Created
December 30, 2012 15:28
-
-
Save svs/4413305 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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