adapt financial transaction type for online payment provider
This commit is contained in:
parent
c59eefd219
commit
2ef17ceca4
10 changed files with 66 additions and 25 deletions
|
@ -50,11 +50,7 @@ class Finance::FinancialTransactionsController < ApplicationController
|
||||||
def create
|
def create
|
||||||
@financial_transaction = FinancialTransaction.new(params[:financial_transaction])
|
@financial_transaction = FinancialTransaction.new(params[:financial_transaction])
|
||||||
@financial_transaction.user = current_user
|
@financial_transaction.user = current_user
|
||||||
if @financial_transaction.ordergroup
|
@financial_transaction.save!
|
||||||
@financial_transaction.add_transaction!
|
|
||||||
else
|
|
||||||
@financial_transaction.save!
|
|
||||||
end
|
|
||||||
redirect_to finance_group_transactions_path(@ordergroup),
|
redirect_to finance_group_transactions_path(@ordergroup),
|
||||||
notice: I18n.t('finance.financial_transactions.controller.create.notice')
|
notice: I18n.t('finance.financial_transactions.controller.create.notice')
|
||||||
rescue ActiveRecord::RecordInvalid => e
|
rescue ActiveRecord::RecordInvalid => e
|
||||||
|
|
|
@ -14,7 +14,7 @@ class Finance::OrdergroupsController < Finance::BaseController
|
||||||
@ordergroups = @ordergroups.page(params[:page]).per(@per_page)
|
@ordergroups = @ordergroups.page(params[:page]).per(@per_page)
|
||||||
|
|
||||||
@total_balances = FinancialTransactionClass.sorted.each_with_object({}) do |c, tmp|
|
@total_balances = FinancialTransactionClass.sorted.each_with_object({}) do |c, tmp|
|
||||||
tmp[c.id] = c.financial_transactions.reduce(0) { |sum, t| sum + t.amount }
|
tmp[c.id] = c.financial_transactions.reduce(0) { |sum, t| sum + (t.amount || 0) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,9 +11,11 @@ class FinancialTransaction < ApplicationRecord
|
||||||
belongs_to :reverts, optional: true, class_name: 'FinancialTransaction'
|
belongs_to :reverts, optional: true, class_name: 'FinancialTransaction'
|
||||||
has_one :reverted_by, class_name: 'FinancialTransaction', foreign_key: 'reverts_id'
|
has_one :reverted_by, class_name: 'FinancialTransaction', foreign_key: 'reverts_id'
|
||||||
|
|
||||||
validates :amount, :note, :user_id, presence: true
|
validates :note, :user_id, presence: true
|
||||||
validates :amount, numericality: { greater_then: -100_000,
|
validates :amount, numericality: { greater_then: -100_000,
|
||||||
less_than: 100_000 }
|
less_than: 100_000 },
|
||||||
|
allow_nil: -> { payment_amount.present? }
|
||||||
|
validates :payment_amount, :payment_fee, allow_nil: true, numericality: { greater_then: 0, less_than: 100_000 }
|
||||||
|
|
||||||
scope :visible, lambda {
|
scope :visible, lambda {
|
||||||
joins('LEFT JOIN financial_transactions r ON financial_transactions.id = r.reverts_id').where('r.id IS NULL').where(reverts: nil)
|
joins('LEFT JOIN financial_transactions r ON financial_transactions.id = r.reverts_id').where('r.id IS NULL').where(reverts: nil)
|
||||||
|
@ -23,6 +25,8 @@ class FinancialTransaction < ApplicationRecord
|
||||||
|
|
||||||
localize_input_of :amount
|
localize_input_of :amount
|
||||||
|
|
||||||
|
after_save :update_ordergroup_balance
|
||||||
|
|
||||||
after_initialize do
|
after_initialize do
|
||||||
initialize_financial_transaction_type
|
initialize_financial_transaction_type
|
||||||
end
|
end
|
||||||
|
@ -38,16 +42,11 @@ class FinancialTransaction < ApplicationRecord
|
||||||
%w[] # none, and certainly not user until we've secured that more
|
%w[] # none, and certainly not user until we've secured that more
|
||||||
end
|
end
|
||||||
|
|
||||||
# Use this save method instead of simple save and after callback
|
|
||||||
def add_transaction!
|
|
||||||
ordergroup.add_financial_transaction! amount, note, user, financial_transaction_type
|
|
||||||
end
|
|
||||||
|
|
||||||
def revert!(user)
|
def revert!(user)
|
||||||
transaction do
|
transaction do
|
||||||
update_attribute :financial_link, FinancialLink.new
|
update_attribute :financial_link, FinancialLink.new
|
||||||
rt = dup
|
rt = dup
|
||||||
rt.amount = -rt.amount
|
rt.amount = rt.amount ? -rt.amount : nil
|
||||||
rt.reverts = self
|
rt.reverts = self
|
||||||
rt.user = user
|
rt.user = user
|
||||||
rt.save!
|
rt.save!
|
||||||
|
@ -73,4 +72,12 @@ class FinancialTransaction < ApplicationRecord
|
||||||
def initialize_financial_transaction_type
|
def initialize_financial_transaction_type
|
||||||
self.financial_transaction_type ||= FinancialTransactionType.default
|
self.financial_transaction_type ||= FinancialTransactionType.default
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def update_ordergroup_balance
|
||||||
|
# @todo Make sure this transaction and the ordergroup update is in one database transaction.
|
||||||
|
# It may be possible to use an around filter if needed.
|
||||||
|
ordergroup.update_balance!
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -91,14 +91,12 @@ class Ordergroup < Group
|
||||||
t.save!
|
t.save!
|
||||||
update_balance!
|
update_balance!
|
||||||
# Notify only when order group had a positive balance before the last transaction:
|
# Notify only when order group had a positive balance before the last transaction:
|
||||||
if t.amount < 0 && account_balance < 0 && account_balance - t.amount >= 0
|
NotifyNegativeBalanceJob.perform_later(self, t) if t.amount < 0 && account_balance < 0 && account_balance - t.amount >= 0
|
||||||
NotifyNegativeBalanceJob.perform_later(self,
|
|
||||||
t)
|
|
||||||
end
|
|
||||||
t
|
t
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Recomputes job statistics from group orders.
|
||||||
def update_stats!
|
def update_stats!
|
||||||
# Get hours for every job of each user in period
|
# Get hours for every job of each user in period
|
||||||
jobs = users.to_a.sum { |u| u.tasks.done.where('updated_on > ?', APPLE_MONTH_AGO.month.ago).sum(:duration) }
|
jobs = users.to_a.sum { |u| u.tasks.done.where('updated_on > ?', APPLE_MONTH_AGO.month.ago).sum(:duration) }
|
||||||
|
@ -156,7 +154,7 @@ class Ordergroup < Group
|
||||||
end
|
end
|
||||||
|
|
||||||
def account_updated
|
def account_updated
|
||||||
financial_transactions.last.try(:created_on) || created_on
|
financial_transactions.last.try(:updated_on) || created_on
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.sort_by_param(param)
|
def self.sort_by_param(param)
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
= t.note
|
= t.note
|
||||||
- FinancialTransactionClass.sorted.each do |c|
|
- FinancialTransactionClass.sorted.each do |c|
|
||||||
%td.numeric{style: 'width:5em'}
|
%td.numeric{style: 'width:5em'}
|
||||||
- if t.financial_transaction_type.financial_transaction_class == c
|
- if t.financial_transaction_type.financial_transaction_class == c && t.amount
|
||||||
= format_currency t.amount
|
= format_currency t.amount
|
||||||
- if with_hidden
|
- if with_hidden
|
||||||
%td.actions{style: 'width:1em'}
|
%td.actions{style: 'width:1em'}
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
%td= format_date(ft.created_on)
|
%td= format_date(ft.created_on)
|
||||||
%td= ft.ordergroup_name
|
%td= ft.ordergroup_name
|
||||||
%td= ft.note
|
%td= ft.note
|
||||||
%td.numeric= format_currency ft.amount
|
%td.numeric= ft.amount ? format_currency(ft.amount) : '-'
|
||||||
.span6
|
.span6
|
||||||
%h2
|
%h2
|
||||||
= t('.open_transactions')
|
= t('.open_transactions')
|
||||||
|
|
|
@ -63,6 +63,7 @@
|
||||||
= link_to my_ordergroup_path do
|
= link_to my_ordergroup_path do
|
||||||
= t '.my_ordergroup.transactions.view'
|
= t '.my_ordergroup.transactions.view'
|
||||||
%i.icon.icon-chevron-right
|
%i.icon.icon-chevron-right
|
||||||
|
- '<dashboard_ordergroup_mark>'
|
||||||
%table.table.table-striped
|
%table.table.table-striped
|
||||||
%tr
|
%tr
|
||||||
%th= heading_helper FinancialTransaction, :created_on
|
%th= heading_helper FinancialTransaction, :created_on
|
||||||
|
@ -83,7 +84,7 @@
|
||||||
- FinancialTransactionClass.sorted.each do |fc|
|
- FinancialTransactionClass.sorted.each do |fc|
|
||||||
%td.numeric{style: 'width:5em'}
|
%td.numeric{style: 'width:5em'}
|
||||||
- if ft.financial_transaction_type.financial_transaction_class == fc
|
- if ft.financial_transaction_type.financial_transaction_class == fc
|
||||||
= format_currency ft.amount
|
= ft.amount ? format_currency(ft.amount) : '-'
|
||||||
|
|
||||||
-# placeholder deface to add content using erb[silent]:contains()
|
-# placeholder deface to add content using erb[silent]:contains()
|
||||||
- '<dashboard_bottom_mark>'
|
- '<dashboard_bottom_mark>'
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
= @ordergroup.memberships.map{|m| show_user m.user}.join(', ')
|
= @ordergroup.memberships.map{|m| show_user m.user}.join(', ')
|
||||||
- unless FoodsoftConfig[:disable_invite]
|
- unless FoodsoftConfig[:disable_invite]
|
||||||
= link_to t('.invite'), new_invite_path(:id => @ordergroup), :remote => true, class: 'btn btn-primary'
|
= link_to t('.invite'), new_invite_path(:id => @ordergroup), :remote => true, class: 'btn btn-primary'
|
||||||
|
- '<home_ordergroup_well_mark>'
|
||||||
.span8
|
.span8
|
||||||
%h2= t('.account_summary')
|
%h2= t('.account_summary')
|
||||||
.well.well-small
|
.well.well-small
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
class AddPaymentToFinancialTransaction < ActiveRecord::Migration[7.0]
|
||||||
|
def change
|
||||||
|
reversible do |dir|
|
||||||
|
dir.up do
|
||||||
|
change_column :financial_transactions, :amount, :decimal, :precision => 8, :scale => 2, :default => nil, :null => true
|
||||||
|
end
|
||||||
|
dir.down do
|
||||||
|
change_column :financial_transactions, :amount, :decimal, :precision => 8, :scale => 2, :default => 0, :null => false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
add_column :financial_transactions, :updated_on, :timestamp
|
||||||
|
add_column :financial_transactions, :payment_method, :string
|
||||||
|
add_column :financial_transactions, :payment_plugin, :string
|
||||||
|
add_column :financial_transactions, :payment_id, :string
|
||||||
|
add_column :financial_transactions, :payment_amount, :decimal, :precision => 8, :scale => 3
|
||||||
|
add_column :financial_transactions, :payment_currency, :string
|
||||||
|
add_column :financial_transactions, :payment_state, :string
|
||||||
|
add_column :financial_transactions, :payment_fee, :decimal, :precision => 8, :scale => 3
|
||||||
|
add_column :financial_transactions, :payment_acct_number, :string
|
||||||
|
add_column :financial_transactions, :payment_acct_name, :string
|
||||||
|
add_column :financial_transactions, :payment_info, :text
|
||||||
|
|
||||||
|
add_index :financial_transactions, [:payment_plugin, :payment_id]
|
||||||
|
end
|
||||||
|
end
|
16
db/schema.rb
16
db/schema.rb
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.0].define(version: 2023_02_15_085312) do
|
ActiveRecord::Schema[7.0].define(version: 2023_09_15_093041) do
|
||||||
create_table "action_text_rich_texts", charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
|
create_table "action_text_rich_texts", charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
t.text "body", size: :long
|
t.text "body", size: :long
|
||||||
|
@ -159,7 +159,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_02_15_085312) do
|
||||||
|
|
||||||
create_table "financial_transactions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
|
create_table "financial_transactions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_general_ci", force: :cascade do |t|
|
||||||
t.integer "ordergroup_id"
|
t.integer "ordergroup_id"
|
||||||
t.decimal "amount", precision: 8, scale: 2, default: "0.0", null: false
|
t.decimal "amount", precision: 8, scale: 2
|
||||||
t.text "note", null: false
|
t.text "note", null: false
|
||||||
t.integer "user_id", default: 0, null: false
|
t.integer "user_id", default: 0, null: false
|
||||||
t.datetime "created_on", precision: nil, null: false
|
t.datetime "created_on", precision: nil, null: false
|
||||||
|
@ -167,7 +167,19 @@ ActiveRecord::Schema[7.0].define(version: 2023_02_15_085312) do
|
||||||
t.integer "financial_link_id"
|
t.integer "financial_link_id"
|
||||||
t.integer "reverts_id"
|
t.integer "reverts_id"
|
||||||
t.integer "group_order_id"
|
t.integer "group_order_id"
|
||||||
|
t.timestamp "updated_on"
|
||||||
|
t.string "payment_method"
|
||||||
|
t.string "payment_plugin"
|
||||||
|
t.string "payment_id"
|
||||||
|
t.decimal "payment_amount", precision: 8, scale: 3
|
||||||
|
t.string "payment_currency"
|
||||||
|
t.string "payment_state"
|
||||||
|
t.decimal "payment_fee", precision: 8, scale: 3
|
||||||
|
t.string "payment_acct_number"
|
||||||
|
t.string "payment_acct_name"
|
||||||
|
t.text "payment_info"
|
||||||
t.index ["ordergroup_id"], name: "index_financial_transactions_on_ordergroup_id"
|
t.index ["ordergroup_id"], name: "index_financial_transactions_on_ordergroup_id"
|
||||||
|
t.index ["payment_plugin", "payment_id"], name: "index_financial_transactions_on_payment_plugin_and_payment_id"
|
||||||
t.index ["reverts_id"], name: "index_financial_transactions_on_reverts_id", unique: true
|
t.index ["reverts_id"], name: "index_financial_transactions_on_reverts_id", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue