11from mollie .api .client import Client as MollieClient
2- from mollie .api .resources .methods import Method as MollieMethods
32from braces .views import LoginRequiredMixin
4- from django import forms
53from django .conf import settings
64from django .contrib import messages
75from django .urls import reverse
1513from ordering .models import Order
1614
1715
18- def choosebankform_factory (methods ):
19- """
20- Generate a Django Form used to choose your bank from a drop down
21- Based on the up-to-date list of :banks: from our PSP
22- """
23- paymethods = [(method ['id' ], method ['description' ])
24- for method in methods
25- if method ['status' ] == 'activated' ]
26-
27- bankchoices = []
28- for method in methods :
29- if (method ['id' ] == 'ideal' ):
30- bankchoices = [(issuer ['id' ], issuer ['name' ])
31- for issuer in method ['issuers' ]]
32-
33- class ChooseBankForm (forms .Form ):
34- method = forms .ChoiceField (
35- choices = paymethods ,
36- required = True ,
37- initial = 'ideal' ,
38- widget = forms .RadioSelect ,
39- label = "Betaalwijze" )
40- bank = forms .ChoiceField (choices = bankchoices , required = True )
41-
42- return ChooseBankForm
43-
44-
4516def get_order_to_pay (user ):
4617 cur_order_round = get_current_order_round ()
4718
@@ -54,26 +25,19 @@ class MollieMixin(object):
5425 def __init__ (self ):
5526 self .mollie = MollieClient ()
5627 self .mollie .set_api_key (settings .MOLLIE_API_KEY )
57- self .methods = self .mollie .methods .all (include = 'issuers' )
58-
59- def create_payment (self , amount , description , issuer_id , order_id , method ):
60- if (method == 'ideal' ):
61- mollieMethod = MollieMethods .IDEAL
62- else :
63- mollieMethod = MollieMethods .BANCONTACT
6428
29+ def create_payment (self , amount , description , order_id ):
6530 # Mollie API wants exactly two decimals, always
6631 return self .mollie .payments .create ({
6732 'amount' : {'currency' : 'EUR' , 'value' : "{0:.2f}" .format (amount )},
6833 'description' : description ,
34+ 'method' : 'ideal' ,
6935 'redirectUrl' : (
7036 settings .BASE_URL
7137 + reverse ("finance.confirmtransaction" )
7238 + "?order=%s" % order_id
7339 ),
7440 'webhookUrl' : settings .BASE_URL + reverse ("finance.callback" ),
75- 'method' : mollieMethod ,
76- 'issuer' : issuer_id ,
7741 'metadata' : {
7842 'order_id' : order_id
7943 },
@@ -83,59 +47,44 @@ def get_payment(self, payment_id):
8347 return self .mollie .payments .get (payment_id )
8448
8549
86- class ChooseBankView (LoginRequiredMixin , MollieMixin , FormView ):
87- """
88- Let user choose a bank to use for iDeal payment
89- """
90- template_name = "finance/choose_bank.html"
91-
92- def get_form_class (self ):
93- return choosebankform_factory (methods = self .methods )
94-
95- def get_context_data (self , ** kwargs ):
96- context = super (ChooseBankView , self ).get_context_data (** kwargs )
97- context ['order' ] = get_order_to_pay (self .request .user )
98- return context
99-
100-
10150class CreateTransactionView (LoginRequiredMixin , MollieMixin , FormView ):
10251 """
10352 Create transaction @ bank and redirect user to bank URL
10453 """
105-
106- def get_form_class (self ):
107- return choosebankform_factory (methods = self .methods )
108-
10954 def post (self , request , * args , ** kwargs ):
110- Form = self .get_form_class ()
111- form = Form (data = request .POST )
112- form .full_clean ()
113-
114- # input validation
115- if 'method' not in form .cleaned_data :
116- return redirect (reverse ('finance.choosebank' ))
117- method = form .cleaned_data .get ('method' )
118-
119- if (method == 'ideal' ):
120- if 'bank' not in form .cleaned_data :
121- return redirect (reverse ('finance.choosebank' ))
122- bank = form .cleaned_data .get ('bank' )
123- else :
124- bank = None
125- # end input validation
126-
12755 order_to_pay = get_order_to_pay (request .user )
12856 if not order_to_pay :
12957 messages .error (request , "Geen bestelling gevonden" )
13058 return redirect (reverse ('view_products' ))
13159
60+ user_notes = request .POST .get ('notes' ).strip ()
61+ if user_notes :
62+ order_to_pay .user_notes = user_notes
63+
64+ log_event (event = "Finalizing order %s" % order_to_pay .id , user = order_to_pay .user )
65+ order_to_pay .finalized = True # Freeze order
66+ order_to_pay .save ()
67+
13268 amount_to_pay = order_to_pay \
13369 .total_price_to_pay_with_balances_taken_into_account ()
13470 log_event (
13571 event = "Initiating payment (creating transaction) for order %d "
13672 "and amount %f" %
13773 (order_to_pay .id , amount_to_pay ), user = order_to_pay .user )
13874
75+ if amount_to_pay == 0 :
76+ log_event (
77+ event = "Payment for order %d not necessary because order total "
78+ "is %f and user's credit is %f" %
79+ (order_to_pay .id , order_to_pay .total_price ,
80+ order_to_pay .user .balance .credit ()),
81+ user = order_to_pay .user
82+ )
83+
84+ self ._message_payment_unnecessary ()
85+ order_to_pay .complete_after_payment ()
86+ return redirect (reverse ('order_summary' , args = (order_to_pay .pk ,)))
87+
13988 # Sanity checks. If one of these fails, it's very likely that someone
14089 # is tampering.
14190 assert order_to_pay .user == request .user
@@ -159,9 +108,10 @@ def post(self, request, *args, **kwargs):
159108 amount = float (amount_to_pay ),
160109 description = "VOKO Utrecht %d"
161110 % order_to_pay .id ,
162- issuer_id = bank ,
111+ # issuer_id=bank,
112+ # method=method,
163113 order_id = order_to_pay .id ,
164- method = method )
114+ )
165115
166116 Payment .objects .create (amount = amount_to_pay ,
167117 order = order_to_pay ,
@@ -170,6 +120,13 @@ def post(self, request, *args, **kwargs):
170120 redirect_url = results .checkout_url
171121 return redirect (redirect_url )
172122
123+ def _message_payment_unnecessary (self ):
124+ messages .add_message (
125+ self .request , messages .SUCCESS ,
126+ 'Omdat je genoeg krediet had was betalen niet nodig. '
127+ 'Je bestelling is bevestigd.'
128+ )
129+
173130
174131class ConfirmTransactionView (LoginRequiredMixin , MollieMixin , TemplateView ):
175132 """
0 commit comments