Obsah

Groovy makra v Openu

3. Pokračování maker

3.1. Barvy v browse

Nastavují se pomocí tlačítka Groovy makra

import java.awt.Color;
import cz.ortex.util.o0.OEntityUtil;
import org.apache.commons.beanutils.PropertyUtils;
import cz.ortex.util.o0.O0Session;
import cz.ortex.model.Nq10;
 
Color getForegroundColor(Nq10 entity, Object dotahovane) {
Character storno = entity.getStorno();
  switch (storno) {
     case 's':
      return new Color(255,0,0);
      // break;
  }
  Character pschvaleni = entity.getPschvaleni();
  switch (pschvaleni) {
     case '1':
     //  return new Color(255,0,0);
       return new Color(0,128,0);
     case '3':
       return new Color(0,0,255);
     case '2':
       return new Color(255,0,0);
     default:
       return Color.BLACK;
  }
}

3.2. Kontroly – práce se záznamem

import cz.ortex.groovy.GroovyBrowsePar;
import cz.ortex.util.o0.O0Data;
import cz.ortex.util.o0.O0Session;
import cz.ortex.util.o0.AppContext;
import cz.ortex.model.Nq10;
import cz.ortex.model.O6a;
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 ("o1ico0".equals(fieldName)) {
               groovyBrowsePar.setFocusName("platep");
  }
  if ("o1firma0".equals(fieldName)) {
               groovyBrowsePar.setFocusName("platep");
  }
  if ("o1nazev0".equals(fieldName)) {
               groovyBrowsePar.setFocusName("platep");
  }
  if ("kodDo".equals(fieldName)) {
    Integer kodDo = entity.getKodDo();
    if ((kodDo != null) && ((kodDo == 400) || (kodDo == 410))) {
      O6aDao o6aDao = (O6aDao) AppContext.getDaoService("o6aDao");
     if (o6aDao != null) {
       O6a o6a = o6aDao.getEntityByDkaNrCl(999999999);
       if (o6a != null) {
        entity.setO6aByO1firma(o6a);
        HashMap<String, Serializable> componentValues = new HashMap();
       //componentValues.put("o1ico0", "999999999");
        componentValues.put("o1ico0", o6a.getDkaIco1());
        componentValues.put("o1firma0", o6a.getDkaNr());
        componentValues.put("o1nazev0", o6a.getDkaKurz());
       //componentValues.put("o1nazev0", "SLL S.P. JANSKE LAZ.");
        groovyBrowsePar.setComponentValues(componentValues);
       }
     }
    }
  }
  return groovyBrowsePar;
}
 
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
 
}

3.3. Tlačítka pomocí Groovy

Přidání tlačítek, které něco vykonají:

3.3.1. Propis znaku na entitu

- Varianta přes speciální metodu

import cz.ortex.model.Nq10;
import java.util.logging.Level;
import java.util.logging.Logger;
import cz.ortex.util.o0.O0JasperParam;
import cz.ortex.util.o0.OEntityUtil;
import cz.ortex.util.o0.O0StringUtil;
import cz.ortex.apilogic.l0.expedice.LdokladParam;
import cz.ortex.apidao.l0.expedice.LdokladInterface;
import cz.ortex.components.OptionPane;
import cz.ortex.util.o0.AppContext;
 
public void priznaky(Nq10 currentRecord, Object dotahovane) {
    Character priznak = 'U';
    Character stav = '1';
    LdokladParam ldokladParam = new LdokladParam();
    ldokladParam.setLqo0((Nq10) currentRecord);
    ldokladParam.setPrizTabulka("nq10");
    ldokladParam.setPrizCislo(priznak);
    ldokladParam.setPrizZnak(stav);
    Boolean vysl = null;
    LdokladInterface ldoklad = (LdokladInterface) AppContext.getService("ldokladService");
    if (ldoklad != null) {
      vysl = ldoklad.zmenPriznaky(ldokladParam);
    }
    if (vysl) {
        OptionPane.createInfoDialog("", "Proběhlo nastavení Příznaku U = 1");
    } else {
        OptionPane.createErrorDialog("", "Nastavení příznaku se nepovedlo!");
    }
}

3.3.2. Propis znaku na entitu

- Varianta přes obecnější metodu

import cz.ortex.model.Nq10;
import java.util.logging.Level;
import java.util.logging.Logger;
import cz.ortex.util.o0.O0JasperParam;
import cz.ortex.util.o0.OEntityUtil;
import cz.ortex.util.o0.O0StringUtil;
import cz.ortex.apilogic.l0.expedice.LdokladParam;
import cz.ortex.apidao.l0.expedice.LdokladInterface;
import cz.ortex.apidao.l0.expedice.Lqo0Dao;
import cz.ortex.components.OptionPane;
import cz.ortex.util.o0.AppContext;
 
