stall 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +60 -23
  3. data/app/assets/javascripts/para/stall.coffee +1 -0
  4. data/app/assets/javascripts/para/stall/inputs/variant-select.coffee +62 -0
  5. data/app/assets/javascripts/para/stall/inputs/variants-matrix.coffee +12 -0
  6. data/app/assets/javascripts/para/stall/inputs/variants-matrix/helpers.coffee +40 -0
  7. data/app/assets/javascripts/para/stall/inputs/variants-matrix/input.coffee +133 -0
  8. data/app/assets/javascripts/para/stall/inputs/variants-matrix/nested-fields.coffee +38 -0
  9. data/app/assets/javascripts/para/stall/inputs/variants-matrix/properties_select.coffee +45 -0
  10. data/app/assets/javascripts/para/stall/inputs/variants-matrix/variant.coffee +59 -0
  11. data/app/assets/javascripts/stall.coffee +1 -0
  12. data/app/assets/javascripts/stall/add-to-cart-form.coffee +53 -28
  13. data/app/assets/javascripts/stall/cart-form.coffee +7 -2
  14. data/app/assets/stylesheets/para/stall.sass +28 -0
  15. data/app/controllers/para/stall/admin/carts_controller.rb +27 -0
  16. data/app/controllers/stall/cart_credits_controller.rb +27 -0
  17. data/app/controllers/stall/carts_controller.rb +1 -1
  18. data/app/controllers/stall/checkout/steps_controller.rb +22 -12
  19. data/app/controllers/stall/checkouts_controller.rb +1 -0
  20. data/app/controllers/stall/line_items_controller.rb +1 -0
  21. data/app/controllers/stall/payments_controller.rb +16 -1
  22. data/app/helpers/stall/credit_notes_helper.rb +25 -0
  23. data/app/helpers/stall/customers_helper.rb +3 -1
  24. data/app/models/billing_address.rb +2 -0
  25. data/app/models/cart_credit_note_adjustment.rb +3 -0
  26. data/app/models/credit_note.rb +3 -0
  27. data/app/models/credit_note_adjustment.rb +3 -0
  28. data/app/models/credit_note_usage.rb +3 -0
  29. data/app/models/product.rb +3 -0
  30. data/app/models/product_category.rb +3 -0
  31. data/app/models/product_detail.rb +3 -0
  32. data/app/models/property.rb +3 -0
  33. data/app/models/property_value.rb +3 -0
  34. data/app/models/shipping_address.rb +2 -0
  35. data/app/models/stall/models/address.rb +2 -2
  36. data/app/models/stall/models/cart.rb +2 -15
  37. data/app/models/stall/models/cart_credit_note_adjustment.rb +11 -0
  38. data/app/models/stall/models/credit_note.rb +50 -0
  39. data/app/models/stall/models/credit_note_adjustment.rb +13 -0
  40. data/app/models/stall/models/credit_note_usage.rb +16 -0
  41. data/app/models/stall/models/customer.rb +20 -8
  42. data/app/models/stall/models/line_item.rb +9 -0
  43. data/app/models/stall/models/product.rb +45 -0
  44. data/app/models/stall/models/product_category.rb +31 -0
  45. data/app/models/stall/models/product_detail.rb +17 -0
  46. data/app/models/stall/models/product_list.rb +9 -45
  47. data/app/models/stall/models/property.rb +20 -0
  48. data/app/models/stall/models/property_value.rb +23 -0
  49. data/app/models/stall/models/variant.rb +34 -0
  50. data/app/models/stall/models/variant_property_value.rb +18 -0
  51. data/app/models/variant.rb +3 -0
  52. data/app/models/variant_property_value.rb +3 -0
  53. data/app/services/stall/cart_credit_note_creation_service.rb +40 -0
  54. data/app/services/stall/cart_payment_validation_service.rb +28 -0
  55. data/app/services/stall/cart_update_service.rb +17 -6
  56. data/app/services/stall/credit_usage_service.rb +102 -0
  57. data/app/services/stall/payment_notification_service.rb +4 -8
  58. data/app/services/stall/product_list_staleness_handling_service.rb +33 -0
  59. data/app/views/admin/addresses/_fields.html.haml +9 -0
  60. data/app/views/admin/carts/_filters.html.haml +17 -0
  61. data/app/views/admin/carts/_form.html.haml +43 -0
  62. data/app/views/admin/carts/_table.html.haml +17 -0
  63. data/app/views/admin/customers/_fields.html.haml +1 -0
  64. data/app/views/admin/line_items/_fields.html.haml +15 -0
  65. data/app/views/admin/products/_table.html.haml +12 -0
  66. data/app/views/admin/properties/_form.html.haml +6 -0
  67. data/app/views/admin/properties/_table.html.haml +8 -0
  68. data/app/views/admin/property_values/_fields.html.haml +1 -0
  69. data/app/views/admin/shipments/_fields.html.haml +7 -0
  70. data/app/views/checkout/steps/_informations.html.haml +3 -1
  71. data/app/views/checkout/steps/_payment.html.haml +2 -0
  72. data/app/views/checkout/steps/_payment_return.html.haml +0 -1
  73. data/app/views/para/admin/resources/_variant_row.html.haml +24 -0
  74. data/app/views/para/stall/inputs/_variant_select.html.haml +14 -0
  75. data/app/views/para/stall/inputs/_variants_matrix.html.haml +41 -0
  76. data/app/views/stall/addresses/_fields.html.haml +6 -12
  77. data/app/views/stall/carts/_cart.html.haml +45 -37
  78. data/app/views/stall/carts/_widget.html.haml +28 -0
  79. data/app/views/stall/carts/show.html.haml +2 -0
  80. data/app/views/stall/checkout/steps/_navigation.html.haml +13 -0
  81. data/app/views/stall/credit_note_adjustments/_form.html.haml +28 -0
  82. data/app/views/stall/line_items/_added.html.haml +2 -2
  83. data/app/views/stall/line_items/_form.html.haml +1 -1
  84. data/app/views/stall/payments/manual_payment_gateway/_form.html.haml +10 -0
  85. data/app/views/stall/shared/mailers/_cart.html.haml +1 -1
  86. data/config/locales/stall.fr.yml +82 -2
  87. data/db/migrate/20161129101956_add_type_to_stall_address_ownerships.rb +52 -0
  88. data/db/migrate/20161202080218_add_reference_to_product_lists.rb +17 -0
  89. data/db/migrate/20170118103916_create_credit_notes.rb +17 -0
  90. data/db/migrate/20170118144047_create_credit_note_adjustments.rb +13 -0
  91. data/db/migrate/20170123123115_create_stall_product_categories.rb +12 -0
  92. data/db/migrate/20170123123326_create_stall_products.rb +17 -0
  93. data/db/migrate/20170123125030_create_stall_variants.rb +13 -0
  94. data/db/migrate/20170123131748_create_stall_product_category_hierarchies.rb +16 -0
  95. data/db/migrate/20170123143704_create_stall_product_details.rb +14 -0
  96. data/db/migrate/20170125152622_convert_all_money_fields_to_decimal_to_use_infinite_precision.rb +27 -0
  97. data/db/migrate/20170131162537_add_data_to_stall_adjustments.rb +5 -0
  98. data/db/migrate/20170202165514_create_stall_properties.rb +9 -0
  99. data/db/migrate/20170202165516_create_stall_property_values.rb +13 -0
  100. data/db/migrate/20170202165518_create_stall_variant_property_values.rb +13 -0
  101. data/lib/generators/stall/install/templates/initializer.rb +21 -0
  102. data/lib/generators/stall/view/view_generator.rb +41 -19
  103. data/lib/para/stall.rb +32 -0
  104. data/lib/para/stall/inputs.rb +13 -0
  105. data/lib/para/stall/inputs/variant_input_helper.rb +34 -0
  106. data/lib/para/stall/inputs/variant_select_input.rb +79 -0
  107. data/lib/para/stall/inputs/variants_matrix_input.rb +72 -0
  108. data/lib/para/stall/routes.rb +11 -0
  109. data/lib/para/stall/variants_property_config.rb +78 -0
  110. data/lib/stall.rb +10 -0
  111. data/lib/stall/addressable.rb +11 -59
  112. data/lib/stall/addresses.rb +1 -0
  113. data/lib/stall/addresses/copier_base.rb +3 -1
  114. data/lib/stall/addresses/copy.rb +10 -0
  115. data/lib/stall/addresses/copy_source_to_target.rb +10 -24
  116. data/lib/stall/addresses/prefill_target_from_source.rb +8 -16
  117. data/lib/stall/adjustable.rb +20 -0
  118. data/lib/stall/archived_paid_cart_helper.rb +36 -0
  119. data/lib/stall/cart_helper.rb +15 -7
  120. data/lib/stall/checkout/informations_checkout_step.rb +47 -50
  121. data/lib/stall/checkout/payment_return_checkout_step.rb +4 -1
  122. data/lib/stall/checkout/step.rb +24 -3
  123. data/lib/stall/checkout/step_form.rb +11 -5
  124. data/lib/stall/checkout/wizard.rb +7 -6
  125. data/lib/stall/config.rb +9 -0
  126. data/lib/stall/default_currency_manager.rb +27 -0
  127. data/lib/stall/engine.rb +14 -3
  128. data/lib/stall/payments.rb +2 -0
  129. data/lib/stall/payments/gateway_request.rb +15 -0
  130. data/lib/stall/payments/gateway_response.rb +33 -0
  131. data/lib/stall/payments/manual_payment_gateway.rb +86 -0
  132. data/lib/stall/priceable.rb +4 -0
  133. data/lib/stall/reference_manager.rb +17 -0
  134. data/lib/stall/routes.rb +1 -0
  135. data/lib/stall/shippable.rb +18 -0
  136. data/lib/stall/total_prices_manager.rb +40 -0
  137. data/lib/stall/version.rb +1 -1
  138. metadata +120 -5
  139. data/app/models/address_ownership.rb +0 -3
  140. data/app/models/stall/models/address_ownership.rb +0 -26
