Exemple #1
0
    def xml_cancel(self, cr, uid, ids, inv, cancel_rps, cert_name,
                   context=None):
        cert_password = str(inv.company_id.nfe_a1_password)
        proc = ProcessadorNFSeSP(cert_name, cert_password)
        if datetime.datetime.now() > proc._certificado._data_fim_validade:
            return {
                'action': 'cancel',
                'message': '%s - %s' % (
                    u'Certificado Digital fora da validade',
                    inv.company_id.name)}
        if not self._check_server(cr, uid, ids, proc.servidor):
            return {
                'action': 'cancel',
                'message': u'Falha de comunicação com o servidor'}
        if inv.company_id.ei_environment == 'production':
            success, res, warnings, errors = proc.cancelar_nfse(cancel_rps)
        else:
            return {
                'action': 'cancel',
                'message': u'Serviço de Teste para Cancelamento INDISPONÍVEL'
            }
        msg_alerta = ''
        for alerta_line in res.Alerta:
            msg_alerta += '%s-%s\n' % (str(alerta_line.Codigo or 0),
                                       alerta_line.Descricao or '')

        msg_erro = ''
        for erro_line in res.Erro:
            msg_erro += '%s-%s\n' % (str(erro_line.Codigo or 0),
                                     erro_line.Descricao or '')

        if msg_erro:
            result = {
                'action': 'cancel',
                'message': '%s%s' % (msg_alerta, msg_erro)
            }
        else:
            result = {
                'action': 'cancel',
                'ei_status': 'cancelled',
                'message': '%s%s' % (msg_alerta, u'NF-e cancelada com SUCESSO')
            }
        return result
Exemple #2
0
    def cancel_nfse(self, cr, uid, ids, context=None):
        """Cancel one or many NFS-e"""

        canceled_invoices = []
        failed_invoices = []

        inv_obj = self.pool.get('account.invoice')
        active_ids = [i.id for i in
                      self.browse(cr, uid, ids[0]).selected_invoices]

        if len(active_ids) == 0:
            raise osv.except_osv(
                u'Atenção!',
                u'Não há notas confirmadas para efetuar o cancelamento.'
                )

        conditions = [('id', 'in', active_ids),
                      ('nfse_status', '=', NFSE_STATUS['send_ok'])]
        invoices_to_cancel = inv_obj.search(cr, uid, conditions)

        if len(invoices_to_cancel) == 0:
            raise osv.except_osv(
                u'Não foi possível cancelar a nota fiscal',
                u'A nota fiscal ainda não foi enviada, portanto não é ' + \
                u'possível cancela-la.'
                )

        for inv in inv_obj.browse(cr, uid, invoices_to_cancel,
                                  context=context):

            if not inv.nfse_numero or not inv.nfse_codigo_verificacao:
                raise osv.except_osv(
                    u'Não foi possível cancelar a nota fiscal',
                    u'A nota fiscal de número {} ainda '.format(inv.number) + \
                    u'não foi enviada, portanto não é possível cancela-la.'
                    )

            company = self.pool.get('res.company').browse(
                cr, uid, inv.company_id.id
                )
            self._check_certificate(company)
            cert_file_content = base64.decodestring(company.nfse_cert_file)

            caminho_temporario = u'/tmp/'
            cert_file = caminho_temporario + uuid4().hex
            arq_tmp = open(cert_file, 'w')
            arq_tmp.write(cert_file_content)
            arq_tmp.close()

            cert_password = company.nfse_cert_password

            processor = ProcessadorNFSeSP(cert_file, cert_password)

            self._check_server(cr, uid, ids, processor.servidor)

            try:
                success, res, warnings, errors = processor.cancelar_nfse({
                    'CPFCNPJRemetente': re.sub('[^0-9]', '', company.cnpj),
                    'InscricaoPrestador': company.inscr_mun,
                    'InscricaoTomador': inv.partner_id.inscr_mun,
                    'NumeroRPS': inv.internal_number,
                    'SerieRPS': inv.document_serie_id.code,
                    'NumeroNFe': inv.nfse_numero,
                    'CodigoVerificacao': inv.nfse_codigo_verificacao,
                    'Versao': 1,
                    })
            except CommunicationError, e:
                raise osv.except_osv(
                    u'Ocorreu um erro de comunicação.',
                    u'Código: {}\nDescrição: {}'.format(e.status, e.reason)
                    )

            if success:
                canceled_invoices.append(inv.id)

                data = {'nfse_status': NFSE_STATUS['cancel_ok']}

            else:
                self._show_warnings_and_errors(warnings, errors)

            self.pool.get('account.invoice').write(
                cr, uid, inv.id, data, context=context
                )