punto_pagos_rails 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/punto_pagos_rails/transaction.rb +7 -8
- data/config/locales/en.yml +0 -3
- data/config/locales/es.yml +0 -3
- data/config/routes.rb +0 -5
- data/lib/generators/punto_pagos_rails/install/USAGE +2 -5
- data/lib/generators/punto_pagos_rails/install/install_generator.rb +5 -39
- data/lib/generators/punto_pagos_rails/install/templates/puntopagos.yml +9 -10
- data/lib/generators/punto_pagos_rails/install/templates/transactions_migration.rb +18 -0
- data/lib/generators/punto_pagos_rails/payment_flow/USAGE +5 -0
- data/lib/generators/punto_pagos_rails/payment_flow/payment_flow_generator.rb +80 -0
- data/lib/generators/punto_pagos_rails/payment_flow/templates/error.html.erb +5 -0
- data/lib/generators/punto_pagos_rails/payment_flow/templates/success.html.erb +5 -0
- data/lib/generators/punto_pagos_rails/payment_flow/templates/transactions_controller.rb.erb +40 -0
- data/lib/punto_pagos_rails.rb +1 -10
- data/lib/punto_pagos_rails/engine.rb +1 -1
- data/lib/punto_pagos_rails/payable.rb +23 -0
- data/lib/punto_pagos_rails/transaction_service.rb +53 -61
- data/lib/punto_pagos_rails/version.rb +1 -1
- data/spec/dummy/app/controllers/home_controller.rb +0 -1
- data/spec/dummy/app/controllers/transactions_controller.rb +40 -0
- data/spec/dummy/app/models/ticket.rb +1 -19
- data/spec/dummy/app/views/home/index.html.erb +3 -2
- data/spec/dummy/app/views/transactions/error.html.erb +6 -0
- data/spec/dummy/app/views/transactions/success.html.erb +6 -0
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/config/puntopagos.yml +9 -9
- data/spec/dummy/config/routes.rb +4 -2
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20141026172010_create_tickets.rb +1 -1
- data/spec/dummy/db/migrate/20160605212231_create_punto_pagos_rails_transactions.rb +18 -0
- data/spec/dummy/db/schema.rb +11 -8
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +809 -0
- data/spec/dummy/log/test.log +31272 -0
- data/spec/dummy/spec/controllers/transactions_controller_spec.rb +88 -0
- data/spec/dummy/spec/lib/punto_pagos_rails/transaction_service_spec.rb +6 -60
- data/spec/dummy/spec/models/punto_pagos_rails/transaction_spec.rb +3 -3
- data/spec/dummy/spec/models/ticket_spec.rb +2 -2
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3Fw4ZqAHNcyjp32NvDuTNl_UqelVnkm1oFk6m8TeecE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3_/3_b-g2v_V_5gxPdo0uhVAPJZLSsCkSSaJFpHHHnZ6F4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/5X/5XQR5pxibZfdEuTpakchl9HyBfhnPIGcUuB7zJON788.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/5bSj5g83MbQ9DKsPwLU9twrU7yvLq6dYmmH-HEs29O8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6X/6X_ukW43EGeNCQiNv8Ocr70mO25LldjeBozF4UiIz50.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/7q/7qi1bAa7jI04pIaFgMGEMDgWNCI-Q7diVLAm3btoA84.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/CduZWIah5G8fpSjD5QO6TFJXr_9TFOHxCbC1Gy8qZxA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/EN/EN1sgFDBtOLV_nTM5QCygjXFjJjrCwASL91R_jbxJqo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Ee/EeKGFrz9PyEmN_5oeyYYGsl3_g2AHxfLBpYXIlZ9qEo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fv8tnOEJ_LEgSDbDEuTuiPLB-eEYIhxUwZsDBbio46w.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/J5/J54BxjKsqhvXfShEaZNnH6dfnLMS0zoVH5mgbz0DK7Y.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/J8/J88DZaT-14iePrHbjUeroRM6XiHxwmMw7k38S1nwR5g.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/MdPfZAJEELkc6iJn6XlCxHSkYdgQ_wgGW950s4axvcs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/O8/O8akbUwAbmIKY-AhITimq-JDQ6IgsO3Hvq2v5etufFw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Pkh2wBkC6wpkIuR8EXAg7elsBHnTjVINP97B71GAyhE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Rm/Rmkvmvnp04uG1YyAWhY8BHBd--6SqqV8mNPXCkmCucs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/VgFPEFaNzkUqN75RTiy1JzWIXg87PGB93hDXsTqxyB8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XfKoGAu1QFs7NV03JWa4QQtoTQSkqlJZx05IkDCP3PM.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XyFO2KxykoEaX_adyCFw667OfGArrYXTOYXJ9b0PgOo.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/a_dtAAwExwuAXpiGsCZKz3W46CsW_KVxNTRFOdoaKzg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/esq8UjWY8tb8I8CizPRT_shPmdQKJYyr2DN19n2klo4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/hj/hj8Ir9wcVSy1KYrnWu9bpD24vDhCG3tvt-nKbNxb1Wg.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/k7noXdZau3gX1CJSriYJIBcNHPwc3318AUHIWCHXKhg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/kn/knvCbDNyQEDreqWUaqRkfTor_EXoGTzPbMdMwdIBJlU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/oC/oCsZTGZyV4kH8Y4OeSDUdrwfkJFPzTODZjuBKZB8oGQ.cache +2 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ogxRgAPyiZ-Nu3IjkBEw9ruI1Knjq_YU6HyWixUrg7g.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/om/omKjrYUgD72M_fYBz1rlfZYic0JVNLXPKY8BGn43I5w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/r0gbTq2v9cKQuG206qQxGolfvjBYw3POwlACk7b41Rg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/rorzxYMlgwKrzjSt_2tNP0StT9Q3pelAqgmVf3YA9SY.cache +3 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/sM/sMuWOI50W0n-l80Pew5AJTy2B4tY5K8RuLjbeB7jQp0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/t78LfYaGJpEOdllJ9lsrnLCKTCSkoSJWU17iCNcvy94.cache +1 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/tP/tPF6H9NRpGO3whu2y5_e_R_1EACKdCwu5437D83qJT0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-X/-XTIyQr6h6v7T797GfFzdxqCpKSZOqemHQqHEHYUItM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1j/1jUXrYbF7jVcJvYHZHNALKbMrXby0qIkxLwN8tMjdl4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/35/35wQlbi0EDG73ZKIiHHpphoZJZUu58POM42B-3-_YX0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3_/3_b-g2v_V_5gxPdo0uhVAPJZLSsCkSSaJFpHHHnZ6F4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5c/5cJuB5GT-GVCPeIQQKexe51JarYx5Zm4Kp5nky33tn8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6O/6OwNk80Fc8hd4f__QxpOLC_qYWFA-uI_iRugkIWqvIQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6X/6X_ukW43EGeNCQiNv8Ocr70mO25LldjeBozF4UiIz50.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7b/7bjowlWzolEF985bac_6I5v3HWZiFJRoa-nqHtn-OXY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7i/7io2gyVCCR83Rk6ocF1HUvam1FLz4-Q1MRk6A10JM0M.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7q/7qnRlg2H1sxfHtaPIpNmoVimW9VFj-yqT0iPzyTT_K4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8Y/8Yb56gIA7T5L10wvHz-fWkKSn254pSN73L7VKYH1Rjg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/96/962nogFuXwCsVtC50UP3FjcEJxWutj384ciKyDgI2cU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9X/9XlM_JtRmY5gbMkK5gueswD7s_ctcOLacU5VYno5ymw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AL/AL6PBU18v_L-23J6RrXIF6BAiPpCRKl0psIsbveU4lA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AP/AP0_3b5N2aJWVyyANhjLMP7qdpczG_C1lo6AtzELoyU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EN/EN1sgFDBtOLV_nTM5QCygjXFjJjrCwASL91R_jbxJqo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EN/eNStu73G536x1iNq9tePGM6hv5Xa6-5ZsXtfJuiDtfE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fi/FiuTIVrQEp_PZDI6AFR7KQkoUtnCXkFVKyr2aSzCINI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HG/HGWuC1XP4qTav8SMCTMvqubfgC1g-BXJH6zXci4WaI8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LK/LK5DwcQTCssBt2sSq8waYL_2OW6zUuLZoRK4vXkUbx0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LO/LOIw_QrLu6EqRv2po1AhlmvJ5T0AcIZuJV0rK15RRx0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MT/MTvVhODKf8qABXyyCrbfCfpCTIA5KjS3WxBpMCXHKRU.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/NR/NRsBMlnlc4XT7crH9pvz4ygo-ZR4AgiGeRMZQPavCxM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/O8/O8akbUwAbmIKY-AhITimq-JDQ6IgsO3Hvq2v5etufFw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PS/PSM535pl0G8ic1fKKJ0rkGdwrgW8b8OITOW47jl2t1g.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R4/R4lZxKQXv7q9xqB-H6AKh5-KeSELCFkMP12qMQ6dMLI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rm/Rmkvmvnp04uG1YyAWhY8BHBd--6SqqV8mNPXCkmCucs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ro/RofByYcbsjOYAjsoyMoH5z1COA5fQ80RZoqB_YRLa84.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rv/Rv0mdxEdzMSxJjrULhpSoGWLCDhlnkqCy48ujNWsXcw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SX/SX0FzvVXLoVzYDZN95Hikfe-1VExx8LZgZh4bam53yE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ui/Ui4eBSjoI421Dzo1z47yeUqcwD-oL_xNCuU_GZ2qh5Y.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V6/V6ShJgOfSo2QDO2zt0zlU1dNhHNG52w6gJbrqt3xnls.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VR/VRC0qpQ2CiJgNEMvtXOvEDluwkaoomyJeAm7Unfrcr0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VY/VYpuh0Ag6L55xqqNJ1mGLQVvGlNNH50DN6HApLtiRSk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X7/X7YQ6EHE68K2fFs0F2XPWazA8x8qVSZuaaYjKvgRj7w.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_l/_lYTKdS6o8FBFea0eYn8eIwjaExcmX5d2ukNTLvrE-c.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bz/bzN6Qn7mi2daF9JkWWFmcv8yPYyWuLQOwlOUre3D-Vg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ct/ctDRUdbKV5LoS0RdmDmOALjaV_onM7pOxr9_otXO9Gk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/es/esYVHbG7qL7AKN3EPN_UFicQM3c0WTcTjqjDGibdz-Y.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hj/hj8Ir9wcVSy1KYrnWu9bpD24vDhCG3tvt-nKbNxb1Wg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iN/iNm88b30nwQF3isi7fjLhZ2910IcuCKNax81fzqHsxY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jU/jUktWNbR4V7n34UAZe7uJpmEofhflF0bVtIO2BgxyJ8.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n4/n4XUXceOzK3gzQKg0Yb9WM-8GLaKrlEERxF518Xms_A.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oC/oCsZTGZyV4kH8Y4OeSDUdrwfkJFPzTODZjuBKZB8oGQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pH/pHvc6bYKLtA9GnOyAwdBMb2HvRJUv-cGBBeZy2A-Js8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pQ/pQoK49Hl4bSF5SQ4TKClybBt_EWRkffqmCqLhDJLlSs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qm/qmCn2iU2tPJeg0QV3QYriSUlxoprqYFAm_jxVHRxK-c.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qu/qukp51oNpP4gQ4mcNPg8p7zttzOMUFWms2yHWGoZKGs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tP/tPF6H9NRpGO3whu2y5_e_R_1EACKdCwu5437D83qJT0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/w_/w_v89Lo_bpb8aAsrFe9y5cBhNobVJ6MwvJqav7plorY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xU/xU8kTXBeW6eLfp_eNY6xEEideoQNSHIMC9yQ-P1OPO8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y8/y8u-QuBe2neNMwhZPDIz3ZE5FqNjBEux-ttpcsU9Qxc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yh/yhC-Cty2J5UucXyvUWMfhQRgloZBt67FS7bSQpo7MMk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zd/zdeYpARJAH5-6ruhRV2366gVGYJ5TdX23ccaWKWHbYw.cache +0 -0
- data/spec/{dummy/spec/factories → factories}/tickets.rb +1 -1
- data/spec/factories/transaction.rb +6 -0
- metadata +229 -54
- data/app/controllers/punto_pagos_rails/transactions_controller.rb +0 -73
- data/db/migrate/20140928003539_create_punto_pagos_rails_transactions.rb +0 -13
- data/lib/generators/punto_pagos_rails/install/templates/error.html.erb +0 -6
- data/lib/generators/punto_pagos_rails/install/templates/punto_pagos_rails.rb +0 -3
- data/lib/generators/punto_pagos_rails/install/templates/success.html.erb +0 -6
- data/lib/punto_pagos_rails/resource_extension.rb +0 -25
- data/spec/dummy/app/views/punto_pagos_rails/transactions/error.html.erb +0 -6
- data/spec/dummy/app/views/punto_pagos_rails/transactions/success.html.erb +0 -6
- data/spec/dummy/config/initializers/punto_pagos_rails.rb +0 -3
- data/spec/dummy/db/migrate/20141026172011_create_punto_pagos_rails_transactions.punto_pagos_rails.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 766fc75b98ecaeba6d4646dce50a465f01064ba5
|
4
|
+
data.tar.gz: 8fb4e1bde5b72af2bdd901dc6c375cf76ba1a55f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3df6abc3ae84c6d0248e916932919edc7396f74cb5369a71f9dd32d7a72cfcb53912f5bf933b13963342a8604c656a72ee85172bbd01f1228f6e1c9577a8066e
|
7
|
+
data.tar.gz: 49f400e2ece33976b6516d034bc69faf9ed42721ccf9c99409735fa2cbb9eb4411c20c2f61d7bb2b78e8cffe5117edbeb99f3d996e407c37717b345f8f4bc372
|
@@ -4,32 +4,31 @@ module PuntoPagosRails
|
|
4
4
|
class Transaction < ActiveRecord::Base
|
5
5
|
include AASM
|
6
6
|
|
7
|
-
belongs_to :
|
7
|
+
belongs_to :payable, polymorphic: true
|
8
8
|
|
9
|
-
delegate :amount, :
|
9
|
+
delegate :amount, to: :payable
|
10
10
|
|
11
|
-
aasm :
|
12
|
-
state :pending, :
|
11
|
+
aasm column: :state do
|
12
|
+
state :pending, initial: true
|
13
13
|
state :completed
|
14
14
|
state :rejected
|
15
15
|
|
16
16
|
event :complete do
|
17
|
-
transitions :
|
17
|
+
transitions from: :pending, to: :completed
|
18
18
|
end
|
19
19
|
|
20
20
|
event :reject do
|
21
|
-
transitions :
|
21
|
+
transitions from: :pending, to: :rejected
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def reject_with(error)
|
26
26
|
self.error = error
|
27
|
-
|
27
|
+
reject
|
28
28
|
end
|
29
29
|
|
30
30
|
def amount_to_s
|
31
31
|
"%0.2f" % amount.to_i
|
32
32
|
end
|
33
|
-
|
34
33
|
end
|
35
34
|
end
|
data/config/locales/en.yml
CHANGED
@@ -2,9 +2,6 @@ en:
|
|
2
2
|
punto_pagos_rails:
|
3
3
|
success:
|
4
4
|
title: Transaction successfully completed
|
5
|
-
detail: "The %{resource} #%{id} for the amount of $%{amount} was made"
|
6
|
-
error:
|
7
|
-
detail: "The payment for %{resource} #%{id} for the amount of $%{amount} was declined"
|
8
5
|
errors:
|
9
6
|
invalid_puntopagos_response: Invalid PuntoPagos response
|
10
7
|
invalid_returned_puntopagos_token: Invalid returned PuntoPagos token
|
data/config/locales/es.yml
CHANGED
@@ -2,9 +2,6 @@ es:
|
|
2
2
|
punto_pagos_rails:
|
3
3
|
success:
|
4
4
|
title: Transacción completada con éxito
|
5
|
-
detail: "El pago del %{resource} <b>#%{id}</b> por el valor de <b>$%{amount}</b> fue realizado"
|
6
|
-
error:
|
7
|
-
detail: "El pago del %{resource} <b>#%{id}</b> por el valor de <b>$%{amount}</b> no se realizó"
|
8
5
|
errors:
|
9
6
|
invalid_puntopagos_response: No se pudo establecer comunicación con PuntoPagos
|
10
7
|
invalid_returned_puntopagos_token: Token inválido de PuntoPagos
|
data/config/routes.rb
CHANGED
@@ -1,7 +1,2 @@
|
|
1
1
|
PuntoPagosRails::Engine.routes.draw do
|
2
|
-
post "transactions/notification", to: 'transactions#notification'
|
3
|
-
get "transactions/notification/:token", to: 'transactions#notification_no_ssl'
|
4
|
-
get "transactions/error/:token", to: 'transactions#error', as: :transaction_error
|
5
|
-
get "transactions/success/:token", to: 'transactions#success', as: :transaction_success
|
6
|
-
post "transactions/create", to: 'transactions#create', as: :transaction_create
|
7
2
|
end
|
@@ -1,47 +1,13 @@
|
|
1
|
-
class PuntoPagosRails::InstallGenerator < Rails::Generators::
|
1
|
+
class PuntoPagosRails::InstallGenerator < Rails::Generators::Base
|
2
2
|
source_root File.expand_path('../templates', __FILE__)
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
def extend_resource_abilities
|
11
|
-
line = "class #{name.classify} < ActiveRecord::Base"
|
12
|
-
gsub_file "app/models/#{name}.rb", /(#{Regexp.escape(line)})/mi do |match|
|
13
|
-
"#{match}\n include PuntoPagosRails::ResourceExtension\n"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def copy_migrations
|
18
|
-
rake "railties:install:migrations"
|
4
|
+
def create_transactions_table
|
5
|
+
generate("migration create_punto_pagos_rails_transactions")
|
6
|
+
new_migration_path = Dir["#{Rails.application.root}/db/migrate/*.rb"].last
|
7
|
+
template "transactions_migration.rb", new_migration_path, force: true
|
19
8
|
end
|
20
9
|
|
21
10
|
def create_initializer
|
22
11
|
template "puntopagos.yml", "config/puntopagos.yml"
|
23
|
-
template "punto_pagos_rails.rb", "config/initializers/punto_pagos_rails.rb"
|
24
|
-
end
|
25
|
-
|
26
|
-
def mount_routes
|
27
|
-
line = "Rails.application.routes.draw do"
|
28
|
-
gsub_file "config/routes.rb", /(#{Regexp.escape(line)})/mi do |match|
|
29
|
-
"#{match}\n mount PuntoPagosRails::Engine => '/'\n"
|
30
|
-
end
|
31
12
|
end
|
32
|
-
|
33
|
-
def copy_views
|
34
|
-
copy_file "success.html.erb", "app/views/punto_pagos_rails/transactions/success.html.erb"
|
35
|
-
copy_file "error.html.erb", "app/views/punto_pagos_rails/transactions/error.html.erb"
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def add_amount_attribute_to_resources
|
41
|
-
generate "migration add_amount_to_#{name.tableize} amount:integer"
|
42
|
-
end
|
43
|
-
|
44
|
-
def create_resource
|
45
|
-
generate "model #{name.classify} amount:integer --no-fixture"
|
46
|
-
end
|
47
13
|
end
|
@@ -1,13 +1,12 @@
|
|
1
1
|
development:
|
2
|
-
environment: "
|
3
|
-
puntopagos_key: "
|
4
|
-
puntopagos_secret: "
|
2
|
+
environment: <%= ENV["PUNTOPAGOS_ENV"]%>
|
3
|
+
puntopagos_key: <%= ENV["PUNTOPAGOS_KEY"]%>
|
4
|
+
puntopagos_secret: <%= ENV["PUNTOPAGOS_SECRET"]%>
|
5
5
|
test:
|
6
|
-
environment: "
|
7
|
-
puntopagos_key: "
|
8
|
-
puntopagos_secret: "
|
6
|
+
environment: <%= ENV["PUNTOPAGOS_ENV_TEST"]%>
|
7
|
+
puntopagos_key: <%= ENV["PUNTOPAGOS_KEY_TEST"]%>
|
8
|
+
puntopagos_secret: <%= ENV["PUNTOPAGOS_SECRET_TEST"]%>
|
9
9
|
production:
|
10
|
-
environment: "
|
11
|
-
puntopagos_key: "
|
12
|
-
puntopagos_secret: "
|
13
|
-
|
10
|
+
environment: <%= ENV["PUNTOPAGOS_ENV"]%>
|
11
|
+
puntopagos_key: <%= ENV["PUNTOPAGOS_KEY"]%>
|
12
|
+
puntopagos_secret: <%= ENV["PUNTOPAGOS_SECRET"]%>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreatePuntoPagosRailsTransactions < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :punto_pagos_rails_transactions do |t|
|
4
|
+
t.references :payable, polymorphic: true
|
5
|
+
t.string :token
|
6
|
+
t.integer :amount
|
7
|
+
t.string :error
|
8
|
+
t.string :state
|
9
|
+
|
10
|
+
t.timestamps null: false
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index(:punto_pagos_rails_transactions,
|
14
|
+
[:payable_id, :payable_type],
|
15
|
+
name: "index_punto_pagos_rails_transactions_on_payable",
|
16
|
+
unique: true)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
class PuntoPagosRails::PaymentFlowGenerator < Rails::Generators::Base
|
2
|
+
source_root File.expand_path("../templates", __FILE__)
|
3
|
+
|
4
|
+
argument(:payable_model_name, type: :string, required: true, banner: "payable_model_name")
|
5
|
+
argument(:payments_controller_name,
|
6
|
+
banner: "payments_controller_name", type: :string, default: "transactions")
|
7
|
+
|
8
|
+
def create_payable_model
|
9
|
+
Rails.application.eager_load!
|
10
|
+
models = ActiveRecord::Base.descendants.map(&:to_s)
|
11
|
+
models.include?(payable_class) ? add_amount_attribute_to_payable : create_payable
|
12
|
+
end
|
13
|
+
|
14
|
+
def extend_payable_abilities
|
15
|
+
line = "class #{payable_class} < ActiveRecord::Base"
|
16
|
+
gsub_file "app/models/#{payable}.rb", /(#{Regexp.escape(line)})/mi do |match|
|
17
|
+
"#{match}\n include PuntoPagosRails::Payable\n"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_controller
|
22
|
+
template("transactions_controller.rb.erb", controller_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def copy_views
|
26
|
+
copy_file("success.html.erb", "app/views/#{controller_name}/success.html.erb")
|
27
|
+
copy_file("error.html.erb", "app/views/#{controller_name}/error.html.erb")
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_routes
|
31
|
+
line = "Rails.application.routes.draw do"
|
32
|
+
gsub_file "config/routes.rb", /(#{Regexp.escape(line)})/mi do |match|
|
33
|
+
<<-HERE.gsub(/^ {9}/, '')
|
34
|
+
#{match}
|
35
|
+
post "#{controller_name}/notification", to: "#{controller_name}#notification"
|
36
|
+
get "#{controller_name}/error/:token", to: "#{controller_name}#error", as: :#{singular_controller_name}_error
|
37
|
+
get "#{controller_name}/success/:token", to: "#{controller_name}#success", as: :#{singular_controller_name}_success
|
38
|
+
post "#{controller_name}/create", to: "#{controller_name}#create", as: :#{singular_controller_name}_create
|
39
|
+
HERE
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def payable
|
46
|
+
payable_table_name.singularize
|
47
|
+
end
|
48
|
+
|
49
|
+
def payable_table_name
|
50
|
+
payable_model_name.tableize
|
51
|
+
end
|
52
|
+
|
53
|
+
def payable_class
|
54
|
+
payable.classify
|
55
|
+
end
|
56
|
+
|
57
|
+
def controller_path
|
58
|
+
"app/controllers/#{controller_name}_controller.rb"
|
59
|
+
end
|
60
|
+
|
61
|
+
def controller_name
|
62
|
+
payments_controller_name.tableize.pluralize
|
63
|
+
end
|
64
|
+
|
65
|
+
def singular_controller_name
|
66
|
+
controller_name.singularize
|
67
|
+
end
|
68
|
+
|
69
|
+
def controller_class
|
70
|
+
"#{payments_controller_name.classify.pluralize}Controller"
|
71
|
+
end
|
72
|
+
|
73
|
+
def add_amount_attribute_to_payable
|
74
|
+
generate "migration add_amount_to_#{payable_table_name} amount:integer"
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_payable
|
78
|
+
generate "model #{payable} amount:integer --no-fixture"
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class <%= controller_class %> < ApplicationController
|
2
|
+
def create
|
3
|
+
@<%= payable %> = <%= payable_class %>.create!(create_params)
|
4
|
+
srv = PuntoPagosRails::TransactionService.new(@<%= payable %>)
|
5
|
+
|
6
|
+
if srv.create
|
7
|
+
redirect_to(srv.process_url)
|
8
|
+
else
|
9
|
+
render_payment_error_view(srv.error)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def notification
|
14
|
+
response = PuntoPagosRails::TransactionService.notificate(params, request.headers)
|
15
|
+
render(json: response)
|
16
|
+
end
|
17
|
+
|
18
|
+
def success
|
19
|
+
@<%= payable %> = <%= payable %>_by_token
|
20
|
+
end
|
21
|
+
|
22
|
+
def error
|
23
|
+
@<%= payable %> = <%= payable %>_by_token
|
24
|
+
render_payment_error_view(I18n.t("punto_pagos_rails.errors.invalid_puntopagos_payment"))
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def render_payment_error_view(error_message)
|
30
|
+
render("error", locals: { error_message: error_message })
|
31
|
+
end
|
32
|
+
|
33
|
+
def <%= payable %>_by_token
|
34
|
+
@<%= payable %> ||= <%= payable_class %>.by_token(params[:token])
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_params
|
38
|
+
params.require(:<%= payable %>).permit(:amount)
|
39
|
+
end
|
40
|
+
end
|
data/lib/punto_pagos_rails.rb
CHANGED
@@ -1,19 +1,10 @@
|
|
1
1
|
require "punto_pagos_rails/engine"
|
2
|
-
require "punto_pagos_rails/
|
2
|
+
require "punto_pagos_rails/payable"
|
3
3
|
require "punto_pagos_rails/transaction_service"
|
4
4
|
|
5
5
|
module PuntoPagosRails
|
6
6
|
extend self
|
7
7
|
|
8
|
-
attr_accessor :resource_class_name
|
9
|
-
attr_accessor :success_url
|
10
|
-
attr_accessor :error_url
|
11
|
-
|
12
|
-
|
13
|
-
def resource_class
|
14
|
-
resource_class_name.constantize
|
15
|
-
end
|
16
|
-
|
17
8
|
def setup
|
18
9
|
yield self
|
19
10
|
require "puntopagos"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "active_support/concern"
|
2
|
+
|
3
|
+
module PuntoPagosRails
|
4
|
+
module Payable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
has_many :transactions, as: :payable, class_name: "PuntoPagosRails::Transaction"
|
9
|
+
|
10
|
+
def paid?
|
11
|
+
return false unless transactions.any?
|
12
|
+
transactions.last.completed?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def by_token(token)
|
18
|
+
transaction = Transaction.find_by(token: token)
|
19
|
+
transaction.try(:payable)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,18 +1,23 @@
|
|
1
1
|
module PuntoPagosRails
|
2
|
-
class TransactionService
|
2
|
+
class TransactionService
|
3
3
|
attr_accessor :process_url
|
4
|
+
attr_reader :payable
|
4
5
|
|
5
6
|
SUCCESS_CODE = "99"
|
6
7
|
ERROR_CODE = "00"
|
7
8
|
|
9
|
+
def initialize(payable)
|
10
|
+
@payable = payable
|
11
|
+
end
|
12
|
+
|
8
13
|
def create
|
9
|
-
transaction =
|
14
|
+
transaction = payable.transactions.create!
|
10
15
|
|
11
16
|
request = PuntoPagos::Request.new
|
12
17
|
response = request.create(transaction.id.to_s, transaction.amount_to_s, nil)
|
13
18
|
|
14
19
|
if !response.success?
|
15
|
-
|
20
|
+
payable.errors.add :base, I18n.t("punto_pagos_rails.errors.invalid_puntopagos_response")
|
16
21
|
return false
|
17
22
|
end
|
18
23
|
|
@@ -21,81 +26,68 @@ module PuntoPagosRails
|
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
24
|
-
def self.notificate(params, headers)
|
25
|
-
notification = PuntoPagos::Notification.new
|
26
|
-
tken = params[:token]
|
27
|
-
err = params[:error]
|
28
|
-
|
29
|
-
if notification.valid?(headers, params)
|
30
|
-
respond_success(tken)
|
31
|
-
else
|
32
|
-
respond_error(tken, err)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.validate(token, transaction)
|
37
|
-
status = PuntoPagos::Status.new
|
38
|
-
status.check token, transaction.id.to_s, transaction.amount_to_s
|
39
|
-
if status.valid?
|
40
|
-
respond_success(token)
|
41
|
-
else
|
42
|
-
respond_error(token, status.error)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
29
|
def error
|
47
|
-
|
30
|
+
payable.errors.messages[:base].first
|
48
31
|
end
|
49
32
|
|
50
|
-
|
51
|
-
|
52
|
-
def self.processing_transaction(token)
|
53
|
-
transaction = Transaction.find_by_token(token)
|
54
|
-
return unless transaction
|
55
|
-
return unless transaction.pending?
|
56
|
-
transaction
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.respond_success(token)
|
60
|
-
transaction = processing_transaction(token)
|
61
|
-
return if transaction.nil?
|
62
|
-
transaction.resource.run_callbacks :payment_success do
|
63
|
-
transaction.complete
|
64
|
-
transaction.save
|
65
|
-
end
|
66
|
-
{ respuesta: SUCCESS_CODE, token: token }
|
67
|
-
end
|
68
|
-
|
69
|
-
def self.respond_error(token, error)
|
70
|
-
transaction = processing_transaction(token)
|
71
|
-
return if transaction.nil?
|
72
|
-
transaction.resource.run_callbacks :payment_error do
|
73
|
-
transaction.reject_with(error)
|
74
|
-
transaction.save
|
75
|
-
end
|
76
|
-
{ respuesta: ERROR_CODE, error: error, token: token }
|
77
|
-
end
|
33
|
+
private
|
78
34
|
|
79
35
|
def init_transaction(transaction, token)
|
80
36
|
if token.blank?
|
81
|
-
|
37
|
+
payable.errors.add(:base,
|
38
|
+
I18n.t("punto_pagos_rails.errors.invalid_returned_puntopagos_token"))
|
82
39
|
return false
|
83
40
|
end
|
84
41
|
|
85
|
-
if
|
86
|
-
|
42
|
+
if repeated_token?(token)
|
43
|
+
payable.errors.add :base, I18n.t("punto_pagos_rails.errors.repeated_token_given")
|
87
44
|
return false
|
88
45
|
end
|
89
46
|
|
90
|
-
transaction.update!(token: token, amount:
|
47
|
+
transaction.update!(token: token, amount: payable.amount)
|
91
48
|
end
|
92
49
|
|
93
|
-
def
|
50
|
+
def repeated_token?(token)
|
94
51
|
Transaction.where(token: token).any?
|
95
52
|
end
|
96
53
|
|
97
|
-
|
98
|
-
|
54
|
+
class << self
|
55
|
+
def notificate(params, headers)
|
56
|
+
notification = PuntoPagos::Notification.new
|
57
|
+
tken = params[:token]
|
58
|
+
err = params[:error]
|
59
|
+
|
60
|
+
if notification.valid?(headers, params)
|
61
|
+
respond_success(tken)
|
62
|
+
else
|
63
|
+
respond_error(tken, err)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def processing_transaction(token)
|
70
|
+
transaction = Transaction.find_by_token(token)
|
71
|
+
return unless transaction
|
72
|
+
return unless transaction.pending?
|
73
|
+
transaction
|
74
|
+
end
|
75
|
+
|
76
|
+
def respond_success(token)
|
77
|
+
transaction = processing_transaction(token)
|
78
|
+
return if transaction.nil?
|
79
|
+
transaction.complete
|
80
|
+
transaction.save
|
81
|
+
{ respuesta: SUCCESS_CODE, token: token }
|
82
|
+
end
|
83
|
+
|
84
|
+
def respond_error(token, error)
|
85
|
+
transaction = processing_transaction(token)
|
86
|
+
return if transaction.nil?
|
87
|
+
transaction.reject_with(error)
|
88
|
+
transaction.save
|
89
|
+
{ respuesta: ERROR_CODE, error: error, token: token }
|
90
|
+
end
|
99
91
|
end
|
100
92
|
end
|
101
93
|
end
|