account_invoice.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. # -*- coding: utf-8 -*-
  2. from openerp.http import request
  3. from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, float_round
  4. from dateutil.parser import parse
  5. from dateutil.relativedelta import relativedelta as rd
  6. _MODEL = 'account.invoice'
  7. '''
  8. '''
  9. def create_invoice(sale_order_id, currency_id, date_today, picking_done=True):
  10. sale_order = request.env['sale.order'].browse(sale_order_id)
  11. invoice_id = sale_order.action_invoice_create()
  12. invoice = request.env[_MODEL].browse(invoice_id)
  13. for picking in sale_order.picking_ids:
  14. picking.force_assign()
  15. if picking_done:
  16. picking.action_done()
  17. date_due = parse(date_today) + rd(days=max(invoice.payment_term.line_ids.mapped(lambda x: x.days + x.days2)))
  18. invoice.write({
  19. 'currency_id': currency_id,
  20. 'date_invoice': date_today,
  21. 'date_due': date_due.strftime(DEFAULT_SERVER_DATE_FORMAT),
  22. 'state': 'open'
  23. })
  24. return invoice
  25. '''
  26. Create move lines
  27. '''
  28. def create_invoice_move_lines(invoice_id, paid_amount, date_today):
  29. invoice = request.env[_MODEL].browse(invoice_id)
  30. context = dict(request.context, lang=invoice.partner_id.lang)
  31. invoice_move_lines = invoice._get_analytic_lines()
  32. decimal_precision = request.env['decimal.precision'].precision_get('Account')
  33. compute_taxes = request.env['account.invoice.tax'].compute(invoice.with_context(context))
  34. invoice.check_tax_lines(compute_taxes)
  35. invoice._recompute_tax_amount()
  36. invoice_move_lines += request.env['account.invoice.tax'].move_line_get(invoice.id)
  37. total, total_currency, invoice_move_lines = invoice.with_context(context).compute_invoice_totals(invoice.company_id.currency_id, invoice.reference, invoice_move_lines)
  38. paid_amount = float_round(paid_amount, precision_digits=decimal_precision)
  39. paid_percentage = paid_amount / float_round(total_currency, precision_digits=decimal_precision)
  40. distributed_percentage = -(paid_percentage / len(invoice.payment_term.line_ids))
  41. diff_currency = invoice.currency_id != invoice.company_id.currency_id
  42. if diff_currency:
  43. paid_amount = invoice.currency_id.compute(paid_amount, invoice.company_id.currency_id)
  44. payment_lines = []
  45. for line in invoice.payment_term.line_ids:
  46. date_due = (parse(date_today) + rd(days=line.days + line.days2)).strftime(DEFAULT_SERVER_DATE_FORMAT)
  47. if paid_percentage and paid_percentage < 1.0:
  48. payment_lines.append([date_today, paid_percentage])
  49. paid_percentage = paid_amount = 0
  50. if date_due == date_today and line.value_amount:
  51. distributed_percentage = -((payment_lines[0][1] - line.value_amount) / (len(invoice.payment_term.line_ids) - 1))
  52. continue
  53. if line.value != 'balance':
  54. payment_lines.append([date_due, line.value_amount + distributed_percentage])
  55. continue
  56. payment_lines.append([date_due, line.value_amount])
  57. for payment_line in payment_lines:
  58. current_price = float_round(total * payment_line[1], precision_digits=decimal_precision)
  59. if current_price < 0.0:
  60. continue
  61. paid_amount += current_price
  62. # Compute move line price
  63. if payment_line[1]:
  64. price = current_price
  65. else:
  66. price = float_round(total - paid_amount, precision_digits=decimal_precision) or total
  67. # Compute move line amount in currency
  68. if diff_currency:
  69. amount_currency = invoice.company_id.currency_id.with_context(context).compute(price, invoice.currency_id)
  70. else:
  71. amount_currency = False
  72. # Create invoice move live value
  73. invoice_move_lines.append({
  74. 'type': 'dest',
  75. 'name': '/',
  76. 'price': price,
  77. 'account_id': invoice.account_id.id,
  78. 'date_maturity': payment_line[0],
  79. 'amount_currency': amount_currency,
  80. 'currency_id': diff_currency and invoice.currency_id.id,
  81. 'ref': invoice.reference
  82. })
  83. payment_lines = []
  84. return invoice_move_lines
  85. '''
  86. Number to invoice
  87. '''
  88. def number_invoice(invoice_id):
  89. request.env[_MODEL].browse(invoice_id).action_number()
  90. '''
  91. Close a invoice
  92. '''
  93. def close_invoice(invoice_id):
  94. invoice = request.env[_MODEL].browse(invoice_id)
  95. if invoice.residual == 0:
  96. invoice.write({
  97. 'state': 'paid'
  98. })