122 Commits

Author SHA1 Message Date
pepa 4d74b0a3fe Opraven binding formuláře vyúčtování služební cesty.
closes #231
2015-06-15 21:17:17 +02:00
pepa 3b3e4b38e6 Vyúčtování služební cesty nelze odeslat ke schválení, pokud nejsou vyplněné časy odjezdu a příjezdu.
closes #230
2015-06-14 20:45:36 +02:00
pepa c2ca2e45ec Opraveno generovani vyuctovani sluzebni cesty spolucestujicich, pokud je pozadovana zaloha- zaloha se nyni neprenese.
closes #229
Po schvaleni pozadavku na sluzebni cestu se spolucestujicimi se posle mail o schvaleni i spolucestujicim.
closes #228
2015-06-13 00:00:00 +02:00
franta aaa89a2653 Workaround pro zápis číselné řady.
Vznikaly duplicity nad unikátním indexem.
Nyní se číslo nezapisuje a načítá se z vazby na požadavku na cesťák.

closes #221
2015-05-22 12:10:00 +02:00
franta fbc7a02161 Zpráva z pracovní cesty prodloužena na 8kB
closes #220
2015-05-20 07:51:47 +02:00
pepa e5a8e0f0d9 Po otevření dialogu pro zobrazení vyúčtování SC se přepne na první záložku, kterou může schválit aktuálně přihlášený uživatel.
closes #217
2015-05-17 21:52:46 +02:00
pepa 0f169f8be9 Na formuláři vyúčtování služební cesty se automaticky předvyplní datum v poli "Zpráva z pracovní cesty podána dne", pokud je pole prázdné.
closes #216
2015-05-17 21:06:26 +02:00
pepa b6d0546b48 Na formulář vyúčtování služební cesty bylo přidáno tlačítko "Uložit a odeslat ke schválení"
closes #218
2015-05-17 20:52:38 +02:00
pepa a6799064f7 Opraveno generování e-mailu po odeslání vyúčtování služební cesty ke schválení. Text a URL se nyní vygeneruje správně.
closes #219
2015-05-13 13:36:51 +02:00
pepa 933f5e784b V dialogu pro zobrazení vyúčtování služební cesty se po otevření přepne záložka na první neschválené vyúčtování.
refs #212
2015-05-06 15:22:07 +02:00
franta 04dc8a5587 Metodou pokus-omyl je správně width="100%" a vflex="1"
refs #215
2015-04-28 09:01:40 +02:00
franta b63a2c3944 Upraveno zobrazování seznamu souborů...
closes #214
2015-04-28 08:17:19 +02:00
franta 67629cf312 IFrame v náhledu na sestavy upraven z width a height na vflex a hflex.
closes #215
2015-04-28 08:15:16 +02:00
pepa cdd2f81cad Oprava sestavy.
refs #213
2015-04-27 14:46:39 +02:00
pepa c292c3bcde Na sestavě "žádost o služební cestu" byl opraven seznam spolucestujících- nyní se generuje vedle sebe a bylo přidáno pole pro cizí osobu.
closes #213
2015-04-27 12:02:03 +02:00
pepa 9d202192ee Změněn způsob přenosu vyúčtování ke spolucestujícím: výúčtování se přenese pouze v případě, když ho ještě spolucestující needitoval. Do zeditovaného vyúčtování se vyúčtování žadatele už nepřenáší.
Vyúčtování spolucestujících se schvalují každé zvlášť.
refs #212
2015-04-24 14:00:36 +02:00
pepa 93a463db69 Upraveno třídění výsledku fulltextového vyhledávání- niní se třídí podle relevancve výsledku.
refs #211
2015-04-13 09:56:04 +02:00
pepa 3a5da06c48 Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2015-04-12 18:54:09 +02:00
pepa 76969a2baf - Přidán fulltext index na číslo požadavku.
- Opravena velikost písmen v SQL dotazu pro úklid tabulek s přiloženými soubory.
- Informativní číslo verze zvýšeno na 2.0
2015-04-12 18:53:43 +02:00
franta 4e6af2ceed Upraveny data a razítka na sestavách služební cesty.
closes #205
2015-04-09 12:14:37 +02:00
franta ef431867e1 V globálním nastavení umožněn upload loga školy.
Upraveny tiskových sestav vloženo logo a název organizace.

closes #199
2015-04-08 11:35:41 +02:00
franta 25c8405f03 Ag. Služební cesty / Cestovní příkazy
• přidáno povinné pole Zpráva z pracovní cesty
• u existujících záznamů přidán text "Zpráva z pracovní cesty"
• upraveno rozdělení formuláře

closes #203
2015-03-23 07:41:23 +01:00
franta ac90b0a2e3 Formulář ag. Služební cesty / Aktuální požadavky
• přidáno textové pole "Cizí osoby"
• upraven popisek formuláře
• upraven vzhled a zarovnání prvků
• přidána kontrola ukazatele při promazávání souborů na disku i v
databázi
• sjednocena maska pro formátování data v <datebox>
closes #197
2015-03-19 10:12:18 +01:00
pepa 9c5679af2c Implementováno schvalování vyúčtování služebních cest.
closes #202
2015-03-17 10:20:59 +01:00
franta ceac59c8d3 Agenda Fakturace požadavků
• grid rozdělen na 2 záložky [Nevyřízené] a [Archive]
• na formuláři přidán checkbox [Vyřízeno]

closes #207
2015-03-09 09:37:58 +01:00
pepa 5d9e6226d3 Merge branch 'Verze_1.0' 2015-03-08 20:16:34 +01:00
pepa b470559cb7 Opraveno přegenerování vyúčtování služební cesty spolucestujících.
refs #195
2015-03-08 20:16:05 +01:00
pepa 9b8bfe2228 Na formulář požadavku na služební byl přidán checkbox pro vygenerování vyúčtování služební cesty i pro spolucestující. Spolucestující nemůžou vyúčtování měnit.
closes #212
2015-03-08 19:33:15 +01:00
pepa 42deec695a Oprava merge. 2015-03-08 10:39:17 +01:00
pepa e01e32f10c Merge branch 'Verze_1.0'
Conflicts:
	src/main/java/info/bukova/isspst/services/requirement/TripRequirementService.java
	src/main/java/info/bukova/isspst/services/requirement/TripRequirementServiceImpl.java
	src/main/java/info/bukova/isspst/ui/requirement/TripRequirementForm.java
	src/main/webapp/WEB-INF/locales/zk-label.properties
2015-03-07 19:00:00 +01:00
pepa f13bc6e5c4 Změnou schváleného požadavku na služební cestu se přegeneruje vyúčtování.
closes #195
2015-03-07 18:53:06 +01:00
pepa 021d73bf48 Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2015-03-06 14:51:01 +01:00
pepa 340abb5269 Vypnuto debug-js v zk.xml. 2015-03-06 14:48:42 +01:00
franta 724f6b3559 Implementováno třístavové vyhledávání boolean hodnot.
Agendu Schválené položky požadavků lze nyní filtrovat podle materiálu a
služeb.

#closes 206
2015-03-06 10:27:37 +01:00
pepa ecd3cf426b Umožněn upload souborů k požadavkům na služební cesty a k vyúčtování služební cesty.
closes #131
2015-03-03 14:46:21 +01:00
pepa c6ebf8959b Umožněna změna data schválení požadavku.
closes #209
2015-03-01 19:28:49 +01:00
pepa 48d2c75d7b Merge remote-tracking branch 'origin/master'
Conflicts:
	src/main/webapp/app/mainMenu.zul
2015-02-23 22:28:14 +01:00
pepa 1d2810f78d Obsah přiložených dokumentů ve formátech ODF - OpenOffice, openxml - MS Office a PDF se extrahuje do čistého textu a indexuje pro fulltextové vyhledávání.
closes #211
2015-02-23 22:21:25 +01:00
franta c4f5671327 Přepracováno vykreslování dialogu Faturace požadavků.
Vyhledávací edit dostane focus po otevření okna.
Opraveno Main menu.


closes #210
2015-02-23 21:06:41 +01:00
pepa 860c7227cd Opraven merge mainMenu.zul 2015-02-17 21:19:33 +01:00
pepa f94afbc3ed Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2015-02-15 19:15:32 +01:00
pepa 1df90a41c4 Do agendy požadavků na služební cesty byla přidána možnost prohlížení vyúčtování služební cesty.
closes #200
2015-02-15 19:14:03 +01:00
franta 93e1ef1fd3 Merge branch 'master' of https://git.bukova.info/repos/git/isspst
Conflicts:
	src/main/webapp/app/mainMenu.zul
2015-02-09 13:35:35 +01:00
franta 277ea0f993 Merge branch 'Verze_1.0'
Conflicts:
	src/main/webapp/WEB-INF/locales/zk-label.properties
	src/main/webapp/app/mainMenu.zul
2015-02-09 13:31:48 +01:00
franta 884bc8267d U nových objednávek lze nyní zatrhout, že je rovnou objednáno...
closes #196
2015-02-09 13:27:32 +01:00
pepa 678c140a94 Třídy pro práci se soubory a přílohami záznamů.
refs #131
2015-02-02 22:18:38 +01:00
pepa 566b408ddd Reindaxece fulltextu se spouští asynchronně- rychlejší start aplikace 2015-01-29 13:56:55 +01:00
pepa 9ec15943ed Merge branch 'Verze_1.0' 2015-01-21 10:59:48 +01:00
pepa ecbc2be47c V agendě Fakturace požadavků byl opraven lazy load vlastníka požadavku.
refs #182
2015-01-21 10:59:15 +01:00
pepa 024f1321ad Merge branch 'Verze_1.0'
Conflicts:
	src/main/webapp/WEB-INF/locales/zk-label.properties
2015-01-20 15:21:55 +01:00
pepa 4e2b00a957 U požadavků se nyní zobrazuje fakturovaná částka.
Opraveno mazání objednávek- pokud je mazaná objednávka označená jako
objednaná, musíme z položek smazat číslo objednávky, aby se nabídly pro
další objednávku.
closes #193
2015-01-20 15:19:51 +01:00
pepa d9fd26bbad Ve schválených položkách požadavků byl do gridu přidaný sloupec s číslem
požadavku.
closes #192
2015-01-20 14:11:59 +01:00
pepa e461afd611 Merge branch 'Verze_1.0' of https://git.bukova.info/repos/git/isspst into Verze_1.0 2015-01-20 10:37:09 +01:00
pepa ea64e5a888 Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2015-01-20 10:35:59 +01:00
pepa 08532dcd02 Merge branch 'Verze_1.0'
Conflicts:
	src/main/webapp/WEB-INF/locales/zk-label.properties
	src/main/webapp/app/mainMenu.zul
2015-01-20 10:35:38 +01:00
pepa ba99079a85 V agendě Fakturace bylo rozchozeno filtrování podle žadatele.
Odkaz na nápovědu v toolbaru.
Zvýšen session timeout na 480 minut.
refs #182
2015-01-20 10:31:30 +01:00
franta c04f74c5a2 Merge branch 'Verze_1.0' 2015-01-20 10:13:19 +01:00
franta a0447318e6 Embeded měrné jednotky (new MUnitEmb) mají nyní ID inicializované na 0.
Převod DB nastaví NULL hodnoty ID na 0, takže načtení přes hibernate
vytvoří neNULLový objekt MUnitEmb.

closes #185
2015-01-20 10:12:30 +01:00
franta eed31fe6da Merge branch 'Verze_1.0' 2015-01-20 09:02:47 +01:00
franta 8e33bb8ef7 Agenda "Fakturace požadavků" nyní podporuje řazení.
Po otevření agendy je nastaveno řazení podle sloupce čísla požadavku.
U textových sloupců se data řadí podle CZ pravidel.
Přidána možnost řadit vnořené property podle CZ pravidel.


closes #189
2015-01-20 09:01:24 +01:00
franta 61a4b3ba82 Merge branch 'Verze_1.0'
Conflicts:
	src/main/java/info/bukova/isspst/AppInitListener.java
	src/main/java/info/bukova/isspst/Constants.java
	src/main/java/info/bukova/isspst/data/Order.java
	src/main/java/info/bukova/isspst/data/OrderItem.java
	src/main/java/info/bukova/isspst/data/RequirementBase.java
	src/main/java/info/bukova/isspst/data/RequirementItem.java
	src/main/java/info/bukova/isspst/ui/settings/NumberSeriesVM.java
2015-01-19 13:29:41 +01:00
franta d37076cd27 Implementována verze DB a převod DB.
Nové DB mají délku nastavenou anotací.
ZUL soubory jsou omezeny atributem maxlength.

closes #186
2015-01-19 13:20:43 +01:00
pepa ee2539000c Merge branch 'Verze_1.0' 2015-01-18 21:04:30 +01:00
pepa 780edd5678 Opravena kontrola práv v agendě "Schválené položky požadavků".
refs #183
2015-01-18 15:54:50 +01:00
pepa e51955f86a Již se nezkrývají schválené požadavky na záložkách
Moje/střediska/komise.
closes #181
2015-01-18 15:53:03 +01:00
pepa 26699fd3a9 Na sestavu cesťáku byla přidaná spodní část "Pokladní doklad". Opraven
překlep na sestavě žádosti o služební cestu.
closes #190
2015-01-18 14:57:15 +01:00
pepa 0f02efbec3 Merge branch 'Verze_1.0' 2015-01-15 15:45:39 +01:00
pepa ce17f5b626 Na toolbar v záložkách Má střediska, Mé komise a Vše bylo přidáno
tlačítko pro smazání záznamu.
refs #183
2015-01-15 15:44:44 +01:00
pepa 2a6ce7e4d3 Upraveno formátovaní času na sestavě cesťáku. Drobné úpravy formátování
sestavy žádosti a cesťáku.
closes #180
closes #188
2015-01-15 15:36:23 +01:00
pepa f4fe974931 Do UserServis byla přidána metoda getUsersForCombo, která vrátí seznam
uživatelů podle abecedy. Volá se pro plnění comboboxů u filtrů a na
formuláři pro zadání žádosti o služební cestu- combo spolucestující.
closes #191
2015-01-15 15:09:11 +01:00
pepa 537cc563ac Merge branch 'Verze_1.0' of https://git.bukova.info/repos/git/isspst into Verze_1.0 2015-01-15 10:48:53 +01:00
pepa b357d0a7ef Merge branch 'Verze_1.0' of https://git.bukova.info/repos/git/isspst 2015-01-15 10:48:24 +01:00
pepa 100889d44a Merge branch 'master' of https://git.bukova.info/repos/git/isspst 2015-01-15 10:47:32 +01:00
pepa 765c56f250 Merge branch 'Verze_1.0'
Conflicts:
	src/main/java/info/bukova/isspst/Constants.java
