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.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/punto_pagos_rails/transaction.rb +7 -8
  3. data/config/locales/en.yml +0 -3
  4. data/config/locales/es.yml +0 -3
  5. data/config/routes.rb +0 -5
  6. data/lib/generators/punto_pagos_rails/install/USAGE +2 -5
  7. data/lib/generators/punto_pagos_rails/install/install_generator.rb +5 -39
  8. data/lib/generators/punto_pagos_rails/install/templates/puntopagos.yml +9 -10
  9. data/lib/generators/punto_pagos_rails/install/templates/transactions_migration.rb +18 -0
  10. data/lib/generators/punto_pagos_rails/payment_flow/USAGE +5 -0
  11. data/lib/generators/punto_pagos_rails/payment_flow/payment_flow_generator.rb +80 -0
  12. data/lib/generators/punto_pagos_rails/payment_flow/templates/error.html.erb +5 -0
  13. data/lib/generators/punto_pagos_rails/payment_flow/templates/success.html.erb +5 -0
  14. data/lib/generators/punto_pagos_rails/payment_flow/templates/transactions_controller.rb.erb +40 -0
  15. data/lib/punto_pagos_rails.rb +1 -10
  16. data/lib/punto_pagos_rails/engine.rb +1 -1
  17. data/lib/punto_pagos_rails/payable.rb +23 -0
  18. data/lib/punto_pagos_rails/transaction_service.rb +53 -61
  19. data/lib/punto_pagos_rails/version.rb +1 -1
  20. data/spec/dummy/app/controllers/home_controller.rb +0 -1
  21. data/spec/dummy/app/controllers/transactions_controller.rb +40 -0
  22. data/spec/dummy/app/models/ticket.rb +1 -19
  23. data/spec/dummy/app/views/home/index.html.erb +3 -2
  24. data/spec/dummy/app/views/transactions/error.html.erb +6 -0
  25. data/spec/dummy/app/views/transactions/success.html.erb +6 -0
  26. data/spec/dummy/config/environments/test.rb +1 -1
  27. data/spec/dummy/config/puntopagos.yml +9 -9
  28. data/spec/dummy/config/routes.rb +4 -2
  29. data/spec/dummy/db/development.sqlite3 +0 -0
  30. data/spec/dummy/db/migrate/20141026172010_create_tickets.rb +1 -1
  31. data/spec/dummy/db/migrate/20160605212231_create_punto_pagos_rails_transactions.rb +18 -0
  32. data/spec/dummy/db/schema.rb +11 -8
  33. data/spec/dummy/db/test.sqlite3 +0 -0
  34. data/spec/dummy/log/development.log +809 -0
  35. data/spec/dummy/log/test.log +31272 -0
  36. data/spec/dummy/spec/controllers/transactions_controller_spec.rb +88 -0
  37. data/spec/dummy/spec/lib/punto_pagos_rails/transaction_service_spec.rb +6 -60
  38. data/spec/dummy/spec/models/punto_pagos_rails/transaction_spec.rb +3 -3
  39. data/spec/dummy/spec/models/ticket_spec.rb +2 -2
  40. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3Fw4ZqAHNcyjp32NvDuTNl_UqelVnkm1oFk6m8TeecE.cache +1 -0
  41. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/3_/3_b-g2v_V_5gxPdo0uhVAPJZLSsCkSSaJFpHHHnZ6F4.cache +0 -0
  42. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/5X/5XQR5pxibZfdEuTpakchl9HyBfhnPIGcUuB7zJON788.cache +1 -0
  43. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/5bSj5g83MbQ9DKsPwLU9twrU7yvLq6dYmmH-HEs29O8.cache +0 -0
  44. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/6X/6X_ukW43EGeNCQiNv8Ocr70mO25LldjeBozF4UiIz50.cache +0 -0
  45. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/7q/7qi1bAa7jI04pIaFgMGEMDgWNCI-Q7diVLAm3btoA84.cache +1 -0
  46. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/CduZWIah5G8fpSjD5QO6TFJXr_9TFOHxCbC1Gy8qZxA.cache +1 -0
  47. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/EN/EN1sgFDBtOLV_nTM5QCygjXFjJjrCwASL91R_jbxJqo.cache +1 -0
  48. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Ee/EeKGFrz9PyEmN_5oeyYYGsl3_g2AHxfLBpYXIlZ9qEo.cache +0 -0
  49. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Fv8tnOEJ_LEgSDbDEuTuiPLB-eEYIhxUwZsDBbio46w.cache +3 -0
  50. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/J5/J54BxjKsqhvXfShEaZNnH6dfnLMS0zoVH5mgbz0DK7Y.cache +0 -0
  51. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/J8/J88DZaT-14iePrHbjUeroRM6XiHxwmMw7k38S1nwR5g.cache +1 -0
  52. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/MdPfZAJEELkc6iJn6XlCxHSkYdgQ_wgGW950s4axvcs.cache +0 -0
  53. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/O8/O8akbUwAbmIKY-AhITimq-JDQ6IgsO3Hvq2v5etufFw.cache +2 -0
  54. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Pkh2wBkC6wpkIuR8EXAg7elsBHnTjVINP97B71GAyhE.cache +0 -0
  55. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/Rm/Rmkvmvnp04uG1YyAWhY8BHBd--6SqqV8mNPXCkmCucs.cache +1 -0
  56. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/VgFPEFaNzkUqN75RTiy1JzWIXg87PGB93hDXsTqxyB8.cache +0 -0
  57. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XfKoGAu1QFs7NV03JWa4QQtoTQSkqlJZx05IkDCP3PM.cache +2 -0
  58. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/XyFO2KxykoEaX_adyCFw667OfGArrYXTOYXJ9b0PgOo.cache +0 -0
  59. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/a_dtAAwExwuAXpiGsCZKz3W46CsW_KVxNTRFOdoaKzg.cache +0 -0
  60. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/esq8UjWY8tb8I8CizPRT_shPmdQKJYyr2DN19n2klo4.cache +1 -0
  61. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/hj/hj8Ir9wcVSy1KYrnWu9bpD24vDhCG3tvt-nKbNxb1Wg.cache +3 -0
  62. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/k7noXdZau3gX1CJSriYJIBcNHPwc3318AUHIWCHXKhg.cache +2 -0
  63. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/kn/knvCbDNyQEDreqWUaqRkfTor_EXoGTzPbMdMwdIBJlU.cache +0 -0
  64. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/oC/oCsZTGZyV4kH8Y4OeSDUdrwfkJFPzTODZjuBKZB8oGQ.cache +2 -0
  65. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/ogxRgAPyiZ-Nu3IjkBEw9ruI1Knjq_YU6HyWixUrg7g.cache +1 -0
  66. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/om/omKjrYUgD72M_fYBz1rlfZYic0JVNLXPKY8BGn43I5w.cache +1 -0
  67. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/r0gbTq2v9cKQuG206qQxGolfvjBYw3POwlACk7b41Rg.cache +1 -0
  68. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/rorzxYMlgwKrzjSt_2tNP0StT9Q3pelAqgmVf3YA9SY.cache +3 -0
  69. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/sM/sMuWOI50W0n-l80Pew5AJTy2B4tY5K8RuLjbeB7jQp0.cache +0 -0
  70. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/t78LfYaGJpEOdllJ9lsrnLCKTCSkoSJWU17iCNcvy94.cache +1 -0
  71. data/spec/dummy/tmp/cache/assets/development/sprockets/v3.0/tP/tPF6H9NRpGO3whu2y5_e_R_1EACKdCwu5437D83qJT0.cache +3 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-X/-XTIyQr6h6v7T797GfFzdxqCpKSZOqemHQqHEHYUItM.cache +0 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1j/1jUXrYbF7jVcJvYHZHNALKbMrXby0qIkxLwN8tMjdl4.cache +1 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/35/35wQlbi0EDG73ZKIiHHpphoZJZUu58POM42B-3-_YX0.cache +0 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3_/3_b-g2v_V_5gxPdo0uhVAPJZLSsCkSSaJFpHHHnZ6F4.cache +0 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5c/5cJuB5GT-GVCPeIQQKexe51JarYx5Zm4Kp5nky33tn8.cache +0 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6O/6OwNk80Fc8hd4f__QxpOLC_qYWFA-uI_iRugkIWqvIQ.cache +0 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6X/6X_ukW43EGeNCQiNv8Ocr70mO25LldjeBozF4UiIz50.cache +0 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7b/7bjowlWzolEF985bac_6I5v3HWZiFJRoa-nqHtn-OXY.cache +1 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7i/7io2gyVCCR83Rk6ocF1HUvam1FLz4-Q1MRk6A10JM0M.cache +1 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7q/7qnRlg2H1sxfHtaPIpNmoVimW9VFj-yqT0iPzyTT_K4.cache +0 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8Y/8Yb56gIA7T5L10wvHz-fWkKSn254pSN73L7VKYH1Rjg.cache +0 -0
  83. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/96/962nogFuXwCsVtC50UP3FjcEJxWutj384ciKyDgI2cU.cache +0 -0
  84. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9X/9XlM_JtRmY5gbMkK5gueswD7s_ctcOLacU5VYno5ymw.cache +1 -0
  85. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AL/AL6PBU18v_L-23J6RrXIF6BAiPpCRKl0psIsbveU4lA.cache +0 -0
  86. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AP/AP0_3b5N2aJWVyyANhjLMP7qdpczG_C1lo6AtzELoyU.cache +0 -0
  87. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EN/EN1sgFDBtOLV_nTM5QCygjXFjJjrCwASL91R_jbxJqo.cache +1 -0
  88. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EN/eNStu73G536x1iNq9tePGM6hv5Xa6-5ZsXtfJuiDtfE.cache +1 -0
  89. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fi/FiuTIVrQEp_PZDI6AFR7KQkoUtnCXkFVKyr2aSzCINI.cache +1 -0
  90. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HG/HGWuC1XP4qTav8SMCTMvqubfgC1g-BXJH6zXci4WaI8.cache +0 -0
  91. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LK/LK5DwcQTCssBt2sSq8waYL_2OW6zUuLZoRK4vXkUbx0.cache +1 -0
  92. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LO/LOIw_QrLu6EqRv2po1AhlmvJ5T0AcIZuJV0rK15RRx0.cache +2 -0
  93. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MT/MTvVhODKf8qABXyyCrbfCfpCTIA5KjS3WxBpMCXHKRU.cache +0 -0
  94. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/NR/NRsBMlnlc4XT7crH9pvz4ygo-ZR4AgiGeRMZQPavCxM.cache +0 -0
  95. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/O8/O8akbUwAbmIKY-AhITimq-JDQ6IgsO3Hvq2v5etufFw.cache +0 -0
  96. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PS/PSM535pl0G8ic1fKKJ0rkGdwrgW8b8OITOW47jl2t1g.cache +1 -0
  97. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R4/R4lZxKQXv7q9xqB-H6AKh5-KeSELCFkMP12qMQ6dMLI.cache +1 -0
  98. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rm/Rmkvmvnp04uG1YyAWhY8BHBd--6SqqV8mNPXCkmCucs.cache +1 -0
  99. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ro/RofByYcbsjOYAjsoyMoH5z1COA5fQ80RZoqB_YRLa84.cache +0 -0
  100. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rv/Rv0mdxEdzMSxJjrULhpSoGWLCDhlnkqCy48ujNWsXcw.cache +0 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SX/SX0FzvVXLoVzYDZN95Hikfe-1VExx8LZgZh4bam53yE.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ui/Ui4eBSjoI421Dzo1z47yeUqcwD-oL_xNCuU_GZ2qh5Y.cache +0 -0
  103. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V6/V6ShJgOfSo2QDO2zt0zlU1dNhHNG52w6gJbrqt3xnls.cache +0 -0
  104. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VR/VRC0qpQ2CiJgNEMvtXOvEDluwkaoomyJeAm7Unfrcr0.cache +1 -0
  105. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VY/VYpuh0Ag6L55xqqNJ1mGLQVvGlNNH50DN6HApLtiRSk.cache +0 -0
  106. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X7/X7YQ6EHE68K2fFs0F2XPWazA8x8qVSZuaaYjKvgRj7w.cache +0 -0
  107. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_l/_lYTKdS6o8FBFea0eYn8eIwjaExcmX5d2ukNTLvrE-c.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bz/bzN6Qn7mi2daF9JkWWFmcv8yPYyWuLQOwlOUre3D-Vg.cache +1 -0
  109. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ct/ctDRUdbKV5LoS0RdmDmOALjaV_onM7pOxr9_otXO9Gk.cache +1 -0
  110. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/es/esYVHbG7qL7AKN3EPN_UFicQM3c0WTcTjqjDGibdz-Y.cache +0 -0
  111. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hj/hj8Ir9wcVSy1KYrnWu9bpD24vDhCG3tvt-nKbNxb1Wg.cache +0 -0
  112. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iN/iNm88b30nwQF3isi7fjLhZ2910IcuCKNax81fzqHsxY.cache +1 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jU/jUktWNbR4V7n34UAZe7uJpmEofhflF0bVtIO2BgxyJ8.cache +2 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n4/n4XUXceOzK3gzQKg0Yb9WM-8GLaKrlEERxF518Xms_A.cache +1 -0
  115. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oC/oCsZTGZyV4kH8Y4OeSDUdrwfkJFPzTODZjuBKZB8oGQ.cache +0 -0
  116. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pH/pHvc6bYKLtA9GnOyAwdBMb2HvRJUv-cGBBeZy2A-Js8.cache +1 -0
  117. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pQ/pQoK49Hl4bSF5SQ4TKClybBt_EWRkffqmCqLhDJLlSs.cache +1 -0
  118. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qm/qmCn2iU2tPJeg0QV3QYriSUlxoprqYFAm_jxVHRxK-c.cache +0 -0
  119. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qu/qukp51oNpP4gQ4mcNPg8p7zttzOMUFWms2yHWGoZKGs.cache +0 -0
  120. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tP/tPF6H9NRpGO3whu2y5_e_R_1EACKdCwu5437D83qJT0.cache +0 -0
  121. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/w_/w_v89Lo_bpb8aAsrFe9y5cBhNobVJ6MwvJqav7plorY.cache +1 -0
  122. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xU/xU8kTXBeW6eLfp_eNY6xEEideoQNSHIMC9yQ-P1OPO8.cache +1 -0
  123. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y8/y8u-QuBe2neNMwhZPDIz3ZE5FqNjBEux-ttpcsU9Qxc.cache +0 -0
  124. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yh/yhC-Cty2J5UucXyvUWMfhQRgloZBt67FS7bSQpo7MMk.cache +1 -0
  125. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zd/zdeYpARJAH5-6ruhRV2366gVGYJ5TdX23ccaWKWHbYw.cache +0 -0
  126. data/spec/{dummy/spec/factories → factories}/tickets.rb +1 -1
  127. data/spec/factories/transaction.rb +6 -0
  128. metadata +229 -54
  129. data/app/controllers/punto_pagos_rails/transactions_controller.rb +0 -73
  130. data/db/migrate/20140928003539_create_punto_pagos_rails_transactions.rb +0 -13
  131. data/lib/generators/punto_pagos_rails/install/templates/error.html.erb +0 -6
  132. data/lib/generators/punto_pagos_rails/install/templates/punto_pagos_rails.rb +0 -3
  133. data/lib/generators/punto_pagos_rails/install/templates/success.html.erb +0 -6
  134. data/lib/punto_pagos_rails/resource_extension.rb +0 -25
  135. data/spec/dummy/app/views/punto_pagos_rails/transactions/error.html.erb +0 -6
  136. data/spec/dummy/app/views/punto_pagos_rails/transactions/success.html.erb +0 -6
  137. data/spec/dummy/config/initializers/punto_pagos_rails.rb +0 -3
  138. 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: 38ee4d459254a4db352d99772377056e970256bd
