예제 #1
0
 private void OKPress() {
   Window owner = win.getOwner();
   if (table.isEditing()) table.removeEditor();
   if (win != null) {
     win.dispose();
     win = null;
   }
   raProcess.runChild(
       owner,
       new Runnable() {
         public void run() {
           performMatching();
         }
       });
   if (total.one == 0 && raProcess.isCompleted())
     JOptionPane.showMessageDialog(
         owner, "Nema stavaka za pokrivanje!", "Poruka", JOptionPane.INFORMATION_MESSAGE);
   else if (total.one > 0)
     JOptionPane.showMessageDialog(
         owner,
         Aus.getNumDep(
                 total.one,
                 "Pokriven " + total.one + " saldo",
                 "Pokrivena " + total.one + " salda",
                 "Pokriveno " + total.one + " salda")
             + " na ukupno "
             + Aus.getNum(total.two, "stavci.", "stavke.", "stavaka."),
         "Poruka",
         JOptionPane.INFORMATION_MESSAGE);
 }
예제 #2
0
  private void performMatching() {
    QueryDataSet sks = null, pok = null;
    Int2 run = new Int2();
    String lastcpar = "";
    total.clear();

    for (int row = 0; row < model.getRowCount(); row++)
      if (model.isRowSelected(row)) {
        MatchableCollection mc = (MatchableCollection) model.getValueAt(row, 0);
        String mkey = mc.getRow(0).getMasterKey();
        String cpar = mkey.substring(0, mkey.indexOf('$'));
        if (!cpar.equals(lastcpar)) {
          if (sks != null && raTransaction.saveChangesInTransaction(new QueryDataSet[] {sks, pok}))
            total = total.add(run);
          run.clear();
          sks = dM.getDataModule().getSkstavke();
          Skstavke.getDataModule()
              .setFilter(
                  Aus.getKnjigCond()
                      .and(Aus.getFreeYearCond())
                      .and(Condition.equal("CPAR", Aus.getNumber(lastcpar = cpar))));
          sks.open();
          pok = Pokriveni.getDataModule().getFilteredDataSet("1=0");
          pok.open();
        }
        PotentialMatch pm = new PotentialMatch();
        for (int i = 0; i < mc.getRowCount(); i++) pm.addStavka(mc.getRow(i));
        for (int i = 0; i < mc.getMatch().getRowCount(); i++) pm.addStavka(mc.getMatch().getRow(i));
        run = run.add(pm.realize(sks, pok));
      }
    if (sks != null && R2Handler.saveChangesInTransaction(new QueryDataSet[] {sks, pok}))
      total = total.add(run);
    dM.getDataModule().getSynchronizer().markAsDirty("pokriveni");
  }
예제 #3
0
 public void globalChangeFont(String defaultFont, String newFont) {
   double ratio;
   String pr =
       frmParam.getParam(
           "sisfun", "globalRatio", "1.0", "Faktor rastezanja reporta zbog promjene fonta");
   if (pr == null || pr.length() == 0) ratio = Aus.getFontHeightRatio(defaultFont, newFont);
   else ratio = Aus.getDecNumber(pr).doubleValue();
   raReportSection s;
   Iterator i = sections.iterator();
   while (i.hasNext()) {
     s = (raReportSection) i.next();
     s.changeFont(defaultFont, newFont, ratio <= 0 ? 1.0 : ratio);
     //      s.enlargeElementsVertical(1.1);
   }
 }
예제 #4
0
 /**
  * Pokrece pilot-beanshell skripte za ubacivanje podataka iz stranih baza Potrebno je prijaviti
  * reportext sa NASLOVOM kao naziv klase za knjizenje, te aplikacijum sisfun npr. IME=1,
  * NASLOV=hr.restart.robno.frmKnjRobno, URL=robnoloader.sql, APP=sisfun i sve skripte sa tim
  * naslovom ce se izvrsiti prije validacija() metode u NASLOV klasi sortirane by IME (pazi string
  * sort!)
  *
  * @return
  */
 private boolean runPreloader() {
   try {
     String cname = this.getClass().getName();
     // executeReport(java.net.URL rep, String title, Window owner)
     QueryDataSet preloaders =
         Reportext.getDataModule()
             .getFilteredDataSet(
                 Condition.whereAllEqual(
                     new String[] {"NASLOV", "APP"}, new String[] {cname, "sisfun"}));
     preloaders.open();
     if (preloaders.getRowCount() == 0) return true;
     preloaders.setSort(new SortDescriptor("IME"));
     for (preloaders.first(); preloaders.inBounds(); preloaders.next()) {
       //
       // raPilot.executeReport(Aus.findFileAnywhere(preloaders.getString("URL")).toURL(),cname,
       // this );
       Interpreter interpreter = new Interpreter();
       Object ret =
           interpreter.eval(
               FileHandler.readFile(
                   Aus.findFileAnywhere(preloaders.getString("URL")).getAbsolutePath()));
       return ((Boolean) ret).booleanValue();
     }
   } catch (Exception e) {
     e.printStackTrace();
     return false;
   }
   return true;
 }
