This commit is contained in:
Ludovic Stephan 2017-02-05 03:42:02 -02:00
parent 1d5e693045
commit b404c989ff

View file

@ -1095,6 +1095,7 @@ def kpsul_perform_operations(request):
consumers.KPsul.group_send('kfet.kpsul', websocket_data) consumers.KPsul.group_send('kfet.kpsul', websocket_data)
return JsonResponse(data) return JsonResponse(data)
@teamkfet_required @teamkfet_required
def kpsul_cancel_operations(request): def kpsul_cancel_operations(request):
# Pour la réponse # Pour la réponse
@ -1117,8 +1118,8 @@ def kpsul_cancel_operations(request):
Operation.objects Operation.objects
.select_related('group', 'group__on_acc', 'group__on_acc__negative') .select_related('group', 'group__on_acc', 'group__on_acc__negative')
.filter(pk__in=opes_post)) .filter(pk__in=opes_post))
opes_pk = [ ope.pk for ope in opes_all ] opes_pk = [ope.pk for ope in opes_all]
opes_notexisting = [ ope for ope in opes_post if ope not in opes_pk ] opes_notexisting = [ope for ope in opes_post if ope not in opes_pk]
transfers_all = ( transfers_all = (
Transfer.objects Transfer.objects
@ -1127,7 +1128,7 @@ def kpsul_cancel_operations(request):
.filter(pk__in=transfers_post)) .filter(pk__in=transfers_post))
transfers_pk = [transfer.pk for transfer in transfers_all] transfers_pk = [transfer.pk for transfer in transfers_all]
transfers_notexisting = [transfer for transfer in transfers_post transfers_notexisting = [transfer for transfer in transfers_post
if transfer not in transfers_pk] if transfer not in transfers_pk]
if transfers_notexisting or opes_notexisting: if transfers_notexisting or opes_notexisting:
if transfers_notexisting: if transfers_notexisting:
@ -1140,12 +1141,16 @@ def kpsul_cancel_operations(request):
opes = [] # Pas déjà annulée opes = [] # Pas déjà annulée
transfers = [] transfers = []
required_perms = set() required_perms = set()
stop_all = False stop_all = False
cancel_duration = Settings.CANCEL_DURATION() cancel_duration = Settings.CANCEL_DURATION()
to_accounts_balances = defaultdict(lambda:0) # Modifs à faire sur les balances des comptes # Modifs à faire sur les balances des comptes
to_groups_amounts = defaultdict(lambda:0) # ------ sur les montants des groupes d'opé to_accounts_balances = defaultdict(lambda: 0)
to_checkouts_balances = defaultdict(lambda:0) # ------ sur les balances de caisses # ------ sur les montants des groupes d'opé
to_articles_stocks = defaultdict(lambda:0) # ------ sur les stocks d'articles to_groups_amounts = defaultdict(lambda: 0)
# ------ sur les balances de caisses
to_checkouts_balances = defaultdict(lambda: 0)
# ------ sur les stocks d'articles
to_articles_stocks = defaultdict(lambda: 0)
for ope in opes_all: for ope in opes_all:
if ope.canceled_at: if ope.canceled_at:
# Opération déjà annulée, va pour un warning en Response # Opération déjà annulée, va pour un warning en Response
@ -1176,10 +1181,11 @@ def kpsul_cancel_operations(request):
# par `.save()`, amount_error est recalculé automatiquement, # par `.save()`, amount_error est recalculé automatiquement,
# ce qui n'est pas le cas en faisant un update sur queryset # ce qui n'est pas le cas en faisant un update sur queryset
# TODO ? : Maj les balance_old de relevés pour modifier l'erreur # TODO ? : Maj les balance_old de relevés pour modifier l'erreur
last_statement = (CheckoutStatement.objects last_statement = \
.filter(checkout=ope.group.checkout) (CheckoutStatement.objects
.order_by('at') .filter(checkout=ope.group.checkout)
.last()) .order_by('at')
.last())
if not last_statement or last_statement.at < ope.group.at: if not last_statement or last_statement.at < ope.group.at:
if ope.type == Operation.PURCHASE: if ope.type == Operation.PURCHASE:
if ope.group.on_acc.is_cash: if ope.group.on_acc.is_cash:
@ -1321,13 +1327,14 @@ def kpsul_cancel_operations(request):
data['warnings']['already_canceled'] = already_canceled data['warnings']['already_canceled'] = already_canceled
return JsonResponse(data) return JsonResponse(data)
@login_required @login_required
def history_json(request): def history_json(request):
# Récupération des paramètres # Récupération des paramètres
from_date = request.POST.get('from', None) from_date = request.POST.get('from', None)
to_date = request.POST.get('to', None) to_date = request.POST.get('to', None)
checkouts = request.POST.getlist('checkouts[]', None) checkouts = request.POST.getlist('checkouts[]', None)
accounts = request.POST.getlist('accounts[]', None) accounts = request.POST.getlist('accounts[]', None)
transfers_only = request.POST.get('transfersonly', None) transfers_only = request.POST.get('transfersonly', None)
# Construction de la requête (sur les opérations) pour le prefetch # Construction de la requête (sur les opérations) pour le prefetch
@ -1335,7 +1342,7 @@ def history_json(request):
'canceled_by__trigramme', 'addcost_for__trigramme', 'canceled_by__trigramme', 'addcost_for__trigramme',
'article__name') 'article__name')
ope_prefetch = Prefetch('opes', ope_prefetch = Prefetch('opes',
queryset = ope_queryset_prefetch) queryset=ope_queryset_prefetch)
transfer_queryset_prefetch = Transfer.objects.select_related( transfer_queryset_prefetch = Transfer.objects.select_related(
'from_acc__trigramme', 'to_acc__trigramme', 'from_acc__trigramme', 'to_acc__trigramme',
@ -1356,19 +1363,21 @@ def history_json(request):
queryset=transfer_queryset_prefetch, queryset=transfer_queryset_prefetch,
to_attr='filtered_transfers') to_attr='filtered_transfers')
# Construction de la requête principale # Construction de la requête principale
opegroups = (OperationGroup.objects opegroups = (
.prefetch_related(ope_prefetch) OperationGroup.objects
.select_related('on_acc__trigramme', 'valid_by__trigramme') .prefetch_related(ope_prefetch)
.order_by('at') .select_related('on_acc__trigramme',
'valid_by__trigramme')
.order_by('at')
) )
transfergroups = ( transfergroups = (
TransferGroup.objects TransferGroup.objects
.prefetch_related(transfer_prefetch) .prefetch_related(transfer_prefetch)
.select_related('valid_by__trigramme') .select_related('valid_by__trigramme')
.order_by('at')) .order_by('at')
)
# Application des filtres # Application des filtres
if from_date: if from_date:
@ -1388,18 +1397,17 @@ def history_json(request):
if not request.user.has_perm('kfet.is_team'): if not request.user.has_perm('kfet.is_team'):
opegroups = opegroups.filter(on_acc=request.user.profile.account_kfet) opegroups = opegroups.filter(on_acc=request.user.profile.account_kfet)
# Construction de la réponse # Construction de la réponse
opegroups_list = [] opegroups_list = []
for opegroup in opegroups: for opegroup in opegroups:
opegroup_dict = { opegroup_dict = {
'type' : 'opegroup', 'type': 'opegroup',
'id' : opegroup.id, 'id': opegroup.id,
'amount' : opegroup.amount, 'amount': opegroup.amount,
'at' : opegroup.at, 'at': opegroup.at,
'is_cof' : opegroup.is_cof, 'is_cof': opegroup.is_cof,
'comment' : opegroup.comment, 'comment': opegroup.comment,
'opes' : [], 'opes': [],
'on_acc__trigramme': 'on_acc__trigramme':
opegroup.on_acc and opegroup.on_acc.trigramme or None, opegroup.on_acc and opegroup.on_acc.trigramme or None,
} }
@ -1408,13 +1416,13 @@ def history_json(request):
opegroup.valid_by and opegroup.valid_by.trigramme or None) opegroup.valid_by and opegroup.valid_by.trigramme or None)
for ope in opegroup.opes.all(): for ope in opegroup.opes.all():
ope_dict = { ope_dict = {
'id' : ope.id, 'id': ope.id,
'type' : ope.type, 'type': ope.type,
'amount' : ope.amount, 'amount': ope.amount,
'article_nb' : ope.article_nb, 'article_nb': ope.article_nb,
'is_checkout' : ope.is_checkout, 'is_checkout': ope.is_checkout,
'addcost_amount': ope.addcost_amount, 'addcost_amount': ope.addcost_amount,
'canceled_at' : ope.canceled_at, 'canceled_at': ope.canceled_at,
'article__name': 'article__name':
ope.article and ope.article.name or None, ope.article and ope.article.name or None,
'addcost_for__trigramme': 'addcost_for__trigramme':
@ -1437,9 +1445,9 @@ def history_json(request):
} }
if request.user.has_perm('kfet.is_team'): if request.user.has_perm('kfet.is_team'):
transfergroup_dict['valid_by__trigramme'] = ( transfergroup_dict['valid_by__trigramme'] = (
transfergroup.valid_by transfergroup.valid_by and
and transfergroup.valid_by.trigramme transfergroup.valid_by.trigramme or
or None) None)
for transfer in transfergroup.filtered_transfers: for transfer in transfergroup.filtered_transfers:
transfer_dict = { transfer_dict = {
@ -1451,9 +1459,9 @@ def history_json(request):
} }
if request.user.has_perm('kfet.is_team'): if request.user.has_perm('kfet.is_team'):
transfer_dict['canceled_by__trigramme'] = ( transfer_dict['canceled_by__trigramme'] = (
transfer.canceled_by transfer.canceled_by and
and transfer.canceled_by.trigramme transfer.canceled_by.trigramme or
or None) None)
transfergroup_dict['opes'].append(transfer_dict) transfergroup_dict['opes'].append(transfer_dict)
opegroups_list.append(transfergroup_dict) opegroups_list.append(transfergroup_dict)
@ -1527,20 +1535,24 @@ def transfers_create(request):
return render(request, 'kfet/transfers_create.html', return render(request, 'kfet/transfers_create.html',
{ 'transfer_formset': transfer_formset }) { 'transfer_formset': transfer_formset })
@teamkfet_required @teamkfet_required
def perform_transfers(request): def perform_transfers(request):
data = { 'errors': {}, 'transfers': [], 'transfergroup': 0 } data = {'errors': {}, 'transfers': [], 'transfergroup': 0}
# Checking transfer_formset # Checking transfer_formset
transfer_formset = TransferFormSet(request.POST) transfer_formset = TransferFormSet(request.POST)
if not transfer_formset.is_valid(): if not transfer_formset.is_valid():
return JsonResponse({ 'errors': list(transfer_formset.errors)}, status=400) return JsonResponse({'errors': list(transfer_formset.errors)},
status=400)
transfers = transfer_formset.save(commit = False) transfers = transfer_formset.save(commit=False)
# Initializing vars # Initializing vars
required_perms = set(['kfet.add_transfer']) # Required perms to perform all transfers # Required perms to perform all transfers
to_accounts_balances = defaultdict(lambda:0) # For balances of accounts required_perms = set(['kfet.add_transfer'])
# For balances of accounts
to_accounts_balances = defaultdict(lambda: 0)
for transfer in transfers: for transfer in transfers:
to_accounts_balances[transfer.from_acc] -= transfer.amount to_accounts_balances[transfer.from_acc] -= transfer.amount
@ -1552,7 +1564,7 @@ def perform_transfers(request):
# Checking if ok on all accounts # Checking if ok on all accounts
for account in to_accounts_balances: for account in to_accounts_balances:
(perms, stop) = account.perms_to_perform_operation( (perms, stop) = account.perms_to_perform_operation(
amount = to_accounts_balances[account]) amount=to_accounts_balances[account])
required_perms |= perms required_perms |= perms
stop_all = stop_all or stop stop_all = stop_all or stop
if stop: if stop:
@ -1578,7 +1590,7 @@ def perform_transfers(request):
# Updating balances accounts # Updating balances accounts
for account in to_accounts_balances: for account in to_accounts_balances:
Account.objects.filter(pk=account.pk).update( Account.objects.filter(pk=account.pk).update(
balance = F('balance') + to_accounts_balances[account]) balance=F('balance') + to_accounts_balances[account])
account.refresh_from_db() account.refresh_from_db()
if account.balance < 0: if account.balance < 0:
if hasattr(account, 'negative'): if hasattr(account, 'negative'):
@ -1587,10 +1599,10 @@ def perform_transfers(request):
account.negative.save() account.negative.save()
else: else:
negative = AccountNegative( negative = AccountNegative(
account = account, start = timezone.now()) account=account, start=timezone.now())
negative.save() negative.save()
elif (hasattr(account, 'negative') elif (hasattr(account, 'negative') and
and not account.negative.balance_offset): not account.negative.balance_offset):
account.negative.delete() account.negative.delete()
# Saving transfer group # Saving transfer group
@ -1611,8 +1623,8 @@ def perform_transfers(request):
'id': transfergroup.pk, 'id': transfergroup.pk,
'at': transfergroup.at, 'at': transfergroup.at,
'comment': transfergroup.comment, 'comment': transfergroup.comment,
'valid_by__trigramme': ( transfergroup.valid_by and 'valid_by__trigramme': (transfergroup.valid_by and
transfergroup.valid_by.trigramme or None), transfergroup.valid_by.trigramme or None),
'opes': [], 'opes': [],
}] }]
for transfer in transfers: for transfer in transfers: