public void saveGR() {
   LogManager log = new LogManager();
   try {
     // µÃǨÇèÒµéͧÁÕ¡ÒáÓ˹´ StorageLocation
     /*for (GoodsReceiptItem grItem : grItemList) {
     	if (grItem.getStorageLocation()== null ){
     		throw new ControllerException("¡ÃسÒÃкØʶҹ·Õè¨Ñ´à¡çºãËé¡Ñº·Ø¡ÃÒ¡Ò÷Õèµéͧ¡ÒÃÃѺà¢éÒ¤Åѧ");
     	}
     }*/
     if (isItemAmountOrPriceChanged == true && !editGR.getTotalDiscountAmount().equals(zero)) {
       throw new ControllerException("¡Ãسҡ´»ØèÁ¡ÃШÒÂÊèǹŴÍÕ¡¤ÃÑé§");
     }
     editGR.setGoodsReceiptItems(grItemList);
     if (editGR.getId() == null) {
       editGR.setBudgetYear(budgetYear);
       editGR = grController.saveGoodsReceipt(editGR);
       log.recordCreateGr(editGR.getFormattedGrNumber(), editGR.getTotalPrice());
     } else {
       editGR = grController.saveGoodsReceipt(editGR);
       log.recordUpdateGr(editGR.getFormattedGrNumber(), editGR.getTotalPrice());
     }
     createPOSelectItemList();
     listGR();
     grTableRowClicked();
     isGrSaved = true;
   } catch (ControllerException e) {
     FacesUtils.reportError(FacesContext.getCurrentInstance(), e.getMessage(), e.getMessage(), e);
     e.printStackTrace();
   }
 }
  public void printGR() {
    LogManager log = new LogManager();
    try {
      JasperReport report = null;
      report =
          (JasperReport)
              JRLoader.loadObject(this.getClass().getResource("/welfare/reports/grForm.jasper"));
      // report = (JasperReport)JRLoader.loadObject("D:/grForm.jasper");

      ArrayList<PurchasingGRReportData> grReportList = new ArrayList<PurchasingGRReportData>();

      for (GoodsReceiptItem goodsReceiptItem : grItemList) {
        PurchasingGRReportData grReport = new PurchasingGRReportData();

        grReport.setItemNo(goodsReceiptItem.getItemNumber());
        grReport.setOrderQty(goodsReceiptItem.getOrderQty());
        grReport.setReceivedQty(goodsReceiptItem.getReceivedQty());
        grReport.setUnit(goodsReceiptItem.getReceiveUnit());
        grReport.setUnitPrice(goodsReceiptItem.getUnitPrice());

        String material = "";
        if (goodsReceiptItem.getMaterial() == null) {
          material = goodsReceiptItem.getOtherMaterial();
        } else {
          material = goodsReceiptItem.getMaterial().getDescription();
        }
        grReport.setMaterial(material);
        grReportList.add(grReport);
      }

      vendor = poController.getVendorForReport(editGR.getPurchaseOrder().getId());
      String text = "";
      if (editGR.getStatus().toString().equals("GR-FULL")) {
        text = "ÃѺàµçÁ¨Ó¹Ç¹";
      }
      if (editGR.getStatus().toString().equals("GR-PAR")) {
        text = "ÃѺäÁèàµçÁ¨Ó¹Ç¹";
      }

      HashMap grReportHashMap = new HashMap();
      grReportHashMap.put("grNo", editGR.getFormattedGrNumber());
      grReportHashMap.put("receivedDate", editGR.getReceivedDate());
      grReportHashMap.put("poNo", editGR.getPurchaseOrder().getFormattedPoNumber());
      grReportHashMap.put("status", editGR.getStatus().toString());
      grReportHashMap.put("invoiceNo", editGR.getInvoiceNumber());
      if (vendor != null) {
        grReportHashMap.put("vendor", vendor.getName());
      } else {
        grReportHashMap.put("vendor", editGR.getPurchaseOrder().getOtherVendor());
      }
      grReportHashMap.put("text", text);
      grReportHashMap.put("recipientName", editGR.getRecipientName());
      grReportHashMap.put("entryName", editGR.getEntryName());
      grReportHashMap.put("recipientPos", editGR.getRecipientPos());
      grReportHashMap.put("entryPos", editGR.getEntryPos());
      grReportHashMap.put("totalPrice", editGR.getTotalPrice());
      grReportHashMap.put("totalDiscount", editGR.getTotalDiscountAmount());
      grReportHashMap.put("LOGO", this.getClass().getResource("/welfare/reports/logo.gif"));
      grReportHashMap.put("logo", this.getClass().getResource("/welfare/reports/aerologo.png"));

      JasperPrint jasperPrint =
          JasperFillManager.fillReport(
              report, grReportHashMap, new JRBeanCollectionDataSource(grReportList));

      // JasperExportManager.exportReportToPdfFile(jasperPrint,"D:/testGR.pdf");
      byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint);
      ReportUtils.displayPdfReport(bytes);
      log.recordPrintGr(editGR.getFormattedGrNumber());

    } catch (JRException e) {
      // TODO: handle exception
      e.printStackTrace();
      e.getMessage();
    } catch (ControllerException e) {
      FacesUtils.reportError(FacesContext.getCurrentInstance(), e.getMessage(), e.getMessage(), e);
      e.printStackTrace();
    } catch (IOException e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }
  public void distributeDiscount() {
    System.out.println("distributed discount");
    BigDecimal sumTotalPrice = new BigDecimal("0.00");
    BigDecimal maxTotalPrice = new BigDecimal("0.00");
    BigDecimal sumOfTotalDiscount = new BigDecimal("0.00");
    BigDecimal difference = new BigDecimal("0.00");
    int itemNumberOfmaxTotalPrice = 0;
    GoodsReceiptItem grItem;
    ArrayList<GoodsReceiptItem> tempGrItemList = new ArrayList<GoodsReceiptItem>();

    tempGrItemList.addAll(grItemList);
    grItemList.clear();

    for (GoodsReceiptItem item : tempGrItemList) {
      if (maxTotalPrice.compareTo(item.getTotalprice()) == -1) {
        maxTotalPrice = item.getTotalprice();
        itemNumberOfmaxTotalPrice = item.getItemNumber();
      }
      sumTotalPrice = sumTotalPrice.add(item.getTotalprice());
    }

    for (GoodsReceiptItem item : tempGrItemList) {
      BigDecimal discountAmount = new BigDecimal("0.00");
      BigDecimal netPrice = new BigDecimal("0.00");
      BigDecimal avgprice = new BigDecimal("0.00");

      discountAmount =
          (item.getTotalprice().divide(sumTotalPrice, 2, RoundingMode.HALF_UP))
              .multiply(editGR.getTotalDiscountAmount());
      netPrice = item.getTotalprice().subtract(discountAmount);
      avgprice = netPrice.divide(item.getReceivedQty(), 2, RoundingMode.HALF_UP);
      sumOfTotalDiscount = sumOfTotalDiscount.add(discountAmount);

      grItem = new GoodsReceiptItem();
      grItem.setBudgetItem(item.getBudgetItem());
      grItem.setGoodsReceipt(item.getGoodsReceipt());
      grItem.setId(item.getId());
      grItem.setItemNumber(item.getItemNumber());
      grItem.setMaterial(item.getMaterial());
      grItem.setOldReceivedQty(item.getOldReceivedQty());
      grItem.setOrderQty(item.getOrderQty());
      grItem.setOrderUnitPrice(item.getOrderUnitPrice());
      grItem.setOtherMaterial(item.getOtherMaterial());
      grItem.setReceivedQty(item.getReceivedQty());
      grItem.setReceiveUnit(item.getReceiveUnit());
      grItem.setStatus(item.getStatus());
      grItem.setStockMovements(item.getStockMovements());
      grItem.setStorageLocation(item.getStorageLocation());
      grItem.setUnitPrice(item.getUnitPrice());
      grItem.setTotalprice(item.getTotalprice());
      grItem.setDiscountAmount(discountAmount);
      grItem.setNetPrice(netPrice);
      grItem.setAvgPrice(avgprice);
      grItemList.add(grItem);
    }

    difference = editGR.getTotalDiscountAmount().subtract(sumOfTotalDiscount);
    if (difference.compareTo(zero) != 0) {
      recalculate(difference, itemNumberOfmaxTotalPrice);
    }
    isItemAmountOrPriceChanged = false;
  }
  public boolean isItemDiscountable() {

    return editGR.getTotalDiscountAmount().compareTo(zero) == 0;
  }