# -*- coding: utf-8 -*-
# © 2016 KMEE INFORMATICA LTDA (https://kmee.com.br)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import time
from openerp import models, fields, api
from openerp.addons import decimal_precision as dp
from openerp.tools.float_utils import float_compare
from openerp.addons.l10n_br_pos.models.pos_config import \
SIMPLIFIED_INVOICE_TYPE
from openerp.tools.translate import _
[documentos]class PosOrder(models.Model):
_inherit = 'pos.order'
@api.model
def _order_fields(self, ui_order):
return {
'name': ui_order['name'],
'user_id': ui_order['user_id'] or False,
'session_id': ui_order['pos_session_id'],
'lines': ui_order['lines'],
'pos_reference': ui_order['name'],
'partner_id': ui_order['partner_id'] or False,
'cfe_return': ui_order['cfe_return'],
'num_sessao_sat': ui_order['num_sessao_sat'],
'chave_cfe': ui_order['chave_cfe'],
}
@api.model
def _pos_order_type(self):
return SIMPLIFIED_INVOICE_TYPE + [('nfe', 'NF-E')]
simplified = fields.Boolean(string='Simplified invoice', default=True)
fiscal_document_type = fields.Selection(
string='Fiscal Document Type',
selection='_pos_order_type',
states={'draft': [('readonly', False)]},
readonly=True
)
cfe_return = fields.Binary('Retorno Cfe')
chave_cfe = fields.Char('Chave da Cfe')
num_sessao_sat = fields.Char(u'Número Sessão SAT envio Cfe')
pos_order_associated = fields.Many2one('pos.order', 'Venda Associada')
canceled_order = fields.Boolean('Venda Cancelada', readonly=True)
cfe_cancelamento_return = fields.Binary('Retorno Cfe Cancelamento')
chave_cfe_cancelamento = fields.Char('Chave da Cfe Cancelamento')
num_sessao_sat_cancelamento = fields.Char(u'Número Sessão SAT Cancelamento')
cnpj_cpf = fields.Char(
string=u'CNPJ/CPF',
related='partner_id.cnpj_cpf',
)
@api.one
[documentos] def action_invoice(self):
self.simplified = False
self.fiscal_document_type = 'nfe'
@api.multi
[documentos] def simplified_limit_check(self):
for order in self:
if not order.simplified:
continue
limit = order.session_id.config_id.simplified_invoice_limit
amount_total = order.amount_total
precision_digits = dp.get_precision('Account')(self.env.cr)[1]
# -1 or 0: amount_total <= limit, simplified
# 1: amount_total > limit, can not be simplified
simplified = (
float_compare(amount_total, limit,
precision_digits=precision_digits) <= 0)
# Change simplified flag if incompatible
if not simplified:
order.write(
{'simplified': simplified,
'fiscal_document_type':
order.session_id.config_id.simplified_invoice_type
})
@api.multi
[documentos] def write(self, vals):
result = super(PosOrder, self).write(vals)
self.simplified_limit_check()
return result
@api.model
[documentos] def create(self, vals):
order = super(PosOrder, self).create(vals)
order.simplified_limit_check()
return order
@api.model
[documentos] def return_orders_from_session(self, **kwargs):
orders_session = {'Orders': []}
orders = self.search(
[
('session_id', '=', kwargs['session_id']),
('state', '=', 'paid'),
('chave_cfe', '!=', '')
], limit=5, order="id DESC"
)
for order in orders:
order_vals = {
'id': order.id,
'name': order.name,
'pos_reference': order.pos_reference,
'partner': order.partner_id.name,
'date': order.date_order,
'total': '%.2f' % order.amount_total,
'chave_cfe': order.chave_cfe,
'canceled_order': order.canceled_order,
'can_cancel': False,
}
orders_session['Orders'].append(order_vals)
orders_session['Orders'][0]['can_cancel'] = True
return orders_session
@api.model
[documentos] def refund(self, ids, dados):
"""Create a copy of order for refund order"""
clone_list = []
for order in self.browse(ids):
current_session_ids = self.env['pos.session'].search([
('state', '!=', 'closed'),
('user_id', '=', self.env.uid)]
)
# if not current_session_ids:
# raise osv.except_osv(_('Error!'), _('To return product(s),
# you need to open a session that will be used to register
# the refund.'))
clone_id = order.copy()
clone_id.write({
'name': order.name + ' CANCEL',
'pos_reference': order.pos_reference + ' CANCEL',
'session_id': current_session_ids.id,
'date_order': time.strftime('%Y-%m-%d %H:%M:%S'),
'pos_order_associated': order.id,
'canceled_order': True,
'chave_cfe': '',
'cfe_return': '',
'num_sessao_sat': ''
})
clone_list.append(clone_id.id)
for clone in self.browse(clone_list):
for order_line in clone.lines:
order_line.write({
'qty': -order_line.qty
})
statements = self.env['account.bank.statement.line']
for statement in order.statement_ids:
vals = {
'name': statement.display_name + " CANCEL",
'statement_id': statement.statement_id.id,
'ref': statement.ref,
'pos_statement_id': clone.id,
'journal_id': statement.journal_id.id,
'amount': statement.amount * -1,
'date': statement.date,
'partner_id': statement.partner_id.id
if statement.partner_id else False,
'account_id': statement.account_id.id
}
statements.create(vals)
clone.action_paid()
parent_order = self.browse(clone.pos_order_associated.id)
parent_order.write({
'canceled_order': True,
'pos_order_associated': clone.id,
'cfe_cancelamento_return': dados['xml'],
'chave_cfe_cancelamento': dados['numSessao'],
'num_sessao_sat_cancelamento': dados['chave_cfe'],
})
return True
@api.model
[documentos] def retornar_order_by_id(self, order_id):
order = self.browse(order_id)
dados_reimpressao = {
'order_id': order_id,
'chaveConsulta': order.chave_cfe,
'doc_destinatario': order.partner_id.cnpj_cpf if order.partner_id
else False,
'xml_cfe_cacelada': order.cfe_cancelamento_return,
'xml_cfe_venda': order.cfe_return,
'canceled_order': order.canceled_order,
}
return dados_reimpressao