예제 #5
0
 public int getPJ(int cpar) {
   QueryDataSet qds = new QueryDataSet();
   String qStr = "select max(pj) as PJ from pjpar where cpar = " + cpar;
   Aus.refilter(qds, qStr);
   if (qds.getRowCount() > 0) return qds.getInt("PJ");
   return 0;
 }
예제 #6
0
 public double getMatchFactor(MatchableCollection other) {
   if (rows.size() > 1 && other.rows.size() > 1) return getMultiMatch(other);
   if (rows.size() > 1) return other.getMatchFactor(this);
   String brdok = getRow(0).getBrojDok();
   double sim = 0;
   for (int i = 0; i < other.getRowCount(); i++)
     sim +=
         Aus.heuristicCompare(brdok, other.getRow(i).getBrojDok(), raOptimisticMatch.getIgnore());
   if (sim == 0) sim = 0.01;
   return sim / other.getRowCount();
 }
예제 #7
0
 private double getMultiMatch(MatchableCollection other) {
   if (rows.size() > other.rows.size()) return other.getMultiMatch(this);
   double sim = 0;
   for (int j = 0; j < other.getRowCount(); j++) {
     String brdok = other.getRow(j).getBrojDok();
     double best = 0, now;
     for (int i = 0; i < getRowCount(); i++)
       if ((now = Aus.heuristicCompare(brdok, getRow(i).getBrojDok())) > best) best = now;
     sim += best;
   }
   if (sim == 0) sim = 0.01;
   return sim / other.getRowCount();
 }
예제 #8
0
 public boolean Validacija() {
   if (jlrCorg.getText().equals("")) {
     jlrCorg.requestFocus();
     javax.swing.JOptionPane.showMessageDialog(
         this.getWindow(),
         "Obvezatan unos - ORG. JEDINICA !",
         "Greška",
         javax.swing.JOptionPane.ERROR_MESSAGE);
     return false;
   }
   if (rpcskl.getCSKL().equals("")) {
     rpcskl.jrfCSKL.requestFocus();
     javax.swing.JOptionPane.showMessageDialog(
         this.getWindow(),
         "Obvezatan unos - SKLADIŠTE !",
         "Greška",
         javax.swing.JOptionPane.ERROR_MESSAGE);
     return false;
   }
   if (!hr.restart.util.Aus.checkDateRange(jtfPocDatum, jtfZavDatum)) return false;
   if (!rpcart.getCGRART().equals("")
       && (rpcart.getCART().equals("") && rpcart.getCART1().equals(""))
       && !doubleClicked) {
     int grupe =
         javax.swing.JOptionPane.showConfirmDialog(
             this.getWindow(),
             "Ukljuèiti i podgrupe?",
             "Grupe artikala",
             javax.swing.JOptionPane.YES_NO_OPTION);
     if (grupe == javax.swing.JOptionPane.CANCEL_OPTION) return false;
     if (grupe == javax.swing.JOptionPane.NO_OPTION) {
       podgrupe = false;
     } else {
       podgrupe = true;
     }
   }
   return true;
 }
