From aa97c2633566928b22b272695e783b09042e7f30 Mon Sep 17 00:00:00 2001 From: nanoy Date: Tue, 27 Aug 2019 18:58:55 +0200 Subject: [PATCH 1/2] Decrement stockBar and not stockHold on transactions --- gestion/models.py | 2 +- gestion/views.py | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/gestion/models.py b/gestion/models.py index 06a4559..fd4278d 100644 --- a/gestion/models.py +++ b/gestion/models.py @@ -95,7 +95,7 @@ class Product(models.Model): def __str__(self): if self.draft_category == self.DRAFT_NONE: - return self.name + "(" + str(self.amount) + " €)" + return self.name + " (" + str(self.amount) + " €)" else: return self.name + " (" + str(self.amount) + " €, " + str(self.deg) + "°)" diff --git a/gestion/views.py b/gestion/views.py index fbadea9..1ec41b1 100644 --- a/gestion/views.py +++ b/gestion/views.py @@ -161,8 +161,11 @@ def order(request): kegHistory.amountSold += Decimal(quantity * product.amount) kegHistory.save() else: - if(product.stockHold > 0): - product.stockHold -= 1 + if(product.stockBar > quantity): + product.stockBar -= quantity + product.save() + else: + product.stockBar = 0 product.save() consumption, _ = Consumption.objects.get_or_create(customer=user, product=product) consumption.quantity += quantity @@ -195,8 +198,11 @@ def order(request): consumption, _ = Consumption.objects.get_or_create(customer=user, product=article) consumption.quantity += quantity consumption.save() - if(article.stockHold > 0): - article.stockHold -= 1 + if(article.stockBar > quantity): + article.stockBar -= quantity + article.save() + else: + article.stockBar = 0 article.save() user.profile.alcohol += Decimal(quantity * float(product.deg) * product.volume * 0.79 /10 /1000) user.save() From f17697dd36da2a1644fb7a8bd5e446cb751ba287 Mon Sep 17 00:00:00 2001 From: nanoy Date: Tue, 27 Aug 2019 23:21:15 +0200 Subject: [PATCH 2/2] Change stock behavior --- gestion/admin.py | 4 +- gestion/migrations/0012_auto_20190827_2119.py | 53 +++++++++++++++++++ gestion/models.py | 8 +-- .../templates/gestion/product_profile.html | 3 +- gestion/templates/gestion/products_list.html | 6 +-- gestion/templates/gestion/stocks.html | 41 ++++++++++++++ gestion/urls.py | 2 + gestion/views.py | 51 ++++++++++++------ staticfiles/stocks.js | 16 ++++++ templates/nav.html | 7 ++- 10 files changed, 161 insertions(+), 30 deletions(-) create mode 100644 gestion/migrations/0012_auto_20190827_2119.py create mode 100644 gestion/templates/gestion/stocks.html create mode 100644 staticfiles/stocks.js diff --git a/gestion/admin.py b/gestion/admin.py index 60d2035..95b9471 100644 --- a/gestion/admin.py +++ b/gestion/admin.py @@ -59,8 +59,8 @@ class ProductAdmin(SimpleHistoryAdmin): """ The admin class for :class:`Products `. """ - list_display = ('name', 'amount', 'is_active', 'category', 'adherentRequired', 'stockHold', 'stockBar', 'volume', 'deg') - ordering = ('name', 'amount', 'stockHold', 'stockBar', 'deg') + list_display = ('name', 'amount', 'is_active', 'category', 'adherentRequired', 'stock', 'volume', 'deg') + ordering = ('name', 'amount', 'stock', 'deg') search_fields = ('name',) list_filter = ('is_active', 'adherentRequired', 'category') diff --git a/gestion/migrations/0012_auto_20190827_2119.py b/gestion/migrations/0012_auto_20190827_2119.py new file mode 100644 index 0000000..15a104d --- /dev/null +++ b/gestion/migrations/0012_auto_20190827_2119.py @@ -0,0 +1,53 @@ +# Generated by Django 2.1 on 2019-08-27 19:19 + +from django.db import migrations, models + +def update(apps, schema_editor): + Product = apps.get_model('gestion', 'Product') + for product in Product.objects.all(): + product.stock = product.stockBar + product.save() + +def reverse(apps, schema_editor): + Product = apps.get_model('gestion', 'Product') + for product in Product.objects.all(): + product.stockBar = product.stock + product.save() + + + +class Migration(migrations.Migration): + + dependencies = [ + ('gestion', '0011_auto_20190623_1640'), + ] + + operations = [ + migrations.AddField( + model_name='historicalproduct', + name='stock', + field=models.IntegerField(default=0, verbose_name='Stock'), + ), + migrations.AddField( + model_name='product', + name='stock', + field=models.IntegerField(default=0, verbose_name='Stock'), + ), + migrations.RunPython(update, reverse), + migrations.RemoveField( + model_name='historicalproduct', + name='stockBar', + ), + migrations.RemoveField( + model_name='historicalproduct', + name='stockHold', + ), + migrations.RemoveField( + model_name='product', + name='stockBar', + ), + migrations.RemoveField( + model_name='product', + name='stockHold', + ), + ] diff --git a/gestion/models.py b/gestion/models.py index fd4278d..64267d2 100644 --- a/gestion/models.py +++ b/gestion/models.py @@ -54,13 +54,9 @@ class Product(models.Model): """ The price of the product. """ - stockHold = models.IntegerField(default=0, verbose_name="Stock en soute") + stock = models.IntegerField(default=0, verbose_name="Stock") """ - Number of product in the hold. - """ - stockBar = models.IntegerField(default=0, verbose_name="Stock en bar") - """ - Number of product at the bar. + Number of product """ category = models.ForeignKey('Category', on_delete=models.PROTECT, verbose_name="Catégorie") """ diff --git a/gestion/templates/gestion/product_profile.html b/gestion/templates/gestion/product_profile.html index d3e81f9..b9dde04 100644 --- a/gestion/templates/gestion/product_profile.html +++ b/gestion/templates/gestion/product_profile.html @@ -14,8 +14,7 @@ {% if perms.gestion.change_product %}{% if product.is_active %}Désa{% else %}A{% endif %}ctiver Modifier
{% endif %}
Nom : {{ product.name }}
Prix de vente : {{ product.amount }}€
- Stock en soute : {{ product.stockHold }}
- Stock au bar : {{ product.stockBar }}
+ Stock en soute : {{ product.stock }}
Catégorie : {{ product.category }}
Actif : {{ product.is_active | yesno:"Oui, Non"}}
Dégré : {{ product.deg }}
diff --git a/gestion/templates/gestion/products_list.html b/gestion/templates/gestion/products_list.html index 3d8d1f6..2a0aa44 100644 --- a/gestion/templates/gestion/products_list.html +++ b/gestion/templates/gestion/products_list.html @@ -19,8 +19,7 @@ Nom Prix - Stock (soute) - Stock (bar) + Stock Catégorie Actif Degré @@ -33,8 +32,7 @@ {{ product.name }} {{ product.amount}} - {{ product.stockHold }} - {{ product.stockBar }} + {{ product.stock }} {{ product.category }} {{ product.is_active | yesno:"Oui, Non"}} {{ product.deg }} diff --git a/gestion/templates/gestion/stocks.html b/gestion/templates/gestion/stocks.html new file mode 100644 index 0000000..82f0671 --- /dev/null +++ b/gestion/templates/gestion/stocks.html @@ -0,0 +1,41 @@ +{% extends 'base.html' %} +{% load static %} +{% block entete %}Gestion des produits{% endblock %} +{% block navbar%} + +{% endblock %} +{% block content %} +{% for category in categories %} +
+
+

