2 # This file is part of SMR.
4 # SMR is free software: you can redistribute it and/or modify it under the
5 # terms of the GNU General Public License as published by the Free Software
6 # Foundation, either version 3 of the License, or (at your option) any later
9 # SMR is distributed in the hope that it will be useful, but WITHOUT ANY
10 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License along with
14 # SMR. If not, see <http://www.gnu.org/licenses/>.
18 # handles CRUD on Security records
19 class Objects::SecurityController < ObjectsController
22 # List all Security records for editing.
25 session[:objects_security_query] = params[:q] if params[:q]
27 @query = Security.ransack(session[:objects_security_query])
28 @securities, @total_pages = smr_paginate(
30 @query.result.includes(:Organization).to_a
32 @organizations = Organization.all.order(:name).to_a
33 @select_securities = smr_securities_list
37 # defines empty Security to #create a new one
42 @security = Security.new(:symbol=>params[:symbol])
43 @security.id_organization = session[:objects_security_organization] if session[:objects_security_organization]
45 begin @security.fetch_metadata
46 rescue ActiveRecord::RecordInvalid => errors
47 flash[:alert] = errors.to_s
50 else @security = Security.new end
55 # retrieve Security for editing
56 # - NOTE: disabled @quote_retrieval_status because it hinders fluent
61 @security = Security.find(params[:id])
66 # handles creates and updates
70 if params[:security][:id].to_i > 0 then
71 security = Security.find(params[:security][:id])
72 security.update(security_params)
73 else security = Security.create(security_params) end
75 if params[:security_use_type] then
76 security.create_type(params[:security_use_type])
79 if params[:security_stock]
80 if params[:security_stock][:id].to_i > 0 then
81 st = SecurityStock.find(params[:security_stock][:id])
82 st.update(security_stock_params)
83 else st = SecurityStock.create(security_stock_params) end
84 security.id_security_stock = st.id
85 n << st.errors.full_messages.uniq
88 if params[:security_bond]
89 if params[:security_bond][:id].to_i > 0 then
90 st = SecurityBond.find(params[:security_bond][:id])
91 st.update(security_bond_params)
92 else st = SecurityBond.create(security_bond_params) end
93 security.id_security_bond = st.id
94 n << st.errors.full_messages.uniq
97 if params[:security_fund]
98 if params[:security_fund][:id].to_i > 0 then
99 st = SecurityFund.find(params[:security_fund][:id])
100 st.update(security_fund_params)
101 else st = SecurityFund.create(security_fund_params) end
102 security.id_security_fund = st.id
103 n << st.errors.full_messages.uniq
106 if params[:security_metal]
107 if params[:security_metal][:id].to_i > 0 then
108 st = SecurityMetal.find(params[:security_metal][:id])
109 st.update(security_metal_params)
110 else st = SecurityMetal.create(security_metal_params) end
111 security.id_security_metal = st.id
112 n << st.errors.full_messages.uniq
115 if params[:security_derivative]
116 if params[:security_derivative][:id].to_i > 0 then
117 st = SecurityDerivative.find(params[:security_derivative][:id])
118 st.update(security_derivative_params)
119 else st = SecurityDerivative.create(security_derivative_params) end
120 security.id_security_derivative = st.id
121 n << st.errors.full_messages.uniq
124 if params[:security_index]
125 if params[:security_index][:id].to_i > 0 then
126 st = SecurityIndex.find(params[:security_index][:id])
127 st.update(security_index_params)
128 else st = SecurityIndex.create(security_index_params) end
129 security.id_security_index = st.id
130 n << st.errors.full_messages.uniq
134 n << security.errors.full_messages.uniq
136 redirect_to objects_security_index_path, :notice=>n.flatten.join(', ')
140 # delete Security unless (!) important data is related to it
141 # - basically delete is not possible if a Position exist (of any user)
142 # - also "observations" block it, ie. a assigned Document or FigureData
143 # - see the model to know what else is important
144 # - unimportant records such as Quote will be removed along
146 s = Security.find(params[:id])
148 rescue ActiveRecord::DeleteRestrictionError => errors
149 flash[:alert] = errors.to_s
152 redirect_to :action=>:index
158 # internal helper defining parameters acceptable for Security create/update
160 params.require(:security).permit(
162 :preferred_reaper, :preferred_reaper_locked,
163 :id_organization, :url, :brief, :description, :fetch_quote,
164 :collateral_coverage_ratio,
169 # internal helper defining parameters acceptable for Security Type model create/update
170 def security_stock_params
171 params.require(:security_stock).permit(
172 :dividend, :time_dividend_exdate, :dividend_interval, :type, :comment
176 def security_bond_params
177 params.require(:security_bond).permit(
178 :type, :currency, :denomination, :is_subordinated, :is_callable, :is_stepup, :is_stepdown,
179 :coupon, :coupon_interval, :interest_method, :time_first_coupon, :time_last_coupon,
180 :time_maturity, :redemption_price, :redemption_installments, :redemption_interval,
185 def security_fund_params
186 params.require(:security_fund).permit(
187 :type, :currency, :tranche, :time_inception, :time_fiscalyearend, :investment_minimum, :is_synthetic,
188 :distribution, :time_distribution, :distribution_interval, :is_retaining_profits,
189 :issue_surcharge, :management_fee, :redemption_fee, :redemption_period,
194 def security_metal_params
195 params.require(:security_metal).permit(
196 :type, :unit, :comment
200 def security_derivative_params
201 params.require(:security_derivative).permit(
202 :type, :direction, :id_security_underlying, :time_inception, :time_end,
203 :strike_price, :subscription_ratio, :is_leveraged, :is_dead, :comment
207 def security_index_params
208 params.require(:security_index).permit(