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