예제 #1
0
    def hacer_venta_productos_dos(
            self,
            punto_venta: PuntoVenta,
            nro_referencias: int = 5,
            cliente: Tercero = None,
            mesero: Tercero = None) -> [VentaProducto, dict]:
        from ventas.services import venta_producto_efectuar_venta
        from terceros.services import tercero_generarQR
        if not Producto.objects.exists():
            array_id_productos = self.crear_inventarios_productos(
                nro_referencias)
        else:
            array_id_productos = Producto.objects.values_list('pk', flat=True)

        pedido = []
        informacion = {'valor_venta': 0}
        precio_a_pagar = 0
        for i in range(len(array_id_productos)):
            precio_venta = Producto.objects.get(
                pk=array_id_productos[i]).precio_venta
            cantidad = random.randint(2, 7)
            precio_a_pagar += precio_venta * cantidad
            pedido.append({
                'producto_id': array_id_productos[i],
                'precio_total': precio_venta * cantidad,
                'cantidad': cantidad
            })

        if mesero is not None:
            venta = venta_producto_efectuar_venta(
                usuario_pdv_id=self.colaborador_cajero.usuario.id,
                punto_venta_id=punto_venta.id,
                tipo_venta=2,
                pedidos=pedido,
                cliente_usuario_id=mesero.usuario.id,
                cliente_qr_codigo=tercero_generarQR(mesero.id).qr_acceso)
        else:
            if cliente is not None:
                venta = venta_producto_efectuar_venta(
                    usuario_pdv_id=self.colaborador_cajero.usuario.id,
                    punto_venta_id=punto_venta.id,
                    tipo_venta=3,
                    pedidos=pedido,
                    cliente_usuario_id=cliente.usuario.id,
                    cliente_qr_codigo=tercero_generarQR(cliente.id).qr_acceso)
            else:
                venta = venta_producto_efectuar_venta(
                    usuario_pdv_id=self.colaborador_cajero.usuario.id,
                    punto_venta_id=punto_venta.id,
                    tipo_venta=1,
                    pedidos=pedido,
                    pago_efectivo=precio_a_pagar)

        valor_venta = venta.productos.aggregate(valor=Sum('precio_total'))
        informacion['valor_venta'] = valor_venta['valor']
        return venta, informacion
예제 #2
0
    def test_venta_producto_efectuar_venta_sin_tipo_venta_existente(self):
        from ventas.services import venta_producto_efectuar_venta
        pedido = self.crear_pedido()

        with self.assertRaisesMessage(
                ValidationError,
                "{'_error': 'No hay ninguna venta de este tipo'}"
        ):
            venta_producto_efectuar_venta(
                usuario_pdv_id=self.colaborador_cajero.usuario.id,
                punto_venta_id=self.punto_venta.id,
                tipo_venta=5,
                pedidos=pedido['pedido'],
                pago_efectivo=1
            )
예제 #3
0
 def test_venta_producto_efectuar_venta_producto_no_existente(self):
     from ventas.services import venta_producto_efectuar_venta
     from terceros.services import tercero_generarQR
     with self.assertRaisesMessage(
             ValidationError,
             "{'_error': 'No existe en el inventario el item de código"
     ):
         venta_producto_efectuar_venta(
             usuario_pdv_id=self.colaborador_cajero.usuario.id,
             punto_venta_id=self.punto_venta.id,
             tipo_venta=3,
             pedidos=self.crear_pedido_errado_producto_no_existente(),
             cliente_usuario_id=self.acompanante.usuario.id,
             cliente_qr_codigo=tercero_generarQR(self.acompanante.id).qr_acceso
         )
예제 #4
0
 def test_venta_producto_efectuar_venta_cantidad_no_existente(self):
     from ventas.services import venta_producto_efectuar_venta
     from terceros.services import tercero_generarQR
     with self.assertRaisesMessage(
             ValidationError,
             "{'_error': 'No hay suficientes existencias del producto"
     ):
         pedido = self.crear_pedido(inventario_no_existente=True)
         venta_producto_efectuar_venta(
             usuario_pdv_id=self.colaborador_cajero.usuario.id,
             punto_venta_id=self.punto_venta.id,
             tipo_venta=3,
             pedidos=pedido['pedido'],
             cliente_usuario_id=self.acompanante.usuario.id,
             cliente_qr_codigo=tercero_generarQR(self.acompanante.id).qr_acceso
         )
