From a332dec4c2b422db58ff08f6ee212c438ad7ab25 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 3 Nov 2014 14:53:38 +0100 Subject: [PATCH] [IMP] doc: add some diagrams to workflow doc Also move transitions to the bottom of the document, and try to clarify the documentation for split, join and activity kinds. --- doc/guides/workflow/Makefile | 20 ++ doc/guides/workflow/join.dot | 10 + doc/guides/workflow/join.png | Bin 0 -> 6835 bytes doc/guides/workflow/join.svg | 36 ++++ doc/guides/workflow/order_0.dot | 9 + doc/guides/workflow/order_0.png | Bin 0 -> 16986 bytes doc/guides/workflow/order_0.svg | 48 +++++ doc/guides/workflow/order_1.dot | 11 ++ doc/guides/workflow/order_1.png | Bin 0 -> 28452 bytes doc/guides/workflow/order_1.svg | 66 +++++++ doc/guides/workflow/split.dot | 10 + doc/guides/workflow/split.png | Bin 0 -> 6912 bytes doc/guides/workflow/split.svg | 36 ++++ doc/guides/workflows.rst | 332 +++++++++++++++++--------------- 14 files changed, 423 insertions(+), 155 deletions(-) create mode 100644 doc/guides/workflow/Makefile create mode 100644 doc/guides/workflow/join.dot create mode 100644 doc/guides/workflow/join.png create mode 100644 doc/guides/workflow/join.svg create mode 100644 doc/guides/workflow/order_0.dot create mode 100644 doc/guides/workflow/order_0.png create mode 100644 doc/guides/workflow/order_0.svg create mode 100644 doc/guides/workflow/order_1.dot create mode 100644 doc/guides/workflow/order_1.png create mode 100644 doc/guides/workflow/order_1.svg create mode 100644 doc/guides/workflow/split.dot create mode 100644 doc/guides/workflow/split.png create mode 100644 doc/guides/workflow/split.svg diff --git a/doc/guides/workflow/Makefile b/doc/guides/workflow/Makefile new file mode 100644 index 00000000000..07bbb67dd55 --- /dev/null +++ b/doc/guides/workflow/Makefile @@ -0,0 +1,20 @@ +DOTFILES:=$(wildcard *.dot) +SVGFILES:=$(patsubst %.dot,%.svg,$(DOTFILES)) +PNGFILES:=$(patsubst %.dot,%.png,$(DOTFILES)) + +# try to disable implicit rules +.SUFFIXES: + +.PHONY: all clean + +all: $(SVGFILES) $(PNGFILES) + +# must -f to ignore errors when running clean multiple times in a row +clean: + rm -f *.png *.svg + +%.svg: %.dot + dot -Tsvg $< > $@ + +%.png: %.dot + dot -Tpng $< > $@ diff --git a/doc/guides/workflow/join.dot b/doc/guides/workflow/join.dot new file mode 100644 index 00000000000..e413a8a8ebc --- /dev/null +++ b/doc/guides/workflow/join.dot @@ -0,0 +1,10 @@ +digraph join { + // dummy sources as support for edges, make invisible and height 0 + a [style=invis height=0 fontsize=0] + b [style=invis height=0 fontsize=0] + c [style=invis height=0 fontsize=0] + + a -> Activity + b -> Activity + c -> Activity +} diff --git a/doc/guides/workflow/join.png b/doc/guides/workflow/join.png new file mode 100644 index 0000000000000000000000000000000000000000..c63e97c809da8e7cce1865b6c2c0e30ed042e812 GIT binary patch literal 6835 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 Sf$y9U2yG2L^=dWi$o~QxcL|^X literal 0 HcmV?d00001 diff --git a/doc/guides/workflow/join.svg b/doc/guides/workflow/join.svg new file mode 100644 index 00000000000..1462281977f --- /dev/null +++ b/doc/guides/workflow/join.svg @@ -0,0 +1,36 @@ + + + + + + +join + + + +Activity + +Activity + + +a->Activity + + + + + +b->Activity + + + + + +c->Activity + + + + + diff --git a/doc/guides/workflow/order_0.dot b/doc/guides/workflow/order_0.dot new file mode 100644 index 00000000000..3932040e914 --- /dev/null +++ b/doc/guides/workflow/order_0.dot @@ -0,0 +1,9 @@ +digraph order { + Draft [style=filled fillcolor="#73fa79"] + Closed [style=filled fillcolor="#98c7df"] + Canceled [style=filled fillcolor="#98c7df"] + + Draft -> Confirmed + Confirmed -> Closed + Confirmed -> Canceled +} diff --git a/doc/guides/workflow/order_0.png b/doc/guides/workflow/order_0.png new file mode 100644 index 0000000000000000000000000000000000000000..98b552da1ba0e89c27eaecf69be5bc8f4fcc235c GIT binary patch literal 16986 zcmc(HgF(~1yUy=E_xtXD zaCskJeLUyvv-VnZjycAda~rCnB#n;p3Izgzpv%fgya&JELw_M5fd7|%St|g)AsEX` zOF*8X|7Eun#zP>lA+i#p>fh227hTlx{>>wv9J5qh=>I^@eVvV`%2b)1J@YcRvRiC2 zxhRyKePFaZfu~Z+B%CW0o9il!l=ywO81AlQ*hS+-ZTr$SW~bDPqV}Vas)f;a?g=Tg z4VXg$YDXCDzm@$|Y$uLXHz9E?UF%|PYzDMNVm+(k{gi0!+{pNH% zr?8N&cR3RWTS(CvxnuK-!_mUKg?d+5FU$uOJ#BQ@H2pEsVoca=eKry+IGfL;6{d5_ zTV=(6eo5F`V0;n(qC)uI=b$jfqUdwG2qM3Nb5_8+uUqX)OZujpYLt@k8M2X)k@c?U zv{7XIVf+8e{h9luj!(CC4s9_wu7y;%-kWi@2BjjHA~Z|fWpJ7To_7HW(wjIhQ1n?9qt5gnVe>PDDySX!m4JgG4hR zKO9*`fGoHw{q0ctJKU`DTj*^X@^S7BTU3SPCJpw~+RRrRw+o%jdZ1~2!t7H<;P65? zE|Sux!WrpZoh@VA=-V)AzW-+Z;7XOAk&%KCX+^H+>`+uz)*D62Ut!b7ePV`;;Ju4> zzvc)YMlVRd=}G zo;M?x%C_wJS1_D7&8Hw7hD5B+@m877ef}Id7 zpgNVL)OBv?a9$ND5XWJ(6=Sz$ZSjrcWr=bn?>d&{nVp89 z^4>g&f)p{j+?!Geo}~JV(#W!Q`i<~vgl*&O>?HHqqyOi{g8Vg)Yt=hKWp0G^ql_j( zerKkM)eFvQzp|2Ao8_RJ?r#cBJEFLc=s}+67(;X)4QHhXRWvpG9C-yX1b@49gcGnD z@{i$DaYqGB>{00HFJp`(ewe`He3@;X{lc?QzarBF_BXO81bfOs^6?gJwJk80sRd7t zPtIOz6>hsc7_}xMtn>@XZ~h3owkLdHk7s|Ce~K;mHs;4+n28=fX%ux8uMc2z1l&Fv z=tVCSzT-XiLV=t(^jg_Z^3uz0QLZYGP+kRfeye7nCC^y8IB3M`$q4EFMe~pSe4Odx z3%B2K)qW96QKugrIZ_P?1Znn)Fm}ExHX{XHW9sNqSA<83b)BD)l@*gtIWu5ljzY}6 zS64|Eqrk)+)$0SdN>F+n$;H7XyW61Fx0@lUAOpU#p;ja>*k`WKd-djsoiGqj+Uvl$ zOdNso*5K=-R!qAl;ed}A5Z+RIG1ylp+gaWyo{Q@D7F90eyAy>J<+PZC+SA62zw6T8 zm2S^cZad(wDM_F@E%uyBLLm4}yX`&Y+v{6vB`dUes9?D(MPJ6AJ#`+OE?9HQ)2zsC z-1hU+T6v84I?$?6)*f-^nuQ?_bS5$O+!(OUPo!KyX<88*@}VL8r2g+*mivCBY*8}L%0?j$zy`}EN{E0CVmJD%#qK|FN~<3|5?v>Px;E~6&pC6(oN5a zPh#Pe18GDU9DeD3BrjlL*}b1Ua>}!;B5B>}Ha0hN3W^ctxYx)Nf8L(Xq~`A7PY5&L ziN&PXq9TedJ}lE6Jn0NfyL=Reh~9d0YlWvU*kiA_&uN_|oE0c^b3`OSe` zW9KhyZ(^tC^p;Jod2iaMDG9sN#qp2b8DWwU*Iyx6y2#B@^!HVadkiQ~i3vL(Rg{W~ zi(ibXyR+C1zqCY9YFWDDe?Sm=F@3x0^4qiDH39y*OKquD1Y4+%GLI?z&mXzJFGXrZ zMh`Nw^YUOJMGR%WajjKagG#)_h>(g*^ZV&#1GXpGctKiYyY%Y6{&3HQOGiFJ*jWJZU?KJ+swC?5CfEBh~r?N%a2{QG_5ox zo#E?Q!&f&ps3$MqALcEZ@ed3RqWY#_uI}Dvj!n;gSpKFhsZDRi2)#Bmgr2Xh=ME~b z_gu8C@mq`Z=x*LU+P*sS^1yX^DWIjW8}9OC$NA9K8l7}KzEa&w6wM=GU0JqOP@9_j zD&2|S_YQ@OmNX4xJ(jlfP6OMU5C2-YF%riX8SmxGz*_xcy=prTbG>?dn6KNTJ>&T= z7i||@WLG#IU))tP+wb=>7l`jNSS;U+oSmHb#8zTw9-^A?CD<0SH9{C#2X2gq2^50I z^8mx32AEl@)%v2+TQY~wp!ucKqTUXxvZ197G7k?AxQObGnFqn-)KtgFUks+tL<)i& z@w@hofs@3nE9m}CO&$?PV{7=?5>NvC=gtgO*3P1lsWUtWO9l!76>HudE*)=41w z)<~K>ZU)T75DVPr>C%pzu3!MV_kM^PMTs|;9=e%dFsS{bL&lISEG^kd-z$rMUJuO4 z$$=?b*Tepf6R3T?RWr}iQb-vISC_OXQap+(;Cd0ziW5e3@m8PE)XdD`^g%M&Ds8QK z-_kxlKzK#mrN?fi>)$?~zOF)N;8y~RT#k^;*}x(|v5w*wV`CD17|cI)?qp;N(u;#k zw{_K%RuaK4(`!J`)YL2x-y7IT(M#s!;#zh2hiMWV*>j6rh+WB(up2|DMyTgA(e)&y zVG2*S;4Oly_X1Sfw=ZA5ywSbtxU*{wd``M{Fx!GxH~r2*nmBVpe1r6Oi98bVK~OyBbXA%>H%2D}n^>yLt07Ol?bRD-lxi-B8Yu|1KJ9&e zIO)QSNlG&3V=6}e6-iJ7(#zxiux`fNP`LWu%H$?Ub%&=*F5h1)M90z!nd}iOAmH4= zo^Zp5Dmc2mqr(@J^+Z5h7gMk=Tt~K|s-6GZxdCE%RIt83n$eyu!tYbhY~g;91J+!KPaJ`+>7DuOMV^-_nEJW3x%gK~7+Rd( z6k8)1sN&+{m3iu5}SVm(^$a&CWArZo}t zzsl+v42T0*DLyYz$8Js^4tLhbQ-Tto0OcO6`A1 z7tUFR;^6E7B~?K!))WqpS8S ztE(_HG&Jl|lCn6d2k(t9cK(k2`)B7O6y4YLaC_cEh)rW@Q6-PeofZj?ieK%{Q2z60 zC^9Z>$h$Xkabu=Ql!tnMzVea`W$+VJRaFbs(t)#(OixcAD^$+pl^zK~){scHiwl5npL6o`F@QTh1zYRNHO#b_a>a}Ih3l%yY#+8H-VR3L^ ztqRMnoEA0Rx*uTwk@Hoyj)sJ3gP|x_a8mptEmAx76F7AL=n+%tDBt75E6t&G z*d0deuBrav10~Sx6ciLl=;)H*3(n5Y+KnqgT#(Pq&7nBEfn{jv=*SZ+fzjScg~CE)!R7WEAc zMx6o3U`tH+)Gejr9~Hsc><{O-bQ`|F11ccm6SvIl=aIOCf?>m<(K3A$Z0_LQ1N$uMbhPOjp#@l-lk3 z2%VLc^_#2fUs#*%Q&G42{Cw)FFPn0?IXU2U)BXeowf@b)B;@Em6F$x`EF4^1@##`+ zaYsi-q_kmLTU*yQ)B!`OT;Ub7*2c!hV%*jf-l$U58A)fHM&!U!XBaCkUyy56^|-JFJu ziAi_9HB1FA(cRx4^6+$joS%~eiaWL5sO;6jf%V$vrsRw@HxZvBeS_yccMIOZ*7(H4 zz@P7op{1ovmA`*efmk-)_yEdbTkD2RXgC zpq7-BR0yUH&F7zO&}BJ2IeGo|?c0r}<5sGvDWIMuLSxFyS=rgyDQIbFfj*DfwWn6h zo8;D)0vr1GFE)soZzn4-&>K!0%};M?;-{pdT0J<3a9Hm(y1zOEm)1@eS_tXv3dRf# z3PMQXw8UBc(x4D5&Tjbp^aze6$m4QK^P=`w=!IVIa+6CmJtJd0*szcviGn;lNu^qq zeqiM|7{THo*80bP$PfH8@K)@0ViI)R!P;GJ6OK(vq5~q$bTE+6;gSp#%uuK(1tX_c$IdI9*34r%(Vw(3ARE zRPU$86NRTg^e_qCAWhv7trb+JP!DlF;{(1{DSuV$6@V z)a)AHKQIt0=zbOQLjajpa6lhqF7(YOt6e=`q(Hh-0MCXBq!BeAU*pt6d%H-dais)V zUkrsf5@dX4hW@N7Kr($m35lY~`H&JE|Hf)purZ_B3t8nVyVjURSgZArKKffWoI!YSs9uC1nA^XHDhK?KN;z&EPj_L=&mm; z=vIFJnU^OHiCJ4)t9w!cF#PxLUy68IMarI@9_qJm-i`T2dA`19uv5+wJ> z51N}Lx-1Vd2+|%i3MwixM09hdRQop)WNm*R9AJKZeR8F#u*VIX>W2@sppF@{>bwBE z+0@t=2Y@fUMgbJ)7d{C|No|)dpdcVa-s|WvCMTw*%0aL^JsZSB(w%5OWt_qJ0?iy+qoAy;3~5i{FrU+-rK2nC z84U^wf{YnITmle+D3)s+MWteX`1$iEb3wc}f`}EFcxy$4O0#bbg|IL=1Xvke_S8c$ zVWuwj_U(Dn(cK@ng2}y*)YQ~Sc|$4~GLaY?TeP~mIt0Yw?c?<_G|~WMZUCNXda}|%O--HOa|TemduS*Ejf6Kw z!22m34-XFuh*@K6>xI2a1*F}~$EiQ{SBW-uOY;h-pqc>;OHNBe z^|}V!6NfuZ5dnil20%@JD%WSY{S|v&n_fy351}lO+Ry|D`K5qNMf%b)0BdbyL*mm& zI>XhMuV23O7i*M+q@)l5RPAnW_wl${4L-zh03=%yFj?uz$;lAV=YUodKv|d*MTuYP zmwV0W963!GJf;kPYO56xLo%w=D%a~P*~}1hPt?-V0wHbo)@rio17btl^HbW+?k+Zv za$oK)EXUitz0b}^h2sHLz<8?RAMNW421Evjh=`%~Esa9nWCRP4oO<<5P3r&_pmKI% zRRss6Arc^jgdCsHl+t-S9C;OD%X0GD9lrn8ad85d)F*+nrA1C$9G1s! zDFCD?fDfqP1+IBF6R=~|3Y7xe+Jwst+M?J^df7pCw`E09FW?to@~mxaZ%ad?2i&=Kt#yhPzmrO*hQ7X%^WmJNf`S4x z1ZJzuL|mLNE-$AG#vrA{$HxyC{uB>5;a>t2N2+)4-kB~oI!TC&`vXEB z2iV>?!I##I%%p?i8xJ8UiaLD#N(GT=^Lp%$7JiZe(VUDCd51|BEe+_cG}u8XD+9n| z3MvliD|w%|+@mTzY%DB@ot>R-^EYgOWhWOG-D^GJ?9K->+*$ht-QY`!pw@R?9nV`1 zj#H4bhNo*i$vk#sppvFwlsCnekvZyVXlMk=C$X%8t{0T%fVgHe`-2B<6yee-47)tiwXo~76JVgw3AWLb#Mh1vU+?RjfhFM0{A+3n;4)-tGm0%0Lysay<;cMtMiShk(Wg(eT;fzylasFn1xW`627t=J z^;lb9hlk|{B#uBl2o2iazKv)`ra^mUf2{1(zpd?!^BkmhUMyOo%^LqiH^EHsG;0}PxLf`>5 z2yT%0)hiSX>)|Y*)Q}J|@(Cs5_0sqD_hSky>idMg|gCtIn3RxVRW@;Ks^0F)=Z> zx>}vhm@&Ff90Y0FK7d{ucIT$BFu4-g5P%JwoSfNZWl=yLLM@RrZktX(cA)|rI3AS` z==8BGgRQPaa_JWr7g&UZAtjpSYXC{063nC$eAW=q>13|Y_==7Uz}v^61;_-8h|vw$ zUpR;`_E+*i!GLaO$Ey9w&R?pzvRySydE0Idv%y-5bZ zMUA_H&;bNFVS}FWmz^<+o7>yfje&Ta2~M-mpTn7TY7Hj}6oF(k=OZab-7#wp0AbS& z0{P_fpTT+`xwk1_IzAFbvXCbq5E$4mUrMHpH`0A1W<~xcKo*2ajsb294gsO|+h9pP zupN9_S_Gw{*rxR5{%00|Bowec4pNLMhl@--9Kc;+K)~=itOZEW@{LW(jXe;aEPFo> zJMya2jdAdIL0dA;2U;Y2j!5KQHxv`A&3_BCyutt#proXH0hqK2AIaX~-@$LR-;{Vy3)3nVV9o$yd{uxnq$lWp$IE+-@76CaN|{YxkKxa~P} z*FNCWRIvuH*8{IjRJ=9t;&mIvSsO-jhaDDQv_udjWqChouelF6efauS*U^!a+h(pC z?54ZKc>&R$2Ji!*h!6Ax2Wgnh;X*?^fVVi%O)C)3`IuMkjZ+^Ir7Vbbme^Sfoo;@pHQd72Bk(cZJip{#toO2EIQbzD@asP5glZ5h8uHyHAR5o z-sI1a=xAwRNB{s&#`sy7n{?WFF`+C>0gxIf9?rkd&Q+b z8_bP#0SZE=l-~YRtq?S1`oKrU#unsl0YkiKIQpkmX$-HFB^24;F9WPCc2Xr}@wBCY zRewyOcF>0a`7>q02ksD9I0%?zXn-`&kpK-u4t`*LsWK>+4G>3A1!Tfu3z zY<&6p6&s)_;Od~$!VOB&!s23VYHFDIXy)H7-qY-)Q#)Xm`GGp}Vd5H$YJi<4;dhRp zbwjM2wFZBJ8k09*PjrUutgR&+9N1xFW#4_`J9i`pE29BbY6Ao(zCw6d7$tP;0f?YU zO+Vh=++aaAz!Cdd0#~F2!y9xJjZaoI?%p2UM2@jR3TvcP(xGGPFYmdtphUh zP0a}*yvGmVL5s`rYhZJW`Xl&`ZnvH8wtxOt7RvBuS316hl*e|#qVBjBcu=5C2W%4z z0j~!_V9pvxmEGS1^Tq!D%EsdJ=em1@6mS-R(B=X!e(0|(UFw0&%K2@**CQV=Dn1U! zfBzo%^CttDuvf&W&^;Oxez-5vk1jyMu!)ILU0kl6pQAv5t=5;20n1yR{cR3xT^sga zw_m;jRvQu;+Og8%pMs>gx3jmm2DCb_+XX!kg*q9V?*K<%Y93H=91o;*C-(64)H!ej zX9KpY{@W?#)xj(*5LO^Yl)~|u#Xu7cgoMt5(CIe;-Byp3j{bZ^#VhV+H{{Vzzu6sk zRG^G$Vj_OEKR>OZ;T-_{O3MjaKn9TFg#Mexph^FGbebn~1dD|_)m~n$D{)PrhHEs{ z1M3ygX5ckK+vcRCq+qGF_q0=IXJ0^96zr^jkFgObGeB37=N}E1#2o=^6Pj{i;o+)a z4q@5r{?~BuC$L*8AbaBCaO@j&MWqYDt^&zk_c61_SQMzIli$F*2S!)U&!4l#jd*bj z(z@Z{;n<|4k^fC#C_uN4;pfl(p+8~{M%bX0(pc?zoSXqb_PSl}!2{0?$^vI*>iItm$w^h2o10Ssvlkm1J0!v*s%VFPV|x<@ zGReuA^TQ6wsYQS6Et_9s6xn38V|H#1`b%`hA}cF#?ZaW|4RFiq-@mA;{*g43W&hJ4 zSwz2?OD#-b7T7?~+%IWli@#@O1srw5=|W6|cYK{oBN!tiBZTb6aOxTwl8=Qu4&d;y zK$m@cG>eLY0!CJLKt@4H?2{A%7`g+W%PuNKiE0*5V6w?B%~`B|(ipqPh{VHUNA{JJ04N0Qn!9f*0{keU_BiWjlX{nuqmgg^o98E)-jHKRR1OX9kXcy zgioG1CKhP55vJ5w<+TW|tZFe?v0)3XlmN+n2ZBLjRJ%Ps4FMenC;*-RZUG)E=A^K zt+~#b@!H*NTT4{E^`*EtJkn{EQE??X%C|Tsu_<`rr5n7av^{>BnuyFcHW6fkuS}$( zduJ+5K$C1#JvmqLDj@;y0njoa%<(`f8W|fQyC=z35bvUx$P-u0E`D`X)we;%=_I3| zox%Kzd7P791o2N#KluyrmEXlSn(Pw;P)7u;`rS4A|4vU<#V4nxJ7+p^wqP^Hy!&Oe zX5NX4OK0t}Nk)y@N$9(wywB~7CB%>DK9Me>XZEeF#Q?5t0MNf3i;H^c_hA-sj{tpV zYCZYO44M#JC27!J@ep+t4*3OUTsTQs7HzM(uILFgIKWg=h^nZ5=m4s^^3(7uU}&>*UIp3~3Uh$Bg0|q_Q6o0%pvWE{Y?d7}r7ThlYYP!MM_yyUN382^a%~1#6;;*1 z;64S=00Db0IcbNDV_Rj=0kHc);2aN7>d*Y1nj%#i9rG(f_7-Ti|*;>(dO1H~Gdnc!tp9H1;#R&omQzCqiCX~dQ_q>9g z+;Ha2_PZAMgZ(1e>N&RC^_#NCO4ye)JvV!Utd(AmZvBIUpwkl!sQxIc-UClM zkOKFU@j^PLp{Y@iqs4pwliLv21I)JH(pcoL&=@~|_P9Q*1Bl(q#&XJ^bP#~`aN0+H zb5>HGQ&xgGs{F6Zc_z6GfvV=!p6f}QJqb_r0|KrI70KmQFK8_!W9QCy{WfNP8tiLj@?PBKK|nS7Mo9TVA8!1+hO@vdDk>_w%aQ=x z4WePEUo@N9u2ugZhouKe6q?%x-rGT*5LDNY=SPm@T!uioX3Z9!Mh0XT;imMxcu zlk+r9Sy|*D;a<3UjKqdPe5qa*<9&?L&Ly{=dI%-p_Tnb7_5%n5d{-7rPvWJZ=K`9!=kA z8?k=w?-*TX;?kF|cGx_8Q&&eiMlOq*Yj))T(mL2k?UTt=x%Xd*B*U#*jGMa?GZ9tv z5%FM3Hnx*rt=DrL?x6X8KuVgEYwoAPA0;C7C2MDQy8iavjoAPin39HS#;}$L&-*Lr zU~6)Xo1pGC%S-oL_3g=jQ)?%fC9!7*$S+`DtnBREH1-&H6CK|kHGRXn!P<{r#=DDc zZLY`SiFydyF%(YtikefF7yabF>|51{aFl*S8cbG*oH(o~FIB&+7_ijfmo;*S%oP+b|_iEoAdHLB>zGy$n6UWEXz{3ZqIH>h4rgy!cF6fRAgmvFV^tAC>?srPYLaKS4 z_edsfxSK+-oLu{4H(wY~CgM*vPS^ikwtg0#Jzi*lb#Za=xSB`S!gQ4`g4xQaHTqZV zYFIh@?f9IW{UpP|!n&yMyuFFH&77*3@y|!=2iD&Cyv8caNo-n|Fl8y7oSaO$D&CR9 zC!*0KeNnfMsaj+){UakmH8tqzbfcXIT+895=~1?JvJ?@IN|X0!kjW`^lkKo;!`#Bi zcF6OU)$V+&IbFbt_x^N;S3=qtZcCX*7=btM6g2xQ~Y=`!xq?p5RtjMYLJT zttV+vyK{Z`*x(@so`(AB+j-Rct7E(KMf1)JP-6gLUTdil7O%}n;zWX7Tv{_4n}4ys z#nb^HV&+JmYfj+`>O|I;f0wyykiOwstmBQ!m^^x$b-;V}VgJvlOqXwY;_7dQTCH_H z2;y@c$t}^d{+pNEpNy90Xl|_2nOn0C{cv@rSJzj!eoa?ie`WR9Gmdnc2&P&Y55+&v zBU|cw9(L+_^$+Ho$9m`dQ)&jc@t$=;()U$BPAQqUL7TIJa0N-eFNc!3kYk>ohK~gL zEe6U&ej0gqM!%YLur=B)cBTI_(q4C`@nz@DQyYeLg2K+ioP(EaIcCe3n?qr!dPAwRO9>nx zV_T}NRB~ruDs2`Uc7mGL%BUqG6@??~9A$qfIx%vV0mpkLJ1 zBJO`jL;-7>sazAJFD^3P|1M3)?u4&o_e=)L7A$1kICFLES;!9*7B8V|2;ePxVYfCG zyTqOOcHXhAguos^06d@*>pF#!F;CmP_Ifr$nBrC&Y5H-~fAQL+;$;38Qj-fQU9A@^ z!H$%CXO=mH5EJl5vs71hBk89Q|s>@w{JCEGYwx@aK!v8tqOU#_0hysoe?m8 z-4nK_)p_esJ7ifF6#qm|%gM7p+xW@7T_<;ScjuP>Bfot}inD85U6WJeo8zVHc8T|q zgqbCBfp;}N;HGRx=8>}DnmNVIc>kWP=XT!xR5Xc9o1YOEl_kpiG~)j#!_&cM>vk;p zt_~?)_y+IKUMk_Wz8dq*;W{D=#6|fTS*Q(LEy)vs%SJE4)kQSP*h{B?`zjS_A^jq_4yK%y`92Jcw~ITslu2JaM3WbodwuM+p~bC%nWgM%|CAb1bxzLJ4ZfF=&+5r7miKj%@2^un)pqHfu-zD?oqyy?-`?2p z8Qm5a|0hD-K~Mh%00Bw!+#E(E+?_#X^dn5QfXNIRDLNzs)AG)&kVVJ;yve&a>igHz zBf8~IhXVJkGa!XI+*9ij%FzBtW~r=&Fn~SdG49G&15L9OO9+2HFQaLR1fdRPelp z`I0_8nyi_?xk&YfKGfy40z8db>{UU@uU~;A!BmMKPe!cmyiBNA$RFTg2$b7x6NvFW z+ep*!6?g4thwHv7nx9Q0rt;W4*UIb(O(-bo!-!1$n)8ltnKEnk6`dezX?QC!L!y@& z6=LKv?|tm7t@=d#Z$iMr=#tUy(E?1cq+b8gkbUkrUb)9@CA=Bo&6fyV?N`o1-TL|X z)gI)tMdi^}8R9Tixq2dg8#|fN8&(#Ha{U&GS})Lt0X!LL&Rg;)$Nc?Shk^a|Mpp9G z>bBO^xgFcC`NYqvv|w?0ByXnV4;ml*f}eF6n*S#zrZ#{4T5_8x)u{UX`LjP2YxH|; z4W@{6cFd1=K}hu%Ja2Jwb%x8|Fm`~QYjY69FrkG&K<2|uq#nnh9M&=p4OctS*;;1VK))3J(Z+&CK-va+@`+^-NNuB{65ba%?p91(4m`W$q) zyv0Z3m}Qw5i-$U~)H3gJYf)lqUa18&$ksAj^|tS#-mARt4YTnU(N`sE(qxs08MRdZ z{yn=f7Y*C1?qq&Doc%Gc=FqDR6mAHc*?^VB_1oT_mb92hN|={Fban4d2skg%*lzum zA&^o3Bg+15JgbtD6Uw)6kTLW2w#Q()<~9=RS~OddS%3FJOsb7q%#nvX|7@Pw1e%f# zMgTHO0H5~Iz zw~sJJ*JU}ijVN_dN4N`L@U}m-IL*c<<34fat#R%} z7kaP2A%@g>q}y>}IWd>M{K;h&SYa=P?dBp3%7Q}<80xBWUo7y|lK<`SqG$XQ9G8l4 zAk}ERH$M7N1LLXArnzC>$kK?6vL%}Kt|B2ffFwSZG z`9r7qww6bw@vD?i!}m&{a|R{>&z5Ixt|OJ@<;8{N<(ahV;DO@9(Y9Cr9NcyfH|4q; z5*g}x-l-Rpk`n6m$i(io+LzpT!4aD%846@d<@)-p%6bJB8UFM%CAbV2;O`r!k+)wj zUo`&Nos*j1BSm@egl@f5ExTcslALS^7Q)MH zSEc$s%9_7Afe$>dQ~DTd1)5kD=GV3h0%vL2@hCKWNtm|c`c^n2neV7-3){hSk1Ou` z_*$1-GfkfyN|YE9HU<^KdRj+Y*j&e{trr_FYX)1LwTh#K?vQ|y+joloS*M2aeJAd! z3+lDpQnkQ>&Y%Deq%0X+uy?d}C0xYrnqtKKqQ7Aj_$>#f+Ij!~M^}c0Z zrrXc)89m0UGnIK2Y{!v;B?KWgYTnA&qzA!N!d^jBCI9hDBf1U2eB%A}Q4S{^X&Z|- zL7+A(QK-M0dn`;{<<}mPnfZ@h*VD|vMrmL?BSuVD2Ty@z%-0#^m-`E5jo6(cF-&o- zdhwiY-+kArTr)XXXgD7>z{&xXh>D354`J@rjoGY1z+%&gg@F3}o~u*6#|pv2>7g9c z$7(Dv+~~T$n!oI}@Qo!23~DG#NJy>uXI+i`6Lf-EJ$E=fVOij7B;TL@)dgm?s6SOF z?(JE5+-@fEg6TJsK85xLRvx6rkoQA!k)iDa!}}`w3DJ5@&c?gr80Z*tl{}p%-vml^ zYfwNl!QP<$g<7JAoWbLyC?GMsmxDYqXzmeR!Oz{DfvDh_Iz`Z<(W-J}KnV|9ZMAr* z`-#`rk-YFsc9I>E_WTIoa_hv}dGc=Ja~myD!PW3m*MZU+d(M zJ67zE6y~0B}kZ@WVal!Ld$w!@pSP? zR{x%~c6I8HRR4_x0Rds=Y;@)+WAav$yUpVkhuo{4cUBydFhtbo`xtg1{=X+t$_hTcS)>;430GK(k^YIca{7a39)OY0TTOK0wo08PW zW+=9#^U)#qJkSoML9K0%A3SQ~-P~4LOI8M!-*5BLwKTg{QCod7aPvX)51SWGtyG(*dee;!w()h(h*Wm+)Vo}Fk~%us z@JNaFKodaxU|Z18E4O}6-GE0sa*F3_R5PCb)|lG$uAkbkw8L1>)MJDGEg|2o9`HR- zJk`#5ytPq!f(5!CCxWr>Ik9SC5e)BZZJ>?W2_s}hSy|+#n{~{GS{K%{FJFx|InhRN z1y^_8R?6pLUP>%HkO;ImAse}rz2-lJ58~xtAFTNd9U#zNZS|Gq9at)DY<$%hMcP%i z*c5xV29JP74!a$iSwX%@ODHP-5lG_K7e^Wb4X!Y=46^o4U%Td5TYZ|Enz|>eQFTB& z<7lD5Kd&!pHEi^y&v0iu_PQbe0z9l##E;|f&(gLZ-{z7Fiddg`QVV1H*G6IBvuHtp z&x1xnU-d5=m1h?I^XB>L{(d;|*zs>7@#l)iD9OBb1!pY6qzR-&?-K9IWYza4H zefZ;3lZ(2BD}%m75T(!t#agC-h^R9yCsz#{=mrj@a3F$FK%6V>X69VkD^1X&Sq1$e zUbhF{%)nqM9p)C7Hd&F;)Z&lELt~vH#S$WaXE_k!c@Vv`axW7a z?Xd8sXEunp6*o7Nw6?a^J0HHXU1$!)VId%ahrg(F5-|wQ+1Xw}n|Ok466mbRe={&D z`O%s>jw*|i<}F+bLnx?YcUSwtL=%N3pbH4?Bk|%qXyhtiX|{lv7ZMVxcf5V;M=m4* zcKsq!@o%3k(j6a~Z^JJtG`H*6XM#&fh#EQ|iW?-X*_p@sApy zQH4n^)D2t#?28i$Fr%b8x-R-b38NSP!_HJ6N)Y~sF%EA3s2t>KbVZ2|w`wEIVh&2Q zVP806vtonN36T4hLZwANARtkwsA=}~yGR*t^t(WxdjNwc;`*7+Y`djkKwUyY0t|lQ zU}KM-Fr5*B*oT39A;Gv%9LoM|jG<@3vGXcLO#C0@l^cS}ziI!}#Hg7yYv6jiI#ATZ zzoTblit~^*fQ#nZCrb)#34>7ePJodvWO%HRn>%nvnfR-zhIyvBkeQYaL&%o6~w$1 zy9WIHS|2|;*F?s<`GbiMFyr?c%qM{f1sORdDdYDz`UOAos?L^;YRon_vVWFfYAD(O zttzex`VYl>D(^J_YjQ&jwx=z6!z$_I3N45#8u~$Vf8MHVCgi2-1dQkU;loPp?d^6f zERa0@Djh2~5bo&v^JniDnS@dD2DQ68=t_YRd)gb&xC3J?Sm1evepV(C@TkNexwPKU z^0G21!Sc<1J~_ERG3)(6B_Yhs@r_MQ`DSL4U0hyd7ZxId;YiSGhJHaoK|u`esyxQe zk)Nfd5@5CmG=XC?G9tm`I%vb?famg{PhxC+>0oAnNg9;YFq;UczKQfuS5K(>NC28f zsdsG|z94V2fBrybR#de3Y$>Xyh6|mRVPo^j$)P|)M>n#zj?iy$bGp7G98h)+%MHi{ w?1Mfmj^+P9zZAgabFP3Ws+!Or`;0h}aW1&FX^jZ}u?UE)q>@CLn4#Z)0n1tGdH?_b literal 0 HcmV?d00001 diff --git a/doc/guides/workflow/order_0.svg b/doc/guides/workflow/order_0.svg new file mode 100644 index 00000000000..54a5c050238 --- /dev/null +++ b/doc/guides/workflow/order_0.svg @@ -0,0 +1,48 @@ + + + + + + +order + + +Draft + +Draft + + +Confirmed + +Confirmed + + +Draft->Confirmed + + + + +Closed + +Closed + + +Canceled + +Canceled + + +Confirmed->Closed + + + + +Confirmed->Canceled + + + + + diff --git a/doc/guides/workflow/order_1.dot b/doc/guides/workflow/order_1.dot new file mode 100644 index 00000000000..cc204343172 --- /dev/null +++ b/doc/guides/workflow/order_1.dot @@ -0,0 +1,11 @@ +digraph order { + Draft [style=filled fillcolor="#73fa79"] + Closed [style=filled fillcolor="#98c7df"] + Canceled [style=filled fillcolor="#98c7df"] + + Draft -> Confirmed [label="discount <= 15%"] + Draft -> Validation [label="discount > 15%"] + Validation -> Confirmed [label="Accept"] + Confirmed -> Closed + Confirmed -> Canceled +} diff --git a/doc/guides/workflow/order_1.png b/doc/guides/workflow/order_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9aba22110228560d27dcd8dc13ecf7ffb98be5ad GIT binary patch literal 28452 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 + + + + + +order + + +Draft + +Draft + + +Confirmed + +Confirmed + + +Draft->Confirmed + + +discount <= 15% + + +Validation + +Validation + + +Draft->Validation + + +discount > 15% + + +Closed + +Closed + + +Canceled + +Canceled + + +Confirmed->Closed + + + + +Confirmed->Canceled + + + + +Validation->Confirmed + + +Accept + + + diff --git a/doc/guides/workflow/split.dot b/doc/guides/workflow/split.dot new file mode 100644 index 00000000000..b0f3831854a --- /dev/null +++ b/doc/guides/workflow/split.dot @@ -0,0 +1,10 @@ +digraph split { + // dummy destinations as support for edges, make invisible and height 0 + a [style=invis height=0 fontsize=0] + b [style=invis height=0 fontsize=0] + c [style=invis height=0 fontsize=0] + + Activity -> a + Activity -> b + Activity -> c +} diff --git a/doc/guides/workflow/split.png b/doc/guides/workflow/split.png new file mode 100644 index 0000000000000000000000000000000000000000..329854a656b6553bd2199181c574fda95ce8a688 GIT binary patch literal 6912 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 literal 0 HcmV?d00001 diff --git a/doc/guides/workflow/split.svg b/doc/guides/workflow/split.svg new file mode 100644 index 00000000000..139874fdc75 --- /dev/null +++ b/doc/guides/workflow/split.svg @@ -0,0 +1,36 @@ + + + + + + +split + + + + + +Activity + +Activity + + +Activity->a + + + + +Activity->b + + + + +Activity->c + + + + + diff --git a/doc/guides/workflows.rst b/doc/guides/workflows.rst index 05957fce61b..24a79862e2e 100644 --- a/doc/guides/workflows.rst +++ b/doc/guides/workflows.rst @@ -3,14 +3,14 @@ Workflows ========= -In OpenERP, a workflow is a technical artefact to manage a set of "things to -do" associated to the records of some data model. The workflow provides a -higher- level way to organize the things to do on a record. +In Odoo, a workflow is a technical artefact to manage a set of "things to +do" associated to the records of a model. The workflow provides a higher-level +way to organize tasks to perform with or on a record. More specifically, a workflow is a directed graph where the nodes are called "activities" and the arcs are called "transitions". -- Activities define work that should be done within the OpenERP server, such +- Activities define work that should be done within the Odoo server, such as changing the state of some records, or sending emails. - Transitions control how the workflow progresses from activity to activity. @@ -19,6 +19,40 @@ triggers to transitions, so that the behavior of the workflow depends on user actions (such as clicking on a button), changes to records, or arbitrary Python code. +All in all, Odoo's workflow system provides: + +* a description of the evolution of a record (document) over time +* automatic actions based on various and flexible conditions +* management of company roles and validation steps +* management of interactions between objects +* a visual representation of document flows through their lifecycle + +For instance, a basic order could have the following flow: + +.. sphinx.ext.graphviz would be nice, but it requires ``dot`` on any machine +.. where the doc is compiled... otoh this is a pain in the ass because you +.. need 2 compilation steps (dot -> image and rst -> html) every time + +.. image:: workflow/order_0.* + :align: center + +Orders start in the *Draft* state, can be *Confirmed* by a user, and then +either shipped (*Closed*) or *Canceled*. + +A company using Odoo may want to add discount support to orders, where sales +staff has discretionary discounting powers up to 15%, but manager validation +is required for discounts beyond 15%. The workflow can be altered online to +add the relevant steps without editing Python or XML files: + +.. image:: workflow/order_1.* + :align: center + +Because Activities can perform arbitrary actions, the *Validation* can +automatically send a validation request to the relevant employee. + +.. note:: the order view needs to be modified to add an *Accept Discount* + button for managers + Basics ------ @@ -63,7 +97,7 @@ made up of two activies, named "a" and "b", and one transition, going from "a" to "b". The first activity has its attribute ``flow_start`` set to ``True`` so that -OpenERP knows where to start the workflow traversal after it is instanciated. +Odoo knows where to start the workflow traversal after it is instanciated. Because ``on_create`` is set to True on the workflow record, the workflow is instanciated for each newly created record. (Otherwise, the workflow should be instanciated by other means, such as from some module Python code.) @@ -77,6 +111,142 @@ The transition between "a" and "b" does not specify any condition. This means that the workflow instance immediately goes from "a" to "b" after "a" has been processed, and thus also processes activity "b". +Activities +---------- + +While the transitions can be seen as the control structures of the workflows, +activities are the places where everything happens, from changing record +states to sending email. + +Different kinds of activities exist: ``Dummy``, ``Function``, ``Subflow``, and +``Stop all``, each doing different things when the activity is processed. In +addition to their kind, activies have other properties, detailed in the next +sections. + +Flow start and flow stop +'''''''''''''''''''''''' + +The attribute ``flow_start`` is a boolean value specifying whether the activity +is processed when the workflow is instanciated. Multiple activities can have +their attribute ``flow_start`` set to ``True``. When instanciating a workflow +for a record, Odoo simply processes all of them, and evaluate all their +outgoing transitions afterwards. + +The attribute ``flow_stop`` is a boolean value specifying whether the activity +stops the workflow instance. A workflow instance is considered completed when +all its activities with the attribute ``flow_stop`` set to ``True`` are +completed. + +It is important for Odoo to know when a workflow instance is completed. A +workflow can have an activity that is actually another workflow (called a +subflow); that activity is completed when the subflow is completed. + +Subflow +''''''' + +An activity can embed a complete workflow, called a subflow (the embedding +workflow is called the parent workflow). The workflow to instanciate is +specified by attribute ``subflow_id``. + +.. note:: In the GUI, that attribute can not be set unless the kind of the + activity is ``Subflow``. + +The activity is considered completed (and its outgoing transitions ready to be +evaluated) when the subflow is completed (see attribute ``flow_stop`` above). + +Sending a signal from a subflow +''''''''''''''''''''''''''''''' + +When a workflow is embedded in an activity (as a subflow) of a workflow, the +sublow can send a signal from its own activities to the parent workflow by +giving a signal name in the attribute ``signal_send``. Odoo processes those +activities by sending the value of ``signal_send`` prefixed by "subflow." to +the parent workflow instance. + +In other words, it is possible to react and get transitions in the parent +workflow as activities are executed in the sublow. + +Server actions +'''''''''''''' + +An activity can run a "Server Action" by specifying its ID in the attribute +``action_id``. + +Python action +''''''''''''' + +An activity can execute some Python code, given by the attribute ``action``. +The evaluation environment is the same as the one explained in the section +`Conditions`_. + +Split mode +'''''''''' + +After an activity has been processed, Odoo evaluates its transition to reach +the next activity in the flow. + +However if an activity has more than one transition, Odoo must decide which +activity or activities to follow. + +.. image:: workflow/split.* + :align: center + +This choice is controlled by the ``split_mode`` attribute: + +``XOR`` (default) + By default, Odoo will use the first transition (in ``sequence`` order) + whose condition is satisfied. All other transitions are ignored. +``OR`` + In ``OR`` mode, all transitions with a satisfied condition are traversed + simultanously. Transitions not yet valid will be ignored, even if they + become valid later. +``AND`` + In ``AND`` mode, Odoo will wait until *all* transitions are satisfied, and + will traverse all of them (much like the ``OR`` mode). + +Both ``OR`` and ``AND`` mode will lead to activities being active in the same +workflow. + +Join mode +''''''''' + +Just like outgoing transition conditions can be combined together to decide +whether they can be traversed or not, incoming transitions can be combined +together to decide if and when an activity may be processed. + +.. image:: workflow/join.* + :align: center + +The ``join_mode`` attribute controls that behavior: + +``XOR`` (default) + Any incoming transition enables the activity and starts its processing. +``AND`` + The activity is enabled and processed only once *all* incoming transitions + have been traversed. + +Kinds +''''' + +An activity's kind defines the type of work an activity can perform. + +Dummy (``dummy``, default) + Do nothing at all, or call a server action. Often used as dispatch or + gather "hubs" for transitions. +Function (``function``) + Run some python code, execute a server action. +Stop all (``stopall``) + Completely stops the workflow instance and marks it as completed. +Subflow (``subflow``) + Starts executing an other workflow, once that workflow is completed the + activity is done processing. + + By default, the subflow is instanciated for the same record as the parent + workflow. It is possible to change that behavior by providing Python code + that returns a record ID (of the same data model as the subflow). The + embedded subflow instance is then the one of the given record. + + Transitions ----------- @@ -98,7 +268,7 @@ Conditions When an activity has been completed, its outgoing transitions are inspected to determine whether it is possible for the workflow instance to proceed through them and reach the next activities. When only a condition is defined (i.e., no -signal or trigger is defined), the condition is evaluated by OpenERP, and if +signal or trigger is defined), the condition is evaluated by Odoo, and if it evaluates to ``True``, the worklfow instance progresses through the transition. If the condition is not met, it will be reevaluated every time the associated record is modified, or by an explicit method call to do it. @@ -109,7 +279,7 @@ may be several lines long; in that case, the value of the last one determines whether the transition can be taken. In the condition evaluation environment, several symbols are conveniently -defined (in addition to the OpenERP ``safe_eval`` environment): +defined (in addition to the Odoo ``safe_eval`` environment): - all the model column names, and - all the browse record's attributes. @@ -152,151 +322,3 @@ record IDs in the given model. Any of those records can wake up the workflow instance they are associated with. .. note:: triggers are not re-installed whenever the transition is re-tried. - -Splitting and joining transitions -''''''''''''''''''''''''''''''''' - -When multiple transitions leave the same activity, or lead to the same -activity, OpenERP provides some control over which transitions are actually -taken, or how the reached activity will be processed. The attributes -``split_mode`` and ``join_mode`` on the activity are used for such -control. The possible values of those attributes are explained below. - -Activities ----------- - -While the transitions can be seen as the control structures of the workflows, -activities are the places where everything happens, from changing record -states to sending email. - -Different kinds of activities exist: ``Dummy``, ``Function``, ``Subflow``, and -``Stop all``, each doing different things when the activity is processed. In -addition to their kind, activies have other properties, detailed in the next -sections. - -Flow start and flow stop -'''''''''''''''''''''''' - -The attribute ``flow_start`` is a boolean value specifying whether the activity -is processed when the workflow is instanciated. Multiple activities can have -their attribute ``flow_start`` set to ``True``. When instanciating a workflow -for a record, OpenERP simply processes all of them, and evaluate all their -outgoing transitions afterwards. - -The attribute ``flow_stop`` is a boolean value specifying whether the activity -stops the workflow instance. A workflow instance is considered completed when -all its activities with the attribute ``flow_stop`` set to ``True`` are -completed. - -It is important for OpenERP to know when a workflow instance is completed. A -workflow can have an activity that is actually another workflow (called a -subflow); that activity is completed when the subflow is completed. - -Subflow -''''''' - -An activity can embed a complete workflow, called a subflow (the embedding -workflow is called the parent workflow). The workflow to instanciate is -specified by attribute ``subflow_id``. - -.. note:: In the GUI, that attribute can not be set unless the kind of the - activity is ``Subflow``. - -The activity is considered completed (and its outgoing transitions ready to be -evaluated) when the subflow is completed (see attribute ``flow_stop`` above). - -Sending a signal from a subflow -''''''''''''''''''''''''''''''' - -When a workflow is embedded in an activity (as a subflow) of a workflow, the -sublow can send a signal from its own activities to the parent workflow by -giving a signal name in the attribute ``signal_send``. OpenERP processes those -activities by sending the value of ``signal_send`` prefixed by "subflow." to -the parent workflow instance. - -In other words, it is possible to react and get transitions in the parent -workflow as activities are executed in the sublow. - -Server actions -'''''''''''''' - -An activity can run a "Server Action" by specifying its ID in the attribute -``action_id``. - -Python action -''''''''''''' - -An activity can execute some Python code, given by the attribute ``action``. -The evaluation environment is the same as the one explained in the section -`Conditions`_. - -Split mode -'''''''''' - -After an activity has been processed, its outgoing transitions are evaluated. -Normally, if a transition can be taken, OpenERP traverses it and proceed to -the activity the transition leads to. - -Actually, when more than a single transition is leaving an activity, OpenERP -may proceed or not, depending on the other transitions. That is, the -conditions on the transitions can be combined together, and the combined -result instructs OpenERP to traverse zero, one, or all the transitions. The -way they are combined is controlled by the attribute ``split_mode``. - -There are three possible split modes: ``XOR``, ``OR`` and ``AND``. - -``XOR`` - When the transitions are combined with a ``XOR`` split mode, as soon as a - transition has a satisfied condition, the transition is traversed and the - others are skipped. -``OR`` - With the ``OR`` mode, all the transitions with a satisfied condition are - traversed. The remaining transitions will not be evaluated later. -``AND`` - With the ``AND`` mode, OpenERP will wait for all outgoing transition - conditions to be satisfied, then traverse all of them at once. - -Join mode -''''''''' - -Just like outgoing transition conditions can be combined together to decide -whether they can be traversed or not, incoming transitions can be combined -together to decide if and when an activity may be processed. The attribute -``join_mode`` controls that behavior. - -There are two possible join modes: ``XOR`` and ``AND``. - -``XOR`` - With the ``XOR`` mode, an incoming transition with a satisfied condition - is traversed immediately, and enables the processing of the activity. - -``AND`` - With the ``AND`` mode, OpenERP will wait until all incoming transitions - have been traversed before enabling the processing of the activity. - -Kinds -''''' - -Activities can be of different kinds: ``dummy``, ``function``, ``subflow``, or -``stopall``. The kind defines what type of work an activity can do. - -Dummy - The ``dummy`` kind is for activities that do nothing, or for activities - that only call a server action. Activities that do nothing can be used as - hubs to gather/dispatch transitions. -Function - The ``function`` kind is for activities that only need to run some Python - code, and possibly a server action. -Stop all - The ``stopall`` kind is for activities that will completely stop the - workflow instance and mark it as completed. In addition they can also run - some Python code. -Subflow - When the kind of the activity is ``subflow``, the activity embeds another - workflow instance. When the subflow is completed, the activity is also - considered completed. - - By default, the subflow is instanciated for the same record as the parent - workflow. It is possible to change that behavior by providing Python code - that returns a record ID (of the same data model as the subflow). The - embedded subflow instance is then the one of the given record.