/*
* 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.mapper;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.session.RowBounds;
import org.openlmis.core.domain.Facility;
import org.openlmis.core.domain.Program;
import org.openlmis.core.domain.RequisitionGroup;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* RequisitionGroupMapper maps the RequisitionGroup entity to corresponding representation in database. Also provides
* methods like getting all requisition groups for a supervisory node, getting requisition group for a program and facility.
*/
@Repository
public interface RequisitionGroupMapper {
@Insert("INSERT INTO requisition_groups" +
"(code, name, description, supervisoryNodeId, createdBy, modifiedBy, modifiedDate) " +
"VALUES (#{code}, #{name}, #{description}, #{supervisoryNode.id}, #{createdBy}, #{createdBy}, COALESCE(#{modifiedDate}, CURRENT_TIMESTAMP))")
@Options(useGeneratedKeys = true)
Integer insert(RequisitionGroup requisitionGroup);
@Select(
{"SELECT RG.id, RG.code, RG.name, RG.description, RG.supervisoryNodeId, SN.name AS supervisoryNodeName, SN.code AS supervisoryNodeCode",
"FROM requisition_groups RG LEFT JOIN supervisory_nodes SN ON RG.supervisoryNodeId = SN.id WHERE RG.id = #{id}"})
@Results(value = {
@Result(property = "supervisoryNode.id", column = "supervisoryNodeId"),
@Result(property = "supervisoryNode.code", column = "supervisoryNodeCode"),
@Result(property = "supervisoryNode.name", column = "supervisoryNodeName")
})
RequisitionGroup getRequisitionGroupById(Long id);
@Select("SELECT id FROM requisition_groups where LOWER(code) = LOWER(#{code})")
Long getIdForCode(String code);
@Select("SELECT id FROM requisition_groups where supervisoryNodeId = ANY(#{supervisoryNodeIdsAsString}::INTEGER[])")
List<RequisitionGroup> getRequisitionGroupBySupervisoryNodes(String supervisoryNodeIdsAsString);
@Select("SELECT * " +
"FROM requisition_groups rg " +
"INNER JOIN requisition_group_program_schedules rgps ON rg.id = rgps.requisitionGroupId " +
"INNER JOIN requisition_group_members rgm ON rgps.requisitionGroupId = rgm.requisitionGroupId " +
"WHERE rgps.programId = #{program.id} " +
"AND RGM.facilityId = #{facility.id}")
RequisitionGroup getRequisitionGroupForProgramAndFacility(@Param(value = "program") Program program,
@Param(value = "facility") Facility facility);
@Select("SELECT * FROM requisition_groups where LOWER(code) = LOWER(#{code})")
@Results(value = {
@Result(property = "supervisoryNode.id", column = "supervisoryNodeId")
})
RequisitionGroup getByCode(String code);
@Update({"UPDATE requisition_groups",
"SET code = #{code}, name = #{name}, description = #{description}, supervisoryNodeId = #{supervisoryNode.id},",
"modifiedBy = #{modifiedBy}, modifiedDate = COALESCE(#{modifiedDate}, NOW())",
"WHERE id = #{id}"})
void update(RequisitionGroup requisitionGroup);
@Select({"SELECT RG.id AS requisitionGroupId, RG.code AS requisitionGroupCode, RG.name AS requisitionGroupName, SN.name AS supervisoryNodeName,",
"(SELECT COUNT(*) FROM requisition_group_members RGM INNER JOIN facilities F ON F.id = RGM.facilityId",
"WHERE RG.id = RGM.requisitionGroupId AND F.enabled = true GROUP BY requisitionGroupId) AS memberCount",
"FROM requisition_groups RG LEFT JOIN supervisory_nodes SN ON SN.id = RG.supervisoryNodeId",
"WHERE LOWER(RG.name) LIKE '%'|| LOWER(#{searchParam}) ||'%'",
"ORDER BY LOWER(SN.name), LOWER(RG.Name) NULLS LAST"})
@Results(value = {
@Result(property = "supervisoryNode.name", column = "supervisoryNodeName"),
@Result(property = "id", column = "requisitionGroupId"),
@Result(property = "name", column = "requisitionGroupName"),
@Result(property = "code", column = "requisitionGroupCode"),
@Result(property = "memberCount", column = "memberCount")
})
List<RequisitionGroup> searchByGroupName(@Param(value = "searchParam") String searchParam, RowBounds rowBounds);
@Select(
{"SELECT RG.id AS requisitionGroupId, RG.code AS requisitionGroupCode, RG.name AS requisitionGroupName, SN.name AS supervisoryNodeName,",
"(SELECT COUNT(*) FROM requisition_group_members RGM INNER JOIN facilities F ON F.id = RGM.facilityId",
"WHERE RG.id = RGM.requisitionGroupId AND F.enabled = true GROUP BY requisitionGroupId) AS memberCount",
"FROM requisition_groups RG INNER JOIN supervisory_nodes SN ON SN.id = RG.supervisoryNodeId",
"WHERE LOWER(SN.name) LIKE '%'|| LOWER(#{searchParam}) ||'%'",
"ORDER BY LOWER(SN.name), LOWER(RG.Name)"})
@Results(value = {
@Result(property = "supervisoryNode.name", column = "supervisoryNodeName"),
@Result(property = "id", column = "requisitionGroupId"),
@Result(property = "name", column = "requisitionGroupName"),
@Result(property = "code", column = "requisitionGroupCode"),
@Result(property = "memberCount", column = "memberCount")
})
List<RequisitionGroup> searchByNodeName(@Param(value = "searchParam") String searchParam, RowBounds rowBounds);
@Select({"SELECT COUNT(*) FROM requisition_groups RG WHERE LOWER(RG.name) LIKE '%'|| LOWER(#{searchParam}) ||'%'"})
Integer getTotalRecordsForSearchOnGroupName(String searchParam);
@Select({"SELECT COUNT(*) FROM requisition_groups RG INNER JOIN supervisory_nodes SN ON SN.id = RG.supervisoryNodeId",
"WHERE LOWER(SN.name) LIKE '%'|| LOWER(#{searchParam}) ||'%'"})
Integer getTotalRecordsForSearchOnNodeName(String searchParam);
}