@@ -0,0 +1,17 @@
1
+ = resources_table(model: model, component: component) do |table|
2
+ = table.header do
3
+ = table.header_for(:reference)
4
+ = table.header_for(:paid, sort: :payment_paid_at)
5
+ = table.header_for(:customer, sort: :customer_email)
6
+ = table.header_for(:total_price)
7
+ = table.header_for(:created_at)
8
+ = table.header_for(:state)
9
+
10
+ = table.rows(resources) do |resource|
11
+ = table.data_for(resource, :reference)
12
+ %td= resource.payment&.paid_at ? l(resource.payment.paid_at, format: :admin) : fa_icon('times')
13
+ = table.data_for(resource.customer.try(:email))
14
+ = table.data_for(number_to_currency(resource.total_price))
15
+ = table.data_for(l(resource.created_at, format: :admin))
16
+ = table.data_for(t("activerecord.enums.cart.state.#{ resource.state }"))
17
+
@@ -0,0 +1 @@
1
+ = form.input :email
@@ -0,0 +1,15 @@
1
+ = form.input :name
2
+
3
+ = form.input :unit_price do
4
+ .input-group
5
+ = form.input_field :unit_price, class: 'form-control'
6
+ %span.input-group-addon
7
+ = form.object.unit_price.symbol
8
+
9
+ = form.input :quantity
10
+
11
+ = form.input :price do
12
+ .input-group
13
+ = form.input_field :price, class: 'form-control', disabled: 'disabled'
14
+ %span.input-group-addon
15
+ = form.object.price.symbol
@@ -0,0 +1,12 @@
1
+ = resources_table(model: model, component: component) do |table|
2
+ = table.header do
3
+ = table.header_for(:name)
4
+ = table.header_for(:published)
5
+ = table.header_for(:price, sort: :variants_price)
6
+ = table.header_for(:product_category, sort: :product_category_name)
7
+
8
+ = table.rows(resources) do |resource|
9
+ = table.data_for(resource, :name)
10
+ = table.data_for(resource, :published)
11
+ = table.data_for(resource, :price)
12
+ = table.data_for(resource, :product_category)
@@ -0,0 +1,6 @@
1
+ = para_form_for(resource) do |form|
2
+ = form.fieldset do
3
+ = form.input :name
4
+ = form.input :property_values, as: :nested_many
5
+
6
+ = form.actions
@@ -0,0 +1,8 @@
1
+ = resources_table(model: model, component: component) do |table|
2
+ = table.header do
3
+ = table.header_for(:name)
4
+ = table.header_for(:property_values, sort: :property_values_name)
5
+
6
+ = table.rows(resources) do |resource|
7
+ = table.data_for(resource, :name)
8
+ = table.data_for(resource, :property_values)
@@ -0,0 +1 @@
1
+ = form.input :value
@@ -0,0 +1,7 @@
1
+ = form.input :state, as: :selectize, collection: Shipment.states.keys.map { |state| { text: I18n.t("activerecord.enums.shipment.state.#{ state }"), value: state } }
2
+
3
+ = form.input :shipping_method, :as => :selectize
4
+ = form.input :tracking_code
5
+
6
+ = form.input :price
7
+ = form.input :sent_at, wrapper: :horizontal_form
@@ -1,3 +1,5 @@
1
+ = render partial: 'stall/checkout/steps/navigation', locals: { cart: cart, wizard: @wizard, step: @step }
2
+
1
3
  -# Display sign in form for users that are not signed in
