123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- # -*- coding: utf-8 -*-
- from openerp import models, fields, tools, api, _
- import openerp.addons.decimal_precision as dp
- from openerp.exceptions import Warning, except_orm, AccessError
- from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
- from pytz import timezone
- from datetime import datetime,timedelta
- import logging
- _logger = logging.getLogger(__name__)
- class ConstructionMove(models.Model):
- _name = 'construction.move'
- name = fields.Char('name')
- date = fields.Date()
- state = fields.Selection([('draft','Borrador'),('posted', 'Fijado')], default='draft')
- ref = fields.Char('Ref')
- comment = fields.Text('Comment', help='information')
- partner_id = fields.Many2one('res.partner', string='partner')
- order_id = fields.Many2one('construction.order', string='order')
- work_id = fields.Many2one('construction.work', string='obra')
- type = fields.Selection([('order', 'Orden'),('contractor', 'Contratista')])
- currency_id = fields.Many2one('res.currency', string="Currency", help="Moneda de la operación", required=True)
- ''' Line '''
- move_lines_ids = fields.One2many('construction.move.line', 'move_id', string='lines')
- '''Valor total de la Orden.'''
- amount_total = fields.Float('Amount Total', digits_compute=dp.get_precision('Account'), default=0.0)
- '''valor total pagado.'''
- amount_paid = fields.Float('Amount paid', digits_compute=dp.get_precision('Account'), default=0.0)
- ''' Saldo de la orden.'''
- residual = fields.Float('Amount Residual', digits_compute=dp.get_precision('Account'), default=0.0)
- '''Valor total de los gasto registrado de la orden.'''
- amount_expenses = fields.Float('Amount Expenses', digits_compute=dp.get_precision('Account'), default=0.0)
- '''Valor disponible para generar gastos de la orden.'''
- available_expenses = fields.Float('Available Expenses', digits_compute=dp.get_precision('Account'), default=0.0)
- ''' invoice '''
- invoice_id = fields.Many2one('account.invoice', string='Invoice Reference', ondelete='restrict', index=True)
- ''' timezone '''
- def get_timezone(self):
- return timezone(self._context.get('tz') or self.env.user.tz)
- ''' Datetime '''
- def get_datetime(self):
- return datetime.now(self.get_timezone()).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
- ''' Date '''
- def get_date(self):
- return datetime.now(self.get_timezone()).strftime(DEFAULT_SERVER_DATE_FORMAT)
- ''' CREATE INVOICE '''
- def createInvoiceMove(self):
- _logger.info('Create invoice')
- decimal_precision = self.env['decimal.precision'].precision_get('Account')
- dateServer = self.get_date()
- constructionConfig = self.env['construction.config'].search([('active', '=', True)])
- if (not constructionConfig):
- raise except_orm(_('Warning'),_('No fue posible localizar la configuración de factura de orden de servicios'))
- invoice_line = []
- invoice = []
- invoice_line.append([0,False, {
- 'name': 'Servicios',
- 'account_id': constructionConfig.line_account_id.id,
- 'quantity': 1,
- 'price_unit': round((self.amount_total),decimal_precision),
- 'price_subtotal': round((self.amount_total),decimal_precision),
- 'partner_id': self.partner_id.id,
- 'invoice_line_tax_id': [(6, 0,[x.id for x in constructionConfig.line_tax_id])],
- }])
- invoice = {
- 'partner_id': self.partner_id.id,
- 'currency_id': self.currency_id.id,
- 'date_invoice': dateServer,
- 'journal_id': constructionConfig.invoice_journal_id.id,
- 'account_id': constructionConfig.invoice_account_id.id,
- 'invoice_line': invoice_line,
- 'origin': '%s' % (self.order_id.name),
- 'type': 'out_invoice',
- 'construction_order_id': self.order_id.id,
- }
- # # Create / open /invoice
- accountInvoice = self.env['account.invoice'].create(invoice)
- accountInvoice.signal_workflow('invoice_open')
- self.write({'invoice_id': accountInvoice.id})
- return True
- # import web_pdb; web_pdb.set_trace()
- ''' recalculate_paid_invoice'''
- def recalculate_paid_invoice(self, amountTotal, amountPaidTotal, residual):
- # Paid
- # amountPaid = self.amount_paid or 0
- amountPaid = amountPaidTotal
- # Residual
- residual = residual
- # Available expenses
- available = amountPaid - self.amount_expenses
- self.write({
- 'amount_paid': amountPaid,
- 'residual': residual,
- 'available_expenses': available,
- })
- return True
- ''' RES PARTNER '''
- class ConstructionOrderMove(models.Model):
- _inherit = 'construction.order'
- construction_move_id = fields.One2many('construction.move', 'order_id', string='Move')
- ''' RES PARTNER '''
- class ResPartnerMove(models.Model):
- _inherit = 'res.partner'
- construction_move_id = fields.One2many('construction.move', 'partner_id', string='Move')
- ''' Account Invoice '''
- class AccountInvoiceMove(models.Model):
- _inherit = 'account.invoice'
- construction_move_id = fields.One2many('construction.move', 'invoice_id', string='Invoice')
- ''' Line '''
- class ConstructionMoveLine(models.Model):
- _name = 'construction.move.line'
- move_id = fields.Many2one('construction.move', string='move', ondelete='cascade', index=True)
- code = fields.Char('Code', size=32)
- task_name = fields.Char('name')
- uom_id = fields.Many2one('construction.uom', string='Unidad de medida')
- task_id = fields.Many2one('construction.task', string='Tarea')
- task_line_id = fields.Many2one('construction.task.line', string='Actividad')
- type = fields.Selection([('task', 'Tarea'),('activity', 'Actividad')])
- ''' Importe Pagado, Total , Residual '''
- amount_total = fields.Float('Amount Total', digits_compute=dp.get_precision('Account'), default=0.0)
- amount_expenses = fields.Float('Amount Expenses', digits_compute=dp.get_precision('Account'), default=0.0)
- residual = fields.Float('Amount Residual', digits_compute=dp.get_precision('Account'), default=0.0)
- expenses_ids = fields.One2many('construction.expenses.move.line', 'move_line_id', string='Expenses')
- def recalculate_paid_expense(self):
- move = self.env['construction.move'].browse(self.move_id.id)
- if (not move):
- return False
- for line in move.move_lines_ids:
- if (line.type == 'task'):
- task = line.task_id.id
- # amountTotal = line.amount_total
- amountExpense = 0
- for lineActivity in move.move_lines_ids:
- if (lineActivity.type == 'activity'):
- amountExpense += lineActivity.amount_expenses
- if (line.type == 'task'):
- line.write({
- 'amount_expenses' : amountExpense,
- 'residual' : line.amount_total - amountExpense
- })
- # import web_pdb; web_pdb.set_trace()
- # task_id
- # task_line_id
- # if (line.type =='activity'):
- # ammount +=line.amount_total
- # amount_total
- # amount_expenses
- # residual
|