Código fonte para l10n_br_account.models.account_invoice

# -*- coding: utf-8 -*-
# Copyright (C) 2009 - TODAY Renato Lima - Akretion
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html

from openerp import models, fields, api, _
from openerp.addons import decimal_precision as dp

OPERATION_TYPE = {
    'out_invoice': 'output',
    'in_invoice': 'input',
    'out_refund': 'input',
    'in_refund': 'output'
}

JOURNAL_TYPE = {
    'out_invoice': 'sale',
    'in_invoice': 'purchase',
    'out_refund': 'sale_refund',
    'in_refund': 'purchase_refund'
}


[documentos]class AccountInvoice(models.Model): _inherit = 'account.invoice' _order = 'date_invoice DESC, internal_number DESC' @api.one @api.depends( 'move_id.line_id.reconcile_id.line_id', 'move_id.line_id.reconcile_partial_id.line_partial_ids', ) def _compute_receivables(self): lines = self.env['account.move.line'] for line in self.move_id.line_id: if line.account_id.id == self.account_id.id and \ line.account_id.type in ('receivable', 'payable') and \ self.journal_id.revenue_expense: lines |= line self.move_line_receivable_id = (lines).sorted() state = fields.Selection( selection_add=[ ('sefaz_export', 'Enviar para Receita'), ('sefaz_exception', u'Erro de autorização da Receita'), ('sefaz_cancelled', 'Cancelado no Sefaz'), ('sefaz_denied', 'Denegada no Sefaz'), ]) move_line_receivable_id = fields.Many2many( 'account.move.line', string='Receivables', compute='_compute_receivables') document_serie_id = fields.Many2one( 'l10n_br_account.document.serie', string=u'Série', domain="[('fiscal_document_id', '=', fiscal_document_id),\ ('company_id','=',company_id)]", readonly=True, states={'draft': [('readonly', False)]}) fiscal_document_id = fields.Many2one( 'l10n_br_account.fiscal.document', string='Documento', readonly=True, states={'draft': [('readonly', False)]}) fiscal_document_electronic = fields.Boolean( related='fiscal_document_id.electronic', type='boolean', readonly=True, store=True, string='Electronic') fiscal_document_code = fields.Char( related='fiscal_document_id.code', readonly=True, store=True, string='Document Code') fiscal_category_id = fields.Many2one( 'l10n_br_account.fiscal.category', 'Categoria Fiscal', readonly=True, states={'draft': [('readonly', False)]}) fiscal_position = fields.Many2one( 'account.fiscal.position', 'Fiscal Position', readonly=True, states={'draft': [('readonly', False)]}, ) account_document_event_ids = fields.One2many( 'l10n_br_account.document_event', 'document_event_ids', u'Eventos') fiscal_comment = fields.Text(u'Observação Fiscal') cnpj_cpf = fields.Char( string=u'CNPJ/CPF', related='partner_id.cnpj_cpf', ) legal_name = fields.Char( string=u'Razão Social', related='partner_id.legal_name', ) ie = fields.Char( string=u'Inscrição Estadual', related='partner_id.inscr_est', ) revenue_expense = fields.Boolean( related='journal_id.revenue_expense', readonly=True, store=True, string='Gera Financeiro' ) @api.multi
[documentos] def name_get(self): lista = [] for obj in self: name = obj.internal_number if obj.internal_number else '' lista.append((obj.id, name)) return lista
_sql_constraints = [ ('number_uniq', 'unique(number, company_id, journal_id,\ type, partner_id)', 'Invoice Number must be unique per Company!'), ] @api.multi
[documentos] def finalize_invoice_move_lines(self, move_lines): """ finalize_invoice_move_lines(move_lines) -> move_lines Hook method to be overridden in additional modules to verify and possibly alter the move lines to be created by an invoice, for special cases. :param move_lines: list of dictionaries with the account.move.lines (as for create()) :return: the (possibly updated) final move_lines to create for this invoice """ move_lines = super( AccountInvoice, self).finalize_invoice_move_lines(move_lines) count = 1 total = len([x for x in move_lines if x[2]['account_id'] == self.account_id.id]) number = self.name or self.number result = [] for move_line in move_lines: if move_line[2]['debit'] or move_line[2]['credit']: if move_line[2]['account_id'] == self.account_id.id: move_line[2]['name'] = '%s/%s-%s' % \ (number, count, total) count += 1 result.append(move_line) return result
@api.multi
[documentos] def open_fiscal_document(self): ctx = self.env.context.copy() ctx.update({ 'fiscal_document_code': self.fiscal_document_code, 'type': self.type }) return { 'name': _('Documento Fiscal'), 'view_type': 'form', 'view_mode': 'form', 'res_model': 'account.invoice', 'context': ctx, 'type': 'ir.actions.act_window', 'nodestroy': True, 'res_id': self.id }
[documentos]class AccountInvoiceLine(models.Model): _inherit = 'account.invoice.line' @api.one @api.depends('price_unit', 'discount', 'invoice_line_tax_id', 'quantity', 'product_id', 'invoice_id.partner_id', 'invoice_id.currency_id') def _compute_price(self): price = self.price_unit * (1 - (self.discount or 0.0) / 100.0) taxes = self.invoice_line_tax_id.compute_all( price, self.quantity, product=self.product_id, partner=self.invoice_id.partner_id, fiscal_position=self.fiscal_position) self.price_subtotal = taxes['total'] self.price_tax_discount = taxes['total'] - taxes['total_tax_discount'] if self.invoice_id: self.price_subtotal = self.invoice_id.currency_id.round( self.price_subtotal) self.price_tax_discount = self.invoice_id.currency_id.round( self.price_tax_discount) invoice_line_tax_id = fields.Many2many( 'account.tax', 'account_invoice_line_tax', 'invoice_line_id', 'tax_id', string='Taxes', domain=[('parent_id', '=', False)]) fiscal_category_id = fields.Many2one( 'l10n_br_account.fiscal.category', 'Categoria Fiscal') fiscal_position = fields.Many2one( 'account.fiscal.position', u'Posição Fiscal', ) price_tax_discount = fields.Float( string='Price Tax discount', store=True, digits=dp.get_precision('Account'), readonly=True, compute='_compute_price') @api.model
[documentos] def move_line_get_item(self, line): """ Overrrite core to fix invoice total account.move :param line: :return: """ res = super(AccountInvoiceLine, self).move_line_get_item(line) res['price'] = line.price_tax_discount return res