Current section

Files

Jump to
bpe src ext bpe_order.erl
Raw

src/ext/bpe_order.erl

-module(bpe_order).
-include_lib("bpe/include/bpe.hrl").
-export([def/0, auth/1, action/2]).
auth(_) -> true.
def() ->
P = #process{
name = "E-Commerce Order",
module = ?MODULE,
flows = [
#sequenceFlow{id = "->CartActive", source = "CartCreated", target = "CartActive"},
#sequenceFlow{id = "CartActive->Checkout", source = "CartActive", target = "Checkout"},
#sequenceFlow{id = "AbandonedRecovery->CartActive", source = "AbandonedRecovery", target = "CartActive"},
#sequenceFlow{id = "Checkout->Payment", source = "Checkout", target = "Payment"},
#sequenceFlow{id = "Payment->Fulfilment", source = "Payment", target = "Fulfilment"},
#sequenceFlow{id = "Fulfilment->PostPurchase", source = "Fulfilment", target = "PostPurchase"},
#sequenceFlow{id = "PostPurchase->Delivered", source = "PostPurchase", target = "Delivered"}
],
tasks = [
#beginEvent{id = "CartCreated"},
#userTask{id = "CartActive"},
#serviceTask{id = "AbandonedRecovery"},
#userTask{id = "Checkout"},
#serviceTask{id = "Payment"},
#serviceTask{id = "Fulfilment"},
#serviceTask{id = "PostPurchase"},
#endEvent{id = "Delivered"}
],
beginEvent = "CartCreated",
endEvent = "Delivered",
events = [
#messageEvent{id = "PaymentReceived"},
#messageEvent{id = "ShipmentUpdate"},
#boundaryEvent{id = '*', timeout = #timeout{spec = {0, {1, 0, 0}}}}
]
},
P#process{tasks = bpe_xml:fillInOut(P#process.tasks, P#process.flows)}.
action({request, "CartCreated", _}, Proc) -> #result{state = Proc};
action({request, "CartActive", _}, Proc) -> #result{state = Proc};
action({request, "AbandonedRecovery", _}, Proc) ->
#result{
type = reply,
reply = "CartActive",
state = Proc#process{docs = [{abandoned_recovery_sent, true}]}
};
action({request, "Checkout", _}, Proc) -> #result{state = Proc};
action({request, "Payment", _}, Proc) ->
case bpe:doc({payment_received}, Proc) of
[] -> #result{type = reply, reply = "Payment", state = Proc};
_ -> #result{type = reply, reply = {complete, "Fulfilment"}, state = Proc#process{docs = [{tx, paid}]}}
end;
action({request, "Fulfilment", _}, Proc) -> #result{state = Proc};
action({request, "PostPurchase", _}, Proc) ->
#result{state = Proc#process{docs = [{post_purchase_sent, true}]}};
action({request, "Delivered", _}, Proc) -> #result{type = stop, state = Proc}.