shoppe 0.0.16 → 0.0.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +5 -6
- data/app/assets/javascripts/shoppe/application.coffee +19 -0
- data/app/assets/stylesheets/shoppe/application.scss +62 -20
- data/app/assets/stylesheets/shoppe/{chosen.css → chosen.scss} +18 -24
- data/app/assets/stylesheets/shoppe/dialog.scss +17 -2
- data/app/controllers/shoppe/orders_controller.rb +9 -7
- data/app/controllers/shoppe/payments_controller.rb +33 -0
- data/app/controllers/shoppe/settings_controller.rb +4 -0
- data/app/controllers/shoppe/tax_rates_controller.rb +1 -1
- data/app/controllers/shoppe/users_controller.rb +1 -1
- data/app/helpers/shoppe/application_helper.rb +0 -9
- data/app/models/shoppe/country.rb +17 -20
- data/app/models/shoppe/delivery_service.rb +16 -22
- data/app/models/shoppe/delivery_service_price.rb +10 -21
- data/app/models/shoppe/order/actions.rb +80 -0
- data/app/models/shoppe/order/billing.rb +99 -0
- data/app/models/shoppe/order/delivery.rb +196 -0
- data/app/models/shoppe/order/states.rb +69 -0
- data/app/models/shoppe/order.rb +29 -365
- data/app/models/shoppe/order_item.rb +52 -39
- data/app/models/shoppe/payment.rb +80 -0
- data/app/models/shoppe/product/product_attributes.rb +6 -4
- data/app/models/shoppe/product/variants.rb +20 -7
- data/app/models/shoppe/product.rb +37 -37
- data/app/models/shoppe/product_attribute.rb +13 -20
- data/app/models/shoppe/product_category.rb +6 -19
- data/app/models/shoppe/setting.rb +9 -0
- data/app/models/shoppe/stock_level_adjustment.rb +5 -18
- data/app/models/shoppe/tax_rate.rb +18 -21
- data/app/models/shoppe/user.rb +8 -15
- data/app/views/shoppe/delivery_service_prices/_form.html.haml +9 -3
- data/app/views/shoppe/delivery_service_prices/index.html.haml +6 -4
- data/app/views/shoppe/delivery_services/_form.html.haml +1 -1
- data/app/views/shoppe/orders/edit.html.haml +62 -0
- data/app/views/shoppe/orders/index.html.haml +2 -3
- data/app/views/shoppe/orders/show.html.haml +100 -63
- data/app/views/shoppe/payments/refund.html.haml +14 -0
- data/app/views/shoppe/product_categories/_form.html.haml +1 -1
- data/app/views/shoppe/products/_form.html.haml +8 -2
- data/app/views/shoppe/settings/edit.html.haml +1 -1
- data/app/views/shoppe/tax_rates/form.html.haml +5 -4
- data/app/views/shoppe/users/_form.html.haml +1 -1
- data/app/views/shoppe/variants/form.html.haml +2 -2
- data/config/routes.rb +3 -1
- data/db/migrate/20130926094549_create_shoppe_initial_schema.rb +1 -1
- data/db/migrate/20131024201501_add_address_type_to_shoppe_tax_rates.rb +5 -0
- data/db/migrate/20131024204815_create_shoppe_payments.rb +32 -0
- data/db/schema.rb +218 -0
- data/db/seeds.rb +15 -15
- data/lib/shoppe/engine.rb +7 -2
- data/lib/shoppe/errors/refund_failed.rb +15 -0
- data/lib/shoppe/settings.rb +0 -2
- data/lib/shoppe/version.rb +1 -1
- data/lib/shoppe/view_helpers.rb +16 -0
- data/lib/shoppe.rb +23 -6
- data/test/app/db/schema.rb +21 -6
- data/test/app/log/development.log +12782 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/application.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sass/edac894564dae62b78e653a08d1c41f10ade93f9/chosen.scssc +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/01d6eb5fc12044a487be4b93584690f2 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/02d3923383f72b56dd7919e301d22d24 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/0a6bca3e510625f255083bd154cc470b +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/2f80004fb2e2ce07283a83ac15cf920a +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/322295abdd8625fcce4da08f9565cc63 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/4c8cb5cfd87990ebddbaa5b5fd594be5 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/53c0f5159a54836310b1a3f5357bc4c6 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/7938636d16e11b754d4dd046b89863c4 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/7a90d9251a7c5506f33a3c72a224e571 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/9da17bb4868a0b762f8884db45c76ffd +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/a692ba7ed6cff183bb840c2622233c87 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/a9befe910d55141b8ba02d8198b8f966 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/accc4dc17ef18d0b510917a005340da5 +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/b9ad7ea18b7e55c3626a15d1dae142ed +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/c733f1a2fe9d05a3a634ff64a394f64b +0 -0
- data/test/app/tmp/cache/assets/development/sprockets/da76586dcb6d9a408b2cf33307790d66 +0 -0
- metadata +62 -63
- data/README.rdoc +0 -1
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dcbba75865dfb23d23a64375e7706b6664bc1d19
|
4
|
+
data.tar.gz: f5b5ae13ac740c329f9f1b693a42708c632e6530
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8cab21ef5ecd835b5a6afb468c1aa5dbc2a6064ffe536e72e0da60f1bac1ce6c4b1d61b7e60a66e67366a9736bbb47b3afbd74cef97126d2061abeb05ad0786e
|
7
|
+
data.tar.gz: ac7abebddd19f138855ed9cc86bda752bf3a2eb9d6156f717abc5dc7f839ab2c48919057e206d4e5f0c51013295d5c1fa7e1b549b5156d52e86f055d39a737a7
|
data/Rakefile
CHANGED
@@ -18,16 +18,15 @@ Rake::TestTask.new(:test) do |t|
|
|
18
18
|
end
|
19
19
|
|
20
20
|
namespace :shoppe do
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
system("rm -Rf doc")
|
25
|
-
system("bundle exec sdoc app/models lib README.rdoc")
|
21
|
+
desc 'Publish the release notes'
|
22
|
+
task :changelog do
|
23
|
+
system "scp CHANGELOG.md rubyapps@tryshoppe.com:/opt/rubyapps/shoppe-website/shared/CHANGELOG.md"
|
26
24
|
end
|
27
25
|
|
28
26
|
desc "Publish RDoc documentation from doc to api.tryshoppe.com"
|
29
|
-
task :
|
27
|
+
task :docs do
|
30
28
|
if File.exist?("doc")
|
29
|
+
system "yard"
|
31
30
|
system "ssh root@tryshoppe.com rm -Rf /var/www/shoppe-api"
|
32
31
|
system "scp -r doc root@tryshoppe.com:/var/www/shoppe-api"
|
33
32
|
else
|
@@ -42,12 +42,23 @@ $ ->
|
|
42
42
|
# Chosen
|
43
43
|
$('select.chosen').chosen()
|
44
44
|
$('select.chosen-with-deselect').chosen({allow_single_deselect: true})
|
45
|
+
$('select.chosen-basic').chosen({disable_search_threshold:100})
|
45
46
|
|
46
47
|
# Printables
|
47
48
|
$('a[rel=print]').on 'click', ->
|
48
49
|
window.open($(this).attr('href'), 'despatchnote', 'width=700,height=800')
|
49
50
|
false
|
50
51
|
|
52
|
+
# Order editting
|
53
|
+
toggleDeliveryFieldsetForOrder = ->
|
54
|
+
fieldset = $('form.edit_order fieldset.delivery')
|
55
|
+
if $('form.edit_order input#order_separate_delivery_address').prop('checked') then fieldset.show() else fieldset.hide()
|
56
|
+
$('form.edit_order input#order_separate_delivery_address').on 'change', toggleDeliveryFieldsetForOrder
|
57
|
+
toggleDeliveryFieldsetForOrder()
|
58
|
+
|
59
|
+
# Close dialog
|
60
|
+
$('body').on 'click', 'a[rel=closeDialog]', Nifty.Dialog.closeTopDialog
|
61
|
+
|
51
62
|
# Open AJAX dialogs
|
52
63
|
$('a[rel=dialog]').on 'click', ->
|
53
64
|
element = $(this)
|
@@ -59,6 +70,14 @@ $ ->
|
|
59
70
|
options.url = element.attr('href')
|
60
71
|
Nifty.Dialog.open(options)
|
61
72
|
false
|
73
|
+
|
74
|
+
# Format money values to 2 decimal places
|
75
|
+
formatMoneyField = ->
|
76
|
+
value = $(this).val()
|
77
|
+
if value.length
|
78
|
+
$(this).val(parseFloat(value).toFixed(2))
|
79
|
+
$('div.moneyInput input').each formatMoneyField
|
80
|
+
$('div.moneyInput input').on('blur', formatMoneyField)
|
62
81
|
|
63
82
|
#
|
64
83
|
# Stock Level Adjustment dialog beavior
|
@@ -129,17 +129,25 @@ header.main {
|
|
129
129
|
&.received { color:#909091; background-image:image-url('shoppe/statuses/received.svg'); }
|
130
130
|
}
|
131
131
|
|
132
|
+
//
|
133
|
+
// fieldset
|
134
|
+
//
|
135
|
+
fieldset {
|
136
|
+
border:1px solid #dce2eb;
|
137
|
+
background:#fff;
|
138
|
+
padding-top:15px;
|
139
|
+
padding-bottom:25px;
|
140
|
+
margin-bottom:15px;
|
141
|
+
legend {color:#5B6270; margin:0 25px; font-weight:300; font-size:1.5em;}
|
142
|
+
&.padded { padding:15px 25px 25px 25px;}
|
143
|
+
&.padded legend { margin:0;}
|
144
|
+
}
|
145
|
+
|
132
146
|
//
|
133
147
|
// forms
|
134
148
|
//
|
135
149
|
form {
|
136
150
|
fieldset {
|
137
|
-
border:1px solid #dce2eb;
|
138
|
-
background:#fff;
|
139
|
-
padding-top:15px;
|
140
|
-
padding-bottom:25px;
|
141
|
-
margin-bottom:15px;
|
142
|
-
legend {color:#5B6270; margin:0 25px; font-weight:300; font-size:1.5em;}
|
143
151
|
|
144
152
|
.splitContainer { margin:0 25px; margin-bottom:15px; height:50px;}
|
145
153
|
.splitContainer:last-child { margin-bottom:0;}
|
@@ -162,6 +170,8 @@ header.main {
|
|
162
170
|
padding-top:4px;
|
163
171
|
input,label { margin-right:10px;}
|
164
172
|
}
|
173
|
+
dd.space { margin-bottom:5px;}
|
174
|
+
dd.space:last-child { margin-bottom:0;}
|
165
175
|
&.half {
|
166
176
|
width:49%;
|
167
177
|
margin:0;
|
@@ -272,6 +282,7 @@ header.main {
|
|
272
282
|
dl {
|
273
283
|
dt { float:left; width:30%; text-align:right; color:#888;white-space:nowrap}
|
274
284
|
dd { font-weight:bold; margin-left:35%; margin-bottom:6px; white-space:nowrap}
|
285
|
+
dd a { color:inherit;}
|
275
286
|
dt.padding { padding-top:6px;}
|
276
287
|
}
|
277
288
|
|
@@ -289,7 +300,7 @@ header.main {
|
|
289
300
|
margin:45px 0;
|
290
301
|
overflow:hidden;
|
291
302
|
ul {
|
292
|
-
li { width:
|
303
|
+
li { width:33%;float:left; text-align:center; background:image-url('shoppe/statuses/shipped.svg') no-repeat center 0; background-size:36px; padding-top:42px;z-index:10;}
|
293
304
|
h4 { color:#E32479;}
|
294
305
|
li p { margin-top:5px; font-size:0.9em; color:#999;}
|
295
306
|
li a { color:inherit;}
|
@@ -304,29 +315,50 @@ header.main {
|
|
304
315
|
}
|
305
316
|
}
|
306
317
|
|
307
|
-
.notes {
|
308
|
-
background:#fff;
|
309
|
-
border:1px solid #CED2D8;
|
310
|
-
p { padding:15px;}
|
311
|
-
p textarea { border:0; padding:0; width:100%; resize:none; height:100px; font-family:$font; font-size:1.1em}
|
312
|
-
h4 { background:#F7F9FC; padding:10px 15px; font-weight:500;}
|
313
|
-
h4 input { float:right; margin-top:-3px;}
|
314
|
-
}
|
315
|
-
|
316
318
|
.order_items {
|
317
|
-
margin:25px 0;
|
318
319
|
table.data {
|
319
320
|
.money { text-align:right; width:8%}
|
320
321
|
.product { width:42%;}
|
321
322
|
.sku { width:18%;}
|
322
323
|
.qty {text-align:center; width:5%;}
|
323
|
-
tfoot td { background:#5B6270; color:#fff; border:1px solid #5B6270; font-weight:bold; font-size:1.1em;}
|
324
324
|
}
|
325
325
|
}
|
326
326
|
}
|
327
327
|
|
328
328
|
//
|
329
|
-
//
|
329
|
+
// payments
|
330
|
+
//
|
331
|
+
fieldset.orderPayments {
|
332
|
+
h4 { font-weight:bold; text-transform:uppercase; color:#5B6270;}
|
333
|
+
.table {
|
334
|
+
margin-bottom:20px;
|
335
|
+
table td.refund { width:10%; text-align:center;}
|
336
|
+
table td.confirmed { width:5%; text-align:center;}
|
337
|
+
}
|
338
|
+
form {
|
339
|
+
overflow:hidden;
|
340
|
+
background:#F7F9FC;
|
341
|
+
border:1px solid #DCE2EB;
|
342
|
+
padding:15px;
|
343
|
+
dl {
|
344
|
+
width:23%;float:left;
|
345
|
+
dt { margin-bottom:4px; font-size:0.9em;color:#A9AEB5; font-weight:500;}
|
346
|
+
&.text { width:27%;margin-right:2%;}
|
347
|
+
&.amount { width:25%;}
|
348
|
+
&.submit { width:15%; text-align:right; margin-top:15px;}
|
349
|
+
}
|
350
|
+
}
|
351
|
+
p.notice {
|
352
|
+
background:#fffff3;
|
353
|
+
padding:10px;
|
354
|
+
color:#F67C00;
|
355
|
+
border:1px solid #F6B721;
|
356
|
+
margin-bottom:15px;
|
357
|
+
}
|
358
|
+
}
|
359
|
+
|
360
|
+
//
|
361
|
+
// order search
|
330
362
|
//
|
331
363
|
div.orderSearch {
|
332
364
|
overflow:hidden;
|
@@ -366,13 +398,22 @@ footer {
|
|
366
398
|
}
|
367
399
|
}
|
368
400
|
|
369
|
-
span.boolean span.true { color:#
|
401
|
+
span.boolean span.true { color:#96BF48}
|
370
402
|
span.boolean span.false { color:#c04a4a}
|
371
403
|
|
372
404
|
.float-right { float:right;}
|
373
405
|
|
374
406
|
div.field_with_errors { display:inline;}
|
375
407
|
|
408
|
+
//
|
409
|
+
// money input box
|
410
|
+
//
|
411
|
+
div.moneyInput {
|
412
|
+
overflow:hidden;
|
413
|
+
div.currency {float:left; background:#f3f6ec; color:#74884a; padding:5px; width:20px; text-align:center;border:1px solid #c5ceb1; font-size:1.1em; border-right:0;}
|
414
|
+
input { width:100px; font-size:1.1em;}
|
415
|
+
}
|
416
|
+
|
376
417
|
//
|
377
418
|
// standard text input box
|
378
419
|
//
|
@@ -425,6 +466,7 @@ div.table {
|
|
425
466
|
td.desc input[type=text] { width:95%;}
|
426
467
|
td.adjustment input[type=text] { width:50px; margin-right:5px;}
|
427
468
|
}
|
469
|
+
tfoot td { background:#5B6270; color:#fff; border:1px solid #5B6270; font-weight:bold; font-size:1.1em;}
|
428
470
|
}
|
429
471
|
}
|
430
472
|
|
@@ -74,7 +74,7 @@
|
|
74
74
|
display: block;
|
75
75
|
width: 12px;
|
76
76
|
height: 12px;
|
77
|
-
background: url('chosen-sprite.png') -42px 1px no-repeat;
|
77
|
+
background: image-url('shoppe/chosen-sprite.png') -42px 1px no-repeat;
|
78
78
|
font-size: 1px;
|
79
79
|
}
|
80
80
|
.chosen-container-single .chosen-single abbr:hover {
|
@@ -95,7 +95,7 @@
|
|
95
95
|
display: block;
|
96
96
|
width: 100%;
|
97
97
|
height: 100%;
|
98
|
-
background: url('chosen-sprite.png') no-repeat 0px 2px;
|
98
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat 0px 2px;
|
99
99
|
}
|
100
100
|
.chosen-container-single .chosen-search {
|
101
101
|
position: relative;
|
@@ -114,12 +114,12 @@
|
|
114
114
|
height: auto;
|
115
115
|
outline: 0;
|
116
116
|
border: 1px solid #ccc;
|
117
|
-
background: white url('chosen-sprite.png') no-repeat 100% -20px;
|
118
|
-
background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
119
|
-
background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
120
|
-
background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
121
|
-
background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
122
|
-
background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
|
117
|
+
background: white image-url('shoppe/chosen-sprite.png') no-repeat 100% -20px;
|
118
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
119
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
120
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
121
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
122
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
|
123
123
|
font-size: 1em;
|
124
124
|
font-family: sans-serif;
|
125
125
|
line-height: normal;
|
@@ -197,17 +197,12 @@
|
|
197
197
|
-moz-box-sizing: border-box;
|
198
198
|
box-sizing: border-box;
|
199
199
|
margin: 0;
|
200
|
-
padding:
|
200
|
+
padding: 5px;
|
201
201
|
width: 100%;
|
202
202
|
height: auto !important;
|
203
203
|
height: 1%;
|
204
204
|
border: 1px solid #ccc;
|
205
205
|
background-color: #fff;
|
206
|
-
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
207
|
-
background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
208
|
-
background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
209
|
-
background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
210
|
-
background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
|
211
206
|
cursor: text;
|
212
207
|
}
|
213
208
|
.chosen-container-multi .chosen-choices li {
|
@@ -261,7 +256,7 @@
|
|
261
256
|
display: block;
|
262
257
|
width: 12px;
|
263
258
|
height: 12px;
|
264
|
-
background: url('chosen-sprite.png') -42px 1px no-repeat;
|
259
|
+
background: image-url('shoppe/chosen-sprite.png') -42px 1px no-repeat;
|
265
260
|
font-size: 1px;
|
266
261
|
}
|
267
262
|
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
|
@@ -298,7 +293,7 @@
|
|
298
293
|
/* @group Active */
|
299
294
|
.chosen-container-active .chosen-single {
|
300
295
|
border: 1px solid #9AC835;
|
301
|
-
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
296
|
+
//box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
302
297
|
}
|
303
298
|
.chosen-container-active.chosen-with-drop .chosen-single {
|
304
299
|
border: 1px solid #ccc;
|
@@ -322,7 +317,6 @@
|
|
322
317
|
}
|
323
318
|
.chosen-container-active .chosen-choices {
|
324
319
|
border: 1px solid #9AC835;
|
325
|
-
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
326
320
|
}
|
327
321
|
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
|
328
322
|
color: #111 !important;
|
@@ -397,12 +391,12 @@
|
|
397
391
|
}
|
398
392
|
.chosen-rtl .chosen-search input[type="text"] {
|
399
393
|
padding: 4px 5px 4px 20px;
|
400
|
-
background: white url('chosen-sprite.png') no-repeat -30px -20px;
|
401
|
-
background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
402
|
-
background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
403
|
-
background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
404
|
-
background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
405
|
-
background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
|
394
|
+
background: white image-url('shoppe/chosen-sprite.png') no-repeat -30px -20px;
|
395
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
396
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
397
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
398
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
399
|
+
background: image-url('shoppe/chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
|
406
400
|
direction: rtl;
|
407
401
|
}
|
408
402
|
.chosen-rtl.chosen-container-single .chosen-single div b {
|
@@ -422,7 +416,7 @@
|
|
422
416
|
.chosen-container-multi .chosen-choices .search-choice .search-choice-close,
|
423
417
|
.chosen-container .chosen-results-scroll-down span,
|
424
418
|
.chosen-container .chosen-results-scroll-up span {
|
425
|
-
background-image: url('chosen-sprite@2x.png') !important;
|
419
|
+
background-image: image-url('shoppe/chosen-sprite@2x.png') !important;
|
426
420
|
background-size: 52px 37px !important;
|
427
421
|
background-repeat: no-repeat !important;
|
428
422
|
}
|
@@ -1,10 +1,25 @@
|
|
1
1
|
div.niftyDialog {
|
2
2
|
h2 {
|
3
3
|
background:#fff;
|
4
|
-
border
|
5
|
-
|
4
|
+
border:0;
|
5
|
+
padding:0;
|
6
|
+
font-size:1.3em;
|
7
|
+
border-bottom:1px solid #000;
|
8
|
+
padding-bottom:4px;
|
9
|
+
margin-bottom:10px;
|
6
10
|
color:#111;
|
7
11
|
}
|
8
12
|
padding:15px;
|
9
13
|
nav.pagination { margin:0; margin-top:15px;}
|
14
|
+
p.intro { line-height:1.5; color:#666; margin:6px 0;}
|
15
|
+
|
16
|
+
form.refundForm {
|
17
|
+
overflow:hidden;
|
18
|
+
margin:10px;
|
19
|
+
p.intro { margin-bottom:25px;}
|
20
|
+
.moneyInput { float:left; }
|
21
|
+
.moneyInput .currency { font-size:1.4em;}
|
22
|
+
.moneyInput input { font-size:1.4em}
|
23
|
+
p.submit { float:right;}
|
24
|
+
}
|
10
25
|
}
|
@@ -8,10 +8,17 @@ module Shoppe
|
|
8
8
|
@query = Shoppe::Order.ordered.received.includes(:order_items => :ordered_item).page(params[:page]).search(params[:q])
|
9
9
|
@orders = @query.result
|
10
10
|
end
|
11
|
+
|
12
|
+
def show
|
13
|
+
@payments = @order.payments.to_a
|
14
|
+
end
|
11
15
|
|
12
16
|
def update
|
13
|
-
@order.update_attributes
|
14
|
-
|
17
|
+
if @order.update_attributes(params[:order].permit(:notes, :first_name, :last_name, :company, :billing_address1, :billing_address2, :billing_address3, :billing_address4, :billing_postcode, :billing_country_id, :separate_delivery_address,:delivery_name, :delivery_address1, :delivery_address2, :delivery_address3, :delivery_address4, :delivery_postcode, :delivery_country_id, :email_address, :phone_number))
|
18
|
+
redirect_to @order, :notice => "Order has been saved successfully"
|
19
|
+
else
|
20
|
+
render :action => "edit"
|
21
|
+
end
|
15
22
|
end
|
16
23
|
|
17
24
|
def search
|
@@ -34,11 +41,6 @@ module Shoppe
|
|
34
41
|
redirect_to @order, :notice => "Order has been shipped successfully"
|
35
42
|
end
|
36
43
|
|
37
|
-
def pay
|
38
|
-
@order.pay!(params[:payment_reference], params[:payment_method].blank? ? 'Unknown' : params[:payment_method])
|
39
|
-
redirect_to @order, :notice => "Order has been marked as paid successfully"
|
40
|
-
end
|
41
|
-
|
42
44
|
def despatch_note
|
43
45
|
render :layout => 'shoppe/printable'
|
44
46
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Shoppe
|
2
|
+
class PaymentsController < ApplicationController
|
3
|
+
|
4
|
+
before_filter { @order = Shoppe::Order.find(params[:order_id]) }
|
5
|
+
before_filter { params[:id] && @payment = @order.payments.find(params[:id]) }
|
6
|
+
|
7
|
+
def create
|
8
|
+
payment = @order.payments.build(params[:payment].permit(:amount, :method, :reference))
|
9
|
+
if payment.save
|
10
|
+
redirect_to @order, :notice => "Payment has been added successfully"
|
11
|
+
else
|
12
|
+
redirect_to @order, :alert => payment.errors.full_messages.to_sentence
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
@payment.destroy
|
18
|
+
redirect_to @order, :notice => "Payment has been removed successfully"
|
19
|
+
end
|
20
|
+
|
21
|
+
def refund
|
22
|
+
if request.post?
|
23
|
+
@payment.refund!(params[:amount])
|
24
|
+
redirect_to @order, :notice => "Refund has been processed successfully."
|
25
|
+
else
|
26
|
+
render :layout => false
|
27
|
+
end
|
28
|
+
rescue Shoppe::Errors::RefundFailed => e
|
29
|
+
redirect_to @order, :alert => e.message
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -4,6 +4,10 @@ module Shoppe
|
|
4
4
|
before_filter { @active_nav = :settings }
|
5
5
|
|
6
6
|
def update
|
7
|
+
if Shoppe.settings.demo_mode?
|
8
|
+
raise Shoppe::Error, "You cannot make changes to settings in demo mode. Sorry about that."
|
9
|
+
end
|
10
|
+
|
7
11
|
Shoppe::Setting.update_from_hash(params[:settings].permit!)
|
8
12
|
redirect_to :settings, :notice => "Settings have been updated successfully."
|
9
13
|
end
|
@@ -5,7 +5,7 @@ module Shoppe
|
|
5
5
|
before_filter { params[:id] && @user = Shoppe::User.find(params[:id]) }
|
6
6
|
before_filter(:only => [:create, :update, :destroy]) do
|
7
7
|
if Shoppe.settings.demo_mode?
|
8
|
-
raise Shoppe::Error, "You cannot make changes to
|
8
|
+
raise Shoppe::Error, "You cannot make changes to users in demo mode. Sorry about that."
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -1,15 +1,6 @@
|
|
1
1
|
module Shoppe
|
2
2
|
module ApplicationHelper
|
3
3
|
|
4
|
-
def number_to_currency(number, options = {})
|
5
|
-
options[:unit] ||= Shoppe.settings.currency_unit
|
6
|
-
super
|
7
|
-
end
|
8
|
-
|
9
|
-
def number_to_weight(kg)
|
10
|
-
"#{kg}#{t('shoppe.helpers.number_to_weight.kg', :default => 'kg')}"
|
11
|
-
end
|
12
|
-
|
13
4
|
def status_tag(status)
|
14
5
|
content_tag :span, status, :class => "status-tag #{status}"
|
15
6
|
end
|
@@ -1,30 +1,27 @@
|
|
1
|
-
# == Schema Information
|
2
|
-
#
|
3
|
-
# Table name: shoppe_countries
|
4
|
-
#
|
5
|
-
# id :integer not null, primary key
|
6
|
-
# name :string(255)
|
7
|
-
# code2 :string(255)
|
8
|
-
# code3 :string(255)
|
9
|
-
# continent :string(255)
|
10
|
-
# tld :string(255)
|
11
|
-
# currency :string(255)
|
12
|
-
# eu_member :boolean default(FALSE)
|
13
|
-
#
|
14
|
-
|
15
1
|
module Shoppe
|
2
|
+
|
3
|
+
# The Shoppe::Country model stores countries which can be used for delivery & billing
|
4
|
+
# addresses for orders.
|
5
|
+
#
|
6
|
+
# You can use the Shoppe::CountryImporter to import a pre-defined list of countries
|
7
|
+
# into your database. This automatically happens when you run the 'shoppe:setup'
|
8
|
+
# rake task.
|
9
|
+
|
16
10
|
class Country < ActiveRecord::Base
|
17
|
-
|
18
|
-
# Set the table name
|
11
|
+
|
19
12
|
self.table_name = 'shoppe_countries'
|
20
|
-
|
21
|
-
#
|
13
|
+
|
14
|
+
# All orders which have this country set as their billing country
|
22
15
|
has_many :billed_orders, :dependent => :restrict_with_exception, :class_name => 'Shoppe::Order', :foreign_key => 'billing_country_id'
|
23
|
-
has_many :delivered_orders, :dependent => :restrict_with_exception, :class_name => 'Shoppe::Order', :foreign_key => 'delivery_country_id'
|
24
16
|
|
17
|
+
# All orders which have this country set as their delivery country
|
18
|
+
has_many :delivered_orders, :dependent => :restrict_with_exception, :class_name => 'Shoppe::Order', :foreign_key => 'delivery_country_id'
|
25
19
|
|
26
|
-
#
|
20
|
+
# All countries ordered by their name asending
|
27
21
|
scope :ordered, -> { order('shoppe_countries.name asc') }
|
28
22
|
|
23
|
+
# Validations
|
24
|
+
validates :name, :presence => true
|
25
|
+
|
29
26
|
end
|
30
27
|
end
|
@@ -1,38 +1,32 @@
|
|
1
|
-
# == Schema Information
|
2
|
-
#
|
3
|
-
# Table name: shoppe_delivery_services
|
4
|
-
#
|
5
|
-
# id :integer not null, primary key
|
6
|
-
# name :string(255)
|
7
|
-
# code :string(255)
|
8
|
-
# default :boolean default(FALSE)
|
9
|
-
# active :boolean default(TRUE)
|
10
|
-
# created_at :datetime
|
11
|
-
# updated_at :datetime
|
12
|
-
# courier :string(255)
|
13
|
-
# tracking_url :string(255)
|
14
|
-
#
|
15
|
-
|
16
1
|
module Shoppe
|
17
2
|
class DeliveryService < ActiveRecord::Base
|
18
3
|
|
19
|
-
# Set the table name
|
20
4
|
self.table_name = 'shoppe_delivery_services'
|
21
|
-
|
5
|
+
|
22
6
|
# Validations
|
23
7
|
validates :name, :presence => true
|
24
8
|
validates :courier, :presence => true
|
25
9
|
|
26
|
-
#
|
10
|
+
# Orders which are assigned to this delivery service
|
27
11
|
has_many :orders, :dependent => :restrict_with_exception, :class_name => 'Shoppe::Order'
|
12
|
+
|
13
|
+
# Prices for the different levels of service within this delivery service
|
28
14
|
has_many :delivery_service_prices, :dependent => :destroy, :class_name => 'Shoppe::DeliveryServicePrice'
|
29
15
|
|
30
|
-
#
|
16
|
+
# All active delivery services
|
31
17
|
scope :active, -> { where(:active => true)}
|
32
18
|
|
33
|
-
#
|
34
|
-
|
35
|
-
|
19
|
+
# Returns a tracking URL for the passed order
|
20
|
+
#
|
21
|
+
# @param order [Shoppe::Order]
|
22
|
+
# @return [String] the full URL for the order.
|
23
|
+
def tracking_url_for(order)
|
24
|
+
return nil if self.tracking_url.blank?
|
25
|
+
tracking_url = self.tracking_url.dup
|
26
|
+
tracking_url.gsub!("{{consignment_number}}", CGI.escape(order.consignment_number.to_s))
|
27
|
+
tracking_url.gsub!("{{delivery_postcode}}", CGI.escape(order.delivery_postcode.to_s))
|
28
|
+
tracking_url.gsub!("{{billing_postcode}}", CGI.escape(order.billing_postcode.to_s))
|
29
|
+
tracking_url
|
36
30
|
end
|
37
31
|
|
38
32
|
end
|
@@ -1,41 +1,30 @@
|
|
1
|
-
# == Schema Information
|
2
|
-
#
|
3
|
-
# Table name: shoppe_delivery_service_prices
|
4
|
-
#
|
5
|
-
# id :integer not null, primary key
|
6
|
-
# delivery_service_id :integer
|
7
|
-
# code :string(255)
|
8
|
-
# price :decimal(8, 2)
|
9
|
-
# cost_price :decimal(8, 2)
|
10
|
-
# tax_rate_id :integer
|
11
|
-
# min_weight :decimal(8, 2)
|
12
|
-
# max_weight :decimal(8, 2)
|
13
|
-
# created_at :datetime
|
14
|
-
# updated_at :datetime
|
15
|
-
# country_ids :text
|
16
|
-
#
|
17
|
-
|
18
1
|
module Shoppe
|
19
2
|
class DeliveryServicePrice < ActiveRecord::Base
|
20
3
|
|
21
4
|
# Set the table name
|
22
5
|
self.table_name = 'shoppe_delivery_service_prices'
|
23
6
|
|
24
|
-
# Tax rates are associated with countries
|
25
7
|
include Shoppe::AssociatedCountries
|
26
8
|
|
27
|
-
#
|
9
|
+
# The delivery service which this price belongs to
|
28
10
|
belongs_to :delivery_service, :class_name => 'Shoppe::DeliveryService'
|
11
|
+
|
12
|
+
# The tax rate which should be applied
|
29
13
|
belongs_to :tax_rate, :class_name => "Shoppe::TaxRate"
|
30
|
-
|
14
|
+
|
31
15
|
# Validations
|
16
|
+
validates :code, :presence => true
|
32
17
|
validates :price, :numericality => true
|
33
18
|
validates :cost_price, :numericality => true, :allow_blank => true
|
34
19
|
validates :min_weight, :numericality => true
|
35
20
|
validates :max_weight, :numericality => true
|
36
21
|
|
37
|
-
#
|
22
|
+
# All prices ordered by their price ascending
|
38
23
|
scope :ordered, -> { order('price asc')}
|
24
|
+
|
25
|
+
# All prices which are suitable for the weight passed.
|
26
|
+
#
|
27
|
+
# @param weight [BigDecimal] the weight of the order
|
39
28
|
scope :for_weight, -> weight { where("min_weight <= ? AND max_weight >= ?", weight, weight) }
|
40
29
|
|
41
30
|
end
|