Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 893b665dc2 | |||
| 2a48f440af | |||
| e55d7ad07f | |||
| 48bd9983fc | |||
| c72ab99dc1 | |||
| 4dbe7c47f8 | |||
| 1aeff7f587 | |||
| 70a2e01fae | |||
| fcb8db25fa | |||
| 740847e865 | |||
| 093d359df7 | |||
| ea2708f303 | |||
| 9b2e2b3641 | |||
| a8dc7f1306 | |||
| 7d4d693b2e | |||
| e4013f44ab | |||
| b95cac9ef1 | |||
| 5079d6d55a | |||
| a93c515bc0 | |||
| 1475babaa1 | |||
| b0fb32825b | |||
| 9d59b34900 | |||
| 47e90b4287 | |||
| b276746bac | |||
| f938403cea | |||
| b321b3e25f | |||
| cbb81657c8 | |||
| cd6b8c01dc | |||
| 012ad06358 | |||
| 88e9711154 | |||
| d2aa1cbd9a | |||
| 52cf63414b | |||
| f904e89946 | |||
| 5cae516cb6 | |||
| 6ac6d783fb | |||
| 67ff54d3f1 | |||
| 275e120021 | |||
| d20a72b336 | |||
| e24684bbd0 | |||
| 21bf006c19 | |||
| 970928bb4e | |||
| 369184940b | |||
| cc374a3bf1 | |||
| 66e0c427ac | |||
| 095089d020 | |||
| 84154ccbff | |||
| 1230959854 | |||
| 96154a6b98 | |||
| 14242fa41a | |||
| 67a99d8d78 | |||
| 768d3ee874 |
@@ -24,7 +24,7 @@
|
||||
<repository>
|
||||
<id>fdvsolution.public</id>
|
||||
<name>Dynamic Jasper</name>
|
||||
<url>http://archiva.fdvs.com.ar/repository/public1/</url>
|
||||
<url>http://nexus.fdvs.com.ar/content/groups/public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
@@ -229,6 +229,11 @@
|
||||
<artifactId>hibernate-search</artifactId>
|
||||
<version>4.4.6.Final</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-ehcache</artifactId>
|
||||
<version>4.2.8.Final</version>
|
||||
</dependency>
|
||||
|
||||
<!-- ZK -->
|
||||
<dependency>
|
||||
@@ -407,6 +412,23 @@
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/java</directory>
|
||||
<includes>
|
||||
<include>**/*.xml</include>
|
||||
<include>**/*.js</include>
|
||||
<include>**/*.wpd</include>
|
||||
</includes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<includes>
|
||||
<include>**/*.xml</include>
|
||||
<include>**/*.properties</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
|
||||
@@ -6,6 +6,7 @@ import info.bukova.isspst.data.NumberSeries;
|
||||
import info.bukova.isspst.data.Permission;
|
||||
import info.bukova.isspst.data.RequirementType;
|
||||
import info.bukova.isspst.data.Role;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.data.SettingsData;
|
||||
import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.reporting.Report;
|
||||
@@ -17,6 +18,8 @@ import info.bukova.isspst.services.munits.MUnitService;
|
||||
import info.bukova.isspst.services.numberseries.NumberSeriesService;
|
||||
import info.bukova.isspst.services.requirement.RequirementTypeService;
|
||||
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||
import info.bukova.isspst.services.settings.SeasonException;
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import info.bukova.isspst.services.users.PermissionService;
|
||||
import info.bukova.isspst.services.users.RoleService;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
@@ -29,6 +32,7 @@ import org.springframework.web.context.support.WebApplicationContextUtils;
|
||||
import javax.servlet.ServletContextEvent;
|
||||
import javax.servlet.ServletContextListener;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
public class AppInitListener implements ServletContextListener {
|
||||
@@ -43,6 +47,7 @@ public class AppInitListener implements ServletContextListener {
|
||||
private RequirementTypeService reqTypeService;
|
||||
private GlobalSettingsService gSettingsService;
|
||||
private FullTextService ftService;
|
||||
private SeasonService seasonService;
|
||||
|
||||
@Override
|
||||
public void contextDestroyed(ServletContextEvent arg0) {
|
||||
@@ -64,6 +69,7 @@ public class AppInitListener implements ServletContextListener {
|
||||
gSettingsService = ctx.getBean(GlobalSettingsService.class);
|
||||
reqTypeService = ctx.getBean(RequirementTypeService.class);
|
||||
ftService = ctx.getBean(FullTextService.class);
|
||||
seasonService = ctx.getBean(SeasonService.class);
|
||||
|
||||
userService.grantAdmin();
|
||||
this.checkDbInfo();
|
||||
@@ -286,28 +292,40 @@ public class AppInitListener implements ServletContextListener {
|
||||
}
|
||||
}
|
||||
|
||||
private void checkNumberSeries()
|
||||
{
|
||||
NumberSeries ns = nsService.getNumberSerie(Constants.MOD_REQUIREMENTS);
|
||||
|
||||
if (ns == null)
|
||||
{
|
||||
private void checkNumberSeriesForSeason(Season season) {
|
||||
for (String modId : Constants.NUM_SERIES_PREFIX.keySet()) {
|
||||
NumberSeries ns = nsService.getNumberSerieForSeason(modId, season);
|
||||
if (ns == null) {
|
||||
ns = new NumberSeries();
|
||||
ns.setModule(Constants.MOD_REQUIREMENTS);
|
||||
ns.setPrefix("");
|
||||
ns.setModule(modId);
|
||||
ns.setPrefix(Constants.NUM_SERIES_PREFIX.get(modId));
|
||||
ns.setNumber(1);
|
||||
ns.setSeason(season);
|
||||
nsService.add(ns);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ns = nsService.getNumberSerie(Constants.MOD_ORDER);
|
||||
|
||||
if (ns == null)
|
||||
private void checkNumberSeries()
|
||||
{
|
||||
ns = new NumberSeries();
|
||||
ns.setModule(Constants.MOD_ORDER);
|
||||
ns.setPrefix("");
|
||||
ns.setNumber(1);
|
||||
nsService.add(ns);
|
||||
Season season;
|
||||
try {
|
||||
season = seasonService.getActive();
|
||||
} catch (SeasonException e) {
|
||||
season = null;
|
||||
}
|
||||
|
||||
if (season == null) {
|
||||
season = new Season();
|
||||
Calendar cal = Calendar.getInstance();
|
||||
season.setDescription(String.valueOf(cal.get(Calendar.YEAR)));
|
||||
season.setValidFrom(cal.getTime());
|
||||
season.setActive(true);
|
||||
seasonService.add(season);
|
||||
}
|
||||
|
||||
for (Season s : seasonService.getAllSeasons()) {
|
||||
checkNumberSeriesForSeason(s);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import static org.apache.commons.lang.StringUtils.strip;
|
||||
|
||||
public class BigDecimalUtils
|
||||
{
|
||||
@@ -23,6 +24,17 @@ public class BigDecimalUtils
|
||||
|
||||
String valueS = value.toPlainString();
|
||||
String searchS = search.toPlainString();
|
||||
|
||||
if (valueS.contains(".") || valueS.contains(",")) {
|
||||
valueS = strip(valueS, "0");
|
||||
valueS = strip(valueS, ".,");
|
||||
}
|
||||
|
||||
if (searchS.contains(".") || searchS.contains(",")) {
|
||||
searchS = strip(searchS, "0");
|
||||
searchS = strip(searchS, ".,");
|
||||
}
|
||||
|
||||
boolean result = (valueS.compareTo(searchS) == 0);
|
||||
|
||||
String s = "search='" + searchS + "', value='" + valueS + "', equal=" + (result ? "true" : "false");
|
||||
|
||||
@@ -15,6 +15,7 @@ import info.bukova.isspst.services.addressbook.AdbService;
|
||||
import info.bukova.isspst.services.buildings.BuildingService;
|
||||
import info.bukova.isspst.services.fulltext.FullTextService;
|
||||
import info.bukova.isspst.services.invoicing.InvoicingService;
|
||||
import info.bukova.isspst.services.limits.LimitService;
|
||||
import info.bukova.isspst.services.munits.MUnitService;
|
||||
import info.bukova.isspst.services.orders.ApprovedService;
|
||||
import info.bukova.isspst.services.orders.OrderService;
|
||||
@@ -35,7 +36,7 @@ import java.util.Map;
|
||||
|
||||
public class Constants {
|
||||
|
||||
public final static long DB_VERSION = 5;
|
||||
public final static long DB_VERSION = 7;
|
||||
|
||||
public final static String DEF_ADMIN = "admin";
|
||||
public final static String DEF_ADMIN_PASSWD = "admin";
|
||||
@@ -88,6 +89,7 @@ public class Constants {
|
||||
public final static String MOD_INVOICING = "INVOICING";
|
||||
public final static String MOD_SEARCH = "SEARCH";
|
||||
public final static String MOD_SIGNEDDOCS = "SIGNEDDOCS";
|
||||
public final static String MOD_LIMITS = "LIMITS";
|
||||
public final static Module MODULES[] = {
|
||||
new Module(MOD_USERS, "Uživatelé", UserService.class),
|
||||
new Module(MOD_PERMISSIONS, "Práva", RoleService.class),
|
||||
@@ -106,6 +108,7 @@ public class Constants {
|
||||
new Module(MOD_INVOICING, "Fakturace požadavků", InvoicingService.class),
|
||||
new Module(MOD_SEARCH, "Fulltextové vyhledávání", FullTextService.class, true, false),
|
||||
new Module(MOD_SIGNEDDOCS, "Podepsané dokumenty", SignedDocumentService.class, true, false),
|
||||
new Module(MOD_LIMITS, "Limity komisi", LimitService.class),
|
||||
};
|
||||
|
||||
public final static String PERM_APPROVE = "PERM_APPROVE";
|
||||
@@ -116,6 +119,7 @@ public class Constants {
|
||||
public final static String PERM_EDIT_OWN = "PERM_EDIT_OWN";
|
||||
public final static String PERM_DELETE_NEW = "PERM_DELETE_NEW";
|
||||
public final static String PERM_SEARCH = "PERM_SEARCH";
|
||||
public final static String PERM_PAY_BILL = "PERM_PAY_BILL";
|
||||
|
||||
public final static Permission SPECIAL_PERMISSIONS[] = {
|
||||
new Permission(PERM_EDIT_NEW, "Upravit neschválené", MOD_REQUIREMENTS, PermissionType.GLOBAL),
|
||||
@@ -133,21 +137,40 @@ public class Constants {
|
||||
new Permission(PERM_APPROVE, "Schválení", MOD_TRIPREQUIREMENTS, PermissionType.WORKGROUP),
|
||||
|
||||
new Permission(PERM_SEARCH, "Vyhledávat", MOD_SEARCH, PermissionType.GLOBAL),
|
||||
new Permission(PERM_READ, "Číst", MOD_SIGNEDDOCS, PermissionType.GLOBAL)
|
||||
new Permission(PERM_READ, "Číst", MOD_SIGNEDDOCS, PermissionType.GLOBAL),
|
||||
|
||||
new Permission(PERM_PAY_BILL, "Vyplacení SC", MOD_TRIPBILL, PermissionType.GLOBAL)
|
||||
};
|
||||
|
||||
public final static String DYNAMIC_REPORT_NAME = "Tabulková sestava";
|
||||
public final static ReportMapping REPORTS[] = {
|
||||
new ReportMapping(MOD_ADDRESSBOOK, new Report(1, false, "Adresní karty", "address")),
|
||||
new ReportMapping(MOD_ADDRESSBOOK, new Report(2, false, "Adresa", "address", false, true)),
|
||||
new ReportMapping(MOD_TRIPBILL, new Report(3, false, "Žádost", "tripRequirement", false, true)),
|
||||
new ReportMapping(MOD_TRIPBILL, new Report(7, true, "Žádost o SC", "tripRequirementApp", false, true, "requirement")),
|
||||
new ReportMapping(MOD_TRIPBILL, new Report(4, true, "Vyúčtování", "tripBill", false, true, true)),
|
||||
new ReportMapping(MOD_ORDER, new Report(5, false, "Objednávka", "order", true, true)),
|
||||
new ReportMapping(MOD_REQUIREMENTS, new Report(6, false, "Požadavky", "requirements")),
|
||||
new ReportMapping(MOD_TRIPREQUIREMENTS, new Report(7, true, "Žádost o SC", "tripRequirementApp", false, true)),
|
||||
new ReportMapping(MOD_REQUIREMENTS, new Report(8, true, "Protokol o kontrole", "orderRequirement", false, true))
|
||||
new ReportMapping(MOD_REQUIREMENTS, new Report(8, true, "Protokol o kontrole", "orderRequirement", false, true)),
|
||||
new ReportMapping(MOD_INVOICING, new Report(9, false, "Přehled o protokolech předběžné kontroly", "requirementProtocol")),
|
||||
new ReportMapping(MOD_TRIPREQUIREMENTS, new Report(10, true, "Přehled o protokolech předběžné kontroly", "tripRequirementProtocol"))
|
||||
};
|
||||
|
||||
public final static long TRIB_BILLS_REP_ID = 100;
|
||||
public final static long TRIB_BILLS_NP_REP_ID = 101;
|
||||
|
||||
// pokud je v agnde vic nez jedena podepisovaci sestava, musi se definovat ktera sestava nalezi jake entite
|
||||
public final static Map<Class<?>, Integer> SIGN_REPORT_MAP = Collections.unmodifiableMap(new HashMap<Class<?>, Integer>() {{
|
||||
put(TripBillApproval.class, 4);
|
||||
put(TripRequirement.class, 7);
|
||||
}});
|
||||
|
||||
// vychozi prefixy ciselnych rad. Pokud se prida agenda s vlastni ciselnou radou, je potreba zadefinovat vychozi prefix
|
||||
public final static Map<String, String> NUM_SERIES_PREFIX = Collections.unmodifiableMap(new HashMap<String, String>() {{
|
||||
put(MOD_REQUIREMENTS, "P");
|
||||
put(MOD_ORDER, "O");
|
||||
}});
|
||||
|
||||
public final static String REQTYPE_ORDER = "ORDER";
|
||||
public final static String REQTYPE_BUSINESSTRIP = "BUSINESSTRIP";
|
||||
public final static RequirementType REQTYPES[] = {
|
||||
@@ -162,7 +185,7 @@ public class Constants {
|
||||
public final static Map<Class<?>, String> URL_MAP = Collections.unmodifiableMap(new HashMap<Class<?>, String>() {{
|
||||
put(Requirement.class, "/main/orders/");
|
||||
put(TripRequirement.class, "/main/trips/requirements/");
|
||||
put(TripBillApproval.class, "/main/trips/requirements/");
|
||||
put(TripBillApproval.class, "/main/trips/bill/");
|
||||
put(Order.class, "/main/orders/created/");
|
||||
put(TripBill.class, "/main/trips/bill/");
|
||||
}} );
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
package info.bukova.isspst;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
import org.apache.commons.lang.time.DateUtils;
|
||||
|
||||
public class DateTimeUtils
|
||||
{
|
||||
public static Date getDate(Date value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
public class DateTimeUtils {
|
||||
public static Date getDate(Date value) {
|
||||
if (value == null) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -18,10 +17,18 @@ public class DateTimeUtils
|
||||
return DateUtils.truncate(value, Calendar.DAY_OF_MONTH);
|
||||
}
|
||||
|
||||
public static boolean isEqualByDate(Date d1, Date d2)
|
||||
{
|
||||
if (d1 != null && d2 != null)
|
||||
{
|
||||
public static int getYear(Date value) {
|
||||
if (value == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Calendar cal =Calendar.getInstance();
|
||||
cal.setTime(value);
|
||||
return cal.get(Calendar.YEAR);
|
||||
}
|
||||
|
||||
public static boolean isEqualByDate(Date d1, Date d2) {
|
||||
if (d1 != null && d2 != null) {
|
||||
d1 = DateTimeUtils.getDate(d1);
|
||||
d2 = DateTimeUtils.getDate(d2);
|
||||
boolean equals = (d1.compareTo(d2) == 0);
|
||||
@@ -31,27 +38,98 @@ public class DateTimeUtils
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isEqualByDateForFilter(Date value, Date search)
|
||||
{
|
||||
if (search == null)
|
||||
{
|
||||
return true;
|
||||
public static boolean isEqualByYear(Date d1, Date d2) {
|
||||
if (d1 != null && d2 != null) {
|
||||
int year1 = DateTimeUtils.getYear(d1);
|
||||
int year2 = DateTimeUtils.getYear(d2);
|
||||
boolean equals = (year1 == year2);
|
||||
return equals;
|
||||
}
|
||||
else if (value != null)
|
||||
{
|
||||
|
||||
return false;
|
||||
}
|
||||
public static boolean isEqualByDateForFilter(Date value, Date search) {
|
||||
if (search == null) {
|
||||
return true;
|
||||
} else if (value != null) {
|
||||
return DateTimeUtils.isEqualByDate(value, search);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Date getCurrDateTime()
|
||||
{
|
||||
public static String getFormatedDate(Date value) {
|
||||
if (value == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(StringUtils.localize("DateFormat"));
|
||||
String result = sdf.format(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static String getFormatedDirDate(Date value) {
|
||||
if (value == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
||||
String result = sdf.format(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static String getFormatedDirDateDDMM(Date value) {
|
||||
if (value == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("MMdd");
|
||||
String result = sdf.format(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static String getFormatedYear(Date value) {
|
||||
if (value == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
|
||||
String result = sdf.format(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Date getCurrDateTime() {
|
||||
return new Date();
|
||||
}
|
||||
|
||||
public static Date getCurrDate()
|
||||
{
|
||||
public static Date getCurrDate() {
|
||||
return DateTimeUtils.getDate(DateTimeUtils.getCurrDateTime());
|
||||
}
|
||||
|
||||
public static Calendar getCalendarDelta(Date value, int calendarType, int delta) {
|
||||
if (value == null) {
|
||||
value = DateTimeUtils.getCurrDate();
|
||||
}
|
||||
|
||||
Calendar calendar = new GregorianCalendar();
|
||||
calendar.setTime(value);
|
||||
int deltaValue = calendar.get(calendarType);
|
||||
calendar.set(calendarType, deltaValue + delta);
|
||||
return calendar;
|
||||
}
|
||||
|
||||
public static Calendar getCalendar(Date value) {
|
||||
if (value == null) {
|
||||
value = DateTimeUtils.getCurrDate();
|
||||
}
|
||||
|
||||
Calendar calendar = new GregorianCalendar();
|
||||
calendar.setTime(value);
|
||||
return calendar;
|
||||
}
|
||||
|
||||
public static Date getDateDelta(Date value, int calendarType, int delta) {
|
||||
Calendar calendar = DateTimeUtils.getCalendarDelta(value, calendarType, delta);
|
||||
return calendar.getTime();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ public class SessionData implements Serializable {
|
||||
private static final long serialVersionUID = -764426911263559759L;
|
||||
|
||||
private List<Workgroup> userCentres;
|
||||
private List<Workgroup> userOnlyCentres;
|
||||
private List<Workgroup> userWorkgroups;
|
||||
private User currentUser;
|
||||
private Map<Integer, List<Role>> workgroupRoles;
|
||||
@@ -75,4 +76,12 @@ public class SessionData implements Serializable {
|
||||
public Object getProperty(String key) {
|
||||
return properties.get(key);
|
||||
}
|
||||
|
||||
public List<Workgroup> getUserOnlyCentres() {
|
||||
return userOnlyCentres;
|
||||
}
|
||||
|
||||
public void setUserOnlyCentres(List<Workgroup> userOnlyCentres) {
|
||||
this.userOnlyCentres = userOnlyCentres;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ public class TripBillAprovalUrlResolver implements EntityUrlResolver {
|
||||
if (entity instanceof TripBillApproval) {
|
||||
String url = Constants.URL_MAP.get(entity.getClass());
|
||||
|
||||
return defUrl + url + "?select=" + String.valueOf(((TripBillApproval)entity).getBill().getRequirement().getId());
|
||||
return defUrl + url + "?select=" + String.valueOf(((TripBillApproval)entity).getId());
|
||||
}
|
||||
|
||||
return defUrl + "/app";
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package info.bukova.isspst.dao;
|
||||
|
||||
import info.bukova.isspst.data.Limit;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public interface LimitDao extends BaseDao<Limit> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package info.bukova.isspst.dao;
|
||||
|
||||
import info.bukova.isspst.data.Season;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public interface SeasonDao extends BaseDao<Season> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package info.bukova.isspst.dao.jpa;
|
||||
|
||||
import info.bukova.isspst.dao.LimitDao;
|
||||
import info.bukova.isspst.data.Limit;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class LimitDaoJPA extends BaseDaoJPA<Limit> implements LimitDao {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package info.bukova.isspst.dao.jpa;
|
||||
|
||||
import info.bukova.isspst.dao.SeasonDao;
|
||||
import info.bukova.isspst.data.Season;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class SeasonDaoJPA extends BaseDaoJPA<Season> implements SeasonDao {
|
||||
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import java.util.Date;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.FetchType;
|
||||
@@ -10,9 +13,7 @@ import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.MappedSuperclass;
|
||||
import javax.persistence.Transient;
|
||||
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
import java.util.Date;
|
||||
|
||||
@MappedSuperclass
|
||||
@Indexed
|
||||
@@ -29,10 +30,12 @@ public abstract class BaseData implements OwnedDataModel {
|
||||
@ManyToOne(fetch=FetchType.LAZY)
|
||||
@JoinColumn(name="OWNED_BY_ID")
|
||||
@IndexedEmbedded
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private User ownedBy;
|
||||
@ManyToOne(fetch=FetchType.LAZY)
|
||||
@JoinColumn(name="MODIFIED_BY_ID")
|
||||
@IndexedEmbedded
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private User modifiedBy;
|
||||
@Transient
|
||||
private boolean valid;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import org.hibernate.annotations.Cascade;
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
@@ -11,17 +12,17 @@ import javax.persistence.JoinColumn;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.OneToOne;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name = "INVOICING")
|
||||
public class Invoicing extends BaseData implements Cloneable
|
||||
{
|
||||
|
||||
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
|
||||
@OneToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "REQUIREMENT_ID")
|
||||
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
|
||||
private Requirement requirement;
|
||||
|
||||
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
@@ -69,6 +70,18 @@ public class Invoicing extends BaseData implements Cloneable
|
||||
this.completed = completed;
|
||||
}
|
||||
|
||||
public String getInvoiceNumbers() {
|
||||
String ret = "";
|
||||
for (InvoicingItem invNum : items) {
|
||||
if (!ret.isEmpty()) {
|
||||
ret += ", ";
|
||||
}
|
||||
ret += invNum.getInvoiceNumber();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object clone() throws CloneNotSupportedException
|
||||
{
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
@@ -11,6 +14,7 @@ import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table(name = "JOBMAPPING")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class JobMapping {
|
||||
|
||||
@Id
|
||||
@@ -19,9 +23,11 @@ public class JobMapping {
|
||||
private int id;
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "MEMBER_ID")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private Member member;
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "ROLE_ID")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private Role role;
|
||||
|
||||
public JobMapping() {
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.Table;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
@Entity
|
||||
@Table(name = "LIMITS")
|
||||
public class Limit extends BaseData implements SeasonsAware {
|
||||
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "WORKGROUP_ID")
|
||||
private Workgroup workgroup;
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "SEASON_ID")
|
||||
private Season season;
|
||||
@Column(name = "REQ_LIMIT", precision = 15, scale = 4)
|
||||
private BigDecimal limit;
|
||||
|
||||
public Workgroup getWorkgroup() {
|
||||
return workgroup;
|
||||
}
|
||||
|
||||
public void setWorkgroup(Workgroup workgroup) {
|
||||
this.workgroup = workgroup;
|
||||
}
|
||||
|
||||
public Season getSeason() {
|
||||
return season;
|
||||
}
|
||||
|
||||
public void setSeason(Season season) {
|
||||
this.season = season;
|
||||
}
|
||||
|
||||
public BigDecimal getLimit() {
|
||||
return limit;
|
||||
}
|
||||
|
||||
public void setLimit(BigDecimal limit) {
|
||||
this.limit = limit;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
@@ -15,12 +16,13 @@ import javax.persistence.JoinColumn;
|
||||
import javax.persistence.JoinTable;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.Transient;
|
||||
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public abstract class Member implements DataModel {
|
||||
|
||||
@Id
|
||||
@@ -33,6 +35,7 @@ public abstract class Member implements DataModel {
|
||||
@ManyToMany
|
||||
@LazyCollection(LazyCollectionOption.TRUE)
|
||||
@JoinTable(name="MEMBER_PARENT", joinColumns={@JoinColumn(name="MEMBER_ID")}, inverseJoinColumns={@JoinColumn(name="PARENT_ID")})
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private List<Workgroup> parents;
|
||||
@Transient
|
||||
private boolean valid;
|
||||
|
||||
@@ -2,6 +2,8 @@ package info.bukova.isspst.data;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.OneToOne;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@@ -17,6 +19,10 @@ public class NumberSeries extends BaseSimpleData
|
||||
@Column(name = "NUMBER")
|
||||
private int number;
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "SEASON_ID")
|
||||
private Season season;
|
||||
|
||||
public String getCurrentNumber()
|
||||
{
|
||||
return String.format("%s%06d", this.getPrefix(), this.getNumber());
|
||||
@@ -51,4 +57,12 @@ public class NumberSeries extends BaseSimpleData
|
||||
{
|
||||
this.number = number;
|
||||
}
|
||||
|
||||
public Season getSeason() {
|
||||
return season;
|
||||
}
|
||||
|
||||
public void setSeason(Season season) {
|
||||
this.season = season;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,6 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import javax.persistence.AttributeOverride;
|
||||
import javax.persistence.AttributeOverrides;
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embedded;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
@@ -24,10 +9,26 @@ import org.hibernate.search.annotations.Index;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
|
||||
import javax.persistence.AttributeOverride;
|
||||
import javax.persistence.AttributeOverrides;
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embedded;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name = "ORDERS")
|
||||
@Indexed
|
||||
public class Order extends BaseData implements Cloneable
|
||||
public class Order extends BaseData implements Cloneable, SeasonsAware
|
||||
{
|
||||
|
||||
@Column(name = "NUMSER")
|
||||
@@ -121,6 +122,10 @@ public class Order extends BaseData implements Cloneable
|
||||
@Column(name = "DELIVERED")
|
||||
private boolean delivered;
|
||||
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "SEASON_ID")
|
||||
private Season season;
|
||||
|
||||
public Order()
|
||||
{
|
||||
this.items = new ArrayList<OrderItem>();
|
||||
@@ -288,4 +293,12 @@ public class Order extends BaseData implements Cloneable
|
||||
cloned.setTotal(new BigDecimal(this.getTotal().toString()));
|
||||
return cloned;
|
||||
}
|
||||
|
||||
public Season getSeason() {
|
||||
return season;
|
||||
}
|
||||
|
||||
public void setSeason(Season season) {
|
||||
this.season = season;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
@@ -8,10 +11,9 @@ import javax.persistence.EnumType;
|
||||
import javax.persistence.Enumerated;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
|
||||
@Entity
|
||||
@Table(name="PERMISSION")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class Permission extends BaseSimpleData implements GrantedAuthority {
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
@@ -11,9 +9,10 @@ import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name = "REQUIREMENT")
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
import org.hibernate.search.annotations.Field;
|
||||
import org.hibernate.search.annotations.Index;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
@@ -16,17 +20,14 @@ import javax.persistence.ManyToOne;
|
||||
import javax.persistence.MappedSuperclass;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.OrderBy;
|
||||
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
import org.hibernate.search.annotations.Field;
|
||||
import org.hibernate.search.annotations.Index;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@MappedSuperclass
|
||||
@Indexed
|
||||
public class RequirementBase extends BaseData implements FilterableRequirement {
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class RequirementBase extends BaseData implements FilterableRequirement, SeasonsAware {
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "TYPE_ID")
|
||||
@@ -45,9 +46,11 @@ public class RequirementBase extends BaseData implements FilterableRequirement {
|
||||
private String description;
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "CENTRE_ID")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private Workgroup centre;
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "WORKGROUP_ID")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private Workgroup workgroup;
|
||||
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
@LazyCollection(LazyCollectionOption.TRUE)
|
||||
@@ -56,6 +59,12 @@ public class RequirementBase extends BaseData implements FilterableRequirement {
|
||||
@Column(name = "STATE")
|
||||
@Enumerated(EnumType.ORDINAL)
|
||||
private RequirementState state;
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "SEASON_ID")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private Season season;
|
||||
@Column(name = "APPROVE_DATE")
|
||||
private Date approveDate;
|
||||
|
||||
public RequirementBase() {
|
||||
authorization = new ArrayList<AuthItem>();
|
||||
@@ -152,4 +161,19 @@ public class RequirementBase extends BaseData implements FilterableRequirement {
|
||||
return authorization.get(authorization.size() - 1).getAuthDate();
|
||||
}
|
||||
|
||||
public Season getSeason() {
|
||||
return season;
|
||||
}
|
||||
|
||||
public void setSeason(Season season) {
|
||||
this.season = season;
|
||||
}
|
||||
|
||||
public Date getApproveDate() {
|
||||
return approveDate;
|
||||
}
|
||||
|
||||
public void setApproveDate(Date approveDate) {
|
||||
this.approveDate = approveDate;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
@@ -11,13 +13,12 @@ import javax.persistence.JoinColumn;
|
||||
import javax.persistence.JoinTable;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name="ROLE")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class Role extends BaseSimpleData implements GrantedAuthority, DataModel {
|
||||
|
||||
/**
|
||||
@@ -32,6 +33,7 @@ public class Role extends BaseSimpleData implements GrantedAuthority, DataModel
|
||||
@ManyToMany
|
||||
@LazyCollection(LazyCollectionOption.FALSE)
|
||||
@JoinTable(name="ROLE_PERMISSION", joinColumns={@JoinColumn(name="ROLE_ID")}, inverseJoinColumns={@JoinColumn(name="PERMISSION_ID")})
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private List<Permission> permissions;
|
||||
@Column(name = "WORKGROUP")
|
||||
private boolean workgroup;
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Table;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
@Entity
|
||||
@Table(name = "SEASON")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class Season extends BaseData {
|
||||
@Column(name = "DESCRIPTION")
|
||||
private String description;
|
||||
@Column(name = "VALID_FROM")
|
||||
private Date validFrom;
|
||||
@Column(name = "VALID_TO")
|
||||
private Date validTo;
|
||||
@Column(name = "ACTIVE")
|
||||
private boolean active;
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (!(o instanceof Season)) return false;
|
||||
|
||||
Season season = (Season) o;
|
||||
|
||||
if (getId() != season.getId()) return false;
|
||||
if (active != season.active) return false;
|
||||
if (description != null ? !description.equals(season.description) : season.description != null) return false;
|
||||
if (validFrom != null ? !validFrom.equals(season.validFrom) : season.validFrom != null) return false;
|
||||
if (validTo != null ? !validTo.equals(season.validTo) : season.validTo != null) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = description != null ? description.hashCode() : 0;
|
||||
result = 31 * result + (validFrom != null ? validFrom.hashCode() : 0);
|
||||
result = 31 * result + (validTo != null ? validTo.hashCode() : 0);
|
||||
result = 31 * result + (active ? 1 : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public Date getValidFrom() {
|
||||
return validFrom;
|
||||
}
|
||||
|
||||
public void setValidFrom(Date validFrom) {
|
||||
this.validFrom = validFrom;
|
||||
}
|
||||
|
||||
public Date getValidTo() {
|
||||
return validTo;
|
||||
}
|
||||
|
||||
public void setValidTo(Date validTo) {
|
||||
this.validTo = validTo;
|
||||
}
|
||||
|
||||
public boolean isActive() {
|
||||
return active;
|
||||
}
|
||||
|
||||
public void setActive(boolean active) {
|
||||
this.active = active;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public interface SeasonsAware {
|
||||
public Season getSeason();
|
||||
}
|
||||
@@ -7,11 +7,7 @@ import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
@@ -20,6 +16,9 @@ import java.util.List;
|
||||
@Table(name = "SIGNED_DOCUMENTS")
|
||||
public class SignedDocument extends BaseData {
|
||||
|
||||
@Transient
|
||||
private String agendaName;
|
||||
|
||||
@Column(name = "MODULE_NAME", length = Constants.LEN_TEXT)
|
||||
private String moduleName;
|
||||
|
||||
@@ -40,6 +39,9 @@ public class SignedDocument extends BaseData {
|
||||
@IndexedEmbedded
|
||||
private List<SignedDocumentItem> items;
|
||||
|
||||
public SignedDocument() {
|
||||
}
|
||||
|
||||
public String getModuleName() {
|
||||
return moduleName;
|
||||
}
|
||||
@@ -81,6 +83,9 @@ public class SignedDocument extends BaseData {
|
||||
}
|
||||
|
||||
public String getAgendaName() {
|
||||
if (!StringUtils.isNullOrEmpty(this.agendaName)) {
|
||||
return this.agendaName;
|
||||
}
|
||||
|
||||
if (StringUtils.isNullOrEmpty(this.moduleName)) {
|
||||
return "";
|
||||
@@ -95,6 +100,10 @@ public class SignedDocument extends BaseData {
|
||||
return "";
|
||||
}
|
||||
|
||||
public void setAgendaName(String agendaName) {
|
||||
this.agendaName = agendaName;
|
||||
}
|
||||
|
||||
public List<SignedDocumentItem> getItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.storage.EntityWithAttachment;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
@@ -15,6 +17,7 @@ import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.OneToOne;
|
||||
import javax.persistence.Table;
|
||||
@@ -26,10 +29,12 @@ import java.util.List;
|
||||
@Entity
|
||||
@Table(name = "TRIP_BILL")
|
||||
@Indexed
|
||||
public class TripBill extends BaseData implements EntityWithAttachment {
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class TripBill extends BaseData implements EntityWithAttachment, SeasonsAware {
|
||||
|
||||
@OneToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "REQUIREMENT_ID")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private TripRequirement requirement;
|
||||
@Column(name = "RESULT_MESSAGE_DATE")
|
||||
private Date resultMessageDate;
|
||||
@@ -60,11 +65,19 @@ public class TripBill extends BaseData implements EntityWithAttachment {
|
||||
@LazyCollection(LazyCollectionOption.TRUE)
|
||||
@IndexedEmbedded
|
||||
private List<FileMetainfo> attachedFiles;
|
||||
@OneToOne(fetch = FetchType.EAGER)
|
||||
@OneToOne(fetch = FetchType.EAGER, orphanRemoval = true)
|
||||
@JoinColumn(name = "APPROVAL_ID")
|
||||
private TripBillApproval approval;
|
||||
@Column(name = "SAVED")
|
||||
private Boolean saved; // Nastaveno na true, pokud uživatel udělá změnu- nepřenáší se pak částky od žadatele
|
||||
@Column(name = "PAID")
|
||||
private Boolean paid;
|
||||
@Column(name = "PAID_DATE")
|
||||
private Date paidDate;
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "SEASON_ID")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private Season season;
|
||||
|
||||
public TripBill() {
|
||||
billItems = new ArrayList<TripBillItem>();
|
||||
@@ -186,4 +199,29 @@ public class TripBill extends BaseData implements EntityWithAttachment {
|
||||
public void setSaved(Boolean saved) {
|
||||
this.saved = saved;
|
||||
}
|
||||
|
||||
public Boolean getPaid() {
|
||||
return paid;
|
||||
}
|
||||
|
||||
public void setPaid(Boolean paid) {
|
||||
this.paid = paid;
|
||||
}
|
||||
|
||||
public Date getPaidDate() {
|
||||
return paidDate;
|
||||
}
|
||||
|
||||
public void setPaidDate(Date paidDate) {
|
||||
this.paidDate = paidDate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Season getSeason() {
|
||||
return season;
|
||||
}
|
||||
|
||||
public void setSeason(Season season) {
|
||||
this.season = season;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ import javax.persistence.FetchType;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.OneToOne;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Transient;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
@@ -17,6 +19,26 @@ public class TripBillApproval extends RequirementBase {
|
||||
@OneToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "TRIPBILL_ID")
|
||||
private TripBill bill;
|
||||
@Transient
|
||||
private boolean billForPassenger;
|
||||
@Transient
|
||||
private Date tripDate;
|
||||
|
||||
public boolean isBillForPassenger() {
|
||||
return billForPassenger;
|
||||
}
|
||||
|
||||
public void setBillForPassenger(boolean billForPassenger) {
|
||||
this.billForPassenger = billForPassenger;
|
||||
}
|
||||
|
||||
public Date getTripDate() {
|
||||
return tripDate;
|
||||
}
|
||||
|
||||
public void setTripDate(Date tripDate) {
|
||||
this.tripDate = tripDate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNumser() {
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.storage.EntityWithAttachment;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
import org.hibernate.search.annotations.Field;
|
||||
import org.hibernate.search.annotations.Index;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
@@ -16,14 +18,10 @@ import javax.persistence.JoinTable;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
import org.hibernate.search.annotations.Field;
|
||||
import org.hibernate.search.annotations.Index;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.hibernate.search.annotations.IndexedEmbedded;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name = "TRIPREQUIREMENT")
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
import org.hibernate.search.annotations.Field;
|
||||
import org.hibernate.search.annotations.Index;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embedded;
|
||||
@@ -13,16 +17,13 @@ import javax.persistence.JoinColumn;
|
||||
import javax.persistence.JoinTable;
|
||||
import javax.persistence.ManyToMany;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.search.annotations.Analyze;
|
||||
import org.hibernate.search.annotations.Field;
|
||||
import org.hibernate.search.annotations.Index;
|
||||
import org.hibernate.search.annotations.Indexed;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name="USER")
|
||||
@Indexed
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class User extends Member implements UserDetails, DataModel {
|
||||
|
||||
/**
|
||||
@@ -50,6 +51,7 @@ public class User extends Member implements UserDetails, DataModel {
|
||||
private boolean notify;
|
||||
@ManyToMany(fetch=FetchType.EAGER)
|
||||
@JoinTable(name="USER_ROLE", joinColumns={@JoinColumn(name="USER_ID")}, inverseJoinColumns={@JoinColumn(name="ROLE_ID")})
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private List<Role> authorities;
|
||||
@Column(name="SETTINGS", length=1048576)
|
||||
private String settings;
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
package info.bukova.isspst.data;
|
||||
|
||||
import info.bukova.isspst.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Column;
|
||||
@@ -17,12 +16,14 @@ import javax.persistence.ManyToMany;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Transient;
|
||||
|
||||
import org.hibernate.annotations.LazyCollection;
|
||||
import org.hibernate.annotations.LazyCollectionOption;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name = "WORKGROUP")
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public class Workgroup extends Member implements OwnedDataModel, Serializable {
|
||||
|
||||
/**
|
||||
@@ -37,6 +38,7 @@ public class Workgroup extends Member implements OwnedDataModel, Serializable {
|
||||
@ManyToMany(cascade = {CascadeType.ALL})
|
||||
@LazyCollection(LazyCollectionOption.TRUE)
|
||||
@JoinTable(name="WORKGROUP_MEMBER", joinColumns={@JoinColumn(name="WORKGROUP_ID")}, inverseJoinColumns={@JoinColumn(name="JOBMAPPING_ID")})
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
private List<JobMapping> members;
|
||||
@Column(name = "CENTRE")
|
||||
private boolean centre;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package info.bukova.isspst.filters;
|
||||
|
||||
import info.bukova.isspst.BigDecimalUtils;
|
||||
import info.bukova.isspst.BooleanUtils;
|
||||
import info.bukova.isspst.DateTimeUtils;
|
||||
import info.bukova.isspst.StringUtils;
|
||||
@@ -48,7 +49,8 @@ public class RequirementFilter implements Filter<Requirement>
|
||||
boolean foundDeliveryDate = DateTimeUtils.isEqualByDateForFilter(item.getDeliveryDate(), condition.getDeliveryDate());
|
||||
boolean foundUser = User.isEqualByUserForFilter(item.getOwnedBy(), condition.getOwnedBy());
|
||||
boolean foundProject = BooleanUtils.isEqualByBooleanValue(item.getProject(), condition.getProject());
|
||||
return (foundNumser && foundReqDate && foundCenter && foundDescription && foundDeliveryDate && foundUser && foundProject);
|
||||
boolean foundSumTotal = BigDecimalUtils.isEqualByDecimalForFilter(item.getSumTotal(), condition.getSumTotal());
|
||||
return (foundNumser && foundReqDate && foundCenter && foundDescription && foundDeliveryDate && foundUser && foundProject && foundSumTotal);
|
||||
}
|
||||
|
||||
@Factory
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
package info.bukova.isspst.filters;
|
||||
|
||||
import info.bukova.isspst.BooleanUtils;
|
||||
import info.bukova.isspst.DateTimeUtils;
|
||||
import info.bukova.isspst.StringUtils;
|
||||
import info.bukova.isspst.data.TripBillApproval;
|
||||
import info.bukova.isspst.data.User;
|
||||
import org.hamcrest.Description;
|
||||
import org.hamcrest.Factory;
|
||||
import org.hamcrest.Matcher;
|
||||
import org.hamcrest.TypeSafeMatcher;
|
||||
|
||||
public class TripBillApprovalFilter implements Filter<TripBillApproval>
|
||||
{
|
||||
|
||||
private TripBillApproval condition;
|
||||
|
||||
public TripBillApprovalFilter(TripBillApproval cond)
|
||||
{
|
||||
this.condition = cond;
|
||||
}
|
||||
|
||||
private static class TripBillApprovalMatcher extends TypeSafeMatcher<TripBillApproval>
|
||||
{
|
||||
|
||||
private TripBillApproval condition;
|
||||
|
||||
public TripBillApprovalMatcher(TripBillApproval cond)
|
||||
{
|
||||
this.condition = cond;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void describeTo(Description desc)
|
||||
{
|
||||
desc.appendText("requirement matches");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matchesSafely(TripBillApproval item)
|
||||
{
|
||||
if (item.getBill() == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean foundNumser = StringUtils.isEqualForFilter(item.getNumser(), condition.getNumser());
|
||||
boolean foundReqDate = DateTimeUtils.isEqualByDateForFilter(item.getBill().getRequirement().getReqDate(), condition.getBill().getRequirement().getReqDate());
|
||||
boolean foundDescription = StringUtils.isEqualForFilter(item.getDescription(), condition.getDescription());
|
||||
boolean foundFrom = StringUtils.isEqualForFilter(item.getBill().getRequirement().getFrom(), condition.getBill().getRequirement().getFrom());
|
||||
boolean foundTo = StringUtils.isEqualForFilter(item.getBill().getRequirement().getTo(), condition.getBill().getRequirement().getTo());
|
||||
boolean foundWorkgroup = (condition.getWorkgroup() == null ||(item.getWorkgroup() != null && item.getWorkgroup().equals(condition.getWorkgroup())));
|
||||
boolean foundCentre = (condition.getCentre() == null || (item.getCentre() != null && item.getCentre().equals(condition.getCentre())));
|
||||
boolean foundOwner = User.isEqualByUserForFilter(item.getBill().getOwnedBy(), condition.getBill().getOwnedBy());
|
||||
boolean foundPaid = BooleanUtils.isEqualByBooleanValue(item.getBill().getPaid(), condition.getBill().getPaid());
|
||||
boolean foundPaidDate = DateTimeUtils.isEqualByDateForFilter(item.getBill().getPaidDate(), condition.getBill().getPaidDate());
|
||||
boolean foundPassenger = (item.getBill().getOwnedBy() != item.getBill().getRequirement().getOwnedBy()) == condition.isBillForPassenger();
|
||||
boolean foundApproveDate = DateTimeUtils.isEqualByDateForFilter(item.getApproveDate(), condition.getApproveDate());
|
||||
boolean foundTripDate = DateTimeUtils.isEqualByDateForFilter(item.getBill().getRequirement().getTripDate(), condition.getTripDate());
|
||||
return foundNumser && foundReqDate && foundDescription && foundFrom && foundTo && foundWorkgroup && foundCentre && foundOwner && foundPaid
|
||||
&& foundPaidDate && foundPassenger && foundApproveDate && foundTripDate;
|
||||
}
|
||||
|
||||
@Factory
|
||||
public static Matcher<TripBillApproval> matchTripRequirement(TripBillApproval building)
|
||||
{
|
||||
return new TripBillApprovalMatcher(building);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TripBillApprovalMatcher matcher()
|
||||
{
|
||||
return new TripBillApprovalMatcher(condition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String queryString()
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -12,8 +12,10 @@ import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||
import info.bukova.isspst.services.tripbill.TripBillApprovalService;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.storage.FileStorage;
|
||||
import net.sf.jasperreports.engine.JRParameter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -31,6 +33,8 @@ public class ParamFiller {
|
||||
private GlobalSettingsService settingService;
|
||||
@Autowired
|
||||
private TripBillApprovalService tripBillApprovalService;
|
||||
@Autowired
|
||||
private HttpServletRequest req;
|
||||
|
||||
public void fill() {
|
||||
if (definition.getDataSet() == null || definition.getDataSet().isEmpty()) {
|
||||
@@ -95,6 +99,7 @@ public class ParamFiller {
|
||||
}
|
||||
|
||||
definition.setParam("P_LOGO", storage.serverPath(settingService.getSettings().getLogoFile()));
|
||||
definition.setParam(JRParameter.REPORT_LOCALE, req.getLocale());
|
||||
|
||||
Address mainAddress = settingService.getSettings().getMainAddress();
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ public class Report {
|
||||
private boolean hasSettings;
|
||||
private boolean singleRecord;
|
||||
private boolean hasCondition;
|
||||
private String property;
|
||||
|
||||
public Report() {
|
||||
this.reportId = 0;
|
||||
@@ -60,6 +61,11 @@ public class Report {
|
||||
this.singleRecord = singleRecord;
|
||||
}
|
||||
|
||||
public Report(long reportId, boolean signable, String name, String jasperFile, boolean hasSettings, boolean singleRecord, String property) {
|
||||
this(reportId, signable, name, jasperFile, hasSettings, singleRecord);
|
||||
this.property = property;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param reportId
|
||||
@@ -138,4 +144,12 @@ public class Report {
|
||||
public void setSignable(boolean signable) {
|
||||
this.signable = signable;
|
||||
}
|
||||
|
||||
public String getProperty() {
|
||||
return property;
|
||||
}
|
||||
|
||||
public void setProperty(String property) {
|
||||
this.property = property;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +73,9 @@ public class ReportController {
|
||||
} catch (ReportException e) {
|
||||
logger.error("Report generation error: " + e.getMessage());
|
||||
writeError(os, e);
|
||||
} catch (Exception e) {
|
||||
logger.error("Report generation error: " + e.getMessage());
|
||||
writeError(os, e);
|
||||
} finally {
|
||||
if (os != null) {
|
||||
try {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package info.bukova.isspst.reporting;
|
||||
|
||||
import com.lowagie.text.Rectangle;
|
||||
import com.lowagie.text.pdf.PdfAnnotation;
|
||||
import com.lowagie.text.pdf.PdfFormField;
|
||||
import com.lowagie.text.pdf.PdfName;
|
||||
import net.sf.jasperreports.engine.JRGenericPrintElement;
|
||||
@@ -27,7 +26,8 @@ public class SignaturePdfHandler implements GenericElementPdfHandler, GenericEle
|
||||
|
||||
@Override
|
||||
public void exportElement(JRPdfExporterContext exporterContext, JRGenericPrintElement element) {
|
||||
PdfFormField field = PdfFormField.createSignature(exporterContext.getPdfWriter());
|
||||
//PdfFormField field = PdfFormField.createSignature(exporterContext.getPdfWriter());
|
||||
PdfFormField field = PdfFormField.createTextField(exporterContext.getPdfWriter(), true, false, 255);
|
||||
Object param = element.getParameterValue("index");
|
||||
String index = param != null ? String.valueOf(param) : null;
|
||||
|
||||
@@ -37,7 +37,9 @@ public class SignaturePdfHandler implements GenericElementPdfHandler, GenericEle
|
||||
field.setFieldName("signature");
|
||||
}
|
||||
|
||||
field.setFieldFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_LOCKED);
|
||||
field.put(PdfName.V, exporterContext.getPdfWriter().getPdfIndirectReference());
|
||||
field.setFieldFlags(PdfFormField.FF_READ_ONLY);
|
||||
|
||||
field.setWidget(new Rectangle(element.getX(),
|
||||
exporterContext.getExportedReport().getPageHeight() - element.getY(),
|
||||
element.getX() + element.getWidth(),
|
||||
|
||||
@@ -0,0 +1,306 @@
|
||||
package info.bukova.isspst.security;
|
||||
|
||||
import org.springframework.ldap.core.DirContextOperations;
|
||||
import org.springframework.ldap.core.DistinguishedName;
|
||||
import org.springframework.ldap.support.LdapUtils;
|
||||
import org.springframework.security.authentication.AccountExpiredException;
|
||||
import org.springframework.security.authentication.BadCredentialsException;
|
||||
import org.springframework.security.authentication.CredentialsExpiredException;
|
||||
import org.springframework.security.authentication.DisabledException;
|
||||
import org.springframework.security.authentication.LockedException;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.authority.AuthorityUtils;
|
||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||
import org.springframework.security.ldap.SpringSecurityLdapTemplate;
|
||||
import org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.naming.AuthenticationException;
|
||||
import javax.naming.Context;
|
||||
import javax.naming.NamingException;
|
||||
import javax.naming.OperationNotSupportedException;
|
||||
import javax.naming.directory.DirContext;
|
||||
import javax.naming.directory.SearchControls;
|
||||
import javax.naming.ldap.InitialLdapContext;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Hashtable;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class AdAuthenticationProvider extends AbstractLdapAuthenticationProvider{
|
||||
private static final Pattern SUB_ERROR_CODE = Pattern.compile(".*data\\s([0-9a-f]{3,4}).*");
|
||||
|
||||
// Error codes
|
||||
private static final int USERNAME_NOT_FOUND = 0x525;
|
||||
private static final int INVALID_PASSWORD = 0x52e;
|
||||
private static final int NOT_PERMITTED = 0x530;
|
||||
private static final int PASSWORD_EXPIRED = 0x532;
|
||||
private static final int ACCOUNT_DISABLED = 0x533;
|
||||
private static final int ACCOUNT_EXPIRED = 0x701;
|
||||
private static final int PASSWORD_NEEDS_RESET = 0x773;
|
||||
private static final int ACCOUNT_LOCKED = 0x775;
|
||||
|
||||
private final String domain;
|
||||
private final String rootDn;
|
||||
private final String url;
|
||||
private final String upnSuffix;
|
||||
private boolean convertSubErrorCodesToExceptions;
|
||||
|
||||
// Only used to allow tests to substitute a mock LdapContext
|
||||
ContextFactory contextFactory = new ContextFactory();
|
||||
|
||||
/**
|
||||
* @param domain the domain for which authentication should take place
|
||||
*/
|
||||
// public ActiveDirectoryLdapAuthenticationProvider(String domain) {
|
||||
// this (domain, null);
|
||||
// }
|
||||
|
||||
/**
|
||||
* @param domain the domain name (may be null or empty)
|
||||
* @param url an LDAP url (or multiple URLs)
|
||||
*/
|
||||
public AdAuthenticationProvider(String domain, String upnSuffix, String url) {
|
||||
Assert.isTrue(StringUtils.hasText(url), "Url cannot be empty");
|
||||
this.domain = StringUtils.hasText(domain) ? domain.toLowerCase() : null;
|
||||
//this.url = StringUtils.hasText(url) ? url : null;
|
||||
this.url = url;
|
||||
this.upnSuffix = upnSuffix;
|
||||
rootDn = this.domain == null ? null : rootDnFromDomain(this.domain);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DirContextOperations doAuthentication(UsernamePasswordAuthenticationToken auth) {
|
||||
String username = auth.getName();
|
||||
String password = (String)auth.getCredentials();
|
||||
|
||||
DirContext ctx = bindAsUser(username, password);
|
||||
|
||||
try {
|
||||
return searchForUser(ctx, username);
|
||||
|
||||
} catch (NamingException e) {
|
||||
logger.error("Failed to locate directory entry for authenticated user: " + username, e);
|
||||
throw badCredentials();
|
||||
} finally {
|
||||
LdapUtils.closeContext(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the user authority list from the values of the {@code memberOf} attribute obtained from the user's
|
||||
* Active Directory entry.
|
||||
*/
|
||||
@Override
|
||||
protected Collection<? extends GrantedAuthority> loadUserAuthorities(DirContextOperations userData, String username, String password) {
|
||||
String[] groups = userData.getStringAttributes("memberOf");
|
||||
|
||||
if (groups == null) {
|
||||
logger.debug("No values for 'memberOf' attribute.");
|
||||
|
||||
return AuthorityUtils.NO_AUTHORITIES;
|
||||
}
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("'memberOf' attribute values: " + Arrays.asList(groups));
|
||||
}
|
||||
|
||||
ArrayList<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(groups.length);
|
||||
|
||||
for (String group : groups) {
|
||||
authorities.add(new SimpleGrantedAuthority(new DistinguishedName(group).removeLast().getValue()));
|
||||
}
|
||||
|
||||
return authorities;
|
||||
}
|
||||
|
||||
private DirContext bindAsUser(String username, String password) {
|
||||
// TODO. add DNS lookup based on domain
|
||||
final String bindUrl = url;
|
||||
|
||||
Hashtable<String,String> env = new Hashtable<String,String>();
|
||||
env.put(Context.SECURITY_AUTHENTICATION, "simple");
|
||||
String bindPrincipal = createBindPrincipal(username);
|
||||
env.put(Context.SECURITY_PRINCIPAL, bindPrincipal);
|
||||
env.put(Context.PROVIDER_URL, bindUrl);
|
||||
env.put(Context.SECURITY_CREDENTIALS, password);
|
||||
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
|
||||
|
||||
try {
|
||||
return contextFactory.createContext(env);
|
||||
} catch (NamingException e) {
|
||||
if ((e instanceof AuthenticationException) || (e instanceof OperationNotSupportedException)) {
|
||||
handleBindException(bindPrincipal, e);
|
||||
throw badCredentials();
|
||||
} else {
|
||||
throw LdapUtils.convertLdapException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void handleBindException(String bindPrincipal, NamingException exception) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Authentication for " + bindPrincipal + " failed:" + exception);
|
||||
}
|
||||
|
||||
int subErrorCode = parseSubErrorCode(exception.getMessage());
|
||||
|
||||
if (subErrorCode > 0) {
|
||||
logger.info("Active Directory authentication failed: " + subCodeToLogMessage(subErrorCode));
|
||||
|
||||
if (convertSubErrorCodesToExceptions) {
|
||||
raiseExceptionForErrorCode(subErrorCode);
|
||||
}
|
||||
} else {
|
||||
logger.debug("Failed to locate AD-specific sub-error code in message");
|
||||
}
|
||||
}
|
||||
|
||||
int parseSubErrorCode(String message) {
|
||||
Matcher m = SUB_ERROR_CODE.matcher(message);
|
||||
|
||||
if (m.matches()) {
|
||||
return Integer.parseInt(m.group(1), 16);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void raiseExceptionForErrorCode(int code) {
|
||||
switch (code) {
|
||||
case PASSWORD_EXPIRED:
|
||||
throw new CredentialsExpiredException(messages.getMessage("LdapAuthenticationProvider.credentialsExpired",
|
||||
"User credentials have expired"));
|
||||
case ACCOUNT_DISABLED:
|
||||
throw new DisabledException(messages.getMessage("LdapAuthenticationProvider.disabled",
|
||||
"User is disabled"));
|
||||
case ACCOUNT_EXPIRED:
|
||||
throw new AccountExpiredException(messages.getMessage("LdapAuthenticationProvider.expired",
|
||||
"User account has expired"));
|
||||
case ACCOUNT_LOCKED:
|
||||
throw new LockedException(messages.getMessage("LdapAuthenticationProvider.locked",
|
||||
"User account is locked"));
|
||||
}
|
||||
}
|
||||
|
||||
String subCodeToLogMessage(int code) {
|
||||
switch (code) {
|
||||
case USERNAME_NOT_FOUND:
|
||||
return "User was not found in directory";
|
||||
case INVALID_PASSWORD:
|
||||
return "Supplied password was invalid";
|
||||
case NOT_PERMITTED:
|
||||
return "User not permitted to logon at this time";
|
||||
case PASSWORD_EXPIRED:
|
||||
return "Password has expired";
|
||||
case ACCOUNT_DISABLED:
|
||||
return "Account is disabled";
|
||||
case ACCOUNT_EXPIRED:
|
||||
return "Account expired";
|
||||
case PASSWORD_NEEDS_RESET:
|
||||
return "User must reset password";
|
||||
case ACCOUNT_LOCKED:
|
||||
return "Account locked";
|
||||
}
|
||||
|
||||
return "Unknown (error code " + Integer.toHexString(code) +")";
|
||||
}
|
||||
|
||||
private BadCredentialsException badCredentials() {
|
||||
return new BadCredentialsException(messages.getMessage(
|
||||
"LdapAuthenticationProvider.badCredentials", "Bad credentials"));
|
||||
}
|
||||
|
||||
private DirContextOperations searchForUser(DirContext ctx, String username) throws NamingException {
|
||||
SearchControls searchCtls = new SearchControls();
|
||||
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
|
||||
|
||||
String searchFilter = "(&(objectClass=user)(userPrincipalName={0}))";
|
||||
|
||||
final String bindPrincipal = createBindPrincipal(username);
|
||||
final String searchDn = createSearchDn(username);
|
||||
|
||||
String searchRoot = rootDn != null ? rootDn : searchRootFromPrincipal(bindPrincipal);
|
||||
|
||||
DirContextOperations ctxOp;
|
||||
|
||||
try {
|
||||
ctxOp = SpringSecurityLdapTemplate.searchForSingleEntryInternal(ctx, searchCtls, searchRoot, searchFilter,
|
||||
new Object[]{searchDn});
|
||||
|
||||
if (ctxOp != null) {
|
||||
return ctxOp;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.warn("UPN " + searchDn + " not found. Falling back to search with domain UPN suffix.");
|
||||
}
|
||||
|
||||
return SpringSecurityLdapTemplate.searchForSingleEntryInternal(ctx, searchCtls, searchRoot, searchFilter,
|
||||
new Object[]{bindPrincipal});
|
||||
}
|
||||
|
||||
private String searchRootFromPrincipal(String bindPrincipal) {
|
||||
int atChar = bindPrincipal.lastIndexOf('@');
|
||||
|
||||
if (atChar < 0) {
|
||||
logger.debug("User principal '" + bindPrincipal + "' does not contain the domain, and no domain has been configured");
|
||||
throw badCredentials();
|
||||
}
|
||||
|
||||
return rootDnFromDomain(bindPrincipal.substring(atChar+ 1, bindPrincipal.length()));
|
||||
}
|
||||
|
||||
private String rootDnFromDomain(String domain) {
|
||||
String[] tokens = StringUtils.tokenizeToStringArray(domain, ".");
|
||||
StringBuilder root = new StringBuilder();
|
||||
|
||||
for (String token : tokens) {
|
||||
if (root.length() > 0) {
|
||||
root.append(',');
|
||||
}
|
||||
root.append("dc=").append(token);
|
||||
}
|
||||
|
||||
return root.toString();
|
||||
}
|
||||
|
||||
String createBindPrincipal(String username) {
|
||||
if (domain == null || username.toLowerCase().endsWith(domain)) {
|
||||
return username;
|
||||
}
|
||||
|
||||
return username + "@" + domain;
|
||||
}
|
||||
|
||||
String createSearchDn(String username) {
|
||||
if (upnSuffix == null) {
|
||||
return createBindPrincipal(username);
|
||||
}
|
||||
|
||||
return username + "@" + upnSuffix;
|
||||
}
|
||||
|
||||
/**
|
||||
* By default, a failed authentication (LDAP error 49) will result in a {@code BadCredentialsException}.
|
||||
* <p>
|
||||
* If this property is set to {@code true}, the exception message from a failed bind attempt will be parsed
|
||||
* for the AD-specific error code and a {@link CredentialsExpiredException}, {@link DisabledException},
|
||||
* {@link AccountExpiredException} or {@link LockedException} will be thrown for the corresponding codes. All
|
||||
* other codes will result in the default {@code BadCredentialsException}.
|
||||
*
|
||||
* @param convertSubErrorCodesToExceptions {@code true} to raise an exception based on the AD error code.
|
||||
*/
|
||||
public void setConvertSubErrorCodesToExceptions(boolean convertSubErrorCodesToExceptions) {
|
||||
this.convertSubErrorCodesToExceptions = convertSubErrorCodesToExceptions;
|
||||
}
|
||||
|
||||
static class ContextFactory {
|
||||
DirContext createContext(Hashtable<?,?> env) throws NamingException {
|
||||
return new InitialLdapContext(env, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,16 +7,6 @@ import info.bukova.isspst.data.UserSettingsData;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -24,6 +14,14 @@ import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
|
||||
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
|
||||
|
||||
@Autowired
|
||||
@@ -45,6 +43,7 @@ public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessH
|
||||
logger.info("User " + u.getUsername() + " logged in");
|
||||
|
||||
sessionData.setUserCentres(workgroupService.getUserCentres((User) auth.getPrincipal()));
|
||||
sessionData.setUserOnlyCentres(workgroupService.getUserCentres((User) auth.getPrincipal(), true));
|
||||
sessionData.setUserWorkgroups(workgroupService.getUserWorkgroups((User) auth.getPrincipal()));
|
||||
workgroupService.loadParents(u);
|
||||
sessionData.setCurrentUser(u);
|
||||
|
||||
@@ -38,6 +38,8 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
|
||||
@Autowired
|
||||
protected SessionData sessionData;
|
||||
@Autowired
|
||||
protected HqlDataFilter hqlFilter;
|
||||
@Autowired
|
||||
protected QueryDao queryDao;
|
||||
private DocumentFileStorage documentFileStorage;
|
||||
|
||||
@@ -88,6 +90,50 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
|
||||
}
|
||||
}
|
||||
|
||||
protected Query filterQuery(Query q) {
|
||||
return filterQuery(q, null);
|
||||
}
|
||||
|
||||
protected Query filterQuery(Query q, HqlDataFilter aditFilter) {
|
||||
HqlDataFilter f = hqlFilter;
|
||||
try {
|
||||
if (((f.getWhere() == null || f.getWhere().isEmpty())
|
||||
&& (f.getOrderBy() == null || f.getOrderBy().isEmpty()))
|
||||
&& ((aditFilter.getWhere() == null || aditFilter.getWhere().isEmpty())
|
||||
&& (aditFilter.getOrderBy() == null || aditFilter.getOrderBy().isEmpty()))) {
|
||||
return q;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
f = new HqlDataFilter(); // pri volani mimo web request filtr z requestu neresime
|
||||
}
|
||||
|
||||
boolean isAplicable = false;
|
||||
if (f.getDataClass() != null) {
|
||||
for (Class<?> clazz : getEntityClasses()) {
|
||||
if (f.getDataClass().isAssignableFrom(clazz)) {
|
||||
isAplicable = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String hql;
|
||||
if (isAplicable) {
|
||||
hql = HqlUtils.buildHql(q.getQueryString(), f);
|
||||
} else {
|
||||
hql = q.getQueryString();
|
||||
}
|
||||
|
||||
hql = HqlUtils.addOrderBy(HqlUtils.addAndWhere(hql, aditFilter), aditFilter);
|
||||
Query newQuery = dao.getQuery(hql);
|
||||
|
||||
if (isAplicable) {
|
||||
HqlUtils.addParameters(newQuery, f);
|
||||
}
|
||||
|
||||
HqlUtils.addParameters(newQuery, aditFilter);
|
||||
return newQuery;
|
||||
}
|
||||
|
||||
@Override
|
||||
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
|
||||
public final T create() {
|
||||
@@ -200,7 +246,9 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
|
||||
throw new ModuleNotActiveException();
|
||||
}
|
||||
|
||||
return dao.getAll();
|
||||
Query q = dao.getQuery("from " + dao.getEntityName());
|
||||
|
||||
return filterQuery(q).list();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
package info.bukova.isspst.services;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class HqlDataFilter {
|
||||
private String where;
|
||||
private String orderBy;
|
||||
private Map<String, Object> params;
|
||||
private Class<?> dataClass;
|
||||
|
||||
public HqlDataFilter() {
|
||||
params = new HashMap<String, Object>();
|
||||
}
|
||||
|
||||
public HqlDataFilter(String where) {
|
||||
this();
|
||||
this.where = where;
|
||||
}
|
||||
|
||||
public HqlDataFilter(String where, String orderBy) {
|
||||
this(where);
|
||||
this.orderBy = orderBy;
|
||||
}
|
||||
|
||||
public String getWhere() {
|
||||
return where;
|
||||
}
|
||||
|
||||
public void setWhere(String where) {
|
||||
this.where = where;
|
||||
}
|
||||
|
||||
public String getOrderBy() {
|
||||
return orderBy;
|
||||
}
|
||||
|
||||
public void setOrderBy(String orderBy) {
|
||||
this.orderBy = orderBy;
|
||||
}
|
||||
|
||||
public void setParam(String key, Object value) {
|
||||
params.put(key, value);
|
||||
}
|
||||
|
||||
public Object getParam(String key) {
|
||||
return params.get(key);
|
||||
}
|
||||
|
||||
public Set<String> getParamKeys() {
|
||||
return params.keySet();
|
||||
}
|
||||
|
||||
public void andFilter(String filter) {
|
||||
if (where == null || where.isEmpty()) {
|
||||
where = filter;
|
||||
} else {
|
||||
where += " and (" + filter + ")";
|
||||
}
|
||||
}
|
||||
|
||||
public void orFilter(String filter) {
|
||||
if (where == null ||where.isEmpty()) {
|
||||
where = filter;
|
||||
} else {
|
||||
where += " or (" + filter + ")";
|
||||
}
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
where = "";
|
||||
orderBy = "";
|
||||
params.clear();
|
||||
}
|
||||
|
||||
public Class<?> getDataClass() {
|
||||
return dataClass;
|
||||
}
|
||||
|
||||
public void setDataClass(Class<?> dataClass) {
|
||||
this.dataClass = dataClass;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
package info.bukova.isspst.services;
|
||||
|
||||
import org.hibernate.Query;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class HqlUtils {
|
||||
|
||||
public static String buildHql(String select, HqlDataFilter filter) {
|
||||
if (select.toLowerCase().contains("where")
|
||||
|| select.toLowerCase().contains("order by")) {
|
||||
throw new IsspstException("Use add*() methods instead.");
|
||||
}
|
||||
|
||||
String hql = addWhere(select, filter, "");
|
||||
return addOrderBy(hql, filter);
|
||||
}
|
||||
|
||||
public static String addAndWhere(String hql, HqlDataFilter filter) {
|
||||
if (!checkWhere(filter)) {
|
||||
return hql;
|
||||
}
|
||||
|
||||
return addWhere(hql, filter, "and");
|
||||
}
|
||||
|
||||
public static String addOrWhere(String hql, HqlDataFilter filter) {
|
||||
if (!checkWhere(filter)) {
|
||||
return hql;
|
||||
}
|
||||
|
||||
return addWhere(hql, filter, "or");
|
||||
}
|
||||
|
||||
public static String addOrderBy(String hql, HqlDataFilter filter) {
|
||||
if (filter == null || filter.getOrderBy() == null || filter.getOrderBy().isEmpty()) {
|
||||
return hql;
|
||||
}
|
||||
|
||||
if (!hql.contains("order by")) {
|
||||
hql += " order by ";
|
||||
}
|
||||
|
||||
hql += filter.getOrderBy();
|
||||
return hql;
|
||||
}
|
||||
|
||||
public static void addParameters(Query query, HqlDataFilter filter) {
|
||||
if (filter == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (String key : filter.getParamKeys()) {
|
||||
if (filter.getParam(key) instanceof Collection<?>) {
|
||||
query.setParameterList(key, (Collection) filter.getParam(key));
|
||||
} else {
|
||||
query.setParameter(key, filter.getParam(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean checkWhere(HqlDataFilter filter) {
|
||||
return filter != null && filter.getWhere() != null && !filter.getWhere().isEmpty();
|
||||
}
|
||||
|
||||
private static String addWhere(String hql, HqlDataFilter filter, String operator) {
|
||||
if (hql.toLowerCase().contains("where") && hql.toLowerCase().contains("order by")) {
|
||||
String[] split = hql.split("order by");
|
||||
hql = split[0] + " " + operator + " (" + filter.getWhere() + ") order by " + split[1];
|
||||
return hql;
|
||||
}
|
||||
|
||||
if (hql.toLowerCase().contains("where")) {
|
||||
hql += " " + operator + " (" + filter.getWhere() + ")";
|
||||
return hql;
|
||||
}
|
||||
|
||||
if (hql.toLowerCase().contains("order by")) {
|
||||
String[] split = hql.split("order by");
|
||||
hql = split[0] + " where (" + filter.getWhere() + ") order by " + split[1];
|
||||
return hql;
|
||||
}
|
||||
|
||||
hql += " where (" + filter.getWhere() + ")";
|
||||
return hql;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,41 @@
|
||||
package info.bukova.isspst.services.dbinfo;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.dao.BaseDao;
|
||||
import info.bukova.isspst.dao.RequirementDao;
|
||||
import info.bukova.isspst.dao.TripBillApprovalDao;
|
||||
import info.bukova.isspst.dao.TripRequirementDao;
|
||||
import info.bukova.isspst.data.DbInfo;
|
||||
import info.bukova.isspst.data.RequirementBase;
|
||||
import info.bukova.isspst.data.RequirementState;
|
||||
import info.bukova.isspst.services.AbstractService;
|
||||
import info.bukova.isspst.services.requirement.RequirementBaseService;
|
||||
import info.bukova.isspst.services.requirement.RequirementService;
|
||||
import info.bukova.isspst.services.requirement.TripRequirementService;
|
||||
import info.bukova.isspst.services.tripbill.TripBillApprovalService;
|
||||
import org.hibernate.SQLQuery;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.SQLQuery;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
public class DbInfoServiceImpl extends AbstractService<DbInfo> implements DbInfoService
|
||||
{
|
||||
@Autowired
|
||||
private TripBillApprovalService tripBillApprovalService;
|
||||
@Autowired
|
||||
private TripBillApprovalDao tripBillApprovalDao;
|
||||
@Autowired
|
||||
private TripRequirementService tripRequirement;
|
||||
@Autowired
|
||||
private TripRequirementDao tripRequirementDao;
|
||||
@Autowired
|
||||
private RequirementService requirementService;
|
||||
@Autowired
|
||||
private RequirementDao requirementDao;
|
||||
|
||||
|
||||
private DbInfo getDbInfo()
|
||||
{
|
||||
DbInfo dbInfo = null;
|
||||
@@ -142,10 +166,96 @@ public class DbInfoServiceImpl extends AbstractService<DbInfo> implements DbInfo
|
||||
sq.executeUpdate();
|
||||
}
|
||||
|
||||
if (dbVersion > 0 && dbVersion < 6) {
|
||||
sql = "INSERT INTO SEASON(DESCRIPTION, VALID_FROM, VALID_TO, ACTIVE) " +
|
||||
"VALUES ('2015', '2015-01-01', '2015-12-31', 0)";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "INSERT INTO SEASON(DESCRIPTION, VALID_FROM, VALID_TO, ACTIVE) " +
|
||||
"VALUES ('2016', '2016-01-01', NULL, 1)";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "UPDATE NUMBERSERIES SET SEASON_ID = 2";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "INSERT INTO NUMBERSERIES(MODULE, PREFIX, NUMBER, SEASON_ID) " +
|
||||
"VALUES ('REQUIREMENTS', 'P', 2528, 1)";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "INSERT INTO NUMBERSERIES(MODULE, PREFIX, NUMBER, SEASON_ID) " +
|
||||
"VALUES ('ORDER', 'OBJ', 55, 1)";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
// rozdeleni dat do sezon
|
||||
sql = "UPDATE REQUIREMENT SET SEASON_ID = 2 WHERE NUMSER LIKE 'P16%'";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
sql = "UPDATE REQUIREMENT SET SEASON_ID = 1 WHERE NUMSER LIKE 'P0%'";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "UPDATE TRIPREQUIREMENT SET SEASON_ID = 2 WHERE NUMSER LIKE 'P16%'";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
sql = "UPDATE TRIPREQUIREMENT SET SEASON_ID = 1 WHERE NUMSER LIKE 'P0%'";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "UPDATE ORDERS SET SEASON_ID = 2 WHERE NUMSER LIKE 'OBJ16%'";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
sql = "UPDATE ORDERS SET SEASON_ID = 1 WHERE NUMSER LIKE 'OBJ0%'";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "UPDATE TRIP_BILL_APPROVAL SET SEASON_ID = 2 " +
|
||||
" WHERE TRIPBILL_ID in " +
|
||||
" (SELECT tb.ID FROM TRIP_BILL AS tb " +
|
||||
" JOIN TRIPREQUIREMENT ON TRIPREQUIREMENT.ID = tb.REQUIREMENT_ID WHERE NUMSER LIKE 'P16%')";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
sql = "UPDATE TRIP_BILL_APPROVAL SET SEASON_ID = 1 " +
|
||||
"WHERE TRIPBILL_ID in " +
|
||||
"(SELECT tb.ID FROM TRIP_BILL AS tb " +
|
||||
"JOIN TRIPREQUIREMENT ON TRIPREQUIREMENT.ID = tb.REQUIREMENT_ID WHERE NUMSER LIKE 'P0%')";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
|
||||
sql = "UPDATE TRIP_BILL tb JOIN TRIPREQUIREMENT ON TRIPREQUIREMENT.ID = tb.REQUIREMENT_ID " +
|
||||
"SET tb.SEASON_ID = 2 WHERE NUMSER LIKE 'P16%'";
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
sql = "UPDATE TRIP_BILL tb JOIN TRIPREQUIREMENT ON TRIPREQUIREMENT.ID = tb.REQUIREMENT_ID " +
|
||||
"SET tb.SEASON_ID = 1 WHERE NUMSER LIKE 'P0%'";;
|
||||
sq = dao.getSession().createSQLQuery(sql);
|
||||
sq.executeUpdate();
|
||||
}
|
||||
|
||||
if (dbVersion < 7) {
|
||||
setApproveDate((RequirementBaseService)tripBillApprovalService, (BaseDao)tripBillApprovalDao);
|
||||
setApproveDate((RequirementBaseService)tripRequirement, (BaseDao)tripRequirementDao);
|
||||
setApproveDate((RequirementBaseService)requirementService, (BaseDao)requirementDao);
|
||||
}
|
||||
|
||||
this.updateDatabaseVersion();
|
||||
}
|
||||
}
|
||||
|
||||
private void setApproveDate(RequirementBaseService<RequirementBase> service, BaseDao<RequirementBase> daoReq) {
|
||||
for (RequirementBase req : service.getAll()) {
|
||||
if (req.getState() == RequirementState.APPROVED) {
|
||||
service.loadAuthItems(req);
|
||||
req.setApproveDate(req.getLastApproveDate());
|
||||
daoReq.modify(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateDatabaseVersion()
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package info.bukova.isspst.services.invoicing;
|
||||
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
import info.bukova.isspst.data.Requirement;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.Service;
|
||||
|
||||
@@ -11,6 +13,8 @@ public interface InvoicingService extends Service<Invoicing> {
|
||||
|
||||
public BigDecimal totalInvoicedForWorkgroup(Workgroup workgroup);
|
||||
|
||||
public BigDecimal totalInvoicedForWorkgroupAndSeason(Workgroup workgroup, Season season);
|
||||
|
||||
public void loadReqItems(Invoicing invoicing);
|
||||
|
||||
public void loadItems(Invoicing invoicing);
|
||||
@@ -20,4 +24,14 @@ public interface InvoicingService extends Service<Invoicing> {
|
||||
public List<Invoicing> getPendingList();
|
||||
|
||||
public List<Invoicing> getArchiveList();
|
||||
|
||||
public Invoicing getForRequirement(Requirement req);
|
||||
|
||||
public List<Invoicing> getMaterialPendingList();
|
||||
|
||||
public List<Invoicing> getMaterialArchiveList();
|
||||
|
||||
public List<Invoicing> getServicesPendingList();
|
||||
|
||||
public List<Invoicing> getServicesArchiveList();
|
||||
}
|
||||
|
||||
@@ -1,29 +1,43 @@
|
||||
package info.bukova.isspst.services.invoicing;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
import info.bukova.isspst.data.InvoicingItem;
|
||||
import info.bukova.isspst.data.Requirement;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
public class InvoicingServiceImpl extends AbstractOwnedService<Invoicing> implements
|
||||
InvoicingService {
|
||||
|
||||
@Autowired
|
||||
private SeasonService seasonService;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public BigDecimal totalInvoicedForWorkgroup(Workgroup workgroup) {
|
||||
return totalInvoicedForWorkgroupAndSeason(workgroup, seasonService.getActive());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public BigDecimal totalInvoicedForWorkgroupAndSeason(Workgroup workgroup, Season season) {
|
||||
Query q = dao.getQuery("select sum(inv.totalInvoiced) "
|
||||
+ "from Invoicing inv join inv.requirement rq join rq.workgroup w "
|
||||
+ "where w = :workgroup ");
|
||||
+ "where w = :workgroup and rq.season = :season");
|
||||
q.setParameter("workgroup", workgroup);
|
||||
q.setParameter("season", season);
|
||||
return (BigDecimal) q.uniqueResult();
|
||||
}
|
||||
|
||||
@@ -45,6 +59,14 @@ public class InvoicingServiceImpl extends AbstractOwnedService<Invoicing> implem
|
||||
invoicing.setItems(inv.getItems());
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@LazyLoader
|
||||
public void loadReqAuth(Invoicing invoicing) {
|
||||
Invoicing inv = getById(invoicing.getId());
|
||||
Hibernate.initialize(inv.getRequirement().getAuthorization());
|
||||
invoicing.getRequirement().setAuthorization(inv.getRequirement().getAuthorization());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void calculate(Invoicing invoicing) {
|
||||
BigDecimal total = BigDecimal.ZERO;
|
||||
@@ -92,4 +114,53 @@ public class InvoicingServiceImpl extends AbstractOwnedService<Invoicing> implem
|
||||
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy where inv.completed = true order by rq.numser");
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Invoicing getForRequirement(Requirement req) {
|
||||
Query query = dao.getQuery("select invoice from Invoicing invoice join invoice.requirement rq where rq.id = :reqId");
|
||||
query.setParameter("reqId", req.getId());
|
||||
|
||||
return (Invoicing) query.uniqueResult();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<Invoicing> getMaterialPendingList() {
|
||||
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy where (inv.completed Is Null or inv.completed = false) and (rq.kind = :kind) order by rq.numser desc");
|
||||
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<Invoicing> getMaterialArchiveList() {
|
||||
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy where (inv.completed = true) and (rq.kind = :kind) order by rq.numser desc");
|
||||
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<Invoicing> getServicesPendingList() {
|
||||
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy where (inv.completed Is Null or inv.completed = false) and (rq.kind = :kind) order by rq.numser desc");
|
||||
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<Invoicing> getServicesArchiveList() {
|
||||
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy where (inv.completed = true) and (rq.kind = :kind) order by rq.numser desc");
|
||||
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return q.list();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package info.bukova.isspst.services.limits;
|
||||
|
||||
import info.bukova.isspst.services.IsspstException;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class LimitException extends IsspstException {
|
||||
|
||||
public LimitException(String reason) {
|
||||
setReason(reason);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package info.bukova.isspst.services.limits;
|
||||
|
||||
import info.bukova.isspst.data.Limit;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public interface LimitService extends Service<Limit> {
|
||||
List<Limit> getForSeason(Season season);
|
||||
Limit getForWorkgroupAndSeason(Workgroup wg, Season season);
|
||||
Limit getForWorkgroup(Workgroup wg);
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package info.bukova.isspst.services.limits;
|
||||
|
||||
import info.bukova.isspst.data.Limit;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class LimitServiceImpl extends AbstractOwnedService<Limit> implements LimitService {
|
||||
|
||||
@Autowired
|
||||
private SeasonService seasonService;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public List<Limit> getForSeason(Season season) {
|
||||
Query q = dao.getQuery("from Limit where season = :season");
|
||||
q.setParameter("season", season);
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Limit getForWorkgroupAndSeason(Workgroup wg, Season season) {
|
||||
Query q = dao.getQuery("from Limit where workgroup = :wg and season = :season");
|
||||
q.setParameter("wg", wg);
|
||||
q.setParameter("season", season);
|
||||
return (Limit) q.uniqueResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Limit getForWorkgroup(Workgroup wg) {
|
||||
return getForWorkgroupAndSeason(wg, seasonService.getActive());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
|
||||
public void add(Limit entity) {
|
||||
if (getForWorkgroupAndSeason(entity.getWorkgroup(),entity.getSeason()) != null) {
|
||||
throw new LimitException("LimitExists");
|
||||
}
|
||||
super.add(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Limit createEntity() {
|
||||
Limit limit = new Limit();
|
||||
limit.setSeason(seasonService.getActive());
|
||||
return limit;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,18 @@
|
||||
package info.bukova.isspst.services.numberseries;
|
||||
|
||||
import info.bukova.isspst.data.NumberSeries;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.services.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface NumberSeriesService extends Service<NumberSeries>
|
||||
{
|
||||
public NumberSeries getNumberSerie(String module);
|
||||
|
||||
public NumberSeries getNumberSerieForSeason(String module, Season season);
|
||||
|
||||
public void increase(NumberSeries ns);
|
||||
|
||||
public List<NumberSeries> getSeriesForSeason(Season season);
|
||||
}
|
||||
|
||||
+29
-5
@@ -1,24 +1,48 @@
|
||||
package info.bukova.isspst.services.numberseries;
|
||||
|
||||
import info.bukova.isspst.data.NumberSeries;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.services.AbstractService;
|
||||
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class NumberSeriesServiceImpl extends AbstractService<NumberSeries> implements NumberSeriesService
|
||||
{
|
||||
@Autowired
|
||||
private SeasonService seasonService;
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public NumberSeries getNumberSerie(String module)
|
||||
{
|
||||
return this.selectSingle("from NumberSeries where MODULE = '" + module + "'");
|
||||
public NumberSeries getNumberSerie(String module) {
|
||||
return getNumberSerieForSeason(module, seasonService.getActive());
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public void increase(NumberSeries ns)
|
||||
{
|
||||
public NumberSeries getNumberSerieForSeason(String module, Season season) {
|
||||
Query q = dao.getQuery("from NumberSeries where module = :m and season = :s");
|
||||
q.setParameter("m", module);
|
||||
q.setParameter("s", season);
|
||||
return (NumberSeries) q.uniqueResult();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public void increase(NumberSeries ns) {
|
||||
ns.setNumber(ns.getNumber() + 1);
|
||||
this.update(ns);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public List<NumberSeries> getSeriesForSeason(Season season) {
|
||||
Query q = dao.getQuery("from NumberSeries where season = :s");
|
||||
q.setParameter("s", season);
|
||||
return q.list();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,16 +10,16 @@ import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
public class OrderServiceImpl extends AbstractOwnedService<Order> implements
|
||||
OrderService {
|
||||
|
||||
@@ -29,6 +29,9 @@ public class OrderServiceImpl extends AbstractOwnedService<Order> implements
|
||||
@Autowired
|
||||
private RequirementItemDao requirementItemDao;
|
||||
|
||||
@Autowired
|
||||
private SeasonService seasonService;
|
||||
|
||||
@Override
|
||||
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
|
||||
public Order createOrder(List<JoinedItem> items) {
|
||||
@@ -46,6 +49,7 @@ public class OrderServiceImpl extends AbstractOwnedService<Order> implements
|
||||
}
|
||||
|
||||
order.setTotal(total);
|
||||
order.setSeason(seasonService.getActive());
|
||||
|
||||
return order;
|
||||
}
|
||||
@@ -76,7 +80,7 @@ public class OrderServiceImpl extends AbstractOwnedService<Order> implements
|
||||
public List<Order> getAll()
|
||||
{
|
||||
Query q = dao.getQuery("select o from Order o join fetch o.ownedBy");
|
||||
return q.list();
|
||||
return filterQuery(q).list();
|
||||
}
|
||||
|
||||
@LazyLoader("form")
|
||||
|
||||
@@ -3,17 +3,14 @@ package info.bukova.isspst.services.requirement;
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.data.Requirement;
|
||||
import info.bukova.isspst.data.RequirementState;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PostFilter;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
public class ReqMaterialServiceImpl extends RequirementServiceImpl implements RequirementService, RequirementBaseService<Requirement>
|
||||
{
|
||||
@Autowired
|
||||
@@ -38,10 +35,10 @@ public class ReqMaterialServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<Requirement> getMy()
|
||||
{
|
||||
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner and kind = :kind");
|
||||
q.setParameter("owner", getLoggedInUser());
|
||||
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return super.getMy();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -51,11 +48,10 @@ public class ReqMaterialServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PostFilter("hasPermission(filterObject, 'PERM_SHOW_CENTRE_REQ')")
|
||||
public List<Requirement> getCentreReq()
|
||||
{
|
||||
List<Workgroup> wgList = workgroupService.getUserCentres(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where c in (:wgList) and kind = :kind order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return super.getCentreReq();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -65,13 +61,10 @@ public class ReqMaterialServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PostFilter("hasPermission(filterObject, 'PERM_SHOW_WORKGROUP_REQ')")
|
||||
public List<Requirement> getWorkgroupReq()
|
||||
{
|
||||
List<Workgroup> wgList = workgroupService.getUserWorkgroups(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from "
|
||||
+ dao.getEntityName()
|
||||
+ " tr join fetch tr.ownedBy join tr.workgroup w where w in (:wgList) and kind = :kind order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return super.getWorkgroupReq();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -80,8 +73,9 @@ public class ReqMaterialServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PreAuthorize("hasPermission(this, 'PERM_SHOW_ALL_REQ')")
|
||||
public List<Requirement> getAll()
|
||||
{
|
||||
Query q = dao.getQuery("from " + dao.getEntityName() + " as tr join fetch tr.ownedBy where kind = :kind order by tr.numser");
|
||||
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_MATERIAL);
|
||||
return super.getAll();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,17 +3,14 @@ package info.bukova.isspst.services.requirement;
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.data.Requirement;
|
||||
import info.bukova.isspst.data.RequirementState;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PostFilter;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
public class ReqServicesServiceImpl extends RequirementServiceImpl implements RequirementService, RequirementBaseService<Requirement>
|
||||
{
|
||||
@Autowired
|
||||
@@ -38,10 +35,10 @@ public class ReqServicesServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<Requirement> getMy()
|
||||
{
|
||||
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner and kind = :kind");
|
||||
q.setParameter("owner", getLoggedInUser());
|
||||
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return super.getMy();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -51,11 +48,10 @@ public class ReqServicesServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PostFilter("hasPermission(filterObject, 'PERM_SHOW_CENTRE_REQ')")
|
||||
public List<Requirement> getCentreReq()
|
||||
{
|
||||
List<Workgroup> wgList = workgroupService.getUserCentres(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where c in (:wgList) and kind = :kind order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return super.getCentreReq();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -65,13 +61,10 @@ public class ReqServicesServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PostFilter("hasPermission(filterObject, 'PERM_SHOW_WORKGROUP_REQ')")
|
||||
public List<Requirement> getWorkgroupReq()
|
||||
{
|
||||
List<Workgroup> wgList = workgroupService.getUserWorkgroups(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from "
|
||||
+ dao.getEntityName()
|
||||
+ " tr join fetch tr.ownedBy join tr.workgroup w where w in (:wgList) and kind = :kind order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return super.getWorkgroupReq();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -80,8 +73,9 @@ public class ReqServicesServiceImpl extends RequirementServiceImpl implements Re
|
||||
@PreAuthorize("hasPermission(this, 'PERM_SHOW_ALL_REQ')")
|
||||
public List<Requirement> getAll()
|
||||
{
|
||||
Query q = dao.getQuery("from " + dao.getEntityName() + " as tr join fetch tr.ownedBy where kind = :kind order by tr.numser");
|
||||
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return q.list();
|
||||
hqlFilter.setDataClass(Requirement.class);
|
||||
hqlFilter.andFilter("kind = :kind");
|
||||
hqlFilter.setParam("kind", Constants.REQ_TYPE_SERVICES);
|
||||
return super.getAll();
|
||||
}
|
||||
}
|
||||
|
||||
+61
-18
@@ -24,17 +24,22 @@ import info.bukova.isspst.reporting.ParamFiller;
|
||||
import info.bukova.isspst.reporting.Report;
|
||||
import info.bukova.isspst.reporting.ReportDefinition;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.HqlDataFilter;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
import info.bukova.isspst.services.Service;
|
||||
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import info.bukova.isspst.services.signeddocs.SignedDocumentService;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.signapi.SignData;
|
||||
import info.bukova.isspst.storage.FileStorage;
|
||||
import info.bukova.isspst.storage.ReportFileStorage;
|
||||
import info.bukova.isspst.storage.StorageException;
|
||||
import org.hibernate.LazyInitializationException;
|
||||
import org.hibernate.Query;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PostFilter;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
@@ -82,6 +87,11 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
@Autowired
|
||||
private ReportFileStorage signedDocStorage;
|
||||
|
||||
@Autowired
|
||||
private SeasonService seasonService;
|
||||
|
||||
private final static Logger logger = LoggerFactory.getLogger(RequirementBaseServiceImpl.class);
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
|
||||
@@ -89,9 +99,13 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
Workgroup reqWorkgroup = null;
|
||||
for (Workgroup w : workgroupService.getUserWorkgroups(getLoggedInUser())) {
|
||||
if (workgroupService.getMembers(entity.getCentre()).contains(w)) {
|
||||
for (Role r : workgroupService.getUserWorkgroupRoles(w, getLoggedInUser())) {
|
||||
if (r.getAuthority().equals(Constants.ROLE_USER)) {
|
||||
reqWorkgroup = w;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
entity.setWorkgroup(reqWorkgroup);
|
||||
|
||||
@@ -101,6 +115,8 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
throw new AddRequirementException();
|
||||
}
|
||||
|
||||
entity.setSeason(seasonService.getActive());
|
||||
|
||||
this.addWorkflow(entity);
|
||||
entity.setNumser(this.getNumberSerie());
|
||||
|
||||
@@ -131,7 +147,8 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
}
|
||||
|
||||
protected void postAdd(T entity) {
|
||||
if (canApprove(entity)) {
|
||||
Workflow wf = getNextWorkflow(entity);
|
||||
if (canApprove(entity) && (wf.getSignature() == null || !wf.getSignature())) {
|
||||
approve(entity);
|
||||
} else {
|
||||
this.sendToApprovers(entity);
|
||||
@@ -272,6 +289,7 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
|
||||
if (getNextWorkflow(e) == null) {
|
||||
e.setState(RequirementState.APPROVED);
|
||||
e.setApproveDate(approveDate);
|
||||
} else {
|
||||
e.setState(RequirementState.PARTIALLY);
|
||||
}
|
||||
@@ -280,7 +298,7 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
|
||||
if (signedPdf != null) {
|
||||
saveSignedDoc(e, signedPdf);
|
||||
} else if (wf.getSignature() != null && wf.getSignature()) {
|
||||
} else if (wf.getSignature() != null && wf.getSignature() && !signatureNotRequired(wf)) {
|
||||
throw new ApproveException("ErrApproveMustBeSigned");
|
||||
}
|
||||
|
||||
@@ -310,6 +328,15 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
postApprove(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check pro automatické schválení, kdy není třeba podepisovat- nadlimitní nákupy se neautorizují...
|
||||
* @param wf Další krok schválení
|
||||
* @return true pokud není potřeba podepisovat. Zde vrací vždy false, v případě potřeby nutno překrýt.
|
||||
*/
|
||||
protected boolean signatureNotRequired(Workflow wf) {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void approve(T entity, User user) {
|
||||
approve(entity, user, new Date(), null);
|
||||
}
|
||||
@@ -423,9 +450,10 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<T> getMy()
|
||||
{
|
||||
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner");
|
||||
q.setParameter("owner", getLoggedInUser());
|
||||
return q.list();
|
||||
Query q = dao.getQuery("from " + dao.getEntityName());
|
||||
HqlDataFilter f = new HqlDataFilter("ownedBy = :owner");
|
||||
f.setParam("owner", getLoggedInUser());
|
||||
return filterQuery(q, f).list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -436,9 +464,10 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
public List<T> getCentreReq()
|
||||
{
|
||||
List<Workgroup> wgList = workgroupService.getUserCentres(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where c in (:wgList) order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
return q.list();
|
||||
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c");
|
||||
HqlDataFilter f = new HqlDataFilter("c in (:wgList)", "tr.numser desc");
|
||||
f.setParam("wgList", wgList);
|
||||
return filterQuery(q, f).list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -449,9 +478,10 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
public List<T> getWorkgroupReq()
|
||||
{
|
||||
List<Workgroup> wgList = workgroupService.getUserWorkgroups(getLoggedInUser());
|
||||
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.workgroup w where w in (:wgList) order by tr.numser");
|
||||
q.setParameterList("wgList", wgList);
|
||||
return q.list();
|
||||
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.workgroup w");
|
||||
HqlDataFilter f = new HqlDataFilter("w in (:wgList)", "tr.numser desc");
|
||||
f.setParam("wgList", wgList);
|
||||
return filterQuery(q, f).list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -460,8 +490,9 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
@PreAuthorize("hasPermission(this, 'PERM_SHOW_ALL_REQ')")
|
||||
public List<T> getAll()
|
||||
{
|
||||
Query q = dao.getQuery("from " + dao.getEntityName() + " as tr join fetch tr.ownedBy order by tr.numser");
|
||||
return q.list();
|
||||
Query q = dao.getQuery("from " + dao.getEntityName() + " as tr join fetch tr.ownedBy");
|
||||
HqlDataFilter f = new HqlDataFilter("", "tr.numser desc");
|
||||
return filterQuery(q, f).list();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -532,11 +563,17 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
private Report getSignReport(T entity) {
|
||||
Module module = ModuleUtils.getModule(entityForSignReport(entity), servletContext);
|
||||
Report report = null;
|
||||
int reportId = Constants.SIGN_REPORT_MAP.get(entity.getClass()) == null ? 0 : Constants.SIGN_REPORT_MAP.get(entity.getClass());
|
||||
|
||||
for (Report r : module.getReports()) {
|
||||
if (r.isSignable()) {
|
||||
if (reportId == 0) {
|
||||
report = r;
|
||||
break;
|
||||
} else if (reportId == r.getReportId()) {
|
||||
report = r;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -549,13 +586,14 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
public void update(T entity) {
|
||||
entity.getAuthorization().clear();
|
||||
entity.setState(RequirementState.NEW);
|
||||
super.update(entity);
|
||||
|
||||
SignedDocument doc = signedDocumentService.getForEntity(entity);
|
||||
if (doc != null) {
|
||||
signedDocumentService.delFromApprove(doc);
|
||||
try {
|
||||
signedDocumentService.deleteForEntity(entity);
|
||||
} catch (StorageException e) {
|
||||
logger.warn(e.getMessage());
|
||||
}
|
||||
|
||||
super.update(entity);
|
||||
sendToApprovers(entity);
|
||||
}
|
||||
|
||||
@@ -563,7 +601,12 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_DELETE') or hasPermission(#entity, this.getDeleteEntityPermission())")
|
||||
public void delete(T entity) {
|
||||
signedDocumentService.delFromApprove(signedDocumentService.getForEntity(entity));
|
||||
super.delete(entity);
|
||||
|
||||
try {
|
||||
signedDocumentService.delFromApprove(signedDocumentService.getForEntity(entity));
|
||||
} catch (StorageException e) {
|
||||
logger.warn(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package info.bukova.isspst.services.requirement;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
import info.bukova.isspst.data.Limit;
|
||||
import info.bukova.isspst.data.Requirement;
|
||||
import info.bukova.isspst.data.RequirementItem;
|
||||
import info.bukova.isspst.data.RequirementState;
|
||||
@@ -10,9 +11,10 @@ import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workflow;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
import info.bukova.isspst.services.invoicing.InvoicingService;
|
||||
import info.bukova.isspst.services.limits.LimitService;
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@@ -33,6 +35,8 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
|
||||
private RequirementTypeService reqTypeService;
|
||||
@Autowired
|
||||
private InvoicingService invoicingService;
|
||||
@Autowired
|
||||
private LimitService limitService;
|
||||
|
||||
@Override
|
||||
protected Requirement createEntity()
|
||||
@@ -67,29 +71,38 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Nadlimitní autorizovat bez podpisu
|
||||
* @param wf Další krok schválení
|
||||
* @return true, pokud má role nastavený limit- automatické schválení podlimitního požadavku
|
||||
*/
|
||||
@Override
|
||||
protected boolean signatureNotRequired(Workflow wf) {
|
||||
return wf.getLimit() != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canAdd(Requirement entity)
|
||||
{
|
||||
if (entity.getWorkgroup() != null && entity.getWorkgroup().getLimit() != null && entity.getWorkgroup().getLimit().compareTo(BigDecimal.ZERO) != 0)
|
||||
{
|
||||
if (entity.getWorkgroup() != null) {
|
||||
Limit limit = limitService.getForWorkgroup(entity.getWorkgroup());
|
||||
if (limit == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
BigDecimal total = invoicingService.totalInvoicedForWorkgroup(entity.getWorkgroup());
|
||||
|
||||
if (total == null)
|
||||
{
|
||||
if (total == null) {
|
||||
total = BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
total = total.add(entity.getSumTotal());
|
||||
|
||||
if (total.compareTo(entity.getWorkgroup().getLimit()) <= 0)
|
||||
{
|
||||
if (total.compareTo(limit.getLimit()) <= 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -244,11 +257,19 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
|
||||
@Override
|
||||
@Transactional
|
||||
public BigDecimal getInvoicedAmount(Requirement req) {
|
||||
Query query = dao.getQuery("select invoice from Invoicing invoice join invoice.requirement rq where rq.id = :reqId");
|
||||
query.setParameter("reqId", req.getId());
|
||||
|
||||
Invoicing inv = (Invoicing) query.uniqueResult();
|
||||
|
||||
Invoicing inv = invoicingService.getForRequirement(req);
|
||||
return inv != null ? inv.getTotalInvoiced() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_EDIT') or hasPermission(#entity, this.getUpdateEntityPermission())")
|
||||
public void update(Requirement entity) {
|
||||
super.update(entity);
|
||||
Invoicing inv = invoicingService.getForRequirement(entity);
|
||||
|
||||
if (inv != null) {
|
||||
invoicingService.delete(inv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+32
-4
@@ -57,8 +57,6 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_EDIT') or hasPermission(#entity, this.getUpdateEntityPermission())")
|
||||
public void update(TripRequirement entity) {
|
||||
super.update(entity);
|
||||
|
||||
if (entity.getState() == RequirementState.APPROVED) {
|
||||
for (TripBill bill : getBills(entity)) {
|
||||
TripBill newBill = tripBillService.createTripBill(entity);
|
||||
@@ -75,6 +73,8 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
|
||||
tripBillService.update(bill);
|
||||
}
|
||||
}
|
||||
|
||||
super.update(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -141,15 +141,30 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
|
||||
|
||||
@Override
|
||||
protected void postApprove(TripRequirement entity) {
|
||||
if (entity.getState() == RequirementState.APPROVED) {
|
||||
if (entity.getState() != RequirementState.APPROVED) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<TripBill> billList = getBills(entity);
|
||||
boolean hasOwned = false;
|
||||
|
||||
for (TripBill tb : billList) {
|
||||
if (tb.getOwnedBy().equals(entity.getOwnedBy())) {
|
||||
hasOwned = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasOwned) {
|
||||
TripBill bill = tripBillService.createTripBill(entity);
|
||||
tripBillService.add(bill);
|
||||
bill.setOwnedBy(entity.getOwnedBy());
|
||||
tripBillService.update(bill);
|
||||
}
|
||||
|
||||
if (entity.getBillForPassengers() != null && entity.getBillForPassengers()) {
|
||||
for (User u : entity.getPassengers()) {
|
||||
if (!u.equals(entity.getOwnedBy())) {
|
||||
if (canCreateBill(entity, u, billList)) {
|
||||
TripBill passBill = tripBillService.createPassengersBill(entity);
|
||||
tripBillService.add(passBill);
|
||||
passBill.setOwnedBy(u);
|
||||
@@ -160,6 +175,19 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
|
||||
sendMailToPassengers(entity, settingsService.getSettings().getConfReqTripPassenger());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean canCreateBill(TripRequirement req, User owner, List<TripBill> bills) {
|
||||
if (owner.equals(req.getOwnedBy())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (TripBill tb : bills) {
|
||||
if (tb.getOwnedBy().equals(owner)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package info.bukova.isspst.services.settings;
|
||||
|
||||
import info.bukova.isspst.services.IsspstException;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class SeasonException extends IsspstException {
|
||||
|
||||
SeasonException() {
|
||||
super();
|
||||
}
|
||||
|
||||
SeasonException(String msg) {
|
||||
super(msg);
|
||||
setReason(msg);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package info.bukova.isspst.services.settings;
|
||||
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.services.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public interface SeasonService extends Service<Season> {
|
||||
Season addSeason();
|
||||
Season getActive();
|
||||
List<Season> getAllSeasons();
|
||||
void setActive(Season season);
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
package info.bukova.isspst.services.settings;
|
||||
|
||||
import info.bukova.isspst.StringUtils;
|
||||
import info.bukova.isspst.data.NumberSeries;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.numberseries.NumberSeriesService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class SeasonServiceImpl extends AbstractOwnedService<Season> implements SeasonService {
|
||||
private Season activeSeason;
|
||||
@Autowired
|
||||
private NumberSeriesService numberSeriesService;
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public Season addSeason() {
|
||||
Season season = new Season();
|
||||
season.setDescription(StringUtils.localize("SeasonsNewSeason"));
|
||||
season.setValidFrom(new Date());
|
||||
season.setActive(true);
|
||||
|
||||
Season last = selectSingle("from Season where validTo Is Null");
|
||||
add(season);
|
||||
|
||||
last.setValidTo(new Date());
|
||||
last.setActive(false);
|
||||
update(last);
|
||||
|
||||
|
||||
activeSeason = null;
|
||||
|
||||
List<NumberSeries> numSeries = numberSeriesService.getSeriesForSeason(last);
|
||||
for (NumberSeries ns: numSeries) {
|
||||
String txt = ns.getPrefix().replaceAll("[0-9]+", "");
|
||||
String numTxt = ns.getPrefix().replaceAll("[a-zA-Z]+", "");
|
||||
|
||||
int num = 0;
|
||||
try {
|
||||
num = Integer.valueOf(numTxt);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
String newPrefix = txt + String.valueOf(num + 1);
|
||||
|
||||
NumberSeries newNumSer = new NumberSeries();
|
||||
newNumSer.setPrefix(newPrefix);
|
||||
newNumSer.setModule(ns.getModule());
|
||||
newNumSer.setNumber(1);
|
||||
newNumSer.setSeason(season);
|
||||
numberSeriesService.add(newNumSer);
|
||||
}
|
||||
return season;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public Season getActive() {
|
||||
if (activeSeason == null) {
|
||||
activeSeason = selectSingle("from Season where active = true");
|
||||
}
|
||||
|
||||
if (activeSeason == null) {
|
||||
throw new SeasonException("Active_season_not_set");
|
||||
}
|
||||
return activeSeason;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public List<Season> getAllSeasons() {
|
||||
return getAll();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
public void setActive(Season season) {
|
||||
for (Season s: getAll()) {
|
||||
s.setActive(false);
|
||||
update(s);
|
||||
}
|
||||
|
||||
Season s = dao.getById(season.getId());
|
||||
|
||||
if (s == null) {
|
||||
throw new SeasonException("Season_not_in_database");
|
||||
}
|
||||
|
||||
s.setActive(true);
|
||||
activeSeason = s;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,15 @@
|
||||
package info.bukova.isspst.services.signeddocs;
|
||||
|
||||
import info.bukova.isspst.data.DataModel;
|
||||
import info.bukova.isspst.data.Member;
|
||||
import info.bukova.isspst.data.SignedDocument;
|
||||
import info.bukova.isspst.data.SignedDocumentItem;
|
||||
import info.bukova.isspst.services.Service;
|
||||
import info.bukova.isspst.ui.signeddocs.SignedDocsTreeNode;
|
||||
import org.zkoss.zul.TreeModel;
|
||||
import org.zkoss.zul.TreeNode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface SignedDocumentService extends Service<SignedDocument> {
|
||||
|
||||
@@ -11,5 +17,9 @@ public interface SignedDocumentService extends Service<SignedDocument> {
|
||||
SignedDocumentItem getItem(DataModel entity, long reportId);
|
||||
void addFromApprove(SignedDocument document);
|
||||
void delFromApprove(SignedDocument document);
|
||||
void deleteForEntity(DataModel entity);
|
||||
|
||||
public List<SignedDocument> getActualList();
|
||||
public List<SignedDocument> getArchiveList();
|
||||
public TreeModel<TreeNode<SignedDocumentItem>> getTree();
|
||||
}
|
||||
|
||||
+158
-3
@@ -1,20 +1,30 @@
|
||||
package info.bukova.isspst.services.signeddocs;
|
||||
|
||||
import info.bukova.isspst.DateTimeUtils;
|
||||
import info.bukova.isspst.Module;
|
||||
import info.bukova.isspst.ModuleUtils;
|
||||
import info.bukova.isspst.data.DataModel;
|
||||
import info.bukova.isspst.data.Member;
|
||||
import info.bukova.isspst.data.SignedDocument;
|
||||
import info.bukova.isspst.data.SignedDocumentItem;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
|
||||
import info.bukova.isspst.storage.ReportFileStorage;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
import info.bukova.isspst.ui.signeddocs.SignedDocsTreeNode;
|
||||
import org.hibernate.Hibernate;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import org.zkoss.zul.DefaultTreeModel;
|
||||
import org.zkoss.zul.DefaultTreeNode;
|
||||
import org.zkoss.zul.TreeModel;
|
||||
import org.zkoss.zul.TreeNode;
|
||||
|
||||
public class SignedDocumentServiceImpl extends AbstractOwnedService<SignedDocument> implements SignedDocumentService {
|
||||
|
||||
@@ -76,6 +86,10 @@ public class SignedDocumentServiceImpl extends AbstractOwnedService<SignedDocume
|
||||
|
||||
@Override
|
||||
public void delFromApprove(SignedDocument document) {
|
||||
if (document == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
super.delete(document);
|
||||
|
||||
for (SignedDocumentItem item : document.getItems()) {
|
||||
@@ -83,5 +97,146 @@ public class SignedDocumentServiceImpl extends AbstractOwnedService<SignedDocume
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void deleteForEntity(DataModel entity) {
|
||||
SignedDocument doc = getForEntity(entity);
|
||||
if (doc != null) {
|
||||
delFromApprove(doc);
|
||||
}
|
||||
}
|
||||
|
||||
private Date getTresholdDate() {
|
||||
Date date = DateTimeUtils.getDateDelta(DateTimeUtils.getCurrDate(), Calendar.MONTH, -6);
|
||||
return date;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<SignedDocument> getActualList() {
|
||||
Query q = dao.getQuery("from SignedDocument where signDate >= :refDate");
|
||||
q.setParameter("refDate", this.getTresholdDate());
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<SignedDocument> getArchiveList() {
|
||||
Query q = dao.getQuery("from SignedDocument where signDate < :refDate");
|
||||
q.setParameter("refDate", this.getTresholdDate());
|
||||
return q.list();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public TreeModel<TreeNode<SignedDocumentItem>> getTree() {
|
||||
Query q = queryDao.getQuery("select item "
|
||||
+ "from SignedDocumentItem as item left join item.signedDocument as rec "
|
||||
+ "order by rec.moduleName, rec.signDate desc, item.reportName, item.fileName "
|
||||
);
|
||||
List<SignedDocumentItem> list = q.list();
|
||||
|
||||
SignedDocumentItem lastItem = null;
|
||||
SignedDocument lastRec = null;
|
||||
List<SignedDocsTreeNode> agendaNameList = new LinkedList<SignedDocsTreeNode>();
|
||||
List<SignedDocsTreeNode> signYearList = new LinkedList<SignedDocsTreeNode>();
|
||||
List<SignedDocsTreeNode> signDateList = new LinkedList<SignedDocsTreeNode>();
|
||||
List<SignedDocsTreeNode> filesList = null;
|
||||
|
||||
int documentsCount = list.size() - 1;
|
||||
|
||||
for (int i = 0; i <= documentsCount; i++) {
|
||||
SignedDocumentItem item = list.get(i);
|
||||
SignedDocument rec = item.getSignedDocument();
|
||||
SignedDocsTreeNode itemNode = new SignedDocsTreeNode(item);
|
||||
|
||||
boolean isChangedAgendaName = ((i == 0)
|
||||
|| (i == documentsCount)
|
||||
|| !lastRec.getAgendaName().equals(rec.getAgendaName())
|
||||
);
|
||||
boolean isChangedSignYear = ((i == 0)
|
||||
|| (i == documentsCount)
|
||||
|| isChangedAgendaName
|
||||
|| !DateTimeUtils.isEqualByYear(lastRec.getSignDate(), rec.getSignDate())
|
||||
);
|
||||
boolean isChangedSignDate = ((i == 0)
|
||||
|| (i == documentsCount)
|
||||
|| isChangedSignYear
|
||||
|| !DateTimeUtils.isEqualByDate(lastRec.getSignDate(), rec.getSignDate())
|
||||
);
|
||||
|
||||
if (isChangedAgendaName || isChangedSignYear || isChangedSignDate) {
|
||||
|
||||
if (isChangedSignDate) {
|
||||
if (i > 0) {
|
||||
SignedDocsTreeNode signDateNode = new SignedDocsTreeNode((i == documentsCount ? item : lastItem), filesList);
|
||||
signDateList.add(signDateNode);
|
||||
}
|
||||
|
||||
filesList = new LinkedList<SignedDocsTreeNode>();
|
||||
filesList.add(itemNode);
|
||||
}
|
||||
|
||||
if (isChangedSignYear) {
|
||||
if (i > 0) {
|
||||
SignedDocsTreeNode signYearNode = new SignedDocsTreeNode((i == documentsCount ? item : lastItem), signDateList);
|
||||
signYearList.add(signYearNode);
|
||||
}
|
||||
|
||||
signDateList = new LinkedList<SignedDocsTreeNode>();
|
||||
}
|
||||
|
||||
if (isChangedAgendaName) {
|
||||
if (i > 0) {
|
||||
SignedDocsTreeNode agendaNode = new SignedDocsTreeNode((i == documentsCount ? item : lastItem), signYearList);
|
||||
agendaNameList.add(agendaNode);
|
||||
}
|
||||
|
||||
signYearList = new LinkedList<SignedDocsTreeNode>();
|
||||
}
|
||||
} else {
|
||||
filesList.add(itemNode);
|
||||
}
|
||||
|
||||
lastItem = item;
|
||||
lastRec = lastItem.getSignedDocument();
|
||||
}
|
||||
|
||||
Collections.sort(agendaNameList, new Comparator<SignedDocsTreeNode>() {
|
||||
@Override
|
||||
public int compare(SignedDocsTreeNode nodeL, SignedDocsTreeNode nodeR) {
|
||||
if ((nodeL != null) && (nodeR != null)) {
|
||||
SignedDocumentItem itemL = nodeL.getData();
|
||||
SignedDocumentItem itemR = nodeR.getData();
|
||||
|
||||
if ((itemL != null) && (itemR != null)) {
|
||||
SignedDocument recL = itemL.getSignedDocument();
|
||||
SignedDocument recR = itemR.getSignedDocument();
|
||||
|
||||
if ((recL != null) && (recR != null)) {
|
||||
String nameL = recL.getAgendaName();
|
||||
String nameR = recR.getAgendaName();
|
||||
|
||||
if ((nameL != null) && (nameR != null)) {
|
||||
return nameL.compareTo(nameR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
SignedDocsTreeNode root = new SignedDocsTreeNode(null, agendaNameList);
|
||||
TreeModel<TreeNode<SignedDocumentItem>> tree = new DefaultTreeModel<SignedDocumentItem>(root);
|
||||
return tree;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package info.bukova.isspst.services.tripbill;
|
||||
|
||||
import info.bukova.isspst.services.IsspstException;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class PayException extends IsspstException {
|
||||
|
||||
public PayException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public PayException(String message) {
|
||||
super(message);
|
||||
setReason(message);
|
||||
}
|
||||
}
|
||||
@@ -10,5 +10,6 @@ import info.bukova.isspst.services.requirement.RequirementBaseService;
|
||||
public interface TripBillApprovalService extends RequirementBaseService<TripBillApproval> {
|
||||
|
||||
public TripBillApproval createApproval(TripBill bill);
|
||||
public void cancelApproval(TripBill bill);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,19 +1,29 @@
|
||||
package info.bukova.isspst.services.tripbill;
|
||||
|
||||
import info.bukova.isspst.Constants;
|
||||
import info.bukova.isspst.Module;
|
||||
import info.bukova.isspst.ModuleUtils;
|
||||
import info.bukova.isspst.StringUtils;
|
||||
import info.bukova.isspst.data.DataModel;
|
||||
import info.bukova.isspst.data.RequirementState;
|
||||
import info.bukova.isspst.data.TripBill;
|
||||
import info.bukova.isspst.data.TripBillApproval;
|
||||
import info.bukova.isspst.reporting.Report;
|
||||
import info.bukova.isspst.services.IsspstException;
|
||||
import info.bukova.isspst.services.requirement.RequirementBaseServiceImpl;
|
||||
import info.bukova.isspst.services.requirement.RequirementTypeService;
|
||||
import info.bukova.isspst.services.signeddocs.SignedDocumentService;
|
||||
import info.bukova.isspst.storage.StorageException;
|
||||
import org.hibernate.Query;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
@@ -22,6 +32,12 @@ public class TripBillApprovalServiceImpl extends RequirementBaseServiceImpl<Trip
|
||||
|
||||
@Autowired
|
||||
private RequirementTypeService reqTypeService;
|
||||
@Autowired
|
||||
private TripBillService tripBillService;
|
||||
@Autowired
|
||||
private SignedDocumentService signedDocumentService;
|
||||
|
||||
private final static Logger logger = LoggerFactory.getLogger(TripBillApproval.class);
|
||||
|
||||
@Override
|
||||
public TripBillApproval createApproval(TripBill bill) {
|
||||
@@ -32,6 +48,7 @@ public class TripBillApprovalServiceImpl extends RequirementBaseServiceImpl<Trip
|
||||
TripBillApproval approval = new TripBillApproval();
|
||||
approval.setCentre(bill.getRequirement().getCentre());
|
||||
approval.setWorkgroup(bill.getRequirement().getWorkgroup());
|
||||
approval.setSeason(bill.getSeason());
|
||||
approval.setReqDate(new Date());
|
||||
approval.setType(reqTypeService.getTypeById(Constants.REQTYPE_BUSINESSTRIP));
|
||||
approval.setState(RequirementState.NEW);
|
||||
@@ -58,4 +75,63 @@ public class TripBillApprovalServiceImpl extends RequirementBaseServiceImpl<Trip
|
||||
protected DataModel entityForSignReport(TripBillApproval entity) {
|
||||
return entity.getBill();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_DELETE') or this.canApprove(#bill.approval)")
|
||||
public void cancelApproval(TripBill bill) {
|
||||
TripBillApproval approval = bill.getApproval();
|
||||
|
||||
if (approval != null) {
|
||||
super.delete(approval);
|
||||
}
|
||||
|
||||
removeApproval(bill);
|
||||
}
|
||||
|
||||
private void removeApproval(TripBill bill) {
|
||||
bill.setApproval(null);
|
||||
tripBillService.update(bill);
|
||||
|
||||
try {
|
||||
signedDocumentService.deleteForEntity(bill);
|
||||
} catch (StorageException e) {
|
||||
logger.warn(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Module getModule() {
|
||||
return ModuleUtils.getModule(Constants.MOD_TRIPREQUIREMENTS);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_DELETE') or hasPermission(#entity, this.getDeleteEntityPermission())")
|
||||
public void delete(TripBillApproval entity) {
|
||||
TripBill bill = entity.getBill();
|
||||
|
||||
if (bill == null) {
|
||||
Query q = queryDao.getQuery("FROM TripBill WHERE APPROVAL_ID = :appId");
|
||||
q.setInteger("appId", entity.getId());
|
||||
bill = (TripBill) q.uniqueResult();
|
||||
}
|
||||
|
||||
if (bill != null) {
|
||||
dao.delete(entity);
|
||||
removeApproval(bill);
|
||||
} else {
|
||||
super.delete(entity);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Report> getReports() {
|
||||
List<Report> reports = new ArrayList<Report>();
|
||||
|
||||
reports.add(new Report(Constants.TRIB_BILLS_REP_ID, false, "Přehled vyúčtovaných CP", "tripBills"));
|
||||
reports.add(new Report(Constants.TRIB_BILLS_NP_REP_ID, false, "Přehled nevyúčtovaných CP", "tripBillsNP"));
|
||||
|
||||
return reports;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import info.bukova.isspst.data.TripBill;
|
||||
import info.bukova.isspst.data.TripRequirement;
|
||||
import info.bukova.isspst.services.Service;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
public interface TripBillService extends Service<TripBill> {
|
||||
@@ -15,6 +16,7 @@ public interface TripBillService extends Service<TripBill> {
|
||||
public List<TripBill> getMy();
|
||||
public void loadOwner(TripBill bill);
|
||||
public void loadPassengers(TripBill bill);
|
||||
public void setPaid(TripBill bill, Date date);
|
||||
|
||||
/**
|
||||
* Uloží vyúčtování a nastaví příznak přenosu vyúčtování od žadatele
|
||||
|
||||
@@ -6,6 +6,7 @@ import info.bukova.isspst.data.TripBill;
|
||||
import info.bukova.isspst.data.TripBillItem;
|
||||
import info.bukova.isspst.data.TripRequirement;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.HqlDataFilter;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||
import org.hibernate.Hibernate;
|
||||
@@ -23,6 +24,7 @@ import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implements
|
||||
@@ -45,6 +47,7 @@ public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implemen
|
||||
TripBill bill = new TripBill();
|
||||
|
||||
bill.setRequirement(requirement);
|
||||
bill.setSeason(requirement.getSeason());
|
||||
|
||||
if (!passengers) {
|
||||
bill.setDownPayment(requirement.getDownPayment());
|
||||
@@ -132,7 +135,7 @@ public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implemen
|
||||
}
|
||||
|
||||
if (item.getBackDeparture() == null) {
|
||||
timeBack = (new LocalTime()).withHourOfDay(23).withMinuteOfHour(59);
|
||||
timeBack = (new LocalTime()).withHourOfDay(23).withMinuteOfHour(00);
|
||||
allDay = true;
|
||||
} else {
|
||||
timeBack = new LocalTime(item.getBackDeparture());
|
||||
@@ -178,9 +181,10 @@ public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implemen
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||
public List<TripBill> getMy() {
|
||||
Query q = dao.getQuery("from TripBill where ownedBy = :owner");
|
||||
q.setParameter("owner", getLoggedInUser());
|
||||
return q.list();
|
||||
Query q = dao.getQuery("from TripBill");
|
||||
HqlDataFilter f = new HqlDataFilter("ownedBy = :owner");
|
||||
f.setParam("owner", getLoggedInUser());
|
||||
return filterQuery(q, f).list();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -212,6 +216,19 @@ public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implemen
|
||||
bill.getRequirement().setPassengers(tr.getPassengers());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_PAY_BILL')")
|
||||
public void setPaid(TripBill bill, Date date) {
|
||||
if (bill.getApproval() == null || bill.getApproval().getState() != RequirementState.APPROVED) {
|
||||
throw new PayException("BillNotApproved");
|
||||
}
|
||||
|
||||
bill.setPaid(true);
|
||||
bill.setPaidDate(date);
|
||||
super.update(bill);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@PreAuthorize("hasPermission(this, 'PERM_EDIT') or hasPermission(#entity, this.getUpdateEntityPermission())")
|
||||
@@ -252,7 +269,9 @@ public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implemen
|
||||
|
||||
@Override
|
||||
public boolean canPrintRecord(TripBill entity) {
|
||||
if (entity.getApproval() != null && entity.getApproval().getState() == RequirementState.APPROVED) {
|
||||
if (entity.getApproval() != null
|
||||
&& entity.getApproval().getState() == RequirementState.APPROVED
|
||||
&& (entity.getPaid() == null || !entity.getPaid())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -234,7 +234,7 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
|
||||
@Override
|
||||
@Transactional
|
||||
public List<User> getUsersForCombo() {
|
||||
Query q = dao.getQuery("from User u order by u.lastName");
|
||||
Query q = dao.getQuery("from User u where u.enabled = true order by u.lastName");
|
||||
return q.list();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package info.bukova.isspst.services.workgroups;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import info.bukova.isspst.data.JobMapping;
|
||||
import info.bukova.isspst.data.Member;
|
||||
import info.bukova.isspst.data.Role;
|
||||
@@ -9,6 +7,8 @@ import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface WorkgroupService extends Service<Workgroup> {
|
||||
|
||||
public void addMember(Workgroup workgroup, Member member, Role role);
|
||||
@@ -17,6 +17,7 @@ public interface WorkgroupService extends Service<Workgroup> {
|
||||
public List<Workgroup> getCentres();
|
||||
public boolean isMember(Workgroup workgroup, Member member);
|
||||
public List<Workgroup> getUserCentres(User user);
|
||||
public List<Workgroup> getUserCentres(User user, boolean userOnly);
|
||||
public List<Workgroup> getUserWorkgroups(User user);
|
||||
public List<Role> getUserWorkgroupRoles(Workgroup workgroup, User user);
|
||||
public List<Member> getMembers(Workgroup workgroup);
|
||||
|
||||
@@ -8,15 +8,14 @@ import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.AbstractOwnedService;
|
||||
import info.bukova.isspst.services.LazyLoader;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.LazyInitializationException;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implements WorkgroupService {
|
||||
|
||||
@Override
|
||||
@@ -125,7 +124,7 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
@Override
|
||||
@Transactional
|
||||
public List<Workgroup> getUserCentres(User user) {
|
||||
if (user.equals(getLoggedInUser()) && sessionData.getUserCentres() != null) {
|
||||
/*if (user.equals(getLoggedInUser()) && sessionData.getUserCentres() != null) {
|
||||
return sessionData.getUserCentres();
|
||||
}
|
||||
|
||||
@@ -150,6 +149,75 @@ public class WorkgroupServiceImpl extends AbstractOwnedService<Workgroup> implem
|
||||
}
|
||||
}
|
||||
}
|
||||
return centres;*/
|
||||
return getUserCentres(user, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public List<Workgroup> getUserCentres(User user, boolean userOnly) {
|
||||
if (!userOnly && user.equals(getLoggedInUser()) && sessionData.getUserCentres() != null) {
|
||||
return sessionData.getUserCentres();
|
||||
}
|
||||
|
||||
if (userOnly && user.equals(getLoggedInUser()) && sessionData.getUserOnlyCentres() != null) {
|
||||
return sessionData.getUserOnlyCentres();
|
||||
}
|
||||
|
||||
List<Workgroup> parents;
|
||||
|
||||
if (userOnly) {
|
||||
parents = filterUserOnly(user, getParents(user));
|
||||
} else {
|
||||
parents = getParents(user);
|
||||
}
|
||||
|
||||
if (parents == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<Workgroup> centres = new ArrayList<Workgroup>();
|
||||
for (Workgroup w : parents) {
|
||||
if (w.isCentre()) {
|
||||
centres.add(w);
|
||||
}
|
||||
}
|
||||
|
||||
List<Workgroup> workGroups;
|
||||
|
||||
if (userOnly) {
|
||||
workGroups = filterUserOnly(user, getUserWorkgroups(user));
|
||||
} else {
|
||||
workGroups = getUserWorkgroups(user);
|
||||
}
|
||||
|
||||
for (Workgroup w : workGroups) {
|
||||
loadParents(w);
|
||||
for (Workgroup centre : w.getParents()) {
|
||||
if (!centres.contains(centre)) {
|
||||
centres.add(centre);
|
||||
}
|
||||
}
|
||||
}
|
||||
return centres;
|
||||
}
|
||||
|
||||
private List<Workgroup> filterUserOnly(User user, List<Workgroup> wgList) {
|
||||
List<Workgroup> centres = new ArrayList<Workgroup>();
|
||||
|
||||
for (Workgroup wg : wgList) {
|
||||
List<Role> roles = getUserWorkgroupRoles(wg, user);
|
||||
if (roles == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (Role r : roles) {
|
||||
if (r.getAuthority().equals(Constants.ROLE_USER)) {
|
||||
centres.add(wg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return centres;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,170 @@
|
||||
package info.bukova.isspst.sort;
|
||||
|
||||
import org.zkoss.zul.Listheader;
|
||||
import info.bukova.isspst.StringUtils;
|
||||
import org.apache.poi.hssf.usermodel.*;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.CellStyle;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.zkoss.zk.au.AuRequest;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
import org.zkoss.zk.ui.event.*;
|
||||
import org.zkoss.zul.*;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.List;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class CzechSortListheader extends Listheader {
|
||||
static {
|
||||
addClientEvent(CzechSortListheader.class, Events.ON_RIGHT_CLICK, CE_IMPORTANT | CE_NON_DEFERRABLE);
|
||||
}
|
||||
|
||||
public void onRightClick() {
|
||||
Menupopup popup = new Menupopup();
|
||||
popup.setPage(this.getPage());
|
||||
popup.setWidth("250px");
|
||||
this.setContext(popup);
|
||||
|
||||
Menuitem item = new Menuitem();
|
||||
item.setLabel(StringUtils.localize("ExportToExcel"));
|
||||
item.setImage("/img/excel-032.png");
|
||||
item.setParent(popup);
|
||||
|
||||
item.addEventListener(Events.ON_CLICK, new EventListener() {
|
||||
@Override
|
||||
public void onEvent(org.zkoss.zk.ui.event.Event event) throws Exception {
|
||||
Listbox listBox = getListbox();
|
||||
|
||||
if (listBox != null) {
|
||||
HSSFWorkbook workBook = new HSSFWorkbook();
|
||||
HSSFSheet workSheet = workBook.createSheet("export");
|
||||
int rowNumber = 0;
|
||||
Row excelRow = null;
|
||||
Cell excelCell = null;
|
||||
|
||||
HSSFCellStyle cellStyle = workBook.createCellStyle();
|
||||
HSSFFont defaultFont = cellStyle.getFont(workBook);
|
||||
|
||||
HSSFCellStyle cellStyleNumber = workBook.createCellStyle();
|
||||
cellStyleNumber.setAlignment(CellStyle.ALIGN_RIGHT);
|
||||
//http://www.roseindia.net/java/poi/setdataformat.shtml
|
||||
//HSSFDataFormat dataNumberFormat = workBook.createDataFormat();
|
||||
//cellStyleNumber.setDataFormat(dataNumberFormat.getFormat("# ##0,00"));
|
||||
cellStyleNumber.setDataFormat((short)4);
|
||||
|
||||
HSSFCellStyle cellStyleDate = workBook.createCellStyle();
|
||||
cellStyleDate.setAlignment(CellStyle.ALIGN_RIGHT);
|
||||
//http://www.roseindia.net/java/poi/setdataformat.shtml
|
||||
HSSFDataFormat dataDateFormat = workBook.createDataFormat();
|
||||
cellStyleDate.setDataFormat(dataDateFormat.getFormat("DD. MM. YYYY"));
|
||||
//cellStyleDate.setDataFormat((short) 15);
|
||||
|
||||
int totalCols = 0;
|
||||
|
||||
Listhead listHead = listBox.getListhead();
|
||||
|
||||
if (listHead != null) {
|
||||
HSSFCellStyle cellStyleHeader = workBook.createCellStyle();
|
||||
cellStyleHeader.setAlignment(CellStyle.ALIGN_CENTER);
|
||||
HSSFFont font = workBook.createFont();
|
||||
font.setFontName(defaultFont.getFontName());
|
||||
font.setFontHeightInPoints(defaultFont.getFontHeightInPoints());
|
||||
font.setBold(true);
|
||||
cellStyleHeader.setFont(font);
|
||||
|
||||
excelRow = workSheet.createRow(rowNumber++);
|
||||
List<Listheader> headerList = listHead.getChildren();
|
||||
totalCols = headerList.size();
|
||||
|
||||
for (int i = 0; i < totalCols; i++) {
|
||||
Listheader listHeader = headerList.get(i);
|
||||
String label = listHeader.getLabel();
|
||||
excelCell = excelRow.createCell(i);
|
||||
excelCell.setCellStyle(cellStyleHeader);
|
||||
excelCell.setCellValue(label);
|
||||
}
|
||||
}
|
||||
|
||||
List<Listitem> itemList = listBox.getItems();
|
||||
|
||||
for (int i = 0; i < itemList.size(); i++) {
|
||||
Listitem item = itemList.get(i);
|
||||
excelRow = workSheet.createRow(rowNumber++);
|
||||
|
||||
List<Listcell> cellList = item.getChildren();
|
||||
|
||||
for (int k=0; k < cellList.size(); k++) {
|
||||
Listcell cell = cellList.get(k);
|
||||
String label = cell.getLabel();
|
||||
|
||||
HSSFCellStyle cellStyleActual = cellStyle;
|
||||
excelCell = excelRow.createCell(k);
|
||||
|
||||
if (label != null) {
|
||||
if (label.isEmpty()) {
|
||||
//List<Component> componentList = cell.getChildren();
|
||||
Component component = cell.getFirstChild();
|
||||
|
||||
if (component != null) {
|
||||
if (component instanceof Textbox) {
|
||||
Textbox textBox = (Textbox) component;
|
||||
label = textBox.getValue();
|
||||
}
|
||||
else if (component instanceof Button) {
|
||||
Button button = (Button) component;
|
||||
label = button.getLabel();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (label.matches("^[+-]?[0-9]{1,3}(,?[0-9]{3})*(\\.[0-9]+)?$")) {
|
||||
// english number -1,234.56 (change browser language)
|
||||
label = label.replace(",", " ");
|
||||
label = label.replace(".", ",");
|
||||
}
|
||||
|
||||
if (label.matches("^[+-]?[0-9]{1,3}([ \\xA0][0-9]{3})*([,][0-9]+)?$")) {
|
||||
// czech number -1 234,56
|
||||
cellStyleActual = cellStyleNumber;
|
||||
}
|
||||
else if (label.matches("[0-9]{1,2}[.][ \\xA0]?[0-9]{1,2}[.][ \\xA0]?[0-9]{4}")) {
|
||||
// czech date
|
||||
cellStyleActual = cellStyleDate;
|
||||
}
|
||||
}
|
||||
|
||||
excelCell.setCellStyle(cellStyleActual);
|
||||
excelCell.setCellValue(label);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < totalCols; i++) {
|
||||
//int width = workSheet.getColumnWidth(i);
|
||||
workSheet.autoSizeColumn(i);
|
||||
int width = workSheet.getColumnWidth(i);
|
||||
int maxWidth = 8000;
|
||||
|
||||
if (width > maxWidth) {
|
||||
workSheet.setColumnWidth(i, maxWidth);
|
||||
}
|
||||
}
|
||||
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
workBook.write(os);
|
||||
Filedownload.save(os.toByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "temp" + Long.toString(System.nanoTime()) + ".xlsx");
|
||||
// //Filedownload.save(tempFile, "application/vnd.ms-excel");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void service(AuRequest request, boolean everError) {
|
||||
super.service(request, everError);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSort(String type) {
|
||||
|
||||
if (type.startsWith("czech"))
|
||||
{
|
||||
// czech(propertyName)
|
||||
@@ -21,5 +178,4 @@ public class CzechSortListheader extends Listheader {
|
||||
super.setSort(type);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -44,6 +44,11 @@ public class DocumentFileStorageImpl extends AbstractFileStorage<FileMetainfo> i
|
||||
this.rootPath = rootPath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRootPath() {
|
||||
return this.rootPath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveFile(byte[] data, FileMetainfo fileID) {
|
||||
String fileName = generateFileName(fileID.getFileName());
|
||||
|
||||
@@ -9,7 +9,7 @@ import java.io.File;
|
||||
*/
|
||||
public interface FileStorage<T> {
|
||||
|
||||
// public String getRootPath();
|
||||
public String getRootPath();
|
||||
public void saveFile(byte[] data, T fileID);
|
||||
public void saveFile(File file, T fileId);
|
||||
public void removeFile(T fileID);
|
||||
|
||||
@@ -12,6 +12,11 @@ public class LocalFileStorage extends AbstractFileStorage<String> {
|
||||
this.rootPath = rootPath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRootPath() {
|
||||
return this.rootPath;
|
||||
}
|
||||
|
||||
public void setContext(ServletContext ctx) {
|
||||
this.context = ctx;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,11 @@ public class ReportFileStorageImpl extends AbstractFileStorage<SignedDocumentIte
|
||||
this.rootPath = rootPath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRootPath() {
|
||||
return this.rootPath;
|
||||
}
|
||||
|
||||
private String getFilePath(String fileName) {
|
||||
return rootPath + "/" + fileName;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
package info.bukova.isspst.ui;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.zkoss.bind.BindContext;
|
||||
import org.zkoss.bind.Converter;
|
||||
import org.zkoss.util.Locales;
|
||||
import org.zkoss.zk.ui.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.ParseException;
|
||||
import java.util.Locale;
|
||||
|
||||
public class BigDecimalFilterConverter implements Converter<String, BigDecimal, Component>
|
||||
{
|
||||
private final static Logger log = LoggerFactory.getLogger(BigDecimalFilterConverter.class.getName());
|
||||
|
||||
@Override
|
||||
public BigDecimal coerceToBean(String str, Component component, BindContext cx)
|
||||
{
|
||||
// BigDecimal val = BigDecimal.ZERO;
|
||||
BigDecimal val = null;
|
||||
|
||||
if (str != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
Locale loc = Locales.getCurrent();
|
||||
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(loc);
|
||||
format.setParseBigDecimal(true);
|
||||
val = (BigDecimal) format.parse(str);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
log.warn(str, e);
|
||||
}
|
||||
catch (ParseException e)
|
||||
{
|
||||
log.warn(str, e);
|
||||
}
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String coerceToUi(BigDecimal val, Component component, BindContext cx)
|
||||
{
|
||||
Locale loc = Locales.getCurrent();
|
||||
|
||||
if (val == null)
|
||||
{
|
||||
return "";
|
||||
//val = BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
val = val.setScale(2, BigDecimal.ROUND_DOWN);
|
||||
|
||||
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(loc);
|
||||
format.setMaximumFractionDigits(2);
|
||||
format.setMinimumFractionDigits(0);
|
||||
format.setGroupingUsed(true);
|
||||
format.setGroupingSize(3);
|
||||
String formatted = format.format(val);
|
||||
return formatted;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,6 +16,18 @@ import org.zkoss.zul.Messagebox;
|
||||
|
||||
public class DocumentViewModel
|
||||
{
|
||||
protected BigDecimalFilterConverter standardBigDecimalFilterConverter;
|
||||
|
||||
public BigDecimalFilterConverter getStandardBigDecimalFilterConverter()
|
||||
{
|
||||
return standardBigDecimalFilterConverter;
|
||||
}
|
||||
|
||||
public void setStandardBigDecimalFilterConverter(BigDecimalFilterConverter standardBigDecimalFilterConverter)
|
||||
{
|
||||
this.standardBigDecimalFilterConverter = standardBigDecimalFilterConverter;
|
||||
}
|
||||
|
||||
protected BigDecimalConverter standardBigDecimalConverter;
|
||||
|
||||
protected BoolConverter standardBoolConverter;
|
||||
@@ -53,6 +65,7 @@ public class DocumentViewModel
|
||||
@Init
|
||||
public void initDocumentViewModel()
|
||||
{
|
||||
this.standardBigDecimalFilterConverter = new BigDecimalFilterConverter();
|
||||
this.standardBigDecimalConverter = new BigDecimalConverter();
|
||||
this.standardBoolConverter = new BoolConverter();
|
||||
}
|
||||
|
||||
@@ -5,10 +5,6 @@ import info.bukova.isspst.data.DataModel;
|
||||
import info.bukova.isspst.services.IsspstException;
|
||||
import info.bukova.isspst.services.Service;
|
||||
import info.bukova.isspst.services.ValidationException;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Map;
|
||||
|
||||
import org.hibernate.exception.ConstraintViolationException;
|
||||
import org.springframework.dao.DataIntegrityViolationException;
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
@@ -20,12 +16,15 @@ import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zul.Messagebox;
|
||||
import org.zkoss.zul.Window;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.Map;
|
||||
|
||||
public class FormViewModel<T extends DataModel> extends BindingViewModel<T>
|
||||
{
|
||||
private T dataBean;
|
||||
private Map<String, String> errMessages;
|
||||
private Service<T> service;
|
||||
private boolean newRec;
|
||||
protected boolean newRec;
|
||||
private ServiceConstraint<T> constraint;
|
||||
|
||||
@Init
|
||||
|
||||
@@ -2,15 +2,13 @@ package info.bukova.isspst.ui;
|
||||
|
||||
import info.bukova.isspst.StringUtils;
|
||||
import info.bukova.isspst.data.DataModel;
|
||||
import info.bukova.isspst.data.Season;
|
||||
import info.bukova.isspst.data.SeasonsAware;
|
||||
import info.bukova.isspst.filters.Filter;
|
||||
import info.bukova.isspst.services.HqlDataFilter;
|
||||
import info.bukova.isspst.services.IsspstException;
|
||||
import info.bukova.isspst.services.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.dao.DataIntegrityViolationException;
|
||||
@@ -24,9 +22,17 @@ import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zk.ui.Executions;
|
||||
import org.zkoss.zk.ui.event.Event;
|
||||
import org.zkoss.zk.ui.event.EventListener;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
import org.zkoss.zul.Listheader;
|
||||
import org.zkoss.zul.Messagebox;
|
||||
import org.zkoss.zul.Window;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
{
|
||||
|
||||
@@ -44,6 +50,14 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
private boolean sortDesc = true;
|
||||
private boolean newRec = false;
|
||||
private boolean fullFill = false;
|
||||
private Listheader sortHeader;
|
||||
|
||||
@WireVariable
|
||||
private SeasonService seasonService;
|
||||
private List<Season> seasons;
|
||||
private Season selSeason;
|
||||
@WireVariable
|
||||
private HqlDataFilter hqlFilter;
|
||||
|
||||
protected Service<T> service;
|
||||
protected Class<T> dataClass;
|
||||
@@ -54,6 +68,9 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
public void initListViewModel()
|
||||
{
|
||||
super.initDocumentViewModel();
|
||||
seasons = seasonService.getAllSeasons();
|
||||
selSeason = seasonService.getActive();
|
||||
setHqlFilter();
|
||||
}
|
||||
|
||||
public List<T> getDataList() {
|
||||
@@ -126,6 +143,7 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
dataList = fullList;
|
||||
dataBean = null;
|
||||
selIndex = -1;
|
||||
restoreSort();
|
||||
} else {
|
||||
doFilter();
|
||||
dataBean = null;
|
||||
@@ -185,7 +203,6 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
}
|
||||
|
||||
@Command
|
||||
@NotifyChange({ "dataList", "dataBean" })
|
||||
public void delete() {
|
||||
Messagebox.show(StringUtils.localize("DbReallyDelete"), StringUtils.localize("DbDeleteRecord"), Messagebox.YES
|
||||
| Messagebox.NO, Messagebox.QUESTION,
|
||||
@@ -266,6 +283,7 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
|
||||
BindUtils.postGlobalCommand(null, null, "reloadRelated", null);
|
||||
|
||||
restoreUserView();
|
||||
}
|
||||
|
||||
@GlobalCommand
|
||||
@@ -273,11 +291,12 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
public void reload() {
|
||||
dataBean = null;
|
||||
dataList.clear();
|
||||
setHqlFilter();
|
||||
loadFromDbSync();
|
||||
}
|
||||
|
||||
@Command
|
||||
@NotifyChange({"selIndex", "dataBean"})
|
||||
@NotifyChange({"selIndex", "dataBean", "ableToDelete"})
|
||||
public void afterRender() {
|
||||
if (editBean != null && !editBean.isValid()) {
|
||||
return;
|
||||
@@ -329,14 +348,13 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
}
|
||||
|
||||
@Command
|
||||
@NotifyChange("dataBean")
|
||||
public void onSort(@BindingParam("column") String column) {
|
||||
if (sortCol == null || this.sortCol.equals(column))
|
||||
this.sortDesc = !this.sortDesc;
|
||||
|
||||
this.sortCol = column;
|
||||
@NotifyChange({"dataBean", "canApprove"})
|
||||
public void onSortHeader(@BindingParam("header") Listheader header) {
|
||||
sortHeader = header;
|
||||
selIndex = -1;
|
||||
dataBean = null;
|
||||
Collections.sort(dataList,
|
||||
sortHeader.getSortDirection().equals("ascending") ? sortHeader.getSortDescending() : sortHeader.getSortAscending());
|
||||
}
|
||||
|
||||
public int getSelIndex() {
|
||||
@@ -392,6 +410,27 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
this.fullFill = fullFill;
|
||||
}
|
||||
|
||||
protected void restoreUserView() {
|
||||
int sel = selIndex;
|
||||
|
||||
restoreFilter();
|
||||
restoreSort();
|
||||
selIndex = sel;
|
||||
}
|
||||
|
||||
private void restoreSort() {
|
||||
if (sortHeader != null) {
|
||||
Collections.sort(dataList,
|
||||
sortHeader.getSortDirection().equals("ascending") ? sortHeader.getSortAscending() : sortHeader.getSortDescending());
|
||||
}
|
||||
}
|
||||
|
||||
private void restoreFilter() {
|
||||
if (filter) {
|
||||
doFilter();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isRecordSelected()
|
||||
{
|
||||
return (dataBean != null);
|
||||
@@ -399,11 +438,61 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
|
||||
|
||||
public boolean isAbleToDelete()
|
||||
{
|
||||
if (isSeasonFilter()
|
||||
&&(!seasonService.getActive().equals(selSeason))) {
|
||||
return false;
|
||||
}
|
||||
return this.isRecordSelected();
|
||||
}
|
||||
|
||||
public boolean isAbleToAdd()
|
||||
{
|
||||
if (isSeasonFilter()
|
||||
&&(!seasonService.getActive().equals(selSeason))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<Season> getSeasons() {
|
||||
return seasons;
|
||||
}
|
||||
|
||||
public Season getSelSeason() {
|
||||
return selSeason;
|
||||
}
|
||||
|
||||
public void setSelSeason(Season selSeason) {
|
||||
this.selSeason = selSeason;
|
||||
}
|
||||
|
||||
private void setHqlFilter() {
|
||||
if (selSeason == null) {
|
||||
hqlFilter.reset();
|
||||
} else {
|
||||
hqlFilter.setWhere("SEASON_ID = :season");
|
||||
hqlFilter.setParam("season", selSeason.getId());
|
||||
hqlFilter.setDataClass(SeasonsAware.class);
|
||||
}
|
||||
}
|
||||
|
||||
@Command
|
||||
@NotifyChange({"dataList", "ableToAdd", "selIndex", "dataBean", "ableToDelete"})
|
||||
public void filterSeason() {
|
||||
setHqlFilter();
|
||||
dataList.clear();
|
||||
loadFromDbSync();
|
||||
dataBean = null;
|
||||
selIndex = -1;
|
||||
}
|
||||
|
||||
public boolean isSeasonFilter() {
|
||||
for (Class<?> clazz : service.getEntityClasses()) {
|
||||
if (SeasonsAware.class.isAssignableFrom(clazz)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ public class MainMenu
|
||||
@Command
|
||||
public void numSeries()
|
||||
{
|
||||
Window window = (Window) Executions.createComponents("/settings/numberSeries.zul", null, null);
|
||||
Window window = (Window) Executions.createComponents("/settings/seasons.zul", null, null);
|
||||
window.doModal();
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,12 @@ import info.bukova.isspst.data.Role;
|
||||
import info.bukova.isspst.data.User;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.invoicing.InvoicingService;
|
||||
import info.bukova.isspst.services.limits.LimitService;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.ui.DocumentViewModel;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
@@ -14,9 +17,6 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
public class DashBoardVM extends DocumentViewModel {
|
||||
|
||||
@WireVariable
|
||||
@@ -25,9 +25,12 @@ public class DashBoardVM extends DocumentViewModel {
|
||||
private UserService userService;
|
||||
@WireVariable
|
||||
private InvoicingService invoicingService;
|
||||
@WireVariable
|
||||
private LimitService limitService;
|
||||
private User user;
|
||||
private Map<Workgroup, List<Role>> groupRoles;
|
||||
private Map<Workgroup, BigDecimal> workgroupSpent;
|
||||
private Map<Workgroup, BigDecimal> workgroupLimit;
|
||||
|
||||
@Init(superclass = true)
|
||||
public void init() {
|
||||
@@ -35,6 +38,7 @@ public class DashBoardVM extends DocumentViewModel {
|
||||
|
||||
groupRoles = new HashMap<Workgroup, List<Role>>();
|
||||
workgroupSpent = new HashMap<Workgroup, BigDecimal>();
|
||||
workgroupLimit = new HashMap<Workgroup, BigDecimal>();
|
||||
|
||||
List<Workgroup> wg = new ArrayList<Workgroup>();
|
||||
if (workgroupService.getUserCentres(user) != null) {
|
||||
@@ -48,6 +52,9 @@ public class DashBoardVM extends DocumentViewModel {
|
||||
List<Role> r = workgroupService.getUserWorkgroupRoles(w, user);
|
||||
groupRoles.put(w, r);
|
||||
workgroupSpent.put(w, invoicingService.totalInvoicedForWorkgroup(w));
|
||||
if (limitService.getForWorkgroup(w) != null) {
|
||||
workgroupLimit.put(w, limitService.getForWorkgroup(w).getLimit());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,4 +78,8 @@ public class DashBoardVM extends DocumentViewModel {
|
||||
return workgroupSpent;
|
||||
}
|
||||
|
||||
public Map<Workgroup, BigDecimal> getWorkgroupLimit() {
|
||||
return workgroupLimit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package info.bukova.isspst.ui.limits;
|
||||
|
||||
import info.bukova.isspst.data.Limit;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.limits.LimitService;
|
||||
import info.bukova.isspst.services.settings.SeasonService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.ui.FormViewModel;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class LimitsForm extends FormViewModel<Limit> {
|
||||
|
||||
List<Workgroup> workgroups;
|
||||
@WireVariable
|
||||
WorkgroupService workgroupService;
|
||||
@WireVariable
|
||||
LimitService limitService;
|
||||
@WireVariable
|
||||
SeasonService seasonService;
|
||||
|
||||
@Init(superclass = true)
|
||||
public void init() {
|
||||
workgroups = workgroupService.getWorkgroups();
|
||||
if (getDataBean().getWorkgroup() == null) {
|
||||
List<Limit> limits = limitService.getForSeason(seasonService.getActive());
|
||||
|
||||
for (Limit l : limits) {
|
||||
workgroups.remove(l.getWorkgroup());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<Workgroup> getWorkgroups() {
|
||||
return workgroups;
|
||||
}
|
||||
|
||||
public boolean isNewRec() {
|
||||
return newRec;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
package info.bukova.isspst.ui.limits;
|
||||
|
||||
import info.bukova.isspst.StringUtils;
|
||||
import info.bukova.isspst.data.Limit;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.services.invoicing.InvoicingService;
|
||||
import info.bukova.isspst.services.limits.LimitService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.ui.ListViewModel;
|
||||
import org.jfree.chart.ChartFactory;
|
||||
import org.jfree.chart.ChartUtilities;
|
||||
import org.jfree.chart.JFreeChart;
|
||||
import org.jfree.chart.plot.CategoryPlot;
|
||||
import org.jfree.chart.plot.PlotOrientation;
|
||||
import org.jfree.chart.renderer.category.BarRenderer3D;
|
||||
import org.jfree.chart.title.LegendTitle;
|
||||
import org.jfree.data.category.DefaultCategoryDataset;
|
||||
import org.jfree.ui.RectangleEdge;
|
||||
import org.zkoss.bind.annotation.GlobalCommand;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.RenderedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class LimitsList extends ListViewModel<Limit> {
|
||||
|
||||
@WireVariable
|
||||
private LimitService limitService;
|
||||
@WireVariable
|
||||
private InvoicingService invoicingService;
|
||||
@WireVariable
|
||||
private WorkgroupService workgroupService;
|
||||
private Map<Limit, BigDecimal> spent;
|
||||
private RenderedImage chart;
|
||||
|
||||
@Init(superclass = true)
|
||||
public void init() {
|
||||
service = limitService;
|
||||
dataClass = Limit.class;
|
||||
formZul = "limitForm.zul";
|
||||
//dataFilter = new MUnitFilter(getFilterTemplate());
|
||||
genSpent();
|
||||
}
|
||||
|
||||
public Map<Limit, BigDecimal> getSpent() {
|
||||
if (spent != null && !getDataList().isEmpty()) {
|
||||
for (Limit l : spent.keySet()) {
|
||||
if (!l.getSeason().equals(getDataList().get(0).getSeason())) {
|
||||
spent = null;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (spent != null && spent.keySet().size() < getDataList().size()) {
|
||||
spent = null;
|
||||
}
|
||||
|
||||
if (spent != null) {
|
||||
return spent;
|
||||
}
|
||||
|
||||
spent = new HashMap<Limit, BigDecimal>();
|
||||
for (Limit l : getDataList()) {
|
||||
spent.put(l, invoicingService.totalInvoicedForWorkgroupAndSeason(l.getWorkgroup(), getSelSeason()));
|
||||
}
|
||||
|
||||
return spent;
|
||||
}
|
||||
|
||||
private void genSpent() {
|
||||
spent = new HashMap<Limit, BigDecimal>();
|
||||
for (Limit l : getDataList()) {
|
||||
spent.put(l, invoicingService.totalInvoicedForWorkgroupAndSeason(l.getWorkgroup(), getSelSeason()));
|
||||
}
|
||||
}
|
||||
|
||||
private void genCharts() {
|
||||
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
|
||||
|
||||
for (Workgroup wg : workgroupService.getWorkgroups()) {
|
||||
Limit limit = null;
|
||||
for (Limit l : getDataList()) {
|
||||
if (l.getWorkgroup().equals(wg)) {
|
||||
limit = l;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dataSet.addValue(limit == null ? null : limit.getLimit(), StringUtils.localize("LimitsLimit"), wg.getFullName());
|
||||
dataSet.addValue(invoicingService.totalInvoicedForWorkgroupAndSeason(wg, getSelSeason()), StringUtils.localize("LimitsSpent"), wg.getFullName());
|
||||
}
|
||||
|
||||
JFreeChart jfChart = ChartFactory.createBarChart3D(StringUtils.localize("LimitsChartTitle"), StringUtils.localize("LimitsWorkgroup"),
|
||||
StringUtils.localize("LimitsAmount"), dataSet, PlotOrientation.HORIZONTAL, true, false, false);
|
||||
CategoryPlot plot = (CategoryPlot) jfChart.getPlot();
|
||||
BarRenderer3D renderer = (BarRenderer3D) plot.getRenderer();
|
||||
renderer.setSeriesPaint(0, Color.GREEN);
|
||||
renderer.setSeriesPaint(1, Color.RED);
|
||||
|
||||
LegendTitle legend = jfChart.getLegend();
|
||||
legend.setPosition(RectangleEdge.RIGHT);
|
||||
|
||||
try {
|
||||
chart = ImageIO.read(new ByteArrayInputStream(ChartUtilities.encodeAsPNG(jfChart.createBufferedImage(1000, 400))));
|
||||
} catch (IOException e) {
|
||||
chart = null;
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public RenderedImage getChart() {
|
||||
genCharts();
|
||||
return chart;
|
||||
}
|
||||
|
||||
@Override
|
||||
@GlobalCommand
|
||||
@NotifyChange({ "dataList", "dataBean", "ableToDelete", "chart", "spent" })
|
||||
public void refresh() {
|
||||
genSpent();
|
||||
super.refresh();
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,5 @@
|
||||
package info.bukova.isspst.ui.mail;
|
||||
|
||||
import static ch.lambdaj.Lambda.filter;
|
||||
import static ch.lambdaj.Lambda.having;
|
||||
import static ch.lambdaj.Lambda.on;
|
||||
import static org.hamcrest.Matchers.startsWith;
|
||||
import info.bukova.isspst.data.Address;
|
||||
import info.bukova.isspst.data.Member;
|
||||
import info.bukova.isspst.data.User;
|
||||
@@ -15,10 +11,6 @@ import info.bukova.isspst.reporting.ReportDefinition;
|
||||
import info.bukova.isspst.services.addressbook.AdbService;
|
||||
import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.ui.DocumentViewModel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.annotation.BindingParam;
|
||||
import org.zkoss.bind.annotation.Command;
|
||||
@@ -28,6 +20,14 @@ import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
import org.zkoss.zul.Window;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static ch.lambdaj.Lambda.filter;
|
||||
import static ch.lambdaj.Lambda.having;
|
||||
import static ch.lambdaj.Lambda.on;
|
||||
import static org.hamcrest.Matchers.startsWith;
|
||||
|
||||
public class MailForm extends DocumentViewModel
|
||||
{
|
||||
|
||||
@@ -69,7 +69,7 @@ public class MailForm extends DocumentViewModel
|
||||
addressbook = new ArrayList<Address>();
|
||||
}
|
||||
|
||||
users = userService.getAll();
|
||||
users = userService.getUsersForCombo();
|
||||
|
||||
selectedAddresses = new ArrayList<Address>();
|
||||
selectedUsers = new ArrayList<User>();
|
||||
|
||||
@@ -72,6 +72,7 @@ public class ApproveDialogVM {
|
||||
BindUtils.postNotifyChange(null, null, grid, "dataBean");
|
||||
BindUtils.postNotifyChange(null, null, grid, "canApprove");
|
||||
BindUtils.postGlobalCommand(null, null, "reload", null);
|
||||
grid.refresh();
|
||||
window.detach();
|
||||
} catch (ApproveException ex) {
|
||||
Messagebox.show(StringUtils.localize(ex.getReason()), StringUtils.localize("Error"), Messagebox.OK,
|
||||
|
||||
@@ -29,7 +29,6 @@ public class InvoicingList extends ListViewModel<Invoicing> {
|
||||
public void initInvoicing() {
|
||||
service = invoicingService;
|
||||
dataClass = Invoicing.class;
|
||||
formZul = "invoicingForm.zul";
|
||||
dataFilter = new InvoicingFilter(getFilterTemplate());
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package info.bukova.isspst.ui.main.invoicing;
|
||||
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class InvoicingMaterialArchiveList extends InvoicingList {
|
||||
|
||||
@Init(superclass = true)
|
||||
public void initInvoicingMaterialArchiveList()
|
||||
{
|
||||
formZul = "/main/invoicing/material/invHeadForm.zul";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Invoicing> getListFromService() {
|
||||
try
|
||||
{
|
||||
return invoicingService.getMaterialArchiveList();
|
||||
}
|
||||
catch (AccessDeniedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return new ArrayList<Invoicing>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package info.bukova.isspst.ui.main.invoicing;
|
||||
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class InvoicingMaterialPendingList extends InvoicingList {
|
||||
|
||||
@Init(superclass = true)
|
||||
public void initInvoicingMaterialPendingList()
|
||||
{
|
||||
formZul = "/main/invoicing/material/invHeadForm.zul";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Invoicing> getListFromService() {
|
||||
try
|
||||
{
|
||||
return invoicingService.getMaterialPendingList();
|
||||
}
|
||||
catch (AccessDeniedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return new ArrayList<Invoicing>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
package info.bukova.isspst.ui.main.invoicing;
|
||||
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
|
||||
public class InvoicingPendingList extends InvoicingList
|
||||
{
|
||||
@Init(superclass = true)
|
||||
public void initInvoicingPendingList()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Invoicing> getListFromService()
|
||||
{
|
||||
try
|
||||
{
|
||||
return invoicingService.getPendingList();
|
||||
}
|
||||
catch (AccessDeniedException e)
|
||||
{
|
||||
// BindUtils.postGlobalCommand(null, null, "disableCentre", null);
|
||||
// e.printStackTrace();
|
||||
return new ArrayList<Invoicing>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package info.bukova.isspst.ui.main.invoicing;
|
||||
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class InvoicingServicesArchiveList extends InvoicingList {
|
||||
|
||||
@Init(superclass = true)
|
||||
public void initInvoicingServicesArchiveList()
|
||||
{
|
||||
formZul = "/main/invoicing/services/invHeadForm.zul";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Invoicing> getListFromService() {
|
||||
try
|
||||
{
|
||||
return invoicingService.getServicesArchiveList();
|
||||
}
|
||||
catch (AccessDeniedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return new ArrayList<Invoicing>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package info.bukova.isspst.ui.main.invoicing;
|
||||
|
||||
import info.bukova.isspst.data.Invoicing;
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class InvoicingServicesPendingList extends InvoicingList {
|
||||
|
||||
@Init(superclass = true)
|
||||
public void initInvoicingServicesPendingList()
|
||||
{
|
||||
formZul = "/main/invoicing/services/invHeadForm.zul";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<Invoicing> getListFromService() {
|
||||
try
|
||||
{
|
||||
return invoicingService.getServicesPendingList();
|
||||
}
|
||||
catch (AccessDeniedException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return new ArrayList<Invoicing>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,6 @@ import info.bukova.isspst.filters.RequirementFilter;
|
||||
import info.bukova.isspst.services.requirement.RequirementService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.ui.requirement.RequirementSubpage;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.BindUtils;
|
||||
import org.zkoss.bind.annotation.GlobalCommand;
|
||||
@@ -18,6 +13,10 @@ import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ReqListMyAll extends RequirementSubpage<Requirement>
|
||||
{
|
||||
@WireVariable
|
||||
@@ -55,10 +54,11 @@ public class ReqListMyAll extends RequirementSubpage<Requirement>
|
||||
}
|
||||
|
||||
@GlobalCommand
|
||||
@NotifyChange({ "dataList", "dataBean", "fullFill" })
|
||||
@NotifyChange({ "dataList", "dataBean", "fullFill", "selIndex" })
|
||||
public void reloadRelated()
|
||||
{
|
||||
this.reload();
|
||||
restoreUserView();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -6,11 +6,6 @@ import info.bukova.isspst.filters.RequirementFilter;
|
||||
import info.bukova.isspst.services.requirement.RequirementService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.ui.requirement.RequirementSubpage;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.BindUtils;
|
||||
import org.zkoss.bind.annotation.GlobalCommand;
|
||||
@@ -18,6 +13,10 @@ import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ReqListMyCenters extends RequirementSubpage<Requirement>
|
||||
{
|
||||
@WireVariable
|
||||
@@ -55,10 +54,11 @@ public class ReqListMyCenters extends RequirementSubpage<Requirement>
|
||||
}
|
||||
|
||||
@GlobalCommand
|
||||
@NotifyChange({ "dataList", "dataBean", "fullFill" })
|
||||
@NotifyChange({ "dataList", "dataBean", "fullFill", "selIndex" })
|
||||
public void reloadRelated()
|
||||
{
|
||||
this.reload();
|
||||
restoreUserView();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+44
-7
@@ -1,16 +1,14 @@
|
||||
package info.bukova.isspst.ui.main.orders.requirements;
|
||||
|
||||
import info.bukova.isspst.data.Limit;
|
||||
import info.bukova.isspst.data.Requirement;
|
||||
import info.bukova.isspst.data.Workgroup;
|
||||
import info.bukova.isspst.filters.RequirementFilter;
|
||||
import info.bukova.isspst.services.invoicing.InvoicingService;
|
||||
import info.bukova.isspst.services.limits.LimitService;
|
||||
import info.bukova.isspst.services.requirement.RequirementService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.ui.requirement.RequirementSubpage;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.zkoss.bind.BindUtils;
|
||||
import org.zkoss.bind.annotation.GlobalCommand;
|
||||
@@ -18,6 +16,10 @@ import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ReqListMyWorkgroups extends RequirementSubpage<Requirement>
|
||||
{
|
||||
@WireVariable
|
||||
@@ -26,6 +28,12 @@ public class ReqListMyWorkgroups extends RequirementSubpage<Requirement>
|
||||
@WireVariable
|
||||
protected WorkgroupService workgroupService;
|
||||
|
||||
@WireVariable
|
||||
protected LimitService limitService;
|
||||
|
||||
@WireVariable
|
||||
protected InvoicingService invoicingService;
|
||||
|
||||
public List<Workgroup> getCentres()
|
||||
{
|
||||
return workgroupService.getCentres();
|
||||
@@ -55,10 +63,11 @@ public class ReqListMyWorkgroups extends RequirementSubpage<Requirement>
|
||||
}
|
||||
|
||||
@GlobalCommand
|
||||
@NotifyChange({ "dataList", "dataBean", "fullFill" })
|
||||
@NotifyChange({ "dataList", "dataBean", "fullFill", "selIndex" })
|
||||
public void reloadRelated()
|
||||
{
|
||||
this.reload();
|
||||
restoreUserView();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -75,8 +84,36 @@ public class ReqListMyWorkgroups extends RequirementSubpage<Requirement>
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotifyChange({ "dataBean", "ableToDelete", "canApprove", "invoicedAmount" })
|
||||
@NotifyChange({ "dataBean", "ableToDelete", "canApprove", "invoicedAmount", "workgroupLimit", "workgroupInvoiced" })
|
||||
public void setDataBean(Requirement data) {
|
||||
super.setDataBean(data);
|
||||
}
|
||||
|
||||
public BigDecimal getWorkgroupLimit() {
|
||||
if (getDataBean() != null && getDataBean().getWorkgroup() != null) {
|
||||
Limit limit = limitService.getForWorkgroup(getDataBean().getWorkgroup());
|
||||
|
||||
if (limit == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return limit.getLimit();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public BigDecimal getWorkgroupInvoiced() {
|
||||
if (getDataBean() != null && getDataBean().getWorkgroup() != null) {
|
||||
BigDecimal invoiced = invoicingService.totalInvoicedForWorkgroup(getDataBean().getWorkgroup());
|
||||
|
||||
if (invoiced == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return invoiced;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,10 +12,6 @@ import info.bukova.isspst.services.users.UserService;
|
||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||
import info.bukova.isspst.ui.FormViewModel;
|
||||
import info.bukova.isspst.validators.RequirementFormValidator;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.zkoss.bind.BindUtils;
|
||||
@@ -29,6 +25,10 @@ import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
import org.zkoss.zul.Window;
|
||||
import org.zkoss.zul.impl.InputElement;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RequirementForm extends FormViewModel<Requirement>
|
||||
{
|
||||
private final static Logger log = LoggerFactory.getLogger(RequirementForm.class.getName());
|
||||
@@ -112,7 +112,14 @@ public class RequirementForm extends FormViewModel<Requirement>
|
||||
this.setRequirementFormValidator(new RequirementFormValidator());
|
||||
this.setSyncItems(this.getDataBean().getItems());
|
||||
requirementService.loadType(getDataBean());
|
||||
this.centres = reqTypeService.filterCentres(getDataBean().getType(), workgroupService.getUserCentres(userService.getCurrent()));
|
||||
|
||||
if (isEditRec()) {
|
||||
List<Workgroup> current = new ArrayList<Workgroup>();
|
||||
current.add(getDataBean().getCentre());
|
||||
this.centres = current;
|
||||
} else {
|
||||
this.centres = reqTypeService.filterCentres(getDataBean().getType(), workgroupService.getUserCentres(userService.getCurrent(), true));
|
||||
}
|
||||
}
|
||||
|
||||
public List<RequirementItem> getSyncItems()
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package info.bukova.isspst.ui.renderers;
|
||||
|
||||
import info.bukova.isspst.data.JobMapping;
|
||||
import info.bukova.isspst.data.User;
|
||||
import org.zkoss.zul.Listbox;
|
||||
import org.zkoss.zul.Listitem;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class JobMappingItemRenderer extends GenericListitemRenderer<JobMapping> {
|
||||
|
||||
|
||||
@Override
|
||||
protected void changeProperties(Listbox lb, Listitem li, int index, String varnm) {
|
||||
JobMapping jm = getObjectOfStates();
|
||||
|
||||
if (jm.getMember() instanceof User && !((User)jm.getMember()).isEnabled()) {
|
||||
li.setSclass("user-disabled");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package info.bukova.isspst.ui.renderers;
|
||||
|
||||
import info.bukova.isspst.data.RequirementState;
|
||||
import info.bukova.isspst.data.TripBillApproval;
|
||||
import org.zkoss.zul.Listbox;
|
||||
import org.zkoss.zul.Listitem;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class TripBillApprovalItemRenderer extends GenericListitemRenderer<TripBillApproval> {
|
||||
|
||||
@Override
|
||||
protected void changeProperties(Listbox lb, Listitem li, int index, String varnm) {
|
||||
|
||||
RequirementState state = getObjectOfStates().getState();
|
||||
|
||||
if (state != null) {
|
||||
if (state == RequirementState.PARTIALLY) {
|
||||
li.setSclass("req-select-partially");
|
||||
}
|
||||
else if (state == RequirementState.APPROVED) {
|
||||
Boolean isPaid;
|
||||
|
||||
if (getObjectOfStates().getBill() == null) {
|
||||
isPaid = false;
|
||||
} else {
|
||||
isPaid = getObjectOfStates().getBill().getPaid();
|
||||
}
|
||||
|
||||
if ((isPaid != null) && (isPaid.booleanValue() == true)) {
|
||||
li.setSclass("req-select-approved-project");
|
||||
}
|
||||
else {
|
||||
li.setSclass("req-select-approved");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package info.bukova.isspst.ui.renderers;
|
||||
|
||||
import info.bukova.isspst.data.User;
|
||||
import org.zkoss.zul.Listbox;
|
||||
import org.zkoss.zul.Listitem;
|
||||
|
||||
/**
|
||||
* @author Pepa Rokos
|
||||
*/
|
||||
public class UserItemRenderer extends GenericListitemRenderer<User> {
|
||||
|
||||
@Override
|
||||
protected void changeProperties(Listbox lb, Listitem li, int index, String varnm) {
|
||||
User u = getObjectOfStates();
|
||||
|
||||
if (!u.isEnabled()) {
|
||||
li.setSclass("user-disabled");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,13 @@
|
||||
package info.bukova.isspst.ui.reporting;
|
||||
|
||||
import info.bukova.isspst.Module;
|
||||
import info.bukova.isspst.ModuleUtils;
|
||||
import info.bukova.isspst.data.DataModel;
|
||||
import info.bukova.isspst.reporting.Report;
|
||||
import info.bukova.isspst.reporting.ReportDefinition;
|
||||
import info.bukova.isspst.reporting.ReportType;
|
||||
import info.bukova.isspst.services.Service;
|
||||
import info.bukova.isspst.sort.ReflectionTools;
|
||||
import info.bukova.isspst.ui.DocumentViewModel;
|
||||
import org.zkoss.bind.annotation.BindingParam;
|
||||
import org.zkoss.bind.annotation.Command;
|
||||
@@ -11,9 +15,12 @@ import org.zkoss.bind.annotation.ExecutionArgParam;
|
||||
import org.zkoss.bind.annotation.Init;
|
||||
import org.zkoss.bind.annotation.NotifyChange;
|
||||
import org.zkoss.zk.ui.Executions;
|
||||
import org.zkoss.zk.ui.Sessions;
|
||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
import org.zkoss.zul.Window;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.List;
|
||||
|
||||
public class ReportDialogVM extends DocumentViewModel
|
||||
@@ -25,6 +32,7 @@ public class ReportDialogVM extends DocumentViewModel
|
||||
private ReportDefinition reportDefinition;
|
||||
private List<Object> dataList;
|
||||
private Object singleObject;
|
||||
private ServletContext ctx;
|
||||
|
||||
@Init(superclass = true)
|
||||
public void init(@ExecutionArgParam("reports") List<Report> reports,
|
||||
@@ -40,6 +48,8 @@ public class ReportDialogVM extends DocumentViewModel
|
||||
dataList = data;
|
||||
this.singleObject = singleObject;
|
||||
reportDefinition.setService(service);
|
||||
|
||||
ctx = Sessions.getCurrent().getWebApp().getServletContext();
|
||||
}
|
||||
|
||||
public List<Report> getReports() {
|
||||
@@ -59,12 +69,37 @@ public class ReportDialogVM extends DocumentViewModel
|
||||
this.selected = selected;
|
||||
reportDefinition.setReport(selected);
|
||||
if (selected.isSingleRecord()) {
|
||||
reportDefinition.setSingleObject(singleObject);
|
||||
setObject(selected);
|
||||
} else {
|
||||
reportDefinition.setDataSet(dataList);
|
||||
}
|
||||
}
|
||||
|
||||
private void setObject(Report report) {
|
||||
if (report.getProperty() == null) {
|
||||
reportDefinition.setSingleObject(singleObject);
|
||||
} else {
|
||||
try {
|
||||
Object o = ReflectionTools.getGetterMethod(singleObject, report.getProperty()).invoke(singleObject);
|
||||
reportDefinition.setSingleObject(o);
|
||||
|
||||
if (!(o instanceof DataModel)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Module m = ModuleUtils.getModule((DataModel)o, ctx);
|
||||
|
||||
if (m != null) {
|
||||
reportDefinition.setService((Service<Object>) ModuleUtils.getServiceInstance(m, ctx));
|
||||
}
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Command
|
||||
public void print(@BindingParam("window") Window window) {
|
||||
if (window != null) {
|
||||
|
||||
@@ -50,7 +50,7 @@ public class RequirementSubpage<T extends RequirementBase> extends ListViewModel
|
||||
this.requirementsItemRenderer = new RequirementsItemRenderer();
|
||||
}
|
||||
|
||||
private RequirementBaseService<T> getReqService()
|
||||
protected RequirementBaseService<T> getReqService()
|
||||
{
|
||||
return (RequirementBaseService<T>) service;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||
import org.zkoss.zul.Messagebox;
|
||||
import org.zkoss.zul.Window;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TripRequirementForm extends FormWithUpload<TripRequirement> {
|
||||
@@ -73,7 +74,14 @@ public class TripRequirementForm extends FormWithUpload<TripRequirement> {
|
||||
@Init(superclass = true)
|
||||
public void init() {
|
||||
tripRequirementService.loadType(getDataBean());
|
||||
centres = reqTypeService.filterCentres(getDataBean().getType(), workgroupService.getUserCentres(userService.getCurrent()));
|
||||
if (isEditRec()) {
|
||||
List<Workgroup> current = new ArrayList<Workgroup>();
|
||||
current.add(getDataBean().getCentre());
|
||||
this.centres = current;
|
||||
} else {
|
||||
this.centres = reqTypeService.filterCentres(getDataBean().getType(), workgroupService.getUserCentres(userService.getCurrent(), true));
|
||||
}
|
||||
|
||||
users = userService.getUsersForCombo();
|
||||
passengers = getDataBean().getPassengers();
|
||||
validator = new TripRequirementFormValidator();
|
||||
|
||||
@@ -30,7 +30,7 @@ public class TripRequirementList extends ListViewModel<TripRequirement> {
|
||||
private boolean showWorkgroup;
|
||||
private boolean showAll;
|
||||
|
||||
@Init
|
||||
@Init(superclass = true)
|
||||
public void init() {
|
||||
service = tripRequirementService;
|
||||
dataClass = TripRequirement.class;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user