← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-commiter/openobject-addons/trunk-dev-addons3-psi into lp:~openerp-dev/openobject-addons/trunk-dev-addons3

 

psi (OpenERP) has proposed merging lp:~openerp-commiter/openobject-addons/trunk-dev-addons3-psi into lp:~openerp-dev/openobject-addons/trunk-dev-addons3.

Requested reviews:
  OpenERP R&D Team (openerp-dev)
Related bugs:
  #662538 account - account_move_lines for payables and receivables must have partner_id - missing check
  https://bugs.launchpad.net/bugs/662538
  #665326 Multi_company : Journal entry missing for company OpenERP IN.
  https://bugs.launchpad.net/bugs/665326
  #667619 Export po file from OpenERP, Accounting reports does not translated.
  https://bugs.launchpad.net/bugs/667619


account_voucher: writeoff implementation without any extra function in account_voucher.py

remaining:(getting errors)
in case of more than one invoice of a partner writeoff entry is reflecting in all the partners.
account.voucher journal entry missing the writeoff entry
-- 
https://code.launchpad.net/~openerp-commiter/openobject-addons/trunk-dev-addons3-psi/+merge/41263
Your team OpenERP R&D Team is requested to review the proposed merge of lp:~openerp-commiter/openobject-addons/trunk-dev-addons3-psi into lp:~openerp-dev/openobject-addons/trunk-dev-addons3.
=== modified file 'account/account_move_line.py'
--- account/account_move_line.py	2010-11-16 09:25:36 +0000
+++ account/account_move_line.py	2010-11-19 05:30:24 +0000
@@ -716,6 +716,8 @@
             account_id = line['account_id']['id']
             partner_id = (line['partner_id'] and line['partner_id']['id']) or False
         writeoff = debit - credit
+        if 'write_off' in context and context['write_off']['writeoff_amount']:
+            writeoff = context['write_off']['writeoff_amount']
 
         # Ifdate_p in context => take this date
         if context.has_key('date_p') and context['date_p']:

=== modified file 'account_voucher/account_voucher.py'
--- account_voucher/account_voucher.py	2010-11-15 07:18:09 +0000
+++ account_voucher/account_voucher.py	2010-11-19 05:30:24 +0000
@@ -543,7 +543,7 @@
         mod_obj = self.pool.get('ir.model.data')
         if context is None:
             context = {}
-        voucher = self.browse(cr, uid, [ids[0]], context=context)[0]
+        voucher = self.browse(cr, uid, ids, context=context)[0]
         debit= credit = 0.0
         if voucher.line_dr_ids:
             for line in voucher.line_dr_ids:
@@ -666,7 +666,6 @@
                 'date': inv.date,
                 'date_maturity': inv.date_due
             }
-
             if (debit == 0.0 or credit == 0.0 or debit+credit > 0) and (debit > 0.0 or credit > 0.0):
                 master_line = move_line_pool.create(cr, uid, move_line)
 
@@ -719,9 +718,14 @@
                 sign = (move_line['debit'] - move_line['credit']) < 0 and -1 or 1
                 move_line['amount_currency'] = company_currency <> current_currency and sign * line.amount or 0.0
                 master_line = move_line_pool.create(cr, uid, move_line)
+                test_ids.append('master_line')
                 if line.move_line_id.id:
                     rec_ids = [master_line, line.move_line_id.id]
                     rec_list_ids.append(rec_ids)
+            writeoff_account_id = False
+            writeoff_journal_id = False
+            writeoff_period_id = inv.period_id.id,
+            comment = False
 
             if not currency_pool.is_zero(cr, uid, inv.currency_id, line_total):
                 diff = line_total
@@ -745,119 +749,22 @@
                 move_line['account_id'] = account_id
                 move_line_pool.create(cr, uid, move_line)
 
