001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kew.stats.dao.impl;
017
018import java.sql.SQLException;
019import java.sql.Timestamp;
020import java.util.ArrayList;
021import java.util.Calendar;
022import java.util.Date;
023import java.util.List;
024
025import javax.persistence.EntityManager;
026import javax.persistence.Query;
027
028import org.kuali.rice.core.api.util.ConcreteKeyValue;
029import org.kuali.rice.core.api.util.KeyValue;
030import org.kuali.rice.kew.api.KewApiConstants;
031import org.kuali.rice.kew.stats.Stats;
032import org.kuali.rice.kew.stats.dao.StatsDAO;
033
034/**
035 * This is a description of what this class does - ddean don't forget to fill this in.
036 *
037 * @author Kuali Rice Team (rice.collab@kuali.org)
038 *
039 */
040public class StatsDaoJpa implements StatsDAO {
041
042    public static final String STATS_DOCUMENTS_ROUTED_REPORT = "select count(drhv) as cnt, drhv.docRouteStatus "
043                            + "from DocumentRouteHeaderValue drhv "
044                            + "where drhv.createDate between :beginDate and :endDate group by drhv.docRouteStatus";
045    public static final String STATS_NUM_ACTIVE_ITEMS_REPORT = "select count(ai) from ActionItem ai";
046    public static final String STATS_NUM_INITIATED_DOCS_BY_DOC_TYPE_REPORT = "select count(drhv), dt.name from "
047            + "DocumentRouteHeaderValue drhv, DocumentType dt where drhv.createDate > :createDate and "
048            + "drhv.documentTypeId = dt.documentTypeId group by dt.name";
049    public static final String STATS_NUM_USERS_REPORT = "select count(distinct(uo.workflowId)) from UserOptions uo";
050    public static final String STATS_NUM_DOC_TYPES_REPORT =
051                    "select count(dt) from DocumentType dt where dt.currentInd = true";
052
053    private EntityManager entityManager;
054
055    @Override
056        public void DocumentsRoutedReport(Stats stats, Date begDate, Date endDate) throws SQLException {
057        Query query = getEntityManager().createQuery(STATS_DOCUMENTS_ROUTED_REPORT);
058        query.setParameter("beginDate", new Timestamp(begDate.getTime()));
059        query.setParameter("endDate", new Timestamp(endDate.getTime()));
060
061        @SuppressWarnings("unchecked")
062        List<Object[]> resultList = query.getResultList();
063
064        for (Object[] result : resultList) {
065            String actionType = result[1].toString();
066            String number = result[0].toString();
067            if (actionType.equals(KewApiConstants.ROUTE_HEADER_CANCEL_CD)) {
068                stats.setCanceledNumber(number);
069            } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_DISAPPROVED_CD)) {
070                stats.setDisapprovedNumber(number);
071            } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_ENROUTE_CD)) {
072                stats.setEnrouteNumber(number);
073            } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_EXCEPTION_CD)) {
074                stats.setExceptionNumber(number);
075            } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_FINAL_CD)) {
076                stats.setFinalNumber(number);
077            } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_INITIATED_CD)) {
078                stats.setInitiatedNumber(number);
079            } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_PROCESSED_CD)) {
080                stats.setProcessedNumber(number);
081            } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_SAVED_CD)) {
082                stats.setSavedNumber(number);
083            }
084        }
085    }
086
087    @Override
088        public void NumActiveItemsReport(Stats stats) throws SQLException {
089        stats.setNumActionItems(getEntityManager().createQuery(STATS_NUM_ACTIVE_ITEMS_REPORT)
090                .getSingleResult().toString());
091    }
092
093    @Override
094        public void NumInitiatedDocsByDocTypeReport(Stats stats) throws SQLException {
095        Query query = getEntityManager().createQuery(STATS_NUM_INITIATED_DOCS_BY_DOC_TYPE_REPORT);
096        Calendar calendar = Calendar.getInstance();
097        calendar.add(Calendar.DAY_OF_YEAR, -29);
098        calendar.set(Calendar.HOUR_OF_DAY, 0);
099        calendar.set(Calendar.MINUTE, 0);
100        calendar.set(Calendar.SECOND, 0);
101        calendar.set(Calendar.MILLISECOND, 0);
102        query.setParameter("createDate", new Timestamp(calendar.getTime().getTime()));
103
104        @SuppressWarnings("unchecked")
105        List<Object[]> resultList = query.getResultList();
106
107        List<KeyValue> numDocs = new ArrayList<KeyValue>(resultList.size());
108        for (Object[] result : resultList) {
109            numDocs.add(new ConcreteKeyValue(result[1].toString(),result[0].toString()));
110        }
111
112        stats.setNumInitiatedDocsByDocType(numDocs);
113    }
114
115    @Override
116        public void NumUsersReport(Stats stats) throws SQLException {
117        stats.setNumUsers(getEntityManager().createQuery(STATS_NUM_USERS_REPORT).getSingleResult().toString());
118    }
119
120    @Override
121        public void NumberOfDocTypesReport(Stats stats) throws SQLException {
122        stats.setNumDocTypes(getEntityManager().createQuery(
123                STATS_NUM_DOC_TYPES_REPORT).getSingleResult().toString());
124    }
125
126    public EntityManager getEntityManager() {
127        return this.entityManager;
128    }
129
130    public void setEntityManager(EntityManager entityManager) {
131        this.entityManager = entityManager;
132    }
133
134}