Skip to content

Instantly share code, notes, and snippets.

@svs
Created December 30, 2012 15:28
Show Gist options
  • Save svs/4413305 to your computer and use it in GitHub Desktop.
Save svs/4413305 to your computer and use it in GitHub Desktop.
class QuotationWorkflow
def initialize(object)
@object = object
end
include Workflow
workflow do
state :created do
event :approve, :transitions_to => :approved, :if => Proc.new{|t| t.approvable? }
event :reject, :transitions_to => :rejected, :if => Proc.new{|t| t.rejectable? }
event :hold, :transitions_to => :on_hold, :if => Proc.new{|t| t.on_holdable? }
event :expire, :transitions_to => :expired, :if => Proc.new{|t| t.expirable? }
event :callback, :transitions_to => :callback, :if => Proc.new{|t| t.callbackable? }
end
state :approved do
event :send_quotation, :transitions_to => :sent, :if => Proc.new{|t| t.sendable? }
event :reject, :transitions_to => :rejected, :if => Proc.new{|t| t.rejectable? }
event :hold, :transitions_to => :on_hold, :if => Proc.new{|t| t.on_holdable? }
event :pay, :transitions_to => :paid, :if => Proc.new{|t| t.payable? }
event :expire, :transitions_to => :expired, :if => Proc.new{|t| t.expirable? }
end
state :sent do
event :send_quotation, :transitions_to => :sent, :if => Proc.new{|t| t.sendable? }
event :pay, :transitions_to => :paid, :if => Proc.new{|t| t.payable? }
event :expire, :transitions_to => :expired, :if => Proc.new{|t| t.expirable? }
end
state :on_hold do
event :approve, :transitions_to => :approved, :if => Proc.new{|t| t.approvable? }
event :reject, :transitions_to => :rejected, :if => Proc.new{|t| t.rejectable? }
event :expire, :transitions_to => :expired, :if => Proc.new{|t| t.expirable? }
event :callback, :transitions_to => :callback, :if => Proc.new{|t| t.callbackable? }
end
state :rejected do
event :approve, :transitions_to => :approved, :if => Proc.new{|t| t.approvable? }
event :hold, :transitions_to => :on_hold, :if => Proc.new{|t| t.on_holdable? }
event :expire, :transitions_to => :expired, :if => Proc.new{|t| t.expirable? }
end
state :paid do
event :expire, :transitions_to => :expired, :if => Proc.new{|t| t.expirable? }
end
state :expired
state :callback do
event :approve, :transitions_to => :approved, :if => Proc.new{|t| t.approvable? }
event :reject, :transitions_to => :rejected, :if => Proc.new{|t| t.rejectable? }
event :hold, :transitions_to => :on_hold, :if => Proc.new{|t| t.on_holdable? }
event :callback, :transitions_to => :callback, :if => Proc.new{|t| t.callbackable? }
end
before_transition do |from, to, event, *event_args|
self.callback_at = nil unless event == :callback
end
on_transition do |from, to, event, *event_args|
valid?
doer = event_args[0]
halt "Not Authorised" unless Ability.new(doer).can?(event, self)
al = ActivityLog.new(:from => from, :to => to, :event => event, :user => self.intended_trip.user,
:staff => (doer if doer.class == Staff), :parent_model => self.class.to_s, :parent_id => self.id)
al.save
end
end
def send_quotation(doer, params = {})
valid?
UserMailer.quotation(self).deliver
self.sent_at = DateTime.now
Transaction.all(:amount.lte => 0, :quotation => @object).destroy
t = Transaction.create(:amount => -quoted_price, :date => Date.today, :user => intended_trip.user, :created_by => doer, :comment => "#{doer.email} sent quotation", :quotation => self)
end
def pay(doer, params = {})
t = Transaction.create(:amount => quoted_price, :date => Date.today, :user => self.intended_trip.user, :created_by => doer, :comment => "#{doer.email} marked as 'Paid'", :quotation => self)
end
def callback(user, params)
self.callback_at = params[:callback_at] unless attribute_dirty?(:callback_at)
halt("require callback_at time in order to mark as calback") unless self.callback_at
end
def expire(user, params = {})
@object.quality = :expired
end
def load_workflow_state
@object.workflow_state
end
def persist_workflow_state(new_value)
return if halted?
@object.workflow_state = new_value
@object.save!
end
def method_missing(name, *args)
@object.send(name, *args)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment