From 3b94e1aac67f1cf5e0eb7f29755a9486ab8a63c6 Mon Sep 17 00:00:00 2001 From: Evgeniy Burdaev Date: Thu, 31 Aug 2017 16:20:16 +0300 Subject: [PATCH 1/6] Kassa namespace --- lib/cloud_payments/namespaces.rb | 4 ++++ lib/cloud_payments/namespaces/kassa.rb | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 lib/cloud_payments/namespaces/kassa.rb diff --git a/lib/cloud_payments/namespaces.rb b/lib/cloud_payments/namespaces.rb index 2c622a3..eb7ce2f 100644 --- a/lib/cloud_payments/namespaces.rb +++ b/lib/cloud_payments/namespaces.rb @@ -12,6 +12,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 From 6aa3abc4bf429e8ff701153487b47de7b343fc6a Mon Sep 17 00:00:00 2001 From: Evgeniy Burdaev Date: Thu, 31 Aug 2017 16:25:25 +0300 Subject: [PATCH 2/6] Readme for Kassa --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) 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 From 4271048f6367935d82b93d44ce7f033437201ea6 Mon Sep 17 00:00:00 2001 From: Evgeniy Burdaev Date: Thu, 31 Aug 2017 16:43:31 +0300 Subject: [PATCH 3/6] require kassa namespace --- lib/cloud_payments/namespaces.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cloud_payments/namespaces.rb b/lib/cloud_payments/namespaces.rb index eb7ce2f..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 From ce42786b0d408d51d45e89f618dac3baf90ec468 Mon Sep 17 00:00:00 2001 From: Evgeniy Burdaev Date: Mon, 4 Sep 2017 19:02:27 +0300 Subject: [PATCH 4/6] Webhook for kassa receipt --- lib/cloud_payments/models.rb | 1 + lib/cloud_payments/models/on_kassa_receipt.rb | 22 +++++++++++++++++++ lib/cloud_payments/webhooks.rb | 4 ++++ 3 files changed, 27 insertions(+) create mode 100644 lib/cloud_payments/models/on_kassa_receipt.rb 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..e45751a --- /dev/null +++ b/lib/cloud_payments/models/on_kassa_receipt.rb @@ -0,0 +1,22 @@ +# 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 :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/webhooks.rb b/lib/cloud_payments/webhooks.rb index d5ef61c..34b0449 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) + + end + def on_recurrent(data) OnRecurrent.new(@serializer.load(data)) end From c71621149bc317007bf4b8282b9c8d4c20907a7f Mon Sep 17 00:00:00 2001 From: Evgeniy Burdaev Date: Mon, 4 Sep 2017 19:03:14 +0300 Subject: [PATCH 5/6] kalla kassa receipt serializer --- lib/cloud_payments/webhooks.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cloud_payments/webhooks.rb b/lib/cloud_payments/webhooks.rb index 34b0449..a7edc54 100644 --- a/lib/cloud_payments/webhooks.rb +++ b/lib/cloud_payments/webhooks.rb @@ -24,7 +24,7 @@ def validate_data!(data, hmac) end def kassa_receipt(data) - + OnKassaReceipt.new(@serializer.load(data)) end def on_recurrent(data) From e0e594e98bcd41dd8b121af9b7063920e077c1d1 Mon Sep 17 00:00:00 2001 From: Evgeniy Burdaev Date: Wed, 6 Sep 2017 13:52:06 +0300 Subject: [PATCH 6/6] Specs for kassa_receipt --- lib/cloud_payments/models/on_kassa_receipt.rb | 1 + spec/cloud_payments/webhooks_spec.rb | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/lib/cloud_payments/models/on_kassa_receipt.rb b/lib/cloud_payments/models/on_kassa_receipt.rb index e45751a..e3025cc 100644 --- a/lib/cloud_payments/models/on_kassa_receipt.rb +++ b/lib/cloud_payments/models/on_kassa_receipt.rb @@ -10,6 +10,7 @@ class OnKassaReceipt < Model 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 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