module DatabaseDesign.Ampersand.Output.ToPandoc.ChapterProcessAnalysis
where
import DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters
import DatabaseDesign.Ampersand.Classes
import Data.List
import DatabaseDesign.Ampersand.Output.PandocAux
noProcesses :: Fspc -> Bool
noProcesses fSpec = null (fRoleRels fSpec) && null (fRoleRuls fSpec)
chpProcessAnalysis :: Int -> Fspc -> Options -> (Blocks,[Picture])
chpProcessAnalysis lev fSpec flags
= if null procs
then (mempty,[])
else (fromList $ header ++ roleRuleBlocks ++ roleRelationBlocks ++ processSections , pictures)
where
pictures = [pict | (_,picts)<-procSections procs,pict<-picts]
procs = if null (themes fSpec)
then vprocesses fSpec
else [ prc | prc<-vprocesses fSpec, name prc `elem` themes fSpec ]
processSections :: [Block]
processSections
= [block | (bs,_)<-procSections procs, block<-bs]
header :: [Block]
header
= toList (chptHeader flags ProcessAnalysis) ++
purposes2Blocks flags purps ++
[ case language flags of
Dutch ->
Plain [ Str $ upCap (name fSpec)++" kent geen regels aan rollen toe. "
, Str "Een generieke rol, User, zal worden gedefinieerd om al het werk te doen wat in het bedrijfsproces moet worden uitgevoerd."
]
English ->
Plain [ Str $ upCap (name fSpec)++" does not assign rules to roles. "
, Str "A generic role, User, will be defined to do all the work that is necessary in the business process."
]
| null (fRoleRuls fSpec)] ++
[ case language flags of
Dutch ->
Plain [ Str $ upCap (name fSpec)++" specificeert niet welke rollen de inhoud van welke relaties mogen wijzigen. "
, Str ""
]
English ->
Plain [ Str $ upCap (name fSpec)++" does not specify which roles may change the contents of which relations. "
, Str ""
]
| null (fRoleRels fSpec)]
where purps = purposesDefinedIn fSpec (language flags) fSpec
roleRuleBlocks :: [Block]
roleRuleBlocks
= if null (fRoleRuls fSpec) && (not.null.udefrules) fSpec then [] else
[ case language flags of
Dutch ->
Para [ Str $ upCap (name fSpec)++" kent regels aan rollen toe. "
, Str "De volgende tabel toont de regels die door een bepaalde rol worden gehandhaafd."
]
English ->
Para [ Str $ upCap (name fSpec)++" assigns rules to roles. "
, Str "The following table shows the rules that are being maintained by a given role."
]
, Para $ [ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") "\\begin{tabular}{|l|l|}\\hline\n"
, case language flags of
Dutch -> RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") "Rol&Regel\\\\ \\hline\n"
English -> RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") "Role&Rule\\\\ \\hline\n"
]++
[ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") $ intercalate "\\\\ \\hline\n "
[ role++" & "++name r++
concat[ "\\\\\n &"++name rul | rul<-map snd (tail rrClass)]
| rrClass<-eqCl fst (fRoleRuls fSpec)
, let role=fst (head rrClass), let r=snd (head rrClass)
]
]++
[ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") "\\\\ \\hline\n\\end{tabular}"
]
]
roleRelationBlocks :: [Block]
roleRelationBlocks
= if null (fRoleRels fSpec) then [] else
[ case language flags of
Dutch ->
Para [ Str $ upCap (name fSpec)++" kent rollen aan relaties toe. "
, Str "De volgende tabel toont de relaties waarvan de inhoud gewijzigd kan worden door iemand die een bepaalde rol vervult."
]
English ->
Para [ Str $ upCap (name fSpec)++" assigns roles to relations. "
, Str "The following table shows the relations, the content of which can be altered by anyone who fulfills a given role."
]
, Para $ [ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") "\\begin{tabular}{|l|l|}\\hline\n"
, RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex")
(case language flags of
Dutch -> "Rol&Relatie\\\\ \\hline\n"
English -> "Role&Relation\\\\ \\hline\n")
]++
[ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") $ intercalate "\\\\ \\hline\n "
[ role++" & $"++showMath r++"$"++
concat[ "\\\\\n &$"++showMath (snd rs)++"$" | rs<-tail rrClass]
| rrClass<-eqCl fst (fRoleRels fSpec)
, let role=fst (head rrClass), let r=snd (head rrClass)
]
]++
[ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") "\\\\ \\hline\n" | not (null rolelessRels)]++
[ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") $ intercalate "\\\\\n " [ "&$"++showMath d++"$" | d<-rolelessRels] | not (null rolelessRels)]++
[ RawInline (DatabaseDesign.Ampersand.Output.ToPandoc.SharedAmongChapters.Format "latex") "\\\\ \\hline\n\\end{tabular}"
]
]
where
rolelessRels = [ d | d<-declarations fSpec, d `notElem` (nub.map snd) (fRoleRels fSpec) ]
emptyProcess :: Process -> Bool
emptyProcess p = null (udefrules p)
procSections :: [FProcess] -> [([Block],[Picture])]
procSections fprocs = iterat [fp |fp<-fprocs, not (emptyProcess (fpProc fp))] 1 (concs (patterns fSpec)) ((concatMap declarations.patterns) fSpec)
where
iterat :: [FProcess] -> Int -> [A_Concept] -> [Declaration] -> [([Block],[Picture])]
iterat [] _ _ _ = []
iterat (fproc:fps) i seenConcepts seenDeclarations
= ( toList (labeledThing flags (lev+1) (xLabel ProcessAnalysis++"_"++name fproc) (name fproc))
++ sctMotivation
++ txtProcessModel fproc
++ txtLangModel fproc
++ (if null sctRules then [] else [DefinitionList sctRules])
, [picProcessModel fproc, picLangModel fproc]): iterat fps i' seenCrs seenDrs
where
sctMotivation
= purposes2Blocks flags purps
purps = purposesDefinedIn fSpec (language flags) fproc
sctRules :: [([Inline], [[Block]])]
(sctRules,i',seenCrs,seenDrs) = dpRule fSpec flags (udefrules (fpProc fproc)) i seenConcepts seenDeclarations
txtLangModel :: FProcess->[Block]
txtLangModel fp
= if not (genGraphics flags) then [] else
[Para (case language flags of
Dutch -> [ Str "Het conceptueel diagram in figuur ", xrefReference pict
, Str " geeft een overzicht van de taal waarin dit proces wordt uitgedrukt."]
English -> [ Str "The conceptual diagram of figure ", xrefReference pict
, Str " provides an overview of the language in which this process is expressed."])
,Plain (xrefFigure1 pict)]
where pict = picLangModel fp
txtProcessModel :: FProcess->[Block]
txtProcessModel p
= if not (genGraphics flags) then [] else
[Para (case language flags of
Dutch -> [ Str "Figuur ", xrefReference pict
, Str " geeft het procesmodel weer."]
English -> [ Str "Figure ", xrefReference pict
, Str " shows the process model."])
,Plain (xrefFigure1 pict)]
where pict = picProcessModel p
picLangModel :: FProcess->Picture
picLangModel fproc
= ((makePictureObj flags (name fproc) PTProcLang . conceptualGraph fSpec flags Rel_CG) fproc)
{caption = case language flags of
Dutch ->"Basiszinnen van "++name fproc
English ->"Basic sentences of "++name fproc}
picProcessModel :: FProcess->Picture
picProcessModel fproc
= makePicture flags fSpec Plain_CG fproc