docs: @Override
    public final void makeCartLine(final Map<String, Object> pRqVs,
      final CartLn pCartLn, final AccSettings pAs, final TradingSettings pTs,
        final TaxDestination pTxRules, final boolean pRedoPr,
          final boolean pRedoTxc) throws Exception {
      AItemPrice<?, ?> itPrice = null;
      if (pRedoPr || pRedoTxc) {
        itPrice = revealItemPrice(pRqVs, pTs, pCartLn.getItsOwner().getBuyer(),
          pCartLn.getItTyp(), pCartLn.getItId());
        if (pCartLn.getItTyp().equals(EShopItemType.SESERVICE)
          || pCartLn.getItTyp().equals(EShopItemType.SEGOODS)) {
          IHasSeSeller seItPr = (IHasSeSeller) itPrice;
          pCartLn.setSeller(seItPr.getSeller());
        }
        pCartLn.setPrice(itPrice.getItsPrice());
        pCartLn.setItsName(itPrice.getItem().getItsName());
        BigDecimal qosr = pCartLn.getQuant().remainder(itPrice.getUnStep());
        if (qosr.compareTo(BigDecimal.ZERO) != 0) {
          pCartLn.setQuant(pCartLn.getQuant().subtract(qosr));
        }
        @SuppressWarnings("unchecked")
        List<CurrRate> currRates = (List<CurrRate>) pRqVs.get("currRates");
        for (CurrRate cr: currRates) {
          if (cr.getCurr().getItsId().equals(pCartLn.getItsOwner()
            .getCurr().getItsId())) {
            BigDecimal exchRate = cr.getRate();
            if (exchRate.compareTo(BigDecimal.ZERO) == -1) {
              exchRate = BigDecimal.ONE.divide(exchRate.negate(), 15,
                RoundingMode.HALF_UP);
            }
            pCartLn.getItsOwner().setExcRt(exchRate);
            pCartLn.setPrice(pCartLn.getPrice().multiply(exchRate)
              .setScale(pAs.getPricePrecision(), pAs.getRoundingMode()));
            break;
          }
        }
        BigDecimal amount = pCartLn.getPrice().multiply(pCartLn.getQuant()).
          setScale(pAs.getPricePrecision(), pAs.getRoundingMode());
        if (pTs.getTxExcl()) {
          pCartLn.setSubt(amount);
        } else {
          pCartLn.setTot(amount);
        }
      }
      if (pRedoTxc && pTxRules != null) {
        AItem<?, ?> item = (AItem<?, ?>) itPrice.getItem();
        pCartLn.setTxCat(item.getTaxCategory());
        if (pTs.getTxDests() && pCartLn.getItsOwner().getBuyer()
          .getRegCustomer().getTaxDestination() != null) {
          Class<?> dstTxItLnCl;
          if (pCartLn.getItTyp().equals(EShopItemType.GOODS)) {
            dstTxItLnCl = DestTaxGoodsLn.class;
          } else if (pCartLn.getItTyp().equals(EShopItemType.SERVICE)) {
            dstTxItLnCl = DestTaxServSelLn.class;
          } else if (pCartLn.getItTyp().equals(EShopItemType.SESERVICE)) {
            dstTxItLnCl = DestTaxSeServiceLn.class;
          } else {
            dstTxItLnCl = DestTaxSeGoodsLn.class;
          }
          //override tax method:
          pRqVs.put(dstTxItLnCl.getSimpleName() + "itsOwnerdeepLevel", 1);
          @SuppressWarnings("unchecked")
          List<ADestTaxItemLn<?>> dtls = (List<ADestTaxItemLn<?>>) getSrvOrm()
            .retrieveListWithConditions(pRqVs, dstTxItLnCl,
              "where ITSOWNER=" + pCartLn.getItId());
          pRqVs.remove(dstTxItLnCl.getSimpleName() + "itsOwnerdeepLevel");
          for (ADestTaxItemLn<?> dtl : dtls) {
            if (dtl.getTaxDestination().getItsId().equals(pCartLn.getItsOwner()
              .getBuyer().getRegCustomer().getTaxDestination().getItsId())) {
              pCartLn.setTxCat(dtl.getTaxCategory()); //it may be null
              break;
            }
          }
        }
      }
      BigDecimal totalTaxes = BigDecimal.ZERO;
      List<CartItTxLn> itls = null;
      if (pTxRules != null && pCartLn.getTxCat() != null) {
        if (!pTxRules.getSalTaxIsInvoiceBase()) {
          BigDecimal bd100 = new BigDecimal("100.00");
          if (!pTxRules.getSalTaxUseAggregItBas()) {
            itls = new ArrayList<CartItTxLn>();
            pRqVs.put("InvItemTaxCategoryLineitsOwnerdeepLevel", 1);
            List<InvItemTaxCategoryLine> itcls = getSrvOrm()
          .retrieveListWithConditions(pRqVs, InvItemTaxCategoryLine.class,
        "where ITSOWNER=" + pCartLn.getTxCat().getItsId()
      + " order by INVITEMTAXCATEGORYLINE.ITSPERCENTAGE");
            pRqVs.remove("InvItemTaxCategoryLineitsOwnerdeepLevel");
            BigDecimal taxTot = null;
            BigDecimal taxRest = null;
            if (!pTs.getTxExcl()) {
              taxTot = pCartLn.getTot().subtract(pCartLn.getTot()
          .divide(BigDecimal.ONE.add(pCartLn.getTxCat().getAggrOnlyPercent()
        .divide(bd100)), pAs.getPricePrecision(), pTxRules.getSalTaxRoundMode()));
              taxRest = taxTot;
            }
            StringBuffer sb = new StringBuffer();
            int i = 0;
            for (InvItemTaxCategoryLine itcl : itcls) {
             if (ETaxType.SALES_TAX_OUTITEM.equals(itcl.getTax().getItsType())
            || ETaxType.SALES_TAX_INITEM.equals(itcl.getTax().getItsType())) {
                if (i++ > 0) {
                  sb.append(", ");
                }
                CartItTxLn itl = new CartItTxLn();
                itl.setIsNew(true);
                itl.setTax(itcl.getTax());
                itls.add(itl);
                BigDecimal addTx;
                if (!pTs.getTxExcl()) {
                  if (i < itcls.size()) {
                    addTx = taxTot.multiply(itcl.getItsPercentage()).divide(
                      pCartLn.getTxCat().getAggrOnlyPercent(),
                        pAs.getPricePrecision(), pTxRules.getSalTaxRoundMode());
                    taxRest = taxRest.subtract(addTx);
                  } else {
                    addTx = taxRest;
                  }
                } else {
                  addTx = pCartLn.getSubt().multiply(itcl.getItsPercentage())
          .divide(bd100, pAs.getPricePrecision(), pTxRules.getSalTaxRoundMode());
                }
                totalTaxes = totalTaxes.add(addTx);
                itl.setTot(addTx);
                sb.append(itl.getTax().getItsName() + " " + prn(pRqVs, addTx));
              }
            }
            pCartLn.setTxDsc(sb.toString());
          } else {
            if (!pTs.getTxExcl()) {
          totalTaxes = pCartLn.getTot().subtract(pCartLn.getTot()
      .divide(BigDecimal.ONE.add(pCartLn.getTxCat().getAggrOnlyPercent()
    .divide(bd100)), pAs.getPricePrecision(), pTxRules.getSalTaxRoundMode()));
            } else {
              totalTaxes = pCartLn.getSubt().multiply(pCartLn.getTxCat()
            .getAggrOnlyPercent()).divide(bd100, pAs.getPricePrecision(),
          pTxRules.getSalTaxRoundMode());
            }
            pCartLn.setTxDsc(pCartLn.getTxCat().getItsName());
          }
        } else {
          pCartLn.setTxDsc(pCartLn.getTxCat().getItsName());
        }
      }
      pCartLn.setTotTx(totalTaxes);
      if (pTs.getTxExcl()) {
        pCartLn.setTot(pCartLn.getSubt().add(pCartLn.getTotTx()));
      } else {
        pCartLn.setSubt(pCartLn.getTot().subtract(pCartLn.getTotTx()));
      }
      if (pCartLn.getIsNew()) {
        getSrvOrm().insertEntity(pRqVs, pCartLn);
      } else {
        getSrvOrm().updateEntity(pRqVs, pCartLn);
      }
      if (itls != null) {
        pRqVs.put("CartItTxLnitsOwnerdeepLevel", 1);
        List<CartItTxLn> itlsr = getSrvOrm().retrieveListWithConditions(
            pRqVs, CartItTxLn.class, "where CARTID="
              + pCartLn.getItsOwner().getBuyer().getItsId());
        pRqVs.remove("CartItTxLnitsOwnerdeepLevel");
        for (CartItTxLn itlrt : itlsr) {
          if (!itlrt.getDisab() && itlrt.getItsOwner().getItsId()
            .equals(pCartLn.getItsId())) {
            itlrt.setDisab(true);
          }
        }
        for (CartItTxLn itl : itls) {
          CartItTxLn itlr = null;
          for (CartItTxLn itlrt : itlsr) {
            if (itlrt.getDisab()) {
              itlr = itlrt;
              itlr.setDisab(false);
              break;
            }
          }
          if (itlr == null) {
            itl.setItsOwner(pCartLn);
            if (pCartLn.getSeller() != null) {
              itl.setSellerId(pCartLn.getSeller().getItsId().getItsId());
            }
            itl.setCartId(pCartLn.getItsOwner().getBuyer().getItsId());
            itl.setItsOwner(pCartLn);
            getSrvOrm().insertEntity(pRqVs, itl);
            itl.setIsNew(false);
          } else {
            itlr.setTax(itl.getTax());
            itlr.setTot(itl.getTot());
            itlr.setItsOwner(pCartLn);
            if (pCartLn.getSeller() == null) {
              itlr.setSellerId(null);
            } else {
              itlr.setSellerId(pCartLn.getSeller().getItsId().getItsId());
            }
            itlr.setCartId(pCartLn.getItsOwner().getBuyer().getItsId());
            getSrvOrm().updateEntity(pRqVs, itlr);
          }
        }
        for (CartItTxLn itlrt : itlsr) {
          if (itlrt.getDisab() && itlrt.getItsOwner().getItsId()
            .equals(pCartLn.getItsId())) {
            getSrvOrm().updateEntity(pRqVs, itlrt);
          }
        }
      }
    }