2
4
  - unless stall_user_signed_in?
3
5
  - resource = Stall.config.default_user_model.new
@@ -21,7 +23,7 @@
21
23
  -# Stall initializer if you want to change the terms URL, but feel free
22
24
  -# to customize further if needed.
23
25
  = form.input :terms, label: false do
24
- = form.check_box :terms
26
+ = form.check_box :terms, id: 'terms-checkbox'
25
27
  = form.label :terms, t('stall.checkout.informations.accept_the')
26
28
  = link_to Stall.config.terms_path, target: '_blank' do
27
29
  = form.object.class.human_attribute_name(:terms)
@@ -1,3 +1,5 @@
1
+ = render partial: 'stall/checkout/steps/navigation', locals: { cart: cart, wizard: @wizard, step: @step }
2
+
1
3
  %h1= t('stall.checkout.payment.title')
2
4
 
3
5
  = render partial: 'stall/carts/cart', locals: { cart: cart }
@@ -1,5 +1,4 @@
1
1
  %h1= t('stall.checkout.payment_return.title')
2
-
3
2
  %p.help-block= t('stall.checkout.payment_return.help').html_safe
4
3
 
5
4
  = link_to root_path, class: 'btn btn-primary' do
@@ -0,0 +1,24 @@
1
+ %tr.variants-matrix-variant-row{ class: ('disabled' unless form.object.published?), data: { :'variants-matrix-variant-row' => true, :'variant-id' => form.object.id } }
2
+ %td{ data: { :'variants-matrix-variant-enabled-cell' => true } }
3
+ = form.hidden_field :id
4
+ = form.hidden_field :_destroy, value: 'false', data: { :'variant-remove' => true }
5
+
6
+ %span.checkbox
7
+ %label
8
+ = form.check_box :published, checked: (form.object.published? || form.object.new_record?), data: { :'variants-matrix-variant-enabled' => true }
9
+ %i.checkbox-icon
10
+
11
+ - all_properties.each do |property_config|
12
+ -# Hide all fields for new records
13
+ %td{ class: ('hidden' unless form.object.persisted? && property_config.active?), data: { :'variants-matrix-variant-property' => property_config.property.id } }
14
+ = form.fields_for :variant_property_values, [property_config.variant_property_value_or_build_for(form.object)] do |fields|
15
+ %span{ data: { :'property-name' => true } }
16
+ = property_config.property_value_for(form.object).try(:name)
17
+
18
+ = fields.hidden_field :property_value_id, data: { :'property-value-id' => true }
19
+
20
+ %td
21
+ .input-group
22
+ = form.input_field :price, class: 'form-control'
23
+ %span.input-group-addon
24
+ = form.object.currency.symbol
@@ -0,0 +1,14 @@
1
+ .variant-select-input{ data: { :'variant-select-input' => true, :'variant-select-data' => variants_data.to_json, :'price-target' => price_selector } }
2
+ = form.hidden_field foreign_key, data: { :'variant-select-foreign-key' => true }
3
+
4
+ - properties.each do |property_config|
5
+ - if property_config.available_options.length == 1
6
+ .variant-select-property.hidden{ data: { :'variant-select-property' => property_config.property.id, :'preselected' => true } }
7
+ = hidden_field :property_config, property_config.property.id, value: property_config.available_options.first.last, data: { :'preselected-value' => true }
8
+ - else
9
+ .variant-select-property{ data: { :'variant-select-property' => property_config.property.id } }
10
+ .row
11
+ .col-md-3
12
+ = label :property_config, property_config.property.id, property_config.property.name, class: 'variant-select-label'
13
+ .col-md-9
14
+ = select :property_config, property_config.property.id, options_for_select(property_config.available_options), { include_blank: true }, placeholder: t('para.stall.variant_select.property_placeholder'), class: 'variant-select-property-input', autocomplete: 'off', data: { selectize: true }
@@ -0,0 +1,41 @@
1
+ .variants-matrix-input-container{ data: { :'variants-matrix-input' => true } }
2
+ = form.input :properties do
3
+ .variants-matrix-properties-select{ data: { :'variants-matrix-properties-select' => true } }
4
+ %p.help-block= t('para.stall.variants_matrix.choose_properties_to_build_variants')
5
+
6
+ .dropdown
7
+ %button.btn.btn-primary{ type: 'button', data: { toggle: 'dropdown' } }
8
+ = fa_icon 'plus'
9
+ = t('para.stall.variants_matrix.add_property')
10
+ %span.caret
11
+ .dropdown-menu.variants-matrix-property-selector
12
+ - all_properties.each do |variants_property_config|
13
+ %label.variants-matrix-property-selector-label{ data: { :'variants-matrix-property-selector-label' => true } }
14
+ = check_box :properties, :activated, { checked: variants_property_config.active? , autocomplete: 'off', data: { :'variants-matrix-property-selector-input' => true } }, variants_property_config.property.id
15
+ = variants_property_config.property.name
16
+
17
+ %ul.list-group
18
+ - all_properties.each do |variants_property_config|
19
+ %li.list-group-item{ class: ('hidden' unless variants_property_config.active?), data: { :'variants-matrix-property-id' => variants_property_config.property.id } }
20
+ .row
21
+ .col-md-3
22
+ = label :variants_property_config, variants_property_config.property.id, variants_property_config.property.name
23
+ .col-md-9
24
+ = select :variants_property_config, variants_property_config.property.id, options_for_select(variants_property_config.options), {}, multiple: true, autocomplete: 'off', data: { :'variants-matrix-property-select' => variants_property_config.property.name }
25
+
26
+ = form.input :variants do
27
+ %table.table.table-hover
28
+ %thead{ data: { :'variants-matrix-variants-table-header' => true } }
29
+ %tr
30
+ %th{ data: { :'variants-matrix-variant-enabled-cell' => true } }= t('para.stall.variants_matrix.enabled')
31
+
32
+ - properties.each do |variants_property_config|
33
+ %th{ data: { :'variants-matrix-variant-property-cell' => true } }= variants_property_config.property.name
34
+
35
+ %th= t('para.stall.variants_matrix.price')
36
+
37
+ %tbody{ data: { :'variants-matrix-variants-container' => "#{ dom_identifier }" } }
38
+ = form.fields_for attribute_name, variants do |variant_fields|
39
+ = render partial: find_partial_for(model, :variant_row), locals: { form: variant_fields }.merge(variant_row_locals)
40
+
41
+ = link_to_add_association t('para.form.nested.add'), form, attribute_name, partial: find_partial_for(model, :variant_row), form_name: 'form', class: 'hidden', data: { :'variants-matrix-new-row-button' => true }, render_options: { nested_attribute_name: attribute_name, locals: variant_row_locals }
@@ -1,16 +1,10 @@
1
1
  .addresses-fields{ data: { :'addresses-fields' => true } }
