Example usage for org.hibernate Query scroll

List of usage examples for org.hibernate Query scroll

Introduction

In this page you can find the example usage for org.hibernate Query scroll.

Prototype

ScrollableResults scroll(ScrollMode scrollMode);

Source Link

Document

Return the query results as ScrollableResults.

Usage

From source file:org.openbravo.advpaymentmngt.utility.FIN_BankStatementImport.java

License:Open Source License

private BusinessPartner matchBusinessPartnerByNameTokens(String partnername, Organization organization) {
    if (partnername == null || "".equals(partnername.trim())) {
        return null;
    }//from ww  w  .ja  v a2s .c  om
    String parsedPartnername = partnername.toLowerCase();
    // Remove exceptions
    for (String eliminate : stringExceptions) {
        parsedPartnername = parsedPartnername.replaceAll(eliminate.toLowerCase(), "");
    }
    StringTokenizer st = new StringTokenizer(parsedPartnername);
    List<String> list = new ArrayList<String>();
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        if (token.length() > 3) {
            list.add(token);
        }
    }
    if (list.isEmpty()) {
        return null;
    }
    final StringBuilder whereClause = new StringBuilder();
    OBContext.setAdminMode();
    ScrollableResults businessPartnersScroll = null;
    try {
        whereClause.append("select b.id as id, b.name as name from ");
        whereClause.append(" BusinessPartner b ");
        whereClause.append(" where (");
        for (String token : list) {
            whereClause.append(
                    " lower(b." + BusinessPartner.PROPERTY_NAME + ") like lower('%" + token + "%') or ");
        }
        whereClause.delete(whereClause.length() - 3, whereClause.length()).append(")");
        whereClause.append(" and b." + BusinessPartner.PROPERTY_ORGANIZATION + ".id in (");
        whereClause.append(
                Utility.getInStrSet(new OrganizationStructureProvider().getNaturalTree(organization.getId()))
                        + ") ");
        final Query bl = OBDal.getInstance().getSession().createQuery(whereClause.toString());
        businessPartnersScroll = bl.scroll(ScrollMode.SCROLL_SENSITIVE);

        if (!businessPartnersScroll.next()) {
            return null;
        }

        else {
            final Object[] resultObject = (Object[]) businessPartnersScroll.get(0);
            if (!businessPartnersScroll.next()) {
                String strParnterId = "";
                if (resultObject.getClass().isArray()) {
                    final Object[] values = resultObject;
                    strParnterId = (String) values[0];
                }
                BusinessPartner bp = OBDal.getInstance().get(BusinessPartner.class, strParnterId);
                return bp;
            }

            else {
                String closestId = closest(businessPartnersScroll, partnername);
                BusinessPartner closest = OBDal.getInstance().get(BusinessPartner.class, closestId);
                return closest;
            }
        }

    } finally {
        businessPartnersScroll.close();
        OBContext.restorePreviousMode();
    }
}

From source file:org.openbravo.costing.CostingRuleProcess.java

License:Open Source License

private ScrollableResults getStockLines(Set<String> childOrgs, Date date) {
    StringBuffer select = new StringBuffer();
    select.append("select trx." + MaterialTransaction.PROPERTY_PRODUCT + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ATTRIBUTESETVALUE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_UOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ORDERUOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_STORAGEBIN + ".id");
    select.append(", loc." + Locator.PROPERTY_WAREHOUSE + ".id");
    select.append(", sum(trx." + MaterialTransaction.PROPERTY_MOVEMENTQUANTITY + ")");
    select.append(", sum(trx." + MaterialTransaction.PROPERTY_ORDERQUANTITY + ")");
    select.append(" from " + MaterialTransaction.ENTITY_NAME + " as trx");
    select.append("    join trx." + MaterialTransaction.PROPERTY_STORAGEBIN + " as loc");
    select.append(" where trx." + MaterialTransaction.PROPERTY_ORGANIZATION + ".id in (:orgs)");
    if (date != null) {
        select.append("   and trx." + MaterialTransaction.PROPERTY_MOVEMENTDATE + " < :date");
    }//from  w  w w.  j a va 2 s.com
    select.append("   and trx." + MaterialTransaction.PROPERTY_PRODUCT + ".productType = 'I'");
    select.append("   and trx." + MaterialTransaction.PROPERTY_PRODUCT + ".stocked = true");
    select.append(" group by trx." + MaterialTransaction.PROPERTY_PRODUCT + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ATTRIBUTESETVALUE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_UOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ORDERUOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_STORAGEBIN + ".id");
    select.append(", loc." + Locator.PROPERTY_WAREHOUSE + ".id");
    select.append(" having ");
    select.append(" sum(trx." + MaterialTransaction.PROPERTY_MOVEMENTQUANTITY + ") <> 0");
    select.append(" or sum(trx." + MaterialTransaction.PROPERTY_ORDERQUANTITY + ") <> 0");
    select.append(" order by loc." + Locator.PROPERTY_WAREHOUSE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_PRODUCT + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_STORAGEBIN + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ATTRIBUTESETVALUE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_UOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ORDERUOM + ".id");

    Query stockLinesQry = OBDal.getInstance().getSession().createQuery(select.toString());
    stockLinesQry.setParameterList("orgs", childOrgs);
    if (date != null) {
        stockLinesQry.setTimestamp("date", date);
    }
    stockLinesQry.setFetchSize(1000);
    ScrollableResults stockLines = stockLinesQry.scroll(ScrollMode.FORWARD_ONLY);
    return stockLines;
}

From source file:org.openbravo.costing.FixBackdatedTransactionsProcess.java

License:Open Source License

private ScrollableResults getTransactions(Set<String> childOrgs, Date startDate, Date endDate) {
    StringBuffer select = new StringBuffer();
    select.append("select trx as trx");
    select.append(" from " + MaterialTransaction.ENTITY_NAME + " as trx");
    select.append(" where trx." + MaterialTransaction.PROPERTY_ORGANIZATION + ".id in (:orgs)");
    select.append(" and trx." + MaterialTransaction.PROPERTY_ISCOSTCALCULATED + " = true");
    select.append(" and trx." + MaterialTransaction.PROPERTY_TRANSACTIONPROCESSDATE + " >= (:startDate)");
    if (endDate != null) {
        select.append(" and trx." + MaterialTransaction.PROPERTY_TRANSACTIONPROCESSDATE + " < (:endDate)");
    }/*from   w  ww  . j a  v a  2s .  com*/
    select.append(" order by trx." + MaterialTransaction.PROPERTY_MOVEMENTDATE);

    Query stockLinesQry = OBDal.getInstance().getSession().createQuery(select.toString());
    stockLinesQry.setParameterList("orgs", childOrgs);
    stockLinesQry.setTimestamp("startDate", startDate);
    if (endDate != null) {
        stockLinesQry.setTimestamp("endDate", endDate);
    }

    stockLinesQry.setFetchSize(1000);
    ScrollableResults stockLines = stockLinesQry.scroll(ScrollMode.FORWARD_ONLY);
    return stockLines;
}

From source file:org.openbravo.costing.InventoryAmountUpdateProcess.java

License:Open Source License

