如何创建自定义运费 - Spree

时间:2015-07-28 03:29:35

标签: ruby-on-rails-4 spree

我所拥有的是一个拥有多个不同用户角色的网站。通常只有管理员和用户。我有多个不同的用户(零售,贸易等)。

客户想要的是,每件产品都有单独的运费。用户的实际成本不同(因此,如果零售价为10美元,则交易运费可能为8美元)。如果选择了多个产品,则第一个产品将100%发货,每个附加产品将发货50%。此价格根据客户的送货地点而有所不同。它也根据项目的类别而有所不同(例如,他们有座位类别和鱼箱类别。座位类别可能是15美元,鱼箱可能是17美元。

我的想法是每个类别都有自己的运输类别,然后运输方式只是位置。这样可以正常工作,但棘手的部分是如何根据用户登录进行调整。我给出的价格与零售运输和贸易运输之间的差异一致(贸易运输总是零售运输的80%)。

基本上,如果我能找到运费计算的位置,那将是多么美妙的事情。这样我可以测试用户是否是交易客户并将值更改为实际值* .80,否则该值是正常的。

如果你们中的任何一个人都没有时间帮助我,我将非常感激。

2 个答案:

答案 0 :(得分:4)

  

基本上,如果我能找到它的话,那将是多么伟大的事情   运费计算完成。

计算在Spree::Calculator::Shipping类(FlatRate,'PerItem`等)中完成 - 请检查source

你可能想要自定义计算器(或装饰现有方法),所以在models/spree/calculator/shipping/my_custom_method.rb中添加文件:

module Spree
  module Calculator::Shipping
    class MyCustomMethod < ShippingCalculator
      preference :amount, :decimal, default: 0
      preference :something_i_need, :string, default: :foo #and so on, those preferences will be ready to set/change in admin panel

      def self.description
        Spree.t(:my_custom_method) # just a label
      end

      # here is where magic happens
      def compute_package(package)
        package.order.shipment_total
      end

    end
  end
end

正如您所看到的,在compute_package对象上调用方法package,该对象有几种有用的方法(source),但您可以直接调用package.order来获取所有line_items shipments 1}},user,订单initializers/shipping_methods.rb以及计算有效金额所需的所有内容。

如果您想创建新方法,请不要忘记将其注册,以便它显示在管理面板中,以便您可以更改设置 - 当然,如果您愿意,可以以编程方式执行此操作:

Rails.application.config.spree.calculators.shipping_methods << Spree::Calculator::Shipping::MyCustomMethod

    SentMessageTableViewCell *sentMessageCell;
    sentMessageCell = [tableView dequeueReusableCellWithIdentifier:@"SentChatMessage"];

    if(sentMessageCell == nil)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SentChatMessage" owner:self options:nil];
        sentMessageCell = [topLevelObjects objectAtIndex:0];
    }
    sentMessageCell.message = message.body;
    [sentMessageCell initWithMessage:message.body andDateTimeStamp:sendDateTimeStamp];
    return sentMessageCell;

答案 1 :(得分:0)

好的,这就是我到目前为止所做的。

在app / models / spree / calculator / shipping / per_item.rb中 (我从\ vendor \ bundle \ ruby​​ \ 1.9.1 \ gems \ spree_core-2.4.7 \ app \ models \ spree \ calculator \ shipping \ per_item.rb复制的狂欢标准模型)

require_dependency spree/shipping_calculator

module Spree
  module Calculator::Shipping
    class PerItem < ShippingCalculator
    preference :amount, :decimal, default: 0
    preference :currency, :string, default: ->{ Spree::Config[:currency] }

  def self.description
    Spree.t(:shipping_flat_rate_per_item)
  end

  def compute_package(package)
    if package.contents.sum(&:quantity) > 1
      compute_from_multiple(package.contents.sum(&:quantity))
    else
      compute_from_single(package.contents.sum(&:quantity))
    end
  end

  def compute_from_multiple(quantity)
    (self.preferred_amount / 2) + ((self.preferred_amount * quantity) / 2
  end

  def compute_from_single(quantity)
    self.preferred_amount * quantity
  end

end

这将测试购物车中的商品数量,如果超过1,则会一件商品100%发货,其余50%发货。

我现在无法弄清楚如何访问当前用户。

例如

    if current_spree_user.has_spree_role?("admin")
      (self.preferred_amount / 2) + ((self.preferred_amount * quantity) / 2)
    else
      ((self.preferred_amount / 2) + ((self.preferred_amount * quantity) / 2)) * 0.87
    end

这会出错:

 undefined local variable or method `spree_current_user'

有谁知道如何在模型中检查当前用户???