1
0
mirror of https://gitlab.crans.org/bde/nk20-scripts synced 2025-10-27 13:43:17 +01:00

add price management in steal script

This commit is contained in:
quark
2025-10-21 18:13:55 +02:00
parent ac93fec326
commit 83fd753200

View File

@@ -2,6 +2,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import Sum from django.db.models import Sum
from note.models import RecurrentTransaction, TransactionTemplate from note.models import RecurrentTransaction, TransactionTemplate
@@ -9,25 +10,40 @@ from note.models import RecurrentTransaction, TransactionTemplate
class Command(BaseCommand): class Command(BaseCommand):
help = """ help = """
Syntax of inventory file:\n Syntax of inventory file:
DATE_START=YYYY-MM-DD HH:MM:SS\n DATE_START=YYYY-MM-DD HH:MM:SS
button_id=quantity\n button_id=quantity
# some comment\n "button_name"=quantity
...\n 'button_name'=quantity
DATE_END=YYYY-MM-DD\n # some comment
button_id=quantity\n ...
...\n DATE_END=YYYY-MM-DD
GROCERY\n button_id=quantity
button_id=quantity\n ...
...\n 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): def add_arguments(self, parser):
parser.add_argument('file', type=str) 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): def handle(self, *args, **kwargs):
if not kwargs['file']: prices_csv = '/var/inventory/prices.csv'
kwargs['file'] = '/var/inventory/current.inv'
file = open(kwargs['file'], 'r', encoding='utf-8') file = open(kwargs['file'], 'r', encoding='utf-8')
inv_start, inv_end, inv_grocery = {}, {}, {} inv_start, inv_end, inv_grocery = {}, {}, {}
@@ -53,6 +69,8 @@ class Command(BaseCommand):
else: else:
add_to_dict(line, inv_grocery) add_to_dict(line, inv_grocery)
file.close()
delta_real = delta_from_inv(inv_start, inv_end, inv_grocery) delta_real = delta_from_inv(inv_start, inv_end, inv_grocery)
delta_th = delta_from_note(date_start, date_end, delta_real.keys()) delta_th = delta_from_note(date_start, date_end, delta_real.keys())
@@ -69,12 +87,52 @@ class Command(BaseCommand):
else: else:
self.stdout.write(self.style.SUCCESS(text)) 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 return 0
def add_to_dict(line, d): def add_to_dict(line, d):
pk, quantity = line.split('=') b, quantity = line.split('=')
button = TransactionTemplate.objects.get(pk=pk) 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) d[button] = int(quantity)
return return