Package ru.portnyagin.helpdeskru.service

Source Code of ru.portnyagin.helpdeskru.service.RequestService

/**
*
* @author ilya portnyagin iportnyagin@gmail.com
*/

package ru.portnyagin.helpdeskru.service;

import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import ru.portnyagin.helpdeskru.model.HistoryRequest;
import ru.portnyagin.helpdeskru.model.Organization;
import ru.portnyagin.helpdeskru.model.Request;
import ru.portnyagin.helpdeskru.model.Request_;
import ru.portnyagin.helpdeskru.model.ServiceObject;
import ru.portnyagin.helpdeskru.model.StateRequest;
import ru.portnyagin.helpdeskru.model.UserHD;
import ru.portnyagin.helpdeskru.util.JsfUtil;

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class RequestService extends AbstractService<Request> {
   
    @PersistenceContext(unitName = "HelpDeskRuPU")
    private EntityManager em;

    @EJB
    private ru.portnyagin.helpdeskru.service.UserHDService userHDService;
       
    protected EntityManager getEntityManager() {
        return em;
    }
   
    @Resource
    private UserTransaction ut;

    public RequestService() {
        super(Request.class);
    }

    // OPENED INPROGRESS HOLDED NEEDINFO REOPENED DONE CLOSED
   
   

    // for CustomerController
    public List<Request> findByStateAndCustomer(List<StateRequest> listStateRequest, UserHD createdBy) {
       
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        Root<Request> z = cq.from(Request.class);
           
        Predicate whereState = null;
       
        if(listStateRequest != null && !listStateRequest.isEmpty()) {
            for(StateRequest st: listStateRequest) {
                if(whereState == null) {
                    whereState = cb.equal(z.get(Request_.stateRequest), st);
                } else {
                    whereState = cb.or(whereState, cb.equal(z.get(Request_.stateRequest), st));
                }
            }
        }
       
        Predicate whereCreatedBy = null;
        Predicate whereCreatedByOrg = null;
       
        if(createdBy != null) {
           
            whereCreatedBy = cb.equal(z.get(Request_.createdBy), createdBy);
           
            if(createdBy.getOrganization() != null) {
                List<UserHD> listUsers = userHDService.findUsersByOrganization(createdBy.getOrganization());
                for(UserHD us: listUsers) {
                    if(whereCreatedByOrg == null) {
                        whereCreatedByOrg = cb.equal(z.get(Request_.createdBy), us);
                    } else {
                        whereCreatedByOrg = cb.or(whereCreatedByOrg, cb.equal(z.get(Request_.createdBy), us));
                    }
                }
            }       
        }
       
       
       
//        cq.where(cb.and(whereState, cb.or(whereCreatedBy, whereCreatedByOrg))); // у заказчика не задана орг-ия - whereCreatedByOrg - NPE

        if(whereCreatedByOrg == null) {
            cq.where(cb.and(whereState, whereCreatedBy));
        } else {
            cq.where(cb.and(whereState, cb.or(whereCreatedBy, whereCreatedByOrg)));
        }
       
       
        cq.orderBy(cb.desc(z.get(Request_.id)));
        cq.select(z);

        return getEntityManager().createQuery(cq).getResultList();
    }       
   
   
   
   
   

    // for ServiceController
    public List<Request> findByStateAndPerfomer(List<StateRequest> listStateRequest, UserHD perfomer,
            boolean showRequestOnlyForCurrentUser) {
       
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        Root<Request> z = cq.from(Request.class);
           
        Predicate whereState = null;
       
        if(listStateRequest != null && !listStateRequest.isEmpty()) {
            for(StateRequest st: listStateRequest) {
                if(whereState == null) {
                    whereState = cb.equal(z.get(Request_.stateRequest), st);
                } else {
                    whereState = cb.or(whereState, cb.equal(z.get(Request_.stateRequest), st));
                }
            }
        }
       
        Predicate wherePerfomer = null;
       
        if(perfomer != null && showRequestOnlyForCurrentUser) {
            wherePerfomer = cb.equal(z.get(Request_.performer), perfomer);
        }
       
       
       
        if(wherePerfomer == null) {
            cq.where(whereState);
        } else {
            cq.where(cb.and(whereState, wherePerfomer));
        }

        cq.orderBy(cb.desc(z.get(Request_.id)));
        cq.select(z);

        return getEntityManager().createQuery(cq).getResultList();
    }       
   
   
   
   
   
   
   
   
   
    // for CurrentRequestBean
    public List<Request> findByServiceObject(Request current) { // история заявок по объекту обслуживания
       
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        Root<Request> z = cq.from(Request.class);
       
        cq.where(cb.and(
                    cb.isNotNull(z.get(Request_.serviceObject)),
                    cb.equal(z.get(Request_.serviceObject), current.getServiceObject()))
                );
               
        cq.orderBy(cb.desc(z.get(Request_.id)));
        cq.select(z);

        return getEntityManager().createQuery(cq).getResultList();
    }
   
   
    // for customer and service search
    public List<Request> findByVariousCriteria(Long id,
            Organization organization,
            UserHD createdBy,
            Date createdDateBegin,
            Date createdDateEnd,
            String description,
            String text,
            ServiceObject serviceObject,
            StateRequest stateRequest,
            Date stateDateBegin,
            Date stateDateEnd,
            UserHD perfomer) {
       
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        Root<Request> z = cq.from(Request.class);
       
        Predicate where = cb.conjunction();
        Predicate whereCreatedByOrg = null;
               
        if(id != null) {
            where = cb.and(where, cb.equal(z.get(Request_.id), id));
        }
       
        if(organization != null) {
            List<UserHD> listUsers = userHDService.findUsersByOrganization(organization);
            for(UserHD us: listUsers) {
                if(whereCreatedByOrg == null) {
                    whereCreatedByOrg = cb.equal(z.get(Request_.createdBy), us);
                } else {
                    whereCreatedByOrg = cb.or(whereCreatedByOrg, cb.equal(z.get(Request_.createdBy), us));
                }
            }
            if(whereCreatedByOrg == null) { // это может быть если в орг-ии нет пользователей - результат поиска пустой
                whereCreatedByOrg = cb.isNull(z.get(Request_.createdBy));
            }
        }
       
        if(createdBy != null) {
            where = cb.and(where, cb.equal(z.get(Request_.createdBy), createdBy));
        }
       
        if(createdDateBegin != null && createdDateEnd != null) {
            where = cb.and(where, cb.between(z.get(Request_.createdDate), createdDateBegin, createdDateEnd));
        }
       
        if(description != null) {
            where = cb.and(where, cb.like(z.get(Request_.description), "%" + description + "%"));
        }
       
        if(text != null) {
            where = cb.and(where, cb.like(z.get(Request_.text), "%" + text + "%"));
        }
       
        if(serviceObject != null) {
            where = cb.and(where, cb.equal(z.get(Request_.serviceObject), serviceObject));
        }
       
        if(stateRequest != null) {
            where = cb.and(where, cb.equal(z.get(Request_.stateRequest), stateRequest));
        }
       
        if(stateDateBegin != null && stateDateEnd != null) {
            where = cb.and(where, cb.between(z.get(Request_.stateDate), stateDateBegin, stateDateEnd));
        }
   
        if(perfomer != null) {
            where = cb.and(where, cb.equal(z.get(Request_.performer), perfomer));
        }
             
       
//        cq.where(cb.and(where, whereCreatedByOrg));   при whereCreatedByOrg == null - NPE 
       
        if(whereCreatedByOrg == null) { // whereCreatedByOrg инициализируется только когда задана орг-ия
            cq.where(where);    
        } else {
            cq.where(cb.and(where, whereCreatedByOrg));    
        }
  
           
        cq.orderBy(cb.desc(z.get(Request_.id)));
        cq.select(z);

        return getEntityManager().createQuery(cq).getResultList();
    }
   
   
   
   
   
   
   
   
   
   
   
    public void update(Request current, UserHD curUser) {
       
        Request preUpdate;
        if (current.getId() == null) {     // новый запрос
            preUpdate = new Request();
        }
        else {
            preUpdate = em.find(Request.class, current.getId());
            if (preUpdate == null) {
                JsfUtil.addErrorMessage(current.getId() + ": "+ ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("requestNotFound"));           
               
                return;
            }
        }
       
        try {
            try {
                ut.begin();
            } catch (javax.transaction.NotSupportedException | SystemException ex) {
//                ex.printStackTrace();
                JsfUtil.addErrorMessage(ex.toString());
            }
           
            // состояние
            if(!current.getStateRequest().equals(preUpdate.getStateRequest())) {
                current.setStateDate(new Date()); // при изменении состояния обновляем дату состояния
                HistoryRequest h = new HistoryRequest(current, curUser, new Date(),
                        ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("common.stateRequest"),
                        current.getStateRequest().getName());
                em.persist(h);
            }

            // исполнитель. м.б. null
            String curPerformer;
            String prevPerformer;
            if(current.getPerformer() != null) {
                curPerformer = current.getPerformer().getName();
            }
            else {
                curPerformer = "";
            }
           
            if(preUpdate.getPerformer() != null) {
                prevPerformer = preUpdate.getPerformer().getName();
            }
            else {
                prevPerformer = "";
            }
           
            if(!curPerformer.equals(prevPerformer)) {
                    HistoryRequest h = new HistoryRequest(current, curUser, new Date(),
                        ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("common.performer"),
                        curPerformer);
                    em.persist(h);
            }

            // объект обслуживания. м.б. null
            String curServiceObject;
            String prevServiceObject;
            if(current.getServiceObject() != null) {
                curServiceObject = current.getServiceObject().getName();
            }
            else {
                curServiceObject = "";
            }
           
            if(preUpdate.getServiceObject() != null) {
                prevServiceObject = preUpdate.getServiceObject().getName();
            }
            else {
                prevServiceObject = "";
            }
           
            if(!curServiceObject.equals(prevServiceObject)) {
                    HistoryRequest h = new HistoryRequest(current, curUser, new Date(),
                        ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("common.serviceObject"),
                        curServiceObject);
                    em.persist(h);
            }
           
            // описание м.б. null
            String curDescription;
            String prevDescription;
            if(current.getDescription() != null) {
                curDescription = current.getDescription();
            }
            else {
                curDescription = "";
            }
           
            if(preUpdate.getDescription() != null) {
                prevDescription = preUpdate.getDescription();
            }
            else {
                prevDescription = "";
            }
           
            if(!curDescription.equals(prevDescription)) {
                    HistoryRequest h = new HistoryRequest(current, curUser, new Date(),
                        ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("common.description"),
                        curDescription);
                    em.persist(h);
            }
           
            // приоритет
            if(!current.getPriority().equals(preUpdate.getPriority())) {
                HistoryRequest h = new HistoryRequest(current, curUser, new Date(),
                        ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("common.priority"),
                        current.getPriority().getName());
                em.persist(h);
            }
           
           
            if(current.getId() != null) {
                em.merge(current);
            }
            else {
                em.persist(current);
            }
           
            try {
                ut.commit();
            } catch (javax.transaction.RollbackException | HeuristicMixedException |
                    HeuristicRollbackException | SecurityException | IllegalStateException |
                    SystemException ex) {
                JsfUtil.addErrorMessage(ex.toString());
            }
           
            JsfUtil.addSuccessMessage(current.getId() + ": "+ ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("requestSaved"));           

        } catch (OptimisticLockException e) {
           
            try {
                ut.rollback();
            } catch (    IllegalStateException | SecurityException | SystemException ex) {
//                ex.printStackTrace();
                JsfUtil.addErrorMessage(ex.toString());
            }
           
            JsfUtil.addErrorMessage(current.getId() + ": " + ResourceBundle.getBundle("property",
                        FacesContext.getCurrentInstance().getViewRoot().getLocale()).
                        getString("requestSaveErrorOptimistic"));           
       
           
        }
    }   
   

}
TOP

Related Classes of ru.portnyagin.helpdeskru.service.RequestService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.