iron_warbler 2.0.7.19 → 2.0.7.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascript/iron_warbler/application.js +2 -0
  3. data/app/assets/javascript/iron_warbler/gameui.js +9 -0
  4. data/app/assets/stylesheets/iron_warbler/application.css +13 -3
  5. data/app/assets/stylesheets/iron_warbler/positions.scss +24 -5
  6. data/app/assets/stylesheets/iron_warbler/purses_gameui.scss +214 -0
  7. data/app/assets/stylesheets/iron_warbler/purses_gameui.scss-bk +112 -0
  8. data/app/assets/stylesheets/iron_warbler/utils.scss +81 -0
  9. data/app/controllers/iro/api/stocks_controller.rb +87 -0
  10. data/app/controllers/iro/api_controller.rb +19 -0
  11. data/app/controllers/iro/positions_controller.rb +35 -4
  12. data/app/controllers/iro/purses_controller.rb +11 -4
  13. data/app/controllers/iro/strategies_controller.rb +7 -7
  14. data/app/helpers/iro/application_helper.rb +5 -2
  15. data/app/jobs/tda_job.rb +14 -0
  16. data/app/models/iro/datapoint.rb +48 -8
  17. data/app/models/iro/position.rb +55 -14
  18. data/app/models/iro/price_item.rb +51 -1
  19. data/app/models/iro/purse.rb +4 -0
  20. data/app/models/iro/stock.rb +5 -2
  21. data/app/models/iro/strategy.rb +84 -10
  22. data/app/models/iro/trash/position_covered_call.rb +4 -0
  23. data/app/models/iro/trash/position_debit_spread.rb +251 -0
  24. data/app/models/tda/option.rb +7 -7
  25. data/app/views/iro/_main_header.haml +18 -17
  26. data/app/views/iro/api/stocks/show.jbuilder +11 -0
  27. data/app/views/iro/positions/_form.haml +11 -38
  28. data/app/views/iro/positions/_formpart_4data.haml +46 -0
  29. data/app/views/iro/positions/_gameui_covered_call.haml +44 -0
  30. data/app/views/iro/positions/_gameui_covered_call.haml-bk +59 -0
  31. data/app/views/iro/positions/_gameui_long_debit_call_spread.haml +37 -0
  32. data/app/views/iro/positions/_gameui_short_debit_put_spread.haml +39 -0
  33. data/app/views/iro/positions/_header.haml +6 -0
  34. data/app/views/iro/positions/_header_covered_call.haml +6 -0
  35. data/app/views/iro/positions/_header_long_debit_call_spread.haml +14 -0
  36. data/app/views/iro/positions/_header_short_debit_put_spread.haml +1 -0
  37. data/app/views/iro/positions/_table.haml +120 -123
  38. data/app/views/iro/positions/roll.haml +83 -0
  39. data/app/views/iro/positions/trash/_header_short_debit_put_spread.haml +9 -0
  40. data/app/views/iro/purses/_form.haml +1 -0
  41. data/app/views/iro/purses/_form_extra_fields.haml +14 -0
  42. data/app/views/iro/purses/_header.haml +22 -0
  43. data/app/views/iro/purses/gameui.haml +19 -0
  44. data/app/views/iro/purses/gameui.haml-bk +44 -0
  45. data/app/views/iro/purses/gameui.haml-bk2 +89 -0
  46. data/app/views/iro/purses/show.haml +1 -7
  47. data/app/views/iro/stocks/_grid_is_long.haml +16 -0
  48. data/app/views/iro/stocks/_grid_is_short.haml +16 -0
  49. data/app/views/iro/strategies/_form.haml +12 -5
  50. data/app/views/iro/strategies/_show.haml +3 -2
  51. data/app/views/iro/strategies/_table.haml +16 -10
  52. data/app/views/iro/strategies/index.haml +8 -0
  53. data/app/views/layouts/iro/application.haml +1 -1
  54. data/config/routes.rb +15 -1
  55. data/lib/iro/engine.rb +2 -0
  56. data/lib/tasks/db_tasks.rake +9 -3
  57. metadata +31 -8
  58. data/app/assets/stylesheets/iron_warbler/alerts.css +0 -8
  59. data/app/assets/stylesheets/iron_warbler/datapoints.css +0 -0
  60. data/app/assets/stylesheets/iron_warbler/profiles.css +0 -4
  61. data/app/assets/stylesheets/iron_warbler/strategies.scss +0 -0
  62. data/app/assets/stylesheets/iron_warbler/utils.css +0 -44
  63. data/app/jobs/iro/application_job.rb-trash +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3323961dddbc46a423f2f913a487c0944d1a39c88ace9517f42b02eb7e4951a9