public void priznaky(Nq10 currentRecord, Object dotahovane) {
    Character priznak = 'U';
    Character stav = '0';
    Short stav2 = 2;
    LdokladParam ldokladParam = new LdokladParam();
    ldokladParam.setLqo0((Nq10) currentRecord);
    ldokladParam.setPrizTabulka("nq10");
    ldokladParam.setPrizCislo(priznak);
    ldokladParam.setPrizZnak(stav);
//    Boolean vysl = null;
    Lqo0Dao nq10Dao = (Lqo0Dao) AppContext.getDaoService("nq10Dao");
    if (nq10Dao != null) {
      currentRecord.setPexpU(stav2);
      nq10Dao.prepisLqo0(currentRecord);
    }
}

3.4. Tisky – úprava jména sestavy

Úprava jména sestavy s doplněním podle řeči v adrese dodavatele

import cz.ortex.gui.o0.Tiskac;
import cz.ortex.gui.o0.TiskacExec;
import cz.ortex.util.o0.O0JasperParam;
import cz.ortex.util.o0.O0StringUtil;
import cz.ortex.util.o0.O0Session;
import cz.ortex.util.o0.OEntityUtil;
import cz.ortex.model.Nq10;
import cz.ortex.apidao.o0.admin.O0menuTiskDao;
import cz.ortex.util.o0.AppContext;
 
// pro Tiskac
 
String Sestava(Tiskac tiskac, O0Session o0Session) {
     String sestava = "";
     if (tiskac != null) {
       if (tiskac.getBrowsePanel().getBrowseModel().getCurrentRecord() != null) {
         Nq10 nq10 = (Nq10) tiskac.getBrowsePanel().getBrowseModel().getCurrentRecord();
         if (nq10.getO6aByO1firma() != null) {
           if (nq10.getO6aByO1firma().getO6r() != null) {
             if (nq10.getO6aByO1firma().getO6r().getDksSp() != null) {
               if (!nq10.getO6aByO1firma().getO6r().getDksSp().equals("CS")) {
//                sestava = "reports/nq1_1301" + nq10.getO6aByO1firma().getO6r().getDksSp().trim() + ".jrxml";
                  sestava = "reports/nq1_1301EN.jrxml";
                  O0menuTiskDao tiskDao = (O0menuTiskDao)
                                          AppContext.getDaoService(O0menuTiskDao.NAME);
//                O0menuTiskDao tiskDao = (O0menuTiskDao) OEntityUtil.getServiceByName(OEntityUtil.OServiceType.dao, O0menuTiskDao.NAME);
                  if (tiskDao != null) {
                    String infoSestava = tiskDao.getSestavaInfoCl(sestava,null);
                    if (infoSestava == null) {
                      sestava = "";
                    }
                  }
                }
              }
            }
          }
       }
     }
    return sestava;
}
 
Boolean  BeforeTisk(Tiskac tiskac, O0Session o0Session) {
     return true;
}
 
Boolean  AfterGa(Tiskac tiskac, O0Session o0Session) {
    return true;
}
 
Boolean  AfterTisk(Tiskac tiskac, O0Session o0Session) {
    return true;
}
 
// pro OR-CZ TiskUtilExec
Boolean  OsobyVypisBeforeTisk(Tiskac tiskac) {
     return true;
}
 
Boolean  OsobyVypisAfterTisk(Tiskac tiskac) {
    return true;
}

3.5. Workflow

3.5.1. Vypočtení absolutní hodnoty

Pro podmínku spuštění postupu WF

import cz.ortex.util.o0.O0Session;
import cz.ortex.util.o0.OEntityUtil;
import java.rmi.RemoteException;
import java.math.BigDecimal;
import cz.ortex.model.PpfHl;
 
  String obnosAbs(Object[] objects, O0Session o0Session) {
    String vysl = "0";
    PpfHl entity = (PpfHl) objects[0];
    if (entity != null) {
      if (entity.getObnosTuzem() != null) {
        vysl = entity.getObnosTuzem().abs().toString();
      }
    }
    return vysl;
  }

3.5.2. Vyhodnocení překročení osobního limitu u objednávky

import cz.ortex.util.o0.O0Session;
import cz.ortex.util.o0.OEntityUtil;
import java.rmi.RemoteException;
import java.math.BigDecimal;
import java.util.logging.Level;
import java.util.logging.Logger;
import cz.ortex.model.Nq10;
import cz.ortex.model.Ofwos;
import cz.ortex.impldao.o0.workflow.OfwosDaoImpl;
 