private ScrollableResults getStockLines(Set<String> childOrgs, Date date, Product product, Warehouse warehouse,
        boolean backdatedTransactionsFixed) {
    StringBuffer select = new StringBuffer();
    StringBuffer subSelect = new StringBuffer();

    select.append("select trx." + MaterialTransaction.PROPERTY_ATTRIBUTESETVALUE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_UOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ORDERUOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_STORAGEBIN + ".id");
    select.append(", loc." + Locator.PROPERTY_WAREHOUSE + ".id");
    select.append(", sum(trx." + MaterialTransaction.PROPERTY_MOVEMENTQUANTITY + ")");
    select.append(", sum(trx." + MaterialTransaction.PROPERTY_ORDERQUANTITY + ")");
    select.append(" from " + MaterialTransaction.ENTITY_NAME + " as trx");
    select.append("    join trx." + MaterialTransaction.PROPERTY_STORAGEBIN + " as loc");
    select.append(" where trx." + MaterialTransaction.PROPERTY_ORGANIZATION + ".id in (:orgs)");
    if (date != null) {
        if (backdatedTransactionsFixed) {
            select.append("   and trx." + MaterialTransaction.PROPERTY_MOVEMENTDATE + " <= :date");
        } else {//w w w .  ja  va  2  s  . c  o m
            subSelect.append("select min(trx." + MaterialTransaction.PROPERTY_TRANSACTIONPROCESSDATE + ")");
            subSelect.append(" from " + MaterialTransaction.ENTITY_NAME + " as trx");
            subSelect.append("   join trx." + MaterialTransaction.PROPERTY_STORAGEBIN + " as locator");
            subSelect.append(" where trx." + MaterialTransaction.PROPERTY_PRODUCT + ".id = :product");
            subSelect.append(" and trx." + MaterialTransaction.PROPERTY_MOVEMENTDATE + " > :date");
            // Include only transactions that have its cost calculated
            subSelect.append("   and trx." + MaterialTransaction.PROPERTY_ISCOSTCALCULATED + " = true");
            if (warehouse != null) {
                subSelect.append("  and locator." + Locator.PROPERTY_WAREHOUSE + ".id = :warehouse");
            }
            subSelect.append("   and trx." + MaterialTransaction.PROPERTY_ORGANIZATION + ".id in (:orgs)");

            Query trxsubQry = OBDal.getInstance().getSession().createQuery(subSelect.toString());
            trxsubQry.setParameter("date", date);
            trxsubQry.setParameter("product", product.getId());
            if (warehouse != null) {
                trxsubQry.setParameter("warehouse", warehouse.getId());
            }
            trxsubQry.setParameterList("orgs", childOrgs);
            Object trxprocessDate = trxsubQry.uniqueResult();
            if (trxprocessDate != null) {
                date = (Date) trxprocessDate;
                select.append("   and trx." + MaterialTransaction.PROPERTY_TRANSACTIONPROCESSDATE + " < :date");
            } else {
                select.append("   and trx." + MaterialTransaction.PROPERTY_MOVEMENTDATE + " <= :date");
            }
        }
    }
    if (warehouse != null) {
        select.append("   and loc." + Locator.PROPERTY_WAREHOUSE + " = :warehouse");
    }
    select.append("   and trx." + MaterialTransaction.PROPERTY_PRODUCT + " = :product");
    select.append(" group by trx." + MaterialTransaction.PROPERTY_ATTRIBUTESETVALUE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_UOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ORDERUOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_STORAGEBIN + ".id");
    select.append(", loc." + Locator.PROPERTY_WAREHOUSE + ".id");
    select.append(" having ");
    select.append(" sum(trx." + MaterialTransaction.PROPERTY_MOVEMENTQUANTITY + ") <> 0");
    select.append(" order by loc." + Locator.PROPERTY_WAREHOUSE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_STORAGEBIN + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ATTRIBUTESETVALUE + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_UOM + ".id");
    select.append(", trx." + MaterialTransaction.PROPERTY_ORDERUOM + ".id");

    Query stockLinesQry = OBDal.getInstance().getSession().createQuery(select.toString());
    stockLinesQry.setParameterList("orgs", childOrgs);
    if (date != null) {
        stockLinesQry.setTimestamp("date", date);
    }
    if (warehouse != null) {
        stockLinesQry.setParameter("warehouse", warehouse);
    }
    stockLinesQry.setParameter("product", product);
    stockLinesQry.setFetchSize(1000);
    ScrollableResults stockLines = stockLinesQry.scroll(ScrollMode.FORWARD_ONLY);
    return stockLines;
}

From source file:org.openbravo.costing.LandedCostProcess.java

License:Open Source License

private CostAdjustment generateCostAdjustment(String strLandedCostId, JSONObject message) {
    LandedCost landedCost = OBDal.getInstance().get(LandedCost.class, strLandedCostId);
    Date referenceDate = landedCost.getReferenceDate();
    CostAdjustment ca = CostAdjustmentUtils.insertCostAdjustmentHeader(landedCost.getOrganization(), "LC");

    String strResult = OBMessageUtils.messageBD("LandedCostProcessed");
    Map<String, String> map = new HashMap<String, String>();
    map.put("documentNo", ca.getDocumentNo());
    try {/*from   w w  w. ja va  2 s . c  o  m*/
        message.put("title", OBMessageUtils.messageBD("Success"));
        message.put("text", OBMessageUtils.parseTranslation(strResult, map));
    } catch (JSONException ignore) {
    }

    StringBuffer hql = new StringBuffer();
    hql.append(" select sum(rla." + LCReceiptLineAmt.PROPERTY_AMOUNT + ") as amt");
    hql.append("   , rla." + LCReceiptLineAmt.PROPERTY_LANDEDCOSTCOST + ".currency.id as lcCostCurrency");
    hql.append("   , rla." + LCReceipt.PROPERTY_GOODSSHIPMENTLINE + ".id as receipt");
    hql.append("   , (select " + MaterialTransaction.PROPERTY_TRANSACTIONPROCESSDATE + " from "
            + MaterialTransaction.ENTITY_NAME + " as transaction where "
            + MaterialTransaction.PROPERTY_GOODSSHIPMENTLINE + ".id = rla."
            + LCReceipt.PROPERTY_GOODSSHIPMENTLINE + ".id) as trxprocessdate");
    hql.append(" from " + LCReceiptLineAmt.ENTITY_NAME + " as rla");
    hql.append("   join rla." + LCReceiptLineAmt.PROPERTY_LANDEDCOSTRECEIPT + " as rl");
    hql.append(" where rl." + LCReceipt.PROPERTY_LANDEDCOST + " = :lc");
    hql.append("   and rla." + LCReceiptLineAmt.PROPERTY_ISMATCHINGADJUSTMENT + " = false ");
    hql.append(" group by rla." + LCReceiptLineAmt.PROPERTY_LANDEDCOSTCOST + ".currency.id");
    hql.append(" , rla." + LCReceipt.PROPERTY_GOODSSHIPMENTLINE + ".id");
    hql.append(" order by trxprocessdate, amt");

    Query qryLCRLA = OBDal.getInstance().getSession().createQuery(hql.toString());
    qryLCRLA.setParameter("lc", landedCost);

    ScrollableResults receiptamts = qryLCRLA.scroll(ScrollMode.FORWARD_ONLY);
    int i = 0;
    try {
        while (receiptamts.next()) {
            log.debug("Process receipt amounts");
            Object[] receiptAmt = receiptamts.get();
            BigDecimal amt = (BigDecimal) receiptAmt[0];
            Currency lcCostCurrency = OBDal.getInstance().get(Currency.class, receiptAmt[1]);
            ShipmentInOutLine receiptLine = OBDal.getInstance().get(ShipmentInOutLine.class, receiptAmt[2]);
            // MaterialTransaction receiptLine = (MaterialTransaction) record[1];
            MaterialTransaction trx = receiptLine.getMaterialMgmtMaterialTransactionList().get(0);
            CostAdjustmentLine cal = CostAdjustmentUtils.insertCostAdjustmentLine(trx, ca, amt, true,
                    referenceDate);
            cal.setNeedsPosting(Boolean.FALSE);
            cal.setUnitCost(Boolean.FALSE);
            cal.setCurrency(lcCostCurrency);
            cal.setLineNo((i + 1) * 10L);
            OBDal.getInstance().save(cal);

            if (i % 100 == 0) {
                OBDal.getInstance().flush();
                OBDal.getInstance().getSession().clear();
                ca = OBDal.getInstance().get(CostAdjustment.class, ca.getId());
            }
            i++;
        }
    } finally {
        receiptamts.close();
    }

    CostAdjustmentProcess.doProcessCostAdjustment(ca);

    return ca;
}

From source file:org.openbravo.costing.LCMatchingProcess.java

License:Open Source License

private String generateCostAdjustment(String strLCCostId, JSONObject message) throws JSONException {
    LandedCostCost lcCost = OBDal.getInstance().get(LandedCostCost.class, strLCCostId);
    Date referenceDate = lcCost.getAccountingDate();
    CostAdjustment ca = CostAdjustmentUtils.insertCostAdjustmentHeader(lcCost.getOrganization(), "LC");

    String strResult = OBMessageUtils.messageBD("LCMatchingProcessed");
    Map<String, String> map = new HashMap<String, String>();
    map.put("documentNo", ca.getDocumentNo());
    message.put("title", OBMessageUtils.messageBD("Success"));
    message.put("text", OBMessageUtils.parseTranslation(strResult, map));

    StringBuffer hql = new StringBuffer();
    hql.append(" select sum(rla." + LCReceiptLineAmt.PROPERTY_AMOUNT + ") as amt");
    hql.append("   , rla." + LCReceipt.PROPERTY_GOODSSHIPMENTLINE + ".id as receipt");
    hql.append("   , (select " + MaterialTransaction.PROPERTY_TRANSACTIONPROCESSDATE + " from "
            + MaterialTransaction.ENTITY_NAME + " as transaction where "
            + MaterialTransaction.PROPERTY_GOODSSHIPMENTLINE + ".id = rla."
            + LCReceipt.PROPERTY_GOODSSHIPMENTLINE + ".id) as trxprocessdate");
    hql.append(" from " + LCReceiptLineAmt.ENTITY_NAME + " as rla");
    hql.append(" where rla." + LCReceiptLineAmt.PROPERTY_LANDEDCOSTCOST + " = :lcc");
    hql.append("   and rla." + LCReceiptLineAmt.PROPERTY_ISMATCHINGADJUSTMENT + " = true ");
    hql.append(" group by rla." + LCReceipt.PROPERTY_GOODSSHIPMENTLINE + ".id");
    hql.append(" order by trxprocessdate, amt");

    Query qryLCRLA = OBDal.getInstance().getSession().createQuery(hql.toString());
    qryLCRLA.setParameter("lcc", lcCost);

    ScrollableResults receiptamts = qryLCRLA.scroll(ScrollMode.FORWARD_ONLY);
    int i = 0;//  w  ww .j a v  a 2  s  .  co m
    try {
        while (receiptamts.next()) {
            Object[] receiptAmt = receiptamts.get();
            BigDecimal amt = (BigDecimal) receiptAmt[0];
            ShipmentInOutLine receiptLine = OBDal.getInstance().get(ShipmentInOutLine.class, receiptAmt[1]);
            MaterialTransaction trx = receiptLine.getMaterialMgmtMaterialTransactionList().get(0);
            CostAdjustmentLine cal = CostAdjustmentUtils.insertCostAdjustmentLine(trx, ca, amt, true,
                    referenceDate);
            cal.setNeedsPosting(Boolean.FALSE);
            cal.setUnitCost(Boolean.FALSE);
            cal.setCurrency(lcCost.getCurrency());
            OBDal.getInstance().save(cal);

            if (i % 100 == 0) {
                OBDal.getInstance().flush();
                OBDal.getInstance().getSession().clear();
                ca = OBDal.getInstance().get(CostAdjustment.class, ca.getId());
            }
            i++;
        }
    } finally {
        receiptamts.close();
    }
    ca = OBDal.getInstance().get(CostAdjustment.class, ca.getId());
    CostAdjustmentProcess.doProcessCostAdjustment(ca);
    return ca.getId();
}

From source file:org.openbravo.dal.service.OBQuery.java

License:Open Source License

/**
 * Computes the row number of a record which has the id which is passed in as a parameter. The
 * rownumber computation takes into account the filter and sorting settings of the the OBQuery
 * object.//from w  w w.jav  a  2s . c o m
 * 
 * @param targetId
 *          the record id
 * @return the row number or -1 if not found
 */
public int getRowNumber(String targetId) {
    String qryStr = createQueryString();
    if (qryStr.toLowerCase().contains(FROM_SPACED)) {
        final int index = qryStr.indexOf(FROM_SPACED) + FROM_SPACED.length();
        qryStr = qryStr.substring(index);
    }
    final Query qry = getSession().createQuery("select " + usedAlias + "id " + FROM_SPACED + qryStr);
    setParameters(qry);

    final ScrollableResults results = qry.scroll(ScrollMode.FORWARD_ONLY);
    try {
        while (results.next()) {
            final String id = results.getString(0);
            if (id.equals(targetId)) {
                return results.getRowNumber();
            }
        }
    } finally {
        results.close();
    }
    return -1;
}

From source file:org.openbravo.financial.paymentreport.erpCommon.ad_reports.PaymentReportDao.java

License:Open Source License

FieldProvider[] getPaymentReport(VariablesSecureApp vars, String strOrg, String strInclSubOrg,
        String strDueDateFrom, String strDueDateTo, String strAmountFrom, String strAmountTo,
        String strDocumentDateFrom, String strDocumentDateTo, String strcBPartnerIdIN, String strcBPGroupIdIN,
        String strcNoBusinessPartner, String strcProjectIdIN, String strfinPaymSt, String strPaymentMethodId,
        String strFinancialAccountId, String strcCurrency, String strConvertCurrency, String strConversionDate,
        String strPaymType, String strOverdue, String strGroupCrit, String strOrdCrit,
        String strInclPaymentUsingCredit, String strPaymentDateFrom, String strPaymentDateTo,
        String strExpectedDateFrom, String strExpectedDateTo, String strOutput) throws OBException {

    StringBuilder hsqlScript = new StringBuilder();
    final java.util.List<Object> parameters = new ArrayList<Object>();

    String dateFormatString = OBPropertiesProvider.getInstance().getOpenbravoProperties()
            .getProperty("dateFormat.java");
    SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatString);
    Currency transCurrency;/*from www  .  j a va2  s  . c  om*/
    BigDecimal transAmount = null;
    ConversionRate convRate = null;
    ArrayList<FieldProvider> totalData = new ArrayList<FieldProvider>();
    int numberOfElements = 0;
    int lastElement = 0;
    boolean existsConvRate = false;
    ScrollableResults scroller = null;

    OBContext.setAdminMode(true);
    try {

        hsqlScript.append(" from FIN_Payment_ScheduleDetail as fpsd ");
        hsqlScript.append(" left outer join fpsd.paymentDetails.finPayment pay");
        hsqlScript.append(" left outer join pay.businessPartner paybp");
        hsqlScript.append(" left outer join paybp.businessPartnerCategory paybpc");
        hsqlScript.append(" left outer join fpsd.invoicePaymentSchedule invps");
        hsqlScript.append(" left outer join invps.invoice inv");
        hsqlScript.append(" left outer join inv.businessPartner invbp");
        hsqlScript.append(" left outer join invbp.businessPartnerCategory invbpc");
        hsqlScript.append(" left outer join fpsd.paymentDetails.finPayment.currency paycur");
        hsqlScript.append(" left outer join fpsd.invoicePaymentSchedule.invoice.currency invcur");
        hsqlScript.append(" left outer join pay.project paypro");
        hsqlScript.append(" left outer join inv.project invpro");
        hsqlScript.append(" where (fpsd.");
        hsqlScript.append(FIN_PaymentScheduleDetail.PROPERTY_PAYMENTDETAILS);
        hsqlScript.append(" is not null or invps is not null ");
        hsqlScript.append(") ");

        hsqlScript.append(" and fpsd.");
        hsqlScript.append(FIN_PaymentScheduleDetail.PROPERTY_ORGANIZATION);
        hsqlScript.append(".id in ");
        hsqlScript.append(concatOrganizations(OBContext.getOBContext().getReadableOrganizations()));

        // organization + include sub-organization
        if (!strOrg.isEmpty()) {
            if (!strInclSubOrg.equalsIgnoreCase("include")) {
                hsqlScript.append(" and fpsd.");
                hsqlScript.append(FIN_PaymentScheduleDetail.PROPERTY_ORGANIZATION);
                hsqlScript.append(".id = '");
                hsqlScript.append(strOrg);
                hsqlScript.append("'");
            } else {
                hsqlScript.append(" and fpsd.");
                hsqlScript.append(FIN_PaymentScheduleDetail.PROPERTY_ORGANIZATION);
                hsqlScript.append(".id in ('");
                Set<String> orgChildTree = OBContext.getOBContext().getOrganizationStructureProvider()
                        .getChildTree(strOrg, true);
                Iterator<String> orgChildTreeIter = orgChildTree.iterator();
                while (orgChildTreeIter.hasNext()) {
                    hsqlScript.append(orgChildTreeIter.next());
                    orgChildTreeIter.remove();
                    hsqlScript.append("'");
                    if (orgChildTreeIter.hasNext())
                        hsqlScript.append(", '");
                }
                hsqlScript.append(")");
            }
        }

        // Exclude payments that use credit payment
        if (!strInclPaymentUsingCredit.equalsIgnoreCase("Y")) {
            hsqlScript.append(" and (not (pay.amount = 0 ");
            hsqlScript.append(" and pay.usedCredit > pay.generatedCredit) or pay is null)");
        }

        // due date from - due date to
        if (!strDueDateFrom.isEmpty()) {
            hsqlScript.append(" and invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_DUEDATE);
            hsqlScript.append(" >= ?");
            parameters.add(FIN_Utility.getDate(strDueDateFrom));
        }
        if (!strDueDateTo.isEmpty()) {
            hsqlScript.append(" and invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_DUEDATE);
            hsqlScript.append(" <= ?");
            parameters.add(FIN_Utility.getDate(strDueDateTo));
        }

        // expected date from - expected date to
        if (!strExpectedDateFrom.isEmpty()) {
            hsqlScript.append(" and invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_EXPECTEDDATE);
            hsqlScript.append(" >= ?");
            parameters.add(FIN_Utility.getDate(strExpectedDateFrom));
        }
        if (!strExpectedDateTo.isEmpty()) {
            hsqlScript.append(" and invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_EXPECTEDDATE);
            hsqlScript.append(" <= ?");
            parameters.add(FIN_Utility.getDate(strExpectedDateTo));
        }

        // document date from - document date to
        if (!strDocumentDateFrom.isEmpty()) {
            hsqlScript.append(" and coalesce(inv.");
            hsqlScript.append(Invoice.PROPERTY_INVOICEDATE);
            hsqlScript.append(", pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_PAYMENTDATE);
            hsqlScript.append(") >= ?");
            parameters.add(FIN_Utility.getDate(strDocumentDateFrom));
        }
        if (!strDocumentDateTo.isEmpty()) {
            hsqlScript.append(" and coalesce(inv.");
            hsqlScript.append(Invoice.PROPERTY_INVOICEDATE);
            hsqlScript.append(", pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_PAYMENTDATE);
            hsqlScript.append(") <= ?");
            parameters.add(FIN_Utility.getDate(strDocumentDateTo));
        }

        // payment date from - payment date to
        if (!strPaymentDateFrom.isEmpty()) {
            hsqlScript.append(" and ((pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_PAYMENTDATE);
            hsqlScript.append(" >= ?)  or (pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_PAYMENTDATE);
            hsqlScript.append(" is null and invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_EXPECTEDDATE);
            hsqlScript.append(" >= ?))");
            parameters.add(FIN_Utility.getDate(strPaymentDateFrom));
            parameters.add(FIN_Utility.getDate(strPaymentDateFrom));
        }
        if (!strPaymentDateTo.isEmpty()) {
            hsqlScript.append(" and coalesce(pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_PAYMENTDATE);
            hsqlScript.append(", invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_EXPECTEDDATE);
            hsqlScript.append(") <= ?");
            parameters.add(FIN_Utility.getDate(strPaymentDateTo));
        }

        // Empty Business Partner included
        if (strcNoBusinessPartner.equals("include")) {

            // business partner
            if (!strcBPartnerIdIN.isEmpty()) {
                hsqlScript.append(" and ((coalesce(pay.");
                hsqlScript.append(FIN_Payment.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(", inv.");
                hsqlScript.append(Invoice.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(") in ");
                hsqlScript.append(strcBPartnerIdIN);
                hsqlScript.append(") or (pay.");
                hsqlScript.append(FIN_Payment.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(" is null and inv.");
                hsqlScript.append(Invoice.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(" is null))");
            }
            // business partner category
            if (!strcBPGroupIdIN.isEmpty()) {
                hsqlScript.append(" and (coalesce(paybpc, invbpc) = '");
                hsqlScript.append(strcBPGroupIdIN);
                hsqlScript.append("' or (pay.");
                hsqlScript.append(FIN_Payment.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(" is null and inv.");
                hsqlScript.append(Invoice.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(" is null))");
            }

            // Empty Businesss Partner excluded
        } else if (strcNoBusinessPartner.equals("exclude")) {

            // business partner
            if (!strcBPartnerIdIN.isEmpty()) {
                hsqlScript.append(" and coalesce(pay.");
                hsqlScript.append(FIN_Payment.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(", inv.");
                hsqlScript.append(Invoice.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(") in ");
                hsqlScript.append(strcBPartnerIdIN);
            }

            // business partner category
            if (!strcBPGroupIdIN.isEmpty()) {
                hsqlScript.append(" and coalesce(paybpc, invbpc) = '");
                hsqlScript.append(strcBPGroupIdIN);
                hsqlScript.append("'");
            }
            // exclude empty business partner
            if (strcBPartnerIdIN.isEmpty() && strcBPGroupIdIN.isEmpty()) {
                hsqlScript.append(" and (pay.");
                hsqlScript.append(FIN_Payment.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(" is not null or inv.");
                hsqlScript.append(Invoice.PROPERTY_BUSINESSPARTNER);
                hsqlScript.append(" is not null) ");
            }

            // Only Empty Business Partner
        } else {// if ((strcNoBusinessPartner.equals("only")))
            hsqlScript.append(" and pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_BUSINESSPARTNER);
            hsqlScript.append(" is null and inv.");
            hsqlScript.append(Invoice.PROPERTY_BUSINESSPARTNER);
            hsqlScript.append(" is null ");
        }

        // project
        if (!strcProjectIdIN.isEmpty()) {
            hsqlScript.append(" and coalesce(pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_PROJECT);
            hsqlScript.append(", inv.");
            hsqlScript.append(Invoice.PROPERTY_PROJECT);
            hsqlScript.append(") in ");
            hsqlScript.append(strcProjectIdIN);
        }

        // status
        if (!strfinPaymSt.isEmpty() && !strfinPaymSt.equalsIgnoreCase("('')")) {
            hsqlScript.append(" and (pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_STATUS);
            hsqlScript.append(" in ");
            hsqlScript.append(strfinPaymSt);
            if (strfinPaymSt.contains("RPAP")) {
                hsqlScript.append(" or fpsd.");
                hsqlScript.append(FIN_PaymentScheduleDetail.PROPERTY_PAYMENTDETAILS);
                hsqlScript.append(" is null)");
            } else {
                hsqlScript.append(" )");
            }
        }

        // payment method
        if (!strPaymentMethodId.isEmpty()) {
            hsqlScript.append(" and coalesce(pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_PAYMENTMETHOD);
            hsqlScript.append(", invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_FINPAYMENTMETHOD);
            hsqlScript.append(") = '");
            hsqlScript.append(strPaymentMethodId);
            hsqlScript.append("'");
        }

        // financial account
        if (!strFinancialAccountId.isEmpty()) {
            hsqlScript.append(" and  (pay is not null and ");
            hsqlScript.append(
                    "(select case when trans is not null then trans.account.id else payment.account.id end from FIN_Finacc_Transaction trans right outer join trans.finPayment payment where payment=pay)");

            hsqlScript.append(" = '");
            hsqlScript.append(strFinancialAccountId);
            hsqlScript.append("' or ((pay is null and inv.");
            hsqlScript.append(Invoice.PROPERTY_SALESTRANSACTION);
            hsqlScript.append(" = 'Y'");
            hsqlScript.append(" and invbp.");
            hsqlScript.append(BusinessPartner.PROPERTY_ACCOUNT);
            hsqlScript.append(".id = '");
            hsqlScript.append(strFinancialAccountId);
            hsqlScript.append("')");
            hsqlScript.append(" or (pay is null and inv.");
            hsqlScript.append(Invoice.PROPERTY_SALESTRANSACTION);
            hsqlScript.append(" = 'N'");
            hsqlScript.append(" and invbp.");
            hsqlScript.append(BusinessPartner.PROPERTY_POFINANCIALACCOUNT);
            hsqlScript.append(".id = '");
            hsqlScript.append(strFinancialAccountId);
            hsqlScript.append("')))");
        }

        // currency
        if (!strcCurrency.isEmpty()) {
            hsqlScript.append(" and coalesce(pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_CURRENCY);
            hsqlScript.append(", inv.");
            hsqlScript.append(Invoice.PROPERTY_CURRENCY);
            hsqlScript.append(") = '");
            hsqlScript.append(strcCurrency);
            hsqlScript.append("'");
        }

        // payment type
        if (strPaymType.equalsIgnoreCase("FINPR_Receivables")) {
            hsqlScript.append(" and (pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_RECEIPT);
            hsqlScript.append(" = 'Y'");
            hsqlScript.append(" or inv.");
            hsqlScript.append(Invoice.PROPERTY_SALESTRANSACTION);
            hsqlScript.append(" = 'Y')");
        } else if (strPaymType.equalsIgnoreCase("FINPR_Payables")) {
            hsqlScript.append(" and (pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_RECEIPT);
            hsqlScript.append(" = 'N'");
            hsqlScript.append(" or inv.");
            hsqlScript.append(Invoice.PROPERTY_SALESTRANSACTION);
            hsqlScript.append(" = 'N')");
        }

        // overdue
        if (!strOverdue.isEmpty()) {
            hsqlScript.append(" and invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_OUTSTANDINGAMOUNT);
            hsqlScript.append(" != '0'");
            hsqlScript.append(" and invps.");
            hsqlScript.append(FIN_PaymentSchedule.PROPERTY_DUEDATE);
            hsqlScript.append(" <  ?");
            parameters.add(DateUtils.truncate(new Date(), Calendar.DATE));
        }

        if ("HTML".equals(strOutput)) {
            int maxRecords = 1000;
            final Session sessionCount = OBDal.getInstance().getSession();
            final Query queryCount = sessionCount.createQuery("select count(*)" + hsqlScript.toString());
            int px = 0;
            for (final Object param : parameters) {
                if (param instanceof BaseOBObject) {
                    queryCount.setEntity(px++, param);
                } else {
                    queryCount.setParameter(px++, param);
                }
            }
            final Long hqlRecordsCount = (Long) queryCount.list().get(0);
            if ((int) (long) hqlRecordsCount > maxRecords) {
                String message = "FINPR_TooManyRecords";
                throw new OBException(message);
            }
        }

        final StringBuilder firstLineQuery = new StringBuilder();
        firstLineQuery.append(
                "select fpsd, (select a.sequenceNumber from ADList a where a.reference.id = '575BCB88A4694C27BC013DE9C73E6FE7' and a.searchKey = coalesce(pay.status, 'RPAP')) as a");
        hsqlScript = firstLineQuery.append(hsqlScript);

        hsqlScript.append(" order by ");

        if (strGroupCrit.equalsIgnoreCase("APRM_FATS_BPARTNER")) {
            hsqlScript.append(" coalesce(paybp.");
            hsqlScript.append(BusinessPartner.PROPERTY_NAME);
            hsqlScript.append(", invbp.");
            hsqlScript.append(BusinessPartner.PROPERTY_NAME);
            hsqlScript.append("), ");
        } else if (strGroupCrit.equalsIgnoreCase("Project")) {
            hsqlScript.append("  coalesce(paypro.");
            hsqlScript.append(Project.PROPERTY_NAME);
            hsqlScript.append(", invpro.");
            hsqlScript.append(Project.PROPERTY_NAME);
            hsqlScript.append("), ");
        } else if (strGroupCrit.equalsIgnoreCase("FINPR_BPartner_Category")) {
            hsqlScript.append("  coalesce(paybpc.");
            hsqlScript.append(Category.PROPERTY_NAME);
            hsqlScript.append(", invbpc.");
            hsqlScript.append(Category.PROPERTY_NAME);
            hsqlScript.append("), ");
        } else if (strGroupCrit.equalsIgnoreCase("INS_CURRENCY")) {
            hsqlScript.append("  coalesce(paycur.");
            hsqlScript.append(Currency.PROPERTY_ISOCODE);
            hsqlScript.append(", invcur.");
            hsqlScript.append(Currency.PROPERTY_ISOCODE);
            hsqlScript.append("), ");
        } else if (strGroupCrit.equalsIgnoreCase("ACCS_ACCOUNT_ID_D")) {
            hsqlScript.append(" coalesce(");
            hsqlScript.append(
                    " (select trans.account.name from FIN_Finacc_Transaction trans left outer join trans.finPayment payment where payment.id=pay.id),");
            hsqlScript.append(" pay.");
            hsqlScript.append(FIN_Payment.PROPERTY_ACCOUNT);
            hsqlScript.append(".name, 'Awaiting Payment'");
            hsqlScript.append("), ");
        }

        hsqlScript.append(" a, coalesce(pay.");
        hsqlScript.append(FIN_Payment.PROPERTY_STATUS);
        hsqlScript.append(", 'RPAP')");

        if (!strOrdCrit.isEmpty()) {
            String[] strOrdCritList = strOrdCrit.substring(2, strOrdCrit.length() - 2).split("', '");

            for (int i = 0; i < strOrdCritList.length; i++) {
                if (strOrdCritList[i].equalsIgnoreCase("Date")) {
                    hsqlScript.append(", inv.");
                    hsqlScript.append(Invoice.PROPERTY_INVOICEDATE);
                }
                if (strOrdCritList[i].contains("Project")) {
                    hsqlScript.append(",  coalesce(paypro.");
                    hsqlScript.append(Project.PROPERTY_NAME);
                    hsqlScript.append(", invpro.");
                    hsqlScript.append(Project.PROPERTY_NAME);
                    hsqlScript.append(")");
                }
                if (strOrdCritList[i].contains("FINPR_BPartner_Category")) {
                    hsqlScript.append(",  coalesce(paybpc.");
                    hsqlScript.append(Category.PROPERTY_NAME);
                    hsqlScript.append(", invbpc.");
                    hsqlScript.append(Category.PROPERTY_NAME);
                    hsqlScript.append(")");
                }
                if (strOrdCritList[i].contains("APRM_FATS_BPARTNER")) {
                    hsqlScript.append(",  coalesce(paybp.");
                    hsqlScript.append(BusinessPartner.PROPERTY_NAME);
                    hsqlScript.append(", invbp.");
                    hsqlScript.append(BusinessPartner.PROPERTY_NAME);
                    hsqlScript.append(")");
                }
                if (strOrdCritList[i].contains("INS_CURRENCY")) {
                    hsqlScript.append(",  coalesce(paycur.");
                    hsqlScript.append(Currency.PROPERTY_ISOCODE);
                    hsqlScript.append(", invcur.");
                    hsqlScript.append(Currency.PROPERTY_ISOCODE);
                    hsqlScript.append(")");
                }
                if (strOrdCritList[i].equalsIgnoreCase("ACCS_ACCOUNT_ID_D")) {
                    hsqlScript.append(", coalesce(");
                    hsqlScript.append(
                            " (select trans.account.name from FIN_Finacc_Transaction trans left outer join trans.finPayment payment where payment.id=pay.id),");
                    hsqlScript.append(" pay.");
                    hsqlScript.append(FIN_Payment.PROPERTY_ACCOUNT);
                    hsqlScript.append(".name)");
                }
                if (strOrdCritList[i].equalsIgnoreCase("DueDate")) {
                    hsqlScript.append(", invps.");
                    hsqlScript.append(FIN_PaymentSchedule.PROPERTY_DUEDATE);
                }
            }
        }

        hsqlScript.append(", fpsd.");
        hsqlScript.append(FIN_PaymentScheduleDetail.PROPERTY_INVOICEPAYMENTSCHEDULE);
        hsqlScript.append(".");
        hsqlScript.append(FIN_PaymentSchedule.PROPERTY_ID);
        final Session session = OBDal.getInstance().getSession();
        final Query query = session.createQuery(hsqlScript.toString());

        int pos = 0;
        for (final Object param : parameters) {
            if (param instanceof BaseOBObject) {
                query.setEntity(pos++, param);
            } else {
                query.setParameter(pos++, param);
            }
        }

        scroller = query.scroll(ScrollMode.FORWARD_ONLY);

        FIN_PaymentDetail finPaymDetail;
        Boolean mustGroup;
        String previousFPSDInvoiceId = null;
        String previousPaymentId = null;
        BigDecimal amountSum = BigDecimal.ZERO;
        BigDecimal balanceSum = BigDecimal.ZERO;
        FieldProvider previousRow = null;
        FieldProvider lastGroupedDatarow = null;
        ConversionRate previousConvRate = null;
        boolean isReceipt = false;
        boolean isAmtInLimit = false;

        // Before processing the data the Transactions without a Payment associated are recovered
        java.util.List<FIN_FinaccTransaction> transactionsList = getTransactionsList(strInclSubOrg, strOrg,
                strcBPartnerIdIN, strFinancialAccountId, strDocumentDateFrom, strDocumentDateTo,
                strPaymentDateFrom, strPaymentDateTo, strAmountFrom, strAmountTo, strcBPGroupIdIN,
                strcProjectIdIN, strfinPaymSt, strcCurrency, strPaymType, strGroupCrit, strOrdCrit,
                strcNoBusinessPartner, strDueDateFrom, strDueDateTo, strExpectedDateFrom, strExpectedDateTo);

        // There are three variables involved in this loop. The first one is data, wich is the
        // the one the loop processes. Then grouped data is used to group similar data lines into
        // one. Finally total data adds the remaining information that is not in data.
        int i = 0;
        while (scroller.next()) {
            i++;
            // get 1st column (idx=0)
            Object value = scroller.get(0);

            // TODO: rename variable to not have same name as class
            FIN_PaymentScheduleDetail FIN_PaymentScheduleDetail = (FIN_PaymentScheduleDetail) value;

            // make a empty FieldProvider instead of saving link to DAL-object
            FieldProvider data = FieldProviderFactory.getFieldProvider(null);

            if (i % 100 == 0) {
                OBDal.getInstance().getSession().clear();
            }
            OBDal.getInstance().getSession().buildLockRequest(LockOptions.NONE)
                    .lock(FIN_PaymentScheduleDetail.ENTITY_NAME, FIN_PaymentScheduleDetail);

            // search for fin_finacc_transaction for this payment
            FIN_FinaccTransaction trx = null;
            FIN_PaymentDetail detail = FIN_PaymentScheduleDetail.getPaymentDetails();
            if (detail != null) {
                OBCriteria<FIN_FinaccTransaction> trxQuery = OBDal.getInstance()
                        .createCriteria(FIN_FinaccTransaction.class);
                trxQuery.add(
                        Restrictions.eq(FIN_FinaccTransaction.PROPERTY_FINPAYMENT, detail.getFinPayment()));
                // uniqueness guaranteed via unique constraint in db
                trx = (FIN_FinaccTransaction) trxQuery.uniqueResult();
            }
            // If the payment schedule detail has a payment detail, then, the information is taken from
            // the payment. If not, the information is taken from the invoice (the else).
            if (FIN_PaymentScheduleDetail.getPaymentDetails() != null) {
                BusinessPartner bp = getDocumentBusinessPartner(FIN_PaymentScheduleDetail);
                if (bp == null) {
                    FieldProviderFactory.setField(data, "BP_GROUP", "");
                    FieldProviderFactory.setField(data, "BPARTNER", "");
                } else {
                    // bp_group -- bp_category
                    FieldProviderFactory.setField(data, "BP_GROUP", bp.getBusinessPartnerCategory().getName());
                    // bpartner
                    FieldProviderFactory.setField(data, "BPARTNER", bp.getName());
                }

                // transCurrency
                transCurrency = FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getCurrency();
                FieldProviderFactory.setField(data, "TRANS_CURRENCY", transCurrency.getISOCode());
                // paymentMethod
                FieldProviderFactory.setField(data, "PAYMENT_METHOD", FIN_PaymentScheduleDetail
                        .getPaymentDetails().getFinPayment().getPaymentMethod().getIdentifier());

                // payment
                FieldProviderFactory.setField(data, "PAYMENT",
                        ((FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment()
                                .getPaymentDate() != null)
                                        ? dateFormat.format(FIN_PaymentScheduleDetail.getPaymentDetails()
                                                .getFinPayment().getPaymentDate())
                                        : "Null")
                                + " - " + FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment()
                                        .getDocumentNo());
                // payment description
                FieldProviderFactory.setField(data, "PAYMENT_DESC",
                        FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getDescription());
                // payment_id
                FieldProviderFactory.setField(data, "PAYMENT_ID",
                        FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getId().toString());
                // payment_date
                FieldProviderFactory.setField(data, "PAYMENT_DATE",
                        (FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getPaymentDate() != null)
                                ? dateFormat.format(FIN_PaymentScheduleDetail
                                        .getPaymentDetails().getFinPayment().getPaymentDate())
                                : "Null");
                // payment_docNo
                FieldProviderFactory.setField(data, "PAYMENT_DOCNO",
                        FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getDocumentNo());
                // payment yes / no
                FieldProviderFactory.setField(data, "PAYMENT_Y_N", "");
                // financialAccount
                FieldProviderFactory.setField(data, "FINANCIAL_ACCOUNT",
                        FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment()
                                .getFINFinaccTransactionList().size() != 0
                                        ? FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment()
                                                .getFINFinaccTransactionList().get(0).getAccount().getName()
                                        : FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment()
                                                .getAccount().getName());
                // status
                FieldProviderFactory.setField(data, "STATUS", translateRefList(
                        FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getStatus()));
                FieldProviderFactory.setField(data, "STATUS_CODE",
                        FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getStatus());
                // is receipt
                if (FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().isReceipt()) {
                    FieldProviderFactory.setField(data, "ISRECEIPT", "Y");
                    isReceipt = true;
                } else {
                    FieldProviderFactory.setField(data, "ISRECEIPT", "N");
                    isReceipt = false;
                }
                // deposit/withdraw date
                if (trx != null) {
                    FieldProviderFactory.setField(data, "DEPOSIT_WITHDRAW_DATE",
                            dateFormat.format(trx.getTransactionDate()));
                } else {
                    FieldProviderFactory.setField(data, "DEPOSIT_WITHDRAW_DATE", "");
                }
            } else {

                // bp_group -- bp_category
                FieldProviderFactory.setField(data, "BP_GROUP",
                        FIN_PaymentScheduleDetail.getInvoicePaymentSchedule().getInvoice().getBusinessPartner()
                                .getBusinessPartnerCategory().getName());
                // bpartner
                FieldProviderFactory.setField(data, "BPARTNER", FIN_PaymentScheduleDetail
                        .getInvoicePaymentSchedule().getInvoice().getBusinessPartner().getName());
                // transCurrency
                transCurrency = FIN_PaymentScheduleDetail.getInvoicePaymentSchedule().getInvoice()
                        .getCurrency();
                FieldProviderFactory.setField(data, "TRANS_CURRENCY", transCurrency.getISOCode());
                // paymentMethod
                FieldProviderFactory.setField(data, "PAYMENT_METHOD", FIN_PaymentScheduleDetail
                        .getInvoicePaymentSchedule().getFinPaymentmethod().getIdentifier());
                // payment
                FieldProviderFactory.setField(data, "PAYMENT", "");
                // payment_id
                FieldProviderFactory.setField(data, "PAYMENT_ID", "");
                // payment_date
                FieldProviderFactory.setField(data, "PAYMENT_DATE", "");
                // payment_docNo
                FieldProviderFactory.setField(data, "PAYMENT_DOCNO", "");
                // payment yes / no
                FieldProviderFactory.setField(data, "PAYMENT_Y_N", "Display:None");
                // financialAccount
                FieldProviderFactory.setField(data, "FINANCIAL_ACCOUNT", "");
                // status
                FieldProviderFactory.setField(data, "STATUS", translateRefList("RPAP"));
                FieldProviderFactory.setField(data, "STATUS_CODE", "RPAP");
                // is receipt
                if (FIN_PaymentScheduleDetail.getInvoicePaymentSchedule().getInvoice().isSalesTransaction()) {
                    FieldProviderFactory.setField(data, "ISRECEIPT", "Y");
                    isReceipt = true;
                } else {
                    FieldProviderFactory.setField(data, "ISRECEIPT", "N");
                    isReceipt = false;
                }
                // deposit/withdraw date
                FieldProviderFactory.setField(data, "DEPOSIT_WITHDRAW_DATE", "");
            }

            /*
             * - If the payment schedule detail has an invoice, the line is filled normally.
             * 
             * - If it has a payment it does not have an invoice or it should have entered the first if,
             * thus, it is a credit payment. If it is a credit payment, it is checked whether it pays
             * one or multiple invoices. If it is one, the information of that invoice is provided. If
             * not, it is filled with '**'.
             * 
             * - Otherwise, it is filled empty.
             */
            if (FIN_PaymentScheduleDetail.getInvoicePaymentSchedule() != null) {
                fillLine(dateFormat, data, FIN_PaymentScheduleDetail,
                        FIN_PaymentScheduleDetail.getInvoicePaymentSchedule(), false);
            } else if (FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment() != null) {
                java.util.List<Invoice> invoices = getInvoicesUsingCredit(
                        FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment());
                if (invoices.size() == 1) {
                    java.util.List<FIN_PaymentSchedule> ps = getInvoicePaymentSchedules(
                            FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment());
                    fillLine(dateFormat, data, FIN_PaymentScheduleDetail, ps.get(0), true);
                } else {
                    // project
                    FieldProviderFactory.setField(data, "PROJECT", "");
                    // salesPerson
                    FieldProviderFactory.setField(data, "SALES_PERSON", "");
                    // invoiceNumber.
                    FieldProviderFactory.setField(data, "INVOICE_NUMBER",
                            invoices.size() > 1 ? "**" + getInvoicesDocNos(invoices) : "");
                    // payment plan id
                    FieldProviderFactory.setField(data, "PAYMENT_PLAN_ID", "");
                    // payment plan yes / no
                    FieldProviderFactory.setField(data, "PAYMENT_PLAN_Y_N",
                            invoices.size() != 1 ? "Display:none" : "");
                    // payment plan yes / no
                    FieldProviderFactory.setField(data, "NOT_PAYMENT_PLAN_Y_N",
                            invoices.size() > 1 ? "" : "Display:none");
                    // invoiceDate
                    FieldProviderFactory.setField(data, "INVOICE_DATE", "");
                    // dueDate.
                    FieldProviderFactory.setField(data, "DUE_DATE", "");
                    // expectedDate.
                    FieldProviderFactory.setField(data, "EXPECTED_DATE", "");
                    // plannedDSO
                    FieldProviderFactory.setField(data, "PLANNED_DSO", "0");
                    // currentDSO
                    FieldProviderFactory.setField(data, "CURRENT_DSO", "0");
                    // daysOverdue
                    FieldProviderFactory.setField(data, "OVERDUE", "0");
                }
            } else {
                // project
                FieldProviderFactory.setField(data, "PROJECT", "");
                // salesPerson
                FieldProviderFactory.setField(data, "SALES_PERSON", "");
                // invoiceNumber.
                FieldProviderFactory.setField(data, "INVOICE_NUMBER", "");
                // payment plan id
                FieldProviderFactory.setField(data, "PAYMENT_PLAN_ID", "");
                // payment plan yes / no
                FieldProviderFactory.setField(data, "PAYMENT_PLAN_Y_N", "Display:none");
                // payment plan yes / no
                FieldProviderFactory.setField(data, "NOT_PAYMENT_PLAN_Y_N", "Display:none");
                // invoiceDate
                FieldProviderFactory.setField(data, "INVOICE_DATE", "");
                // dueDate.
                FieldProviderFactory.setField(data, "DUE_DATE", "");
                // expectedDate.
                FieldProviderFactory.setField(data, "EXPECTED_DATE", "");
                // plannedDSO
                FieldProviderFactory.setField(data, "PLANNED_DSO", "0");
                // currentDSO
                FieldProviderFactory.setField(data, "CURRENT_DSO", "0");
                // daysOverdue
                FieldProviderFactory.setField(data, "OVERDUE", "0");

            }

            // transactional and base amounts
            transAmount = FIN_PaymentScheduleDetail.getAmount();

            Currency baseCurrency = OBDal.getInstance().get(Currency.class, strConvertCurrency);

            boolean sameCurrency = baseCurrency.getISOCode().equalsIgnoreCase(transCurrency.getISOCode());

            if (!sameCurrency) {
                convRate = this.getConversionRate(transCurrency, baseCurrency, strConversionDate);

                if (convRate != null) {
                    final int stdPrecission = convRate.getToCurrency().getStandardPrecision().intValue();
                    if (isReceipt) {
                        FieldProviderFactory.setField(data, "TRANS_AMOUNT", transAmount.toString());
                        FieldProviderFactory.setField(data, "BASE_AMOUNT",
                                transAmount.multiply(convRate.getMultipleRateBy())
                                        .setScale(stdPrecission, BigDecimal.ROUND_HALF_UP).toString());
                    } else {
                        FieldProviderFactory.setField(data, "TRANS_AMOUNT", transAmount.negate().toString());
                        FieldProviderFactory.setField(data, "BASE_AMOUNT",
                                transAmount.multiply(convRate.getMultipleRateBy())
                                        .setScale(stdPrecission, BigDecimal.ROUND_HALF_UP).negate().toString());
                    }
                } else {
                    String message = transCurrency.getISOCode() + " -> " + baseCurrency.getISOCode() + " "
                            + strConversionDate;
                    throw new OBException(message);
                }
            } else {
                convRate = null;
                if (isReceipt) {
                    FieldProviderFactory.setField(data, "TRANS_AMOUNT", transAmount.toString());
                    FieldProviderFactory.setField(data, "BASE_AMOUNT", transAmount.toString());
                } else {
                    FieldProviderFactory.setField(data, "TRANS_AMOUNT", transAmount.negate().toString());
                    FieldProviderFactory.setField(data, "BASE_AMOUNT", transAmount.negate().toString());
                }
            }

            // currency
            FieldProviderFactory.setField(data, "BASE_CURRENCY", baseCurrency.getISOCode());
            // baseCurrency
            FieldProviderFactory.setField(data, "TRANS_CURRENCY", transCurrency.getISOCode());

            // Balance
            String status = "RPAE";
            try {
                status = FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getStatus();
            } catch (NullPointerException e) {
            }
            final boolean isCreditPayment = FIN_PaymentScheduleDetail.getInvoicePaymentSchedule() == null
                    && FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment() != null;

            BigDecimal balance = BigDecimal.ZERO;
            if (isCreditPayment && status != null && "PWNC RPR RPPC PPM RDNC".indexOf(status) >= 0) {
                balance = FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getGeneratedCredit()
                        .subtract(
                                FIN_PaymentScheduleDetail.getPaymentDetails().getFinPayment().getUsedCredit());
                if (isReceipt) {
                    balance = balance.negate();
                }
            } else if (!isCreditPayment && status != null
                    && "PWNC RPR RPPC PPM RDNC RPVOID".indexOf(status) == -1) {
                balance = isReceipt ? transAmount : transAmount.negate();
            }
            if (convRate != null) {
                final int stdPrecission = convRate.getToCurrency().getStandardPrecision().intValue();
                balance = balance.multiply(convRate.getMultipleRateBy()).setScale(stdPrecission,
                        BigDecimal.ROUND_HALF_UP);
            }
            FieldProviderFactory.setField(data, "BALANCE", balance.toString());

            finPaymDetail = FIN_PaymentScheduleDetail.getPaymentDetails();

            // Payment Schedule Detail grouping criteria
            if (finPaymDetail != null && FIN_PaymentScheduleDetail.getInvoicePaymentSchedule() != null) {
                mustGroup = finPaymDetail.getFinPayment().getId().equalsIgnoreCase(previousPaymentId)
                        && FIN_PaymentScheduleDetail.getInvoicePaymentSchedule().getId()
                                .equalsIgnoreCase(previousFPSDInvoiceId);
                previousFPSDInvoiceId = FIN_PaymentScheduleDetail.getInvoicePaymentSchedule().getId();
                previousPaymentId = finPaymDetail.getFinPayment().getId();
            } else if (finPaymDetail != null && FIN_PaymentScheduleDetail.getInvoicePaymentSchedule() == null) {
                mustGroup = finPaymDetail.getFinPayment().getId().equalsIgnoreCase(previousPaymentId)
                        && previousFPSDInvoiceId == null;
                previousPaymentId = finPaymDetail.getFinPayment().getId();
                previousFPSDInvoiceId = null;
            } else if (finPaymDetail == null && FIN_PaymentScheduleDetail.getInvoicePaymentSchedule() != null) {
                mustGroup = previousPaymentId == null && FIN_PaymentScheduleDetail.getInvoicePaymentSchedule()
                        .getId().equalsIgnoreCase(previousFPSDInvoiceId);
                previousPaymentId = null;
                previousFPSDInvoiceId = FIN_PaymentScheduleDetail.getInvoicePaymentSchedule().getId();
            } else {
                mustGroup = false;
            }

            if (mustGroup) {
                amountSum = amountSum.add(transAmount);
                balanceSum = balanceSum.add(balance);
            } else {
                if (previousRow != null) {
                    // The current row has nothing to do with the previous one. Because of that, the
                    // previous row has to be added to grouped data.
                    if (previousRow.getField("ISRECEIPT").equalsIgnoreCase("Y"))
                        FieldProviderFactory.setField(previousRow, "TRANS_AMOUNT", amountSum.toString());
                    else
                        FieldProviderFactory.setField(previousRow, "TRANS_AMOUNT",
                                amountSum.negate().toString());
                    FieldProviderFactory.setField(previousRow, "BALANCE", balanceSum.toString());
                    if (previousConvRate == null) {
                        if (previousRow.getField("ISRECEIPT").equalsIgnoreCase("Y"))
                            FieldProviderFactory.setField(previousRow, "BASE_AMOUNT", amountSum.toString());
                        else
                            FieldProviderFactory.setField(previousRow, "BASE_AMOUNT",
                                    amountSum.negate().toString());
                    } else {
                        final int stdPrecission = previousConvRate.getToCurrency().getStandardPrecision()
                                .intValue();
                        if (previousRow.getField("ISRECEIPT").equalsIgnoreCase("Y"))
                            FieldProviderFactory.setField(previousRow, "BASE_AMOUNT",
                                    amountSum.multiply(previousConvRate.getMultipleRateBy())
                                            .setScale(stdPrecission, BigDecimal.ROUND_HALF_UP).toString());
                        else
                            FieldProviderFactory.setField(previousRow, "BASE_AMOUNT",
                                    amountSum.multiply(previousConvRate.getMultipleRateBy())
                                            .setScale(stdPrecission, BigDecimal.ROUND_HALF_UP).negate()
                                            .toString());
                    }

                    if (strAmountFrom.isEmpty() && strAmountTo.isEmpty()) {
                        isAmtInLimit = true;
                    } else if (!strAmountFrom.isEmpty() && strAmountTo.isEmpty()) {
                        isAmtInLimit = Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) >= Double
                                .parseDouble(strAmountFrom);
                    } else if (strAmountFrom.isEmpty() && !strAmountTo.isEmpty()) {
                        isAmtInLimit = Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) <= Double
                                .parseDouble(strAmountTo);
                    } else {
                        isAmtInLimit = Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) >= Double
                                .parseDouble(strAmountFrom)
                                && Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) <= Double
                                        .parseDouble(strAmountTo);
                    }
                    if (isAmtInLimit) {
                        lastGroupedDatarow = previousRow;
                        isAmtInLimit = false;
                        numberOfElements++;
                    }
                }
                previousRow = data;
                previousConvRate = convRate;
                amountSum = transAmount;
                balanceSum = balance;
            }

            // group_crit_id this is the column that has the ids of the grouping criteria selected
            if (strGroupCrit.equalsIgnoreCase("APRM_FATS_BPARTNER")) {
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT_ID", previousRow.getField("BPARTNER"));
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT", "Business Partner");
            } else if (strGroupCrit.equalsIgnoreCase("Project")) {
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT_ID", previousRow.getField("PROJECT"));
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT", "Project");
            } else if (strGroupCrit.equalsIgnoreCase("FINPR_BPartner_Category")) {
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT_ID", previousRow.getField("BP_GROUP"));
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT", "Business Partner Category");
            } else if (strGroupCrit.equalsIgnoreCase("INS_CURRENCY")) {
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT_ID",
                        previousRow.getField("TRANS_CURRENCY"));
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT", "Currency");
            } else if (strGroupCrit.equalsIgnoreCase("ACCS_ACCOUNT_ID_D")) {
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT_ID",
                        previousRow.getField("FINANCIAL_ACCOUNT"));
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT", "Financial Account");
            } else {
                FieldProviderFactory.setField(previousRow, "GROUP_CRIT_ID", "");
            }

            // Insert the transactions without payment if necessary
            if (lastElement != numberOfElements) {
                if (transactionsList.size() > 0) {
                    try {
                        existsConvRate = insertIntoTotal(lastGroupedDatarow, transactionsList, totalData,
                                strGroupCrit, strOrdCrit, strConvertCurrency, strConversionDate);
                    } catch (OBException e) {
                        // If there is no conversion rate
                        throw e;
                    }
                }
                totalData.add(lastGroupedDatarow);
                lastElement++;
            }

        }
        if (previousRow != null) {
            // The current row has nothing to do with the previous one. Because of that, the
            // previous row has to be added to grouped data.
            if (previousRow.getField("ISRECEIPT").equalsIgnoreCase("Y"))
                FieldProviderFactory.setField(previousRow, "TRANS_AMOUNT", amountSum.toString());
            else
                FieldProviderFactory.setField(previousRow, "TRANS_AMOUNT", amountSum.negate().toString());
            FieldProviderFactory.setField(previousRow, "BALANCE", balanceSum.toString());
            if (previousConvRate == null) {
                if (previousRow.getField("ISRECEIPT").equalsIgnoreCase("Y"))
                    FieldProviderFactory.setField(previousRow, "BASE_AMOUNT", amountSum.toString());
                else
                    FieldProviderFactory.setField(previousRow, "BASE_AMOUNT", amountSum.negate().toString());
            } else {
                final int stdPrecission = previousConvRate.getToCurrency().getStandardPrecision().intValue();
                if (previousRow.getField("ISRECEIPT").equalsIgnoreCase("Y"))
                    FieldProviderFactory.setField(previousRow, "BASE_AMOUNT",
                            amountSum.multiply(previousConvRate.getMultipleRateBy())
                                    .setScale(stdPrecission, BigDecimal.ROUND_HALF_UP).toString());
                else
                    FieldProviderFactory.setField(previousRow, "BASE_AMOUNT",
                            amountSum.multiply(previousConvRate.getMultipleRateBy())
                                    .setScale(stdPrecission, BigDecimal.ROUND_HALF_UP).negate().toString());
            }

            if (strAmountFrom.isEmpty() && strAmountTo.isEmpty()) {
                isAmtInLimit = true;
            } else if (!strAmountFrom.isEmpty() && strAmountTo.isEmpty()) {
                isAmtInLimit = Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) >= Double
                        .parseDouble(strAmountFrom);
            } else if (strAmountFrom.isEmpty() && !strAmountTo.isEmpty()) {
                isAmtInLimit = Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) <= Double
                        .parseDouble(strAmountTo);
            } else {
                isAmtInLimit = Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) >= Double
                        .parseDouble(strAmountFrom)
                        && Double.parseDouble(previousRow.getField("TRANS_AMOUNT")) <= Double
                                .parseDouble(strAmountTo);
            }
            if (isAmtInLimit) {
                lastGroupedDatarow = previousRow;
                isAmtInLimit = false;
                numberOfElements++;
            }
        }

        // Insert the transactions without payment if necessary
        if (lastElement != numberOfElements) {
            if (transactionsList.size() > 0) {
                try {
                    existsConvRate = insertIntoTotal(lastGroupedDatarow, transactionsList, totalData,
                            strGroupCrit, strOrdCrit, strConvertCurrency, strConversionDate);
                } catch (OBException e) {
                    // If there is no conversion rate
                    throw e;
                }
            }
            totalData.add(lastGroupedDatarow);
            lastElement++;
        }

        // Insert the remaining transactions wihtout payment if necessary
        while (transactionsList.size() > 0) {
            // throws OBException if there is no conversion rate
            FieldProvider transactionData = createFieldProviderForTransaction(transactionsList.get(0),
                    strGroupCrit, strConvertCurrency, strConversionDate);
            totalData.add(transactionData);
            transactionsList.remove(0);
        }
    } finally {
        if (scroller != null) {
            scroller.close();
        }
        OBContext.restorePreviousMode();
    }
    return totalData.toArray(new FieldProvider[totalData.size()]);
}

From source file:org.openbravo.service.json.DataEntityQueryService.java

License:Open Source License

/**
 * @return a result which can be scrolled forward only and the results are not cached
 *//*from   w ww  .j ava  2s . c  om*/
public ScrollableResults scroll() {
    final Query qry = buildOBQuery().createQuery();
    qry.setFetchSize(1000);
    qry.setCacheable(false);
    return qry.scroll(ScrollMode.FORWARD_ONLY);
}

From source file:org.openbravo.test.dal.DalPerformanceExampleTest.java

License:Open Source License

/**
 * Show explicit joining of referenced objects
 *//*www  .  j  ava  2  s  . com*/
@Test
public void testJoinReferencedObjects() {
    setTestUserContext();
    {
        int i = 0;
        final OBQuery<BusinessPartner> bpQuery = OBDal.getInstance().createQuery(BusinessPartner.class, "");
        bpQuery.setMaxResult(1000);
        final ScrollableResults scroller = bpQuery.scroll(ScrollMode.FORWARD_ONLY);
        while (scroller.next()) {
            final BusinessPartner bp = (BusinessPartner) scroller.get()[0];

            // this will load the category object with a separate query
            System.err.println(bp.getBusinessPartnerCategory().getIdentifier());

            // clear the session every 100 records
            if ((i % 10) == 0) {
                OBDal.getInstance().getSession().clear();
            }
            i++;
        }
    }

    // start with an empty session
    OBDal.getInstance().getSession().clear();

    {
        int i = 0;
        // for joining referenced objects we can't use OBQuery, but have to
        // use a direct Hibernate query object
        final String queryStr = "from BusinessPartner as bp left join bp.businessPartnerCategory where bp.organization.id "
                + OBDal.getInstance().getReadableOrganizationsInClause();

        final Query qry = OBDal.getInstance().getSession().createQuery(queryStr);
        qry.setMaxResults(1000);
        final ScrollableResults scroller = qry.scroll(ScrollMode.FORWARD_ONLY);
        while (scroller.next()) {
            final BusinessPartner bp = (BusinessPartner) scroller.get()[0];

            // the category is already loaded, so this won't fire a query
            System.err.println(bp.getBusinessPartnerCategory().getIdentifier());

            // clear the session every 100 records
            if ((i % 100) == 0) {
                OBDal.getInstance().getSession().clear();
            }
            i++;
        }
    }
}