2015-01-15 10:46:02 +01:00
pepa 4cd2f5b5e6 V agndě Fakturace požadavků přidán sloupec s žadatelem. Výchozí třídění
gridu je nyní podle čísla požadavku.
closes #182
refs #189
2015-01-15 10:40:46 +01:00
pepa 6ff69c932c Do agendy požadavků bylo přidáno nové oprávnění pro mazání neschválených
požadavků.
closes #183
2015-01-15 10:04:00 +01:00
franta 908b214a93 Merge branch 'Verze_1.0' of https://git.bukova.info/repos/git/isspst into Verze_1.0 2015-01-13 14:16:22 +01:00
franta f5e69ce80d Merge branch 'Verze_1.0' 2015-01-13 14:12:44 +01:00
franta cd2214c7ef Změněn název agendy z "Požadavky na servis" na "Požadavky na služby"
closes #184
2015-01-13 14:11:52 +01:00
pepa 66133dce1a Opravena kontrola práv při úpravě objednávky. Opraveno vyhodnocení práv
pro zobrazení požadavků střediska/komise.
closes #187
2015-01-13 13:57:43 +01:00
pepa e9cd08c249 Implementováno fulltextové vyhledávání přes všechny záznamy. Nutno
dořešit konfiguraci adresáře pro ukládání fulltextového indexu.
2015-01-09 14:00:27 +01:00
pepa 34f1bb86de Merge branch 'master' into fulltext 2015-01-07 17:07:53 +01:00
pepa ad2a861a7b Vyhledávání - index.zul 2015-01-07 17:07:46 +01:00
pepa cf6c523698 Umožněna deaktivace modulu prostřednictvím nastavení objektu modulu ve
třídě Constants. Položku neaktivního modulu v menu lze skrýt funkcí
isActive definovanou v module.tld (viz mainMenu.zul).
2015-01-07 17:03:58 +01:00
pepa 02311ae5dd Rozdělané fulltextové vyhledávání 2015-01-06 09:08:36 +01:00
pepa b1818546c0 Uživatele a komisi nelze smazat, pokud jsou členem některého střediska,
nebo komise.
closes #178
2014-12-12 14:43:11 +01:00
pepa bc5a7a7c4c Uživateli už nelze odebrat roli "Uživatel"
closes #177
2014-12-08 14:17:36 +01:00
pepa 966c9033ef Opraveno generování URL záznamu do e-mailových zpráv.
closes #179
2014-12-08 14:13:25 +01:00
pepa 08dfb177ef Byla přidána sestava požadavků.
closes #175
2014-11-30 19:43:25 +01:00
pepa 3c3cf5d46f Opravena kontrola práv při otvírání formuláře pro úpravu práv na roli.
closes #176
2014-11-28 10:15:56 +01:00
pepa 26e733a537 Pokud je nastaveno přihlašování proti AD nebo LDAP serveru, tak zmizí
nabídka "Změnit heslo".
closes #174
2014-11-26 15:24:42 +01:00
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
301 changed files with 11103 additions and 1662 deletions
+26 -15
View File
@@ -202,12 +202,6 @@
</dependency>
<!-- DB -->
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
@@ -221,16 +215,20 @@
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.8.Final</version>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.8.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.0.Final</version>
</dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>4.4.6.Final</version>
</dependency>
<!-- ZK -->
<dependency>
@@ -350,7 +348,20 @@
<artifactId>joda-time</artifactId>
<version>2.4</version>
</dependency>
<!-- Text extractors -->
<dependency>
<groupId>org.apache.odftoolkit</groupId>
<artifactId>simple-odf</artifactId>
<version>0.7-incubating</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.11</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
@@ -11,6 +11,8 @@ import info.bukova.isspst.data.User;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportMapping;
import info.bukova.isspst.reporting.ReportType;
import info.bukova.isspst.services.dbinfo.DbInfoService;
import info.bukova.isspst.services.fulltext.FullTextService;
import info.bukova.isspst.services.munits.MUnitService;
import info.bukova.isspst.services.numberseries.NumberSeriesService;
import info.bukova.isspst.services.requirement.RequirementTypeService;
@@ -18,21 +20,21 @@ import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.users.PermissionService;
import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.services.users.UserService;
import java.math.BigDecimal;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.math.BigDecimal;
import java.util.List;
public class AppInitListener implements ServletContextListener {
private DbInfoService dbInfoService;
private MUnitService mUnitsService;
private RoleService roleService;
private UserService userService;
@@ -40,6 +42,7 @@ public class AppInitListener implements ServletContextListener {
private NumberSeriesService nsService;
private RequirementTypeService reqTypeService;
private GlobalSettingsService gSettingsService;
private FullTextService ftService;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
@@ -48,10 +51,11 @@ public class AppInitListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent evt) {
/*Logger logger = LoggerFactory.getLogger(AppInitListener.class);
Logger logger = LoggerFactory.getLogger(AppInitListener.class);
logger.info("Initializing database");
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(evt.getServletContext());
dbInfoService = ctx.getBean(DbInfoService.class);
mUnitsService = ctx.getBean(MUnitService.class);
roleService = ctx.getBean(RoleService.class);
userService = ctx.getBean(UserService.class);
@@ -59,8 +63,10 @@ public class AppInitListener implements ServletContextListener {
nsService =ctx.getBean(NumberSeriesService.class);
gSettingsService = ctx.getBean(GlobalSettingsService.class);
reqTypeService = ctx.getBean(RequirementTypeService.class);
ftService = ctx.getBean(FullTextService.class);
userService.grantAdmin();
this.checkDbInfo();
checkMUnits();
checkRoles();
checkUsers();
@@ -69,11 +75,33 @@ public class AppInitListener implements ServletContextListener {
this.checkNumberSeries();
checkReqTypes();
this.checkGlobalSettings();
buildFulltext();
userService.removeAccess();
loadModuleReports();*/
loadModuleReports();
}
private void buildFulltext() {
ftService.reindex();
}
private void checkDbInfo()
{
List<User> userList = userService.getAll();
if (userList.isEmpty())
{
// Database is new/empty, column definition is anotated - set actual
// database version
dbInfoService.updateDatabaseVersion();
}
else
{
// Existing database - try change structure and set actual database
// version...
dbInfoService.changeDatabase();
}
}
private void checkMUnits()
{
List<MUnit> mUnits = mUnitsService.getAll();
@@ -200,6 +228,9 @@ public class AppInitListener implements ServletContextListener {
private void checkPermissions() {
for (Module m : Constants.MODULES) {
if (!m.isDefaultPermissions()) {
continue;
}
for (Permission p : Constants.DEF_PERMISSIONS) {
if (permService.getPermissionByModule(m.getId(), p.getAuthority()) == null) {
p.setModule(m.getId());
@@ -0,0 +1,48 @@
package info.bukova.isspst;
import org.jfree.util.Log;
public class BooleanUtils
{
private static final String TAG = BooleanUtils.class.getSimpleName();
public static boolean isEqualByBooleanValue(Boolean b1, Boolean b2)
{
boolean bool1 = ((b1 == null) ? false : b1.booleanValue());
boolean bool2 = ((b2 == null) ? false : b2.booleanValue());
boolean equals = (bool1 == bool2);
return equals;
}
public static boolean isEqualByBoolean(Boolean b1, Boolean b2)
{
if ((b1 == null) && (b2 == null))
{
return true;
}
else if ((b1 != null) && (b2 != null))
{
return (b1.booleanValue() == b2.booleanValue());
}
return false;
}
public static boolean isEqualFilterByBoolean(Boolean value, Boolean filterValue)
{
if (filterValue == null)
{
// Show all records
return true;
}
if (value == null)
{
// Fuck!!! Tri-state data (null, false, true)... We need new solution for selecting ALL data
Log.warn(TAG + "\nVelky Boolean v databazi... Pozor na filtrovani.");
return true;
}
return (value.booleanValue() == filterValue.booleanValue());
}
}
@@ -1,78 +0,0 @@
package info.bukova.isspst;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.hibernate.HibernateException;
import org.hibernate.service.UnknownUnwrapTypeException;
import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.service.jdbc.connections.spi.MultiTenantConnectionProvider;
public class ClientConnectionPrivider implements MultiTenantConnectionProvider {
/**
*
*/
private static final long serialVersionUID = 2142963179208004018L;
private DataSource dataSource;
public ClientConnectionPrivider(DataSource dataSource) {
this.dataSource = dataSource;
}
@SuppressWarnings("rawtypes")
@Override
public boolean isUnwrappableAs(Class unwrapType) {
return ConnectionProvider.class.equals( unwrapType ) || MultiTenantConnectionProvider.class.equals( unwrapType ) || ClientConnectionPrivider.class.isAssignableFrom( unwrapType );
}
@SuppressWarnings("unchecked")
@Override
public <T> T unwrap(Class<T> unwrapType) {
if ( isUnwrappableAs( unwrapType ) ) {
return (T) this;
}
else {
throw new UnknownUnwrapTypeException( unwrapType );
}
}
@Override
public Connection getAnyConnection() throws SQLException {
return dataSource.getConnection();
}
@Override
public void releaseAnyConnection(Connection connection) throws SQLException {
connection.close();
}
@Override
public Connection getConnection(String tenantIdentifier)
throws SQLException {
Connection con = getAnyConnection();
try {
con.createStatement().execute("SET schema '" + tenantIdentifier + "'");
} catch ( SQLException e ) {
throw new HibernateException("Could not alter JDBC connection to specified schema [" + tenantIdentifier + "]", e);
}
return con;
}
@Override
public void releaseConnection(String tenantIdentifier, Connection connection)
throws SQLException {
releaseAnyConnection(connection);
}
@Override
public boolean supportsAggressiveRelease() {
return false;
}
}
@@ -1,35 +0,0 @@
package info.bukova.isspst;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.springframework.beans.factory.annotation.Autowired;
public class ClientResolver implements CurrentTenantIdentifierResolver {
@Autowired
private HttpServletRequest request;
private static final String TOP_DOMAIN = "localhost"; // Bude se tahat z konfigurace...
@Override
public String resolveCurrentTenantIdentifier() {
String hostName = request.getServerName();
String tenant = "";
if (hostName.contains(".")) {
tenant = hostName.substring(0, hostName.indexOf("." + TOP_DOMAIN));
}
if (tenant.isEmpty()) {
tenant = "public";
}
return tenant;
}
@Override
public boolean validateExistingCurrentSessions() {
return false;
}
}
@@ -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 info.bukova.isspst.data.Order;
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.TripBill;
import info.bukova.isspst.data.TripBillApproval;
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.fulltext.FullTextService;
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;
@@ -21,8 +28,14 @@ import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Constants {
public final static long DB_VERSION = 5;
public final static String DEF_ADMIN = "admin";
public final static String DEF_ADMIN_PASSWD = "admin";
public final static String ROLE_USER = "ROLE_USER";
@@ -71,6 +84,8 @@ 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 String MOD_SEARCH = "SEARCH";
public final static Module MODULES[] = {
new Module(MOD_USERS, "Uživatelé", UserService.class),
new Module(MOD_PERMISSIONS, "Práva", RoleService.class),
@@ -85,7 +100,10 @@ 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),
new Module(MOD_SEARCH, "Fulltextové vyhledávání", FullTextService.class, true, false),
};
public final static String PERM_APPROVE = "PERM_APPROVE";
public final static String PERM_SHOW_WORKGROUP_REQ = "PERM_SHOW_WORKGROUP_REQ";
@@ -93,19 +111,25 @@ public class Constants {
public final static String PERM_SHOW_ALL_REQ = "PERM_SHOW_ALL_REQ";
public final static String PERM_EDIT_NEW = "PERM_EDIT_NEW";
public final static String PERM_EDIT_OWN = "PERM_EDIT_OWN";
public final static String PERM_DELETE_NEW = "PERM_DELETE_NEW";
public final static String PERM_SEARCH = "PERM_SEARCH";
public final static Permission SPECIAL_PERMISSIONS[] = {
new Permission(PERM_EDIT_NEW, "Upravit neschválené", MOD_REQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_DELETE_NEW, "Mazat neschválené", MOD_REQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_SHOW_WORKGROUP_REQ, "Zobrazení požadavků komise", MOD_REQUIREMENTS, PermissionType.WORKGROUP),
new Permission(PERM_SHOW_CENTRE_REQ, "Zobrazení požadavků střediska", MOD_REQUIREMENTS, PermissionType.CENTRE),
new Permission(PERM_SHOW_ALL_REQ, "Zobrazení všech požadavků", MOD_REQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_APPROVE, "Schválení", MOD_REQUIREMENTS, PermissionType.WORKGROUP),
new Permission(PERM_EDIT_NEW, "Upravit neschválené", MOD_TRIPREQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_DELETE_NEW, "Mazat neschválené", MOD_TRIPREQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_SHOW_WORKGROUP_REQ, "Zobrazení požadavků komise", MOD_TRIPREQUIREMENTS, PermissionType.WORKGROUP),
new Permission(PERM_SHOW_CENTRE_REQ, "Zobrazení požadavků střediska", MOD_TRIPREQUIREMENTS, PermissionType.CENTRE),
new Permission(PERM_SHOW_ALL_REQ, "Zobrazení všech požadavků", MOD_TRIPREQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_APPROVE, "Schválení", MOD_TRIPREQUIREMENTS, PermissionType.WORKGROUP),
new Permission(PERM_SEARCH, "Vyhledávat", MOD_SEARCH, PermissionType.GLOBAL),
};
public final static String DYNAMIC_REPORT_NAME = "Tabulková sestava";
@@ -113,8 +137,9 @@ public class Constants {
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresní karty", "address")),
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresa", "address", false, true)),
new ReportMapping(MOD_TRIPBILL, new Report("Žádost", "tripRequirement", false, true)),
new ReportMapping(MOD_TRIPBILL, new Report("Vyúčtování", "tripBill", false, true)),
new ReportMapping(MOD_ORDER, new Report("Objednávka", "order", true, true))
new ReportMapping(MOD_TRIPBILL, new Report("Vyúčtování", "tripBill", false, true, true)),
new ReportMapping(MOD_ORDER, new Report("Objednávka", "order", true, true)),
new ReportMapping(MOD_REQUIREMENTS, new Report("Požadavky", "requirements"))
};
public final static String REQTYPE_ORDER = "ORDER";
@@ -126,4 +151,17 @@ 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/");
put(TripBillApproval.class, "/main/trips/requirements/");
put(Order.class, "/main/orders/created/");
put(TripBill.class, "/main/trips/bill/");
}} );
public final static int LEN_TEXT = 255;
public final static int LEN_DESCRIPTION = 8192;
public final static int LEN_RESULT_MESSAGE = 8192;
}
@@ -0,0 +1,7 @@
package info.bukova.isspst;
public interface EntityUrlResolver {
public String entityUrl(Object entity);
}
@@ -1,16 +1,26 @@
package info.bukova.isspst;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.services.AbstractService;
import info.bukova.isspst.services.ModuleNotActiveException;
import java.util.ArrayList;
import java.util.List;
/**
* @author Pepa Rokos
*
* Třída reprezentuje informace o modulu (agendě).
*
*/
public class Module {
private String id;
private String name;
private Class<?> serviceClass;
private List<Report> reports;
private boolean defaultPermissions;
private boolean active;
public Class<?> getServiceClass() {
return serviceClass;
@@ -20,11 +30,42 @@ public class Module {
this.serviceClass = serviceClass;
}
/**
*
* @param id identifikátor modulu
* @param name jméno zobrazované v aplikaci
* @param serviceClass servisní třída
*/
public Module(String id, String name, Class<?> serviceClass) {
this.id = id;
this.name = name;
this.serviceClass = serviceClass;
reports = new ArrayList<Report>();
defaultPermissions = true;
active = true;
}
/**
* @param id identifikátor modulu
* @param name jméno zobrazované v aplikaci
* @param serviceClass servisní třída
* @param active příznak, jestli je modul aktivní
*/
public Module(String id, String name, Class<?> serviceClass, boolean active) {
this(id, name, serviceClass);
this.active = active;
}
/**
* @param id identifikátor modulu
* @param name jméno zobrazované v aplikaci
* @param serviceClass servisní třída
* @param active příznak, jestli je modul aktivní.
* @param defaultPermissions příznak určující jestli modul kontroluje výchozí práva (čtení, zápis, modifikace, mazání)
*/
public Module(String id, String name, Class<?> serviceClass, boolean active, boolean defaultPermissions) {
this(id, name, serviceClass, active);
this.defaultPermissions = defaultPermissions;
}
public String getId() {
@@ -51,4 +92,33 @@ public class Module {
this.reports.add(report);
}
/**
* Pokud je true, modul kontroluje výchozí práva (čtení, zápis, modifikace, mazání). Má vliv
* na generování formulářů v nastavení práv.
*
* @return výchozí práva. Default true
*/
public boolean isDefaultPermissions() {
return defaultPermissions;
}
public void setDefaultPermissions(boolean defaultPermissions) {
this.defaultPermissions = defaultPermissions;
}
/**
* Určuje, zda je modul aktivní. Neaktivní moduly nejsou viditelné v UI. Při pokusu o přístup přímo přes URL
* se generuje výjimka {@link ModuleNotActiveException}. Pokud servisní třída modulu nedědí z {@link AbstractService},
* musí se implementovat kontrola aktivity do příslušné třídy.
*
* @return aktivita. Default true
*/
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
@@ -0,0 +1,45 @@
package info.bukova.isspst;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ModuleUtils {
public static List<Module> getActiveModules() {
List<Module> modules = new ArrayList<Module>();
for (Module m : Arrays.asList(Constants.MODULES)) {
if (m.isActive()) {
modules.add(m);
}
}
return modules;
}
public static Module getModule(Class<?> serviceClass) {
for (Module m : Constants.MODULES) {
if (Arrays.asList(serviceClass.getInterfaces()).contains(m.getServiceClass())) {
return m;
}
}
return null;
}
public static Module getModule(String id) {
for (Module m : Constants.MODULES) {
if (m.getId().equals(id)) {
return m;
}
}
return null;
}
public static boolean isActive(String id) {
return getModule(id).isActive();
}
}
@@ -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() != null && req.getKind() == Constants.REQ_TYPE_MATERIAL) {
return defaultUrl + Constants.URL_MAP.get(req.getClass()) + "material/?select=" + String.valueOf(req.getId());
} else {
return defaultUrl + Constants.URL_MAP.get(req.getClass()) + "services/?select=" + String.valueOf(req.getId());
}
}
}
@@ -1,18 +1,28 @@
package info.bukova.isspst;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.util.resource.Labels;
public class StringUtils
{
public static boolean isNullOrEmpty(String str)
{
return ((str == null) || (str.isEmpty()));
}
private static String nullStr(String str)
public static boolean isNullOrTrimmedEmpty(String str)
{
return ((str == null) || (str.trim().isEmpty()));
}
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 +70,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 +83,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 +134,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 +148,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())
{
@@ -149,4 +159,47 @@ public class StringUtils
return result;
}
public static List<String> split(String value, String separator)
{
String tmp = value;
List<String> list = new ArrayList<String>();
if (tmp != null)
{
if ((separator == null) || separator.isEmpty() || tmp.isEmpty())
{
list.add(tmp);
}
else
{
int separatorLength = separator.length();
while (!tmp.isEmpty())
{
String part = "";
int idx = tmp.indexOf(separator);
if (idx > -1)
{
part = tmp.substring(0, idx);
list.add(part);
tmp = tmp.substring(idx + separatorLength);
if (tmp.isEmpty())
{
list.add("");
}
}
else
{
list.add(tmp);
tmp = "";
}
}
}
}
return list;
}
}
@@ -0,0 +1,29 @@
package info.bukova.isspst;
import info.bukova.isspst.data.TripBillApproval;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
/**
* @author Pepa Rokos
*/
public class TripBillAprovalUrlResolver implements EntityUrlResolver {
@Autowired
private HttpServletRequest request;
@Override
public String entityUrl(Object entity) {
String defUrl = request.getRequestURL().toString();
defUrl = defUrl.substring(0, defUrl.indexOf(request.getServletPath()));
if (entity instanceof TripBillApproval) {
String url = Constants.URL_MAP.get(entity.getClass());
return defUrl + url + "?select=" + String.valueOf(((TripBillApproval)entity).getBill().getRequirement().getId());
}
return defUrl + "/app";
}
}
@@ -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.DbInfo;
public interface DbInfoDao extends BaseDao<DbInfo>
{
}
@@ -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;
import info.bukova.isspst.data.TripBillApproval;
/**
* @author Pepa Rokos
*/
public interface TripBillApprovalDao extends BaseDao<TripBillApproval> {
}
@@ -0,0 +1,9 @@
package info.bukova.isspst.dao.jpa;
import info.bukova.isspst.dao.DbInfoDao;
import info.bukova.isspst.data.DbInfo;
public class DbInfoDaoJPA extends BaseDaoJPA<DbInfo> implements DbInfoDao
{
}
@@ -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,11 @@
package info.bukova.isspst.dao.jpa;
import info.bukova.isspst.dao.TripBillApprovalDao;
import info.bukova.isspst.data.TripBillApproval;
/**
* @author Pepa Rokos
*/
public class TripBillApprovalDaoJPA extends BaseDaoJPA<TripBillApproval> implements TripBillApprovalDao {
}
@@ -1,5 +1,6 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import info.bukova.isspst.StringUtils;
import java.util.ArrayList;
@@ -45,7 +46,7 @@ public class Address extends BaseData
private String email;
@Column(name = "WEB")
private String web;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
@NotNull(message = "Zadejte firmu")
@@ -7,11 +7,18 @@ import java.util.List;
import javax.persistence.Embeddable;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
@Embeddable
@Indexed
public class AddressEmb
{
private int id;
@Field(index = Index.YES, analyze = Analyze.YES)
private String company;
private String department;
private String contactName;
@@ -11,7 +11,11 @@ import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
@MappedSuperclass
@Indexed
public abstract class BaseData implements OwnedDataModel {
@Id
@@ -24,9 +28,11 @@ public abstract class BaseData implements OwnedDataModel {
private Date modified;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="OWNED_BY_ID")
@IndexedEmbedded
private User ownedBy;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="MODIFIED_BY_ID")
@IndexedEmbedded
private User modifiedBy;
@Transient
private boolean valid;
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.util.ArrayList;
import java.util.List;
@@ -23,7 +25,7 @@ public class Building extends BaseData implements DataModel {
@Column(name = "NAME")
private String name;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "building", orphanRemoval = true)
@@ -0,0 +1,28 @@
package info.bukova.isspst.data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "DBINFO")
public class DbInfo extends BaseSimpleData
{
@Column(name = "VERSION")
private long version;
public DbInfo()
{
this.version = 0;
}
public long getVersion()
{
return version;
}
public void setVersion(long version)
{
this.version = version;
}
}
@@ -0,0 +1,97 @@
package info.bukova.isspst.data;
import org.hibernate.annotations.Type;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author Pepa Rokos
*/
@Entity
@Table(name = "FILE_CONTENTS")
@Indexed
public class FileContent {
@Id
@Column(name = "ID")
@GeneratedValue
private int id;
@Column(name = "CONTENT")
@Type(type = "text")
@Field(index = Index.YES, analyze = Analyze.YES)
private String plainText;
@Column(name = "CONTENT_TYPE")
private String contentType;
@Column(name = "PATH_IN_FILESYSTEM")
private String pathInFilesystem;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPlainText() {
return plainText;
}
public void setPlainText(String content) {
this.plainText = content;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getPathInFilesystem() {
return pathInFilesystem;
}
public void setPathInFilesystem(String pathInFilesystem) {
this.pathInFilesystem = pathInFilesystem;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof FileContent)) return false;
FileContent that = (FileContent) o;
if (id != that.id) return false;
if (plainText != null ? !plainText.equals(that.plainText) : that.plainText != null) return false;
if (contentType != null ? !contentType.equals(that.contentType) : that.contentType != null) return false;
if (pathInFilesystem != null ? !pathInFilesystem.equals(that.pathInFilesystem) : that.pathInFilesystem != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (plainText != null ? plainText.hashCode() : 0);
result = 31 * result + (contentType != null ? contentType.hashCode() : 0);
result = 31 * result + (pathInFilesystem != null ? pathInFilesystem.hashCode() : 0);
return result;
}
}
@@ -0,0 +1,152 @@
package info.bukova.isspst.data;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "FILE_METAINFO")
@Indexed
public class FileMetainfo extends BaseData {
@Column(name = "FILE_NAME")
@Field(index = Index.YES, analyze = Analyze.YES)
private String fileName;
@Column(name = "MODULE_ID")
private String moduleId;
@Column(name = "RECORD_ID")
private int recordId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "CONTENT_ID")
@Cascade(CascadeType.SAVE_UPDATE)
@IndexedEmbedded
private FileContent content;
@Column(name = "MD5")
private String md5;
@Column(name = "DESCRIPTION")
@Field(index = Index.YES, analyze = Analyze.YES)
private String description;
private void ensureContentExists() {
if (content == null) {
content = new FileContent();
}
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getPathInFilesystem() {
if (content != null) {
return content.getPathInFilesystem();
}
return null;
}
public void setPathInFilesystem(String pathInFilesystem) {
ensureContentExists();
content.setPathInFilesystem(pathInFilesystem);
}
public String getModuleId() {
return moduleId;
}
public void setModuleId(String moduleId) {
this.moduleId = moduleId;
}
public int getRecordId() {
return recordId;
}
public void setRecordId(int recordId) {
this.recordId = recordId;
}
public FileContent getContent() {
return content;
}
public void setContent(FileContent content) {
this.content = content;
}
public String getMd5() {
return md5;
}
public void setMd5(String md5) {
this.md5 = md5;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getContentType() {
if (content != null) {
return content.getContentType();
}
return null;
}
public void setContentType(String contentType) {
ensureContentExists();
content.setContentType(contentType);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof FileMetainfo)) return false;
FileMetainfo that = (FileMetainfo) o;
if (recordId != that.recordId) return false;
if (content != null ? !content.equals(that.content) : that.content != null) return false;
if (description != null ? !description.equals(that.description) : that.description != null) return false;
if (fileName != null ? !fileName.equals(that.fileName) : that.fileName != null) return false;
if (md5 != null ? !md5.equals(that.md5) : that.md5 != null) return false;
if (moduleId != null ? !moduleId.equals(that.moduleId) : that.moduleId != null) return false;
return true;
}
@Override
public int hashCode() {
int result = fileName != null ? fileName.hashCode() : 0;
result = 31 * result + (moduleId != null ? moduleId.hashCode() : 0);
result = 31 * result + recordId;
result = 31 * result + (content != null ? content.hashCode() : 0);
result = 31 * result + (md5 != null ? md5.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
return result;
}
}
@@ -0,0 +1,78 @@
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 implements Cloneable
{
@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;
@Column(name = "COMPLETED")
private boolean completed;
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;
}
public boolean isCompleted()
{
return completed;
}
public void setCompleted(boolean completed)
{
this.completed = completed;
}
@Override
public Object clone() throws CloneNotSupportedException
{
Invoicing cloned = (Invoicing) super.clone();
return cloned;
}
}
@@ -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;
}
}
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.math.BigDecimal;
import java.util.Date;
@@ -220,6 +222,23 @@ public class JoinedItem implements DataModel, FilterableRequirement
this.ownedBy = owner;
}
protected Boolean itemMaterial;
public boolean isItemMaterialReal()
{
return ((this.requirement != null) && (this.requirement.getKind() == Constants.REQ_TYPE_MATERIAL));
}
public Boolean getItemMaterial()
{
return this.itemMaterial;
}
public void setItemMaterial(Boolean value)
{
this.itemMaterial = value;
}
@Override
public boolean equals(Object obj)
{
@@ -1,5 +1,6 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import info.bukova.isspst.StringUtils;
import javax.persistence.Column;
@@ -13,7 +14,7 @@ public class MUnit extends BaseData
@Column(name = "NAME")
private String name;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
public String getName()
@@ -1,5 +1,6 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import info.bukova.isspst.StringUtils;
import javax.persistence.Column;
@@ -14,11 +15,14 @@ public class MUnitEmb
@Column(name = "MUNIT_NAME")
private String name;
@Column(name = "MUNIT_DESCRIPTION")
@Column(name = "MUNIT_DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
public MUnitEmb()
{
// Embeddable object is loaded by hibernate like NULL, if all properties
// are NULL. So, we set ID.
this.id = 0;
}
public MUnitEmb(MUnit munit)
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
@@ -16,10 +18,16 @@ import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
@Entity
@Table(name = "ORDERS")
public class Order extends BaseData
@Indexed
public class Order extends BaseData implements Cloneable
{
@Column(name = "NUMSER")
@@ -35,7 +43,7 @@ public class Order extends BaseData
@AttributeOverride(name = "company", column = @Column(name = "SUPPLIER_COMPANY")),
@AttributeOverride(name = "contactName", column = @Column(name = "SUPPLIER_CONTACT_NAME")),
@AttributeOverride(name = "department", column = @Column(name = "SUPPLIER_DEPARTMENT")),
@AttributeOverride(name = "description", column = @Column(name = "SUPPLIER_DESCRIPTION")),
@AttributeOverride(name = "description", column = @Column(name = "SUPPLIER_DESCRIPTION", length = Constants.LEN_DESCRIPTION)),
@AttributeOverride(name = "dic", column = @Column(name = "SUPPLIER_DIC")),
@AttributeOverride(name = "email", column = @Column(name = "SUPPLIER_EMAIL")),
@AttributeOverride(name = "houseNumber", column = @Column(name = "SUPPLIER_HOUSENUMBER")),
@@ -45,6 +53,7 @@ public class Order extends BaseData
@AttributeOverride(name = "street", column = @Column(name = "SUPPLIER_STREET")),
@AttributeOverride(name = "web", column = @Column(name = "SUPPLIER_WEB")),
@AttributeOverride(name = "zipCode", column = @Column(name = "SUPPLIER_ZIP_CODE")) })
@IndexedEmbedded
private AddressEmb suplier;
@Embedded
@@ -54,7 +63,7 @@ public class Order extends BaseData
@AttributeOverride(name = "company", column = @Column(name = "INVOICE_COMPANY")),
@AttributeOverride(name = "contactName", column = @Column(name = "INVOICE_CONTACT_NAME")),
@AttributeOverride(name = "department", column = @Column(name = "INVOICE_DEPARTMENT")),
@AttributeOverride(name = "description", column = @Column(name = "INVOICE_DESCRIPTION")),
@AttributeOverride(name = "description", column = @Column(name = "INVOICE_DESCRIPTION", length = Constants.LEN_DESCRIPTION)),
@AttributeOverride(name = "dic", column = @Column(name = "INVOICE_DIC")),
@AttributeOverride(name = "email", column = @Column(name = "INVOICE_EMAIL")),
@AttributeOverride(name = "houseNumber", column = @Column(name = "INVOICE_HOUSENUMBER")),
@@ -73,7 +82,7 @@ public class Order extends BaseData
@AttributeOverride(name = "company", column = @Column(name = "DELIVERY_COMPANY")),
@AttributeOverride(name = "contactName", column = @Column(name = "DELIVERY_CONTACT_NAME")),
@AttributeOverride(name = "department", column = @Column(name = "DELIVERY_DEPARTMENT")),
@AttributeOverride(name = "description", column = @Column(name = "DELIVERY_DESCRIPTION")),
@AttributeOverride(name = "description", column = @Column(name = "DELIVERY_DESCRIPTION", length = Constants.LEN_DESCRIPTION)),
@AttributeOverride(name = "dic", column = @Column(name = "DELIVERY_DIC")),
@AttributeOverride(name = "email", column = @Column(name = "DELIVERY_EMAIL")),
@AttributeOverride(name = "houseNumber", column = @Column(name = "DELIVERY_HOUSENUMBER")),
@@ -94,11 +103,13 @@ public class Order extends BaseData
@Column(name = "DELIVERY_TYPE")
private String deliveryType;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
@Field(index = Index.YES, analyze = Analyze.YES)
private String description;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "order", orphanRemoval = true)
@LazyCollection(LazyCollectionOption.TRUE)
@IndexedEmbedded
private List<OrderItem> items;
@Column(name = "TOTAL", precision = 15, scale = 4)
@@ -110,20 +121,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 +233,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 +263,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;
}
}
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.math.BigDecimal;
import javax.persistence.Column;
@@ -12,52 +14,64 @@ import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
@Entity
@Table(name = "ORDER_ITEM")
public class OrderItem {
@Indexed
public class OrderItem
{
@Id
@Column(name="ID")
@GeneratedValue
@Column(name = "ID")
@GeneratedValue
private int id;
@Column(name = "CODE")
private String code;
@Column(name = "NAME")
@Field(index = Index.YES, analyze = Analyze.YES)
private String name;
@Column(name = "TEXTITEM")
@Field(index = Index.YES, analyze = Analyze.YES)
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")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
@Field(index = Index.YES, analyze = Analyze.YES)
private String description;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "REQUIREMENT_ITEM_ID")
private RequirementItem reqItem;
@ManyToOne
@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 +84,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;
}
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
@@ -19,7 +21,7 @@ public class Permission extends BaseSimpleData implements GrantedAuthority {
@Column(name="AUTHORITY")
private String authority;
@Column(name="DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
@Column(name="MODULE")
private String module;
@@ -12,11 +12,16 @@ import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
@Entity
@Table(name = "REQUIREMENT")
@Indexed
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)
@IndexedEmbedded
private List<RequirementItem> items;
@Column(name = "DELIVERYDATE")
@@ -28,6 +33,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 +86,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;
}
}
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -17,8 +19,13 @@ import javax.persistence.OrderBy;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
@MappedSuperclass
@Indexed
public class RequirementBase extends BaseData implements FilterableRequirement {
@ManyToOne(fetch = FetchType.LAZY)
@@ -29,10 +36,12 @@ public class RequirementBase extends BaseData implements FilterableRequirement {
@OrderBy("CENTRE, WORDER")
private List<Workflow> workflow;
@Column(name = "NUMSER", unique = true)
@Field(index = Index.YES, analyze = Analyze.YES)
private String numser;
@Column(name = "REQ_DATE")
private Date reqDate;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
@Field(index = Index.YES, analyze = Analyze.YES)
private String description;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "CENTRE_ID")
@@ -126,5 +135,21 @@ public class RequirementBase extends BaseData implements FilterableRequirement {
public void setWorkflow(List<Workflow> workflow) {
this.workflow = workflow;
}
public User getLastApprover() {
if (authorization.isEmpty()) {
return null;
}
return authorization.get(authorization.size() - 1).getApprover();
}
public Date getLastApproveDate() {
if (authorization.isEmpty()) {
return null;
}
return authorization.get(authorization.size() - 1).getAuthDate();
}
}
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.math.BigDecimal;
import javax.persistence.Column;
@@ -12,8 +14,15 @@ import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
@Entity
@Table(name = "REQUIREMENT_ITEMS")
@Indexed
public class RequirementItem
{
@Id
@@ -33,9 +42,11 @@ public class RequirementItem
private String code;
@Column(name = "NAME")
@Field(index = Index.YES, analyze = Analyze.YES)
private String name;
@Column(name = "TEXTITEM")
@Field(index = Index.YES, analyze = Analyze.YES)
private String textItem;
@Column(name = "QUANTITY", precision=15, scale=4)
@@ -50,12 +61,19 @@ public class RequirementItem
@Column(name = "TOTAL", precision=15, scale=4)
private BigDecimal total;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
@Field(index = Index.YES, analyze = Analyze.YES)
private String description;
@Column(name = "DELIVERED")
private Boolean delivered;
@Column(name = "ORDERNUM")
private String orderNum;
@Column(name = "PAID")
private Boolean paid;
public int getId()
{
return id;
@@ -162,8 +180,23 @@ public class RequirementItem
if (obj instanceof RequirementItem)
{
RequirementItem item = (RequirementItem)obj;
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 (this.getId() == item.getId());
return equalsId;
}
}
@@ -187,4 +220,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;
}
}
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.util.Date;
import javax.persistence.Column;
@@ -42,10 +44,9 @@ public abstract class RequirementSubject implements OwnedDataModel {
private String code;
@Column(name = "NAME")
private String name;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
@NotEmpty(message = "{MaterialFormCodeConstr}")
public String getCode() {
return code;
@@ -140,7 +141,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;
}
}
@@ -1,13 +1,15 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
@@ -22,7 +24,7 @@ public class RequirementType extends BaseData {
@Column(name = "TYPE")
private String type;
@Column(name = "DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval=true)
@LazyCollection(LazyCollectionOption.FALSE)
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import java.util.ArrayList;
import java.util.List;
@@ -25,7 +27,7 @@ public class Role extends BaseSimpleData implements GrantedAuthority, DataModel
@Column(name="AUTHORITY", unique=true)
private String authority;
@Column(name="DESCRIPTION")
@Column(name = "DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
@@ -14,6 +14,7 @@ public class SettingsData {
private MailMessage newReqTemplate;
private MailMessage authReqTemplate;
private MailMessage confReqTemplate;
private MailMessage confReqTripPassenger;
private Address mainAddress;
private List<Address> shippingAddrs;
private String bankName;
@@ -22,11 +23,13 @@ public class SettingsData {
private List<Vehicle> vehicles;
private Map<Integer, BigDecimal[]> refunds;
private String stampFile;
private String logoFile;
public SettingsData() {
newReqTemplate = new MailMessage();
authReqTemplate = new MailMessage();
confReqTemplate = new MailMessage();
confReqTripPassenger = new MailMessage();
mainAddress = new Address();
shippingAddrs = new ArrayList<Address>();
vehicles = new ArrayList<Vehicle>();
@@ -140,4 +143,21 @@ public class SettingsData {
this.stampFile = stampFile;
}
public String getLogoFile()
{
return logoFile;
}
public void setLogoFile(String logoFile)
{
this.logoFile = logoFile;
}
public MailMessage getConfReqTripPassenger() {
return confReqTripPassenger;
}
public void setConfReqTripPassenger(MailMessage confReqTripPassenger) {
this.confReqTripPassenger = confReqTripPassenger;
}
}
@@ -1,5 +1,8 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import info.bukova.isspst.storage.EntityWithAttachment;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
@@ -16,10 +19,16 @@ import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
@Entity
@Table(name = "TRIP_BILL")
public class TripBill extends BaseData {
@Indexed
public class TripBill extends BaseData implements EntityWithAttachment {
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "REQUIREMENT_ID")
@@ -28,6 +37,11 @@ public class TripBill extends BaseData {
private Date resultMessageDate;
@Column(name = "SIGN_DATE")
private Date signDate;
@Column(name = "RESULT_MESSAGE", length = Constants.LEN_RESULT_MESSAGE)
@Field(index = Index.YES, analyze = Analyze.YES)
private String resultMessage;
@Column(name = "FREE_MEALS")
private boolean freeMeals;
@Column(name = "FREE_HOUSING")
@@ -44,9 +58,19 @@ public class TripBill extends BaseData {
private BigDecimal downPayment;
@Column(name = "TOTAL", precision = 15, scale = 4)
private BigDecimal total;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.TRUE)
@IndexedEmbedded
private List<FileMetainfo> attachedFiles;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "APPROVAL_ID")
private TripBillApproval approval;
@Column(name = "SAVED")
private Boolean saved;
public TripBill() {
billItems = new ArrayList<TripBillItem>();
attachedFiles = new ArrayList<FileMetainfo>();
}
public TripRequirement getRequirement() {
@@ -73,6 +97,16 @@ public class TripBill extends BaseData {
this.signDate = signDate;
}
public String getResultMessage()
{
return resultMessage;
}
public void setResultMessage(String resultMessage)
{
this.resultMessage = resultMessage;
}
public boolean isFreeMeals() {
return freeMeals;
}
@@ -121,4 +155,37 @@ public class TripBill extends BaseData {
this.total = total;
}
public List<FileMetainfo> getAttachedFiles() {
return attachedFiles;
}
@Override
public void addAttachment(FileMetainfo metaInfo) {
attachedFiles.add(metaInfo);
}
@Override
public void removeAttachment(FileMetainfo metainfo) {
attachedFiles.remove(metainfo);
}
public void setAttachedFiles(List<FileMetainfo> attachedFiles) {
this.attachedFiles = attachedFiles;
}
public TripBillApproval getApproval() {
return approval;
}
public void setApproval(TripBillApproval approval) {
this.approval = approval;
}
public Boolean getSaved() {
return saved;
}
public void setSaved(Boolean saved) {
this.saved = saved;
}
}
@@ -0,0 +1,44 @@
package info.bukova.isspst.data;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
/**
* @author Pepa Rokos
*/
@Entity
@Table(name = "TRIP_BILL_APPROVAL")
public class TripBillApproval extends RequirementBase {
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TRIPBILL_ID")
private TripBill bill;
@Override
public String getNumser() {
if (bill == null) {
return "";
}
TripRequirement tr = bill.getRequirement();
if (tr == null) {
return "";
}
return tr.getNumser();
}
public TripBill getBill() {
return bill;
}
public void setBill(TripBill bill) {
this.bill = bill;
}
}
@@ -1,7 +1,6 @@
package info.bukova.isspst.data;
import java.math.BigDecimal;
import java.util.Date;
import info.bukova.isspst.Constants;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
@@ -9,6 +8,8 @@ import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;
@Entity
@Table(name = "TRIP_BILL_ITEMS")
@@ -33,7 +34,7 @@ public class TripBillItem extends BaseData {
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "code", column = @Column(name = "BACK_VEHICLE_CODE")),
@AttributeOverride(name = "description", column = @Column(name = "BACK_VEHICLE_DESCRIPTION"))
@AttributeOverride(name = "description", column = @Column(name = "BACK_VEHICLE_DESCRIPTION", length = Constants.LEN_DESCRIPTION))
})
private Vehicle backVehicle;
@Column(name = "BEGIN_WORK")
@@ -63,6 +64,35 @@ public class TripBillItem extends BaseData {
@Column(name = "ADJUSTED_TOTAL", precision = 15, scale = 4)
private BigDecimal adjustedTotal;
public TripBillItem() {
}
public TripBillItem(TripBillItem src) {
date = src.getDate();
to = src.getTo();
back = src.getBack();
toDeparture = src.getToDeparture();
toArrival = src.getToArrival();
backDeparture = src.getBackDeparture();
backArrival = src.getBackArrival();
toVehicle = src.getToVehicle();
backVehicle = src.getBackVehicle();
beginWork = src.getBeginWork();
endWork = src.getEndWork();
freeMealsCount = src.getFreeMealsCount();
distance = src.getDistance();
fuelConsumption = src.getFuelConsumption();
distanceAmount = src.getDistanceAmount();
fuelAmount = src.getFuelAmount();
carefare = src.getCarefare();
housing = src.getHousing();
meals = src.getMeals();
otherExpenses = src.getOtherExpenses();
total = src.getTotal();
adjustedTotal = src.getAdjustedTotal();
}
public Date getDate() {
return date;
}
@@ -1,32 +1,44 @@
package info.bukova.isspst.data;
import info.bukova.isspst.storage.EntityWithAttachment;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
@Entity
@Table(name = "TRIPREQUIREMENT")
public class TripRequirement extends RequirementBase {
@Indexed
public class TripRequirement extends RequirementBase implements EntityWithAttachment {
@Column(name = "TRIP_FROM")
@Field(index = Index.YES, analyze = Analyze.YES)
private String from;
@Column(name = "TRIP_TO")
@Field(index = Index.YES, analyze = Analyze.YES)
private String to;
@Column(name = "TRIP_DATE")
private Date tripDate;
@Column(name = "TRIP_END")
@Column(name = "END")
private String end;
@Column(name = "END_DATE")
private Date endDate;
@@ -34,16 +46,28 @@ public class TripRequirement extends RequirementBase {
@LazyCollection(LazyCollectionOption.TRUE)
@JoinTable(name="TRIPREQUIREMENT_PASSANGER", joinColumns={@JoinColumn(name="TRIPREQUIREMENT_ID")}, inverseJoinColumns={@JoinColumn(name="USER_ID")})
private List<User> passengers;
@Column(name = "FOREIGN_PERSONS")
@Field(index = Index.YES, analyze = Analyze.YES)
private String foreignPersons;
@Embedded
private Vehicle vehicle;
@Column(name = "REQUIRE_DOWN_PAYMENT")
private Boolean requireDownPayment;
@Column(name = "DOWN_PAYMENT", precision = 15, scale = 4)
private BigDecimal downPayment;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.TRUE)
@IndexedEmbedded
private List<FileMetainfo> attachedFiles;
@Column(name = "BILL_FOR_PASSENGERS")
private Boolean billForPassengers;
public TripRequirement() {
this.setOwnedBy(new User());
passengers = new ArrayList<User>();
attachedFiles = new ArrayList<FileMetainfo>();
}
public String getFrom() {
@@ -94,6 +118,16 @@ public class TripRequirement extends RequirementBase {
this.passengers = passengers;
}
public String getForeignPersons()
{
return foreignPersons;
}
public void setForeignPersons(String foreignPersons)
{
this.foreignPersons = foreignPersons;
}
public Vehicle getVehicle() {
return vehicle;
}
@@ -118,4 +152,30 @@ public class TripRequirement extends RequirementBase {
this.downPayment = downPayment;
}
@Override
public List<FileMetainfo> getAttachedFiles() {
return attachedFiles;
}
public void setAttachedFiles(List<FileMetainfo> attachedFiles) {
this.attachedFiles = attachedFiles;
}
@Override
public void addAttachment(FileMetainfo metaInfo) {
attachedFiles.add(metaInfo);
}
@Override
public void removeAttachment(FileMetainfo metainfo) {
attachedFiles.remove(metainfo);
}
public Boolean getBillForPassengers() {
return billForPassengers;
}
public void setBillForPassengers(Boolean billForPassengers) {
this.billForPassengers = billForPassengers;
}
}
@@ -14,10 +14,15 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.springframework.security.core.userdetails.UserDetails;
@Entity
@Table(name="USER_LOGIN")
@Table(name="USER")
@Indexed
public class User extends Member implements UserDetails, DataModel {
/**
@@ -32,8 +37,10 @@ public class User extends Member implements UserDetails, DataModel {
@Column(name="ENABLED")
private boolean enabled;
@Column(name="FIRST_NAME")
@Field(index = Index.YES, analyze = Analyze.YES)
private String firstName;
@Column(name="LAST_NAME")
@Field(index = Index.YES, analyze = Analyze.YES)
private String lastName;
@Column(name="PERSONAL_NUMBER")
private String personalNumber;
@@ -1,5 +1,10 @@
package info.bukova.isspst.data;
import info.bukova.isspst.StringUtils;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@@ -47,4 +52,22 @@ public class UsersAddress {
this.city = city;
}
public String toString() {
List<String> list = new ArrayList<String>();
list.add(this.street);
list.add(this.houseNumber);
final String s1 = StringUtils.joinNotEmpty(list, " ");
list.clear();
list.add(this.zipCode);
list.add(this.city);
final String s2 = StringUtils.joinNotEmpty(list, " ");
list.clear();
list.add(s1);
list.add(s2);
final String s = StringUtils.joinNotEmpty(list, ", ");
return s;
}
}
@@ -1,5 +1,7 @@
package info.bukova.isspst.data;
import info.bukova.isspst.Constants;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@@ -8,7 +10,7 @@ public class Vehicle {
@Column(name = "VEHICLE_CODE")
private String code;
@Column(name = "VEHICLE_DESCRIPTION")
@Column(name = "VEHICLE_DESCRIPTION", length = Constants.LEN_DESCRIPTION)
private String description;
public String getCode() {
@@ -0,0 +1,57 @@
package info.bukova.isspst.filters;
import info.bukova.isspst.StringUtils;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
@SuppressWarnings("serial")
public class BooleanFilterListbox extends Listbox
{
class TristateBooleanListItem extends TristateBoolean
{
public TristateBooleanListItem(String text, int value)
{
this.setText(text);
this.setValue(value);
}
private String text;
public String getText()
{
return text;
}
public void setText(String text)
{
this.text = text;
}
}
public BooleanFilterListbox()
{
super();
List<TristateBooleanListItem> list = new ArrayList<TristateBooleanListItem>();
list.add(new TristateBooleanListItem(StringUtils.localize("LabelAll"), TristateBoolean.NULL));
list.add(new TristateBooleanListItem(StringUtils.localize("LabelNo"), TristateBoolean.FALSE));
list.add(new TristateBooleanListItem(StringUtils.localize("LabelYes"), TristateBoolean.TRUE));
for (int i = 0; i < list.size(); i++)
{
TristateBooleanListItem triStateItem = (TristateBooleanListItem) list.get(i);
this.appendItem(triStateItem.getText(), "");
Listitem item = this.getItemAtIndex(i);
item.setValue((TristateBoolean) triStateItem);
}
this.setSelectedIndex(0);
// this.setHflex("1");
this.setMold("select");
}
}
@@ -0,0 +1,76 @@
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.User;
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 foundUser = User.isEqualByUserForFilter(item.getRequirement().getOwnedBy(), condition.getRequirement().getOwnedBy());
boolean foundDescription = StringUtils.isEqualForFilter(item.getRequirement().getDescription(), condition.getRequirement().getDescription());
return (foundNumser && foundReqDate && foundCenter && foundDescription && foundWorkgroup && foundUser);
}
@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 "";
}
}
@@ -1,5 +1,6 @@
package info.bukova.isspst.filters;
import info.bukova.isspst.BooleanUtils;
import info.bukova.isspst.StringUtils;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.data.MUnitEmb;
@@ -42,6 +43,7 @@ public class JoinedItemFilter implements Filter<JoinedItem>
@Override
public boolean matchesSafely(JoinedItem item)
{
boolean foundItemMaterial = BooleanUtils.isEqualFilterByBoolean(item.isItemMaterialReal(), condition.getItemMaterial());
boolean foundCode = StringUtils.isEqualForFilter(item.getCode(), condition.getCode());
boolean foundName = StringUtils.isEqualForFilter(item.getName(), condition.getName());
boolean foundTextItem = StringUtils.isEqualForFilter(item.getTextItem(), condition.getTextItem());
@@ -56,7 +58,18 @@ public class JoinedItemFilter implements Filter<JoinedItem>
boolean foundCenter = Workgroup.isEqualByWorkgroupForFilter(item.getCentre(), condition.getCentre());
boolean foundOwner = User.isEqualByUserForFilter(item.getOwnedBy(), condition.getOwnedBy());
boolean foundDescription = StringUtils.isEqualForFilter(item.getDescription(), condition.getDescription());
return (foundCode && foundName && foundTextItem && foundDescription && foundQuantity && foundUnitPrice && foundMUnit && foundTotal && foundWorkgroup && foundCenter && foundOwner && foundDescription);
return (foundItemMaterial
&& foundCode
&& foundName
&& foundTextItem
&& foundDescription
&& foundQuantity
&& foundUnitPrice
&& foundMUnit
&& foundTotal
&& foundWorkgroup
&& foundCenter
&& foundOwner && foundDescription);
}
@Factory
@@ -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.isEqualByBooleanValue(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;
}
@@ -0,0 +1,87 @@
package info.bukova.isspst.filters;
import org.jfree.util.Log;
public class TristateBoolean
{
private static final String TAG = TristateBoolean.class.getSimpleName();
public static final int NULL = -1;
public static final int FALSE = 0;
public static final int TRUE = 1;
public static final int getValidValue(final int value)
{
if ((value != TristateBoolean.NULL) && (value != TristateBoolean.FALSE) && (value != TristateBoolean.TRUE))
{
Log.warn(TAG + "\nBad tristate boolean value.");
return TristateBoolean.NULL;
}
return value;
}
public TristateBoolean()
{
this.setValue(TristateBoolean.NULL);
}
public TristateBoolean(boolean value)
{
this.setValue(value ? TristateBoolean.TRUE : TristateBoolean.FALSE);
}
public TristateBoolean(int value)
{
this.setValue(value);
}
protected int value;
public int getValue()
{
return value;
}
public void setValue(int value)
{
this.value = TristateBoolean.getValidValue(value);
}
public Boolean getBoolean()
{
switch (this.value)
{
case TristateBoolean.FALSE:
return new Boolean(false);
case TristateBoolean.TRUE:
return new Boolean(true);
default:
return null;
}
}
@Override
public boolean equals(Object obj)
{
if (obj != null)
{
if (obj instanceof TristateBoolean)
{
TristateBoolean item = (TristateBoolean) obj;
int thisValue = this.getValue();
int itemValue = item.getValue();
return (thisValue == itemValue);
}
}
return false;
}
public boolean equals(int value)
{
return (this.getValue() == value);
}
}
@@ -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) {
@@ -67,5 +75,18 @@ 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;
}
}
@@ -42,6 +42,10 @@ public class MailerWithAttachement implements Mailer {
message.setFrom(from);
}
}
if (message.getReplyTo() == null) {
message.setReplyTo(message.getFrom());
}
helper.setFrom(message.getFrom());
helper.setReplyTo(message.getReplyTo());
@@ -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) {
@@ -1,8 +1,6 @@
package info.bukova.isspst.reporting;
import java.util.HashMap;
import java.util.Map;
import info.bukova.isspst.data.Address;
import info.bukova.isspst.data.AuthItem;
import info.bukova.isspst.data.Order;
import info.bukova.isspst.data.TripBill;
@@ -13,8 +11,13 @@ import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.storage.FileStorage;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.mysql.jdbc.StringUtils;
public class ParamFiller {
@Autowired
@@ -45,6 +48,7 @@ public class ParamFiller {
if ((definition.getDataSet().get(0) instanceof TripBill)
&& definition.getReport().isSingleRecord()) {
if (userService.getUserSettings().getSignatureFile() != null
&& !userService.getUserSettings().getSignatureFile().isEmpty()) {
definition.setParam("P_USER_SIGNATURE", storage.serverPath(userService.getUserSettings().getSignatureFile()));
@@ -52,17 +56,25 @@ public class ParamFiller {
TripBill tb = (TripBill)definition.getDataSet().get(0);
tripReqService.loadAuthItems(tb.getRequirement());
AuthItem lastButOneAuth = tb.getRequirement().getAuthorization().get(0);
definition.setParam("P_PREV_APPROVE_DATE", lastButOneAuth.getAuthDate());
User lastButOneUser = lastButOneAuth.getApprover();
UserSettingsData prevApproverSettings = userService.getUserSettings(lastButOneUser);
if (prevApproverSettings != null && !StringUtils.isNullOrEmpty(prevApproverSettings.getSignatureFile())) {
definition.setParam("P_PREV_APPROVER_SIGNATURE", storage.serverPath(prevApproverSettings.getSignatureFile()));
}
AuthItem lastAuth = tb.getRequirement().getAuthorization().get(tb.getRequirement().getAuthorization().size() - 1);
definition.setParam("P_APPROVE_DATE", lastAuth.getAuthDate());
User u = lastAuth.getApprover();
UserSettingsData approverSettings = userService.getUserSettings(u);
if (approverSettings != null
&& approverSettings.getSignatureFile() != null
&& !approverSettings.getSignatureFile().isEmpty()) {
if (approverSettings != null && !StringUtils.isNullOrEmpty(approverSettings.getSignatureFile())) {
definition.setParam("P_APPROVER_SIGNATURE", storage.serverPath(approverSettings.getSignatureFile()));
}
}
@@ -74,6 +86,15 @@ public class ParamFiller {
definition.setParam("P_STAMP", storage.serverPath(settingService.getSettings().getStampFile()));
}
}
definition.setParam("P_LOGO", storage.serverPath(settingService.getSettings().getLogoFile()));
Address mainAddress = settingService.getSettings().getMainAddress();
if (mainAddress != null) {
String addr = (StringUtils.isNullOrEmpty(mainAddress.getCompany()) ? "" : mainAddress.getCompany());
definition.setParam("P_MAIN_ADDRESS", addr);
}
}
}
@@ -8,10 +8,12 @@ public class Report {
private String jasperFile;
private boolean hasSettings;
private boolean singleRecord;
private boolean hasCondition;
public Report() {
hasSettings = false;
singleRecord = false;
hasCondition = false;
}
/**
@@ -46,6 +48,19 @@ public class Report {
this.singleRecord = singleRecord;
}
/**
*
* @param name
* @param jasperFile
* @param hasSettings
* @param singleRecord
* @param hasCondition
*/
public Report(String name, String jasperFile, boolean hasSettings, boolean singleRecord, boolean hasCondition) {
this(name, jasperFile, hasSettings, singleRecord);
this.hasCondition = hasCondition;
}
public ReportType getType() {
return type;
}
@@ -86,4 +101,11 @@ public class Report {
this.singleRecord = singleRecord;
}
public boolean isHasCondition() {
return hasCondition;
}
public void setHasCondition(boolean hasCondition) {
this.hasCondition = hasCondition;
}
}
@@ -24,10 +24,16 @@ public abstract class AbstractRequirementEvaluator extends AbstractModuleEvaluat
return false;
}
RequirementBase req = (RequirementBase) targetDomainObject;
if (permission.equals(Constants.PERM_EDIT_NEW)) {
return req.getState() == RequirementState.NEW;
if (targetDomainObject instanceof RequirementBase) {
RequirementBase req = (RequirementBase) targetDomainObject;
if (permission.equals(Constants.PERM_EDIT_NEW)) {
return req.getState() == RequirementState.NEW;
}
if (permission.equals(Constants.PERM_DELETE_NEW)) {
return req.getState() == RequirementState.NEW;
}
}
return true;
@@ -0,0 +1,9 @@
package info.bukova.isspst.security;
public enum AuthMethod {
DATABASE,
LDAP,
AD
}
@@ -23,6 +23,7 @@ public class AuthPopulator implements LdapAuthoritiesPopulator {
public AuthPopulator(UserService userService, RoleService roleService) {
this.userService = userService;
this.roleService = roleService;
userService.setAuthMethod(AuthMethod.LDAP);
}
@Override
@@ -1,11 +1,13 @@
package info.bukova.isspst.security;
import info.bukova.isspst.Constants;
import info.bukova.isspst.Module;
import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.PermissionType;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.Service;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import java.util.List;
@@ -39,11 +41,31 @@ public class WorkgroupAwareServiceEvaluator implements Evaluator {
}
User user = (User)authentication.getPrincipal();
String moduleId = "";
if (targetDomainObject instanceof Service<?>) {
Service<?> service = (Service<?>)targetDomainObject;
Module mod = service.getModule();
if (mod != null) {
moduleId = mod.getId();
}
}
// TODO - v master větvi je na toto pomocná třída
/*for (Module m : Constants.MODULES) {
if (m.getServiceClass() != null && m.getServiceClass().isAssignableFrom(targetDomainObject.getClass())) {
moduleId = m.getId();
break;
}
}*/
Permission appPermission = null;
for (Permission p : Constants.SPECIAL_PERMISSIONS) {
if (p.getAuthority().equals(permission)) {
if (p.getAuthority().equals(permission)
&& p.getModule().equals(moduleId)) {
appPermission = p;
break;
}
}
@@ -66,7 +88,8 @@ public class WorkgroupAwareServiceEvaluator implements Evaluator {
for (Role r : wgRoles) {
for (Permission p : r.getPermissions()) {
if (p.getAuthority().equals(appPermission.getAuthority())) {
if (p.getAuthority().equals(appPermission.getAuthority())
&& p.getModule().equals(appPermission.getModule())) {
return true;
}
}
@@ -1,7 +1,7 @@
package info.bukova.isspst.services;
import java.util.Date;
import info.bukova.isspst.data.OwnedDataModel;
import info.bukova.isspst.data.User;
import org.hibernate.NonUniqueResultException;
import org.hibernate.Query;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -9,8 +9,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.transaction.annotation.Transactional;
import info.bukova.isspst.data.OwnedDataModel;
import info.bukova.isspst.data.User;
import java.util.Date;
public class AbstractOwnedService<T extends OwnedDataModel> extends AbstractService<T> {
@@ -32,6 +31,7 @@ public class AbstractOwnedService<T extends OwnedDataModel> extends AbstractServ
entity.setModifiedBy(getLoggedInUser());
entity.setModified(new Date());
dao.modify(entity);
maintainStorrage();
}
@Transactional
@@ -1,8 +1,7 @@
package info.bukova.isspst.services;
import static ch.lambdaj.Lambda.filter;
import info.bukova.isspst.Constants;
import info.bukova.isspst.Module;
import info.bukova.isspst.ModuleUtils;
import info.bukova.isspst.SessionData;
import info.bukova.isspst.dao.BaseDao;
import info.bukova.isspst.dao.QueryDao;
@@ -11,7 +10,15 @@ import info.bukova.isspst.data.NumberSeries;
import info.bukova.isspst.filters.Filter;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.services.numberseries.NumberSeriesService;
import info.bukova.isspst.storage.DocumentFileStorage;
import org.hibernate.NonUniqueResultException;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -20,14 +27,7 @@ import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import org.hibernate.NonUniqueResultException;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import static ch.lambdaj.Lambda.filter;
public abstract class AbstractService<T extends DataModel> implements Service<T> {
@@ -37,9 +37,14 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
protected SessionData sessionData;
@Autowired
protected QueryDao queryDao;
private DocumentFileStorage documentFileStorage;
private NumberSeriesService numberSeriesService;
public void setDocumentFileStorage(DocumentFileStorage storage) {
this.documentFileStorage = storage;
}
public NumberSeriesService getNumberSeriesService()
{
@@ -59,6 +64,16 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
return "";
}
public String getDeleteEntityPermission() {
return "";
}
protected void maintainStorrage() {
if (documentFileStorage != null) {
documentFileStorage.purge();
}
}
@Override
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
public final T create() {
@@ -73,6 +88,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null");
}
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
validate(entity);
entity.setCreated(new Date());
dao.add(entity);
@@ -86,20 +105,31 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null");
}
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
validate(entity);
entity.setModified(new Date());
dao.modify(entity);
maintainStorrage();
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_DELETE')")
@PreAuthorize("hasPermission(this, 'PERM_DELETE') or hasPermission(#entity, this.getDeleteEntityPermission())")
public void delete(T entity) {
if (dao == null) {
throw new IsspstException("DAO is null");
}
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
dao.delete(entity);
maintainStorrage(); // poklidit přiložené soubory
}
@Override
@@ -137,6 +167,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null");
}
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
return dao.getById(id);
}
@@ -148,6 +182,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null");
}
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
return dao.getAll();
}
@@ -159,6 +197,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null");
}
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
return dao.execQuery(query);
}
@@ -171,6 +213,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
throw new IsspstException("DAO is null");
}
if (getModule() != null && !getModule().isActive()) {
throw new ModuleNotActiveException();
}
try {
Query q = dao.getQuery(query);
return (T) q.uniqueResult();
@@ -189,13 +235,7 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
@Override
public Module getModule() {
for (Module m : Constants.MODULES) {
if (Arrays.asList(this.getClass().getInterfaces()).contains(m.getServiceClass())) {
return m;
}
}
return null;
return ModuleUtils.getModule(this.getClass());
}
public List<Report> getReports() {
@@ -234,6 +274,10 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
@Override
@Transactional
public void loadLazyData(String group, T entity) {
if (entity == null) {
return;
}
Method[] methods = this.getClass().getMethods();
for (Method m : methods) {
@@ -256,4 +300,9 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
}
}
}
@Override
public boolean canPrintRecord(T entity) {
return true;
}
}
@@ -0,0 +1,14 @@
package info.bukova.isspst.services;
public class ModuleNotActiveException extends IsspstException {
/**
*
*/
private static final long serialVersionUID = -1219763294556500698L;
public ModuleNotActiveException() {
super("Module deactivated");
}
}
@@ -22,5 +22,6 @@ public interface Service<T> {
public List<T> filterList(List<T> sourceList, Filter<T> filter);
public Module getModule();
public List<Report> getReports();
public boolean canPrintRecord(T entity);
}
@@ -0,0 +1,11 @@
package info.bukova.isspst.services.dbinfo;
import info.bukova.isspst.data.DbInfo;
import info.bukova.isspst.services.Service;
public interface DbInfoService extends Service<DbInfo>
{
public void changeDatabase();
public void updateDatabaseVersion();
}
@@ -0,0 +1,157 @@
package info.bukova.isspst.services.dbinfo;
import info.bukova.isspst.Constants;
import info.bukova.isspst.data.DbInfo;
import info.bukova.isspst.services.AbstractService;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SQLQuery;
import org.springframework.transaction.annotation.Transactional;
public class DbInfoServiceImpl extends AbstractService<DbInfo> implements DbInfoService
{
private DbInfo getDbInfo()
{
DbInfo dbInfo = null;
List<DbInfo> list = this.getAll();
if (list.isEmpty())
{
dbInfo = new DbInfo();
this.add(dbInfo);
list = this.getAll();
}
for (DbInfo item : list)
{
dbInfo = item;
break;
}
return dbInfo;
}
@Override
@Transactional
public void changeDatabase()
{
class Str2Str
{
private String key;
private String value;
public Str2Str(String key, String value)
{
this.key = key;
this.value = value;
}
public String getKey()
{
return this.key;
}
public String getValue()
{
return this.value;
}
}
// String source = UserCountUtils.encryptUserCount(1000);
// long users = UserCountUtils.decryptUserCount(source);
long dbVersion = this.getDbInfo().getVersion();
if (Constants.DB_VERSION > dbVersion)
{
SQLQuery sq = null;
String sql = "";
if (dbVersion < 1)
{
List<Str2Str> tables = new ArrayList<Str2Str>();
tables.add(new Str2Str("ADDRESS", "DESCRIPTION"));
tables.add(new Str2Str("BUILDING", "DESCRIPTION"));
tables.add(new Str2Str("MATERIAL", "DESCRIPTION"));
tables.add(new Str2Str("MUNIT", "DESCRIPTION"));
tables.add(new Str2Str("ORDERS", "DESCRIPTION"));
tables.add(new Str2Str("ORDER_ITEM", "DESCRIPTION"));
tables.add(new Str2Str("PERMISSION", "DESCRIPTION"));
tables.add(new Str2Str("REQUIREMENT", "DESCRIPTION"));
tables.add(new Str2Str("REQUIREMENTTYPE", "DESCRIPTION"));
tables.add(new Str2Str("REQUIREMENT_ITEMS", "DESCRIPTION"));
tables.add(new Str2Str("ROLE", "DESCRIPTION"));
tables.add(new Str2Str("SERVICE", "DESCRIPTION"));
tables.add(new Str2Str("TRIPREQUIREMENT", "DESCRIPTION"));
tables.add(new Str2Str("MATERIAL", "MUNIT_DESCRIPTION"));
tables.add(new Str2Str("ORDERS", "INVOICE_DESCRIPTION"));
tables.add(new Str2Str("ORDERS", "DELIVERY_DESCRIPTION"));
tables.add(new Str2Str("ORDERS", "SUPPLIER_DESCRIPTION"));
tables.add(new Str2Str("ORDER_ITEM", "MUNIT_DESCRIPTION"));
tables.add(new Str2Str("REQUIREMENT_ITEMS", "MUNIT_DESCRIPTION"));
tables.add(new Str2Str("TRIPREQUIREMENT", "VEHICLE_DESCRIPTION"));
tables.add(new Str2Str("TRIP_BILL_ITEMS", "BACK_VEHICLE_DESCRIPTION"));
tables.add(new Str2Str("TRIP_BILL_ITEMS", "VEHICLE_DESCRIPTION"));
for (Str2Str item : tables)
{
sql = "ALTER TABLE " + item.getKey() + " MODIFY " + item.getValue() + " VARCHAR(" + String.valueOf(Constants.LEN_DESCRIPTION) + ")";
sq = this.dao.getSession().createSQLQuery(sql);
sq.executeUpdate();
}
}
if (dbVersion < 2)
{
List<String> tables = new ArrayList<String>();
tables.add("MATERIAL");
tables.add("ORDER_ITEM");
tables.add("REQUIREMENT_ITEMS");
for (String item : tables)
{
sql = "UPDATE " + item + " SET MUNIT_ID = 0 WHERE (MUNIT_ID Is NULL) ";
sq = this.dao.getSession().createSQLQuery(sql);
sq.executeUpdate();
}
}
if (dbVersion < 3)
{
sql = "UPDATE INVOICING SET COMPLETED = false WHERE (COMPLETED Is NULL) ";
sq = this.dao.getSession().createSQLQuery(sql);
sq.executeUpdate();
}
if (dbVersion < 4)
{
sql = "UPDATE TRIP_BILL SET RESULT_MESSAGE = 'Zpráva z pracovní cesty' WHERE (RESULT_MESSAGE Is NULL) ";
sq = this.dao.getSession().createSQLQuery(sql);
sq.executeUpdate();
}
if (dbVersion < 5) {
sql = "ALTER TABLE TRIP_BILL MODIFY RESULT_MESSAGE VARCHAR(" + String.valueOf(Constants.LEN_RESULT_MESSAGE) + ")";
sq = this.dao.getSession().createSQLQuery(sql);
sq.executeUpdate();
}
this.updateDatabaseVersion();
}
}
@Override
@Transactional
public void updateDatabaseVersion()
{
DbInfo dbInfo = this.getDbInfo();
dbInfo.setVersion(Constants.DB_VERSION);
this.update(dbInfo);
}
}
@@ -0,0 +1,14 @@
package info.bukova.isspst.services.fulltext;
import java.io.ByteArrayInputStream;
/**
* @author Pepa Rokos
*/
public abstract class AbstractExtractor implements Extractor {
public String extract(byte[] data) {
return extract(new ByteArrayInputStream(data));
}
}
@@ -0,0 +1,25 @@
package info.bukova.isspst.services.fulltext;
import org.apache.poi.POIXMLTextExtractor;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Pepa Rokos
*/
public abstract class AbstractOfficeExtractor extends AbstractExtractor {
@Override
public String extract(InputStream is) throws ExtractorException {
try {
POIXMLTextExtractor extractor = createExtractor(is);
return extractor.getText();
} catch (IOException e) {
throw new ExtractorException(e);
}
}
protected abstract POIXMLTextExtractor createExtractor(InputStream is) throws IOException;
}
@@ -0,0 +1,19 @@
package info.bukova.isspst.services.fulltext;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Pepa Rokos
*/
public class ExcelExtractor extends AbstractOfficeExtractor implements Extractor {
@Override
protected POIXMLTextExtractor createExtractor(InputStream is) throws IOException {
return new XSSFExcelExtractor(new XSSFWorkbook(is));
}
}
@@ -0,0 +1,30 @@
package info.bukova.isspst.services.fulltext;
import java.io.InputStream;
/**
* @author Pepa Rokos
*
* Rozhraní extractoru čistého textu z formátů Office a PDF
*/
public interface Extractor {
/**
* Extrahuje text z předaného pole bytů
*
* @param data zdrajová data
* @return čistý text
* @throws ExtractorException
*/
public String extract(byte[] data) throws ExtractorException;
/**
* Extrahuje text z předaného InputStream objektu
*
* @param is zdrojový InputStream
* @return čistý text
* @throws ExtractorException
*/
public String extract(InputStream is) throws ExtractorException;
}
@@ -0,0 +1,16 @@
package info.bukova.isspst.services.fulltext;
import info.bukova.isspst.services.IsspstException;
/**
* @author Pepa Rokos
*
* Výjimka extrakce textu
*/
public class ExtractorException extends IsspstException {
public ExtractorException(Throwable cause) {
super("Extractor exception: ", cause);
}
}
@@ -0,0 +1,42 @@
package info.bukova.isspst.services.fulltext;
/**
* @author Pepa Rokos
*
* Factory pro konkrétní extractor
*/
public class ExtractorFactory {
/**
* Vytvoří extractor podle předaného content typu
*
* @param contentType
* @return Extractor
*/
public static Extractor createExtractor(String contentType) {
if (contentType.equals("application/vnd.oasis.opendocument.text")
|| contentType.equals("application/vnd.oasis.opendocument.spreadsheet")
|| contentType.equals("application/vnd.oasis.opendocument.presentation")) {
return new OdfExtractor();
}
if (contentType.equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document")) {
return new WordExtractor();
}
if (contentType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) {
return new ExcelExtractor();
}
if (contentType.equals("application/vnd.openxmlformats-officedocument.presentationml.slideshow")) {
return new PowerPointExtractor();
}
if (contentType.equals("application/pdf")) {
return new PdfExtractor();
}
return null;
}
}
@@ -0,0 +1,42 @@
package info.bukova.isspst.services.fulltext;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import java.util.List;
/**
* @author Pepa Rokos
*
* Rozhraní služby fulltextového vyhledávání
*
*/
public interface FullTextService {
/**
* Přegeneruje fulltextový index.
*/
public void reindex();
/**
* Vyhledává entity zadané třídy. Třída entity musí být anotovaná {@link Indexed}
*
* @param entityClass třída entity k vyhledání
* @param fields property entity kde se bude vyhledávat. Musí být anotované {@link Field}
* @param word vyhledávaný výraz
* @return list odpovídajících entit
*/
public List<?> search(Class<?> entityClass, String[] fields, String word);
/**
* Globální vyhledávání ve všech entitách, jejichš třídy jsou anotované {@link Indexed} a
* property {@link Field}
*
* @param word vyhledávaný výraz
* @return list odpovídajících entit
*/
public List<?> globalSearch(String word);
}
@@ -0,0 +1,154 @@
package info.bukova.isspst.services.fulltext;
import info.bukova.isspst.ModuleUtils;
import info.bukova.isspst.dao.QueryDao;
import info.bukova.isspst.data.BaseData;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.ModuleNotActiveException;
import info.bukova.isspst.sort.ReflectionTools;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.hibernate.Hibernate;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FullTextServiceImpl implements FullTextService {
@Autowired
private QueryDao queryDao;
private List<Class<?>> classesForSearch;
private Map<Class<?>, String[]> fields;
private List<Class<?>> nestedClasses;
public FullTextServiceImpl() {
nestedClasses = new ArrayList<Class<?>>();
nestedClasses.add(User.class);
nestedClasses.add(BaseData.class);
}
@Override
@Transactional
public void reindex() {
Logger logger = LoggerFactory.getLogger(FullTextServiceImpl.class);
logger.info("Indexing database for fulltext search");
FullTextSession ftSession = Search.getFullTextSession(queryDao.getSession());
ftSession.createIndexer().start();
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_SEARCH')")
public List<?> search(Class<?> entityClass, String[] fields, String word) {
checkActivity();
FullTextSession session = Search.getFullTextSession(queryDao.getSession());
QueryBuilder qb = session.getSearchFactory().buildQueryBuilder().forEntity(entityClass).get();
Query luceneQuery = qb.keyword().onFields(fields).matching(word).createQuery();
FullTextQuery hiberQuery = session.createFullTextQuery(luceneQuery, entityClass);
hiberQuery.setSort(Sort.RELEVANCE);
return hiberQuery.list();
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_SEARCH')")
public List<?> globalSearch(String word) {
checkActivity();
List<Object> result = new ArrayList<Object>();
for (Class<?> clazz : classesForSearch()) {
result.addAll(search(clazz, fields.get(clazz), word));
}
for (Object o : result) {
BaseData data = (BaseData) o;
Hibernate.initialize(data.getModifiedBy());
Hibernate.initialize(data.getOwnedBy());
}
return result;
}
private void checkActivity() {
if (!ModuleUtils.getModule(this.getClass()).isActive()) {
throw new ModuleNotActiveException();
}
}
private List<Class<?>> classesForSearch() {
if (classesForSearch != null) {
return classesForSearch;
}
classesForSearch = new ArrayList<Class<?>>();
fields = new HashMap<Class<?>, String[]>();
FullTextSession session = Search.getFullTextSession(queryDao.getSession());
for (Class<?> clazz : session.getSearchFactory().getIndexedTypes()) {
if (nestedClasses.contains(clazz)) {
continue;
}
classesForSearch.add(clazz);
fields.put(clazz, fields(clazz, ""));
}
return classesForSearch;
}
private String[] fields(Class<?> clazz, String prefix) {
List<String> res = new ArrayList<String>();
for (Field field : ReflectionTools.getFields(clazz)) {
for (Annotation a : field.getDeclaredAnnotations()) {
if (a instanceof org.hibernate.search.annotations.Field) {
res.add(prefix + field.getName());
}
if (a instanceof IndexedEmbedded) {
Class<?> fieldClass;
fieldClass = field.getType();
if (fieldClass.isAssignableFrom(List.class)) {
ParameterizedType type = (ParameterizedType) field.getGenericType();
Type[] types = type.getActualTypeArguments();
if (types.length == 1) {
fieldClass = (Class<?>)types[0];
}
}
classesForSearch.remove(fieldClass);
fields.remove(fieldClass);
nestedClasses.add(fieldClass);
String nestedPrefix = prefix + field.getName() + ".";
res.addAll(Arrays.asList(fields(fieldClass, nestedPrefix)));
}
}
}
String resArray[] = new String[res.size()];
resArray = res.toArray(resArray);
return resArray;
}
}
@@ -0,0 +1,24 @@
package info.bukova.isspst.services.fulltext;
import org.odftoolkit.simple.Document;
import org.odftoolkit.simple.common.TextExtractor;
import java.io.InputStream;
/**
* @author Pepa Rokos
*/
public class OdfExtractor extends AbstractExtractor implements Extractor {
@Override
public String extract(InputStream is) throws ExtractorException {
try {
Document odfDocument = Document.loadDocument(is);
TextExtractor extractor = TextExtractor.newOdfTextExtractor(odfDocument.getContentRoot());
return extractor.getText();
} catch (Exception e) {
throw new ExtractorException(e);
}
}
}
@@ -0,0 +1,32 @@
package info.bukova.isspst.services.fulltext;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.parser.PdfTextExtractor;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Pepa Rokos
*/
public class PdfExtractor extends AbstractExtractor implements Extractor {
@Override
public String extract(InputStream is) throws ExtractorException {
try {
PdfReader reader = new PdfReader(is);
PdfTextExtractor extractor = new PdfTextExtractor(reader);
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
sb.append(extractor.getTextFromPage(i));
}
return sb.toString();
} catch (IOException e) {
throw new ExtractorException(e);
}
}
}
@@ -0,0 +1,20 @@
package info.bukova.isspst.services.fulltext;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Pepa Rokos
*/
public class PowerPointExtractor extends AbstractOfficeExtractor implements Extractor {
@Override
protected POIXMLTextExtractor createExtractor(InputStream is) throws IOException {
return new XSLFPowerPointExtractor(new XMLSlideShow(is));
}
}
@@ -0,0 +1,19 @@
package info.bukova.isspst.services.fulltext;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Pepa Rokos
*/
public class WordExtractor extends AbstractOfficeExtractor implements Extractor {
@Override
protected POIXMLTextExtractor createExtractor(InputStream is) throws IOException {
return new XWPFWordExtractor(new XWPFDocument(is));
}
}
@@ -0,0 +1,23 @@
package info.bukova.isspst.services.invoicing;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.Service;
import java.math.BigDecimal;
import java.util.List;
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);
public List<Invoicing> getPendingList();
public List<Invoicing> getArchiveList();
}
@@ -0,0 +1,95 @@
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 java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
public class InvoicingServiceImpl extends AbstractOwnedService<Invoicing> implements
InvoicingService {
@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);
}
@SuppressWarnings("unchecked")
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_READ')")
public List<Invoicing> getAll() {
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy order by rq.numser");
return q.list();
}
@Transactional
@LazyLoader("form")
public void loadOwnedBy(Invoicing invoice) {
Invoicing inv = getById(invoice.getId());
Hibernate.initialize(inv.getRequirement().getOwnedBy());
invoice.getRequirement().setOwnedBy(inv.getRequirement().getOwnedBy());
}
@SuppressWarnings("unchecked")
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_READ')")
public List<Invoicing> getPendingList()
{
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy where (inv.completed Is Null or inv.completed = false) order by rq.numser");
return q.list();
}
@SuppressWarnings("unchecked")
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_READ')")
public List<Invoicing> getArchiveList()
{
Query q = dao.getQuery("select inv from Invoicing as inv join fetch inv.requirement rq join fetch rq.ownedBy where inv.completed = true order by rq.numser");
return q.list();
}
}
@@ -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,9 +1,13 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.Constants;
import info.bukova.isspst.Module;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.data.RequirementItem;
import info.bukova.isspst.data.RequirementState;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportType;
import info.bukova.isspst.services.AbstractService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
@@ -34,9 +38,14 @@ 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)");
q.setParameterList("wgList", 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>();
@@ -47,7 +56,30 @@ public class ApprovedServiceImpl extends AbstractService<JoinedItem> implements
items.add(new JoinedItem(it, it.getRequirement().getWorkgroup(), it.getRequirement().getCentre(), it.getRequirement().getOwnedBy()));
}
return items;
}
@Override
public Module getModule() {
for (Module m : Constants.MODULES) {
if (m.getId() == Constants.MOD_REQUIREMENTS) {
return m;
}
}
return null;
}
@Override
public List<Report> getReports() {
Report rep = new Report();
rep.setType(ReportType.DYNAMIC);
rep.setName(Constants.DYNAMIC_REPORT_NAME);
List<Report> ret = new ArrayList<Report>();
ret.add(rep);
return ret;
}
}
@@ -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,7 @@ public interface OrderService extends Service<Order> {
public BigDecimal calcSumTotalFromItems(List<OrderItem> items);
public void addApprovedItems(Order order, boolean orderedChanged);
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;
@@ -23,7 +25,10 @@ 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,57 @@ public class OrderServiceImpl extends AbstractOwnedService<Order> implements
return sumTotal;
}
protected void setApprovedItems(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);
}
}
}
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
public void addApprovedItems(Order order, boolean orderedChanged)
{
this.add(order);
this.setApprovedItems(order, orderedChanged);
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_EDIT') or hasPermission(#entity, this.getUpdateEntityPermission())")
public void updateApprovedItems(Order order, boolean orderedChanged)
{
this.setApprovedItems(order, orderedChanged);
super.update(order);
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_DELETE') or hasPermission(#entity, this.getDeleteEntityPermission())")
public void delete(Order order) {
for (OrderItem item : order.getItems())
{
RequirementItem rItem = item.getReqItem();
if (rItem != null)
{
rItem.setOrderNum(null);
requirementItemDao.modify(rItem);
}
}
super.delete(order);
}
}
@@ -0,0 +1,24 @@
package info.bukova.isspst.services.requirement;
import info.bukova.isspst.services.IsspstException;
/**
* @author Pepa Rokos
*/
public class ApproveException extends IsspstException {
/**
*
*/
private static final long serialVersionUID = -3794779381621324848L;
public ApproveException() {
super();
}
public ApproveException(String message) {
super(message);
this.setReason(message);
}
}
@@ -38,9 +38,8 @@ public class ReqMaterialServiceImpl extends RequirementServiceImpl implements Re
@PreAuthorize("hasPermission(this, 'PERM_READ')")
public List<Requirement> getMy()
{
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner and state != :state and kind = :kind");
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner and kind = :kind");
q.setParameter("owner", getLoggedInUser());
q.setParameter("state", RequirementState.APPROVED);
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
return q.list();
}
@@ -53,9 +52,8 @@ public class ReqMaterialServiceImpl extends RequirementServiceImpl implements Re
public List<Requirement> getCentreReq()
{
List<Workgroup> wgList = workgroupService.getUserCentres(getLoggedInUser());
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where tr.state != :state and c in (:wgList) and kind = :kind order by tr.numser");
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where c in (:wgList) and kind = :kind order by tr.numser");
q.setParameterList("wgList", wgList);
q.setParameter("state", RequirementState.APPROVED);
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
return q.list();
}
@@ -70,9 +68,8 @@ public class ReqMaterialServiceImpl extends RequirementServiceImpl implements Re
List<Workgroup> wgList = workgroupService.getUserWorkgroups(getLoggedInUser());
Query q = dao.getQuery("select tr from "
+ dao.getEntityName()
+ " tr join fetch tr.ownedBy join tr.workgroup w where tr.state != :state and w in (:wgList) and kind = :kind order by tr.numser");
+ " tr join fetch tr.ownedBy join tr.workgroup w where w in (:wgList) and kind = :kind order by tr.numser");
q.setParameterList("wgList", wgList);
q.setParameter("state", RequirementState.APPROVED);
q.setParameter("kind", Constants.REQ_TYPE_MATERIAL);
return q.list();
}
@@ -38,9 +38,8 @@ public class ReqServicesServiceImpl extends RequirementServiceImpl implements Re
@PreAuthorize("hasPermission(this, 'PERM_READ')")
public List<Requirement> getMy()
{
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner and state != :state and kind = :kind");
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner and kind = :kind");
q.setParameter("owner", getLoggedInUser());
q.setParameter("state", RequirementState.APPROVED);
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
return q.list();
}
@@ -53,9 +52,8 @@ public class ReqServicesServiceImpl extends RequirementServiceImpl implements Re
public List<Requirement> getCentreReq()
{
List<Workgroup> wgList = workgroupService.getUserCentres(getLoggedInUser());
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where tr.state != :state and c in (:wgList) and kind = :kind order by tr.numser");
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where c in (:wgList) and kind = :kind order by tr.numser");
q.setParameterList("wgList", wgList);
q.setParameter("state", RequirementState.APPROVED);
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
return q.list();
}
@@ -70,9 +68,8 @@ public class ReqServicesServiceImpl extends RequirementServiceImpl implements Re
List<Workgroup> wgList = workgroupService.getUserWorkgroups(getLoggedInUser());
Query q = dao.getQuery("select tr from "
+ dao.getEntityName()
+ " tr join fetch tr.ownedBy join tr.workgroup w where tr.state != :state and w in (:wgList) and kind = :kind order by tr.numser");
+ " tr join fetch tr.ownedBy join tr.workgroup w where w in (:wgList) and kind = :kind order by tr.numser");
q.setParameterList("wgList", wgList);
q.setParameter("state", RequirementState.APPROVED);
q.setParameter("kind", Constants.REQ_TYPE_SERVICES);
return q.list();
}
@@ -4,8 +4,17 @@ import info.bukova.isspst.data.RequirementBase;
import info.bukova.isspst.data.User;
import info.bukova.isspst.services.Service;
import java.util.Date;
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>
{
@@ -13,6 +22,7 @@ public interface RequirementBaseService<T extends RequirementBase> extends Servi
public void loadType(T data);
public void loadWorkflow(T data);
public void approve(T entity);
public void approve(T entity, Date approveDate);
public boolean canApprove(T entity);
public List<User> getNextApprover(T entity);
@@ -18,11 +18,6 @@ import info.bukova.isspst.services.LazyLoader;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.LazyInitializationException;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +25,18 @@ import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author Pepa Rokos
* @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 +75,7 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
super.add(entity);
this.sendToApprovers(entity);
this.postAdd(entity);
}
private void checkEnable() {
@@ -92,6 +99,14 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
}
}
protected void postAdd(T entity) {
if (canApprove(entity)) {
approve(entity);
} else {
this.sendToApprovers(entity);
}
}
protected void addWorkflow(T entity) {
if (entity.getType() == null) {
return;
@@ -199,39 +214,45 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
}
}
protected void approve(T entity, User user) {
protected void approve(T entity, User user, Date approveDate) {
T e = (T) dao.getById(entity.getId());
if (e.getReqDate().getTime() > approveDate.getTime()) {
throw new ApproveException("ErrApproveBeforeRequirement");
}
if (e.getLastApproveDate() != null && e.getLastApproveDate().getTime() > approveDate.getTime()) {
throw new ApproveException("ErrAppreveBeforeLastApprove");
}
Workflow wf = getNextWorkflow(e);
if (wf == null) {
return;
}
Role role = wf.getRole();
AuthItem auth = new AuthItem();
auth.setApprover(user);
auth.setRole(role);
auth.setAuthDate(new Date());
auth.setAuthDate(approveDate);
e.getAuthorization().add(auth);
if (getNextWorkflow(e) == null) {
e.setState(RequirementState.APPROVED);
} else {
e.setState(RequirementState.PARTIALLY);
}
entity.setState(e.getState());
entity.getAuthorization().add(auth);
super.update(e);
if (!autoApprove(entity)) {
if (!autoApprove(e, approveDate)) {
this.sendToApprovers(e);
SettingsData settings = settingsService.getSettings();
MailMessage message = null;
if (e.getOwnedBy().getEmail() != null
if (e.getOwnedBy().getEmail() != null
&& !e.getOwnedBy().getEmail().isEmpty()
&& e.getOwnedBy().isNotify()) {
if (e.getState() == RequirementState.APPROVED && settings.getConfReqTemplate() != null) {
@@ -239,14 +260,20 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
} else if (settings.getAuthReqTemplate() != null) {
message = messageBuilder.buildMessage(settings.getAuthReqTemplate(), e);
}
if (message != null) {
message.setFrom(getLoggedInUser().getEmail());
message.setTo(e.getOwnedBy().getEmail());
mailer.send(message);
mailer.send(message);
}
}
}
postApprove(e);
}
protected void approve(T entity, User user) {
approve(entity, user, new Date());
}
@Override
@@ -255,10 +282,33 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
public void approve(T entity) {
approve(entity, getLoggedInUser());
}
protected boolean autoApprove(T entity) {
@Override
@Transactional
@PreAuthorize("this.canApprove(#entity)")
public void approve(T entity, Date approveDate) {
approve(entity, getLoggedInUser(), approveDate);
}
/**
* 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
* @param approveDate
* @return true pokud se provedlo automatické schválení.
*/
protected boolean autoApprove(T entity, Date approveDate) {
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
@@ -307,9 +357,8 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
@PreAuthorize("hasPermission(this, 'PERM_READ')")
public List<T> getMy()
{
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner and state != :state");
Query q = dao.getQuery("from " + dao.getEntityName() + " where ownedBy = :owner");
q.setParameter("owner", getLoggedInUser());
q.setParameter("state", RequirementState.APPROVED);
return q.list();
}
@@ -321,9 +370,8 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
public List<T> getCentreReq()
{
List<Workgroup> wgList = workgroupService.getUserCentres(getLoggedInUser());
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where tr.state != :state and c in (:wgList) order by tr.numser");
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.centre c where c in (:wgList) order by tr.numser");
q.setParameterList("wgList", wgList);
q.setParameter("state", RequirementState.APPROVED);
return q.list();
}
@@ -335,9 +383,8 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
public List<T> getWorkgroupReq()
{
List<Workgroup> wgList = workgroupService.getUserWorkgroups(getLoggedInUser());
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.workgroup w where tr.state != :state and w in (:wgList) order by tr.numser");
Query q = dao.getQuery("select tr from " + dao.getEntityName() + " tr join fetch tr.ownedBy join tr.workgroup w where w in (:wgList) order by tr.numser");
q.setParameterList("wgList", wgList);
q.setParameter("state", RequirementState.APPROVED);
return q.list();
}
@@ -355,5 +402,10 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
public String getUpdateEntityPermission() {
return Constants.PERM_EDIT_NEW;
}
@Override
public String getDeleteEntityPermission() {
return Constants.PERM_DELETE_NEW;
}
}
@@ -6,9 +6,18 @@ 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);
@@ -17,4 +26,6 @@ public interface RequirementService extends RequirementBaseService<Requirement>
public RequirementItem calcItemValuesFromItemTotal(RequirementItem item);
public BigDecimal calcSumTotalFromItems(List<RequirementItem> items);
public BigDecimal getInvoicedAmount(Requirement req);
}
@@ -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 org.hibernate.Hibernate;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
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()
@@ -38,7 +47,7 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
}
@Override
protected boolean autoApprove(Requirement entity)
protected boolean autoApprove(Requirement entity, Date approveDate)
{
List<User> approvers = this.getNextApprover(entity);
Workflow nextWf = this.getNextWorkflow(entity);
@@ -48,9 +57,10 @@ 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));
approve(entity, approvers.get(0), approveDate);
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)
{
@@ -135,6 +145,19 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
// materiálů a služeb konzistentní
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,24 @@ 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);
}
}
@Override
@Transactional
public BigDecimal getInvoicedAmount(Requirement req) {
Query query = dao.getQuery("select invoice from Invoicing invoice join invoice.requirement rq where rq.id = :reqId");
query.setParameter("reqId", req.getId());
Invoicing inv = (Invoicing) query.uniqueResult();
return inv != null ? inv.getTotalInvoiced() : null;
}
}
@@ -1,10 +1,23 @@
package info.bukova.isspst.services.requirement;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripRequirement;
import java.util.List;
public interface TripRequirementService extends RequirementBaseService<TripRequirement>
{
public void loadPassangers(TripRequirement entity);
public TripBill getTripBill(TripRequirement requirement);
/**
* Vrátí seznam vyúčtování, která josu vázána k požadavku
*
* @param entity požadavek
* @return seznam vyúčtování
*/
public List<TripBill> getBills(TripRequirement entity);
}
@@ -4,27 +4,44 @@ import info.bukova.isspst.Constants;
import info.bukova.isspst.data.NumberSeries;
import info.bukova.isspst.data.RequirementState;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripBillApproval;
import info.bukova.isspst.data.TripRequirement;
import info.bukova.isspst.data.User;
import info.bukova.isspst.mail.MailMessage;
import info.bukova.isspst.mail.Mailer;
import info.bukova.isspst.mail.MessageBuilder;
import info.bukova.isspst.services.LazyLoader;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.tripbill.TripBillApprovalService;
import info.bukova.isspst.services.tripbill.TripBillService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import java.util.Date;
import info.bukova.isspst.services.users.UserService;
import org.hibernate.Hibernate;
import org.hibernate.LazyInitializationException;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripRequirement>
implements TripRequirementService, RequirementBaseService<TripRequirement> {
@Autowired
private RequirementTypeService reqTypeService;
@Autowired
private WorkgroupService workgroupService;
@Autowired
private TripBillService tripBillService;
@Autowired
private TripBillApprovalService tripBillApprovalService;
@Autowired
private Mailer mailer;
@Autowired
private MessageBuilder messageBuilder;
@Autowired
private GlobalSettingsService settingsService;
@Autowired
private UserService userService;
@Override
protected TripRequirement createEntity() {
@@ -36,6 +53,30 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
return tr;
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_EDIT') or hasPermission(#entity, this.getUpdateEntityPermission())")
public void update(TripRequirement entity) {
super.update(entity);
if (entity.getState() == RequirementState.APPROVED) {
for (TripBill bill : getBills(entity)) {
TripBill newBill = tripBillService.createTripBill(entity);
bill.getBillItems().clear();
bill.getBillItems().addAll(newBill.getBillItems());
TripBillApproval approval = bill.getApproval();
if (approval != null) {
tripBillApprovalService.delete(approval);
}
bill.setApproval(null);
tripBillService.calculate(bill);
tripBillService.update(bill);
}
}
}
@Override
@Transactional
@LazyLoader("form")
@@ -55,15 +96,59 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
@Override
@Transactional
@PreAuthorize("this.canApprove(#entity)")
public void approve(TripRequirement entity) {
super.approve(entity);
public TripBill getTripBill(TripRequirement requirement) {
Query q = dao.getQuery("from TripBill tb where tb.requirement = :req");
q.setParameter("req", requirement);
List<TripBill> result = q.list();
if (result.size() > 0) {
return result.get(0);
}
return null;
}
@Override
@Transactional
public List<TripBill> getBills(TripRequirement entity) {
Query q = queryDao.getQuery("from TripBill bill where bill.requirement = :req");
q.setParameter("req", entity);
return q.list();
}
@Transactional
@LazyLoader("form")
public void loadAttachments(TripRequirement entity) {
TripRequirement e = dao.getById(entity.getId());
Hibernate.initialize(e.getAttachedFiles());
entity.setAttachedFiles(e.getAttachedFiles());
}
@Override
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);
if (entity.getBillForPassengers() != null && entity.getBillForPassengers()) {
for (User u : entity.getPassengers()) {
if (!u.equals(entity.getOwnedBy())) {
TripBill passBill = tripBillService.createPassengersBill(entity);
tripBillService.add(passBill);
passBill.setOwnedBy(u);
tripBillService.update(passBill);
}
}
if (!entity.getPassengers().isEmpty() && settingsService.getSettings().getConfReqTripPassenger() != null) {
MailMessage message = messageBuilder.buildMessage(settingsService.getSettings().getConfReqTripPassenger(), entity);
message.setFrom(userService.getCurrent().getEmail());
message.setTo(userService.getEmailsForSend(entity.getPassengers()));
mailer.send(message);
}
}
}
}
@@ -0,0 +1,14 @@
package info.bukova.isspst.services.tripbill;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripBillApproval;
import info.bukova.isspst.services.requirement.RequirementBaseService;
/**
* @author Pepa Rokos
*/
public interface TripBillApprovalService extends RequirementBaseService<TripBillApproval> {
public TripBillApproval createApproval(TripBill bill);
}

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