mangopay4-ruby-sdk 3.44.0 → 3.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +59 -0
- data/lib/mangopay/acquiring.rb +7 -0
- data/lib/mangopay/pay_in.rb +24 -0
- data/lib/mangopay/settlement.rb +14 -4
- data/lib/mangopay/user.rb +4 -0
- data/lib/mangopay/version.rb +1 -1
- data/spec/mangopay/acquiring_spec.rb +27 -1
- data/spec/mangopay/conversion_spec.rb +8 -1
- data/spec/mangopay/payin_intent_spec.rb +163 -19
- data/spec/mangopay/payin_payconiq_web_spec.rb +2 -1
- data/spec/mangopay/settlement_sample.csv +8 -8
- data/spec/mangopay/settlement_sample_bad.csv +8 -0
- data/spec/mangopay/settlement_spec.rb +40 -13
- data/spec/mangopay/shared_resources.rb +20 -1
- data/spec/mangopay/user_spec.rb +11 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ebeaec3cb872600bd73956fbf11d134bc90c5d4eb858e4a5873ff1dc020bbe56
|
|
4
|
+
data.tar.gz: 0df0444dd4be33ca5936d3d911250287cddafc339aa9275c35fbfc264e3d2d21
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 474b4ec9b214ea50d75aec50506818aba748f9b2c279919ba8849d4749b716151411a8a5a0e6240d16744b70ea8341342188c89e6db471269a83c8a93c7e4757
|
|
7
|
+
data.tar.gz: b9e6f1e6636a116c2f670849a61839964d11a2298304c0ad0be7584a4024a9415f42f5861bf630effca9a964084f8baa0f7a9f49e3848f1c35f1df21663ea6c3
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,62 @@
|
|
|
1
|
+
## [3.46.0] - 2026-02-12
|
|
2
|
+
### FX
|
|
3
|
+
|
|
4
|
+
#### Breaking change – Custom fees
|
|
5
|
+
#329
|
|
6
|
+
To support percentage-based FX fees ([API release note](/release-notes/api/2026-02-11)):
|
|
7
|
+
- Updated tests to check for conversion custom fees
|
|
8
|
+
|
|
9
|
+
#### Added – User margin
|
|
10
|
+
#329
|
|
11
|
+
To support the FX user margin ([API release note](/release-notes/api/2026-02-11)):
|
|
12
|
+
- Updated tests to check for conversion user margins
|
|
13
|
+
|
|
14
|
+
### Echo
|
|
15
|
+
|
|
16
|
+
#### Breaking change - Settlement upload endpoints
|
|
17
|
+
#325
|
|
18
|
+
To support the new behavior of the [POST Create a Settlement](/api-reference/settlements/create-settlement) endpoint to obtain an `UploadUrl`:
|
|
19
|
+
- Updated `settlement_sample.csv` and tests
|
|
20
|
+
- **Breaking change** – Replaced `upload` method in `Settlement` with `generate_upload_url`:
|
|
21
|
+
- **Breaking change** – Replaced `update` method in `Settlement` with `generate_new_upload_url`:
|
|
22
|
+
|
|
23
|
+
#### Added - GET validations for a Settlement endpoint
|
|
24
|
+
#325
|
|
25
|
+
To support the [GET View validations for a Settlement](/api-reference/settlements/view-settlement-validations) endpoint:
|
|
26
|
+
- Added `get_validations` method to `Settlement`
|
|
27
|
+
|
|
28
|
+
#### Added - PUT Cancel a Settlement endpoint
|
|
29
|
+
#325
|
|
30
|
+
To support the [PUT Cancel a Settlement](/api-reference/settlements/cancel-settlement) endpoint:
|
|
31
|
+
- Added `cancel` method to `Settlement`
|
|
32
|
+
|
|
33
|
+
#### Added – POST Create a Refund of an Intent
|
|
34
|
+
#324
|
|
35
|
+
To support [POST Create a Refund of an Intent](/api-reference/intents/create-intent-refund):
|
|
36
|
+
- Added `create` method to `Refund`
|
|
37
|
+
|
|
38
|
+
#### Added – POST Reverse the Refund of an Intent
|
|
39
|
+
#324
|
|
40
|
+
To support [POST Reverse the Refund of an Intent](/api-reference/intents/create-intent-refund):
|
|
41
|
+
- Added `reverse` method to `Refund`
|
|
42
|
+
|
|
43
|
+
#### Added – POST Create a Dispute of an Intent
|
|
44
|
+
#324
|
|
45
|
+
To support [POST Create a Dispute of an Intent](/api-reference/intents/create-intent-refund):
|
|
46
|
+
- Added `create` method to `Dispute`
|
|
47
|
+
|
|
48
|
+
#### Added - PUT Update an Intent Dispute
|
|
49
|
+
#324
|
|
50
|
+
To support [PUT Update an Intent Dispute](/api-reference/intents/create-intent-dispute):
|
|
51
|
+
- Added `update_outcome` method to `Dispute`
|
|
52
|
+
|
|
53
|
+
## [3.45.0] - 2026-01-27
|
|
54
|
+
### Added
|
|
55
|
+
- Support for new [GET View the SCA status of a User](https://docs.mangopay.com/api-reference/users/view-user-sca-status) endpoint ([API release note](https://docs.mangopay.com/release-notes/api/2026-01-15)) (#326)
|
|
56
|
+
- Support for Acquiring - Card Validation endpoint (#327)
|
|
57
|
+
|
|
58
|
+
Release PR: #328
|
|
59
|
+
|
|
1
60
|
## [3.44.0] - 2025-11-28
|
|
2
61
|
### Changed
|
|
3
62
|
- Migrated to V4 naming convention
|
data/lib/mangopay/acquiring.rb
CHANGED
|
@@ -8,6 +8,13 @@ module MangoPay
|
|
|
8
8
|
MangoPay.request(:post, "#{MangoPay.api_path}/acquiring/payins/card/direct", params, {}, idempotency_key)
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
def create_card_validation(card_id, params)
|
|
14
|
+
url = "#{MangoPay.api_path}/acquiring/cards/#{card_id}/validation"
|
|
15
|
+
MangoPay.request(:post, url, params)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
11
18
|
end
|
|
12
19
|
|
|
13
20
|
module ApplePay
|
data/lib/mangopay/pay_in.rb
CHANGED
|
@@ -409,6 +409,30 @@ module MangoPay
|
|
|
409
409
|
end
|
|
410
410
|
end
|
|
411
411
|
end
|
|
412
|
+
|
|
413
|
+
class Refund < Resource
|
|
414
|
+
class << self
|
|
415
|
+
def create(intent_id, params, idempotency_key = nil)
|
|
416
|
+
MangoPay.request(:post, "#{MangoPay.api_path_v3}/payins/intents/#{intent_id}/refunds", params, {}, idempotency_key)
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
def reverse(intent_id, refund_id, params, idempotency_key = nil)
|
|
420
|
+
MangoPay.request(:post, "#{MangoPay.api_path_v3}/payins/intents/#{intent_id}/refunds/#{refund_id}/reverse", params, {}, idempotency_key)
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
class Dispute < Resource
|
|
426
|
+
class << self
|
|
427
|
+
def create(intent_id, capture_id, params, idempotency_key = nil)
|
|
428
|
+
MangoPay.request(:post, "#{MangoPay.api_path_v3}/payins/intents/#{intent_id}/captures/#{capture_id}/disputes", params, {}, idempotency_key)
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
def update_outcome(intent_id, capture_id, dispute_id, params, idempotency_key = nil)
|
|
432
|
+
MangoPay.request(:put, "#{MangoPay.api_path_v3}/payins/intents/#{intent_id}/captures/#{capture_id}/disputes/#{dispute_id}/decision", params, {}, idempotency_key)
|
|
433
|
+
end
|
|
434
|
+
end
|
|
435
|
+
end
|
|
412
436
|
end
|
|
413
437
|
|
|
414
438
|
end
|
data/lib/mangopay/settlement.rb
CHANGED
|
@@ -2,9 +2,9 @@ module MangoPay
|
|
|
2
2
|
|
|
3
3
|
class Settlement < Resource
|
|
4
4
|
class << self
|
|
5
|
-
def
|
|
5
|
+
def generate_upload_url(settlement, idempotency_key = nil)
|
|
6
6
|
url = "#{MangoPay.api_path_v3}/payins/intents/settlements"
|
|
7
|
-
MangoPay.
|
|
7
|
+
MangoPay.request(:post, url, settlement, {}, idempotency_key)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def get(settlement_id)
|
|
@@ -12,9 +12,19 @@ module MangoPay
|
|
|
12
12
|
MangoPay.request(:get, url)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def
|
|
15
|
+
def generate_new_upload_url(settlement_id, settlement)
|
|
16
16
|
url = "#{MangoPay.api_path_v3}/payins/intents/settlements/#{settlement_id}"
|
|
17
|
-
MangoPay.
|
|
17
|
+
MangoPay.request(:put, url, settlement, {})
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def get_validations(settlement_id, filters = {})
|
|
21
|
+
url = "#{MangoPay.api_path_v3}/payins/intents/settlements/#{settlement_id}/validations"
|
|
22
|
+
MangoPay.request(:get, url, {}, filters)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def cancel(settlement_id, idempotency_key = nil)
|
|
26
|
+
url = "#{MangoPay.api_path_v3}/payins/intents/settlements/#{settlement_id}/cancel"
|
|
27
|
+
MangoPay.request(:post, url, {}, {}, idempotency_key)
|
|
18
28
|
end
|
|
19
29
|
end
|
|
20
30
|
end
|
data/lib/mangopay/user.rb
CHANGED
|
@@ -95,6 +95,10 @@ module MangoPay
|
|
|
95
95
|
def validate_data_format(params, idempotency_key = nil)
|
|
96
96
|
MangoPay.request(:post, "#{MangoPay.api_path}/users/data-formats/validation", params, {}, idempotency_key)
|
|
97
97
|
end
|
|
98
|
+
|
|
99
|
+
def get_sca_status(user_id, filters = {})
|
|
100
|
+
MangoPay.request(:get, "#{MangoPay.api_path}/sca/users/#{user_id}/sca-status", {}, filters)
|
|
101
|
+
end
|
|
98
102
|
end
|
|
99
103
|
end
|
|
100
104
|
end
|
data/lib/mangopay/version.rb
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
xdescribe MangoPay::
|
|
1
|
+
xdescribe MangoPay::Acquiring do
|
|
2
2
|
include_context 'wallets'
|
|
3
3
|
include_context 'payins'
|
|
4
4
|
|
|
5
5
|
let(:card_id) { 'placeholder' }
|
|
6
|
+
let(:author_id) { 'placeholder' }
|
|
6
7
|
|
|
7
8
|
describe 'PAY_IN CARD DIRECT' do
|
|
8
9
|
it 'creates a Card Direct PayIn' do
|
|
@@ -141,6 +142,31 @@ xdescribe MangoPay::Hook do
|
|
|
141
142
|
end
|
|
142
143
|
end
|
|
143
144
|
|
|
145
|
+
describe 'CARD VALIDATION' do
|
|
146
|
+
it 'creates card validation' do
|
|
147
|
+
params = {
|
|
148
|
+
AuthorId: author_id,
|
|
149
|
+
SecureModeReturnURL: "https://mangopay.com",
|
|
150
|
+
IpAddress: "2001:0620:0000:0000:0211:24FF:FE80:C12C",
|
|
151
|
+
Tag: "custom meta",
|
|
152
|
+
BrowserInfo: {
|
|
153
|
+
AcceptHeader: "text/html, application/xhtml+xml, application/xml;q=0.9, /;q=0.8",
|
|
154
|
+
JavaEnabled: true,
|
|
155
|
+
Language: "FR-FR",
|
|
156
|
+
ColorDepth: 4,
|
|
157
|
+
ScreenHeight: 1800,
|
|
158
|
+
ScreenWidth: 400,
|
|
159
|
+
JavascriptEnabled: true,
|
|
160
|
+
TimeZoneOffset: "+60",
|
|
161
|
+
UserAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 13_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
card_validation = MangoPay::Acquiring::PayIn::Card.create_card_validation(card_id, params)
|
|
165
|
+
expect(card_validation).not_to be_nil
|
|
166
|
+
expect("SUCCEEDED").to eq(card_validation['Status'])
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
144
170
|
def create_new_pay_in_card_direct
|
|
145
171
|
MangoPay::Acquiring::PayIn::Card::Direct.create(
|
|
146
172
|
DebitedFunds: { Currency: 'EUR', Amount: 100 },
|
|
@@ -17,7 +17,10 @@ describe MangoPay::Conversion, type: :feature do
|
|
|
17
17
|
expect(conversion['DebitedFunds']['Amount']).not_to be_nil
|
|
18
18
|
expect(conversion['CreditedFunds']['Amount']).not_to be_nil
|
|
19
19
|
expect(conversion['Fees']['Amount']).not_to be_nil
|
|
20
|
+
expect(conversion['RequestedFees']['Value']).not_to be_nil
|
|
20
21
|
expect(conversion['Status']).equal? 'SUCCEEDED'
|
|
22
|
+
expect(conversion['MarginsResponse']['Mangopay']).not_to be_nil
|
|
23
|
+
expect(conversion['MarginsResponse']['User']).to be_nil
|
|
21
24
|
end
|
|
22
25
|
end
|
|
23
26
|
|
|
@@ -77,10 +80,14 @@ describe MangoPay::Conversion, type: :feature do
|
|
|
77
80
|
|
|
78
81
|
describe 'CREATE CONVERSION QUOTE' do
|
|
79
82
|
it 'create a conversion quote' do
|
|
80
|
-
conversion_quote =
|
|
83
|
+
conversion_quote = create_conversion_quote_with_fees
|
|
81
84
|
expect(conversion_quote['DebitedFunds']).not_to be_nil
|
|
82
85
|
expect(conversion_quote['CreditedFunds']).not_to be_nil
|
|
83
86
|
expect(conversion_quote['Duration']).equal? 90
|
|
87
|
+
expect(conversion_quote['Fees']['Amount']).not_to be_nil
|
|
88
|
+
expect(conversion_quote['RequestedFees']['Value']).not_to be_nil
|
|
89
|
+
expect(conversion_quote['MarginsResponse']['Mangopay']).not_to be_nil
|
|
90
|
+
expect(conversion_quote['MarginsResponse']['User']).not_to be_nil
|
|
84
91
|
end
|
|
85
92
|
end
|
|
86
93
|
|
|
@@ -10,18 +10,7 @@ describe MangoPay::PayIn::PayInIntent, type: :feature do
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
it 'creates a payin intent full capture' do
|
|
13
|
-
|
|
14
|
-
to_create = {
|
|
15
|
-
"ExternalData": {
|
|
16
|
-
"ExternalProcessingDate": "01-10-2029",
|
|
17
|
-
"ExternalProviderReference": SecureRandom.uuid,
|
|
18
|
-
"ExternalMerchantReference": "Order-xyz-35e8490e-2ec9-4c82-978e-c712a3f5ba16",
|
|
19
|
-
"ExternalProviderName": "Stripe",
|
|
20
|
-
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
created = MangoPay::PayIn::PayInIntent::Capture.create(intent['Id'], to_create)
|
|
13
|
+
created = create_new_intent_full_capture
|
|
25
14
|
expect(created['Id']).not_to be_nil
|
|
26
15
|
expect(created['Status']).to eq('CAPTURED')
|
|
27
16
|
end
|
|
@@ -99,13 +88,8 @@ describe MangoPay::PayIn::PayInIntent, type: :feature do
|
|
|
99
88
|
it 'reverses split' do
|
|
100
89
|
intent = new_payin_intent_authorization
|
|
101
90
|
split = create_new_splits(intent)['Splits'][0]
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}.to raise_error { |err|
|
|
105
|
-
expect(err).to be_a MangoPay::ResponseError
|
|
106
|
-
expect(err.code).to eq '400'
|
|
107
|
-
expect(err.details['Type']).to eq 'param_error'
|
|
108
|
-
}
|
|
91
|
+
reversed = MangoPay::PayIn::PayInIntent::Split.reverse(intent['Id'], split['Id'])
|
|
92
|
+
expect(reversed['Status']).to eq('REVERSED')
|
|
109
93
|
end
|
|
110
94
|
|
|
111
95
|
it 'fetches split' do
|
|
@@ -127,6 +111,137 @@ describe MangoPay::PayIn::PayInIntent, type: :feature do
|
|
|
127
111
|
end
|
|
128
112
|
end
|
|
129
113
|
|
|
114
|
+
describe 'Intent Refund' do
|
|
115
|
+
it 'creates a full refund' do
|
|
116
|
+
created_refund = create_new_intent_full_refund
|
|
117
|
+
expect(created_refund['Id']).not_to be_nil
|
|
118
|
+
expect(created_refund['Status']).to eq('REFUNDED')
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it 'creates a partial refund' do
|
|
122
|
+
full_capture = create_new_intent_full_capture
|
|
123
|
+
to_create = {
|
|
124
|
+
"Amount": 1000,
|
|
125
|
+
"LineItems": [
|
|
126
|
+
{
|
|
127
|
+
"Id": full_capture['LineItems'][0]['Id'],
|
|
128
|
+
"Amount": 1000
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
"ExternalData": {
|
|
132
|
+
"ExternalProcessingDate": 1727913600,
|
|
133
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
134
|
+
"ExternalMerchantReference": SecureRandom.uuid,
|
|
135
|
+
"ExternalProviderName": "Stripe",
|
|
136
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
created_refund = MangoPay::PayIn::PayInIntent::Refund.create(full_capture['Id'], to_create)
|
|
140
|
+
expect(created_refund['Id']).not_to be_nil
|
|
141
|
+
expect(created_refund['Status']).to eq('REFUNDED')
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'fully reverses a refund' do
|
|
145
|
+
created_refund = create_new_intent_full_refund
|
|
146
|
+
to_create = {
|
|
147
|
+
"ExternalData": {
|
|
148
|
+
"ExternalProcessingDate": 1727913600,
|
|
149
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
150
|
+
"ExternalMerchantReference": SecureRandom.uuid,
|
|
151
|
+
"ExternalProviderName": "Stripe",
|
|
152
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
reversed_refund = MangoPay::PayIn::PayInIntent::Refund.reverse(created_refund['Id'], created_refund['Refund']['Id'], to_create)
|
|
156
|
+
expect(reversed_refund['Id']).not_to be_nil
|
|
157
|
+
expect(reversed_refund['Status']).to eq('REFUND_REVERSED')
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'partially reverses a refund' do
|
|
161
|
+
created_refund = create_new_intent_full_refund
|
|
162
|
+
to_create = {
|
|
163
|
+
"Amount": 1000,
|
|
164
|
+
"LineItems": [
|
|
165
|
+
{
|
|
166
|
+
"Id": created_refund['LineItems'][0]['Id'],
|
|
167
|
+
"Amount": 1000
|
|
168
|
+
}
|
|
169
|
+
],
|
|
170
|
+
"ExternalData": {
|
|
171
|
+
"ExternalProcessingDate": 1727913600,
|
|
172
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
173
|
+
"ExternalMerchantReference": SecureRandom.uuid,
|
|
174
|
+
"ExternalProviderName": "Stripe",
|
|
175
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
reversed_refund = MangoPay::PayIn::PayInIntent::Refund.reverse(created_refund['Id'], created_refund['Refund']['Id'], to_create)
|
|
179
|
+
expect(reversed_refund['Id']).not_to be_nil
|
|
180
|
+
expect(reversed_refund['Status']).to eq('REFUND_REVERSED')
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it 'creates a full dispute' do
|
|
184
|
+
capture = create_new_intent_full_capture
|
|
185
|
+
to_create = {
|
|
186
|
+
"ExternalData": {
|
|
187
|
+
"ExternalProcessingDate": 1727913600,
|
|
188
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
189
|
+
"ExternalMerchantReference": SecureRandom.uuid,
|
|
190
|
+
"ExternalProviderName": "Stripe",
|
|
191
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
created_dispute = MangoPay::PayIn::PayInIntent::Dispute.create(capture['Id'], capture['Capture']['Id'], to_create)
|
|
195
|
+
expect(created_dispute['Id']).not_to be_nil
|
|
196
|
+
expect(created_dispute['Status']).to eq('DISPUTED')
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it 'creates a partial dispute' do
|
|
200
|
+
capture = create_new_intent_full_capture
|
|
201
|
+
to_create = {
|
|
202
|
+
"Amount": 1000,
|
|
203
|
+
"LineItems": [
|
|
204
|
+
{
|
|
205
|
+
"Id": capture['LineItems'][0]['Id'],
|
|
206
|
+
"Amount": 1000
|
|
207
|
+
}
|
|
208
|
+
],
|
|
209
|
+
"ExternalData": {
|
|
210
|
+
"ExternalProcessingDate": 1727913600,
|
|
211
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
212
|
+
"ExternalMerchantReference": SecureRandom.uuid,
|
|
213
|
+
"ExternalProviderName": "Stripe",
|
|
214
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
created_dispute = MangoPay::PayIn::PayInIntent::Dispute.create(capture['Id'], capture['Capture']['Id'], to_create)
|
|
218
|
+
expect(created_dispute['Id']).not_to be_nil
|
|
219
|
+
expect(created_dispute['Status']).to eq('DISPUTED')
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
it 'updates dispute outcome' do
|
|
223
|
+
capture = create_new_intent_full_capture
|
|
224
|
+
to_create = {
|
|
225
|
+
"ExternalData": {
|
|
226
|
+
"ExternalProcessingDate": 1727913600,
|
|
227
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
228
|
+
"ExternalMerchantReference": SecureRandom.uuid,
|
|
229
|
+
"ExternalProviderName": "Stripe",
|
|
230
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
created_dispute = MangoPay::PayIn::PayInIntent::Dispute.create(capture['Id'], capture['Capture']['Id'], to_create)
|
|
234
|
+
|
|
235
|
+
dto = {
|
|
236
|
+
"Decision": "DEFENDED"
|
|
237
|
+
}
|
|
238
|
+
updated = MangoPay::PayIn::PayInIntent::Dispute.update_outcome(capture['Id'], capture['Capture']['Id'], created_dispute['Dispute']['Id'], dto)
|
|
239
|
+
|
|
240
|
+
expect(updated['Id']).not_to be_nil
|
|
241
|
+
expect(updated['Decision']).to eq('DEFENDED')
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
130
245
|
def create_new_splits(intent)
|
|
131
246
|
full_capture = {
|
|
132
247
|
"ExternalData": {
|
|
@@ -148,4 +263,33 @@ describe MangoPay::PayIn::PayInIntent, type: :feature do
|
|
|
148
263
|
}
|
|
149
264
|
return MangoPay::PayIn::PayInIntent::Split.create(intent['Id'], split)
|
|
150
265
|
end
|
|
266
|
+
|
|
267
|
+
def create_new_intent_full_capture
|
|
268
|
+
intent = new_payin_intent_authorization
|
|
269
|
+
to_create = {
|
|
270
|
+
"ExternalData": {
|
|
271
|
+
"ExternalProcessingDate": "01-10-2029",
|
|
272
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
273
|
+
"ExternalMerchantReference": "Order-xyz-35e8490e-2ec9-4c82-978e-c712a3f5ba16",
|
|
274
|
+
"ExternalProviderName": "Stripe",
|
|
275
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return MangoPay::PayIn::PayInIntent::Capture.create(intent['Id'], to_create)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def create_new_intent_full_refund
|
|
283
|
+
full_capture = create_new_intent_full_capture
|
|
284
|
+
to_create = {
|
|
285
|
+
"ExternalData": {
|
|
286
|
+
"ExternalProcessingDate": 1727913600,
|
|
287
|
+
"ExternalProviderReference": SecureRandom.uuid,
|
|
288
|
+
"ExternalMerchantReference": SecureRandom.uuid,
|
|
289
|
+
"ExternalProviderName": "Stripe",
|
|
290
|
+
"ExternalProviderPaymentMethod": "PAYPAL"
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return MangoPay::PayIn::PayInIntent::Refund.create(full_capture['Id'], to_create)
|
|
294
|
+
end
|
|
151
295
|
end
|
|
@@ -21,7 +21,8 @@ describe MangoPay::PayIn::Payconiq::Web, type: :feature do
|
|
|
21
21
|
check_type_and_status(created)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
# endpoint removed
|
|
25
|
+
xit 'creates a payconiq web payin using the old endpoint' do
|
|
25
26
|
created = new_payin_payconiq_web_legacy
|
|
26
27
|
expect(created['Id']).not_to be_nil
|
|
27
28
|
check_type_and_status(created)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
SettlementDate,19-06-2025
|
|
5
|
-
ExternalProviderName,Paypal
|
|
6
|
-
TotalSettlementFeesAmount,0
|
|
7
|
-
|
|
8
|
-
SettlementCurrency,EUR
|
|
1
|
+
ExternalProviderReference,ExternalPaymentMethod,ExternalTransactionType,ExternalTransactionStatus,ExternalProcessingDate,Amount,Currency,ExternalInitialReference,ExternalProviderFees
|
|
2
|
+
6TU984332A894613W,PAYPAL,PAYMENT,SETTLED,19-06-2025,1000,EUR,,0
|
|
3
|
+
,,,,,,,,
|
|
4
|
+
SettlementDate,19-06-2025,,,,,,,
|
|
5
|
+
ExternalProviderName,Paypal,,,,,,,
|
|
6
|
+
TotalSettlementFeesAmount,0,,,,,,,
|
|
7
|
+
TotalNetSettlementAmount,1000,,,,,,,
|
|
8
|
+
SettlementCurrency,EUR,,,,,,,
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
ExternalProviderReference,ExternalPaymentMethod,ExternalTransactionType,ExternalTransactionStatus,ExternalProcessingDate,Amount,Currency,ExternalInitialReference,ExternalProviderFees
|
|
2
|
+
6TU984332A894613W,PAYPAL,PAYMENT,SETTLED,19-06-2025,1000,EUR,,0
|
|
3
|
+
,,,,,,,,
|
|
4
|
+
SettlementDate,19-06-2025,,,,,,,
|
|
5
|
+
ExternalProviderName,Paypal,,,,,,,
|
|
6
|
+
TotalSettlementFeesAmount,0,,,,,,,
|
|
7
|
+
TotalNetSettlementAmount,999999,,,,,,,
|
|
8
|
+
SettlementCurrency,EUR,,,,,,
|
|
@@ -6,33 +6,60 @@ describe MangoPay::Settlement do
|
|
|
6
6
|
|
|
7
7
|
def create_settlement_if_needed
|
|
8
8
|
@settlement ||= begin
|
|
9
|
-
|
|
10
|
-
file = File.binread(file_path)
|
|
11
|
-
MangoPay::Settlement.upload(file)
|
|
9
|
+
MangoPay::Settlement.generate_upload_url({FileName: 'settlement_sample.csv'})
|
|
12
10
|
end
|
|
13
11
|
end
|
|
14
12
|
|
|
13
|
+
def upload_file(upload_url, file_name)
|
|
14
|
+
file_path = File.expand_path(file_name, __dir__)
|
|
15
|
+
file_content = File.binread(file_path)
|
|
16
|
+
|
|
17
|
+
uri = URI(upload_url)
|
|
18
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
19
|
+
http.use_ssl = (uri.scheme == 'https')
|
|
20
|
+
|
|
21
|
+
request = Net::HTTP::Put.new(uri)
|
|
22
|
+
request.body = file_content
|
|
23
|
+
request['Content-Type'] = 'text/csv'
|
|
24
|
+
|
|
25
|
+
http.request(request)
|
|
26
|
+
end
|
|
27
|
+
|
|
15
28
|
describe 'UPLOAD' do
|
|
29
|
+
it 'generates the upload URL' do
|
|
30
|
+
expect(@settlement['SettlementId']).not_to be_nil
|
|
31
|
+
expect(@settlement['UploadUrl']).not_to be_nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'generates a new upload URL' do
|
|
35
|
+
new_url = MangoPay::Settlement.generate_new_upload_url(@settlement['SettlementId'], {FileName: 'settlement_sample.csv'})
|
|
36
|
+
expect(new_url['SettlementId']).not_to be_nil
|
|
37
|
+
expect(new_url['UploadUrl']).not_to be_nil
|
|
38
|
+
end
|
|
39
|
+
|
|
16
40
|
it 'uploads the file' do
|
|
17
|
-
|
|
41
|
+
response = upload_file(@settlement['UploadUrl'], 'settlement_sample.csv')
|
|
42
|
+
expect(response.code.to_i).to eq(200)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'fetches validations' do
|
|
46
|
+
upload_file(@settlement['UploadUrl'], 'settlement_sample_bad.csv')
|
|
47
|
+
validations = MangoPay::Settlement.get_validations(@settlement['SettlementId'], {page: 1, per_page: 10})
|
|
48
|
+
expect(validations).not_to be_nil
|
|
18
49
|
end
|
|
19
50
|
end
|
|
20
51
|
|
|
21
52
|
describe 'GET' do
|
|
22
53
|
it 'fetches the file' do
|
|
23
54
|
fetched = MangoPay::Settlement.get(@settlement['SettlementId'])
|
|
24
|
-
expect(fetched['Status']).to eq('
|
|
55
|
+
expect(fetched['Status']).to eq('PENDING_UPLOAD')
|
|
25
56
|
end
|
|
26
57
|
end
|
|
27
58
|
|
|
28
|
-
describe '
|
|
29
|
-
it '
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
before_update = MangoPay::Settlement.upload(file)
|
|
33
|
-
expect(before_update['Status']).to eq('UPLOADED')
|
|
34
|
-
updated = MangoPay::Settlement.update(before_update['SettlementId'], file)
|
|
35
|
-
expect(updated['Status']).to eq('UPLOADED')
|
|
59
|
+
describe 'CANCEL' do
|
|
60
|
+
it 'cancels the settlement' do
|
|
61
|
+
fetched = MangoPay::Settlement.cancel(@settlement['SettlementId'])
|
|
62
|
+
expect(fetched['Status']).to eq('CANCELLED')
|
|
36
63
|
end
|
|
37
64
|
end
|
|
38
65
|
end
|
|
@@ -1225,7 +1225,8 @@ shared_context 'instant_conversion' do
|
|
|
1225
1225
|
},
|
|
1226
1226
|
Fees: {
|
|
1227
1227
|
Currency: 'EUR',
|
|
1228
|
-
Amount:
|
|
1228
|
+
Amount: 0.01,
|
|
1229
|
+
Type: 'PERCENTAGE'
|
|
1229
1230
|
},
|
|
1230
1231
|
Tag: 'Instant conversion test'
|
|
1231
1232
|
)
|
|
@@ -1259,6 +1260,24 @@ shared_context 'instant_conversion' do
|
|
|
1259
1260
|
)
|
|
1260
1261
|
end
|
|
1261
1262
|
|
|
1263
|
+
def create_conversion_quote_with_fees
|
|
1264
|
+
MangoPay::Conversion.create_quote(
|
|
1265
|
+
CreditedFunds: { Currency: 'GBP' },
|
|
1266
|
+
DebitedFunds: { Currency: 'EUR', Amount: 50 },
|
|
1267
|
+
Duration: 300,
|
|
1268
|
+
Tag: 'Created using the Mangopay Ruby SDK',
|
|
1269
|
+
Fees: {
|
|
1270
|
+
Currency: 'EUR',
|
|
1271
|
+
Amount: 1,
|
|
1272
|
+
Type: 'FIXED'
|
|
1273
|
+
},
|
|
1274
|
+
UserMargin: {
|
|
1275
|
+
Type: "PERCENTAGE",
|
|
1276
|
+
Value: 0.01
|
|
1277
|
+
}
|
|
1278
|
+
)
|
|
1279
|
+
end
|
|
1280
|
+
|
|
1262
1281
|
def get_conversion(id)
|
|
1263
1282
|
MangoPay::Conversion.get(id, params = {})
|
|
1264
1283
|
end
|
data/spec/mangopay/user_spec.rb
CHANGED
|
@@ -441,4 +441,15 @@ describe MangoPay::User do
|
|
|
441
441
|
}
|
|
442
442
|
end
|
|
443
443
|
end
|
|
444
|
+
|
|
445
|
+
describe 'SCA STATUS' do
|
|
446
|
+
it 'fetches SCA status' do
|
|
447
|
+
sca_status = MangoPay::User.get_sca_status("user_m_01JKZW095BFB2TRQMCZ8GE7M8D")
|
|
448
|
+
expect(sca_status).not_to be_nil
|
|
449
|
+
expect(sca_status['LastEnrollmentDate']).not_to be_nil
|
|
450
|
+
expect(sca_status['ConsentScope']['ContactInformationUpdate']).not_to be_nil
|
|
451
|
+
expect(sca_status['UserStatus']).to eq('ACTIVE')
|
|
452
|
+
expect(sca_status['IsEnrolled']).to eq(true)
|
|
453
|
+
end
|
|
454
|
+
end
|
|
444
455
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mangopay4-ruby-sdk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.46.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Geoffroy Lorieux
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2026-02-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: multi_json
|
|
@@ -176,6 +176,7 @@ files:
|
|
|
176
176
|
- spec/mangopay/report_v2_spec.rb
|
|
177
177
|
- spec/mangopay/report_wallets_spec.rb
|
|
178
178
|
- spec/mangopay/settlement_sample.csv
|
|
179
|
+
- spec/mangopay/settlement_sample_bad.csv
|
|
179
180
|
- spec/mangopay/settlement_spec.rb
|
|
180
181
|
- spec/mangopay/shared_resources.rb
|
|
181
182
|
- spec/mangopay/transaction_spec.rb
|
|
@@ -267,6 +268,7 @@ test_files:
|
|
|
267
268
|
- spec/mangopay/report_v2_spec.rb
|
|
268
269
|
- spec/mangopay/report_wallets_spec.rb
|
|
269
270
|
- spec/mangopay/settlement_sample.csv
|
|
271
|
+
- spec/mangopay/settlement_sample_bad.csv
|
|
270
272
|
- spec/mangopay/settlement_spec.rb
|
|
271
273
|
- spec/mangopay/shared_resources.rb
|
|
272
274
|
- spec/mangopay/transaction_spec.rb
|