4
- data.tar.gz: 2f28158b88fe50b7d190c5151da808819c816de9abf773c70063e39b8ed6a8da
3
+ metadata.gz: fabfbb9bdc5c7cceac9b4cf0e3fdb5513c89f199502f5731b2f4d423e96a90d0
4
+ data.tar.gz: b182eba8faab8d64b7c75826ab2b5c7328e6fa4123201f334238e9d981293992
5
5
  SHA512:
6
- metadata.gz: 509add67004fa9cda9757fc71bd3319db109acb0cb981a4ac265dc5777f39680bbcfb265a0685f357b0b073604087df756c084b98d333f0c21616d535d205a62
7
- data.tar.gz: f1b24ce8505853cbc1723b5117ff3a3c79f85bf793f2f8aa00f7bdd4d57ae47e2a9014f0739920609595c16376b2b7c2e0b4a1c13822f4477455fec68aa55d74
6
+ metadata.gz: c33a21b2c7c4587088b9eccf288075ccb1bcd6ec3bb62e87deeed5b9f28ba1fa1f875e37bda0e875ae8d74af9907c1dd2232bbad7bd45b70cc7ca96106d98f6c
7
+ data.tar.gz: 6e38e2f1815f67c5afa4936c3604cc668b79a15c1f7541f1ff5196344e8fd022acb1457ecf7524935e726186202c7162b9626dded867bfe48b75a2dae038fe9a
@@ -1,3 +1,5 @@
1
1
 
2
+ //= require ./gameui
3
+
2
4
  // console.log('Loaded iron_warbler/application.js')
3
5
 
@@ -0,0 +1,9 @@
1
+
2
+ $(function() {
3
+
4
+ const tmp = $('.purses-gameuiW').attr('data-margin-left')
5
+ logg(tmp, 'tmp')
6
+
7
+ $('.purses-gameuiW').scrollLeft( tmp );
8
+
9
+ }); // END
@@ -12,8 +12,18 @@
12
12
  *
13
13
  *= require_tree .
14
14
  *= require_self
15
- */
15
+ **/
16
16
 
