package org.openlmis.core.view.viewmodel; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import org.openlmis.core.LMISApp; import org.openlmis.core.R; import org.openlmis.core.model.DraftInventory; import org.openlmis.core.model.DraftLotItem; import org.openlmis.core.model.StockCard; import org.openlmis.core.utils.DateUtil; import org.roboguice.shaded.goole.common.base.Predicate; import org.roboguice.shaded.goole.common.collect.FluentIterable; import java.util.List; import lombok.Data; @Data public class PhysicalInventoryViewModel extends InventoryViewModel { private DraftInventory draftInventory; private boolean done; public PhysicalInventoryViewModel(StockCard stockCard) { super(stockCard); } @Override public boolean validate() { valid = !checked || (validateNewLotList() && validateExistingLot()) || product.isArchived(); done = valid; return valid; } @Override public boolean isDataChanged() { if (draftInventory == null) { return hasLotInInventoryModelChanged(); } return !draftInventory.getDraftLotItemListWrapper().isEmpty() && isDifferentFromDraft(); } private boolean isDifferentFromDraft() { List<DraftLotItem> newAddedDraftLotItems = FluentIterable.from(draftInventory.getDraftLotItemListWrapper()).filter(new Predicate<DraftLotItem>() { @Override public boolean apply(DraftLotItem draftLotItem) { return draftLotItem.isNewAdded(); } }).toList(); List<DraftLotItem> existingDraftLotItems = FluentIterable.from(draftInventory.getDraftLotItemListWrapper()).filter(new Predicate<DraftLotItem>() { @Override public boolean apply(DraftLotItem draftLotItem) { return !draftLotItem.isNewAdded(); } }).toList(); for (DraftLotItem draftLotItem : existingDraftLotItems) { for (LotMovementViewModel existingLotMovementViewModel : existingLotMovementViewModelList) { if (draftLotItem.getLotNumber().equals(existingLotMovementViewModel.getLotNumber())) { if (!String.valueOf(draftLotItem.getQuantity() == null ? "" : draftLotItem.getQuantity()).equals(existingLotMovementViewModel.getQuantity())) { return true; } } } } for (DraftLotItem draftLotItem : newAddedDraftLotItems) { if (newAddedDraftLotItems.size() != newLotMovementViewModelList.size()) { return true; } for (LotMovementViewModel lotMovementViewModel : newLotMovementViewModelList) { if (draftLotItem.getLotNumber().equals(lotMovementViewModel.getLotNumber())) { if (!String.valueOf(draftLotItem.getQuantity() == null ? "" : draftLotItem.getQuantity()).equals(lotMovementViewModel.getQuantity())) { return true; } } } } return false; } private boolean hasLotInInventoryModelChanged() { for (LotMovementViewModel viewModel : getExistingLotMovementViewModelList()) { if (viewModel.getQuantity() != null && !viewModel.getQuantity().isEmpty()) { return true; } } if (newLotMovementViewModelList.size() > 0) return true; for (LotMovementViewModel viewModel : getNewLotMovementViewModelList()) { if (viewModel.getQuantity() != null && !viewModel.getQuantity().isEmpty()) { return true; } } return false; } private boolean validateExistingLot() { for (LotMovementViewModel lotMovementViewModel : existingLotMovementViewModelList) { if (!lotMovementViewModel.validateLotWithNoEmptyFields()) { return false; } } return true; } public String getFormattedProductName() { return product.getFormattedProductNameWithoutStrengthAndType(); } public String getFormattedProductUnit() { return product.getStrength() + " " + product.getType(); } public SpannableStringBuilder getGreenName() { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getFormattedProductName()); spannableStringBuilder.setSpan(new ForegroundColorSpan(LMISApp.getInstance().getResources().getColor(R.color.color_primary)), 0, getFormattedProductName().length(), Spanned.SPAN_POINT_MARK); return spannableStringBuilder; } public SpannableStringBuilder getGreenUnit() { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getFormattedProductUnit()); spannableStringBuilder.setSpan(new ForegroundColorSpan(LMISApp.getInstance().getResources().getColor(R.color.color_primary)), 0, getFormattedProductUnit().length(), Spanned.SPAN_POINT_MARK); return spannableStringBuilder; } public void setDraftInventory(DraftInventory draftInventory) { this.draftInventory = draftInventory; done = draftInventory.isDone(); populateLotMovementModelWithDraftLotItem(); } private void populateLotMovementModelWithDraftLotItem() { for (DraftLotItem draftLotItem : draftInventory.getDraftLotItemListWrapper()) { if (draftLotItem.isNewAdded()) { if (isNotInExistingLots(draftLotItem)) { LotMovementViewModel newLotMovementViewModel = new LotMovementViewModel(); newLotMovementViewModel.setQuantity(formatQuantity(draftLotItem.getQuantity())); newLotMovementViewModel.setLotNumber(draftLotItem.getLotNumber()); newLotMovementViewModel.setExpiryDate(DateUtil.formatDate(draftLotItem.getExpirationDate(), DateUtil.DATE_FORMAT_ONLY_MONTH_AND_YEAR)); getNewLotMovementViewModelList().add(newLotMovementViewModel); } } else { for (LotMovementViewModel existingLotMovementViewModel : existingLotMovementViewModelList) { if (draftLotItem.getLotNumber().equals(existingLotMovementViewModel.getLotNumber())) { existingLotMovementViewModel.setQuantity(formatQuantity(draftLotItem.getQuantity())); } } } } } private boolean isNotInExistingLots(DraftLotItem draftLotItem) { for (LotMovementViewModel lotMovementViewModel : existingLotMovementViewModelList) { if (draftLotItem.getLotNumber().toUpperCase().equals(lotMovementViewModel.getLotNumber().toUpperCase())) { return false; } } for (LotMovementViewModel lotMovementViewModel : newLotMovementViewModelList) { if (draftLotItem.getLotNumber().toUpperCase().equals(lotMovementViewModel.getLotNumber().toUpperCase())) { return false; } } return true; } private String formatQuantity(Long quantity) { return quantity == null ? "" : quantity.toString(); } }