+            for rec_ids in rec_list_ids:
+                if len(rec_ids) >= 2:
+                    if 'write_off' in context and context['write_off']['writeoff_acc_id']:
+                        writeoff_account_id = context['write_off']['writeoff_acc_id']
+                        writeoff_journal_id = context['write_off']['writeoff_journal_id']
+                        comment = context['write_off']['comment']
+                        self.pool.get('account.move.line').reconcile(cr, uid, rec_ids, 'manual', writeoff_account_id, writeoff_period_id, writeoff_journal_id, context)
+                    else:
+                        self.pool.get('account.move.line').reconcile_partial(cr, uid, rec_ids, 'manual', context)
+
             self.write(cr, uid, [inv.id], {
                 'move_id': move_id,
                 'state': 'posted',
                 'number': name,
             })
             move_pool.post(cr, uid, [move_id], context={})
-            for rec_ids in rec_list_ids:
-                if len(rec_ids) >= 2:
-                    move_line_pool.reconcile_partial(cr, uid, rec_ids)
-        return True
-
-    def pay_and_reconcile(self, cr, uid, ids, pay_amount, pay_account_id, period_id, pay_journal_id, writeoff_acc_id, writeoff_period_id, writeoff_journal_id, context=None, name=''):
-        if context is None:
-            context = {}
-        seq_obj = self.pool.get('ir.sequence')
-        #TODO check if we can use different period for payment and the writeoff line
-        assert len(ids)==1, "Can only pay one voucher at a time"
-        voucher = self.browse(cr, uid, ids[0])
-        if voucher.number:
-            name = voucher.number
-        elif voucher.journal_id.sequence_id:
-            name = seq_obj.get_id(cr, uid, voucher.journal_id.sequence_id.id)
-        else:
-            raise osv.except_osv(_('Error !'), _('Please define a sequence on the journal !'))
-        if not voucher.reference:
-            ref = name.replace('/','')
-        else:
-            ref = voucher.reference
-
-        src_account_id = voucher.account_id.id
-        # Take the seq as name for move
-        types = {'sale': -1, 'purchase': 1, 'payment': 1, 'receipt': -1}
-        direction = types[voucher.type]
-        #take the choosen date
-        if 'date_p' in context and context['date_p']:
-            date = context['date_p']
-        else:
-            date = time.strftime('%Y-%m-%d')
-        # Take the amount in currency and the currency of the payment
-        if 'amount_currency' in context and context['amount_currency'] and 'currency_id' in context and context['currency_id']:
-            amount_currency = context['amount_currency']
-            currency_id = context['currency_id']
-        else:
-            amount_currency = False
-            currency_id = False
-        pay_journal = self.pool.get('account.journal').read(cr, uid, pay_journal_id, ['type'], context=context)
-        if voucher.type in ('sale', 'receipt'):
-            if pay_journal['type'] == 'bank':
-                entry_type = 'bank_pay_voucher' # Bank payment
-            else:
-                entry_type = 'pay_voucher' # Cash payment
-        else:
-            entry_type = 'cont_voucher'
-
-        # Pay attention to the sign for both debit/credit AND amount_currency
-        l1 = {
-            'debit': direction * pay_amount>0 and direction * pay_amount,
-            'credit': direction * pay_amount<0 and - direction * pay_amount,
-            'account_id': src_account_id,
-            'partner_id': voucher.partner_id.id,
-            'ref':ref,
-            'date': date,
-            'currency_id':currency_id,
-            'amount_currency':amount_currency and direction * amount_currency or 0.0,
-            'company_id': voucher.company_id.id,
-        }
-        l2 = {
-            'debit': direction * pay_amount<0 and - direction * pay_amount,
-            'credit': direction * pay_amount>0 and direction * pay_amount,
-            'account_id': pay_account_id,
-            'partner_id': voucher.partner_id.id,
-            'ref':ref,
-            'date': date,
-            'currency_id':currency_id,
-            'amount_currency':amount_currency and - direction * amount_currency or 0.0,
-            'company_id': voucher.company_id.id,
-        }
-
-        if not name:
-            name = voucher.line_ids and voucher.line_ids[0].name or voucher.number
-        l1['name'] = name
-        l2['name'] = name
-        lines = [(0, 0, l1), (0, 0, l2)]
-        move = {'ref': ref, 'line_id': lines, 'journal_id': pay_journal_id, 'period_id': period_id, 'name': name, 'date': date}
-        move_id = self.pool.get('account.move').create(cr, uid, move, context=context)
-
-        line_ids = []
-        total = 0.0
-        line = self.pool.get('account.move.line')
-        move_ids = [move_id,]
-        if voucher.move_id:
-            move_ids.append(voucher.move_id.id)
-        cr.execute('SELECT id FROM account_move_line '\
-                   'WHERE move_id IN %s',
-                   ((move_id,),))
-        lines = line.browse(cr, uid, map(lambda x: x[0], cr.fetchall()) )
-        for l in lines:
-            if l.account_id.id == src_account_id:
-                line_ids.append(l.id)
-                total += (l.debit or 0.0) - (l.credit or 0.0)
-
-        voc_id, name = self.name_get(cr, uid, [voucher.id], context=context)[0]
-        if (not round(total,self.pool.get('decimal.precision').precision_get(cr, uid, 'Account'))) or writeoff_acc_id:
-            self.pool.get('account.move.line').reconcile(cr, uid, line_ids, 'manual', writeoff_acc_id, writeoff_period_id, writeoff_journal_id, context)
-        else:
-            code = voucher.currency_id.code
-            # TODO: use currency's formatting function
-            msg = _("Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining)") % \
-                    (name, pay_amount, code, voucher.amount_total, code, total, code)
-            self.log(cr, uid, voc_id,  msg)
-            self.pool.get('account.move.line').reconcile_partial(cr, uid, line_ids, 'manual', context)
-        # Update the stored value (fields.function), so we write to trigger recompute
-        self.write(cr, uid, ids, {'state':'posted'}, context=context)
         return True
 
     def copy(self, cr, uid, id, default={}, context=None):