2
- = form.fields_for :address_ownerships, [cart.address_ownership_for(:shipping)] do |ownership_form|
3
- %fieldset{ data: { :'address-form' => :shipping } }
4
- = ownership_form.hidden_field :shipping
5
-
6
- = ownership_form.fields_for :address do |address_form|
7
- = render partial: 'stall/addresses/nested_fields', locals: { form: address_form }
2
+ %fieldset{ data: { :'address-form' => :shipping } }
3
+ = form.fields_for :shipping_address do |address_form|
4
+ = render partial: 'stall/addresses/nested_fields', locals: { form: address_form }
8
5
 
9
6
  = form.input :use_another_address_for_billing, as: :boolean, input_html: { data: { :'use-another-address-for-billing' => true } }
10
7
 
11
- = form.fields_for :address_ownerships, [cart.address_ownership_for(:billing)] do |ownership_form|
12
- %fieldset{ class: ('hidden' unless params[:use_another_address_for_billing] == '1'), data: { :'address-form' => :billing } }
13
- = ownership_form.hidden_field :billing
14
-
15
- = ownership_form.fields_for :address do |address_form|
16
- = render partial: 'stall/addresses/nested_fields', locals: { form: address_form }
8
+ %fieldset{ class: ('hidden' unless params[:use_another_address_for_billing] == '1'), data: { :'address-form' => :billing } }
9
+ = form.fields_for :billing_address do |address_form|
10
+ = render partial: 'stall/addresses/nested_fields', locals: { form: address_form }
@@ -1,45 +1,53 @@
1
- %table.table.table-hover
2
- %thead
3
- %tr
4
- %th= LineItem.human_attribute_name(:name)
5
- %th= LineItem.human_attribute_name(:price)
6
- %tbody
7
- - cart.line_items.each do |line_item|
8
- %tr{ data: { :'line-item-id' => line_item.id } }
9
- %td
10
- = line_item.name
11
- x
12
- = line_item.quantity
13
- %td= number_to_currency(line_item.price)
14
-
15
- %tfoot
16
- - if cart.subtotal != cart.total_price
1
+ .cart-table-wrapper{ data: { :'cart-recap' => true } }
2
+ %table.table.table-hover
3
+ %thead
17
4
  %tr
