From 83fd7532004f8efe9d45ab083edbb1055b0d26a8 Mon Sep 17 00:00:00 2001 From: quark Date: Tue, 21 Oct 2025 18:13:55 +0200 Subject: [PATCH] add price management in steal script --- management/commands/{steals.py => steal.py} | 88 +++++++++++++++++---- 1 file changed, 73 insertions(+), 15 deletions(-) rename management/commands/{steals.py => steal.py} (50%) diff --git a/management/commands/steals.py b/management/commands/steal.py similarity index 50% rename from management/commands/steals.py rename to management/commands/steal.py index 3a85b25..f088512 100644 --- a/management/commands/steals.py +++ b/management/commands/steal.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django.core.management.base import BaseCommand +from django.db import transaction from django.db.models import Sum from note.models import RecurrentTransaction, TransactionTemplate @@ -9,25 +10,40 @@ from note.models import RecurrentTransaction, TransactionTemplate class Command(BaseCommand): help = """ - Syntax of inventory file:\n - DATE_START=YYYY-MM-DD HH:MM:SS\n - button_id=quantity\n - # some comment\n - ...\n - DATE_END=YYYY-MM-DD\n - button_id=quantity\n - ...\n - GROCERY\n - button_id=quantity\n - ...\n + Syntax of inventory file: + DATE_START=YYYY-MM-DD HH:MM:SS + button_id=quantity + "button_name"=quantity + 'button_name'=quantity + # some comment + ... + DATE_END=YYYY-MM-DD + button_id=quantity + ... + GROCERY + button_id=quantity + ... + Syntax of price file: + button_id;price_ht;TVA + "button_name";price_ht;TVA + 'button_name';price_ht;TVA + # some comment + button_name + You don't need to escape internal " or ' in button_name + "=" and ";" aren't allowed in button_name + TVA in % (i.e 5.5, 20) + price_ht in € (i.e 0.928, 1.045) """ def add_arguments(self, parser): parser.add_argument('file', type=str) + parser.add_argument('-t', '--type', choices=["weekend", "weekdays"], + default="", help='Type of prices') + parser.add_argument('-d', '--doit', action='store_true', + help='Actually do it') def handle(self, *args, **kwargs): - if not kwargs['file']: - kwargs['file'] = '/var/inventory/current.inv' + prices_csv = '/var/inventory/prices.csv' file = open(kwargs['file'], 'r', encoding='utf-8') inv_start, inv_end, inv_grocery = {}, {}, {} @@ -53,6 +69,8 @@ class Command(BaseCommand): else: add_to_dict(line, inv_grocery) + file.close() + delta_real = delta_from_inv(inv_start, inv_end, inv_grocery) delta_th = delta_from_note(date_start, date_end, delta_real.keys()) @@ -69,12 +87,52 @@ class Command(BaseCommand): else: self.stdout.write(self.style.SUCCESS(text)) + change = False + if kwargs['type']: + change = True + prices_dict = {} + prices = open(prices_csv, 'r', encoding='utf-8') + for line in prices: + if line[0] == '#': + continue + b, p, tva = line.split(';') + if b[0] == "\"" or b[0] == "'": + b = TransactionTemplate.objects.get(name=b[1:-1]) + else: + b = TransactionTemplate.objects.get(pk=int(b)) + prices_dict[b] = float(p) * (1 + float(tva) / 100) + prices.close() + + if kwargs['type'] == 'weekdays': + for b in prices_dict: + # people steal on weekdays + prices_dict[b] = prices_dict[b] * (1 + steal_dict[b] / 100) + + if change: + with transaction.atomic(): + for b in prices_dict: + # dizaine de centime supérieures + # sauf si les pertes sont inférieures à 1 centimes + # 1.299€ -> 1.30€ | 1.2100€ -> 1.30€ | 1.20999€ -> 1.20€ + amount = round(int(100*(prices_dict[b] + 0.05)), -1) + if kwargs['verbosity'] > 0: + self.stdout.write(f"""{b.name}: + -Old amount: {b.amount}c€ + -New amount: {amount}c€""") + b.amount = amount + # we don't want to flood price history each week + b._no_signal = True + if kwargs['doit']: + b.save() return 0 def add_to_dict(line, d): - pk, quantity = line.split('=') - button = TransactionTemplate.objects.get(pk=pk) + b, quantity = line.split('=') + if b[0] == "\"" or b[0] == "'": + button = TransactionTemplate.objects.get(name=b[1:-1]) + else: + button = TransactionTemplate.objects.get(pk=int(b)) d[button] = int(quantity) return