# -*- 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