Updated Gems, improved quote retrieval
[smr.git] / gui / app / controllers / objects / security_controller.rb
blob8d0e987095c251b9f54409497b928733c955a02c
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
7 # version.
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
21     ##
22     # List all Security records for editing.
23     def index
24         super
25         session[:objects_security_query] = params[:q] if params[:q]
27         @query = Security.ransack(session[:objects_security_query])
28         @securities, @total_pages = smr_paginate(
29             @page=smr_page,
30             @query.result.includes(:Organization).to_a
31         )
32         @organizations = Organization.all.order(:name).to_a
33         @select_securities = smr_securities_list
34     end
36     ##
37     # defines empty Security to #create a new one
38     def new
39         self.index
41         if params[:symbol]
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
48                 @security = false
49             end
50         else @security = Security.new end
51         render :index
52     end
54     ##
55     # retrieve Security for editing
56     # - NOTE: disabled @quote_retrieval_status because it hinders fluent
57     # security editing
58     def edit
59         self.index
61         @security = Security.find(params[:id])
62         render :index
63     end
65     ##
66     # handles creates and updates
67     def create
68         n = Array.new
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])
77         end
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
86         end
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
95         end
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
104         end
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
113         end
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
122         end
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
131         end
133         security.save
134         n << security.errors.full_messages.uniq
136         redirect_to objects_security_index_path, :notice=>n.flatten.join(', ')
137     end
139     ##
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
145     def destroy
146         s = Security.find(params[:id])
147         begin s.destroy
148         rescue ActiveRecord::DeleteRestrictionError => errors
149             flash[:alert] = errors.to_s
150         end
152         redirect_to :action=>:index
153     end
155  protected
157     ##
158     # internal helper defining parameters acceptable for Security create/update
159     def security_params
160         params.require(:security).permit(
161           :symbol,
162           :preferred_reaper, :preferred_reaper_locked,
163           :id_organization, :url, :brief, :description, :fetch_quote,
164           :collateral_coverage_ratio,
165         )
166     end
168     ##
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
173         )
174     end
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,
181           :comment
182         )
183     end
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,
190           :comment
191         )
192     end
194     def security_metal_params
195         params.require(:security_metal).permit(
196           :type, :unit, :comment
197         )
198     end
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
204         )
205     end
207     def security_index_params
208         params.require(:security_index).permit(
209           :comment
210         )
211     end