From 3767e0fa069e8ba4d2aca4d9e781dbdbb0b71693 Mon Sep 17 00:00:00 2001 From: Emmanuel Cazenave Date: Fri, 5 Oct 2018 16:49:28 +0200 Subject: [PATCH] systempayv2: allow arbitrary date for deferred payment (#26992) --- eopayment/systempayv2.py | 20 +++++++++++-- tests/test_systempayv2.py | 60 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/eopayment/systempayv2.py b/eopayment/systempayv2.py index 201cb2c..96b2ac2 100644 --- a/eopayment/systempayv2.py +++ b/eopayment/systempayv2.py @@ -266,14 +266,14 @@ class Payment(PaymentCommon): def request(self, amount, name=None, first_name=None, last_name=None, address=None, email=None, phone=None, orderid=None, info1=None, - info2=None, info3=None, next_url=None, **kwargs): + info2=None, info3=None, next_url=None, capture_date=None, **kwargs): ''' Create the URL string to send a request to SystemPay ''' self.logger.debug('%s amount %s name %s address %s email %s phone %s ' - 'next_url %s info1 %s info2 %s info3 %s kwargs: %s', + 'next_url %s info1 %s info2 %s info3 %s capture_date %s kwargs: %s', __name__, amount, name, address, email, phone, info1, - info2, info3, next_url, kwargs) + info2, info3, next_url, capture_date, kwargs) # amount unit is cents amount = '%.0f' % (100 * amount) kwargs.update(add_vads({'amount': force_text(amount)})) @@ -332,6 +332,20 @@ class Payment(PaymentCommon): fields[name] = parameter.default() else: fields[name] = parameter.default + + if capture_date: + try: + capture_date = dt.datetime.strptime(capture_date, "%Y-%m-%d").date() + except (TypeError, ValueError): + raise ValueError('Bad format for capture date, it should be yyyy-mm-dd.') + vads_capture_delay = ( + capture_date - + dt.datetime.strptime(fields[VADS_TRANS_DATE], "%Y%m%d%H%M%S").date() + ).days + if vads_capture_delay <= 0: + raise ValueError("capture_date needs to be superior to the transaction date") + fields['vads_capture_delay'] = force_text(vads_capture_delay) + check_vads(fields) fields[SIGNATURE] = force_text(self.signature(fields)) self.logger.debug('%s request contains fields: %s', __name__, fields) diff --git a/tests/test_systempayv2.py b/tests/test_systempayv2.py index bf00b6d..3048129 100644 --- a/tests/test_systempayv2.py +++ b/tests/test_systempayv2.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +from datetime import datetime, timedelta import pytest from six.moves.urllib import parse as urlparse @@ -14,6 +15,13 @@ PARAMS = { 'vads_trans_date': u'20090501193530', } + +def get_field(form, field_name): + for field in form.fields: + if field['name'] == field_name: + return field + + def test_systempayv2(): p = Payment(PARAMS) data = {'amount': 15.24, 'orderid': '654321', @@ -49,3 +57,55 @@ def test_systempayv2(): # bad response with pytest.raises(ResponseError, match='missing signature, vads_ctx_mode or vads_auth_result'): p.response('foo=bar') + + +def test_systempayv2_deferred_payment(): + default_params = { + 'secret_test': u'1122334455667788', + 'vads_site_id': u'12345678', + 'vads_ctx_mode': u'TEST', + } + default_data = { + 'amount': 15.24, 'orderid': '654321', 'first_name': u'John', + 'last_name': u'Doe' + } + p = Payment(default_params.copy()) + data = default_data.copy() + data['capture_date'] = (datetime.now().date() + timedelta(days=3)).isoformat() + transaction_id, f, form = p.request(**data) + assert get_field(form, 'vads_capture_delay')['value'] == '3' + + # default vads_capture_delay used if no capture date + params = default_params.copy() + params['vads_capture_delay'] = 1 + p = Payment(params) + transaction_id, f, form = p.request(**default_data.copy()) + assert get_field(form, 'vads_capture_delay')['value'] == '1' + + # capture date override vads_capture_delay + params = default_params.copy() + params['vads_capture_delay'] = 1 + p = Payment(params) + data = default_data.copy() + data['capture_date'] = (datetime.now().date() + timedelta(days=3)).isoformat() + transaction_id, f, form = p.request(**data) + assert get_field(form, 'vads_capture_delay')['value'] == '3' + + # capture date can't be inferior to the transaction date + params = default_params.copy() + params['vads_trans_date'] = (datetime.utcnow() + timedelta(days=3)).strftime("%Y%m%d%H%M%S") + p = Payment(params) + data = default_data.copy() + data['capture_date'] = (datetime.now().date()).isoformat() + + with pytest.raises( + ValueError, match='capture_date needs to be superior to the transaction date'): + transaction_id, f, form = p.request(**data) + + # capture date should have the right format + p = Payment(params) + data = default_data.copy() + data['capture_date'] = 'not a date' + with pytest.raises( + ValueError, match='Bad format for capture date, it should be yyyy-mm-dd.'): + transaction_id, f, form = p.request(**data) -- 2.19.0