account_voucher.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # -*- coding: utf-8 -*-
  2. from openerp import api, fields, models, cli
  3. from openerp.exceptions import except_orm
  4. from datetime import datetime
  5. from dateutil.relativedelta import relativedelta as rd
  6. from dateutil.parser import parse
  7. class AccountVoucher(models.Model):
  8. _inherit = 'account.voucher'
  9. @api.model
  10. def create_from_pos(self, values):
  11. date_now = fields.Date.context_today(self)
  12. date_format = '%Y-%m-%d'
  13. # Step 1: Create Sale Order and Confirm
  14. sale_order_line_values = [
  15. [0, False, {
  16. 'product_id': int(item['id']),
  17. 'product_uom_qty': float(item['qty']),
  18. 'price_unit': float(item['price']) ,
  19. 'state': 'confirmed'
  20. }] for item in values['cart_items']]
  21. sale_order_values = {
  22. 'partner_id': int(values['customer_id']),
  23. 'order_line': sale_order_line_values,
  24. 'picking_policy': 'direct',
  25. 'state': 'manual',
  26. 'date_confirm': date_now,
  27. 'payment_term': 5
  28. }
  29. sale_order = self.env['sale.order'].create(sale_order_values)
  30. # Step 2: Create innvoice and calculate due_date
  31. invoice_id = sale_order.action_invoice_create()
  32. invoice = self.env['account.invoice'].browse(invoice_id)
  33. due_date = parse(date_now) + rd(days=max(invoice.payment_term.line_ids.mapped(lambda x: x.days + x.days2)))
  34. invoice.write({
  35. 'date_invoice': date_now,
  36. 'date_due': due_date.strftime(date_format)
  37. })
  38. # Step 3: Create invoice move lines
  39. amount_paid = float(values['amount_paid'])
  40. decimal_precision = self.env['decimal.precision'].precision_get('Account')
  41. invoice_move_lines = invoice._get_analytic_lines() + self.env['account.invoice.tax'].move_line_get(invoice_id)
  42. compute_taxes = self.env['account.invoice.tax'].compute(invoice)
  43. invoice.check_tax_lines(compute_taxes)
  44. total, total_currency, invoice_move_lines = invoice.compute_invoice_totals(invoice.company_id.currency_id, invoice.reference, invoice_move_lines)
  45. percent_paid = amount_paid / total
  46. distribute_percent = -(percent_paid / len(invoice.payment_term.line_ids))
  47. total_lines = []
  48. for line in invoice.payment_term.line_ids:
  49. due_date = (parse(date_now) + rd(days=line.days + line.days2)).strftime(date_format)
  50. if percent_paid:
  51. total_lines.append([date_now, percent_paid])
  52. percent_paid = amount_paid = 0
  53. if date_format == date_now:
  54. distribute_percent = -((total_lines[0] - line.value_amount) / (len(invoice.payment_term.line_ids) - 1))
  55. continue
  56. if line.value != 'balance':
  57. total_lines.append([due_date, line.value_amount + distribute_percent])
  58. continue
  59. total_lines.append([due_date, line.value_amount])
  60. for total_line in total_lines:
  61. current_price = round(total * total_line[1], decimal_precision)
  62. amount_paid += current_price
  63. invoice_move_lines.append({
  64. 'type': 'dest',
  65. 'name': '/',
  66. 'price': current_price if total_line[1] else total - amount_paid,
  67. 'account_id': invoice.account_id.id,
  68. 'date_maturity': invoice.date_due,
  69. 'amount_currency': invoice.company_id.currency_id.compute(total_line[1], invoice.currency_id) if invoice.currency_id != invoice.company_id.currency_id else False,
  70. 'currency_id': invoice.currency_id != invoice.company_id.currency_id and invoice.currency_id.id,
  71. 'ref': invoice.reference
  72. })
  73. total_lines = []
  74. accounting_partner = self.env['res.partner']._find_accounting_partner(invoice.partner_id)
  75. move_line_values = [(0, 0, invoice.line_get_convert(line, accounting_partner.id, invoice.date_invoice)) for line in invoice_move_lines]
  76. move_line_values = invoice.group_lines(invoice_move_lines, move_line_values)
  77. move_line_values = invoice.finalize_invoice_move_lines(move_line_values)
  78. move_values = {
  79. 'ref': invoice.reference or invoice.name,
  80. 'line_id': move_line_values,
  81. 'journal_id': invoice.journal_id.id,
  82. 'date': invoice.date_invoice,
  83. 'narration': invoice.comment,
  84. 'company_id': invoice.company_id.id,
  85. 'period_id': invoice.period_id.find(invoice.date_invoice).id
  86. }
  87. account_move = self.env['account.move'].create(move_values)
  88. invoice.write({
  89. 'move_id': account_move.id,
  90. 'period_id': account_move.period_id.id,
  91. 'move_name': account_move.name,
  92. })
  93. account_move.post()
  94. # Step 4: Validate invoice
  95. invoice.action_number()
  96. invoice.write({
  97. 'state': 'open'
  98. })
  99. # Step 5: Pay Invoice