4
- data.tar.gz: cb7cb0328bec57a0d1372a3bd63f1a8afc024937
3
+ metadata.gz: 766fc75b98ecaeba6d4646dce50a465f01064ba5
4
+ data.tar.gz: 8fb4e1bde5b72af2bdd901dc6c375cf76ba1a55f
5
5
  SHA512:
6
- metadata.gz: d0a4dbd040088c855bb2bb90d124cdcfa6f1f4955aa99a7a6ad17faaaa884bc29310bb75a885e80d434e235667c2ee221549e801becca94623a0313ca1c19207
7
- data.tar.gz: 25c12ef1d73c0553186b23d97a20594b0952d6fbaa232064a6b1374a870746d7167c4a55dca5e96209f20984bdb0c32c21887f5f67a5c9878c420b8f855a2356
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 :resource, class_name: PuntoPagosRails.resource_class_name
7
+ belongs_to :payable, polymorphic: true
8
8
 
9
- delegate :amount, :to => :resource
9
+ delegate :amount, to: :payable
10
10
 
11
- aasm :column => :state do
12
- state :pending, :initial => true
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 :from => :pending, :to => :completed
17
+ transitions from: :pending, to: :completed
18
18
  end
19
19
 
20
20
  event :reject do
21
- transitions :from => :pending, :to => :rejected
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
- self.reject
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
@@ -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
@@ -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,8 +1,5 @@
1
1
  Description:
