/*
* 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.openlmis.core.domain.Facility;
import org.openlmis.core.domain.RequisitionGroup;
import org.openlmis.core.domain.RequisitionGroupMember;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* RequisitionGroupMemberMapper maps the RequisitionGroupMember entity to corresponding representation in database. Also
* provides methods to replicate members to virtual facility.
*/
@Repository
public interface RequisitionGroupMemberMapper {
@Insert("INSERT INTO requisition_group_members" +
"(requisitionGroupId, facilityId, createdBy, modifiedBy, modifiedDate) " +
"VALUES (#{requisitionGroup.id}, #{facility.id}, #{createdBy}, #{createdBy}, COALESCE(#{modifiedDate}, NOW()))")
@Options(useGeneratedKeys = true)
Integer insert(RequisitionGroupMember requisitionGroupMember);
@Select({"SELECT rgps.programId FROM requisition_groups rg",
"INNER JOIN requisition_group_program_schedules rgps ON rg.id = rgps.requisitionGroupId",
"INNER JOIN requisition_group_members rgm ON rg.id = rgm.requisitionGroupId",
"WHERE rgm.facilityId = #{facilityId}"})
List<Long> getRequisitionGroupProgramIdsForFacilityId(Long facilityId);
@Select(
{"SELECT * FROM requisition_group_members WHERE requisitionGroupId = #{requisitionGroup.id} AND facilityId = #{facility.id}"})
RequisitionGroupMember getMappingByRequisitionGroupIdAndFacilityId(
@Param(value = "requisitionGroup") RequisitionGroup requisitionGroup,
@Param(value = "facility") Facility facility);
@Update("UPDATE requisition_group_members " +
"SET modifiedBy = #{modifiedBy}, modifiedDate = COALESCE(#{modifiedDate}, NOW()) WHERE " +
"requisitionGroupId = #{requisitionGroup.id} AND facilityId = #{facility.id}")
void update(RequisitionGroupMember requisitionGroupMember);
@Delete("DELETE from requisition_group_members WHERE " +
"requisitionGroupId = #{requisitionGroup.id} AND facilityId = #{facility.id}")
void removeRequisitionGroupMember(
@Param(value = "requisitionGroup") RequisitionGroup requisitionGroup,
@Param(value="facility") Facility facility);
@Select("SELECT * FROM requisition_group_members WHERE facilityId = #{facilityId}")
@Results(value = {
@Result(property = "facility.id", column = "facilityId"),
@Result(property = "requisitionGroup", column = "requisitionGroupId", javaType = RequisitionGroup.class,
one = @One(select = "org.openlmis.core.repository.mapper.RequisitionGroupMapper.getRequisitionGroupById"))
})
List<RequisitionGroupMember> getAllRequisitionGroupMembersByFacility(Long facilityId);
@Delete({"DELETE FROM requisition_group_members RGM USING facilities F",
"WHERE RGM.facilityId = F.id AND F.parentFacilityId = #{id}"})
int deleteMembersForVirtualFacility(Facility parentFacility);
@Insert({"INSERT INTO requisition_group_members(requisitionGroupId, facilityId, createdBy, modifiedBy)",
"SELECT requisitionGroupId, C.virtualFacilityId, createdBy, modifiedBy",
"FROM requisition_group_members RGM, ",
"(SELECT id as virtualFacilityId FROM facilities where parentFacilityId=#{id}) AS C",
"WHERE RGM.facilityId = #{id}"})
void copyToVirtualFacilities(Facility parentFacility);
@Delete({"DELETE FROM requisition_group_members where facilityId = #{id}"})
void deleteMembersFor(Facility facility);
@Select(
{"SELECT RGM.*,GZ.name as geoZoneName, F.name AS facilityName, F.code AS facilityCode, F.id AS facilityId, F.enabled AS enabled, FT.name AS facilityType FROM requisition_group_members RGM",
"INNER JOIN facilities F ON RGM.facilityId = F.id INNER JOIN facility_types FT ON FT.id = F.typeId",
"INNER JOIN requisition_groups RG ON RG.id = requisitionGroupId",
"INNER JOIN geographic_zones GZ ON GZ.id = F.geographiczoneid",
"WHERE requisitionGroupId = #{requisitionGroupId} ORDER BY LOWER(F.code)"})
@Results(value = {
@Result(property = "requisitionGroup.id", column = "requisitionGroupId"),
@Result(property = "facility.id", column = "facilityId"),
@Result(property = "facility.name", column = "facilityName"),
@Result(property = "facility.code", column = "facilityCode"),
@Result(property = "facility.enabled", column = "enabled"),
@Result(property = "facility.facilityType.name", column = "facilityType"),
@Result(property = "facility.geographicZone.name", column = "geoZoneName"),
})
List<RequisitionGroupMember> getMembersBy(Long requisitionGroupId);
@Delete({"DELETE FROM requisition_group_members where requisitionGroupId = #{requisitionGroupId}"})
void deleteMemberForGroup(Long requisitionGroupId);
}