package org.openlmis.core.view.viewmodel; import org.apache.commons.lang3.StringUtils; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.manager.MovementReasonManager; import org.openlmis.core.model.Lot; import org.openlmis.core.model.LotMovementItem; import org.openlmis.core.model.Product; import org.openlmis.core.utils.DateUtil; import java.io.Serializable; import java.text.ParseException; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor public class LotMovementViewModel implements Serializable { private String lotNumber; private String expiryDate; private String quantity; private String lotSoh; private MovementReasonManager.MovementType movementType; boolean valid = true; boolean quantityLessThanSoh = true; boolean isDataChanged = false; public LotMovementViewModel(String lotNumber, String expiryDate, MovementReasonManager.MovementType movementType) { this.lotNumber = lotNumber; this.expiryDate = expiryDate; this.movementType = movementType; } public LotMovementViewModel(String lotNumber, String expiryDate, String quantityOnHand, MovementReasonManager.MovementType movementType) { this.lotNumber = lotNumber; this.expiryDate = expiryDate; this.lotSoh = quantityOnHand; this.movementType = movementType; } public boolean validateQuantityNotGreaterThanSOH() { if (movementType.isNegative()) { quantityLessThanSoh = StringUtils.isBlank(quantity) || Long.parseLong(quantity) <= Long.parseLong(lotSoh); } return quantityLessThanSoh; } public LotMovementItem convertViewToModel(Product product) { LotMovementItem lotMovementItem = new LotMovementItem(); Lot lot = new Lot(); lot.setProduct(product); lot.setLotNumber(lotNumber); lot.setExpirationDate(DateUtil.getActualMaximumDate(DateUtil.parseString(expiryDate, DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR))); lotMovementItem.setLot(lot); lotMovementItem.setMovementQuantity(Long.parseLong(quantity)); return lotMovementItem; } public boolean quantityGreaterThanZero() { return !StringUtils.isBlank(quantity) && Long.parseLong(quantity) > 0; } public LotMovementItem convertViewToModelAndResetSOH(Product product) { LotMovementItem lotMovementItem = new LotMovementItem(); long previousStockOnHand = Long.parseLong(getLotSoh()); long currentStockOnHand = Long.parseLong(getQuantity()); Lot lot = new Lot(); lot.setProduct(product); lot.setLotNumber(lotNumber); lot.setExpirationDate(DateUtil.getActualMaximumDate(DateUtil.parseString(expiryDate, DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR))); lotMovementItem.setLot(lot); lotMovementItem.setStockOnHand(currentStockOnHand); lotMovementItem.setMovementQuantity(currentStockOnHand - previousStockOnHand); return lotMovementItem; } public boolean validateLotWithPositiveQuantity() { valid = StringUtils.isNumeric(quantity) && !StringUtils.isBlank(lotNumber) && !StringUtils.isBlank(expiryDate) && !StringUtils.isBlank(quantity) && Long.parseLong(quantity) > 0; return valid; } public boolean validateLotWithNoEmptyFields() { valid = StringUtils.isNumeric(quantity) && !StringUtils.isBlank(lotNumber) && !StringUtils.isBlank(expiryDate) && !StringUtils.isBlank(quantity); return valid; } public boolean isNewAdded() { return StringUtils.isBlank(lotSoh); } public static String generateLotNumberForProductWithoutLot(String productCode, String expiryDate) { try { return "SEM-LOTE-" + productCode.toUpperCase() + "-" + DateUtil.convertDate(expiryDate, DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR, DateUtil.DATE_DIGIT_FORMAT_ONLY_MONTH_AND_YEAR); } catch (ParseException e) { new LMISException(e).reportToFabric(); } return null; } public int getAdjustmentQuantity() { if (StringUtils.isBlank(lotSoh)) { return Integer.parseInt(quantity); } return (Integer.parseInt(this.getQuantity()) - Integer.parseInt(this.getLotSoh())); } }