@Transactional
  public void reconcileAddRV(
      User loggedOnUser,
      List<RvLineItem> rvLineItems,
      ReconciliationVoucher reconciliationVoucher) {

    if (reconciliationVoucher == null || reconciliationVoucher.getId() == null) {
      // reconciliationVoucher = new ReconciliationVoucher();
      reconciliationVoucher.setCreateDate(new Date());
      reconciliationVoucher.setCreatedBy(loggedOnUser);
      reconciliationVoucher.setReconciliationType(
          EnumReconciliationType.Add.asReconciliationType());
    }
    reconciliationVoucher =
        (ReconciliationVoucher) reconciliationVoucherDao.save(reconciliationVoucher);

    logger.debug("rvLineItems@Save: " + rvLineItems.size());

    for (RvLineItem rvLineItem : rvLineItems) {
      Sku sku = rvLineItem.getSku();
      if (sku == null) {
        sku =
            skuService.getSKU(rvLineItem.getProductVariant(), reconciliationVoucher.getWarehouse());
      }
      if (rvLineItem.getQty() != null && rvLineItem.getQty() == 0 && rvLineItem.getId() != null) {
        getBaseDao().delete(rvLineItem);
      } else if (rvLineItem.getId() == null) {

        Long additionType = rvLineItem.getReconciliationType().getId();
        EnumReconciliationType enumReconciliationType =
            EnumReconciliationType.getEnumReconciliationTypeById(additionType);
        InvTxnType invTxnType = null;

        switch (enumReconciliationType) {
          case AddDamage:
            invTxnType = inventoryService.getInventoryTxnType(EnumInvTxnType.RV_ADD_DAMAGED);
            break;
          case AddExpired:
            invTxnType = inventoryService.getInventoryTxnType(EnumInvTxnType.RV_ADD_EXPIRED);
            break;
          case AddBatchMismatch:
            invTxnType = inventoryService.getInventoryTxnType(EnumInvTxnType.RV_ADD_BATCH_MISMATCH);
            break;
          case CustomerReturn:
            invTxnType = inventoryService.getInventoryTxnType(EnumInvTxnType.RV_CUSTOMER_RETURN);
            break;
          case PharmaReturn:
            invTxnType = inventoryService.getInventoryTxnType(EnumInvTxnType.RV_PHARMA_RETURN);
            break;
          case AddFreeVariant:
            invTxnType =
                inventoryService.getInventoryTxnType(EnumInvTxnType.RV_ADD_FREE_VARIANT_RECONCILE);
            break;
          case AddIncorrectCounting:
            invTxnType =
                inventoryService.getInventoryTxnType(EnumInvTxnType.RV_ADD_INCORRECT_COUNTING);
            break;
        }

        rvLineItem.setSku(sku);
        rvLineItem.setReconciliationVoucher(reconciliationVoucher);
        rvLineItem = (RvLineItem) getBaseDao().save(rvLineItem);
        SkuGroup skuGroup = null;
        if (productVariantInventoryDao.getPVIForRV(sku, rvLineItem).isEmpty()) {
          // Create batch and checkin inv
          //                        SkuGroup skuGroup =
          // adminInventoryService.createSkuGroup(rvLineItem.getBatchNumber(),
          // rvLineItem.getMfgDate(), rvLineItem.getExpiryDate(), rvLineItem.getCostPrice(),
          // rvLineItem.getMrp(), null, reconciliationVoucher, null, sku);
          skuGroup =
              adminInventoryService.createSkuGroupWithoutBarcode(
                  rvLineItem.getBatchNumber(),
                  rvLineItem.getMfgDate(),
                  rvLineItem.getExpiryDate(),
                  rvLineItem.getCostPrice(),
                  rvLineItem.getMrp(),
                  null,
                  reconciliationVoucher,
                  null,
                  sku);
          adminInventoryService.createSkuItemsAndCheckinInventory(
              skuGroup,
              rvLineItem.getQty(),
              null,
              null,
              rvLineItem,
              null,
              invTxnType,
              loggedOnUser);
          rvLineItem.setSkuGroup(skuGroup);
        }
        rvLineItem.setReconciledQty(rvLineItem.getQty());
        rvLineItem = (RvLineItem) getBaseDao().save(rvLineItem);

        // Add PVI Entry with -1  and  set sku item status to expired
        if ((additionType.intValue()) == (EnumReconciliationType.AddExpired.getId().intValue())) {
          for (SkuItem skuItem : skuGroup.getSkuItems()) {
            adminInventoryService.inventoryCheckinCheckout(
                sku,
                skuItem,
                null,
                null,
                null,
                rvLineItem,
                null,
                EnumInvTxnType.RV_ADD_EXPIRED_AUTOMATIC_DELETION.asInvTxnType(),
                -1L,
                userService.getLoggedInUser());
            skuItem.setSkuItemStatus(EnumSkuItemStatus.Expired.getSkuItemStatus());
            skuGroupService.saveSkuItem(skuItem);
          }
        }

        // Check inventory health now.
        inventoryService.checkInventoryHealth(rvLineItem.getSku().getProductVariant());
      }
    }
  }