account_move.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. # -*- coding: utf-8 -*-
  2. from openerp.http import request as r
  3. def create_invoice_move_lines(invoice_ids, paid_amount, date_today):
  4. assert len(invoice_ids) == 1
  5. invoice = r.env['account.invoice'].browse(invoice_ids)
  6. is_purchase = False
  7. scoped_context = dict(r.context, lang=invoice.partner_id.lang)
  8. invoice_move_lines = invoice._get_analytic_lines()
  9. decimal_precision = r.env['decimal.precision'].precision_get('Account')
  10. compute_taxes = r.env['account.invoice.tax'].compute(invoice.with_context(lang=invoice.partner_id.lang))
  11. invoice.check_tax_lines(compute_taxes)
  12. invoice._recompute_tax_amount()
  13. invoice_move_lines += r.env['account.invoice.tax'].move_line_get(invoice.id)
  14. total, total_currency, invoice_move_lines = invoice.with_context(scoped_context).compute_invoice_totals(invoice.company_id.currency_id, invoice.reference, invoice_move_lines)
  15. if total < 0:
  16. total = total * -1
  17. is_purchase = True
  18. paid_percentage = abs(paid_amount / round(total, decimal_precision))
  19. distributed_percentage = -(paid_percentage / len(invoice.payment_term.line_ids))
  20. payment_lines = []
  21. for line in invoice.payment_term.line_ids:
  22. date_due = (parse(date_today) + rd(days=line.days + line.days2)).strftime(DATE_FORMAT)
  23. if paid_percentage and paid_percentage < 1.0:
  24. payment_lines.append([date_today, paid_percentage])
  25. paid_percentage = paid_amount = 0
  26. if date_due == date_today and line.value_amount:
  27. distributed_percentage = -((payment_lines[0][1] - line.value_amount) / (len(invoice.payment_term.line_ids) - 1))
  28. continue
  29. if line.value != 'balance':
  30. payment_lines.append([date_due, line.value_amount + distributed_percentage])
  31. continue
  32. payment_lines.append([date_due, line.value_amount])
  33. for payment_line in payment_lines:
  34. current_price = round(total * payment_line[1], decimal_precision)
  35. if current_price < 0.0:
  36. continue
  37. paid_amount = paid_amount + current_price
  38. price = current_price if payment_line[1] else round(total - paid_amount, decimal_precision) or total
  39. if is_purchase:
  40. price = price * -1
  41. invoice_move_lines.append({
  42. 'type': 'dest',
  43. 'name': '/',
  44. 'price': price,
  45. 'account_id': invoice.account_id.id,
  46. 'date_maturity': payment_line[0],
  47. 'amount_currency': invoice.company_id.currency_id.compute(payment_line[1], invoice.currency_id) if invoice.currency_id != invoice.company_id.currency_id else False,
  48. 'currency_id': invoice.currency_id != invoice.company_id.currency_id and invoice.currency_id.id,
  49. 'ref': invoice.type in ('in_invoice', 'in_refund') and invoice.reference or invoice.number
  50. })
  51. payment_lines = []
  52. return invoice_move_lines
  53. def create_account_move(invoice_ids, invoice_move_lines):
  54. assert len(invoice_ids) == 1
  55. invoice = r.env['account.invoice'].browse(invoice_ids)
  56. accounting_partner = r.env['res.partner']._find_accounting_partner(invoice.partner_id)
  57. move_line_values = [(0, 0, invoice.line_get_convert(line, accounting_partner.id, invoice.date_invoice)) for line in invoice_move_lines]
  58. move_line_values = invoice.group_lines(invoice_move_lines, move_line_values)
  59. move_line_values = invoice.finalize_invoice_move_lines(move_line_values)
  60. ctx = dict(r.context, lang=invoice.partner_id.lang, company_id=invoice.company_id.id)
  61. period = invoice.period_id
  62. if not period:
  63. period = period.with_context(ctx).find(invoice.date_invoice)[:1]
  64. if period:
  65. for line in move_line_values:
  66. line[2]['period_id'] = period.id
  67. ctx['invoice'] = invoice
  68. ctx_nolang = ctx.copy()
  69. ctx_nolang.pop('lang', None)
  70. account_move = r.env['account.move'].with_context(ctx_nolang).create({
  71. 'ref': invoice.reference or invoice.name,
  72. 'line_id': move_line_values,
  73. 'journal_id': invoice.journal_id.with_context(r.context, lang=invoice.partner_id.lang).id,
  74. 'date': invoice.date_invoice,
  75. 'narration': invoice.comment,
  76. 'company_id': invoice.company_id.id,
  77. 'period_id': period.id
  78. })
  79. invoice.with_context(ctx).write({
  80. 'move_id': account_move.id,
  81. 'period_id': account_move.period_id.id,
  82. 'move_name': account_move.name,
  83. })
  84. account_move.post()
  85. return account_move