====== Groovy makra v Openu ====== ===== 4. Další příklady ===== ==== 4.1. Tlačítka v detailu ==== === 4.1.1. Zobrazení adresáře === import cz.ortex.model.O6r; import cz.ortex.gui.o0.adresar.O6rWrapper; import cz.ortex.gui.o0.browse.BrowseDialogWindow; import java.util.logging.Level; import java.util.logging.Logger; public void main() { try { O6rWrapper o6rWrapper = new O6rWrapper(); BrowseDialogWindow nabidkaO6r = null; nabidkaO6r = o6rWrapper.getVyberWindow(null); O6r o6r = new O6r(); o6r.setDksSp("CS"); nabidkaO6r.getBrowseParams().setEntity(o6r); // aby se nastavilo na řeč již vyplněnou nabidkaO6r.setVisible(true); } catch (Exception ex) { Logger.getLogger(MakroO6r.class.getName()).log(Level.SEVERE, null, ex); } } {{:orsoftopen:spravais:workshop:groovymakra:image45.png?700}} === 4.1.2. Tlačítko v liště wrapperu – zobrazení dokumentu === Je zde řešeno: - Zjištění počtu dokumentů - Když je jeden – zobrazení - Když je více – zobrazení okna se seznamem - Když není – tak nic === 4.1.3. Tlačítko pro tisk „sestavy“ === {{:orsoftopen:spravais:workshop:groovymakra:image46.png?700}} import java.util.logging.Level; import java.util.logging.Logger; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.util.o0.AppContext; import cz.ortex.gui.o0.Tiskac; import cz.ortex.util.o0.O0JasperParam; public void tisk(Object currentRecord, Object dotahovane) { Tiskac tiskac = new Tiskac("Tisk likvid.litku", true, null); O0JasperParam o0JasperParam = new O0JasperParam(); o0JasperParam.setSestava("/cz/ortex/jasper/reports/PpfHllik.jrxml"); // o0JasperParam.setPouzUzivSestIfExist(true); o0JasperParam.setBrowseCurrentRecord(currentRecord); tiskac.view(o0JasperParam); } === 4.1.4. Tlačítko pro odeslání mailu === {{:orsoftopen:spravais:workshop:groovymakra:image47.png?700}} import java.util.logging.Level; import java.util.logging.Logger; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.components.OptionPane; import cz.ortex.util.o0.AppContext; import cz.ortex.apidao.o0.eldoc.OeldokDao; import cz.ortex.apidao.o0.workflow.OemailParams; public void sendMail(Object currentRecord, Object dotahovane) { String sablona = "oJRViewerINF"; String prijemce = "tomas.myslivec@ortex.cz"; OemailParams oemailParams = new OemailParams(); oemailParams.setSablonaMailu(sablona); oemailParams.setEmailAdresa(prijemce); OeldokDao oeldokDao = (OeldokDao) AppContext.getDaoService(OeldokDao.NAME); if (oeldokDao != null) { oemailParams = oeldokDao.posliDokumentMailem(oemailParams, currentRecord); } if (oemailParams.isOk()) { OptionPane.createInfoDialog("", "Probehlo odeslami mailu."); } else { OptionPane.createErrorDialog("", "Mail nebyl odeslan!"); } } {{:orsoftopen:spravais:workshop:groovymakra:image48.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image49.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image50.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image51.png?700}} ==== 4.2. Ikony v browsu a makra Práce se záznamem ==== === 4.2.1. Vložení ikony do browsu === {{:orsoftopen:spravais:workshop:groovymakra:image52.png?700}} A makro: {{:orsoftopen:spravais:workshop:groovymakra:image53.png?700}} import cz.ortex.model.Ofwk; import cz.ortex.model.Ofwp; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; Object getCellValue(Ofwk entity, Object dotahovane) { //zde vypiste kod if (entity != null){ if (O0StringUtil.notBlank(entity.getOfwp().getIko())) { return "oeldok16.png:Dokument je připojen"; } else { return ""; } } else { return ""; } } Kliknutí na ikonu Groovy makra + Práce se záznamem: {{:orsoftopen:spravais:workshop:groovymakra:image54.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import java.util.logging.Logger; import cz.ortex.model.Ofwk; import cz.ortex.model.Ofwp; import cz.ortex.gui.o0.browse.BrowseWindow; import cz.ortex.gui.o0.eldoc.OeldokWrapper; import cz.ortex.util.o0.O0StringUtil; GroovyBrowsePar editUvod(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } GroovyBrowsePar validate(Object entity, O0Data dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } GroovyBrowsePar noEditDetail(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } GroovyBrowsePar kontrolaVeta(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } String getPgmVars(Object entity, Object dotahovane) { //zde vypiste kod } GroovyBrowsePar akceIkonaBrowse(Ofwk entity, O0Data dotahovane, String fieldName, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod if ("oeldok16.png".equals(fieldName)) { if ((entity != null) && (entity.getOfwp() != null) && (O0StringUtil.notBlank(entity.getOfwp().getIko()))) { try { BrowseWindow window1 = new OeldokWrapper(entity.getOfwp().getIko(), Ofwp.class, entity.getOfwp().getIdpk()); window1.setVisible(true); } catch (Exception ex) { Logger.getLogger(OfwkPanel.class.getName()).log(Level.SEVERE, null, ex); } } } } S ošetřením počtu dokumentů {{:orsoftopen:spravais:workshop:groovymakra:image55.png?700}} GroovyBrowsePar akceIkonaBrowse(Ofwk entity, O0Data dotahovane, String fieldName, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod Integer pocet = 0; if ("oeldok16.png".equals(fieldName)) { if ((entity != null) && (entity.getOfwp() != null) && (O0StringUtil.notBlank(entity.getOfwp().getIko()))) { try { pocet = OeldokWrapper.podejPocetDokumentu(null,entity.getOfwp().getIko()); if (pocet > 0) { if (pocet == 1) { OeldokWrapper oeldokWrapper = new OeldokWrapper(); Oeldok oeldok = oeldokWrapper.podejOeldokIko(null,entity.getOfwp().getIko()); // if (oeldok != null) { oeldokWrapper.zobrazitDokument(oeldok); // } } else { BrowseWindow window1 = new OeldokWrapper(entity.getOfwp().getIko(), Ofwp.class, entity.getOfwp().getIdpk()).getDialogWindow(); window1.setVisible(true); } } } catch (Exception ex) { Logger.getLogger(OeldokWrapper.class.getName()).log(Level.SEVERE, null, ex); } } } } === 4.2.2. Volání jiného wrapperu na ikonu v browsu – např. Poznámky === import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import java.util.logging.Logger; import cz.orcz.orfmodel.CPolozka; import cz.ortex.gui.o0.browse.BrowseWindow; import cz.ortex.gui.o0.eldoc.OeldokWrapper; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.gui.o0.poznamky.O0pozWrapper; GroovyBrowsePar akceIkonaBrowse(CPolozka entity, O0Data dotahovane, String fieldName, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod if ("oeldok16.png".equals(fieldName)) { if ((entity != null) && (O0StringUtil.notBlank(entity.getIko()))) { try { BrowseWindow windowl = new OeldokWrapper(entity.getIko(), CPolozka.class, entity.getIdpk()).getDialogWindow(); windowl.setVisible(true); } catch (Exception ex) { Logger.getLogger(OeldokWrapper.class.getName()).log(Level.SEVERE, null, ex); } } } if ("o0poz16.png".equals(fieldName)) { if ((entity != null) && (O0StringUtil.notBlank(entity.getIdpk()))) { try { O0pozWrapper o0pozWrapper = new O0pozWrapper(); o0pozWrapper.getBrowseParams().setEntity(o0poz); o0pozWrapper.setUloha(O0pozWrapper.OBJEKT); BrowseWindow poznamky; poznamky = o0pozWrapper.getWindow(null); GlobalGui.getDesktop().add(poznamky); poznamky.setVisible(true); } catch (Exception ex) { Logger.getLogger(O0pozWrapper.class.getName()).log(Level.SEVERE, null, ex); } } } } === 4.2.3. Ikony v browsu jako tlačítka v Katalogu položek === Konkrétní příklad použití v Katalogu položek. Do browsu je třeba vložit nejprve ikony, které obsahují příslušné png: {{:orsoftopen:spravais:workshop:groovymakra:image56.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import java.util.logging.Logger; import java.util.logging.Level; import cz.orcz.orfmodel.CPolozka; import cz.ortex.model.Oeldok; import cz.ortex.model.O0poz; import cz.orcz.orfmodel.CDoprovodneTexty; import cz.ortex.gui.o0.browse.BrowseWindow; import cz.ortex.gui.o0.eldoc.OeldokWrapper; import cz.ortex.util.o0.O0StringUtil; import cz.orcz.gui.lc.CDoprovodneTextyWrapper; import cz.ortex.gui.o0.poznamky.O0pozWrapper; import cz.ortex.util.o0.StringParams; import cz.ortex.gui.o0.OPocitadlo; import cz.ortex.gui.o0.OExec; import cz.ortex.components.OptionPane; GroovyBrowsePar editUvod(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } GroovyBrowsePar validate(Object entity, O0Data dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } GroovyBrowsePar noEditDetail(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } GroovyBrowsePar kontrolaVeta(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } String getPgmVars(Object entity, Object dotahovane) { //zde vypiste kod } //GroovyBrowsePar akceIkonaBrowse(Object entity, O0Data dotahovane, String fieldName, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod GroovyBrowsePar akceIkonaBrowse(CPolozka entity, O0Data dotahovane, String fieldName, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod //klik na ikonu el. dokumentů v browse if ("oeldok16.png".equals(fieldName)) { Integer pocet = 0; if ((entity != null) && (O0StringUtil.notBlank(entity.getIko()))) { try { OPocitadlo.createPocitadlo("Čekejte prosím", "Zjišťuji počet připojených dokumentů…", OPocitadlo.POCITADLO_VRTITKO, OPocitadlo.BUTTON_NENI, new OExec() {@Override public Object execute() throws Exception { //tohle (níže) trochu trvá, proto zobrazíme vrtítko (výše) pocet = OeldokWrapper.podejPocetDokumentu(null,entity.getIko()); }}); //konec OPocitadla if (pocet > 0) { if (pocet == 1) { OPocitadlo.createPocitadlo("Čekejte prosím", "Připravuji zobrazení připojeného dokumentu…", OPocitadlo.POCITADLO_VRTITKO, OPocitadlo.BUTTON_NENI, new OExec() {@Override public Object execute() throws Exception { //tohle (níže) trochu trvá, proto zobrazíme vrtítko (výše) OeldokWrapper oeldokWrapper = new OeldokWrapper(); Oeldok oeldok = oeldokWrapper.podejOeldokIko(null,entity.getIko()); oeldokWrapper.zobrazitDokument(oeldok); }}); //konec OPocitadla } else { BrowseWindow window1 = new OeldokWrapper(entity.getIko(), CPolozka.class, entity.getIdpk()).getDialogWindow(); window1.setVisible(true); } } } catch (Exception ex) { Logger.getLogger(OeldokWrapper.class.getName()).log(Level.SEVERE, null, ex); } } return groovyBrowsePar; } //klik na ikonu poznámek v browse if ("o0poz16.png".equals(fieldName)) { if ((entity != null) ) { try { Character typ = 'K'; O0poz o0poz = new O0poz(); BrowseWindow poznamky; OPocitadlo.createPocitadlo("Čekejte prosím", "Připravuji zobrazení poznámek k položce…", OPocitadlo.POCITADLO_VRTITKO, OPocitadlo.BUTTON_NENI, new OExec() {@Override public Object execute() throws Exception { //tohle (níže) trochu trvá, proto zobrazíme vrtítko (výše) o0poz.setPrizTyp(typ); o0poz.setObjName("CPolozka"); //o0poz.setCisIdpk(null); o0poz.setCisKlic(entity.getIna()); o0poz.setPoradi(0); O0pozWrapper o0pozWrapper = new O0pozWrapper(); o0pozWrapper.getBrowseParams().setEntity(o0poz); String wrapperParams = ""; wrapperParams = StringParams.addParamValue(wrapperParams, "predanyTitulek", "Poznámka k položce "+entity.getIna()); o0pozWrapper.setWrapperParams(wrapperParams); o0pozWrapper.setUloha(O0pozWrapper.KLIC); poznamky = o0pozWrapper.getWindow(null); }}); //konec OPocitadla poznamky.setVisible(true); } catch (Exception ex) { Logger.getLogger(O0pozWrapper.class.getName()).log(Level.SEVERE, null, ex); } } return groovyBrowsePar; } //klik na ikonu doprovodného textu v browse if ("oretezp16.png".equals(fieldName)) { if ((entity != null) ) { try { CDoprovodneTexty cDoprovodneTexty = new CDoprovodneTexty(); BrowseWindow texty; OPocitadlo.createPocitadlo("Čekejte prosím", "Připravuji zobrazení doprovodných textů k položce…", OPocitadlo.POCITADLO_VRTITKO, OPocitadlo.BUTTON_NENI, new OExec() {@Override public Object execute() throws Exception { //tohle (níže) trochu trvá, proto zobrazíme vrtítko (výše) CDoprovodneTextyWrapper cDoprovodneTextyWrapper = new CDoprovodneTextyWrapper(); cDoprovodneTextyWrapper.getBrowseParams().setEntity(cDoprovodneTexty); String wrapperParamsCDT = ""; wrapperParamsCDT = StringParams.addParamValue(wrapperParamsCDT, "title", "Doprovodný text k položce "+entity.getIna()); wrapperParamsCDT = StringParams.addParamValue(wrapperParamsCDT, "filter", "cisIdpk.eq("+entity.getIdpk().toString().trim()+") and nazevNt.eq('TS')"); cDoprovodneTextyWrapper.setWrapperParams(wrapperParamsCDT); texty = cDoprovodneTextyWrapper.getWindow(null); }}); //konec OPocitadla texty.setVisible(true); } catch (Exception ex) { Logger.getLogger(CDoprovodneTextyWrapper.class.getName()).log(Level.SEVERE, null, ex); } } return groovyBrowsePar; } } ==== 4.3. Makra Práce se záznamem – další příklady ==== === 4.3.1. Makro Práce se záznamem a volání makro na serveru === import cz.ortex.model.O6a; import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Session; import cz.ortex.gui.o0.browse.BrowsePanel; import javax.swing.JOptionPane; import cz.ortex.components.OptionPane; GroovyBrowsePar editUvod(O6a entity, Object dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, BrowsePanel browsePanel) { //zde vypiste kod pisu:) System.out.println(entity.getDkaNr()); entity.setDkaName1("xxx"); //groovyBrowsePar = browsePanel.callServerGroovy("grooO6a", "editUvod", groovyBrowsePar); entity.setDkaName1("yyy"); return groovyBrowsePar; } GroovyBrowsePar noEditDetail(O6a entity, Object dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, BrowsePanel browsePanel) { groovyBrowsePar = browsePanel.callServerGroovy("grooO6a", "noEditDetail", groovyBrowsePar); return groovyBrowsePar; } GroovyBrowsePar kontrolaVeta(O6a entity, Object dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, BrowsePanel browsePanel) { String fieldName = "dkaEMail"; Object fieldValue = entity.getDkaEMail(); groovyBrowsePar = validate(entity, dotahovane, fieldName, fieldValue, groovyBrowsePar, o0session, browsePanel); return groovyBrowsePar; } GroovyBrowsePar validate(O6a entity, Object dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0session, BrowsePanel browsePanel) { if ("dkaEMail".equals(fieldName)) { groovyBrowsePar = browsePanel.callServerGroovy("grooO6a", "kontrolaEmail", groovyBrowsePar); System.out.println("result = " + groovyBrowsePar.getResult()); if (groovyBrowsePar.getResult() == false) { if (OptionPane.createYesNoDialog(null, "Špatný formát mailu, povolit ?", JOptionPane.WARNING_MESSAGE) == 1) { groovyBrowsePar.setFocusName(fieldName); } else { entity.setDkaHomePage(fieldValue.toString()); } } } return groovyBrowsePar; } Kontrolní makro na serveru: import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.model.O6a; import cz.ortex.apilogic.o0.adresar.O6aData; import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.util.o0.BrowseEditState; import java.util.HashMap; GroovyBrowsePar kontrolaEmail(O6a entity, O6aData dotahovane, O0Session o0Session, GroovyBrowsePar groovyBrowsePar) { if (entity.getDkaEMail().contains("@")) { groovyBrowsePar.setResult(true); if (O0StringUtil.isBlank(entity.getDkaHomePage())) { entity.setDkaHomePage("www." + entity.getDkaEMail().substring(entity.getDkaEMail().indexOf("@") + 1)); } } else { groovyBrowsePar.setResult(false); } return groovyBrowsePar; } GroovyBrowsePar noEditDetail(O6a entity, O6aData dotahovane, O0Session o0Session, GroovyBrowsePar groovyBrowsePar) { if (BrowseEditState.isProhlizeni(groovyBrowsePar.getEditState())) { groovyBrowsePar.setVar(1, 'P' as char); } else { groovyBrowsePar.setVar(1, ' ' as char); } HashMap componentValues = new HashMap(); componentValues.put("poznamka", "text poznamky z groovy makra"); groovyBrowsePar.setComponentValues(componentValues); return groovyBrowsePar; } GroovyBrowsePar editUvod(O6a entity, O6aData dotahovane, O0Session o0Session, GroovyBrowsePar groovyBrowsePar) { groovyBrowsePar.setVar(1, ' ' as char); if (BrowseEditState.isZalozeni(groovyBrowsePar.getEditState())) { entity.setDkaName2("nova"); } return groovyBrowsePar; } === 4.3.2. Makro Práce se záznamem a volání makro na serveru - podruhé === Řešení pomocí browsePanelu a voláním metody callServerGroovy. Tato metoda vrací object GroovyBrowsePar – v něm lze předat např. text zprávy. Do pohledu – Práce se záznamem - vložíme následující kód {{:orsoftopen:spravais:workshop:groovymakra:image57.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.model.O6a; import cz.ortex.util.o0.O0Session; import cz.ortex.gui.o0.browse.BrowsePanel; import cz.ortex.components.OptionPane; import javax.swing.JOptionPane; // Toto je vzor makra pro pohled - práce se záznamem - metoda validate // Nelze volat samostatně. // V makru je volána metoda callServerGroovy v aktuálním browsePanel GroovyBrowsePar validate(O6a entity, Object dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0session, BrowsePanel browsePanel) { if ("dkaEMail".equals(fieldName) { groovyBrowsePar = browsePanel.callServerGroovy("vzorEmailO6aTestSrv", "kontrolaEmail", groovyBrowsePar); if (groovyBrowsePar.getResult() == true) { if (OptionPane.createYesNoDialog(null, "Špatný formát mailu, povolit ?", JOptionPane.WARNING_MESSAGE) == 1) { groovyBrowsePar.setFocusName(fieldName); } else { entity.setDkaHomePage(fieldValue.toString()); } } } } Na straně serveru si připravíme volané makro {{:orsoftopen:spravais:workshop:groovymakra:image58.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.model.O6a; import cz.ortex.apilogic.o0.adresar.O6aData; import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.O0StringUtil; // Toto je vzor serverového makra volané z makra pro pohled - práce se záznamem - metoda validate // Makro vrací objekt GroovyBrowsePar //Makru se předává parametr groovyBrowsePar, ostatní parametry v této metodě jsou povinné - doplní je "browsePanel" - entitu, dotahované a o0Session // groovyBrowsePar = browsePanel.callServerGroovy("vzorEmailO6aTestSrv", "kontrolaEmail", groovyBrowsePar); GroovyBrowsePar kontrolaEmail(O6a entity, O6aData dotahovane, O0Session o0Session, GroovyBrowsePar groovyBrowsePar) { if (entity.getDkaEMail().contains("@")) { groovyBrowsePar.setResult(true); if (O0StringUtil.isBlank(entity.getDkaHomePage())) { //nastavení webové stránky dle domény z e-mailu entity.setDkaHomePage("www." + entity.getDkaEMail().substring(entity.getDkaEMail().indexOf("@") + 1)); } } else { groovyBrowsePar.setResult(false); } return groovyBrowsePar; } === 4.3.3. Makro Práce se záznamem a volání makro na serveru - potřetí === Řešení pomocí Dao a voláním metody callGroovy. Tato metoda vrací obecně jakýkoli objekt, který je dále zpracován. Zde v příkladu je použito O6aDao a vracený objekt je osoba třídy Osoby. Do pohledu – Práce se záznamem - vložíme následující kód {{:orsoftopen:spravais:workshop:groovymakra:image59.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import cz.ortex.model.O6a; import cz.ortex.model.Osoby; import cz.ortex.gui.o0.browse.BrowsePanel; import cz.ortex.apidao.o0.adresar.O6aDao; import cz.ortex.util.o0.AppContext; // Toto je vzor makra pro pohled - práce se záznamem - metoda validate // Nelze volat samostatně. // V makru je volána metoda callGroovy v Dao - je zde použito O6aDao //Makru se předávají parametry v poli Objects[] - jejich počet a typy musí být stejné jako je ve volané metodě "kontrolaEmail" v makru na serveru "vzorEmailO6aOsobySrv" // Osoby kontrolaEmail(O6a entity, Object dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0Session) { GroovyBrowsePar validate(O6a entity, Object dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0session, BrowsePanel browsePanel) { if ("dkaEMail".equals(fieldName)) { O6aDao o6aDao = (O6aDao) AppContext.getDaoService("o6aDao"); if (o6aDao != null) { Object[] grooObject = new Object[6]; grooObject[0] = entity; grooObject[1] = dotahovane; grooObject[2] = fieldName; grooObject[3] = fieldValue; grooObject[4] = groovyBrowsePar; grooObject[5] = o0session; Osoby osoba = o6aDao.callGroovy("vzorEmailO6aOsobySrv", "kontrolaEmail", grooObject); if (osoba != null) { if (osoba.getJmPrijm() != null) { entity.setDkaHomePage(osoba.getJmPrijm()); } } } } return groovyBrowsePar; } Na straně serveru si připravíme volané makro {{:orsoftopen:spravais:workshop:groovymakra:image60.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.model.O6a; import cz.ortex.model.Osoby; import cz.ortex.apilogic.o0.adresar.O6aData; import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.util.o0.OEntityUtil; // Toto je vzor serverového makra volané z makra pro pohled - práce se záznamem - metoda validate // Makro vrací objekt Osoba //Makru se předávají parametry v poli Objects[] - jejich počet a typy musí být stejné jako je ve této metodě // Object[] grooObject = new Object[6]; // grooObject[0] = entity; // grooObject[1] = dotahovane; // grooObject[2] = fieldName; // grooObject[3] = fieldValue; // grooObject[4] = groovyBrowsePar; // grooObject[5] = o0session; // Osoby osoba = o6aDao.callGroovy("vzorEmailO6aOsobySrv", "kontrolaEmail", grooObject); Osoby kontrolaEmail(O6a entity, Object dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0Session) { if (entity.getDkaEMail().contains("@")) { Integer oscis = o0Session.getUserNumber(); Osoby osoba = (Osoby) OEntityUtil.getRecordByParam(Osoby.class.getCanonicalName(), "oscis", oscis); return osoba; } else { return null; } } === 4.3.4. Makro Práce se záznamem a dotažení údajů k adrese z Dkx === import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.AppContext; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.model.Nq10; import cz.ortex.model.O6a; import cz.ortex.model.Osoby; import cz.ortex.model.Ohkon; import cz.orcz.orfmodel.Dkx; import cz.ortex.apidao.o0.adresar.O6aDao; GroovyBrowsePar editUvod(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod } GroovyBrowsePar validate(Object entity, O0Data dotahovane, String fieldName, Object fieldValue, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod if (entity != null) { if (entity.getO6aByO1firma() != null) { if (entity.getO6aByO1firma().getDkaNr() != null) { if ("o1ico0".equals(fieldName)) { if (O0StringUtil.isBlank(entity.getKontakt())) { if (O0StringUtil.isBlank(entity.getTelefon())) { if (O0StringUtil.isBlank(entity.getEmail())) { O6aDao o6aDao = (O6aDao) AppContext.getDaoService("o6aDao"); if (o6aDao != null) { Dkx dodavatelDkx = o6aDao.podejDkxDodavatel(entity.getO6aByO1firma().getDkaNr()); if (dodavatelDkx != null) { if (O0StringUtil.notBlank(dodavatelDkx.getDkxTel())) { entity.setTelefon(dodavatelDkx.getDkxTel()); } if (O0StringUtil.notBlank(dodavatelDkx.getDkxEMail2())) { entity.setEmail(dodavatelDkx.getDkxEMail2()); } if (dodavatelDkx.getDkxIdpkOhkon() != null) { Ohkon osoby = (Ohkon) OEntityUtil.getRecordByParam(Ohkon.class.getCanonicalName(), "idpk", dodavatelDkx.getDkxIdpkOhkon()); if (osoby != null) { String pr = ""; String jm = ""; if (osoby.getJmPrijm() != null) { pr = osoby.getJmPrijm(); } if (osoby.getJmJmeno() != null) { jm = osoby.getJmJmeno(); } entity.setKontakt(O0StringUtil.slozit(pr, jm, " ")); } } HashMap componentValues = new HashMap(); componentValues.put("kontakt", entity.getKontakt()); componentValues.put("telefon", entity.getTelefon()); componentValues.put("email", entity.getEmail()); groovyBrowsePar.setComponentValues(componentValues); groovyBrowsePar.setFocusName("kontakt"); } } } } } } if ("o1firma0".equals(fieldName)) { if (O0StringUtil.isBlank(entity.getKontakt())) { if (O0StringUtil.isBlank(entity.getTelefon())) { if (O0StringUtil.isBlank(entity.getEmail())) { O6aDao o6aDao = (O6aDao) AppContext.getDaoService("o6aDao"); if (o6aDao != null) { Dkx dodavatelDkx = o6aDao.podejDkxDodavatel(entity.getO6aByO1firma().getDkaNr()); if (dodavatelDkx != null) { if (O0StringUtil.notBlank(dodavatelDkx.getDkxTel())) { entity.setTelefon(dodavatelDkx.getDkxTel()); } if (O0StringUtil.notBlank(dodavatelDkx.getDkxEMail2())) { entity.setEmail(dodavatelDkx.getDkxEMail2()); } if (dodavatelDkx.getDkxIdpkOhkon() != null) { Ohkon osoby = (Ohkon) OEntityUtil.getRecordByParam(Ohkon.class.getCanonicalName(), "idpk", dodavatelDkx.getDkxIdpkOhkon()); if (osoby != null) { String pr = ""; String jm = ""; if (osoby.getJmPrijm() != null) { pr = osoby.getJmPrijm(); } if (osoby.getJmJmeno() != null) { jm = osoby.getJmJmeno(); } entity.setKontakt(O0StringUtil.slozit(pr, jm, " ")); } } // entity.setKontakt("myslivec"); HashMap componentValues = new HashMap(); componentValues.put("kontakt", entity.getKontakt()); componentValues.put("telefon", entity.getTelefon()); componentValues.put("email", entity.getEmail()); groovyBrowsePar.setComponentValues(componentValues); groovyBrowsePar.setFocusName("kontakt"); } } } } } } if ("o1nazev0".equals(fieldName)) { if (O0StringUtil.isBlank(entity.getKontakt())) { if (O0StringUtil.isBlank(entity.getTelefon())) { if (O0StringUtil.isBlank(entity.getEmail())) { O6aDao o6aDao = (O6aDao) AppContext.getDaoService("o6aDao"); if (o6aDao != null) { Dkx dodavatelDkx = o6aDao.podejDkxDodavatel(entity.getO6aByO1firma().getDkaNr()); if (dodavatelDkx != null) { if (O0StringUtil.notBlank(dodavatelDkx.getDkxTel())) { entity.setTelefon(dodavatelDkx.getDkxTel()); } if (O0StringUtil.notBlank(dodavatelDkx.getDkxEMail2())) { entity.setEmail(dodavatelDkx.getDkxEMail2()); } if (dodavatelDkx.getDkxIdpkOhkon() != null) { Ohkon osoby = (Ohkon) OEntityUtil.getRecordByParam(Ohkon.class.getCanonicalName(), "idpk", dodavatelDkx.getDkxIdpkOhkon()); if (osoby != null) { String pr = ""; String jm = ""; if (osoby.getJmPrijm() != null) { pr = osoby.getJmPrijm(); } if (osoby.getJmJmeno() != null) { jm = osoby.getJmJmeno(); } entity.setKontakt(O0StringUtil.slozit(pr, jm, " ")); } } HashMap componentValues = new HashMap(); componentValues.put("kontakt", entity.getKontakt()); componentValues.put("telefon", entity.getTelefon()); componentValues.put("email", entity.getEmail()); groovyBrowsePar.setComponentValues(componentValues); groovyBrowsePar.setFocusName("kontakt"); } } } } } } } } } return groovyBrowsePar; } === 4.3.5. Makro Práce se záznamem a dotažení všech poznámek z WF === Do pohledu si vložíme víceřádkové pole a nazveme ho „wfPozn“. V makru bude následující plnění poznámkou: import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import cz.ortex.apidao.o0.workflow.OfwoDao; import cz.ortex.model.Ofwo; import cz.ortex.util.o0.AppContext; GroovyBrowsePar noEditDetail(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod String wfPoznamka = ""; if (entity != null) { OfwoDao ofwoDao = (OfwoDao) AppContext.getDaoService(OfwoDao.NAME); if (ofwoDao != null) { List ofwos = ofwoDao.getOfwosByTargetRecord(entity); if (ofwos != null && !ofwos.isEmpty()) { Ofwo ofwo = ofwos[0]; wfPoznamka = ofwoDao.pozHistorieTisk(ofwo, true, true, true); } } } HashMap componentValues = new HashMap(); componentValues.put("wfPozn", wfPoznamka); groovyBrowsePar.setComponentValues(componentValues); // System.out.println(wfPoznamka); return groovyBrowsePar; } ==== 4.4. Speciální makra ==== === 4.4.1. Podání čísla žádanky === {{:orsoftopen:spravais:workshop:groovymakra:image61.png?700}}{{:orsoftopen:spravais:workshop:groovymakra:image62.png?700}}{{:orsoftopen:spravais:workshop:groovymakra:image63.png?700}} import cz.ortex.model.Oelfrm; import cz.ortex.util.o0.O0Session; import cz.ortex.impldao.o0.admin.OsobyDaoImpl; import cz.ortex.util.o0.O0DateUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.model.Osoby; import java.util.logging.Level; import java.util.logging.Logger; String cisloZadanky(Object[] args, O0Session o0session) { //char 20, číslo z Osob číslo referenta wf – skupina poslední 3 číslice, rok, 5, rostoucí číslo platí pro přihlášenou osobu // zde se vrací pouze speciální maska kde samorostoucí číslo je oddělené za mezerou String vysl = null; Osoby osoby = OsobyDaoImpl.getEntity(o0session.getUserNumber()); String skupina = O0StringUtil.rtrim(osoby.getSkupina()); int len = skupina.length(); skupina = skupina.substring(len -3); Integer rok = O0DateUtil.getRok(o0session.getDatumZpracovani()); vysl = skupina + rok.toString().substring(2,4) + "5 001"; return vysl; } === 4.4.2. WF a vice maker v podmínce === {{:orsoftopen:spravais:workshop:groovymakra:image64.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image65.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.rmi.RemoteException; import java.math.BigDecimal; import cz.ortex.model.Oelfrm; import cz.ortex.model.Ofwos; import cz.ortex.impldao.o0.workflow.OfwosDaoImpl; String osobniLimit(Object[] objects, O0Session o0Session) { String vysl = "0"; Oelfrm entity = (Oelfrm) objects[0]; if (entity != null) { // Integer oscis = o0Session.getUserNumber(); Integer oscis = entity.getZodpovidaOscis(); Ofwos ofwos = OfwosDaoImpl.getEntityByUtvar(oscis, entity.getHodn06(), o0Session); if (ofwos != null && ofwos.getOsobniLimit() != null) { vysl = ofwos.getOsobniLimit().toString(); } } return vysl; } {{:orsoftopen:spravais:workshop:groovymakra:image66.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import java.rmi.RemoteException; import cz.ortex.model.Oelfrm; String pripravena(Object[] objects, O0Session o0Session) { Oelfrm entity = (Oelfrm) objects[0]; if (entity != null) { if (entity.getStav() == null) { return true; } if (O0StringUtil.isBlank(entity.getStav().toString())) { return true; } } return false; } {{:orsoftopen:spravais:workshop:groovymakra:image67.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.rmi.RemoteException; import java.math.BigDecimal; import cz.ortex.model.Oelfrm; import cz.ortex.model.Ofwos; import cz.ortex.impldao.o0.workflow.OfwosDaoImpl; String substring(Object[] objects, O0Session o0Session) { String vysl = "' '"; Oelfrm entity = (Oelfrm) objects[0]; if (entity != null) { if (entity.getCislo() != null) { vysl = "'" + entity.getCislo().substring(0,3) + "'"; } } return vysl; } === 4.4.1. WF a kontrola správnosti schválení makrem === Makro kontroluje vyplnění návrhu rozpočtu (tabulka OFWDT) na cenu faktury {{:orsoftopen:spravais:workshop:groovymakra:image68.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image69.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image70.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.rmi.RemoteException; import cz.ortex.apilogic.o0.workflow.OfwUtil; import cz.ortex.model.Ofwdt; import cz.ortex.model.Ofwk; import cz.ortex.model.PpfHl; import cz.ortex.implutil.o0.HibernateUtil; import java.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; import cz.ortex.apilogic.o0.workflow.OfwRetObject; import cz.ortex.apilogic.o0.workflow.OfwSplnenoChoices; import org.apache.commons.beanutils.ConvertUtils; import cz.ortex.util.o0.O0StringUtil; OfwRetObject stepActionRun(PpfHl entity, Ofwk ofwk, OfwUtil.OfwActionRunParams runParams, O0Session o0Session) { OfwRetObject retObject = new OfwRetObject(); retObject.setActionCorrectlyDone(true); String chyba = ""; BigDecimal obnosFaktury = new BigDecimal(100.00); // "vzdy do 1 Kc, u cizi meny prepocitat dle kurzu na fakture" BigDecimal rozdilMax = new BigDecimal(1.00); BigDecimal rozdilProc = new BigDecimal(5.00); if (entity != null) { if (entity.getObnosTuzem() != null) { obnosFaktury = entity.getObnosFakt(); if (O0StringUtil.notBlank(ofwk.getTrideni2())) { obnosFaktury = ConvertUtils.convert(ofwk.getTrideni2().trim().replaceAll(",","."), BigDecimal.class); } Session session = HibernateUtil.getCurrentSession(); Transaction tx = session.getTransaction(); boolean byloTransactionActive = tx.isActive(); try { if (!byloTransactionActive) { tx.begin(); } String nazevTab = "PpfhlRozuct"; BigDecimal obnosNum02 = BigDecimal.ZERO; Criteria c = session.CriteriaUtil.createCriteria(session, Ofwdt.class); c.add(Restrictions.eq("nazevtab", nazevTab.trim())); c.add(Restrictions.eq("casttab", " ")); c.add(Restrictions.eq("ofwkIdpk", ofwk.getIdpk())); List ofwdtList = c.list(); for (int i = 0; i < ofwdtList.size(); i++) { Ofwdt ofwdt = ofwdtList.get(i); if (ofwdt != null) { if (ofwdt.getNazevtab().trim().equals(nazevTab.trim())) { if (ofwdt.getNum02() != null) { obnosNum02 = obnosNum02.add(ofwdt.getNum02()); } } } } if (entity.getObnosTuzem().compareTo(obnosNum02) == 0) { chyba = "OK"; } else { // "Nelze schválit. Rozdílny obnos faktury a rozúčtování." BigDecimal sto = new BigDecimal(100.00); BigDecimal rozdil = obnosFaktury.subtract(obnosNum02); rozdil = rozdil.abs(); BigDecimal procento = rozdil.divide(obnosFaktury, 2, RoundingMode.HALF_DOWN).multiply(sto); procento = procento.abs(); if (rozdil.compareTo(rozdilMax) > 0) { chyba = "- nelze schválit. Rozdílný obnos faktury a rozúčtování."; retObject.setActionCorrectlyDone(false); retObject.setChoiceToSetWf(OfwSplnenoChoices.OfwSplnenoChoice.NESPLNENO); retObject.setRetString(chyba); } if (procento.compareTo(rozdilProc) > 0) { chyba = "- nelze schválit. Rozdílný obnos faktury a rozúčtování."; retObject.setActionCorrectlyDone(false); retObject.setChoiceToSetWf(OfwSplnenoChoices.OfwSplnenoChoice.NESPLNENO); retObject.setRetString(chyba); } } } catch (Exception e) { if (!byloTransactionActive) { tx.rollback(); } retObject.setActionCorrectlyDone(false); retObject.setChoiceToSetWf(OfwSplnenoChoices.OfwSplnenoChoice.NESPLNENO); retObject.setRetString("Bylo exception"); retObject.setException(e); throw new RuntimeException(e); } } } return retObject; } === 4.4.1. WF a kontrola správnosti schválení makrem 2 === Makro kontroluje zda je vyplněn alespoň jeden řádek návrhu čerpání rozpočtu (v tabulce OFWDT). {{:orsoftopen:spravais:workshop:groovymakra:image71.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image72.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.rmi.RemoteException; import cz.ortex.apilogic.o0.workflow.OfwUtil; import cz.ortex.model.Ofwdt; import cz.ortex.model.Ofwk; import cz.ortex.model.PpfHl; import cz.ortex.implutil.o0.HibernateUtil; import java.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; import cz.ortex.apilogic.o0.workflow.OfwRetObject; import cz.ortex.apilogic.o0.workflow.OfwSplnenoChoices; import org.apache.commons.beanutils.ConvertUtils; import cz.ortex.util.o0.O0StringUtil; public OfwRetObject stepActionRun(PpfHl entity, Ofwk ofwk, OfwUtil.OfwActionRunParams runParams, O0Session o0Session) { OfwRetObject retObject = new OfwRetObject(); retObject.setActionCorrectlyDone(true); String chyba = ""; if (entity != null) { Session session = HibernateUtil.getCurrentSession(); Transaction tx = session.getTransaction(); boolean byloTransactionActive = tx.isActive(); try { if (!byloTransactionActive) { tx.begin(); } String nazevTab = "PpfhlRozp"; Criteria c = session.CriteriaUtil.createCriteria(session, Ofwdt.class); c.add(Restrictions.eq("nazevtab", nazevTab.trim())); c.add(Restrictions.eq("casttab", " ")); c.add(Restrictions.eq("ofwkIdpk", ofwk.getIdpk())); List ofwdtList = c.list(); for (int i = 0; i < ofwdtList.size(); i++) { Ofwdt ofwdt = ofwdtList.get(i); if (ofwdt != null) { if (ofwdt.getNazevtab().trim().equals(nazevTab.trim())) { if (ofwdt.getHodnota10() == null || ofwdt.getHodnota10().trim().length() == 0) { chyba = " - prázdný oddíl v rozúčtování"; retObject.setActionCorrectlyDone(false); retObject.setChoiceToSetWf(OfwSplnenoChoices.OfwSplnenoChoice.NESPLNENO); retObject.setRetString(chyba); break; } } } } if (!byloTransactionActive) { tx.commit(); } } catch (Exception e) { if (!byloTransactionActive) { tx.rollback(); } retObject.setActionCorrectlyDone(false); retObject.setChoiceToSetWf(OfwSplnenoChoices.OfwSplnenoChoice.NESPLNENO); retObject.setRetString("Bylo exception"); retObject.setException(e); throw new RuntimeException(e); } } return retObject; } === 4.4.2. WF a dotažení obnosu do udaje WF včetně vodících null === 1) Takto je plnění u většiny zákazníků – na Typu postupu se řekne, jaký údaj ze schvalovaného dokladu se má umístit do WF údajů. {{:orsoftopen:spravais:workshop:groovymakra:image73.png?700}} 2) Takto lze plnit údaj pomocí makra, kde si změníte způsob naplnění {{:orsoftopen:spravais:workshop:groovymakra:image74.png?700}} 3) Makro vypadá nějak takto {{:orsoftopen:spravais:workshop:groovymakra:image75.png?700}} A zde je změna uložení – u obnosu faktury se doplní zepředu nuly na nějaký „rozumný“ počet míst {{:orsoftopen:spravais:workshop:groovymakra:image76.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.text.DecimalFormat; // metoda vrací string, max. 50 znaků pro Doplňkovou hodnotu u Typu postupu // pro každou Doplňkovou hodnotu je třeba mít jedno makro String hodnota(Object[] objects, O0Session o0Session) { //zde vypište kód Object primRecord = objects[0]; String hodnota = ""; if (primRecord != null) { if (primRecord.getObnosFakt() != null) { BigDecimal bigDecimal = primRecord.getObnosFakt(); DecimalFormat df = new DecimalFormat("0000000000000000.00"); hodnota = df.format(bigDecimal); } } return hodnota; } 4) A v zobrazení je třeba ty úvodní zase odstranit. Jinak tam budou vidět {{:orsoftopen:spravais:workshop:groovymakra:image77.png?700}} 5) A to se udělá zase makrem na sloupci {{:orsoftopen:spravais:workshop:groovymakra:image78.png?700}} import cz.ortex.model.Ofwk; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.model.Osoby; Object getCellValue(Ofwk entity, Object dotahovane) { if (entity != null) { Character znak = '0'; return O0StringUtil.lTrimByChar(entity.getTrideni1(), znak); } return " "; } 6) Nebo zobrazení změnou textového pole na číselné {{:orsoftopen:spravais:workshop:groovymakra:image79.png?700}} === 4.4.3. WF a dotažení datumu do udaje WF ve formátu RRRRMMDD === 1) Takto je plnění u většiny zákazníků – na Typu postupu se řekne, jaký údaj ze schvalovaného dokladu se má umístit do WF údajů. {{:orsoftopen:spravais:workshop:groovymakra:image80.png?700}} Datum se doplní do WF ve formátu DD.MM.RRRR 2) Takto lze plnit údaj pomocí makra, kde si změníte způsob naplnění {{:orsoftopen:spravais:workshop:groovymakra:image81.png?700}} 3) Makro vypadá nějak takto {{:orsoftopen:spravais:workshop:groovymakra:image82.png?700}} A zde je změna uložení – u datumu splatnosti faktury se změní uložení na RRRRMMDD {{:orsoftopen:spravais:workshop:groovymakra:image83.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.util.o0.O0DateUtil; import org.apache.commons.beanutils.ConvertUtils; // metoda vrací string, max. 50 znaků pro Doplňkovou hodnotu u Typu postupu // pro každou Doplňkovou hodnotu je třeba mít jedno makro String hodnota(Object[] objects, O0Session o0Session) { //zde vypište kód Object primRecord = objects[0]; String hodnota = "00000000"; if (primRecord != null) { if (primRecord.getDatSplatnost() != null) { Date datum = primRecord.getDatSplatnost(); String hodn = O0DateUtil.dateToString(datum); if (O0StringUtil.notBlank(hodn)) { hodnota = hodn.substring(6,10) + hodn.substring(3,5) + hodn.substring(0,2);; } } } return hodnota; } 4) A v zobrazení je třeba zase změní zobrazení na DD.MM.RRRR {{:orsoftopen:spravais:workshop:groovymakra:image84.png?700}} 5) A to se udělá zase makrem na sloupci {{:orsoftopen:spravais:workshop:groovymakra:image85.png?700}} import cz.ortex.model.Ofwk; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.model.Osoby; Object getCellValue(Ofwk entity, Object dotahovane) { if (entity != null) { if (O0StringUtil.notBlank(entity.getTrideni5())) { return entity.getTrideni5().substring(6,8) + "." + entity.getTrideni5().substring(4,6) + "." + entity.getTrideni5().substring(0,4) } } return " "; } === 4.4.4. Pojmenování dokumentu === Makro vrací jméno dokumentu pro uložení. Lze kombinovat s pořadím. {{:orsoftopen:spravais:workshop:groovymakra:image86.png?700}}{{:orsoftopen:spravais:workshop:groovymakra:image87.png?700}}{{:orsoftopen:spravais:workshop:groovymakra:image88.png?700}}{{:orsoftopen:spravais:workshop:groovymakra:image89.png?700}} Zde je vzorové systémové makro: {{:orsoftopen:spravais:workshop:groovymakra:image90.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.rmi.RemoteException; import java.math.BigDecimal; import cz.ortex.model.Oeldok; // Vzorové makro pro podání jména dokumentu // pro použití jako uživatelské přejmenovat na groo... String jmenoDokumentu(Object[] objects, O0Session o0Session) { String vysl = ""; Oeldok oeldok = null; Object entity = objects[0]; if (objects.length > 1) { oeldok = objects[1]; } if (entity != null) { vysl = "nove_jmeno"; } return vysl; } ==== 4.5. Práce s browsem ==== **Poznámka – pro doplnění sloupce browsu, který je plněn makrem, je v Dotahovaných k tomuto účelu připraven atribut „zzmakro“. ** === 4.5.1. Obarvení browsu pomocí SQL === Makro vykonává na serveru, kontroluje se na klientu a tak je třeba místo import cz.ortex.implutil.o0.HibernateUtil; použít celou cestu až při volání Session session = cz.ortex.implutil.o0.HibernateUtil.getCurrentSession(); {{:orsoftopen:spravais:workshop:groovymakra:image91.png?700}} import java.awt.Color; import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import java.rmi.RemoteException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.query.NativeQuery; import cz.ortex.implutil.o0.HibernateUtil; import cz.ortex.model.PpfHl; Color getBackgroundColor(Object entity, Object dotahovane) { //zde vypiste kod } Color getForegroundColor(Object entity, Object dotahovane) { //zde vypiste kod BigDecimal sumaSkut = BigDecimal.ZERO; if (entity != null) { if (entity.getO6a() != null) { Session session = HibernateUtil.getCurrentSession(); Transaction transaction = session.getTransaction(); boolean byloTransactionActive = transaction.isActive(); if (!byloTransactionActive) { transaction.begin(); } if (transaction.isActive()) { String testDotaz = "select sum(obnos_tuzem) from PPF_HL where cf_o6a = " + entity.getO6a().getDkaNr() + " group by cf_o6a"; NativeQuery sqlQuery = session.createNativeQuery(testDotaz); Object hodnota = (Object) sqlQuery.uniqueResult(); if (hodnota != null) { if (hodnota.getClass().getSimpleName().equals("BigDecimal")) { sumaSkut = (BigDecimal) hodnota; } } } if (!byloTransactionActive) { transaction.rollback(); } if (sumaSkut.compareTo(new BigDecimal("100000.00"))> 0) { return new Color(255,0,0); } } === 4.5.2. Makro pro dotažení WF, které je Vráceno === Nad přijatými fakturami {{:orsoftopen:spravais:workshop:groovymakra:image92.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image93.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import java.rmi.RemoteException; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.query.NativeQuery; import cz.ortex.implutil.o0.HibernateUtil; import java.util.List; import cz.ortex.model.PpfHl; import cz.ortex.model.Ofwk; import cz.ortex.model.Osoby; Object getCellValue(PpfHl entity, Object dotahovane) { String vysl = " "; if ((entity != null) && (entity.getDatOdsouhlaseni() == null) && (entity.getDatPredani() != null)) { Session session = HibernateUtil.getCurrentSession(); Transaction transaction = session.getTransaction(); boolean byloTransactionActive = transaction.isActive(); if (!byloTransactionActive) { transaction.begin(); } if (transaction.isActive()) { String testDotaz = "select ofwk.idpk from OFWO ofwo join OFWK ofwk on ofwk.ofwp_idpk = ofwo.ofwp_idpk join OFWA ofwa on ofwa.idpk = ofwk.ofwa_idpk where (ofwa.aktivita = 'ZNOVU') and (ofwk.splneno = 'n') and (ofwo.stav = '1') and (ofwo.obj_name = 'PpfHl') and (ofwo.obj_idpk = " + entity.getIdpk() + " )"; NativeQuery sqlQuery = session.createNativeQuery(testDotaz); List list = sqlQuery.getResultList(); for (Object l : list) { if (l != null) { vysl = "Ano"; } } } if (!byloTransactionActive) { transaction.rollback(); } } return vysl; } === 4.5.3. Makro pro dotažení jména aktuálního schvalovatele ve WF === import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.model.PpfHl; import cz.ortex.model.Ofwk; import cz.ortex.model.Osoby; import cz.ortex.impldao.o0.workflow.OfwkDaoImpl; Object getCellValue(PpfHl entity, Object dotahovane) { String vysl = " "; if ((entity != null) && (entity.getDatOdsouhlaseni() == null)) { OfwkDaoImpl ofwkDaoImpl = new OfwkDaoImpl(); Ofwk ofwk = ofwkDaoImpl.aktualniKrok(entity, "PPFHL"); if (ofwk != null) { Osoby osoby = null; osoby = (Osoby) OEntityUtil.getRecordByParam(Osoby.class.getCanonicalName(), "idpk", ofwk.getUcastnikIdpk()); if (osoby != null) { return osoby.getJmPrijm().trim() + " " + osoby.getJmJmeno().trim(); } } } return vysl; } === 4.5.4. Makro dotažení obnosu faktury z rozúčtování === {{:orsoftopen:spravais:workshop:groovymakra:image94.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image95.png?700}} import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.rmi.RemoteException; import cz.ortex.apilogic.o0.workflow.OfwUtil; import java.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; import java.rmi.RemoteException; import cz.ortex.apidao.p0.ucto.PucnDao; import cz.ortex.model.PpfHl; import cz.ortex.impldao.p0.ucto.PucnDaoImpl; BigDecimal obnosPpfhl(Object[] objects, O0Session o0Session) { //zde vypište kód BigDecimal obnosFa = BigDecimal.ZERO; PpfHl ppfhl = (PpfHl) objects[0]; if (ppfhl != null) { try { PucnDao dao = (PucnDao) OEntityUtil.getServiceByName(OEntityUtil.OServiceType.dao, "pucnDao"); if (dao != null) { obnosFa = dao.getObnosFakturovanoVcetneZalohForPpfHlWorkflow(ppfhl); } } catch (RemoteException ex) { Logger.getLogger(PpfHlPanel.class.getName()).log(Level.SEVERE, null, ex); } } return obnosFa; } === 4.5.5. Makro dotažení seznamu čísel faktury k objednávce === import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.OEntityUtil; import java.rmi.RemoteException; import cz.ortex.model.PpfHl; import cz.ortex.model.Nq10; import cz.ortex.util.o0.O0StringUtil; import java.math.BigDecimal; import java.math.RoundingMode; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.query.NativeQuery; import cz.ortex.implutil.o0.HibernateUtil; import java.util.List; import org.hibernate.type.StandardBasicTypes; Object getCellValue(Nq10 entity, Object dotahovane) { String vysl = "FD:"; vysl = ""; if ((entity != null) && (entity.getObje() != null)) { Session session = HibernateUtil.getCurrentSession(); Transaction transaction = session.getTransaction(); boolean byloTransactionActive = transaction.isActive(); if (!byloTransactionActive) { transaction.begin(); } if (transaction.isActive()) { // String testDotaz = "select cis_dokl from PPF_HL where (objednavka like '%" + entity.getObje().trim() + "%')"; String testDotaz = "select cis_dokl from PPF_HL ppf left outer join O0ZAZNVAZ o0zaznvaz on (o0zaznvaz.trida = 'PpfHl') and (o0zaznvaz.name_obj = 'Nq10') and (o0zaznvaz.idpk_obj = " + entity.getIdpk() + " ) where (ppf.objednavka like '%" + entity.getObje().trim() + "%') or (ppf.idpk = o0zaznvaz.id_zaznamu)"; NativeQuery sqlQuery = session.createNativeQuery(testDotaz); sqlQuery.addScalar("cis_dokl", StandardBasicTypes.STRING); List list = sqlQuery.getResultList(); if (list != null) { for (Object l : list) { if (l != null) { if (String.class.isInstance(l)) { String cObj = (String) l; if (O0StringUtil.notBlank(vysl)) { vysl = vysl.trim() + ", "; } vysl = vysl.trim() + " " + cObj.trim(); } } } } } if (!byloTransactionActive) { transaction.rollback(); } } return vysl; } === 4.5.6. Dotažení do browsu s použitím entity z volajícího (nadřazeného) wrapperu === Makro pracuje s hodnotami v dotahovaných: - getPredavajiciClass() - Vrací entitní třídu z předávajícího wrapperu pro groovy makro cellValue - getPredavajiciId() - Vrací id entity z předávajícího wrapperu pro groovy makro cellValue {{:orsoftopen:spravais:workshop:groovymakra:image96.png?700}} import cz.ortex.util.o0.OEntityUtil; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.model.PpfHl; import cz.ortex.model.Givazobj; import java.math.BigDecimal; import cz.ortex.apidao.g0.GivazobjDao; Object getCellValue(PpfHl entity, Object dotahovane) { BigDecimal obnosFa = BigDecimal.ZERO; if (entity != null) { obnosFa = entity.getObnosTuzem(); if (dotahovane != null) { if (dotahovane.getPredavajiciClass() != null) { if (dotahovane.getPredavajiciId() != null) { GivazobjDao givazobjDao = (GivazobjDao) OEntityUtil.getServiceByName(OEntityUtil.OServiceType.dao, GivazobjDao.NAME); if (givazobjDao != null) { Givazobj givazobj = givazobjDao.getEntityByParam("Giia", dotahovane.getPredavajiciId(), "PpfHl", entity.getIdpk()); if (givazobj != null) { if (givazobj.getCastka() != null) { obnosFa = givazobj.getCastka(); } } } } } } } return obnosFa; } ==== 4.6. Práce s detailem ==== === 4.6.1. Zobrazení obrázku === Makro načte obrázek dle zadání a zobrazí ho v poli „gobrazek“ {{:orsoftopen:spravais:workshop:groovymakra:image97.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image98.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.O0StringUtil; import cz.ortex.gui.o0.eldoc.OeldokWrapper; import javax.swing.ImageIcon; GroovyBrowsePar noEditDetail(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod if (entity != null) { HashMap componentValues = new HashMap(); // zobrazi prvni připojený obrázek druhu MAJ_BJ String bI = ""; if (O0StringUtil.notBlank(entity.getIko())) { bI = OeldokWrapper.podejNahledIko("MAJ_OBJ",entity.getIko(), 200); } componentValues.put("gobrazek", new ImageIcon(bI)); groovyBrowsePar.setComponentValues(componentValues); return groovyBrowsePar; } } === 4.6.2. Zobrazení obrázku === Makro vytvoří čárový kód a zobrazí ho v poli „gobrck“ {{:orsoftopen:spravais:workshop:groovymakra:image99.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image100.png?700}} import cz.ortex.groovy.GroovyBrowsePar; import cz.ortex.util.o0.O0Data; import cz.ortex.util.o0.O0Session; import cz.ortex.util.o0.O0StringUtil; import javax.swing.ImageIcon; import java.awt.image.BufferedImage; import net.sourceforge.barbecue.Barcode; import net.sourceforge.barbecue.BarcodeException; import net.sourceforge.barbecue.BarcodeFactory; import net.sourceforge.barbecue.BarcodeImageHandler; import net.sourceforge.barbecue.output.OutputException; GroovyBrowsePar noEditDetail(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod if (entity != null) { HashMap componentValues = new HashMap(); // zobrazi čárový kód - dle nastavení - zde Code128 z inventářního čísla try { Barcode barcode; barcode = BarcodeFactory.createCode128B(String.valueOf(entity.getInv())); barcode.setBarHeight(30); barcode.setBarWidth(2); //barcode.setResolution(300); BufferedImage bCK = BarcodeImageHandler.getImage(barcode); componentValues.put("gobrck", new ImageIcon(bCK)); } catch (BarcodeException ex) { Logger.getLogger(G0zphValidator.class.getName()).log(Level.SEVERE, null, ex); } catch (OutputException ex) { Logger.getLogger(G0zphValidator.class.getName()).log(Level.SEVERE, null, ex); } groovyBrowsePar.setComponentValues(componentValues); return groovyBrowsePar; } } === 4.6.3. Dotažení poznámky WF do detailu === Zde příklad pro Došlé faktury: {{:orsoftopen:spravais:workshop:groovymakra:image101.png?700}} {{:orsoftopen:spravais:workshop:groovymakra:image102.png?700}} import cz.ortex.apidao.o0.workflow.OfwoDao; import cz.ortex.model.Ofwo; GroovyBrowsePar noEditDetail(Object entity, O0Data dotahovane, GroovyBrowsePar groovyBrowsePar, O0Session o0session, Object browsePanel) { //zde vypiste kod String wfPoznamka = ""; if (entity != null) { OfwoDao ofwoDao = (OfwoDao) AppContext.getDaoService(OfwoDao.NAME); if (ofwoDao != null) { Ofwo ofwo = ofwoDao.getLastOfwoByTargetRecord(entity, "PPFHL", false); if (ofwo != null ) { wfPoznamka = ofwoDao.pozHistoriePozn(ofwo); } } } HashMap componentValues = new HashMap(); componentValues.put("wfPozn", wfPoznamka); groovyBrowsePar.setComponentValues(componentValues); return groovyBrowsePar; }