18
- %td= t('stall.carts.recap.subtotal')
19
- %td= number_to_currency(cart.subtotal)
5
+ %th= LineItem.human_attribute_name(:name)
6
+ %th= LineItem.human_attribute_name(:price)
7
+ %tbody
8
+ - cart.line_items.each do |line_item|
9
+ %tr{ data: { :'line-item-id' => line_item.id } }
10
+ %td
11
+ = line_item.name
12
+ x
13
+ = line_item.quantity
14
+ %td= number_to_currency(line_item.price)
20
15
 
21
- - if cart.shipment.try(:persisted?)
22
- %tr
23
- %td
24
- = t('stall.carts.recap.total_shipment_price')
25
- \:
26
- = cart.shipment.shipping_method.name
16
+ %tfoot
17
+ - if cart.subtotal != cart.total_price
18
+ %tr
19
+ %td= t('stall.carts.recap.subtotal')
20
+ %td= number_to_currency(cart.subtotal)
21
+
22
+ - if cart.shipment.try(:persisted?)
23
+ %tr
24
+ %td
25
+ = t('stall.carts.recap.total_shipment_price')
26
+ \:
27
+ = cart.shipment.shipping_method.name
28
+
29
+ %td= number_to_currency(cart.shipment.price)
27
30
 
28
- %td= number_to_currency(cart.shipment.price)
31
+ - cart.adjustments.each do |adjustment|
32
+ %tr
33
+ %td= adjustment.name
34
+ %td= number_to_currency(adjustment.price)
29
35
 
