openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #00533
[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','<>','view'),('type','<>','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"/>