/*
* This program is part of the OpenLMIS logistics management information system platform software.
* Copyright © 2013 VillageReach
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses. For additional information contact info@OpenLMIS.org.
*/
package org.openlmis.rnr.repository;
import org.openlmis.core.domain.*;
import org.openlmis.core.exception.DataException;
import org.openlmis.core.repository.helper.CommaSeparator;
import org.openlmis.core.repository.mapper.SignatureMapper;
import org.openlmis.equipment.domain.EquipmentInventoryStatus;
import org.openlmis.equipment.repository.mapper.EquipmentInventoryStatusMapper;
import org.openlmis.rnr.domain.*;
import org.openlmis.rnr.dto.RnrDTO;
import org.openlmis.rnr.repository.mapper.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
import static org.openlmis.rnr.domain.RnrStatus.*;
/**
* Repository class for Requisition related database operations.
*/
@Repository
public class RequisitionRepository {
@Autowired
private RequisitionMapper requisitionMapper;
@Autowired
private RnrLineItemMapper rnrLineItemMapper;
@Autowired
private LossesAndAdjustmentsMapper lossesAndAdjustmentsMapper;
@Autowired
private CommentMapper commentMapper;
@Autowired
private CommaSeparator commaSeparator;
@Autowired
private RequisitionStatusChangeMapper requisitionStatusChangeMapper;
@Autowired
private RegimenLineItemMapper regimenLineItemMapper;
@Autowired
private EquipmentLineItemMapper equipmentLineItemMapper;
@Autowired
private EquipmentInventoryStatusMapper equipmentInventoryStatusMapper;
@Autowired
private PatientQuantificationLineItemMapper patientQuantificationLineItemMapper;
@Autowired
private SignatureMapper signatureMapper;
public void insert(Rnr requisition) {
requisition.setStatus(INITIATED);
requisitionMapper.insert(requisition);
insertLineItems(requisition, requisition.getFullSupplyLineItems());
insertLineItems(requisition, requisition.getNonFullSupplyLineItems());
insertRegimenLineItems(requisition, requisition.getRegimenLineItems());
insertEquipmentStatus(requisition, requisition.getEquipmentLineItems());
}
public void insertPatientQuantificationLineItems(Rnr rnr) {
for (PatientQuantificationLineItem patientQuantificationLineItem : rnr.getPatientQuantifications()) {
patientQuantificationLineItem.setRnrId(rnr.getId());
patientQuantificationLineItem.setModifiedBy(rnr.getModifiedBy());
patientQuantificationLineItem.setCreatedBy(rnr.getCreatedBy());
patientQuantificationLineItemMapper.insert(patientQuantificationLineItem);
}
}
private void insertEquipmentStatus(Rnr requisition, List<EquipmentLineItem> equipmentLineItems) {
for (EquipmentLineItem equipmentLineItem : equipmentLineItems) {
EquipmentInventoryStatus status = getStatusFromEquipmentLineItem(equipmentLineItem);
equipmentInventoryStatusMapper.insert(status);
equipmentLineItem.setInventoryStatusId(status.getId());
equipmentLineItem.setRnrId(requisition.getId());
equipmentLineItem.setModifiedBy(requisition.getModifiedBy());
equipmentLineItemMapper.insert(equipmentLineItem);
}
}
private EquipmentInventoryStatus getStatusFromEquipmentLineItem(EquipmentLineItem equipmentLineItem) {
EquipmentInventoryStatus status = new EquipmentInventoryStatus();
status.setId(equipmentLineItem.getInventoryStatusId());
status.setInventoryId(equipmentLineItem.getEquipmentInventoryId());
status.setStatusId(equipmentLineItem.getOperationalStatusId());
return status;
}
private void insertRegimenLineItems(Rnr requisition, List<RegimenLineItem> regimenLineItems) {
for (RegimenLineItem regimenLineItem : regimenLineItems) {
regimenLineItem.setRnrId(requisition.getId());
regimenLineItem.setModifiedBy(requisition.getModifiedBy());
regimenLineItemMapper.insert(regimenLineItem);
}
}
private void insertLineItems(Rnr requisition, List<RnrLineItem> lineItems) {
for (RnrLineItem lineItem : lineItems) {
lineItem.setRnrId(requisition.getId());
lineItem.setModifiedBy(requisition.getModifiedBy());
rnrLineItemMapper.insert(lineItem, lineItem.getPreviousNormalizedConsumptions().toString());
}
}
public void update(Rnr rnr) {
requisitionMapper.update(rnr);
updateFullSupplyLineItems(rnr);
updateNonFullSupplyLineItems(rnr);
if (!(rnr.getStatus() == AUTHORIZED || rnr.getStatus() == IN_APPROVAL)) {
updateRegimenLineItems(rnr);
updateEquipmentLineItems(rnr);
}
}
private void updateEquipmentLineItems(Rnr rnr) {
for(EquipmentLineItem item : rnr.getEquipmentLineItems()){
equipmentLineItemMapper.update(item);
EquipmentInventoryStatus status = getStatusFromEquipmentLineItem(item);
equipmentInventoryStatusMapper.update(status);
}
}
private void updateRegimenLineItems(Rnr rnr) {
for (RegimenLineItem regimenLineItem : rnr.getRegimenLineItems()) {
regimenLineItemMapper.update(regimenLineItem);
}
}
public void approve(Rnr rnr) {
requisitionMapper.update(rnr);
for (RnrLineItem lineItem : rnr.getFullSupplyLineItems()) {
updateLineItem(rnr, lineItem);
}
for (RnrLineItem lineItem : rnr.getNonFullSupplyLineItems()) {
updateLineItem(rnr, lineItem);
}
}
private void updateNonFullSupplyLineItems(Rnr rnr) {
for (RnrLineItem lineItem : rnr.getNonFullSupplyLineItems()) {
RnrLineItem savedLineItem = rnrLineItemMapper.getExistingNonFullSupplyItemByRnrIdAndProductCode(rnr.getId(), lineItem.getProductCode());
if (savedLineItem != null) {
lineItem.setId(savedLineItem.getId());
updateLineItem(rnr, lineItem);
continue;
}
lineItem.setRnrId(rnr.getId());
rnrLineItemMapper.insertNonFullSupply(lineItem);
}
}
private void updateFullSupplyLineItems(Rnr requisition) {
for (RnrLineItem lineItem : requisition.getFullSupplyLineItems()) {
updateLineItem(requisition, lineItem);
lossesAndAdjustmentsMapper.deleteByLineItemId(lineItem.getId());
insertLossesAndAdjustmentsForLineItem(lineItem);
}
}
private void updateLineItem(Rnr requisition, RnrLineItem lineItem) {
lineItem.setModifiedBy(requisition.getModifiedBy());
if (requisition.getStatus() == RnrStatus.IN_APPROVAL) {
rnrLineItemMapper.updateOnApproval(lineItem);
return;
}
rnrLineItemMapper.update(lineItem);
}
private void insertLossesAndAdjustmentsForLineItem(RnrLineItem lineItem) {
for (LossesAndAdjustments lossAndAdjustment : lineItem.getLossesAndAdjustments()) {
lossesAndAdjustmentsMapper.insert(lineItem, lossAndAdjustment);
}
}
public Rnr getRequisitionWithLineItems(Facility facility, Program program, ProcessingPeriod period) {
return requisitionMapper.getRequisitionWithLineItems(facility, program, period);
}
public Rnr getRequisitionWithoutLineItems(Long facilityId, Long programId, Long periodId) {
return requisitionMapper.getRequisitionWithoutLineItems(facilityId, programId, periodId);
}
public Rnr getRegularRequisitionWithLineItems(Facility facility, Program program, ProcessingPeriod period) {
return requisitionMapper.getRegularRequisitionWithLineItems(facility, program, period);
}
public List<Rnr> getInitiatedOrSubmittedEmergencyRequisitions(Long facilityId, Long programId) {
return requisitionMapper.getInitiatedOrSubmittedEmergencyRequisitions(facilityId, programId);
}
public List<LossesAndAdjustmentsType> getLossesAndAdjustmentsTypes() {
return lossesAndAdjustmentsMapper.getLossesAndAdjustmentsTypes();
}
public Rnr getById(Long rnrId) {
Rnr requisition = requisitionMapper.getById(rnrId);
if (requisition == null) throw new DataException("error.rnr.not.found");
return requisition;
}
@Deprecated
public List<Rnr> getAuthorizedRequisitions(RoleAssignment roleAssignment) {
return requisitionMapper.getAuthorizedRequisitions(roleAssignment);
}
public List<RnrDTO> getAuthorizedRequisitionsDTOs(RoleAssignment roleAssignment){
return requisitionMapper.getAuthorizedRequisitionsDTO(roleAssignment);
}
public Rnr getLastRegularRequisitionToEnterThePostSubmitFlow(Long facilityId, Long programId) {
return requisitionMapper.getLastRegularRequisitionToEnterThePostSubmitFlow(facilityId, programId);
}
public List<Rnr> getPostSubmitRequisitions(Facility facility, Program program, List<ProcessingPeriod> periods) {
return requisitionMapper.getPostSubmitRequisitions(facility, program, commaSeparator.commaSeparateIds(periods));
}
public Integer getCategoryCount(Rnr requisition, boolean fullSupply) {
return rnrLineItemMapper.getCategoryCount(requisition, fullSupply);
}
public List<Comment> getCommentsByRnrID(Long rnrId) {
return commentMapper.getByRnrId(rnrId);
}
public void insertComment(Comment comment) {
commentMapper.insert(comment);
}
public void logStatusChange(Rnr requisition, String name) {
RequisitionStatusChange statusChange = new RequisitionStatusChange(requisition, name);
requisitionStatusChangeMapper.insert(statusChange);
}
public Date getOperationDateFor(Long rnrId, String status) {
return requisitionStatusChangeMapper.getOperationDateFor(rnrId, status);
}
public Rnr getLWById(Long rnrId) {
return requisitionMapper.getLWById(rnrId);
}
public List<Rnr> getApprovedRequisitionsForCriteriaAndPageNumber(String searchType, String searchVal, Integer pageNumber,
Integer pageSize, Long userId, String rightName, String sortBy,
String sortDirection) {
return requisitionMapper.getApprovedRequisitionsForCriteriaAndPageNumber(searchType, searchVal, pageNumber, pageSize,
userId, rightName, sortBy, sortDirection);
}
public Integer getCountOfApprovedRequisitionsForCriteria(String searchType, String searchVal, Long userId, String rightName) {
return requisitionMapper.getCountOfApprovedRequisitionsForCriteria(searchType, searchVal, userId, rightName);
}
public Long getFacilityId(Long id) {
return requisitionMapper.getFacilityId(id);
}
public Rnr getLastRegularRequisition(Facility facility, Program program) {
return requisitionMapper.getLastRegularRequisition(facility, program);
}
public Date getAuthorizedDateForPreviousLineItem(Rnr rnr, String productCode, Date periodStartDate) {
return rnrLineItemMapper.getAuthorizedDateForPreviousLineItem(rnr, productCode, periodStartDate);
}
public List<RnrLineItem> getAuthorizedRegularUnSkippedLineItems(String productCode, Rnr rnr, Integer n, Date startDate) {
return rnrLineItemMapper.getAuthorizedRegularUnSkippedLineItems(productCode, rnr, n, startDate);
}
public RnrLineItem getNonSkippedLineItem(Long rnrId, String productCode) {
return rnrLineItemMapper.getNonSkippedLineItem(rnrId, productCode);
}
public Long getProgramId(Long rnrId) {
return requisitionMapper.getProgramId(rnrId);
}
public String deleteRnR(Long rnrId) {
return requisitionMapper.deleteRnR(rnrId.intValue());
}
public void updateClientFields(Rnr rnr) {
requisitionMapper.updateClientFields(rnr);
}
public List<Rnr> getRequisitionDetailsByFacility(Facility facility) {
return requisitionMapper.getRequisitionsWithLineItemsByFacility(facility);
}
public void insertRnrSignatures(Rnr rnr) {
for (Signature signature: rnr.getRnrSignatures()) {
signatureMapper.insertSignature(signature);
requisitionMapper.insertRnrSignature(rnr, signature);
}
}
}