construction_move.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. # -*- coding: utf-8 -*-
  2. from openerp import models, fields, tools, api, _
  3. import openerp.addons.decimal_precision as dp
  4. from openerp.exceptions import Warning, except_orm, AccessError
  5. from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
  6. from pytz import timezone
  7. from datetime import datetime,timedelta
  8. import logging
  9. _logger = logging.getLogger(__name__)
  10. class ConstructionMove(models.Model):
  11. _name = 'construction.move'
  12. name = fields.Char('name')
  13. date = fields.Date()
  14. state = fields.Selection([('draft','Borrador'),('posted', 'Fijado')], default='draft')
  15. ref = fields.Char('Ref')
  16. comment = fields.Text('Comment', help='information')
  17. partner_id = fields.Many2one('res.partner', string='partner')
  18. order_id = fields.Many2one('construction.order', string='order')
  19. work_id = fields.Many2one('construction.work', string='obra')
  20. type = fields.Selection([('order', 'Orden'),('contractor', 'Contratista')])
  21. currency_id = fields.Many2one('res.currency', string="Currency", help="Moneda de la operación", required=True)
  22. ''' Line '''
  23. move_lines_ids = fields.One2many('construction.move.line', 'move_id', string='lines')
  24. '''Valor total de la Orden.'''
  25. amount_total = fields.Float('Amount Total', digits_compute=dp.get_precision('Account'), default=0.0)
  26. '''valor total pagado.'''
  27. amount_paid = fields.Float('Amount paid', digits_compute=dp.get_precision('Account'), default=0.0)
  28. ''' Saldo de la orden.'''
  29. residual = fields.Float('Amount Residual', digits_compute=dp.get_precision('Account'), default=0.0)
  30. '''Valor total de los gasto registrado de la orden.'''
  31. amount_expenses = fields.Float('Amount Expenses', digits_compute=dp.get_precision('Account'), default=0.0)
  32. '''Valor disponible para generar gastos de la orden.'''
  33. available_expenses = fields.Float('Available Expenses', digits_compute=dp.get_precision('Account'), default=0.0)
  34. ''' invoice '''
  35. invoice_id = fields.Many2one('account.invoice', string='Invoice Reference', ondelete='restrict', index=True)
  36. ''' timezone '''
  37. def get_timezone(self):
  38. return timezone(self._context.get('tz') or self.env.user.tz)
  39. ''' Datetime '''
  40. def get_datetime(self):
  41. return datetime.now(self.get_timezone()).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
  42. ''' Date '''
  43. def get_date(self):
  44. return datetime.now(self.get_timezone()).strftime(DEFAULT_SERVER_DATE_FORMAT)
  45. ''' CREATE INVOICE '''
  46. def createInvoiceMove(self):
  47. _logger.info('Create invoice')
  48. decimal_precision = self.env['decimal.precision'].precision_get('Account')
  49. dateServer = self.get_date()
  50. constructionConfig = self.env['construction.config'].search([('active', '=', True)])
  51. if (not constructionConfig):
  52. raise except_orm(_('Warning'),_('No fue posible localizar la configuración de factura de orden de servicios'))
  53. invoice_line = []
  54. invoice = []
  55. invoice_line.append([0,False, {
  56. 'name': 'Servicios',
  57. 'account_id': constructionConfig.line_account_id.id,
  58. 'quantity': 1,
  59. 'price_unit': round((self.amount_total),decimal_precision),
  60. 'price_subtotal': round((self.amount_total),decimal_precision),
  61. 'partner_id': self.partner_id.id,
  62. 'invoice_line_tax_id': [(6, 0,[x.id for x in constructionConfig.line_tax_id])],
  63. }])
  64. invoice = {
  65. 'partner_id': self.partner_id.id,
  66. 'currency_id': self.currency_id.id,
  67. 'date_invoice': dateServer,
  68. 'journal_id': constructionConfig.invoice_journal_id.id,
  69. 'account_id': constructionConfig.invoice_account_id.id,
  70. 'invoice_line': invoice_line,
  71. 'origin': '%s' % (self.order_id.name),
  72. 'type': 'out_invoice',
  73. 'construction_order_id': self.order_id.id,
  74. }
  75. # # Create / open /invoice
  76. accountInvoice = self.env['account.invoice'].create(invoice)
  77. accountInvoice.signal_workflow('invoice_open')
  78. self.write({'invoice_id': accountInvoice.id})
  79. return True
  80. # import web_pdb; web_pdb.set_trace()
  81. ''' recalculate_paid_invoice'''
  82. def recalculate_paid_invoice(self, amountTotal, amountPaidTotal, residual):
  83. # Paid
  84. # amountPaid = self.amount_paid or 0
  85. amountPaid = amountPaidTotal
  86. # Residual
  87. residual = residual
  88. # Available expenses
  89. available = amountPaid - self.amount_expenses
  90. self.write({
  91. 'amount_paid': amountPaid,
  92. 'residual': residual,
  93. 'available_expenses': available,
  94. })
  95. return True
  96. ''' RES PARTNER '''
  97. class ConstructionOrderMove(models.Model):
  98. _inherit = 'construction.order'
  99. construction_move_id = fields.One2many('construction.move', 'order_id', string='Move')
  100. ''' RES PARTNER '''
  101. class ResPartnerMove(models.Model):
  102. _inherit = 'res.partner'
  103. construction_move_id = fields.One2many('construction.move', 'partner_id', string='Move')
  104. ''' Account Invoice '''
  105. class AccountInvoiceMove(models.Model):
  106. _inherit = 'account.invoice'
  107. construction_move_id = fields.One2many('construction.move', 'invoice_id', string='Invoice')
  108. ''' Line '''
  109. class ConstructionMoveLine(models.Model):
  110. _name = 'construction.move.line'
  111. move_id = fields.Many2one('construction.move', string='move', ondelete='cascade', index=True)
  112. code = fields.Char('Code', size=32)
  113. task_name = fields.Char('name')
  114. uom_id = fields.Many2one('construction.uom', string='Unidad de medida')
  115. task_id = fields.Many2one('construction.task', string='Tarea')
  116. task_line_id = fields.Many2one('construction.task.line', string='Actividad')
  117. type = fields.Selection([('task', 'Tarea'),('activity', 'Actividad')])
  118. ''' Importe Pagado, Total , Residual '''
  119. amount_total = fields.Float('Amount Total', digits_compute=dp.get_precision('Account'), default=0.0)
  120. amount_expenses = fields.Float('Amount Expenses', digits_compute=dp.get_precision('Account'), default=0.0)
  121. residual = fields.Float('Amount Residual', digits_compute=dp.get_precision('Account'), default=0.0)
  122. expenses_ids = fields.One2many('construction.expenses.move.line', 'move_line_id', string='Expenses')
  123. def recalculate_paid_expense(self):
  124. move = self.env['construction.move'].browse(self.move_id.id)
  125. if (not move):
  126. return False
  127. for line in move.move_lines_ids:
  128. if (line.type == 'task'):
  129. task = line.task_id.id
  130. # amountTotal = line.amount_total
  131. amountExpense = 0
  132. for lineActivity in move.move_lines_ids:
  133. if (lineActivity.type == 'activity'):
  134. amountExpense += lineActivity.amount_expenses
  135. if (line.type == 'task'):
  136. line.write({
  137. 'amount_expenses' : amountExpense,
  138. 'residual' : line.amount_total - amountExpense
  139. })
  140. # import web_pdb; web_pdb.set_trace()
  141. # task_id
  142. # task_line_id
  143. # if (line.type =='activity'):
  144. # ammount +=line.amount_total
  145. # amount_total
  146. # amount_expenses
  147. # residual