package com.napa.pulse.dao.impl; import com.napa.pulse.dao.interfaces.SiteDAO; import com.napa.pulse.entity.pulseui.Site; import com.napa.pulse.entity.pulseui.SiteType; import com.napa.pulse.entity.security.User; import com.napa.pulse.utils.ROLE; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import java.util.List; /** * @author Yong Wang *

* Created on 12/15/2014 */ @Repository public class SiteDAOImpl implements SiteDAO { private static final Logger LOGGER = LoggerFactory.getLogger(SiteDAOImpl.class); @Autowired private JdbcTemplate jdbcTemplate; @Override public List getUserSites(User user, String userAccessSites, int userId, String sessionType) { List sites; String jasStoreOnly = ""; if (("minMax").equals(sessionType) || ("MM").equals(sessionType)) jasStoreOnly = " and s.JAS_STORE = 'Y' "; try { if ((user.getRoleId() == ROLE.ADMIN.getNumVal() || user.getRoleId() == ROLE.XO.getNumVal()) && userId == 0) // Admin user { String sql = "select /*+ INDEX_JOIN(ST) */ s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", st.UI_ORDER, " + "(case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end) as BR_UPDATED, " + "s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY') as SNAPSHOT_DT, to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY') as STAGED_SNAPSHOT_DT, " + "to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY') as EPTS_UPDATE_DT, to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY') as SALES_UPDATE_DT, " + "sum(case when sm.site_id is not null then 1 else 0 end) as MARKET_COUNT, " + "ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE " + "from site s " + "inner join site_type st on st.SITE_TYPE_CODE = s.SITE_TYPE_CODE " + "left join site_market sm on sm.SITE_ID = s.SITE_ID " + "left join major_account ma on s.major_account_id = ma.major_account_id " + "left join ma_inv_coll_template ict on ict.ma_inv_coll_template_id = nvl(S.ma_inv_coll_template_id, ma.default_inv_coll_template_id) " + "where s.ACTIVE_FLAG='Y' " + jasStoreOnly + "group by s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", st.UI_ORDER, " + "(case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end), s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY'), to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY'), " + "to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY'), to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY'), ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE order by s.SITE_NAME asc "; sites = jdbcTemplate.query(sql, (rs, rowNum) -> { Site site = new Site(); SiteType siteType = new SiteType(); site.setSiteId(rs.getInt("SITE_ID")); site.setIdNumber(rs.getString("ID_NUMBER")); site.setProductAvailabilityId(rs.getInt("PRODUCT_AVAILABILITY_ID")); site.setSiteName(rs.getString("SITE_NAME")); site.setActiveFlag(rs.getString("ACTIVE_FLAG")); site.setVirtualSiteFlag(rs.getString("VIRTUAL_SITE_FLAG")); site.setPosType(rs.getString("POS_TYPE")); site.setCreatedUserId(rs.getInt("CREATED_USER_ID")); site.setBrUpdated(rs.getInt("BR_UPDATED")); site.setLongitude(rs.getDouble("LONGITUDE")); site.setLatitude(rs.getDouble("LATITUDE")); site.setSnapshotDt(rs.getString("SNAPSHOT_DT")); site.setStagedSnapshotDt(rs.getString("STAGED_SNAPSHOT_DT")); site.setEptsUpdateDt(rs.getString("EPTS_UPDATE_DT")); site.setSalesUpdateDt(rs.getString("SALES_UPDATE_DT")); site.setMarketCount(rs.getInt("MARKET_COUNT")); site.setInvCollTemplateId(rs.getInt("MA_INV_COLL_TEMPLATE_ID")); site.setInvCollTemplateName(rs.getString("MA_INV_COLL_TEMPLATE_NAME")); siteType.setSiteTypeCode(rs.getString("SITE_TYPE_CODE")); siteType.setSiteTypeDesc(rs.getString((("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR"))); siteType.setUiOrder(rs.getInt("UI_ORDER")); site.setSiteType(siteType); site.setStoreTypeCode(rs.getString("STORE_TYPE_CODE")); return site; }); } else if ((user.getRoleId() == ROLE.ADMIN.getNumVal()) && userId > 0) { String sql = "select /*+ INDEX_JOIN(ST) */ s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", st.UI_ORDER, " + "(case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end) as BR_UPDATED, " + "s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY') as SNAPSHOT_DT, to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY') as STAGED_SNAPSHOT_DT, to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY') as EPTS_UPDATE_DT, to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY') as SALES_UPDATE_DT, " + "sum(case when sm.site_id is not null then 1 else 0 end) as MARKET_COUNT, " + "ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE " + "from site s " + "inner join site_type st on s.SITE_TYPE_CODE=st.SITE_TYPE_CODE " + "inner join user_site_type ust on st.SITE_TYPE_CODE=ust.SITE_TYPE_CODE " + "left join site_market sm on sm.SITE_ID = s.SITE_ID " + "left join major_account ma on s.major_account_id = ma.major_account_id " + "left join ma_inv_coll_template ict on ict.ma_inv_coll_template_id = nvl(S.ma_inv_coll_template_id, ma.default_inv_coll_template_id) " + "where s.ACTIVE_FLAG='Y' and ust.USER_ID=? " + jasStoreOnly + "group by s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", " + "st.UI_ORDER, (case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end), s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY'), to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY'), " + "to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY'), to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY'), ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE order by s.SITE_NAME asc "; sites = jdbcTemplate.query(sql, new Object[]{userId}, (rs, rowNum) -> { Site site = new Site(); SiteType siteType = new SiteType(); site.setSiteId(rs.getInt("SITE_ID")); site.setIdNumber(rs.getString("ID_NUMBER")); site.setProductAvailabilityId(rs.getInt("PRODUCT_AVAILABILITY_ID")); site.setSiteName(rs.getString("SITE_NAME")); site.setActiveFlag(rs.getString("ACTIVE_FLAG")); site.setVirtualSiteFlag(rs.getString("VIRTUAL_SITE_FLAG")); site.setPosType(rs.getString("POS_TYPE")); site.setCreatedUserId(rs.getInt("CREATED_USER_ID")); site.setBrUpdated(rs.getInt("BR_UPDATED")); site.setLongitude(rs.getDouble("LONGITUDE")); site.setLatitude(rs.getDouble("LATITUDE")); site.setSnapshotDt(rs.getString("SNAPSHOT_DT")); site.setStagedSnapshotDt(rs.getString("STAGED_SNAPSHOT_DT")); site.setEptsUpdateDt(rs.getString("EPTS_UPDATE_DT")); site.setSalesUpdateDt(rs.getString("SALES_UPDATE_DT")); site.setMarketCount(rs.getInt("MARKET_COUNT")); site.setInvCollTemplateId(rs.getInt("MA_INV_COLL_TEMPLATE_ID")); site.setInvCollTemplateName(rs.getString("MA_INV_COLL_TEMPLATE_NAME")); siteType.setSiteTypeCode(rs.getString("SITE_TYPE_CODE")); siteType.setSiteTypeDesc(rs.getString((("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR"))); siteType.setUiOrder(rs.getInt("UI_ORDER")); site.setSiteType(siteType); site.setStoreTypeCode(rs.getString("STORE_TYPE_CODE")); return site; }); } else { if (userAccessSites != null && userAccessSites.length() > 0) { if (userId == 0) { String sql = "select /*+ INDEX_JOIN(ST) */ s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", st.UI_ORDER, " + "(case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end) as BR_UPDATED, " + "s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY') as SNAPSHOT_DT, to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY') as STAGED_SNAPSHOT_DT, to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY') as EPTS_UPDATE_DT, to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY') as SALES_UPDATE_DT, " + "sum(case when sm.site_id is not null then 1 else 0 end) as MARKET_COUNT, " + "ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE " + "from site s " + "inner join site_type st on s.SITE_TYPE_CODE=st.SITE_TYPE_CODE " + "left join site_market sm on sm.SITE_ID = s.SITE_ID " + "left join major_account ma on s.major_account_id = ma.major_account_id " + "left join ma_inv_coll_template ict on ict.ma_inv_coll_template_id = nvl(S.ma_inv_coll_template_id, ma.default_inv_coll_template_id) " + "where s.ACTIVE_FLAG='Y' " + jasStoreOnly + "and (s.SITE_ID, 0) in (" + userAccessSites + ") " + "group by s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", " + "st.UI_ORDER, (case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end), s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY'), to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY'), " + "to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY'), to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY'), ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE order by s.SITE_NAME asc "; sites = jdbcTemplate.query(sql, (rs, rowNum) -> { Site site = new Site(); SiteType siteType = new SiteType(); site.setSiteId(rs.getInt("SITE_ID")); site.setIdNumber(rs.getString("ID_NUMBER")); site.setProductAvailabilityId(rs.getInt("PRODUCT_AVAILABILITY_ID")); site.setSiteName(rs.getString("SITE_NAME")); site.setActiveFlag(rs.getString("ACTIVE_FLAG")); site.setVirtualSiteFlag(rs.getString("VIRTUAL_SITE_FLAG")); site.setPosType(rs.getString("POS_TYPE")); site.setCreatedUserId(rs.getInt("CREATED_USER_ID")); site.setBrUpdated(rs.getInt("BR_UPDATED")); site.setLongitude(rs.getDouble("LONGITUDE")); site.setLatitude(rs.getDouble("LATITUDE")); site.setSnapshotDt(rs.getString("SNAPSHOT_DT")); site.setStagedSnapshotDt(rs.getString("STAGED_SNAPSHOT_DT")); site.setEptsUpdateDt(rs.getString("EPTS_UPDATE_DT")); site.setSalesUpdateDt(rs.getString("SALES_UPDATE_DT")); site.setMarketCount(rs.getInt("MARKET_COUNT")); site.setInvCollTemplateId(rs.getInt("MA_INV_COLL_TEMPLATE_ID")); site.setInvCollTemplateName(rs.getString("MA_INV_COLL_TEMPLATE_NAME")); siteType.setSiteTypeCode(rs.getString("SITE_TYPE_CODE")); siteType.setSiteTypeDesc(rs.getString((("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR"))); siteType.setUiOrder(rs.getInt("UI_ORDER")); site.setSiteType(siteType); site.setStoreTypeCode(rs.getString("STORE_TYPE_CODE")); return site; }); } else { String sql = "select /*+ parallel (s 10) */ s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", st.UI_ORDER, " + "(case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end) as BR_UPDATED, " + "s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY') as SNAPSHOT_DT, to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY') as STAGED_SNAPSHOT_DT, to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY') as EPTS_UPDATE_DT, to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY') as SALES_UPDATE_DT, " + "sum(case when sm.site_id is not null then 1 else 0 end) as MARKET_COUNT, " + "ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE " + "from site s " + "inner join site_type st on s.SITE_TYPE_CODE=st.SITE_TYPE_CODE " + "inner join user_site_type ust on st.SITE_TYPE_CODE=ust.SITE_TYPE_CODE " + "left join site_market sm on sm.SITE_ID = s.SITE_ID " + "left join major_account ma on s.major_account_id = ma.major_account_id " + "left join ma_inv_coll_template ict on ict.ma_inv_coll_template_id = nvl(S.ma_inv_coll_template_id, ma.default_inv_coll_template_id) " + "where s.ACTIVE_FLAG='Y' and ust.USER_ID=? and (s.SITE_ID, 0) in (" + userAccessSites + ") " + jasStoreOnly + "group by s.SITE_ID, s.ID_NUMBER, s.PRODUCT_AVAILABILITY_ID, s.SITE_NAME, s.ACTIVE_FLAG, " + "s.VIRTUAL_SITE_FLAG, POS_TYPE, s.CREATED_USER_ID, st.SITE_TYPE_CODE, st." + (("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR") + ", " + "st.UI_ORDER, (case when s.MARKET_UPDATE_DT is not null and s.MARKET_UPDATE_DT > s.EPTS_UPDATE_DT then 1 else 0 end), s.LATITUDE, s.LONGITUDE, to_char(s.SNAPSHOT_DT, 'MM/DD/YYYY'), to_char(STAGED_SNAPSHOT_DT, 'MM/DD/YYYY'), " + "to_char(s.EPTS_UPDATE_DT, 'MM/DD/YYYY'), to_char(s.SALES_UPDATE_DT, 'MM/DD/YYYY'), ICT.MA_INV_COLL_TEMPLATE_ID, MA_INV_COLL_TEMPLATE_NAME, STORE_TYPE_CODE order by s.SITE_NAME asc "; sites = jdbcTemplate.query(sql, new Object[]{userId}, (rs, rowNum) -> { Site site = new Site(); SiteType siteType = new SiteType(); site.setSiteId(rs.getInt("SITE_ID")); site.setIdNumber(rs.getString("ID_NUMBER")); site.setProductAvailabilityId(rs.getInt("PRODUCT_AVAILABILITY_ID")); site.setSiteName(rs.getString("SITE_NAME")); site.setActiveFlag(rs.getString("ACTIVE_FLAG")); site.setVirtualSiteFlag(rs.getString("VIRTUAL_SITE_FLAG")); site.setPosType(rs.getString("POS_TYPE")); site.setCreatedUserId(rs.getInt("CREATED_USER_ID")); site.setBrUpdated(rs.getInt("BR_UPDATED")); site.setLongitude(rs.getDouble("LONGITUDE")); site.setLatitude(rs.getDouble("LATITUDE")); site.setSnapshotDt(rs.getString("SNAPSHOT_DT")); site.setStagedSnapshotDt(rs.getString("STAGED_SNAPSHOT_DT")); site.setEptsUpdateDt(rs.getString("EPTS_UPDATE_DT")); site.setSalesUpdateDt(rs.getString("SALES_UPDATE_DT")); site.setMarketCount(rs.getInt("MARKET_COUNT")); site.setInvCollTemplateId(rs.getInt("MA_INV_COLL_TEMPLATE_ID")); site.setInvCollTemplateName(rs.getString("MA_INV_COLL_TEMPLATE_NAME")); siteType.setSiteTypeCode(rs.getString("SITE_TYPE_CODE")); siteType.setSiteTypeDesc(rs.getString((("en".equals(user.getLanguage()) || user.getLanguage() == null) ? "SITE_TYPE_DESC" : "SITE_TYPE_DESC_FR"))); siteType.setUiOrder(rs.getInt("UI_ORDER")); site.setSiteType(siteType); site.setStoreTypeCode(rs.getString("STORE_TYPE_CODE")); return site; }); } } else { return null; } } } catch (Exception e) { LOGGER.error("getUserSites",e); throw new RuntimeException(e); } return sites; } }