account_analytic_analysis.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # -*- coding: utf-8 -*-
  2. ##############################################################################
  3. # For copyright and license notices, see __openerp__.py file in module root
  4. # directory
  5. ##############################################################################
  6. from dateutil.relativedelta import relativedelta
  7. import datetime
  8. import logging
  9. import time
  10. from openerp.osv import osv, fields
  11. import openerp.tools
  12. from openerp.tools.translate import _
  13. from openerp.addons.decimal_precision import decimal_precision as dp
  14. class account_analytic_account(osv.osv):
  15. _inherit = "account.analytic.account"
  16. def _prepare_invoice_data(self, cr, uid, contract, context=None):
  17. context = context or {}
  18. journal_obj = self.pool.get('account.journal')
  19. if contract.type == 'purchase_contract':
  20. invoice = {}
  21. if not contract.partner_id:
  22. raise osv.except_osv(_('No Supplier Defined!'), _(
  23. "You must first select a Supplier for Contract %s!") % contract.name)
  24. fpos = contract.partner_id.property_account_position or False
  25. journal_ids = journal_obj.search(cr, uid, [(
  26. 'type', '=', 'purchase'), ('company_id', '=', contract.company_id.id or False)], limit=1)
  27. if not journal_ids:
  28. raise osv.except_osv(_('Error!'),
  29. _('Please define a pruchase journal for the company "%s".') % (contract.company_id.name or '', ))
  30. currency_id = False
  31. if contract.pricelist_id:
  32. currency_id = contract.pricelist_id.currency_id.id
  33. elif contract.partner_id.property_product_pricelist:
  34. currency_id = contract.partner_id.property_product_pricelist.currency_id.id
  35. elif contract.company_id:
  36. currency_id = contract.company_id.currency_id.id
  37. invoice = {
  38. 'account_id': contract.partner_id.property_account_payable.id,
  39. 'type': 'in_invoice',
  40. 'reference': contract.name,
  41. 'partner_id': contract.partner_id.id,
  42. 'currency_id': currency_id,
  43. 'journal_id': len(journal_ids) and journal_ids[0] or False,
  44. 'date_invoice': contract.recurring_next_date,
  45. 'origin': contract.code,
  46. 'fiscal_position': fpos and fpos.id,
  47. 'company_id': contract.company_id.id or False,
  48. }
  49. return invoice
  50. else:
  51. return super(account_analytic_account, self)._prepare_invoice_data(cr, uid, contract, context=context)
  52. def _prepare_invoice_lines(self, cr, uid, contract, fiscal_position_id, context=None):
  53. if not context:
  54. context = {}
  55. if contract.type == 'purchase_contract':
  56. fpos_obj = self.pool.get('account.fiscal.position')
  57. fiscal_position = None
  58. if fiscal_position_id:
  59. fiscal_position = fpos_obj.browse(
  60. cr, uid, fiscal_position_id, context=context)
  61. invoice_lines = []
  62. for line in contract.recurring_invoice_line_ids:
  63. res = line.product_id
  64. account_id = res.property_account_expense.id
  65. if not account_id:
  66. account_id = res.categ_id.property_account_expense_categ.id
  67. account_id = fpos_obj.map_account(
  68. cr, uid, fiscal_position, account_id)
  69. taxes = res.supplier_taxes_id or False
  70. if taxes:
  71. tax_ids = [x.id for x in taxes]
  72. tax_ids = self.pool['account.tax'].search(
  73. cr, uid,
  74. [('id', 'in', tax_ids), ('company_id', '=', contract.company_id.id)],
  75. context=context)
  76. taxes = self.pool['account.tax'].browse(cr, uid, tax_ids, context=context)
  77. tax_id = fpos_obj.map_tax(cr, uid, fiscal_position, taxes)
  78. invoice_lines.append((0, 0, {
  79. 'name': line.name,
  80. 'account_id': account_id,
  81. 'account_analytic_id': contract.id,
  82. 'price_unit': line.price_unit or 0.0,
  83. 'quantity': line.quantity,
  84. 'uos_id': line.uom_id.id or False,
  85. 'product_id': line.product_id.id or False,
  86. 'invoice_line_tax_id': [(6, 0, tax_id)],
  87. }))
  88. return invoice_lines
  89. else:
  90. return super(account_analytic_account, self)._prepare_invoice_lines(cr, uid, contract, fiscal_position_id, context=None)
  91. def _cron_recurring_create_invoice_purchase(self, cr, uid, context=None):
  92. current_date = time.strftime('%Y-%m-%d')
  93. contract_ids = self.search(cr, uid, [('recurring_next_date', '<=', current_date), (
  94. 'state', '=', 'open'), ('recurring_invoices', '=', True), ('type', '=', 'purchase_contract')])
  95. return self._recurring_create_invoice(cr, uid, contract_ids, context=context)