# -*- coding: utf-8 -*- from openerp import models, fields, tools, api import openerp.addons.decimal_precision as dp from datetime import datetime from openerp.exceptions import ValidationError class AccountInterest(models.Model): _name = 'account.interest' name = fields.Char() date = fields.Date('Date', help="Fecha de operación") state = fields.Selection([('cancel', 'Cancelado'),('open', 'Abierto'),('paid', 'Pagado')],'Estado del pago', default="open", help="Estado") comment = fields.Text('Comment', help="Información adicional") ## Cliente customer_id = fields.Many2one('res.partner', string="customer") ## factura invoice_id = fields.Many2one('account.invoice', string='Invoice Reference', ondelete='restrict', index=True) reference = fields.Char(string='Invoice Reference', help="Invoice Reference") ## Currency currency_id = fields.Many2one('res.currency', string="Currency", help="Moneda de la operación") ## Line lines_ids = fields.One2many('account.interest.line', 'interest_id', string='interest line') ''' Create ''' @api.model def create(self, vals): interest = super(AccountInterest, self).create(vals) interest.write({'name':("INTEREST/%06d" % (interest.id))}) return interest ''' Unlink ''' @api.multi def unlink(self): interestLine = self.env['account.interest.line'].search([('interest_id.id', '=', self.id)]) invoice_ids = map(lambda x: x.invoice.id, interestLine) moves_ids = map(lambda x: x.move_line_id.id, interestLine) invoiceNumber = "" invoice = self.env['account.invoice'].search([('id', 'in', invoice_ids)]) if (invoice): for invoiceN in invoice: invoiceNumber += "%s, " % (invoiceN.number) raise ValidationError('Existe relacion de la lineas de interes con las facturas (%s)' % (invoiceNumber)) return False moveLine = self.env['account.move.line'].search([('id', 'in', moves_ids)]) for lineMove in moveLine: lineMove.write({'date_interest': lineMove.date_maturity}) return super(AccountInterest, self).unlink() ''' Invoice ''' class accountInvoiceInterest(models.Model): _inherit = 'account.invoice' interest_ids = fields.One2many('account.interest', 'invoice_id', string=' Account Interest') is_interest = fields.Boolean('Factura de interés', default=False, help="Indica si esta factura fue generado por un interés.") interest_line_ids = fields.One2many('account.interest.line', 'invoice', string=' Account Interest Line') ''' Unlink Invoice ''' @api.multi def unlink(self): interestLine = self.env['account.interest.line'].search([('invoice.id', '=', self.id)]) for line in interestLine: moveLine = self.env['account.move.line'].browse(line.move_line_id.id) if (moveLine): moveLine.write({'date_interest': moveLine.date_maturity}) line.write({ 'state': 'open', 'reference': '' }) return super(accountInvoiceInterest, self).unlink() @api.multi def write(self, vals): invoice = super(accountInvoiceInterest, self).write(vals) linesIds = map(lambda x: x.id, self.interest_line_ids) if (linesIds): interestLine = self.env['account.interest.line'].search([('id', 'in', linesIds)]) if (interestLine): state = [] if (self.state == 'open'): state = {'state': 'invoiced'} if (self.state == 'cancel'): state = {'state': 'invoice_cancel'} if (self.state == 'draft'): state = {'state': 'invoice_draft'} if (self.state == 'paid'): state = {'state': 'paid'} if (state): for line in interestLine: line.write(state) return True ''' Partner ''' class ResPartnerInterest(models.Model): _inherit = 'res.partner' interest_ids = fields.One2many('account.interest', 'customer_id', string=' Account Interest') class AccountInterestLine(models.Model): _name = 'account.interest.line' ## Interest interest_id = fields.Many2one('account.interest', string='Account Interest', ondelete='cascade', index=True, required=True) move_line_id = fields.Many2one('account.move.line', string="Registros del diario", help="Registros del diario") amount = fields.Float('amount', digits_compute=dp.get_precision('Account'), required=True, help="Monto del pago") amount_residual = fields.Float('amount', digits_compute=dp.get_precision('Account'), required=True, help="Monto del pago") amount_interest = fields.Float('amount', digits_compute=dp.get_precision('Account'), required=True, help="Monto del pago") date_maturity = fields.Date() expired_days = fields.Integer('Expired Days ') invoice = fields.Many2one('account.invoice', string='Invoice Reference', index=True) reference = fields.Char(string='Invoice Reference', help="Invoice Reference") state = fields.Selection([ ('discount','Descuento total'), ('open','Abierto'), ('invoiced','Facturado'), ('invoice_cancel', 'Factura Cancelada'), ('invoice_draft', 'Factura Borrador'), ('paid', 'Pagado')],'Estado del pago de la linea ', default="open") amount_dicount = fields.Float('amount disconut', digits_compute=dp.get_precision('Account'), help="Monto del descuento") ''' Move Line ''' class accountMoveLineInterest(models.Model): _inherit = 'account.move.line' interest_line_ids = fields.One2many('account.interest.line', 'move_line_id', string=' Account Interest Line') date_interest = fields.Date("Date interés", help="Fecha de la facturación de os interés")