31 Commits

Author SHA1 Message Date
pepa c521fc3c87 Byl přidán checkbox "Fakturováno" k položkám v agendě Fakturace. Bude
označovat položky vykryté fakturou.
closes #170
2014-11-17 21:15:17 +01:00
pepa 9f07c52f2c Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2014-11-14 14:36:10 +01:00
pepa 6737d44d62 Pokud je nastavené přihlašování proti LDAP nebo Active Directory, tak
lze omezit přihlašování do aplikace pouze na uživatele (z AD nebo LDAP),
ktří jsou členy nastavené skupiny.
2014-11-14 14:21:41 +01:00
franta 9ca4908ce4 Merge branch 'master' of https://git.bukova.info/repos/git/isspst
Conflicts:
	src/main/java/info/bukova/isspst/ui/requirement/RequirementSubpage.java
2014-11-10 08:10:41 +01:00
franta 4c033deffb Schválený studentský projekt (karta Vše) má modrou barvu.
Schválený nestudentský projekt má zelenou barvu.
Částečně schválený projekt má žlutou barvu.

closes #172
2014-11-10 07:56:15 +01:00
pepa 9088a88b9a Na formulář objednávky k adrese dodavatele bylo přidáno tlačítko "Hledat
v ARESu". Tlačítko je aktivní, pokud není vybraná adresa z comba.
closes #171
2014-11-08 15:12:03 +01:00
pepa a9a98cfd63 Do automaticky odesílaných e-mailů lze nyní vložit URL na záznam
požadavku. Při otevření URL se nastaví kurzor v gridu na příslušný
záznam.
2014-10-28 21:39:10 +01:00
franta babb9f8312 Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2014-10-27 13:25:09 +01:00
franta 7c6a43baf6 Nastavení hodnot middle objektu bez validace.
closes #169
2014-10-27 13:24:53 +01:00
pepa d2bcfc727d Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2014-10-27 12:50:54 +01:00
pepa fc2fa76402 Opravena chyba null pointer při automatickém schválení podlimitního
požadavku.
2014-10-27 12:50:35 +01:00
franta ab9a5577d9 BigDecimal nyní pro formátování přebírá locales klienta/prohlížeče.
closes #165
2014-10-27 12:31:51 +01:00
pepa bd37a7081a Upraveno formátování a zarovnání v cestovních příkazech. Opraveno
filtrování v požadavcích na služební cesty.
closes #168
2014-10-27 10:44:52 +01:00
pepa 8f248de094 Limit komise se nyní počítá z vyfakturované částky zadané ve fakturaci
požadavků.
closes #167
2014-10-27 09:25:14 +01:00
pepa 6ccd2a91a3 Filtr v agendě Fakturace požadavků.
closes #164
2014-10-27 08:47:24 +01:00
pepa 9175a7911f Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2014-10-26 22:17:07 +01:00
pepa b2d141e52b Přidána agenda pro zadávání fakturace k požadavkům. Chybí filtrování.
refs #164
2014-10-26 22:16:14 +01:00
franta a1c400aa27 Do požadavků materiálu i servisu přidán checkbox "Studentský projekt".
Pokud je nastaven, položky požadavků nevstupují do schválených položek
požadavků.

closes #166
2014-10-25 19:58:59 +02:00
franta f1ca2d11c8 Políčka s číslem faktury a fakturovanou částkou odstraněna z objednávek.
closes #163
2014-10-24 09:19:15 +02:00
franta 3558d1bd50 Když je na požadavku víc položek, tak že už se grid nevejde do okna a
přidá se položka, tak grid odroluje na poslední přidávanou položku.
Upravena aktualizace dat podle změn UI.

closes #158
2014-10-20 11:00:30 +02:00
franta eaf37147dc Pokud je v položkovém gridu vybraná některá z položek a zmáčkne se
"Smazat" u jiné položky, smaže se položka, na které tlačítko leží.

closes #159
2014-10-20 10:16:25 +02:00
franta 13f35611fd Když se přidává položka požadavku (skupina materiálu/služby) přes combo,
tak se přenese i měrná jednotka.
Měrnou jednotku lze změnit.

closes #157
2014-10-20 08:26:10 +02:00
pepa 3725e9473d Optimalizováno načítání požadavků z databáze. Položky požadavků se
načítají jako lazy.
2014-10-18 22:37:56 +02:00
pepa 412db2a394 Opravena aktivace tlačítka "Hledat v ARESu" v agendě Dodavatelé.
closes #161
2014-10-18 22:19:40 +02:00
pepa b8a734f817 Pokud zadává požadavek uživatel, který je zároveň první ze schvalujících
(vedoucí komise), požadavek se za tohoto schvalovatele schválí
automaticky hned při vytvoření.
closes #162
2014-10-18 21:59:43 +02:00
franta b932d390ca Upraveny vlastnosti dialogů pro výběr skupin materiálu a služeb.
Okno má velikost vždy 95 % velikosti.

closes #156
2014-10-17 11:49:25 +02:00
franta 882993ef17 Ag. Vytvořené objednávky
• vložen kód pro barevné rozlišení Listitem v objednávkách pomocí stylů

closes #160
2014-10-17 05:48:44 +02:00
pepa 44178c52e6 Výpočet vyčerpané částky za komisy se nyní počítá z vyfakturované částky
na položce objednávky.
closes #137
2014-10-16 08:54:32 +02:00
franta a10abe6961 V celém projektu nahrazeny výskyty sort="auto(*)", kde byly objekty typu
User a Workgroup.

closes #155
2014-10-16 08:16:33 +02:00
franta 18920701a7 Fakturovaná částka na objednávkách se nyní počítá z položek.
closes #152, #154
2014-10-15 21:51:39 +02:00
franta 5b380386bd Objednávku lze nyní označit jako objednanou.
Na schválené položky se propíš číslo objednávky.
Všechny objednávky, které schválené a objednané položky obsahují již
není možno znovu objednat.
Objednávky mazat nelze, takže mazání dokladů neřešíme.

