def crear_productos(self): from inventarios.services import ( movimiento_inventario_saldo_inicial_crear, movimiento_inventario_aplicar_movimiento) from inventarios.factories import MovimientoInventarioDetalleFactory movimiento = movimiento_inventario_saldo_inicial_crear( fecha=timezone.now(), bodega_destino_id=self.bodega.id, usuario_id=self.user.id) self.mid_uno = MovimientoInventarioDetalleFactory( movimiento=movimiento) self.mid_dos = MovimientoInventarioDetalleFactory( movimiento=movimiento) self.mid_tres = MovimientoInventarioDetalleFactory( movimiento=movimiento) movimiento_inventario_aplicar_movimiento( movimiento_inventario_id=movimiento.id)
def ventasProductosInventarioInicialSetUp(self): from inventarios.factories import MovimientoInventarioDetalleFactory from inventarios.services import ( movimiento_inventario_aplicar_movimiento, movimiento_inventario_saldo_inicial_crear) movimiento = movimiento_inventario_saldo_inicial_crear( fecha=timezone.now(), bodega_destino_id=self.bodega.id, usuario_id=self.colaborador_cajero.usuario.id) self.mid_uno = MovimientoInventarioDetalleFactory( movimiento=movimiento, entra_cantidad=100, entra_costo=100000) self.mid_dos = MovimientoInventarioDetalleFactory( movimiento=movimiento, entra_cantidad=80, entra_costo=70000) self.mid_tres = MovimientoInventarioDetalleFactory( movimiento=movimiento, entra_cantidad=85, entra_costo=120000) movimiento_inventario_aplicar_movimiento( movimiento_inventario_id=movimiento.id)
def crear_inventarios_productos(self, nro_referencias: int = 5): from inventarios.factories import MovimientoInventarioDetalleFactory from productos.factories import ProductoFactory from inventarios.services import ( movimiento_inventario_aplicar_movimiento, movimiento_inventario_saldo_inicial_crear) movimiento = movimiento_inventario_saldo_inicial_crear( fecha=timezone.now(), bodega_destino_id=self.bodega.id, usuario_id=self.colaborador_cajero.usuario.id) for i in range(nro_referencias): producto = ProductoFactory() entra_cantidad = random.randint(300, 1000) entra_costo = (producto.precio_venta - producto.precio_venta * 0.3) * entra_cantidad MovimientoInventarioDetalleFactory(producto=producto, movimiento=movimiento, entra_cantidad=entra_cantidad, entra_costo=entra_costo) movimiento_inventario_aplicar_movimiento( movimiento_inventario_id=movimiento.id) return movimiento.detalles.values_list('producto_id', flat=True)
def cargar_inventario(self, request, pk=None): movimiento_inventario = self.get_object() movimiento_inventario = movimiento_inventario_aplicar_movimiento( movimiento_inventario.id) serializer = self.get_serializer(movimiento_inventario) return Response(serializer.data)
def venta_producto_efectuar_venta(punto_venta_id: int, usuario_pdv_id: int, tipo_venta: int, pedidos: list, cliente_usuario_id: int = None, cliente_qr_codigo: str = None, pago_efectivo: float = 0) -> VentaProducto: from puntos_venta.models import PuntoVenta from terceros.models import Tercero from inventarios.models import MovimientoInventarioDetalle from ventas.models import VentaProductoDetalle from inventarios.services import ( movimiento_inventario_venta_crear, movimiento_inventario_detalle_salida_add_item, movimiento_inventario_aplicar_movimiento) punto_venta = PuntoVenta.objects.get(pk=punto_venta_id) punto_venta_turno = punto_venta.usuario_actual.tercero.turno_punto_venta_abierto bodega = punto_venta.bodega if tipo_venta == 3 or tipo_venta == 2: tercero = Tercero.objects.get(usuario_id=cliente_usuario_id, qr_acceso=cliente_qr_codigo) if tipo_venta == 2: # Venta en mesero if tercero.es_acompanante: raise serializers.ValidationError({ '_error': 'No se puede crear una venta mesero a una acompañante' }) venta = venta_producto_crear( punto_venta_turno_id=punto_venta_turno.id, cuenta_id=tercero.cuenta_abierta_mesero.id) else: # Venta colaborador o acompañante venta = venta_producto_crear( punto_venta_turno_id=punto_venta_turno.id, cuenta_id=tercero.cuenta_abierta.id) elif tipo_venta == 1: # Venta en efectivo venta = venta_producto_crear(punto_venta_turno_id=punto_venta_turno.id) else: venta = None if not venta: raise serializers.ValidationError( {'_error': 'No hay ninguna venta de este tipo'}) movimiento_venta = movimiento_inventario_venta_crear( bodega_origen_id=bodega.id, usuario_id=usuario_pdv_id) for item in pedidos: producto_id = item.get('producto_id') cantidad = item.get('cantidad') saldo_producto = MovimientoInventarioDetalle.objects.filter( producto_id=producto_id, es_ultimo_saldo=True, movimiento__bodega=bodega) if not saldo_producto.exists(): raise serializers.ValidationError({ '_error': 'No existe en el inventario el item de código %s' % producto_id }) saldo_producto = saldo_producto.first() if saldo_producto.saldo_cantidad < cantidad: raise serializers.ValidationError({ '_error': 'No hay suficientes existencias del producto %s. Usted solicita %s y solo hay %s' % (saldo_producto.producto.nombre, cantidad, saldo_producto.saldo_cantidad) }) movimiento_inventario_detalle_salida_add_item( movimiento_id=movimiento_venta.id, producto_id=producto_id, cantidad=cantidad) movimiento_venta = movimiento_inventario_aplicar_movimiento( movimiento_venta.id) venta.movimientos.add(movimiento_venta) detalles_movimiento = movimiento_venta.detalles.all() for item in pedidos: producto_id = item.get('producto_id') item_movimiento_detalle = detalles_movimiento.get( producto_id=producto_id) precio_total = item.get('precio_total') VentaProductoDetalle.objects.create( venta_id=venta.id, producto_id=producto_id, cantidad=item_movimiento_detalle.sale_cantidad, precio_total=precio_total, precio_unitario=(precio_total / item_movimiento_detalle.sale_cantidad), costo_total=item_movimiento_detalle.sale_costo, costo_unitario=item_movimiento_detalle.costo_unitario_promedio) if tipo_venta == 1: valor_venta = venta.productos.aggregate( precio_total=Sum('precio_total'))['precio_total'] if int(Decimal(pago_efectivo)) != int(Decimal(valor_venta)): raise serializers.ValidationError({ '_error': 'El valor del pago no coincide con el valor de la compra. El valor de la compra es %s y el del efectivo fue %s' % (valor_venta, pago_efectivo) }) from cajas.services import transaccion_caja_registrar_venta_product_efectivo_ingreso transaccion_caja_registrar_venta_product_efectivo_ingreso( punto_venta_turno_id=punto_venta_turno.id, valor_efectivo=Decimal(pago_efectivo), venta_id=venta.id) return venta