Skip to content

Instantly share code, notes, and snippets.

@stockedge
Last active February 4, 2021 20:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stockedge/cd8fb06edad652d329cdb51d0c6b3b16 to your computer and use it in GitHub Desktop.
Save stockedge/cd8fb06edad652d329cdb51d0c6b3b16 to your computer and use it in GitHub Desktop.
class 「案件」
types
private 「案件ステータス」 = <請書発行済> | <見積保存> | <注文済> | <出荷済>
instance variables
private サービス: 「サービス条件」`「サービス」;
private 種類: [「製造サービス詳細条件」`「種類」];
private 案件ステータス: 「案件ステータス」 := <見積保存>;
private 適用クーポン: 「クーポン一覧」 := new 「クーポン一覧」();
private 見積有効期間: 「有効期限条件」`「期間」 := 90;
operations
public 「案件」: 「サービス条件」`「サービス」 * [「製造サービス詳細条件」`「種類」] ==> 「案件」
「案件」(aサービス, a種類) == atomic(
サービス := aサービス;
種類 := a種類
);
private pure 請書発行済: () ==> bool
請書発行済() == return 案件ステータス = <請書発行済>
post if 案件ステータス = <請書発行済> then RESULT = true else RESULT = true;
public 請書発行: () ==> ()
請書発行() == 案件ステータス := <請書発行済>
post 案件ステータス = <請書発行済>;
public クーポン適用: 「クーポン」 ==> ()
クーポン適用(aクーポン) == 適用クーポン.追加(aクーポン);
public クーポン適用: 「クーポン一覧」 ==> ()
クーポン適用(aクーポン一覧) == 適用クーポン.追加(aクーポン一覧);
public クーポン除外: 「クーポン」 ==> ()
クーポン除外(aクーポン) == 適用クーポン.除外(aクーポン);
public pure クーポン適用済み判定: 「クーポン」 ==> bool
クーポン適用済み判定(aクーポン) == 適用クーポン.保有(aクーポン);
public 友達紹介クーポン獲得: () ==> ()
友達紹介クーポン獲得() == if 請書発行済() then 適用クーポン.友達紹介クーポン獲得();
public pure getサービス: () ==> 「サービス条件」`「サービス」
getサービス() == return サービス;
public pure get種類: () ==> [「製造サービス詳細条件」`「種類」]
get種類() == return 種類;
end 「案件」
class 「案件一覧」
instance variables
private 案件一覧: set of 「案件」 := {}
end 「案件一覧」
class 「顧客」
instance variables
private CPM: 「CPM条件」`「CPM」;
private 使用クーポンコード: [「クーポンマスタ」`「クーポンコード」];
private クーポン一覧: 「クーポン一覧」 := new 「クーポン一覧」();
private 案件一覧: 「案件一覧」 := new 「案件一覧」();
operations
public 「顧客」: 「CPM条件」`「CPM」 * [「クーポンマスタ」`「クーポンコード」] * 「クーポン一覧」 * 「案件一覧」 ==> 「顧客」
「顧客」(aCPM, aクーポンコード, aクーポン一覧, a案件一覧) == atomic(
CPM := aCPM;
使用クーポンコード := aクーポンコード;
クーポン一覧 := aクーポン一覧;
案件一覧 := a案件一覧;
);
public pure getCPM: () ==> [「CPM条件」`「CPM」]
getCPM() == return CPM
post RESULT = CPM;
public pure getクーポンコード: () ==> [「クーポンマスタ」`「クーポンコード」]
getクーポンコード() == return 使用クーポンコード
post RESULT = 使用クーポンコード;
public pure getクーポン一覧: () ==> 「クーポン一覧」
getクーポン一覧() == return クーポン一覧
post RESULT = クーポン一覧;
public クーポン獲得: 「クーポン」 ==> ()
クーポン獲得(aクーポン) == return クーポン一覧.追加(aクーポン)
post クーポン一覧.保有(aクーポン);
end 「顧客」
class 「クーポン一覧」
instance variables
クーポン一覧: set of 「クーポン」 := {}
operations
public pure 保有判定: token ==> bool
保有判定(aクーポンマスタID) == return exists クーポン in set クーポン一覧 & クーポン.生成元判定(aクーポンマスタID);
public 追加: 「クーポン」 ==> ()
追加(aクーポン) == クーポン一覧 := クーポン一覧 union {aクーポン}
post aクーポン in set クーポン一覧 and
if aクーポン in set クーポン一覧~ then card クーポン一覧~ = card クーポン一覧
else card クーポン一覧~ + 1 = card クーポン一覧;
public 追加: 「クーポン一覧」 ==> ()
追加(aクーポン一覧) == クーポン一覧 := クーポン一覧 union aクーポン一覧.クーポン一覧
post forall クーポン in set aクーポン一覧.クーポン一覧 & クーポン in set クーポン一覧 and
card クーポン一覧 >= card aクーポン一覧.クーポン一覧;
public 除外: 「クーポン」 ==> ()
除外(aクーポン) == クーポン一覧 := クーポン一覧 \ {aクーポン}
post aクーポン not in set クーポン一覧 and
if aクーポン in set クーポン一覧~ then card クーポン一覧~ = card クーポン一覧 - 1
else card クーポン一覧~ = card クーポン一覧;
public pure 保有: 「クーポン」 ==> bool
保有(aクーポン) == return aクーポン in set クーポン一覧
post RESULT = aクーポン in set クーポン一覧;
public 友達紹介クーポン獲得: () ==> ()
友達紹介クーポン獲得() ==
for all クーポン in set クーポン一覧 do
クーポン.友達紹介クーポン獲得();
public pure クーポン数: () ==> nat
クーポン数() == return card クーポン一覧
post RESULT = card クーポン一覧;
end 「クーポン一覧」
class 「顧客条件」
operations
public pure 判定: 「顧客」 ==> bool
判定(a割引対象) == is subclass responsibility
end 「顧客条件」
class 「案件条件」
operations
public pure 判定: 「案件」 ==> bool
判定(a割引対象) == is subclass responsibility
end 「案件条件」
class 「CPM条件」 is subclass of 「顧客条件」
types
public 「CPM」 = <未注文客> | <初回客> | <よちよち客> | <こつこつ客> | <優良客> | <離れ客>
instance variables
private CPM条件: 「CPM」;
operations
public 「CPM条件」: 「CPM」 ==> 「CPM条件」
「CPM条件」(aCPM条件) == (CPM条件 := aCPM条件);
public pure 判定: 「顧客」 ==> bool
判定(a割引対象) == return a割引対象.getCPM() = CPM条件
post RESULT = (a割引対象.getCPM() = CPM条件);
end 「CPM条件」
class 「サービス条件」 is subclass of 「案件条件」
types
public 「サービス」 = <設計> | <製造> | <実装> | <筐体> | <ハーネス> | <メタルマスク>
instance variables
サービス条件: 「サービス」;
operations
public 「サービス条件」: 「サービス」 ==> 「サービス条件」
「サービス条件」(aサービス条件) == (サービス条件 := aサービス条件);
public pure 判定: 「案件」 ==> bool
判定(a割引対象) == return a割引対象.getサービス() = サービス条件
post RESULT = (a割引対象.getサービス() = サービス条件);
end 「サービス条件」
class 「製造サービス詳細条件」 is subclass of 「案件条件」
types
public 「種類」 = <リジッド> | <フレキ> | <アルミ> | <パネル>
instance variables
種類条件: 「種類」;
operations
public 「製造サービス詳細条件」: 「種類」 ==> 「製造サービス詳細条件」
「製造サービス詳細条件」(a種類条件) == (種類条件 := a種類条件);
public pure 判定: 「案件」 ==> bool
判定(a割引対象) == return a割引対象.get種類() = 種類条件
post RESULT = (a割引対象.get種類() = 種類条件);
end 「製造サービス詳細条件」
class 「クーポンコード条件」 is subclass of 「顧客条件」
instance variables
クーポンコード: 「クーポンマスタ」`「クーポンコード」;
operations
public 「クーポンコード条件」: 「クーポンマスタ」`「クーポンコード」 ==> 「クーポンコード条件」
「クーポンコード条件」(aクーポンコード) == (クーポンコード := aクーポンコード);
public pure 判定: 「顧客」 ==> bool
判定(a割引対象) == return a割引対象.getクーポンコード() = クーポンコード
post RESULT = (a割引対象.getクーポンコード() = クーポンコード);
end 「クーポンコード条件」
class 「恒真条件」 is subclass of 「顧客条件」
operations
public pure 判定: 「顧客」 ==> bool
判定(-) == return true;
end 「恒真条件」
class 「重複保有不可能条件」 is subclass of 「顧客条件」
instance variables
クーポンマスタID: 「クーポンマスタ」`「クーポンマスタID」;
operations
public 「重複保有不可能条件」: token ==> 「重複保有不可能条件」
「重複保有不可能条件」(aクーポンマスタID) == (クーポンマスタID := aクーポンマスタID);
public pure 判定: 「顧客」 ==> bool
判定(a割引対象) == return a割引対象.getクーポン一覧().保有判定(クーポンマスタID)
post RESULT = a割引対象.getクーポン一覧().保有判定(クーポンマスタID);
end 「重複保有不可能条件」
class 「案件AND条件」 is subclass of 「案件条件」
instance variables
条件リスト: seq1 of 「案件条件」;
operations
public 「案件AND条件」: seq1 of 「案件条件」 ==> 「案件AND条件」
「案件AND条件」(a条件リスト) == 条件リスト := a条件リスト;
public pure 判定: 「案件」 ==> bool
判定(a割引対象) == return forall 条件 in seq 条件リスト & 条件.判定(a割引対象)
post RESULT = forall 条件 in seq 条件リスト & 条件.判定(a割引対象);
end 「案件AND条件」
class 「顧客AND条件」 is subclass of 「顧客条件」
instance variables
条件リスト: seq1 of 「顧客条件」;
operations
public 「顧客AND条件」: seq1 of 「顧客条件」 ==> 「顧客AND条件」
「顧客AND条件」(a条件リスト) == 条件リスト := a条件リスト;
public pure 判定: 「顧客」 ==> bool
判定(a割引対象) == return forall 条件 in seq 条件リスト & 条件.判定(a割引対象)
post RESULT = forall 条件 in seq 条件リスト & 条件.判定(a割引対象);
end 「顧客AND条件」
class 「割引量」
types
public 「金額」 = nat
operations
public pure 割引: 「金額」 ==> 「金額」
割引(-) == is subclass responsibility
end 「割引量」
class 「割引率」 is subclass of 「割引量」
instance variables
割引率: real;
inv 0.0 <= 割引率 and 割引率 <= 1.0;
operations
public 「割引率」: real ==> 「割引率」
「割引率」(a割引率) == 割引率 := a割引率
pre 0.0 <= a割引率 and a割引率 <= 1.0;
public pure 割引: 「金額」 ==> 「金額」
割引(金額) == return 金額 - 金額 * self.割引率
pre 金額 > 0;
end 「割引率」
class 「割引額」 is subclass of 「割引量」
instance variables
割引額: 「金額」;
operations
public 「割引額」: 「金額」 ==> 「割引額」
「割引額」(a割引額) == 割引額 := a割引額;
public pure 割引: 「金額」 ==> 「金額」
割引(金額) == return 金額 - self.割引額
pre 金額 > 0;
end 「割引額」
class 「有効期限条件」
types
public 「日付」 = nat;
public 「期間」 = nat;
operations
public pure 判定: 「日付」 ==> bool
判定(-) == is subclass responsibility
end 「有効期限条件」
class 「特定日付期限」 is subclass of 「有効期限条件」
instance variables
特定日付: 「日付」;
operations
public 「特定日付期限」: 「日付」 ==> 「特定日付期限」
「特定日付期限」(a特定日付) == 特定日付 := a特定日付;
public pure 判定: 「日付」 ==> bool
判定(a日付) == return a日付 <= 特定日付
post RESULT = (a日付 <= 特定日付);
end 「特定日付期限」
class 「発行期日期限」 is subclass of 「有効期限条件」
instance variables
発行日: 「日付」;
有効期間: 「期間」;
operations
public 「発行期日期限」: 「日付」 * 「期間」 ==> 「発行期日期限」
「発行期日期限」(a発行日, a有効期間) == atomic(発行日 := a発行日; 有効期間 := a有効期間);
public pure 判定: 「日付」 ==> bool
判定(a日付) == return a日付 <= 発行日 + 有効期間
post RESULT = (a日付 <= 発行日 + 有効期間);
end 「発行期日期限」
class 「クーポンマスタ」
types
public 「クーポンコード」 = nat;
public 「クーポンマスタID」 = token;
instance variables
protected クーポンマスタID: 「クーポンマスタID」;
protected クーポンコード: [「クーポンコード」];
protected クーポン名: seq1 of char;
protected 割引量: 「割引量」;
protected 使用可能回数: nat1;
operations
protected pure 割引対象顧客条件: () ==> 「顧客条件」
割引対象顧客条件() == is subclass responsibility;
protected pure クーポン生成: () ==> 「クーポン」
クーポン生成() == is subclass responsibility;
public クーポン付与: 「顧客」 ==> bool
クーポン付与(a割引対象顧客) ==
if 割引対象顧客条件().判定(a割引対象顧客) then (
a割引対象顧客.クーポン獲得(クーポン生成());
return true;
) else
return false
post RESULT = 割引対象顧客条件().判定(a割引対象顧客);
public pure 同ID判定: token ==> bool
同ID判定(aクーポンマスタID) == return クーポンマスタID = aクーポンマスタID
post RESULT = (クーポンマスタID = aクーポンマスタID);
public pure getクーポンコード: () ==> [「クーポンコード」]
getクーポンコード() == return クーポンコード
post RESULT = クーポンコード;
end 「クーポンマスタ」
class 「クーポン」
instance variables
protected クーポンマスタ: 「クーポンマスタ」;
protected 残使用回数: nat;
protected 使用可能回数: nat;
protected 発行日: 「有効期限条件」`「日付」;
operations
protected pure 割引対象案件条件: () ==> 「案件条件」
割引対象案件条件() == is subclass responsibility;
protected pure 有効期限条件: () ==> 「有効期限条件」
有効期限条件() == is subclass responsibility;
public pure 有効期限判定: 「有効期限条件」`「日付」 ==> bool
有効期限判定(a現在時刻) == 有効期限条件().判定(a現在時刻);
public 適用: 「案件」 * 「有効期限条件」`「日付」 ==> bool
適用(a割引対象案件, a現在時刻) ==
if 割引対象案件条件().判定(a割引対象案件) and 有効期限判定(a現在時刻) and 残使用回数 > 0 then (
残使用回数 := 残使用回数 - 1;
a割引対象案件.クーポン適用(self);
return true
) else
return false;
public 除外: 「案件」 ==> bool
除外(a割引対象案件) == (
残使用回数 := 残使用回数 + 1;
a割引対象案件.クーポン除外(self);
return true
);
public pure 生成元判定: token ==> bool
生成元判定(aクーポンマスタID) == return クーポンマスタ.同ID判定(aクーポンマスタID);
public 友達紹介クーポン獲得: () ==> ()
友達紹介クーポン獲得() == skip;
end 「クーポン」
class 「クーポンマスタリポジトリ」
instance variables
private static DB: set of 「友達紹介クーポンマスタ」 := {};
operations
public static 追加: 「友達紹介クーポンマスタ」 ==> ()
追加(aクーポンマスタ) == DB := DB union {aクーポンマスタ}
pre aクーポンマスタ.getクーポンコード() <> nil
post if aクーポンマスタ not in set DB~ then card DB > card DB~ else card DB = card DB~;
public static 取得: 「クーポンマスタ」`「クーポンコード」 ==> 「友達紹介クーポンマスタ」
取得(aクーポンコード) == (
let クーポンマスタ in set DB be st クーポンマスタ.getクーポンコード() = aクーポンコード in
return クーポンマスタ)
pre aクーポンコード in set { クーポンマスタ.getクーポンコード() | クーポンマスタ in set DB };
end 「クーポンマスタリポジトリ」
class 「友達紹介クーポンマスタ」 is subclass of 「クーポンマスタ」
instance variables
作成者: 「顧客」;
operations
public 「友達紹介クーポンマスタ」: 「顧客」 ==> 「友達紹介クーポンマスタ」
「友達紹介クーポンマスタ」(a作成者) == atomic(
クーポンコード := MATH`rand(100);
クーポン名 := "友達紹介クーポン";
割引量 := new 「割引額」(5000);
クーポンマスタID := mk_token("友達紹介クーポン");
使用可能回数 := 1;
作成者 := a作成者;
);
protected pure 割引対象顧客条件: () ==> 「顧客条件」
割引対象顧客条件() == return new 「恒真条件」();
protected pure クーポン生成: () ==> 「クーポン」
クーポン生成() == return new 「友達紹介クーポン」(self.使用可能回数);
public クーポン付与: 「顧客」 ==> bool
クーポン付与(a割引対象顧客) ==
if 割引対象顧客条件().判定(a割引対象顧客) then (
a割引対象顧客.クーポン獲得(クーポン生成());
return true;
) else
return false
post RESULT = 割引対象顧客条件().判定(a割引対象顧客);
public pure 被紹介クーポンマスタ生成: () ==> 「友達被紹介クーポンマスタ」
被紹介クーポンマスタ生成() == return new 「友達被紹介クーポンマスタ」(クーポンコード, 作成者, self);
public pure getクーポンコード: () ==> [「クーポンコード」]
getクーポンコード() == return クーポンコード
post クーポンコード <> nil;
end 「友達紹介クーポンマスタ」
class 「友達紹介クーポン」 is subclass of 「クーポン」
operations
public 「友達紹介クーポン」: nat ==> 「友達紹介クーポン」
「友達紹介クーポン」(a残使用回数) == atomic(
残使用回数 := a残使用回数;
発行日 := 0;
);
protected pure 割引対象案件条件: () ==> 「案件条件」
割引対象案件条件() == return new 「案件AND条件」([
new 「サービス条件」(<製造>),
new 「案件AND条件」([
new 「製造サービス詳細条件」(<リジッド>),
new 「製造サービス詳細条件」(<フレキ>),
new 「製造サービス詳細条件」(<アルミ>)
])
]);
protected pure 有効期限条件: () ==> 「有効期限条件」
有効期限条件() == return new 「発行期日期限」(発行日, 30);
end 「友達紹介クーポン」
class 「友達被紹介クーポンマスタ」 is subclass of 「クーポンマスタ」
instance variables
紹介者: 「顧客」;
友達紹介クーポンマスタ: 「友達紹介クーポンマスタ」;
operations
public 「友達被紹介クーポンマスタ」: [「クーポンコード」] * 「顧客」 * 「友達紹介クーポンマスタ」 ==> 「友達被紹介クーポンマスタ」
「友達被紹介クーポンマスタ」(aクーポンコード, a紹介者, a友達紹介クーポンマスタ) == atomic(
クーポンコード := aクーポンコード;
クーポン名 := "友達被紹介クーポン";
割引量 := new 「割引額」(5000);
クーポンマスタID := mk_token("友達被紹介クーポン");
使用可能回数 := 1;
紹介者 := a紹介者;
友達紹介クーポンマスタ := a友達紹介クーポンマスタ;
);
protected pure 割引対象顧客条件: () ==> 「顧客条件」
割引対象顧客条件() == return new 「顧客AND条件」([
new 「CPM条件」(<未注文客>),
new 「クーポンコード条件」(クーポンコード),
new 「重複保有不可能条件」(クーポンマスタID)
]);
protected pure クーポン生成: () ==> 「クーポン」
クーポン生成() == return new 「友達被紹介クーポン」(紹介者, 友達紹介クーポンマスタ, self.使用可能回数);
public クーポン付与: 「顧客」 ==> bool
クーポン付与(a割引対象顧客) ==
if 割引対象顧客条件().判定(a割引対象顧客) then (
a割引対象顧客.クーポン獲得(クーポン生成());
return true;
) else
return false
post RESULT = 割引対象顧客条件().判定(a割引対象顧客);
public pure getクーポンコード: () ==> [「クーポンコード」]
getクーポンコード() == return クーポンコード
post クーポンコード <> nil;
end 「友達被紹介クーポンマスタ」
class 「友達被紹介クーポン」 is subclass of 「クーポン」
instance variables
紹介者: 「顧客」;
友達紹介クーポンマスタ: 「友達紹介クーポンマスタ」;
operations
public 「友達被紹介クーポン」: 「顧客」 * 「友達紹介クーポンマスタ」 * nat ==> 「友達被紹介クーポン」
「友達被紹介クーポン」(a紹介者, a友達紹介クーポンマスタ, a残使用回数) == atomic(
紹介者 := a紹介者;
友達紹介クーポンマスタ := a友達紹介クーポンマスタ;
残使用回数 := a残使用回数;
発行日 := 0;
);
protected pure 割引対象案件条件: () ==> 「案件条件」
割引対象案件条件() == return new 「案件AND条件」([
new 「サービス条件」(<製造>),
new 「案件AND条件」([
new 「製造サービス詳細条件」(<リジッド>),
new 「製造サービス詳細条件」(<フレキ>),
new 「製造サービス詳細条件」(<アルミ>)
])
]);
protected pure 有効期限条件: () ==> 「有効期限条件」
有効期限条件() == return new 「発行期日期限」(発行日, 30);
public 友達紹介クーポン獲得: () ==> ()
友達紹介クーポン獲得() ==
let - = 友達紹介クーポンマスタ.クーポン付与(紹介者) in skip;
end 「友達被紹介クーポン」
class 「クーポン一覧表示」
operations
private pure クーポン一覧を表示する: 「顧客」 ==> 「クーポン一覧」
クーポン一覧を表示する(a顧客) == return a顧客.getクーポン一覧();
public pure 見積時にクーポン一覧を表示する: 「顧客」 ==> 「クーポン一覧」
見積時にクーポン一覧を表示する(a顧客) == クーポン一覧を表示する(a顧客);
public pure 見積保存後にクーポン一覧を表示する: 「顧客」 ==> 「クーポン一覧」
見積保存後にクーポン一覧を表示する(a顧客) == クーポン一覧を表示する(a顧客);
public pure 注文時にクーポン一覧を表示する: 「顧客」 ==> 「クーポン一覧」
注文時にクーポン一覧を表示する(a顧客) == クーポン一覧を表示する(a顧客);
public pure マイページにクーポン一覧を表示する: 「顧客」 ==> 「クーポン一覧」
マイページにクーポン一覧を表示する(a顧客) == クーポン一覧を表示する(a顧客);
public pure 技術サポートにクーポン一覧を表示する: 「顧客」 ==> 「クーポン一覧」
技術サポートにクーポン一覧を表示する(a顧客) == クーポン一覧を表示する(a顧客);
public クーポンの適用状況を表示する: token ==> token
クーポンの適用状況を表示する(-) == is not yet specified;
end 「クーポン一覧表示」
class 「クーポンコード獲得」
operations
public クーポンコードを表示する: 「顧客」 ==> 「クーポンマスタ」`「クーポンコード」
クーポンコードを表示する(a顧客) == 
let 友達紹介クーポンマスタ = new 「友達紹介クーポンマスタ」(a顧客) in
(「クーポンマスタリポジトリ」`追加(友達紹介クーポンマスタ);
return 友達紹介クーポンマスタ.getクーポンコード())
traces
trace_クーポンコードを表示する: (
let 顧客A = new 「顧客」(<未注文客>, 10, new 「クーポン一覧」(), new 「案件一覧」()) in
クーポンコードを表示する(顧客A)
);
end 「クーポンコード獲得」
class 「クーポン獲得」
operations
private クーポンを獲得させる: 「クーポンマスタ」`「クーポンコード」 * 「顧客」 ==> bool
クーポンを獲得させる(aクーポンコード, a顧客) ==
let クーポンマスタ = 「クーポンマスタリポジトリ」`取得(aクーポンコード) in
クーポンマスタ.クーポン付与(a顧客);
public 顧客新規登録時にクーポンを獲得させる: 「クーポンマスタ」`「クーポンコード」 * 「顧客」 ==> bool
顧客新規登録時にクーポンを獲得させる(aクーポンコード, a顧客) == return クーポンを獲得させる(aクーポンコード, a顧客);
public マイページからクーポンを獲得させる: 「クーポンマスタ」`「クーポンコード」 * 「顧客」 ==> bool
マイページからクーポンを獲得させる(aクーポンコード, a顧客) == return クーポンを獲得させる(aクーポンコード, a顧客);
public 技術サポートからクーポンを獲得させる: 「クーポンマスタ」`「クーポンコード」 * 「顧客」 ==> bool
技術サポートからクーポンを獲得させる(aクーポンコード, a顧客) == return クーポンを獲得させる(aクーポンコード, a顧客);
public 紹介者にクーポンを獲得させる: 「案件」 ==> ()
紹介者にクーポンを獲得させる(a案件) == a案件.友達紹介クーポン獲得();
public TEST_クーポンを獲得させる: () ==> bool
TEST_クーポンを獲得させる() == (
let 顧客A = new 「顧客」(<未注文客>, 10, new 「クーポン一覧」(), new 「案件一覧」()) in
let クーポンコード獲得 = new 「クーポンコード獲得」() in
let クーポンコード = クーポンコード獲得.クーポンコードを表示する(顧客A) in
let 顧客B = new 「顧客」(<未注文客>, クーポンコード, new 「クーポン一覧」(), new 「案件一覧」()) in
return 顧客新規登録時にクーポンを獲得させる(クーポンコード, 顧客B);
);
public TEST_紹介者にクーポンを獲得させる: () ==> nat
TEST_紹介者にクーポンを獲得させる() == (
let 顧客A = new 「顧客」(<未注文客>, nil, new 「クーポン一覧」(), new 「案件一覧」()) in
let クーポンコード獲得 = new 「クーポンコード獲得」() in
let クーポンコード = クーポンコード獲得.クーポンコードを表示する(顧客A) in
let 顧客B = new 「顧客」(<未注文客>, クーポンコード, new 「クーポン一覧」(), new 「案件一覧」()) in
let 案件 = new 「案件」(<製造>, <リジッド>) in
(dcl result: bool := 顧客新規登録時にクーポンを獲得させる(クーポンコード, 顧客B);
案件.クーポン適用(顧客B.getクーポン一覧());
案件.請書発行();
紹介者にクーポンを獲得させる(案件);
顧客A.getクーポン一覧().クーポン数())
);
traces
trace_クーポンを獲得させる: TEST_クーポンを獲得させる();
trace_紹介者にクーポンを獲得させる: TEST_紹介者にクーポンを獲得させる();
end 「クーポン獲得」
class 「有効期限通知」
operations
private pure 有効期限切れのクーポンを通知する: 「クーポン」  * 「有効期限条件」`「日付」 ==> bool
有効期限切れのクーポンを通知する(aクーポン, a現在時刻) == aクーポン.有効期限判定(a現在時刻);
public 注文時に期限切れを通知する: 「クーポン」  * 「有効期限条件」`「日付」 ==> bool
注文時に期限切れを通知する(aクーポン, a現在時刻) == 有効期限切れのクーポンを通知する(aクーポン, a現在時刻);
public メールで期限切れを通知する: 「クーポン」  * 「有効期限条件」`「日付」 ==> bool
メールで期限切れを通知する(aクーポン, a現在時刻) == 有効期限切れのクーポンを通知する(aクーポン, a現在時刻);
public メールで期限切れ前日に警告する: 「クーポン」  * 「有効期限条件」`「日付」 ==> bool
メールで期限切れ前日に警告する(aクーポン, a現在時刻) ==
return 有効期限切れのクーポンを通知する(aクーポン, a現在時刻) and not 有効期限切れのクーポンを通知する(aクーポン, a現在時刻 + 1);
end 「有効期限通知」
class 「クーポン利用」
operations
public クーポンを適用する: 「案件」 * 「クーポン」 * 「有効期限条件」`「日付」 ==> bool
クーポンを適用する(a案件, aクーポン, a現在時刻) == return aクーポン.適用(a案件, a現在時刻);
public クーポンを除外する: 「案件」 * 「クーポン」 ==> bool
クーポンを除外する(a案件, aクーポン) == return aクーポン.除外(a案件);
end 「クーポン利用」
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment