/** čĊ Ġ* ĠĠ ĠCopyright Ġ 2 0 2 0 , ĠState set . čĊ Ġ* čĊ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); čĊ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . čĊ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat čĊ Ġ* čĊ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 čĊ Ġ* čĊ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware čĊ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , čĊ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . čĊ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand čĊ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . čĊ Ġ*/ čĊčĊč Ċ package Ġio . state set . approval čĊč Ċ import Ġnet . cord a . core . contracts .* č Ċ import Ġnet . cord a . core . identity . Abstract Party č Ċ import Ġnet . cord a . core . identity . Party č Ċ import Ġnet . cord a . core . serialization . C ord a Serializable č Ċ import Ġnet . cord a . core . transactions . Ledger Transaction č Ċ import Ġjava . lang . IllegalArgumentException čĊč Ċ // Ġ********* č Ċ // Ġ* ĠAppro val ĠState Ġ* č Ċ // Ġ********* čĊč Ċ @ C ord a Serializable č Ċ @ Bel ongsTo Contract ( Approval Contract :: class ) č Ċ data Ġclass ĠAppro val ( val Ġapproval Id : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapproval Name : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindustry : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapproval Status : ĠAppro val Status , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubmit ter : ĠParty , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġappro ver : ĠParty , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive : ĠBoolean ?, čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcreatedAt : ĠString ?, čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Updated : ĠString ?, čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġlinear Id : ĠUnique Identifier Ġ= ĠUnique Identifier ()) Ġ: ĠLinear State , ĠContract State Ġ{ čĊčĊčĊĠĠĠ Ġoverride Ġval Ġparticipants : ĠList < Abstract Party > Ġget () Ġ= ĠlistOf ( submit ter , Ġappro ver ) čĊčĊč Ċ } čĊč Ċ @ C ord a Serializable č Ċ enum Ġclass ĠAppro val Status Ġ{ čĊĠĠĠ ĠSUB MIT TED , ĠREQUEST ED , ĠUN STARTED , ĠSTART ED , ĠIN RE VIEW , ĠMED ICAL _ CHECK , ĠFIN AN CIAL _ CHECK , ĠWORK ING , ĠE SCAL ATED , ĠAP PRO VED , ĠRE JECT ED č Ċ } čĊčĊčĊč Ċ class ĠAppro val Contract Ġ: ĠContract Ġ{ čĊĠĠĠ Ġ// ĠThis Ġis Ġused Ġto Ġidentify Ġour Ġcontract Ġwhen Ġbuilding Ġa Ġtransaction čĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġval ĠAP PRO VAL _ CONTRACT _ ID Ġ= ĠAppro val Contract :: class . java . canonical Name čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// ĠUsed Ġto Ġindicate Ġthe Ġtransaction 's Ġintent . čĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġclass ĠCreate Approval : ĠCommands čĊĠĠĠĠĠĠĠ Ġclass ĠAppro ve : ĠCommands čĊĠĠĠĠĠĠĠ Ġclass ĠReject : ĠCommands čĊčĊčĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġ// ĠA Ġtransaction Ġis Ġconsidered Ġvalid Ġif Ġthe Ġverify () Ġfunction Ġof Ġthe Ġcontract Ġof Ġeach Ġof Ġthe Ġtransaction 's Ġinput čĊĠĠĠ Ġ// Ġand Ġoutput Ġstates Ġdoes Ġnot Ġthrow Ġan Ġexception . čĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġapproval Inputs Ġ= Ġtx . inputs OfType < Approval >() čĊĠĠĠĠĠĠĠ Ġval Ġapproval Outputs Ġ= Ġtx . outputs OfType < Approval >() čĊĠĠĠĠĠĠĠ Ġval Ġapproval Command Ġ= Ġtx . commands OfType < Approval Contract . Commands >(). single () čĊčĊĠĠĠĠĠĠĠ Ġwhen ( approval Command . value ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Create Approval Ġ-> Ġrequire That Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" no Ġinputs Ġshould Ġbe Ġconsumed " Ġusing Ġ( approval Inputs . isEmpty ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġwe Ġmight Ġallow Ġseveral Ġjobs Ġto Ġbe Ġproposed Ġat Ġonce Ġlater čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġoutput Ġshould Ġbe Ġproduced " Ġusing Ġ( approval Outputs . size Ġ== Ġ 1 ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊč ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Approve Ġ-> Ġrequire That Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġinput Ġshould Ġbe Ġproduced " Ġusing Ġ( approval Inputs . size Ġ== Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġoutput Ġshould Ġbe Ġproduced " Ġusing Ġ( approval Outputs . size Ġ== Ġ 1 ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapproval Input Ġ= Ġapproval Inputs . single () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapproval Output Ġ= Ġapproval Outputs . single () čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġinput Ġstatus Ġmust Ġbe Ġset Ġas Ġstarted " Ġusing Ġ( approval Input . approval Status Ġ== ĠAppro val Status . REQUEST ED ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġoutput Ġstatus Ġshould Ġbe Ġset Ġas Ġapproved " Ġusing Ġ( approval Output . approval Status Ġ== ĠAppro val Status . APPRO VED ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊč ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Reject Ġ-> Ġrequire That Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġinput Ġshould Ġbe Ġproduced " Ġusing Ġ( approval Inputs . size Ġ== Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġoutput Ġshould Ġbe Ġproduced " Ġusing Ġ( approval Outputs . size Ġ== Ġ 1 ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapproval Input Ġ= Ġapproval Inputs . single () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapproval Output Ġ= Ġapproval Outputs . single () čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġinput Ġstatus Ġmust Ġbe Ġset Ġas Ġin Ġeffect " Ġusing Ġ( approval Input . approval Status Ġ== ĠAppro val Status . REQUEST ED ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġoutput Ġstatus Ġshould Ġbe Ġset Ġas Ġrenew ed " Ġusing Ġ( approval Output . approval Status Ġ== Approval Status . RE JECT ED ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊč ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Un re cogn ised Ġcommand .") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊč Ċ }