require 'piggybak/config' require 'acts_as_sellable' require 'acts_as_orderer' require 'acts_as_changer' require 'active_merchant' require 'formatted_changes' require 'currency' require 'mask_submissions' require 'rack-ssl-enforcer' module Piggybak def self.config(entity = nil, &block) if entity Piggybak::Config.model(entity, &block) elsif block_given? && ENV['SKIP_RAILS_ADMIN_INITIALIZER'] != "true" block.call(Piggybak::Config) else Piggybak::Config end end def self.reset Piggybak::Config.reset end class Engine < Rails::Engine initializer "piggybak.ssl_enforcer" do |app| # Note: If your main application also uses rack-ssl-enforcer, # append to Piggyak.config.extra_secure_paths # inside a before_initialize block if Piggybak.config.secure_checkout paths = [/^#{Piggybak.config.secure_prefix}\/checkout\/$/, "#{Piggybak.config.secure_prefix}/checkout/orders/tax", "#{Piggybak.config.secure_prefix}/checkout/orders/shipping", "#{Piggybak.config.secure_prefix}/checkout/orders/geodata", /^\/users$/, "/users/sign_in", "/users/sign_out", "/users/sign_up"] Piggybak.config.extra_secure_paths.each do |extra_path| paths << [/^#{Piggybak.config.secure_prefix}#{extra_path}/] end app.config.middleware.use Rack::SslEnforcer, :only => paths, :strict => true end end initializer "piggybak.add_helper" do |app| ApplicationController.class_eval do helper :piggybak end end initializer "piggybak.precompile_hook", :group => :all do |app| app.config.assets.precompile += ['piggybak/piggybak-application.js'] end # Needed for development config.to_prepare do Piggybak.config.line_item_types.each do |k, v| plural_k = k.to_s.pluralize.to_sym if v[:nested_attrs] Piggybak::LineItem.class_eval do # TODO: dependent destroy destroys all line items. Fix and remove after_destroy on line items has_one k, :class_name => v[:class_name] #, :dependent => :destroy accepts_nested_attributes_for k attr_accessible "#{k}_attributes".to_sym end end Piggybak::Order.class_eval do define_method "#{k}_charge" do self.line_items.send(plural_k).map(&:price).reduce(:+) || 0 end end end Piggybak::Order.class_eval do has_many :line_items, :inverse_of => :order do Piggybak.config.line_item_types.each do |k, v| # Define proxy association method for line items # e.g. self.line_items.sellables # e.g. self.line_items.taxes define_method "#{k.to_s.pluralize}" do proxy_association.proxy.select { |li| li.line_item_type == "#{k}" && !li.marked_for_destruction? } end end end # Define method subtotal on order, alias to sellable_charge alias :subtotal :sellable_charge end end initializer "piggybak.rails_admin_config" do |app| Piggybak.config.line_item_types.each do |k, v| plural_k = k.to_s.pluralize.to_sym if v[:nested_attrs] Piggybak::LineItem.class_eval do # TODO: See above has_one k, :class_name => v[:class_name] accepts_nested_attributes_for k attr_accessible "#{k}_attributes".to_sym end end end RailsAdmin::Config.reset_model(Piggybak::LineItem) RailsAdmin.config do |config| config.label_methods << :admin_label config.model Piggybak::LineItem do label "Line Item" visible false edit do field :line_item_type do label "Line Item Type" partial "polymorphic_nested" help "" end Piggybak.config.line_item_types.each do |k, v| if v[:nested_attrs] field k do active true end end end field :sellable_id, :enum do label "Sellable" help "Required" end field :price field :quantity field :description end end config.model Piggybak::Sellable do label "Sellable" visible false edit do field :sku field :description field :price field :active field :quantity field :unlimited_inventory do help "If true, backorders on this variant will be allowed, regardless of quantity on hand." end end end config.model Piggybak::Order do label "Order" navigation_label "Orders" weight 1 object_label_method :admin_label show do field :status field :total do formatted_value do "$%.2f" % value end end field :total_due do formatted_value do "$%.2f" % value end end field :created_at field :email field :phone field :user if defined?(User) field :line_items field :billing_address field :shipping_address field :order_notes do pretty_value do value.inject([]) { |arr, o| arr << o.details }.join("

