Example #1
0
 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'))
Example #2
0
    def setUp(self):
        cooperativa = Cooperativa.objects.create(nombre='Cooperativa',
                                                 ciudad='Ciudad',
                                                 departamento='Departamento')
        cooperativa.save()

        semana = get_or_create_week()
        categoria = Categoria(
            nombre='Nombre de la categoría',
            descripcion='Descripción de la categoría de pruebas',
            imagen='categorias/imagen-pruebas.jpg')
        categoria.save()

        counter = 1
        limit = 10
        while counter <= limit:
            Producto(
                fk_categoria_id=categoria.id,
                nombre='Producto de pruebas {0}'.format(counter),
                descripcion='Descripción del producto de pruebas {0}'.format(
                    counter),
                imagen='productos/producto-prueba-{0}.png'.format(counter),
                fecha_creacion=timezone.now(),
                unidad_medida='Kg').save()
            counter += 1

        catalogo = Catalogo(fk_semana_id=semana.id,
                            fecha_creacion=timezone.now(),
                            fecha_cierre=timezone.now() + timedelta(days=5))
        catalogo.save()

        productos = Producto.objects.all()
        for producto in productos:
            Catalogo_Producto(fk_catalogo=catalogo,
                              fk_producto=producto,
                              precio=Decimal('1600')).save()

        if platform.system() == 'Darwin':
            self.browser = webdriver.Chrome(
                os.path.join(BASE_DIR, 'Administrador', 'chromedriver',
                             'chromedriver'))
        elif platform.system() == 'Linux':
            self.browser = webdriver.Chrome()
        else:
            self.browser = webdriver.Chrome(
                os.path.join(BASE_DIR, 'Administrador', 'chromedriver',
                             'chromedriver.exe'))

        self.browser.implicitly_wait(2000000000)
Example #3
0
    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
        })
Example #4
0
    def post(self, request):
        sugerir_producto_Json = json.loads(request.POST.get('sugerir-producto-form'))
        configuracion = sugerir_producto_Json.get('configuracion')
        num_usuarios = configuracion.get('numUsuarios')
        productos_actuales = configuracion.get('reemplazar')
        usuarios = configuracion.get('todos')
        semana = get_or_create_week()

        if productos_actuales:
            ClienteProducto.objects.filter(fk_semana=semana).update(sugerir=False)

        for producto_id in sugerir_producto_Json.get('sugerir_productos'):
            if usuarios:
                self.sugerirProductosTodosClientes(producto_id.get('productos'))
            else:
                self.grabarPruductosSugeridos(producto_id.get('productos'), semana, int(num_usuarios))

        return redirect(reverse('administrador:consultar-productos-sugeridos'))
Example #5
0
    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'))
Example #6
0
def actualizar_inventario(producto_catalogo, cantidad, cooperativa_id):
    cantidad_restante = cantidad
    ofertas_productos = Oferta_Producto.objects \
        .filter(fk_producto=producto_catalogo.fk_producto, fk_oferta__fk_semana=get_or_create_week(), estado=1,
                fk_oferta__fk_productor__fk_cooperativa_id=cooperativa_id) \
        .exclude(cantidad_vendida=F('cantidad_aceptada')) \
        .order_by('precioProvedor')

    for oferta_producto in ofertas_productos:
        disponible_productos = oferta_producto.cantidad_aceptada - oferta_producto.cantidad_vendida
        if cantidad_restante == 0:
            break
        if disponible_productos >= cantidad_restante:
            oferta_producto.cantidad_vendida += cantidad_restante
            cantidad_restante = 0
        else:
            cantidad_restante -= disponible_productos
            oferta_producto.cantidad_vendida += disponible_productos
        oferta_producto.save()
    return cantidad_restante
Example #7
0
    def sugerirProductosTodosClientes(self, producto_id):
        productos = Producto.objects.filter(id=producto_id)
        if productos.exists():
            producto = productos[0]

        for cliente in Cliente.objects.all():
            cliente_producto_model=ClienteProducto.objects.filter(fk_producto=producto, fk_cliente=cliente)
            if cliente_producto_model.exists():
                cliente_producto_model.update(sugerir=True)
            else:
                cliente_producto_model = ClienteProducto(
                    fk_cliente=cliente,
                    fk_producto=producto,
                    fk_semana=get_or_create_week(),
                    cantidad=0,
                    frecuencia=0,
                    sugerir=True
                )

                cliente_producto_model.save()
Example #8
0
    def get(self, request):
        cooperativas = Cooperativa.objects.all()
        cooperativa_id = get_cooperativa_cliente(request)
        catalogo = Catalogo.objects.filter(fk_semana=get_or_create_week(),
                                           fk_cooperativa_id=cooperativa_id)

        producto_catalogo = Catalogo_Producto.objects \
            .filter(fk_catalogo=catalogo).order_by('fk_producto__nombre')
        categorias = Categoria.objects.all()

        productos = formatear_lista_productos(producto_catalogo, request,
                                              cooperativa_id)

        return render(
            request, 'Cliente/index.html', {
                'productos_json': json.dumps(productos),
                'productos_catalogo': producto_catalogo,
                'categorias': categorias,
                'cooperativas': cooperativas,
                'solo_favoritos': False,
                'cooperativaSeleccionada': get_cooperativa_cliente(request),
                'buscarGeolocation': 1
            })
Example #9
0
    def post(self, request):
        # Se listan los productos por Cooperativa y se ordenan segun filtro
        cooperativa_id = request.POST.get('cooperativa_id', '')

        set_cooperativa_cliente(request, cooperativa_id)

        catalogo = Catalogo.objects.filter(fk_semana=get_or_create_week(),
                                           fk_cooperativa_id=cooperativa_id)

        cliente_model = Cliente.objects.filter(
            fk_django_user=self.request.user).first()
        cliente_producto = ClienteProducto.objects.filter(
            sugerir=True, fk_cliente=cliente_model).values('fk_producto_id')

        producto_catalogo = Catalogo_Producto.objects.filter(fk_catalogo=catalogo, fk_producto_id__in=cliente_producto)\
            .order_by('fk_producto__nombre')

        categorias = Categoria.objects.all()

        cooperativas = Cooperativa.objects.all()

        productos = formatear_lista_productos(producto_catalogo, request,
                                              int(cooperativa_id))

        mensaje = ''
        if len(productos) == 0:
            mensaje = 'La cooperativa seleccionada no cuenta con productos sugeridos para ti.'

        return render(
            request, 'Cliente/productos-sugeridos.html', {
                'productos_json': json.dumps(productos),
                'categorias': categorias,
                'cooperativas': cooperativas,
                'mensajePython': mensaje,
                'cooperativaSeleccionada': get_cooperativa_cliente(request),
                'buscarGeolocation': 0
            })
Example #10
0
 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'))
Example #11
0
 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})
Example #12
0
    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}))