1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.ole.module.purap.document.web.struts;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.apache.struts.action.ActionForm;
20 import org.apache.struts.action.ActionForward;
21 import org.apache.struts.action.ActionMapping;
22 import org.kuali.ole.module.purap.PurapConstants;
23 import org.kuali.ole.module.purap.PurapConstants.InvoiceStatuses;
24 import org.kuali.ole.module.purap.PurapConstants.PRQSDocumentsStrings;
25 import org.kuali.ole.module.purap.PurapKeyConstants;
26 import org.kuali.ole.module.purap.PurapPropertyConstants;
27 import org.kuali.ole.module.purap.document.AccountsPayableDocument;
28 import org.kuali.ole.module.purap.document.InvoiceDocument;
29 import org.kuali.ole.module.purap.document.PurchaseOrderDocument;
30 import org.kuali.ole.module.purap.document.PurchasingAccountsPayableDocument;
31 import org.kuali.ole.module.purap.document.service.InvoiceService;
32 import org.kuali.ole.module.purap.document.service.PurapService;
33 import org.kuali.ole.module.purap.document.service.PurchaseOrderService;
34 import org.kuali.ole.module.purap.document.validation.event.AttributedCalculateAccountsPayableEvent;
35 import org.kuali.ole.module.purap.document.validation.event.AttributedContinuePurapEvent;
36 import org.kuali.ole.module.purap.document.validation.event.AttributedPreCalculateAccountsPayableEvent;
37 import org.kuali.ole.module.purap.service.PurapAccountingService;
38 import org.kuali.ole.module.purap.util.PurQuestionCallback;
39 import org.kuali.ole.sys.OLEConstants;
40 import org.kuali.ole.sys.OLEKeyConstants;
41 import org.kuali.ole.sys.OLEPropertyConstants;
42 import org.kuali.ole.sys.context.SpringContext;
43 import org.kuali.ole.sys.service.UniversityDateService;
44 import org.kuali.rice.core.api.config.property.ConfigurationService;
45 import org.kuali.rice.core.api.util.RiceConstants;
46 import org.kuali.rice.kew.api.exception.WorkflowException;
47 import org.kuali.rice.kim.api.KimConstants;
48 import org.kuali.rice.kns.question.ConfirmationQuestion;
49 import org.kuali.rice.kns.service.DocumentHelperService;
50 import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
51 import org.kuali.rice.krad.service.KualiRuleService;
52 import org.kuali.rice.krad.util.GlobalVariables;
53 import org.kuali.rice.krad.util.KRADConstants;
54 import org.kuali.rice.krad.util.ObjectUtils;
55
56 import javax.servlet.http.HttpServletRequest;
57 import javax.servlet.http.HttpServletResponse;
58 import java.util.HashMap;
59
60
61
62
63 public class InvoiceAction extends AccountsPayableActionBase {
64 static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(InvoiceAction.class);
65
66
67
68
69
70
71 @Override
72 protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException {
73 super.createDocument(kualiDocumentFormBase);
74 ((InvoiceDocument) kualiDocumentFormBase.getDocument()).initiateDocument();
75 }
76
77
78
79
80
81 @Override
82 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
83 InvoiceForm prqsForm = (InvoiceForm) form;
84 InvoiceDocument document = (InvoiceDocument) prqsForm.getDocument();
85
86 return super.refresh(mapping, form, request, response);
87 }
88
89
90
91
92
93
94
95
96
97
98
99
100 public ActionForward continuePRQS(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
101 LOG.debug("continuePRQS() method");
102 InvoiceForm prqsForm = (InvoiceForm) form;
103 InvoiceDocument invoiceDocument = (InvoiceDocument) prqsForm.getDocument();
104
105 boolean poNotNull = true;
106
107 boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedContinuePurapEvent(invoiceDocument));
108 if (!rulePassed) {
109 return mapping.findForward(OLEConstants.MAPPING_BASIC);
110 }
111
112 GlobalVariables.getMessageMap().clearErrorPath();
113 GlobalVariables.getMessageMap().addToErrorPath(OLEPropertyConstants.DOCUMENT);
114
115
116 if (ObjectUtils.isNull(invoiceDocument.getPurchaseOrderIdentifier())) {
117 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, OLEKeyConstants.ERROR_REQUIRED, PRQSDocumentsStrings.PURCHASE_ORDER_ID);
118 poNotNull = false;
119 }
120
121 if (ObjectUtils.isNull(invoiceDocument.getInvoiceDate())) {
122 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.INVOICE_DATE, OLEKeyConstants.ERROR_REQUIRED, PRQSDocumentsStrings.INVOICE_DATE);
123 poNotNull = false;
124 }
125
126
127
128
129
130 invoiceDocument.setInvoiceNumber(invoiceDocument.getInvoiceNumber().toUpperCase());
131
132 if (ObjectUtils.isNull(invoiceDocument.getVendorInvoiceAmount())) {
133 GlobalVariables.getMessageMap().putError(PurapPropertyConstants.VENDOR_INVOICE_AMOUNT, OLEKeyConstants.ERROR_REQUIRED, PRQSDocumentsStrings.VENDOR_INVOICE_AMOUNT);
134 poNotNull = false;
135 }
136
137
138 if (poNotNull == false) {
139 return mapping.findForward(OLEConstants.MAPPING_BASIC);
140 }
141
142
143 PurchaseOrderDocument po = SpringContext.getBean(PurchaseOrderService.class).getCurrentPurchaseOrder(invoiceDocument.getPurchaseOrderIdentifier());
144 if (ObjectUtils.isNotNull(po)) {
145
146 invoiceDocument.setAccountsPayablePurchasingDocumentLinkIdentifier(po.getAccountsPayablePurchasingDocumentLinkIdentifier());
147
148
149 if (!SpringContext.getBean(DocumentHelperService.class).getDocumentAuthorizer(invoiceDocument).isAuthorizedByTemplate(invoiceDocument, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.OPEN_DOCUMENT, GlobalVariables.getUserSession().getPrincipalId())) {
150 throw buildAuthorizationException("initiate document", invoiceDocument);
151 }
152 }
153
154 if (!SpringContext.getBean(InvoiceService.class).isPurchaseOrderValidForInvoiceDocumentCreation(invoiceDocument, po)) {
155 return mapping.findForward(OLEConstants.MAPPING_BASIC);
156 }
157
158
159 ActionForward forward = performDuplicateInvoiceAndEncumberFiscalYearCheck(mapping, form, request, response, invoiceDocument);
160 if (forward != null) {
161 return forward;
162 }
163
164
165
166 SpringContext.getBean(InvoiceService.class).populateAndSaveInvoice(invoiceDocument);
167
168
169 prqsForm.setCalculated(false);
170
171
172
173 prqsForm.setCalculatedTax(false);
174
175
176 SpringContext.getBean(PurapService.class).sortBelowTheLine(invoiceDocument);
177
178
179 prqsForm.updateItemCounts();
180
181 return mapping.findForward(OLEConstants.MAPPING_BASIC);
182 }
183
184
185
186
187
188
189
190
191
192
193
194
195 public ActionForward clearInitFields(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
196 LOG.debug("clearInitValues() method");
197 InvoiceForm prqsForm = (InvoiceForm) form;
198 InvoiceDocument invoiceDocument = (InvoiceDocument) prqsForm.getDocument();
199 invoiceDocument.clearInitFields();
200
201 return super.refresh(mapping, form, request, response);
202 }
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221 protected ActionForward performDuplicateInvoiceAndEncumberFiscalYearCheck(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, InvoiceDocument invoiceDocument) throws Exception {
222 ActionForward forward = null;
223 Object question = request.getParameter(OLEConstants.QUESTION_INST_ATTRIBUTE_NAME);
224 if (question == null) {
225
226 if (isEncumberNextFiscalYear(invoiceDocument)) {
227 String questionText = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(PurapKeyConstants.WARNING_ENCUMBER_NEXT_FY);
228 return this.performQuestionWithoutInput(mapping, form, request, response, PRQSDocumentsStrings.ENCUMBER_NEXT_FISCAL_YEAR_QUESTION, questionText, OLEConstants.CONFIRMATION_QUESTION, OLEConstants.ROUTE_METHOD, "");
229 } else {
230
231 HashMap<String, String> duplicateMessages = SpringContext.getBean(InvoiceService.class).invoiceDuplicateMessages(invoiceDocument);
232 if (!duplicateMessages.isEmpty()) {
233 return this.performQuestionWithoutInput(mapping, form, request, response, PRQSDocumentsStrings.DUPLICATE_INVOICE_QUESTION, duplicateMessages.get(PRQSDocumentsStrings.DUPLICATE_INVOICE_QUESTION), OLEConstants.CONFIRMATION_QUESTION, OLEConstants.ROUTE_METHOD, "");
234 }
235 }
236 } else {
237 Object buttonClicked = request.getParameter(OLEConstants.QUESTION_CLICKED_BUTTON);
238
239 if (PRQSDocumentsStrings.ENCUMBER_NEXT_FISCAL_YEAR_QUESTION.equals(question) && ConfirmationQuestion.YES.equals(buttonClicked)) {
240 HashMap<String, String> duplicateMessages = SpringContext.getBean(InvoiceService.class).invoiceDuplicateMessages(invoiceDocument);
241 if (!duplicateMessages.isEmpty()) {
242 return this.performQuestionWithoutInput(mapping, form, request, response, PRQSDocumentsStrings.DUPLICATE_INVOICE_QUESTION, duplicateMessages.get(PRQSDocumentsStrings.DUPLICATE_INVOICE_QUESTION), OLEConstants.CONFIRMATION_QUESTION, OLEConstants.ROUTE_METHOD, "");
243 }
244 }
245
246 else if ((PRQSDocumentsStrings.ENCUMBER_NEXT_FISCAL_YEAR_QUESTION.equals(question) || PRQSDocumentsStrings.DUPLICATE_INVOICE_QUESTION.equals(question)) && ConfirmationQuestion.NO.equals(buttonClicked)) {
247 invoiceDocument.updateAndSaveAppDocStatus(InvoiceStatuses.APPDOC_INITIATE);
248 forward = mapping.findForward(OLEConstants.MAPPING_BASIC);
249 }
250 }
251
252 return forward;
253 }
254
255
256
257
258
259
260
261 protected boolean isEncumberNextFiscalYear(InvoiceDocument invoiceDocument) {
262 Integer fiscalYear = SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear();
263 if (invoiceDocument.getPurchaseOrderDocument().getPostingYear().intValue() > fiscalYear) {
264 return true;
265 }
266 return false;
267 }
268
269
270
271
272
273
274
275
276
277
278
279 public ActionForward addHoldOnPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
280 String operation = "Hold ";
281
282 PurQuestionCallback callback = new PurQuestionCallback() {
283 @Override
284 public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception {
285 document = SpringContext.getBean(InvoiceService.class).addHoldOnInvoice((InvoiceDocument) document, noteText);
286 return document;
287 }
288 };
289
290 return askQuestionWithInput(mapping, form, request, response, PRQSDocumentsStrings.HOLD_PRQS_QUESTION, PRQSDocumentsStrings.HOLD_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_HOLD_DOCUMENT, callback);
291 }
292
293
294
295
296
297
298
299
300
301
302
303 public ActionForward removeHoldFromPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
304 String operation = "Remove ";
305
306 PurQuestionCallback callback = new PurQuestionCallback() {
307 @Override
308 public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception {
309 document = SpringContext.getBean(InvoiceService.class).removeHoldOnInvoice((InvoiceDocument) document, noteText);
310 return document;
311 }
312 };
313
314 return askQuestionWithInput(mapping, form, request, response, PRQSDocumentsStrings.REMOVE_HOLD_PRQS_QUESTION, PRQSDocumentsStrings.REMOVE_HOLD_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_REMOVE_HOLD_DOCUMENT, callback);
315 }
316
317
318
319
320
321
322
323
324
325
326
327 public ActionForward requestCancelOnPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
328 String operation = "Cancel ";
329
330 PurQuestionCallback callback = new PurQuestionCallback() {
331 @Override
332 public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception {
333 SpringContext.getBean(InvoiceService.class).requestCancelOnInvoice((InvoiceDocument) document, noteText);
334 return document;
335 }
336 };
337
338 return askQuestionWithInput(mapping, form, request, response, PRQSDocumentsStrings.CANCEL_PRQS_QUESTION, PRQSDocumentsStrings.CANCEL_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_CANCEL_DOCUMENT, callback);
339 }
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366 public ActionForward removeCancelRequestFromPayment(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
367 String operation = "Cancel ";
368
369 PurQuestionCallback callback = new PurQuestionCallback() {
370 @Override
371 public AccountsPayableDocument doPostQuestion(AccountsPayableDocument document, String noteText) throws Exception {
372 SpringContext.getBean(InvoiceService.class).removeRequestCancelOnInvoice((InvoiceDocument) document, noteText);
373 return document;
374 }
375 };
376
377 return askQuestionWithInput(mapping, form, request, response, PRQSDocumentsStrings.REMOVE_CANCEL_PRQS_QUESTION, PRQSDocumentsStrings.REMOVE_CANCEL_NOTE_PREFIX, operation, PurapKeyConstants.PAYMENT_REQUEST_MESSAGE_REMOVE_CANCEL_DOCUMENT, callback);
378 }
379
380
381
382
383
384
385 @Override
386 protected void customCalculate(PurchasingAccountsPayableDocument apDoc) {
387 InvoiceDocument prqsDoc = (InvoiceDocument) apDoc;
388
389
390 prqsDoc.updateExtendedPriceOnItems();
391
392
393
394 if (StringUtils.equals(prqsDoc.getApplicationDocumentStatus(), InvoiceStatuses.APPDOC_AWAITING_TAX_REVIEW)) {
395 SpringContext.getBean(InvoiceService.class).calculateTaxArea(prqsDoc);
396 return;
397 }
398
399
400
401 SpringContext.getBean(InvoiceService.class).calculateInvoice(prqsDoc, true);
402 SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedCalculateAccountsPayableEvent(prqsDoc));
403 }
404
405
406
407
408 @Override
409 public String getActionName() {
410 return PurapConstants.INVOICE_ACTION_NAME;
411 }
412
413 public ActionForward useAlternateVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
414 InvoiceForm prqsForm = (InvoiceForm) form;
415 InvoiceDocument document = (InvoiceDocument) prqsForm.getDocument();
416
417 SpringContext.getBean(InvoiceService.class).changeVendor(
418 document, document.getAlternateVendorHeaderGeneratedIdentifier(), document.getAlternateVendorDetailAssignedIdentifier());
419
420 return mapping.findForward(OLEConstants.MAPPING_BASIC);
421 }
422
423 public ActionForward useOriginalVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
424 InvoiceForm prqsForm = (InvoiceForm) form;
425 InvoiceDocument document = (InvoiceDocument) prqsForm.getDocument();
426
427 SpringContext.getBean(InvoiceService.class).changeVendor(
428 document, document.getOriginalVendorHeaderGeneratedIdentifier(), document.getOriginalVendorDetailAssignedIdentifier());
429
430 return mapping.findForward(OLEConstants.MAPPING_BASIC);
431 }
432
433 @Override
434 public ActionForward route(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
435 InvoiceDocument prqs = ((InvoiceForm) form).getInvoiceDocument();
436 SpringContext.getBean(PurapService.class).prorateForTradeInAndFullOrderDiscount(prqs);
437 SpringContext.getBean(PurapAccountingService.class).updateAccountAmounts(prqs);
438 if (prqs.isClosePurchaseOrderIndicator()) {
439 PurchaseOrderDocument po = prqs.getPurchaseOrderDocument();
440 if (po.canClosePOForTradeIn()) {
441 return super.route(mapping, form, request, response);
442 } else {
443 return mapping.findForward(OLEConstants.MAPPING_BASIC);
444 }
445 } else {
446 return super.route(mapping, form, request, response);
447 }
448 }
449
450
451
452
453
454
455
456 @Override
457 public ActionForward approve(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
458 InvoiceDocument prqs = ((InvoiceForm) form).getInvoiceDocument();
459
460 SpringContext.getBean(PurapService.class).prorateForTradeInAndFullOrderDiscount(prqs);
461
462 if (requiresCalculateTax((InvoiceForm) form)) {
463 GlobalVariables.getMessageMap().putError(OLEConstants.DOCUMENT_ERRORS, PurapKeyConstants.ERROR_APPROVE_REQUIRES_CALCULATE);
464 return mapping.findForward(OLEConstants.MAPPING_BASIC);
465 }
466
467
468
469
470 if (SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedPreCalculateAccountsPayableEvent(prqs))) {
471
472 customCalculate(prqs);
473 SpringContext.getBean(PurapAccountingService.class).updateAccountAmounts(prqs);
474 return super.approve(mapping, form, request, response);
475 } else {
476
477 return mapping.findForward(OLEConstants.MAPPING_BASIC);
478 }
479 }
480
481
482
483
484
485
486
487
488 protected boolean requiresCalculateTax(InvoiceForm invoiceForm) {
489 InvoiceDocument prqs = (InvoiceDocument) invoiceForm.getDocument();
490 boolean requiresCalculateTax = StringUtils.equals(prqs.getApplicationDocumentStatus(), InvoiceStatuses.APPDOC_AWAITING_TAX_REVIEW) && !invoiceForm.isCalculatedTax();
491 return requiresCalculateTax;
492 }
493
494 public ActionForward changeUseTaxIndicator(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
495 PurchasingAccountsPayableDocument document = (PurchasingAccountsPayableDocument) ((PurchasingAccountsPayableFormBase) form).getDocument();
496
497
498 SpringContext.getBean(PurapService.class).updateUseTaxIndicator(document, !document.isUseTaxIndicator());
499 SpringContext.getBean(PurapService.class).calculateTax(document);
500
501
502
503 return mapping.findForward(OLEConstants.MAPPING_BASIC);
504 }
505
506
507
508
509 public ActionForward clearTaxInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
510 InvoiceForm prForm = (InvoiceForm) form;
511 InvoiceDocument document = (InvoiceDocument) prForm.getDocument();
512
513 InvoiceService taxService = SpringContext.getBean(InvoiceService.class);
514
515
516 taxService.clearTax(document);
517
518 return mapping.findForward(OLEConstants.MAPPING_BASIC);
519 }
520
521
522 @Override
523 public ActionForward cancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
524 InvoiceForm prqsForm = (InvoiceForm) form;
525
526 InvoiceDocument prqsDocument = (InvoiceDocument) prqsForm.getDocument();
527
528 ActionForward forward = mapping.findForward(RiceConstants.MAPPING_BASIC);
529 if (prqsDocument.getPurchaseOrderDocument().isPendingActionIndicator()) {
530 GlobalVariables.getMessageMap().putError(
531 OLEPropertyConstants.DOCUMENT + "." + OLEPropertyConstants.DOCUMENT_NUMBER,
532 PurapKeyConstants.ERROR_PAYMENT_REQUEST_CANNOT_BE_CANCELLED);
533 } else {
534 forward = super.cancel(mapping, form, request, response);
535 }
536
537 return forward;
538 }
539 }