package crmdna.api.servlet; import crmdna.common.DateUtils; import crmdna.common.UnitUtils.PhysicalQuantity; import crmdna.common.UnitUtils.ReportingUnit; import crmdna.common.Utils; import crmdna.common.Utils.Currency; import crmdna.common.api.APIResponse; import crmdna.common.api.APIResponse.Status; import crmdna.common.api.APIUtils; import crmdna.common.api.RequestInfo; import crmdna.group.Group; import crmdna.hr.Department; import crmdna.inventory.*; import crmdna.inventory.MealCount.Meal; import crmdna.user.User.ResourceType; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import static crmdna.common.AssertUtils.ensure; public class InventoryServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { String action = request.getParameter("action"); if (action == null) { ServletUtils.setJson(response, new APIResponse().status(Status.ERROR_RESOURCE_NOT_FOUND)); } else { String client = request.getParameter("client"); if (client == null) client = "isha"; String login = ServletUtils.getLogin(request); try { if (action.equals("createInventoryItem")) { String group = ServletUtils.getStrParam(request, "groupId"); long groupId = Group.safeGetByIdOrName(client, group).toProp().groupId; InventoryItemProp prop = InventoryItem .create(client, groupId, ServletUtils.getLongParam(request, "inventoryItemTypeId"), ServletUtils.getStrParam(request, "displayName"), PhysicalQuantity.valueOf(ServletUtils.getStrParam(request, "physicalQuantity")), ReportingUnit.valueOf(ServletUtils.getStrParam(request, "reportingUnit")), login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(prop)); } else if (action.equals("updateInventoryItem")) { InventoryItemProp prop = InventoryItem .update(client, ServletUtils.getLongParam(request, "inventoryItemId"), ServletUtils.getLongParam(request, "newInventoryItemTypeId"), ServletUtils.getStrParam(request, "newDisplayName"), ReportingUnit.valueOf(ServletUtils.getStrParam(request, "newReportingUnit")), login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(prop)); } else if (action.equals("checkIn")) { Long inventoryItemId; for (int i = 0; i < 50; i++) { inventoryItemId = ServletUtils.getLongParam(request, "items[" + i + "].inventoryItemId"); if (inventoryItemId == null) { break; } DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); Date date = dateFormat.parse(ServletUtils.getStrParam(request, "yyyymmdd")); InventoryItem.checkIn(client, inventoryItemId, date, ServletUtils.getDoubleParam(request, "items[" + i + "].qtyInReportingUnit"), ReportingUnit .valueOf(ServletUtils.getStrParam(request, "items[" + i + "].reportingUnit")), ServletUtils.getDoubleParam(request, "items[" + i + "].pricePerReportingUnit"), Currency.INR, ServletUtils.getStrParam(request, "items[" + i + "].comment"), login); } ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS)); } else if (action.equals("checkOut")) { Set<String> tags = new HashSet<>(); Long departmentId = ServletUtils.getLongParam(request, "departmentId"); ensure(departmentId != null, "departmentId should be specified for check out"); tags.add(ResourceType.DEPARTMENT + "||" + departmentId); String departmentName = Department.safeGet(client, departmentId).toProp().displayName; if (departmentName.toUpperCase().contains("KITCHEN")) { Meal meal = Meal.valueOf(ServletUtils.getStrParam(request, "meal")); tags.add(ResourceType.MEAL + "||" + meal); } Long inventoryItemId; for (int i = 0; i < 50; i++) { inventoryItemId = ServletUtils.getLongParam(request, "items[" + i + "].inventoryItemId"); if (inventoryItemId == null) { break; } DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); Date date = dateFormat.parse(ServletUtils.getStrParam(request, "yyyymmdd")); InventoryItem.checkOut(client, inventoryItemId, date, ServletUtils.getDoubleParam(request, "items[" + i + "].qtyInReportingUnit"), ReportingUnit .valueOf(ServletUtils.getStrParam(request, "items[" + i + "].reportingUnit")), ServletUtils.getDoubleParam(request, "items[" + i + "].pricePerReportingUnit" + i), Currency.INR, ServletUtils.getStrParam(request, "items[" + i + "].comment"), tags, login); } ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS)); } else if (action.equals("getCurrentStockList")) { InventoryItemQueryCondition qc = new InventoryItemQueryCondition(); String groupName = ServletUtils.getStrParam(request, "groupName"); if (groupName == null) { groupName = "mahamudra"; } qc.groupId = Group.safeGetByIdOrName(client, groupName).toProp().groupId; List<InventoryItemProp> props = InventoryItem.query(client, qc, login); InventoryItemProp.populateDependents(client, props); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(props)); } else if (action.equals("setKitchen3MealCount")) { MealCountProp prop = MealCount .setCount(client, ServletUtils.getIntParam(request, "yyyymmdd"), ServletUtils.getIntParam(request, "breakfastCount"), ServletUtils.getIntParam(request, "lunchCount"), ServletUtils.getIntParam(request, "dinnerCount"), login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(prop)); } else if (action.equals("getAllInventoryItemTypes")) { List<InventoryItemTypeProp> props = InventoryItemType.getAll(client); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(props)); } else if (action.equals("createPackagedItems")) { long groupId = Group.safeGetByIdOrName(client, ServletUtils.getStrParam(request, "groupName")) .toProp().groupId; PackagedInventoryBatchProp batchProp = PackagedInventoryBatch .create(client, ServletUtils.getStrParam(request, "batchName"), ServletUtils.getDoubleParam(request, "overheads[packingCostAtSrc][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[labellingCostAtSrc][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[transportAtSrc][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[warehouseCost][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[manpowerCost][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[shipmentCost][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[transportAtDst][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[clearanceAtDst][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[GST][valueInSGD]", true), ServletUtils.getDoubleParam(request, "overheads[other][valueInSGD]", true), ServletUtils.getDoubleParam(request, "forex[USD]"), ServletUtils.getDoubleParam(request, "forex[INR]"), login); int itemsCount = 0, i; for (i = 0; i < 1000; i++) { Long inventoryItemId = ServletUtils.getLongParam(request, "items[" + i + "][inventoryItemId]"); if (inventoryItemId == null) { break; } itemsCount += PackagedInventoryItem.create(client, groupId, inventoryItemId, ServletUtils.getIntParam(request, "items[" + i + "][expiryYYYYMMDD]"), ServletUtils.getDoubleParam(request, "items[" + i + "][costPrice]"), ServletUtils.getDoubleParam(request, "items[" + i + "][sellingPrice]"), Utils.Currency .valueOf(ServletUtils.getStrParam(request, "items[" + i + "][currency]")), ServletUtils.getIntParam(request, "items[" + i + "][qty]"), batchProp.batchId, login); } ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS) .message("Checked in " + itemsCount + " items in " + i + " categories")); } else if (action.equals("updatePackagedItem")) { PackagedInventoryItemProp prop = PackagedInventoryItem .update(client, ServletUtils.getLongParam(request, "packagedInventoryItemId"), ServletUtils.getLongParam(request, "newInventoryItemId"), ServletUtils.getIntParam(request, "newExpiryYYYYMMDD"), ServletUtils.getDoubleParam(request, "newCostPrice"), ServletUtils.getDoubleParam(request, "newSellingPrice"), login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(prop)); } else if (action.equals("transferPackagedItems")) { Set<Long> packagedInventoryItemIds = new HashSet<>(); for (int i = 0; i < 1000; i++) { Long packagedInventoryItemId = ServletUtils.getLongParam(request, "itemIds[" + i + "]"); if (packagedInventoryItemId == null) { break; } packagedInventoryItemIds.add(packagedInventoryItemId); } long groupId = Group.safeGetByIdOrName(client, ServletUtils.getStrParam(request, "groupName")) .toProp().groupId; PackagedInventoryItem.transfer(client, groupId, packagedInventoryItemIds, ServletUtils.getLongParam(request, "fromLocation"), ServletUtils.getLongParam(request, "toLocation"), login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS)); } else if (action.equals("updateSoldPackagedItems")) { Map<Long, Double> packagedInventoryItemIdMap = new HashMap<>(); for (int i = 0; i < 1000; i++) { Long packagedInventoryItemId = ServletUtils.getLongParam(request, "itemIds[" + i + "]"); if (packagedInventoryItemId == null) { break; } Double sellingPrice = ServletUtils.getDoubleParam(request, "sellingPrices[" + i + "]"); packagedInventoryItemIdMap.put(packagedInventoryItemId, sellingPrice); } long groupId = Group.safeGetByIdOrName(client, ServletUtils.getStrParam(request, "groupName")) .toProp().groupId; PackagedInventoryItem.updateSold(client, groupId, packagedInventoryItemIdMap, ServletUtils.getStrParam(request, "salesOrder"), ServletUtils.getBoolParam(request, "paidOnline"), login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS)); } else if (action.equals("queryPackagedItems")) { PackagedInventoryItemQueryCondition qc = new PackagedInventoryItemQueryCondition(); qc.locationId = ServletUtils.getLongParam(request, "locationId"); qc.salesId = ServletUtils.getLongParam(request, "salesId"); qc.batchId = ServletUtils.getLongParam(request, "batchId"); List<PackagedInventoryItemProp> props = PackagedInventoryItem.query(client, qc, login); ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(props)); } else if (action.equals("querySoldPackagedItems")) { PackagedInventorySalesQueryCondition qcSales = new PackagedInventorySalesQueryCondition(); qcSales.startMS = DateUtils.toDate(ServletUtils.getIntParam(request, "startYYYYMMDD")) .getTime(); qcSales.endMS = DateUtils.toDate(ServletUtils.getIntParam(request, "endYYYYMMDD")) .getTime(); List<PackagedInventorySalesProp> salesProps = PackagedInventorySales.query(client, qcSales); for (PackagedInventorySalesProp salesProp : salesProps) { PackagedInventoryItemQueryCondition qc = new PackagedInventoryItemQueryCondition(); qc.locationId = ServletUtils.getLongParam(request, "locationId"); qc.salesId = salesProp.salesId; qc.batchId = ServletUtils.getLongParam(request, "batchId"); salesProp.packagedInventoryItemProps = PackagedInventoryItem.query(client, qc, login); } ServletUtils.setJson(response, new APIResponse().status(Status.SUCCESS).object(salesProps)); } else if (action.equals("getAllLocations")) { List<InventoryLocationProp> props = InventoryLocation .getAll(client, ServletUtils.getBoolParam(request, "populateItemCount"), login); ServletUtils.setJson(response, new APIResponse().object(props).status(Status.SUCCESS)); } else if (action.equals("getAllBatches")) { List<PackagedInventoryBatchProp> props = PackagedInventoryBatch.getAll(client); ServletUtils.setJson(response, new APIResponse().object(props).status(Status.SUCCESS)); } else { ServletUtils.setJson(response, new APIResponse().status(Status.ERROR_RESOURCE_INCORRECT)); } } catch (Exception ex) { ServletUtils.setJson(response, APIUtils.toAPIResponse(ex, true, new RequestInfo().client(client).req(request).login(login))); } } } }