/*
* 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.core.repository;
import lombok.NoArgsConstructor;
import org.openlmis.core.domain.*;
import org.openlmis.core.exception.DataException;
import org.openlmis.core.repository.mapper.SupervisoryNodeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Component;
import java.util.List;
import static org.openlmis.core.domain.RightName.commaSeparateRightNames;
/**
* SupervisoryNodeRepository is Repository class for SupervisoryNode related database operations.
*/
@Component
@NoArgsConstructor
public class SupervisoryNodeRepository {
private SupervisoryNodeMapper supervisoryNodeMapper;
private FacilityRepository facilityRepository;
private RequisitionGroupRepository requisitionGroupRepository;
@Autowired
public SupervisoryNodeRepository(SupervisoryNodeMapper supervisoryNodeMapper,
FacilityRepository facilityRepository,
RequisitionGroupRepository requisitionGroupRepository) {
this.supervisoryNodeMapper = supervisoryNodeMapper;
this.facilityRepository = facilityRepository;
this.requisitionGroupRepository = requisitionGroupRepository;
}
public void insert(SupervisoryNode supervisoryNode) {
try {
supervisoryNodeMapper.insert(supervisoryNode);
} catch (DuplicateKeyException ex) {
throw new DataException("error.duplicate.code.supervisory.node");
}
}
public List<SupervisoryNode> getAllSupervisoryNodesInHierarchyBy(Long userId, Long programId, String... rightNames) {
return supervisoryNodeMapper.getAllSupervisoryNodesInHierarchyBy(userId, programId,
commaSeparateRightNames(rightNames));
}
public Long getIdForCode(String code) {
Long supervisoryNodeId = supervisoryNodeMapper.getIdForCode(code);
if (supervisoryNodeId == null)
throw new DataException("error.supervisory.node.invalid");
return supervisoryNodeId;
}
public Long getSupervisoryNodeParentId(Long supervisoryNodeId) {
SupervisoryNode parent = supervisoryNodeMapper.getSupervisoryNode(supervisoryNodeId).getParent();
return parent == null ? null : parent.getId();
}
public SupervisoryNode getFor(Facility facility, Program program) {
RequisitionGroup requisitionGroup = requisitionGroupRepository.getRequisitionGroupForProgramAndFacility(program,
facility);
return (requisitionGroup == null) ? null : supervisoryNodeMapper.getFor(requisitionGroup.getCode());
}
public SupervisoryNode getParent(Long id) {
return supervisoryNodeMapper.getParent(id);
}
public List<SupervisoryNode> getAll() {
return supervisoryNodeMapper.getAll();
}
public List<SupervisoryNode> getAllSupervisoryNodesInHierarchyBy(Long userId, String... rightNames) {
return supervisoryNodeMapper.getAllSupervisoryNodesInHierarchyByUserAndRights(userId,
commaSeparateRightNames(rightNames));
}
//Returns the specified SupervisoryNode along with all of its ancestor nodes.
public List<SupervisoryNode> getAllParentSupervisoryNodesInHierarchy(SupervisoryNode node) {
return supervisoryNodeMapper.getAllParentSupervisoryNodesInHierarchy(node);
}
//Returns the specified SupervisoryNode along with all of its descendant nodes.
public List<SupervisoryNode> getAllChildSupervisoryNodesInHierarchy(SupervisoryNode node) {
return supervisoryNodeMapper.getAllChildSupervisoryNodesInHierarchy(node);
}
public SupervisoryNode getByCode(SupervisoryNode supervisoryNode) {
return supervisoryNodeMapper.getByCode(supervisoryNode);
}
public void update(SupervisoryNode supervisoryNode) {
try {
supervisoryNodeMapper.update(supervisoryNode);
} catch (DuplicateKeyException ex) {
throw new DataException("error.duplicate.code.supervisory.node");
}
}
public List<SupervisoryNode> getSupervisoryNodesByParent(Pagination pagination, String nameSearchCriteria) {
return supervisoryNodeMapper.getSupervisoryNodesByParent(nameSearchCriteria, pagination);
}
public List<SupervisoryNode> getSupervisoryNodesBy(Pagination pagination, String nameSearchCriteria) {
return supervisoryNodeMapper.getSupervisoryNodesBy(nameSearchCriteria, pagination);
}
public Integer getTotalSearchResultCount(String param) {
return supervisoryNodeMapper.getTotalSearchResultCount(param);
}
public Integer getTotalParentSearchResultCount(String param) {
return supervisoryNodeMapper.getTotalParentSearchResultCount(param);
}
public SupervisoryNode getSupervisoryNode(Long id) {
return supervisoryNodeMapper.getSupervisoryNode(id);
}
public List<SupervisoryNode> getFilteredSupervisoryNodesByName(String param) {
return supervisoryNodeMapper.getFilteredSupervisoryNodesByName(param);
}
public List<SupervisoryNode> searchTopLevelSupervisoryNodesByName(String param) {
return supervisoryNodeMapper.searchTopLevelSupervisoryNodesByName(param);
}
public Long getTotalUnassignedSupervisoryNodeOfUserBy(Long userId, Long programId) {
return supervisoryNodeMapper.getTotalUnassignedSupervisoryNodeOfUserBy(userId, programId);
}
}