Commit e17d20a0 by Petri Jarvisalo

Merge branch 'devel' of codecrew.fi:bortal

2 parents c3ffe1ed a4e00182
Showing with 381 additions and 98 deletions
...@@ -250,7 +250,7 @@ public class BillBean implements BillBeanLocal { ...@@ -250,7 +250,7 @@ public class BillBean implements BillBeanLocal {
} }
MailMessage msg = new MailMessage(); MailMessage msg = new MailMessage();
msg.setSubject(I18n.get("bill.billMarkedPaidMail.subject")); msg.setSubject(I18n.get("bill.billMarkedPaidMail.subject", user.getEvent().getName()));
msg.setMessage(I18n.get("bill.billMarkedPaidMail.message", (bill.getBillNumber() == null) ? "----" : bill.getBillNumber().toString())); msg.setMessage(I18n.get("bill.billMarkedPaidMail.message", (bill.getBillNumber() == null) ? "----" : bill.getBillNumber().toString()));
msg.setTo(bill.getUser().getUser()); msg.setTo(bill.getUser().getUser());
utilbean.sendMail(msg); utilbean.sendMail(msg);
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
*/ */
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
...@@ -79,33 +78,23 @@ public class RoleBean implements RoleBeanLocal { ...@@ -79,33 +78,23 @@ public class RoleBean implements RoleBeanLocal {
return roleList; return roleList;
} }
List<Role> children = getAllChilds(role, new HashSet<Role>()); HashSet<Role> childroles = new HashSet<Role>();
getAllChildren(role, childroles);
roleList.removeAll(childroles);
for (Role unit : children) {
if (roleList.contains(unit)) {
roleList.remove(unit);
}
}
roleList.remove(role);
return roleList; return roleList;
} }
private static List<Role> getAllChilds(Role role, Set<Role> checkedRoles) { public static final void getAllChildren(Role role, Set<Role> checkedRoles) {
List<Role> returnList = new ArrayList<Role>();
if (checkedRoles.contains(role) || role == null) { if (checkedRoles.contains(role) || role == null) {
return returnList; return;
} }
for (Role unit : role.getChildren()) { for (Role unit : role.getChildren()) {
List<Role> someList = getAllChilds(unit, checkedRoles); getAllChildren(unit, checkedRoles);
returnList.addAll(someList);
} }
checkedRoles.add(role); checkedRoles.add(role);
return returnList;
} }
// @Override // @Override
......
...@@ -126,7 +126,7 @@ public abstract class GenericFacade<C extends ModelInterface> { ...@@ -126,7 +126,7 @@ public abstract class GenericFacade<C extends ModelInterface> {
// return ret; // return ret;
// } // }
// Le fu... Tuota.. generics ei hanskaa ... operaattoria.. tehdään siis // Le fu... Tuota.. generics ei hanskaa '...' operaattoria.. tehdään siis
// näin... :( // näin... :(
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) { protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) {
return searcher(search, Collections.singletonList(callback)); return searcher(search, Collections.singletonList(callback));
......
package fi.insomnia.bortal.facade.callbacks; package fi.insomnia.bortal.facade.callbacks;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From; import javax.persistence.criteria.From;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.AccountEvent_;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_; import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.GroupMembership_;
import fi.insomnia.bortal.model.Place_;
import fi.insomnia.bortal.model.Product_;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.Role_; import fi.insomnia.bortal.model.Role_;
...@@ -25,17 +35,53 @@ public class EventUserRolefilter implements FacadeCallback<EventUser> { ...@@ -25,17 +35,53 @@ public class EventUserRolefilter implements FacadeCallback<EventUser> {
roles = filters; roles = filters;
} }
@Override private static final Set<Integer> getAllChildren(Collection<Role> roles, Set<Integer> checkedRoles) {
for (Role role : roles)
{
if (role == null || checkedRoles.contains(role.getId())) {
continue;
}
checkedRoles.add(role.getId());
getAllChildren(role.getChildren(), checkedRoles);
}
return checkedRoles;
}
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) { public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) {
if (roles != null && !roles.isEmpty()) if (roles != null && !roles.isEmpty())
{ {
List<Integer> roleids = new ArrayList<Integer>(); HashSet<Integer> roleids = new HashSet<Integer>();
for (Role r : roles) { getAllChildren(roles, roleids);
roleids.add(r.getId());
}
logger.debug("Requiring roles {}", roleids); logger.debug("Requiring roles {}", roleids);
Predicate pred = root.join(EventUser_.roles).get(Role_.id).in(roleids);
predicates.add(pred); Path<Integer> rootId = root.get(EventUser_.id);
ArrayList<Predicate> orPreds = new ArrayList<Predicate>();
{
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<Role> subroot = subq.from(Role.class);
subq.select(subroot.join(Role_.users).get(EventUser_.id));
subq.where(subroot.get(Role_.id).in(roleids));
orPreds.add(rootId.in(subq));
}
{
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<Role> subroot = subq.from(Role.class);
subq.select(subroot.join(Role_.productsProvide).join(Product_.accountEvents).get(AccountEvent_.user).get(EventUser_.id));
subq.where(subroot.get(Role_.id).in(roleids));
orPreds.add(rootId.in(subq));
}
{
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<Role> subroot = subq.from(Role.class);
subq.select(subroot.join(Role_.productsProvide).join(Product_.places).get(Place_.placeReserver).get(GroupMembership_.user).get(EventUser_.id));
subq.where(subroot.get(Role_.id).in(roleids));
orPreds.add(rootId.in(subq));
}
predicates.add(cb.or(orPreds.toArray(new Predicate[orPreds.size()])));
} }
} }
} }
package fi.insomnia.bortal.model;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
@Entity
@Table(name = "inventory_events")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class InventoryEvent extends GenericEntity {
private static final long serialVersionUID = 1L;
@Column(name = "created", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date created = new Date();
@JoinColumn(name = "user_id")
private User user;
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@JoinColumn(name = "product_id")
private Product product;
@Column(name = "info", nullable = true)
private String info;
@Column(name = "quantity", nullable = false, precision = 24, scale = 4)
private BigDecimal quantity;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
}
...@@ -92,6 +92,9 @@ public class Product extends GenericEntity { ...@@ -92,6 +92,9 @@ public class Product extends GenericEntity {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product") @OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private List<AccountEvent> accountEvents; private List<AccountEvent> accountEvents;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private List<InventoryEvent> inventoryEvents;
@ManyToMany(cascade = CascadeType.ALL) @ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "product_discounts", @JoinTable(name = "product_discounts",
inverseJoinColumns = { inverseJoinColumns = {
...@@ -168,6 +171,23 @@ public class Product extends GenericEntity { ...@@ -168,6 +171,23 @@ public class Product extends GenericEntity {
return ret; return ret;
} }
public BigDecimal getInventoryCount() {
BigDecimal ret = new BigDecimal(0);
if (accountEvents != null) {
for (AccountEvent ae : accountEvents) {
ret = ret.subtract(ae.getQuantity());
}
}
if (inventoryEvents != null) {
for (InventoryEvent ie : inventoryEvents) {
ret = ret.add(ie.getQuantity());
}
}
return ret;
}
public String getName() { public String getName() {
return name; return name;
} }
...@@ -304,4 +324,12 @@ public class Product extends GenericEntity { ...@@ -304,4 +324,12 @@ public class Product extends GenericEntity {
this.buyInPrice = buyInPrice; this.buyInPrice = buyInPrice;
} }
public List<InventoryEvent> getInventoryEvents() {
return inventoryEvents;
}
public void setInventoryEvents(List<InventoryEvent> inventoryEvents) {
this.inventoryEvents = inventoryEvents;
}
} }
...@@ -4,12 +4,16 @@ import java.io.Serializable; ...@@ -4,12 +4,16 @@ import java.io.Serializable;
public class SearchQuery implements Serializable { public class SearchQuery implements Serializable {
public enum QuerySortOrder {
UNSORTED, ASCENDING, DESCENDING
}
private static final long serialVersionUID = -8777921789916093938L; private static final long serialVersionUID = -8777921789916093938L;
private int page = 0; private int page = 0;
private int pagesize = 20; private int pagesize = 20;
private String sort = null; private String sort = null;
private String search = null; private String search = null;
private Boolean direction = false; private QuerySortOrder sortDirection = QuerySortOrder.UNSORTED;
public SearchQuery() public SearchQuery()
{ {
...@@ -70,12 +74,12 @@ public class SearchQuery implements Serializable { ...@@ -70,12 +74,12 @@ public class SearchQuery implements Serializable {
} }
} }
public Boolean isDirection() { public QuerySortOrder getSortDirection() {
return direction; return sortDirection;
} }
public void setDirection(Boolean direction) { public void setSortDirection(QuerySortOrder sortDirection) {
this.direction = direction; this.sortDirection = sortDirection;
} }
} }
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
</session-config> </session-config>
<context-param> <context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name> <param-name>javax.faces.PROJECT_STAGE</param-name>
<!-- <param-value>Production</param-value>--> <!-- param-value>Production</param-value -->
<param-value>Development</param-value> <param-value>Development</param-value>
</context-param> </context-param>
<context-param> <context-param>
......
...@@ -48,6 +48,15 @@ ...@@ -48,6 +48,15 @@
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" /> <f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</h:outputText> </h:outputText>
</h:column> </h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{i18n['product.inventoryQuantity']}" />
</f:facet>
<h:outputText value="#{product.inventoryCount}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</h:outputText>
</h:column>
</h:dataTable> </h:dataTable>
</h:form> </h:form>
......
...@@ -142,12 +142,15 @@ ...@@ -142,12 +142,15 @@
<td><h:outputLabel for="birthday" <td><h:outputLabel for="birthday"
value="#{i18n['user.birthday']}" /><br /> value="#{i18n['user.birthday']}" /><br />
<p:inplace emptyLabel="#{i18n['user.insert']}"> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:calendar <p:calendar id="birthday" navigator="true" yearRange="c-80:c-0"
id="birthday" navigator="true" yearRange="c-80:c-0" locale="fi" value="#{userView.selectedUser.birthday}"
value="#{userView.selectedUser.birthday}" >
pattern="#{sessionHandler.dateFormat}" <f:convertDateTime pattern="#{sessionHandler.dateFormat}"
timeZone="#{sessionHandler.timezone}" /></p:inplace> <h:message timeZone="#{sessionHandler.timezone}" />
</p:calendar>
</p:inplace>
<h:message
for="birthday" /></td> for="birthday" /></td>
<td><h:outputLabel value="#{i18n['user.sex']}" for="sex" /> <td><h:outputLabel value="#{i18n['user.sex']}" for="sex" />
<br /> <br />
......
...@@ -2,18 +2,19 @@ ...@@ -2,18 +2,19 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools"> xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui">
<composite:interface> <composite:interface>
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:dataTable styleClass="bordertable" id="user" value="#{userSearchView.eventUserResults}" var="user">
<h:column>
<p:dataTable styleClass="bordertable" id="usertable" value="#{userSearchView.eventuserModel}" rows="20" paginator="true" lazy="true" var="user">
<p:column>
<f:facet name="header"> <f:facet name="header">
<h:link value="#{i18n['user.nick']}" includeViewParams="true"> <h:link value="#{i18n['user.nick']}" includeViewParams="true">
<f:param name="sort" value="nick" /> <f:param name="sort" value="nick" />
<f:param name="page" value="0" />
</h:link> </h:link>
</f:facet> </f:facet>
<h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" /> <h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" />
...@@ -47,8 +48,8 @@ ...@@ -47,8 +48,8 @@
</h:panelGrid> </h:panelGrid>
</div> </div>
</h:column> </p:column>
<h:column> <p:column>
<f:facet name="header"> <f:facet name="header">
<h:link value="#{i18n['user.firstNames']}" includeViewParams="true"> <h:link value="#{i18n['user.firstNames']}" includeViewParams="true">
<f:param name="sort" value="firstnames" /> <f:param name="sort" value="firstnames" />
...@@ -56,8 +57,8 @@ ...@@ -56,8 +57,8 @@
</h:link> </h:link>
</f:facet> </f:facet>
<h:outputText value="#{user.firstnames}" /> <h:outputText value="#{user.firstnames}" />
</h:column> </p:column>
<h:column> <p:column>
<f:facet name="header"> <f:facet name="header">
<h:link value="#{i18n['user.lastName']}" includeViewParams="true"> <h:link value="#{i18n['user.lastName']}" includeViewParams="true">
<f:param name="sort" value="lastname" /> <f:param name="sort" value="lastname" />
...@@ -65,16 +66,24 @@ ...@@ -65,16 +66,24 @@
</h:link> </h:link>
</f:facet> </f:facet>
<h:outputText value="#{user.lastname}" /> <h:outputText value="#{user.lastname}" />
</h:column> </p:column>
<p:column>
<f:facet name="header">
<h:link value="#{i18n['user.email']}" includeViewParams="true" >
<f:param name="sort" value="email" />
</h:link>
<h:outputText value="#{user.email}" />
</f:facet>
</p:column>
<h:column> <p:column>
<button onClick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.user.id}')">#{i18n['user.edit']}</button> <button onclick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.user.id}')">#{i18n['user.edit']}</button>
</h:column> </p:column>
<!-- <h:column> <!-- <h:column>
<h:commandButton action="#{userView.shop()}" value="#{i18n['user.shop']}" /> <h:commandButton action="#{userView.shop()}" value="#{i18n['user.shop']}" />
</h:column> --> </h:column> -->
</h:dataTable> </p:dataTable>
<script> <script>
jQuery(function() { jQuery(function() {
jQuery(".hoverable").hover(function () { jQuery(".hoverable").hover(function () {
......
...@@ -65,6 +65,7 @@ ...@@ -65,6 +65,7 @@
<f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" /> <f:convertDateTime pattern="#{sessionHandler.datetimeFormat}" timeZone="#{sessionHandler.timezone}" />
</h:outputText> </h:outputText>
</h:column> </h:column>
<h:column> <h:column>
......
<!DOCTYPE html <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/cditools/user" xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core">
xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"
>
<h:body> <h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml"> <ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata> <f:metadata>
...@@ -22,6 +20,7 @@ ...@@ -22,6 +20,7 @@
<h1>#{i18n['userlist.header']}</h1> <h1>#{i18n['userlist.header']}</h1>
<h:form> <h:form>
<h:panelGrid columns="2"> <h:panelGrid columns="2">
<h:panelGroup> <h:panelGroup>
<a onclick="$('#advancedSearch').show(); $(this).hide();"><h:outputText value="#{i18n['userlist.showAdvancedSearch']}" /></a> <a onclick="$('#advancedSearch').show(); $(this).hide();"><h:outputText value="#{i18n['userlist.showAdvancedSearch']}" /></a>
...@@ -55,18 +54,19 @@ ...@@ -55,18 +54,19 @@
<br /> <br />
<h:commandButton actionListener="#{userSearchView.addToCart}" value="#{i18n['usercart.addSearchedUsers']}" /> <h:commandButton actionListener="#{userSearchView.addToCart}" value="#{i18n['usercart.addSearchedUsers']}" />
<h:commandButton action="#{userCartView.traverse}" value="#{i18n['usercart.traverse']}" /> <h:commandButton action="#{userCartView.traverse}" value="#{i18n['usercart.traverse']}" />
<h:commandButton value="#{i18n['usercart.downloadCsv']}">
<p:fileDownload value="#{userCartView.downloadCsv}" />
</h:commandButton>
</div> </div>
</h:panelGroup> </h:panelGroup>
</h:panelGrid> </h:panelGrid>
<h:outputText value="#{i18n['userlist.searchcount']}" />: <h:outputText value="#{userSearchView.resultcount}" />
</h:form> </h:form>
<p> <p>
<users:list rendered="#{!userSearchView.searchQuery.onlyThisEvent}" /> <users:list rendered="#{!userSearchView.searchQuery.onlyThisEvent}" />
<users:eventuserlist rendered="#{userSearchView.searchQuery.onlyThisEvent}" /> <users:eventuserlist rendered="#{userSearchView.searchQuery.onlyThisEvent}" />
</p> </p>
<p>
<tools:paginationHeader view="#{userSearchView}" />
</p>
</ui:define> </ui:define>
</ui:composition> </ui:composition>
</h:body> </h:body>
......
...@@ -10,7 +10,8 @@ ...@@ -10,7 +10,8 @@
#{sessionHandler.flushCache()} #{sessionHandler.flushCache()}
<h:form> <h:form>
<h:commandButton action="#{testView.resetMenu()}" value="Reset menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" /> <h:commandButton action="#{testView.resetMenu()}" value="Reset to newui menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" />
<h:commandButton action="#{testView.resetOldMenu()}" value="Reset to old menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" />
</h:form> </h:form>
</ui:define> </ui:define>
......
package fi.insomnia.bortal.resources;
import java.util.Enumeration;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext;
public class BortalI18n extends ResourceBundle {
private static final Control BORTAL_CONTROL = new BortalControl();
public BortalI18n()
{
ResourceBundle p = ResourceBundle.getBundle("fi.insomnia.bortal.resources.i18n",
FacesContext.getCurrentInstance().getViewRoot().getLocale(), BORTAL_CONTROL);
this.setParent(p);
}
@Override
protected Object handleGetObject(String key) {
// TODO Auto-generated method stub
return null;
}
@Override
public Enumeration<String> getKeys() {
// TODO Auto-generated method stub
return null;
}
protected static class BortalControl extends Control {
}
}
...@@ -5,15 +5,16 @@ acc_line.product = Product ...@@ -5,15 +5,16 @@ acc_line.product = Product
acc_line.quantity = Quantity acc_line.quantity = Quantity
acc_line.time = Transaction Date acc_line.time = Transaction Date
accountEvent.commit = Save accountEvent.commit = Save
accountEvent.delivered = Delivered accountEvent.delivered = Delivered
accountEvent.edit = Edit accountEvent.edit = Edit
accountEvent.eventTime = Time accountEvent.eventTime = Time
accountEvent.productname = Product accountEvent.inventoryQuantity = Inventory Count
accountEvent.quantity = Count accountEvent.productname = Product
accountEvent.seller = Sold by accountEvent.quantity = Count
accountEvent.total = Total accountEvent.seller = Sold by
accountEvent.unitPrice = Unit price accountEvent.total = Total
accountEvent.unitPrice = Unit price
actionlog.create.header = Create new actionmessage actionlog.create.header = Create new actionmessage
actionlog.create.message = Message actionlog.create.message = Message
...@@ -445,8 +446,8 @@ passwordChanged.header = Password changed successfully. ...@@ -445,8 +446,8 @@ passwordChanged.header = Password changed successfully.
passwordReset.errorChanging = Unexpected error whilst password reset. Contact your administrator. passwordReset.errorChanging = Unexpected error whilst password reset. Contact your administrator.
passwordReset.hashNotFound = Password change token has expired. Please send the query again. passwordReset.hashNotFound = Password change token has expired. Please send the query again.
passwordreset.mailBody = You can change your password in address: {0}\n\nIf you have not requested password reset, ignore this message.\n\nStream intranet\nwww.streamparty.org\ninfo@streamparty.org passwordreset.mailBody = You can change your password in address: {0}\n\nIf you have not requested password reset, ignore this message.\n\n
passwordreset.mailSubject = [STREAM] Password reset passwordreset.mailSubject = [{0}] Password reset
passwordreset.usernotfound = Username not found. Please note that username is case sensitive. passwordreset.usernotfound = Username not found. Please note that username is case sensitive.
permissiondenied.alreadyLoggedIn = You don't have enough rights permissiondenied.alreadyLoggedIn = You don't have enough rights
...@@ -528,6 +529,7 @@ product.color = Color in UI ...@@ -528,6 +529,7 @@ product.color = Color in UI
product.create = Create product product.create = Create product
product.createDiscount = Add volumediscount product.createDiscount = Add volumediscount
product.edit = edit product.edit = edit
product.inventoryQuantity = Inventory count
product.name = Name of product product.name = Name of product
product.paid = Paid product.paid = Paid
product.prepaid = Prepaid product.prepaid = Prepaid
...@@ -840,6 +842,7 @@ userlist.placeassoc = Assigned to place ...@@ -840,6 +842,7 @@ userlist.placeassoc = Assigned to place
userlist.rolefilter = Assigned roles userlist.rolefilter = Assigned roles
userlist.saldofilter = Saldo userlist.saldofilter = Saldo
userlist.search = Search userlist.search = Search
userlist.searchcount = Result count
userlist.showAdvancedSearch = Advanced search userlist.showAdvancedSearch = Advanced search
usertitle.managingUser = Shop usertitle.managingUser = Shop
......
...@@ -988,11 +988,11 @@ user.accountEvents=Tilitapahtumat ...@@ -988,11 +988,11 @@ user.accountEvents=Tilitapahtumat
bill.billMarkedPaidMail.subject=[INSOMNIA] Lasku merkitty maksetuksi bill.billMarkedPaidMail.subject=[{0}] Lasku merkitty maksetuksi
bill.billMarkedPaidMail.message=Laskusi numero {0} on merkitty maksetuksi. Voit nyt siirty\u2030 lippukauppaan varamaamaan haluamasi paikat. \nTervetuloa tapahtumaan!\n\nTerveisin,\nInsomnia lippupalvelu\nwww.insomnia.fi bill.billMarkedPaidMail.message=Laskusi numero {0} on merkitty maksetuksi. Voit nyt siirty\u2030 lippukauppaan varamaamaan haluamasi paikat. \nTervetuloa tapahtumaan!\n\n
...@@ -1000,7 +1000,7 @@ passwordreset.usernotfound=Annettua k\u2030ytt\u2030j\u2030tunnusta ei l\u02C6yd ...@@ -1000,7 +1000,7 @@ passwordreset.usernotfound=Annettua k\u2030ytt\u2030j\u2030tunnusta ei l\u02C6yd
passwordreset.mailSubject=[INSOMNIA] Salasanan vaihtaminen passwordreset.mailSubject=[{0}] Salasanan vaihtaminen
......
...@@ -5,15 +5,16 @@ acc_line.product = Tuote ...@@ -5,15 +5,16 @@ acc_line.product = Tuote
acc_line.quantity = M\u00E4\u00E4r\u00E4 acc_line.quantity = M\u00E4\u00E4r\u00E4
acc_line.time = Ostoaika acc_line.time = Ostoaika
accountEvent.commit = Tallenna accountEvent.commit = Tallenna
accountEvent.delivered = Toimitettu accountEvent.delivered = Toimitettu
accountEvent.edit = Muokkaa accountEvent.edit = Muokkaa
accountEvent.eventTime = Aika accountEvent.eventTime = Aika
accountEvent.productname = Tuote accountEvent.inventoryQuantity = Varastossa
accountEvent.quantity = Lkm accountEvent.productname = Tuote
accountEvent.seller = Myyj\u00E4 accountEvent.quantity = Lkm
accountEvent.total = Yhteens\u00E4 accountEvent.seller = Myyj\u00E4
accountEvent.unitPrice = Yksikk\u00F6hinta accountEvent.total = Yhteens\u00E4
accountEvent.unitPrice = Yksikk\u00F6hinta
actionlog.create.header = Luo uusi ActionMessage actionlog.create.header = Luo uusi ActionMessage
actionlog.create.message = Viesti actionlog.create.message = Viesti
...@@ -511,6 +512,7 @@ product.color = V\u00E4ri k\u00E4ytt\u00F6liittym\u00E4ss\u00E4 ...@@ -511,6 +512,7 @@ product.color = V\u00E4ri k\u00E4ytt\u00F6liittym\u00E4ss\u00E4
product.create = Luo tuote product.create = Luo tuote
product.createDiscount = Lis\u00E4\u00E4 m\u00E4\u00E4r\u00E4alennus product.createDiscount = Lis\u00E4\u00E4 m\u00E4\u00E4r\u00E4alennus
product.edit = Muokkaa product.edit = Muokkaa
product.inventoryQuantity = Varastotilanne
product.name = Tuotteen nimi product.name = Tuotteen nimi
product.paid = Maksettu product.paid = Maksettu
product.prepaid = Prepaid product.prepaid = Prepaid
...@@ -818,6 +820,7 @@ userlist.placeassoc = Liitetty paikkaan ...@@ -818,6 +820,7 @@ userlist.placeassoc = Liitetty paikkaan
userlist.rolefilter = Annetut roolit userlist.rolefilter = Annetut roolit
userlist.saldofilter = Tilin saldo userlist.saldofilter = Tilin saldo
userlist.search = Etsi userlist.search = Etsi
userlist.searchcount = Tuloksia
userlist.showAdvancedSearch = Tarkennettu haku userlist.showAdvancedSearch = Tarkennettu haku
usertitle.managingUser = Kauppa usertitle.managingUser = Kauppa
......
...@@ -64,6 +64,11 @@ public class TestDataView { ...@@ -64,6 +64,11 @@ public class TestDataView {
return null; return null;
} }
public String resetOldMenu() {
menubean.flushOldMenu();
return null;
}
public String makeTestData() { public String makeTestData() {
testdatabean.createAdmin(); testdatabean.createAdmin();
return null; return null;
......
...@@ -149,12 +149,4 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD ...@@ -149,12 +149,4 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
this.searchQuery = searchQuery; this.searchQuery = searchQuery;
} }
public Boolean isDirection() {
return searchQuery.isDirection();
}
public void setDirection(Boolean direction) {
searchQuery.setDirection(direction);
}
} }
package fi.insomnia.bortal.web.cdiview.user; package fi.insomnia.bortal.web.cdiview.user;
import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -7,6 +10,8 @@ import javax.enterprise.context.ConversationScoped; ...@@ -7,6 +10,8 @@ import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -19,6 +24,8 @@ public class UserCartView extends GenericCDIView { ...@@ -19,6 +24,8 @@ public class UserCartView extends GenericCDIView {
private static final long serialVersionUID = 5294631925744474031L; private static final long serialVersionUID = 5294631925744474031L;
private static final Charset UTF8 = Charset.forName("UTF-8");
private Integer current = 0; private Integer current = 0;
@Inject @Inject
...@@ -26,12 +33,37 @@ public class UserCartView extends GenericCDIView { ...@@ -26,12 +33,37 @@ public class UserCartView extends GenericCDIView {
private List<EventUser> usercart; private List<EventUser> usercart;
public void initView() { private SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
public StreamedContent getDownloadCsv() {
StringBuilder sb = new StringBuilder();
sb.append("firstname").append(";");
sb.append("lastname").append(";");
sb.append("nick").append(";");
sb.append("login").append(";");
sb.append("birthday").append(";");
sb.append("phone").append(";");
sb.append("email").append(";");
sb.append("\n");
for (EventUser uc : usercart)
{
sb.append(uc.getFirstnames()).append(";");
sb.append(uc.getLastname()).append(";");
sb.append(uc.getNick()).append(";");
sb.append(uc.getLogin()).append(";");
sb.append(uc.getBirthday() != null ? dateformat.format(uc.getBirthday()) : "").append(";");
sb.append(uc.getPhone()).append(";");
sb.append(uc.getEmail()).append(";");
sb.append("\n");
}
DefaultStreamedContent ret = new DefaultStreamedContent(new ByteArrayInputStream(sb.toString().getBytes(UTF8)));
ret.setContentType("text/csv");
return ret;
} }
private static final Logger logger = LoggerFactory private static final Logger logger = LoggerFactory.getLogger(UserCartView.class);
.getLogger(UserCartView.class);
public String next() { public String next() {
++current; ++current;
......
package fi.insomnia.bortal.web.cdiview.user; package fi.insomnia.bortal.web.cdiview.user;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import fi.insomnia.bortal.beans.UserBeanLocal; import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission; import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.EventUser; import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.util.UserSearchQuery; import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchQuery.QuerySortOrder;
import fi.insomnia.bortal.utilities.SearchResult; import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.web.cdiview.PaginationView; import fi.insomnia.bortal.web.cdiview.PaginationView;
@Named @Named
@RequestScoped @ConversationScoped
public class UserSearchView extends PaginationView<User> { public class UserSearchView extends PaginationView<User> {
/** /**
...@@ -32,6 +37,8 @@ public class UserSearchView extends PaginationView<User> { ...@@ -32,6 +37,8 @@ public class UserSearchView extends PaginationView<User> {
private UserSearchQuery usersearch = new UserSearchQuery(); private UserSearchQuery usersearch = new UserSearchQuery();
private LazyDataModel<EventUser> eventuserModel;
public void addToCart() public void addToCart()
{ {
int pagesize = usersearch.getPagesize(); int pagesize = usersearch.getPagesize();
...@@ -47,7 +54,33 @@ public class UserSearchView extends PaginationView<User> { ...@@ -47,7 +54,33 @@ public class UserSearchView extends PaginationView<User> {
} }
public void initView() { public void initView() {
if (requirePermissions(permbean.hasPermission(UserPermission.VIEW_ALL))) { if (requirePermissions(permbean.hasPermission(UserPermission.VIEW_ALL))) {
eventuserModel = new LazyDataModel<EventUser>() {
private static final long serialVersionUID = 1L;
@Override
public List<EventUser> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, String> filters) {
UserSearchQuery sq = getSearchQuery();
sq.setPagesize(pageSize);
if (pageSize > 0)
{
sq.setPage(first / pageSize);
}
sq.setSort(sortField);
sq.setSortDirection(SortOrder.ASCENDING.equals(sortOrder) ? QuerySortOrder.ASCENDING : (SortOrder.DESCENDING.equals(sortOrder) ? QuerySortOrder.DESCENDING : QuerySortOrder.UNSORTED));
SearchResult<EventUser> sr = userbean.getThisEventsUsers(sq);
this.setRowCount(new Long(sr.getResultcount()).intValue());
setResultcount(sr.getResultcount());
setEventUserResults(sr.getResults());
return sr.getResults();
}
};
if (usersearch.isOnlyThisEvent() || usersearch.getSearch() == null || usersearch.getSearch().isEmpty()) if (usersearch.isOnlyThisEvent() || usersearch.getSearch() == null || usersearch.getSearch().isEmpty())
{ {
usersearch.setOnlyThisEvent(true); usersearch.setOnlyThisEvent(true);
...@@ -58,6 +91,7 @@ public class UserSearchView extends PaginationView<User> { ...@@ -58,6 +91,7 @@ public class UserSearchView extends PaginationView<User> {
else { else {
super.setResult(userbean.getEventUsers(getSearchQuery())); super.setResult(userbean.getEventUsers(getSearchQuery()));
} }
super.beginConversation();
} }
} }
...@@ -75,4 +109,12 @@ public class UserSearchView extends PaginationView<User> { ...@@ -75,4 +109,12 @@ public class UserSearchView extends PaginationView<User> {
this.eventUserResults = eventUserResults; this.eventUserResults = eventUserResults;
} }
public LazyDataModel<EventUser> getEventuserModel() {
return eventuserModel;
}
public void setEventuserModel(LazyDataModel<EventUser> eventuserModel) {
this.eventuserModel = eventuserModel;
}
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!