Project

General

Profile

1
package eu.dnetlib.goldoa.service;
2

    
3
import eu.dnetlib.goldoa.domain.*;
4
import eu.dnetlib.goldoa.service.dao.RequestDAO;
5
import eu.dnetlib.goldoa.service.utils.EmailUtils;
6
import org.apache.commons.codec.digest.DigestUtils;
7
import org.springframework.beans.factory.annotation.Autowired;
8
import org.springframework.dao.EmptyResultDataAccessException;
9
import org.springframework.jdbc.core.JdbcTemplate;
10
import org.springframework.jdbc.core.RowMapper;
11
import org.springframework.transaction.annotation.Transactional;
12

    
13
import javax.mail.MessagingException;
14
import javax.sql.DataSource;
15
import java.io.InputStream;
16
import java.sql.ResultSet;
17
import java.sql.SQLException;
18
import java.sql.Types;
19
import java.text.SimpleDateFormat;
20
import java.util.ArrayList;
21
import java.util.Date;
22
import java.util.List;
23
import java.util.concurrent.ExecutorService;
24

    
25
/**
26
 * Created by antleb on 3/10/15.
27
 */
28
@Transactional
29
public class RequestManagerImpl implements RequestManager {
30

    
31
    @Autowired
32
    private RequestDAO requestDAO;
33
    @Autowired
34
    private PersonManager personManager;
35
    @Autowired
36
    private OrganizationManager organizationManager;
37
    @Autowired
38
    private ProjectManager projectManager;
39
    @Autowired
40
    private PublicationManager publicationManager;
41
    @Autowired
42
    private InvoiceManager invoiceManager;
43
    @Autowired
44
    private BudgetManager budgetManager;
45
    @Autowired
46
    private EligibilityManager eligibilityManager;
47
    @Autowired
48
    private EmailUtils emailUtils;
49
    @Autowired
50
    private ExecutorService executorService;
51

    
52
    private boolean sendCoordinatorEmails = false;
53

    
54
	@Override
55
	public Request saveRequest(final Request request) {
56

    
57
		if (request.getId() == null) {
58
			request.setId(new SimpleDateFormat("yyyyMMdd-").format(new Date()) + requestDAO.getRequestId());
59
		}
60

    
61
        if (request.getInvoice() != null)
62
            request.addStatus(Request.RequestStatus.INVOICE_UPLOADED);
63

    
64
        requestDAO.saveRequest(request);
65
        requestDAO.saveCoFunders(request);
66

    
67
		return request;
68
	}
69

    
70
	@Override
71
	public RequestInfo getById(String requestId) {
72
        try {
73
            Request request = requestDAO.getRequest(requestId);
74

    
75
            request.setCoFunders(requestDAO.getCoFunders(request));
76

    
77
            return this.getRequestInfo(request);
78
        } catch (PersonManagerException e) {
79
            e.printStackTrace();
80
        }
81

    
82
        return null;
83
	}
84

    
85
    @Override
86
    public List<RequestInfo> getForUser(String personId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
87
        List<Request> requests = requestDAO.getForUser(personId, fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
88
        List<RequestInfo> res = new ArrayList<RequestInfo>();
89

    
90
        for (Request request:requests) {
91
            try {
92
                request.setCoFunders(requestDAO.getCoFunders(request));
93

    
94
                RequestInfo req = getShortRequestInfo(request);
95

    
96
                res.add(req);
97
            } catch (Exception e) {
98
                e.printStackTrace();
99
            }
100
        }
101

    
102
        return res;
103
    }
104

    
105
    @Override
106
    public List<RequestInfo> getForPublisher(String publisherId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
107
        List<Request> requests = requestDAO.getForPublisher(publisherId, fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
108
        List<RequestInfo> res = new ArrayList<RequestInfo>();
109

    
110
        for (Request request:requests) {
111
            try {
112
                request.setCoFunders(requestDAO.getCoFunders(request));
113

    
114
                RequestInfo req = getShortRequestInfo(request);
115

    
116
                res.add(req);
117
            } catch (Exception e) {
118
                e.printStackTrace();
119
            }
120
        }
121

    
122
        return res;
123
    }
124

    
125
    @Override
126
    public List<RequestInfo> getForOrganization(List<String> organizationIds, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
127
        List<Request> requests = requestDAO.getForOrganization(organizationIds, fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
128
        List<RequestInfo> res = new ArrayList<RequestInfo>();
129

    
130
        for (Request request:requests) {
131
            try {
132
                request.setCoFunders(requestDAO.getCoFunders(request));
133

    
134
                RequestInfo req = getShortRequestInfo(request);
135

    
136
                res.add(req);
137
            } catch (Exception e) {
138
                e.printStackTrace();
139
            }
140
        }
141

    
142
        return res;
143
    }
144

    
145
    @Override
146
	public List<Request> getForProject(String projectId) {
147
		return requestDAO.getForProject(projectId);
148
	}
149

    
150
    @Override
151
    public List<RequestInfo> getRequests(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
152
        List<Request> requests = requestDAO.getRequests(fromDate, toDate, requestSortBy, order, requestFilter, term, statusFilter, from, to);
153
        List<RequestInfo> res = new ArrayList<RequestInfo>();
154

    
155
        for (Request request:requests) {
156
            try {
157
                request.setCoFunders(requestDAO.getCoFunders(request));
158

    
159
                RequestInfo req = getShortRequestInfo(request);
160

    
161
                res.add(req);
162
            } catch (Exception e) {
163
                e.printStackTrace();
164
            }
165
        }
166

    
167
        return res;
168
    }
169

    
170
    @Override
171
    public Request submitRequest(final Request request) {
172

    
173
        request.addStatus(Request.RequestStatus.SUBMITTED);
174

    
175
        Budget budget = null; //getBudgetForRequest(request);
176

    
177
        if  (budget != null) {
178
            request.setBudget(budget.getId());
179

    
180
            budget.setRemaining(budget.getRemaining() - request.getFundingRequested());
181
            budgetManager.saveBudget(budget);
182
        }
183

    
184
        saveRequest(request);
185

    
186
        executorService.submit(new Runnable() {
187
            @Override
188
            public void run() {
189
                RequestInfo requestInfo = null;
190
                try {
191
                    requestInfo = getRequestInfo(request);
192

    
193
                    switch (requestInfo.getEligibility().getStatus()) {
194
                        case OK:
195
                            emailUtils.sendRequesterOKEmail(requestInfo);
196

    
197
                            for (Person person : personManager.getModerators())
198
                                emailUtils.sendModeratorOKEmail(requestInfo, person);
199
                            break;
200
                        case IFFY:
201
                            emailUtils.sendRequesterIFFYEmail(requestInfo);
202

    
203
                            for (Person person : personManager.getModerators())
204
                                emailUtils.sendModeratorIFFYEmail(requestInfo, person);
205
                            break;
206
                        case NONO:
207
                            break;
208
                    }
209

    
210
                    if (sendCoordinatorEmails) {
211
                        for (Person coordinator:requestInfo.getProject().getCoordinators())
212
                            emailUtils.sendCoordinatorRequestSubmittedEmail(coordinator, requestInfo);
213
                    }
214
                } catch (MessagingException e) {
215
                    e.printStackTrace();
216
                } catch (PersonManagerException e) {
217
                    e.printStackTrace();
218
                } catch (Exception e) {
219
					e.printStackTrace();
220
				}
221
            }
222
        });
223

    
224
        return request;
225
    }
226

    
227
    @Override
228
    public void approveRequest(final String requestId, String comment) {
229
        requestDAO.approveRequest(requestId, comment);
230

    
231
        executorService.submit(new Runnable() {
232
            @Override
233
            public void run() {
234
                RequestInfo requestInfo = getById(requestId);
235

    
236
                try {
237
                    emailUtils.sendRequesterApprovedEmail(requestInfo);
238
                } catch (MessagingException e) {
239
                    e.printStackTrace();
240
                }
241

    
242
                if (requestInfo.getInvoice() == null) {
243
                    try {
244
                        emailUtils.sendRequesterInvoiceNotification(requestInfo);
245
                        emailUtils.sendPublisherInvoiceNotification(requestInfo);
246
                    } catch (MessagingException e) {
247
                        e.printStackTrace();
248
                    }
249
                } else {
250
                    try {
251
                        for (Person person:personManager.getAccountingOfficers())
252
                            emailUtils.sendAccountingRequestApprovedEmail(person, requestInfo);
253
                    } catch (MessagingException e) {
254
                        e.printStackTrace();
255
                    }
256
                }
257
            }
258
        });
259
    }
260

    
261
    @Override
262
    public void rejectRequest(final String requestId, String comment) {
263
        requestDAO.rejectRequest(requestId, comment);
264

    
265
        executorService.submit(new Runnable() {
266
            @Override
267
            public void run() {
268
                RequestInfo requestInfo = getById(requestId);
269

    
270
                try {
271
                    emailUtils.sendRequesterRejectedEmail(requestInfo);
272
                } catch (MessagingException e) {
273
                    e.printStackTrace();
274
                }
275
            }
276
        });
277
    }
278

    
279
    @Override
280
    public void paidRequest(final String requestId, String comment, float apc_paid, float transfer_cost, float other_cost, Date datePaid) {
281
        requestDAO.paidRequest(requestId, comment, apc_paid, transfer_cost, other_cost, datePaid);
282

    
283
        executorService.submit(new Runnable() {
284
            @Override
285
            public void run() {
286
                RequestInfo requestInfo = getById(requestId);
287

    
288
                try {
289
                    emailUtils.sendRequesterPaidEmail(requestInfo);
290
                    emailUtils.sendPublisherPaidEmail(requestInfo);
291
                } catch (MessagingException e) {
292
                    e.printStackTrace();
293
                }
294
            }
295
        });
296
    }
297

    
298
    @Override
299
    public void onHoldRequest(final String requestId, String comment) {
300
        requestDAO.onHoldRequest(requestId, comment);
301

    
302
        executorService.submit(new Runnable() {
303
            @Override
304
            public void run() {
305
                RequestInfo requestInfo = getById(requestId);
306

    
307
                try {
308
                    emailUtils.sendRequesterOnHoldEmail(requestInfo);
309
                    emailUtils.sendPublisherOnHoldEmail(requestInfo);
310
                } catch (MessagingException e) {
311
                    e.printStackTrace();
312
                }
313
            }
314
        });
315
    }
316

    
317
    @Override
318
    public void deniedRequest(final String requestId, String comment) {
319
        requestDAO.deniedRequest(requestId, comment);
320

    
321
        executorService.submit(new Runnable() {
322
            @Override
323
            public void run() {
324
                RequestInfo requestInfo = getById(requestId);
325

    
326
                try {
327
                    emailUtils.sendRequesterDeniedEmail(requestInfo);
328
                    emailUtils.sendPublisherDeniedEmail(requestInfo);
329
                } catch (MessagingException e) {
330
                    e.printStackTrace();
331
                }
332
            }
333
        });
334
    }
335

    
336
    @Override
337
    public void invoiceUploaded(final String requestId, String invoiceId) {
338
        requestDAO.invoiceUploaded(requestId, invoiceId);
339

    
340
        executorService.submit(new Runnable() {
341
            @Override
342
            public void run() {
343
                RequestInfo requestInfo = getById(requestId);
344

    
345
                if (requestInfo.getRequest().getStatus(Request.RequestStatus.APPROVED)) {
346
                    try {
347
                        for (Person person : personManager.getAccountingOfficers())
348
                            emailUtils.sendAccountingRequestApprovedEmail(person, requestInfo);
349
                    } catch (MessagingException e) {
350
                        e.printStackTrace();
351
                    }
352
                }
353
            }
354
        });
355
    }
356

    
357
    @Override
358
    public void uploadTransferReceipt(String requestid, String contentType, InputStream inputStream) {
359
        requestDAO.uploadBankTransferReceipt(requestid, contentType, inputStream);
360
    }
361

    
362
    @Override
363
    public BankTransferReceipt downloadBankTransferReceipt(String requestId) throws RequestManagerException {
364
        try {
365
            return requestDAO.downloadBankTransferReceipt(requestId);
366
        } catch (EmptyResultDataAccessException e) {
367
            throw new RequestManagerException(RequestManagerException.ErrorCause.NOT_EXISTS);
368
        }
369
    }
370

    
371
    private Request.RequestStatus getStatus(Request request) {
372
        if (request.getStatus(Request.RequestStatus.SUBMITTED)) {
373
            if (request.getStatus(Request.RequestStatus.APPROVED)) {
374
                if (request.getStatus(Request.RequestStatus.ACCOUNTING_PAID))
375
                    return Request.RequestStatus.ACCOUNTING_PAID;
376
                else if (request.getStatus(Request.RequestStatus.ACCOUNTING_ON_HOLD))
377
                    return Request.RequestStatus.ACCOUNTING_ON_HOLD;
378
                else if (request.getStatus(Request.RequestStatus.ACCOUNTING_DENIED))
379
                    return Request.RequestStatus.ACCOUNTING_DENIED;
380
                else
381
                    return Request.RequestStatus.APPROVED;
382
            }
383
            else if (request.getStatus(Request.RequestStatus.REJECTED))
384
                return Request.RequestStatus.REJECTED;
385
            else
386
                return Request.RequestStatus.SUBMITTED;
387
        }
388
        else
389
            return Request.RequestStatus.INCOMPLETE;
390
    }
391

    
392

    
393

    
394
    private RequestInfo getRequestInfo(Request request) throws PersonManagerException {
395
        RequestInfo req = new RequestInfo();
396

    
397
        try {
398
            // TODO add missing fields
399
            req.setId(request.getId());
400
            req.setUser(personManager.getById(request.getUser()));
401
            req.setDate(request.getDate());
402
            req.setResearcher(personManager.getById(request.getResearcher()));
403
            req.setOrganization(organizationManager.getById(request.getOrganization()));
404
            req.setProject(projectManager.getById(request.getProject()).getProject());
405
            req.setPublication(publicationManager.getPublication(request.getPublication()));
406
            req.setPublisherEmail(request.getPublisherEmail());
407
            req.setApc(request.getApc());
408
            req.setDiscount(request.getDiscount());
409
            req.setProjectParticipation(request.getProjectParticipation());
410
            req.setFundingRequested(request.getFundingRequested());
411
            req.setCurrency(request.getCurrency());
412
            req.setBankAccount(request.getBankAccount());
413
            if(request.getInvoice()!=null)
414
                req.setInvoice(invoiceManager.getInvoice(request.getInvoice()));
415
            req.setEligibility(eligibilityManager.validate(request));
416
            req.setStatus(getStatus(request));
417
            req.setComments(requestDAO.getComments(request.getId()));
418
            req.setCoFunders(request.getCoFunders());
419
            req.setRequest(request);
420
        } catch (ManagerException me) {
421
            me.printStackTrace();
422
        } catch (OrganizationManagerException e) {
423
            e.printStackTrace();
424
        }
425

    
426
        return req;
427
    }
428

    
429
    private RequestInfo getShortRequestInfo(Request request) throws PersonManagerException {
430
        RequestInfo req = new RequestInfo();
431

    
432
        // TODO add missing fields
433
        req.setId(request.getId());
434
        req.setDate(request.getDate());
435
        req.setPublication(publicationManager.getPublication(request.getPublication()));
436
        req.setPublisherEmail(request.getPublisherEmail());
437
        req.setApc(request.getApc());
438
        req.setDiscount(request.getDiscount());
439
        req.setProjectParticipation(request.getProjectParticipation());
440
        req.setFundingRequested(request.getFundingRequested());
441
        req.setCurrency(request.getCurrency());
442
        req.setBankAccount(request.getBankAccount());
443
        req.setCoFunders(request.getCoFunders());
444
        req.setStatus(getStatus(request));
445
        req.setComments(requestDAO.getComments(request.getId()));
446
        req.setRequest(request);
447

    
448
        return req;
449
    }
450

    
451
    public boolean isSendCoordinatorEmails() {
452
        return sendCoordinatorEmails;
453
    }
454

    
455
    public void setSendCoordinatorEmails(boolean sendCoordinatorEmails) {
456
        this.sendCoordinatorEmails = sendCoordinatorEmails;
457
    }
458
}
(26-26/29)