String lzeSchvalovat(Object[] objects, O0Session o0Session) {
  //zde vypište kód
    String vysl = "true";
    BigDecimal obnosFa = BigDecimal.ZERO;
    Integer oscis = o0Session.getUserNumber();
    Nq10 nq10 = (Nq10) objects[0];
    if (nq10 != null) {
      try {
         Ofwos ofwos = OfwosDaoImpl.getEntityByOscis(oscis, null, null, o0Session);
         if (ofwos != null && ofwos.getOsobniLimit() != null && nq10.getDzakl() != null) {
           if (ofwos.getOsobniLimit().compareTo(nq10.getDzakl()) >= 0) {
             vysl = "false";
           }
         }
      } catch (RemoteException ex) {
        Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
      }
    }
    return vysl;
}

3.5.3. Vyhodnocení dalších schvalovatelů podle schvalovací struktury

- Pro Objednávky

import cz.ortex.util.o0.O0Session;
import cz.ortex.util.o0.OEntityUtil;
import java.rmi.RemoteException;
import java.math.BigDecimal;
import java.util.logging.Level;
import java.util.logging.Logger;
import cz.ortex.model.Nq10;
import cz.ortex.model.PpfHl;
import cz.ortex.model.Ofwos;
import cz.ortex.model.Ofwkv;
 
boolean lzePouzit(Object entity, Ofwos ofwos, Ofwkv ofwkv, Ofwos prevOfwos, O0Session o0Session) {
  //zde vypište kód
    boolean vysl = false;
    if (entity instanceof PpfHl) {
      Nq10 nq10 = (Nq10) entity;
      try {
         if (ofwos != null && ofwos.getOsobniLimit() != null && nq10.getDzakl() != null) {
           if (ofwos.getOsobniLimit().compareTo(nq10.getDzakl()) <= 0) {
             vysl = true;
           } else {
             if (prevOfwos != null && prevOfwos.getOsobniLimit() != null && nq10.getDzakl() != null) {
               if (prevOfwos.getOsobniLimit().compareTo(nq10.getDzakl()) <= 0) {
                 vysl = true;
               }
             } else {
               if (prevOfwos == null) {
                 vysl = true;
               }
             }
           }
         } else {
           vysl = true;
         }
      } catch (Exception ex) {
        Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
      }
    }
    return vysl;
}

- Pro Přijaté faktury

import cz.ortex.util.o0.O0Session;
import cz.ortex.util.o0.OEntityUtil;
import java.rmi.RemoteException;
import java.math.BigDecimal;
import java.util.logging.Level;
import java.util.logging.Logger;
import cz.ortex.model.Nq10;
import cz.ortex.model.PpfHl;
import cz.ortex.model.Ofwos;
import cz.ortex.model.Ofwkv;
 
boolean lzePouzit(Object entity, Ofwos ofwos, Ofwkv ofwkv, Ofwos prevOfwos, O0Session o0Session) {
  //zde vypište kód
    boolean vysl = false;
    if (entity instanceof PpfHl) {
           PpfHl ppfHl = (PpfHl) entity;
        try {
          if (ofwos != null && ofwos.getOsobniLimit() != null && ppfHl.getObnosFakt() != null) {
            if (ofwos.getOsobniLimit().compareTo(ppfHl.getObnosFakt()) <= 0) {
              vysl = true;
            } else {
              if (prevOfwos != null && prevOfwos.getOsobniLimit() != null && ppfHl.getObnosFakt() != null) {
                if (prevOfwos.getOsobniLimit().compareTo(ppfHl.getObnosFakt()) <= 0) {
                  vysl = true;
                }
              } else {
                  if (prevOfwos == null) {
                      vysl = true;
                  }
              }
            }
          } else {
            vysl = true;
          }
        } catch (Exception ex) {
          Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
        }
    }
    return vysl;
}

3.5.4. Propis hodnoty na kroku

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.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.query.NativeQuery;
import cz.ortex.implutil.o0.HibernateUtil;
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;
 
