Ruby gem for creating SPS XML files
sps_king is a Ruby gem which implements pain (Payment Initiation) file building for the Swiss Payment Standard, which is a subset of the ISO 20022 standard.
This is currently implemented in v1.8 for Swiss Credit Transfers (pain.001.001.03.ch.02) and v1.2 for Swiss Direct Debits (pain.008.001.02.ch.03).
If you are looking for SEPA pain file building, take a look at sepa_king.
This gem is forked of sepa_king and therefore heavily inspired by the structure and the API.
Requirements
- Ruby 3.0 or newer
- ActiveModel 5.0 or newer
Installation
gem install sps_king
Usage
Direct Debit Initiation
How to create the XML for Direct Debit Initiation (in German: "Lastschriften")
# First: Create the main object
sdd = SPS::DirectDebit.new(
# Name of the initiating party and creditor, in German: "Auftraggeber"
# String, max. 70 char
name: 'Gläubiger GmbH',
# Optional: ISR Participant Number for the swiss ISR debit system. Only for Swiss Direct Debits with ISR references
# Numeric, 9 digits, last digit is checkdigit recursive with modulo 10
isr_participant_number: '010001456',
# International Bank Account Number of the creditor
# String, max. 34 chars
iban: 'CH7081232000001998736',
# Creditor Identifier, in German: Gläubiger-Identifikationsnummer
# String, max. 35 chars
creditor_identifier: 'ABC1W',
)
# Second: Add transactions
sdd.add_transaction(
# Name of the debtor, in German: "Zahlungspflichtiger"
# String, max. 70 char
name: 'Zahlemann & Söhne GbR',
# International Bank Account Number of the debtor's account
# String, max. 34 chars
iban: 'CH9804835011062385295',
# Amount
# Number with two decimal digit
amount: 39.99,
# OPTIONAL: Currency, CHF by default (ISO 4217 standard)
# String, 3 char
currency: 'CHF',
# Instruction Identification, will not be submitted to the debtor
# String, max. 35 char
instruction: '12345',
# OPTIONAL: End-To-End-Identification, will be submitted to the debtor
# String, max. 35 char
reference: 'XYZ/2013-08-ABO/6789',
# OPTIONAL: Unstructured remittance information, in German "Verwendungszweck"
# String, max. 140 char
remittance_information: 'Vielen Dank für Ihren Einkauf!',
# OPTIONAL: Structured remittance information, in German "Strukturierter Verwendungszweck". Required for e.g. Swiss Direct Debits
# StructuredRemittanceInformation
structured_remittance_information: SPS::StructuredRemittanceInformation.new(
# Defines how the reference field should be interpreted for Swiss Direct Debits
# One of these strings:
# 'ESR' ("ESR-Referenznummer")
# 'IPI' ("IPI-Verwendungszweck")
proprietary: 'ESR',
# if proprietary is 'ESR': 27 character ISR reference number
# if proprietary is 'IPI': 20 character IPI remittance
reference: '609323234234234353453423423',
),
# Service Level
# One of these strings:
# 'CHTA' ("Banklastschrift") - Only for Swiss Direct Debits
# 'CHDD' ("PostFinance-Lastschrift") - Only for Swiss Direct Debits
service_level: 'CHTA',
# Local instrument, in German "Lastschriftart"
# One of these strings:
# 'DDCOR1' ("Basis-Lastschrift") - only for service_level 'CHDD'
# 'DDB2B' ("Firmen-Lastschrift") - only for service_level 'CHDD'
# 'LSV+' ("Basis-Lastschrift") - only for service_level 'CHTA'
# 'BDD' ("Firmen-Lastschrift") - only for service_level 'CHTA'
local_instrument: 'LSV+',
# OPTIONAL: Requested collection date, in German "Fälligkeitsdatum der Lastschrift"
# Date
requested_date: Date.new(2013, 9, 5),
# OPTIONAL: Use a different creditor account
# CreditorAccount
creditor_account: SPS::CreditorAccount.new(
name: 'Creditor Inc.',
iban: 'CH7081232000001998736',
creditor_identifier: '12312',
)
# Specify the country & address of the debtor (The individually required fields depend on the local legal requirements)
debtor_address: SPS::DebtorAddress.new(
country_code: 'CH',
# Not required if individual fields are used
address_line1: 'Mustergasse 123a',
address_line2: '1234 Musterstadt',
# Not required if address_line1 and address_line2 are used
street_name: 'Mustergasse',
post_code: '1234',
town_name: 'Musterstadt',
)
)
sdd.add_transaction ...
# Last: create XML string
xml_string = sdd.to_xml # Use latest schema pain.008.001.02.ch.03Credit Transfer Initiation
How to create the XML for Credit Transfer Initiation (in German: "Überweisungen")
# First: Create the main object
sct = SPS::CreditTransfer.new(
# Name of the initiating party and debtor, in German: "Auftraggeber"
# String, max. 70 char
name: 'Schuldner GmbH',
# Business Identifier Code (SWIFT-Code) of the debtor
# String, 8 or 11 char
bic: 'RAIFCH22',
# International Bank Account Number of the debtor
# String, max. 34 chars
iban: 'CH5481230000001998736',
)
# Second: Add transactions
sct.add_transaction(
# Name of the creditor, in German: "Zahlungsempfänger"
# String, max. 70 char
name: 'Contoso AG',
# Business Identifier Code (SWIFT-Code) of the creditor's account
# String, 8 or 11 char
bic: 'CRESCHZZ80A',
# International Bank Account Number of the creditor's account
# String, max. 34 chars
iban: 'CH9300762011623852957',
# Amount
# Number with two decimal digit
amount: 102.50,
# OPTIONAL: Currency, CHF by default (ISO 4217 standard)
# String, 3 char
currency: 'CHF',
# OPTIONAL: Instruction Identification, will not be submitted to the creditor
# String, max. 35 char
instruction: '12345',
# OPTIONAL: End-To-End-Identification, will be submitted to the creditor
# String, max. 35 char
reference: 'XYZ-1234/123',
# OPTIONAL: Unstructured remittance information, in German "Verwendungszweck"
# String, max. 140 char
remittance_information: 'Rechnung vom 22.08.2013',
# OPTIONAL: Structured remittance information, in German "Strukturierter Verwendungszweck". Required for e.g. Swiss QR transfers
# StructuredRemittanceInformation
structured_remittance_information: SPS::StructuredRemittanceInformation.new(
# Defines how the reference field should be interpreted for Swiss Credit Transfers
# One of these strings:
# 'IPI' ("IPI-Verwendungszweck")
# 'QRR' ("QR-Referenz")
proprietary: 'QRR',
# if proprietary is 'IPI': 20 character IPI remittance
# if proprietary is 'QRR': 27 character QR reference
reference: '000008207791225857421286694',
),
# OPTIONAL: Requested execution date, in German "Ausführungstermin"
# Date
requested_date: Date.new(2013,9,5),
# OPTIONAL: Enables or disables batch booking, in German "Sammelbuchung / Einzelbuchung"
# True or False
batch_booking: true,
# OPTIONAL: Urgent Payment
# One of these strings:
# 'SEPA' ("SEPA-Zahlung")
# 'URGP' ("Taggleiche Eilüberweisung")
service_level: 'URGP',
# OPTIONAL: Charge Bearer
# One of these strings:
# 'DEBT' (Borne by Debitor)
# 'CRED' (Borne by Creditor)
# 'SHAR' (Shared)
# 'SLEV' (Service Level) - Must be SLEV for SEPA transfers
charge_bearer: 'SHAR',
# OPTIONAL: Unstructured information to indicate the purpose of the payment
# String, max. 4 char
category_purpose: 'SALA',
# Specify the country & address of the creditor. The required fields may vary depending on the legal requirements.
creditor_address: SPS::CreditorAddress.new(
country_code: 'CH',
# Not required if individual fields are used
address_line1: 'Mustergasse 123a',
address_line2: '1234 Musterstadt',
# Not required if address_line1 and address_line2 are used
street_name: 'Mustergasse',
building_number: '123a',
post_code: '1234',
town_name: 'Musterstadt',
)
)
sct.add_transaction ...
# Last: create XML string
xml_string = sct.to_xml # Use latest schema pain.001.001.03.ch.02Changelog
https://github.com/viafintech/sps_king/releases
Contributors
https://github.com/viafintech/sps_king/graphs/contributors
Resources
- https://www.six-group.com/interbank-clearing/de/home/standardization/iso-payments/customer-bank/implementation-guidelines.html
- https://www.lsv.ch/en/home/financial-institutions/direct-debit-procedures/support.html
- https://www.six-group.com/interbank-clearing/de/home/bank-master-data/inquiry-bc-number.html
License
Released under the MIT license
Copyright (c) 2018-2025 Tobias Schoknecht
Copyright (c) 2013-2017 Georg Leciejewski (Sales King GmbH) & Georg Ledermann for portions of this project copied from sepa_king