001package org.kuali.ole.deliver.maintenance;
002
003import org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException;
004import org.kuali.ole.OLEConstants;
005import org.kuali.ole.deliver.bo.*;
006import org.kuali.ole.deliver.form.OlePatronMaintenanceDocumentForm;
007import org.kuali.ole.deliver.processor.LoanProcessor;
008import org.kuali.ole.deliver.service.OleDeliverRequestDocumentHelperServiceImpl;
009import org.kuali.ole.krad.OleComponentUtils;
010import org.kuali.ole.service.OlePatronService;
011import org.kuali.ole.service.OlePatronServiceImpl;
012import org.kuali.rice.kim.api.KimConstants;
013import org.kuali.rice.kim.impl.identity.address.EntityAddressBo;
014import org.kuali.rice.kim.impl.identity.affiliation.EntityAffiliationBo;
015import org.kuali.rice.kim.impl.identity.employment.EntityEmploymentBo;
016import org.kuali.rice.kim.impl.identity.entity.EntityBo;
017import org.kuali.rice.kim.impl.identity.name.EntityNameBo;
018import org.kuali.rice.kim.impl.identity.name.EntityNameTypeBo;
019import org.kuali.rice.kim.impl.identity.type.EntityTypeContactInfoBo;
020import org.kuali.rice.krad.maintenance.MaintainableImpl;
021import org.kuali.rice.krad.maintenance.MaintenanceDocument;
022import org.kuali.rice.krad.service.KRADServiceLocator;
023import org.kuali.rice.krad.uif.util.ProcessLogger;
024
025import java.util.*;
026
027/**
028 * OlePatronMaintenanceImpl performs save ,edit,copy  and create new operation for OlePatron.
029 */
030public class OlePatronMaintenanceImpl extends MaintainableImpl {
031    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OlePatronMaintenanceImpl.class);
032    OlePatronService olePatronService = new OlePatronServiceImpl();
033
034
035    /**
036     * This method populate the patron object used for edit and copy
037     *
038     * @param document
039     * @param dataObjectKeys
040     * @return olePatron(Object)
041     */
042    @Override
043    public Object retrieveObjectForEditOrCopy(MaintenanceDocument document, Map<String, String> dataObjectKeys) {
044        LOG.debug("Inside retrieveObjectForEditOrCopy()");
045        Object dataObject = null;
046        OlePatronDocument olePatron = new OlePatronDocument();
047        OleEntityAddressBo entityAddressBo = null;
048        OleAddressBo oleAddressBo = new OleAddressBo();
049        List<OleEntityAddressBo> oleEntityAddressList = new ArrayList<OleEntityAddressBo>();
050        try {
051            dataObject = getLookupService().findObjectBySearch(getDataObjectClass(), dataObjectKeys);
052            olePatron = (OlePatronDocument) dataObject;
053            EntityBo entity = olePatron.getEntity();
054            if (entity.getNames().size() > 0) {
055                EntityNameBo name = entity.getNames().get(0);
056                olePatron.setName(name);
057            }
058            if (!entity.getEntityTypeContactInfos().isEmpty()) {
059                List<EntityAddressBo> entityAddressList = entity.getEntityTypeContactInfos().get(0).getAddresses();
060                for (EntityAddressBo entityAdd : entityAddressList) {
061                    entityAddressBo = new OleEntityAddressBo();
062                    Map addMap = new HashMap();
063                    addMap.put(OLEConstants.OlePatron.ENTITY_BO_ID, entityAdd.getId());
064                    oleAddressBo = getBusinessObjectService().findByPrimaryKey(OleAddressBo.class, addMap);
065                    entityAddressBo.setOleAddressBo(oleAddressBo);
066                    entityAddressBo.setEntityAddressBo(entityAdd);
067                    oleEntityAddressList.add(entityAddressBo);
068                }
069                olePatron.setOleEntityAddressBo(oleEntityAddressList);
070                olePatron.setPhones(entity.getEntityTypeContactInfos().get(0).getPhoneNumbers());
071                olePatron.setEmails(entity.getEntityTypeContactInfos().get(0).getEmailAddresses());
072            }
073            
074            olePatron.setEmployments(entity.getEmploymentInformation());
075            List<OlePatronAffiliation> patronAffiliations = new ArrayList<OlePatronAffiliation>();
076            olePatron.setPatronAffiliations(getPatronAffiliationFromEntity(entity.getAffiliations(), entity.getEmploymentInformation()));
077
078            if (olePatron.getOlePatronId() != null) {
079                LoanProcessor loanProcessor = new LoanProcessor();
080               /* OleDeliverRequestDocumentHelperServiceImpl requestService = new OleDeliverRequestDocumentHelperServiceImpl();
081                List<OleDeliverRequestBo> oleDeliverRequestBoList = olePatron.getOleDeliverRequestBos();
082                if (oleDeliverRequestBoList.size() > 0) {
083                    for (int i = 0; i < oleDeliverRequestBoList.size(); i++) {
084                        OleItemSearch oleItemSearch = requestService.getItemDetailsForPatron(oleDeliverRequestBoList.get(i).getItemUuid());
085                        if (oleItemSearch != null && oleItemSearch.getItemBarCode() != null) {
086                            oleDeliverRequestBoList.get(i).setTitle(oleItemSearch.getTitle());
087                            oleDeliverRequestBoList.get(i).setCallNumber(oleItemSearch.getCallNumber());
088                        }
089                    }
090                }
091                try {
092                    olePatron.setOleLoanDocuments(loanProcessor.getPatronLoanedItemBySolr(olePatron.getOlePatronId()));
093                    olePatron.setOleTemporaryCirculationHistoryRecords(loanProcessor.getPatronTemporaryCirculationHistoryRecords(olePatron.getOlePatronId()));
094                    olePatron.setOleDeliverRequestBos(loanProcessor.getPatronRequestRecords(olePatron.getOlePatronId()));
095                } catch (Exception e) {
096                    LOG.error("Exception", e);
097                }*/
098                if (olePatron.getOleLoanDocuments().size() > 0) {
099                    olePatron.setLoanFlag(true);
100                }
101                if (olePatron.getOleTemporaryCirculationHistoryRecords().size() > 0) {
102                    olePatron.setTempCircHistoryFlag(true);
103                }
104                if (olePatron.getOleDeliverRequestBos().size() > 0) {
105                    olePatron.setRequestFlag(true);
106                }
107                OlePatronDocument olePatronDocument;
108                OleProxyPatronDocument proxyPatronDocument = null;
109                List<OleProxyPatronDocument> proxyPatronDocuments = new ArrayList<OleProxyPatronDocument>();
110                Map proxyMap = new HashMap();
111                proxyMap.put(OLEConstants.OlePatron.PROXY_PATRON_ID, olePatron.getOlePatronId());
112                List<OleProxyPatronDocument> oleProxyPatronDocumentList = (List<OleProxyPatronDocument>) getBusinessObjectService().findMatching(OleProxyPatronDocument.class, proxyMap);
113                if (oleProxyPatronDocumentList.size() > 0) {
114                    for (OleProxyPatronDocument oleProxyPatronDocument : oleProxyPatronDocumentList) {
115                        proxyMap.remove(OLEConstants.OlePatron.PROXY_PATRON_ID);
116                        proxyMap.put(OLEConstants.OlePatron.PATRON_ID, oleProxyPatronDocument.getOlePatronId());
117                        List<OlePatronDocument> olePatronDocumentList = (List<OlePatronDocument>) getBusinessObjectService().findMatching(OlePatronDocument.class, proxyMap);
118                        if (olePatronDocumentList.size() > 0) {
119                            olePatronDocument = olePatronDocumentList.get(0);
120                            proxyPatronDocument = new OleProxyPatronDocument();
121                            if (olePatronDocument.isActiveIndicator()) {
122                                proxyPatronDocument.setOlePatronId(olePatronDocument.getOlePatronId());
123                                proxyPatronDocument.setProxyForPatronFirstName(olePatronDocument.getEntity().getNames().get(0).getFirstName());
124                                proxyPatronDocument.setProxyForPatronLastName(olePatronDocument.getEntity().getNames().get(0).getLastName());
125                                proxyPatronDocument.setProxyPatronActivationDate(oleProxyPatronDocument.getProxyPatronActivationDate());
126                                proxyPatronDocument.setProxyPatronExpirationDate(oleProxyPatronDocument.getProxyPatronExpirationDate());
127
128                            }
129                            proxyPatronDocuments.add(proxyPatronDocument);
130                        }
131                    }
132                    olePatron.setOleProxyPatronDocumentList(proxyPatronDocuments);
133                }
134            }
135        } catch (ClassNotPersistenceCapableException ex) {
136            if (!document.getOldMaintainableObject().isExternalBusinessObject()) {
137                LOG.error("Data Object Class: "
138                        + getDataObjectClass()
139                        + " is not persistable and is not externalizable - configuration error", ex);
140                throw new RuntimeException("Data Object Class: "
141                        + getDataObjectClass()
142                        + " is not persistable and is not externalizable - configuration error");
143            }
144        }
145
146        return olePatron;
147    }
148
149    /**
150     * This method will set the default value for the name object and also set the description when a new patron document is created
151     *
152     * @param document
153     * @param requestParameters
154     */
155    @Override
156    public void processAfterNew(MaintenanceDocument document,
157                                Map<String, String[]> requestParameters) {
158        LOG.debug("Inside processAfterNew()");
159        EntityNameTypeBo nameTypeBo = (EntityNameTypeBo) KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(EntityNameTypeBo.class, OLEConstants.OlePatron.ENTITY_NM_TYP_CD);
160        OlePatronDocument patronDocument = (OlePatronDocument) document.getNewMaintainableObject().getDataObject();
161        patronDocument.setActiveIndicator(true);
162        patronDocument.getName().setNameCode(OLEConstants.OlePatron.ENTITY_NM_TYP_CD);
163        patronDocument.getName().setActive(true);
164        patronDocument.getName().setDefaultValue(true);
165        patronDocument.getName().setNameType(nameTypeBo);
166        document.getNewMaintainableObject().setDataObject(patronDocument);
167        super.processAfterNew(document, requestParameters);
168        document.getDocumentHeader().setDocumentDescription("New Patron Document");
169
170    }
171
172    /**
173     * This method will set the description when copy is selected
174     *
175     * @param document
176     * @param requestParameters
177     */
178    @Override
179    public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> requestParameters) {
180        LOG.debug("Inside processAfterCopy()");
181        super.processAfterCopy(document, requestParameters);
182        document.getDocumentHeader().setDocumentDescription("Copied Patron Document");
183    }
184
185    /**
186     * This method will set the description for edit operation
187     *
188     * @param document
189     * @param requestParameters
190     */
191    @Override
192    public void processAfterEdit(MaintenanceDocument document, Map<String, String[]> requestParameters) {
193        LOG.debug("Inside processAfterEdit()");
194        super.processAfterEdit(document, requestParameters);
195        document.getDocumentHeader().setDocumentDescription("Edited Patron Document");
196    }
197
198    private List<OlePatronAffiliation> getPatronAffiliationFromEntity(List<EntityAffiliationBo> affiliations,
199                                                                      List<EntityEmploymentBo> employeeDetails) {
200        List<OlePatronAffiliation> patronAffiliations = new ArrayList<OlePatronAffiliation>();
201        for (EntityAffiliationBo entityAffiliationBo : affiliations) {
202            OlePatronAffiliation patronAffiliation = new OlePatronAffiliation(entityAffiliationBo);
203            List<EntityEmploymentBo> employmentBos = new ArrayList<EntityEmploymentBo>();
204            for (EntityEmploymentBo entityEmploymentBo : employeeDetails) {
205                if (patronAffiliation.getEntityAffiliationId().equalsIgnoreCase(entityEmploymentBo.getEntityAffiliationId())) {
206                    employmentBos.add(entityEmploymentBo);
207                }
208                patronAffiliation.setEmployments(employmentBos);
209            }
210            patronAffiliations.add(patronAffiliation);
211        }
212        return patronAffiliations;
213    }
214
215    public String getTempCircRecords(String olePatronId) {
216        String url = "temporaryCirculationRecord?viewId=OleTemporaryCirculationHistoryRecordView&amp;methodToCall=viewTempCircRecords&amp;patronId=" + olePatronId;
217        return url;
218    }
219
220    public String getLoanedRecords(String olePatronId) {
221        String url = "patronLoanedRecord?viewId=OlePatronLoanedRecordView&amp;methodToCall=viewLoanedRecords&amp;patronId=" + olePatronId;
222        return url;
223    }
224
225    public String getRequestedRecords(String olePatronId) {
226        String url = "patronRequestedRecord?viewId=OlePatronRequestedRecordView&amp;methodToCall=viewRequestedRecords&amp;patronId=" + olePatronId;
227        return url;
228    }
229
230    public String getCountOfPendingRequests(String itemId) {
231        Map itemMap = new HashMap();
232        itemMap.put(OLEConstants.OleDeliverRequest.ITEM_ID, itemId);
233        List<OleDeliverRequestBo> oleDeliverRequestBoList = (List<OleDeliverRequestBo>) getBusinessObjectService().findMatching(OleDeliverRequestBo.class, itemMap);
234        if (oleDeliverRequestBoList != null && oleDeliverRequestBoList.size() > 0) {
235
236            return "View all requests";
237        } else
238            return " ";
239    }
240}