package net.techreadiness.customer.datagrid;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import net.techreadiness.service.common.DataGrid;
import net.techreadiness.service.object.Org;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@Component
@Scope("prototype")
@Transactional(readOnly = true)
public class OrgsByIdItemProviderImpl implements OrgsByIdItemProvider {
@PersistenceContext
private EntityManager em;
private Collection<Org> orgs;
@Override
public List<Map<String, String>> getPage(DataGrid<Map<String, String>> grid) {
List<Map<String, String>> maps = Lists.newArrayList();
int enrollmentCounts = 0;
for (OrgDeleteRowInfo orgDeleteRowInfo : getOrgs()) {
Map<String, String> orgMap = Maps.newHashMap();
orgDeleteRowInfoToMap(enrollmentCounts, orgDeleteRowInfo, orgMap);
maps.add(orgMap);
}
return maps;
}
private static void orgDeleteRowInfoToMap(int enrollmentCounts, OrgDeleteRowInfo orgDeleteRowInfo,
Map<String, String> orgMap) {
orgMap.put("orgId", String.valueOf(orgDeleteRowInfo.getOrgId()));
orgMap.put("name", orgDeleteRowInfo.getName());
orgMap.put("code", orgDeleteRowInfo.getCode());
if (orgDeleteRowInfo.getInactive()) {
orgMap.put("inactive", "closed");
} else {
orgMap.put("inactive", "open");
}
orgMap.put("participations", String.valueOf(orgDeleteRowInfo.getParticipations()));
orgMap.put("contacts", String.valueOf(orgDeleteRowInfo.getContacts()));
}
@Override
public int getTotalNumberOfItems(DataGrid<Map<String, String>> grid) {
return getOrgs().size();
}
@Override
public void setOrgs(Collection<Org> orgs) {
this.orgs = orgs;
}
private List<OrgDeleteRowInfo> getOrgs() {
Collection<Long> orgIds = Lists.newArrayList();
for (Org org : orgs) {
orgIds.add(org.getOrgId());
}
return findOrgDeleteInfoByIds(orgIds);
}
public List<OrgDeleteRowInfo> findOrgDeleteInfoByIds(Collection<Long> orgIds) {
if (orgIds.isEmpty()) {
return Lists.<OrgDeleteRowInfo> newArrayList();
}
Query query = em.createQuery("select " + "new net.techreadiness.customer.datagrid.OrgDeleteRowInfo("
+ "o.orgId, o.name, o.code, o.inactive, " + "count(distinct c.contactId), "
+ "count(distinct op.orgPartId)) " + "from OrgDO o left join o.contacts c left join o.orgParts op "
+ "where o.orgId in (:orgIds) " + "group by o.orgId ");
query.setParameter("orgIds", orgIds);
return query.getResultList();
}
}