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
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 )
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 )
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 )
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)
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 )
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})
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'] )
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'] )