sage_pay 0.2.13 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rbenv-version +1 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +2 -7
- data/README.md +27 -8
- data/Rakefile +5 -114
- data/config/locales/en.yml +8 -0
- data/lib/sage_pay.rb +10 -6
- data/lib/sage_pay/locale_initializer.rb +3 -0
- data/lib/sage_pay/server/address.rb +11 -15
- data/lib/sage_pay/server/authorise.rb +2 -2
- data/lib/sage_pay/server/command.rb +7 -4
- data/lib/sage_pay/server/notification.rb +1 -1
- data/lib/sage_pay/server/notification_response.rb +1 -1
- data/lib/sage_pay/server/refund.rb +2 -3
- data/lib/sage_pay/server/registration.rb +2 -2
- data/lib/sage_pay/server/related_transaction.rb +1 -1
- data/lib/sage_pay/server/release.rb +2 -3
- data/lib/sage_pay/server/repeat.rb +2 -2
- data/lib/sage_pay/server/response.rb +2 -1
- data/lib/sage_pay/uri_fixups.rb +6 -40
- data/lib/sage_pay/validators.rb +36 -0
- data/lib/sage_pay/version.rb +3 -0
- data/sage_pay.gemspec +16 -30
- data/spec/integration/sage_pay/server_spec.rb +9 -9
- data/spec/sage_pay/server/address_spec.rb +5 -5
- data/spec/sage_pay/server/notification_response_spec.rb +2 -2
- data/spec/sage_pay/server/registration_spec.rb +13 -13
- data/spec/sage_pay/server_spec.rb +4 -4
- data/spec/sage_pay_spec.rb +2 -2
- data/spec/spec_helper.rb +8 -2
- data/spec/support/integration.rb +6 -6
- data/spec/support/validation_matchers.rb +13 -13
- metadata +115 -93
- data/Gemfile.lock +0 -39
- data/lib/validatable-ext.rb +0 -28
- data/lib/validations/validates_inclusion_of.rb +0 -22
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p194
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format n
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.0.0
|
4
|
+
|
5
|
+
* Ruby 1.9 compatibility. Note that Ruby 1.8.x is no longer supported due to
|
6
|
+
the different way in which `URI` needs to be patched to support `{` and `}`
|
7
|
+
in the URLs. Thanks to @jairodiaz, @moomerman and @gato-omega for
|
8
|
+
contributing!
|
9
|
+
|
10
|
+
* The validation regular expressions have been pulled out into a module so that
|
11
|
+
you can also use them in your higher level models. Thanks, @lenary!
|
12
|
+
|
3
13
|
## 0.2.13
|
4
14
|
|
5
15
|
* If the country for an address is the US, then the US state is required.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
SagePay
|
2
|
-
=======
|
1
|
+
# SagePay
|
3
2
|
|
4
|
-
|
3
|
+
[![Build Status](https://secure.travis-ci.org/mathie/sage_pay.png?branch=master)](http://travis-ci.org/mathie/sage_pay)
|
4
|
+
[![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/mathie/sage_pay)
|
5
|
+
|
6
|
+
## Description
|
5
7
|
|
6
8
|
This is a Ruby library for integrating with SagePay. SagePay is a payment
|
7
9
|
gateway for accepting credit card payments through your web app. It offers
|
@@ -23,17 +25,34 @@ The current client app I'm writing is using SagePay Server, so that's where
|
|
23
25
|
the current implementation will be focused. Direct will follow when I (or
|
24
26
|
somebody else) has the impetus to do so.
|
25
27
|
|
26
|
-
|
28
|
+
## Installation
|
27
29
|
|
28
|
-
You should be able to install the gem directly from
|
29
|
-
default Rubygems repository. Simply do:
|
30
|
+
You should be able to install the gem directly from Rubygems. Simply do:
|
30
31
|
|
31
32
|
(sudo) gem install sage_pay
|
32
33
|
|
33
|
-
and you're good to go.
|
34
|
+
and you're good to go. If you're adding it as a dependency to an existing
|
35
|
+
project and you're using bundler, simply add:
|
36
|
+
|
37
|
+
gem 'sage_pay'
|
34
38
|
|
35
|
-
|
39
|
+
to your `Gemfile` and you're also good to go.
|
40
|
+
|
41
|
+
## Assumptions
|
36
42
|
|
37
43
|
This gem currently implements SagePay protocol version 2.23. The client app
|
38
44
|
I'm writing is in Rails, so there are probably some assumptions around that,
|
39
45
|
too.
|
46
|
+
|
47
|
+
## Test Configuration
|
48
|
+
|
49
|
+
For running the integration tests, you'll need a valid SagePay account on the
|
50
|
+
simulator. If you want to run the integration tests, pass in your vendor name
|
51
|
+
with the environment variable `VENDOR_NAME`. If you don't supply a vendor name,
|
52
|
+
the integration tests will be skipped. For example:
|
53
|
+
|
54
|
+
VENDOR_NAME=rubaidh bundle exec rake spec
|
55
|
+
|
56
|
+
Please note that you need to include your current IP address in the Sage Pay
|
57
|
+
Simulator portal. The Simulator only accepts calls from white listed IP
|
58
|
+
addresses.
|
data/Rakefile
CHANGED
@@ -1,129 +1,20 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
|
6
|
-
#############################################################################
|
7
|
-
#
|
8
|
-
# Helper functions
|
9
|
-
#
|
10
|
-
#############################################################################
|
11
|
-
|
12
|
-
def name
|
13
|
-
@name ||= Dir['*.gemspec'].first.split('.').first
|
14
|
-
end
|
15
|
-
|
16
|
-
def version
|
17
|
-
line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
|
18
|
-
line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
|
19
|
-
end
|
20
|
-
|
21
|
-
def date
|
22
|
-
Date.today.to_s
|
23
|
-
end
|
24
|
-
|
25
|
-
def rubyforge_project
|
26
|
-
name
|
27
|
-
end
|
28
|
-
|
29
|
-
def gemspec_file
|
30
|
-
"#{name}.gemspec"
|
31
|
-
end
|
32
|
-
|
33
|
-
def gem_file
|
34
|
-
"#{name}-#{version}.gem"
|
35
|
-
end
|
36
|
-
|
37
|
-
def replace_header(head, header_name)
|
38
|
-
head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
|
39
|
-
end
|
40
|
-
|
41
|
-
#############################################################################
|
42
|
-
#
|
43
|
-
# Standard tasks
|
44
|
-
#
|
45
|
-
#############################################################################
|
3
|
+
require 'rdoc/task'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'bundler/gem_tasks'
|
46
6
|
|
47
7
|
task :default => :spec
|
48
8
|
|
49
|
-
|
9
|
+
RSpec::Core::RakeTask.new
|
50
10
|
|
51
|
-
Spec::Rake::SpecTask.new(:coverage) do |coverage|
|
52
|
-
coverage.rcov = true
|
53
|
-
coverage.rcov_opts << '--exclude' << '\.rvm,spec'
|
54
|
-
end
|
55
|
-
|
56
|
-
require 'rake/rdoctask'
|
57
11
|
Rake::RDocTask.new do |rdoc|
|
58
12
|
rdoc.rdoc_dir = 'rdoc'
|
59
|
-
rdoc.title = "#{name} #{version}"
|
60
13
|
rdoc.rdoc_files.include('README*')
|
61
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
62
15
|
end
|
63
16
|
|
64
17
|
desc "Open an irb session preloaded with this library"
|
65
18
|
task :console do
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
#############################################################################
|
70
|
-
#
|
71
|
-
# Custom tasks (add your own tasks here)
|
72
|
-
#
|
73
|
-
#############################################################################
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
#############################################################################
|
78
|
-
#
|
79
|
-
# Packaging tasks
|
80
|
-
#
|
81
|
-
#############################################################################
|
82
|
-
|
83
|
-
desc "Release the new version of the gem into the wild"
|
84
|
-
task :release => :build do
|
85
|
-
unless `git branch` =~ /^\* master$/
|
86
|
-
puts "You must be on the master branch to release!"
|
87
|
-
exit!
|
88
|
-
end
|
89
|
-
sh "git commit --allow-empty -a -m 'Release #{version}'"
|
90
|
-
sh "git tag v#{version}"
|
91
|
-
sh "git push origin master"
|
92
|
-
sh "git push origin v#{version}"
|
93
|
-
sh "gem push pkg/#{name}-#{version}.gem"
|
94
|
-
end
|
95
|
-
|
96
|
-
desc "Build the gem"
|
97
|
-
task :build => [:spec, :gemspec] do
|
98
|
-
sh "mkdir -p pkg"
|
99
|
-
sh "gem build #{gemspec_file}"
|
100
|
-
sh "mv #{gem_file} pkg"
|
101
|
-
end
|
102
|
-
|
103
|
-
task :gemspec do
|
104
|
-
# read spec file and split out manifest section
|
105
|
-
spec = File.read(gemspec_file)
|
106
|
-
head, manifest, tail = spec.split(" # = MANIFEST =\n")
|
107
|
-
|
108
|
-
# replace name version and date
|
109
|
-
replace_header(head, :name)
|
110
|
-
replace_header(head, :version)
|
111
|
-
replace_header(head, :date)
|
112
|
-
#comment this out if your rubyforge_project has a different name
|
113
|
-
replace_header(head, :rubyforge_project)
|
114
|
-
|
115
|
-
# determine file list from git ls-files
|
116
|
-
files = `git ls-files`.
|
117
|
-
split("\n").
|
118
|
-
sort.
|
119
|
-
reject { |file| file =~ /^\./ }.
|
120
|
-
reject { |file| file =~ /^(rdoc|pkg)/ }.
|
121
|
-
map { |file| " #{file}" }.
|
122
|
-
join("\n")
|
123
|
-
|
124
|
-
# piece file back together and write
|
125
|
-
manifest = " s.files = %w[\n#{files}\n ]\n"
|
126
|
-
spec = [head, manifest, tail].join(" # = MANIFEST =\n")
|
127
|
-
File.open(gemspec_file, 'w') { |io| io.write(spec) }
|
128
|
-
puts "Updated #{gemspec_file}"
|
19
|
+
ruby "-S irb -rubygems -Ilib -r ./lib/sage_pay.rb -r ./spec/support/factories.rb"
|
129
20
|
end
|
data/lib/sage_pay.rb
CHANGED
@@ -1,18 +1,22 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
require 'validatable'
|
1
|
+
require 'active_support/core_ext/class'
|
3
2
|
require 'bigdecimal'
|
4
3
|
require 'net/https'
|
5
4
|
require 'uri'
|
6
|
-
require 'md5'
|
5
|
+
require 'digest/md5'
|
7
6
|
require 'uuid'
|
8
7
|
|
8
|
+
require 'active_model/naming'
|
9
|
+
require 'active_model/validator'
|
10
|
+
require 'active_model/validations'
|
11
|
+
require 'active_model/translation'
|
12
|
+
|
9
13
|
module SagePay
|
10
|
-
VERSION = '0.2.13'
|
11
14
|
end
|
12
15
|
|
13
|
-
require '
|
14
|
-
|
16
|
+
require 'sage_pay/version'
|
15
17
|
require 'sage_pay/uri_fixups'
|
18
|
+
require 'sage_pay/locale_initializer'
|
19
|
+
require 'sage_pay/validators'
|
16
20
|
require 'sage_pay/server/address'
|
17
21
|
require 'sage_pay/server/transaction_code'
|
18
22
|
require 'sage_pay/server/signature_verification_details'
|
@@ -1,13 +1,8 @@
|
|
1
1
|
module SagePay
|
2
2
|
module Server
|
3
3
|
class Address
|
4
|
-
include
|
5
|
-
|
6
|
-
class << self
|
7
|
-
attr_accessor :us_states, :iso_3166_country_codes
|
8
|
-
end
|
9
|
-
self.us_states = ["AK", "AL", "AR", "AS", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "FM", "GA", "GU", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MH", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "PR", "PW", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VI", "VT", "WA", "WI", "WV", "WY"]
|
10
|
-
self.iso_3166_country_codes = ["AF", "AX", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", "BW", "BV", "BR", "IO", "BN", "BG", "BF", "BI", "KH", "CM", "CA", "CV", "KY", "CF", "TD", "CL", "CN", "CX", "CC", "CO", "KM", "CG", "CD", "CK", "CR", "CI", "HR", "CU", "CY", "CZ", "DK", "DJ", "DM", "DO", "EC", "EG", "SV", "GQ", "ER", "EE", "ET", "FK", "FO", "FJ", "FI", "FR", "GF", "PF", "TF", "GA", "GM", "GE", "DE", "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GG", "GN", "GW", "GY", "HT", "HM", "VA", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IQ", "IE", "IM", "IL", "IT", "JM", "JP", "JE", "JO", "KZ", "KE", "KI", "KP", "KR", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MK", "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", "MU", "YT", "MX", "FM", "MD", "MC", "MN", "ME", "MS", "MA", "MZ", "MM", "NA", "NR", "NP", "NL", "AN", "NC", "NZ", "NI", "NE", "NG", "NU", "NF", "MP", "OM", "PK", "PW", "PS", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", "PR", "QA", "RE", "RO", "RU", "RW", "BL", "SH", "KN", "LC", "MF", "PM", "VC", "WS", "SM", "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SK", "SI", "SB", "SO", "ZA", "GS", "ES", "LK", "SD", "SR", "SJ", "SZ", "SE", "CH", "SY", "TW", "TJ", "TZ", "TH", "TL", "TG", "TK", "TO", "TT", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "UY", "UZ", "VU", "VE", "VN", "VG", "VI", "WF", "EH", "YE", "ZM", "ZW"]
|
4
|
+
include ActiveModel::Validations
|
5
|
+
include SagePay::Validators
|
11
6
|
|
12
7
|
attr_accessor :first_names, :surname, :address_1, :address_2, :city,
|
13
8
|
:post_code, :country, :state, :phone
|
@@ -16,10 +11,10 @@ module SagePay
|
|
16
11
|
|
17
12
|
# FIXME: This regexp isn't correctly matching accented characters. I
|
18
13
|
# think it's a Ruby version issue so I'm punting for the moment.
|
19
|
-
validates_format_of :first_names, :surname, :with =>
|
20
|
-
validates_format_of :address_1, :address_2, :city, :with =>
|
21
|
-
validates_format_of :post_code, :with =>
|
22
|
-
validates_format_of :phone, :with =>
|
14
|
+
validates_format_of :first_names, :surname, :with => NAME_FORMAT
|
15
|
+
validates_format_of :address_1, :address_2, :city, :with => ADDRESS_FORMAT
|
16
|
+
validates_format_of :post_code, :with => POST_CODE_FORMAT
|
17
|
+
validates_format_of :phone, :with => PHONE_FORMAT
|
23
18
|
|
24
19
|
validates_length_of :first_names, :surname, :maximum => 20
|
25
20
|
validates_length_of :address_1, :address_2, :maximum => 100
|
@@ -32,13 +27,14 @@ module SagePay
|
|
32
27
|
# contains two-character strings, so this validation has no real win.
|
33
28
|
# validates_length_of :country, :state, :maximum => 2
|
34
29
|
|
35
|
-
validates_inclusion_of :state, :in =>
|
36
|
-
validates_inclusion_of :country, :in =>
|
30
|
+
validates_inclusion_of :state, :in => US_STATE_OPTIONS, :allow_blank => true, :message => "is not a US state"
|
31
|
+
validates_inclusion_of :country, :in => COUNTRY_OPTIONS, :allow_blank => true, :message => "is not an ISO3166-1 country code"
|
37
32
|
|
38
33
|
# The state's presence is required if the country is the US, and
|
39
34
|
# verboten otherwise.
|
40
|
-
|
41
|
-
|
35
|
+
|
36
|
+
validates :state, :presence => {:message => "is required if the country is US"}, :if => :in_us?
|
37
|
+
validates_inclusion_of :state, :in => ['', nil], :message => "is present but the country is not US", :unless => :in_us?
|
42
38
|
|
43
39
|
def initialize(attributes = {})
|
44
40
|
attributes.each do |k, v|
|
@@ -12,8 +12,8 @@ module SagePay
|
|
12
12
|
|
13
13
|
validates_inclusion_of :apply_avs_cv2, :allow_blank => true, :in => (0..3).to_a
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
validates :amount, :numericality => {:message => "is less than the minimum value (0.01)", :greater_than_or_equal_to => BigDecimal.new("0.01")}
|
16
|
+
validates :amount, :numericality => {:message => "is greater than the maximum value (100,000.00)", :less_than_or_equal_toi => BigDecimal.new("100000")}
|
17
17
|
|
18
18
|
def post_params
|
19
19
|
params = super.merge({
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module SagePay
|
2
2
|
module Server
|
3
3
|
class Command
|
4
|
-
include
|
4
|
+
include ActiveModel::Validations
|
5
|
+
|
6
|
+
class_attribute :tx_type, :vps_protocol
|
5
7
|
|
6
|
-
class_inheritable_accessor :tx_type, :vps_protocol
|
7
8
|
self.vps_protocol = "2.23"
|
8
9
|
|
9
10
|
attr_accessor :mode, :vendor, :vendor_tx_code
|
@@ -15,7 +16,7 @@ module SagePay
|
|
15
16
|
validates_length_of :vendor, :maximum => 15
|
16
17
|
validates_length_of :vendor_tx_code, :maximum => 40
|
17
18
|
|
18
|
-
validates_inclusion_of :mode, :allow_blank => true, :in => [ :simulator, :test, :live ]
|
19
|
+
validates_inclusion_of :mode, :allow_blank => true, :in => [ :showpost, :simulator, :test, :live ]
|
19
20
|
|
20
21
|
def self.decimal_accessor(*attrs)
|
21
22
|
attrs.each do |attr|
|
@@ -46,6 +47,8 @@ module SagePay
|
|
46
47
|
|
47
48
|
def url
|
48
49
|
case mode
|
50
|
+
when :showpost
|
51
|
+
"https://test.sagepay.com/showpost/showpost.asp?Service=#{simulator_service}"
|
49
52
|
when :simulator
|
50
53
|
"https://test.sagepay.com/simulator/VSPServerGateway.asp?Service=#{simulator_service}"
|
51
54
|
when :test
|
@@ -91,7 +94,7 @@ module SagePay
|
|
91
94
|
response_from_response_body(response.body)
|
92
95
|
else
|
93
96
|
# FIXME: custom error response would be nice.
|
94
|
-
raise RuntimeError, "I guess SagePay doesn't like us today."
|
97
|
+
raise RuntimeError, "I guess SagePay doesn't like us today: #{response.inspect}"
|
95
98
|
end
|
96
99
|
end
|
97
100
|
end
|
@@ -136,7 +136,7 @@ module SagePay
|
|
136
136
|
params["CardType"],
|
137
137
|
params["Last4Digits"]
|
138
138
|
]
|
139
|
-
attributes[:calculated_hash] = MD5.
|
139
|
+
attributes[:calculated_hash] = Digest::MD5.hexdigest(fields_used_in_signature.join).upcase
|
140
140
|
end
|
141
141
|
|
142
142
|
new(attributes)
|
@@ -11,9 +11,8 @@ module SagePay
|
|
11
11
|
validates_length_of :currency, :is => 3
|
12
12
|
validates_length_of :description, :maximum => 100
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
validates_true_for :amount, :key => :amount_maximum_value, :logic => lambda { amount.nil? || amount <= BigDecimal.new("100000") }, :message => "is greater than the maximum value (100,000.00)"
|
14
|
+
validates :amount, :numericality => {:message => "is less than the minimum value (0.01)", :greater_than_or_equal_to => BigDecimal.new("0.01")}
|
15
|
+
validates :amount, :numericality => {:message => "is greater than the maximum value (100,000.00)", :less_than_or_equal_to => BigDecimal.new("100000")}
|
17
16
|
|
18
17
|
def post_params
|
19
18
|
super.merge({
|
@@ -24,8 +24,8 @@ module SagePay
|
|
24
24
|
validates_inclusion_of :billing_agreement, :allow_blank => true, :in => [true, false]
|
25
25
|
validates_inclusion_of :account_type, :allow_blank => true, :in => [:ecommerce, :continuous_authority, :mail_order]
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
validates :amount, :numericality => {:message => "is less than the minimum value (0.01)", :greater_than_or_equal_to => BigDecimal.new("0.01")}
|
28
|
+
validates :amount, :numericality => {:message => "is greater than the maximum value (100,000.00)", :less_than_or_equal_to => BigDecimal.new("100000")}
|
29
29
|
|
30
30
|
def run!
|
31
31
|
if @response.nil? || (@vendor_tx_code_sent != vendor_tx_code)
|
@@ -12,9 +12,8 @@ module SagePay
|
|
12
12
|
validates_length_of :vps_tx_id, :is => 38
|
13
13
|
validates_length_of :security_key, :is => 10
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
validates_true_for :release_amount, :key => :release_amount_maximum_value, :logic => lambda { release_amount.nil? || release_amount <= BigDecimal.new("100000") }, :message => "is greater than the maximum value (100,000.00)"
|
15
|
+
validates :amount, :numericality => {:message => "is less than the minimum value (0.01)", :greater_than_or_equal_to => BigDecimal.new("0.01")}
|
16
|
+
validates :amount, :numericality => {:message => "is greater than the maximum value (100,000.00)", :less_than_or_equal_to => BigDecimal.new("100000")}
|
18
17
|
|
19
18
|
def post_params
|
20
19
|
super.merge({
|
@@ -11,8 +11,8 @@ module SagePay
|
|
11
11
|
validates_length_of :currency, :is => 3
|
12
12
|
validates_length_of :description, :maximum => 100
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
validates :amount, :numericality => {:message => "is less than the minimum value (0.01)", :greater_than_or_equal_to => BigDecimal.new("0.01")}
|
15
|
+
validates :amount, :numericality => {:message => "is greater than the maximum value (100,000.00)", :less_than_or_equal_toi => BigDecimal.new("100000")}
|
16
16
|
|
17
17
|
def post_params
|
18
18
|
params = super.merge({
|