/*
* 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.Program;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* ProgramMapper maps the Program entity to corresponding representation in database. Apart from basic CRUD operations
* provides methods like getting user supervised/home facility active programs, getting programs for a user and facility
* on which user have given rights.
*/
@Repository
public interface ProgramMapper {
@Insert({"INSERT INTO programs(code, name, description, active, push, templateConfigured, regimenTemplateConfigured)",
"VALUES (#{code}, #{name}, #{description}, #{active}, #{push}, #{templateConfigured}, #{regimenTemplateConfigured})"})
@Options(useGeneratedKeys = true)
Integer insert(Program program);
@Delete("DELETE FROM programs WHERE code=#{code}")
public void deleteByCode(String code);
@Select({"SELECT P.*",
"FROM programs P, programs_supported PS",
"WHERE P.id = PS.programId AND",
"PS.facilityId = #{facilityId} AND",
"PS.active = true AND",
"P.active = true"})
List<Program> getActiveByFacility(Long facilityId);
@Select("SELECT * FROM programs WHERE push = FALSE ORDER BY name ")
List<Program> getAllPullPrograms();
@Select("SELECT * FROM programs WHERE push = TRUE ORDER BY name ")
List<Program> getAllPushPrograms();
@Select({"SELECT",
"p.id AS id,",
"p.code AS code,",
"p.name AS name,",
"p.description AS description,",
"ps.active AS active",
"FROM programs p, programs_supported ps WHERE",
"p.id = ps.programId AND",
"ps.facilityId = #{facilityId}"})
List<Program> getByFacilityId(Long facilityId);
@Select("SELECT id FROM programs WHERE LOWER(code) = LOWER(#{code})")
Long getIdForCode(String code);
@Select("SELECT * FROM programs WHERE id = #{id}")
Program getById(Long id);
@Select({"SELECT DISTINCT p.*",
"FROM programs p",
"INNER JOIN role_assignments ra ON p.id = ra.programId",
"INNER JOIN role_rights rr ON ra.roleId = rr.roleId",
"WHERE ra.userId = #{userId}",
"AND rr.rightName = ANY (#{commaSeparatedRights}::VARCHAR[])",
"AND ra.supervisoryNodeId IS NOT NULL",
"AND p.active = TRUE",
"AND p.push = FALSE"})
List<Program> getUserSupervisedActivePrograms(@Param(value = "userId") Long userId,
@Param(value = "commaSeparatedRights") String commaSeparatedRights);
@Select({"SELECT DISTINCT p.*",
"FROM programs p",
"INNER JOIN role_assignments ra ON p.id = ra.programId",
"INNER JOIN role_rights rr ON ra.roleId = rr.roleId",
"WHERE ra.userId = #{userId}",
"AND rr.rightName = ANY (#{commaSeparatedRights}::VARCHAR[])",
"AND ra.supervisoryNodeId IS NOT NULL",
"AND p.active = TRUE " ,
"AND p.enableIvdForm = TRUE ",
"AND p.push = FALSE"})
List<Program> getUserSupervisedActiveIvdPrograms(@Param(value = "userId") Long userId,
@Param(value = "commaSeparatedRights") String commaSeparatedRights);
@Select({"SELECT DISTINCT p.* ",
"FROM programs p",
"INNER JOIN programs_supported ps ON p.id = ps.programId",
"INNER JOIN role_assignments ra ON ra.programId = p.id",
"INNER JOIN role_rights rr ON rr.roleId = ra.roleId",
"WHERE ra.supervisoryNodeId IS NULL",
"AND p.active = TRUE",
"AND p.push = FALSE",
"AND ps.active= TRUE",
"AND ra.userId = #{userId}",
"AND ps.facilityId = #{facilityId}",
"AND rr.rightName = ANY(#{commaSeparatedRights}::VARCHAR[])"})
List<Program> getProgramsSupportedByUserHomeFacilityWithRights(@Param("facilityId") Long facilityId,
@Param("userId") Long userId,
@Param("commaSeparatedRights") String commaSeparatedRights);
@Select({"SELECT DISTINCT p.* ",
"FROM programs p",
"INNER JOIN programs_supported ps ON p.id = ps.programId",
"INNER JOIN role_assignments ra ON ra.programId = p.id",
"INNER JOIN role_rights rr ON rr.roleId = ra.roleId",
"WHERE ra.supervisoryNodeId IS NULL",
"AND p.active = TRUE",
"AND p.push = FALSE",
"AND ps.active= TRUE",
"AND ra.userId = #{userId}",
"AND p.enableIvdForm = TRUE ",
"AND ps.facilityId = #{facilityId}",
"AND rr.rightName = ANY(#{commaSeparatedRights}::VARCHAR[])"})
List<Program> getIvdProgramsSupportedByUserHomeFacilityWithRights(@Param("facilityId") Long facilityId,
@Param("userId") Long userId,
@Param("commaSeparatedRights") String commaSeparatedRights);
@Select({"SELECT DISTINCT p.*",
"FROM programs p",
"INNER JOIN role_assignments ra ON p.id = ra.programId",
"INNER JOIN role_rights rr ON ra.roleId = rr.roleId",
"WHERE ra.userId = #{userId}",
"AND rr.rightName = ANY (#{commaSeparatedRights}::VARCHAR[])",
"AND p.active = true"})
List<Program> getActiveProgramsForUserWithRights(@Param(value = "userId") Long userId,
@Param(value = "commaSeparatedRights") String commaSeparatedRights);
@Update("UPDATE programs SET templateConfigured = true WHERE id = #{id}")
void setTemplateConfigured(Long id);
@Select({"SELECT DISTINCT p.* FROM programs p INNER JOIN programs_supported ps ON p.id = ps.programId",
"INNER JOIN role_assignments ra ON ra.programId = p.id",
"INNER JOIN role_rights rr ON rr.roleId = ra.roleId",
"AND p.active = TRUE",
"AND ps.active= TRUE",
"AND ra.userId = #{userId}",
"AND ps.facilityId = #{facilityId}",
"AND rr.rightName = ANY(#{commaSeparatedRights}::VARCHAR[])"})
List<Program> getProgramsForUserByFacilityAndRights(@Param("facilityId") Long facilityId,
@Param("userId") Long userId,
@Param("commaSeparatedRights") String commaSeparatedRights);
@Select("SELECT * FROM programs ORDER BY templateConfigured DESC, name")
List<Program> getAll();
@Select("SELECT * FROM programs WHERE LOWER(code) = LOWER(#{code})")
Program getByCode(String code);
@Select("SELECT * FROM programs ORDER BY regimenTemplateConfigured DESC, name")
List<Program> getAllByRegimenTemplate();
@Update("UPDATE programs SET regimenTemplateConfigured = true WHERE id = #{id}")
void setRegimenTemplateConfigured(Long id);
@Update("UPDATE programs SET sendFeed = #{sendFeed} WHERE code = #{program.code}")
void setFeedSendFlag(@Param("program") Program program, @Param("sendFeed") Boolean sendFeed);
@Select("SELECT * FROM programs WHERE sendFeed = TRUE")
List<Program> getProgramsForNotification();
@Update("UPDATE programs SET " +
"code = #{code}, name = #{name}, " +
"isEquipmentConfigured = #{isEquipmentConfigured}, " +
"showNonFullSupplyTab = #{showNonFullSupplyTab}, " +
"hideSkippedProducts = #{hideSkippedProducts}, " +
"enableSkipPeriod = #{enableSkipPeriod}," +
"enableIvdForm = #{enableIvdForm}, " +
"budgetingApplies = #{budgetingApplies}, " +
"usepriceschedule = #{usePriceSchedule}" +
"WHERE id = #{id}")
void update(Program program);
@Select("SELECT * FROM programs " +
" where enableIvdForm = true " +
" order by name")
List<Program> getAllIvdPrograms();
}