def post(self, request): semanas = request.POST.getlist('semana', []) respuesta = [] catalogoProd = Catalogo_Producto.objects.filter(fk_catalogo__fk_semana_id__in=semanas, fk_catalogo__fk_cooperativa_id=get_id_cooperativa_global( request)) for pro in catalogoProd: valor_compra = obtener_valor_compra(semanas, pro.fk_producto, get_id_cooperativa_global(request)) valor_venta = pro.precio cantVendida = obtener_cantidad_vendida(semanas, pro.fk_producto, get_id_cooperativa_global(request)) producto = Producto.objects.filter(id=pro.fk_producto_id).first() porcentaje = int if cantVendida != 0: porcentaje = int((((valor_venta - valor_compra) * cantVendida) * 100) / (valor_compra * cantVendida)) else: porcentaje = 0 respuesta.append({ 'producto': producto, 'cantidad_vendida': cantVendida, 'valor_compra': valor_compra, 'valor_venta': valor_venta, 'ganancia': (valor_venta - valor_compra) * cantVendida, 'porcentaje': porcentaje }) ordenado = sorted(respuesta, key=itemgetter('ganancia'), reverse=True) return render(request, 'Administrador/Informes/mejoresProductos.html', {'datos': ordenado})
def agregar_producto_carrito(request, product_id, quantity): product = Catalogo_Producto.objects.get( fk_producto_id=product_id, fk_catalogo__fk_cooperativa_id=get_id_cooperativa_global(request), fk_catalogo__fk_semana=get_or_create_week()) cantidad_disponible = cantidad_disponible_producto_catalogo( product, get_id_cooperativa_global(request)) cart = get_or_create_cart(request) items = cart.get('items', []) exists = False i = 0 while not exists and i < len(items): item = items[i] if item['product_id'] == product_id: new_quantity = item['quantity'] + quantity if new_quantity > cantidad_disponible: new_quantity = cantidad_disponible item['quantity'] = new_quantity exists = True i += 1 if not exists: items.append({ 'product_id': product_id, 'quantity': quantity, 'name': product.fk_producto.nombre, 'image': product.fk_producto.imagen.url, 'price': float(product.precio), 'unit': product.fk_producto.unidad_medida, 'cantidad_disponible': cantidad_disponible }) cart['items'] = items return cart
def get(self, request): semana = Semana.objects.last() ofertas_por_pagar = Oferta_Producto \ .objects.filter(fk_orden_compra__isnull=True, cantidad_vendida__gt=0, fk_oferta__fk_productor__fk_cooperativa_id=get_id_cooperativa_global(request)) \ .exclude(fk_oferta__fk_semana=semana) \ .distinct('fk_oferta__fk_productor') productor = Productor.objects.filter(fk_cooperativa_id=get_id_cooperativa_global(request)) return render(request, 'Administrador/pagos-pendientes-productor.html', {'ofertas_por_pagar': ofertas_por_pagar, 'productores': productor})
def get(self, request): canastas = Canasta.objects.filter( esta_publicada=True, fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) if canastas: arreglo_canastas = formatear_lista_canastas( canastas, get_id_cooperativa_global(request)) return render(request, 'Cliente/canastas.html', {'canastas_json': json.dumps(arreglo_canastas)}) else: messages.add_message(request, messages.INFO, 'Actualmente no hay canastas disponibles') return redirect(reverse('cliente:index'))
def agregar_canasta_carrito(request, canasta_id, quantity): canasta = Canasta.objects.get(id=canasta_id) cantidad_disponible = cantidad_disponible_canasta( canasta, get_id_cooperativa_global(request)) cart = get_or_create_cart(request) canastas = cart.get('canastas', []) exists = False i = 0 while not exists and i < len(canastas): canasta_act = canastas[i] if canasta_act['id'] == canasta_id: new_quantity = canasta_act['quantity'] + quantity if new_quantity > cantidad_disponible: new_quantity = cantidad_disponible canasta_act['quantity'] = new_quantity exists = True i += 1 if not exists: canastas.append({ 'id': canasta_id, 'quantity': quantity, 'name': canasta.nombre, 'image': canasta.imagen.url if canasta.imagen else '', 'price': float(canasta.precio), 'cantidad_disponible': cantidad_disponible }) cart['canastas'] = canastas return cart
def post(self, request): id_canasta = request.POST.get('id_canasta', '0') canasta = Canasta.objects.filter(id=id_canasta, fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)).first() if canasta: canasta.delete() messages.add_message(request, messages.SUCCESS, 'La canasta fue eliminada') else: messages.add_message(request, messages.ERROR, 'No existe la canasta que estás tratando de eliminar') return redirect(reverse('administrador:canastas'))
def get(self, request, id_canasta): canasta = Canasta.objects.filter(id=id_canasta, fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)).first() if canasta: ids_productos_canasta = CanastaProducto.objects \ .filter(fk_canasta_id=canasta.id) \ .values_list('fk_producto_catalogo_id', flat=True) productos_disponibles = Catalogo_Producto.objects \ .filter(fk_catalogo__fk_semana_id=canasta.fk_semana_id, fk_catalogo__fk_cooperativa_id=get_id_cooperativa_global(request)) \ .exclude(id__in=ids_productos_canasta) \ .distinct() return render(request, 'Administrador/detalles-canasta.html', { 'canasta': canasta, 'productos_disponibles': productos_disponibles }) else: messages.add_message(request, messages.ERROR, 'No existe la canasta que estás buscando') return redirect(reverse('administrador:canastas'))
def post(self, request): nombre = request.POST.get('nombre', '') imagen = request.FILES.get('imagen', None) nueva = Canasta(fk_semana=get_or_create_week(), nombre=nombre, imagen=imagen, fk_cooperativa_id=get_id_cooperativa_global(request)) nueva.save() messages.add_message( request, messages.SUCCESS, 'La canasta fue creada exitosamente. Ahora puede agregar los productos que desee' ) return redirect(reverse('administrador:detalles-canasta', kwargs={'id_canasta': nueva.id}))
def get(self, request, id_productor): productor = Productor.objects.filter(id=id_productor, fk_cooperativa_id=get_id_cooperativa_global(request)).first() if productor: orden_compra = Orden_Compra.objects.filter(fk_productor_id=id_productor, fk_productor__fk_cooperativa_id=get_id_cooperativa_global( request)) \ .order_by('-id') return render(request, 'Administrador/ordenes-pago-productor.html', {'ordenes_compra': orden_compra, 'productor': productor}) else: return redirect(reverse('administrador:pagos-pendientes-productor'))
def get(self, request, id_oferta, guardado_exitoso): if (Oferta.objects.filter(id=id_oferta, fk_productor__fk_cooperativa_id=get_id_cooperativa_global(request)).exists()): ofertas_producto = Oferta_Producto.cargar_ofertas(id_oferta) return render(request, 'Administrador/detalle-oferta.html', { 'ofertas_producto': ofertas_producto, 'id_oferta': id_oferta, 'guardado_exitoso': guardado_exitoso }) else: return redirect(reverse('administrador:ofertas'))
def get(self, request): semana = get_or_create_next_week() ofertas = list() for productor in Productor.objects.filter(fk_cooperativa_id=get_id_cooperativa_global(request)): cantidad_ofertas = 0 id_oferta = 0 for oferta in Oferta.objects.filter(fk_productor=productor, fk_semana=semana): cantidad_ofertas = Oferta_Producto.objects.filter(fk_oferta=oferta).count() id_oferta = oferta.id if cantidad_ofertas > 0: ofertas.append((productor.nombre, cantidad_ofertas, id_oferta)) return render(request, 'Administrador/ofertas.html', {'ofertas': ofertas, 'semana': semana})
def get(self, request): semana = get_or_create_week() ofertas_pro = Oferta_Producto \ .objects.filter(estado=1, fk_oferta__fk_semana=semana, fk_oferta__fk_productor__fk_cooperativa_id=get_id_cooperativa_global(request)) \ .values('fk_producto', 'fk_producto__nombre', 'fk_producto__imagen', 'fk_producto__unidad_medida') \ .annotate(canAceptada=Sum('cantidad_aceptada'), canVendida=Sum('cantidad_vendida'), canDisponible=Sum(F('cantidad_aceptada') - F('cantidad_vendida'))) \ .distinct() return render(request, 'Administrador/Informes/inventario.html', { 'ofertas_pro': ofertas_pro, 'semana': semana })
def get(self, request, id_productor): productor = Productor.objects.filter(id=id_productor, fk_cooperativa_id=get_id_cooperativa_global(request)).first() if productor: semana = Semana.objects.last() ofertas_por_pagar = Oferta_Producto.objects. \ filter(fk_orden_compra__isnull=True, fk_oferta__fk_productor_id=id_productor, cantidad_vendida__gt=0) \ .exclude(fk_oferta__fk_semana=semana) productor = Productor.objects.filter(id=id_productor)[0] return render(request, 'Administrador/detalle-productos-orden-pago.html', { 'ofertas_por_pagar': ofertas_por_pagar, 'productor': productor }) else: return redirect(reverse('administrador:pagos-pendientes-productor'))
def get(self, request): productores_destacados = list() for productor in Productor.objects.filter(fk_cooperativa_id=get_id_cooperativa_global(request)): ordenes = Orden_Compra.objects.filter(fk_productor=productor, estado='PA') cantidad_ordenes = ordenes.count() if cantidad_ordenes > 0: nombre = productor.nombre cooperativa = productor.fk_cooperativa.nombre total_ventas = ordenes.aggregate(Sum('valor_total'))['valor_total__sum'] ultima_fecha = ordenes.latest('fecha_creacion') productores_destacados.append( ProductorDestacado(productor.id, nombre, cooperativa, total_ventas, ultima_fecha) ) productores_ordenados = sorted(productores_destacados, key=lambda x: x.total_ventas, reverse=True) return render(request, 'Administrador/Informes/productores_destacados.html', { 'productores_destacados': productores_ordenados })
def get_cantidad_disponible_producto_catalogo(producto_catalogo, request): return cantidad_disponible_producto_catalogo( producto_catalogo, get_id_cooperativa_global(request))
def get(self, request): productores = Productor.objects.filter(fk_cooperativa_id=get_id_cooperativa_global(request)).order_by('id') return render(request, 'Administrador/Productores.html', {'listaProductores': productores})
def post(self, request): canastas = Canasta.objects.filter(fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) canastas.update(esta_publicada=True) messages.add_message(request, messages.SUCCESS, 'Las canastas fueron publicadas exitosamente') return redirect(reverse('administrador:canastas'))
def post(self, request): checkout_Json = json.loads(request.POST.get('checkout_form')) detalles_productos = checkout_Json.get('detalles_productos') detalles_canastas = checkout_Json.get('detalles_canastas') informacion_envio = checkout_Json.get('informacion_envio') informacion_pago = checkout_Json.get('informacion_pago') nombre_envio = informacion_envio.get('nombre') direccion_envio = informacion_envio.get('direccion') email_envio = informacion_envio.get('email') celular_envio = informacion_envio.get('celular') telefono_envio = informacion_envio.get('telefono') observaciones_envio = informacion_envio.get('observaciones') nombre_pago = informacion_pago.get('nombre_completo') numero_identificacion = informacion_pago.get('numero_documento') tipo_identificacion = informacion_pago.get('tipo_documento') cliente_model = Cliente.objects.filter( fk_django_user_id=request.user.id).first() pedido_model = Pedido(fk_cliente=cliente_model, fecha_pedido=datetime.now(), fecha_entrega=datetime.now(), estado='PE', valor_total=0, nombre_envio=nombre_envio, direccion_envio=direccion_envio, email_envio=email_envio, telefono_envio=telefono_envio, observaciones_envio=observaciones_envio, nombre_pago=nombre_pago, tipo_identificacion=tipo_identificacion, numero_identificacion=numero_identificacion) checkpoint = savepoint() pedido_model.save() id_cooperativa = get_id_cooperativa_global(request) valor_total = 0 for item in detalles_productos: producto_catalogo = Catalogo_Producto.objects.get( fk_producto_id=item.get('product_id'), fk_catalogo__fk_cooperativa_id=id_cooperativa, fk_catalogo__fk_semana=get_or_create_week()) cantidad = int(item.get('quantity')) pedido_producto_model = PedidoProducto( fk_catalogo_producto=producto_catalogo, fk_pedido=pedido_model, cantidad=cantidad, fk_oferta_producto=Oferta_Producto.objects.filter( fk_producto=producto_catalogo.fk_producto, fk_oferta__fk_semana=get_or_create_week(), estado=1).first()) pedido_producto_model.save() cliente_producto_model = ClienteProducto.objects.filter( fk_producto=producto_catalogo.fk_producto, fk_cliente=cliente_model) if cliente_producto_model.exists(): total_cantidad = cliente_producto_model[0].cantidad + cantidad total_frecuencia = cliente_producto_model[0].frecuencia + 1 cliente_producto_model.update(cantidad=total_cantidad, frecuencia=total_frecuencia) else: cliente_producto_model = ClienteProducto( fk_cliente=cliente_model, fk_producto=producto_catalogo.fk_producto, fk_semana=get_or_create_week(), cantidad=cantidad, frecuencia=1, sugerir=False) cliente_producto_model.save() cantidad_restante = actualizar_inventario( producto_catalogo, cantidad, get_id_cooperativa_global(request)) if cantidad_restante > 0: cart = get_or_create_cart(request) items = cart.get('items', []) cart['items'] = list( filter( lambda x: x['product_id'] != producto_catalogo. fk_producto_id, items)) request.session['cart'] = cart messages.add_message( request, messages.ERROR, 'El producto {producto} ya no se encuentra disponible'. format(producto=producto_catalogo.fk_producto.nombre)) savepoint_rollback(checkpoint) return redirect(reverse('cliente:checkout')) else: valor_total += producto_catalogo.precio * cantidad canastas_query = Canasta.objects.filter( esta_publicada=True, fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) for canasta_carrito in detalles_canastas: canasta = canastas_query.get(id=canasta_carrito.get('canasta_id')) cantidad_canasta = int(canasta_carrito.get('quantity')) pedido_canasta_model = PedidoCanasta( cantidad=cantidad_canasta, fk_pedido=pedido_model, fk_canasta=canasta, ) for canasta_producto in canasta.productos: producto_catalogo = canasta_producto.fk_producto_catalogo cantidad_producto = canasta_producto.cantidad * cantidad_canasta cantidad_restante = actualizar_inventario( producto_catalogo, cantidad_producto, get_id_cooperativa_global(request)) if cantidad_restante > 0: cart = get_or_create_cart(request) canastas_carrito = cart.get('canastas', []) cart['canastas'] = list( filter(lambda x: x['canasta_id'] != canasta.id, canastas_carrito)) request.session['cart'] = cart messages.add_message( request, messages.ERROR, 'La canasta {canasta} ya no se encuentra disponible'. format(canasta=canasta.nombre)) savepoint_rollback(checkpoint) return redirect(reverse('cliente:checkout')) valor_total += canasta.precio * cantidad_canasta pedido_canasta_model.save() pedido_model.valor_total = valor_total pedido_model.save() savepoint_commit(checkpoint) request.session['cart'] = "" messages.add_message(request, messages.SUCCESS, 'La compra se realizó exitosamente') return redirect( reverse('cliente:detalle-mis-pedidos', kwargs={'id_pedido': pedido_model.id}))
def get(self, request): canastas = Canasta.objects.filter(fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) return render(request, 'Administrador/canastas.html', {'canastas': canastas})