forked from DGNum/gestioCOF
Merge branch 'Aufinal/create_opes' into 'master'
K-Fêt - Dev : - new command - createopes: Création d'opérations et transferts aléatoires See merge request !193
This commit is contained in:
commit
215d4a63ad
3 changed files with 180 additions and 63 deletions
175
kfet/management/commands/createopes.py
Normal file
175
kfet/management/commands/createopes.py
Normal file
|
@ -0,0 +1,175 @@
|
|||
|
||||
"""
|
||||
Crée des opérations aléatoires réparties sur une période de temps spécifiée
|
||||
"""
|
||||
|
||||
import random
|
||||
from datetime import timedelta
|
||||
from decimal import Decimal
|
||||
from django.utils import timezone
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from kfet.models import (Account, Article, OperationGroup, Operation,
|
||||
Checkout, Transfer, TransferGroup)
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Crée des opérations réparties uniformément sur une période de temps"
|
||||
|
||||
def add_arguments(self, parser):
|
||||
# Nombre d'opérations à créer
|
||||
parser.add_argument('opes', type=int,
|
||||
help='Number of opegroups to create')
|
||||
|
||||
# Période sur laquelle créer (depuis num_days avant maintenant)
|
||||
parser.add_argument('days', type=int,
|
||||
help='Period in which to create opegroups')
|
||||
|
||||
# Optionnel : nombre de transfert à créer (défaut 0)
|
||||
parser.add_argument('--transfers', type=int, default=0,
|
||||
help='Number of transfers to create (default 0)')
|
||||
|
||||
|
||||
def handle(self, *args, **options):
|
||||
|
||||
self.stdout.write("Génération d'opérations")
|
||||
|
||||
# Output log vars
|
||||
opes_created = 0
|
||||
purchases = 0
|
||||
transfers = 0
|
||||
|
||||
num_ops = options['opes']
|
||||
num_transfers = options['transfers']
|
||||
# Convert to seconds
|
||||
time = options['days'] * 24 * 3600
|
||||
|
||||
checkout = Checkout.objects.first()
|
||||
articles = Article.objects.all()
|
||||
accounts = Account.objects.exclude(trigramme='LIQ')
|
||||
liq_account = Account.objects.get(trigramme='LIQ')
|
||||
try:
|
||||
con_account = Account.objects.get(
|
||||
cofprofile__user__first_name='Assurancetourix'
|
||||
)
|
||||
except Account.DoesNotExist:
|
||||
con_account = random.choice(accounts)
|
||||
|
||||
for i in range(num_ops):
|
||||
|
||||
# Randomly pick account
|
||||
if random.random() > 0.25:
|
||||
account = random.choice(accounts)
|
||||
else:
|
||||
account = liq_account
|
||||
|
||||
# Randomly pick time
|
||||
at = timezone.now() - timedelta(
|
||||
seconds=random.randint(0, time))
|
||||
|
||||
# Majoration sur compte 'concert'
|
||||
if random.random() < 0.2:
|
||||
addcost = True
|
||||
addcost_for = con_account
|
||||
addcost_amount = Decimal('0.5')
|
||||
else:
|
||||
addcost = False
|
||||
|
||||
# Initialize opegroup amount
|
||||
amount = Decimal('0')
|
||||
|
||||
opegroup = OperationGroup.objects.create(
|
||||
on_acc=account,
|
||||
checkout=checkout,
|
||||
at=at,
|
||||
is_cof=account.cofprofile.is_cof
|
||||
)
|
||||
|
||||
# Generating operations
|
||||
ope_list = []
|
||||
for j in range(random.randint(1, 4)):
|
||||
# Operation type
|
||||
typevar = random.random()
|
||||
|
||||
# 0.1 probability to have a charge
|
||||
if typevar > 0.9 and account != liq_account:
|
||||
ope = Operation(
|
||||
group=opegroup,
|
||||
type=Operation.DEPOSIT,
|
||||
is_checkout=(random.random() > 0.2),
|
||||
amount=Decimal(random.randint(1, 99)/10)
|
||||
)
|
||||
# 0.1 probability to have a withdrawal
|
||||
elif typevar > 0.8 and account != liq_account:
|
||||
ope = Operation(
|
||||
group=opegroup,
|
||||
type=Operation.WITHDRAW,
|
||||
is_checkout=(random.random() > 0.2),
|
||||
amount=-Decimal(random.randint(1, 99)/10)
|
||||
)
|
||||
else:
|
||||
article = random.choice(articles)
|
||||
nb = random.randint(1, 5)
|
||||
|
||||
ope = Operation(
|
||||
group=opegroup,
|
||||
type=Operation.PURCHASE,
|
||||
amount=-article.price*nb,
|
||||
article=article,
|
||||
article_nb=nb
|
||||
)
|
||||
|
||||
purchases += 1
|
||||
|
||||
if addcost:
|
||||
ope.addcost_for = addcost_for
|
||||
ope.addcost_amount = addcost_amount * nb
|
||||
ope.amount -= ope.addcost_amount
|
||||
|
||||
ope_list.append(ope)
|
||||
amount += ope.amount
|
||||
|
||||
Operation.objects.bulk_create(ope_list)
|
||||
opes_created += len(ope_list)
|
||||
opegroup.amount = amount
|
||||
opegroup.save()
|
||||
|
||||
# Transfer generation
|
||||
for i in range(num_transfers):
|
||||
|
||||
# Randomly pick time
|
||||
at = timezone.now() - timedelta(
|
||||
seconds=random.randint(0, time))
|
||||
|
||||
# Choose whether to have a comment
|
||||
if random.random() > 0.5:
|
||||
comment = "placeholder comment"
|
||||
else:
|
||||
comment = ""
|
||||
|
||||
transfergroup = TransferGroup.objects.create(
|
||||
at=at,
|
||||
comment=comment,
|
||||
valid_by=random.choice(accounts)
|
||||
)
|
||||
|
||||
# Randomly generate transfer
|
||||
transfer_list = []
|
||||
for i in range(random.randint(1, 4)):
|
||||
transfer_list.append(Transfer(
|
||||
group=transfergroup,
|
||||
from_acc=random.choice(accounts),
|
||||
to_acc=random.choice(accounts),
|
||||
amount=Decimal(random.randint(1, 99)/10)
|
||||
))
|
||||
|
||||
Transfer.objects.bulk_create(transfer_list)
|
||||
transfers += len(transfer_list)
|
||||
|
||||
self.stdout.write(
|
||||
"- {:d} opérations créées dont {:d} commandes d'articles"
|
||||
.format(opes_created, purchases))
|
||||
|
||||
if transfers:
|
||||
self.stdout.write("- {:d} transferts créés"
|
||||
.format(transfers))
|
|
@ -5,15 +5,14 @@ Crée des utilisateurs, des articles et des opérations aléatoires
|
|||
import os
|
||||
import random
|
||||
from datetime import timedelta
|
||||
from decimal import Decimal
|
||||
|
||||
from django.utils import timezone
|
||||
from django.contrib.auth.models import User, Group, Permission, ContentType
|
||||
from django.core.management import call_command
|
||||
|
||||
from gestioncof.management.base import MyBaseCommand
|
||||
from gestioncof.models import CofProfile
|
||||
from kfet.models import (Account, Article, OperationGroup, Operation,
|
||||
Checkout, CheckoutStatement)
|
||||
from kfet.models import (Account, Checkout, CheckoutStatement)
|
||||
|
||||
# Où sont stockés les fichiers json
|
||||
DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)),
|
||||
|
@ -130,61 +129,4 @@ class Command(MyBaseCommand):
|
|||
# Opérations
|
||||
# ---
|
||||
|
||||
self.stdout.write("Génération d'opérations")
|
||||
|
||||
articles = Article.objects.all()
|
||||
accounts = Account.objects.exclude(trigramme='LIQ')
|
||||
|
||||
num_op = 100
|
||||
# Operations are put uniformly over the span of a week
|
||||
past_date = 3600*24*7
|
||||
|
||||
for i in range(num_op):
|
||||
if random.random() > 0.25:
|
||||
account = random.choice(accounts)
|
||||
else:
|
||||
account = liq_account
|
||||
|
||||
amount = Decimal('0')
|
||||
at = timezone.now() - timedelta(
|
||||
seconds=random.randint(0, past_date))
|
||||
|
||||
opegroup = OperationGroup(
|
||||
on_acc=account,
|
||||
checkout=checkout,
|
||||
at=at,
|
||||
is_cof=account.cofprofile.is_cof)
|
||||
|
||||
opegroup.save()
|
||||
|
||||
for j in range(random.randint(1, 4)):
|
||||
typevar = random.random()
|
||||
if typevar > 0.9 and account != liq_account:
|
||||
ope = Operation(
|
||||
group=opegroup,
|
||||
type=Operation.DEPOSIT,
|
||||
amount=Decimal(random.randint(1, 99)/10,)
|
||||
)
|
||||
elif typevar > 0.8 and account != liq_account:
|
||||
ope = Operation(
|
||||
group=opegroup,
|
||||
type=Operation.WITHDRAW,
|
||||
amount=-Decimal(random.randint(1, 99)/10,)
|
||||
)
|
||||
else:
|
||||
article = random.choice(articles)
|
||||
nb = random.randint(1, 5)
|
||||
|
||||
ope = Operation(
|
||||
group=opegroup,
|
||||
type=Operation.PURCHASE,
|
||||
amount=-article.price*nb,
|
||||
article=article,
|
||||
article_nb=nb
|
||||
)
|
||||
|
||||
ope.save()
|
||||
amount += ope.amount
|
||||
|
||||
opegroup.amount = amount
|
||||
opegroup.save()
|
||||
call_command('createopes','100', '7')
|
||||
|
|
|
@ -466,7 +466,7 @@ class OrderArticle(models.Model):
|
|||
quantity_received = models.IntegerField(default = 0)
|
||||
|
||||
class TransferGroup(models.Model):
|
||||
at = models.DateTimeField(auto_now_add = True)
|
||||
at = models.DateTimeField(default=timezone.now)
|
||||
# Optional
|
||||
comment = models.CharField(
|
||||
max_length = 255,
|
||||
|
@ -502,7 +502,7 @@ class OperationGroup(models.Model):
|
|||
checkout = models.ForeignKey(
|
||||
Checkout, on_delete = models.PROTECT,
|
||||
related_name = "opesgroup")
|
||||
at = models.DateTimeField(auto_now_add = True)
|
||||
at = models.DateTimeField(default=timezone.now)
|
||||
amount = models.DecimalField(
|
||||
max_digits = 6, decimal_places = 2,
|
||||
default = 0)
|
||||
|
|
Loading…
Reference in a new issue