stall 0.2.0 → 0.3.1

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 (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: