private void fillPreviousNCsInLineItems(
      Rnr requisition, Integer numberOfMonths, Date trackingDate) {
    if (numberOfMonths >= 3 && !(requisition.isEmergency() || requisition.isForVirtualFacility())) {
      return;
    }

    for (RnrLineItem lineItem : requisition.getFullSupplyLineItems()) {
      List<RnrLineItem> previousLineItems =
          requisitionRepository.getAuthorizedRegularUnSkippedLineItems(
              lineItem.getProductCode(),
              requisition,
              getNumberOfPreviousNCToTrack(numberOfMonths),
              trackingDate);
      List<Integer> nNormalizedConsumptions =
          (List<Integer>)
              collect(
                  previousLineItems,
                  new Transformer() {
                    @Override
                    public Object transform(Object o) {
                      return ((RnrLineItem) o).getNormalizedConsumption();
                    }
                  });
      lineItem.setPreviousNormalizedConsumptions(nNormalizedConsumptions);
    }
  }
  private void calculateForNonFullSupply(Rnr requisition) {
    for (RnrLineItem lineItem : requisition.getNonFullSupplyLineItems()) {
      lineItem.validateNonFullSupply();

      lineItem.calculatePacksToShip();

      requisition.addToNonFullSupplyCost(lineItem.calculateCost());
    }
  }
  private void calculateForFullSupply(Rnr requisition, ProgramRnrTemplate template) {
    List<LossesAndAdjustmentsType> lossesAndAdjustmentsTypes =
        requisitionRepository.getLossesAndAdjustmentsTypes();

    for (RnrLineItem lineItem : requisition.getNonSkippedLineItems()) {

      lineItem.validateMandatoryFields(template);
      lineItem.calculateForFullSupply(template, requisition.getStatus(), lossesAndAdjustmentsTypes);
      lineItem.validateCalculatedFields(template);

      requisition.addToFullSupplyCost(lineItem.calculateCost());
    }
  }
  public void fillReportingDays(Rnr requisition) {
    Date startDate = requisition.getPeriod().getStartDate();
    Integer numberOfMonths = requisition.getPeriod().getNumberOfMonths();

    List<ProcessingPeriod> twoPreviousPeriods =
        processingScheduleService.getNPreviousPeriodsInDescOrder(requisition.getPeriod(), 2);

    if (twoPreviousPeriods.size() != 0) {
      numberOfMonths = twoPreviousPeriods.get(0).getNumberOfMonths();
      startDate =
          (numberOfMonths < 3 && twoPreviousPeriods.size() != 1)
              ? twoPreviousPeriods.get(1).getStartDate()
              : twoPreviousPeriods.get(0).getStartDate();
    }

    for (RnrLineItem lineItem : requisition.getNonSkippedLineItems()) {
      Integer reportingDays =
          getReportingDaysBasedOnRequisition(
              requisition, lineItem.getProductCode(), startDate, numberOfMonths);
      lineItem.setReportingDays(reportingDays);
    }
  }
        @Override
        public RnrLineItem instantiate(PropertyLookup<RnrLineItem> lookup) {
          RnrLineItem rnrLineItem = new RnrLineItem();
          rnrLineItem.setProductCode(lookup.valueOf(productCode, PRODUCT_CODE));
          rnrLineItem.setProductCategory(lookup.valueOf(productCategory, PRODUCT_CATEGORY));
          rnrLineItem.setBeginningBalance(
              lookup.valueOf(beginningBalance, DEFAULT_BEGINNING_BALANCE));
          rnrLineItem.setQuantityReceived(lookup.valueOf(quantityReceived, QUANTITY_RECEIVED));

          rnrLineItem.addLossesAndAdjustments(lookup.valueOf(lossesAndAdjustments, ONE_LOSS));
          rnrLineItem.setTotalLossesAndAdjustments(
              lookup.valueOf(totalLossesAndAdjustments, TOTAL_LOSSES_AND_ADJUSTMENTS));
          rnrLineItem.setStockInHand(lookup.valueOf(stockInHand, DEFAULT_STOCK_IN_HAND));
          rnrLineItem.setQuantityDispensed(
              lookup.valueOf(quantityDispensed, DEFAULT_QUANTITY_DISPENSED));

          rnrLineItem.setDispensingUnit("tablet");
          rnrLineItem.setMaxMonthsOfStock(1);
          rnrLineItem.setPrice(new Money("2"));
          rnrLineItem.setQuantityApproved(lookup.valueOf(quantityApproved, QUANTITY_APPROVED));

          rnrLineItem.setFullSupply(lookup.valueOf(fullSupply, true));
          rnrLineItem.setStockOutDays(lookup.valueOf(stockOutDays, STOCK_OUT_DAYS));
          rnrLineItem.setNewPatientCount(lookup.valueOf(newPatientCount, NEW_PATIENT_COUNT));
          rnrLineItem.setDosesPerMonth(30);
          rnrLineItem.setDosesPerDispensingUnit(10);
          rnrLineItem.setNormalizedConsumption(37);
          rnrLineItem.setAmc(37);
          rnrLineItem.setMaxMonthsOfStock(2);
          rnrLineItem.setMaxStockQuantity(74);
          rnrLineItem.setCalculatedOrderQuantity(70);
          rnrLineItem.setPackSize(lookup.valueOf(packSize, 6));
          rnrLineItem.setPacksToShip(12);
          rnrLineItem.setPackRoundingThreshold(lookup.valueOf(packRoundingThreshold, 3));
          rnrLineItem.setRoundToZero(lookup.valueOf(roundToZero, ROUND_To_ZERO));
          rnrLineItem.setPrice(new Money("4"));
          rnrLineItem.setQuantityRequested(lookup.valueOf(quantityRequested, QUANTITY_REQUESTED));
          rnrLineItem.setReasonForRequestedQuantity(
              lookup.valueOf(reasonForRequestedQuantity, REASON_FOR_REQUESTED_QUANTITY));
          rnrLineItem.setPacksToShip(lookup.valueOf(packsToShip, PACKS_TO_SHIP));
          rnrLineItem.setRemarks(lookup.valueOf(remarks, REMARKS));
          rnrLineItem.setProductCategoryDisplayOrder(
              lookup.valueOf(productCategoryDisplayOrder, PRODUCT_CATEGORY_DISPLAY_ORDER));
          rnrLineItem.setProductDisplayOrder(
              lookup.valueOf(productDisplayOrder, PRODUCT_DISPLAY_ORDER));
          rnrLineItem.setSkipped(lookup.valueOf(skipped, SKIPPED));
          return rnrLineItem;
        }