예제 #5
0
    def test_venta_producto_efectuar_venta_sin_tercero(self):
        from ventas.services import venta_producto_efectuar_venta
        pedido = self.crear_pedido()

        with self.assertRaisesMessage(
                ValidationError,
                "{'_error': 'El valor del pago no coincide con el valor de la compra. El valor de la compra es"
        ):
            venta_producto_efectuar_venta(
                usuario_pdv_id=self.colaborador_cajero.usuario.id,
                punto_venta_id=self.punto_venta.id,
                tipo_venta=1,
                pedidos=pedido['pedido'],
                pago_efectivo=1
            )
        venta = venta_producto_efectuar_venta(
            usuario_pdv_id=self.colaborador_cajero.usuario.id,
            punto_venta_id=self.punto_venta.id,
            tipo_venta=1,
            pedidos=pedido['pedido'],
            pago_efectivo=pedido['valor_pedido']
        )
        movimientos_detalles_venta = venta.movimientos.first()
        self.assertEqual(movimientos_detalles_venta.detalle, 'Salida de Mercancia x Venta')
        self.assertEqual(movimientos_detalles_venta.motivo, 'venta')
        for x in pedido['pedido']:
            producto_id = x.get('producto_id')
            cantidad = x.get('cantidad')
            precio_total = x.get('precio_total')
            movimiento_item = movimientos_detalles_venta.detalles.filter(producto__id=producto_id).first()
            venta_item = venta.productos.filter(producto__id=producto_id).first()
            self.assertEqual(movimiento_item.sale_cantidad, cantidad)
            self.assertEqual(movimiento_item.es_ultimo_saldo, True)
            self.assertEqual(venta_item.precio_total, precio_total)
            self.assertEqual(venta_item.cantidad, cantidad)
            self.assertEqual(venta_item.costo_unitario, movimiento_item.costo_unitario_promedio)
            self.assertEqual(venta_item.costo_total, movimiento_item.sale_costo)

        transaccion = venta.transacciones_caja.filter(
            tipo='I',
            tipo_dos='VENTA_PRODUCTO',
            concepto__contains='Ingreso x Venta de Producto en Efectivo'
        ).last()
        self.assertEqual(transaccion.valor_efectivo, pedido['valor_pedido'])
        self.assertEqual(transaccion.concepto, 'Ingreso x Venta de Producto en Efectivo')
        self.assertIsNone(venta.cuenta)
예제 #6
0
 def test_venta_producto_efectuar_venta_mesero_a_acompanante(self):
     from ventas.services import venta_producto_efectuar_venta, venta_producto_generar_comprobante_venta
     from terceros.services import tercero_generarQR
     pedido = self.crear_pedido()
     self.assertTrue(self.colaborador_dos.cuenta_abierta_mesero.compras_productos.all().count() == 0)
     with self.assertRaisesMessage(
             ValidationError,
             "'_error': 'No se puede crear una venta mesero a una acompañante'}"
     ):
         venta_producto_efectuar_venta(
             usuario_pdv_id=self.colaborador_cajero.usuario.id,
             punto_venta_id=self.punto_venta.id,
             tipo_venta=2,
             pedidos=pedido['pedido'],
             cliente_usuario_id=self.acompanante_dos.usuario.id,
             cliente_qr_codigo=tercero_generarQR(self.acompanante_dos.id).qr_acceso
         )
예제 #7
0
 def efectuar_venta_producto(self, request, pk=None):
     punto_venta = self.get_object()
     from ventas.services import venta_producto_efectuar_venta
     from terceros.models import Tercero
     pedidos = json.loads(request.POST.get('pedido', None))
     tipo_venta = int(request.POST.get('tipo_venta', None))
     qr_codigo = request.POST.get('qr_codigo')
     tercero_id = request.POST.get('tercero_id', None)
     pago_efectivo = request.POST.get('pago_efectivo', 0)
     tercero = None
     if tercero_id:
         tercero = Tercero.objects.get(pk=tercero_id)
     venta_producto_efectuar_venta(
         punto_venta_id=punto_venta.id,
         usuario_pdv_id=self.request.user.id,
         tipo_venta=tipo_venta,
         pedidos=pedidos,
         cliente_usuario_id=tercero.usuario_id if tercero_id else None,
         cliente_qr_codigo=qr_codigo,
         pago_efectivo=pago_efectivo)
     mensaje = 'La venta se ha efectuado'
     return Response({'result': mensaje})