30
- - cart.adjustments.each do |adjustment|
31
36
  %tr
32
- %td= adjustment.name
33
- %td= number_to_currency(adjustment.price)
37
+ %td= t('stall.carts.recap.total_eot_price')
38
+ %td= number_to_currency(cart.total_eot_price)
34
39
 
35
- %tr
36
- %td= t('stall.carts.recap.total_eot_price')
37
- %td= number_to_currency(cart.total_eot_price)
40
+ %tr
41
+ %td= t('stall.carts.recap.total_vat')
42
+ %td= number_to_currency(cart.total_vat)
43
+
44
+ %tr
45
+ %td= t('stall.carts.recap.total_price')
46
+ %td= number_to_currency(cart.total_price)
38
47
 
39
- %tr
40
- %td= t('stall.carts.recap.total_vat')
41
- %td= number_to_currency(cart.total_vat)
48
+ - if cart.remainder?
49
+ %tr
50
+ %td= t('stall.carts.recap.remainder')
51
+ %td= number_to_currency(cart.remainder)
42
52
 
43
- %tr
44
- %td= t('stall.carts.recap.total_price')
45
- %td= number_to_currency(cart.total_price)
53
+ = render partial: 'stall/credit_note_adjustments/form', locals: { cart: @cart }
@@ -0,0 +1,28 @@
1
+ -# Button with dropdown showing the number of items in the cart, and the detail
2
+ -# when clicked.
3
+ .dropdown{ data: { :'cart-widget' => true } }
4
+ %button.btn.btn-primary{ data: { toggle: 'dropdown' } }
5
+ %i.fa.fa-shopping-cart
6
+ %span.label.label-default{ data: { :'cart-quantity-counter' => true } }= cart.total_quantity
7
+ %span.caret
8
+
9
+ .dropdown-menu
10
+ %table.table
11
+ %tbody
12
+ - cart.line_items.each do |line_item|
13
+ %tr
14
+ %td
15
+ = line_item.name
16
+ x
17
+ = line_item.quantity
18
+ %td
19
+ = number_to_currency(line_item.price)
20
+ %tfoot
21
+ %tr
22
+ %td= t('stall.carts.recap.total_price')
23
+ %td
24
+ = number_to_currency(cart.total_price)
25
+ %tr
26
+ %td{ colspan: 2 }
27
+ = link_to cart_path(cart), class: 'btn btn-primary btn-block' do
28
+ = t('stall.carts.actions.view_cart')
@@ -61,3 +61,5 @@
61
61
 
62
62
  = link_to checkout_path(current_cart.identifier), class: 'btn btn-primary' do
63
63
  = t('stall.carts.recap.validate')
64
+
65
+
@@ -0,0 +1,13 @@
1
+ -# Steps navigation presented as breadcrumbs. By default, all steps are shown
2
+ -# but the navigation isn't shown in the `payment_return` step, to avoid
3
+ -# customers going back at this point.
4
+ %ol.breadcrumb
5
+ - wizard.steps.each_with_index do |step_identifier, index|
6
+ %li{ class: ('active' if step.is?(step_identifier) ) }
7
+ - if wizard.step_complete?(step_identifier) && wizard.cart.active?
8
+ = link_to change_checkout_step_path(wizard.cart.identifier, step_identifier) do
9
+ %span.badge= index + 1
10
+ = t("stall.checkout.#{ step_identifier }.title")
11
+ - else
12
+ %span.badge= index + 1
13
+ = t("stall.checkout.#{ step_identifier }.title")
@@ -0,0 +1,28 @@
1
+ - if stall_user_signed_in? && available_customer_credit_for?(cart)
2
+ = simple_form_for cart, url: cart_credit_path(cart), method: (credit_used_for?(@cart) ? :delete : :patch), html: { class: 'cart-credit-form', data: { :'cart-credit-form' => true } } do |form|
3
+ = hidden_field_tag :_return_to, request.fullpath
4
+
5
+ %legend= t('stall.credit_notes.usage_form.title')
6
+
7
+ - if credit_used_for?(@cart)
8
+ %p.help-block= t('stall.credit_notes.usage_form.already_used_remove_it')
9
+
10
+ .row
11
+ .col-md-4.col-md-offset-4
12
+ %button.btn.btn-primary.btn-block{ type: 'submit', data: { :'cart-credit-remove-button' => true } }
13
+ = t('stall.credit_notes.usage_form.remove_credit_usage')
14
+
15
+ - else
16
+ %p.help-block= t('stall.credit_notes.usage_form.you_have_credit', amount: number_to_currency(current_customer_credit_for(@cart))).html_safe
17
+
18
+ %p.help-block= t('stall.credit_notes.usage_form.you_can_use_it').html_safe
19
+
20
+ .row
21
+ .col-md-8
22
+ .input-group
23
+ = number_field_tag :amount, maximum_credit_usage_for(@cart), class: 'form-control', data: { :'cart-credit-input' => true }
24
+ %span.input-group-addon= @cart.currency.symbol
25
+
26
+ .col-md-4
27
+ %button.btn.btn-primary.btn-block{ type: 'submit', data: { :'cart-credit-button' => true } }
28
+ = t('stall.credit_notes.usage_form.use_my_credit')
@@ -1,4 +1,4 @@
1
- .modal.fade{ role: 'dialog', tabindex: '-1', data: { :'cart' => { token: current_cart.token, :'total-quantity' => current_cart.total_quantity } } }
1
+ .modal.fade{ role: 'dialog', tabindex: '-1', data: { :'cart' => { token: current_cart.token, :'total-quantity' => current_cart.total_quantity, :'widget-markup' => @widget_partial } } }
2
2
  .modal-dialog
