From 731f9f0ae2cc516030c6b0a14cb6661c0200857a Mon Sep 17 00:00:00 2001 From: Simon Oyaneder Date: Thu, 22 Oct 2026 16:20:05 -0300 Subject: [PATCH 1/6] feat(v2): add TransferBatch resource and TransferBatchesManager --- lib/fintoc/v2/client/client.rb | 5 + .../v2/managers/transfer_batches_manager.rb | 47 ++++++++ lib/fintoc/v2/resources/transfer_batch.rb | 108 +++++++++++++++++ .../managers/transfer_batches_manager_spec.rb | 114 ++++++++++++++++++ spec/lib/fintoc/v2/transfer_batch_spec.rb | 105 ++++++++++++++++ 5 files changed, 379 insertions(+) create mode 100644 lib/fintoc/v2/managers/transfer_batches_manager.rb create mode 100644 lib/fintoc/v2/resources/transfer_batch.rb create mode 100644 spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb create mode 100644 spec/lib/fintoc/v2/transfer_batch_spec.rb diff --git a/lib/fintoc/v2/client/client.rb b/lib/fintoc/v2/client/client.rb index 7e17cb8..11b9865 100644 --- a/lib/fintoc/v2/client/client.rb +++ b/lib/fintoc/v2/client/client.rb @@ -3,6 +3,7 @@ require 'fintoc/v2/managers/accounts_manager' require 'fintoc/v2/managers/account_numbers_manager' require 'fintoc/v2/managers/transfers_manager' +require 'fintoc/v2/managers/transfer_batches_manager' require 'fintoc/v2/managers/simulate_manager' require 'fintoc/v2/managers/account_verifications_manager' @@ -25,6 +26,10 @@ def transfers @transfers ||= Managers::TransfersManager.new(self) end + def transfer_batches + @transfer_batches ||= Managers::TransferBatchesManager.new(self) + end + def simulate @simulate ||= Managers::SimulateManager.new(self) end diff --git a/lib/fintoc/v2/managers/transfer_batches_manager.rb b/lib/fintoc/v2/managers/transfer_batches_manager.rb new file mode 100644 index 0000000..200639b --- /dev/null +++ b/lib/fintoc/v2/managers/transfer_batches_manager.rb @@ -0,0 +1,47 @@ +require 'fintoc/v2/resources/transfer_batch' + +module Fintoc + module V2 + module Managers + class TransferBatchesManager + def initialize(client) + @client = client + end + + def create(description:, currency:, transfers:, idempotency_key: nil) + data = _create_transfer_batch(description:, currency:, transfers:, idempotency_key:) + build_transfer_batch(data) + end + + def get(transfer_batch_id) + data = _get_transfer_batch(transfer_batch_id) + build_transfer_batch(data) + end + + def list(**params) + _list_transfer_batches(**params).map { |data| build_transfer_batch(data) } + end + + private + + def _create_transfer_batch(description:, currency:, transfers:, idempotency_key: nil) + @client + .post(version: :v2, use_jws: true, idempotency_key:) + .call('transfer_batches', description:, currency:, transfers:) + end + + def _get_transfer_batch(transfer_batch_id) + @client.get(version: :v2).call("transfer_batches/#{transfer_batch_id}") + end + + def _list_transfer_batches(**params) + @client.get(version: :v2).call('transfer_batches', **params) + end + + def build_transfer_batch(data) + Fintoc::V2::TransferBatch.new(**data, client: @client) + end + end + end + end +end diff --git a/lib/fintoc/v2/resources/transfer_batch.rb b/lib/fintoc/v2/resources/transfer_batch.rb new file mode 100644 index 0000000..d21f6c7 --- /dev/null +++ b/lib/fintoc/v2/resources/transfer_batch.rb @@ -0,0 +1,108 @@ +require 'money' + +module Fintoc + module V2 + class TransferBatch + attr_reader :id, :object, :mode, :description, :status, :currency, :transfer_count, + :transfer_amount, :succeeded_count, :succeeded_amount, :created_at, + :authorized_at, :rejected_at, :expired_at + + def initialize( + id:, + object:, + mode:, + status:, + currency:, + transfer_count:, + transfer_amount:, + description: nil, + succeeded_count: nil, + succeeded_amount: nil, + created_at: nil, + authorized_at: nil, + rejected_at: nil, + expired_at: nil, + client: nil, + ** + ) + @id = id + @object = object + @mode = mode + @description = description + @status = status + @currency = currency + @transfer_count = transfer_count + @transfer_amount = transfer_amount + @succeeded_count = succeeded_count + @succeeded_amount = succeeded_amount + @created_at = created_at + @authorized_at = authorized_at + @rejected_at = rejected_at + @expired_at = expired_at + @client = client + end + + def to_s + amount_str = Money.from_cents(@transfer_amount, @currency).format + "📦 #{amount_str} (#{@id}) - #{@status}" + end + + def refresh + fresh_transfer_batch = @client.transfer_batches.get(@id) + refresh_from_transfer_batch(fresh_transfer_batch) + end + + def pending_authorization? + @status == 'pending_authorization' + end + + def in_progress? + @status == 'in_progress' + end + + def rejected? + @status == 'rejected' + end + + def expired? + @status == 'expired' + end + + def succeeded? + @status == 'succeeded' + end + + def partially_succeeded? + @status == 'partially_succeeded' + end + + def failed? + @status == 'failed' + end + + private + + def refresh_from_transfer_batch(transfer_batch) # rubocop:disable Metrics/MethodLength + unless transfer_batch.id == @id + raise ArgumentError, 'Transfer batch must be the same instance' + end + + @object = transfer_batch.object + @mode = transfer_batch.mode + @description = transfer_batch.description + @status = transfer_batch.status + @currency = transfer_batch.currency + @transfer_count = transfer_batch.transfer_count + @transfer_amount = transfer_batch.transfer_amount + @succeeded_count = transfer_batch.succeeded_count + @succeeded_amount = transfer_batch.succeeded_amount + @created_at = transfer_batch.created_at + @authorized_at = transfer_batch.authorized_at + @rejected_at = transfer_batch.rejected_at + @expired_at = transfer_batch.expired_at + + self + end + end + end +end diff --git a/spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb b/spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb new file mode 100644 index 0000000..acbf563 --- /dev/null +++ b/spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb @@ -0,0 +1,114 @@ +require 'fintoc/v2/managers/transfer_batches_manager' + +RSpec.describe Fintoc::V2::Managers::TransferBatchesManager do + let(:client) { instance_double(Fintoc::BaseClient) } + let(:get_proc) { instance_double(Proc) } + let(:post_proc) { instance_double(Proc) } + let(:manager) { described_class.new(client) } + let(:transfers) do + [ + { + account_id: 'acc_123', + amount: 10000, + counterparty: { account_number: '735969000000203297' }, + reference_id: '123456' + } + ] + end + let(:transfer_batch_id) { 'trbatch_123' } + let(:first_transfer_batch_data) do + { + id: transfer_batch_id, + object: 'transfer_batch', + mode: 'test', + description: 'Pago proveedores', + status: 'pending_authorization', + currency: 'MXN', + transfer_count: 1, + transfer_amount: 10000 + } + end + let(:second_transfer_batch_data) do + { + id: 'trbatch_456', + object: 'transfer_batch', + mode: 'test', + description: 'Pago sueldos', + status: 'succeeded', + currency: 'MXN', + transfer_count: 2, + transfer_amount: 50000 + } + end + + before do + allow(client).to receive(:get).with(version: :v2).and_return(get_proc) + allow(client).to receive(:post).and_return(post_proc) + + allow(get_proc) + .to receive(:call) + .with("transfer_batches/#{transfer_batch_id}") + .and_return(first_transfer_batch_data) + allow(get_proc) + .to receive(:call) + .with('transfer_batches') + .and_return([first_transfer_batch_data, second_transfer_batch_data]) + allow(post_proc) + .to receive(:call) + .with('transfer_batches', description: 'Pago proveedores', currency: 'MXN', transfers:) + .and_return(first_transfer_batch_data) + + allow(Fintoc::V2::TransferBatch).to receive(:new) + end + + describe '#create' do + it 'calls build_transfer_batch with the response' do + manager.create(description: 'Pago proveedores', currency: 'MXN', transfers:) + expect(Fintoc::V2::TransferBatch) + .to have_received(:new).with(**first_transfer_batch_data, client:) + end + + it 'signs the POST with JWS' do + manager.create(description: 'Pago proveedores', currency: 'MXN', transfers:) + expect(client) + .to have_received(:post).with(version: :v2, use_jws: true, idempotency_key: nil) + end + + context 'when idempotency_key is provided' do + let(:idempotency_key) { '123e4567-e89b-12d3-a456-426614174000' } + + before do + allow(client) + .to receive(:post) + .with(version: :v2, use_jws: true, idempotency_key:) + .and_return(post_proc) + end + + it 'passes idempotency_key to the POST method' do + manager.create( + description: 'Pago proveedores', currency: 'MXN', transfers:, idempotency_key: + ) + + expect(client).to have_received(:post).with(version: :v2, use_jws: true, idempotency_key:) + end + end + end + + describe '#get' do + it 'calls build_transfer_batch with the response' do + manager.get('trbatch_123') + expect(Fintoc::V2::TransferBatch) + .to have_received(:new).with(**first_transfer_batch_data, client:) + end + end + + describe '#list' do + it 'calls build_transfer_batch for each response item' do + manager.list + expect(Fintoc::V2::TransferBatch) + .to have_received(:new).with(**first_transfer_batch_data, client:) + expect(Fintoc::V2::TransferBatch) + .to have_received(:new).with(**second_transfer_batch_data, client:) + end + end +end diff --git a/spec/lib/fintoc/v2/transfer_batch_spec.rb b/spec/lib/fintoc/v2/transfer_batch_spec.rb new file mode 100644 index 0000000..21cc59f --- /dev/null +++ b/spec/lib/fintoc/v2/transfer_batch_spec.rb @@ -0,0 +1,105 @@ +require 'fintoc/v2/resources/transfer_batch' + +RSpec.describe Fintoc::V2::TransferBatch do + let(:api_key) { 'sk_test_SeCreT-aPi_KeY' } + let(:client) { Fintoc::V2::Client.new(api_key) } + + let(:data) do + { + id: 'trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd', + object: 'transfer_batch', + mode: 'test', + description: 'Pago proveedores', + status: 'in_progress', + currency: 'MXN', + transfer_count: 2, + transfer_amount: 100000, + succeeded_count: 0, + succeeded_amount: 0, + created_at: '2026-10-22T13:51:03Z', + authorized_at: '2026-10-22T13:55:12Z', + rejected_at: nil, + expired_at: nil, + client: client + } + end + + let(:transfer_batch) { described_class.new(**data) } + + describe '#new' do + it 'creates an instance of TransferBatch' do + expect(transfer_batch).to be_an_instance_of(described_class) + end + + it 'sets all attributes correctly' do # rubocop:disable RSpec/ExampleLength + expect(transfer_batch).to have_attributes( + id: 'trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd', + object: 'transfer_batch', + mode: 'test', + description: 'Pago proveedores', + status: 'in_progress', + currency: 'MXN', + transfer_count: 2, + transfer_amount: 100000, + succeeded_count: 0, + succeeded_amount: 0, + created_at: '2026-10-22T13:51:03Z', + authorized_at: '2026-10-22T13:55:12Z', + rejected_at: nil, + expired_at: nil + ) + end + end + + describe '#to_s' do + it 'returns a string representation' do + expect(transfer_batch.to_s) + .to eq('📦 $1,000.00 (trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd) - in_progress') + end + end + + describe 'status predicates' do + statuses = %w[ + pending_authorization in_progress rejected expired succeeded partially_succeeded failed + ] + + statuses.each do |status| + context "when status is #{status}" do + before { data[:status] = status } + + it "returns true only for #{status}?" do + expect(statuses.select { |predicate| transfer_batch.public_send(:"#{predicate}?") }) + .to eq([status]) + end + end + end + end + + describe '#refresh' do + let(:refreshed_transfer_batch) { described_class.new(**data, status: 'succeeded') } + + before do + allow(client.transfer_batches) + .to receive(:get).with(data[:id]).and_return(refreshed_transfer_batch) + end + + it 'refreshes the transfer batch data' do + expect { transfer_batch.refresh } + .to change { transfer_batch.status }.from('in_progress').to('succeeded') + end + + it 'returns self' do + expect(transfer_batch.refresh).to eq(transfer_batch) + end + + it 'raises an error if the transfer batch ID does not match' do + wrong_transfer_batch = described_class.new(**data, id: 'wrong_id') + + allow(client.transfer_batches) + .to receive(:get).with(data[:id]).and_return(wrong_transfer_batch) + + expect { transfer_batch.refresh } + .to raise_error(ArgumentError, 'Transfer batch must be the same instance') + end + end +end From 3cc2e0c56a34ee051c666b265d96d22c38d2832b Mon Sep 17 00:00:00 2001 From: Simon Oyaneder Date: Thu, 22 Oct 2026 16:20:10 -0300 Subject: [PATCH 2/6] feat(errors): add transfer batch error classes --- lib/fintoc/errors.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/fintoc/errors.rb b/lib/fintoc/errors.rb index 9470109..e6987c1 100644 --- a/lib/fintoc/errors.rb +++ b/lib/fintoc/errors.rb @@ -66,6 +66,9 @@ class InvalidExpiresAtError < FintocError; end class InvalidInstallmentsCurrencyError < FintocError; end class InvalidClabeError < FintocError; end class MismatchTransferAccountCurrencyError < FintocError; end + class InvalidTransfersError < FintocError; end + class InvalidTransfersSizeError < FintocError; end + class InvalidDescriptionSizeError < FintocError; end # 401 Unauthorized Errors class AuthenticationError < FintocError; end @@ -124,6 +127,7 @@ class InvalidTransferStatusError < FintocError; end class InvalidTransferDirectionError < FintocError; end class AccountNumberLimitReachedError < FintocError; end class AccountCannotBeBlockedError < FintocError; end + class InvalidSenderAccountsError < FintocError; end # 422 Unprocessable Entity Errors class InvalidOtpCodeError < FintocError; end @@ -150,6 +154,9 @@ class InternalServerError < FintocError; end class UnrecognizedRequestError < FintocError; end class CoreResponseError < FintocError; end + # 501 Not Implemented Errors + class OperationNotImplementedError < FintocError; end + # Webhook Errors class WebhookSignatureError < FintocError; end From b6b5bdc4aa5842c14108032145139ff75b9a1046 Mon Sep 17 00:00:00 2001 From: Simon Oyaneder Date: Thu, 22 Oct 2026 16:20:14 -0300 Subject: [PATCH 3/6] test(v2): cover transfer_batches in v2 client --- spec/lib/fintoc/v2/client_spec.rb | 2 + .../transfer_batches_client_examples.rb | 132 ++++++++++++++++++ .../returns_a_TransferBatch_instance.yml | 79 +++++++++++ .../returns_a_TransferBatch_instance.yml | 81 +++++++++++ .../_get/returns_a_TransferBatch_instance.yml | 74 ++++++++++ .../_list/accepts_filtering_parameters.yml | 77 ++++++++++ ...ns_an_array_of_TransferBatch_instances.yml | 77 ++++++++++ 7 files changed, 522 insertions(+) create mode 100644 spec/support/shared_examples/clients/transfer_batches_client_examples.rb create mode 100644 spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml create mode 100644 spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml create mode 100644 spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml create mode 100644 spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml create mode 100644 spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml diff --git a/spec/lib/fintoc/v2/client_spec.rb b/spec/lib/fintoc/v2/client_spec.rb index 7c53eb1..78e4362 100644 --- a/spec/lib/fintoc/v2/client_spec.rb +++ b/spec/lib/fintoc/v2/client_spec.rb @@ -27,6 +27,8 @@ it_behaves_like 'a client with transfers manager' + it_behaves_like 'a client with transfer batches manager' + it_behaves_like 'a client with simulate manager' it_behaves_like 'a client with account verifications manager' diff --git a/spec/support/shared_examples/clients/transfer_batches_client_examples.rb b/spec/support/shared_examples/clients/transfer_batches_client_examples.rb new file mode 100644 index 0000000..b7a2246 --- /dev/null +++ b/spec/support/shared_examples/clients/transfer_batches_client_examples.rb @@ -0,0 +1,132 @@ +require 'openssl' + +RSpec.shared_examples 'a client with transfer batches manager' do + let(:jws_private_key) do + key_string = "-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDNLwwQr/uFToDH +8x1GHlW5gRsngNp8J+sg8vZc5jX+dISZh42CNM2eMSyPOMLSZL08xIA9ISoxjCJb +rpJ7MY9OKOZdrFheclz8e3z/hVcXpmgT0JARYIyKUb2sgoh1JsH3aSQILTc4KuDM +dm0+WIWl9tOqKXm23j9RcYL+WOUCcLYNj3xga39CnXdqT3dy2fMIOJ+vZxfSxPhG +EBTyV6v9jrMbRukhxllTqDc64WkVdt0MOvzFzcSNkGcvHRdrK1w+x5IhfsYGtv+9 +mz+fvmI88qGsb0x8peGVDgWfQjykxrB/8umpQKANn9bqjyay+ogRRwv05dmaB/gm +IycvGXE7AgMBAAECggEAI4gTKcyf3MzkZjvGhP75z175KdUZgMiU4ibQ3POMxBy/ +XaroqXSlatCPK9ojerWxQ5Wvs2ZL3TqsNH49pZHGhD127x/KSci6K4ri8YjQtSq+ ++Tdzy16R194h337XTJpCmqqdb8EMv/BE74NOla5UrpHYw63dAvrnsh3bFlqkhdBZ +E5OBfdLyxGy5FYdewV803a8XGfnDfT7RrsdWhPib8E3i+wix+/dv10AX/+Y6VPpG +2EPXRV63UtmO2EVXyIGT5kSAnzZBJPIB3EYTlm1A86PxQGVD4X8LAUXIj6VRVC8h +B1KXb5YZ9W1vYmKyWUZPyMQHMpUTNGEuU/EtN0aOCQKBgQD+zMd1+3BhoSwBusXb +EK2SBJwn9TfqdUghsFHNz0xjvpAFKpO55qA7XyilZwZeJsOzPQZ33ERCRk18crCd +Q6oWI15xKjPl+Dfxf4UYjokx/iQCCHu8lJ6TXcEwXniIs6CVsUq9QV+s6JBlb3C4 +qD/wwp7VrmbcMLfIUs3nb3tqHQKBgQDOJnGylmqC/l4BCZj9BhLiVg7nioY24lG1 +9DY0/nnnbuMtDQ+8VUKtt93Or8giejOVqj3BZ8/TflkwCQAt9cIvFG50aTVZBo2E +4uPJLGSBLrQqpuUNPR2O239o4RqGgDICkh9TRH9D9GsekLRCgefLRubUyuZZ4pI9 +j1ty2kMpNwKBgGtYJmgEKBJZbkrEPvrNifJMUuVan9X81wiqWaxVOx+CdvZWO6pE +CRk6O8uDHeGofyYR/ZmdiHxLVfWp89ItYYi2GeGfIAIwkpEBYjc4RYB0SwM4Q7js +++mlw+/2vN0KoAqwiIY29nHIAJ1bV6fT6iwqMfRf5yG4vJR+nhR0mQ/ZAoGAfgLJ +5RxEpyXNWF0Bg0i/KlLocWgfelUFFW/d4q7a3TjO7K7bO4fyZjXKA5k3gLup5IZX +kW1fgCvvYIlf7rgWpqiai9XzoiN7RgtaqZHVLZHa12eFA36kHrrVOsq+aBDcgO3I +8CEimetBv0E8rpqxkXQZjWEpRTBVrAOBJsd73ikCgYAwf4fnpTcEa4g6ejmbjkXw +yacTlKFuxyLZHZ5R7D0+Fj19gwm9EzvrRIEcX84ebiJ8P1bL3kycQmLV19zE5B3M +pcsQmZ28/Oa3xCPiy8CDyDuiDbbNfnR1Ot3IbgfFL7xPYySljJbMyl7vhKJIacWs +draAAQ5iJEb5BR8AmL6tAQ== +-----END PRIVATE KEY-----" + OpenSSL::PKey::RSA.new(key_string) + end + let(:transfer_batch_id) { 'trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd' } + + let(:transfer_batch_data) do + { + description: 'Pago proveedores', + currency: 'MXN', + transfers: [ + { + account_id: 'acc_31yYL7h9LVPg121AgFtCyJPDsgM', + amount: 50000, + counterparty: { account_number: '735969000000203297' }, + comment: 'Test payment', + reference_id: '123456' + } + ] + } + end + + it 'responds to transfer batch-specific methods' do + expect(client).to respond_to(:transfer_batches) + expect(client.transfer_batches).to be_a(Fintoc::V2::Managers::TransferBatchesManager) + expect(client.transfer_batches) + .to respond_to(:create) + .and respond_to(:get) + .and respond_to(:list) + end + + describe '#transfer_batches' do + describe '#create' do + it 'returns a TransferBatch instance', :vcr do + transfer_batch = client.transfer_batches.create(**transfer_batch_data) + + expect(transfer_batch) + .to be_an_instance_of(Fintoc::V2::TransferBatch) + .and have_attributes( + description: 'Pago proveedores', + currency: 'MXN', + transfer_count: 1, + transfer_amount: 50000, + status: 'pending_authorization' + ) + end + + context 'with idempotency key' do + let(:idempotency_key) { 'test_transfer_batch_creation_123' } + + it 'returns a TransferBatch instance', :vcr do + transfer_batch = client.transfer_batches.create(**transfer_batch_data, idempotency_key:) + + expect(transfer_batch) + .to be_an_instance_of(Fintoc::V2::TransferBatch) + .and have_attributes( + description: 'Pago proveedores', + currency: 'MXN', + transfer_count: 1, + transfer_amount: 50000, + status: 'pending_authorization' + ) + end + end + end + + describe '#get' do + it 'returns a TransferBatch instance', :vcr do + transfer_batch = client.transfer_batches.get(transfer_batch_id) + + expect(transfer_batch) + .to be_an_instance_of(Fintoc::V2::TransferBatch) + .and have_attributes( + id: transfer_batch_id, + object: 'transfer_batch' + ) + end + end + + describe '#list' do + it 'returns an array of TransferBatch instances', :vcr do + transfer_batches = client.transfer_batches.list + + expect(transfer_batches) + .to all(be_a(Fintoc::V2::TransferBatch)) + .and have_attributes(size: 2) + end + + it 'accepts filtering parameters', :vcr do + transfer_batches = client.transfer_batches.list( + 'status[]': %w[succeeded partially_succeeded], + since: '2026-10-01T00:00:00Z', + until: '2026-10-31T23:59:59Z' + ) + + expect(transfer_batches).to all(be_a(Fintoc::V2::TransferBatch)) + expect(transfer_batches.map(&:status)) + .to contain_exactly('succeeded', 'partially_succeeded') + end + end + end +end diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml new file mode 100644 index 0000000..f957118 --- /dev/null +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml @@ -0,0 +1,79 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.fintoc.com/v2/transfer_batches + body: + encoding: UTF-8 + string: '{"description":"Pago proveedores","currency":"MXN","transfers":[{"account_id":"acc_31yYL7h9LVPg121AgFtCyJPDsgM","amount":50000,"counterparty":{"account_number":"735969000000203297"},"comment":"Test + payment","reference_id":"123456"}]}' + headers: + Authorization: + - Bearer sk_test_SeCreT-aPi_KeY + User-Agent: + - fintoc-ruby/1.4.0 + Fintoc-Jws-Signature: + - eyJhbGciOiJSUzI1NiIsIm5vbmNlIjoiYjM1ZDI5MjlmMWRiMDdkMzQ5N2MyNWUxYWUzMTNlYTciLCJ0cyI6MTc5MjY5NjQ0OSwiY3JpdCI6WyJ0cyIsIm5vbmNlIl19.snNz8_RzVrzBHy6h1A_LEpUZNjesXFZkaqa0POxtfcFbqPgdGvbdEk_J5s4yYeJBu9toGF3aEbBm2exd7aZfFtFNLiwxQ_hUGMgEZK1Z5ngVI8nDFiksRH-40ctC5CqEYfDN_UiRXS7OcFgZ0GSrE7_3h4AZmCo281MzvbxBA50zdsWodtC6nC-5BV8mzthcuaJYs90x2BC-uuwjA1Lk0E43enxHUn2WamGS5LQRg-1GnbqIcVh1v7O1yjx_jzRV9eSH4-tLnYh8H7igql0zTA7zhR3iRl5VK8b2fOw-BQaFf13cnDg9cS2mUjvoPJwgn4XOhXkV9mNKzNhDrks4-w + Connection: + - close + Content-Type: + - application/json; charset=utf-8 + Host: + - api.fintoc.com + response: + status: + code: 201 + message: Created + headers: + Date: + - Thu, 22 Oct 2026 19:14:10 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '345' + Connection: + - close + Cf-Ray: + - 978e36138f38b861-EZE + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + X-Download-Options: + - noopen + X-Permitted-Cross-Domain-Policies: + - none + Referrer-Policy: + - strict-origin-when-cross-origin + Etag: + - W/"3bcd22908f94497674e96ead614e8a01" + Cache-Control: + - max-age=0, private, must-revalidate + X-Request-Id: + - 7f91b9f0-fd13-4d51-8b88-16f0122f5ea3 + X-Runtime: + - '0.293159' + Vary: + - Origin + Via: + - 1.1 google + Cf-Cache-Status: + - DYNAMIC + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=Iv7AS7YO%2FSvC6uTUZgyWC2%2BaUfgdXl7xakqe1BSg2PGNCHtalgXnlviJpWj1wQJK3dsFWG9U6L0AuPx2E0tMdXKTtuVH8gXuCvBOmscmnic9ljwLzFlpxqN0l1IZeAL4"}],"group":"cf-nel","max_age":604800}' + Nel: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Strict-Transport-Security: + - max-age=15552000; includeSubDomains; preload + Server: + - cloudflare + Server-Timing: + - cfL4;desc="?proto=TCP&rtt=30125&min_rtt=30083&rtt_var=11366&sent=7&recv=8&lost=0&retrans=0&sent_bytes=3879&recv_bytes=2641&delivery_rate=140016&cwnd=252&unsent_bytes=0&cid=b848458890c32a83&ts=558&x=0" + body: + encoding: UTF-8 + string: '{"object":"transfer_batch","id":"trbatch_3AhQ8iLzUuJ9n6YbX1xH4CfQwTe","mode":"test","description":"Pago + proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"transfer_amount":50000,"succeeded_count":0,"succeeded_amount":0,"created_at":"2026-10-22T19:14:09Z","authorized_at":null,"rejected_at":null,"expired_at":null}' + recorded_at: Thu, 22 Oct 2026 19:14:09 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml new file mode 100644 index 0000000..3c0be1b --- /dev/null +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml @@ -0,0 +1,81 @@ +--- +http_interactions: +- request: + method: post + uri: https://api.fintoc.com/v2/transfer_batches + body: + encoding: UTF-8 + string: '{"description":"Pago proveedores","currency":"MXN","transfers":[{"account_id":"acc_31yYL7h9LVPg121AgFtCyJPDsgM","amount":50000,"counterparty":{"account_number":"735969000000203297"},"comment":"Test + payment","reference_id":"123456"}]}' + headers: + Authorization: + - Bearer sk_test_SeCreT-aPi_KeY + User-Agent: + - fintoc-ruby/1.4.0 + Fintoc-Jws-Signature: + - eyJhbGciOiJSUzI1NiIsIm5vbmNlIjoiMDcyNThiZjFmY2Y4NzY5NGI1NjlmMTM1YWMyNzhlNzAiLCJ0cyI6MTc5MjY5NjQ0OSwiY3JpdCI6WyJ0cyIsIm5vbmNlIl19.MK0EY8071lz2vseAblYkR_E88k-T9Q8CQZWzsePqal3XAkvXBaDYz6tSFfWrhuMwC7gomF-c4HpkoHwwt1RSeBHfMfillVWmVHXZ4PWoN331Ads0ucaw9D75CdCBNLB964i_cRRjdcqC2Q9a4Gi9RKmbjrWSZP1vQ3bwoEKxIxZ0Lx8hT2W3Leye7pWnhhbSx0u5VLiSs2EQwt-R_7Le_zM1pkHQqBA-ktC1g709pAOKjuQeSjdLGC5Vat3dATQcDctBnCM0ZMl_aYgi3Q7qRLazbWbuDE8k-lmgvLnt90Xk3XhpAOeLV2ehzMlkOi2BZ4P-0smeK7xtoOD3-1KGng + Idempotency-Key: + - test_transfer_batch_creation_123 + Connection: + - close + Content-Type: + - application/json; charset=utf-8 + Host: + - api.fintoc.com + response: + status: + code: 201 + message: Created + headers: + Date: + - Thu, 22 Oct 2026 19:14:10 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '345' + Connection: + - close + Cf-Ray: + - 97f898bf3eca1fe4-EZE + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + X-Download-Options: + - noopen + X-Permitted-Cross-Domain-Policies: + - none + Referrer-Policy: + - strict-origin-when-cross-origin + Etag: + - W/"a751b58856b241a654dc45766e2d1948" + Cache-Control: + - max-age=0, private, must-revalidate + X-Request-Id: + - 03c4f1f1-68ac-457f-8f3e-f4c75ccd8e36 + X-Runtime: + - '0.835700' + Vary: + - Origin + Via: + - 1.1 google + Cf-Cache-Status: + - DYNAMIC + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=3WN9NQj%2FJ%2BlBOprWo5sd%2BPJ3k%2FYnlg3JtOou1hewfv2U4XD%2BGtV3DtzwRRFxFinURzf7ijnIMvsCvJ1SJxiUk9%2FXFb3ovUbThVfu498Jlvr%2BYts7%2BFLGuhhSU3C4X3vg"}],"group":"cf-nel","max_age":604800}' + Nel: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Strict-Transport-Security: + - max-age=15552000; includeSubDomains; preload + Server: + - cloudflare + Server-Timing: + - cfL4;desc="?proto=TCP&rtt=47099&min_rtt=32430&rtt_var=22639&sent=7&recv=8&lost=0&retrans=0&sent_bytes=3879&recv_bytes=2686&delivery_rate=131359&cwnd=252&unsent_bytes=0&cid=e26ee8c1ed576517&ts=1104&x=0" + body: + encoding: UTF-8 + string: '{"object":"transfer_batch","id":"trbatch_3AhQ9ZpVmk2xR0tWbE7sJd5YqLc","mode":"test","description":"Pago + proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"transfer_amount":50000,"succeeded_count":0,"succeeded_amount":0,"created_at":"2026-10-22T19:14:10Z","authorized_at":null,"rejected_at":null,"expired_at":null}' + recorded_at: Thu, 22 Oct 2026 19:14:10 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml new file mode 100644 index 0000000..a6d0883 --- /dev/null +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml @@ -0,0 +1,74 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.fintoc.com/v2/transfer_batches/trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd + body: + encoding: ASCII-8BIT + string: '' + headers: + Authorization: + - Bearer sk_test_SeCreT-aPi_KeY + User-Agent: + - fintoc-ruby/1.4.0 + Connection: + - close + Host: + - api.fintoc.com + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 22 Oct 2026 19:14:11 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '357' + Connection: + - close + Cf-Ray: + - 978e379f2c927842-EZE + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + X-Download-Options: + - noopen + X-Permitted-Cross-Domain-Policies: + - none + Referrer-Policy: + - strict-origin-when-cross-origin + Etag: + - W/"37bbc649f214cfce2f8d9aba6caecf21" + Cache-Control: + - max-age=0, private, must-revalidate + X-Request-Id: + - 5191d7ac-26b2-4188-b180-f6dfe901f339 + X-Runtime: + - '0.059927' + Vary: + - Origin + Via: + - 1.1 google + Cf-Cache-Status: + - DYNAMIC + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=FAx0QL7Eef4ZkT1QR%2BkB0cgqRpZSc8mZ1kyh6SsnZcqbg6fJZ8bi7euv7xDBrfgrqPI1HfMqlYq9EgszMsvIeR37MiKYP%2FXsLOzy6%2FyMrq3a9QkVFFsPv2s7H5extDUw"}],"group":"cf-nel","max_age":604800}' + Nel: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Strict-Transport-Security: + - max-age=15552000; includeSubDomains; preload + Server: + - cloudflare + Server-Timing: + - cfL4;desc="?proto=TCP&rtt=32899&min_rtt=32105&rtt_var=12607&sent=7&recv=8&lost=0&retrans=0&sent_bytes=3879&recv_bytes=1823&delivery_rate=132689&cwnd=253&unsent_bytes=0&cid=a29d81c8d5b56467&ts=316&x=0" + body: + encoding: UTF-8 + string: '{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"transfer_amount":100000,"succeeded_count":2,"succeeded_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null}' + recorded_at: Thu, 22 Oct 2026 19:14:11 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml new file mode 100644 index 0000000..28fca0c --- /dev/null +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml @@ -0,0 +1,77 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.fintoc.com/v2/transfer_batches?since=2026-10-01T00:00:00Z&status%5B%5D=partially_succeeded&status%5B%5D=succeeded&until=2026-10-31T23:59:59Z + body: + encoding: ASCII-8BIT + string: '' + headers: + Authorization: + - Bearer sk_test_SeCreT-aPi_KeY + User-Agent: + - fintoc-ruby/1.4.0 + Connection: + - close + Host: + - api.fintoc.com + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 22 Oct 2026 19:14:12 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '721' + Connection: + - close + Cf-Ray: + - 978e3a451c00a4fc-GRU + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + X-Download-Options: + - noopen + X-Permitted-Cross-Domain-Policies: + - none + Referrer-Policy: + - strict-origin-when-cross-origin + Link: + - '' + Etag: + - W/"8cd7042fdca7259ed4ef7a4518bdf6ee" + Cache-Control: + - max-age=0, private, must-revalidate + X-Request-Id: + - 75d3c249-fa90-487a-ab18-e9971eddcd4c + X-Runtime: + - '0.064205' + Vary: + - Origin + Via: + - 1.1 google + Cf-Cache-Status: + - DYNAMIC + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=%2B1u%2FnTIHzyJohdVDT2cSiuJNrBQxE3acdGpl7gOBsai8IUWqJ%2B2ZgXyEbbEy37QiN9OMvKCM6%2BkDEF7sdBZNcaWXlGzUcgefErVT0PqggHoMOb7D1jlrzGh5iYP5wl3F"}],"group":"cf-nel","max_age":604800}' + Nel: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Strict-Transport-Security: + - max-age=15552000; includeSubDomains; preload + Server: + - cloudflare + Server-Timing: + - cfL4;desc="?proto=TCP&rtt=59799&min_rtt=59513&rtt_var=22521&sent=7&recv=8&lost=0&retrans=0&sent_bytes=3879&recv_bytes=1828&delivery_rate=71580&cwnd=45&unsent_bytes=0&cid=e3345cf16d5e8803&ts=392&x=0" + body: + encoding: UTF-8 + string: '[{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"transfer_amount":100000,"succeeded_count":2,"succeeded_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago + sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"transfer_amount":80000,"succeeded_count":1,"succeeded_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' + recorded_at: Thu, 22 Oct 2026 19:14:12 GMT +recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml new file mode 100644 index 0000000..c93bf80 --- /dev/null +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml @@ -0,0 +1,77 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.fintoc.com/v2/transfer_batches + body: + encoding: ASCII-8BIT + string: '' + headers: + Authorization: + - Bearer sk_test_SeCreT-aPi_KeY + User-Agent: + - fintoc-ruby/1.4.0 + Connection: + - close + Host: + - api.fintoc.com + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 22 Oct 2026 19:14:11 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '721' + Connection: + - close + Cf-Ray: + - 978e36a3cd4e0ba0-EZE + X-Frame-Options: + - SAMEORIGIN + X-Xss-Protection: + - 1; mode=block + X-Content-Type-Options: + - nosniff + X-Download-Options: + - noopen + X-Permitted-Cross-Domain-Policies: + - none + Referrer-Policy: + - strict-origin-when-cross-origin + Link: + - '' + Etag: + - W/"c44d2930120083fb1fcfe202e1d2c7c5" + Cache-Control: + - max-age=0, private, must-revalidate + X-Request-Id: + - a6572b4c-f53d-4934-aa11-5453c24e695c + X-Runtime: + - '0.123093' + Vary: + - Origin + Via: + - 1.1 google + Cf-Cache-Status: + - DYNAMIC + Report-To: + - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=dGWez9dCHhHPY3gIOowmzhSbR5PjvTHLFLD2kGv8rpM2Aopvl00MqFrSvjwLfv0b8SN7sBFSRqHfTLsqRSAr0RyMm2v3L1WRrkg3IJHXnMcfpFPH9msZJiFM8Ch1a3pC"}],"group":"cf-nel","max_age":604800}' + Nel: + - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}' + Strict-Transport-Security: + - max-age=15552000; includeSubDomains; preload + Server: + - cloudflare + Server-Timing: + - cfL4;desc="?proto=TCP&rtt=31982&min_rtt=31972&rtt_var=12010&sent=7&recv=8&lost=0&retrans=0&sent_bytes=3879&recv_bytes=1792&delivery_rate=132896&cwnd=253&unsent_bytes=0&cid=cc7a1dbdbfbf7d50&ts=384&x=0" + body: + encoding: UTF-8 + string: '[{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"transfer_amount":100000,"succeeded_count":2,"succeeded_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago + sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"transfer_amount":80000,"succeeded_count":1,"succeeded_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' + recorded_at: Thu, 22 Oct 2026 19:14:11 GMT +recorded_with: VCR 6.3.1 From a58519cffd4823e064d0f1ce5abf68c7d343a472 Mon Sep 17 00:00:00 2001 From: Simon Oyaneder Date: Thu, 22 Oct 2026 16:20:15 -0300 Subject: [PATCH 4/6] docs(v2): document transfer batches in README --- README.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/README.md b/README.md index dff39cb..f2d308b 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Do yourself a favor: go grab some ice cubes by installing this refreshing librar - [Accounts](#accounts) - [Account Numbers](#account-numbers) - [Transfers](#transfers) + - [Transfer Batches](#transfer-batches) - [Simulate](#simulate) - [Account Verifications](#account-verifications) - [Entity onboardings API Examples](#entity-onboardings-api-examples) @@ -139,6 +140,15 @@ transfer = client.v2.transfers.create( ) client.v2.transfers.return('transfer_id') +# Transfer Batches +transfer_batches = client.v2.transfer_batches.list +transfer_batch = client.v2.transfer_batches.get('transfer_batch_id') +transfer_batch = client.v2.transfer_batches.create( + description: 'Supplier payments', + currency: 'MXN', + transfers: [{...}] +) + # Simulate simulated_transfer = client.v2.simulate.receive_transfer( account_number_id: 'account_number_id', @@ -360,6 +370,42 @@ transfers = client.v2.transfers.list returned_transfer = client.v2.transfers.return('transfer_id') ``` +#### Transfer Batches + +```ruby +require 'fintoc' + +client = Fintoc::Client.new('api_key', jws_private_key: 'jws_private_key') + +# Create a transfer batch. Each transfer has the same shape as `transfers.create`, without `currency` +transfer_batch = client.v2.transfer_batches.create( + description: 'Supplier payments', + currency: 'MXN', + transfers: [ + { + account_id: 'account_id', + amount: 10000, + comment: 'Invoice 1234', + reference_id: '123456', + counterparty: { account_number: '735969000000203297' } + } + ] +) + +# Get a specific transfer batch +transfer_batch = client.v2.transfer_batches.get('transfer_batch_id') + +# List transfer batches, optionally filtered by status and creation date +transfer_batches = client.v2.transfer_batches.list( + 'status[]': %w[succeeded partially_succeeded], + since: '2026-10-01T00:00:00Z', + until: '2026-10-31T23:59:59Z' +) + +# List the transfers of a batch +transfers = client.v2.transfers.list(transfer_batch_id: 'transfer_batch_id') +``` + #### Simulate ```ruby From 4ae761a4be08f8d61c1576c2915e809eb3061bc7 Mon Sep 17 00:00:00 2001 From: Simon Oyaneder Date: Fri, 23 Oct 2026 18:35:14 -0300 Subject: [PATCH 5/6] refactor(v2): rename transfer batch amounts to amount and settled_amount --- lib/fintoc/v2/resources/transfer_batch.rb | 16 ++++++++-------- .../v2/managers/transfer_batches_manager_spec.rb | 4 ++-- spec/lib/fintoc/v2/transfer_batch_spec.rb | 8 ++++---- .../clients/transfer_batches_client_examples.rb | 4 ++-- .../_create/returns_a_TransferBatch_instance.yml | 2 +- .../returns_a_TransferBatch_instance.yml | 2 +- .../_get/returns_a_TransferBatch_instance.yml | 2 +- .../_list/accepts_filtering_parameters.yml | 4 ++-- ...turns_an_array_of_TransferBatch_instances.yml | 4 ++-- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/fintoc/v2/resources/transfer_batch.rb b/lib/fintoc/v2/resources/transfer_batch.rb index d21f6c7..82b29c2 100644 --- a/lib/fintoc/v2/resources/transfer_batch.rb +++ b/lib/fintoc/v2/resources/transfer_batch.rb @@ -4,7 +4,7 @@ module Fintoc module V2 class TransferBatch attr_reader :id, :object, :mode, :description, :status, :currency, :transfer_count, - :transfer_amount, :succeeded_count, :succeeded_amount, :created_at, + :amount, :succeeded_count, :settled_amount, :created_at, :authorized_at, :rejected_at, :expired_at def initialize( @@ -14,10 +14,10 @@ def initialize( status:, currency:, transfer_count:, - transfer_amount:, + amount:, description: nil, succeeded_count: nil, - succeeded_amount: nil, + settled_amount: nil, created_at: nil, authorized_at: nil, rejected_at: nil, @@ -32,9 +32,9 @@ def initialize( @status = status @currency = currency @transfer_count = transfer_count - @transfer_amount = transfer_amount + @amount = amount @succeeded_count = succeeded_count - @succeeded_amount = succeeded_amount + @settled_amount = settled_amount @created_at = created_at @authorized_at = authorized_at @rejected_at = rejected_at @@ -43,7 +43,7 @@ def initialize( end def to_s - amount_str = Money.from_cents(@transfer_amount, @currency).format + amount_str = Money.from_cents(@amount, @currency).format "📦 #{amount_str} (#{@id}) - #{@status}" end @@ -93,9 +93,9 @@ def refresh_from_transfer_batch(transfer_batch) # rubocop:disable Metrics/Method @status = transfer_batch.status @currency = transfer_batch.currency @transfer_count = transfer_batch.transfer_count - @transfer_amount = transfer_batch.transfer_amount + @amount = transfer_batch.amount @succeeded_count = transfer_batch.succeeded_count - @succeeded_amount = transfer_batch.succeeded_amount + @settled_amount = transfer_batch.settled_amount @created_at = transfer_batch.created_at @authorized_at = transfer_batch.authorized_at @rejected_at = transfer_batch.rejected_at diff --git a/spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb b/spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb index acbf563..58204f3 100644 --- a/spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb +++ b/spec/lib/fintoc/v2/managers/transfer_batches_manager_spec.rb @@ -25,7 +25,7 @@ status: 'pending_authorization', currency: 'MXN', transfer_count: 1, - transfer_amount: 10000 + amount: 10000 } end let(:second_transfer_batch_data) do @@ -37,7 +37,7 @@ status: 'succeeded', currency: 'MXN', transfer_count: 2, - transfer_amount: 50000 + amount: 50000 } end diff --git a/spec/lib/fintoc/v2/transfer_batch_spec.rb b/spec/lib/fintoc/v2/transfer_batch_spec.rb index 21cc59f..e67f907 100644 --- a/spec/lib/fintoc/v2/transfer_batch_spec.rb +++ b/spec/lib/fintoc/v2/transfer_batch_spec.rb @@ -13,9 +13,9 @@ status: 'in_progress', currency: 'MXN', transfer_count: 2, - transfer_amount: 100000, + amount: 100000, succeeded_count: 0, - succeeded_amount: 0, + settled_amount: 0, created_at: '2026-10-22T13:51:03Z', authorized_at: '2026-10-22T13:55:12Z', rejected_at: nil, @@ -40,9 +40,9 @@ status: 'in_progress', currency: 'MXN', transfer_count: 2, - transfer_amount: 100000, + amount: 100000, succeeded_count: 0, - succeeded_amount: 0, + settled_amount: 0, created_at: '2026-10-22T13:51:03Z', authorized_at: '2026-10-22T13:55:12Z', rejected_at: nil, diff --git a/spec/support/shared_examples/clients/transfer_batches_client_examples.rb b/spec/support/shared_examples/clients/transfer_batches_client_examples.rb index b7a2246..1d47e31 100644 --- a/spec/support/shared_examples/clients/transfer_batches_client_examples.rb +++ b/spec/support/shared_examples/clients/transfer_batches_client_examples.rb @@ -70,7 +70,7 @@ description: 'Pago proveedores', currency: 'MXN', transfer_count: 1, - transfer_amount: 50000, + amount: 50000, status: 'pending_authorization' ) end @@ -87,7 +87,7 @@ description: 'Pago proveedores', currency: 'MXN', transfer_count: 1, - transfer_amount: 50000, + amount: 50000, status: 'pending_authorization' ) end diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml index f957118..db14c39 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml @@ -74,6 +74,6 @@ http_interactions: body: encoding: UTF-8 string: '{"object":"transfer_batch","id":"trbatch_3AhQ8iLzUuJ9n6YbX1xH4CfQwTe","mode":"test","description":"Pago - proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"transfer_amount":50000,"succeeded_count":0,"succeeded_amount":0,"created_at":"2026-10-22T19:14:09Z","authorized_at":null,"rejected_at":null,"expired_at":null}' + proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"amount":50000,"succeeded_count":0,"settled_amount":0,"created_at":"2026-10-22T19:14:09Z","authorized_at":null,"rejected_at":null,"expired_at":null}' recorded_at: Thu, 22 Oct 2026 19:14:09 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml index 3c0be1b..890b4b9 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml @@ -76,6 +76,6 @@ http_interactions: body: encoding: UTF-8 string: '{"object":"transfer_batch","id":"trbatch_3AhQ9ZpVmk2xR0tWbE7sJd5YqLc","mode":"test","description":"Pago - proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"transfer_amount":50000,"succeeded_count":0,"succeeded_amount":0,"created_at":"2026-10-22T19:14:10Z","authorized_at":null,"rejected_at":null,"expired_at":null}' + proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"amount":50000,"succeeded_count":0,"settled_amount":0,"created_at":"2026-10-22T19:14:10Z","authorized_at":null,"rejected_at":null,"expired_at":null}' recorded_at: Thu, 22 Oct 2026 19:14:10 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml index a6d0883..8dce293 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml @@ -69,6 +69,6 @@ http_interactions: body: encoding: UTF-8 string: '{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago - proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"transfer_amount":100000,"succeeded_count":2,"succeeded_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null}' + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null}' recorded_at: Thu, 22 Oct 2026 19:14:11 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml index 28fca0c..d4873bc 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml @@ -71,7 +71,7 @@ http_interactions: body: encoding: UTF-8 string: '[{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago - proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"transfer_amount":100000,"succeeded_count":2,"succeeded_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago - sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"transfer_amount":80000,"succeeded_count":1,"succeeded_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago + sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"amount":80000,"succeeded_count":1,"settled_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' recorded_at: Thu, 22 Oct 2026 19:14:12 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml index c93bf80..880290b 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml @@ -71,7 +71,7 @@ http_interactions: body: encoding: UTF-8 string: '[{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago - proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"transfer_amount":100000,"succeeded_count":2,"succeeded_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago - sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"transfer_amount":80000,"succeeded_count":1,"succeeded_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago + sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"amount":80000,"succeeded_count":1,"settled_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' recorded_at: Thu, 22 Oct 2026 19:14:11 GMT recorded_with: VCR 6.3.1 From 824d8bf93bb91430a369ccbf7f4ffef751d9c950 Mon Sep 17 00:00:00 2001 From: Simon Oyaneder Date: Fri, 23 Oct 2026 18:52:04 -0300 Subject: [PATCH 6/6] feat(v2): expose succeeded_at and partially_succeeded_at on transfer batches --- lib/fintoc/v2/resources/transfer_batch.rb | 12 +++++++++--- spec/lib/fintoc/v2/transfer_batch_spec.rb | 6 +++++- .../_create/returns_a_TransferBatch_instance.yml | 2 +- .../returns_a_TransferBatch_instance.yml | 2 +- .../_get/returns_a_TransferBatch_instance.yml | 2 +- .../_list/accepts_filtering_parameters.yml | 4 ++-- .../returns_an_array_of_TransferBatch_instances.yml | 4 ++-- 7 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/fintoc/v2/resources/transfer_batch.rb b/lib/fintoc/v2/resources/transfer_batch.rb index 82b29c2..adef75c 100644 --- a/lib/fintoc/v2/resources/transfer_batch.rb +++ b/lib/fintoc/v2/resources/transfer_batch.rb @@ -4,10 +4,10 @@ module Fintoc module V2 class TransferBatch attr_reader :id, :object, :mode, :description, :status, :currency, :transfer_count, - :amount, :succeeded_count, :settled_amount, :created_at, - :authorized_at, :rejected_at, :expired_at + :amount, :succeeded_count, :settled_amount, :created_at, :authorized_at, + :rejected_at, :expired_at, :succeeded_at, :partially_succeeded_at - def initialize( + def initialize( # rubocop:disable Metrics/MethodLength id:, object:, mode:, @@ -22,6 +22,8 @@ def initialize( authorized_at: nil, rejected_at: nil, expired_at: nil, + succeeded_at: nil, + partially_succeeded_at: nil, client: nil, ** ) @@ -39,6 +41,8 @@ def initialize( @authorized_at = authorized_at @rejected_at = rejected_at @expired_at = expired_at + @succeeded_at = succeeded_at + @partially_succeeded_at = partially_succeeded_at @client = client end @@ -100,6 +104,8 @@ def refresh_from_transfer_batch(transfer_batch) # rubocop:disable Metrics/Method @authorized_at = transfer_batch.authorized_at @rejected_at = transfer_batch.rejected_at @expired_at = transfer_batch.expired_at + @succeeded_at = transfer_batch.succeeded_at + @partially_succeeded_at = transfer_batch.partially_succeeded_at self end diff --git a/spec/lib/fintoc/v2/transfer_batch_spec.rb b/spec/lib/fintoc/v2/transfer_batch_spec.rb index e67f907..266c28e 100644 --- a/spec/lib/fintoc/v2/transfer_batch_spec.rb +++ b/spec/lib/fintoc/v2/transfer_batch_spec.rb @@ -20,6 +20,8 @@ authorized_at: '2026-10-22T13:55:12Z', rejected_at: nil, expired_at: nil, + succeeded_at: nil, + partially_succeeded_at: nil, client: client } end @@ -46,7 +48,9 @@ created_at: '2026-10-22T13:51:03Z', authorized_at: '2026-10-22T13:55:12Z', rejected_at: nil, - expired_at: nil + expired_at: nil, + succeeded_at: nil, + partially_succeeded_at: nil ) end end diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml index db14c39..c599954 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/returns_a_TransferBatch_instance.yml @@ -74,6 +74,6 @@ http_interactions: body: encoding: UTF-8 string: '{"object":"transfer_batch","id":"trbatch_3AhQ8iLzUuJ9n6YbX1xH4CfQwTe","mode":"test","description":"Pago - proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"amount":50000,"succeeded_count":0,"settled_amount":0,"created_at":"2026-10-22T19:14:09Z","authorized_at":null,"rejected_at":null,"expired_at":null}' + proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"amount":50000,"succeeded_count":0,"settled_amount":0,"created_at":"2026-10-22T19:14:09Z","authorized_at":null,"rejected_at":null,"expired_at":null,"succeeded_at":null,"partially_succeeded_at":null}' recorded_at: Thu, 22 Oct 2026 19:14:09 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml index 890b4b9..1ea0618 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_create/with_idempotency_key/returns_a_TransferBatch_instance.yml @@ -76,6 +76,6 @@ http_interactions: body: encoding: UTF-8 string: '{"object":"transfer_batch","id":"trbatch_3AhQ9ZpVmk2xR0tWbE7sJd5YqLc","mode":"test","description":"Pago - proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"amount":50000,"succeeded_count":0,"settled_amount":0,"created_at":"2026-10-22T19:14:10Z","authorized_at":null,"rejected_at":null,"expired_at":null}' + proveedores","status":"pending_authorization","currency":"MXN","transfer_count":1,"amount":50000,"succeeded_count":0,"settled_amount":0,"created_at":"2026-10-22T19:14:10Z","authorized_at":null,"rejected_at":null,"expired_at":null,"succeeded_at":null,"partially_succeeded_at":null}' recorded_at: Thu, 22 Oct 2026 19:14:10 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml index 8dce293..38e47e5 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_get/returns_a_TransferBatch_instance.yml @@ -69,6 +69,6 @@ http_interactions: body: encoding: UTF-8 string: '{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago - proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null}' + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null,"succeeded_at":"2026-10-15T14:55:12Z","partially_succeeded_at":null}' recorded_at: Thu, 22 Oct 2026 19:14:11 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml index d4873bc..91f5fbf 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/accepts_filtering_parameters.yml @@ -71,7 +71,7 @@ http_interactions: body: encoding: UTF-8 string: '[{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago - proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago - sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"amount":80000,"succeeded_count":1,"settled_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null,"succeeded_at":"2026-10-15T14:55:12Z","partially_succeeded_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago + sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"amount":80000,"succeeded_count":1,"settled_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null,"succeeded_at":null,"partially_succeeded_at":"2026-10-14T11:10:05Z"}]' recorded_at: Thu, 22 Oct 2026 19:14:12 GMT recorded_with: VCR 6.3.1 diff --git a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml index 880290b..d1d8682 100644 --- a/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml +++ b/spec/vcr/Fintoc_V2_Client/behaves_like_a_client_with_transfer_batches_manager/_transfer_batches/_list/returns_an_array_of_TransferBatch_instances.yml @@ -71,7 +71,7 @@ http_interactions: body: encoding: UTF-8 string: '[{"object":"transfer_batch","id":"trbatch_32jqKMMm1XFaPPxmdk5xg7Q1yHd","mode":"test","description":"Pago - proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago - sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"amount":80000,"succeeded_count":1,"settled_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null}]' + proveedores","status":"succeeded","currency":"MXN","transfer_count":2,"amount":100000,"succeeded_count":2,"settled_amount":100000,"created_at":"2026-10-15T13:51:03Z","authorized_at":"2026-10-15T13:55:12Z","rejected_at":null,"expired_at":null,"succeeded_at":"2026-10-15T14:55:12Z","partially_succeeded_at":null},{"object":"transfer_batch","id":"trbatch_32k1Fh3eOqLrA8sVnD2wZy6TxPu","mode":"test","description":"Pago + sueldos","status":"partially_succeeded","currency":"MXN","transfer_count":2,"amount":80000,"succeeded_count":1,"settled_amount":30000,"created_at":"2026-10-14T10:02:41Z","authorized_at":"2026-10-14T10:10:05Z","rejected_at":null,"expired_at":null,"succeeded_at":null,"partially_succeeded_at":"2026-10-14T11:10:05Z"}]' recorded_at: Thu, 22 Oct 2026 19:14:11 GMT recorded_with: VCR 6.3.1