docs: @Override
    public final AItemPrice<?, ?> revealItemPrice(
      final Map<String, Object> pRqVs, final TradingSettings pTs,
        final OnlineBuyer pBuyer, final EShopItemType pItType,
          final Long pItId) throws Exception {
      String lang = (String) pRqVs.get("lang");
      AItemPrice<?, ?> itPrice = null;
      String query;
      Class<?> itemI18nCl;
      Class<?> itemCl;
      Class<?> itemPriceCl;
      if (pItType.equals(EShopItemType.GOODS)) {
        itemCl = InvItem.class;
        itemI18nCl = I18nInvItem.class;
        itemPriceCl = PriceGoods.class;
      } else if (pItType.equals(EShopItemType.SERVICE)) {
        itemCl = ServiceToSale.class;
        itemI18nCl = I18nServiceToSale.class;
        itemPriceCl = ServicePrice.class;
      } else if (pItType.equals(EShopItemType.SESERVICE)) {
        itemCl = SeService.class;
        itemI18nCl = I18nSeService.class;
        itemPriceCl = SeServicePrice.class;
      } else {
        itemCl = SeGoods.class;
        itemI18nCl = I18nSeGoods.class;
        itemPriceCl = SeGoodsPrice.class;
      }
      Set<String> ndFlItPr = new HashSet<String>();
      ndFlItPr.add("item");
      ndFlItPr.add("priceCategory");
      ndFlItPr.add("itsPrice");
      ndFlItPr.add("unStep");
      pRqVs.put(itemPriceCl.getSimpleName() + "neededFields", ndFlItPr);
      pRqVs.put(itemPriceCl.getSimpleName() + "priceCategorydeepLevel", 1);
      Set<String> ndFlIt = new HashSet<String>();
      ndFlIt.add("itsId");
      ndFlIt.add("itsName");
      ndFlIt.add("taxCategory");
      if (pItType.equals(EShopItemType.SEGOODS)
        || pItType.equals(EShopItemType.SESERVICE)) {
        Set<String> ndFlNm = new HashSet<String>();
        ndFlNm.add("itsId");
        ndFlNm.add("itsName");
        ndFlIt.add("seller");
        Set<String> ndFlSe = new HashSet<String>();
        ndFlSe.add("seller");
        pRqVs.put("SeSellerneededFields", ndFlSe);
        pRqVs.put("DebtorCreditorneededFields", ndFlNm);
        pRqVs.put(itemCl.getSimpleName() + "sellerdeepLevel", 3);
      }
      pRqVs.put(itemCl.getSimpleName() + "neededFields", ndFlIt);
      Set<String> ndFlTc = new HashSet<String>();
      ndFlTc.add("itsId");
      ndFlTc.add("itsName");
      ndFlTc.add("aggrOnlyPercent");
      pRqVs.put(InvItemTaxCategory.class.getSimpleName() + "neededFields",
        ndFlTc);
      pRqVs.put(itemPriceCl.getSimpleName() + "itemdeepLevel", 3);
      if (pTs.getIsUsePriceForCustomer() && pBuyer != null) {
        //try to reveal price dedicated to customer:
        List<BuyerPriceCategory> buyerPrCats = getSrvOrm()
          .retrieveListWithConditions(pRqVs, BuyerPriceCategory.class,
            "where BUYER=" + pBuyer.getItsId());
        if (buyerPrCats.size() > 1) {
          this.logger.error(pRqVs, SrvShoppingCart.class,
            "Several price category for same buyer! buyer ID="
              + pBuyer.getItsId());
          throw new ExceptionWithCode(ExceptionWithCode.CONFIGURATION_MISTAKE,
            "several_price_category_for_same_buyer");
        }
        if (buyerPrCats.size() == 1) {
          if (pItType.equals(EShopItemType.GOODS)
            || pItType.equals(EShopItemType.SERVICE)) {
            query = lazyGetQuItemPriceCat();
          } else {
            query = lazyGetQuItemSePriceCat();
          }
          query = query.replace(":ITEMID", pItId.toString());
          query = query.replace(":LANG", lang);
          query = query.replace(":TITEMPRICE", itemPriceCl.getSimpleName()
            .toUpperCase());
          query = query.replace(":TITEM", itemCl.getSimpleName().toUpperCase());
          query = query.replace(":TI18NITEM", itemI18nCl.getSimpleName()
            .toUpperCase());
          StringBuffer pccnd = new StringBuffer("");
          pccnd.append("=" + buyerPrCats.get(0).getPriceCategory().getItsId());
          query = query.replace(":PRCATIDCOND", pccnd);
          itPrice = (AItemPrice<?, ?>) getSrvOrm().retrieveEntity(pRqVs,
            itemPriceCl, query);
        }
      }
      if (itPrice == null) {
        //retrieve price for all:
        if (pItType.equals(EShopItemType.GOODS)
          || pItType.equals(EShopItemType.SERVICE)) {
          query = lazyGetQuItemPrice();
        } else {
          query = lazyGetQuItemSePrice();
        }
        query = query.replace(":ITEMID", pItId.toString());
        query = query.replace(":LANG", lang);
        query = query.replace(":TITEMPRICE", itemPriceCl.getSimpleName()
          .toUpperCase());
        query = query.replace(":TITEM", itemCl.getSimpleName().toUpperCase());
        query = query.replace(":TI18NITEM", itemI18nCl.getSimpleName()
          .toUpperCase());
        @SuppressWarnings("unchecked")
        List<AItemPrice<?, ?>> itPrices = (List<AItemPrice<?, ?>>)
          getSrvOrm().retrieveListByQuery(pRqVs, itemPriceCl, query);
        if (itPrices.size() == 0) {
          throw new ExceptionWithCode(ExceptionWithCode.SOMETHING_WRONG,
            "requested_item_has_no_price");
        }
        if (itPrices.size() > 1) {
          throw new ExceptionWithCode(ExceptionWithCode.SOMETHING_WRONG,
            "requested_item_has_several_prices");
        }
        itPrice = itPrices.get(0);
      }
      pRqVs.remove(itemCl.getSimpleName() + "neededFields");
      pRqVs.remove(itemPriceCl.getSimpleName() + "priceCategorydeepLevel");
      pRqVs.remove(itemPriceCl.getSimpleName() + "neededFields");
      pRqVs.remove(InvItemTaxCategory.class.getSimpleName() + "neededFields");
      pRqVs.remove(itemPriceCl.getSimpleName() + "itemdeepLevel");
      if (pItType.equals(EShopItemType.SEGOODS)
        || pItType.equals(EShopItemType.SESERVICE)) {
        pRqVs.remove("SeSellerneededFields");
        pRqVs.remove(itemCl.getSimpleName() + "sellerdeepLevel");
        pRqVs.remove("DebtorCreditorneededFields");
      }
      return itPrice;
    }