예제 #8
0
    def test_venta_producto_efectuar_venta_mesero(self):
        from ventas.services import venta_producto_efectuar_venta, venta_producto_generar_comprobante_venta
        from terceros.services import tercero_generarQR
        pedido = self.crear_pedido()
        self.assertTrue(self.colaborador_dos.cuenta_abierta_mesero.compras_productos.all().count() == 0)
        venta = venta_producto_efectuar_venta(
            usuario_pdv_id=self.colaborador_cajero.usuario.id,
            punto_venta_id=self.punto_venta.id,
            tipo_venta=2,
            pedidos=pedido['pedido'],
            cliente_usuario_id=self.colaborador_dos.usuario.id,
            cliente_qr_codigo=tercero_generarQR(self.colaborador_dos.id).qr_acceso
        )

        recibo_venta = venta_producto_generar_comprobante_venta(venta_producto_id=venta.id)
        recibo_venta.write_pdf(
            target='media/pruebas_pdf/recibo_venta_producto_mesero.pdf'
        )

        movimientos_detalles_venta = venta.movimientos.first()
        self.assertEqual(movimientos_detalles_venta.detalle, 'Salida de Mercancia x Venta')
        self.assertEqual(movimientos_detalles_venta.motivo, 'venta')
        for x in pedido['pedido']:
            producto_id = x.get('producto_id')
            cantidad = x.get('cantidad')
            precio_total = x.get('precio_total')
            movimiento_item = movimientos_detalles_venta.detalles.filter(producto__id=producto_id).first()
            venta_item = venta.productos.filter(producto__id=producto_id).first()
            self.assertEqual(movimiento_item.sale_cantidad, cantidad)
            self.assertEqual(movimiento_item.es_ultimo_saldo, True)
            self.assertEqual(venta_item.precio_total, precio_total)
            self.assertEqual(venta_item.cantidad, cantidad)
            self.assertEqual(venta_item.costo_unitario, movimiento_item.costo_unitario_promedio)
            self.assertEqual(venta_item.costo_total, movimiento_item.sale_costo)

        compras_productos = self.colaborador_dos.cuenta_abierta_mesero.compras_productos.first()
        self.assertEqual(compras_productos.productos.count(), len(pedido['pedido']))
        self.assertEqual(
            self.colaborador_dos.cuenta_abierta_mesero.cxc_por_compras_productos,
            pedido['valor_pedido']
        )
예제 #9
0
    def test_venta_producto_efectuar(self):
        from ventas.services import venta_producto_efectuar_venta
        from terceros.services import tercero_generarQR
        self.assertTrue(self.acompanante.cuenta_abierta.compras_productos.all().count() == 0)
        pedido_ini = self.crear_pedido(nro_referencias=5)
        venta_producto_efectuar_venta(
            usuario_pdv_id=self.colaborador_cajero.usuario.id,
            punto_venta_id=self.punto_venta.id,
            tipo_venta=3,
            pedidos=pedido_ini['pedido'],
            cliente_usuario_id=self.colaborador_dos.usuario.id,
            cliente_qr_codigo=tercero_generarQR(self.colaborador_dos.id).qr_acceso
        )

        self.assertEqual(
            self.colaborador_dos.cuenta_abierta.cxc_por_compras_productos,
            pedido_ini['valor_pedido']
        )

        pedido = self.crear_pedido(nro_referencias=5)
        venta = venta_producto_efectuar_venta(
            usuario_pdv_id=self.colaborador_cajero.usuario.id,
            punto_venta_id=self.punto_venta.id,
            tipo_venta=3,
            pedidos=pedido['pedido'],
            cliente_usuario_id=self.acompanante.usuario.id,
            cliente_qr_codigo=tercero_generarQR(self.acompanante.id).qr_acceso
        )
        valor_pedido_efectivo = venta.productos.aggregate(
            precio_venta=Sum('precio_total')
        )['precio_venta']
        cantidad_pedido_efectivo = venta.productos.aggregate(
            cantidad=Sum('cantidad')
        )['cantidad']
        valor_pedido_esperado = pedido['valor_pedido']
        cantidad_pedido_esperado = pedido['cantidad_pedido']

        self.assertEqual(valor_pedido_efectivo, valor_pedido_esperado)
        self.assertEqual(cantidad_pedido_efectivo, cantidad_pedido_esperado)

        movimientos_detalles_venta = venta.movimientos.first()
        self.assertEqual(movimientos_detalles_venta.detalle, 'Salida de Mercancia x Venta')
        self.assertEqual(movimientos_detalles_venta.motivo, 'venta')
        for x in pedido['pedido']:
            producto_id = x.get('producto_id')
            cantidad = x.get('cantidad')
            precio_total = x.get('precio_total')
            movimiento_item = movimientos_detalles_venta.detalles.filter(producto__id=producto_id).first()
            venta_item = venta.productos.filter(producto__id=producto_id).first()
            self.assertEqual(movimiento_item.sale_cantidad, cantidad)
            self.assertEqual(movimiento_item.es_ultimo_saldo, True)
            self.assertEqual(venta_item.precio_total, precio_total)
            self.assertEqual(venta_item.cantidad, cantidad)
            self.assertEqual(venta_item.costo_unitario, movimiento_item.costo_unitario_promedio)
            self.assertEqual(venta_item.costo_total, movimiento_item.sale_costo)
        compras_productos = self.acompanante.cuenta_abierta.compras_productos.first()
        self.assertEqual(compras_productos.productos.count(), len(pedido['pedido']))
        self.assertEqual(
            self.acompanante.cuenta_abierta.cxc_por_compras_productos,
            pedido['valor_pedido']
        )