mirror of
				https://gitlab.crans.org/bde/nk20-scripts
				synced 2025-10-31 15:09:59 +01:00 
			
		
		
		
	add price management in steal script
This commit is contained in:
		| @@ -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 | ||||
| 
 | ||||
		Reference in New Issue
	
	Block a user