").html_safe end end field :ip_address field :user_agent end list do field :id field :billing_address do label "Billing Name" pretty_value do "#{value.lastname}, #{value.firstname}" end searchable [:firstname, :lastname] sortable false end field :total do formatted_value do "$%.2f" % value end end field :created_at do strftime_format "%d-%m-%Y" end field :status end edit do field :recorded_changer, :hidden do partial "recorded_changer" end field :status do visible do !bindings[:object].new_record? end read_only do !bindings[:object].new_record? end end field :details do partial "order_details" help "" visible do !bindings[:object].new_record? end end field :user if defined?(User) field :email field :phone field :ip_address do partial "ip_address" end field :user_agent do read_only true end field :billing_address do active true help "Required" end field :shipping_address do active true help "Required" end field :line_items do active true help "" end field :order_notes do active true end end end config.model Piggybak::OrderNote do visible false list do field :user if defined?(User) field :note field :created_at end edit do field :details do label "Order Note" help "" visible do !bindings[:object].new_record? end read_only do !bindings[:object].new_record? end end field :user_id, :hidden do default_value do bindings[:view]._current_user.id end end field :note do visible do bindings[:object].new_record? end end end end config.model Piggybak::Address do label "Address" visible false edit do field :copy_from_billing do visible do bindings[:object].is_shipping end partial "copy_from_billing" label "Help" help "Copies address from billing to shipping." end field :firstname field :lastname field :address1 field :address2 field :city field :zip field :location do partial "location_select" help "Required" label "Country & State" end end end config.model Piggybak::Shipment do visible false edit do field :shipping_method do read_only do bindings[:object].status == "shipped" end end field :status do label "Shipping Status" end end end config.model Piggybak::Adjustment do visible false end config.model Piggybak::Payment do visible false edit do field :payment_method do read_only do !bindings[:object].new_record? end end field :masked_number do help "Required" label "Number" visible do !bindings[:object].new_record? end read_only do !bindings[:object].new_record? end end field :number do help "Required" visible do bindings[:object].new_record? end end field :verification_value do help "Required" visible do bindings[:object].new_record? end end field :month do label "Exp. Month" read_only do !bindings[:object].new_record? end end field :year do label "Exp. Year" read_only do !bindings[:object].new_record? end end end end config.model Piggybak::PaymentMethod do navigation_label "Configuration" weight 2 list do field :description field :active end edit do field :description do help "This is the label the user sees." end field :klass do label "Calculator" end field :active field :payment_method_values do label "Metadata" end end end config.model Piggybak::PaymentMethodValue do visible false edit do include_all_fields field :payment_method do visible false end end end config.model Piggybak::ShippingMethod do navigation_label "Configuration" edit do field :description do help "This is the label the user sees." end field :klass do label "Calculator" end field :active field :shipping_method_values do label "Metadata" end end list do field :description field :active end end config.model Piggybak::ShippingMethodValue do visible false edit do include_all_fields field :shipping_method do visible false end end end config.model Piggybak::TaxMethod do navigation_label "Configuration" edit do field :description field :klass do label "Calculator" end field :active field :tax_method_values do label "Metadata" end end list do field :description field :active end end config.model Piggybak::TaxMethodValue do visible false edit do include_all_fields field :tax_method do visible false end end end config.model Piggybak::Country do label "Countries" navigation_label "Geodata" weight 3 list do sort_by :name field :name field :abbr end edit do field :name field :abbr field :active_shipping field :active_billing end end config.model Piggybak::State do navigation_label "Geodata" label "States" list do field :name field :abbr field :country end edit do field :name field :abbr field :country end end end end end end