diff --git a/plugins/delivery/controllers/myprofile/delivery_plugin/admin_method_controller.rb b/plugins/delivery/controllers/myprofile/delivery_plugin/admin_method_controller.rb
new file mode 100644
index 0000000..81c3c0b
--- /dev/null
+++ b/plugins/delivery/controllers/myprofile/delivery_plugin/admin_method_controller.rb
@@ -0,0 +1,32 @@
+require_dependency 'delivery_plugin/display_helper'
+
+class DeliveryPlugin::AdminMethodController < MyProfileController
+
+ protect 'edit_profile', :profile
+
+ helper OrdersPlugin::FieldHelper
+ helper DeliveryPlugin::DisplayHelper
+
+ def new
+ @delivery_method = profile.delivery_methods.build
+ self.edit
+ end
+
+ def edit
+ @delivery_method ||= profile.delivery_methods.find_by_id params[:id]
+ if params[:delivery_method].present? and @delivery_method.update_attributes params[:delivery_method]
+ render partial: 'list'
+ else
+ render partial: 'edit', locals: {delivery_method: @delivery_method}
+ end
+ end
+
+ def destroy
+ @delivery_method = profile.delivery_methods.find params[:id]
+ @delivery_method.destroy
+ render nothing: true
+ end
+
+ protected
+
+end
diff --git a/plugins/delivery/controllers/myprofile/delivery_plugin/admin_options_controller.rb b/plugins/delivery/controllers/myprofile/delivery_plugin/admin_options_controller.rb
new file mode 100644
index 0000000..c837073
--- /dev/null
+++ b/plugins/delivery/controllers/myprofile/delivery_plugin/admin_options_controller.rb
@@ -0,0 +1,38 @@
+class DeliveryPlugin::AdminOptionsController < DeliveryPlugin::AdminMethodController
+
+ helper OrdersPlugin::FieldHelper
+ helper DeliveryPlugin::DisplayHelper
+
+ protect 'edit_profile', :profile
+ before_filter :load_context
+ before_filter :load_owner
+
+ def select
+
+ end
+
+ def new
+ dms = profile.delivery_methods.find Array(params[:method_id])
+ (dms - @owner.delivery_methods).each do |dm|
+ DeliveryPlugin::Option.create! owner_id: @owner.id, owner_type: @owner.class.name, delivery_method: dm
+ end
+ end
+
+ def destroy
+ @delivery_option = @owner.delivery_options.find params[:id]
+ @delivery_option.destroy
+ end
+
+ protected
+
+ def load_owner
+ @owner_id = params[:owner_id]
+ @owner_type = params[:owner_type]
+ @owner = @owner_type.constantize.find @owner_id
+ end
+
+ def load_context
+ @delivery_context = 'delivery_plugin/admin_options'
+ end
+
+end
diff --git a/plugins/delivery/db/migrate/20130719132252_create_delivery_plugin_tables.rb b/plugins/delivery/db/migrate/20130719132252_create_delivery_plugin_tables.rb
new file mode 100644
index 0000000..d263afc
--- /dev/null
+++ b/plugins/delivery/db/migrate/20130719132252_create_delivery_plugin_tables.rb
@@ -0,0 +1,44 @@
+class CreateDeliveryPluginTables < ActiveRecord::Migration
+ def self.up
+ # check if distribution plugin already moved tables
+ return if ActiveRecord::Base.connection.table_exists? :delivery_plugin_methods
+
+ create_table :delivery_plugin_methods do |t|
+ t.integer :profile_id
+ t.string :name
+ t.text :description
+ t.string :recipient
+ t.string :address_line1
+ t.string :address_line2
+ t.string :postal_code
+ t.string :state
+ t.string :country
+ t.string :delivery_type
+ t.datetime :created_at
+ t.datetime :updated_at
+ end
+
+ add_index :delivery_plugin_methods, [:profile_id]
+ add_index :delivery_plugin_methods, [:delivery_type]
+
+ create_table :delivery_plugin_options do |t|
+ t.integer :delivery_method_id
+ t.integer :owner_id
+ t.string :owner_type
+ t.datetime :created_at
+ t.datetime :updated_at
+ end
+
+ add_index :delivery_plugin_options, [:delivery_method_id]
+ add_index :delivery_plugin_options, [:owner_id, :delivery_method_id], name: :index_delivery_plugin_owner_id_delivery_method_id
+ add_index :delivery_plugin_options, [:owner_id]
+ add_index :delivery_plugin_options, [:owner_type]
+ add_index :delivery_plugin_options, [:owner_id, :owner_type]
+
+ end
+
+ def self.down
+ drop_table :delivery_plugin_methods
+ drop_table :delivery_plugin_options
+ end
+end
diff --git a/plugins/delivery/db/migrate/20150202122306_add_fixed_cost_to_delivery_plugin_method.rb b/plugins/delivery/db/migrate/20150202122306_add_fixed_cost_to_delivery_plugin_method.rb
new file mode 100644
index 0000000..640a8a4
--- /dev/null
+++ b/plugins/delivery/db/migrate/20150202122306_add_fixed_cost_to_delivery_plugin_method.rb
@@ -0,0 +1,10 @@
+class AddFixedCostToDeliveryPluginMethod < ActiveRecord::Migration
+ def up
+ add_column :delivery_plugin_methods, :fixed_cost, :decimal
+ add_column :delivery_plugin_methods, :free_over_price, :decimal
+ end
+ def down
+ remove_column :delivery_plugin_methods, :fixed_cost
+ remove_column :delivery_plugin_methods, :free_over_price
+ end
+end
diff --git a/plugins/delivery/lib/delivery_plugin.rb b/plugins/delivery/lib/delivery_plugin.rb
new file mode 100644
index 0000000..e48abb3
--- /dev/null
+++ b/plugins/delivery/lib/delivery_plugin.rb
@@ -0,0 +1,13 @@
+module DeliveryPlugin
+
+ extend Noosfero::Plugin::ParentMethods
+
+ def self.plugin_name
+ I18n.t('delivery_plugin.lib.plugin.name')
+ end
+
+ def self.plugin_description
+ I18n.t('delivery_plugin.lib.plugin.description')
+ end
+
+end
diff --git a/plugins/delivery/lib/delivery_plugin/base.rb b/plugins/delivery/lib/delivery_plugin/base.rb
new file mode 100644
index 0000000..20edc4a
--- /dev/null
+++ b/plugins/delivery/lib/delivery_plugin/base.rb
@@ -0,0 +1,13 @@
+class DeliveryPlugin::Base < Noosfero::Plugin
+
+ def stylesheet?
+ true
+ end
+
+ def js_files
+ ['delivery'].map{ |j| "javascripts/#{j}" }
+ end
+
+end
+
+
diff --git a/plugins/delivery/lib/delivery_plugin/display_helper.rb b/plugins/delivery/lib/delivery_plugin/display_helper.rb
new file mode 100644
index 0000000..1a02e1e
--- /dev/null
+++ b/plugins/delivery/lib/delivery_plugin/display_helper.rb
@@ -0,0 +1,25 @@
+module DeliveryPlugin::DisplayHelper
+
+ def input_group_addon unit
+ yield
+ end unless defined? ResponsivePlugin
+
+ def supplier_delivery_options options = {}
+ selected = options[:selected]
+ methods = options[:methods] || profile.delivery_methods
+
+ options = methods.map do |method|
+ cost = if method.fixed_cost.present? and method.fixed_cost > 0 then float_to_currency_cart(method.fixed_cost, environment) else nil end
+ text = if cost.present? then "#{method.name} (#{cost})" else method.name end
+
+ content_tag :option, text, value: method.id,
+ data: {label: method.name, type: method.delivery_type, instructions: method.description.to_s},
+ selected: if method == selected then 'selected' else nil end
+ end.join
+ end
+
+ def delivery_context
+ @delivery_context || 'delivery_plugin/admin_method'
+ end
+
+end
diff --git a/plugins/delivery/lib/ext/profile.rb b/plugins/delivery/lib/ext/profile.rb
new file mode 100644
index 0000000..a40e513
--- /dev/null
+++ b/plugins/delivery/lib/ext/profile.rb
@@ -0,0 +1,7 @@
+require_dependency 'profile'
+
+class Profile
+
+ has_many :delivery_methods, class_name: 'DeliveryPlugin::Method', foreign_key: :profile_id, dependent: :destroy, order: 'id ASC'
+
+end
diff --git a/plugins/delivery/locales/en-US.yml b/plugins/delivery/locales/en-US.yml
new file mode 100644
index 0000000..eba15b1
--- /dev/null
+++ b/plugins/delivery/locales/en-US.yml
@@ -0,0 +1,48 @@
+"en-US": &en-US
+
+ delivery_plugin:
+ lib:
+ plugin:
+ name: "Delivery"
+ description: "Management of delivery's methods and options"
+ models:
+ method:
+ pickup: 'Pickup'
+ deliver: 'Deliver'
+ delivery_type: 'Type'
+ delivery_type_help: 'Pickup: the products will be delivered in the consumption place.
Delivery: the products will be delivered in the address asked by the consumer.'
+ name: Name
+ name_help: Write the name of the Consumption Place or the
+ fixed_cost: Fixed cost
+ free_over_price: Order's minimum price for free delivery
+ instructions: Description
+ instructions_help: "Write the address and other important informations about the place of this consumption place.
This text will be available"
+ views:
+ delivery_option:
+ select:
+ add: Add selected
+ _select_content:
+ add: Add option
+ add_new: "add new"
+ are_you_sure_you_want: "Are you sure you want to remove?"
+ cancel: cancel
+ choose_a_delivery_met: "Choose a delivery method from the list"
+ edit_this: "Edit"
+ remove_method: "Remover"
+ _show:
+ x: X
+ select:
+ add_a_delivery_method: "Add a delivery method to the Orders' Cycle"
+ method:
+ index:
+ new: "New delivery or pickup"
+ edit:
+ add: Add
+ back: back
+ save: Save
+
+'en_US':
+ <<: *en-US
+'en':
+ <<: *en-US
+
diff --git a/plugins/delivery/locales/pt-BR.yml b/plugins/delivery/locales/pt-BR.yml
new file mode 100644
index 0000000..26d1e2b
--- /dev/null
+++ b/plugins/delivery/locales/pt-BR.yml
@@ -0,0 +1,48 @@
+"pt-BR": &pt-BR
+
+ delivery_plugin:
+ lib:
+ plugin:
+ name: "Entrega"
+ description: "Gestão de métodos e opções de entrega"
+ models:
+ method:
+ pickup: 'Retirada'
+ deliver: 'Entrega'
+ delivery_type: "Tipo"
+ delivery_type_help: "Retirada: os produtos serão buscados pela(o) consumidor(a), por exemplo, no empreendimento, numa feira ou num Núcleo de Consumo.
Entrega: os produtos serão entregues no endereço solicitado pelo(a) consumidor(a)."
+ name: Nome
+ name_help: "Para opção Retirada: escreva o nome do local onde os produtos deverão ser retirados pela(o) consumidor(a), por exemplo o nome do Núcleo de Consumo, da feira ou do próprio empreendimento.
Para a opção Entrega: escreva o nome do local, (uma cidade ou região) ou a forma de entrega (Correios, transportadora)"
+ fixed_cost: Custo
+ free_over_price: "Preço mínimo do pedido para Entrega Grátis"
+ instructions: Descrição
+ instructions_help: "Escreva informações importantes sobre esta opção de Retirada ou Entrega.
Por exemplo, o endereço completo do Núcleo de Consumo, a abrangência da região de entrega.
Este texto estará disponível no \"Finalizar pedido\" e, ao confirmar a compra, o(a) consumidor(a) receberá um email com o pedido realizado e as informações deste campo."
+ views:
+ delivery_option:
+ select:
+ add: "Adicionar selecionados"
+ _select_content:
+ add: Adicionar opção
+ add_new: "adicionar novo"
+ are_you_sure_you_want: "Tem certeza de que quer remover?"
+ cancel: Cancelar
+ choose_a_delivery_met: "Escolha um método de entrega da lista"
+ edit_this: Editar
+ remove_method: "Remover"
+ _show:
+ x: X
+ select:
+ add_a_delivery_method: "Adicionar um método de entrega ao ciclo de pedidos"
+ method:
+ index:
+ new: "Nova forma de entrega ou retirada"
+ edit:
+ add: Adicionar
+ back: voltar
+ save: Salvar
+
+'pt_BR':
+ <<: *pt-BR
+'pt':
+ <<: *pt-BR
+
diff --git a/plugins/delivery/models/delivery_plugin/method.rb b/plugins/delivery/models/delivery_plugin/method.rb
new file mode 100644
index 0000000..05398ed
--- /dev/null
+++ b/plugins/delivery/models/delivery_plugin/method.rb
@@ -0,0 +1,53 @@
+class DeliveryPlugin::Method < ActiveRecord::Base
+
+ extend CurrencyHelper::ClassMethods
+
+ Types = ['pickup', 'deliver']
+
+ # see also: Profile::LOCATION_FIELDS
+ AddressFields = %w[
+ address address_line2 address_reference district city state country_name zip_code
+ ].map(&:to_sym)
+
+ attr_accessible :profile, :delivery_type, :name, :description,
+ :fixed_cost, :free_over_price
+
+ belongs_to :profile
+
+ has_many :delivery_options, class_name: 'DeliveryPlugin::Option', foreign_key: :delivery_method_id, dependent: :destroy
+
+ validates_presence_of :profile
+ validates_presence_of :name
+ validates_inclusion_of :delivery_type, in: Types
+
+ scope :pickup, conditions: {delivery_type: 'pickup'}
+ scope :delivery, conditions: {delivery_type: 'deliver'}
+
+ def pickup?
+ self.delivery_type == 'pickup'
+ end
+ def deliver?
+ self.delivery_type == 'deliver'
+ end
+
+ def has_cost? order_price=nil
+ if order_price.present? and order_price.nonzero? and self.free_over_price.present? and self.free_over_price.nonzero?
+ order_price <= self.free_over_price
+ else
+ self.fixed_cost.present? and self.fixed_cost.nonzero?
+ end
+ end
+ def free? order_price=nil
+ !self.has_cost?
+ end
+
+ def cost order_price=nil
+ if self.has_cost?(order_price) then self.fixed_cost.to_f else 0 end
+ end
+ has_currency :fixed_cost
+ has_currency :free_over_price
+ has_currency :cost
+
+ protected
+
+end
diff --git a/plugins/delivery/models/delivery_plugin/option.rb b/plugins/delivery/models/delivery_plugin/option.rb
new file mode 100644
index 0000000..12998d7
--- /dev/null
+++ b/plugins/delivery/models/delivery_plugin/option.rb
@@ -0,0 +1,11 @@
+class DeliveryPlugin::Option < ActiveRecord::Base
+
+ belongs_to :delivery_method, :class_name => 'DeliveryPlugin::Method'
+ belongs_to :owner, :polymorphic => true
+
+ validates_presence_of :delivery_method
+ validates_presence_of :owner
+
+ attr_accessible :owner_id, :owner_type, :delivery_methods, :delivery_method
+
+end
diff --git a/plugins/delivery/public/javascripts/delivery.js b/plugins/delivery/public/javascripts/delivery.js
new file mode 100644
index 0000000..cbba70d
--- /dev/null
+++ b/plugins/delivery/public/javascripts/delivery.js
@@ -0,0 +1,103 @@
+
+delivery = {
+
+ order: {
+ select: {
+
+ onChange: function(input) {
+ var input = jQuery(input)
+ var deliverySelect = input.parents('.order-delivery-select')
+
+ var option = input.find('option:selected')
+ var typeData = option.attr('data-type')
+ var isPickup = typeData == 'pickup'
+ var instructionsData = option.attr('data-instructions')
+ var labelData = option.attr('data-label')
+
+ var instructions = deliverySelect.find('.instructions')
+ instructions.html(instructionsData)
+ var consumerData = deliverySelect.find('.consumer-delivery-data')
+ if (isPickup) {
+ consumerData.slideUp('fast')
+ } else {
+ consumerData.slideDown('fast')
+ }
+ },
+
+ },
+ },
+
+ option: {
+ },
+
+ method: {
+
+ view: {
+ edition: function() {
+ return jQuery('#delivery-method-edition')
+ },
+ listing: function() {
+ return jQuery('#delivery-method-list')
+ },
+ toggle: function () {
+ jQuery('#delivery-method-list, #delivery-method-edition').fadeToggle();
+ },
+ },
+
+ changeType: function(select) {
+ select = jQuery(select)
+ },
+
+ new: function(newUrl) {
+ this.edit(newUrl)
+ },
+
+ edit: function(editUrl) {
+ var listing = this.view.listing()
+ var edition = this.view.edition()
+
+ loading_overlay.show(listing)
+ jQuery.get(editUrl, function(data) {
+ edition.html(data)
+ delivery.method.view.toggle();
+ loading_overlay.hide(listing)
+ });
+ },
+
+ save: function(form) {
+ var listing = this.view.listing()
+ var edition = this.view.edition()
+
+ jQuery(form).ajaxSubmit({
+ beforeSubmit: function() {
+ loading_overlay.show(edition)
+ }, success: function(data) {
+ listing.html(data);
+ delivery.method.view.toggle();
+ loading_overlay.hide(edition)
+ },
+ })
+ return false;
+ },
+
+ destroy: function(id, confirmText, destroy_url) {
+ if (!confirm(confirmText))
+ return
+ var method = jQuery('#delivery-method-'+id)
+ jQuery.post(destroy_url, function() {
+ method.fadeOut(function() {
+ method.remove()
+ })
+ })
+ },
+
+ },
+
+ option: {
+
+ add: function(newUrl) {
+ $.getScript(newUrl)
+ },
+ },
+
+};
diff --git a/plugins/delivery/public/style.scss b/plugins/delivery/public/style.scss
new file mode 100644
index 0000000..d31d8f3
--- /dev/null
+++ b/plugins/delivery/public/style.scss
@@ -0,0 +1,2 @@
+@import 'stylesheets/delivery'
+
diff --git a/plugins/delivery/public/stylesheets/_base.scss b/plugins/delivery/public/stylesheets/_base.scss
new file mode 120000
index 0000000..26345f3
--- /dev/null
+++ b/plugins/delivery/public/stylesheets/_base.scss
@@ -0,0 +1 @@
+../../../suppliers/public/stylesheets/_base.scss
\ No newline at end of file
diff --git a/plugins/delivery/public/stylesheets/_field.scss b/plugins/delivery/public/stylesheets/_field.scss
new file mode 120000
index 0000000..46300a3
--- /dev/null
+++ b/plugins/delivery/public/stylesheets/_field.scss
@@ -0,0 +1 @@
+../../../suppliers/public/stylesheets/_field.scss
\ No newline at end of file
diff --git a/plugins/delivery/public/stylesheets/delivery.scss b/plugins/delivery/public/stylesheets/delivery.scss
new file mode 100644
index 0000000..a38aac1
--- /dev/null
+++ b/plugins/delivery/public/stylesheets/delivery.scss
@@ -0,0 +1,40 @@
+@import 'base';
+
+#delivery-method-edition {
+ @extend .container-clean;
+
+ .field-help {
+ font-size: 10px;
+ }
+}
+#delivery-method-list {
+}
+
+#delivery-add {
+ // to resize popin
+ overflow: hidden;
+}
+
+.delivery-method {
+ .select {
+ width: 20px;
+ }
+
+}
+
+.order-delivery-select {
+
+}
+
+#delivery-method-choose {
+ height: 235px;
+
+ #delivery-menu a {
+ text-transform: capitalize;
+ }
+}
+
+.cycle-delete-delivery-option {
+ font-weight: bold;
+}
+
diff --git a/plugins/delivery/test/test_helper.rb b/plugins/delivery/test/test_helper.rb
new file mode 100644
index 0000000..cca1fd3
--- /dev/null
+++ b/plugins/delivery/test/test_helper.rb
@@ -0,0 +1 @@
+require File.dirname(__FILE__) + '/../../../test/test_helper'
diff --git a/plugins/delivery/test/unit/delivery_plugin/method_test.rb b/plugins/delivery/test/unit/delivery_plugin/method_test.rb
new file mode 100644
index 0000000..9dec65e
--- /dev/null
+++ b/plugins/delivery/test/unit/delivery_plugin/method_test.rb
@@ -0,0 +1,42 @@
+require "#{File.dirname(__FILE__)}/../../test_helper"
+
+class DeliveryPlugin::MethodTest < ActiveSupport::TestCase
+
+ def setup
+ @profile = build(Profile)
+ end
+
+ attr_accessor :profile
+
+ should 'have a name and a delivery type' do
+ dm = DeliveryPlugin::Method.new :name => 'Delivery Deluxe', :delivery_type => 'deliver', :profile => profile
+ assert dm.valid?
+ dm = DeliveryPlugin::Method.new :profile => profile
+ assert !dm.valid?
+ end
+
+ should 'accept only pickup and deliver as delivery types' do
+ dm = build(DeliveryPlugin::Method, :name => 'Delivery Deluxe', :delivery_type => 'unkown', :profile => profile)
+ assert !dm.valid?
+ dm = build(DeliveryPlugin::Method, :name => 'Delivery Deluxe', :delivery_type => 'pickup', :profile => profile)
+ assert dm.valid?
+ dm = build(DeliveryPlugin::Method, :name => 'Delivery Deluxe', :delivery_type => 'deliver', :profile => profile)
+ assert dm.valid?
+ end
+
+ should 'filter by delivery types' do
+ dm_deliver = create(DeliveryPlugin::Method, :name => 'Delivery Deluxe', :delivery_type => 'deliver', :profile => profile)
+ dm_pickup = create(DeliveryPlugin::Method, :name => 'Delivery Deluxe', :delivery_type => 'pickup', :profile => profile)
+ assert_equal [dm_deliver], DeliveryPlugin::Method.delivery
+ assert_equal [dm_pickup], DeliveryPlugin::Method.pickup
+ end
+
+ should 'have many delivery options' do
+ dm = create(DeliveryPlugin::Method, :name => 'Delivery Deluxe', :delivery_type => 'deliver', :profile => profile)
+ cycle = build(OrdersCyclePlugin::Cycle, :name => 'cycle name', :profile => profile)
+ option = create(DeliveryPlugin::Option, :cycle => cycle, :delivery_method => dm)
+
+ assert_equal [option], dm.reload.delivery_options
+ end
+
+end
diff --git a/plugins/delivery/test/unit/delivery_plugin/option_test.rb b/plugins/delivery/test/unit/delivery_plugin/option_test.rb
new file mode 100644
index 0000000..f8a3617
--- /dev/null
+++ b/plugins/delivery/test/unit/delivery_plugin/option_test.rb
@@ -0,0 +1,24 @@
+require "#{File.dirname(__FILE__)}/../../test_helper"
+
+class DeliveryPlugin::OptionTest < ActiveSupport::TestCase
+
+ def setup
+ @profile = build(Profile)
+ @cycle = build(OrdersCyclePluginCycle, :profile => @profile)
+ @delivery_method = build(OrdersCyclePluginMethod, :profile => @profile)
+ end
+
+ attr_accessor :profile
+ attr_accessor :cycle
+ attr_accessor :delivery_method
+
+ should 'be associated with a cycle and a delivery method' do
+ option = OrdersCyclePluginOption.new :cycle => @cycle, :delivery_method => @delivery_method
+ assert option.valid?
+ option = OrdersCyclePluginOption.new
+ :wa
+
+ assert !option.valid?
+ end
+
+end
diff --git a/plugins/delivery/views/delivery_plugin/_order_select.html.slim b/plugins/delivery/views/delivery_plugin/_order_select.html.slim
new file mode 100644
index 0000000..4acc741
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/_order_select.html.slim
@@ -0,0 +1,31 @@
+- methods ||= order.delivery_methods
+- edition = true if edition.nil?
+- readonly = !edition
+
+div.order-delivery-select
+
+ div.supplier-delivery-data
+ = labelled_form_field _('Option'),
+ f.select(:supplier_delivery_id, supplier_delivery_options(methods: methods), {}, disabled: readonly,
+ onchange: 'delivery.order.select.onChange(this)', onkeyup: 'delivery.order.select.onChange(this)')
+ p.instructions
+
+ div.consumer-delivery-data
+ = f.fields_for :consumer_delivery_data, order.consumer_delivery_data do |ff|
+ = labelled_form_field _('Address (street and number)'),
+ ff.text_field(:address, value: order.consumer_delivery_data[:address], readonly: readonly)
+ = labelled_form_field _('Address completion'),
+ ff.text_field(:address_line2, value: order.consumer_delivery_data[:address_line2], readonly: readonly)
+ = labelled_form_field _('Address reference'),
+ ff.text_field(:address_reference, value: order.consumer_delivery_data[:address_reference], readonly: readonly)
+ = labelled_form_field _('District'),
+ ff.text_field(:district, value: order.consumer_delivery_data[:district], readonly: readonly)
+ = labelled_form_field _('City'),
+ ff.text_field(:city, value: order.consumer_delivery_data[:city], readonly: readonly)
+ = labelled_form_field _('State'),
+ ff.text_field(:state, value: order.consumer_delivery_data[:state], readonly: readonly)
+ = labelled_form_field _('ZIP code'),
+ ff.text_field(:zip_code, value: order.consumer_delivery_data[:zip_code], readonly: readonly)
+
+ javascript:
+ delivery.order.select.onChange($('#order_supplier_delivery_id'))
diff --git a/plugins/delivery/views/delivery_plugin/admin_method/_edit.html.slim b/plugins/delivery/views/delivery_plugin/admin_method/_edit.html.slim
new file mode 100644
index 0000000..717bfd1
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_method/_edit.html.slim
@@ -0,0 +1,26 @@
+= form_for delivery_method, as: :delivery_method,
+ url: request.GET.merge(controller: delivery_context, action: delivery_method.new_record? ? :new : :edit, id: delivery_method.id),
+ html: {onsubmit: 'return delivery.method.save(this)'} do |f|
+
+ = error_messages_for :delivery_method
+
+ = labelled_field f, :delivery_type, t('delivery_plugin.models.method.delivery_type'),
+ f.select(:delivery_type, DeliveryPlugin::Method::Types.map{ |t| [t("delivery_plugin.models.method.#{t}"), t] },
+ onchange: 'delivery.method.changeType(this)', onkeyup: 'this.onchange()'),
+ help: t('delivery_plugin.models.method.delivery_type_help')
+
+ = labelled_field f, :name, t('delivery_plugin.models.method.name'), f.text_field(:name),
+ help: t('delivery_plugin.models.method.name_help')
+ = labelled_field f, :description, t('delivery_plugin.models.method.instructions'),
+ f.text_area(:description, rows: 5), help: t('delivery_plugin.models.method.instructions_help')
+
+ = labelled_field f, :fixed_cost, t('delivery_plugin.models.method.fixed_cost'),
+ input_group_addon(environment.currency_unit){ f.text_field :fixed_cost, type: :number, step: '0.01', value: number_with_precision(delivery_method.fixed_cost, precision: 2, locale: :en)}
+
+ = labelled_field f, :free_over_price, t('delivery_plugin.models.method.free_over_price'),
+ input_group_addon(environment.currency_unit){ f.text_field :free_over_price, type: :number, step: '0.01', value: number_with_precision(delivery_method.free_over_price, precision: 2, locale: :en)}
+
+ div
+ = submit_button :save, if delivery_method.new_record? then t('delivery_plugin.views.method.edit.add') else t('delivery_plugin.views.method.edit.save') end
+ = link_to_function t('delivery_plugin.views.method.edit.back'), "delivery.method.view.toggle()"
+
diff --git a/plugins/delivery/views/delivery_plugin/admin_method/_index.html.slim b/plugins/delivery/views/delivery_plugin/admin_method/_index.html.slim
new file mode 100644
index 0000000..3089dbd
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_method/_index.html.slim
@@ -0,0 +1,4 @@
+table#delivery-method-list
+ = render 'delivery_plugin/admin_method/list'
+
+#delivery-method-edition style=("display: none")
diff --git a/plugins/delivery/views/delivery_plugin/admin_method/_list.html.slim b/plugins/delivery/views/delivery_plugin/admin_method/_list.html.slim
new file mode 100644
index 0000000..db3ec43
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_method/_list.html.slim
@@ -0,0 +1,9 @@
+tr
+ td colspan=3
+ = button_to_function :add, t('delivery_plugin.views.method.index.new'),
+ "delivery.method.new('#{url_for request.GET.merge(controller: 'delivery_plugin/admin_method', action: :new)}')"
+
+- profile.delivery_methods.each do |m|
+ tr.delivery-method id="delivery-method-#{m.id}"
+ = render "delivery_plugin/admin_method/show", method: m
+
diff --git a/plugins/delivery/views/delivery_plugin/admin_method/_show.html.slim b/plugins/delivery/views/delivery_plugin/admin_method/_show.html.slim
new file mode 100644
index 0000000..d9bf24f
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_method/_show.html.slim
@@ -0,0 +1,12 @@
+td.name title="#{method.description}"
+ = method.name
+td.actions
+ - if request.GET[:select_ids].present? and not method.id.to_s.in? Array(request.GET[:selected_ids])
+ = button_to_function :add, t('delivery_plugin.views.delivery_option._select_content.add'),
+ "delivery.option.add('#{url_for request.GET.merge(controller: 'delivery_plugin/admin_options', action: :new, method_id: method.id)}')"
+
+ = button_to_function :edit, t('delivery_plugin.views.delivery_option._select_content.edit_this'),
+ "delivery.method.edit('#{url_for request.GET.merge(controller: delivery_context, action: :edit, id: method.id)}')"
+ = button_to_function :remove, t('delivery_plugin.views.delivery_option._select_content.remove_method'),
+ "delivery.method.destroy(#{method.id}, '#{t('delivery_plugin.views.delivery_option._select_content.are_you_sure_you_want')}',
+ '#{url_for request.GET.merge(controller: delivery_context, action: :destroy, id: method.id)}')"
diff --git a/plugins/delivery/views/delivery_plugin/admin_method/edit.html.slim b/plugins/delivery/views/delivery_plugin/admin_method/edit.html.slim
new file mode 120000
index 0000000..74b090f
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_method/edit.html.slim
@@ -0,0 +1 @@
+_edit.html.slim
\ No newline at end of file
diff --git a/plugins/delivery/views/delivery_plugin/admin_method/new.js.erb b/plugins/delivery/views/delivery_plugin/admin_method/new.js.erb
new file mode 100644
index 0000000..2b2ec16
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_method/new.js.erb
@@ -0,0 +1,2 @@
+$('#delivery-method-edition').replaceWith('<%=j render 'index' %>')
+
diff --git a/plugins/delivery/views/delivery_plugin/admin_options/_index.html.slim b/plugins/delivery/views/delivery_plugin/admin_options/_index.html.slim
new file mode 100644
index 0000000..1890937
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_options/_index.html.slim
@@ -0,0 +1,3 @@
+- owner.delivery_options.each do |o|
+ = render 'delivery_plugin/admin_options/show', owner: owner, option: o
+
diff --git a/plugins/delivery/views/delivery_plugin/admin_options/_new.js.erb b/plugins/delivery/views/delivery_plugin/admin_options/_new.js.erb
new file mode 100644
index 0000000..56977ec
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_options/_new.js.erb
@@ -0,0 +1,4 @@
+// FIXME: move to orders_cycle plugin
+jQuery('#cycle-delivery-options').html('<%= j render('index', owner: @owner) %>');
+noosfero.modal.close()
+
diff --git a/plugins/delivery/views/delivery_plugin/admin_options/_show.html.slim b/plugins/delivery/views/delivery_plugin/admin_options/_show.html.slim
new file mode 100644
index 0000000..937b312
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_options/_show.html.slim
@@ -0,0 +1,5 @@
+.cycle-delivery-option id="cycle-delivery-option-#{option.id}"
+ span= option.delivery_method.name
+ = link_to_remote t('delivery_plugin.views.delivery_option._show.x'),
+ { url: {controller: 'delivery_plugin/admin_options', action: :destroy, id: option.id, owner_id: owner.id, owner_type: owner.class.name} },
+ class: 'cycle-delete-delivery-option'
diff --git a/plugins/delivery/views/delivery_plugin/admin_options/destroy.rjs b/plugins/delivery/views/delivery_plugin/admin_options/destroy.rjs
new file mode 100644
index 0000000..289ceb6
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_options/destroy.rjs
@@ -0,0 +1 @@
+page.remove "cycle-delivery-option-#{@delivery_option.id}"
diff --git a/plugins/delivery/views/delivery_plugin/admin_options/new.js.erb b/plugins/delivery/views/delivery_plugin/admin_options/new.js.erb
new file mode 120000
index 0000000..073ee2f
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_options/new.js.erb
@@ -0,0 +1 @@
+_new.js.erb
\ No newline at end of file
diff --git a/plugins/delivery/views/delivery_plugin/admin_options/select.html.slim b/plugins/delivery/views/delivery_plugin/admin_options/select.html.slim
new file mode 100644
index 0000000..7739600
--- /dev/null
+++ b/plugins/delivery/views/delivery_plugin/admin_options/select.html.slim
@@ -0,0 +1,8 @@
+#delivery-add.popin
+ h1= t('delivery_plugin.views.delivery_option.select.add_a_delivery_method')
+
+ / flag to admin_method/show that we want to select an option from methods
+ - request.GET[:select_ids] = 'true'
+ - request.GET[:selected_ids] = @owner.delivery_methods.map(&:id).map(&:to_s)
+ = render 'delivery_plugin/admin_method/index'
+
--
libgit2 0.21.2