package com.connectivity.vikray.serivces; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.jdo.JDOException; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.Transaction; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.connectivity.vikray.VikrayConstant; import com.connectivity.vikray.VikrayError; import com.connectivity.vikray.VikrayServlet; import com.connectivity.vikray.model.AccountAddress; import com.connectivity.vikray.model.AccountDetail; import com.connectivity.vikray.model.BusinessDeal; import com.connectivity.vikray.model.DeliveryChallanHeader; import com.connectivity.vikray.model.DeliveryChallanItem; import com.connectivity.vikray.model.GoodsReceiptNoteHeader; import com.connectivity.vikray.model.GoodsReceiptNoteItem; import com.connectivity.vikray.model.OrderItem; import com.connectivity.vikray.model.Organisation; import com.connectivity.vikray.model.PersonDetail; import com.connectivity.vikray.model.PurchaseOrderHeader; import com.connectivity.vikray.model.SalesOrderHeader; import com.connectivity.vikray.model.StatusItem; import com.connectivity.vikray.model.UserDetail; import com.cs.base.MsgReq; import com.cs.base.MsgRes; public class DeliveryChallanService extends VikrayServlet{ private static final long serialVersionUID = 1L; CommonUtilServices utilServices = new CommonUtilServices(); public String createDeliveryChallan(HttpServletRequest req, HttpServletResponse res){ CreateDeliveryChallanRequest dcRequest = getRequestMsg(CreateDeliveryChallanRequest.class); CreateDeliveryChallanResponse dcResponse = new CreateDeliveryChallanResponse(); if (dcRequest == null) { dcResponse.error = VikrayError.getError(VikrayError.CREATE_DC_FAILURE); } DeliveryChallanHeader dcFromClient = dcRequest.deliveryChallanHeader; DeliveryChallanHeader dcToDB = new DeliveryChallanHeader(); _pm.makePersistent(dcToDB); SalesOrderHeader salesOrder = _pm.getObjectById(SalesOrderHeader.class, dcFromClient.getSaleOrderDcFk().getId()); Boolean success = validateDeliveredQuantity(salesOrder, _pm, dcFromClient); if (!success) { dcResponse.error = VikrayError.getError(VikrayError.QUANTITY_DELIVERED_FAILURE); return makeResponse(dcResponse); } Transaction tx = _pm.currentTransaction(); try { tx.begin(); dcToDB.setSaleOrderDcFk(salesOrder); AccountAddress shippingAddress = _pm.getObjectById(AccountAddress.class, dcFromClient.getShippingAddress().getId()); dcToDB.setShippingAddress(shippingAddress); AccountAddress billingAddress = _pm.getObjectById(AccountAddress.class, dcFromClient.getBillingFk().getId()); dcToDB.setBillingFk(billingAddress); dcToDB.setCustPoNo(dcFromClient.getCustPoNo()); dcToDB.setModeOfTransport(dcFromClient.getModeOfTransport()); dcToDB.setDestination(dcFromClient.getDestination()); dcToDB.setTermOfPayment(dcFromClient.getTermOfPayment()); dcToDB.setTermOfDelivery(dcFromClient.getTermOfDelivery()); Organisation organisation = _pm.getObjectById(Organisation.class, dcFromClient.getOrganisation().getId()); dcToDB.setOrganisation(organisation); dcToDB.setCreatedDate(new Date(System.currentTimeMillis())); createDeliveryChallanItems(dcRequest, _pm, dcResponse, dcToDB); String deliveryChallanName = ""; String year = utilServices.sequenceDate("yyyy"); BigDecimal nextYear = new BigDecimal(utilServices.sequenceDate("yy")); if (dcResponse != null) { deliveryChallanName = "CS-DC" + "-" + dcToDB.getId() + "-" + year + "-" + nextYear.add(new BigDecimal(1)); } dcToDB.setName(deliveryChallanName); dcResponse.deliveryChallanHeader = dcToDB; tx.commit(); }catch (JDOException e) { dcResponse.error = VikrayError.getError(VikrayError.CREATE_DC_FAILURE); e.printStackTrace(); } return makeResponse(dcResponse); } // Update Delivery Challan---------------- public String updateDeliveryChallan(HttpServletRequest req, HttpServletResponse res) { UpdateDeliveryChallanReq dcRequest = getRequestMsg(UpdateDeliveryChallanReq.class); UpdateDeliveryChallanRes dcResponse = new UpdateDeliveryChallanRes(); if (dcRequest == null) { dcResponse.error = VikrayError.getError(VikrayError.UPDATE_DC_FAILURE); } SalesOrderHeader salesOrderHeader = _pm.getObjectById(SalesOrderHeader.class, dcRequest.deliveryChallanHeader.getSaleOrderDcFk().getId()); Set grnItems = dcRequest.deliveryChallanHeader.getDeliveryChallanItem(); Boolean success = validateDeliveredQuantity(salesOrderHeader, _pm, dcRequest.deliveryChallanHeader); if (!success) { dcResponse.error = VikrayError.getError(VikrayError.QUANTITY_DELIVERED_FAILURE); return makeResponse(dcResponse); } // UserDetail user = getLoggedInUser(req, res); Transaction tx = _pm.currentTransaction(); try { tx.begin(); DeliveryChallanHeader dcHeader = _pm.getObjectById(DeliveryChallanHeader.class, dcRequest.deliveryChallanHeader.getId()); dcHeader.setDeliveryChallanItem(updateDeliveryChallanItems(dcRequest, _pm, dcResponse)); // grnHeader.setLastModifiedBy(user); dcHeader.setLastModifiedDate(new Date(System.currentTimeMillis())); tx.commit(); dcResponse.deliveryChallanHeader = dcHeader; } catch (JDOException e) { dcResponse.error = VikrayError.getError(VikrayError.UPDATE_DC_FAILURE); e.printStackTrace(); tx.rollback(); } return makeResponse(dcResponse); } @SuppressWarnings("unused") private Boolean validateDeliveredQuantity(SalesOrderHeader salesOrder, PersistenceManager _pm, DeliveryChallanHeader deliveryChallanHeader) { StatusItem partialDCStatus, dcCompletedStatus; partialDCStatus = _pm.getObjectById(StatusItem.class, VikrayConstant.PARTIAL_DELIVERED); dcCompletedStatus = _pm.getObjectById(StatusItem.class, VikrayConstant.DELIVERY_COMPLETED); PurchaseOrderHeader purchaseOrder = _pm.getObjectById(PurchaseOrderHeader.class, salesOrder.getId()); BusinessDeal deal = _pm.getObjectById(BusinessDeal.class, salesOrder.getBusinessDeal().getId()); Set dcItems = deliveryChallanHeader.getDeliveryChallanItem(); boolean success = false; UserDetail user = _pm.getObjectById(UserDetail.class, salesOrder.getCreatedBy().getId()); Iterator result = dcItems.iterator(); long totalQuantity = 0, totalDeliveredQuantity = 0; Transaction tx = _pm.currentTransaction(); while (result.hasNext()) { DeliveryChallanItem items = result.next(); // To set Recieved Quantity in Order Item if (deliveryChallanHeader.getId() == 0) { OrderItem orderItem = _pm.getObjectById(OrderItem.class, items.getId()); totalQuantity += orderItem.getQuantity(); totalDeliveredQuantity += orderItem.getDeliveredQuantity() + items.getDeliveredQuantity(); } else { DeliveryChallanItem dcItemDetail = _pm.getObjectById(DeliveryChallanItem.class, items.getId()); //need to create relation with order item OrderItem orderItem = _pm.getObjectById(OrderItem.class, dcItemDetail.getOrderItems().getId()); long dcDeliveredQuantity = 0, orderItemsDeliveredQuantity = 0; dcDeliveredQuantity = dcItemDetail.getDeliveredQuantity(); orderItemsDeliveredQuantity = orderItem.getDeliveredQuantity(); totalDeliveredQuantity = (orderItemsDeliveredQuantity - dcDeliveredQuantity) + items.getDeliveredQuantity(); totalQuantity += orderItem.getQuantity(); } } if (totalDeliveredQuantity < totalQuantity) { salesOrder.setOrderStatus(partialDCStatus); utilServices.persistDealHistory(deal, _pm, user, partialDCStatus); success = true; } else if (totalDeliveredQuantity == totalQuantity) { salesOrder.setOrderStatus(dcCompletedStatus); utilServices.persistDealHistory(deal, _pm, user, dcCompletedStatus); success = true; } else { success = false; } return success; } // To set the items detail in Goods Receipt Note item public void createDeliveryChallanItems(CreateDeliveryChallanRequest dcRequest, PersistenceManager _pm, CreateDeliveryChallanResponse dcResponse, DeliveryChallanHeader deliveryChallanHeader) { Set dcItems = dcRequest.deliveryChallanHeader.getDeliveryChallanItem(); Iterator result = dcItems.iterator(); while (result.hasNext()) { DeliveryChallanItem toDb = new DeliveryChallanItem(); toDb = _pm.makePersistent(toDb); DeliveryChallanItem item = result.next(); // To set Recieved Quantity in Order Item OrderItem orderItem = _pm.getObjectById(OrderItem.class, item.getId()); long deliveredQuantity = orderItem.getDeliveredQuantity(); orderItem.setDeliveredQuantity(deliveredQuantity + item.getDeliveredQuantity()); toDb.setOrderItems(orderItem); toDb.setItemName(item.getItemName()); toDb.setItemDescription(item.getItemDescription()); toDb.setDeliveredQuantity(item.getDeliveredQuantity()); toDb.setUom(item.getUom()); deliveryChallanHeader.getDeliveryChallanItem().add(toDb); toDb.setDeliveryChallan(deliveryChallanHeader);; } } // To update the items detail in Goods Receipt Note item public Set updateDeliveryChallanItems(UpdateDeliveryChallanReq grnRequest, PersistenceManager _pm, UpdateDeliveryChallanRes grnResponse) { Set deliveryChallanItems = grnRequest.deliveryChallanHeader.getDeliveryChallanItem(); Set deliveryChallan = new HashSet(); Iterator result = deliveryChallanItems.iterator(); while (result.hasNext()) { DeliveryChallanItem items = result.next(); // To set Recieved Quantity in Order Item DeliveryChallanItem dcItemDetail = _pm.getObjectById(DeliveryChallanItem.class, items.getId()); OrderItem orderItem = _pm.getObjectById(OrderItem.class, dcItemDetail.getOrderItems().getId()); // Adding received Quantity long dcDeliveredQuantity = 0, orderItemsDeliveredQuantity = 0, totalDeliveredQuantity = 0; dcDeliveredQuantity = dcItemDetail.getDeliveredQuantity(); orderItemsDeliveredQuantity = orderItem.getDeliveredQuantity(); totalDeliveredQuantity = (orderItemsDeliveredQuantity - dcDeliveredQuantity) + items.getDeliveredQuantity(); orderItem.setDeliveredQuantity(totalDeliveredQuantity); dcItemDetail.setItemDescription(items.getItemDescription()); dcItemDetail.setDeliveredQuantity(items.getDeliveredQuantity()); dcItemDetail.setOrderItems(orderItem); deliveryChallan.add(dcItemDetail); } return deliveryChallan; } /*************** Find Delivery Challan *****************/ public String findDeliveryChallan(HttpServletRequest req, HttpServletResponse res) { FindDCResp response = new FindDCResp(); Transaction tx = _pm.currentTransaction(); try { tx.begin(); Query q = _pm.newQuery(DeliveryChallanHeader.class); @SuppressWarnings("unchecked") List deliveryChallanList = (List) q.execute(); Iterator itr = deliveryChallanList.iterator(); while (itr.hasNext()) { response.deliveryChallanHeaderList.add(itr.next()); } tx.commit(); if (response.deliveryChallanHeaderList.isEmpty()) { response.error = VikrayError.getError(VikrayError.FIND_DC_FAILURE); } response.error = VikrayError.getError(VikrayError.NO_ERROR); } catch (JDOException e) { response.error = VikrayError.getError(VikrayError.FIND_DC_FAILURE); e.printStackTrace(); tx.rollback(); } return makeResponse(response); } /*************** GET Goods Receipt Note BY ID *****************/ @SuppressWarnings("unused") public String getDeliveryChallanById(HttpServletRequest req, HttpServletResponse res) { GetDeliveryChallanReq request = getRequestMsg(GetDeliveryChallanReq.class); GetDeliveryChallanResp response = new GetDeliveryChallanResp(); long id = request.deliveryChallanId; if (request == null) response.error = VikrayError.getError(VikrayError.GET_DC_FAILURE); response.deliveryChallanHeader = _pm.getObjectById(DeliveryChallanHeader.class, id); // _pm.retrieve(response.order); if (response.deliveryChallanHeader == null) { response.error = VikrayError.getError(VikrayError.GET_DC_FAILURE); } response.error = VikrayError.getError(VikrayError.NO_ERROR); return makeResponse(response); } } class CreateDeliveryChallanRequest extends MsgReq { public DeliveryChallanHeader deliveryChallanHeader; } class CreateDeliveryChallanResponse extends MsgRes { public DeliveryChallanHeader deliveryChallanHeader; } class UpdateDeliveryChallanReq extends MsgReq { public DeliveryChallanHeader deliveryChallanHeader = new DeliveryChallanHeader(); } class UpdateDeliveryChallanRes extends MsgRes { public DeliveryChallanHeader deliveryChallanHeader; } class FindDCResp extends MsgRes { public List deliveryChallanHeaderList = new ArrayList(); } class GetDeliveryChallanReq extends MsgReq { public long deliveryChallanId; } class GetDeliveryChallanResp extends MsgRes { public DeliveryChallanHeader deliveryChallanHeader; }