Project

General

Profile

1
package eu.dnetlib.goldoa.service.dao;
2

    
3
import com.opencsv.CSVWriter;
4
import com.sun.org.apache.regexp.internal.RE;
5
import eu.dnetlib.goldoa.domain.*;
6
import eu.dnetlib.goldoa.domain.RequestPage;
7
import eu.dnetlib.goldoa.service.EligibilityManager;
8
import org.apache.commons.codec.digest.DigestUtils;
9
import org.apache.commons.io.IOUtils;
10
import org.apache.commons.logging.Log;
11
import org.apache.commons.logging.LogFactory;
12
import org.hibernate.Criteria;
13
import org.hibernate.Query;
14
import org.hibernate.criterion.*;
15
import org.hibernate.transform.AliasToBeanResultTransformer;
16
import org.springframework.beans.factory.annotation.Autowired;
17
import org.springframework.stereotype.Repository;
18
import org.hibernate.type.Type;
19
import java.io.ByteArrayOutputStream;
20
import java.io.IOException;
21
import java.io.InputStream;
22
import java.io.StringWriter;
23
import java.math.BigInteger;
24
import java.sql.*;
25
import java.text.SimpleDateFormat;
26
import java.util.*;
27
import java.util.Date;
28
import org.hibernate.type.*;
29

    
30
/*
31
 * Created by antleb on 3/30/15.
32
*/
33
@Repository
34
public class RequestDAO extends AbstractDao<String,Request>{
35

    
36
	private Log logger = LogFactory.getLog(RequestDAO.class);
37
	private final static String GET_COMMENT_TEMPLATES = "select id, status, name, comment from commenttemplate where status=?";
38
	@Autowired
39
	private EligibilityManager eligibilityManager;
40

    
41
	public void saveRequest(final Request request) {
42
		Request r = getRequest(request.getId());
43
		Request r_merged = null;
44

    
45
		if(request.getRequestCoFunders().size() > 0  ){
46
			logger.debug("Submition request co funders list size -> " + request.getRequestCoFunders().size());
47
			for(RequestCoFunder rc:request.getRequestCoFunders())
48
				rc.getPk().setRequest(request);
49
		}
50

    
51
		if(r != null){
52
			logger.debug("Request submition with id -> " + r.getId());
53
			logger.debug("Submition request co funders list size -> " + r.getRequestCoFunders().size());
54

    
55
			System.out.println("Request submition with id -> " + r.getId());
56
			System.out.println("Submition request co funders list size -> " + r.getRequestCoFunders().size());
57

    
58
			for(RequestCoFunder rc:r.getRequestCoFunders())
59
				rc.getPk().setRequest(r);
60

    
61
			r_merged = (Request)getSession().merge(request);
62
		}
63
		else{
64
			logger.debug("First save of request with id -> " + request.getId());
65
			logger.debug("Request co funders list size -> " + request.getRequestCoFunders().size());
66

    
67
			for(RequestCoFunder rc:request.getRequestCoFunders())
68
				rc.getPk().setRequest(request);
69

    
70
			Date date = new Date();
71
			request.setDate(new Timestamp(date.getTime()));
72

    
73
			persist(request);
74
		}
75
	}
76

    
77

    
78
	public List<RequestCoFunder> getCoFunders(final Request request) {
79
	    return request.getRequestCoFunders();
80
	}
81

    
82
	@SuppressWarnings("unchecked")
83
	public Request getRequest(String requestId) {
84
	   List<Request> r = createEntityCriteria().add(Restrictions.eq("id",requestId)).list();
85
	   if(r.size() > 0){
86
		   r.get(0).setEligibility(eligibilityManager.validate(r.get(0)));
87
		   return r.get(0);
88
	   }
89
	   return null;
90
	}
91

    
92
	public void submitRequest(Request r) {
93
        if(r.getStatus() != Request.RequestStatus.APPROVED && r.getStatus() != Request.RequestStatus.ACCOUNTING_PROCESSING &&
94
                r.getStatus() != Request.RequestStatus.ACCOUNTING_PAID && r.getStatus() != Request.RequestStatus.CONDITIONALLY_APPROVED){
95
            r.setStatus(Request.RequestStatus.SUBMITTED);
96
            r.setSubmissiondate(new Timestamp(new Date().getTime()));
97

    
98
            saveRequest(r);
99
        }
100
	}
101

    
102
	public void approveRequest(String requestId, User user, String comment, String template) {
103
		Request r = getRequest(requestId);
104
		r.setStatus(Request.RequestStatus.APPROVED);
105
		r.setApprovaldate(new Timestamp(new Date().getTime()));
106
		saveRequest(r);
107

    
108
		if (comment != null && !comment.isEmpty()) {
109
			saveComment(requestId, user, comment, template);
110
		}
111
	}
112

    
113
	public void conditionallyApproveRequest(String requestId, User personId, String comment, String template) {
114
		Request r = getRequest(requestId);
115
		r.setStatus(Request.RequestStatus.CONDITIONALLY_APPROVED);
116
		saveRequest(r);
117
		if (comment != null && !comment.isEmpty()) {
118
			saveComment(requestId, personId, comment, template);
119
		}
120
	}
121

    
122
	private void saveComment(String requestId, User user, String comment, String template) {
123
		String commentId = "portal::" + DigestUtils.md5Hex(comment + new Date());
124
		Comment com = new Comment();
125
		com.setComment(comment);
126
		com.setId(commentId);
127
		com.setPerson(user);
128
		com.setTemplate(null);
129

    
130

    
131
		Request r = getRequest(requestId);
132
		List<Comment> cms = r.getRequestComments();
133
		cms.add(com);
134

    
135
		saveRequest(r);
136

    
137
	}
138

    
139
	public void rejectRequest(String requestId, User personId, String comment, String template) {
140
		Request r = getRequest(requestId);
141
		r.setStatus(Request.RequestStatus.REJECTED);
142
		saveRequest(r);
143

    
144
		if (comment != null && !comment.isEmpty()) {
145
			saveComment(requestId, personId, comment, template);
146
		}
147
	}
148

    
149
	public void processingRequest(String requestId, User user, String comment, String template) {
150
		Request r = getRequest(requestId);
151
		r.setStatus(Request.RequestStatus.ACCOUNTING_PROCESSING);
152
		saveRequest(r);
153

    
154
		if (comment != null && !comment.isEmpty()) {
155
			saveComment(requestId, user, comment, template);
156
		}
157
	}
158

    
159
	public void paidRequest(String requestId, User user, String comment, String template, float apc_paid, float transfer_cost, float other_cost, Date datePaid) {
160
		Request r = getRequest(requestId);
161
		r.setStatus(Request.RequestStatus.ACCOUNTING_PAID);
162
		r.setApcPaid(apc_paid);
163
		r.setOtherCost(other_cost);
164
		r.setDatePaid(new Timestamp(datePaid.getTime()));
165
		saveRequest(r);
166

    
167
		if (comment != null && !comment.isEmpty()) {
168
			saveComment(requestId, user, comment, template);
169
		}
170
	}
171

    
172
	public void paidLibraryRequest(String requestId, User user, String comment, String template,
173
								   float apc_paid, float transfer_cost, float other_cost, Date datePaid) {
174
		Request r = getRequest(requestId);
175
		r.setStatus(Request.RequestStatus.LIBRARY_FUND_PAID);
176
		r.setApcPaid(apc_paid);
177
		r.setTransferCost(transfer_cost);
178
		r.setOtherCost(other_cost);
179
		r.setDatePaid(new Timestamp(datePaid.getTime()));
180
		saveRequest(r);
181

    
182
		if (comment != null && !comment.isEmpty()) {
183
			saveComment(requestId, user, comment, template);
184
		}
185
	}
186

    
187
	public void paidPublisherRequest(String requestId, User user, String comment, String template,
188
									 float apc_paid, float transfer_cost, float other_cost, Date datePaid) {
189
		Request r = getRequest(requestId);
190
		r.setStatus(Request.RequestStatus.PUBLISHER_FUND_PAID);
191
		r.setApcPaid(apc_paid);
192
		r.setTransferCost(transfer_cost);
193
		r.setOtherCost(other_cost);
194
		r.setDatePaid(new Timestamp(datePaid.getTime()));
195
		saveRequest(r);
196

    
197
		if (comment != null && !comment.isEmpty()) {
198
			saveComment(requestId, user, comment, template);
199
		}
200
	}
201

    
202
	public void onHoldRequest(String requestId, User user, String comment, String template) {
203
		Request r = getRequest(requestId);
204
		r.setStatus(Request.RequestStatus.ACCOUNTING_ON_HOLD);
205
		saveRequest(r);
206

    
207
		if (comment != null && !comment.isEmpty()) {
208
			saveComment(requestId, user, comment, template);
209
		}
210
	}
211

    
212
	public void deniedRequest(String requestId, User user, String comment, String template) {
213
		Request r = getRequest(requestId);
214
		r.setStatus(Request.RequestStatus.ACCOUNTING_DENIED);
215
		saveRequest(r);
216

    
217
		if (comment != null && !comment.isEmpty()) {
218
			saveComment(requestId, user, comment, template);
219
		}
220
	}
221

    
222
	@SuppressWarnings("unchecked")
223
	public List<Request> getForProject(String projectId) {
224
		return createEntityCriteria().add(Restrictions.eq("project.id",projectId)).list();
225
	}
226

    
227
    public RequestPage getForUser(String personId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
228
        return this.getRequestPage(personId, null, null, requestSortBy, order, requestFilter, term, getStatusFilter(statusFilter), from, to);
229
    }
230

    
231
    public RequestPage getForOrganization(List<String> organizationIds, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
232
        return this.getRequestPage(null, organizationIds, null, requestSortBy, order, requestFilter, term, getStatusFilter(statusFilter), from, to);
233
    }
234

    
235
    public RequestPage getForPublisher(String publisherId, Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
236
        return this.getRequestPage(null, null, publisherId, requestSortBy, order, requestFilter, term, getStatusFilter(statusFilter), from, to);
237
    }
238

    
239
    public RequestPage getRequests(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Request.RequestStatus[] statusFilter, int from, int to) {
240
        return this.getRequestPage(null, null, null, requestSortBy, order, requestFilter, term, getStatusFilter(statusFilter), from, to);
241
    }
242

    
243
    public RequestPage getRequests(Date fromDate, Date toDate, RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Integer[] statusFilter, int from, int to) {
244
        return this.getRequestPage(null, null, null, requestSortBy, order, requestFilter, term, statusFilter, from, to);
245
    }
246

    
247
	public BigInteger getRequestId() {
248
		return (BigInteger) getSession().createSQLQuery("select nextval('request_id_seq') as id").list().get(0);
249
	}
250

    
251
	@SuppressWarnings("unchecked")
252
	public String getCSV(RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter, String term, Integer[] statuses) throws IOException {
253
		List<Object> args = new ArrayList<Object>();
254
		List<Type> types = new ArrayList<>();
255
		String requestQuery = this.getQuery(null, null, null, requestSortBy, order, requestFilter, term, statuses, args, types);
256
		String query = "select r.id as rid, r.status, r.date, u.firstname, u.lastname, o.name as organization," +
257
				" c.name as country, p.id as pid, p.acronym, p.startdate, p.enddate, p.scientificarea, " +
258
				"pub.title, pub.type, j.title as journal,(case when jp.id is not null then jp.name else mp.name end) as publisher, " +
259
				" r.approvaldate as approvaldate, r.apc as apc,r.currency as currency,r.datepaid, r.apcpaid, r.transfercost, " +
260
				" r.othercost, comment.comment as comment from (" + requestQuery + ") r " +
261
				"left join \"user\" u on r.researcher = u.email " +
262
				"left join project p on r.project=p.id " +
263
				"left join publication pub on r.publication=pub.id " +
264
				"left join journal j on j.id=r.journal " +
265
				"left join publisher jp on j.publisher=jp.id " +
266
				"left join publisher mp on mp.id=r.publisher " +
267
				"left join organization o on o.id=r.organization " +
268
				"left join country c on c.id=o.country " +
269
				"left join (select rid , comments[1] as comment  " +
270
				"           from (select rid, array_agg(comments) as comments" +
271
				"                 from (select rc.request as rid, c.comment as comments " +
272
				"                       from comment c " +
273
				"                            join request_comment rc on rc.comment=c.id " +
274
				"                            join request r on r.id=rc.request " +
275
				"                            and r.status = 8  order by rid, c.date desc" +
276
				"                       ) foo " +
277
				"                       group by rid" +
278
				"                 ) bar order by rid \n" +
279
				"           ) as comment on r.id=comment.rid";
280

    
281

    
282

    
283
		System.out.println(query);
284
		List<String[]> requests = new ArrayList<>();
285
		Type[] t = new Type[types.size()];
286
		t = types.toArray(t);
287
		List<Object[]> resultSet = getSession().createSQLQuery(query)
288
				.setParameters(args.toArray(), t).list();
289

    
290
		for(Object rs[] : resultSet){
291

    
292
			String[] objs = new String[24];
293
			objs[0] = rs[0].toString();
294
			objs[1] = String.valueOf(Request.RequestStatus.forStatus(Integer.parseInt(rs[1].toString())));
295
			objs[2] = rs[2]!=null?new SimpleDateFormat("yyyy/MM/dd").format(rs[2]):null;
296
			objs[3] = rs[3]!=null?rs[3].toString():null;
297
			objs[4] = rs[4]!=null?rs[4].toString():null;
298
			objs[5] = rs[5]!=null?rs[5].toString():null;
299
			objs[6] = rs[6]!=null?rs[6].toString():null;
300
			//project id
301
			objs[7] = rs[7]!=null?rs[7].toString():null;
302
			objs[8] = rs[8]!=null?rs[8].toString():null;
303
			objs[9] = rs[9]!=null?new SimpleDateFormat("yyyy/MM/dd").format(rs[9]):null;
304
			objs[10] = rs[10]!=null?new SimpleDateFormat("yyyy/MM/dd").format(rs[10]):null;
305
			objs[11] = rs[11]!=null?rs[11].toString():null;
306
			objs[12] = rs[12]!=null?rs[12].toString():null;
307
			objs[13] = rs[13]!=null?rs[13].toString():null;
308
			objs[14] = rs[14]!=null?rs[14].toString():null;
309
			objs[15] = rs[15]!=null?rs[15].toString():null;
310
			objs[16] = rs[16]!=null?new SimpleDateFormat("yyyy/MM/dd").format(rs[16]):null;
311
			objs[17] = rs[20]!=null?Float.toString(Float.parseFloat(rs[17].toString())):null;
312
			objs[18] = rs[18]!=null?rs[18].toString():null;
313
			objs[19] = rs[19]!=null?new SimpleDateFormat("yyyy/MM/dd").format(rs[19]):null;
314
			objs[20] = rs[20]!=null?rs[20].toString() + "":null;
315
			objs[21] = rs[21]!=null?rs[21].toString() + "":null;
316
			objs[22] = rs[22]!=null?rs[22].toString() + "":null;
317
			objs[23] = rs[23]!=null?rs[23].toString():null;
318
			requests.add(objs);
319
		}
320

    
321
		StringWriter sw = new StringWriter();
322
		CSVWriter csvWriter = new CSVWriter(sw);
323

    
324
		csvWriter.writeNext(new String[]{"id", "Status", "Submission Date", "Firstname", "Lastname", "Organization",
325
				"Country", "Project id", "Acronym", "Start Date", "End Date", "Scientific Area", "Title", "Type",
326
				"Journal", "Publisher", "Date Approved", "APC requested", "Currency", "Date Paid", "APC paid",
327
				"Transfer Cost", "Other Expenses", "Rejection Reason"}, false);
328
		csvWriter.writeAll(requests, false);
329

    
330
		csvWriter.close();
331
		sw.close();
332

    
333
		return sw.toString();
334
	}
335

    
336
	@SuppressWarnings("unchecked")
337
	private RequestPage getRequestPage(String personId, List<String> organizationIds, String publisherId,
338
                                       RequestSort requestSortBy, RequestSortOrder order, RequestFilter requestFilter,
339
                                       String term, Integer[] statusFilterCodes, int from, int to) {
340
		RequestPage page = new RequestPage();
341
		List<Object> args = new ArrayList<Object>();
342
		List<Type> types = new ArrayList<>();
343
		String query = getQuery(personId, organizationIds, publisherId, requestSortBy, order,
344
				requestFilter, term, statusFilterCodes, args, types);
345

    
346
		Type[] t = new Type[types.size()];
347
		t = types.toArray(t);
348

    
349
		page.setRequests(getSession().createSQLQuery(applyPaging(query, from, to))
350
				.addEntity(Request.class)
351
				.setParameters(args.toArray(),t)
352
				.list());
353
		
354
		BigInteger bi = (BigInteger) getSession().createSQLQuery(getCountQuery(query))
355
				.setParameters(args.toArray(),t)
356
				.list().get(0);
357
		page.setTotal(bi.intValue());
358
		page.setFrom(from);
359
		page.setTo(to);
360

    
361
		return page;
362
	}
363

    
364
	private String getCountQuery(String query) {
365
		StringBuilder sb = new StringBuilder();
366

    
367
		sb.append("select count(*) from (").append(query).append(") foo");
368

    
369
		return sb.toString();
370
	}
371

    
372
	private String getQuery(String email, List<String> organizationIds, String publisherId, RequestSort requestSortBy, RequestSortOrder order,
373
							RequestFilter requestFilter, String term, Integer[] statusFilterCodes, List<Object> args, List<Type> types) {
374
		Map<String, String> joins = new HashMap<String, String>();
375
		List<String> whereClauses = new ArrayList<String>();
376
		List<Object> whereArgs = new ArrayList<Object>();
377
		List<Type> whereTypes = new ArrayList<>();
378

    
379
		String orderBy = null;
380

    
381
		if (term != null) {
382
			if (requestFilter != null) {
383
				switch (requestFilter) {
384
					case ID:
385
						whereClauses.add("(r.id like ? )");
386
						whereArgs.add("%" + term + "%");
387
						types.add(StringType.INSTANCE);
388
						break;
389
					case USER:
390
						joins.put("user", " join \"user\" u on u.email=r.user and (lower(u.firstname) like lower(?) or lower(u.initials) like lower(?) or lower(u.lastname) like lower(?)) ");
391
						args.add("%" + term + "%");
392
						args.add("%" + term + "%");
393
						args.add("%" + term + "%");
394
						types.add(StringType.INSTANCE);
395
						types.add(StringType.INSTANCE);
396
						types.add(StringType.INSTANCE);
397
						break;
398
					case RESEARCHER:
399
						joins.put("researcher", " join \"user\" res on res.email=r.researcher and (lower(res.firstname) like lower(?) or lower(res.initials) like lower(?) or lower(res.lastname) like lower(?)) ");
400
						args.add("%" + term + "%");
401
						args.add("%" + term + "%");
402
						args.add("%" + term + "%");
403
						types.add(StringType.INSTANCE);
404
						types.add(StringType.INSTANCE);
405
						types.add(StringType.INSTANCE);
406
						break;
407
					case PROJECT:
408
						joins.put("project", " join project proj on proj.id=r.project and (lower(proj.acronym) like lower(?) or lower(proj.title) like lower(?) or lower(proj.grant) like lower(?)) ");
409
						args.add("%" + term + "%");
410
						args.add("%" + term + "%");
411
						args.add("%" + term + "%");
412
						types.add(StringType.INSTANCE);
413
						types.add(StringType.INSTANCE);
414
						types.add(StringType.INSTANCE);
415
						break;
416
					case PUBLICATION:
417
						joins.put("publication", " join publication pub on pub.id=r.publication and (lower(pub.title) like lower(?)) ");
418
						args.add("%" + term + "%");
419
						types.add(StringType.INSTANCE);
420
						break;
421
					case JOURNAL:
422
						joins.put("journal", " join journal j on j.id=r.journal and (lower(j.title) like lower(?)) ");
423
						args.add("%" + term + "%");
424
						types.add(StringType.INSTANCE);
425
						break;
426
					case PUBLISHER:
427
						joins.put("publisher", " join publisher publ on publ.id=r.publisher and (lower(publ.name) like lower(?)) ");
428
						args.add("%" + term + "%");
429
						types.add(StringType.INSTANCE);
430
						break;
431
					case INVOICE:
432
						joins.put("invoice", "join invoice i on i.id=r.invoice and (lower(i.number) like lower(?) or lower(alternativeid) like lower(?))");
433
						args.add("%" + term + "%");
434
						args.add("%" + term + "%");
435
						types.add(StringType.INSTANCE);
436
						types.add(StringType.INSTANCE);
437
						break;
438
				}
439
			} else {
440
				whereClauses.add("(r.id like ? )");
441
				whereArgs.add("%" + term + "%");
442
				types.add(StringType.INSTANCE);
443

    
444
				joins.put("user", " left join \"user\" u on u.email=r.user ");
445
				whereClauses.add("(lower(u.firstname) like lower(?) or lower(u.initials) like lower(?) or lower(u.lastname) like lower(?))");
446
				whereArgs.add("%" + term + "%");
447
				whereArgs.add("%" + term + "%");
448
				whereArgs.add("%" + term + "%");
449
				whereTypes.add(StringType.INSTANCE);
450
				whereTypes.add(StringType.INSTANCE);
451
				whereTypes.add(StringType.INSTANCE);
452
				joins.put("researcher", " left join \"user\" res on res.email=r.researcher ");
453
				whereClauses.add("(lower(res.firstname) like lower(?) or lower(res.initials) like lower(?) or lower(res.lastname) like lower(?))");
454
				whereArgs.add("%" + term + "%");
455
				whereArgs.add("%" + term + "%");
456
				whereArgs.add("%" + term + "%");
457
				whereTypes.add(StringType.INSTANCE);
458
				whereTypes.add(StringType.INSTANCE);
459
				whereTypes.add(StringType.INSTANCE);
460
				joins.put("project", " left join project proj on proj.id=r.project ");
461
				whereClauses.add("(lower(proj.acronym) like lower(?) or lower(proj.title) like lower(?) or lower(proj.grant) like lower(?))");
462
				whereArgs.add("%" + term + "%");
463
				whereArgs.add("%" + term + "%");
464
				whereArgs.add("%" + term + "%");
465
				whereTypes.add(StringType.INSTANCE);
466
				whereTypes.add(StringType.INSTANCE);
467
				whereTypes.add(StringType.INSTANCE);
468
				joins.put("publication", " left join publication pub on pub.id=r.publication ");
469
				whereClauses.add("(lower(pub.title) like lower(?))");
470
				whereArgs.add("%" + term + "%");
471
				whereTypes.add(StringType.INSTANCE);
472
				joins.put("journal", " left join journal j on j.id=r.journal ");
473
				whereClauses.add("(lower(j.title) like lower(?))");
474
				whereArgs.add("%" + term + "%");
475
				whereTypes.add(StringType.INSTANCE);
476
				joins.put("publisher", " left join publisher publ on publ.id=r.publisher ");
477
				whereClauses.add("(lower(publ.name) like lower(?))");
478
				whereArgs.add("%" + term + "%");
479
				whereTypes.add(StringType.INSTANCE);
480
				joins.put("invoice", " left join invoice i on i.id=r.invoice ");
481
				whereClauses.add("(lower(i.number) like lower(?) or lower(alternativeid) like lower(?))");
482
				whereArgs.add("%" + term + "%");
483
				whereArgs.add("%" + term + "%");
484
				whereTypes.add(StringType.INSTANCE);
485
				whereTypes.add(StringType.INSTANCE);
486
			}
487

    
488
		}
489

    
490
		if (requestSortBy != null) {
491
			switch (requestSortBy) {
492
				case DATE:
493
					orderBy = " r.date ";
494
					break;
495
				case FUNDING_REQUESTED:
496
					orderBy = " r.fundingrequested ";
497
					break;
498
				case USER:
499
					if (joins.get("user") == null)
500
						joins.put("user", " left join \"user\" u on u.email=r.user ");
501

    
502
					orderBy = " u.firstname, u.initials, u.lastname ";
503
					break;
504
				case PUBLICATION:
505
					if (joins.get("publication") == null)
506
						joins.put("publication", " left join publication pub on r.publication=pub.id ");
507

    
508
					orderBy = " pub.title ";
509
					break;
510
				case RESEARCHER:
511
					if (joins.get("researcher") == null)
512
						joins.put("researcher", " left join \"user\" res on res.email=r.researcher ");
513

    
514
					orderBy = " res.firstname, res.initials, res.lastname ";
515
					break;
516
				case PROJECT:
517
					if (joins.get("project") == null)
518
						joins.put("project", " left join project proj on proj.id=r.project ");
519

    
520
					orderBy = " proj.acronym ";
521
					break;
522
				case JOURNAL:
523
					if (joins.get("journal") == null)
524
						joins.put("journal", " left join journal j on j.id=r.journal ");
525

    
526
					orderBy = " j.title ";
527
					break;
528
				case PUBLISHER:
529
					if (joins.get("publisher") == null)
530
						joins.put("publisher", " left join publisher publ on publ.id=r.publisher ");
531

    
532
					orderBy = " publ.name ";
533
					break;
534
				case STATUS:
535
				default:
536
					orderBy = " r.status ";
537
					break;
538
			}
539
		}
540

    
541
		//TODO fix bank fields and publisher_email
542
		//StringBuilder sb = new StringBuilder("select r.id, r.\"user\", r.date, r.researcher, r.organization, r.project, r.publication, r.journal, r.publisher, r.publisher_email, r.budget, r.invoice, r.apc, r.discount, r.projectparticipation, r.fundingrequested, r.currency, r.bank_name, r.bank_address, r.bank_code, r.bank_holder, r.bank_iban, r.apc_paid, r.transfer_cost, r.other_cost, r.date_paid, r.submissiondate, r.approvaldate, r.status from request r ");
543
		StringBuilder sb = new StringBuilder("select r.id as id, " +
544
				"r.\"user\" as \"user\", r.date as date, r.researcher as researcher, r.organization as organization, " +
545
				"r.project as project, r.publication as publication, r.journal as journal, r.publisher as publisher,  " +
546
				"r.budget as budget, r.invoice as invoice , r.apc as apc, r.discount as discount, " +
547
				"r.projectparticipation as projectparticipation, r.fundingrequested as fundingrequested, r.currency as currency, " +
548
				"r.apcPaid as apcPaid, r.transferCost as transferCost, r.otherCost as otherCost, r.datePaid as datePaid, " +
549
				"r.submissiondate as submissiondate, r.approvaldate as approvaldate, r.status as status ," +
550
				"r.bankAccount as bankAccount , r.bankTransferReceipt as bankTransferReceipt ," +
551
				"r.publisher_email as publisher_email from request r ");
552
		for (String join : joins.values())
553
			sb.append(" ").append(join).append(" ");
554

    
555

    
556
		sb.append(" where ");
557

    
558
		if (email != null) {
559
			sb.append("r.\"user\"=? ");
560

    
561
			args.add(email);
562
			types.add(StringType.INSTANCE);
563
		} else if (organizationIds != null) {
564
			sb.append("(");
565

    
566
			for (int i = 0; i < organizationIds.size(); i++) {
567
				if (i > 0)
568
					sb.append(" or ");
569

    
570
				sb.append(" r.organization=? ");
571

    
572
				args.add(organizationIds.get(i));
573
				types.add(StringType.INSTANCE);
574
			}
575

    
576
			sb.append(")");
577

    
578
		} else if (publisherId != null) {
579

    
580
			if (joins.get("journal") == null) {
581
				sb.delete(sb.lastIndexOf("where"), sb.length());
582
				sb.append(" left join journal j on j.id=r.journal ");
583
				sb.append(" where ");
584
			}
585

    
586
			sb.append("(r.publisher=? or j.publisher=?)");
587

    
588
			args.add(publisherId);
589
			types.add(StringType.INSTANCE);
590
			args.add(publisherId);
591
			types.add(StringType.INSTANCE);
592
		}
593

    
594
		if (statusFilterCodes != null) {
595
			StringBuilder ssb = new StringBuilder();
596

    
597
			for (Integer code:statusFilterCodes) {
598
				String clause;
599

    
600
				switch (code) {
601
					default:
602
						clause = " (r.status = " + code + ")";
603
						break;
604
				}
605

    
606
				ssb.append(ssb.length()==0?clause:" or " + clause);
607
			}
608

    
609
			if (sb.toString().trim().endsWith("where"))
610
				sb.append("(").append(ssb.toString()).append(")");
611
			else
612
				sb.append(" and ").append("(").append(ssb.toString()).append(")");
613
		}
614

    
615
		if (whereClauses.size() > 0) {
616
			if (!sb.toString().trim().endsWith("where"))
617
				sb.append(" and ");
618
			sb.append("(");
619

    
620
			for (String clause : whereClauses) {
621
				sb.append(clause);
622
				sb.append(" or ");
623
			}
624

    
625
			sb.delete(sb.lastIndexOf("or"), sb.length());
626
			sb.append(") ");
627

    
628
			args.addAll(whereArgs);
629
			types.addAll(whereTypes);
630
		}
631

    
632
		if (sb.toString().trim().endsWith("where"))
633
			sb.delete(sb.lastIndexOf("where"), sb.length());
634

    
635
		if (orderBy != null) {
636
			sb.append(" order by ").append(orderBy);
637

    
638
			if (order == RequestSortOrder.ASCENDING)
639
				sb.append(" asc");
640
			else
641
				sb.append(" desc");
642
		}
643

    
644
		return sb.toString();
645
	}
646

    
647
	private String applyPaging(String query, int from, int to) {
648
		StringBuilder sb = new StringBuilder(query);
649

    
650
		if (from > 0 || to > 0) {
651
			sb.append(" limit ").append(to - from + 1);
652
			sb.append(" offset ").append(from);
653
		}
654

    
655
		return sb.toString();
656
	}
657

    
658
	private Integer[] getStatusFilter(Request.RequestStatus[] statuses) {
659
		if (statuses == null)
660
			return null;
661
		else {
662
			Integer[] res = new Integer[statuses.length];
663

    
664
			for (int i = 0; i < statuses.length; i++)
665
				res[i] = statuses[i].getCode();
666

    
667
			return res;
668
		}
669
	}
670

    
671
	public List<Comment> getComments(String id) {
672
		return getRequest(id).getRequestComments();
673
	}
674

    
675
	public void uploadBankTransferReceipt(final String requestid, final String contentType, InputStream inputStream) {
676
		try {
677
			final ByteArrayOutputStream baos = new ByteArrayOutputStream();
678
			Request r = getRequest(requestid);
679

    
680
			IOUtils.copy(inputStream, baos);
681
			IOUtils.closeQuietly(baos);
682
			r.setBankTransferReceipt(new BankTransferReceipt(contentType,baos.toByteArray()));
683
			saveRequest(r);
684
		} catch (Exception e) {
685
			e.printStackTrace();
686
		}
687
	}
688

    
689
	public BankTransferReceipt downloadBankTransferReceipt(String requestId) {
690
		Request r = getRequest(requestId);
691
		return r.getBankTransferReceipt();
692
	}
693

    
694
	@SuppressWarnings("unchecked")
695
	public List<CommentTemplate> getCommentTemplates(Request.RequestStatus requestStatus) {
696
		Criteria cr = getSession().createCriteria(CommentTemplate.class);
697
		return cr.list();
698
	}
699

    
700
    public BigInteger getActiveNumber() {
701

    
702
		String NUMBERS_REQUESTS = "select count(*) from request r where r.status in (" + Request.RequestStatus.APPROVED.getCode() + ", "
703
				+ Request.RequestStatus.ACCOUNTING_PROCESSING.getCode() + ", " + Request.RequestStatus.ACCOUNTING_PAID.getCode() + ", "
704
				+ Request.RequestStatus.CONDITIONALLY_APPROVED.getCode() + ", " + Request.RequestStatus.ACCOUNTING_ON_HOLD.getCode() + ")" ;
705

    
706
		Query q = getSession().createSQLQuery(NUMBERS_REQUESTS);
707
		return ((BigInteger) q.list().get(0));
708
	}
709

    
710
	public BigInteger getPaidNumber() {
711
		String NUMBERS_PAID_REQUESTS = "select count(*) from request r where r.status in (" + Request.RequestStatus.ACCOUNTING_PAID.getCode() + ")" ;
712

    
713
		Query q = getSession().createSQLQuery(NUMBERS_PAID_REQUESTS);
714
		return ((BigInteger) q.list().get(0));
715
	}
716

    
717
	public BigInteger getNumberOfProjects() {
718
		String NUMBERS_PROJECTS = "select count(distinct project) from request r where r.status in (" + Request.RequestStatus.APPROVED.getCode() + ", "
719
				+ Request.RequestStatus.ACCOUNTING_PROCESSING.getCode() + ", " + Request.RequestStatus.ACCOUNTING_PAID.getCode()
720
				+ ", " + Request.RequestStatus.CONDITIONALLY_APPROVED.getCode() + ", " + Request.RequestStatus.ACCOUNTING_ON_HOLD.getCode() + ")";
721
		Query q = getSession().createSQLQuery(NUMBERS_PROJECTS);
722
		return ((BigInteger) q.list().get(0));
723
	}
724

    
725
	public Float getTotalAmount() {
726
		String NUMBERS_TOTAL_AMOUNT = "select sum(apcPaid) from request r";
727
		Query q = getSession().createSQLQuery(NUMBERS_TOTAL_AMOUNT);
728
		Float result = (Float) q.list().get(0);
729
		if(result == null) return Float.valueOf(0);
730
		return result;
731
	}
732

    
733
	public Double getAverageAmount() {
734
		String NUMBERS_AVERAGE_AMOUNT = "select avg(apcPaid) from request r";
735
		Query q = getSession().createSQLQuery(NUMBERS_AVERAGE_AMOUNT);
736
		Double result = (Double) q.list().get(0);
737
		if(result == null) return Double.valueOf(0);
738
		return result;
739
	}
740

    
741
	public Double getAverageAmountPerArticle(){
742
		String NUMBERS_AVERAGE_PER_ARTICLE = "select avg(apcPaid) from request r join publication p on r.publication=p.id where p.type='ARTICLE'";
743
		Query q = getSession().createSQLQuery(NUMBERS_AVERAGE_PER_ARTICLE);
744
		Double result = (Double) q.list().get(0);
745
		if(result == null) return Double.valueOf(0);
746
		return result;
747
	}
748

    
749
	public Double getAverageAmountPerMonograph(){
750
		String NUMBERS_AVERAGE_PER_MONOGRAPH = "select avg(apcPaid) from request r join publication p on r.publication=p.id where p.type='MONOGRAPH'";
751
		Query q = getSession().createSQLQuery(NUMBERS_AVERAGE_PER_MONOGRAPH);
752
		Double result = (Double) q.list().get(0);
753
		if(result == null) return Double.valueOf(0);
754
		return result;
755
	}
756

    
757
	public Double getAverageAmountPerBookChapter(){
758
		String NUMBERS_AVERAGE_PER_BOOK_CHAPTER = "select avg(apcPaid) from request r join publication p on r.publication=p.id where p.type='BOOK_CHAPTER'";
759
		Query q = getSession().createSQLQuery(NUMBERS_AVERAGE_PER_BOOK_CHAPTER);
760
		Double result = (Double) q.list().get(0);
761
		if(result == null) return Double.valueOf(0);
762
		return result;
763
	}
764

    
765
	public BigInteger getNumberOfPaidRequestsWithDOI() {
766
		String NUMBERS_PAID_REQUESTS_WITH_DOI = "select count(*) from request r join publication p on r.publication=p.id where p.doi is not null " +
767
				"and r.status=" + Request.RequestStatus.ACCOUNTING_PAID.getCode();
768
		Query q = getSession().createSQLQuery(NUMBERS_PAID_REQUESTS_WITH_DOI);
769
		BigInteger result = (BigInteger) q.list().get(0);
770
		if(result == null) return BigInteger.valueOf(0);
771
		return result;
772
	}
773

    
774
	public BigInteger getNumberOfApprovedRequestsWithDOI() {
775
		String NUMBERS_APPROVED_REQUESTS_WITH_DOI = "select count(*) from request r join publication p on r.publication=p.id where p.doi is not null and r.status in (" +
776
				Request.RequestStatus.APPROVED.getCode() + ", " + Request.RequestStatus.ACCOUNTING_PROCESSING.getCode() + ", "
777
				+ Request.RequestStatus.ACCOUNTING_PAID.getCode() + ", " + Request.RequestStatus.CONDITIONALLY_APPROVED.getCode()
778
				+ ", " + Request.RequestStatus.ACCOUNTING_ON_HOLD.getCode() + ", " + Request.RequestStatus.CONDITIONALLY_APPROVED.getCode() + ")";
779

    
780
		Query q = getSession().createSQLQuery(NUMBERS_APPROVED_REQUESTS_WITH_DOI);
781
		BigInteger result = (BigInteger) q.list().get(0);
782
		if(result == null) return BigInteger.valueOf(0);
783
		return result;
784
	}
785

    
786
	public BigInteger getNumberOfPaidPublicationPerArticle(){
787
		String NUMBERS_PAID_ARTICLE_REQUESTS = "select count(*) from request r join publication p on r.publication=p.id where r.status in ("
788
				+ Request.RequestStatus.ACCOUNTING_PAID.getCode() + ") and p.type='ARTICLE'" ;
789
		Query q = getSession().createSQLQuery(NUMBERS_PAID_ARTICLE_REQUESTS);
790
		BigInteger result = (BigInteger) q.list().get(0);
791
		if(result == null) return BigInteger.valueOf(0);
792
		return result;
793
	}
794

    
795
	public BigInteger getNumberOfPaidPublicationPerMonograph(){
796
		String NUMBERS_PAID_MONOGRAPH_REQUESTS = "select count(*) from request r join publication p on r.publication=p.id where r.status in ("
797
				+ Request.RequestStatus.ACCOUNTING_PAID.getCode() + ") and p.type='MONOGRAPH'" ;
798
		Query q = getSession().createSQLQuery(NUMBERS_PAID_MONOGRAPH_REQUESTS);
799
		BigInteger result = (BigInteger) q.list().get(0);
800
		if(result == null) return BigInteger.valueOf(0);
801
		return result;
802
	}
803

    
804
	public BigInteger getNumberOfPaidPublicationPerBookChapter(){
805
		String NUMBERS_PAID_BOOK_CHAPTER_REQUESTS = "select count(*) from request r join publication p on r.publication=p.id where r.status in ("
806
				+ Request.RequestStatus.ACCOUNTING_PAID.getCode() + ") and p.type='BOOK_CHAPTER'" ;
807
		Query q = getSession().createSQLQuery(NUMBERS_PAID_BOOK_CHAPTER_REQUESTS);
808
		BigInteger result = (BigInteger) q.list().get(0);
809
		if(result == null) return BigInteger.valueOf(0);
810
		return result;
811
	}
812

    
813
}
(11-11/12)