3
3
  .modal-content
4
4
  .modal-header
@@ -20,4 +20,4 @@
20
20
  = t('stall.line_items.added.continue_shopping')
21
21
 
22
22
  = link_to cart_path(@cart), class: 'btn btn-primary' do
23
- = t('stall.line_items.added.view_cart')
23
+ = t('stall.carts.actions.view_cart')
@@ -6,7 +6,7 @@
6
6
  = form.input_field :quantity, spinner: false, value: 1, class: 'form-group', data: { :'quantity-field' => true }
7
7
 
8
8
  %span.input-group-btn
9
- %button.btn.btn-primary{ type: 'submit', data: { :'loading-text' => t('stall.shared.sending') } }
9
+ %button.btn.btn-primary{ type: 'submit', autocomplete: 'off', data: { :'loading-text' => t('stall.shared.sending') } }
10
10
  %i.fa.fa-shopping-cart
11
11
  = t('stall.line_items.form.add_to_cart')
12
12
 
@@ -0,0 +1,10 @@
1
+ %p.help-block= t('stall.payments.manual_payment_gateway.help').html_safe
2
+
3
+ = simple_form_for request.cart, as: :cart, url: Stall::Payments::UrlsConfig.new(request.cart).payment_notification_url, method: :post do |form|
4
+ = form.hidden_field :token, value: request.token
5
+ = form.hidden_field :timestamp, value: request.timestamp
6
+ = form.hidden_field :reference, value: request.reference
7
+ = form.hidden_field :checksum, value: request.checksum
8
+
9
+ %button.btn.btn-primary{ type: 'submit' }
10
+ = t('stall.payments.manual_payment_gateway.validate')
@@ -18,7 +18,7 @@
18
18
  %tr
19
19
  %td
20
20
  %h2= Cart.human_attribute_name(:billing_address)
21
- = render partial: 'stall/shared/mailers/address', locals: { address: cart.billing_address }
21
+ = render partial: 'stall/shared/mailers/address', locals: { address: cart.billing_address || cart.shipping_address }
22
22
 
23
23
  %td
24
24
  %h2= Cart.human_attribute_name(:shipping_address)
@@ -1,10 +1,34 @@
1
1
  fr:
2
+ para:
3
+ stall:
4
+ variants_matrix:
5
+ enabled: "Publier ?"
6
+ price: "Prix"
7
+ add_property: "Ajouter une propriété"
8
+ choose_properties_to_build_variants: |
9
+ Choisissez les propriétés ainsi que les valeurs dont vous disposez
10
+ pour créer automatiquement les déclinaisons de votre produit.
11
+
12
+ variant_select:
13
+ property_placeholder: "Choisissez une option ..."
14
+
15
+ forms:
16
+ tabs:
17
+ cart:
18
+ informations: "Informations"
19
+ billing: "Facturation"
20
+ shipping: "Livraison"
21
+ payment: "Paiement"
22
+ line_items: "Produits"
23
+
2
24
  stall:
3
25
  shared:
4
26
  close: "Fermer"
5
27
  sending: "Envoi en cours ..."
6
28
 
7
29
  carts:
30
+ actions:
31
+ view_cart: "Voir mon panier"
8
32
  formats:
9
33
  name: "Commande n°%{ref}"
10
34
 
@@ -21,6 +45,7 @@ fr:
21
45
  total_eot_price: "Prix total HT"
22
46
  total_vat: "Total TVA"
23
47
  total_price: "Prix total"
48
+ remainder: "Le montant suivant sera transformé en avoir"
24
49
  update: "Mettre à jour le panier"
25
50
  validate: "Passer la commande"
