stall 0.2.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +60 -23
- data/app/assets/javascripts/para/stall.coffee +1 -0
- data/app/assets/javascripts/para/stall/inputs/variant-select.coffee +62 -0
- data/app/assets/javascripts/para/stall/inputs/variants-matrix.coffee +12 -0
- data/app/assets/javascripts/para/stall/inputs/variants-matrix/helpers.coffee +40 -0
- data/app/assets/javascripts/para/stall/inputs/variants-matrix/input.coffee +133 -0
- data/app/assets/javascripts/para/stall/inputs/variants-matrix/nested-fields.coffee +38 -0
- data/app/assets/javascripts/para/stall/inputs/variants-matrix/properties_select.coffee +45 -0
- data/app/assets/javascripts/para/stall/inputs/variants-matrix/variant.coffee +59 -0
- data/app/assets/javascripts/stall.coffee +1 -0
- data/app/assets/javascripts/stall/add-to-cart-form.coffee +53 -28
- data/app/assets/javascripts/stall/cart-form.coffee +7 -2
- data/app/assets/stylesheets/para/stall.sass +28 -0
- data/app/controllers/para/stall/admin/carts_controller.rb +27 -0
- data/app/controllers/stall/cart_credits_controller.rb +27 -0
- data/app/controllers/stall/carts_controller.rb +1 -1
- data/app/controllers/stall/checkout/steps_controller.rb +22 -12
- data/app/controllers/stall/checkouts_controller.rb +1 -0
- data/app/controllers/stall/line_items_controller.rb +1 -0
- data/app/controllers/stall/payments_controller.rb +16 -1
- data/app/helpers/stall/credit_notes_helper.rb +25 -0
- data/app/helpers/stall/customers_helper.rb +3 -1
- data/app/models/billing_address.rb +2 -0
- data/app/models/cart_credit_note_adjustment.rb +3 -0
- data/app/models/credit_note.rb +3 -0
- data/app/models/credit_note_adjustment.rb +3 -0
- data/app/models/credit_note_usage.rb +3 -0
- data/app/models/product.rb +3 -0
- data/app/models/product_category.rb +3 -0
- data/app/models/product_detail.rb +3 -0
- data/app/models/property.rb +3 -0
- data/app/models/property_value.rb +3 -0
- data/app/models/shipping_address.rb +2 -0
- data/app/models/stall/models/address.rb +2 -2
- data/app/models/stall/models/cart.rb +2 -15
- data/app/models/stall/models/cart_credit_note_adjustment.rb +11 -0
- data/app/models/stall/models/credit_note.rb +50 -0
- data/app/models/stall/models/credit_note_adjustment.rb +13 -0
- data/app/models/stall/models/credit_note_usage.rb +16 -0
- data/app/models/stall/models/customer.rb +20 -8
- data/app/models/stall/models/line_item.rb +9 -0
- data/app/models/stall/models/product.rb +45 -0
- data/app/models/stall/models/product_category.rb +31 -0
- data/app/models/stall/models/product_detail.rb +17 -0
- data/app/models/stall/models/product_list.rb +9 -45
- data/app/models/stall/models/property.rb +20 -0
- data/app/models/stall/models/property_value.rb +23 -0
- data/app/models/stall/models/variant.rb +34 -0
- data/app/models/stall/models/variant_property_value.rb +18 -0
- data/app/models/variant.rb +3 -0
- data/app/models/variant_property_value.rb +3 -0
- data/app/services/stall/cart_credit_note_creation_service.rb +40 -0
- data/app/services/stall/cart_payment_validation_service.rb +28 -0
- data/app/services/stall/cart_update_service.rb +17 -6
- data/app/services/stall/credit_usage_service.rb +102 -0
- data/app/services/stall/payment_notification_service.rb +4 -8
- data/app/services/stall/product_list_staleness_handling_service.rb +33 -0
- data/app/views/admin/addresses/_fields.html.haml +9 -0
- data/app/views/admin/carts/_filters.html.haml +17 -0
- data/app/views/admin/carts/_form.html.haml +43 -0
- data/app/views/admin/carts/_table.html.haml +17 -0
- data/app/views/admin/customers/_fields.html.haml +1 -0
- data/app/views/admin/line_items/_fields.html.haml +15 -0
- data/app/views/admin/products/_table.html.haml +12 -0
- data/app/views/admin/properties/_form.html.haml +6 -0
- data/app/views/admin/properties/_table.html.haml +8 -0
- data/app/views/admin/property_values/_fields.html.haml +1 -0
- data/app/views/admin/shipments/_fields.html.haml +7 -0
- data/app/views/checkout/steps/_informations.html.haml +3 -1
- data/app/views/checkout/steps/_payment.html.haml +2 -0
- data/app/views/checkout/steps/_payment_return.html.haml +0 -1
- data/app/views/para/admin/resources/_variant_row.html.haml +24 -0
- data/app/views/para/stall/inputs/_variant_select.html.haml +14 -0
- data/app/views/para/stall/inputs/_variants_matrix.html.haml +41 -0
- data/app/views/stall/addresses/_fields.html.haml +6 -12
- data/app/views/stall/carts/_cart.html.haml +45 -37
- data/app/views/stall/carts/_widget.html.haml +28 -0
- data/app/views/stall/carts/show.html.haml +2 -0
- data/app/views/stall/checkout/steps/_navigation.html.haml +13 -0
- data/app/views/stall/credit_note_adjustments/_form.html.haml +28 -0
- data/app/views/stall/line_items/_added.html.haml +2 -2
- data/app/views/stall/line_items/_form.html.haml +1 -1
- data/app/views/stall/payments/manual_payment_gateway/_form.html.haml +10 -0
- data/app/views/stall/shared/mailers/_cart.html.haml +1 -1
- data/config/locales/stall.fr.yml +82 -2
- data/db/migrate/20161129101956_add_type_to_stall_address_ownerships.rb +52 -0
- data/db/migrate/20161202080218_add_reference_to_product_lists.rb +17 -0
- data/db/migrate/20170118103916_create_credit_notes.rb +17 -0
- data/db/migrate/20170118144047_create_credit_note_adjustments.rb +13 -0
- data/db/migrate/20170123123115_create_stall_product_categories.rb +12 -0
- data/db/migrate/20170123123326_create_stall_products.rb +17 -0
- data/db/migrate/20170123125030_create_stall_variants.rb +13 -0
- data/db/migrate/20170123131748_create_stall_product_category_hierarchies.rb +16 -0
- data/db/migrate/20170123143704_create_stall_product_details.rb +14 -0
- data/db/migrate/20170125152622_convert_all_money_fields_to_decimal_to_use_infinite_precision.rb +27 -0
- data/db/migrate/20170131162537_add_data_to_stall_adjustments.rb +5 -0
- data/db/migrate/20170202165514_create_stall_properties.rb +9 -0
- data/db/migrate/20170202165516_create_stall_property_values.rb +13 -0
- data/db/migrate/20170202165518_create_stall_variant_property_values.rb +13 -0
- data/lib/generators/stall/install/templates/initializer.rb +21 -0
- data/lib/generators/stall/view/view_generator.rb +41 -19
- data/lib/para/stall.rb +32 -0
- data/lib/para/stall/inputs.rb +13 -0
- data/lib/para/stall/inputs/variant_input_helper.rb +34 -0
- data/lib/para/stall/inputs/variant_select_input.rb +79 -0
- data/lib/para/stall/inputs/variants_matrix_input.rb +72 -0
- data/lib/para/stall/routes.rb +11 -0
- data/lib/para/stall/variants_property_config.rb +78 -0
- data/lib/stall.rb +10 -0
- data/lib/stall/addressable.rb +11 -59
- data/lib/stall/addresses.rb +1 -0
- data/lib/stall/addresses/copier_base.rb +3 -1
- data/lib/stall/addresses/copy.rb +10 -0
- data/lib/stall/addresses/copy_source_to_target.rb +10 -24
- data/lib/stall/addresses/prefill_target_from_source.rb +8 -16
- data/lib/stall/adjustable.rb +20 -0
- data/lib/stall/archived_paid_cart_helper.rb +36 -0
- data/lib/stall/cart_helper.rb +15 -7
- data/lib/stall/checkout/informations_checkout_step.rb +47 -50
- data/lib/stall/checkout/payment_return_checkout_step.rb +4 -1
- data/lib/stall/checkout/step.rb +24 -3
- data/lib/stall/checkout/step_form.rb +11 -5
- data/lib/stall/checkout/wizard.rb +7 -6
- data/lib/stall/config.rb +9 -0
- data/lib/stall/default_currency_manager.rb +27 -0
- data/lib/stall/engine.rb +14 -3
- data/lib/stall/payments.rb +2 -0
- data/lib/stall/payments/gateway_request.rb +15 -0
- data/lib/stall/payments/gateway_response.rb +33 -0
- data/lib/stall/payments/manual_payment_gateway.rb +86 -0
- data/lib/stall/priceable.rb +4 -0
- data/lib/stall/reference_manager.rb +17 -0
- data/lib/stall/routes.rb +1 -0
- data/lib/stall/shippable.rb +18 -0
- data/lib/stall/total_prices_manager.rb +40 -0
- data/lib/stall/version.rb +1 -1
- metadata +120 -5
- data/app/models/address_ownership.rb +0 -3
- 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,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)
|
@@ -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
|
-
|
3
|
-
|
4
|
-
=
|
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
|
-
|
12
|
-
|
13
|
-
=
|
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
|
-
|
2
|
-
%
|
3
|
-
%
|
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
|
-
%
|
19
|
-
%
|
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
|
-
|
22
|
-
|
23
|
-
%
|
24
|
-
= t('stall.carts.recap.
|
25
|
-
|
26
|
-
|
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
|
-
|
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=
|
33
|
-
%td= number_to_currency(
|
37
|
+
%td= t('stall.carts.recap.total_eot_price')
|
38
|
+
%td= number_to_currency(cart.total_eot_price)
|
34
39
|
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
40
|
-
|
41
|
-
|
48
|
+
- if cart.remainder?
|
49
|
+
%tr
|
50
|
+
%td= t('stall.carts.recap.remainder')
|
51
|
+
%td= number_to_currency(cart.remainder)
|
42
52
|
|
43
|
-
|
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')
|
@@ -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.
|
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)
|
data/config/locales/stall.fr.yml
CHANGED
@@ -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
|
-
|
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:
|