Stocks {{category}}

+
+
+ + + + + + + + + + {% for product in category.active_products %} + + + + + + {% endfor %} + +
NomStockMettre à jour
{{ product.name }}{{ product.stock }}
+
+
+{% endfor %} + + +{% endblock %} diff --git a/gestion/urls.py b/gestion/urls.py index c5c777f..bb1734f 100644 --- a/gestion/urls.py +++ b/gestion/urls.py @@ -55,4 +55,6 @@ urlpatterns = [ path('divide', views.divide, name="divide"), path('gen_invoice', views.gen_invoice, name="gen_invoice"), path('compute-price', views.compute_price_view, name="compute-price"), + path('stocks', views.stocks, name="stocks"), + path('updateStock/', views.update_stock, name="updateStock"), ] \ No newline at end of file diff --git a/gestion/views.py b/gestion/views.py index 1ec41b1..f8e4bed 100644 --- a/gestion/views.py +++ b/gestion/views.py @@ -161,12 +161,11 @@ def order(request): kegHistory.amountSold += Decimal(quantity * product.amount) kegHistory.save() else: - if(product.stockBar > quantity): - product.stockBar -= quantity + if(product.stock > quantity): + product.stock -= quantity product.save() else: - product.stockBar = 0 - product.save() + raise Exception("Le stock du produit n'autorise pas l'opération") consumption, _ = Consumption.objects.get_or_create(customer=user, product=product) consumption.quantity += quantity consumption.save() @@ -198,12 +197,11 @@ def order(request): consumption, _ = Consumption.objects.get_or_create(customer=user, product=article) consumption.quantity += quantity consumption.save() - if(article.stockBar > quantity): - article.stockBar -= quantity + if(article.stock > quantity): + article.stock -= quantity article.save() else: - article.stockBar = 0 - article.save() + raise Exception("Le stock du produit " + article.name + "n'autorise pas l'opération") user.profile.alcohol += Decimal(quantity * float(product.deg) * product.volume * 0.79 /10 /1000) user.save() return HttpResponse("La commande a bien été effectuée") @@ -288,6 +286,7 @@ def cancel_consumption(request, pk): """ consumption = get_object_or_404(ConsumptionHistory, pk=pk) user = consumption.customer + product = consumption.product if consumption.paymentMethod.affect_balance: user.profile.debit -= consumption.amount else: @@ -297,6 +296,8 @@ def cancel_consumption(request, pk): consumptionT = Consumption.objects.get(customer=user, product=consumption.product) consumptionT.quantity -= consumption.quantity consumptionT.save() + product.stock += consumption.quantity + product.save() consumption.delete() messages.success(request, "La consommation a bien été annulée") return redirect(reverse('users:profile', kwargs={'pk': user.pk})) @@ -317,7 +318,9 @@ def cancel_menu(request, pk): user.profile.debit -= menu_history.amount else: user.profile.direct_debit -= menu_history.amount - for product in manu_history.menu.articles: + for product in menu_history.menu.articles: + product.stock += menu_history.quantity + product.save() consumptionT = Consumption.objects.get(customer=user, product=product) consumptionT -= menu_history.quantity consumptionT.save() @@ -328,6 +331,7 @@ def cancel_menu(request, pk): return redirect(reverse('users:profile', kwargs={'pk': user.pk})) ########## Products ########## + @active_required @login_required @acl_or('gestion.add_product', 'gestion.view_product', 'gestion.add_keg', 'gestion.view_keg', 'gestion.change_keg', 'gestion.view_menu', 'gestion.add_menu') @@ -457,6 +461,26 @@ class ActiveProductsAutocomplete(autocomplete.Select2QuerySetView): qs = qs.filter(name__icontains=self.q) return qs +@active_required +@login_required +@permission_required('gestion.change_product') +def update_stock(request, pk): + product = get_object_or_404(Product, pk=pk) + if("stock" in request.GET): + product.stock = request.GET.get("stock") + product.save() + return HttpResponse("Le stock a bien été mis à jour") + +@active_required +@login_required +@permission_required('gestion.change_product') +def stocks(request): + """ + View to update stocks of active products + """ + categories = Category.objects.exclude(order=0).order_by("order") + return render(request, "gestion/stocks.html", {"categories": categories}) + ########## Kegs ########## @active_required @@ -477,8 +501,7 @@ def addKeg(request): pinte = Product( name = "Pinte " + name, amount = pinte_price, - stockHold = 0, - stockBar = 0, + stock = 0, category = form.cleaned_data["category"], needQuantityButton = False, is_active = True, @@ -493,8 +516,7 @@ def addKeg(request): demi = Product( name = "Demi " + name, amount = ceil(5*pinte_price)/10, - stockHold = 0, - stockBar = 0, + stock = 0, category = form.cleaned_data["category"], needQuantityButton = False, is_active = True, @@ -510,8 +532,7 @@ def addKeg(request): galopin = Product( name = "Galopin " + name, amount = ceil(2.5 * pinte_price)/10, - stockHold = 0, - stockBar = 0, + stock = 0, category = form.cleaned_data["category"], needQuantityButton = False, is_active = True, diff --git a/staticfiles/stocks.js b/staticfiles/stocks.js new file mode 100644 index 0000000..05c0f60 --- /dev/null +++ b/staticfiles/stocks.js @@ -0,0 +1,16 @@ +$(document).ready(function(){ + $(".update-stock").click(function(){ + var pk = $(this).attr('data-pk'); + var current_value = $(this).attr('data-stock'); + var ok = false; + while(!ok){ + var new_stock = prompt("Nouveau stock ? (entier attendu)", current_value); + ok = new_stock == null || !(isNaN(parseInt(new_stock))); + } + if(new_stock != null){ + $.get("/gestion/updateStock/" + pk, {"stock": new_stock}, function(data){ + $("#stock-"+pk).html(new_stock); + }); + } + }); +}); \ No newline at end of file diff --git a/templates/nav.html b/templates/nav.html index 876d1bd..c8583bd 100644 --- a/templates/nav.html +++ b/templates/nav.html @@ -20,8 +20,13 @@ Gestion des produits {% endif %} +{% if perms.gestion.change_product %} + +
+ Stocks +
+{% endif %} -
Classement
{% if perms.preferences.change_generalpreferences %}