26
51
  paid_at: "Payée le %{at}"
@@ -31,7 +56,6 @@ fr:
31
56
  added:
32
57
  title: "Votre produit a bien été ajouté à votre panier"
33
58
  continue_shopping: "Continuer mes achats"
34
- view_cart: "Voir mon panier"
35
59
  add_error:
36
60
  title: "Votre produit n'a pu être ajouté"
37
61
  description: "Merci de vérifier que vous avez bien rempli la quantité avant d'ajouter le produit au panier."
@@ -77,12 +101,40 @@ fr:
77
101
  payments:
78
102
  gateway:
79
103
  pay: "Payer ma commande"
104
+ manual_payment_gateway:
105
+ help: |
106
+ Le montant de votre commande étant nul, vous n'avez rien à payer.
107
+ <br>
108
+ Afin de valider votre commande, merci de vérifier son contenu puis de
109
+ cliquer sur le bouton suivant :
110
+ validate: "Valider ma commande"
111
+
80
112
 
81
113
  addresses:
82
114
  civilities:
83
115
  m: M.
84
116
  mme: Mme.
85
117
 
118
+ credit_notes:
119
+ usage_form:
120
+ title: "Utiliser un avoir"
121
+ you_have_credit: |
122
+ Vous disposez d'un crédit de <b>%{amount}</b> lié à votre / vos avoir(s) en
123
+ cours de validité.
124
+ you_can_use_it: |
125
+ Vous pouvez utiliser ce crédit en renseignant le montant que vous
126
+ souhaitez utiliser de ce crédit dans le champ suivant puis en cliquant
127
+ sur le bouton "Utiliser mon crédit".
128
+ use_my_credit: "Utiliser mon crédit"
129
+ already_used_remove_it: |
130
+ Vous avez déjà utilisé un avoir, si vous souhaitez modifier la somme
131
+ utilisée ou tout simplement le supprimer de votre panier, utilisez
132
+ le bouton ci-dessous pour le supprimer.
133
+ remove_credit_usage: "Retirer l'avoir du panier"
134
+
135
+ adjustment_label: "Avoir n°%{ref}"
136
+ source_cart_adjustment_label: "Solde transformé en avoir n°%{ref}"
137
+
86
138
  mailers:
87
139
  customer:
88
140
  order_paid_email:
@@ -94,6 +146,11 @@ fr:
94
146
 
95
147
  activerecord:
96
148
  enums:
149
+ cart:
150
+ state:
151
+ informations: "Informations client"
152
+ payment: "Paiement"
153
+ payment_return: "Paiement traité"
97
154
  shipment:
98
155
  state:
99
156
  pending: "En attente"
@@ -101,7 +158,7 @@ fr:
101
158
  payment:
102
159
  state:
103
160
  pending: "En attente"
104
- shipped: "Payé"
161
+ paid: "Payé"
105
162
 
106
163
  models:
107
164
  line_item: "Produit"
@@ -110,6 +167,10 @@ fr:
110
167
  cart: "Panier"
111
168
  shipment: "Livraison"
112
169
  payment: "Paiement"
170
+ product: "Produit"
171
+ product_category: "Catégorie"
172
+ variant: "Déclinaison"
173
+ product_detail: "Bloc de description"
113
174
 
114
175
  attributes:
115
176
  line_item:
@@ -122,6 +183,7 @@ fr:
122
183
  price: "Prix total TTC"
123
184
  vat_rate: "Taux de TVA"
124
185
  weight: "Poids"
186
+ state: "Étape du panier"
125
187
  customer:
126
188
  email: "Adresse e-mail"
127
189
  shipping_address: "Adresse de livraison"
@@ -151,6 +213,7 @@ fr:
151
213
  shipping_address: "Adresse de livraison"
152
214
  billing_address: "Adresse de facturation"
153
215
  terms: "Conditions générales de vente"
216
+ paid: "Payé"
154
217
  shipment:
155
218
  price: "Prix"
156
219
  eot_price: "Prix HT"
@@ -164,6 +227,23 @@ fr:
164
227
  paid_at: "Payé le"
165
228
  transaction_id: "Numéro de transaction"
166
229
  state: "État"
230
+ property:
231
+ name: "Nom de la propriété"
232
+ property_values: "Valeurs"
233
+ property_value:
234
+ value: "Valeur"
235
+ product:
236
+ published: "Publié ?"
237
+ product_category: "Catégorie de produit"
238
+ name: "Nom du produit"
239
+ slug: "Fragment d'URL"
240
+ description: "Description du produit"
241
+ properties: "Propriétés"
242
+ variants: "Déclinaisons"
243
+ product_details: "Blocs de description produit"
244
+ product_detail:
245
+ name: "Titre"
246
+ content: "Contenu"
167
247
 
168
248
  simple_form:
169
249
  placeholders: