docs: @Override
    public final void process(final Map<String, Object> pRqVs,
      final IRequestData pRqDt) throws Exception {
      pRqDt.setAttribute("catalogs", lazyRetrieveCatalogs(pRqVs));
      TradingSettings ts = (TradingSettings)
        pRqVs.get("tradSet");
      String catalogIdStr = pRqDt.getParameter("catalogId");
      Long catId = null;
      if (catalogIdStr != null) {
        catId = Long.valueOf(catalogIdStr);
      }
      if (catId == null && ts.getCatalogOnStart() != null) {
        catId = ts.getCatalogOnStart().getItsId();
      }
      Cart cart = (Cart) pRqDt.getAttribute("cart");
      if (cart == null) {
        cart = this.srvShoppingCart
          .getShoppingCart(pRqVs, pRqDt, false, false);
      }
      AccSettings as = (AccSettings) pRqVs.get("accSet");
      Currency curr = (Currency) pRqVs.get("wscurr");
      List<CurrRate> currRates = (List<CurrRate>) pRqVs.get("currRates");
      BigDecimal cuRt = BigDecimal.ONE;
      for (CurrRate cr: currRates) {
        if (cr.getCurr().getItsId().equals(curr.getItsId())) {
          cuRt = cr.getRate();
          break;
        }
      }
      if (cart != null) {
        if (cart.getTot().compareTo(BigDecimal.ZERO) == 0) {
          pRqDt.setAttribute("cart", null);
        } else {
          if (!cart.getCurr().getItsId().equals(curr.getItsId())) {
            cart.setCurr(curr);
            cart.setExcRt(cuRt);
            this.srvShoppingCart.handleCurrencyChanged(pRqVs, cart, as, ts);
          }
          if (pRqDt.getAttribute("txRules") == null) {
            TaxDestination txRules = this.srvShoppingCart
              .revealTaxRules(pRqVs, cart, as);
            pRqDt.setAttribute("txRules", txRules);
          }
          Map<EShopItemType, Map<Long, CartLn>> cartMap =
            new HashMap<EShopItemType, Map<Long, CartLn>>();
          for (CartLn ci : cart.getItems()) {
            if (!ci.getDisab()) {
              Map<Long, CartLn> typedMap = cartMap.get(ci.getItTyp());
              if (typedMap == null) {
                typedMap = new HashMap<Long, CartLn>();
                cartMap.put(ci.getItTyp(), typedMap);
              }
              typedMap.put(ci.getItId(), ci);
            }
          }
          pRqDt.setAttribute("cartMap", cartMap);
        }
      }
      if (catId != null) {
        // either selected by user catalog or "on start" must be
        // if user additionally selected filters (include set of subcatalogs)
        // then the main (root) catalog ID still present in request
        TradingCatalog tcat = findTradingCatalogById(this.catalogs, catId);
        if (tcat == null) {
          this.logger.warn(pRqVs, PrcWebstorePage.class,
            "Can't find catalog #" + catId);
        } else {
          String ordb = pRqDt.getParameter("ordb");
          pRqDt.setAttribute("ordb", ordb);
          String orderBy = null;
          if (ordb != null) {
            if (ordb.equals("pa")) {
              orderBy = " order by ITSPRICE asc";
            } else if (ordb.equals("pd")) {
              orderBy = " order by ITSPRICE desc";
            }
          }
          FilterInteger filterPrice = revialFilterPrice(tcat,
            pRqVs, pRqDt);
          FilterItems<CatalogGs> filterCatalog = revialFilterCatalog(tcat,
            pRqVs, pRqDt);
          List<SpecificsFilter> filtersSpecifics = revialFiltersSpecifics(tcat,
            pRqVs, pRqDt);
          String whereAdd = revWhePri(filterPrice, cuRt);
          String whereCatalog = revealWhereCatalog(tcat, filterCatalog);
          //TODO StringBuffer
          String queryg = null;
          String querys = null;
          String queryseg = null;
          String queryses = null;
          if (ts.getUseAdvancedI18n()) {
            String lang = (String) pRqVs.get("lang");
            String langDef = (String) pRqVs.get("langDef");
            if (!lang.equals(langDef)) {
              if (tcat.getCatalog().getHasGoods()) {
                queryg = lazyGetQuItInLstCaIn().replace(":ITTYP", "0")
      .replace(":TITCAT", "GOODSCATALOG").replace(":CATALOGFILTER", whereCatalog)
    .replace(":WHEREADD", whereAdd).replace(":LANG", lang);
              }
              if (tcat.getCatalog().getHasServices()) {
                querys = lazyGetQuItInLstCaIn().replace(":ITTYP", "1")
    .replace(":TITCAT", "SERVICECATALOG").replace(":CATALOGFILTER", whereCatalog)
  .replace(":WHEREADD", whereAdd).replace(":LANG", lang);
              }
              if (tcat.getCatalog().getHasSeGoods()) {
                queryseg = lazyGetQuItInLstCaIn().replace(":ITTYP", "2")
     .replace(":TITCAT", "SEGOODCATALOG").replace(":CATALOGFILTER", whereCatalog)
   .replace(":WHEREADD", whereAdd).replace(":LANG", lang);
              }
              if (tcat.getCatalog().getHasSeServices()) {
                queryses = lazyGetQuItInLstCaIn().replace(":ITTYP", "3")
            .replace(":TITCAT", "SESRCA").replace(":CATALOGFILTER", whereCatalog)
          .replace(":WHEREADD", whereAdd).replace(":LANG", lang);
              }
            }
          }
          if (tcat.getCatalog().getHasGoods() && queryg == null) {
            queryg = lazyGetQuItInLstCa().replace(":ITTYP", "0")
      .replace(":TITCAT", "GOODSCATALOG").replace(":CATALOGFILTER", whereCatalog)
    .replace(":WHEREADD", whereAdd);
          }
          if (tcat.getCatalog().getHasServices() && querys == null) {
            querys = lazyGetQuItInLstCa().replace(":ITTYP", "1")
    .replace(":TITCAT", "SERVICECATALOG").replace(":CATALOGFILTER", whereCatalog)
  .replace(":WHEREADD", whereAdd);
          }
          if (tcat.getCatalog().getHasSeGoods() && queryseg == null) {
            queryseg = lazyGetQuItInLstCa().replace(":ITTYP", "2")
     .replace(":TITCAT", "SEGOODCATALOG").replace(":CATALOGFILTER", whereCatalog)
   .replace(":WHEREADD", whereAdd);
          }
          if (tcat.getCatalog().getHasSeServices() && queryses == null) {
            queryses = lazyGetQuItInLstCa().replace(":ITTYP", "3")
         .replace(":TITCAT", "SESRCA").replace(":CATALOGFILTER", whereCatalog)
       .replace(":WHEREADD", whereAdd);
          }
          String querygRc = null;
          if (tcat.getCatalog().getHasGoods()) {
            querygRc = lazyGetQuItInLstCaTo().replace(":ITTYP", "0")
      .replace(":TITCAT", "GOODSCATALOG").replace(":CATALOGFILTER", whereCatalog)
    .replace(":WHEREADD", whereAdd);
          }
          String querysRc = null;
          if (tcat.getCatalog().getHasServices()) {
            querysRc = lazyGetQuItInLstCaTo().replace(":ITTYP", "1")
    .replace(":TITCAT", "SERVICECATALOG").replace(":CATALOGFILTER", whereCatalog)
  .replace(":WHEREADD", whereAdd);
          }
          String querysegRc = null;
          if (tcat.getCatalog().getHasSeGoods()) {
            querysegRc = lazyGetQuItInLstCaTo().replace(":ITTYP", "2")
     .replace(":TITCAT", "SEGOODCATALOG").replace(":CATALOGFILTER", whereCatalog)
    .replace(":WHEREADD", whereAdd);
          }
          String querysesRc = null;
          if (tcat.getCatalog().getHasSeServices()) {
            querysesRc = lazyGetQuItInLstCaTo().replace(":ITTYP", "3")
             .replace(":TITCAT", "SESRCA").replace(":CATALOGFILTER", whereCatalog)
              .replace(":WHEREADD", whereAdd);
          }
          boolean isDbgSh = getLogger().getDbgSh(this.getClass())
            && getLogger().getDbgFl() < 13011 && getLogger().getDbgCl() > 13013;
          if (filtersSpecifics != null) {
            if (isDbgSh) {
              getLogger().debug(pRqVs, PrcWebstorePage.class,
                "filters apecifics: size: " + filtersSpecifics.size());
            }
            SpecificsFiltersWhere whereSpec =
              revealWhereSpecifics(filtersSpecifics);
            if (whereSpec != null) {
              if (queryg != null) {
                String querySpec = lazyGetQuItSpFlt()
      .replace(":TITSPEC", "GOODSSPECIFICS").replace(":WHESPITFLR", whereSpec
    .getWhere()).replace(":SPITFLTCO", whereSpec.getWhereCount().toString());
                queryg += querySpec;
                querygRc += querySpec;
              }
              if (querys != null) {
                String querySpec = lazyGetQuItSpFlt()
      .replace(":TITSPEC", "SERVICESPECIFICS").replace(":WHESPITFLR", whereSpec
    .getWhere()).replace(":SPITFLTCO", whereSpec.getWhereCount().toString());
                querys += querySpec;
                querysRc += querySpec;
              }
              if (queryseg != null) {
                String querySpec = lazyGetQuItSpFlt()
      .replace(":TITSPEC", "SEGOODSSPECIFICS").replace(":WHESPITFLR", whereSpec
    .getWhere()).replace(":SPITFLTCO", whereSpec.getWhereCount().toString());
                queryseg += querySpec;
                querysegRc += querySpec;
              }
              if (queryses != null) {
                String querySpec = lazyGetQuItSpFlt()
      .replace(":TITSPEC", "SESERVICESPECIFICS").replace(":WHESPITFLR", whereSpec
    .getWhere()).replace(":SPITFLTCO", whereSpec.getWhereCount().toString());
                queryses += querySpec;
                querysesRc += querySpec;
              }
            }
          }
          if (queryg != null || querys != null || queryseg != null
            || queryses != null) {
            String query = null;
            String queryRc = null;
            if (queryg != null) {
              query = queryg;
              queryRc = querygRc;
            }
            if (querys != null) {
              if (query == null) {
                query = querys;
                queryRc = querysRc;
              } else {
                query += "\n union all \n" + querys;
                queryRc += "\n union all \n" + querysRc;
              }
            }
            if (queryseg != null) {
              if (query == null) {
                query = queryseg;
                queryRc = querysegRc;
              } else {
                query += "\n union all \n" + queryseg;
                queryRc += "\n union all \n" + querysegRc;
              }
            }
            if (queryses != null) {
              if (query == null) {
                query = queryses;
                queryRc = querysesRc;
              } else {
                query += "\n union all \n" + queryses;
                queryRc += "\n union all \n" + querysesRc;
              }
            }
            queryRc = "select count(*) as TOTALROWS from (" + queryRc
              + ") as ALL_TOT";
            if (orderBy != null) {
              query += orderBy;
              queryRc += orderBy;
            }
            queryRc += ";";
            Integer rowCount = this.srvOrm
              .evalRowCountByQuery(pRqVs, ItemInList.class, queryRc);
            Set<String> neededFields = new HashSet<String>();
            neededFields.add("itsType");
            neededFields.add("itemId");
            neededFields.add("itsName");
            neededFields.add("imageUrl");
            neededFields.add("specificInList");
            neededFields.add("itsPrice");
            neededFields.add("previousPrice");
            neededFields.add("availableQuantity");
            neededFields.add("itsRating");
            neededFields.add("detailsMethod");
            pRqVs.put("ItemInListneededFields", neededFields);
            String pageStr = pRqDt.getParameter("page");
            Integer page;
            if (pageStr != null) {
              page = Integer.valueOf(pageStr);
            } else {
              page = 1;
            }
            Integer itemsPerPage = ts.getItemsPerPage();
            int totalPages = this.srvPage.evalPageCount(rowCount, itemsPerPage);
            if (page > totalPages) {
              page = totalPages;
            }
            int firstResult = (page - 1) * itemsPerPage; //0-20,20-40
            List<ItemInList> itemsList = getSrvOrm()
              .retrievePageByQuery(pRqVs, ItemInList.class,
                query, firstResult, itemsPerPage);
            pRqVs.remove("ItemInListneededFields");
            if (ts.getIsUsePriceForCustomer() && cart != null
              && cart.getBuyer().getRegEmail() != null) {
              List<BuyerPriceCategory> buyerPrCats = getSrvOrm()
                .retrieveListWithConditions(pRqVs, BuyerPriceCategory.class,
                  "where BUYER=" + cart.getBuyer().getItsId());
              if (buyerPrCats.size() > 1) {
                this.logger.error(pRqVs, PrcWebstorePage.class,
                  "Several price category for same buyer! buyer ID="
                    + cart.getBuyer().getItsId());
              throw new ExceptionWithCode(ExceptionWithCode.CONFIGURATION_MISTAKE,
                  "several_price_category_for_same_buyer");
              }
              if (buyerPrCats.size() == 1) {
                StringBuffer sbg = null;
                StringBuffer sbs = null;
                StringBuffer sbsg = null;
                StringBuffer sbss = null;
                for (ItemInList iil : itemsList) {
                  if (iil.getItsType().equals(EShopItemType.GOODS)) {
                    if (sbg == null) {
                      sbg = new StringBuffer();
                      sbg.append("(" + iil.getItemId());
                    } else {
                      sbg.append("," + iil.getItemId());
                    }
                  } else if (iil.getItsType().equals(EShopItemType.SERVICE)) {
                    if (sbs == null) {
                      sbs = new StringBuffer();
                      sbs.append("(" + iil.getItemId());
                    } else {
                      sbs.append("," + iil.getItemId());
                    }
                  } else if (iil.getItsType().equals(EShopItemType.SEGOODS)) {
                    if (sbsg == null) {
                      sbsg = new StringBuffer();
                      sbsg.append("(" + iil.getItemId());
                    } else {
                      sbsg.append("," + iil.getItemId());
                    }
                  } else if (iil.getItsType().equals(EShopItemType.SESERVICE)) {
                    if (sbss == null) {
                      sbss = new StringBuffer();
                      sbss.append("(" + iil.getItemId());
                    } else {
                      sbss.append("," + iil.getItemId());
                    }
                  }
                }
                StringBuffer sbq = null;
                if (sbg != null) {
                  sbq = new StringBuffer();
                  sbq.append(
         "select 0 as ITSVERSION, ITEM, ITSPRICE from PRICEGOODS where ITEM in "
      + sbg + ")");
                }
                if (sbs != null) {
                  if (sbq == null) {
                    sbq = new StringBuffer();
                  } else {
                    sbq.append("\n union all \n");
                  }
                  sbq.append(
         "select 1 as ITSVERSION, ITEM, ITSPRICE from SERVICEPRICE where ITEM in "
      + sbs + ")");
                }
                if (sbsg != null) {
                  if (sbq == null) {
                    sbq = new StringBuffer();
                  } else {
                    sbq.append("\n union all \n");
                  }
                  sbq.append(
         "select 2 as ITSVERSION, ITEM, ITSPRICE from SEGOODSPRICE where ITEM in "
      + sbsg + ")");
                }
                if (sbss != null) {
                  if (sbq == null) {
                    sbq = new StringBuffer();
                  } else {
                    sbq.append("\n union all \n");
                  }
                  sbq.append(
       "select 3 as ITSVERSION, ITEM, ITSPRICE from SESERVICEPRICE where ITEM in "
      + sbss + ")");
                }
                if (sbq != null) {
                  sbq.append(";");
                  Set<String> ndFlPr = new HashSet<String>();
                  ndFlPr.add("item");
                  ndFlPr.add("itsPrice");
                  ndFlPr.add("itsVersion"); //actually item type!
                  pRqVs.put("PriceGoodsneededFields", ndFlPr);
                  pRqVs.put("PriceGoodsitemdeepLevel", 1);
               List<PriceGoods> prcs = this.srvOrm.retrieveListByQuery(pRqVs,
                    PriceGoods.class, sbq.toString());
                  pRqVs.remove("PriceGoodsneededFields");
                  pRqVs.remove("PriceGoodsitemdeepLevel");
                  for (PriceGoods pri : prcs) {
                    for (ItemInList iil : itemsList) {
                      long itTyp = iil.getItsType().ordinal();
                      if (iil.getItemId().equals(pri.getItem().getItsId())
                        && itTyp == pri.getItsVersion()) {
                        iil.setItsPrice(pri.getItsPrice());
                        break;
                      }
                    }
                  }
                }
              }
            }
            Integer paginationTail = Integer.valueOf(mngUvdSettings
              .getAppSettings().get("paginationTail"));
            List<Page> pages = this.srvPage.evalPages(page, totalPages,
              paginationTail);
            pRqDt.setAttribute("pages", pages);
            pRqDt.setAttribute("itemsList", itemsList);
            pRqDt.setAttribute("totalItems", rowCount);
          }
          if (filterPrice != null) {
            pRqDt.setAttribute("filterPrice", filterPrice);
          }
          if (filterCatalog != null) {
            pRqDt.setAttribute("filterCatalog", filterCatalog);
          }
          if (filtersSpecifics != null) {
            pRqDt.setAttribute("filtersSpecifics", filtersSpecifics);
          }
          pRqDt.setAttribute("catalog", tcat.getCatalog());
        }
      }
    }