closes #153
2014-10-15 16:49:39 +02:00
105 changed files with 2149 additions and 380 deletions
@@ -0,0 +1,13 @@
package info.bukova.isspst;
public class BooleanUtils
{
public static boolean isEqualByBoolean(Boolean b1, Boolean b2)
{
boolean bool1 = ((b1 == null) ? false : b1.booleanValue());
boolean bool2 = ((b2 == null) ? false : b2.booleanValue());
boolean equals = (bool1 == bool2);
return equals;
}
}
@@ -0,0 +1,39 @@
package info.bukova.isspst;
import info.bukova.isspst.data.DataModel;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
public class CommonUrlResolver implements EntityUrlResolver {
@Autowired
private HttpServletRequest request;
protected String defaultUrl;
public CommonUrlResolver() {
}
@Override
public String entityUrl(Object entity) {
if (defaultUrl == null) {
this.defaultUrl = request.getRequestURL().toString();
this.defaultUrl = defaultUrl.substring(0, defaultUrl.indexOf(request.getServletPath()));
}
if (!DataModel.class.isAssignableFrom(entity.getClass())) {
return defaultUrl + "/app";
}
String url = Constants.URL_MAP.get(entity.getClass());
if (url == null) {
return defaultUrl + "/app";
}
return defaultUrl + url + "?select=" + String.valueOf(((DataModel)entity).getId());
}
}
@@ -1,16 +1,23 @@
package info.bukova.isspst;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.PermissionType;
import info.bukova.isspst.data.Requirement;
import info.bukova.isspst.data.RequirementType;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.TripRequirement;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportMapping;
import info.bukova.isspst.services.addressbook.AdbService;
import info.bukova.isspst.services.approved.ApprovedService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.buildings.BuildingService;
import info.bukova.isspst.services.invoicing.InvoicingService;
import info.bukova.isspst.services.munits.MUnitService;
import info.bukova.isspst.services.orders.ApprovedService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.reqsubjects.MaterialService;
import info.bukova.isspst.services.reqsubjects.ServiceItemService;
import info.bukova.isspst.services.requirement.RequirementService;
@@ -71,6 +78,7 @@ public class Constants {
public final static String MOD_TRIPBILL = "TRIPBILL";
public final static String MOD_APPROVED = "APPROVED";
public final static String MOD_ORDER = "ORDER";
public final static String MOD_INVOICING = "INVOICING";
public final static Module MODULES[] = {
new Module(MOD_USERS, "Uživatelé", UserService.class),
new Module(MOD_PERMISSIONS, "Práva", RoleService.class),
@@ -85,7 +93,8 @@ public class Constants {
new Module(MOD_WORKFLOW, "Procesy schválení", RequirementTypeService.class),
new Module(MOD_TRIPBILL, "Cestovní příkazy", TripBillService.class),
new Module(MOD_APPROVED, "Schválené položky požadavků", ApprovedService.class),
new Module(MOD_ORDER, "Objednávky", OrderService.class) };
new Module(MOD_ORDER, "Objednávky", OrderService.class),
new Module(MOD_INVOICING, "Fakturace požadavků", InvoicingService.class) };
public final static String PERM_APPROVE = "PERM_APPROVE";
public final static String PERM_SHOW_WORKGROUP_REQ = "PERM_SHOW_WORKGROUP_REQ";
@@ -126,4 +135,10 @@ public class Constants {
public final static long REQ_TYPE_MATERIAL = 1;
public final static long REQ_TYPE_SERVICES = 2;
@SuppressWarnings("serial")
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/");
}} );
}
@@ -0,0 +1,7 @@
package info.bukova.isspst;
public interface EntityUrlResolver {
public String entityUrl(Object entity);
}
@@ -0,0 +1,39 @@
package info.bukova.isspst;
import info.bukova.isspst.data.Requirement;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
public class RequirementUrlResolver implements EntityUrlResolver {
private String defaultUrl;
@Autowired
private HttpServletRequest request;
public RequirementUrlResolver() {
}
@Override
public String entityUrl(Object entity) {
if (!(entity instanceof Requirement)) {
return defaultUrl + "/app";
}
if (defaultUrl == null) {
this.defaultUrl = request.getRequestURL().toString();
this.defaultUrl = defaultUrl.substring(0, defaultUrl.indexOf(request.getServletPath()));
}
Requirement req = (Requirement)entity;
if (req.getKind() == Constants.REQ_TYPE_MATERIAL) {
return defaultUrl + Constants.URL_MAP.get(req) + "material/?select=" + String.valueOf(req.getId());
} else {
return defaultUrl + Constants.URL_MAP.get(req) + "services/?select=" + String.valueOf(req.getId());
}
}
}
@@ -7,12 +7,12 @@ import org.zkoss.util.resource.Labels;
public class StringUtils
{
private static String nullStr(String str)
public static String nullToEmptyString(String str)
{
return str == null ? "" : str;
}
private static String not0ToStr(long i)
private static String zeroToEmptyString(long i)
{
return i == 0 ? "" : String.valueOf(i);
}
@@ -60,8 +60,8 @@ public class StringUtils
public static boolean isEqualForFilter(String value, String search)
{
value = StringUtils.nullStr(value).toLowerCase();
search = StringUtils.nullStr(search).toLowerCase();
value = StringUtils.nullToEmptyString(value).toLowerCase();
search = StringUtils.nullToEmptyString(search).toLowerCase();
if (search.isEmpty())
{
@@ -73,8 +73,8 @@ public class StringUtils
public static boolean isIcEqualForFilter(long value, long search)
{
String compareValue = StringUtils.not0ToStr(value);
String searchValue = StringUtils.not0ToStr(search);
String compareValue = StringUtils.zeroToEmptyString(value);
String searchValue = StringUtils.zeroToEmptyString(search);
return compareValue.startsWith(searchValue);
}
@@ -124,7 +124,7 @@ public class StringUtils
for (int i = 0; i < list.size(); i++)
{
String item = StringUtils.nullStr(list.get(i));
String item = StringUtils.nullToEmptyString(list.get(i));
result = StringUtils.addSeparator(result, separator);
result += item;
}
@@ -138,7 +138,7 @@ public class StringUtils
for (int i = 0; i < list.size(); i++)
{
String item = StringUtils.nullStr(list.get(i));
String item = StringUtils.nullToEmptyString(list.get(i));
if (!item.isEmpty())
{
@@ -0,0 +1,30 @@
package info.bukova.isspst;
import java.util.HashMap;
import java.util.Map;
public class UrlResolverHolder {
private EntityUrlResolver commonResolver;
private Map<Class<?>, EntityUrlResolver> resolvers;
public UrlResolverHolder(EntityUrlResolver common) {
this.commonResolver = common;
resolvers = new HashMap<Class<?>, EntityUrlResolver>();
}
public void setResolvers(Map<Class<?>, EntityUrlResolver> resolvers) {
this.resolvers = resolvers;
}
public EntityUrlResolver resolverFor(Class<?> clazz) {
EntityUrlResolver res = resolvers.get(clazz);
if (res == null) {
return commonResolver;
}
return res;
}
}
@@ -0,0 +1,7 @@
package info.bukova.isspst.dao;
import info.bukova.isspst.data.Invoicing;
public interface InvoicingDao extends BaseDao<Invoicing> {
}
@@ -0,0 +1,8 @@
package info.bukova.isspst.dao;
import info.bukova.isspst.data.RequirementItem;
public interface RequirementItemDao extends BaseDao<RequirementItem>
{
}
@@ -0,0 +1,9 @@
package info.bukova.isspst.dao.jpa;
import info.bukova.isspst.dao.InvoicingDao;
import info.bukova.isspst.data.Invoicing;
public class InvoicingDaoJPA extends BaseDaoJPA<Invoicing> implements InvoicingDao {
}
@@ -0,0 +1,8 @@
package info.bukova.isspst.dao.jpa;
import info.bukova.isspst.dao.RequirementItemDao;
import info.bukova.isspst.data.RequirementItem;
public class RequirementItemDaoJPA extends BaseDaoJPA<RequirementItem> implements RequirementItemDao
{
}
@@ -0,0 +1,58 @@
package info.bukova.isspst.data;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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;
@Entity
@Table(name = "INVOICING")
public class Invoicing extends BaseData {
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "REQUIREMENT_ID")
private Requirement requirement;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.TRUE)
@JoinColumn(name = "INVOICING_ID")
private List<InvoicingItem> items;
@Column(name = "TOTAL_INVOICED", precision = 15, scale = 4)
private BigDecimal totalInvoiced;
public Requirement getRequirement() {
return requirement;
}
public void setRequirement(Requirement requirement) {
this.requirement = requirement;
}
public List<InvoicingItem> getItems() {
return items;
}
public void setItems(List<InvoicingItem> items) {
this.items = items;
}
public BigDecimal getTotalInvoiced() {
return totalInvoiced;
}
public void setTotalInvoiced(BigDecimal totalInvoiced) {
this.totalInvoiced = totalInvoiced;
}
}
@@ -0,0 +1,87 @@
package info.bukova.isspst.data;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "INVOICING_ITEM")
public class InvoicingItem {
@Id
@Column(name = "ID")
@GeneratedValue
private int id;
@Column(name = "INVOICE_DATE")
private Date invoiceDate;
@Column(name = "INVOICE_NUMBER")
private String invoiceNumber;
@Column(name = "AMOUNT", precision = 15, scale = 4)
private BigDecimal amount;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getInvoiceDate() {
return invoiceDate;
}
public void setInvoiceDate(Date invoiceDate) {
this.invoiceDate = invoiceDate;
}
public String getInvoiceNumber() {
return invoiceNumber;
}
public void setInvoiceNumber(String invoiceNumber) {
this.invoiceNumber = invoiceNumber;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
@Override
public boolean equals(Object obj)
{
if (obj != null)
{
if (obj instanceof InvoicingItem)
{
InvoicingItem item = (InvoicingItem)obj;
int thisId = this.getId();
int itemId = item.getId();
boolean equalsId = (thisId == itemId);
if (equalsId && (thisId == 0))
{
return super.equals(obj);
}
return equalsId;
}
}
return false;
}
}
@@ -19,7 +19,7 @@ import org.hibernate.annotations.LazyCollectionOption;
@Entity
@Table(name = "ORDERS")
public class Order extends BaseData
public class Order extends BaseData implements Cloneable
{
@Column(name = "NUMSER")
@@ -110,20 +110,10 @@ public class Order extends BaseData
@Column(name = "DELIVERED")
private boolean delivered;
@Column(name = "INVOICED")
private boolean invoiced;
@Column(name = "INVOICE_NUMBER")
private String invoiceNumber;
@Column(name = "INVOICE_TOTAL", precision = 15, scale = 4)
private BigDecimal invoiceTotal;
public Order()
{
this.items = new ArrayList<OrderItem>();
this.total = BigDecimal.ZERO;
this.invoiceTotal = BigDecimal.ZERO;
}
public String getNumser()
@@ -232,26 +222,6 @@ public class Order extends BaseData
this.delivered = delivered;
}
public boolean isInvoiced()
{
return invoiced;
}
public void setInvoiced(boolean invoiced)
{
this.invoiced = invoiced;
}
public String getInvoiceNumber()
{
return invoiceNumber;
}
public void setInvoiceNumber(String invoiceNumber)
{
this.invoiceNumber = invoiceNumber;
}
public boolean isOrdered()
{
return ordered;
@@ -282,14 +252,29 @@ public class Order extends BaseData
this.total = total;
}
public BigDecimal getInvoiceTotal()
public boolean isIcludedRequirementItemFromAnotherOrder()
{
return invoiceTotal;
for (OrderItem oItem : this.getItems())
{
RequirementItem rItem = oItem.getReqItem();
if (rItem != null)
{
String orderNum = rItem.getOrderNum();
boolean isIncluded = ((orderNum != null) && !orderNum.isEmpty());
boolean isFromAnotherOrder = (isIncluded && !this.numser.equals(orderNum));
return isFromAnotherOrder;
}
}
return false;
}
public void setInvoiceTotal(BigDecimal invoiceTotal)
@Override
public Object clone() throws CloneNotSupportedException
{
this.invoiceTotal = invoiceTotal;
Order cloned = (Order) super.clone();
cloned.setTotal(new BigDecimal(this.getTotal().toString()));
return cloned;
}
}
@@ -14,11 +14,12 @@ import javax.persistence.Table;
@Entity
@Table(name = "ORDER_ITEM")
public class OrderItem {
public class OrderItem
{
@Id
@Column(name="ID")
@GeneratedValue
@Column(name = "ID")
@GeneratedValue
private int id;
@Column(name = "CODE")
@@ -30,16 +31,16 @@ public class OrderItem {
@Column(name = "TEXTITEM")
private String textItem;
@Column(name = "QUANTITY", precision=15, scale=4)
@Column(name = "QUANTITY", precision = 15, scale = 4)
private BigDecimal quantity;
@Embedded
private MUnitEmb munit;
@Column(name = "UNITPRICE", precision=15, scale=4)
@Column(name = "UNITPRICE", precision = 15, scale = 4)
private BigDecimal unitPrice;
@Column(name = "TOTAL", precision=15, scale=4)
@Column(name = "TOTAL", precision = 15, scale = 4)
private BigDecimal total;
@Column(name = "DESCRIPTION")
@@ -53,11 +54,13 @@ public class OrderItem {
@JoinColumn(name = "ORDER_ID")
private Order order;
public OrderItem() {
public OrderItem()
{
super();
}
public OrderItem(RequirementItem reqItem) {
public OrderItem(RequirementItem reqItem)
{
super();
this.reqItem = reqItem;
this.code = reqItem.getCode();
@@ -70,91 +73,113 @@ public class OrderItem {
this.description = reqItem.getDescription();
}
public int getId() {
public int getId()
{
return id;
}
public void setId(int id) {
public void setId(int id)
{
this.id = id;
}
public String getCode() {
public String getCode()
{
return code;
}
public void setCode(String code) {
public void setCode(String code)
{
this.code = code;
}
public String getName() {
public String getName()
{
return name;
}
public void setName(String name) {
public void setName(String name)
{
this.name = name;
}
public String getTextItem() {
public String getTextItem()
{
return textItem;
}
public void setTextItem(String textItem) {
public void setTextItem(String textItem)
{
this.textItem = textItem;
}
public BigDecimal getQuantity() {
public BigDecimal getQuantity()
{
return quantity;
}
public void setQuantity(BigDecimal quantity) {
public void setQuantity(BigDecimal quantity)
{
this.quantity = quantity;
}
public MUnitEmb getMunit() {
public MUnitEmb getMunit()
{
return munit;
}
public void setMunit(MUnitEmb munit) {
public void setMunit(MUnitEmb munit)
{
this.munit = munit;
}
public BigDecimal getUnitPrice() {
public BigDecimal getUnitPrice()
{
return unitPrice;
}
public void setUnitPrice(BigDecimal unitPrice) {
public void setUnitPrice(BigDecimal unitPrice)
{
this.unitPrice = unitPrice;
}
public BigDecimal getTotal() {
public BigDecimal getTotal()
{
return total;
}
public void setTotal(BigDecimal total) {
public void setTotal(BigDecimal total)
{
this.total = total;
}
public String getDescription() {
public String getDescription()
{
return description;
}
public void setDescription(String description) {
public void setDescription(String description)
{
this.description = description;
}
public RequirementItem getReqItem() {
public RequirementItem getReqItem()
{
return reqItem;
}
public void setReqItem(RequirementItem reqItem) {
public void setReqItem(RequirementItem reqItem)
{
this.reqItem = reqItem;
}
public Order getOrder() {
public Order getOrder()
{
return order;
}
public void setOrder(Order order) {
public void setOrder(Order order)
{
this.order = order;
}
@@ -16,7 +16,7 @@ import javax.persistence.Table;
@Table(name = "REQUIREMENT")
public class Requirement extends RequirementBase
{
@OneToMany(fetch = FetchType.EAGER, mappedBy = "requirement", cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(fetch = FetchType.LAZY, mappedBy = "requirement", cascade = CascadeType.ALL, orphanRemoval = true)
private List<RequirementItem> items;
@Column(name = "DELIVERYDATE")
@@ -28,6 +28,9 @@ public class Requirement extends RequirementBase
@Column(name = "KIND")
private Long kind;
@Column(name = "PROJECT")
private Boolean project;
public Requirement()
{
this.setItems(new ArrayList<RequirementItem>());
@@ -78,4 +81,39 @@ public class Requirement extends RequirementBase
{
this.kind = kind;
}
public Boolean getProject()
{
return project;
}
public void setProject(Boolean project)
{
this.project = project;
}
@Override
public boolean equals(Object obj)
{
if (obj != null)
{
if (obj instanceof Requirement)
{
Requirement item = (Requirement) obj;
int thisId = this.getId();
int itemId = item.getId();
boolean equalsId = (thisId == itemId);
if (equalsId && (thisId == 0))
{
return super.equals(obj);
}
return equalsId;
}
}
return false;
}
}
@@ -56,6 +56,12 @@ public class RequirementItem
@Column(name = "DELIVERED")
private Boolean delivered;
@Column(name = "ORDERNUM")
private String orderNum;
@Column(name = "PAID")
private Boolean paid;
public int getId()
{
return id;
@@ -163,7 +169,22 @@ public class RequirementItem
{
RequirementItem item = (RequirementItem)obj;
return (this.getId() == item.getId());
int thisId = this.getId();
int itemId = item.getId();
boolean equalsId = (thisId == itemId);
if (equalsId && (thisId == 0))
{
// Při zadávání položek do gridu zatím nové položky nemají
// přiřazeno ID, takže se rozlišují podle reference
// Při hledání položky v seznamu nebo zjišťování indexu pak
// byly veškeré položky s ID = 0 a grid nevybíral aktivní
// položku správně, stejně tak nepřekresloval ani scrollbar
// a pod.
return super.equals(obj);
}
return equalsId;
}
}
@@ -187,4 +208,22 @@ public class RequirementItem
public void setDelivered(Boolean delivered) {
this.delivered = delivered;
}
public String getOrderNum()
{
return orderNum;
}
public void setOrderNum(String orderNum)
{
this.orderNum = orderNum;
}
public Boolean getPaid() {
return paid;
}
public void setPaid(Boolean paid) {
this.paid = paid;
}
}
@@ -45,7 +45,6 @@ public abstract class RequirementSubject implements OwnedDataModel {
@Column(name = "DESCRIPTION")
private String description;
@NotEmpty(message = "{MaterialFormCodeConstr}")
public String getCode() {
return code;
@@ -140,7 +139,16 @@ public abstract class RequirementSubject implements OwnedDataModel {
{
RequirementSubject item = (RequirementSubject) obj;
return (this.getId() == item.getId());
int thisId = this.getId();
int itemId = item.getId();
boolean equalsId = (thisId == itemId);
if (equalsId && (thisId == 0))
{
return super.equals(obj);
}
return equalsId;
}
}
@@ -0,0 +1,74 @@
package info.bukova.isspst.filters;
import info.bukova.isspst.DateTimeUtils;
import info.bukova.isspst.StringUtils;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.Requirement;
import info.bukova.isspst.data.Workgroup;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public class InvoicingFilter implements Filter<Invoicing>
{
private Invoicing condition;
public InvoicingFilter(Invoicing cond)
{
this.condition = cond;
}
private static class InvoicingMatcher extends TypeSafeMatcher<Invoicing>
{
private Invoicing condition;
public InvoicingMatcher(Invoicing cond)
{
this.condition = cond;
if (condition.getRequirement() == null) {
condition.setRequirement(new Requirement());
}
}
@Override
public void describeTo(Description desc)
{
desc.appendText("Invoicing matches");
}
@Override
public boolean matchesSafely(Invoicing item)
{
boolean foundNumser = StringUtils.isEqualForFilter(item.getRequirement().getNumser(), condition.getRequirement().getNumser());
boolean foundReqDate = DateTimeUtils.isEqualByDateForFilter(item.getRequirement().getReqDate(), condition.getRequirement().getReqDate());
boolean foundCenter = Workgroup.isEqualByWorkgroupForFilter(item.getRequirement().getCentre(), condition.getRequirement().getCentre());
boolean foundWorkgroup = Workgroup.isEqualByWorkgroupForFilter(item.getRequirement().getWorkgroup(), condition.getRequirement().getWorkgroup());
boolean foundDescription = StringUtils.isEqualForFilter(item.getRequirement().getDescription(), condition.getRequirement().getDescription());
return (foundNumser && foundReqDate && foundCenter && foundDescription && foundWorkgroup);
}
@Factory
public static Matcher<Invoicing> matchBuilding(Invoicing building)
{
return new InvoicingMatcher(building);
}
}
@Override
public InvoicingMatcher matcher()
{
return new InvoicingMatcher(condition);
}
@Override
public String queryString()
{
return "";
}
}
@@ -42,27 +42,24 @@ public class OrderFilter implements Filter<Order>
@Override
public boolean matchesSafely(Order item)
{
boolean foundOrdered = (item.isOrdered() == condition.isOrdered());
boolean foundNumSer = StringUtils.isEqualForFilter(item.getNumser(), condition.getNumser());
boolean foundOrderDate = DateTimeUtils.isEqualByDateForFilter(item.getOrderDate(), condition.getOrderDate());
boolean foundTotal = true;// BigDecimalUtils.isEqualByDecimalForFilter(item.getTotal(),
// condition.getTotal());
boolean foundDeliveryDate = DateTimeUtils.isEqualByDateForFilter(item.getDeliveryDate(), condition.getDeliveryDate());
boolean foundDeliveredDate = DateTimeUtils.isEqualByDateForFilter(item.getDeliveredDate(), condition.getDeliveredDate());
boolean foundInvoiceNumber = StringUtils.isEqualForFilter(item.getInvoiceNumber(), condition.getInvoiceNumber());
boolean foundInvoiceTotal = true;// BigDecimalUtils.isEqualByDecimalForFilter(item.getInvoiceTotal(),
// condition.getInvoiceTotal());
boolean foundSupplierAddr = AddressEmb.isEqualByAddressEmbForFilter(item.getSuplier(), condition.getSuplier());
boolean foundDeliveryAddr = AddressEmb.isEqualByAddressEmbForFilter(item.getDeliveryAddress(), condition.getDeliveryAddress());
boolean foundInvoiceAddr = AddressEmb.isEqualByAddressEmbForFilter(item.getAddress(), condition.getAddress());
boolean foundOwnedBy = User.isEqualByUserForFilter(item.getOwnedBy(), condition.getOwnedBy());
boolean foundDescription = StringUtils.isEqualForFilter(item.getDescription(), condition.getDescription());
return (foundNumSer
return (foundOrdered
&& foundNumSer
&& foundOrderDate
&& foundTotal
&& foundDeliveryDate
&& foundDeliveredDate
&& foundInvoiceNumber
&& foundInvoiceTotal
&& foundSupplierAddr
&& foundDeliveryAddr
&& foundInvoiceAddr
@@ -1,5 +1,6 @@
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.Requirement;
@@ -46,7 +47,8 @@ public class RequirementFilter implements Filter<Requirement>
boolean foundDescription = StringUtils.isEqualForFilter(item.getDescription(), condition.getDescription());
boolean foundDeliveryDate = DateTimeUtils.isEqualByDateForFilter(item.getDeliveryDate(), condition.getDeliveryDate());
boolean foundUser = User.isEqualByUserForFilter(item.getOwnedBy(), condition.getOwnedBy());
return (foundNumser && foundReqDate && foundCenter && foundDescription && foundDeliveryDate && foundUser);
boolean foundProject = BooleanUtils.isEqualByBoolean(item.getProject(), condition.getProject());
return (foundNumser && foundReqDate && foundCenter && foundDescription && foundDeliveryDate && foundUser && foundProject);
}
@Factory
@@ -3,6 +3,7 @@ package info.bukova.isspst.filters;
import info.bukova.isspst.DateTimeUtils;
import info.bukova.isspst.StringUtils;
import info.bukova.isspst.data.TripRequirement;
import info.bukova.isspst.data.User;
import org.hamcrest.Description;
import org.hamcrest.Factory;
@@ -45,7 +46,7 @@ public class TripRequirementFilter implements Filter<TripRequirement>
boolean foundTo = StringUtils.isEqualForFilter(item.getTo(), condition.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 = StringUtils.isEqualForFilter(item.getOwnedBy().getLastName(), condition.getOwnedBy().getLastName());
boolean foundOwner = User.isEqualByUserForFilter(item.getOwnedBy(), condition.getOwnedBy());
return foundNumser && foundReqDate && foundDescription && foundFrom && foundTo && foundWorkgroup && foundCentre && foundOwner;
}
@@ -1,5 +1,8 @@
package info.bukova.isspst.mail;
import info.bukova.isspst.EntityUrlResolver;
import info.bukova.isspst.UrlResolverHolder;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
@@ -12,6 +15,7 @@ public class EntityMessageBuilder implements MessageBuilder {
private final static Logger logger = LoggerFactory.getLogger(EntityMessageBuilder.class);
private boolean html;
private UrlResolverHolder urlResolverHolder;
public void setHtml(boolean html) {
this.html = html;
@@ -53,7 +57,11 @@ public class EntityMessageBuilder implements MessageBuilder {
for (String p : properties) {
try {
ret = ret.replaceAll("\\[" + p + "\\]", BeanUtils.getProperty(data, p));
if (p.equals("-url-")) {
ret = ret.replaceAll("\\[" + p + "\\]", getUrl(data));
} else {
ret = ret.replaceAll("\\[" + p + "\\]", BeanUtils.getProperty(data, p));
}
} catch (IllegalAccessException e) {
logger.error(e.getMessage());
} catch (InvocationTargetException e) {
@@ -68,4 +76,17 @@ public class EntityMessageBuilder implements MessageBuilder {
return ret;
}
private String getUrl(Object data) {
if (urlResolverHolder == null) {
return "";
}
EntityUrlResolver res = urlResolverHolder.resolverFor(data.getClass());
return res.entityUrl(data);
}
public void setUrlResolverHolder(UrlResolverHolder urlResolverHolder) {
this.urlResolverHolder = urlResolverHolder;
}
}
@@ -43,6 +43,10 @@ public class MailerWithAttachement implements Mailer {
}
}
if (message.getReplyTo() == null) {
message.setReplyTo(message.getFrom());
}
helper.setFrom(message.getFrom());
helper.setReplyTo(message.getReplyTo());
helper.setTo(message.getTo());
@@ -63,6 +67,7 @@ public class MailerWithAttachement implements Mailer {
}
try {
sender.send(mimeMessage);
logger.info("Mail queued for send");
} catch (MailAuthenticationException e) {
logger.error("Authentication error");
} catch (MailSendException e) {
@@ -0,0 +1,19 @@
package info.bukova.isspst.services.invoicing;
import java.math.BigDecimal;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.Service;
public interface InvoicingService extends Service<Invoicing> {
public BigDecimal totalInvoicedForWorkgroup(Workgroup workgroup);
public void loadReqItems(Invoicing invoicing);
public void loadItems(Invoicing invoicing);
public void calculate(Invoicing invoicing);
}
@@ -0,0 +1,57 @@
package info.bukova.isspst.services.invoicing;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.InvoicingItem;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.AbstractOwnedService;
import info.bukova.isspst.services.LazyLoader;
import java.math.BigDecimal;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.springframework.transaction.annotation.Transactional;
public class InvoicingServiceImpl extends AbstractOwnedService<Invoicing> implements
InvoicingService {
@Override
@Transactional
public BigDecimal totalInvoicedForWorkgroup(Workgroup workgroup) {
Query q = dao.getQuery("select sum(inv.totalInvoiced) "
+ "from Invoicing inv join inv.requirement rq join rq.workgroup w "
+ "where w = :workgroup ");
q.setParameter("workgroup", workgroup);
return (BigDecimal) q.uniqueResult();
}
@Override
@Transactional
@LazyLoader("form")
public void loadReqItems(Invoicing invoicing) {
Invoicing inv = getById(invoicing.getId());
Hibernate.initialize(inv.getRequirement().getItems());
invoicing.getRequirement().setItems(inv.getRequirement().getItems());
}
@Override
@Transactional
@LazyLoader({"form", "grid"})
public void loadItems(Invoicing invoicing) {
Invoicing inv = getById(invoicing.getId());
Hibernate.initialize(inv.getItems());
invoicing.setItems(inv.getItems());
}
@Override
public void calculate(Invoicing invoicing) {
BigDecimal total = BigDecimal.ZERO;
for (InvoicingItem item : invoicing.getItems()) {
total = total.add(item.getAmount());
}
invoicing.setTotalInvoiced(total);
}
}
@@ -1,4 +1,4 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.services.Service;
@@ -1,4 +1,4 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.data.RequirementItem;
@@ -34,8 +34,13 @@ public class ApprovedServiceImpl extends AbstractService<JoinedItem> implements
public List<JoinedItem> getAll()
{
List<Workgroup> wgList = workgroupService.getUserCentres(userService.getCurrent());
Query q = queryDao
.getQuery("select item from RequirementItem item left join item.requirement rq join rq.centre c where rq.kind is not null and rq.state = :state and c in (:wgList)");
Query q = queryDao.getQuery("select item "
+ "from RequirementItem item left join item.requirement rq join rq.centre c "
+ "where rq.kind is not null "
+ "and rq.state = :state "
+ "and (rq.project Is Null or rq.project = false) "
+ "and c in (:wgList) "
+ "and (item.orderNum Is Null or item.orderNum = '')");
q.setParameterList("wgList", wgList);
q.setParameter("state", RequirementState.APPROVED);
List<JoinedItem> items = new ArrayList<JoinedItem>();
@@ -1,4 +1,4 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.data.Order;
@@ -22,4 +22,5 @@ public interface OrderService extends Service<Order> {
public BigDecimal calcSumTotalFromItems(List<OrderItem> items);
public void updateApprovedItems(Order order, boolean orderedChanged);
}
@@ -1,9 +1,11 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.dao.RequirementItemDao;
import info.bukova.isspst.data.AddressEmb;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.data.Order;
import info.bukova.isspst.data.OrderItem;
import info.bukova.isspst.data.RequirementItem;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.AbstractOwnedService;
import info.bukova.isspst.services.LazyLoader;
@@ -24,6 +26,9 @@ public class OrderServiceImpl extends AbstractOwnedService<Order> implements
@Autowired
private GlobalSettingsService globalSettings;
@Autowired
private RequirementItemDao requirementItemDao;
@Override
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
public Order createOrder(List<JoinedItem> items) {
@@ -47,10 +52,13 @@ public class OrderServiceImpl extends AbstractOwnedService<Order> implements
@Override
@Transactional
public BigDecimal totalOrderedForWorkgroup(Workgroup workgroup) {
Query q = dao.getQuery("select sum(oi.total) from OrderItem oi join oi.reqItem ri join ri.requirement rq join rq.workgroup w where ri.delivered = true and w = :workgroup");
public BigDecimal totalOrderedForWorkgroup(Workgroup workgroup)
{
Query q = dao.getQuery("select sum(oi.total) "
+ "from OrderItem oi join oi.reqItem ri join ri.requirement rq join rq.workgroup w "
+ "where (ri.orderNum is not null or ri.orderNum = '') and w = :workgroup ");
q.setParameter("workgroup", workgroup);
return (BigDecimal)q.uniqueResult();
return (BigDecimal) q.uniqueResult();
}
@Override
@@ -171,4 +179,24 @@ public class OrderServiceImpl extends AbstractOwnedService<Order> implements
return sumTotal;
}
@Transactional
public void updateApprovedItems(Order order, boolean orderedChanged)
{
if (orderedChanged)
{
for (OrderItem item : order.getItems())
{
RequirementItem rItem = item.getReqItem();
if (rItem != null)
{
rItem.setOrderNum(order.isOrdered() ? order.getNumser() : null);
requirementItemDao.modify(rItem);
}
}
}
super.update(order);
}
}
@@ -6,6 +6,14 @@ import info.bukova.isspst.services.Service;
import java.util.List;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Základní rozhraní všech požadavků.
*
* @param <T> Třída požadavku.
*/
public interface RequirementBaseService<T extends RequirementBase> extends Service<T>
{
@@ -30,6 +30,14 @@ import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Abstraktní bázová třída všech požadavků
*
* @param <T> Třída požadavku
*/
public abstract class RequirementBaseServiceImpl<T extends RequirementBase> extends
AbstractOwnedService<T> implements RequirementBaseService<T> {
@@ -68,7 +76,11 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
super.add(entity);
this.sendToApprovers(entity);
if (canApprove(entity)) {
approve(entity);
} else {
this.sendToApprovers(entity);
}
}
private void checkEnable() {
@@ -220,12 +232,10 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
} else {
e.setState(RequirementState.PARTIALLY);
}
entity.setState(e.getState());
entity.getAuthorization().add(auth);
super.update(e);
if (!autoApprove(entity)) {
if (!autoApprove(e)) {
this.sendToApprovers(e);
SettingsData settings = settingsService.getSettings();
@@ -247,6 +257,8 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
}
}
}
postApprove(e);
}
@Override
@@ -256,10 +268,25 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
approve(entity, getLoggedInUser());
}
/**
* Volá se z metody approve pro automatické schválení dalším schvalovatelem v pořadí. Metoda z báze nedělá nic.
*
* @param entity Požadavek
* @return true pokud se provedlo automatické schválení.
*/
protected boolean autoApprove(T entity) {
return false;
}
/**
* Činnost prováděná po schválení požadavku (i dílčím schválení).
*
* @param entity Požadavek
*/
protected void postApprove(T entity) {
}
@Override
@Transactional
public boolean canApprove(T entity) {
@@ -6,10 +6,19 @@ import info.bukova.isspst.data.RequirementItem;
import java.math.BigDecimal;
import java.util.List;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Základní rozhraní požadavků na služby a materiál.
*
*/
public interface RequirementService extends RequirementBaseService<Requirement>
{
public void loadGroups(Requirement req);
public void loadItems(Requirement req);
public BigDecimal calcTotalFromItem(RequirementItem item);
public RequirementItem calcTotalInItem(RequirementItem item);
@@ -1,6 +1,7 @@
package info.bukova.isspst.services.requirement;
import info.bukova.isspst.Constants;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.Requirement;
import info.bukova.isspst.data.RequirementItem;
import info.bukova.isspst.data.RequirementState;
@@ -8,22 +9,30 @@ import info.bukova.isspst.data.RequirementSubject;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workflow;
import info.bukova.isspst.services.LazyLoader;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.invoicing.InvoicingService;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Bázová třída požadavků na materiál a služby.
*
*/
public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requirement> implements RequirementService, RequirementBaseService<Requirement>
{
@Autowired
private RequirementTypeService reqTypeService;
@Autowired
private OrderService orderService;
private InvoicingService invoicingService;
@Override
protected Requirement createEntity()
@@ -48,7 +57,8 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
return false;
}
if (entity.getSumTotal().compareTo(nextWf.getLimit()) == -1)
if ((entity.getSumTotal() != null)
&& (entity.getSumTotal().compareTo(nextWf.getLimit()) == -1))
{
approve(entity, approvers.get(0));
return true;
@@ -63,7 +73,7 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
if (entity.getWorkgroup() != null && entity.getWorkgroup().getLimit() != null && entity.getWorkgroup().getLimit().compareTo(BigDecimal.ZERO) != 0)
{
BigDecimal total = orderService.totalOrderedForWorkgroup(entity.getWorkgroup());
BigDecimal total = invoicingService.totalInvoicedForWorkgroup(entity.getWorkgroup());
if (total == null)
{
@@ -136,6 +146,19 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
req.setItems(items);
}
@Override
@Transactional
@LazyLoader("form")
public void loadItems(Requirement req) {
if (req == null) {
return;
}
Requirement r = getById(req.getId());
Hibernate.initialize(r.getItems());
req.setItems(r.getItems());
}
@Override
public BigDecimal calcTotalFromItem(RequirementItem item)
{
@@ -208,4 +231,13 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
return sumTotal;
}
@Override
protected void postApprove(Requirement entity) {
if (entity.getState() == RequirementState.APPROVED) {
Invoicing inv = new Invoicing();
inv.setRequirement(entity);
invoicingService.add(inv);
}
}
}
@@ -5,6 +5,7 @@ import info.bukova.isspst.data.NumberSeries;
import info.bukova.isspst.data.RequirementState;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripRequirement;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.LazyLoader;
import info.bukova.isspst.services.tripbill.TripBillService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
@@ -13,7 +14,6 @@ import java.util.Date;
import org.hibernate.LazyInitializationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripRequirement>
@@ -54,16 +54,21 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
}
@Override
@Transactional
@PreAuthorize("this.canApprove(#entity)")
public void approve(TripRequirement entity) {
super.approve(entity);
protected void postApprove(TripRequirement entity) {
if (entity.getState() == RequirementState.APPROVED) {
TripBill bill = tripBillService.createTripBill(entity);
tripBillService.add(bill);
bill.setOwnedBy(entity.getOwnedBy());
tripBillService.update(bill);
for (User u : entity.getPassengers()) {
if (!u.equals(entity.getOwnedBy())) {
TripBill passBill = tripBillService.createTripBill(entity);
tripBillService.add(passBill);
passBill.setOwnedBy(u);
tripBillService.update(passBill);
}
}
}
}
@@ -26,6 +26,7 @@ public class AdUserCtxMapper implements UserDetailsContextMapper {
private UserService userService;
private RoleService roleService;
private String allowedGroup;
private final static Logger logger = LoggerFactory.getLogger(AdUserCtxMapper.class);
@@ -43,7 +44,7 @@ public class AdUserCtxMapper implements UserDetailsContextMapper {
return user;
} catch (UsernameNotFoundException e) {
logger.info("Importing user from Active Directory");
LdapUserImporter importer = new LdapUserImporter(userService);
LdapUserImporter importer = new LdapUserImporter(userService, allowedGroup);
importer.importUser(username, userData, roleService.getRoleByAuthority(Constants.ROLE_USER));
return userService.loadUserByUsername(username);
@@ -56,4 +57,8 @@ public class AdUserCtxMapper implements UserDetailsContextMapper {
"use a subclass if mapUserToContext() is required.");
}
public void setAllowedGroup(String allowedGroup) {
this.allowedGroup = allowedGroup;
}
}
@@ -9,6 +9,7 @@ import javax.naming.NamingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ldap.core.DirContextOperations;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
/**
* Pomocná třída pro import uživatele z LDAP serveru (nebo Active Directory) do databáze aplikace
@@ -19,12 +20,18 @@ import org.springframework.ldap.core.DirContextOperations;
public class LdapUserImporter {
private UserService userService;
private String allowedGroup;
private final static Logger logger = LoggerFactory.getLogger(LdapUserImporter.class);
public LdapUserImporter(UserService userService) {
this.userService = userService;
}
public LdapUserImporter(UserService userService, String group) {
this.userService = userService;
this.allowedGroup = group;
}
/**
* Provede import uživatele z LDAP do aplikační databáze
*
@@ -37,6 +44,21 @@ public class LdapUserImporter {
user.setUsername(login);
user.addAuthority(defaultRole);
if (allowedGroup != null && !allowedGroup.isEmpty()) {
boolean isAllowed = false;
for (Object atr : userData.getObjectAttributes("memberOf")) {
if (atr.toString().startsWith("CN="+allowedGroup)) {
isAllowed = true;
break;
}
}
if (!isAllowed) {
throw new UsernameNotFoundException("User is not member of group '" + allowedGroup + "'");
}
}
if (userData.attributeExists("givenName")) {
try {
user.setFirstName(userData.getAttributes().get("givenName").get().toString());
@@ -3,11 +3,13 @@ package info.bukova.isspst.ui;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Locale;
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;
public class BigDecimalConverter implements Converter<String, BigDecimal, Component>
@@ -23,7 +25,8 @@ public class BigDecimalConverter implements Converter<String, BigDecimal, Compon
{
try
{
DecimalFormat format = new DecimalFormat();
Locale loc = Locales.getCurrent();
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(loc);
format.setParseBigDecimal(true);
val = (BigDecimal) format.parse(str);
}
@@ -43,6 +46,9 @@ public class BigDecimalConverter implements Converter<String, BigDecimal, Compon
@Override
public String coerceToUi(BigDecimal val, Component component, BindContext cx)
{
// String lang = Executions.getCurrent().getHeader("accept-language");
Locale loc = Locales.getCurrent();
if (val == null)
{
val = BigDecimal.ZERO;
@@ -50,13 +56,13 @@ public class BigDecimalConverter implements Converter<String, BigDecimal, Compon
val = val.setScale(2, BigDecimal.ROUND_DOWN);
DecimalFormat format = new DecimalFormat();
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(loc);
format.setMaximumFractionDigits(2);
format.setMinimumFractionDigits(2);
format.setGroupingUsed(true);
format.setGroupingSize(3);
return format.format(val);
String formatted = format.format(val);
return formatted;
}
}
@@ -2,7 +2,7 @@ package info.bukova.isspst.ui;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.bind.SimpleForm;
@@ -34,12 +34,40 @@ public class BindingForm<T> extends SimpleForm {
*/
public void bindTo(T object) {
for (String key : getFieldNames()) {
try {
BeanUtils.setProperty(object, key, getField(key));
} catch (IllegalAccessException e) {
// try {
// BeanUtils.setProperty(object, key, getField(key));
//
// } catch (IllegalAccessException e) {
// logger.warn("Cannot bind value", e);
// } catch (InvocationTargetException e) {
// logger.warn("Cannot bind value", e);
// }
try
{
if (PropertyUtils.getPropertyType(object, key).isPrimitive()
&& (getField(key) == null))
{
PropertyUtils.setProperty(object, key, 0);
}
else
{
PropertyUtils.setProperty(object, key, getField(key));
}
}
catch (NoSuchMethodException e)
{
logger.warn("Cannot bind value " + key + " (" + e.getMessage() + ")");
// e.printStackTrace();
}
catch (IllegalAccessException e)
{
logger.warn("Cannot bind value", e);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
catch (InvocationTargetException e)
{
logger.warn("Cannot bind value", e);
e.printStackTrace();
}
}
}
@@ -6,16 +6,22 @@ import org.zkoss.bind.BindContext;
import org.zkoss.bind.Converter;
import org.zkoss.zk.ui.Component;
public class BoolConverter implements Converter<String, Boolean, Component> {
public class BoolConverter implements Converter<String, Boolean, Component>
{
@Override
public Boolean coerceToBean(String str, Component component, BindContext cx) {
public Boolean coerceToBean(String str, Component component, BindContext cx)
{
return false;
}
@Override
public String coerceToUi(Boolean val, Component component, BindContext cx) {
public String coerceToUi(Boolean val, Component component, BindContext cx)
{
if (val == null)
{
val = new Boolean(false);
}
return StringUtils.localize(val.toString());
}
}
@@ -17,6 +17,8 @@ public class DocumentViewModel
{
protected BigDecimalConverter standardBigDecimalConverter;
protected BoolConverter standardBoolConverter;
public BigDecimalConverter getStandardBigDecimalConverter()
{
return standardBigDecimalConverter;
@@ -27,10 +29,21 @@ public class DocumentViewModel
this.standardBigDecimalConverter = standardBigDecimalConverter;
}
public BoolConverter getStandardBoolConverter()
{
return standardBoolConverter;
}
public void setStandardBoolConverter(BoolConverter standardBoolConverter)
{
this.standardBoolConverter = standardBoolConverter;
}
@Init
public void initDocumentViewModel()
{
this.standardBigDecimalConverter = new BigDecimalConverter();
this.standardBoolConverter = new BoolConverter();
}
@Command
@@ -300,6 +300,7 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
if (selIndex > -1) {
this.setDataBean(dataList.get(selIndex));
afterSelect();
}
}
@@ -307,6 +308,10 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
}
protected void afterSelect() {
}
@Command
@NotifyChange("dataBean")
public void onSort(@BindingParam("column") String column) {
@@ -335,26 +340,6 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
}
}
// private void loadFromDb() {
// Thread fillThread = new Thread(new Runnable() {
//
// @Override
// public void run() {
// tmpList = service.getAll();
//
// try {
// Thread.sleep(200);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//
// fullFill = true;
// }
// });
//
// fillThread.start();
// }
@Command
public void onPrint() {
Map<String, Object> params = new HashMap<String, Object>();
@@ -400,4 +385,9 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
{
return this.isRecordSelected();
}
public boolean isAbleToAdd()
{
return true;
}
}
@@ -3,7 +3,7 @@ package info.bukova.isspst.ui.dashboard;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.invoicing.InvoicingService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import info.bukova.isspst.ui.DocumentViewModel;
@@ -24,7 +24,7 @@ public class DashBoardVM extends DocumentViewModel {
@WireVariable
private UserService userService;
@WireVariable
private OrderService orderService;
private InvoicingService invoicingService;
private User user;
private Map<Workgroup, List<Role>> groupRoles;
private Map<Workgroup, BigDecimal> workgroupSpent;
@@ -47,7 +47,7 @@ public class DashBoardVM extends DocumentViewModel {
for (Workgroup w : wg) {
List<Role> r = workgroupService.getUserWorkgroupRoles(w, user);
groupRoles.put(w, r);
workgroupSpent.put(w, orderService.totalOrderedForWorkgroup(w));
workgroupSpent.put(w, invoicingService.totalInvoicedForWorkgroup(w));
}
}
@@ -5,8 +5,8 @@ import info.bukova.isspst.data.Order;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.filters.JoinedItemFilter;
import info.bukova.isspst.services.approved.ApprovedService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.orders.ApprovedService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import info.bukova.isspst.ui.BigDecimalConverter;
@@ -0,0 +1,80 @@
package info.bukova.isspst.ui.main.invoicing;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.InvoicingItem;
import info.bukova.isspst.services.invoicing.InvoicingService;
import info.bukova.isspst.ui.FormViewModel;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.select.annotation.WireVariable;
public class InvoicingForm extends FormViewModel<Invoicing> {
private InvoicingItem selectedItem;
private int selectedIndex;
@WireVariable
private InvoicingService invoicingService;
@Init(superclass = true)
public void init() {
selectedIndex = -1;
}
private void selectItem(InvoicingItem item) {
if (item != null) {
selectedItem = item;
selectedIndex = getDataBean().getItems().indexOf(item);
} else {
selectedItem = null;
selectedIndex = -1;
}
}
@Command
@NotifyChange({"dataBean", "selectedItem", "selectedIndex"})
public void addItem() {
InvoicingItem item = new InvoicingItem();
getDataBean().getItems().add(item);
selectItem(item);
}
@Command
@NotifyChange({"dataBean", "selectedItem", "selectedIndex"})
public void removeItem(@BindingParam("item") InvoicingItem item) {
getDataBean().getItems().remove(item);
selectItem(null);
calculate();
}
@Command
@NotifyChange({"selectedItem", "selectedIndex"})
public void onFocus(@BindingParam("item") InvoicingItem item) {
selectItem(item);
}
@Command
@NotifyChange("dataBean")
public void calculate() {
invoicingService.calculate(getDataBean());
}
public InvoicingItem getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(InvoicingItem selectedItem) {
this.selectedItem = selectedItem;
}
public int getSelectedIndex() {
return selectedIndex;
}
public void setSelectedIndex(int selectedIndex) {
this.selectedIndex = selectedIndex;
}
}
@@ -0,0 +1,48 @@
package info.bukova.isspst.ui.main.invoicing;
import java.util.List;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.filters.InvoicingFilter;
import info.bukova.isspst.services.invoicing.InvoicingService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import info.bukova.isspst.ui.ListViewModel;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.select.annotation.WireVariable;
public class InvoicingList extends ListViewModel<Invoicing> {
@WireVariable
private InvoicingService invoicingService;
@WireVariable
private WorkgroupService workgroupService;
@Init(superclass = true)
public void initInvoicing() {
service = invoicingService;
dataClass = Invoicing.class;
formZul = "invoicingForm.zul";
dataFilter = new InvoicingFilter(getFilterTemplate());
}
@Override
public boolean isAbleToAdd() {
return false;
}
@Override
public boolean isAbleToDelete() {
return false;
}
public List<Workgroup> getCentres() {
return workgroupService.getCentres();
}
public List<Workgroup> getWorkgroups() {
return workgroupService.getWorkgroups();
}
}
@@ -4,14 +4,18 @@ import info.bukova.isspst.data.Address;
import info.bukova.isspst.data.AddressEmb;
import info.bukova.isspst.data.Order;
import info.bukova.isspst.data.OrderItem;
import info.bukova.isspst.services.IsspstException;
import info.bukova.isspst.services.addressbook.AdbService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.addressbook.AddressFinder;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.ui.FormViewModel;
import info.bukova.isspst.validators.OrderFormValidator;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -19,9 +23,13 @@ import org.zkoss.bind.BindUtils;
import org.zkoss.bind.SimpleForm;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;
import org.zkoss.zul.impl.InputElement;
public class OrderForm extends FormViewModel<Order>
@@ -29,7 +37,11 @@ public class OrderForm extends FormViewModel<Order>
private final static Logger log = LoggerFactory.getLogger(OrderForm.class.getName());
@WireVariable
protected AdbService adbService;
private AdbService adbService;
@WireVariable
private AddressFinder addressFinderAres;
@WireVariable
private AddressFinder addressFinderTaxID;
@WireVariable
protected GlobalSettingsService settingsService;
@@ -51,19 +63,29 @@ public class OrderForm extends FormViewModel<Order>
protected List<OrderItem> syncOrderItems;
/**
* Obsah záznamu před editací
*/
protected Order recordBeforeEdit;
@Init(superclass = true)
public void initOrderForm()
{
this.orderFormValidator = new OrderFormValidator();
if (this.getDataBean().getSuplier() == null)
if (getDataBean().getSuplier() != null)
{
if (getDataBean().getSuplier().getAddress().getId() != 0)
{
this.selectedSuppAddrItem = this.getDataBean().getSuplier().getAddress();
}
this.suppCompany = getDataBean().getSuplier().getCompany();
}
else
{
this.getDataBean().setSuplier(new AddressEmb());
}
this.selectedSuppAddrItem = this.getDataBean().getSuplier().getAddress();
this.suppCompany = this.selectedSuppAddrItem.getCompany();
if (this.getDataBean().getDeliveryAddress() == null)
{
this.getDataBean().setDeliveryAddress(new AddressEmb());
@@ -78,6 +100,16 @@ public class OrderForm extends FormViewModel<Order>
}
this.syncOrderItems = this.getDataBean().getItems();
try
{
this.recordBeforeEdit = (Order) this.getDataBean().clone();
}
catch (CloneNotSupportedException e)
{
log.error("Nelze provést hlubokou kopii objednávky!");
e.printStackTrace();
}
}
public OrderFormValidator getOrderFormValidator()
@@ -165,10 +197,21 @@ public class OrderForm extends FormViewModel<Order>
this.syncOrderItems = syncOrderItems;
}
public Order getRecordBeforeEdit()
{
return recordBeforeEdit;
}
public void setRecordBeforeEdit(Order recordBeforeEdit)
{
this.recordBeforeEdit = recordBeforeEdit;
}
@Command
@NotifyChange("dataBean")
public void doFillSuppAddress()
{
this.getDataForm().bind();
AddressEmb addr;
if (this.selectedSuppAddrItem == null)
@@ -190,6 +233,7 @@ public class OrderForm extends FormViewModel<Order>
@NotifyChange("dataBean")
public void doFillDeliveryAddress()
{
this.getDataForm().bind();
AddressEmb addr;
if (this.selectedDeliveryAddrItem == null)
@@ -252,4 +296,70 @@ public class OrderForm extends FormViewModel<Order>
// Calculate total price at form
this.calcAndUpdateFormTotalPrice(form);
}
@Override
protected void doSave()
{
// Zjisti, zda se změnil příznak objednávky (objednáno/neobjednáno)
boolean orderedChanged = (this.recordBeforeEdit.isOrdered() != this.getDataBean().isOrdered());
// Aktualizovat příznak schválených položek, aby se nemohli vložit do
// jiných objednávek
orderService.updateApprovedItems(this.getDataBean(), orderedChanged);
}
@Command
@NotifyChange({"dataBean", "suppCompany"})
public void searchAddress()
{
getDataForm().bind();
Address adr = getDataBean().getSuplier().getAddress();
if (adr.getIc() != 0)
{
try
{
adbService.fillFoundData(addressFinderTaxID, adr);
getDataBean().setSuplier(new AddressEmb(adr));
suppCompany = adr.getCompany();
}
catch (IsspstException e)
{
Messagebox.show("Chyba při hledání adresy", "Chyba", Messagebox.OK, Messagebox.ERROR);
return;
}
}
else
{
Map<String, List<Address>> arg = new HashMap<String, List<Address>>();
try {
arg.put("result", adbService.lookForAddr(addressFinderAres, adr));
} catch (IsspstException e) {
Messagebox.show("Chyba při hledání adresy", "Chyba", Messagebox.OK, Messagebox.ERROR);
return;
}
Window resWin = (Window) Executions.createComponents("/lists/addressbook/addrFindResult.zul", null, arg);
resWin.doModal();
}
}
@GlobalCommand
@NotifyChange({"dataBean", "suppCompany"})
public void selectAddress(@BindingParam("selected") Address selected, @BindingParam("window") Window window) {
try {
adbService.fillFoundData(addressFinderTaxID, selected);
} catch (IsspstException e) {
e.printStackTrace();
}
Address adr = getDataBean().getSuplier().getAddress();
adbService.mergeAddress(adr, selected, true);
getDataBean().setSuplier(new AddressEmb(adr));
suppCompany = adr.getCompany();
if (window != null)
window.detach();
}
}
@@ -9,10 +9,11 @@ import info.bukova.isspst.data.SettingsData;
import info.bukova.isspst.data.User;
import info.bukova.isspst.filters.OrderFilter;
import info.bukova.isspst.services.addressbook.AdbService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.ui.ListViewModel;
import info.bukova.isspst.ui.renderers.OrderCreatedItemRenderer;
import java.util.ArrayList;
import java.util.List;
@@ -47,6 +48,8 @@ public class OrderList extends ListViewModel<Order>
protected List<OrderItem> orderItems;
protected OrderCreatedItemRenderer orderCreatedItemRenderer;
@Init(superclass = true)
public void initOrderList()
{
@@ -55,6 +58,7 @@ public class OrderList extends ListViewModel<Order>
formZul = "orderForm.zul";
dataFilter = new OrderFilter(getFilterTemplate());
this.orderItems = new ArrayList<OrderItem>();
this.orderCreatedItemRenderer = new OrderCreatedItemRenderer();
}
public List<AddressEmb> getSuppAddresses()
@@ -117,6 +121,16 @@ public class OrderList extends ListViewModel<Order>
this.orderItems = orderItems;
}
public OrderCreatedItemRenderer getOrderCreatedItemRenderer()
{
return orderCreatedItemRenderer;
}
public void setOrderCreatedItemRenderer(OrderCreatedItemRenderer orderCreatedItemRenderer)
{
this.orderCreatedItemRenderer = orderCreatedItemRenderer;
}
@Command
@NotifyChange("orderItems")
public void onChangeSelectOrder(@BindingParam("ctrl") Listbox lb)
@@ -17,10 +17,9 @@ public class ReqMaterialListMy extends ReqListMy
@WireVariable
protected RequirementService reqMaterialService;
@Init
public void init()
@Init(superclass = true)
public void initReqMaterialListMy()
{
super.init();
service = reqMaterialService;
formZul = "/main/orders/material/reqHeadForm.zul";
}
@@ -17,10 +17,9 @@ public class ReqMaterialListMyAll extends ReqListMyAll
@WireVariable
protected RequirementService reqMaterialService;
@Init
public void init()
@Init(superclass = true)
public void initReqMaterialListMyAll()
{
super.init();
service = reqMaterialService;
formZul = "/main/orders/material/reqHeadForm.zul";
}
@@ -17,10 +17,9 @@ public class ReqMaterialListMyCenters extends ReqListMyCenters
@WireVariable
protected RequirementService reqMaterialService;
@Init
public void init()
@Init(superclass = true)
public void initReqMaterialListMyCenters()
{
super.init();
service = reqMaterialService;
formZul = "/main/orders/material/reqHeadForm.zul";
}
@@ -17,10 +17,9 @@ public class ReqMaterialListMyWorkgroups extends ReqListMyWorkgroups
@WireVariable
protected RequirementService reqMaterialService;
@Init
public void init()
@Init(superclass = true)
public void initReqMaterialListMyWorkgroups()
{
super.init();
service = reqMaterialService;
formZul = "/main/orders/material/reqHeadForm.zul";
}
@@ -28,10 +28,9 @@ public class ReqListMy extends RequirementSubpage<Requirement>
return workgroupService.getCentres();
}
@Init
public void init()
@Init(superclass = true)
public void initReqListMy()
{
super.init();
service = requirementService;
dataClass = Requirement.class;
formZul = "/main/orders/requirements/reqForm.zul";
@@ -30,10 +30,9 @@ public class ReqListMyAll extends RequirementSubpage<Requirement>
return workgroupService.getCentres();
}
@Init
public void init()
@Init(superclass = true)
public void initReqListMyAll()
{
super.init();
service = requirementService;
dataClass = Requirement.class;
formZul = "/main/orders/requirements/reqForm.zul";
@@ -30,10 +30,9 @@ public class ReqListMyCenters extends RequirementSubpage<Requirement>
return workgroupService.getUserCentres(userService.getCurrent());
}
@Init
public void init()
@Init(superclass = true)
public void initReqListMyCenters()
{
super.init();
service = requirementService;
dataClass = Requirement.class;
formZul = "/main/orders/requirements/reqForm.zul";
@@ -30,10 +30,9 @@ public class ReqListMyWorkgroups extends RequirementSubpage<Requirement>
return workgroupService.getCentres();
}
@Init
public void init()
@Init(superclass = true)
public void initReqListMyWorkgroups()
{
super.init();
service = requirementService;
dataClass = Requirement.class;
formZul = "/main/orders/requirements/reqForm.zul";
@@ -1,5 +1,6 @@
package info.bukova.isspst.ui.main.orders.requirements;
import info.bukova.isspst.data.MUnitEmb;
import info.bukova.isspst.data.Material;
import info.bukova.isspst.data.Requirement;
import info.bukova.isspst.data.RequirementItem;
@@ -125,6 +126,7 @@ public class RequirementForm extends FormViewModel<Requirement>
}
@Command
@NotifyChange({ "selItemIndex", "selectedItem" })
public void onFocusItem(@BindingParam("item") RequirementItem item, @BindingParam("ctrl") InputElement ctrl)
{
this.selItemIndex = this.getDataBean().getItems().indexOf(item);
@@ -147,19 +149,20 @@ public class RequirementForm extends FormViewModel<Requirement>
}
@Command
@NotifyChange({ "syncItems", "selItemIndex" })
@NotifyChange({ "syncItems", "selItemIndex", "selectedItem" })
public void removeItem(@BindingParam("form") SimpleForm form, @BindingParam("item") RequirementItem item)
{
if (item != null)
{
this.getDataBean().getItems().remove(item);
this.setSelItemIndex(-1);
this.selItemIndex = -1;
this.selectedItem = null;
this.calcAndUpdateFormTotalPrice(form);
}
}
@GlobalCommand("insertSelectedItem")
@NotifyChange({ "syncItems", "selItemIndex" })
@NotifyChange({ "syncItems", "selItemIndex", "selectedItem" })
public void insertSelectedItem(@BindingParam("selected") RequirementSubject selected, @BindingParam("window") Window window)
{
if (selected != null)
@@ -195,7 +198,7 @@ public class RequirementForm extends FormViewModel<Requirement>
}
@Command
@NotifyChange({ "selectedItem", "syncItems" })
@NotifyChange({ "selectedItem" })
public void recalculate(@BindingParam("form") SimpleForm form, @BindingParam("changed") String source)
{
if (this.selectedItem == null)
@@ -219,7 +222,7 @@ public class RequirementForm extends FormViewModel<Requirement>
}
@Command
@NotifyChange({ "selectedItem", "syncItems" })
@NotifyChange({ "selectedItem" })
public void onChangeGroup()
{
// Někdo změnil skupinu materiálu nebo služby
@@ -234,6 +237,15 @@ public class RequirementForm extends FormViewModel<Requirement>
if (subject != null)
{
boolean isMaterial = (subject instanceof Material);
if (isMaterial)
{
Material materialItem = (Material) subject;
MUnitEmb munit = materialItem.getMunit();
this.selectedItem.setMunit(munit);
}
// Skupina materiálu nebo služeb je propojená, nastavit k zadanému
// kódu i správný název skupiny materiálu nebo služby
this.selectedItem.setName(subject.getName());
@@ -241,7 +253,7 @@ public class RequirementForm extends FormViewModel<Requirement>
}
@Command
@NotifyChange({ "selectedItem", "syncItems" })
@NotifyChange({ "syncItems", "selectedItem", "selItemIndex" })
public void addNewItem()
{
RequirementItem item = new RequirementItem();
@@ -254,10 +266,11 @@ public class RequirementForm extends FormViewModel<Requirement>
item.setUnitPrice(BigDecimal.valueOf(0));
item.setTotal(BigDecimal.valueOf(0));
item.setDescription("");
item.setMunit(null);
item.setMunit(new MUnitEmb());
this.setSelectedItem(item);
this.getDataBean().addItem(item);
this.setSelItemIndex(this.getDataBean().getItems().indexOf(item));
this.selItemIndex = this.getDataBean().getItems().indexOf(item);
this.selectedItem = item;
}
}
@@ -17,10 +17,9 @@ public class ReqServicesListMy extends ReqListMy
@WireVariable
protected RequirementService reqServicesService;
@Init
public void init()
@Init(superclass = true)
public void initReqServicesListMy()
{
super.init();
service = reqServicesService;
formZul = "/main/orders/services/reqHeadForm.zul";
}
@@ -17,10 +17,9 @@ public class ReqServicesListMyAll extends ReqListMyAll
@WireVariable
protected RequirementService reqServicesService;
@Init
public void init()
@Init(superclass = true)
public void initReqServicesListMyAll()
{
super.init();
service = reqServicesService;
formZul = "/main/orders/services/reqHeadForm.zul";
}
@@ -17,10 +17,9 @@ public class ReqServicesListMyCenters extends ReqListMyCenters
@WireVariable
protected RequirementService reqServicesService;
@Init
public void init()
@Init(superclass = true)
public void initReqServicesListMyCenters()
{
super.init();
service = reqServicesService;
formZul = "/main/orders/services/reqHeadForm.zul";
}
@@ -17,10 +17,9 @@ public class ReqServicesListMyWorkgroups extends ReqListMyWorkgroups
@WireVariable
protected RequirementService reqServicesService;
@Init
public void init()
@Init(superclass = true)
public void initReqServicesListMyWorkgroups()
{
super.init();
service = reqServicesService;
formZul = "/main/orders/services/reqHeadForm.zul";
}
@@ -0,0 +1,50 @@
package info.bukova.isspst.ui.renderers;
import org.zkoss.bind.impl.BindListitemRenderer;
import org.zkoss.zk.ui.Component;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
@SuppressWarnings("serial")
public abstract class GenericListitemRenderer<T> extends BindListitemRenderer
{
protected abstract void changeProperties(Listbox lb, Listitem li, int index, String varnm);
protected T objectOfStates;
public T getObjectOfStates()
{
return objectOfStates;
}
public void setObjectOfStates(T objectOfStates)
{
this.objectOfStates = objectOfStates;
}
@SuppressWarnings("unchecked")
@Override
public void render(Listitem item, Object data, int index) throws Exception
{
this.objectOfStates = (T) data;
super.render(item, data, index);
}
@Override
protected void addItemReference(Component modelOwner, Component comp, int index, String varnm)
{
if (this.objectOfStates != null)
{
if (modelOwner != null && modelOwner instanceof Listbox)
{
if (comp != null && comp instanceof Listitem)
{
this.changeProperties((Listbox) modelOwner, (Listitem) comp, index, varnm);
}
}
}
super.addItemReference(modelOwner, comp, index, varnm);
}
}
@@ -0,0 +1,29 @@
package info.bukova.isspst.ui.renderers;
import info.bukova.isspst.data.Order;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
@SuppressWarnings("serial")
public class OrderCreatedItemRenderer extends GenericListitemRenderer<Order>
{
@Override
protected void changeProperties(Listbox lb, Listitem li, int index, String varnm)
{
Order order = this.getObjectOfStates();
boolean objednano = order.isOrdered();
boolean doruceno = (order.getDeliveredDate() != null);
if (doruceno)
{
li.setSclass("order-select-delivered");
}
else if (objednano)
{
li.setSclass("order-select-ordered");
}
}
}
@@ -0,0 +1,39 @@
package info.bukova.isspst.ui.renderers;
import info.bukova.isspst.data.Requirement;
import info.bukova.isspst.data.RequirementState;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
@SuppressWarnings("serial")
public class RequirementsItemRenderer extends GenericListitemRenderer<Requirement>
{
@Override
protected void changeProperties(Listbox lb, Listitem li, int index, String varnm)
{
Requirement requirement = this.getObjectOfStates();
RequirementState state = requirement.getState();
if (state != null)
{
if (state == RequirementState.PARTIALLY)
{
li.setSclass("req-select-partially");
}
else if (state == RequirementState.APPROVED)
{
Boolean isProject = requirement.getProject();
if ((isProject != null) && (isProject.booleanValue() == true))
{
li.setSclass("req-select-approved-project");
}
else
{
li.setSclass("req-select-approved");
}
}
}
}
}
@@ -6,6 +6,7 @@ import info.bukova.isspst.services.requirement.RequirementBaseService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.ui.BigDecimalConverter;
import info.bukova.isspst.ui.ListViewModel;
import info.bukova.isspst.ui.renderers.RequirementsItemRenderer;
import java.util.List;
@@ -20,6 +21,8 @@ public class RequirementSubpage<T extends RequirementBase> extends ListViewModel
@WireVariable
protected UserService userService;
protected RequirementsItemRenderer requirementsItemRenderer;
public List<User> getAllUsers()
{
return userService.getAll();
@@ -37,10 +40,11 @@ public class RequirementSubpage<T extends RequirementBase> extends ListViewModel
this.bigDecimalConverter = bigDecimalConverter;
}
@Init
public void init()
@Init(superclass = true)
public void initRequirementSubpage()
{
this.bigDecimalConverter = new BigDecimalConverter();
this.requirementsItemRenderer = new RequirementsItemRenderer();
}
private RequirementBaseService<T> getReqService()
@@ -68,4 +72,19 @@ public class RequirementSubpage<T extends RequirementBase> extends ListViewModel
return false;
}
public RequirementsItemRenderer getRequirementsItemRenderer()
{
return requirementsItemRenderer;
}
public void setRequirementsItemRenderer(RequirementsItemRenderer requirementsItemRenderer)
{
this.requirementsItemRenderer = requirementsItemRenderer;
}
@Override
protected void afterSelect() {
BindUtils.postNotifyChange(null, null, this, "canApprove");
}
}
@@ -94,6 +94,12 @@ public class GlobalSettingsVM {
message.setText(message.getText() + "[" + field + "]");
}
@Command
@NotifyChange("settings")
public void insertUrl(@BindingParam("message") MailMessage message) {
message.setText(message.getText() + "[-url-]");
}
@Command
@NotifyChange("settings")
public void addAddress() {
@@ -1,15 +1,14 @@
package info.bukova.isspst.ui.tripbill;
import java.util.ArrayList;
import java.util.List;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.Vehicle;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.tripbill.TripBillService;
import info.bukova.isspst.ui.BigDecimalConverter;
import info.bukova.isspst.ui.FormViewModel;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
@@ -17,7 +16,6 @@ import org.zkoss.zk.ui.select.annotation.WireVariable;
public class TripBillForm extends FormViewModel<TripBill> {
private BigDecimalConverter bigDecimalConverter;
@WireVariable
private TripBillService tripBillService;
private List<Vehicle> vehicles;
@@ -26,16 +24,11 @@ public class TripBillForm extends FormViewModel<TripBill> {
@Init(superclass = true)
public void init() {
bigDecimalConverter = new BigDecimalConverter();
vehicles = new ArrayList<Vehicle>();
vehicles.add(null);
vehicles.addAll(settingsService.getSettings().getVehicles());
}
public BigDecimalConverter getBigDecimalConverter() {
return bigDecimalConverter;
}
@Command
@NotifyChange("dataBean")
public void calculate() {
@@ -45,4 +38,5 @@ public class TripBillForm extends FormViewModel<TripBill> {
public List<Vehicle> getVehicles() {
return vehicles;
}
}
@@ -16,8 +16,8 @@ public class TripBillList extends ListViewModel<TripBill> {
private TripBillService tripBillService;
private BigDecimalConverter converter;
@Init
public void init() {
@Init(superclass = true)
public void initTripBill() {
service = tripBillService;
dataClass = TripBill.class;
formZul = "tripBillForm.zul";
@@ -33,4 +33,10 @@ public class TripBillList extends ListViewModel<TripBill> {
public BigDecimalConverter getConverter() {
return converter;
}
@Override
public boolean isAbleToAdd() {
return false;
}
}
+2
View File
@@ -30,5 +30,7 @@
<mapping class="info.bukova.isspst.data.TripBillItem"></mapping>
<mapping class="info.bukova.isspst.data.Order"></mapping>
<mapping class="info.bukova.isspst.data.OrderItem"></mapping>
<mapping class="info.bukova.isspst.data.Invoicing"></mapping>
<mapping class="info.bukova.isspst.data.InvoicingItem"></mapping>
</session-factory>
</hibernate-configuration>
+1
View File
@@ -1,2 +1,3 @@
ad.domain=bukova.net
ad.ldapUrl=ldap://192.168.25.110/
ad.allowedGroup=ucitele
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE xml>
<language-addon>
<addon-name>CzechSortListheader</addon-name>
<language-name>xul/html</language-name>
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<language-addon>
<!-- The name of this addon. It must be unique -->
<addon-name>ckezbind</addon-name>
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<language-addon>
<addon-name>mapa</addon-name>
<language-name>xul/html</language-name>
@@ -172,6 +172,7 @@ GlobalSettingsHours=Hodin
GlobalSettingsUploadStamp=Nahrát obrázek razítka
GlobalSettingsStamp=Razítko
GlobalSettingsReqEnable=Povolení požadavků
GlobalSettingsInsertUrl=Vložit URL záznamu
UserSettings=Uživatelské nastavení
@@ -279,6 +280,7 @@ false=Ne
Information=Informace
Order=Objednávka
Orders=Objednávky
OrderAbr=Obj.
MaterialRequirement=Požadavek na materiál
MaterialRequirements=Požadavky na materiál
@@ -310,6 +312,9 @@ AddItem=Přidat položku
SelectGroup=Vybrat skupinu...
RemoveItem=Smazat
StudentProject = Studentský projekt
StudentProjectAbr = St. projekt
Amount=Částka
Owner=Vlastník
CreateOrder=Vytvořit objednávku
@@ -329,6 +334,18 @@ OrderFormInvoiceNumber=Číslo faktury
OrderFormInvoiceTotal=Částka faktury
OrderPrintPrices=Tisknout ceny
Invoicing=Fakturace požadavků
InvoicingRequirementNumber=Číslo požadavku
InvoicingRequirementPrice=Cena požadavku
InvoicingInvoicedPrice=Vyfakturovaná cena
InvoicingFormTitle=Zadání fakturace
InvoicingAdd=Přidat fakturaci
InvoicingDate=Datum
InvoicingInvoiceNumber=Číslo faktury
InvoicingAmount=Částka
InvoicingDescription=Popis
InvoicingInvoiced=Fakturováno
HandleComboKeyFilter=#del
HandleComboKey=$#del
+1
View File
@@ -1,3 +1,4 @@
<!DOCTYPE xml>
<taglib>
<uri>http://www.zkoss.org/demo/integration/security</uri>
<description>
@@ -18,6 +18,7 @@
<bean id="adUserMapper" class="info.bukova.isspst.services.users.AdUserCtxMapper">
<constructor-arg name="userService" ref="userService"/>
<constructor-arg name="roleService" ref="roleService"/>
<property name="allowedGroup" value="${ad.allowedGroup}"/>
</bean>
</beans>
@@ -30,6 +30,20 @@
<bean id="messageBuilder" class="info.bukova.isspst.mail.EntityMessageBuilder">
<property name="html" value="true"/>
<property name="urlResolverHolder" ref="urlResolverHolder"/>
</bean>
<bean id="commonUrlResolver" class="info.bukova.isspst.CommonUrlResolver"/>
<bean id="requirementUrlResolver" class="info.bukova.isspst.RequirementUrlResolver"/>
<bean id="urlResolverHolder" class="info.bukova.isspst.UrlResolverHolder">
<constructor-arg ref="commonUrlResolver"/>
<property name="resolvers">
<map>
<entry key="#{T(info.bukova.isspst.data.Requirement)}" value-ref="requirementUrlResolver"/>
</map>
</property>
</bean>
<!-- <bean id="mailer" class="info.bukova.rsfaktura.services.mail.ThreadMailer"> -->
@@ -219,6 +219,10 @@
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="requirementItemDao" class="info.bukova.isspst.dao.jpa.RequirementItemDaoJPA">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="numericSeriesDao" class="info.bukova.isspst.dao.jpa.NumberSeriesDaoJPA">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
@@ -247,6 +251,10 @@
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="invoicingDao" class="info.bukova.isspst.dao.jpa.InvoicingDaoJPA">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- Business logic -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
@@ -313,7 +321,7 @@
<property name="xmlContext" ref="xmlCtxAres" />
</bean>
<bean id="approvedService" class="info.bukova.isspst.services.approved.ApprovedServiceImpl"/>
<bean id="approvedService" class="info.bukova.isspst.services.orders.ApprovedServiceImpl"/>
<bean id="permissionService" class="info.bukova.isspst.services.users.PermissionServiceImpl">
<property name="dao" ref="permissionDao"/>
@@ -404,10 +412,15 @@
<property name="validator" ref="validator"/>
</bean>
<bean id="orderService" class="info.bukova.isspst.services.approved.OrderServiceImpl">
<bean id="orderService" class="info.bukova.isspst.services.orders.OrderServiceImpl">
<property name="dao" ref="orderDao"/>
<property name="validator" ref="validator"/>
<property name="numberSeriesService" ref="numericSeriesService"/>
</bean>
<bean id="invoicingService" class="info.bukova.isspst.services.invoicing.InvoicingServiceImpl">
<property name="dao" ref="invoicingDao"/>
<property name="validator" ref="validator"/>
</bean>
</beans>
+7 -1
View File
@@ -9,7 +9,7 @@
autodrop="true">
<menuitem
label="${labels.Information}"
href="/" />
href="/app/" />
<menuseparator />
<menu label="${labels.Orders}">
<menupopup>
@@ -34,6 +34,12 @@
label="${labels.CreatedOrders}"
href="/main/orders/created/"
disabled="${not sec:isAllGranted('PERM_READ_ORDER')}" />
<menuseparator/>
<menuitem
image="/img/invoicing-016.png"
label="${labels.Invoicing}"
href="/main/invoicing/"
disabled="${not sec:isAllGranted('PERM_READ_INVOICING')}" />
</menupopup>
</menu>
<menu label="${labels.BussinessTrips}">
+1 -1
View File
@@ -51,6 +51,6 @@
<div id="mainData">
<u:include src="${gridZul}" />
</div>
<div id="footer"> </div>
<div id="footer"> Verze 1.0 </div>
</div>
</html>
+1 -1
View File
@@ -1,7 +1,7 @@
<?page title="toolbar" contentType="text/html;charset=UTF-8"?>
<zk>
<toolbar>
<toolbarbutton image="/img/add.png" tooltiptext="${labels.ToolbarRecNew}" id="btnNew" onClick="@command('addNew')" disabled="@load(vm.filter)" />
<toolbarbutton image="/img/add.png" tooltiptext="${labels.ToolbarRecNew}" id="btnNew" onClick="@command('addNew')" disabled="@load(vm.filter or not vm.ableToAdd)" />
<toolbarbutton image="/img/edit.png" tooltiptext="${labels.ToolbarRecEdit}" id="btnEdit" onClick="@command('edit')" disabled="@load(empty vm.dataBean ? 'true' : 'false')"/>
<toolbarbutton image="/img/delete.png" tooltiptext="${labels.ToolbarRecDelete}" id="btnDelete" onClick="@command('delete')" disabled="@load(not vm.ableToDelete)" />
<toolbarbutton image="/img/funnel.png" tooltiptext="${labels.ToolbarRecFilter}" id="btnFilter" onClick="@command('filter')" />
+9 -1
View File
@@ -66,7 +66,7 @@ html, body {
overflow: hidden;
}
.form-caption {
.form-caption, .form-caption-highlight {
overflow: hidden;
font-weight: bold;
font-size: 20px;
@@ -82,6 +82,14 @@ html, body {
padding-right: 5px;
}
.form-caption-highlight {
background-color: red;
}
.form-caption-highlight-content {
float: left;
}
/*
html, body { background-color: red; }
#screen { background-color: lightgreen; }
+30 -8
View File
@@ -8,10 +8,8 @@
text-shadow: 2px 2px 2px #000000;
}
.addScrollbar {
.addScrollbar {
overflow: auto;
}
.find-grid-cell {
@@ -44,26 +42,50 @@
text-align: right;
}
.grid-textbox-max {
.grid-textbox-max {
width: 100%;
}
.grid-textbox-max-right {
.grid-textbox-max-right {
width: 100%;
text-align: right;
}
.row-title {
.row-title {
/* ve formuláři zarovná u víceřádkových editů label nahoru */
vertical-align: top;
}
.z-listcell-content {
.z-listcell-content {
/* při úzkém sloupci gridu neodřádkuje slova podle mezer */
white-space: nowrap;
}
.combo {
.combo {
width: 100%;
min-width: 0;
}
.order-select-ordered {
background-color: #98fb98 !important;
}
.order-select-invoiced {
background-color: #fff44f !important;
}
.order-select-delivered {
background-color: #d19fe8 !important;
}
.req-select-partially {
background-color: #fffb90 !important;
}
.req-select-approved {
background-color: #afffb5 !important;
}
.req-select-approved-project {
background-color: #87cefa !important;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

@@ -13,7 +13,7 @@
<row>
<label value="${labels.SuppliersFormCompany}" />
<textbox id="company" value="@bind(fx.company)" instant="true" width="320px" />
<button image="/img/search.png" label="${labels.SuppliersFormFindInARES}" onClick="@command('searchAres')" sclass="nicebutton" disabled="@load((vm.dataBean.ic == 0) &amp;&amp; (empty vm.dataBean.company))" />
<button image="/img/search.png" label="${labels.SuppliersFormFindInARES}" onClick="@command('searchAres')" sclass="nicebutton" disabled="@load((fx.ic == 0) &amp;&amp; (empty fx.company))" />
</row>
<row>
<label value="${labels.SuppliersFormIC}" />
+10
View File
@@ -0,0 +1,10 @@
<?page title="${labels.Invoicing}" contentType="text/html;charset=UTF-8"?>
<zk>
<zscript>
String gridZul = "invoicingGrid.zul";
</zscript>
<include src="/app/template.zhtml"/>
</zk>
@@ -0,0 +1,199 @@
<?page title="${labels.Invoicing}" contentType="text/html;charset=UTF-8"?>
<zk>
<window
id="editWin"
closable="true"
width="95%"
height="95%"
border="normal"
position="center"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('info.bukova.isspst.ui.main.invoicing.InvoicingForm')">
<caption
src="/img/invoicing-032.png"
zclass="form-caption"
label="${labels.InvoicingFormTitle}" />
<vlayout vflex="1">
<hbox>
<vbox height="300px">
<button
image="/img/item-add.png"
label="${labels.InvoicingAdd}"
sclass="nicebutton"
onClick="@command('addItem')"/>
<listbox
model="@load(vm.dataBean.items)"
vflex="1"
selectedItem="@bind(vm.selectedItem)"
selectedIndex="@bind(vm.selectedIndex)">
<listhead>
<listheader
label="${labels.InvoicingDate}"
width="150px"/>
<listheader label="${labels.InvoicingInvoiceNumber}" />
<listheader
label="${labels.InvoicingAmount}"
align="right"
width="90px"/>
<listheader/>
</listhead>
<template name="model">
<listitem>
<listcell>
<datebox
value="@bind(each.invoiceDate)"
inplace="true"
onFocus="@command('onFocus', item=each)"/>
</listcell>
<listcell>
<textbox
value="@bind(each.invoiceNumber)"
sclass="grid-textbox-max"
inplace="true"
onFocus="@command('onFocus', item=each)"/>
</listcell>
<listcell>
<textbox
value="@bind(each.amount) @converter(vm.standardBigDecimalConverter)"
sclass="grid-textbox-max"
inplace="true"
onFocus="@command('onFocus', item=each)"
onChange="@command('calculate')"/>
</listcell>
<listcell>
<button label="${labels.RemoveItem}" sclass="nicebutton" onClick="@command('removeItem', item=each)"/>
</listcell>
</listitem>
</template>
</listbox>
</vbox>
<grid hflex="min">
<columns>
<column
align="right"
hflex="min" />
<column />
</columns>
<rows>
<row>
<cell sclass="row-title">${labels.InvoicingRequirementNumber} :</cell>
<cell>
<textbox
width="200px"
value="@bind(vm.dataBean.requirement.numser)"
style="font-weight: bold;"
readonly="true"/>
</cell>
</row>
<row>
<cell sclass="row-title">${labels.InvoicingDescription} :</cell>
<cell>
<textbox
width="350px"
rows="5"
value="@bind(vm.dataBean.requirement.description)"
readonly="true" />
</cell>
</row>
<row>
<cell sclass="row-title">${labels.InvoicingRequirementPrice} :</cell>
<cell>
<textbox
width="150px"
value="@bind(vm.dataBean.requirement.sumTotal) @converter(vm.standardBigDecimalConverter)"
readonly="true"/>
</cell>
</row>
<row>
<cell sclass="row-title">${labels.InvoicingInvoicedPrice} :</cell>
<cell>
<textbox
width="150px"
value="@bind(vm.dataBean.totalInvoiced) @converter(vm.standardBigDecimalConverter)"
readonly="true"
style="@load(vm.dataBean.totalInvoiced gt vm.dataBean.requirement.sumTotal ? ' color: red;' : '' )"/>
</cell>
</row>
</rows>
</grid>
</hbox>
<listbox
vflex="1"
model="@load(vm.dataBean.requirement.items)">
<listhead>
<listheader
hflex="10"
label="${labels.RequirementItemCode}" />
<listheader
hflex="15"
label="${labels.RequirementItemName}" />
<listheader
hflex="30"
label="${labels.RequirementItemText}" />
<listheader
hflex="10"
align="right"
label="${labels.RequirementItemQuantity}" />
<listheader
hflex="10"
label="${labels.RequirementItemMUnit}" />
<listheader
hflex="10"
align="right"
label="${labels.RequirementItemUnitPrice}" />
<listheader
hflex="10"
align="right"
label="${labels.RequirementItemTotal}" />
<listheader
hflex="10"
align="right"
label="${labels.InvoicingInvoiced}" />
<listheader
hflex="15"
label="${labels.RequirementItemDescription}" />
</listhead>
<template name="model">
<listitem>
<listcell>
<label value="@load(each.code)"/>
</listcell>
<listcell>
<label value="@load(each.name)" />
</listcell>
<listcell>
<label value="@load(each.textItem)" />
</listcell>
<listcell>
<label value="@bind(each.quantity) @converter(vm.standardBigDecimalConverter)" />
</listcell>
<listcell>
<label value="@bind(each.munit.name)" />
</listcell>
<listcell>
<label value="@bind(each.unitPrice) @converter(vm.standardBigDecimalConverter)" />
</listcell>
<listcell>
<label value="@bind(each.total) @converter(vm.standardBigDecimalConverter)" />
</listcell>
<listcell>
<checkbox checked="@bind(each.paid)"/>
</listcell>
<listcell>
<label value="@bind(each.description)" />
</listcell>
</listitem>
</template>
</listbox>
<include src="/app/formButtons.zul" />
</vlayout>
</window>
</zk>
@@ -0,0 +1,172 @@
<?page title="${labels.Invoicing}" contentType="text/html;charset=UTF-8"?>
<zk>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<window
vflex="1"
border="normal"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('info.bukova.isspst.ui.main.invoicing.InvoicingList')">
<caption
src="/img/invoicing-032.png"
zclass="form-caption"
label="${labels.Invoicing}" />
<include src="/app/toolbar.zul" />
<listbox
vflex="1"
model="@load(vm.dataList)"
selectedItem="@bind(vm.dataBean)">
<listhead menupopup="auto">
<listheader
label="${labels.InvoicingRequirementNumber}"
width="130px" />
<listheader
label="${labels.RequirementsGridReqDate}"
width="150px"/>
<listheader
label="${labels.RequirementsGridCenter}"
width="180px"/>
<listheader
label="${labels.RequirementsGridWorkgroup}"
width="180px"/>
<listheader
label="${labels.InvoicingDescription}"
width=""/>
<listheader
label="${labels.InvoicingRequirementPrice}"
align="right"
width="130px" />
<listheader
label="${labels.InvoicingInvoicedPrice}"
align="right"
width="130px" />
</listhead>
<auxhead
sclass="category-center"
visible="@load(vm.filter)">
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<textbox
value="@bind(vm.filterTemplate.requirement.numser)"
instant="true"
onChange="@command('doFilter')"
sclass="find-grid-textbox" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<datebox
value="@bind(vm.filterTemplate.requirement.reqDate)"
format="${labels.DateFormat}"
instant="true"
onChange="@command('doFilter')"
sclass="find-grid-textbox" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<combobox
ctrlKeys="${labels.HandleComboKeyFilter}"
onCtrlKey="@command('handleComboKeyFilter', ctrl=self, keyEvent=event)"
onChange="@command('doFilter')"
model="@load(vm.centres)"
readonly="true"
width="100%"
selectedItem="@bind(vm.filterTemplate.requirement.centre)">
<template name="model">
<comboitem label="@load(each.fullName)" />
</template>
</combobox>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<combobox
ctrlKeys="${labels.HandleComboKeyFilter}"
onCtrlKey="@command('handleComboKeyFilter', ctrl=self, keyEvent=event)"
onChange="@command('doFilter')"
model="@load(vm.workgroups)"
readonly="true"
width="100%"
selectedItem="@bind(vm.filterTemplate.requirement.workgroup)">
<template name="model">
<comboitem label="@load(each.fullName)" />
</template>
</combobox>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<textbox
value="@bind(vm.filterTemplate.requirement.description)"
instant="true"
onChange="@command('doFilter')"
sclass="find-grid-textbox" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<!-- div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<textbox
value="@bind(vm.filterTemplate.requirement.sumTotal) @converter(vm.standardBigDecimalConverter)"
instant="true"
onChange="@command('doFilter')"
sclass="find-grid-textbox" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div -->
</auxheader>
<auxheader>
<!-- div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<textbox
value="@bind(vm.filterTemplate.totalInvoiced) @converter(vm.standardBigDecimalConverter)"
instant="true"
onChange="@command('doFilter')"
sclass="find-grid-textbox" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div-->
</auxheader>
</auxhead>
<template name="model">
<listitem>
<listcell label="@load(each.requirement.numser)" />
<listcell label="@load(each.requirement.reqDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.requirement.centre)" />
<listcell label="@load(each.requirement.workgroup)" />
<listcell label="@load(each.requirement.description)" />
<listcell label="@load(each.requirement.sumTotal) @converter(vm.standardBigDecimalConverter)" />
<listcell label="@load(each.totalInvoiced) @converter(vm.standardBigDecimalConverter)"
style="@load(vm.dataBean.totalInvoiced gt vm.dataBean.requirement.sumTotal ? ' color: red;' : '' )" />
</listitem>
</template>
</listbox>
</window>
</zk>
+26 -28
View File
@@ -21,15 +21,20 @@
<tabpanel>
<include src="/main/toolbar.zul" />
<listbox
itemRenderer="@load(vm.orderCreatedItemRenderer)"
vflex="1"
onSelect="@command('onChangeSelectOrder', ctrl=self)"
selectedItem="@bind(vm.dataBean)"
model="@load(vm.dataList)">
<listhead menupopup="auto">
<listheader
hflex="10"
hflex="3"
sort="auto(ordered)"
label="${labels.OrderAbr}" />
<listheader
hflex="7"
sort="czech(numser)"
label="${labels.OrderFormNumber}" />
label="${labels.number}" />
<listheader
hflex="10"
sort="auto(orderDate)"
@@ -47,15 +52,6 @@
hflex="10"
sort="auto(deliveredDate))"
label="${labels.OrderFormDeliveredDate}" />
<listheader
hflex="10"
sort="auto(invoiceNumber)"
label="${labels.OrderFormInvoiceNumber}" />
<listheader
hflex="7"
align="right"
sort="auto(invoiceTotal)"
label="${labels.OrderFormInvoiceTotal}" />
<listheader
hflex="15"
sort="auto(suplier.company)"
@@ -79,6 +75,19 @@
label="${labels.OrderFormDescription}" />
</listhead>
<auxhead visible="@load(vm.filter)">
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<checkbox
label="${labels.OrderFormOrdered}"
checked="@bind(vm.filterTemplate.ordered)"
onClick="@command('doFilter')" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
@@ -142,21 +151,6 @@
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<textbox
value="@bind(vm.filterTemplate.invoiceNumber)"
instant="true"
onChange="@command('doFilter')"
sclass="find-grid-textbox" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader></auxheader>
<auxheader>
<div zclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
@@ -251,13 +245,12 @@
</auxhead>
<template name="model">
<listitem>
<listcell label="@load(each.ordered) @converter(vm.standardBoolConverter)" />
<listcell label="@load(each.numser)" />
<listcell label="@load(each.orderDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.total) @converter(vm.standardBigDecimalConverter)" />
<listcell label="@load(each.deliveryDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.deliveredDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.invoiceNumber)" />
<listcell label="@load(each.invoiceTotal) @converter(vm.standardBigDecimalConverter)" />
<listcell label="@load(each.suplier)" />
<listcell label="@load(each.deliveryAddress)" />
<listcell label="@load(each.address)" />
@@ -308,6 +301,10 @@
hflex="15"
sort="czech(description)"
label="${labels.RequirementItemDescription}" />
<listheader
hflex="5"
sort="auto(reqItem.orderNum)"
label="${labels.OrderAbr}" />
</listhead>
<template name="model">
<listitem>
@@ -319,6 +316,7 @@
<listcell label="@load(each.unitPrice) @converter(vm.standardBigDecimalConverter)" />
<listcell label="@load(each.total) @converter(vm.standardBigDecimalConverter)" />
<listcell label="@load(each.description)" />
<listcell label="@load(each.reqItem.orderNum)" />
</listitem>
</template>
</listbox>
@@ -18,7 +18,7 @@
label="${labels.Order}" />
<vlayout
sclass="addScrollbar"
form="@id('fx') @load(vm.dataBean) @save(vm.dataBean, before='save') @validator(vm.orderFormValidator)"
form="@id('fx') @init(vm.dataForm) @load(vm.dataBean) @save(vm.dataBean, before='save') @validator(vm.orderFormValidator)"
hflex="1"
vflex="1">
<hlayout
@@ -42,6 +42,16 @@
<column />
</columns>
<rows vflex="max">
<row>
<cell sclass="row-title"></cell>
<cell>
<checkbox
id="idOrderOrdered"
disabled="@load(fx.icludedRequirementItemFromAnotherOrder)"
label="${labels.OrderFormOrdered}"
checked="@bind(fx.ordered)" />
</cell>
</row>
<row>
<cell sclass="row-title">${labels.OrderFormNumber} :</cell>
<cell>
@@ -94,26 +104,6 @@
format="${labels.DateFormat}" />
</cell>
</row>
<row>
<cell sclass="row-title">${labels.OrderFormInvoiceNumber} :</cell>
<cell>
<textbox
id="idInvoiceNumber"
width="150px"
value="@bind(fx.invoiceNumber)"
placeholder="${labels.NotYetFilled}..."
readonly="@load(empty fx.created)" />
</cell>
</row>
<row>
<cell sclass="row-title">${labels.OrderFormInvoiceTotal} :</cell>
<cell>
<textbox
id="idOrderInvoiceTotal"
width="150px"
value="@bind(fx.invoiceTotal) @converter(vm.standardBigDecimalConverter)" />
</cell>
</row>
<row>
<cell sclass="row-title">${labels.OrderFormDescription} :</cell>
<cell>
@@ -156,19 +146,29 @@
<row>
<cell sclass="row-title">${labels.SuppliersFormCompany} :</cell>
<cell colspan="3">
<combobox
ctrlKeys="${labels.HandleComboKey}"
onCtrlKey="@command('handleComboKey', ctrl=self, keyEvent=event)"
onChange="@command('doFillSuppAddress')"
width="100%"
selectedItem="@bind(vm.selectedSuppAddrItem)"
value="@bind(vm.suppCompany)"
model="@load(vm.suppAddresses)"
readonly="false">
<template name="model">
<comboitem label="@load(each)" />
</template>
</combobox>
<hbox hflex="1">
<combobox
ctrlKeys="${labels.HandleComboKey}"
onCtrlKey="@command('handleComboKey', ctrl=self, keyEvent=event)"
onChange="@command('doFillSuppAddress')"
hflex="4"
selectedItem="@bind(vm.selectedSuppAddrItem)"
value="@bind(vm.suppCompany)"
model="@load(vm.suppAddresses)"
instant="true"
readonly="false">
<template name="model">
<comboitem label="@load(each)" />
</template>
</combobox>
<hbox hflex="2">
<button image="/img/search.png"
label="${labels.SuppliersFormFindInARES}"
sclass="nicebutton"
disabled="@load((not empty vm.selectedSuppAddrItem) or ((empty vm.suppCompany) and (fx.suplier.ic eq 0)))"
onClick="@command('searchAddress')"/>
</hbox>
</hbox>
</cell>
</row>
<row>
@@ -176,7 +176,8 @@
<cell>
<textbox
id="idSuppIC"
value="@bind(fx.suplier.ic)" />
value="@bind(fx.suplier.ic)"
instant="true" />
</cell>
<cell sclass="row-title">${labels.SuppliersFormDIC} :</cell>
<cell>
@@ -532,6 +533,10 @@
hflex="15"
sort="czech(description)"
label="${labels.RequirementItemDescription}" />
<listheader
hflex="5"
sort="auto(reqItem.orderNum)"
label="${labels.OrderAbr}" />
</listhead>
<template name="model">
<listitem>
@@ -542,7 +547,7 @@
<textbox
inplace="true"
sclass="grid-textbox-max-right"
readonly="${not sec:isAllGranted('ROLE_ADMIN')}"
readonly="true"
onFocus="@command('onFocusItem', item=each, ctrl=self)"
onChange="@command('recalculate', form=fx, changed='quantity')"
value="@bind(each.quantity) @converter(vm.standardBigDecimalConverter)" />
@@ -567,6 +572,7 @@
value="@bind(each.total) @converter(vm.standardBigDecimalConverter)" />
</listcell>
<listcell label="@load(each.description)" />
<listcell label="@load(each.reqItem.orderNum)" />
</listitem>
</template>
</listbox>
@@ -2,10 +2,11 @@
<zk>
<window
id="selectItemsWnd"
width="95%"
height="95%"
closable="true"
border="normal"
position="center"
vflex="1"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('info.bukova.isspst.ui.main.orders.material.SelectMaterialItems')">
<caption
@@ -118,9 +119,7 @@
</listbox>
</vlayout>
<vlayout>
<div
hflex="max"
align="right">
<div align="right">
<button
image="~./zul/img/misc/drag-disallow.png"
label="${labels.ButtonStorno}"
@@ -10,6 +10,14 @@
<column />
</columns>
<rows>
<row>
<cell sclass="row-title"></cell>
<cell>
<checkbox
label="${labels.StudentProject}"
checked="@bind(fx.project)" />
</cell>
</row>
<row>
<cell sclass="row-title">${labels.RequirementsFormNumberSerie} :</cell>
<cell>
@@ -174,7 +182,7 @@
<textbox
inplace="true"
sclass="grid-textbox-max"
readonly="true"
readonly="false"
onFocus="@command('onFocusItem', item=each, ctrl=self)"
value="@bind(each.munit.name)" />
</listcell>
@@ -207,7 +215,7 @@
<button
image="~./zul/img/misc/drag-disallow.png"
label="${labels.RemoveItem}"
onClick="@command('removeItem', item=each, form=fx, ctrl=self)"
onClick="@command('removeItem', form=fx, item=each)"
sclass="nicebutton" />
</listcell>
</listitem>
@@ -1,10 +1,15 @@
<listbox
vflex="1"
itemRenderer="@load(vm.requirementsItemRenderer)"
selectedItem="@bind(vm.dataBean)"
model="@load(vm.dataList)"
onAfterRender="@command('afterRender')"
selectedIndex="@bind(vm.selIndex)">
<listhead menupopup="auto">
<listheader
label="${labels.StudentProjectAbr}"
sort="auto(project)"
hflex="5" />
<listheader
label="${labels.RequirementsGridNumberSerie}"
sort="czech(numser)"
@@ -15,7 +20,7 @@
hflex="13" />
<listheader
label="${labels.RequirementsGridCenter}"
sort="auto(centre)"
sort="auto(centre.fullName)"
hflex="15" />
<listheader
label="${labels.RequirementsGridDeliveryDate}"
@@ -34,6 +39,19 @@
<auxhead
sclass="category-center"
visible="@load(vm.filter)">
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<checkbox
label="${labels.StudentProjectAbr}"
checked="@bind(vm.filterTemplate.project)"
onClick="@command('doFilter')" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
@@ -127,7 +145,8 @@
</auxheader>
</auxhead>
<template name="model">
<listitem style="@load((each.state eq 'PARTIALLY') ? 'background-color: #fffb90' : ((each.state eq 'APPROVED') ? 'background-color: #afffb5' : ''))">
<listitem>
<listcell label="@load(each.project) @converter(vm.standardBoolConverter)" />
<listcell label="@load(each.numser)" />
<listcell label="@load(each.reqDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.centre.fullName)" />
@@ -2,11 +2,16 @@
<listbox
vflex="1"
hflex="7"
itemRenderer="@load(vm.requirementsItemRenderer)"
selectedItem="@bind(vm.dataBean)"
model="@load(vm.dataList)"
onAfterRender="@command('afterRender')"
selectedIndex="@bind(vm.selIndex)">
<listhead menupopup="auto">
<listheader
label="${labels.StudentProjectAbr}"
sort="auto(project)"
hflex="5" />
<listheader
label="${labels.RequirementsGridNumberSerie}"
sort="czech(numser)"
@@ -17,7 +22,7 @@
hflex="13" />
<listheader
label="${labels.RequirementsGridCenter}"
sort="auto(centre)"
sort="auto(centre.fullName)"
hflex="15" />
<listheader
label="${labels.RequirementsGridDeliveryDate}"
@@ -40,6 +45,19 @@
<auxhead
sclass="category-center"
visible="@load(vm.filter)">
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<checkbox
label="${labels.StudentProjectAbr}"
checked="@bind(vm.filterTemplate.project)"
onClick="@command('doFilter')" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
@@ -154,7 +172,8 @@
</auxheader>
</auxhead>
<template name="model">
<listitem style="@load((each.state eq 'PARTIALLY') ? 'background-color: #fffb90' : ((each.state eq 'APPROVED') ? 'background-color: #afffb5' : ''))">
<listitem>
<listcell label="@load(each.project) @converter(vm.standardBoolConverter)" />
<listcell label="@load(each.numser)" />
<listcell label="@load(each.reqDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.centre.fullName)" />
@@ -2,11 +2,16 @@
<listbox
vflex="1"
hflex="7"
itemRenderer="@load(vm.requirementsItemRenderer)"
selectedItem="@bind(vm.dataBean)"
model="@load(vm.dataList)"
onAfterRender="@command('afterRender')"
selectedIndex="@bind(vm.selIndex)">
<listhead menupopup="auto">
<listheader
label="${labels.StudentProjectAbr}"
sort="auto(project)"
hflex="5" />
<listheader
label="${labels.RequirementsGridNumberSerie}"
sort="czech(numser)"
@@ -17,7 +22,7 @@
hflex="13" />
<listheader
label="${labels.RequirementsGridCenter}"
sort="auto(centre)"
sort="auto(centre.fullName)"
hflex="15" />
<listheader
label="${labels.RequirementsGridDeliveryDate}"
@@ -40,6 +45,19 @@
<auxhead
sclass="category-center"
visible="@load(vm.filter)">
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<checkbox
label="${labels.StudentProjectAbr}"
checked="@bind(vm.filterTemplate.project)"
onClick="@command('doFilter')" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
@@ -154,7 +172,8 @@
</auxheader>
</auxhead>
<template name="model">
<listitem style="@load((each.state eq 'PARTIALLY') ? 'background-color: #fffb90' : ((each.state eq 'APPROVED') ? 'background-color: #afffb5' : ''))">
<listitem>
<listcell label="@load(each.project) @converter(vm.standardBoolConverter)" />
<listcell label="@load(each.numser)" />
<listcell label="@load(each.reqDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.centre.fullName)" />
@@ -2,11 +2,16 @@
<listbox
vflex="1"
hflex="7"
itemRenderer="@load(vm.requirementsItemRenderer)"
selectedItem="@bind(vm.dataBean)"
model="@load(vm.dataList)"
onAfterRender="@command('afterRender')"
selectedIndex="@bind(vm.selIndex)">
<listhead menupopup="auto">
<listheader
label="${labels.StudentProjectAbr}"
sort="auto(project)"
hflex="5" />
<listheader
label="${labels.RequirementsGridNumberSerie}"
sort="czech(numser)"
@@ -17,7 +22,7 @@
hflex="13" />
<listheader
label="${labels.RequirementsGridCenter}"
sort="auto(centre)"
sort="auto(centre.fullName)"
hflex="15" />
<listheader
label="${labels.RequirementsGridDeliveryDate}"
@@ -40,6 +45,19 @@
<auxhead
sclass="category-center"
visible="@load(vm.filter)">
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
<checkbox
label="${labels.StudentProjectAbr}"
checked="@bind(vm.filterTemplate.project)"
onClick="@command('doFilter')" />
</div>
<div sclass="find-grid-img">
<image src="/img/funnel.png" />
</div>
</div>
</auxheader>
<auxheader>
<div sclass="find-grid-cell">
<div sclass="find-grid-divtextbox">
@@ -154,7 +172,8 @@
</auxheader>
</auxhead>
<template name="model">
<listitem style="@load((each.state eq 'PARTIALLY') ? 'background-color: #fffb90' : ((each.state eq 'APPROVED') ? 'background-color: #afffb5' : ''))">
<listitem>
<listcell label="@load(each.project) @converter(vm.standardBoolConverter)" />
<listcell label="@load(each.numser)" />
<listcell label="@load(each.reqDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.centre.fullName)" />
@@ -2,6 +2,8 @@
<zk>
<window
id="selectItemsWnd"
width="95%"
height="95%"
closable="true"
border="normal"
position="center"
@@ -11,7 +13,7 @@
src="/img/painting-032.png"
zclass="form-caption"
label="${labels.AgendaServices}" />
<vlayout>
<vlayout vflex="1">
<toolbar>
<toolbarbutton
image="/img/funnel.png"
@@ -20,6 +22,7 @@
onClick="@command('onFilterService')" />
</toolbar>
<listbox
vflex="1"
model="@load(vm.serviceItemList)"
selectedItem="@bind(vm.selectedItem)">
<listhead menupopup="auto">
@@ -92,9 +95,7 @@
</listbox>
</vlayout>
<vlayout>
<div
hflex="max"
align="right">
<div align="right">
<button
image="~./zul/img/misc/drag-disallow.png"
label="${labels.ButtonStorno}"
@@ -4,6 +4,8 @@
<window
id="editWin"
closable="true"
width="95%"
height="95%"
border="normal"
position="center"
apply="org.zkoss.bind.BindComposer"
@@ -12,7 +14,7 @@
src="/img/pickup-032.png"
zclass="form-caption"
label="${labels.TravelOrdersFormTitle}" />
<vlayout>
<vlayout vflex="1">
<grid>
<columns visible="false">
<column hflex="min"/>
@@ -78,7 +80,9 @@
</row>
</rows>
</grid>
<grid model="@load(vm.dataBean.billItems)">
<grid
model="@load(vm.dataBean.billItems)"
vflex="1">
<auxhead>
<auxheader rowspan="2">
<div sclass="vertikaal" height="50px">
@@ -271,15 +275,15 @@
<timebox inplace="true" width="68px" value="@bind(each.endWork)" format="short"/>
</vbox>
<vbox>
<textbox inplace="true" width="68px" value="@bind(each.distance) @converter(vm.bigDecimalConverter)"/>
<textbox inplace="true" width="68px" value="@bind(each.distanceAmount) @converter(vm.bigDecimalConverter)" onChange="@command('calculate')"/>
<textbox inplace="true" width="68px" value="@bind(each.distance) @converter(vm.standardBigDecimalConverter)"/>
<textbox inplace="true" width="68px" value="@bind(each.distanceAmount) @converter(vm.standardBigDecimalConverter)" onChange="@command('calculate')"/>
</vbox>
<vbox>
<textbox inplace="true" width="68px" value="@bind(each.fuelConsumption) @converter(vm.bigDecimalConverter)"/>
<textbox inplace="true" width="68px" value="@bind(each.fuelAmount) @converter(vm.bigDecimalConverter)" onChange="@command('calculate')"/>
<textbox inplace="true" width="68px" value="@bind(each.fuelConsumption) @converter(vm.standardBigDecimalConverter)"/>
<textbox inplace="true" width="68px" value="@bind(each.fuelAmount) @converter(vm.standardBigDecimalConverter)" onChange="@command('calculate')"/>
</vbox>
<textbox inplace="true" value="@bind(each.carefare) @converter(vm.bigDecimalConverter)" onChange="@command('calculate')"/>
<textbox inplace="true" value="@bind(each.housing) @converter(vm.bigDecimalConverter)" onChange="@command('calculate')"/>
<textbox inplace="true" value="@bind(each.carefare) @converter(vm.standardBigDecimalConverter)" onChange="@command('calculate')"/>
<textbox inplace="true" value="@bind(each.housing) @converter(vm.standardBigDecimalConverter)" onChange="@command('calculate')"/>
<combobox inplace="true" selectedIndex="@bind(each.freeMealsCount)"
readonly="true"
width="60px"
@@ -290,10 +294,10 @@
<comboitem value="2" label="2"/>
<comboitem value="3" label="3"/>
</combobox>
<label value="@load(each.meals) @converter(vm.bigDecimalConverter)"/>
<textbox inplace="true" value="@bind(each.otherExpenses) @converter(vm.bigDecimalConverter)" onChange="@command('calculate')"/>
<label value="@load(each.total) @converter(vm.bigDecimalConverter)"/>
<label value="@load(each.adjustedTotal) @converter(vm.bigDecimalConverter)"/>
<label value="@load(each.meals) @converter(vm.standardBigDecimalConverter)"/>
<textbox inplace="true" value="@bind(each.otherExpenses) @converter(vm.standardBigDecimalConverter)" onChange="@command('calculate')"/>
<label value="@load(each.total) @converter(vm.standardBigDecimalConverter)"/>
<label value="@load(each.adjustedTotal) @converter(vm.standardBigDecimalConverter)"/>
</row>
</template>
</rows>
@@ -302,11 +306,11 @@
<vbox>
<hbox>
<label value="Záloha: " style="font-size: 14px;"/>
<label value="@load(vm.dataBean.requirement.downPayment) @converter(vm.bigDecimalConverter)" style="font-size: 14px;"/>
<label value="@load(vm.dataBean.requirement.downPayment) @converter(vm.standardBigDecimalConverter)" style="font-size: 14px;"/>
</hbox>
<hbox>
<label value="${labels.TripBillTotal}: " style="font-size: 14px; font-weight: bold;"/>
<label value="@load(vm.dataBean.total) @converter(vm.bigDecimalConverter)" style="font-size: 14px; font-weight: bold;"/>
<label value="@load(vm.dataBean.total) @converter(vm.standardBigDecimalConverter)" style="font-size: 14px; font-weight: bold;"/>
</hbox>
</vbox>
</div>
@@ -18,23 +18,24 @@
<listhead menupopup="auto">
<listheader
label="${labels.TravelOrdersGridNumser}"
sort="czech(name)"
sort="czech(numser)"
width="30%" />
<listheader
label="${labels.TravelOrdersGridReqDate}"
sort="czech(description)"
sort="auto(requirement.reqDate)"
width="70%" />
<listheader
label="${labels.TravelOrdersGridFrom}"
sort="czech(description)"
sort="czech(requirement.from)"
width="70%" />
<listheader
label="${labels.TravelOrdersGridTo}"
sort="czech(description)"
sort="czech(requirement.to)"
width="70%" />
<listheader
label="${labels.TravelOrdersGridTotal}"
sort="czech(description)"
sort="auto(total)"
align="right"
width="70%" />
</listhead>
<!-- <auxhead
@@ -72,10 +73,10 @@
<template name="model">
<listitem>
<listcell label="@load(each.requirement.numser)" />
<listcell label="@load(each.requirement.reqDate)" />
<listcell label="@load(each.requirement.reqDate) @converter('formatedDate', format=labels.DateFormat)" />
<listcell label="@load(each.requirement.from)" />
<listcell label="@load(each.requirement.to)" />
<listcell label="@load(each.total)"/>
<listcell label="@load(each.total) @converter(vm.standardBigDecimalConverter)"/>
</listitem>
</template>
</listbox>

Some files were not shown because too many files have changed in this diff Show More