285 lines
11 KiB
Java
285 lines
11 KiB
Java
/*******************************************************************************
|
|
* Imixs Workflow Technology
|
|
* Copyright (C) 2003, 2008 Imixs Software Solutions GmbH,
|
|
* http://www.imixs.com
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You can receive a copy of the GNU General Public
|
|
* License at http://www.gnu.org/licenses/gpl.html
|
|
*
|
|
* Contributors:
|
|
* Imixs Software Solutions GmbH - initial API and implementation
|
|
* Ralph Soika
|
|
*
|
|
*******************************************************************************/
|
|
package com.alexanderlogistics;
|
|
|
|
import java.io.Serializable;
|
|
import java.text.DecimalFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
import java.util.logging.Logger;
|
|
|
|
import org.imixs.marty.team.TeamController;
|
|
import org.imixs.workflow.ItemCollection;
|
|
import org.imixs.workflow.office.views.SearchController;
|
|
import org.imixs.workflow.office.views.SearchEvent;
|
|
|
|
import jakarta.enterprise.context.SessionScoped;
|
|
import jakarta.enterprise.event.Observes;
|
|
import jakarta.inject.Inject;
|
|
import jakarta.inject.Named;
|
|
|
|
/**
|
|
* Der CustomSearchController reagiert auf SeachEvents und erweitert das Search
|
|
* Query um Rechnungbetrag von-bis.
|
|
*
|
|
* @author rsoika
|
|
* @version 1.0
|
|
*/
|
|
|
|
@Named
|
|
@SessionScoped
|
|
// @RequestScoped
|
|
public class CustomSearchController implements Serializable {
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
private static Logger logger = Logger.getLogger(CustomSearchController.class.getName());
|
|
|
|
@Inject
|
|
SearchController searchController;
|
|
|
|
@Inject
|
|
TeamController teamController;
|
|
|
|
boolean isArchiveSearch = false;
|
|
|
|
public void init() {
|
|
isArchiveSearch = true;
|
|
}
|
|
|
|
/**
|
|
* Diese Suche schränkt immer auf Archive und Rechnugnscontrolling ein!!
|
|
*
|
|
* @param searchEvent
|
|
*/
|
|
public void onSearchEvent(@Observes SearchEvent searchEvent) {
|
|
|
|
if (!isArchiveSearch) {
|
|
// Keine Anpassung für andere Prozesse
|
|
return;
|
|
}
|
|
|
|
String query = searchEvent.getQuery();
|
|
float invoiceTotal = searchEvent.getSearchFilter().getItemValueFloat("invoice.total");
|
|
Date invoiceDate = searchEvent.getSearchFilter().getItemValueDate("invoice.date");
|
|
Date dueDate = searchEvent.getSearchFilter().getItemValueDate("invoice.duedate");
|
|
Date closingDate = searchEvent.getSearchFilter().getItemValueDate("invoice.closingdate");
|
|
|
|
String cdtrNumber = searchEvent.getSearchFilter().getItemValueString("cdtr.number").trim();
|
|
String invoiceType = searchEvent.getSearchFilter().getItemValueString("invoice.type");
|
|
String invoiceCurrency = searchEvent.getSearchFilter().getItemValueString("invoice.currency").trim();
|
|
|
|
String invoiceNumber = searchEvent.getSearchFilter().getItemValueString("invoice.number");
|
|
|
|
String paymentType = searchEvent.getSearchFilter().getItemValueString("payment.type").trim();
|
|
String sequenceNumber = searchEvent.getSearchFilter().getItemValueString("sequencenumber").trim();
|
|
|
|
query += " (type:\"workitemarchive\") ";
|
|
// process ref= Rechnugnscontorling Prozess
|
|
ItemCollection process = teamController.getProcessByName("Rechnungscontrolling");
|
|
if (process == null) {
|
|
process = teamController.getProcessByName("Invoice Controlling");
|
|
}
|
|
if (process != null) {
|
|
query += " AND ($uniqueidref:\"" + process.getUniqueID() + "\") ";
|
|
}
|
|
|
|
// invoice.total
|
|
if (invoiceTotal != 0) {
|
|
// format form and to with at least one digit
|
|
DecimalFormat decimalFormat = new DecimalFormat("#.00");
|
|
query += " AND (invoice.total:" + decimalFormat.format(invoiceTotal) + ")";
|
|
|
|
}
|
|
|
|
// invoice.date
|
|
if (invoiceDate != null) {
|
|
query += " AND (invoice.date:" + CustomSearchController.getRangeDay(invoiceDate) + ")";
|
|
|
|
}
|
|
|
|
// invoice.duedate
|
|
if (dueDate != null) {
|
|
query += " AND (invoice.duedate:" + CustomSearchController.getRangeDay(dueDate) + ")";
|
|
|
|
}
|
|
|
|
// invoice.closingdate
|
|
if (closingDate != null) {
|
|
query += " AND ($lasteventdate:" + CustomSearchController.getRangeMonth(closingDate) + ")";
|
|
}
|
|
|
|
if (invoiceNumber != null && !invoiceNumber.isEmpty()) {
|
|
query += " AND (invoice.number:" + invoiceNumber + ")";
|
|
}
|
|
|
|
if (paymentType != null && !paymentType.isEmpty()) {
|
|
query += " AND (payment.type:" + paymentType + ")";
|
|
}
|
|
if (sequenceNumber != null && !sequenceNumber.isEmpty()) {
|
|
query += " AND (sequencenumber:" + sequenceNumber + ")";
|
|
}
|
|
|
|
if (invoiceCurrency != null && !invoiceCurrency.isEmpty()) {
|
|
query += " AND (invoice.currency:" + invoiceCurrency + ")";
|
|
}
|
|
|
|
// Rechnungsart
|
|
if (invoiceType != null && !"0".equals(invoiceType)) {
|
|
if ("1".equals(invoiceType)) {
|
|
query += " AND ($workflowgroup:\"Rechnungseingang\" AND NOT payment.type:credit)";
|
|
}
|
|
if ("2".equals(invoiceType)) {
|
|
query += " AND ($workflowgroup:Sachrechnung)";
|
|
}
|
|
if ("3".equals(invoiceType)) {
|
|
query += " AND (($workflowgroup:Rechnungseingang) AND (payment.type:credit))";
|
|
}
|
|
if ("4".equals(invoiceType)) {
|
|
query += " AND ($workflowgroup:\"Gutschrift Abgleich\")";
|
|
}
|
|
}
|
|
|
|
// dbtr.number
|
|
if (cdtrNumber != null && !cdtrNumber.isEmpty()) {
|
|
cdtrNumber = cdtrNumber.trim().toUpperCase();
|
|
if (!cdtrNumber.startsWith("K") && !cdtrNumber.startsWith("D")) {
|
|
query += " AND (cdtr.number:K" + cdtrNumber + " OR dbtr.number:" + cdtrNumber + ")";
|
|
} else {
|
|
if (cdtrNumber.startsWith("K")) {
|
|
// suche nach Kreditor (Eingangsrechnung)
|
|
query += " AND (cdtr.number:" + cdtrNumber + ")";
|
|
} else {
|
|
// suche nach Debitor (Ausgangsrechnung)
|
|
if (cdtrNumber.startsWith("D")) {
|
|
cdtrNumber = cdtrNumber.substring(1);
|
|
}
|
|
query += " AND (dbtr.number:" + cdtrNumber + ")";
|
|
}
|
|
}
|
|
}
|
|
|
|
logger.fine("Custom Query=" + query);
|
|
// Udpate query
|
|
searchEvent.setQuery(query);
|
|
|
|
}
|
|
|
|
/**
|
|
* Sonder AGL Lösung um im Archiv zu bleiben.
|
|
*
|
|
*/
|
|
public String refreshAGLArchive() {
|
|
String phrase = searchController.getSearchFilter().getItemValueString("phrase");
|
|
searchController.refreshSearch();
|
|
searchController.getSearchFilter().setItemValue("type", "workitemarchive");
|
|
String action = "/pages/workitems/agl_archive.xhtml?faces-redirect=true&phrase=" + phrase;
|
|
return action;
|
|
|
|
// String phrase =
|
|
// searchController.getSearchFilter().getItemValueString("phrase");
|
|
|
|
// searchController.getSearchFilter().setItemValue("type", "workitemarchive");
|
|
// try {
|
|
// phrase = URLEncoder.encode(phrase, "UTF-8");
|
|
// } catch (UnsupportedEncodingException e) {
|
|
// logger.severe("unable to encode search phrase!");
|
|
// e.printStackTrace();
|
|
// }
|
|
// String action =
|
|
// "/pages/workitems/agl_archive.xhtml?faces-redirect=true&phrase=" + phrase;
|
|
// searchController.setPageIndex(0);
|
|
// return action;
|
|
}
|
|
|
|
/**
|
|
* This method reset the search filter and the search pageIndex and creates a
|
|
* new bookmarkable search link to the worklist including the current search
|
|
* phrase.
|
|
*
|
|
*/
|
|
public String resetSearch() {
|
|
searchController.reset();
|
|
return refreshAGLArchive();
|
|
}
|
|
|
|
private static String getRangeDay(Date dueDate) {
|
|
// Setze die Uhrzeit auf Mitternacht (00:00)
|
|
Calendar startCalendar = Calendar.getInstance();
|
|
startCalendar.setTime(dueDate);
|
|
startCalendar.set(Calendar.HOUR_OF_DAY, 0);
|
|
startCalendar.set(Calendar.MINUTE, 0);
|
|
startCalendar.set(Calendar.SECOND, 0);
|
|
startCalendar.set(Calendar.MILLISECOND, 0);
|
|
|
|
Date startDate = startCalendar.getTime();
|
|
|
|
// Setze die Uhrzeit auf 23:59:59.999
|
|
Calendar endCalendar = Calendar.getInstance();
|
|
endCalendar.setTime(dueDate);
|
|
endCalendar.set(Calendar.HOUR_OF_DAY, 23);
|
|
endCalendar.set(Calendar.MINUTE, 59);
|
|
endCalendar.set(Calendar.SECOND, 59);
|
|
endCalendar.set(Calendar.MILLISECOND, 999);
|
|
|
|
Date endDate = endCalendar.getTime();
|
|
SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMddHHmm");
|
|
String dateRange = "[" + dateformat.format(startDate) + " TO "
|
|
+ dateformat.format(endDate) + "]";
|
|
|
|
return dateRange;
|
|
}
|
|
|
|
private static String getRangeMonth(Date dueDate) {
|
|
// Setze die Uhrzeit auf Mitternacht (00:00)
|
|
Calendar startCalendar = Calendar.getInstance();
|
|
startCalendar.setTime(dueDate);
|
|
startCalendar.set(Calendar.HOUR_OF_DAY, 0);
|
|
startCalendar.set(Calendar.MINUTE, 0);
|
|
startCalendar.set(Calendar.SECOND, 0);
|
|
startCalendar.set(Calendar.MILLISECOND, 0);
|
|
startCalendar.set(Calendar.DAY_OF_MONTH, 1);
|
|
|
|
Date startDate = startCalendar.getTime();
|
|
|
|
// Setze die Uhrzeit auf 23:59:59.999
|
|
Calendar endCalendar = Calendar.getInstance();
|
|
endCalendar.setTime(dueDate);
|
|
endCalendar.set(Calendar.HOUR_OF_DAY, 23);
|
|
endCalendar.set(Calendar.MINUTE, 59);
|
|
endCalendar.set(Calendar.SECOND, 59);
|
|
endCalendar.set(Calendar.MILLISECOND, 999);
|
|
endCalendar.set(Calendar.DAY_OF_MONTH, 1);
|
|
endCalendar.add(Calendar.MONTH, 1);
|
|
endCalendar.add(Calendar.DAY_OF_MONTH, -1);
|
|
|
|
Date endDate = endCalendar.getTime();
|
|
SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMddHHmm");
|
|
String dateRange = "[" + dateformat.format(startDate) + " TO "
|
|
+ dateformat.format(endDate) + "]";
|
|
|
|
return dateRange;
|
|
}
|
|
}
|