diff --git a/README.md b/README.md index 0478fa8..f5f7544 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,30 @@ transaction.token # => "a4e67841-abb0-42de-a364-d1d8f9f4b3c0" ``` +## Kassa Receipt + CloudPayments Kassa API (https://cloudpayments.ru/docs/api/kassa) + +```ruby + CloudPayments.client.kassa.receipt({ + :account_id => "user@example.com", + :customer_receipt => { + :items => [ + { + :amount => "13350.00", + :ean13 => nil, + :label => "Good Description", + :price => "13350.00", + :quantity => 1.0, + :vat => nil + } + ] + }, + :inn => "7708806666", + :invoice_id => "231312312", + :type => "Income" + }) +``` + ## Webhooks ```ruby diff --git a/lib/cloud_payments/models.rb b/lib/cloud_payments/models.rb index 8814388..2725800 100644 --- a/lib/cloud_payments/models.rb +++ b/lib/cloud_payments/models.rb @@ -9,3 +9,4 @@ require 'cloud_payments/models/on_recurrent' require 'cloud_payments/models/on_pay' require 'cloud_payments/models/on_fail' +require 'cloud_payments/models/on_kassa_receipt' diff --git a/lib/cloud_payments/models/on_kassa_receipt.rb b/lib/cloud_payments/models/on_kassa_receipt.rb new file mode 100644 index 0000000..e3025cc --- /dev/null +++ b/lib/cloud_payments/models/on_kassa_receipt.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +module CloudPayments + # @see https://cloudpayments.ru/Docs/Notifications#receipt CloudPayments API + class OnKassaReceipt < Model + property :id, required: true + property :document_number, required: true + property :session_number, required: true + property :fiscal_sign, required: true + property :device_number, required: true + property :reg_number, required: true + property :inn, required: true + property :type, required: true + property :ofd, required: true + property :url, required: true + property :qr_code_url, required: true + property :amount, transform_with: DecimalTransform, required: true + property :date_time, transform_with: DateTimeTransform + property :receipt + property :invoice_id + property :transaction_id + property :account_id + end +end diff --git a/lib/cloud_payments/namespaces.rb b/lib/cloud_payments/namespaces.rb index 2c622a3..90c42ef 100644 --- a/lib/cloud_payments/namespaces.rb +++ b/lib/cloud_payments/namespaces.rb @@ -5,6 +5,7 @@ require 'cloud_payments/namespaces/payments' require 'cloud_payments/namespaces/subscriptions' require 'cloud_payments/namespaces/orders' +require 'cloud_payments/namespaces/kassa' module CloudPayments module Namespaces @@ -12,6 +13,10 @@ def payments Payments.new(self) end + def kassa + Kassa.new(self) + end + def subscriptions Subscriptions.new(self) end diff --git a/lib/cloud_payments/namespaces/kassa.rb b/lib/cloud_payments/namespaces/kassa.rb new file mode 100644 index 0000000..6870a91 --- /dev/null +++ b/lib/cloud_payments/namespaces/kassa.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module CloudPayments + module Namespaces + class Kassa < Base + InnNotProvided = Class.new(StandardError) + TypeNotProvided = Class.new(StandardError) + CustomerReceiptNotProvided = Class.new(StandardError) + + def self.resource_name + 'kkt' + end + + def receipt(attributes) + attributes.fetch(:inn) { raise InnNotProvided.new('inn attribute is required') } + attributes.fetch(:type) { raise TypeNotProvided.new('type attribute is required') } + attributes.fetch(:inn) { raise CustomerReceiptNotProvided.new('customer_receipt is required') } + + request(:receipt, attributes) + end + end + end +end diff --git a/lib/cloud_payments/webhooks.rb b/lib/cloud_payments/webhooks.rb index d5ef61c..a7edc54 100644 --- a/lib/cloud_payments/webhooks.rb +++ b/lib/cloud_payments/webhooks.rb @@ -23,6 +23,10 @@ def validate_data!(data, hmac) true end + def kassa_receipt(data) + OnKassaReceipt.new(@serializer.load(data)) + end + def on_recurrent(data) OnRecurrent.new(@serializer.load(data)) end diff --git a/spec/cloud_payments/webhooks_spec.rb b/spec/cloud_payments/webhooks_spec.rb index b77fe96..0f9c9c5 100644 --- a/spec/cloud_payments/webhooks_spec.rb +++ b/spec/cloud_payments/webhooks_spec.rb @@ -227,4 +227,46 @@ specify { expect(subject.failed_transactions).to eq 22 } specify { expect(subject.next_transaction_at).to eq DateTime.parse('2015-11-18 20:29:05') } end + + describe 'on_kassa_receipt' do + let(:raw_data) do + {"Id"=>"sc_a38ca02005d40db7d32b36a0097b0", + "DocumentNumber"=>"1234", + "SessionNumber"=>"12345", + "FiscalSign"=>"signsgin", + "DeviceNumber"=>"123465", + "RegNumber"=>"12345", + "Inn"=>"0", + "Type"=>"Type", + "Ofd"=>"Ofd", + "Url"=>"http://example.com/url/", + "QrCodeUrl"=>"http://example.com/url", + "Amount"=>"11.11", + "DateTime"=>"2015-11-18 20:29:05", + "Receipt"=>"{}", + "TransactionId" => "12321123", + "InvoiceId" => "123123", + "AccountId" => "3213213"} + end + + subject { CloudPayments.webhooks.kassa_receipt(raw_data) } + + specify { expect(subject.id).to eq "sc_a38ca02005d40db7d32b36a0097b0" } + specify { expect(subject.document_number).to eq '1234' } + specify { expect(subject.session_number).to eq '12345' } + specify { expect(subject.fiscal_sign).to eq 'signsgin' } + specify { expect(subject.device_number).to eq '123465' } + specify { expect(subject.reg_number).to eq '12345' } + specify { expect(subject.inn).to eq '0' } + specify { expect(subject.type).to eq 'Type' } + specify { expect(subject.ofd).to eq 'Ofd' } + specify { expect(subject.url).to eq 'http://example.com/url/' } + specify { expect(subject.qr_code_url).to eq 'http://example.com/url' } + specify { expect(subject.amount).to eq 11.11 } + specify { expect(subject.date_time).to eq DateTime.parse('2015-11-18 20:29:05') } + specify { expect(subject.receipt).to eq '{}' } + specify { expect(subject.transaction_id).to eq '12321123' } + specify { expect(subject.invoice_id).to eq '123123' } + specify { expect(subject.account_id).to eq '3213213' } + end end