OfwRetObject proZapis(Object entity, Ofwk ofwk, OfwUtil.OfwActionRunParams runParams, O0Session o0Session) {
    OfwRetObject retObject = new OfwRetObject();
    retObject.setActionCorrectlyDone(true);
    String chyba = "";
    if (entity != null) {
      if (entity.getIdpk() != null) {
        try {
          Session session = HibernateUtil.getCurrentSession();
          Transaction transaction = session.getTransaction();
          boolean byloTransactionActive = transaction.isActive();
          if (!byloTransactionActive) {
            transaction.begin();
          }
          if (transaction.isActive()) {
            String testDotaz =  "update NQ10 set prodejce = (select osoby.oscis from OFWK ofwk ";
                   testDotaz += "inner join OSOBY osoby on osoby.idpk = ofwk.ucastnik_idpk ";
                   testDotaz += "where (ofwk.ofwp_idpk = " + ofwk.getOfwp().getIdpk() + ") and
                                 (ofwk.poradi = 2)) ";
//                   testDotaz += "where idpk =  18813";
                   testDotaz += "where idpk = " + entity.getIdpk();
            NativeQuery<String> sqlQuery = session.createNativeQuery(testDotaz);
            sqlQuery.executeUpdate();
            chyba = "OK";
          }
          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;
}

3.5.5. Spuštění WF – kontrola FD na AK

Podmínka pro spuštění WF – zda objednávka AK je rovna došlé faktuře

import cz.ortex.util.o0.O0Session;
import cz.ortex.util.o0.OEntityUtil;
import java.rmi.RemoteException;
import cz.ortex.model.PpfHl;
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;
 
String lzeSchvalovat(Object[] objects, O0Session o0Session) {
  //zde vypište kód
  PpfHl ppfhl = (PpfHl) objects[0];
  String vysl = "false";
  String chyba = "";
  BigDecimal rozdilMax = new BigDecimal(1.00);
  BigDecimal rozdilProc = new BigDecimal(1.00);
 
  if (O0StringUtil.notBlank(ppfhl.getObjednavka())) {
    Session session = HibernateUtil.getCurrentSession();
    Transaction transaction = session.getTransaction();
    boolean byloTransactionActive = transaction.isActive();
    if (!byloTransactionActive) {
        transaction.begin();
    }
    if (transaction.isActive()) {
     String testDotaz = "select ak_s_w from ak where (ak_aa = 3) and (ak_anr = " + ppfhl.getObjednavka().trim() + ")";
     NativeQuery<String> sqlQuery = session.createNativeQuery(testDotaz);
     List<String> list = sqlQuery.getResultList();
     for (Object l : list) {
       if (l != null) {
        if (BigDecimal.class.isInstance(l)) {
          BigDecimal objTuzem = (BigDecimal) l;
          if (ppfhl.getObnosTuzem() != null) {
             if (ppfhl.getObnosTuzem().compareTo(objTuzem) == 0) {
                  vysl = "true";
             } else {
               BigDecimal sto = new BigDecimal(100.00);
               BigDecimal rozdil = ppfhl.getObnosTuzem().subtract(objTuzem);
               rozdil = rozdil.abs();
               BigDecimal procento = rozdil.divide(ppfhl.getObnosTuzem(), 2, RoundingMode.HALF_DOWN).multiply(sto);
               procento = procento.abs();
               if (rozdil.compareTo(rozdilMax) > 0) {
                 chyba = "Vetsi nez povoleny rozdil.";
               } else {
                     vysl = "true";
               }
               if (procento.compareTo(rozdilProc) > 0) {
                 chyba = "Vetsi nez povolene procento rozdilu.";
               } else {
                     vysl = "true";
               }
//               System.out.println("Test Makro: objTuzem   = " + objTuzem);
//               System.out.println("Test Makro: obnosTuzem = " + ppfhl.getObnosTuzem());
//               System.out.println("Test Makro: rozdil   = " + rozdil);
//               System.out.println("Test Makro: procento = " + procento);
//               System.out.println(chyba);
             }
          }
        }
       }
     }
    }
    if (!byloTransactionActive) {
        transaction.rollback();
    }
  }
  return vysl;
}

3.5.6. Schválení WF – kontrola vyplněné hodnoty

Na kroku WF je makro, které kontroluje, zda je vyplněna hodnota a lze tedy krok schválit.

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.Ofwk;
import cz.ortex.model.PpfHl;
import cz.ortex.apilogic.o0.workflow.OfwRetObject;
import cz.ortex.apilogic.o0.workflow.OfwSplnenoChoices;
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 = "";
    if (ofwk != null) {
      if (O0StringUtil.isBlank(ofwk.getHodn2())) {
        chyba = "- nelze schválit. Není vyplněna hodnota.";
        retObject.setActionCorrectlyDone(false);
        retObject.setChoiceToSetWf(OfwSplnenoChoices.OfwSplnenoChoice.NESPLNENO);
        retObject.setRetString(chyba);
      } else {
        chyba = "OK";
      }
    }
    return retObject;
}

A výsledek:

3.5.7. Schválení WF – kontrola FD na návrh rozúčtování

Na kroku WF se nastaví makro, které kontroluje, zda lze schválit WF:

Vlastní makro:

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<Ofwdt> 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;
}