コード例 #1
0
 def test_produccion_autorizacion(self):
     res = sri_sender.autorizar_comprobante("123456", entorno='produccion')
     self.assertEquals(res.claveAccesoConsultada, '123456')
     self.assertEquals(res.autorizaciones.autorizacion[0].estado,
                       'RECHAZADA')
     self.assertEquals(
         res.autorizaciones.autorizacion[0].mensajes.mensaje[0].
         identificador, 'null')
コード例 #2
0
    def test_full_context_manager(self):
        clave_acceso = '2209201501170439497000120021000000146680001466819'
        xml_data = '<xml></xml>'
        entorno = 'produccion'
        enviar_response = gen_respuesta_solicitud_invalid_xml(clave_acceso)
        autorizar_response = gen_respuesta_autorizacion_comprobante_valido(
            clave_acceso, xml_data, ambiente=entorno)

        with MockSRISender(enviar_response,
                           autorizar_response) as (enviar_mock,
                                                   autorizar_mock):
            sri_sender.enviar_comprobante(xml_data, entorno=entorno)
            sri_sender.autorizar_comprobante(clave_acceso, entorno=entorno)

        self.assertEquals(autorizar_mock.request_args['clave_acceso'],
                          clave_acceso)
        self.assertEquals(autorizar_mock.request_args['entorno'], entorno)

        self.assertEquals(enviar_mock.request_args['xml_data'], xml_data)
        self.assertEquals(enviar_mock.request_args['entorno'], entorno)
コード例 #3
0
    def test_MockValidarComprobante(self):
        clave_acceso = '2209201501170439497000120021000000146680001466819'
        xml_data = '<xml></xml>'
        entorno = 'produccion'
        response = gen_respuesta_autorizacion_comprobante_valido(
            clave_acceso, xml_data, ambiente=entorno)

        with MockAutorizarComprobante(response) as mock:
            res = sri_sender.autorizar_comprobante(clave_acceso,
                                                   entorno=entorno)

        self.assertEquals(res, response)
        self.assertEquals(mock.request_args['clave_acceso'], clave_acceso)
        self.assertEquals(mock.request_args['entorno'], entorno)
コード例 #4
0
    def check_if_annulled_in_SRI(self):
        """
        Checks if a bill has been annulled in SRI
        Requires:
            Clave Acceso
            status = Accepted
            ambiente_sri
            fecha_autorizacion is no more than 15 days old
        After:
            1: No
                status = Accepted
            2: Yes
                status = Annulled
            sri_last_check is set to now
        """
        assert self.clave_acceso
        assert self.status == SRIStatus.options.Accepted
        assert self.ambiente_sri in [
            AmbienteSRI.options.pruebas, AmbienteSRI.options.produccion
        ]
        assert datetime.now(tz=pytz.timezone('America/Guayaquil')
                            ) - self.fecha_autorizacion < timedelta(days=15)

        autorizar_comprobante_result = sri_sender.autorizar_comprobante(
            self.clave_acceso, entorno=self.ambiente_sri)

        if int(autorizar_comprobante_result.numeroComprobantes) == 1:
            # All right
            res = False
        elif int(autorizar_comprobante_result.numeroComprobantes) == 0:
            self.status = SRIStatus.options.Annulled
            res = True

        self.sri_last_check = datetime.now(
            tz=pytz.timezone('America/Guayaquil'))
        self.secret_save()
        return res
コード例 #5
0
 def test_produccion_autorizacion(self):
     res = sri_sender.autorizar_comprobante("123456", entorno='produccion')
     self.assertEquals(res.claveAccesoConsultada, '123456')
     self.assertEquals(res.autorizaciones.autorizacion[0].estado, 'RECHAZADA')
     self.assertEquals(res.autorizaciones.autorizacion[0].mensajes.mensaje[0].identificador, 'null')
