docs: @Override
    public final void hndCartChan(final Map<String, Object> pRqVs,
      final Cart pCart, final TaxDestination pTxRules) throws Exception {
      @SuppressWarnings("unchecked")
      List<Deliv> dlvMts = (List<Deliv>) pRqVs.get("dlvMts");
      Deliv cdl = null;
      for (Deliv dl : dlvMts) {
        if (dl.getItsId().equals(pCart.getDeliv())) {
          cdl = dl;
          break;
        }
      }
      if (cdl == null) {
        throw new Exception("wrong delivering!");
      }
      //it must be at least one item to add forced service:
      boolean crtEmpty = true;
      CartLn clFrc = null;
      CartLn clEm = null;
      for (CartLn cl : pCart.getItems()) {
        if (cl.getDisab()) {
          clEm = cl;
        } else if (!cl.getDisab() && cl.getForc()) {
          clFrc = cl;
        } else if (!cl.getDisab() && !cl.getForc()) {
          crtEmpty = false;
        }
      }
      if (clFrc == null && cdl.getFrcSr() == null || cdl.getApMt() == null) {
        return;
      }
      if (crtEmpty) {
        if (clFrc != null) {
          delLine(pRqVs, clFrc, pTxRules);
        }
        return;
      }
      int cartTot;
      AccSettings as = (AccSettings) pRqVs.get("accSet");
      TradingSettings ts = (TradingSettings) pRqVs.get("tradSet");
      BigDecimal ct = pCart.getTot();
      if (clFrc != null && clFrc.getTot().compareTo(BigDecimal.ZERO) == 1) {
        ct = ct.subtract(clFrc.getTot());
      }
      if (pCart.getExcRt().compareTo(BigDecimal.ONE) == 0) {
        cartTot = ct.intValue();
      } else {
        cartTot = ct.divide(pCart.getExcRt(), as.getPricePrecision(),
          as.getRoundingMode()).intValue();
      }
      if (cartTot >= cdl.getApMt()) {
        if (clFrc != null && clFrc.getTot().compareTo(BigDecimal.ZERO) == 1) {
          clFrc.setPrice(BigDecimal.ZERO);
          clFrc.setTot(BigDecimal.ZERO);
          clFrc.setTotTx(BigDecimal.ZERO);
          clFrc.setSubt(BigDecimal.ZERO);
          clFrc.setTxDsc(null);
          clFrc.setTxCat(null);
          this.srvOrm.updateEntity(pRqVs, clFrc);
          makeCartTotals(pRqVs, ts, clFrc, as, pTxRules);
        }
      } else {
        if (clFrc == null) {
          if (clEm == null) {
            clFrc = new CartLn();
            clFrc.setIsNew(true);
            clFrc.setItsOwner(pCart);
            pCart.getItems().add(clFrc);
          } else {
            clFrc = clEm;
          }
          clFrc.setSel(null);
          clFrc.setForc(true);
          clFrc.setDisab(false);
          clFrc.setItTyp(EShopItemType.SERVICE);
          clFrc.setItId(cdl.getFrcSr().getItsId());
          clFrc.setItsName(cdl.getFrcSr().getItsName());
          clFrc.setUom(cdl.getFrcSr().getDefUnitOfMeasure());
          clFrc.setAvQuan(BigDecimal.ONE);
          clFrc.setQuant(BigDecimal.ONE);
          clFrc.setUnStep(BigDecimal.ONE);
          makeCartLine(pRqVs, clFrc, as, ts, pTxRules, true, true);
          makeCartTotals(pRqVs, ts, clFrc, as, pTxRules);
        } else if (clFrc.getTot().compareTo(BigDecimal.ZERO) == 0) {
          makeCartLine(pRqVs, clFrc, as, ts, pTxRules, true, true);
          makeCartTotals(pRqVs, ts, clFrc, as, pTxRules);
        }
      }
    }