Piotr Labudda 9 tahun lalu
induk
melakukan
e53769c2e7

+ 12 - 0
SE/ant.php

@@ -0,0 +1,12 @@
+<?php
+
+require_once dirname(__FILE__) . '/se-lib/bootstrap.php';
+
+if (!Request::isHttps()) {
+	header("Location: https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
+	exit();
+}
+
+Lib::loadClass('Router');
+$antTask = V::get('antTask', '', $_GET);
+Router::getRoute('Ant')->execAntTool($antTask);

+ 113 - 0
SE/schema/ant-tool/DownloadProcesToDita/PROCES_INCLUDE.xsl

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    xmlns:system_cache__appinfo="http://biuro.biall-net.pl/xmlschema_procesy5/default_db_xml_cache/appinfo.xsd"
+    exclude-result-prefixes="xs system_cache__appinfo"
+    version="2.0">
+    
+    <xsl:param name="DEFAULTS__SERVER_ADDRESS" select="'biuro.biall-net.pl/SE/version-git/'"/><!--  parametr do wyrzucenia w defaults - do umozliwienia szybkiego wchodzenia do systemu powiazania szkolenia -->
+    <xsl:variable name="CRM_PROCES.xml" select="doc('../../default_db.instance.xml/CRM_PROCES.xml')"/>
+    
+    <!--<xsl:import href="../../default_db.instance.xml/"/>-->
+    <xsl:include href="../../default_db_xml_cache/escaped_html_to_xml.xsl"/>
+    
+    
+    
+    <xsl:template  match="text()" mode="PROCES_INCLUDE">
+        <xsl:param name="ID_PROCES" required="yes"/><!-- to be set to retrieve process tree -->
+        parsed  PROCES:<xsl:value-of select="$ID_PROCES"/>; proces to include is <xsl:value-of select="."/>;
+        
+        <xsl:apply-templates mode="PROCES_TO_DITA" select="$CRM_PROCES.xml/data/items/item[ID=$ID_PROCES]"/>
+        <xsl:apply-templates mode="CRM_PROCES_STEP" select="$CRM_PROCES.xml/data/items/item[PARENT_ID=$ID_PROCES]">
+            <xsl:sort select="SORT_PRIO"/>
+        </xsl:apply-templates>
+        
+    </xsl:template>
+    
+    <xsl:template mode="CRM_PROCES_STEP" match="node()">
+        <!--        CRM_PROCES_STEP dla ID <xsl:value-of select="ID"/> ;-->
+        <xsl:variable name="ID" select="ID"/>
+        <ul>
+            <xsl:for-each select=".">
+                <xsl:sort select="SORT_PRIO"/>
+             
+                 <li>
+                <xsl:apply-templates mode="PROCES_TO_DITA">
+                    <xsl:with-param name="ID" select="$ID"/>
+                </xsl:apply-templates>
+                 
+    <!--            Try to goto  item/PARENT_ID=<xsl:value-of select="current()/ID"/>-->  
+                 <xsl:apply-templates mode="CRM_PROCES_STEP" select="$CRM_PROCES.xml/data/items/item[PARENT_ID=$ID and A_STATUS!='DELETED']"/>
+                 </li>
+             
+            </xsl:for-each>
+        </ul>
+        
+    </xsl:template>
+    
+    <xsl:template mode="PROCES_TO_DITA" match="ID">
+        <xref href="https://{$DEFAULTS__SERVER_ADDRESS}/procesy5.php?task=CRM_PROCES&amp;filtr_id={current()}&amp;filtr_ids=%2B&amp;filtr_ob=%2B&amp;filtr_img=%2B" format="html" scope="external"><xsl:value-of select="."/></xref>
+    </xsl:template>
+    <xsl:template mode="PROCES_TO_DITA" match="DESC">
+        <xsl:param name="ID"/>
+        <term><!--ID: <xsl:apply-templates mode="PROCES_TO_DITA_STRIP_HTML" select="../ID/text()"/><xsl:value-of select="'  '"/>--> <xsl:apply-templates mode="PROCES_TO_DITA_STRIP_HTML"/></term>
+    </xsl:template>
+    <xsl:template mode="PROCES_TO_DITA" match="OPIS">
+        OPIS: <xsl:apply-templates mode="PROCES_TO_DITA_STRIP_HTML"/>
+    </xsl:template>
+    
+    <xsl:template mode="PROCES_TO_DITA" match="*"/>
+        
+    
+    
+    <xsl:template match="*" mode="PROCES_TO_DITA_STRIP_HTML"/>
+    <xsl:template match="text()" mode="PROCES_TO_DITA_STRIP_HTML">
+        <xsl:param name="limit"/>
+        <xsl:variable name="parse_content">
+        <xsl:choose>
+            <xsl:when test=".='&#xD;'"/>
+            <xsl:otherwise><xsl:call-template name="system_cache__appinfo:escaped_html_to_xml" exclude-result-prefixes="#all" extension-element-prefixes="">
+                <xsl:with-param name="html" select="."/>
+            </xsl:call-template></xsl:otherwise>
+        </xsl:choose>
+        </xsl:variable>
+        <xsl:apply-templates select="$parse_content" mode="CONVERT_HTML_TO_DITA_CONTENT"/>
+    </xsl:template>
+    
+    <xsl:template match="text()" mode="PROCES_TO_DITA_STRIP_HTML_TITLE">
+        <xsl:param name="limit"/>
+        <xsl:variable name="parse_title">
+        <xsl:choose>
+            <xsl:when test=".='&#xD;'"/>
+            <xsl:otherwise><xsl:call-template name="system_cache__appinfo:escaped_html_to_xml" exclude-result-prefixes="#all" extension-element-prefixes="">
+                <xsl:with-param name="html" select="."/>
+            </xsl:call-template></xsl:otherwise>
+        </xsl:choose>
+        </xsl:variable>
+        <xsl:copy-of select="$parse_title"/>
+    </xsl:template>
+    
+    
+    <xsl:template match="text()" mode="CONVERT_HTML_TO_DITA_CONTENT">
+        <p><xsl:copy-of select="."/></p>
+    </xsl:template>
+    
+    <xsl:template match="br" mode="CONVERT_HTML_TO_DITA_CONTENT">
+        <xsl:param name="ph_used"/>
+        <xsl:choose>
+            <xsl:when test="$ph_used">
+                <p/>
+                <xsl:apply-templates mode="CONVERT_HTML_TO_DITA_CONTENT"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <p/><xsl:apply-templates mode="CONVERT_HTML_TO_DITA_CONTENT">
+                    <xsl:with-param name="ph_used" select="true()"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    
+    
+    
+</xsl:stylesheet>

+ 116 - 0
SE/schema/ant-tool/DownloadProcesToDita/build.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project basedir="." name="PROCES_TO_DITA" default="PROCES_TO_DITA_build">
+    <!-- Przykładowe wyzwolenie z bash : 
+    cat input.xml | /Library/Server/Web/Data/Sites/Default/SE/stuff/dita-ot-2.3.3/bin/ant -buildfile ild__IN7_DZIENNIK_KORESP.xml
+    na output mamy pdf'a
+-->
+    
+    <property name="INPUT" value="main.dita"/> <!-- Test_z_getfeature_do_parse.xml todo cos co otrzymamy z API do parsowania -->
+    <!--<property name="main.dita" value="main.dita"/>-->
+    <property name="parse_dita_templ.xsl" value="parse_dita_templ.xsl"/> <!-- do wykorzystania do przeparsowania pliku main.dita-->
+    <property name="PROCES_INCLUDE.xsl" value="PROCES_INCLUDE.xsl" /> <!-- parser main.dita - potem pewnie przeparsowanego pliku -->
+    <!--<tempfile property="tmp.xml" destdir="temp" deleteonexit="yes"/>-->
+    <!--<tempfile property="Test_z_getfeature_do_parse__noxml.xml" destdir="temp" deleteonexit="yes"/>-->
+    <!--<tempfile property="main__noxml.dita" destdir="temp" deleteonexit="yes"/>-->
+    <!--<tempfile property="Test_z_getfeature_do_parse__noxml.xml" destdir="temp" deleteonexit="yes"/>-->
+    <!--<tempfile property="main__noxml.dita" destdir="temp" deleteonexit="yes"/>-->
+    <tempfile property="out.dita" deleteonexit="no" /> <!-- do wygenerowania dita do zrobienia z niego PDF -->
+    <!--<tempfile destdir="out.dita" deleteonexit="yes"/>-->
+    <!--<delete file="tmp.xml"/>
+    <delete file="Test_z_getfeature_do_parse__noxml.xml"/>
+    <delete file="main__noxml.dita"/>-->
+    
+    
+    <!--<if>
+        <available file="${INPUT}" type="file" />
+    </if>-->
+    
+    
+    
+    <target name="check" >
+        <echo message="testuje check"/>
+        <condition property="test_if_INPUTxml" taskname="PROCES_TO_DITA_build" value="AVIABLE">
+            <available file="${INPUT}" filepath="." />
+        </condition>
+    </target>
+    
+    <target name="make_inputXML_from_stdin" unless="test_if_INPUTxml">
+        <echo message="make_inputXML_from_stdin is not aviable appending"/>
+        <input addproperty="INPUT_from_stdin"/>
+        <echo message="${INPUT_from_stdin}" file="${INPUT}"/>
+        <!--<echo file="${test_if_INPUTxml}" message=""/>-->
+    </target>
+    <target name="check-info" if="test_if_INPUTxml">
+        <echo message="Using default XML object on input from file ${INPUT} . "/>
+    </target>
+    
+    <target name="PROCES_TO_DITA_build" depends="check,check-info,make_inputXML_from_stdin">
+        <echo message="PROCES_TO_DITA_build to ${test_if_INPUTxml}"/>
+        <!-- przyklad z uzywaniem saxona ktorego wczesniej trzeba pobrac z port install saxon -->
+        <!--<xslt style="copy-no-xml.xsl" in="${INPUT}" out="${Test_z_getfeature_do_parse__noxml.xml}"> <!-\- {Test_z_getfeature_do_parse__noxml.xml"-\->
+            <factory name="net.sf.saxon.TransformerFactoryImpl">    
+                <attribute name="http://saxon.sf.net/feature/xinclude-aware" value="true"/>
+            </factory>
+            <classpath location="/opt/local/share/java/saxon9he.jar"/>
+        </xslt>-->
+        <!--<xslt style="copy-no-xml.xsl" in="main.dita" out="${main__noxml.dita}"/>-->
+        <!--<concat destfile="${tmp.xml}" append="true" encoding="UTF-8" > 
+            <string>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+                &lt;root&gt;</string>
+            <file file="${Test_z_getfeature_do_parse__noxml.xml}"  />
+            <file file="${main__noxml.dita}"/>
+            <string>&lt;/root&gt;</string>
+        </concat>-->  
+        
+        <!-- parsuje main.dita aby wiedziec, jaki proces jest zalaczany do danego zaglebienia aby wygenerowac docelowy plik dita z zaglebieniami -->
+        <xslt basedir="./" style="${parse_dita_templ.xsl}" in="${INPUT}"  destdir="./" out="out.dita" >
+            <factory name="net.sf.saxon.TransformerFactoryImpl">    
+                <attribute name="http://saxon.sf.net/feature/xinclude-aware" value="true"/>
+                <attribute name="http://saxon.sf.net/feature/initialMode" value="DITA_PARSE_templ"/>
+                <!--<attribute name="http://saxon.sf.net/feature/initialTemplate" value="asd"/>-->
+            </factory>
+            <classpath location="/opt/local/share/java/saxon9he.jar"/>
+            <!--<param name="dita_task_template_file_param" expression="main.dita"/>-->
+        </xslt>
+        
+        <!-- tymczasowe rem dla zrobienia akcji wyzej -->
+        <!--<xslt basedir="./" style="${PROCES_INCLUDE.xsl}" in="${INPUT}"  destdir="./" out="out.dita" >
+            <factory name="net.sf.saxon.TransformerFactoryImpl">    
+                <attribute name="http://saxon.sf.net/feature/xinclude-aware" value="true"/>
+                <attribute name="http://saxon.sf.net/feature/initialMode" value="PROCES_INCLUDE"/>
+                <!-\-<attribute name="http://saxon.sf.net/feature/initialTemplate" value="asd"/>-\->
+            </factory>
+            <classpath location="/opt/local/share/java/saxon9he.jar"/>
+            <!-\-<param name="dita_task_template_file_param" expression="main.dita"/>-\->
+        </xslt>--> 
+        
+        
+        
+        <!--<property name="dita.dir" location="/Library/Server/Web/Data/Sites/Default/SE/stuff/dita-ot-2.3.3/bin/dita"/>-->
+        <!--<exec executable="${dita.dir}" dir=".">
+            <arg value="-i"/>
+            <arg value="${out_task.dita}" />
+            <arg value="-f" />
+            <arg value="pdf"/>
+            <arg value="-o"/>
+            <arg value="out"/>
+        </exec>-->
+        
+        <!--<exec  executable="bash" dir="." outputproperty="out_task_file">
+            <arg value="-c"/>
+            <arg value="echo ${out_task.dita} |sed 's/^.*\///'"/>
+        </exec>-->
+        
+        <!--<propertyregex  property="out_file" input="${out_task.dita}" regexp="$.*/(.*)" select="\1."/>-->
+        <!--<loadfile property="result" srcFile="out/${out_task_file}.pdf"/>-->
+        <!--<echo message="input was : ${input}"/>-->
+        <!--<echo message="${result}"/>-->
+        <!--<propertyregex 
+            name="test"
+            property="current.target.dir"
+            input="com.element.subelement"
+            regexp="\."
+            replace="/"
+            global="true" />-->
+    </target>
+</project>

+ 15 - 0
SE/schema/ant-tool/DownloadProcesToDita/main.dita

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<topic id="topic_sfx_mwx_yx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:noNamespaceSchemaLocation="urn:oasis:names:tc:dita:xsd:topic.xsd">
+  <title>Sciagniecie procesu do DITY testowe nr 1607</title>
+  <body>
+    <p> element data-about/data/apiname[@base=PROCES_INCLUDE]/text()=1607 <data-about>
+        <data><apiname base="PROCES_INCLUDE">1607</apiname></data>
+      </data-about>
+    </p>
+    <p>asda</p>
+  </body>
+  <topic id="topic_dzd_vxx_yx">
+    <title>test</title>
+  </topic>
+</topic>

+ 391 - 0
SE/schema/ant-tool/DownloadProcesToDita/out.dita

@@ -0,0 +1,391 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<topic xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       id="topic_sfx_mwx_yx"
+       xsi:noNamespaceSchemaLocation="urn:oasis:names:tc:dita:xsd:topic.xsd">
+   <title>Sciagniecie procesu do DITY testowe nr 1607</title>
+   <body>
+      <p> element data-about/data/apiname[@base=PROCES_INCLUDE]/text()=1607 <data-about>
+            <data>
+               <apiname base="PROCES_INCLUDE">1607</apiname>
+            </data>
+         </data-about>
+      </p>
+      <p>asda</p>
+   </body>
+   <topic id="asd1607">
+      <title> Opracowanie nowych (brakujących) procesów i wymagań ogólnych / tworzenie procesów wraz z tworzeniem zasobów, tworzeniem pytań testowych teoretycznych i praktycznych [wszystkie procesy wykazane w drzewie procesów na daną osobę oraz im podległe muszą by</title>
+      <body>
+         <p>W firmie prowadzi się rejestr procesów oraz zasobów. Procesy są gromadzone w postaci konspektu/drzewa. Procesy mogą zawierać informacje o charakterze choreografii postępowania (czyli instrukcje postępowania krok-po-kroku), mogą także zawierać ogólne wymagania (np. szkolenie z zakresu wiedzy ogólnej na temat instrukcji BHP lub specjalne szkolenie z zakresu asortymentu produktów jakie dana firma sprzedaje/kupuje). </p>
+      </body>
+      <topic id="asd3866">
+         <title>Procesy</title>
+         <body>
+            <p>Procesy są jednym z elementów składowych zintegrowanej dokumentacji jakości (kolejnym jest tzw. drzewo zasobów). &#xD;
+</p>
+         </body>
+         <topic id="asd1608">
+            <title>W przypadku chęci dodania nowych procesów/procedur należy zweryfikować istnienia procesu/procedury opisującej wybrane zadanie (za pomocą przeszukiwania listy procesów) w celu upewnienia się, że nie dodamy informacji do systemu, które już istnieją, co będz</title>
+            <body>
+               <p>Należy dążyć do tego aby dane zagadnienie było w systemie zdefiniowane wyłącznie jeden raz - dla tego upewniamy się, czy już dane zagadnienie nie zostało opisane. </p>
+            </body>
+            <topic id="asd2165">
+               <title>Zweryfikuj czy nie istnieje proces/procedura opisująca wybrane zadanie (poprzez nawigację w drzewie procesów). Po czym wróć do wykonywania kolejnych instrukcji</title>
+               <body>
+                  <p>Opcjonalna możliwość weryfikacji istnienia procesu opisującego interesującą nas procedurę: </p>
+               </body>
+            </topic>
+         </topic>
+         <topic id="asd1609">
+            <title>Jeżeli odnalazłeś procedurę lub Proces i potwierdzasz, po jego przeanalizowaniu, że nie wymaga poprawy i spełnia swoje oczekiwania, przerwij proces dodawania nowego procesu do systemu, z informacją zwrotną</title>
+            <body>
+               <p>W przypadku jeżeli po wstępnej weryfikacji udało się ustalić, że jest proces i w zupełności w wystarczający sposób (zgodnie z przyjętymi standardami tworzenia nowych procesów) , opisuje on zagadnienia jakie były problemem i wyzwoliły niniejszy proces, możesz zakończyć ten proces. Jeżeli wykonywanie niniejszego obowiązku było zlecone, należy poinformować osobę zlecającą o tym , że dla danego zagadnienia XXXXX udało się zidentyfikować proces {ZZZZZ}. Należy powiadomić tą osobę elektronicznie i zakończyć proces.</p>
+            </body>
+         </topic>
+         <topic id="asd1611">
+            <title>Jeżeli nie odnalazłeś procedury lub procesu i potwierdzasz, po jego przeanalizowaniu, należy dodać nowy lub poprawić istniejący, wykonaj kolejne czynności opisujące w jaki sposób dodać lub poprawić procesy/procedury do systemu</title>
+            <body>
+               <p>Jeżeli proces/procedura nie istnieje i należy ją stworzyć wykonaj kolejne kroki procesu.</p>
+            </body>
+            <topic id="asd1612">
+               <title>Wyszukać osobę odpowiedzialną za daną sprawę/proces.</title>
+               <body>
+                  <p>Załączone zdjęcie pokazuje przykładowy widok struktury zasobów dotyczących Stanowisk/ Należy ustalić kto jest wykonawcą tego procesu ( jakie stanowisko wykonuje dany proces ) . Może być do tego pomocne wykorzystanie drzewa spraw i sprawdzenie czy nikt aktualnie się nie zajmuje tego typu sprawami. Warto wyszukać inny podobny proces i zweryfikować jakie stanowisko jest jego wykonawcą. W przypadku wątpliwości należy tą kwestię skonsultować z kierownikami działów, pod które dane sugerowane stanowisko podlega, poprzez wysłanie wiadomości email z podaniem numeru procesu oraz opisaniem wątpliwości, np: </p>
+                  <p>Dla procesu {xxxx} (, gdzie xxxx to numer niniejszego procesu ) jest problem z ustaleniem stanowiska odpowiedzialnego za wykonywanie czynności (opisać czynności) , gdyż podobny proces o numerze {0001} oraz {0002} wykonują aktualnie stanowiska [11] Sprzedawca oraz [12] Przedstawiciel Handlowy</p>
+                  <p>.  </p>
+               </body>
+               <topic id="asd1613">
+                  <title>Przeprowadzenie wywiadu z pracownikiem</title>
+                  <body>
+                     <p>Należy skontaktować się osobiście lub elektronicznie z osobą wykonującą dane zadanie.&#xD;
+Spisz istotne elementy z punktu widzenia kolejności wykonywanych czynności, jakie były używane narzędzia oraz zasoby do wykonywania tych czynności. Będzie to niezbędne do właściwego stworzenia mapy procesu oraz późniejszego jego wprowadzenia do systemu procesów.&#xD;
+</p>
+                  </body>
+                  <topic id="asd1614">
+                     <title>Stworzenie diagramu przepływu procesu (Flowchart/Schemat Blokowy)</title>
+                     <body>
+                        <p>Na podstawie otrzymanych danych na temat wykonywania zadania, należy stworzyć diagram przepływu procesu (Schemat Blokowy).  W tym celu użyć narzędzia Diagram Designer bądź innego narzędzia umożliwiającego wykonanie diagramu przepływu.  &#xD;
+&#xD;
+Diagram przepływu jest rysunkiem przedstawiającym przebieg danego pojedynczego procesu.(wykres blokowy), który zawiera poszczególne zadania po kolei, jakie należy w ramach danego procesu wykonać. W odróżnieniu od Diagramu Przepływu np. Mapa procesów zawiera informacje ogólne wraz z powiązaniami pomiędzy poszczególnymi procesami i z natury zawiera mniej szczegółów na temat samego przebiegu poszczególnego procesu (ciężko byłoby przedstawić wszystkie procesy wraz ze szczegółami zadań dla każdego z nich na jednym arkuszu). </p>
+                     </body>
+                     <topic id="asd1615">
+                        <title>Weryfikacja diagramu</title>
+                        <body>
+                           <p>Należy przedstawić gotowy diagram przepływu procesu (Flowchart/Schemat Blokowy) osobie odpowiedzialnej za wykonanie zadania, w celu sprawdzenia jego poprawności. Należy także diagram przepływu procesu (Flowchart/Schemat Blokowy) uzgodnić ze zwierzchnikiem danego stanowiska, które wykonuje dany proces ( na podstawie struktury zasobów ) </p>
+                        </body>
+                        <topic id="asd1616">
+                           <title>IF Jeżeli diagram przepływu procesu wymaga poprawy - Wróć do kroku wywiadu i popraw diagram. </title>
+                           <body/>
+                        </topic>
+                        <topic id="asd1618">
+                           <title>Diagram przepływu procesu nie wymaga poprawy</title>
+                           <body>
+                              <p>Diagram został zaakceptowany. Można przejść do tworzenia procesu.</p>
+                           </body>
+                           <topic id="asd1619">
+                              <title>Po zakończeniu pracy w ramach tworzenia diagramu, należy ponownie uruchomić system procesy5.</title>
+                              <body>
+                                 <p>Po zakończeniu pracy z tworzeniem oraz uzgadnianiem diagramu przepływu należy ponownie wejść do systemu i się zalogować, po czym należy przejść do menu edycji drzewa procesów.&#xD;
+</p>
+                              </body>
+                              <topic id="asd1620">
+                                 <title>Stworzenie i odpowiednie umiejscowienie procesu inicjującego (PROCES_INIT)</title>
+                                 <body>
+                                    <p>Po wybraniu odpowiedniej lokalizacji nowego procesu w drzewie procesów należy stworzyć proces inicjujący nową procedurę. Pierwszy krok procesu ma specjalny typ, wg którego system traktuje ten krok procesu jako Pierwszy Krok Procesu - czyli PROCES_INIT.</p>
+                                 </body>
+                              </topic>
+                              <topic id="asd1621">
+                                 <title>Dodanie stanowiska wykonującego proces - stanowiska wykonujące proces dodajemy zawsze w pierwszym kroku procesu (PROCES_INIT), wskazując, że dane stanowisko odpowiada za wykonywanie całego procesu - spowoduje to dodanie obowiązków osobom na tym stanowisku</title>
+                                 <body>
+                                    <p>Aby dodać stanowisko, któremu podlega dany proces ( dodanie wskaźnika do procesu z zasobem wykonawcy procesu ) należy kliknąć przycisk "Z+". Jeżeli jest znany numer zasobu stanowiska, wpisać numer w pole "Podaj numer zasobu:" i kliknąć "OK". Jeżeli numer stanowiska nie jest znany, należy wyszukać go w drzewie. Znaleziony zasób w drzewie dodać klikając "(DODAJ do proc.# XXXX)", gdzie XXXX jest numerem procesu. Stanowisko ma mieć: </p>
+                                 </body>
+                                 <topic id="asd2207">
+                                    <title>IF jeżeli nie istnieje zasób odpowiadający stanowisku pracy, jakie chcemy przyporządkować, należy je dodać jako nowy zasób, zgodnie z opisem w kroku {wywoływanym}</title>
+                                    <body>
+                                       <p>Może się zdarzyć, że powiązywane stanowisko, jakie wykonuje dany proces/powinno wykonywać dany proces nie jest zdefiniowane w zasobach. Należy w takim przypadku je dopisać do zasobów, zachowując zasady wprowadzania nowych zasobów w podanym kroku.  Każde stanowisko pracy podlega pod inne stanowisko pracy, w związku z czym najpierw należy ustalić stanowisko nadrzędne, któremu będzie podlegać nowe stanowisko. Analogicznie do sytuacji dodawania innych zasobów (np. w przypadku dodawania koła, zasobem nadrzędnym będzie prawdopodobnie samochód).</p>
+                                    </body>
+                                 </topic>
+                              </topic>
+                              <topic id="asd1622">
+                                 <title>Dodanie kolejnych kroków procesu</title>
+                                 <body>
+                                    <p>Po dodaniu pierwszego kroku procesu system utworzył nowy krok z nowym numerem XXX, który to został przyporządkowany do ostatnio wybranego przez nas nadrzędnego numeru procesu. Aby dodać kolejne kroki musimy postępować dokładnie w taki sam sposób, z tą różnicą, że kolejne kroki procesu nie są już typu PROCES_INIT, tylko  PROCES. &#xD;
+&#xD;
+&#xD;
+Aby dodać kolejny krok odnajdź jaki był numer kroku procesu ostatnio dodanego rekordu, tą liczbę wprowadź do kolumny P_ID na samym dole tabeli. W pokazanym przykładowym rysunku dodajemy kolejny krok do kroku o numerze {1662} . &#xD;
+Należy pamiętać aby w sposób właściwy opisać Krok Procesu w polu DESC oraz OPIS Kroku procesu w polu OPIS, zgodnie z dokładnymi instrukcjami we wskaźnikach tego kroku.</p>
+                                 </body>
+                                 <topic id="asd1628">
+                                    <title>Dodaj zasób do kroku (Stworzenie Wskaźnika pomiędzy Procesem oraz Zasobem (asocjacji)), co umożliwi jednoczesne stworzenie aplikacji udostępniającej te dane a w przypadku urządzeń oznaczenie, które urządzenia są używane oraz jakich procesach</title>
+                                    <body>
+                                       <p>Po kliknięciu przycisku "Z+", jeżeli numer jest znany, wpisać numer w pole "Zasób", wybrać typ uprawnień, opisać kontekst użycia zasobu i kliknąć "OK". Jeżeli jest to konieczne dodać komentarz.</p>
+                                    </body>
+                                    <topic id="asd5201">
+                                       <title>IF Jeżeli chcesz umożliwić eksport danych z zasobu typu: TABELA / KOMORKA  określ typ uprawnień na: R,X,E: Export</title>
+                                       <body>
+                                          <p>W przypadku gdy istnieje konieczność eksportowania danych z tabeli do pliku HTML lub CSV należy to określić w typie uprawnień dodawanego zasobu do procesu. W tym celu ustalamy typ uprawnień na: R,X,E: Export dla każdego zasobu, który ma być eksportowany. Możliwość eksportu można dodać zarówno na etapie dodawania zasobu do kroku jak i poprzez edycję / zmianę typu uprawnień już wcześniej dodanego zasobu. </p>
+                                       </body>
+                                    </topic>
+                                 </topic>
+                                 <topic id="asd3639">
+                                    <title>Ewentualne użycie istniejącej procedury wyzwalanej (w przypadku konieczności przeskoku do innego procesu lub procedury)</title>
+                                    <body>
+                                       <p>Jeżeli chciałbyś użyć w ramach wykonywania czynności istniejącej procedury wyzwalanej, oznacz w danym kroku procesu numer tego kroku procesu oraz wybierz tryb wyzwalania obcego procesu</p>
+                                    </body>
+                                 </topic>
+                              </topic>
+                              <topic id="asd1629">
+                                 <title>Sprawdzić czy można przejść proces</title>
+                                 <body>
+                                    <p>Należy wykonać proces w celu sprawdzenia jego poprawności i czytelności. </p>
+                                 </body>
+                                 <topic id="asd1630">
+                                    <title>Jeżeli nie można przejść procesu</title>
+                                    <body/>
+                                    <topic id="asd1631">
+                                       <title>Nanieść poprawki</title>
+                                       <body/>
+                                       <topic id="asd3988">
+                                          <title>IF Jeżeli proces zawiera niewłaściwe dowiązane zasoby (np. jeżeli odnosi się do innej tabeli lub stanowisk)</title>
+                                          <body>
+                                             <p>Należy dokonać edycji wskaźników przypisanych do danego procesu oraz w nich określić właściwy numer powiązanego zasobu. W tym przypadku korzystamy z podglądu drzewa zasobów, które możemy mieć otwarte w osobnym oknie w zasobie, który nas interesuje (w rozwiniętym jego drzewie). </p>
+                                          </body>
+                                       </topic>
+                                    </topic>
+                                 </topic>
+                                 <topic id="asd1633">
+                                    <title>Jeżeli można przejść proces</title>
+                                    <body/>
+                                    <topic id="asd1634">
+                                       <title>Sprawdzić proces przez osobę odpowiedzialną za sprawę</title>
+                                       <body>
+                                          <p>Należy wykonać zadanie według procesu, sprawdzić jasność sformułowanych poleceń, poprawną kolejność poszczególnych kroków, użycie zasobów. Wszystkie ewentualne uwagi należy zgłosić osobie tworzącej proces. </p>
+                                       </body>
+                                       <topic id="asd1635">
+                                          <title>Jeżeli proces nie jest zgodny</title>
+                                          <body/>
+                                          <topic id="asd1636">
+                                             <title>Nanieść poprawki</title>
+                                             <body/>
+                                          </topic>
+                                       </topic>
+                                       <topic id="asd1638">
+                                          <title>Jeżeli proces jest zgodny</title>
+                                          <body/>
+                                          <topic id="asd1639">
+                                             <title>Dodać pytania do testów</title>
+                                             <body>
+                                                <p>W celu właściwego wdrożenia procesu istnieje konieczność weryfikacji czy uczestnicy/wykonawcy tego procesu (aktualni a także przyszli) są w stanie go wykonać lub czy zapoznali się wystarczająco z materiałem dotyczącym tego procesu, aby wykonywać ten proces. W celu optymalnego zapewnienia takiej funkcjonalności system umożliwia wprowadzenie pytań testowych oraz gotowych sugerowanych odpowiedzi bezpośrednio w strukturze procesów. Każde z pytań jest postawione do danego kroku procesu jednak można także dodatkowo dane pytanie uszczegółowić dla konkretnego numeru wskaźnika (zasobu). Przygotowywane pytania mogą mieć wszystkie prawdziwe jak i wszystkie nieprawdziwe sugerowane odpowiedzi. Pytania do procesów są wykorzystywane podczas procesów rekrutacji oraz innych opisanych w systemie jakości. Wyzwalanie pytań odbywa się za pomocą osobnego menu TESTY.&#xD;
+</p>
+                                                <p>/Na załączonym obrazku przedstawiono przykładowy ekran podczas dodawania pytań do procesu</p>
+                                                <p>/&#xD;
+Użyć przycisku "P+" przy danym kroku. Po przyciśnięciu tego przycisku istnieje możliwość dodania zarówno pytania praktycznego, jak i teoretycznego. W zależności jakie pytanie chcesz dodać taki typ pytania wybierz.&#xD;
+</p>
+                                             </body>
+                                             <topic id="asd1640">
+                                                <title>Rozpocząć testy </title>
+                                                <body>
+                                                   <p>Należy wybrać osoby do wykonanie testów i postępować wg procesu [1530].</p>
+                                                </body>
+                                             </topic>
+                                             <topic id="asd3811">
+                                                <title>IF Jeżeli dodajesz pytanie teoretyczne</title>
+                                                <body>
+                                                   <p>Jeżeli dodajesz pytanie teoretyczne to wpisz treść pytania oraz proponowane odpowiedzi. Przy każdej odpowiedzi wybierz: "TAK" - jeżeli jest poprawna, bądź "NIE" - jeżeli jest błędna. </p>
+                                                </body>
+                                             </topic>
+                                             <topic id="asd3817">
+                                                <title>IF Jeżeli dodajesz pytanie praktyczne</title>
+                                                <body>
+                                                   <p>Jeżeli dodajesz pytanie praktyczne, to w treść pytania wpisz polecenie, jakie pracownik ma wykonać. W jedną z możliwych odpowiedzi wpisz np. "pracownik wykonał zadanie" oraz odpowiedź ustaw na "TAK". W kolejnym polu na odpowiedzi wpisz np. "pracownik nie wykonał zadania" a odpowiedź ustaw na "NIE". </p>
+                                                </body>
+                                             </topic>
+                                          </topic>
+                                       </topic>
+                                    </topic>
+                                 </topic>
+                              </topic>
+                              <topic id="asd3809">
+                                 <title>Przesuwanie kroków procesu</title>
+                                 <body>
+                                    <p>Jeżeli dodałeś nowy krok procesu i chcesz zmienić jego usytuowanie, czyli przesunąć krok w górę bądź w dół, użyj funkcji do przesuwania poziomu procesu.</p>
+                                 </body>
+                              </topic>
+                           </topic>
+                        </topic>
+                     </topic>
+                  </topic>
+               </topic>
+            </topic>
+         </topic>
+         <topic id="asd2166">
+            <title>Szczególne przypadki wymagające poprawy - w przypadku ich wykrycia wykonaj poprawy procesu, mając na względzie, że należy kasować lub zmieniać istniejące kroki procesu, aby nie duplikować informacji</title>
+            <body>
+               <p>W przypadku, kiedy wstępnie stwierdzono błędy w procesie, należy je poprawić.&#xD;
+Przykładowe błędy to : </p>
+            </body>
+         </topic>
+         <topic id="asd3867">
+            <title>Struktura Drzewa Procesów</title>
+            <body>
+               <p>System procesów zorganizowany jest w postaci konspektu punktów z zagłębieniami. Dla tego można go nazwać drzewem procesów, gdyż ilość możliwych zagłębień jest bardzo duża. Podstawową dodawania nowych procesów jest tworzenie tzw. "gałęzi drzew", co jest niczym innym jak wprowadzanie nowych procesów przy jednoczesnym określaniu procesu/węzła nadrzędnego (PARENT_ID). Po dodaniu nowego procesu otrzymuje on nowy numer procesu (ID). Pierwszy proces zwykle opisywany jest jako "Drzewo Procesów", powinien mieć numer ID = "1"  oraz numer węzła nadrzędnego  PARENT_ID=0. </p>
+            </body>
+         </topic>
+         <topic id="asd3868">
+            <title>Zasady dzielenia procesów na mniejsze wyzwalane etapy oraz łączenie z innymi procesami/procedurami poprzez stosowanie wyzwoleń do procesów (lub kroków w istniejącym procesie) lub/i dowiązywanie w nich innych Procesów (wyzwalanych), które wcześniej zostały</title>
+            <body>
+               <p>Każdy z procesów powinien być rozbudowywany w miarę potrzeb poprzez tworzenie mniejszych jego etapów i zagłębień.&#xD;
+Do każdego z tych etapów jest konieczne powiązywanie zasobów, w sposób umożliwiający&#xD;
+zachowanie odpowiedniej kolejności wykonywania czynności. Przy każdym z powiązanych zasobów możliwe jest jednoczesne wprowadzanie dodatkowych adnotacji. Do poszczególnych kroków procesów można dodać pytania i odpowiedzi, które mogą zostać wykorzystane do testów oceny okresowej/rekrutacji lub szkoleń. &#xD;
+&#xD;
+To właśnie dzięki logicznej spójności procesów/zasobów/instrukcji/pytań otrzymujemy </p>
+               <p> zintegrowaną dokumentację jakości. </p>
+               <p>&#xD;
+</p>
+            </body>
+         </topic>
+         <topic id="asd3869">
+            <title>Nazywanie procesów</title>
+            <body>
+               <p>W ramach bogatego doświadczenia w implementacji systemu jakości uzyskuje się największe efekty w przypadku zastosowania następujących reguł nazywania procesów. Jak wiadomo z niniejszego opracowania pojedynczy proces zawiera kilka pól, umożliwiających jego opisanie. Dwa z tych pól to : </p>
+            </body>
+         </topic>
+         <topic id="asd5016">
+            <title>Procesy o charakterze choreografii (opisujące przypadki kolejności postępowania w danym przypadku) oraz wymagania ogólne</title>
+            <body>
+               <p>W ramach tworzenia wymagań (procesów) z reguły mamy do czynienia z jakimś problemem, który chcemy rozwiązać, poprzez stworzenie zasad postępowania lub/i reguł, które po zapoznaniu się przez personel, będą mogły być realizowane w sposób wcześniej przemyślany i najskuteczniejszy. W zależności od zakresu przypadku, jaki chcemy w danej chwili zdefiniować należy rozróżnić te, które są wyjaśnione w kolejnych podpunktach:</p>
+            </body>
+            <topic id="asd5017">
+               <title>Procesy wykonawcze - czyli bezpośrednio instruują pracownika jakie czynności po kolei ma wykonywać i jakimi narzędziami/zasobami </title>
+               <body>
+                  <p>Na załączonym obrazku przedstawiono wynik dyskusji na temat ,,ak przebiega ogólnie proces wykonywania badań klienta. </p>
+               </body>
+            </topic>
+            <topic id="asd5018">
+               <title> Zalecenia (wymagania) ogólne w tym wymagania w zakresie wiedzy produktowej, technologii</title>
+               <body>
+                  <p>Wymagania ogólne w odróżnieniu od wymagań o charakterze procesowym (choreograficznym) w sposób ogólny definiują zasady, które są pozbawione informacji o konkretnie uszeregowanych czynnościach - np. zasady dobrego wychowania i komunikacji w firmie.</p>
+               </body>
+            </topic>
+         </topic>
+      </topic>
+      <topic id="asd3871">
+         <title>Ogólne założenia zasad systematyzacji Zasobów.</title>
+         <body/>
+         <topic id="asd1623">
+            <title>dlaczego należy systematyzować zasoby oraz w jaki sposób są one wykorzystywane</title>
+            <body>
+               <p>W ramach tworzenia Procesów niezbędnym ich elementem jest powiązanie do danego Procesu zasobów, które biorą udział w wykonywaniu danego procesu. Zasoby mogą być powiązane na różne sposoby jeżeli chodzi o kontekst ich użycia, np.: zasób może być</p>
+            </body>
+         </topic>
+         <topic id="asd5126">
+            <title>Ważniejsze typy zasobów, przetwarzane przez system w specjalny sposób DZIAL, STANOWISKO, LOKALIZACJA, URZADZENIE, SPRAWA, DOKUMENT</title>
+            <body>
+               <p>Na załączonym zdjęciu przedstawiono przykłady właściwego umiejscowienia w strukturze poszczególnych typów zasobów, co szczegółowo opisano w kolejnych krokach.</p>
+            </body>
+            <topic id="asd5119">
+               <title>DZIAL - typ zasobu - używać zawsze pod typem zasobu STANOWISKO (kierownicze), dla grupowania zasobów podległych pod dział np. Techniczny, a pod nim wprowadzać zasoby typu STANOWISKO oraz inne zasoby.</title>
+               <body>
+                  <p>Rekomendowany zasób nadrzędny: </p>
+               </body>
+            </topic>
+            <topic id="asd5120">
+               <title>DOKUMENTY - typ zasobu - używać zawsze pod typem zasobu LOKALIZACJA, URZADZENIE, SPRAWA - służy do określenia, że jest wymagane istnienie dokumentu dla danego zasobu - np. Dowód Rejestracyjny dla zasobu URZADZENIE - np. samochoód</title>
+               <body>
+                  <p>Rekomendowany zasób nadrzędny: </p>
+               </body>
+            </topic>
+            <topic id="asd5121">
+               <title>STANOWISKO - typ zasobu - rekomendowane użycie pod typem zasobu DZIAL, PODMIOT, STANOWISKO - służy do określenia, że jest wymagane zatrudnienie pracownika na danym stanowisku</title>
+               <body>
+                  <p>Rekomendowany zasób nadrzędny: </p>
+               </body>
+            </topic>
+            <topic id="asd5122">
+               <title>URZADZENIE - typ zasobu - rekomendowane użycie pod typem zasobu URZADZENIE, DZIAL, STANOWISKO, LOKALIZACJA.  Służy do określenia, że jest wymagane urządzenie danego rodzaju w strukturze</title>
+               <body>
+                  <p>Rekomendowany zasób nadrzędny: </p>
+               </body>
+            </topic>
+            <topic id="asd5123">
+               <title>LOKALIZACJA, OBSZAR, POLKA, MAGAZYN, POMIESZCZENIE - typ zasobu - rekomendowane użycie pod typem zasobu URZADZENIE, DZIAL, STANOWISKO, LOKALIZACJA.  Służy do określenia, że jest wymagane istnienie lokalizacji dla danego typu zasobu</title>
+               <body>
+                  <p>Rekomendowany zasób nadrzędny: </p>
+               </body>
+            </topic>
+            <topic id="asd5124">
+               <title>PROJEKT, SPRAWA - typ zasobu - rekomendowane użycie pod typem zasobu PODMIOT, SPRAWA.  Służy do określenia, że jest wymagane istnienie sprawy dla danego typu zasobu</title>
+               <body>
+                  <p>Rekomendowany zasób nadrzędny: </p>
+               </body>
+            </topic>
+            <topic id="asd5125">
+               <title>PODMIOT - typ zasobu - używać zawsze na samym początku drzewa procesów, dla grupowania zasobów dla podmiotu</title>
+               <body>
+                  <p>Rekomendowany zasób nadrzędny: </p>
+               </body>
+            </topic>
+         </topic>
+         <topic id="asd5127">
+            <title>W jaki sposób tworzy się w systemie zasoby - rekomendowany proces tworzenia zasobów w systemie Procesy5</title>
+            <body/>
+            <topic id="asd1624">
+               <title>IF Jeżeli zasób nie istnieje</title>
+               <body/>
+               <topic id="asd1625">
+                  <title>Dodać nowy zasób</title>
+                  <body>
+                     <p>W celu dodania nowego zasobu należy najpierw znaleźć numer zasobu nadrzędnego. Jeśli go nie znamy, wyszukujemy go w pierwszej linijce w tabeli zasobów po opisie bądź nazwie zasobu. Znaleziony numer zapamiętujemy w celu dodania nowego zasobu. Do tego wykorzystujemy ostatnią linijkę w tabeli zasobów.</p>
+                  </body>
+                  <topic id="asd1626">
+                     <title>Po dodaniu zasobu możesz dodać do niego zdjęcie, aby za każdym razem było widoczne podczas kojarzenia danego zasobu z procesem.</title>
+                     <body/>
+                  </topic>
+                  <topic id="asd4387">
+                     <title>Ustal minimalną oraz maksymalną ilość danego zasobu, jaka ma występować w ramach struktury</title>
+                     <body>
+                        <p>Dzięki technologii XML-Schema jest możliwe stworzenie systemowej informacji na temat właściwej ilości występowania danego elementu w strukturze. Nominalnie system zakłada, że dany element powinien występować nie mniej i nie więcej niż jeden raz. </p>
+                     </body>
+                  </topic>
+                  <topic id="asd5183">
+                     <title>Jeżeli dodajesz zasób prototypowy, ustal pole Abstract (Prototyp). W przypadku kiedy nie dodajesz zasobu prototypowego, powinieneś go powiązać z jednym z istniejących prototypów.</title>
+                     <body>
+                        <p>Zasoby prototypowe należy gromadzić w drzewie zasobów pod specjalną gałęzią do tego celu stworzoną, która zwykle nosi nazwę "Prototypy zasobów wyposażenia". W drzewie zasobów znajdują się różne gałęzie prototypów - także takie jak "prototypy stanowisk". Należy tworzyć prototypy wyposażeń używanych w strukturze, aby jednoznacznie określić jakie typy urządzeń/wyposażeń stosowane są w firmie. Umożliwi to zawężenie ilości różnych typów zasobów do minimum oraz poprawi ich kontrolę.</p>
+                     </body>
+                  </topic>
+               </topic>
+            </topic>
+            <topic id="asd2208">
+               <title>IF Jeżeli zasób ma niewłaściwie umiejscowienie w strukturze popraw jego lokalizację </title>
+               <body>
+                  <p>Istnieje możliwość, że zasób ma niewłaściwie przyporządkowany zasób nadrzędny. Zasób powinien mieć przyporządkowany numer Zasobu Nadrzędnego w sposób taki, jaki najbardziej wynika z naturalnego logicznego przyporządkowania danego zasobu.&#xD;
+W takim przypadku należy dokonać korekty tej struktury poprzez np: </p>
+               </body>
+            </topic>
+         </topic>
+         <topic id="asd5185">
+            <title>Zasady trzymania zasobów prototypowych (Abstract) dla zapewnienia potrzeb ewidencji unikalnych cech zasobów, zwłaszcza dla potrzeb wyposażenia, które powinny być dziedziczone (Aliasowane) w prawdziwych strukturach zasobów</title>
+            <body>
+               <p>W celu zapewnienia uzyskania jednoznaczności pod kątem posiadania unikalnej listy typów zasobów używanych w firmie, należy prowadzić w specjalnym miejscu w drzewie zasobów listę zasobów prototypowych (Abstract). Takie zasoby powinny być następnie dziedziczone w prawdziwych strukturach zasobów poprzez użycie pola ALIAS_ID (Aliasowanie). W specjalnych przypadkach należy stosować typ dziedziczenia wirtualny (Alias wirtualny), które tyczą się wykorzystywania tego samego numeru zasobu w innej strukturze.</p>
+            </body>
+         </topic>
+      </topic>
+      <topic id="asd4632">
+         <title>Najczęstsze błędy popełniane przez osoby modelujące procesy oraz zasoby - materiał uzupełniający, dzięki któremu można uniknąć wielu błędów przy tworzeniu/modyfikacji/doskonaleniu procesów biznesowych</title>
+         <body>
+            <p>Po mimo przeczytania założeń do modelowania procesów oraz udzielenia właściwych odpowiedzi, osoby odpowiedzialne za modyfikację procesów i zasobów popełniają błędy. W tym celu opracowano niniejszy materiał, po którego zaliczeniu jest możliwe lepsze wykonywanie pracy. Należy ten materiał w sposób ciągły doskonalić o nowe aspekty, które wyniknęły ze złego rozumienia założeń wymagań procesów opisujących zasady modelowania procesów oraz zasobów.</p>
+         </body>
+         <topic id="asd4633">
+            <title>Przypadek torby na laptopa</title>
+            <body>
+               <p>Zasób zamówiony u dostawcy nie zgodny z opisem. Brak posiadania dodatkowych kieszonek na dokumenty.  Opis który opisywał torbę był zły.Została napisana reklamacja/formularz zgłoszeniowy, czas oczekiwania na odpowiedź od sprzedawcy do 14 dni.</p>
+            </body>
+         </topic>
+         <topic id="asd5130">
+            <title>Przypadek błędnej inwentaryzacji zasobów przez Irminę</title>
+            <body>
+               <p>Irmina wykonała inwentaryzację Biura obsługi klienta, zaczęła usuwać zasoby oraz stare oznaczenia z poszczególnych zasobów, przy czym tworzyła nowe takie same lub podobne i ponownie naklejała. Kolejnie błędnie podpinała zasoby, niezgodnie z naszą strukturą. Zamiast ujednolicać nasze standardy tworzyła nowe, które się różniły.</p>
+            </body>
+         </topic>
+      </topic>
+   </topic>
+</topic>

+ 75 - 0
SE/schema/ant-tool/DownloadProcesToDita/parse_dita_templ.xsl

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    exclude-result-prefixes="xs"
+    version="2.0">
+    <!-- @2016-11 bindera: ten template ma przeparsowac plik dita i podstawic w nim sposob przetwarzania aby sciagnac stworzyc procesy w miejsce data-about. 
+        Potem do podpiecia do innych przetwarzan -->
+    
+    <xsl:output indent="yes" />
+    <xsl:strip-space elements="*"/>
+    <xsl:include href="PROCES_INCLUDE.xsl"/>
+    
+    
+    
+       <xsl:template match="topic" mode="DITA_PARSE_templ">
+           <xsl:element name="{name()}">
+               <xsl:apply-templates mode="#current" select="@*"/>
+               <xsl:copy-of select="title"/>
+               <xsl:copy-of select="body"/>
+               <xsl:variable name="ID_PROCES" select="//.[@base='PROCES_INCLUDE']"/>
+               <xsl:variable name="topic_id" select="@topic_sfx_mwx_yx"/>
+               <!--<xsl:apply-templates mode="#current"/>-->
+               
+               <xsl:if test="$ID_PROCES">
+                   <xsl:call-template name="PROCES_INCLUDE">
+                       <xsl:with-param name="ID_PROCESS" select="$ID_PROCES"/>
+                   </xsl:call-template>
+               </xsl:if>
+               
+           </xsl:element>
+       </xsl:template>
+       
+    
+       <xsl:template name="PROCES_INCLUDE">
+           <xsl:param name="ID_PROCESS" required="yes"/>
+           <xsl:variable name="proces_node" select="$CRM_PROCES.xml//item[ID=$ID_PROCESS]"/>
+           <topic>
+               <xsl:attribute name="id" select="concat('asd',$ID_PROCESS)"/> 
+                  <title>
+                      <xsl:apply-templates mode="PROCES_TO_DITA_STRIP_HTML_TITLE" select="$proces_node/DESC/text()">
+                          <xsl:with-param name="limit" select="50"/>
+                      </xsl:apply-templates>
+                  </title>
+                  <body>
+                      <xsl:apply-templates mode="PROCES_TO_DITA_STRIP_HTML" select="$proces_node/OPIS/text()"/>
+                  </body>
+               <xsl:for-each select="$CRM_PROCES.xml//item[PARENT_ID=$ID_PROCESS]">
+                   <xsl:call-template name="PROCES_INCLUDE">
+                       <xsl:with-param name="ID_PROCESS" select="ID"/>
+                   </xsl:call-template>
+               </xsl:for-each>
+           </topic>
+       </xsl:template>
+    
+    
+    
+    
+    <!--<xsl:template match="*" mode="DITA_PARSE_templ">
+        <xsl:element name="{name()}">
+            <xsl:apply-templates mode="#current" select="@*"/>
+            <xsl:apply-templates mode="#current"/>
+        </xsl:element>
+    </xsl:template>-->
+    
+       <xsl:template match="apiname[@base='PROCES_INCLUDE']" mode="DITA_PARSE_templ">
+           generuje costam
+           
+           
+       </xsl:template>
+       <xsl:template match="@*" mode="DITA_PARSE_templ">
+           <xsl:attribute name="{name()}" select="."/>
+       </xsl:template>
+    
+</xsl:stylesheet>

+ 340 - 0
SE/schema/ant-tool/DownloadProcesToDita/test_detect_tags.xsl

@@ -0,0 +1,340 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    xmlns:test="test"
+    exclude-result-prefixes="xs"
+    version="2.0">
+    
+    <xsl:output indent="yes"/>
+    <xsl:strip-space elements="*"/>
+    
+    
+    
+    <xsl:template name="main">
+        <!--<xsl:variable name="html">
+            "&lt;u&gt;Sprzedawca Stacjonarny &lt;/u&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;u&gt;pracujący&#xD;
+            w Biurze Obsługi Klienta&lt;/u&gt;&lt;/FONT&gt;
+        </xsl:variable>-->
+        <!--<xsl:variable name="html">
+        as&lt;b&gt;dasd&lt;a&gt;asdasd&lt;/a&gt;asdaas&lt;/b&gt;dsd
+        </xsl:variable>-->
+        <xsl:variable name="html">
+            &lt;z&gt;123&lt;b&gt;456&lt;a&gt;789&lt;/a&gt;111213&lt;/b&gt;141516&lt;/z&gt;
+        </xsl:variable>
+        <xsl:result-document href="test_detect_tags.xml">
+            <!--<org>
+                <xsl:value-of select="$html"/>
+            </org>-->
+         <!--   <out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'&lt;a&gt;789&lt;/a&gt;'"/>
+                </xsl:call-template>            
+            </out>
+            <out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'&lt;z&gt;123&lt;b&gt;456&lt;a&gt;789&lt;/a&gt;111213&lt;/b&gt;141516&lt;/z&gt;'"/>
+                </xsl:call-template>            
+            </out>
+            <out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'000123&lt;z&gt;123&lt;b&gt;456&lt;a&gt;789&lt;/a&gt;111213&lt;/b&gt;141516&lt;/z&gt;'"/>
+                </xsl:call-template>            
+            </out>
+            <out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'000123&lt;z&gt;123&lt;b&gt;456&lt;a&gt;789&lt;/a&gt;111213&lt;/b&gt;141516&lt;/z&gt;001234'"/>
+                </xsl:call-template>            
+            </out>
+            <out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'000123&lt;z&gt;123&lt;a&gt;Pomiedzy////A456-&lt;/a&gt;789-pomiedzy///-drugim-a&lt;a&gt;111213&lt;/a&gt;141////516&lt;/z&gt;001234'"/>
+                </xsl:call-template>            
+            </out>-->
+           <!-- <xsl:variable name="p3871">&lt;br&gt;Zasoby są to elementy, które biorą udział w procesach. Należy je systematyzować w sposób wynikający z typów tych zasobów, pełnionych funkcji oraz ich lokalizacji, w jakich się&#13;
+                znajdują. Główne kryterium systematyzacji może być wyłącznie jedno.Zasoby można grupować poprzez tworzenie zasobów opisujących grupę danych zasobów.&lt;br&gt;&lt;br&gt; Zasoby uzupełniamy w następujący sposób: &lt;br&gt;&lt;br&gt;&#13;
+                &lt;b&gt;a) Należy ustalić Cechy Szczególne.&lt;/b&gt;&lt;br&gt; Gdybyśmy zabierali się po raz pierwszy do systematyzacji zasobów i chcielibyśmy dodać pierwszy napotkany zasób w firmie będący "Tonerem do Drukarki", to prawdopodobnie powinniśmy ustalić jego cechy szczególne, które umożliwią jego rozróżnienie pomiędzy innymi tonerami, których użycie, zamiast tych właściwych było by niewłaściwe: np. w firmie używanych jest kilka typów Tonerów do drukarki, bez ustalenia ich konkretnych typów nie jest możliwa ich właściwa rewitalizacja (nikt nie będzie wiedział jaki konkretnie toner należy kupić, bo po złożeniu zamówienia na "Toner" będzie konieczna weryfikacja przez dostawcę o jaki konkretnie nam chodzi "Toner". Taki stan rzeczy będzie mieć miejsce do czasu dokładnie nie określimy cech zasobu. Z uwagi na ograniczenie pola nazwy zasobu powinniśmy zmieścić się w 250 znakach alfanumerycznych i w tym miejscu powinniśmy udzielić informacji przynajmniej o:&lt;br&gt;&#13;
+                &#13;
+                &lt;b&gt;- Oznaczenie możliwego producenta&lt;/b&gt; - umożliwi zakup oryginału lub zamiennika produktu w oparciu o producenta, podając nazwę producenta umożliwiamy szybką orientację i zawężamy krąg poszukiwań zamiennika do nazwy producenta.&lt;br&gt;&#13;
+                &lt;b&gt;- Oznaczenie nazwy produktu/modelu&lt;/b&gt;, jeżeli posiada kilka typów różnych funkcjonalnie - umożliwi najszybszy sposób późniejszej rewitalizacji zasobu. Z reguły model produktu określany przez producenta jednoznacznie rozróżnia produkty. &lt;br&gt;&#13;
+                - W przypadku kiedy dany zasób występuje wyłącznie w jednostce, w której wdrażany jest system jakości np. określa nazwę własną produktu, półproduktu, którym może być [987] "Obszar biura handlowego do którego mają dostęp klienci". W takim przypadku należy opisać ten obszar, jego cechy, parametry i główne funkcje.&lt;br&gt;&#13;
+                - W przypadku Tonera, powinniśmy opisać go jako [99] &lt;u&gt;"Toner , gdzie XXX może wynosić : "BJC250X-2 firmy BUBBLEJET&lt;/u&gt;".&lt;br&gt;&lt;br&gt;&#13;
+                &#13;
+                &lt;b&gt;b) Następnie należy wykonać Ustalanie Stanu Zasobu.&lt;/b&gt;&lt;br&gt; Jeżeli dany zasób (toner) posiada kilka stanów, np.: &lt;br&gt; &#13;
+                - toner jest nowy, gotowy do użycia i włożenia do drukarki; &lt;br&gt;&#13;
+                - toner jest używany (w jakiejś konkretnej drukarce);&lt;br&gt;&#13;
+                - toner jest zużyty (leży gdzieś na półce);&#13;
+                &lt;br&gt;&#13;
+                Należy opisać zasób z określeniem tego stanu, jakiego dotyczy opisywany zasób (dodać tyle zasobów ile stanów).&#13;
+                &lt;br&gt;&lt;br&gt;Ustalić zasób nadrzędny, gdzie zwykle dany zasób (toner) znajduje się w opisanym stanie. Każdy ze stanów danego zasobu zwykle ma inną lokalizację fizyczną oraz logiczną. Oznacza to, że zasób nadrzędny dla każdego ze stanów może być inny (np. zasób używany będzie przyporządkowany do konkretnego typu urządzenia (zasobu). Z kolei zużyty toner będzie przyporządkowany do szafki (opisanej konkretnym numerem zasobu),a nawet konkretnej półki (poprzez ustalenie  numeru zasobu półki w tej szafie). &#13;
+                &lt;br&gt;&lt;br&gt;Jeżeli nie jest opisany zasób nadrzędny, to nie możesz dodać nowego zasobu bez wcześniejszego ustalenia jego przynależności do nadrzędnego zasobu, który powinieneś dopisać do systemu, korzystając z tych samych zasad, opisanych wcześniej.&#13;
+                &lt;br&gt;&lt;br&gt; Może się okazać, że dany zasób może występować w jednym lub większej ilości typów zasobów nadrzędnych (np. dany rodzaj tonera pasuje do kilku rodzajów drukarek), w takim wypadku należy zdać sobie sprawę z sytuacji, że został zidentyfikowany nowy stan zasobu. W takim przypadku mamy do czynienia z dwoma bliźniaczymi zasobami, np.: &lt;u&gt;[100] "Toner podczas używania w drukarce YYY&lt;/u&gt; oraz &lt;u&gt; [101] "Toner podczas używania w drukarce &lt;/u&gt;&#13;
+                Z powyższego wynika,że właściwy opis do zasobu &lt;u&gt;[99] "Toner XXX gotowy do użycia na półce&lt;/u&gt;" będzie następujący: &lt;u&gt; [99] "Toner gotowy do użycia na półce, do użycia w drukarce YYY lub ZZZ&lt;/u&gt;", bowiem to konkretnie opisuje funkcje zasobu w strukturze.&#13;
+                &#13;
+                &lt;br&gt;&lt;br&gt;Opisane wcześniej stany zasobów tyczących się jednego i tego samego fizycznego zasobu, jakim jest w tym przypadku "Toner &lt;FONT COLOR="#ff00ff"&gt;typu XXX&lt;/FONT&gt;", powinny być powiązane wspólnym oznacznikiem w strukturze zasobów, opisanym jako (5) ALIAS_ID . Jeden z tych opisanych zasobów musi być ustalony jako wiodący. Powinien nim być zasób opisany stanem, z którym mamy do czynienia pierwotnie (np. tuż po zakupieniu tonera jego stanem będzie oczekiwanie na użycie na półce). &#13;
+                &lt;br&gt;&lt;br&gt;&#13;
+                W przypadku chęci ograniczenia w początkowej fazie wdrażania systemu jakości dużej ilości dodawania szczegółowych zasobów, można utworzyć jeden zasób, ustalony jako wiodący, lecz zamiast tworzenia osobnych zasobów opisujących poszczególne stany jest możliwość wymienienia kilku miejsc, w których dany zasób może występować, poprzez ich ustalenie oraz wpisanie ich w ramach cechy P_ID3. Jeżeli decydujesz się na ten sposób dodawania zasobów to w P_ID powinieneś wpisać numer zasobu w jakim początkowo znajduje się ten zasób. &lt;u&gt;Np. jeżeli dodajemy zszywacz, to w komórce P_ID wpisujemy numer szafy na artykuły biurowe, a w P_ID3 wpisujemy numery zasobów biurek pracowników na których znajduje się zszywacz.&lt;/u&gt; Jednak w przypadku takiego sposobu dodawania zasobów nie będzie możliwe dokładne modelowanie procesów z uwzględnieniem zasobów w konkretnych stanach (Nie będzie można stworzyć procesu opisującego pobranie Zasobu &lt;u&gt;[99] Toner XXX gotowy do użycia, w celu umieszczenia go w drukarce YYY&lt;/u&gt;, co oznaczałoby wytworzenie zasobu &lt;u&gt;[100] Toner XXX w drukarce YYY&lt;/u&gt;&lt;br&gt;&lt;br&gt;&#13;
+                &#13;
+                &lt;b&gt;c) Zasób powinien w swoim oznaczeniu także posiadać opisane nominalne wartości ilości występowania danego zasobu:&lt;/b&gt;Jeżeli zasób jest stanowiskiem pracy, to niewątpliwie należy określić ilość minimalną oraz maksymalną występowania danego zasobu, czyli dla zasobu &lt;u&gt;[321]"Sprzedawca Stacjonarny pracujący w Biurze Obsługi Klienta&lt;/u&gt;powinniśmy opisać ile takich stanowisk ma być zatrudnionych w firmie.&#13;
+                Przyjęliśmy, że taki opis odnośnie nominalnych wartości wprowadza&#13;
+                się w nawiasach kwadratowych "[" oraz "]",&#13;
+                zatem opis właściwy zasobu [321] będzie następujący: [321]&#13;
+                "&lt;u&gt;Sprzedawca Stacjonarny &lt;/u&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;u&gt;pracujący&#13;
+                w Biurze Obsługi Klienta&lt;/u&gt;&lt;/FONT&gt;&lt;u&gt; &lt;/u&gt;&lt;FONT COLOR="#ff0000"&gt;&lt;u&gt;[minimalne&#13;
+                2 osoby na biuro, w czasie wakacji może być 1 osoba]&lt;/u&gt;&lt;/FONT&gt;".&#13;
+                &lt;BR&gt;Z uwagi na konieczność opisania cech szczególnych, do opisu&#13;
+                nazwy tego zasobu powinniśmy modelowo kompletnie tak go opisać:&#13;
+                [321] "&lt;u&gt;Sprzedawca Stacjonarny, &lt;/u&gt;&lt;FONT COLOR="#ff00ff"&gt;&lt;u&gt;posiadający&#13;
+                szkolenia produktowe, po szkole średniej, zatrudniony na umowę o&#13;
+                pracę&lt;/u&gt;&lt;/FONT&gt;&lt;u&gt;, &lt;/u&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;u&gt;pracujący w&#13;
+                Biurze Obsługi Klienta&lt;/u&gt;&lt;/FONT&gt;&lt;u&gt; &lt;/u&gt;&lt;FONT COLOR="#ff0000"&gt;&lt;u&gt;[minimalne&#13;
+                2 osoby na biuro, w czasie wakacji może być 1 osoba]&lt;/u&gt;&lt;/FONT&gt;".&lt;/P&gt;&#13;
+                &lt;P CLASS="western"&gt;Jeżeli&#13;
+                zasób to [99] "&lt;u&gt;Toner XXX &lt;/u&gt;&lt;FONT COLOR="#0000ff"&gt;&lt;u&gt;gotowy&#13;
+                do użycia na półce&lt;/u&gt;&lt;/FONT&gt;&lt;u&gt;, do użycia w druarce YYY lub&#13;
+                drukarce ZZZ&lt;/u&gt;", to&#13;
+                powinniśmy dołączyć opis ilości jego występowania w nastepujący&#13;
+                sposób [99] "Toner &lt;FONT COLOR="#ff00ff"&gt;typu&#13;
+                XXX &lt;/FONT&gt;&lt;FONT COLOR="#0000ff"&gt;gotowy&#13;
+                do użycia na półce&lt;/FONT&gt;,&#13;
+                do użycia w drukarce YYY lub drukarce ZZZ&lt;FONT COLOR="#ff0000"&gt;[minimalnie&#13;
+                2 tonery maksymalnie 4, jeżeli mniej niż 1 pilnie rewitalizuj!]&lt;/FONT&gt;".&lt;/P&gt;&#13;
+                &#13;
+                &#13;
+                &lt;br&gt;Na załączonych zdjęciach widać przykładowe struktury zasobów</xsl:variable>
+            
+            <out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="$p3871"/>
+                </xsl:call-template>            
+            </out>-->
+            <out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'jakim jest w tym przypadku &quot;Toner &lt;FONT COLOR=&quot;#ff00ff&quot; DUPA=&quot;jasiu&quot;&gt;typu XXX&lt;/FONT&gt;&quot;, powinny być powiązane wspólnym o'"/>
+                </xsl:call-template>            
+            </out>
+            
+            <!--<out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'
+                        1PrzedA1&lt;A1&gt;2W-A1
+                        &lt;B1&gt;
+                        3W-A1/B1
+                        &lt;/B1&gt;
+                        4W-A1-dalej_za_B1
+                        &lt;/A1&gt;
+                        5Za-A1-B1-przed-A2
+                        &lt;A2&gt;
+                        6W-A2
+                        &lt;B2&gt;
+                        7W-A2/B2
+                        &lt;/B2&gt;
+                        8W-A2-dalej-za-B2
+                        &lt;/A2&gt;
+                        9Za-A2-B2
+                        '"/>
+                </xsl:call-template>            
+            </out>-->
+            
+            
+            <!--<out>
+                <xsl:call-template name="detect_tag">
+                    <xsl:with-param name="html" select="'
+                        SRODEK-LEWO                         
+                        &lt;B&gt;
+                        SRODEK                         
+                        &lt;B&gt;
+                        SRODEK      
+                        '"/>
+                </xsl:call-template>            
+            </out>-->
+
+        </xsl:result-document>
+    </xsl:template>
+    
+    
+    
+    <xsl:template name="detect_tag">
+        <xsl:param name="html"/>
+        <xsl:param name="debug" select="false()"/>
+        <xsl:param name="loopno" select="1"/>
+        <xsl:variable name="anal_out">
+            <anal_out>
+                <xsl:for-each select=" tokenize($html,'&lt;') ">
+                    <xsl:variable name="lt_pos" select="position()"/>
+                    <lt>
+                        <xsl:attribute name="lt_pos" select="position()"/>
+                        
+                        <!--<xsl:value-of select="."/>-->
+                        <xsl:for-each select="tokenize(.,'&gt;')">
+                            <gt>
+                                 <xsl:attribute name="gtnum" select="position()"/>
+                                <!--<xsl:attribute name="lt_pos" select="$lt_pos"/>-->
+                                
+                                
+                                <xsl:choose>
+                                    <xsl:when test="$lt_pos=1 and position()=1">
+                                        <xsl:attribute name="tag_place" select="'before_tag'"/>
+                                    </xsl:when>
+                                    <xsl:when test="$lt_pos=2 and position()=1">
+                                        <xsl:attribute name="tag_place" select="'first_tag'"/>
+                                    </xsl:when>
+                                </xsl:choose>
+                                <xsl:choose>
+                                    <xsl:when test="position()=1 and $lt_pos&gt;1">
+                                        <xsl:attribute name="is_tag" select="true()"/>
+                                    </xsl:when>
+                                    <xsl:otherwise><xsl:attribute name="is_string" select="true()"/></xsl:otherwise>
+                                </xsl:choose>
+                                 <xsl:choose>
+                                     <xsl:when test=" contains(.,'/') and position()=1 and $lt_pos>1"><xsl:attribute name="closing" select="true()"/></xsl:when>
+                                     <xsl:when test=" not(contains(.,'/')) and position()=1 and $lt_pos>1"><xsl:attribute name="closing" select="false()"/></xsl:when>
+                                     <!--<xsl:otherwise><xsl:attribute name="closing" select="false()"/></xsl:otherwise>-->
+                                 </xsl:choose>
+                                <xsl:choose>
+                                    <xsl:when test="position()=1 and $lt_pos&gt;1 and not(contains(.,'/')) and contains(.,' ')">
+                                            <xsl:variable name="attributes">
+                                            <xsl:for-each select="tokenize(.,' ')">
+                                                <el><xsl:value-of select="."/></el>
+                                            </xsl:for-each>
+                                            </xsl:variable>
+                                        <xsl:attribute name="attributes" select="$attributes/el[position()&gt;1]"/>
+                                        <xsl:copy-of select="$attributes/el[position()=1]/text()"/>
+                                    </xsl:when>
+                                    <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
+                                </xsl:choose>
+                                <!--<xsl:value-of select="."/>-->
+                            </gt>
+                        </xsl:for-each>
+                    </lt>
+                </xsl:for-each>
+            </anal_out>
+        </xsl:variable>
+        <!--<analyse>
+            <before_tag><xsl:value-of select="$anal_out/anal_out/lt[@ltnum=1]/gt[@gtnum=1]/text()"/></before_tag>
+            <first_tag><xsl:value-of select="$anal_out/anal_out/lt[@ltnum=2]/gt[@gtnum=1]/text()"/></first_tag>
+            <closing_tag></closing_tag>
+            <after_closing_tag></after_closing_tag>
+        </analyse>-->
+        <!--<xsl:copy-of select="$anal_out"/>-->
+        <xsl:variable name="anal_num">
+            <anal_num>
+                <xsl:for-each select="$anal_out/anal_out/lt/gt">
+                    <gt><xsl:attribute name="pos" select="position()"/>
+                        <xsl:copy-of select="@attributes"/>
+                        <xsl:choose>
+                            <xsl:when test="@is_string=true()">
+                                    <xsl:attribute name="level" select="0"/>                                
+                                <xsl:value-of select="text()"/></xsl:when>
+                            <xsl:when test="@is_tag=true() and @closing=false()">
+                                <xsl:attribute name="level" select="1"/>
+                                <xsl:choose>
+                                    <xsl:when test=" position()=1">
+                                        <xsl:attribute name="new_gr" select="2"/>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:attribute name="new_gr" select="1"/>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                                <xsl:attribute name="element" select="text()"/>
+                            </xsl:when>
+                            <xsl:when test="@is_tag=true() and @closing=true()">
+                                <xsl:attribute name="level" select="-1"/>
+                                <xsl:attribute name="element" select="text()"/>
+                            </xsl:when>
+                        </xsl:choose>
+                    </gt>
+                </xsl:for-each>
+            </anal_num>
+        </xsl:variable>
+        <!--<xsl:copy-of select="$anal_num"/>-->
+        <xsl:variable name="anal_num1">
+            <anal_num1>
+                <xsl:for-each select="$anal_num/anal_num/gt">
+                    <gt>
+                        <xsl:copy-of select="@*"/>
+                        <xsl:choose>
+                            <xsl:when test="@level=0 and $anal_num/anal_num/gt[number(@pos)= number(current()/@pos)-1]/@level=1"><xsl:attribute name="level" select="1"/></xsl:when><!-- and $anal_num/anal_num/gt[@pos=current()/@pos-1]/@level= -->
+                            <xsl:when test="@level=0 and $anal_num/anal_num/gt[number(@pos)= number(current()/@pos)-1]/@level=-1"><xsl:attribute name="level" select="-1"/></xsl:when>
+                            <xsl:otherwise><xsl:attribute name="level" select="@level"/></xsl:otherwise>
+                        </xsl:choose>
+                        <xsl:value-of select="text()"/>
+                    </gt>
+                </xsl:for-each>
+            </anal_num1>
+        </xsl:variable>
+        <!--<xsl:copy-of select="$anal_num1"/>-->
+        <xsl:variable name="anal_num_anal">
+            <anal_num_anal>
+                <xsl:for-each select="$anal_num1/anal_num1/gt">
+                    <gt>
+                        <xsl:variable name="cur_pos" select="@pos"/>
+                        <!--<xsl:attribute name="what_sum" select="concat('sum($anal_num/anal_num/gt[@pos&lt;=',$cur_pos,']/@level')" />-->
+                        <xsl:choose>
+                            <xsl:when test="sum($anal_num1/anal_num1/gt[number(@pos)&lt;= number($cur_pos) ]/@level)&lt;0">
+                                <xsl:attribute name="sum_cur" select="1"/>
+                                <xsl:attribute name="sum_cur_293" select="true()"/>
+                            </xsl:when>
+                            <!--<xsl:when test="@level=-1">
+                                <xsl:attribute name="sum_cur" select="sum($anal_num1/anal_num1/gt[number(@pos)&lt;number($cur_pos) ]/@level)+1"/>
+                            </xsl:when>-->
+                            <xsl:otherwise><xsl:attribute name="sum_cur" select="sum($anal_num1/anal_num1/gt[number(@pos)&lt;= number($cur_pos) ]/@level)+1"/></xsl:otherwise>
+                        </xsl:choose>
+                        
+                        <xsl:copy-of select="@*"/>
+                        <xsl:value-of select="text()"/>
+                        <!--<copy>
+                            <xsl:copy-of select="$anal_num/anal_num/gt[  number(@pos)&lt;= number($cur_pos) ]"/>
+                        </copy>-->
+                    </gt>
+                </xsl:for-each>
+            </anal_num_anal>
+        </xsl:variable>
+        <!--<xsl:copy-of select="$anal_num_anal"/>-->
+        <xsl:for-each select="$anal_num_anal/anal_num_anal/gt[@sum_cur=1]"><!-- text outside of first tag -->
+            <xsl:variable name="min_pos_sum_cur_1" select="min($anal_num_anal/anal_num_anal/gt[@sum_cur=1 and number(@pos)&gt;number(current()/@pos)]/@pos)"/>
+            <xsl:value-of select="text()"/>
+            <xsl:for-each select="$anal_num_anal/anal_num_anal/gt[@sum_cur=2 and number(@pos)&gt;number(current()/@pos) and  number(@pos)&lt;number($min_pos_sum_cur_1) and @level=1 ]"><!-- first level tags -->
+                <xsl:element name="{@element}">
+                    <xsl:choose>
+                        <xsl:when test="@attributes">
+                            <xsl:variable name="attributes">
+                            <xsl:for-each select="tokenize(@attributes,' ')">
+                                <e300><xsl:attribute name="val" select="."/>
+                                    <xsl:for-each select="tokenize(.,'=&quot;')">
+                                    <e302><xsl:attribute name="val" select="."/>
+                                    <!--<xsl:attribute name="{.}" select="true()"/>-->
+                                            <xsl:for-each select="tokenize(.,'&quot;')">
+                                                <e307>
+                                                <xsl:attribute name="val" select="."/>
+                                                </e307>
+                                            </xsl:for-each>
+                                    </e302>
+                                </xsl:for-each>
+                                </e300>
+                            </xsl:for-each>
+                            </xsl:variable>
+                            <xsl:for-each select="$attributes/e300">
+                                <xsl:attribute name="{e302[1]/@val}" select="e302[2]/e307[1]/@val"/>
+                            </xsl:for-each>
+                            <!--<xsl:copy-of select="$attributes"/>-->
+                        </xsl:when>
+                    </xsl:choose>
+                    <xsl:variable name="html2">
+                    <xsl:for-each select="$anal_num_anal/anal_num_anal/gt[@sum_cur&gt;2 and number(@pos)&gt;number(current()/@pos) and  number(@pos)&lt;number($min_pos_sum_cur_1) ]"><!-- text of 1 level tags -->
+                        <xsl:choose>
+                            <xsl:when test="@element">&lt;<xsl:value-of select="@element"/>&gt;</xsl:when>
+                            <xsl:otherwise><xsl:copy-of select="text()"/></xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:for-each>
+                    </xsl:variable>
+                    <!--<xsl:call-template name="detect_tag">
+                        <xsl:with-param name="html" select="$html2"/>
+                    </xsl:call-template>-->
+                </xsl:element>
+            </xsl:for-each>
+        </xsl:for-each>
+    </xsl:template>
+    
+    
+    
+</xsl:stylesheet>

+ 0 - 0
SE/schema/dita/default_db-in7_dziennik_koresp/test-druk/IN7_DZIENNIK_KORESP.xsl → SE/schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/IN7_DZIENNIK_KORESP.xsl


+ 0 - 0
SE/schema/dita/default_db-in7_dziennik_koresp/test-druk/Test_z_getfeature_do_parse.xml → SE/schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/Test_z_getfeature_do_parse.xml


+ 0 - 0
SE/schema/dita/default_db-in7_dziennik_koresp/test-druk/build.xml → SE/schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/build.xml


+ 0 - 0
SE/schema/dita/default_db-in7_dziennik_koresp/test-druk/copy-no-xml.xsl → SE/schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/copy-no-xml.xsl


+ 0 - 0
SE/schema/dita/default_db-in7_dziennik_koresp/test-druk/main.dita → SE/schema/ant-url_action/default_db.in7_dziennik_koresp/test-druk/main.dita


+ 0 - 0
SE/schema/dita/topicProcesy5.xsd → SE/schema/ant-url_action/topicProcesy5.xsd


+ 186 - 0
SE/se-lib/Route/Ant.php

@@ -0,0 +1,186 @@
+<?php
+
+Lib::loadClass('RouteBase');
+Lib::loadClass('UI');
+Lib::loadClass('DBG');
+
+/**
+ * Executes ant build for dita file - creates pdf file
+ * - ant build in SE/schema/ant-url_action/{object_namespace_to_file_path}/{function_name}/build.xml
+ *
+ * APP_PATH_SCHEMA . '/ant-url_action/' . {$namespace_sep_by_dot} . '/' . {$function_name} . '/build.xml'
+ * APP_PATH_SCHEMA . '/ant-tool/' . {$ant_tool_name} . '/build.xml'
+ *
+ * usage:
+ *  index.php?_route=Ant
+ *  index.php?_route=Ant&_task=ant&path={$ant_tool_name}
+ *  index.php?_route=UrlAction_Ant
+ *  index.php?_route=UrlAction_Ant&_task=ant&path={$namespace_sep_by_dot}{$function_name}&featureID={featureID}&namespace={$namespace}
+ */
+class Route_Ant extends RouteBase {
+
+  public $pathTools = APP_PATH_SCHEMA . "/ant-tool/";
+  public $pathUrlActions = APP_PATH_SCHEMA . "/ant-url_action/";
+  public $antBin = APP_PATH_WWW . DS . 'stuff' . DS . 'dita-ot-2.3.3' . DS . 'bin' . DS . 'ant';
+
+  public function defaultAction() {
+    UI::gora();
+    UI::tag('h1', [], 'Ant');
+    try {
+      $taskList = $this->getAntToolList();
+      DBG::nicePrint($taskList, 'ant-tool');
+
+      $featureID = V::get('featureID', '', $_GET);
+      $namespace = V::get('namespace', '', $_GET);
+
+      UI::startTag('ul');
+      foreach ($taskList as $path => $label) {
+        $link = "index.php?_route=Ant&_task=ant&path={$ditaPath}";
+        echo UI::h('li', [], [
+          UI::h('a', ['href'=>$link], "Uruchom '{$label}'")
+        ]);
+      }
+      UI::endTag('ul');
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+    UI::dol();
+  }
+
+  public function antAction() {
+    UI::gora();
+    try {
+      $path = V::get('path', '', $_GET);
+      if (!$path) throw new Exception("Missing Ant path!");
+      $taskList = $this->getAntToolList();
+      if (!array_key_exists($path, $taskList)) throw new Exception("Ant path not exists! '{$path}'");
+
+      $cmd = "cd {$this->pathTools}/{$path} && {$this->antBin} 2>&1";// wymaga java jdk
+      V::exec($cmd, $out, $ret);
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+    UI::dol();
+  }
+
+  public function execAntTool($antTask) {
+    $antList = $this->getAntToolList();
+    if (!array_key_exists($antTask, $antList)) throw new Exception("ant task not found", 404);
+    throw new Exception("TODO: run ant task '{$antTask}'", 501);
+  }
+
+  public function getAntUrlActionList() {
+    V::exec("ls -1 {$this->pathUrlActions}*/*/build.xml", $out, $ret);
+    $taskList = array();
+    foreach ($out as $line) {
+      try {
+        if ($this->pathUrlActions != substr($line, 0, strlen($this->pathUrlActions))) throw new Exception("Wrong line prefix '{$line}' - skip");
+        if ('/build.xml' != substr($line, -1 * strlen('/build.xml'))) throw new Exception("Wrong line suffix '{$line}' - expected '/build.xml' - skip");
+      } catch (Exception $e) {
+        UI::alert('warning', $e->getMessage());
+        continue;
+      }
+      $line = substr($line, strlen($this->pathUrlActions));
+      $name = substr($line, 0, -1 * strlen('/build.xml'));
+      $taskList[$name] = $name;// TODO: $name => $description (read from build.xml file first xml tag <project...>)
+    }
+    return $taskList;
+  }
+  public function getAntToolList() {
+    V::exec("ls -1 {$this->pathTools}*/build.xml", $out, $ret);
+    $taskList = array();
+    foreach ($out as $line) {
+      try {
+        if ($this->pathTools != substr($line, 0, strlen($this->pathTools))) throw new Exception("Wrong line prefix '{$line}' - skip");
+        if ('/build.xml' != substr($line, -1 * strlen('/build.xml'))) throw new Exception("Wrong line suffix '{$line}' - expected '/build.xml' - skip");
+      } catch (Exception $e) {
+        UI::alert('warning', $e->getMessage());
+        continue;
+      }
+      $line = substr($line, strlen($this->pathTools));
+      $name = substr($line, 0, -1 * strlen('/build.xml'));
+      $taskList[$name] = $name;// TODO: $name => $description (read from build.xml file first xml tag <project...>)
+    }
+    return $taskList;
+  }
+
+  public function generatePdfAction() {// TODO: OLD TEST
+    $antPath = V::get('ditaPath', '', $_GET);
+    $idKoresp = V::get('idKoresp', 0, $_POST, 'int');
+    $doExecute = V::get('doExecute', '', $_POST);
+
+    $antList = $this->getAntToolList();
+    if (!array_key_exists($antPath, $antList)) throw new Exception("dita path not found", 404);
+
+    UI::gora();
+    UI::startContainer();
+    try {
+      UI::tag('h1', [], "Dita: '{$antList[$antPath]}'");
+
+      UI::startTag('form', ['action'=>"", 'method'=>"POST", 'class'=>'form-inline']);
+      UI::tag('input', ['type'=>'number', 'value'=>$idKoresp, 'class'=>'form-control', 'style'=>'max-width:200px']);
+      UI::tag('input', ['type'=>'hidden', 'name'=>'doExecute', 'value'=>'1']);
+      UI::tag('input', ['type'=>"submit", 'value'=>"Wykonaj", 'class'=>'btn btn-primary']);
+      UI::endTag('form');
+
+      if ($doExecute) {
+        // if ($idKoresp <= 0) throw new Exception("Bad Request - missing id koresp");
+        if ($idKoresp <= 0) UI::alert('danger', "Missing id koresp - using default file");
+        if ($idKoresp > 0) UI::alert('warning', "TODO: generate xml file for id koresp = {$idKoresp}");
+
+        $execPath = APP_PATH_SCHEMA . DS . 'ant' . DS . $antPath;
+        $ant = APP_PATH_WWW . DS . 'stuff' . DS . 'dita-ot-2.3.3' . DS . 'bin' . DS . 'ant';
+        $cmd = "cd {$execPath} && {$ant} 2>&1";// wymaga java jdk
+        V::exec($cmd, $out, $ret);
+        DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
+      }
+
+      throw new Exception("TODO: F." . __FUNCTION__ . " . L." . __LINE__);
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+    }
+    UI::endContainer();
+    UI::dol();
+  }
+
+  public function reinstallAction() {
+    UI::gora();
+    UI::tag('h1', [], 'Reinstall Dita Open Toolkit 2.3.3');
+    $stuffPath = APP_PATH_WWW . DS . 'stuff';
+    // $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && rm dita-ot-2.3.3.zip || echo PASSED";
+  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && wget https://github.com/dita-ot/dita-ot/releases/download/2.3.3/dita-ot-2.3.3.zip -O dita-ot-2.3.3.zip ";
+  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && rm dita-ot-2.3.3 || echo PASSED";
+  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && unzip dita-ot-2.3.3.zip || echo PASSED";
+  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff/dita-ot-2.3.3 && ./startcmd.sh || echo PASSED";
+    $wget = "/opt/local/bin/wget";
+    $unzip = "/usr/bin/unzip";
+
+    // $testCmd = "which unzip";
+    // V::exec($testCmd, $out, $ret);
+    // DBG::_(true, true, "testCmd: {$testCmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
+
+    // $testCmd = "which wget";
+    // V::exec($testCmd, $out, $ret);
+    // DBG::_(true, true, "testCmd: {$testCmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
+
+    $cmd = "cd {$stuffPath} ; [ -f dita-ot-2.3.3.zip ] && rm dita-ot-2.3.3.zip";
+    V::exec($cmd, $out, $ret);
+    DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
+
+    $cmd = "cd {$stuffPath} ; {$wget} https://github.com/dita-ot/dita-ot/releases/download/2.3.3/dita-ot-2.3.3.zip -O dita-ot-2.3.3.zip";
+    V::exec($cmd, $out, $ret);
+    DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
+
+    $cmd = "cd {$stuffPath}
+[ -f dita-ot-2.3.3.zip ] && rm dita-ot-2.3.3.zip
+{$wget} https://github.com/dita-ot/dita-ot/releases/download/2.3.3/dita-ot-2.3.3.zip -O dita-ot-2.3.3.zip
+[ -d dita-ot-2.3.3 ] && rm -rf dita-ot-2.3.3
+{$unzip} dita-ot-2.3.3.zip
+    ";
+    V::exec($cmd, $out, $ret);
+    DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
+  }
+
+}

+ 0 - 122
SE/se-lib/Route/Dita.php

@@ -1,122 +0,0 @@
-<?php
-
-Lib::loadClass('RouteBase');
-Lib::loadClass('UI');
-Lib::loadClass('DBG');
-
-/**
- * Executes ant build for dita file - creates pdf file
- * - ant build in SE/schema/dita/{object_namespace_to_file_path}/{function_name}/build.xml
- */
-class Route_Dita extends RouteBase {
-
-  public function defaultAction() {
-
-    // Expected Result:
-    // ...
-    // [echo] OUTPUT_PDF_FILE: out/null1293984876.pdf
-    //
-    // BUILD SUCCESSFUL
-    // ...
-
-    UI::gora();
-    UI::tag('h1', [], 'Dita');
-    $ditaList = $this->getDitaFunctionList();
-    DBG::_(true, true, "\$ditaList", $ditaList, __CLASS__, __FUNCTION__, __LINE__);
-    UI::startTag('ul');
-    UI::startTag('li');
-      UI::tag('a', ['href'=>"index.php?_route=Dita&_task=reinstall"], "Reinstall");
-    UI::endTag('li');
-    foreach ($ditaList as $ditaPath => $label) {
-      $link = "index.php?_route=Dita&_task=generatePdf&ditaPath={$ditaPath}";
-      UI::startTag('li');
-        UI::tag('a', ['href'=>$link], $label);
-      UI::endTag('li');
-    }
-    UI::endTag('ul');
-  }
-
-  public function getDitaFunctionList() {
-    return [
-      'default_db-in7_dziennik_koresp/test-druk' => "Test Koresp Dita Druk PDF"
-    ];
-  }
-
-  public function generatePdfAction() {
-    $ditaPath = V::get('ditaPath', '', $_GET);
-    $idKoresp = V::get('idKoresp', 0, $_POST, 'int');
-    $doExecute = V::get('doExecute', '', $_POST);
-
-    $ditaList = $this->getDitaFunctionList();
-    if (!array_key_exists($ditaPath, $ditaList)) throw new Exception("dita path not found", 404);
-
-    UI::gora();
-    UI::startContainer();
-    try {
-      UI::tag('h1', [], "Dita: '{$ditaList[$ditaPath]}'");
-
-      UI::startTag('form', ['action'=>"", 'method'=>"POST", 'class'=>'form-inline']);
-      UI::tag('input', ['type'=>'number', 'value'=>$idKoresp, 'class'=>'form-control', 'style'=>'max-width:200px']);
-      UI::tag('input', ['type'=>'hidden', 'name'=>'doExecute', 'value'=>'1']);
-      UI::tag('input', ['type'=>"submit", 'value'=>"Wykonaj", 'class'=>'btn btn-primary']);
-      UI::endTag('form');
-
-      if ($doExecute) {
-        // if ($idKoresp <= 0) throw new Exception("Bad Request - missing id koresp");
-        if ($idKoresp <= 0) UI::alert('danger', "Missing id koresp - using default file");
-        if ($idKoresp > 0) UI::alert('warning', "TODO: generate xml file for id koresp = {$idKoresp}");
-
-        $execPath = APP_PATH_SCHEMA . DS . 'dita' . DS . $ditaPath;
-        $ant = APP_PATH_WWW . DS . 'stuff' . DS . 'dita-ot-2.3.3' . DS . 'bin' . DS . 'ant';
-        $cmd = "cd {$execPath} && {$ant} 2>&1";// wymaga java jdk
-        V::exec($cmd, $out, $ret);
-        DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
-      }
-
-      throw new Exception("TODO: F." . __FUNCTION__ . " . L." . __LINE__);
-    } catch (Exception $e) {
-      UI::alert('danger', $e->getMessage());
-    }
-    UI::endContainer();
-    UI::dol();
-  }
-
-  public function reinstallAction() {
-    UI::gora();
-    UI::tag('h1', [], 'Reinstall Dita Open Toolkit 2.3.3');
-    $stuffPath = APP_PATH_WWW . DS . 'stuff';
-    // $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && rm dita-ot-2.3.3.zip || echo PASSED";
-  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && wget https://github.com/dita-ot/dita-ot/releases/download/2.3.3/dita-ot-2.3.3.zip -O dita-ot-2.3.3.zip ";
-  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && rm dita-ot-2.3.3 || echo PASSED";
-  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff && unzip dita-ot-2.3.3.zip || echo PASSED";
-  	// $cmd[]['rsh']="cd /Library/Server/Web/Data/Sites/Default/SE/stuff/dita-ot-2.3.3 && ./startcmd.sh || echo PASSED";
-    $wget = "/opt/local/bin/wget";
-    $unzip = "/usr/bin/unzip";
-
-    // $testCmd = "which unzip";
-    // V::exec($testCmd, $out, $ret);
-    // DBG::_(true, true, "testCmd: {$testCmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
-
-    // $testCmd = "which wget";
-    // V::exec($testCmd, $out, $ret);
-    // DBG::_(true, true, "testCmd: {$testCmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
-
-    $cmd = "cd {$stuffPath} ; [ -f dita-ot-2.3.3.zip ] && rm dita-ot-2.3.3.zip";
-    V::exec($cmd, $out, $ret);
-    DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
-
-    $cmd = "cd {$stuffPath} ; {$wget} https://github.com/dita-ot/dita-ot/releases/download/2.3.3/dita-ot-2.3.3.zip -O dita-ot-2.3.3.zip";
-    V::exec($cmd, $out, $ret);
-    DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
-
-    $cmd = "cd {$stuffPath}
-[ -f dita-ot-2.3.3.zip ] && rm dita-ot-2.3.3.zip
-{$wget} https://github.com/dita-ot/dita-ot/releases/download/2.3.3/dita-ot-2.3.3.zip -O dita-ot-2.3.3.zip
-[ -d dita-ot-2.3.3 ] && rm -rf dita-ot-2.3.3
-{$unzip} dita-ot-2.3.3.zip
-    ";
-    V::exec($cmd, $out, $ret);
-    DBG::_(true, true, "cmd: {$cmd} (return: {$ret})", $out, __CLASS__, __FUNCTION__, __LINE__);
-  }
-
-}

+ 46 - 0
SE/se-lib/Route/UrlAction/Ant.php

@@ -0,0 +1,46 @@
+<?php
+
+Lib::loadClass('RouteBase');
+Lib::loadClass('UI');
+Lib::loadClass('DBG');
+Lib::loadClass('Router');
+
+class Route_UrlAction_Ant extends RouteBase {// @doc @see Route_Ant
+
+  public function defaultAction() {
+    UI::gora();
+    UI::tag('h1', [], 'Ant');
+    try {
+      $taskList = Router::getRoute('Ant')->getAntUrlActionList();
+      DBG::nicePrint($taskList, 'ant-url_action');
+
+      $featureID = V::get('featureID', '', $_GET);
+      $namespace = V::get('namespace', '', $_GET);
+
+      UI::startTag('ul');
+      foreach ($taskList as $path => $label) {
+        $link = "index.php?_route=UrlAction_Ant&_task=ant&path={$ditaPath}";
+        echo UI::h('li', [], [
+          UI::h('a', ['href'=>$link], "Uruchom '{$label}'")
+        ]);
+      }
+      UI::endTag('ul');
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+    UI::dol();
+  }
+
+  public function antAction() {
+    UI::gora();
+    try {
+
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+      DBG::log($e);
+    }
+    UI::dol();
+  }
+
+}