def test_comprobante_asociado_acepta_iva(self, afip_mock): afip = afip_mock() afip.consultar_proximo_numero.return_value = 11 gravado = Gravado.objects.get(pk=1) importe = Decimal('100.21') nuevo_comp = crear_comprobante_asociado( 1, importe, '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO, gravado.id) importe_total = importe + calcular_iva(importe, gravado.porcentaje) assert nuevo_comp.total_facturado == importe_total.quantize( Decimal(10)**-2) assert nuevo_comp.gravado == gravado afip.consultar_proximo_numero.return_value = 12 gravado = Gravado.objects.get(pk=2) nuevo_comp = crear_comprobante_asociado( 1, importe, '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO, gravado.id) importe_total = importe + calcular_iva(importe, gravado.porcentaje) assert nuevo_comp.total_facturado == importe_total.quantize( Decimal(10)**-2) assert nuevo_comp.gravado == gravado
def test_crear_comprobante_asociado_falla_si_no_se_realiza_la_conexion_con_afip( self, afip_mock): afip_mock.side_effect = AfipErrorRed with self.assertRaises(AfipErrorRed): crear_comprobante_asociado(1, Decimal(100), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO)
def test_falla_crear_comprobante_asociado_si_es_liquidacion(self, mock): nuevo_comp = Comprobante.objects.get(pk=1) nuevo_comp.tipo_comprobante = TipoComprobante.objects.get( pk=ID_TIPO_COMPROBANTE_LIQUIDACION) nuevo_comp.save() with self.assertRaises(TipoComprobanteAsociadoNoValidoException): crear_comprobante_asociado(1, Decimal(500), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO)
def test_crear_comprobante_asociado_falla_si_afip_no_valida_el_comprobante( self, afip_mock): afip = afip_mock() afip.emitir_comprobante.side_effect = AfipErrorValidacion with self.assertRaises(AfipErrorValidacion): crear_comprobante_asociado(1, Decimal(100), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO)
def crear_comprobante_asociado(self, request, pk=None): id_comprobante_asociado = int(request.POST['id-comprobante-asociado']) importe = Decimal(request.POST['importe']) concepto = request.POST['concepto'] tipo = request.POST.get('tipo', None) iva = request.POST.get('iva', None) try: comp = crear_comprobante_asociado(id_comprobante_asociado, importe, concepto, tipo, iva) content = {'data': ComprobanteSmallSerializer(comp).data , 'message': 'Comprobante creado correctamente'} return Response(content, status=status.HTTP_201_CREATED) except Comprobante.DoesNotExist: content = {'data': {}, 'message': 'El comprobante seleccionado no existe en la base de datos.'} return Response(content, status=status.HTTP_400_BAD_REQUEST) except TipoComprobanteAsociadoNoValidoException: content = {'data': {}, 'message': 'No se puede crear un comprobante asociado con el tipo seleccionado.'} return Response(content, status=status.HTTP_400_BAD_REQUEST) except AfipErrorRed as e: content = {'data': {}, 'message': 'No se pudo realizar la conexion con Afip, intente mas tarde.\nError: ' + str(e)} return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR) except AfipErrorValidacion as e: content = {'data': {}, 'message': 'Afip rechazo el comprobante.\nError: ' + str(e)} return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR) except Exception as e: content = {'data': {}, 'message': 'Ocurrio un error inesperado.\nError: ' + str(e)} return Response(content, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
def test_guarda_decimales_en_comprobante(self, afip_mock): afip = afip_mock() afip.consultar_proximo_numero.return_value = 11 nuevo_comp = crear_comprobante_asociado( 1, Decimal(200.52), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert nuevo_comp.total_facturado == Decimal(200.52).quantize( Decimal(10)**-2)
def test_comprobante_asociado_permite_crear_distintos_tipos( self, afip_mock): afip = afip_mock() afip.consultar_proximo_numero.return_value = 11 assert Comprobante.objects.get( pk=1).tipo_comprobante.id == ID_TIPO_COMPROBANTE_FACTURA nuevo_comp = crear_comprobante_asociado( 1, Decimal(1), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert nuevo_comp.tipo_comprobante.id == ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO afip.consultar_proximo_numero.return_value = 11 nuevo_comp = crear_comprobante_asociado( 1, Decimal(1), '', ID_TIPO_COMPROBANTE_NOTA_DE_DEBITO) assert nuevo_comp.tipo_comprobante.id == ID_TIPO_COMPROBANTE_NOTA_DE_DEBITO
def test_no_guarda_linea_en_db_si_comprobante_falla(self, afip_mock): afip = afip_mock() afip.emitir_comprobante.side_effect = AfipErrorValidacion cantidad_inicial = LineaDeComprobante.objects.count() with self.assertRaises(AfipErrorValidacion): crear_comprobante_asociado(1, Decimal(199), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert cantidad_inicial == LineaDeComprobante.objects.count() afip.emitir_comprobante.side_effect = AfipErrorRed with self.assertRaises(AfipErrorRed): crear_comprobante_asociado(1, Decimal(100), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert cantidad_inicial == LineaDeComprobante.objects.count()
def test_guarda_linea_en_db(self, afip_mock): afip = afip_mock() afip.consultar_proximo_numero.return_value = 15 cantidad_inicial = LineaDeComprobante.objects.count() nuevo_comp = crear_comprobante_asociado( 1, Decimal(400), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert cantidad_inicial + 1 == LineaDeComprobante.objects.count() assert LineaDeComprobante.objects.latest( 'id' ).concepto == 'AJUSTA FACTURA {} No {}-{} SEGUN DEBITO APLICADO'.format( nuevo_comp.sub_tipo, nuevo_comp.nro_terminal, nuevo_comp.numero) nuevo_comp = crear_comprobante_asociado( 1, Decimal(400), 'prueba', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert cantidad_inicial + 2 == LineaDeComprobante.objects.count() assert LineaDeComprobante.objects.latest('id').concepto == 'prueba'
def anular(self): from comprobante.comprobante_asociado import crear_comprobante_asociado if self.tipo_comprobante.id != ID_TIPO_COMPROBANTE_LIQUIDACION: linea = LineaDeComprobante.objects.filter(comprobante=self).first() nuevo_comprobante = crear_comprobante_asociado( self.id, linea.importe_neto, "Anula comprobante nro " + str(self.numero), TIPO_COMPROBANTE_ASOCIADO[self.tipo_comprobante.id]) else: nuevo_comprobante = None self.estado = Comprobante.ANULADO self.save() return nuevo_comprobante
def test_genera_nota_de_credito_si_se_envia_una_factura(self, afip_mock): afip = afip_mock() afip.consultar_proximo_numero.return_value = 10 comp = Comprobante.objects.get(pk=1) nuevo_comp = crear_comprobante_asociado( 1, Decimal(200), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert nuevo_comp.nombre_cliente == comp.nombre_cliente assert nuevo_comp.nro_cuit == comp.nro_cuit assert nuevo_comp.responsable == comp.responsable assert nuevo_comp.condicion_fiscal == comp.condicion_fiscal assert nuevo_comp.total_facturado == Decimal(200).quantize( Decimal(10)**-2) assert nuevo_comp.tipo_comprobante == TipoComprobante.objects.get( pk=ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO) assert nuevo_comp.nro_terminal == comp.nro_terminal
def test_crear_comprobante_asociado_falla_si_el_comprobante_no_existe( self): with self.assertRaises(Comprobante.DoesNotExist): crear_comprobante_asociado(50, Decimal(100), '', ID_TIPO_COMPROBANTE_NOTA_DE_CREDITO)