2
- Explain the generator
2
+ Install PuntoPagosRails gem
3
3
 
4
4
  Example:
5
- rails generate punto_pagos_rails:install ResourceModel
6
-
7
- This will create:
8
- what/will/it/create
5
+ rails generate punto_pagos_rails:install
@@ -1,47 +1,13 @@
1
- class PuntoPagosRails::InstallGenerator < Rails::Generators::NamedBase
1
+ class PuntoPagosRails::InstallGenerator < Rails::Generators::Base
2
2
  source_root File.expand_path('../templates', __FILE__)
3
3
 
4
- def create_resource_model
5
- Rails.application.eager_load!
6
- models = ActiveRecord::Base.descendants.map(&:to_s)
7
- models.include?(name.classify) ? add_amount_attribute_to_resources : create_resource
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: "sandbox"
3
- puntopagos_key: "YOUR-API-KEY"
4
- puntopagos_secret: "YOUR-APP-SECRET"
2
+ environment: <%= ENV["PUNTOPAGOS_ENV"]%>
3
+ puntopagos_key: <%= ENV["PUNTOPAGOS_KEY"]%>
4
+ puntopagos_secret: <%= ENV["PUNTOPAGOS_SECRET"]%>
5
5
  test:
6
- environment: "sandbox"
7
- puntopagos_key: "YOUR-API-KEY"
8
- puntopagos_secret: "YOUR-APP-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: "production"
11
- puntopagos_key: "YOUR-API-KEY"
12
- puntopagos_secret: "YOUR-APP-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,5 @@
1
+ Description:
2
+ Add payment flow
3
+
4
+ Example:
5
+ rails generate punto_pagos_rails:payment_flow ticket payments
@@ -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,5 @@
1
+ <div class="puntopagos">
2
+ <div class="view error">
3
+ <h2><%= error_message %></h2>
4
+ </div>
5
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="puntopagos">
2
+ <div class="view success">
3
+ <h2><%= t("punto_pagos_rails.success.title") %></h2>
4
+ </div>
5
+ </div>
@@ -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
@@ -1,19 +1,10 @@
1
1
  require "punto_pagos_rails/engine"
