diff --git a/app/assets/templates/wallet/transactions.html.erb b/app/assets/templates/wallet/transactions.html.erb index 011005b51..4bd4b35ea 100644 --- a/app/assets/templates/wallet/transactions.html.erb +++ b/app/assets/templates/wallet/transactions.html.erb @@ -10,16 +10,19 @@ - {{ t.created_at | amDateFormat:'L' }} + {{ ::t.created_at | amDateFormat:'L' }} {{ 'credit' }} {{ 'debit' }} + + {{::t.invoice.reference}} + - {{ t.user.full_name }} + {{ ::t.user.full_name }} + - - {{ t.amount | currency }} + {{ ::t.amount | currency }} diff --git a/app/controllers/api/wallet_controller.rb b/app/controllers/api/wallet_controller.rb index 9753bf63d..5ff142155 100644 --- a/app/controllers/api/wallet_controller.rb +++ b/app/controllers/api/wallet_controller.rb @@ -10,7 +10,7 @@ class API::WalletController < API::ApiController def transactions @wallet = Wallet.find(params[:id]) authorize @wallet - @wallet_transactions = @wallet.wallet_transactions.includes(:transactable, user: [:profile]).order(created_at: :desc) + @wallet_transactions = @wallet.wallet_transactions.includes(:invoice, user: [:profile]).order(created_at: :desc) end def credit diff --git a/app/models/invoice.rb b/app/models/invoice.rb index 301ac0cba..839f0c5e8 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -7,6 +7,7 @@ class Invoice < ActiveRecord::Base has_many :invoice_items, dependent: :destroy accepts_nested_attributes_for :invoice_items belongs_to :user + belongs_to :wallet_transaction has_one :avoir, class_name: 'Invoice', foreign_key: :invoice_id, dependent: :destroy diff --git a/app/models/reservation.rb b/app/models/reservation.rb index bcadc12fd..f3af73157 100644 --- a/app/models/reservation.rb +++ b/app/models/reservation.rb @@ -364,8 +364,10 @@ class Reservation < ActiveRecord::Base def debit_user_wallet if @wallet_amount_debit.present? and @wallet_amount_debit != 0 amount = @wallet_amount_debit / 100.0 - WalletService.new(user: user, wallet: user.wallet).debit(amount, self) - self.invoice.update_columns(wallet_amount: @wallet_amount_debit) if !user.invoicing_disabled? + wallet_transaction = WalletService.new(user: user, wallet: user.wallet).debit(amount, self) + if !user.invoicing_disabled? and wallet_transaction + self.invoice.update_columns(wallet_amount: @wallet_amount_debit, wallet_transaction_id: wallet_transaction.id) + end end end end diff --git a/app/models/subscription.rb b/app/models/subscription.rb index 0a25d5a21..9ea2a2110 100644 --- a/app/models/subscription.rb +++ b/app/models/subscription.rb @@ -48,7 +48,11 @@ class Subscription < ActiveRecord::Base if invoice invoc = generate_invoice(stp_invoice.id) # debit wallet - invoc.wallet_amount = @wallet_amount_debit if debit_user_wallet + wallet_transaction = debit_user_wallet + if wallet_transaction + invoc.wallet_amount = @wallet_amount_debit + invoc.wallet_transaction_id = wallet_transaction.id + end invoc.save end # cancel subscription after create @@ -101,7 +105,11 @@ class Subscription < ActiveRecord::Base if invoice invoc = generate_invoice # debit wallet - invoc.wallet_amount = @wallet_amount_debit if debit_user_wallet + wallet_transaction = debit_user_wallet + if wallet_transaction + invoc.wallet_amount = @wallet_amount_debit + invoc.wallet_transaction_id = wallet_transaction.id + end invoc.save end return true @@ -243,7 +251,7 @@ class Subscription < ActiveRecord::Base def debit_user_wallet if @wallet_amount_debit.present? and @wallet_amount_debit != 0 amount = @wallet_amount_debit / 100.0 - WalletService.new(user: user, wallet: user.wallet).debit(amount, self) + return WalletService.new(user: user, wallet: user.wallet).debit(amount, self) end end end diff --git a/app/models/wallet_transaction.rb b/app/models/wallet_transaction.rb index 21c70eef4..0de5feb3b 100644 --- a/app/models/wallet_transaction.rb +++ b/app/models/wallet_transaction.rb @@ -5,6 +5,7 @@ class WalletTransaction < ActiveRecord::Base belongs_to :wallet belongs_to :reservation belongs_to :transactable, polymorphic: true + has_one :invoice validates_inclusion_of :transaction_type, in: %w( credit debit ) validates :user, :wallet, presence: true diff --git a/app/views/api/wallet/transactions.json.jbuilder b/app/views/api/wallet/transactions.json.jbuilder index 050cb137f..14a484915 100644 --- a/app/views/api/wallet/transactions.json.jbuilder +++ b/app/views/api/wallet/transactions.json.jbuilder @@ -4,9 +4,8 @@ json.array!(@wallet_transactions) do |t| json.id t.user.id json.full_name t.user.profile.full_name end - json.transactable do - if t.transactable_type == 'Reservation' - json.reservable_type t.transactable.reservable_type - end - end if t.transactable + json.invoice do + json.id t.invoice.id + json.reference t.invoice.reference + end if t.invoice end diff --git a/db/migrate/20160720124355_add_wallet_transaction_to_invoice.rb b/db/migrate/20160720124355_add_wallet_transaction_to_invoice.rb new file mode 100644 index 000000000..b0fdac46d --- /dev/null +++ b/db/migrate/20160720124355_add_wallet_transaction_to_invoice.rb @@ -0,0 +1,5 @@ +class AddWalletTransactionToInvoice < ActiveRecord::Migration + def change + add_reference :invoices, :wallet_transaction, index: true, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 63222c2c7..a66af403b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160718165434) do +ActiveRecord::Schema.define(version: 20160720124355) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -221,10 +221,12 @@ ActiveRecord::Schema.define(version: 20160718165434) do t.boolean "subscription_to_expire" t.text "description" t.integer "wallet_amount" + t.integer "wallet_transaction_id" end add_index "invoices", ["invoice_id"], name: "index_invoices_on_invoice_id", using: :btree add_index "invoices", ["user_id"], name: "index_invoices_on_user_id", using: :btree + add_index "invoices", ["wallet_transaction_id"], name: "index_invoices_on_wallet_transaction_id", using: :btree create_table "licences", force: :cascade do |t| t.string "name", limit: 255, null: false @@ -737,6 +739,7 @@ ActiveRecord::Schema.define(version: 20160718165434) do add_foreign_key "availability_tags", "tags" add_foreign_key "events_event_themes", "event_themes" add_foreign_key "events_event_themes", "events" + add_foreign_key "invoices", "wallet_transactions" add_foreign_key "o_auth2_mappings", "o_auth2_providers" add_foreign_key "open_api_calls_count_tracings", "open_api_clients" add_foreign_key "prices", "groups" diff --git a/test/integration/reservations/create_as_admin_test.rb b/test/integration/reservations/create_as_admin_test.rb index af3e59243..6e5589371 100644 --- a/test/integration/reservations/create_as_admin_test.rb +++ b/test/integration/reservations/create_as_admin_test.rb @@ -283,6 +283,7 @@ module Reservations assert_equal transaction.transaction_type, 'debit' assert_equal transaction.amount, 10 assert_equal transaction.amount, invoice.wallet_amount / 100.0 + assert_equal transaction.id, invoice.wallet_transaction_id end test "user without subscription and with invoicing disabled reserves a machine and pay wallet with success" do diff --git a/test/integration/subscriptions/create_as_user_test.rb b/test/integration/subscriptions/create_as_user_test.rb index 1d3907438..f9c8d32fc 100644 --- a/test/integration/subscriptions/create_as_user_test.rb +++ b/test/integration/subscriptions/create_as_user_test.rb @@ -141,5 +141,6 @@ class Subscriptions::CreateAsUserTest < ActionDispatch::IntegrationTest assert_equal transaction.transaction_type, 'debit' assert_equal transaction.amount, 10 assert_equal transaction.amount, invoice.wallet_amount / 100.0 + assert_equal transaction.id, invoice.wallet_transaction_id end end