예제 #9
0
  private boolean findAll(int maxDepth, Condition cond) {
    // nadji sve stavke koje zadovoljavaju uvjet, a nisu pokrivene.
    DataSet ds =
        Skstavke.getDataModule()
            .getTempSet(
                Aus.getKnjigCond()
                    .and(cond)
                    .and(Aus.getFreeYearCond())
                    .and(Condition.equal(raSaldaKonti.colPok(), "N")));

    // ako je metoda pozvana iz raProcess sustava, iskoristi ga
    if (!raProcess.isRunning()) ds.open();
    else {
      raProcess.setMessage("Dohvat nepokrivenih stavaka salda konti ...", true);
      raProcess.openScratchDataSet(ds);
    }

    // najprije prevrti cijeli dataset i prebaci sve stavke u MatchRow,
    // te ih napuni u LinkedList iz kojih cemo ih izbacivati kad i ako
    // pronadjemo kombinaciju u kojoj se moze pokriti.
    LinkedList stavke = new LinkedList();
    for (ds.first(); ds.inBounds(); ds.next()) stavke.addLast(new MatchRow(ds));

    // pocni raditi kombinacije. Najprije svaka stavka pojedinacno,
    // onda sve do 'maxDepth' stavki po kombinaciji. Prati i potrosnju
    // objekata da ne predje neku razumnu granicu.
    int slots = 0, collections = 0;
    master.clear();
    for (int depth = 1; depth <= maxDepth; depth++) {
      if (raProcess.isRunning())
        raProcess.setMessage("Provjera moguæeg pokrivanja stupnja " + depth + " ...", false);

      // prodji kroz sve preostale stavke i puni glavnu mapu,
      // koja se sastoji od po jedne mape salda na popis dokumenata za
      // svaku razlicitu kombinaciju cpar$konto$valuta$godina$uloga
      // koja postoji u nadjenim stavkama. Jebeno.
      for (Iterator st = stavke.iterator(); st.hasNext(); ) {
        MatchRow mr = (MatchRow) st.next();
        if (raProcess.isRunning()) raProcess.checkClosing();

        // probaj naci vec postojecu grupu salda za ovaj kljuc ili napravi novu
        SaldoGroup salda = (SaldoGroup) master.get(mr.getMasterKey());
        if (salda == null) master.put(mr.getMasterKey(), salda = new SaldoGroup());

        // Inicijaliziraj listu kombinacija koja ce se kasnije ubaciti u mapu salda.
        // Kombinacije se ne mogu odmah ubacivati u mapu jer se po njoj iterira, pa
        // bi to rezultiralo gadnim kolizijama. Ako je depth 1, onda se napravi
        // kombinacija od samo teukce stavke, inace se prolazi kroz cijelu mapu
        // salda i priprema dodavanje novih kombinacija duljine depth.
        ArrayList toAdd = new ArrayList();
        if (depth == 1) toAdd.add(new MatchableCollection(mr));
        else
          for (Iterator it = salda.slotIterator(); it.hasNext(); ) {
            SaldoSlot ss = (SaldoSlot) it.next();
            if (raProcess.isRunning()) raProcess.checkClosing();

            // prodji koz sve kombinacije u ovom slotu (koje imaju taj saldo)
            // i pripremi dodavanje po jedne nove kombinacije za svaku koja
            // ima depth-1 clanova, i koja je istog tipa kao nova stavka
            // (tip racuni ili uplate), te koja vec nije u toj kombinaciji.
            for (int i = 0; i < ss.getCollectionCount(); i++) {
              MatchableCollection mc = ss.getCollection(i);
              if (mc.checkAdd(mr, depth)) toAdd.add(mc.copyAndExtend(mr));
            }
          }

        // i na kraju ubaci sve pripremljene kombinacije iz liste toAdd
        // u odgovarajuce slotove mape salda.
        slots -= salda.countSlots();
        for (int i = 0; i < toAdd.size(); i++) {
          MatchableCollection mc = (MatchableCollection) toAdd.get(i);
          if (raProcess.isRunning()) raProcess.checkClosing();

          // probaj naci postojeci saldo slot ili napravi novog ako ga nema,
          // te dodaj ovu kombinaciju u njega.
          SaldoSlot ss = (SaldoSlot) salda.getSlot(mc.getMatchSaldo());
          if (ss == null) salda.addSlot(mc.getMatchSaldo(), ss = new SaldoSlot());
          ss.addCollection(mc);
          mc.setOwner(ss);
        }
        slots += salda.countSlots();
        collections += toAdd.size();
        if (collections > 100000) break;
      }
      if (collections > 100000) break;

      // ako se stavka vec nalazi u nekoj kombinaciji koja se moze pokriti,
      // nema potrebe traziti daljnje kombinacije s njom, tj kombinacije s
      // vise clanova. Cilj je da se minimiziraju visestruka pokrivanja.
      for (Iterator st = stavke.iterator(); st.hasNext(); ) {
        MatchRow mr = (MatchRow) st.next();
        if (mr.isMatchable()) st.remove();
      }
    }

    // na kraju balade, u glavnoj mapi imamo mnostvo mapa (za svaki kljuc
    // cpar$konto$valuta$godina$uloga po jedna) u cijim slotovima se
    // potencijalno nalaze kombinacije stavaka koje se mogu medjusobno
    // pokriti. Sve te kombinacije bit ce ponudjene za pokrivanje, grupirane
    // po saldu. No najprije treba izbaciti iz mape sve one slotove kod kojih
    // nema bar po jedna kombinacija tipa uplate i jedna tipa racun.
    for (Iterator it = master.values().iterator(); it.hasNext(); ) {
      SaldoGroup salda = (SaldoGroup) it.next();
      for (Iterator s = salda.slotIterator(); s.hasNext(); ) {
        SaldoSlot ss = (SaldoSlot) s.next();
        if (!ss.isMatchable()) s.remove();
      }
      if (salda.countSlots() == 0) it.remove();
    }

    // medju preostalim mapama probaj naci najbolje matcheve.
    for (Iterator it = master.values().iterator(); it.hasNext(); ) {
      SaldoGroup salda = (SaldoGroup) it.next();
      for (Iterator s = salda.slotIterator(); s.hasNext(); ) {
        SaldoSlot ss = (SaldoSlot) s.next();
        for (int i = 0; i < ss.getCollectionCount(); i++) {
          MatchableCollection mi = ss.getCollection(i);
          mi.findRepresentations();
          double now;
          for (int j = 0; j < ss.getCollectionCount(); j++) {
            MatchableCollection mj = ss.getCollection(j);
            if (mi.isRacunTip() != mj.isRacunTip()
                && (now = mi.getMatchFactor(mj)) > mi.getMatchedFactor()
                && now > mj.getMatchedFactor()
                && now > mi.getMaxMatchStrength()
                && now > mj.getMaxMatchStrength()) mi.setMatch(mj);
          }
        }
      }
      salda.findMarks();
    }
    return master.size() > 0;
  }