コード例 #6
0
    def validate_in_SRI(self):
        """
        Validates a bill in SRI
        Requires:
            Clave Acceso
            status = Sent
            ambiente_sri
        After:
            1: Being processed
                status = Sent
                Nothing changed
            2: Accepted
                status = Accepted
                Fecha autorizacion
                numero autorizacion
                maybe Issues
            3: Rejected
                status = NotSent
                Fecha autorizacion
                Issues
            sri_last_check is set to now
        """
        assert self.clave_acceso
        assert self.status == SRIStatus.options.Sent
        assert self.ambiente_sri in [
            AmbienteSRI.options.pruebas, AmbienteSRI.options.produccion
        ]

        def convert_messages(messages):
            def convert_msg(msg):
                converted = {}
                for key in [
                        'tipo', 'identificador', 'mensaje',
                        'informacionAdicional'
                ]:
                    converted[key] = getattr(msg, key, None)

            return map(convert_msg, messages)

        autorizar_comprobante_result = sri_sender.autorizar_comprobante(
            self.clave_acceso, entorno=self.ambiente_sri)

        if int(autorizar_comprobante_result.numeroComprobantes) > 0:
            already_authorised = False
            for autorizacion in autorizar_comprobante_result.autorizaciones.autorizacion:
                # This should not happen, but it happened
                # The same bill was submitted twice, with same everything but randoms from signature
                # It was approved both times
                if autorizacion.estado == 'AUTORIZADO':
                    if already_authorised:
                        self.company.add_db_issue(
                            """
El comprobante con clave de acceso {clave_acceso} ha sido enviado y aprobado dos veces, con
códigos de autorización {cod_1} y {cod_2}. Se recomienda anular el segundo.""".
                            format(clave_acceso=autorizar_comprobante_result.
                                   claveAccesoConsultada,
                                   cod_1=self.numero_autorizacion,
                                   cod_2=autorizacion.numeroAutorizacion))
                    else:
                        self.fecha_autorizacion = autorizacion.fechaAutorizacion
                        self.numero_autorizacion = autorizacion.numeroAutorizacion
                        if autorizacion.mensajes:
                            self.issues = json.dumps(
                                convert_messages(
                                    autorizacion.mensajes.mensaje))
                        self.status = SRIStatus.options.Accepted
                        self.secret_save()
                        res = True
                        already_authorised = True
                elif autorizacion.estado == 'RECHAZADA':
                    self.fecha_autorizacion = autorizacion.fechaAutorizacion
                    self.issues = json.dumps(
                        convert_messages(autorizacion.mensajes.mensaje))
                    self.status = SRIStatus.options.Rejected
                    self.secret_save()
                    res = False
                else:  # Aun no procesado??
                    # FIXME: log
                    res = False
        else:
            res = False

        self.sri_last_check = datetime.now(
            tz=pytz.timezone('America/Guayaquil'))

        self.secret_save()

        if self.status == SRIStatus.options.Sent:
            # Nothing changed
            pass
        elif self.status == SRIStatus.options.Accepted:
            assert self.fecha_autorizacion
            assert self.numero_autorizacion
        elif self.status == SRIStatus.options.Rejected:
            assert self.fecha_autorizacion
            assert self.issues
        else:
            assert False  # This should not happen
        return res
コード例 #7
0
    def send_to_SRI(self):
        """
        Sends a bill to SRI
        Requires:
            XML
            Clave Acceso
            status = ReadyToSend
            ambiente_sri
            punto_emision
        After:
            status = Sent or NotSent
            maybe Issues
        """
        assert self.status == SRIStatus.options.ReadyToSend
        assert self.ambiente_sri in [
            AmbienteSRI.options.pruebas, AmbienteSRI.options.produccion
        ]
        assert self.punto_emision

        def convert_messages(messages):
            def convert_msg(msg):
                converted = {}
                for key in [
                        'tipo', 'identificador', 'mensaje',
                        'informacionAdicional'
                ]:
                    converted[key] = getattr(msg, key, None)
                return converted

            return [convert_msg(msg) for msg in messages]

        # Check it has not been sent and accepted
        if self.clave_acceso:
            autorizar_comprobante_result = sri_sender.autorizar_comprobante(
                self.clave_acceso, entorno=self.ambiente_sri)
            if int(autorizar_comprobante_result.numeroComprobantes) > 0:
                for autorizacion in autorizar_comprobante_result.autorizaciones.autorizacion:
                    if autorizacion.estado == 'AUTORIZADO':
                        self.status = SRIStatus.options.Sent
                        self.secret_save()
                        return True
                    elif autorizacion.estado == 'RECHAZADA':
                        pass
                    else:  # Not processed yet
                        return False

        with transaction.atomic():
            punto_emision = self.punto_emision

            self.ambiente_sri = punto_emision.ambiente_sri
            self.secuencial = {
                'pruebas': punto_emision.siguiente_secuencial_pruebas,
                'produccion': punto_emision.siguiente_secuencial_produccion,
            }[self.ambiente_sri]
            self.secret_save()

            # Generate and sign XML
            xml_data, clave_acceso = self.gen_xml()

            self.xml_content = xml_data
            self.clave_acceso = clave_acceso
            self.issues = ''
            self.secret_save()

            enviar_comprobante_result = sri_sender.enviar_comprobante(
                self.xml_content, entorno=self.ambiente_sri)
            if enviar_comprobante_result.estado == 'RECIBIDA':
                punto_emision = self.punto_emision
                if self.ambiente_sri == AmbienteSRI.options.pruebas:
                    punto_emision.siguiente_secuencial_pruebas += 1
                else:
                    punto_emision.siguiente_secuencial_produccion += 1
                punto_emision.save()
                self.status = SRIStatus.options.Sent
                self.secret_save()
                res = True
            else:
                enviar_msgs = (enviar_comprobante_result.comprobantes.
                               comprobante[0].mensajes.mensaje)
                self.issues = json.dumps(convert_messages(enviar_msgs))
                self.status = SRIStatus.options.Rejected
                self.secret_save()
                res = False
        assert self.status in [
            SRIStatus.options.Sent, SRIStatus.options.Rejected
        ]
        return res