17
- body {
18
- colod: red !important;
17
+ html {
18
+ --iro-color-long: lightseagreen;
19
+ --iro-color-short: orange;
20
+
21
+ --iro-color-grid1: #ccc;
22
+ --iro-color-grid2: #999;
23
+ --iro-color-bg1: #efefef;
24
+ --iro-color-bg2: #fefefe;
19
25
  }
26
+
27
+ /* body {
28
+ color: red !important;
29
+ } */
@@ -1,4 +1,9 @@
1
1
 
2
+ .positions--header {
3
+ position: relative;
4
+ z-index: 1;
5
+ }
6
+
2
7
  .positions--table {
3
8
 
4
9
  table {
@@ -15,17 +20,12 @@
15
20
  border: 1px solid red;
16
21
 
17
22
  > * {
18
- border: 1px solid yellow;
19
- // background: #ddd;
20
-
21
23
  transform-origin: 0 0;
22
24
  rotate: -40deg;
23
25
 
24
26
  padding: .4em 0;
25
27
  width: 120px;
26
-
27
28
  }
28
-
29
29
  }
30
30
 
31
31
  th.begin_price {
@@ -43,5 +43,24 @@
43
43
  th.next_symbol {
44
44
  width: 120px;
45
45
  }
46
+
47
+ tr.is_long {
48
+ border-left: 5px solid var(--iro-color-long);
49
+ }
50
+ tr.is_short {
51
+ border-left: 5px solid var(--iro-color-short);
52
+ }
53
+
54
+ tr.covered_call {
55
+ .begin-outer-price,
56
+ .end-outer-price,
57
+ .max-gainp,
58
+ .max-loss,
59
+ .outer-strike,
60
+ ._ {
61
+ display: none;
62
+ }
63
+ }
64
+
46
65
  }
47
66
  }
@@ -0,0 +1,214 @@
1
+
2
+ .purses-gameuiW {
3
+ border: 1px solid red;
4
+ width: 100%;
5
+ overflow: scroll;
6
+ }
7
+
8
+ .purses-gameui {
9
+
10
+ .Origin::before {
11
+ position: absolute;
12
+ top: -1em;
13
+ content: "";
14
+ margin-left: -1em;
15
+ border: 1em solid transparent;
16
+ border-top: 1em solid black;
17
+ }
18
+ .Origin {
19
+ position: absolute;
20
+ top: 0;
21
+ // background: rgba(255,255,0, 0.5);
22
+ height: 100%;
23
+ width: 100%;
24
+
25
+ > .label {
26
+ width: 300px;
27
+
28
+ position: absolute;
29
+ top: -1.5em;
30
+ left: 1.2em;
31
+ z-index: 2;
32
+ }
33
+ }
34
+ .PositionW {
35
+ top: 0;
36
+ border: 2px solid black;
37
+ background: rgba(0,255,255, 0.25);
38
+ position: absolute;
39
+ height: 100%;
40
+ }
41
+ .reviewing {
42
+ .PositionW {
43
+ border-radius: 10px 10px 0 0;
44
+ height: 90%;
45
+ }
46
+ }
47
+
48
+ .Position {
49
+ position: absolute;
50
+ background: rgba(0,255,255, 0.25);
51
+ width: 100%;
52
+ height: 90%;
53
+
54
+ left: 0;
55
+ top: 0;
56
+ }
57
+ /* only for covered calls */
58
+ .PositionC {
59
+ background: rgba(255,153,51, 0.5);
60
+ position: absolute;
61
+
62
+ /* HEREHERE: either left, or right 0, this orange strip flips. */
63
+ // left: 0;
64
+ right: 0;
65
+
66
+ width: 10000px;
67
+ height: 100%;
68
+ }
69
+
70
+ .MaxGain,
71
+ .Breakeven {
72
+ position: absolute;
73
+ right: 0;
74
+ bottom: -10%;
75
+ border: 2px solid green;
76
+ background: rgba(0,255,0, 0.5);
77
+ height: 10%;
78
+ }
79
+
80
+ .sprite {
81
+ position: absolute;
82
+ }
83
+ .sprite-bottom {
84
+ bottom: 0;
85
+ }
86
+
87
+ .StockCoordinatesW {
88
+ // width: 500px;
89
+
90
+ // background: var(--iro-color-bg2);
91
+ // border: 1px solid red;
92
+ margin-bottom: 2em;
93
+
94
+ position: relative;
95
+
96
+ z-index: 1;
97
+ }
98
+ .StockCoordinates {
99
+ border-left: 1px solid var(--iro-color-grid1);
100
+ border-bottom: 1px solid var(--iro-color-grid1);
101
+
102
+ margin-left: 50%;
103
+ margin-bottom: 0em;
104
+
105
+ position: relative;
106
+
107
+ .Last {
108
+ border-left: 2px dotted red;
109
+ }
110
+ .label {
111
+ width: 200px;
112
+ color: gray;
113
+ // border: 1px solid cyan;
114
+ }
115
+
116
+ .marker {
117
+ position: absolute;
118
+ height: 100%;
119
+ }
120
+
121
+ .Net {
122
+ position: absolute;
123
+ // bottom: 3em;
124
+ // z-index: 3;
125
+ height: 90%;
126
+
127
+ // border-bottom: 5px solid red;
128
+ .label {
129
+ color: white;
130
+ text-shadow: 1px 1px black;
131
+ }
132
+ }
133
+ .NetPositive {
134
+ border: 2px dashed #339966;
135
+ background: rgba(32,64,96, 0.5);
136
+ }
137
+ .NetNegative {
138
+ background: rgba(255,0,0, 0.75);
139
+ }
140
+
141
+
142
+ // .grid-mark:nth-child(4n + 1) {
143
+ // border: 1px solid red;
144
+ // display: none;
145
+ // }
146
+ // .grid-mark:nth-child(4n) {
147
+ // border: 1px solid red;
148
+ // display: none;
149
+ // }
150
+ // .grid-mark:nth-child(6n + 1) {
151
+ // border: 1px solid red;
152
+ // display: none;
153
+ // }
154
+ // .grid-mark:nth-child(6n) {
155
+ // border: 1px solid red;
156
+ // display: none;
157
+ // }
158
+ // .grid-mark:nth-child(3n + 1) {
159
+ // border: 1px solid red;
160
+ // display: none;
161
+ // }
162
+ // .grid-mark:nth-child(3n) {
163
+ // border: 1px solid red;
164
+ // display: none;
165
+ // }
166
+
167
+ .grid-mark {
168
+ // border: 1px solid red;
169
+
170
+ height: 100%;
171
+ position: absolute;
172
+ top: 0;
173
+ width: 100px;
174
+ z-index: -2;
175
+ border-left: 1px dashed var(--iro-color-grid1);
176
+
177
+ .label::before {
178
+ content: "";
179
+ position: absolute;
180
+ left: -1em;
181
+ width: 1em;
182
+ height: 1em;
183
+ border: 1em solid transparent;
184
+ border-left-color: white;
185
+ }
186
+ .label {
187
+
188
+ // border: 1px solid red;
189
+
190
+ transform: rotate(-45deg);
191
+ transform-origin: center left;
192
+
193
+ font-size: 0.8em;
194
+
195
+ position: absolute;
196
+ height: 1em;
197
+ line-height: 1em;
198
+ bottom: -0em;
199
+ z-index: -2;
200
+ width: 0;
201
+
202
+ .labelC {
203
+ background: white;
204
+ position: absolute;
205
+ top: 1.5em;
206
+ left: -1.5em;
207
+ }
208
+ }
209
+ }
210
+
211
+
212
+ }
213
+
214
+ }
@@ -0,0 +1,112 @@
1
+
2
+ .purses-gameui {
3
+
4
+
5
+ .Origin::before {
6
+ content: "";
7
+ margin-left: -1em;
8
+ border: 1em solid transparent;
9
+ border-top: 1em solid black;
10
+ }
11
+ .Origin {
12
+ position: absolute;
13
+ top: 0;
14
+ left: calc( 50% );
15
+ // z-index: -2;
16
+ }
17
+ .sprite {
18
+ position: absolute;
19
+ }
20
+ .sprite-bottom {
21
+ bottom: 0;
22
+ }
23
+
24
+ .CoordinatesW {
25
+ // width: 500px;
26
+
27
+ background: var(--iro-color-bg2);
28
+ border: 1px solid red;
29
+ margin-bottom: 3em;
30
+
31
+ position: relative;
32
+
33
+ z-index: 1;
34
+ }
35
+ .Coordinates {
36
+ border-left: 1px solid var(--iro-color-grid1);
37
+ border-bottom: 1px solid var(--iro-color-grid1);
38
+
39
+ background: yellow;
40
+
41
+ height: 100px;
42
+
43
+ margin-left: 50%;
44
+
45
+ position: relative;
46
+
47
+ .Breakeven {
48
+ // background: cyan;
49
+ border-right: 2px solid lightblue;
50
+
51
+ .half-circle {
52
+ width: 100%;
53
+ height: 100%; /* as the half of the width */
54
+ background-color: lightblue;
55
+ border-top-left-radius: 100%; /* 100px of height + 10px of border */
56
+ border-top-right-radius: 100%; /* 100px of height + 10px of border */
57
+ // border: 10px solid gray;
58
+ // border-bottom: 0;
59
+ }
60
+ }
61
+
62
+ .Last {
63
+ border-left: 2px dotted red;
64
+ }
65
+ .label {
66
+ width: 200px;
67
+ color: gray;
68
+ }
69
+
70
+ .marker {
71
+ position: absolute;
72
+ height: 100%;
73
+ }
74
+
75
+ .Net {
76
+
77
+ position: absolute;
78
+ bottom: 3em;
79
+ z-index: 3;
80
+
81
+ background: #339966;
82
+ // border-bottom: 5px solid red;
83
+ .label {
84
+ color: white;
85
+ }
86
+ }
87
+
88
+ .grid-mark {
89
+ height: 100%;
90
+ position: absolute;
91
+ top: 0;
92
+ width: 100px;
93
+ z-index: 1;
94
+ border-left: 1px dashed var(--iro-color-grid1);
95
+
96
+ .label {
97
+ position: absolute;
98
+ bottom: -1em;
99
+ z-index: 0;
100
+ }
101
+ }
102
+ .mark0 {
103
+ .label {
104
+ bottom: -2em;
105
+ }
106
+ }
107
+
108
+
109
+
110
+ }
111
+
112
+ }
@@ -0,0 +1,81 @@
1
+
2
+
3
+
4
+ // .long-or-short::before {
5
+ // // content: '[LONG]';
6
+ // }
7
+ .long-or-short-item,
8
+ .long-or-short-container .is_long,
9
+ .long-or-short-container .is_short {
10
+ display: flex;
11
+ flex-direction: column;
12
+ }
13
+
14
+ .long-or-short-container .is_long,
15
+ .is_long .long-or-short-item {
16
+ border-left: 3px solid var(--iro-color-long);
17
+ padding-left: 5px;
18
+ }
19
+ .long-or-short-container .is_short,
20
+ .is_short .long-or-short-item {
21
+ border-left: 3px solid var(--iro-color-short);
22
+ padding-left: 5px;
23
+ }
24
+
25
+ .is_short .long-or-short-item::before {
26
+ // content: '[SHORT]';
27
+ }
28
+ .is_short .long-or-short-item,
29
+ .long-or-short-container .is_short {
30
+ flex-direction: column-reverse;
31
+ }
32
+
33
+ /* F */
34
+
35
+ .flex-row {
36
+ display: flex;
37
+ margin-bottom: 0.4em;
38
+ }
39
+
40
+ .floaty-collapse {
41
+ float: left;
42
+ z-index: 5;
43
+ position: relative;
44
+ background: white;
45
+ }
46
+ .field {
47
+ min-width: 100px;
48
+ margin-right: 1em;
49
+ }
50
+
51
+ /* H */
52
+
53
+ /* M */
54
+
55
+ .modal-absolute {
56
+ border: 1px solid green;
57
+ border-radius: 5px;
58
+ box-shadow: 2px 2px;
59
+
60
+ padding: 0.5em;
61
+
62
+ position: absolute;
63
+
64
+ min-width: 200px;
65
+ width: 400px;
66
+
67
+ min-height: 200px;
68
+ height: 300px;
69
+ /* overflow: auto; */
70
+
71
+ background: white;
72
+
73
+ z-index: 2;
74
+
75
+ }
76
+
77
+
78
+
79
+ /* W */
80
+
81
+
@@ -0,0 +1,87 @@
1
+
2
+ class Iro::Api::StocksController < Iro::ApiController
3
+ before_action :set_stock, only: [:show, :edit, :update, :destroy]
4
+
5
+ def index
6
+ authorize! :index, Iro::Stock
7
+
8
+ respond_to do |format|
9
+ format.json do
10
+ render
11
+ end
12
+ end
13
+ end
14
+
15
+ def show
16
+ authorize! :show, @stock
17
+ end_on = Time.now.to_date.in_time_zone('UTC')
18
+
19
+ begin_on = params[:begin_on].to_date.in_time_zone('UTC') if params[:begin_on]
20
+ end_on = params[:end_on].to_date.in_time_zone('UTC') if params[:end_on]
21
+
22
+ case params[:period]
23
+ when '1-mo'
24
+ begin_on = ( Time.now - 30.days ).to_date.in_time_zone('UTC')
25
+ # end_on = Time.now.to_date.in_time_zone('UTC')
26
+ when '3-mo'
27
+ begin_on = ( Time.now - 90.days ).to_date.in_time_zone('UTC')
28
+ # end_on = Time.now.to_date.in_time_zone('UTC')
29
+ when '1-yr'
30
+ begin_on = ( Time.now - 1.year ).to_date.in_time_zone('UTC')
31
+ # end_on = Time.now.to_date.in_time_zone('UTC')
32
+ end
33
+
34
+ @datapoints = Iro::Datapoint.where({
35
+ :quote_at.gte => begin_on,
36
+ :quote_at.lte => end_on,
37
+ symbol: params[:ticker],
38
+ }).order_by({ quote_at: :asc })
39
+ end
40
+
41
+ def new
42
+ @stock = Iro::Stock.new
43
+ authorize! :new, @stock
44
+ end
45
+
46
+ def edit
47
+ end
48
+
49
+ def create
50
+ @stock = Iro::Stock.new(stock_params)
51
+ authorize! :create, @stock
52
+
53
+ if @stock.save
54
+ flash_notice @stock
55
+ else
56
+ flash_alert @stock
57
+ end
58
+ redirect_to action: :index
59
+ end
60
+
61
+ def update
62
+ @stock = Iro::Stock.find params[:id]
63
+ authorize! :update, @stock
64
+ if @stock.update(stock_params)
65
+ flash_notice @stock
66
+ else
67
+ flash_alert @stock
68
+ end
69
+ redirect_to request.referrer
70
+ end
71
+
72
+ def destroy
73
+ @stock.destroy
74
+ redirect_to stocks_url, notice: 'Stock was successfully destroyed.'
75
+ end
76
+
77
+ ##
78
+ ## private
79
+ ##
80
+ private
81
+
82
+ def set_stock
83
+ @stock = Iro::Stock.find_by({ ticker: params[:ticker] })
84
+ end
85
+
86
+ end
87
+
@@ -0,0 +1,19 @@
1
+
2
+ class Iro::ApiController < ActionController::Base
3
+ layout false
4
+
5
+ before_action :decode_jwt
6
+
7
+ ##
8
+ ## private
9
+ ##
10
+ private
11
+
12
+ def decode_jwt
13
+ out = JWT.decode params[:jwt_token], nil, false
14
+ email = out[0]['email']
15
+ user = User.find_by({ email: email })
16
+ sign_in user
17
+ end
18
+
19
+ end
@@ -1,6 +1,5 @@
1
1
 
2
2
  class Iro::PositionsController < Iro::ApplicationController
3
-
4
3
  before_action :set_lists
5
4
 
6
5
  def new
@@ -32,8 +31,40 @@ class Iro::PositionsController < Iro::ApplicationController
32
31
  def edit
33
32
  @position = Iro::Position.find params[:id]
34
33
  authorize! :edit, @position
34
+ end
35
+
36
+ def refresh
37
+ @position = pos = Iro::Position.find params[:id]
38
+ authorize! :refresh, @position
39
+
40
+ ## covered call
41
+ out = Tda::Option.get_quote({
42
+ contractType: 'CALL',
43
+ strike: pos.inner_strike,
44
+ expirationDate: pos.expires_on,
45
+ ticker: pos.stock.ticker,
46
+ })
47
+ puts! out, 'out'
48
+ @position.update({
49
+ end_inner_price: ( out.bid + out.ask ) / 2,
50
+ end_inner_delta: out.delta,
51
+ })
52
+ redirect_to request.referrer || purse_path( @position.purse )
53
+ end
54
+
55
+ def roll
56
+ @position = Iro::Position.find params[:id]
57
+ authorize! :roll, @position
58
+
59
+ stock = @position.stock
35
60
 
36
- @strategies_list = Iro::Strategy.for_ticker( @position.ticker ).list
61
+ @positions = [
62
+ Iro::Position.new({ stock: stock, begin_inner_price: 5.21, inner_strike: 91, expires_on: '2024-04-05', gain_loss_amount: -1.25 }),
63
+ Iro::Position.new({ stock: stock, begin_inner_price: 5.77, inner_strike: 90, expires_on: '2024-04-05', gain_loss_amount: -0.7 }),
64
+ Iro::Position.new({ stock: stock, begin_inner_price: 6.4, inner_strike: 89, expires_on: '2024-04-05', gain_loss_amount: -0.03 }),
65
+ Iro::Position.new({ stock: stock, begin_inner_price: 6.85, inner_strike: 88, expires_on: '2024-04-05', gain_loss_amount: 0.6 }),
66
+ Iro::Position.new({ stock: stock, begin_inner_price: 7.07, inner_strike: 87, expires_on: '2024-04-05', gain_loss_amount: 1.22 }),
67
+ ]
37
68
  end
38
69
 
39
70
  def update
@@ -55,8 +86,8 @@ class Iro::PositionsController < Iro::ApplicationController
55
86
  private
56
87
 
57
88
  def set_lists
58
- @strategies_list = Iro::Strategy.list
59
- @tickers_list = Iro::Stock.tickers_list
89
+ @strategies_list = Iro::Strategy.list(params[:long_or_short])
90
+ @stocks_list = Iro::Stock.list
60
91
  end
61
92
 
62
93
  end
@@ -23,8 +23,6 @@ class Iro::PursesController < Iro::ApplicationController
23
23
  def edit
24
24
  @purse = Iro::Purse.find(params[:id])
25
25
  authorize! :edit, @purse
26
-
27
-
28
26
  end
29
27
 
30
28
  def index
@@ -36,15 +34,24 @@ class Iro::PursesController < Iro::ApplicationController
36
34
  @purse = Iro::Purse.find(params[:id])
37
35
  authorize! :show, @purse
38
36
 
39
- @positions = Iro::Position.all
37
+ @positions = @purse.positions.includes( :strategy
38
+ ).order({ expires_on: :desc })
39
+
40
+ @unit = @purse.unit # 12 ## pixels per dollar
41
+ @height = @purse.height # 100 ## pixels
42
+ @n_dollars = 100 ## dollars to each side of origin
43
+
44
+ render params[:template]
40
45
  end
41
46
 
42
47
  def update
43
48
  @purse = Iro::Purse.find(params[:id])
44
49
  authorize! :update, @purse
45
50
  if @purse.update params[:purse].permit!
46
- redirect_to action: :index, notice: 'Purse was successfully updated.'
51
+ flash[:notice] = 'ok'
52
+ redirect_to purse_path(@purse)
47
53
  else
54
+ flash_alert @purse
48
55
  render :edit
49
56
  end
50
57
  end