2
- require "punto_pagos_rails/resource_extension"
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"
@@ -4,7 +4,7 @@ module PuntoPagosRails
4
4
 
5
5
  config.generators do |g|
6
6
  g.test_framework :rspec
7
- g.fixture_replacement :factory_girl, :dir => 'spec/factories'
7
+ g.fixture_replacement :factory_girl, dir: "spec/factories"
8
8
  end
9
9
  end
10
10
  end
@@ -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 < Struct.new(:resource_id)
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 = resource.transactions.create!
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
- resource.errors.add :base, I18n.t("punto_pagos_rails.errors.invalid_puntopagos_response")
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
- resource.errors.messages[:base].first
30
+ payable.errors.messages[:base].first
48
31
  end
49
32
 
50
- private
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
- resource.errors.add :base, I18n.t("punto_pagos_rails.errors.invalid_returned_puntopagos_token")
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 token_repeated?(token)
86
- resource.errors.add :base, I18n.t("punto_pagos_rails.errors.repeated_token_given")
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: resource.amount)
47
+ transaction.update!(token: token, amount: payable.amount)
91
48
  end
92
49
 
93
- def token_repeated?(token)
50
+ def repeated_token?(token)
94
51
  Transaction.where(token: token).any?
95
52
  end
96
53
 
97
- def resource
98
- @resource ||= PuntoPagosRails.resource_class.find(resource_id)
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