Files
aem_monespace/monaem/views/reglement.py
2023-06-22 10:26:17 +02:00

275 lines
9.2 KiB
Python

# -*- coding: utf8 -*-
from pyramid.response import Response
from pyramid.renderers import render, get_renderer
from pyramid.view import (
view_config,
)
from pyramid.httpexceptions import (
HTTPFound,
)
from datetime import *
from dateutil.relativedelta import relativedelta
from time import strftime
import math
import hashlib
import binascii
import hmac
from ..models.default import *
from ..models.reglement import *
from ..views.default import (
to_decimal,
)
def hash_hmac(request, msg):
# lire la clé HMAC donné par PAYBOX et stocké dans agence 6
agence6 = get_agences(request, 6)
hmac_key = agence6.hmac_key
# Transformer la key en binaire
binary_key = binascii.unhexlify(hmac_key.encode('utf-8'))
# hasher le msg avec la key binaire
res = hmac.new(binary_key, msg.encode('utf-8'), hashlib.sha512).hexdigest()
return res.upper()
# - - - - - - - - - - - - - - - - - - - - - - - - - -
@view_config(route_name='crediter', renderer='../templates/reglement/crediter.pt')
def crediter(request):
url = request.route_url('crediter')
logged_in = request.authenticated_userid
eleve_info = get_eleve_info(request, logged_in)
message = ""
# lire les articles possibles selon le permise demandé ?
items = get_tarifs(request, eleve_info['permis'])
qtes = []
for item in items :
qtes.append('0')
mttotal = 0
if 'form.submitted' in request.params or 'regler.submitted' in request.params:
# calculer le montant total
qtes = []
for item in items :
# récupère la qté saisie pour la REF
qte = int(request.params[item.REF])
qtes.append(str(qte))
mttotal += item.PUTTC * qte
if 'regler.submitted' in request.params:
# case CGV cocher ?
if 'cb_cgv' not in request.params:
request.session.flash(u"Veuillez accepter les Conditions Générales de Vente pour continuer.", 'danger')
else:
return HTTPFound(location=request.route_url('reglement', ref='CRE', mttotal=mttotal, nfois='1'))
return {
'page_title': "Créditer mon compte",
'url': url,
'message': message,
'items': items,
'qtes': qtes,
'mttotal': mttotal,
}
@view_config(route_name='reglement', renderer='../templates/reglement/reglement.pt', permission='view')
def reglement(request):
def get_cb_maxdate(nfois):
today = date.today()
cb_maxdate = today + relativedelta(months=+int(nfois)-1)
return cb_maxdate.strftime('%y%m') # format AAMM
def get_schedule_dates():
today = date.today()
second_reglement = today + relativedelta(months=+1)
third_reglement = today + relativedelta(months=+2)
return [today.strftime('%d/%m/%Y'),
second_reglement.strftime('15/%m/%Y'),
third_reglement.strftime('15/%m/%Y')]
def calc_montant_nfois(total, display):
"""Divise total par 3, et retourne le binôme suivant :
[ ([int] résultat entier + reste), ([str10] résultat entier avec zéros devant) ]
display est utilisé pour produire soit des paramètres (display = 0), soit des
chaînes d'affichage (display = 1).
"""
total = int(total)
a = int(total / 3 + total % 3)
b = int(total / 3)
if display == 0:
b = str(b)
b = b.zfill(10)
return [a, b]
ref = request.matchdict['ref']
sum_to_pay = float(request.matchdict['mttotal'])
nfois = request.matchdict['nfois']
logged_in = request.authenticated_userid
url = request.route_url('reglement', ref=ref, mttotal=request.matchdict['mttotal'], nfois=nfois)
# --- sites de prod
url_paybox = "https://tpeweb.e-transactions.fr/cgi/MYchoix_pagepaiement.cgi"
url_retour = request.route_url('reglement_ret')
# --- sites de test
# carte de test : 1111222233334444 12/18 123
# url_paybox = "https://preprod-tpeweb.e-transactions.fr/cgi/MYchoix_pagepaiement.cgi"
# url_retour = "http://62.35.112.130/reglement_ret"
pbx_site = '1119903'
pbx_rang = '01'
pbx_identifiant = '210073358'
pbx_total = 0
pbx_devise = '978'
pbx_cmd = '%s%s/' % (ref, logged_in)
pbx_porteur = get_eleve_info(request, logged_in)['email']
pbx_retour = 'reference:R;montant:M;autorisation:A;erreur:E'
pbx_datevalmax = ''
pbx_repondre_a = url_retour
pbx_hash = 'SHA512'
pbx_time = datetime.now().isoformat()
pbx_hmac = ''
# préparer les macros
snippets = get_renderer('../templates/inscriptions/macros.pt').implementation()
pay_ok = False
schedule_dates = None
schedule_sums = None
mt_total = 0
if 'form.submitted' in request.params:
pay_ok = True
nfois = request.params['nfois']
pbx_datevalmax = get_cb_maxdate(nfois)
pbx_total = int(math.ceil(to_decimal(100.)*to_decimal(sum_to_pay))) # was montantcmd
mt_total = sum_to_pay
if nfois == '3':
# Splitted reglement
if pbx_total < 30000:
pay_ok = False
else:
sums = calc_montant_nfois(pbx_total, 0)
save_total = pbx_total
pbx_total = sums[0] # 1ere echeance
mt_total = float(pbx_total)
today = strftime('%d-%m-%Y')
# compléter la référence commande
pbx_cmd += today + 'PBX_2MONT' + sums[1] + 'PBX_NBPAIE02PBX_FREQ01PBX_QUAND00'
schedule_dates = get_schedule_dates()
schedule_sums = calc_montant_nfois(save_total, 1)
# hash the parameters by hmac
param = 'PBX_SITE=%s&PBX_RANG=%s&PBX_IDENTIFIANT=%s' % (pbx_site, pbx_rang, pbx_identifiant)
param += '&PBX_TOTAL=%s&PBX_DEVISE=%s&PBX_CMD=%s&PBX_PORTEUR=%s&PBX_RETOUR=%s' % (
pbx_total, pbx_devise, pbx_cmd, pbx_porteur, pbx_retour)
param += '&PBX_DATEVALMAX=%s&PBX_REPONDRE_A=%s&PBX_HASH=%s&PBX_TIME=%s' % (
pbx_datevalmax, pbx_repondre_a, pbx_hash, pbx_time)
pbx_hmac = hash_hmac(request, param)
return {
'page_title': 'Paiement',
'url': url,
'url_paybox': url_paybox,
'pbx_site': pbx_site,
'pbx_rang': pbx_rang,
'pbx_identifiant': pbx_identifiant,
'pbx_total': pbx_total,
'pbx_devise': pbx_devise,
'pbx_cmd': pbx_cmd,
'pbx_porteur': pbx_porteur,
'pbx_retour': pbx_retour,
'pbx_datevalmax': pbx_datevalmax,
'pbx_repondre_a': pbx_repondre_a,
'pbx_hash': pbx_hash,
'pbx_time': pbx_time,
'pbx_hmac': pbx_hmac,
'ref': ref,
'sum_to_pay': sum_to_pay,
'mt_total': mt_total,
'nfois': nfois,
'pay_ok': pay_ok,
'schedule_dates': schedule_dates,
'schedule_sums': schedule_sums,
'snippets': snippets,
}
@view_config(route_name='reglement_acc', renderer='../templates/reglement/reglement_acc.pt')
def reglement_acc(request):
page_title = "Paiement accepté"
return {
'page_title': "Paiement accepté",
}
@view_config(route_name='reglement_ann', renderer='../templates/reglement/reglement_ann.pt')
def reglement_ann(request):
return {
'page_title': "Paiement annulé",
}
@view_config(route_name='reglement_ref', renderer='../templates/reglement/reglement_ref.pt')
def reglement_ref(request):
return {
'page_title': "Paiement refusé",
}
@view_config(route_name='reglement_ret')
def reglement_ret(request):
reference = request.params['reference']
montant = request.params['montant']
erreur = request.params['erreur']
if 'autorisation' in request.params:
autorisation = request.params['autorisation']
else:
#en cas de refus de paybox
autorisation = 'ERREUR'
if reference.find("/") > 6:
cd_cli = reference[3:9]
else:
# ancien format
cd_cli = reference[:6]
montant = float(montant)/100
# paiement en 1 fois ?
if reference.find("PBX") == -1:
# réglement comptant
prochain_montant = 0.0
# réglement PASS ROUSSEAU ? oui, confirmer
if reference[:3] == "PRS" and erreur == '00000':
confirmerPass(request, cd_cli)
else:
# réglement 3 fois sans frais
# reference = CPT100481/22-09-2020PBX_2MONT0000076300PBX_NBPAIE02PBX_FREQ01PBX_QUAND00
# reference = CRE661759/18-06-2018PBX_2MONT0000018800PBX_NBPAIE02PBX_FREQ01PBX_QUAND00
prochain_montant = reference.split("PBX")[1]
prochain_montant = prochain_montant.split("MONT")[1]
prochain_montant = float(int (prochain_montant))/100
reference = reference.split("PBX")[0]
if 'ETAT_PBX' in request.params:
reconduction = request.params['ETAT_PBX']
else:
reconduction = ''
ins_tickets(request, cd_cli, datetime.now(), reference[:20], montant, autorisation, erreur, prochain_montant, reconduction)
return Response(
content_type='text/plain',
body='1'
)