=== modified file 'account_voucher/wizard/account_voucher_payment_option.py'
--- account_voucher/wizard/account_voucher_payment_option.py	2010-11-12 13:15:46 +0000
+++ account_voucher/wizard/account_voucher_payment_option.py	2010-11-19 05:30:24 +0000
@@ -21,6 +21,7 @@
 
 from osv import fields, osv
 from tools.translate import _
+import decimal_precision as dp
 
 class account_voucher_pay_writeoff(osv.osv_memory):
     """
@@ -28,11 +29,22 @@
     """
     _name = "account.voucher.pay.writeoff"
     _description = "Pay Voucher"
+
+    def _get_amount(self, cr, uid, context=None):
+        voucher_obj = self.pool.get('account.voucher')
+        voucher = voucher_obj.browse(cr, uid, context['voucher_id'], context=context)
+        amount = 0.0
+        for line in voucher.line_ids:
+            amount += line.amount_unreconciled
+        diff = amount - voucher.amount
+        return diff
+
     _columns = {
         'payment_option':fields.selection([
                                            ('not_reconcile', 'Do not reconcile balance'),
                                            ('close_balance', 'close the balance'),
                                            ], 'Payment Option', required=True),
+        'writeoff_amount': fields.float('Writeoff Amount', required=True, digits_compute = dp.get_precision('Account')),
         'writeoff_acc_id': fields.many2one('account.account', 'Write-Off account'),
         'writeoff_journal_id': fields.many2one('account.journal', 'Write-Off journal'),
         'comment': fields.char('Comment', size=64, required=True),
@@ -41,76 +53,18 @@
     _defaults = {
         'payment_option': 'not_reconcile',
         'comment': 'Write-Off',
+        'writeoff_amount': _get_amount
     }
 
     def pay_and_reconcile_writeoff(self, cr, uid, ids, context=None):
         voucher_obj = self.pool.get('account.voucher')
-        data =  self.read(cr, uid, ids,context=context)[0]
+        data =  self.read(cr, uid, ids, context=context)[0]
         voucher_id = context.get('voucher_id', False)
-        if data['payment_option'] == 'not_reconcile':
-            voucher_obj.action_move_line_create(cr, uid, [voucher_id], context=context)
-            return {}
-        context.update({'write_off':data})
-        self.pool.get('account.voucher.pay').pay_and_reconcile(cr, uid, [voucher_id], context=context)
+        if data['payment_option'] == 'close_balance':
+            context.update({'write_off':data})
+        voucher_obj.action_move_line_create(cr, uid, [voucher_id], context=context)
         return {}
 
 account_voucher_pay_writeoff()
 
-class account_voucher_pay(osv.osv_memory):
-    """
-    Generate pay invoice wizard, user can make partial or full payment for invoice.
-    """
-    _name = "account.voucher.pay"
-    _description = "Pay Voucher"
-
-    def pay_and_reconcile(self, cr, uid, ids, context=None):
-        cur_obj = self.pool.get('res.currency')
-        voucher_obj = self.pool.get('account.voucher')
-        if context is None:
-            context = {}
-        voucher = voucher_obj.browse(cr, uid, [ids[0]], context=context)[0]
-        writeoff_account_id = False
-        writeoff_journal_id = False
-        comment = False
-
-        if 'write_off' in context and context['write_off'] :
-            writeoff_account_id = context['write_off']['writeoff_acc_id']
-            writeoff_journal_id = context['write_off']['writeoff_journal_id']
-            comment = context['write_off']['comment']
-
-        amount = voucher.amount
-        journal = voucher.journal_id
-        # Compute the amount in company's currency, with the journal currency (which is equal to payment currency)
-        # when it is needed :  If payment currency (according to selected journal.currency) is <> from company currency
-        if journal.currency and voucher.company_id.currency_id.id<>journal.currency.id:
-            ctx = {'date': voucher.date}
-            amount = cur_obj.compute(cr, uid, journal.currency.id, voucher.company_id.currency_id.id, amount, context=ctx)
-            currency_id = journal.currency.id
-            # Put the paid amount in currency, and the currency, in the context if currency is different from company's currency
-            context.update({'amount_currency': voucher.amount, 'currency_id': currency_id})
-
-        if voucher.company_id.currency_id.id<>voucher.currency_id.id:
-            ctx = {'date':voucher.date}
-            amount = cur_obj.compute(cr, uid, voucher.currency_id.id, voucher.company_id.currency_id.id, amount, context=ctx)
-            currency_id = voucher.currency_id.id
-            # Put the paid amount in currency, and the currency, in the context if currency is different from company's currency
-            context.update({'amount_currency':voucher.amount,'currency_id':currency_id})
-
-        # Take the choosen date
-        if comment:
-            context.update({'date_p':voucher.date, 'comment':comment})
-        else:
-            context.update({'date_p':voucher.date, 'comment':False})
-
-        acc_id = journal.default_credit_account_id and journal.default_credit_account_id.id
-        if not acc_id:
-            raise osv.except_osv(_('Error !'), _('Your journal must have a default credit and debit account.'))
-
-        voucher_obj.pay_and_reconcile(cr, uid, ids,
-                amount, acc_id, voucher.period_id.id, journal.id, writeoff_account_id,
-                voucher.period_id, writeoff_journal_id, context, voucher.name)
-        return {}
-
-account_voucher_pay()
-
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== modified file 'account_voucher/wizard/account_voucher_payment_option.xml'
--- account_voucher/wizard/account_voucher_payment_option.xml	2010-11-12 13:15:46 +0000
+++ account_voucher/wizard/account_voucher_payment_option.xml	2010-11-19 05:30:24 +0000
@@ -12,9 +12,10 @@
                      <field name="payment_option"/>
                      <group colspan="4" attrs="{'invisible':[('payment_option','!=','close_balance')]}">
                          <separator string="Write-Off Move" colspan="4"/>
+                         <field name="writeoff_amount"/>
+                         <field name="comment"/>
                          <field name="writeoff_journal_id" attrs="{'required':[('payment_option','=','close_balance')]}"/>
                          <field name="writeoff_acc_id" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'required':[('payment_option','=','close_balance')]}"/>
-                         <field name="comment"/>
                          <group colspan="4" groups="analytic.group_analytic_accounting">
                            <separator string="Analytic" colspan="4"/>
                            <field name="analytic_id"/>