001 /*
002 * Copyright 2011 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 */
016 package org.kuali.kfs.module.purap.document.service.impl;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.HashMap;
021 import java.util.List;
022 import java.util.Map;
023
024 import org.apache.commons.lang.StringUtils;
025 import org.apache.log4j.Logger;
026 import org.kuali.kfs.module.purap.PurapConstants;
027 import org.kuali.kfs.module.purap.businessobject.PurchaseOrderContractLanguage;
028 import org.kuali.kfs.module.purap.businessobject.PurchaseOrderVendorQuote;
029 import org.kuali.kfs.module.purap.dataaccess.ImageDao;
030 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
031 import org.kuali.kfs.module.purap.document.service.FaxService;
032 import org.kuali.kfs.module.purap.exception.FaxServerUnavailableError;
033 import org.kuali.kfs.module.purap.exception.FaxSubmissionError;
034 import org.kuali.kfs.module.purap.exception.PurError;
035 import org.kuali.kfs.module.purap.exception.PurapConfigurationException;
036 import org.kuali.kfs.module.purap.pdf.PurchaseOrderParameters;
037 import org.kuali.kfs.module.purap.pdf.PurchaseOrderPdf;
038 import org.kuali.kfs.module.purap.pdf.PurchaseOrderQuotePdf;
039 import org.kuali.kfs.module.purap.pdf.PurchaseOrderTransmitParameters;
040 import org.kuali.kfs.sys.KFSConstants;
041 import org.kuali.kfs.sys.KFSPropertyConstants;
042 import org.kuali.kfs.sys.context.SpringContext;
043 import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
044 import org.kuali.kfs.vnd.businessobject.CampusParameter;
045 import org.kuali.kfs.vnd.document.service.VendorService;
046 import org.kuali.rice.kim.bo.Person;
047 import org.kuali.rice.kns.bo.Country;
048 import org.kuali.rice.kns.service.BusinessObjectService;
049 import org.kuali.rice.kns.service.CountryService;
050 import org.kuali.rice.kns.service.KualiConfigurationService;
051 import org.kuali.rice.kns.service.ParameterService;
052 import org.kuali.rice.kns.util.GlobalVariables;
053 import org.springframework.transaction.annotation.Transactional;
054
055
056 @Transactional
057 public class FaxServiceImpl implements FaxService {
058
059 private static final Logger LOG = Logger.getLogger(FaxServiceImpl.class);
060
061 protected KualiConfigurationService kualiConfigurationService;
062 protected ParameterService parameterService;
063 protected VendorService vendorService;
064 protected BusinessObjectService businessObjectService;
065 protected CountryService countryService;
066 protected ImageDao imageDao;
067
068
069
070 /**
071 * Create the Purchase Order Pdf document and send it via fax to the recipient in the PO
072 *
073 * @param po PurchaseOrder that holds the Quote
074 * @param isRetransmit if passed true then PO is being retransmitted
075 * @return Collection of ServiceError objects
076 */
077 public void faxPurchaseOrderPdf(PurchaseOrderDocument po, boolean isRetransmit) {
078 LOG.debug("faxPurchaseOrderPdf(po,reTransmit) started");
079 String pdfFileLocation = parameterService.getParameterValue(KfsParameterConstants.PURCHASING_DOCUMENT.class, PurapConstants.PDF_DIRECTORY);
080 if (pdfFileLocation == null) {
081 throw new RuntimeException("Application Setting PDF_DIRECTORY is missing.");
082 }
083
084 String imageTempLocation = kualiConfigurationService.getPropertyString(KFSConstants.TEMP_DIRECTORY_KEY) + "/";
085 if (imageTempLocation == null) {
086 throw new RuntimeException("Application Setting TEMP_DIRECTORY_KEY is missing.");
087 }
088
089 LOG.debug("faxPurchaseOrderPdf() ended");
090 this.faxPurchaseOrderPdf(po, pdfFileLocation, imageTempLocation, isRetransmit);
091 }
092
093
094
095 /**
096 * Create the Purchase Order Pdf document and send it via fax to the recipient in the PO
097 *
098 * @param po PurchaseOrder that holds the Quote
099 * @param isRetransmit if passed true then PO is being retransmitted
100 * @return Collection of ServiceError objects
101 */
102 public void faxPurchaseOrderPdf(PurchaseOrderDocument po, String pdfFileLocation, String imageTempLocation, boolean isRetransmit) {
103 LOG.debug("faxPurchaseOrderPdf() started with locations");
104
105 // Get the vendor's country name.
106 if (po.getVendorCountryCode() != null) {
107 Country vendorCountry = countryService.getByPrimaryId(po.getVendorCountryCode());
108 if (vendorCountry != null) {
109 po.setVendorCountryCode(vendorCountry.getPostalCountryCode());
110 }
111 else {
112 po.setVendorCountryCode("NA");
113 }
114 }
115 else {
116 po.setVendorCountryCode("NA");
117 }
118
119
120 PurchaseOrderParameters purchaseOrderParameters = getPurchaseOrderParameters();
121 purchaseOrderParameters.setPurchaseOrderPdfAndFaxParameters(po);
122
123 PurchaseOrderPdf poPdf = null;
124 try {
125 String environment = kualiConfigurationService.getPropertyString(KFSConstants.ENVIRONMENT_KEY);
126 poPdf = new PurchaseOrderPdf();
127 poPdf.savePdf(po, purchaseOrderParameters , isRetransmit, environment);
128 }
129 catch (PurError e) {
130 GlobalVariables.getMessageMap().putError("errors", "error.blank");
131 // only need to call once.
132 LOG.debug("faxPurchaseOrderPdf() ended");
133 }
134 catch (Throwable e) {
135 LOG.error("faxPurchaseOrderPdf() Faxing Failed on PDF creation - Exception was " + e.getMessage(), e);
136 GlobalVariables.getMessageMap().putError("errors", "error.blank", "Faxing Error. Unable to save pdf file. Please Contact Purchasing");
137 // only need to call once.
138 LOG.debug("faxPurchaseOrderPdf() ended");
139 }
140
141 PurchaseOrderTransmitParameters transmitParameters = (PurchaseOrderTransmitParameters)purchaseOrderParameters;
142 String[] files = new String[1];
143 files[0] = transmitParameters.getPdfFileName();
144
145 try {
146 this.faxPDF(files,purchaseOrderParameters);
147 }
148 catch (FaxSubmissionError e) {
149 GlobalVariables.getMessageMap().putError("errors", "error.blank");
150 }
151 catch (FaxServerUnavailableError e) {
152 GlobalVariables.getMessageMap().putError("errors", "error.blank");
153 }
154 catch (PurError e) {
155 GlobalVariables.getMessageMap().putError("errors", "error.blank");
156 }
157 catch (Throwable e) {
158 LOG.error("faxPurchaseOrderPdf() Faxing Failed Exception was " + e.getMessage(), e);
159 GlobalVariables.getMessageMap().putError("errors", "error.blank", "Faxing Error. Please Contact Purchasing");
160 }
161 finally {
162 try {
163 if (poPdf != null) {
164 poPdf.deletePdf(pdfFileLocation, transmitParameters.getPdfFileName());
165 }
166 else {
167 // ignore - PDF can't be deleted if PDF doesn't exist
168 }
169 }
170 catch (Throwable e) {
171 LOG.error("faxPurchaseOrderPdf() Error deleting PDF - Exception was " + e.getMessage(), e);
172 GlobalVariables.getMessageMap().putError("errors", "error.blank","Your fax was sent successfully but an error occurred that is unrelated to faxing. Please report this problem to Purchasing");
173 }
174 }
175
176 LOG.debug("faxPurchaseOrderPdf() ended");
177 }
178
179 public void faxPurchaseOrderQuotePdf(PurchaseOrderDocument po, PurchaseOrderVendorQuote povq) {
180 LOG.debug("faxPurchaseOrderQuotePdf() started");
181
182
183 PurchaseOrderParameters purchaseOrderParameters = getPurchaseOrderParameters();
184 purchaseOrderParameters.setPurchaseOrderPdfAndFaxParameters(po,povq);
185 String environmentCode = kualiConfigurationService.getPropertyString(KFSConstants.ENVIRONMENT_KEY);
186
187 PurchaseOrderQuotePdf poQuotePdf = new PurchaseOrderQuotePdf();
188 Collection errors = new ArrayList();
189
190
191 try {
192
193 // Get the vendor's country name.
194 if (povq.getVendorCountryCode() != null) {
195 Country vendorCountry = countryService.getByPrimaryId(po.getVendorCountryCode());
196 if (vendorCountry != null) {
197 povq.setVendorCountryCode(vendorCountry.getPostalCountryCode());
198 }
199 else {
200 povq.setVendorCountryCode("NA");
201 }
202 }
203 else {
204 povq.setVendorCountryCode("NA");
205 }
206
207 poQuotePdf.savePOQuotePDF(po, povq, purchaseOrderParameters, environmentCode);
208 } catch (PurError e) {
209 GlobalVariables.getMessageMap().putError("errors", "error.blank");
210 LOG.debug("faxPurchaseOrderQuotePdf() ended");
211
212 } catch (Throwable e) {
213 LOG.error("faxPurchaseOrderQuotePdf() Faxing Failed on PDF creation - Exception was " + e.getMessage(), e);
214 LOG.error("faxPurchaseOrderQuotePdf() Faxing Failed on PDF creation - Exception was " + e.getMessage(), e);
215 GlobalVariables.getMessageMap().putError("errors", "error.blank", "Faxing Error. Unable to save pdf file. Please Contact Purchasing");
216 }
217
218 LOG.debug("faxPurchaseOrderQuotePdf() Quote PDF saved successfully for PO " + po.getPurapDocumentIdentifier() + " and Quote ID " + povq.getPurchaseOrderVendorQuoteIdentifier());
219
220
221
222
223 PurchaseOrderTransmitParameters transmitParameters = (PurchaseOrderTransmitParameters)purchaseOrderParameters;
224 String pdfFileLocation = transmitParameters.getPdfFileLocation();
225 String pdfFileName = transmitParameters.getPdfFileName();
226 String[] files = new String[1];
227 files[0] = pdfFileName;
228
229 try {
230 this.faxPDF(files,transmitParameters);
231 } catch (FaxSubmissionError e) {
232 LOG.error("faxPurchaseOrderQuotePdf() Error faxing Quote PDF" + pdfFileName + " - Exception was " + e.getMessage(), e);
233 GlobalVariables.getMessageMap().putError("errors", "error.blank");
234
235 } catch (FaxServerUnavailableError e) {
236 LOG.error("faxPurchaseOrderQuotePdf() Error faxing Quote PDF" + pdfFileName + " - Exception was " + e.getMessage(), e);
237 GlobalVariables.getMessageMap().putError("errors", "error.blank","The document did not successfully transmit to the fax server. Report this to the Procurement Services Technology group, make note of the document you attempted to transmit and try again when the issue has been resolved");
238
239 } catch (PurError e) {
240 LOG.error("faxPurchaseOrderQuotePdf() Error faxing Quote PDF" + pdfFileName + " - Exception was " + e.getMessage(), e);
241 GlobalVariables.getMessageMap().putError("errors", "error.blank","The document did not successfully transmit to the fax server. Report this to the Procurement Services Technology group, make note of the document you attempted to transmit and try again when the issue has been resolved");
242
243 } catch (Throwable e) {
244 LOG.error("faxPurchaseOrderQuotePdf() Error faxing Quote PDF" + pdfFileName + " - Exception was " + e.getMessage(), e);
245 GlobalVariables.getMessageMap().putError("errors", "error.blank","The document did not successfully transmit to the fax server. Report this to the Procurement Services Technology group, make note of the document you attempted to transmit and try again when the issue has been resolved");
246
247 } finally {
248 try {
249 poQuotePdf.deletePdf(pdfFileLocation, pdfFileName);
250 } catch (Throwable e) {
251 LOG.error("faxPurchaseOrderQuotePdf() Error deleting Quote PDF" + pdfFileName + " - Exception was " + e.getMessage(), e);
252 GlobalVariables.getMessageMap().putError("errors", "error.blank","Your fax was sent successfully but an error occurred that is unrelated to faxing. Please report this problem to Purchasing");
253
254 }
255 }
256
257
258 LOG.debug("faxPurchaseOrderQuotePdf() ended");
259
260
261 }
262
263
264 /**
265 * Here is where the PDF is actually faxed, needs to be implemented at each institution
266 */
267 protected void faxPDF(String[] files, PurchaseOrderParameters transmitParameters ) {
268 LOG.info("faxPDF() NEEDS TO BE IMPLEMENTED!");
269 throw new RuntimeException("faxPDF() NEEDS TO BE IMPLEMENTED!");
270 }
271
272
273
274 public KualiConfigurationService getKualiConfigurationService() {
275 return kualiConfigurationService;
276 }
277
278 public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) {
279 this.kualiConfigurationService = kualiConfigurationService;
280 }
281
282 public ParameterService getParameterService() {
283 return parameterService;
284 }
285
286 public void setParameterService(ParameterService parameterService) {
287 this.parameterService = parameterService;
288 }
289
290 public VendorService getVendorService() {
291 return vendorService;
292 }
293
294 public void setVendorService(VendorService vendorService) {
295 this.vendorService = vendorService;
296 }
297
298 public BusinessObjectService getBusinessObjectService() {
299 return businessObjectService;
300 }
301
302 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
303 this.businessObjectService = businessObjectService;
304 }
305
306 public CountryService getCountryService() {
307 return countryService;
308 }
309
310 public PurchaseOrderParameters getPurchaseOrderParameters() {
311 return SpringContext.getBean(PurchaseOrderParameters.class);
312 }
313
314 public void setCountryService(CountryService countryService) {
315 this.countryService = countryService;
316 }
317
318 public ImageDao getImageDao() {
319 return imageDao;
320 }
321
322 public void setImageDao(ImageDao imageDao) {
323 this.imageDao = imageDao;
324 }
325
326
327
328
329 }