/*
   * =====================================Edit
   * Method==============================
   */
  @RequestMapping(value = "/vendorReturnIdEdit1", method = RequestMethod.GET)
  @Scope("request")
  public String vendorReturnEdit(
      @ModelAttribute VendorReturn vendorReturnIdEdit1,
      BindingResult result,
      HttpServletRequest request,
      HttpServletResponse response,
      Model model) {
    response.setCharacterEncoding("UTF-8");
    List<Float> qtyList = new ArrayList<Float>();
    List<Object> list = null;
    List<VendorReturn> vrEditList = new ArrayList<VendorReturn>();
    List<VendorReturnLine> vrLineEditList = new ArrayList<VendorReturnLine>();
    int vrid = vendorReturnIdEdit1.getVendorReturnId();

    try {

      list = vrService.editVendorReturnWithId(vrid);

      Iterator<Object> iterator = list.iterator();

      if (iterator.hasNext()) {
        Object vrObj = iterator.next();
        VendorReturn vr = (VendorReturn) vrObj;

        vendorReturnIdEdit1.setVendorReturnIdEditt(vr.getVendorReturnId());
        vendorReturnIdEdit1.setVendorReturnNoEditt(vr.getVendorReturnNo());
        vendorReturnIdEdit1.setVendorReturnDateEditt(
            dateService.dateFormat(dateService.dateParse(vr.getVendorReturnDate(), "se"), "se"));
        vendorReturnIdEdit1.setReferenceEditt(vr.getReference());
        vendorReturnIdEdit1.setDescriptionEditt(vr.getDescription());
        vendorReturnIdEdit1.setPurchaseOrderIdEditt(vr.getPurchaseOrderId());
        vendorReturnIdEdit1.setGoodsReceiptIdEdit(vr.getGoodsReceiptId());

        List<VendorReturnLine> listEdit = vr.getVendorReturnLine();

        Iterator<VendorReturnLine> iterator1 = listEdit.iterator();
        while (iterator1.hasNext()) {
          Object vrLineObj = iterator1.next();
          VendorReturnLine vrLine = (VendorReturnLine) vrLineObj;
          VendorReturnLine vrMultiple = new VendorReturnLine();
          vrMultiple.setVendorReturnLineId(vrLine.getVendorReturnLineId());

          int materialId = Integer.parseInt(vrLine.getMaterial_Id());

          int previousUpdatedStock;
          previousUpdatedStock = materialService.materialStockGet(materialId);

          int materialQtyInEditField = (int) (vrLine.getQuantity());
          int stockEdit = previousUpdatedStock + materialQtyInEditField;

          vrMultiple.setStockEdit(stockEdit);

          Material material = vrLine.getMaterialDetails();
          Uom uom = vrLine.getUomDetails();
          ReasonForRejection rfr = vrLine.getRfrDetails();
          StorageLocation storage = vrLine.getStorageDetails();

          vrMultiple.setMaterial_IdEditt((vrLine.getMaterial_Id()));
          vrMultiple.setMaterialName(material.getMaterialName());
          vrMultiple.setQuantityEditt((vrLine.getQuantity()));

          vrMultiple.setBatchNoEdit(vrLine.getBatchNo());
          vrMultiple.setUom_IdEditt(vrLine.getUom_Id());
          vrMultiple.setUomName(uom.getUom());
          vrMultiple.setPriceEditt(vrLine.getPrice());
          vrMultiple.setReasonForRejectionIdEditt(vrLine.getReasonForRejectionId());
          vrMultiple.setRfrName(rfr.getReasonForRejection());
          vrMultiple.setStorageLocationIdEditt(vrLine.getStorageLocationId());
          vrMultiple.setStorageName(storage.getStorageLocation());
          vrLineEditList.add(vrMultiple);
          qtyList.add((float) vrLine.getQuantity());
        }
        vrEditList.add(vendorReturnIdEdit1);
      }

      model.addAttribute("vendorReturnCommand", vendorReturnIdEdit1);
      session = request.getSession(false);
      session.setAttribute("qtyList", qtyList);
      request.setAttribute("vrEditList", vrEditList);
      request.setAttribute("vrLineEditList", vrLineEditList);

    } catch (Exception e) {
      e.printStackTrace();
    }
    return "vendorReturnHome";
  }
  /* ===================================Update Method======================== */
  @RequestMapping(value = "/vendorReturnEdit", method = RequestMethod.GET)
  public String updateVendorReturn(
      @ModelAttribute("vendorReturnCommand") VendorReturn vrEdit,
      HttpServletRequest request,
      HttpServletResponse response,
      Model model) {
    response.setCharacterEncoding("UTF-8");
    VendorReturnLine vrLine = null;
    List<VendorReturnLine> vrLines = null;
    String vendorReturnUpdate = null;
    List<Object[]> ob = null;
    float rejQty = 0.0f, returnQty = 0.0f, qty = 0.0f, diffQty = 0.0f;
    List<String> list = new ArrayList<String>();
    String msg = null;

    String checkVrNo = vrEdit.getVendorReturnNoEditt();

    int id = vrEdit.getVendorReturnIdEditt();

    int list1 = vrService.checkEditDuplicate(checkVrNo, id);

    if (list1 == 0) {

      try {
        float stockEdit = vrEdit.getStockEdit();
        vrEdit.setVendorReturnId(id);
        vrEdit.setVendorReturnNo(vrEdit.getVendorReturnNoEditt());
        vrEdit.setVendorReturnDate(
            dateService.dateFormat(
                dateService.dateParse(vrEdit.getVendorReturnDateEditt(), "au"), "au"));
        vrEdit.setReference(vrEdit.getReferenceEditt());
        vrEdit.setDescription(vrEdit.getDescriptionEditt());
        vrEdit.setPurchaseOrderId(vrEdit.getPurchaseOrderIdEditt());
        vrEdit.setGoodsReceiptId(vrEdit.getGoodsReceiptIdEdit());
        vrLines = new ArrayList<VendorReturnLine>();
        List<Float> newQty = new ArrayList<Float>();

        int[] vrIdUpdate = vrEdit.getVendorReturnLineIdEditt();
        String[] bno = vrEdit.getBatchNoEdit();
        String materialedit = vrEdit.getmIdEditt();
        List<String> meditlist = Arrays.asList(materialedit.split(","));
        Object[] materialiidedit = meditlist.toArray();

        Integer[] quantity = vrEdit.getQuantityEditt();

        String unitedit = vrEdit.getUommEditt();
        List<String> uomeditlist = Arrays.asList(unitedit.split(","));
        Object[] uomidedit = uomeditlist.toArray();

        float[] price = vrEdit.getPriceEditt();

        String rfredit = vrEdit.getRfrIdEditt();
        List<String> rfreditlist = Arrays.asList(rfredit.split(","));
        Object[] rfridedit = rfreditlist.toArray();

        String storageedit = vrEdit.getUommEditt();
        List<String> storageeditlist = Arrays.asList(storageedit.split(","));
        Object[] storageidedit = storageeditlist.toArray();

        String idQL = null;

        if (quantity != null) {
          session = request.getSession(false);
          @SuppressWarnings("unchecked")
          List<Float> oldQty = (List<Float>) session.getAttribute("qtyList");
          for (int i = 0; i < quantity.length; i++) {
            int kk = vrIdUpdate[i];
            // get the Qtys
            ob =
                vrService.getRejQty(
                    Integer.parseInt(vrEdit.getPurchaseOrderId()),
                    Integer.parseInt(vrEdit.getGoodsReceiptId()),
                    materialiidedit[i].toString(),
                    bno[i]);

            if (kk == 0) {
              vrLine = new VendorReturnLine();
              vrLine.setBatchNo(bno[i]);
              vrLine.setMaterial_Id(materialiidedit[i].toString());
              vrLine.setQuantity(quantity[i]);

              /*
               * float afterEdit = vrLine.getQuantity(); int
               * materialId = Integer.parseInt(vrLine
               * .getMaterial_Id()); float finalStock = 0;
               * finalStock = stockEdit - afterEdit;
               *
               * materialService.materialStockUpdate(materialId,
               * finalStock);
               */
              vrLine.setUom_Id(uomidedit[i].toString());
              vrLine.setPrice(price[i]);
              vrLine.setReasonForRejectionId(rfridedit[i].toString());
              vrLine.setStorageLocationId(storageidedit[i].toString());
              vrLines.add(vrLine);
              // update qty returns in GRL
              if (ob != null) {
                Iterator<Object[]> itr = ob.iterator();
                while (itr.hasNext()) {
                  Object[] obj = (Object[]) itr.next();
                  if (obj[0] != null && obj[1] != null) {
                    rejQty = (Float) obj[0];
                    returnQty = (Float) obj[1];
                  } else if (obj[0] != null) {
                    rejQty = (Float) obj[0];
                  }
                }
                diffQty = returnQty + quantity[i].floatValue();
                // update qty returns in GRL
                vrService.updateGRLQtyReturns(
                    Integer.parseInt(vrEdit.getGoodsReceiptIdEdit()),
                    materialiidedit[i].toString(),
                    String.valueOf(bno[i]),
                    diffQty);
              }

            } else {

              vrLine = new VendorReturnLine();
              vrLine.setBatchNo(bno[i]);
              vrLine.setMaterial_Id(materialiidedit[i].toString());
              vrLine.setQuantity(quantity[i]);
              vrLine.setUom_Id(uomidedit[i].toString());
              vrLine.setPrice(price[i]);
              vrLine.setReasonForRejectionId(rfridedit[i].toString());
              vrLine.setStorageLocationId(storageidedit[i].toString());

              newQty.add((float) (quantity[i]));
              String ch = "1", ch1 = "0";
              idQL = request.getParameter(kk + "Check");
              if (ch.equals(idQL)) {
                vrService.deleteVendorReturnLine(kk);
              }
              if (ch1.equals(idQL) || idQL == null) {
                vrLines.add(vrLine);
              }

              if (oldQty.get(i) > (newQty.get(i))) {
                qty = oldQty.get(i) - newQty.get(i);
                if (ob != null) {
                  Iterator<Object[]> itr = ob.iterator();
                  while (itr.hasNext()) {
                    Object[] obj = (Object[]) itr.next();
                    if (obj[0] != null && obj[1] != null) {
                      rejQty = (Float) obj[0];
                      returnQty = (Float) obj[1];
                    } else if (obj[0] != null) {
                      rejQty = (Float) obj[0];
                    }
                  }
                  diffQty = returnQty - qty;
                  // update qty returns in GRL
                  vrService.updateGRLQtyReturns(
                      Integer.parseInt(vrEdit.getGoodsReceiptIdEdit()),
                      materialiidedit[i].toString(),
                      String.valueOf(bno[i]),
                      diffQty);
                }
              } else if (oldQty.get(i) < (newQty.get(i))) {
                qty = newQty.get(i) - oldQty.get(i);
                if (ob != null) {
                  Iterator<Object[]> itr = ob.iterator();
                  while (itr.hasNext()) {
                    Object[] obj = (Object[]) itr.next();
                    if (obj[0] != null && obj[1] != null) {
                      rejQty = (Float) obj[0];
                      returnQty = (Float) obj[1];
                    } else if (obj[0] != null) {
                      rejQty = (Float) obj[0];
                    }
                  }

                  diffQty = returnQty + qty;
                  // update qty returns in GRL
                  vrService.updateGRLQtyReturns(
                      Integer.parseInt(vrEdit.getGoodsReceiptIdEdit()),
                      materialiidedit[i].toString(),
                      String.valueOf(bno[i]),
                      diffQty);
                }

              } else { // Two Quantitys are Equal No update... }

              }
            }
          }
        }
        vrEdit.setVendorReturnLine(vrLines);
        msg = vrService.updateVendorReturn(vrEdit);

        request.setAttribute("updateVendorReturn", "Vendor Return Details Updated Successfully");
      } catch (Exception e) {
        e.printStackTrace();
      }
      if (msg.equals("Vendor Return Details Updated Successfully")) {
        vendorReturnUpdate = "Vendor Return Details Updated Successfully";
        list.add("2");
      } else {
        return "redirect:VendorReturn.mnt?updateFail=" + vendorReturnUpdate + "";
      }

      model.addAttribute("vendorReturnCommand", new VendorReturn());

      return "redirect:VendorReturn.mnt?updateSuccess=" + vendorReturnUpdate + "";
    } else {

      request.setAttribute("vrEditList", "vrEditList");
      return "redirect:VendorReturn.mnt?updateFail=" + vendorReturnUpdate + "";
    }
  }
  /* ================================Add Method========================== */
  @RequestMapping(value = "/vendorReturn", method = RequestMethod.GET)
  public String addVendorReturn(
      @ModelAttribute("vendorReturnCommand") VendorReturn vendorReturnAdd,
      HttpServletRequest request,
      HttpServletResponse response,
      Model model) {

    response.setCharacterEncoding("UTF-8");
    List<String> list = new ArrayList<String>();
    VendorReturnLine vrLine = null;
    List<VendorReturnLine> vrLines = null;
    String vrAddSus = null;
    String msg = null;

    String checkVrNo = vendorReturnAdd.getVendorReturnNo();
    int list1 = vrService.checkDuplicate(checkVrNo);
    if (list1 == 0) {

      try {

        vrLines = new ArrayList<VendorReturnLine>();

        String material = vendorReturnAdd.getmId();
        String[] bNo = vendorReturnAdd.getBatchNo();
        List<String> mlist = Arrays.asList(material.split(","));
        Object[] materialiid = mlist.toArray();

        Integer[] quantity = vendorReturnAdd.getQuantity();
        String unit = vendorReturnAdd.getUomm();
        List<String> uomlist = Arrays.asList(unit.split(","));
        Object[] uomid = uomlist.toArray();

        float[] price = vendorReturnAdd.getPrice();

        String rfr = vendorReturnAdd.getRfrId();
        List<String> rfrlist = Arrays.asList(rfr.split(","));
        Object[] rfrid = rfrlist.toArray();

        String storage = vendorReturnAdd.getStLId();
        List<String> storagelist = Arrays.asList(storage.split(","));
        Object[] storageid = storagelist.toArray();

        for (int i = 0; i < quantity.length; i++) {
          vrLine = new VendorReturnLine();
          vrLine.setMaterial_Id(materialiid[i].toString());
          vrLine.setQuantity(quantity[i]);
          vrLine.setUom_Id(uomid[i].toString());
          vrLine.setPrice(price[i]);
          vrLine.setReasonForRejectionId(rfrid[i].toString());
          vrLine.setStorageLocationId(storageid[i].toString());
          vrLine.setBatchNo(bNo[i]);
          vrLines.add(vrLine);

          float enteredQty = vrLine.getQuantity();
          int materialid = Integer.parseInt(vrLine.getMaterial_Id());
          float materialStock;
          materialStock = materialService.materialStockGet(materialid);
          float updatedStock = 0;
          updatedStock = materialStock - enteredQty;
          // msg =
          // materialService.materialStockUpdate(materialid,updatedStock);
          // Update Goods Receipt Line Returns Qty
          vrService.updateGRLQtyReturns(
              Integer.parseInt(vendorReturnAdd.getGoodsReceiptId()),
              materialiid[i].toString(),
              String.valueOf(bNo[i]),
              quantity[i].floatValue());
        }
        vendorReturnAdd.setVendorReturnDate(
            dateService.dateFormat(
                dateService.dateParse(vendorReturnAdd.getVendorReturnDate(), "au"), "au"));
        vendorReturnAdd.setVendorReturnLine(vrLines);
        msg = vrService.addVendorReturn(vendorReturnAdd);
        request.setAttribute("addVendorReturn", "Vendor Return Details Successfully Saved");
      } catch (Exception e) {
        e.printStackTrace();
      }

      if (msg.equals("S")) {
        session = request.getSession(false);
        Date dates = new Date();
        String modifiedDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(dates);
        auditLogService.setAuditLogSave(
            session.getAttribute("userId").toString(),
            "A",
            "Vendor Returns",
            "ROW",
            String.valueOf(vendorReturnAdd.getVendorReturnId()),
            "1",
            modifiedDate,
            session.getAttribute("userName").toString());
        vrAddSus = "Vendor Return Details Successfully Saved";
        list.add("2");
      }
      model.addAttribute("vendorReturnCommand", new VendorReturn());

      return "redirect:VendorReturn.mnt?Addsuccess=" + vrAddSus + "";

    } else {
      vendorReturnAdd.setAid(1);

      request.setAttribute(
          "addVendorReturnDuplicate", "Vendor Return No Already Exists Choose Another One");
      return "redirect:VendorReturn.mnt?AddFail=" + vrAddSus + "";
    }
  }