353 Commits

Author SHA1 Message Date
701e3c9cf6 remove sql debug output. Closes #125 2020-06-29 09:47:38 +02:00
e320f5b02b Merge pull request 'Cleanup. closes #75' (#131) from feature/rename into master
Reviewed-on: #131
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-26 10:09:39 +02:00
5aca84c43b delete old files. Cleanup repo 2020-06-26 10:06:41 +02:00
5b483d5c5d rename prototype folder -> web_backend. closes #75 2020-06-26 10:00:05 +02:00
037f1ff671 Merge pull request 'revisit ShoppingCart' (#130) from feature/revisit_shopping_cart into master
Reviewed-on: #130
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-26 09:52:11 +02:00
99896a4f77 revisit ShoppingCart 2020-06-25 16:52:13 +02:00
624ade2032 Merge pull request 'Set Default Payment on first order' (#128) from feature/update_credit_card_on_order into master
Reviewed-on: #128
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-25 12:40:19 +02:00
99b123565c Merge pull request 'Show all articles if no term is provided. fixes #127' (#129) from feature/fix_seatch_showing_err into master
Reviewed-on: #129
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-25 12:39:33 +02:00
be6de240bb fix encoding err in supplier cfg 2020-06-25 12:13:47 +02:00
7cf1819460 add session timeout 2020-06-25 12:10:38 +02:00
17f0c645f1 Show all articles if no term is provided. fixes #127 2020-06-25 11:52:27 +02:00
bdd1017232 Set Default Payment on first order 2020-06-25 11:46:01 +02:00
f4299c33c1 Merge pull request 'feature/email_validation_fe' (#126) from feature/email_validation_fe into master
Reviewed-on: #126
Reviewed-by: Lukas <lukas@xn--frderer-n2a.de>
2020-06-25 11:23:44 +02:00
f86a14b2f8 Fix Email pattern, disallow whitespace 2020-06-25 11:16:54 +02:00
2fb5826a3b Validate Email in FE 2020-06-25 11:10:20 +02:00
b993700ae4 Merge pull request 'feature/employee_login_defaults' (#124) from feature/employee_login_defaults into master
Reviewed-on: #124
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 19:00:36 +02:00
5d506a1526 Merge pull request 'Fix display order in various locations. closes #120' (#121) from feateure/display_order_intern into master
Reviewed-on: #121
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 18:59:14 +02:00
e87d0d8cdd Merge pull request 'feature/optimize_create_order_whbookings' (#117) from feature/optimize_create_order_whbookings into master
Reviewed-on: #117
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 18:57:45 +02:00
fb222c9213 Merge branch 'master' into feature/employee_login_defaults 2020-06-24 18:57:05 +02:00
cf9ab66e68 Hide /intern/ link if non employee. closes #76 2020-06-24 18:40:57 +02:00
cdc372d574 Redirect to intern if employee. 2020-06-24 18:40:22 +02:00
2290f01a8f Merge pull request 'feature/fix_delivery_api' (#116) from feature/fix_delivery_api into master
Reviewed-on: #116
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 18:38:03 +02:00
3bc0996c73 Merge pull request 'Add & generate tracking information to (Supplier-)OrderConfirmation. Fixes #110' (#114) from feature/supplier_tracking into master
Reviewed-on: #114
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 18:37:15 +02:00
758c6810ab Merge pull request 'Clean Shopping Cart on Logout' (#123) from feature/clean_shopping_on_logout into master
Reviewed-on: #123
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 18:27:24 +02:00
577a4f72f0 Clean Shopping Cart on Logout for real 2020-06-24 18:25:42 +02:00
a2aca7a8ca Clean Shopping Cart on Logout 2020-06-24 18:23:01 +02:00
3b7317a831 Fix typo 7 2020-06-24 18:19:14 +02:00
32921a3f87 Merge pull request 'Remove WarehouseBookingReason it was not used.' (#115) from feature/remove_unused_warehouse_booking_reason into master
Reviewed-on: #115
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 15:03:47 +02:00
63e9bc2336 Merge pull request 'Fix in stock calculation. closes #118' (#119) from feature/display_article_shop_in_stock into master
Reviewed-on: #119
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 15:03:04 +02:00
31bff55a20 Merge pull request 'Show advertisements distinct.' (#122) from feature/show_ads_distinct into master
Reviewed-on: #122
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-24 14:59:50 +02:00
5861b61565 Merge branch 'master' into feature/supplier_tracking 2020-06-24 10:44:38 +02:00
f0c9823e45 Clearify Inventory view with text. 2020-06-24 09:53:19 +02:00
6fbb16fea2 Show advertisements distinct. 2020-06-24 02:20:24 +02:00
0d547c8903 Fix display order in various locations. closes #120 2020-06-24 02:15:31 +02:00
5162e3fc19 Fix in stock calculation. closes #118 2020-06-24 02:05:25 +02:00
8bfe8b37f5 Maybe Fix warehouse booking repo 2020-06-24 02:00:37 +02:00
2e07d03908 Fix warehouse bookings on CreateOrderAction 2020-06-24 01:48:33 +02:00
b9e87f5bd4 Add additional infos for order history in /user/... fixes #109 2020-06-24 01:19:37 +02:00
cd641d6cc4 Fix #113 by fixing initialization of RestServiceForDelivery. 2020-06-24 01:18:16 +02:00
4e9f7800be Remove WarehouseBookingReason it was not used. 2020-06-24 00:42:55 +02:00
8d27c486d5 Add & generate tracking information to (Supplier-)OrderConfirmation. Fixes #110 2020-06-24 00:37:58 +02:00
714ac4f1de Fix issues with class loading in Cronjobs 2020-06-24 00:35:18 +02:00
186db31b17 Merge pull request 'Fix showing CustomerOrder all CustomerOrders in my orders. fix displaying orders in random order' (#108) from feature/fix_show_orders into master
reviewed by Lukas
2020-06-21 22:22:53 +02:00
fb53c68be3 Merge pull request 'implement Config for Supplier and Delivery Service' (#107) from feature/reading_config into master
reviewed by Lukas
2020-06-21 22:22:43 +02:00
19cf6ccfc5 Merge pull request 'Implement Supplier AutoSupplierPayment. closes #100' (#105) from feature/supplier_auto_payment into master 2020-06-21 22:13:41 +02:00
7fafd14715 Fix variable name 2020-06-21 19:01:25 +02:00
d5181f149a Fix showing CustomerOrder all CustomerOrders in my orders. fix displaying orders in random order 2020-06-21 18:58:15 +02:00
a950ecb2b9 Make delivery/gradlew executable 2020-06-21 18:42:33 +02:00
f42a50d24d fix CustomerOrder find by order 2020-06-21 18:32:04 +02:00
33118ddb2f Mark lost delivery as delivered. #spaghetticode 2020-06-21 18:25:33 +02:00
a6a2adc7db implement Config for Supplier and Delivery Service 2020-06-21 16:49:35 +02:00
62df2346c3 fix template crashing when defaultAddr == null 2020-06-21 16:28:00 +02:00
c1a0ecdcf3 fix delivery server crashing when tracking id not found 2020-06-21 16:13:48 +02:00
a1abbf5329 Implement Supplier AutoSupplierPayment. closes #100 2020-06-21 15:50:27 +02:00
deaf283a98 remove db blob 2020-06-21 01:08:58 +02:00
ffe9af0633 Prevent duplicate Articles from ArticleOffer 2020-06-21 01:07:04 +02:00
2989b54593 Merge pull request 'fix_change_user_name' (#104) from fix_change_user_name into master 2020-06-21 00:15:57 +02:00
b846b919b7 code clean up 2020-06-21 00:14:00 +02:00
1f83a82f17 removed user.name and use user.defaultDeliveryAddress.name instead 2020-06-21 00:13:10 +02:00
cd1a8568e6 show only one entry per article suggestions fix #96 2020-06-21 00:06:15 +02:00
53cdb20091 Merge pull request 'Fix the warehouse diagrams on the dashboard' (#103) from fix/dashboard_warehouse_statistics into master 2020-06-21 00:02:50 +02:00
9389675b5c Do not show dupliactes in category search. fixes #85 2020-06-21 00:01:28 +02:00
97a7f3a8ad Fix the warehouse diagrams on the dashboard
- Show the correct utilization
- Display values as correct percentages

Closes #99
2020-06-20 23:54:33 +02:00
aa2f42a10a Add password restrictions fixes #91 2020-06-20 23:47:53 +02:00
f128a8b9ed Make reason for manuel booking required. fixes #90 2020-06-20 23:35:56 +02:00
ffea25c082 Merge pull request 'Fix bad query for article slot sum' (#102) from feature/89_fix_lagerstand into master 2020-06-20 23:30:12 +02:00
d77b8c046a Fix bad query for article slot sum 2020-06-20 23:24:06 +02:00
8fdfe9cc69 Catch failing delivery server 2020-06-20 22:51:18 +02:00
e5332a3348 Fix String -> UUIDs -> String in method causing crash 2020-06-20 22:25:52 +02:00
c3eaf5ac11 Remove unused db fields 2020-06-20 22:10:53 +02:00
fa75beb9c4 Fix 6284a4d7bf altering template 2020-06-20 22:09:25 +02:00
4bef17dc0a Merge pull request 'feature/dashboard' (#83) from feature/dashboard into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-19 14:12:44 +02:00
79e4986880 delete blank line 2020-06-19 14:11:32 +02:00
181a09e16b Merge pull request 'feature/config' (#78) from feature/config into master
Reviewed-by: CodeSteak <codesteak@shellf.art>
2020-06-18 14:09:46 +02:00
f4aae9c581 ignore config.yml 2020-06-18 14:07:59 +02:00
ea0c8c45d6 rename eCommerce_config.yml to config.yml
* if no config file is present, create a default config file
2020-06-18 14:04:54 +02:00
8416783e0a merged 2020-06-18 01:13:03 +02:00
bcbebe8e8d master merged into feature/customer_orders 2020-06-18 01:11:11 +02:00
a570696795 feature/customer_orders merged into master 2020-06-18 01:07:11 +02:00
187656814e String Error -> Enum ErrorHandling Logic removed from model class 2020-06-18 00:50:43 +02:00
8c0652b26b exit if the settings file has not been found
* use a final variable for the settings file name
2020-06-17 22:32:48 +02:00
ef07447abc fix json-file 2020-06-17 20:42:08 +02:00
bb7b35dc28 Increase the amount of commits 2020-06-17 19:00:49 +02:00
93cfbb4a27 Merge remote-tracking branch 'origin/master' 2020-06-17 18:59:10 +02:00
68cc35cec3 Fix typo 6 2020-06-17 18:57:42 +02:00
b2ee048f25 Fix typo 5 2020-06-17 18:57:23 +02:00
020a30474e Fix typo 4 2020-06-17 18:56:32 +02:00
4bfc8a2cc6 Fix typo 3 2020-06-17 18:56:02 +02:00
0ff873baaa Fix typo 2 2020-06-17 18:55:50 +02:00
1812c89994 Fix typo 2020-06-17 18:55:29 +02:00
2442a477c8 add missing "|" 2020-06-17 18:43:06 +02:00
ebb3c8c235 removes unused Imports and fomattet 2020-06-17 17:23:29 +02:00
e6c068e71a Secretly fix number 0 showing on 'Warenkorb' 2020-06-17 00:23:05 +02:00
86e3ced19b Secretly fix searchbar not showing term when searching 2020-06-17 00:17:50 +02:00
44df9e4b4f Secretly add Favicon 2020-06-17 00:11:55 +02:00
18cbfbf148 Fix template strings with a starting "/" 2020-06-17 00:02:46 +02:00
e037b75f7c Merge pull request 'fix creditcard num not being set leading to crash' (#82) from feature/80_fix_creditcardnum_null_usersettings into master 2020-06-16 23:51:25 +02:00
486f237135 fix creditcard num not being set leading to crash 2020-06-16 23:50:10 +02:00
396d3fda14 Merge pull request 'Fix not creating directory when uploading file' (#80) from feature/fix_uploading_images into master 2020-06-16 23:40:12 +02:00
3b1d378968 Fix not creating directory when uploading file 2020-06-16 23:38:35 +02:00
5a0b303601 Merge branch 'master' into feature/config 2020-06-16 20:44:10 +02:00
d5825ba7a0 use @Autowired to get AppSettings Object 2020-06-16 20:42:40 +02:00
8199bd8a23 Merge pull request 'Allow employees to trigger cronjobs manually' (#74) from feature/manual_cronjobs into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-16 19:29:38 +02:00
774e62f892 add suppliers to YAMLData, store data in AppSettings() 2020-06-16 19:19:58 +02:00
e1c00eca8f fix ApplicationSettings.readConfig() 2020-06-16 18:52:33 +02:00
e904eba7a4 Merge remote-tracking branch 'origin/feature/manual_cronjobs' into feature/dashboard
Butfixes
2020-06-15 21:41:54 +02:00
6284a4d7bf Dashboard working 2020-06-15 17:47:55 +02:00
3b364ae815 Allow employees to trigger cronjobs manually 2020-06-15 16:23:42 +02:00
2ba4968556 Merge pull request 'feature/create_admin' (#73) from feature/create_admin into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-15 11:18:59 +02:00
18f35c43e7 remove spaces 2020-06-15 10:46:04 +02:00
709c80fa37 add fist admin user after start 2020-06-15 10:43:16 +02:00
87bade71b4 Dateien hochladen nach „supplier/config“ 2020-06-15 10:20:40 +02:00
b6eb66e348 Dateien hochladen nach „supplier/config“ 2020-06-15 10:19:16 +02:00
0a7722d612 removed register user type and ad 2020-06-15 09:40:32 +02:00
d121532fba Merge remote-tracking branch 'origin/master' into feature/config 2020-06-14 21:15:37 +02:00
985169117d fix nullpointer in settings 2020-06-14 18:19:59 +02:00
fa610cae3b if no orders show hint 2020-06-14 17:56:09 +02:00
3bb3c5b513 [HOTFIX] of HOTFIX: Use CanonicalPath for check 2020-06-14 16:51:59 +02:00
15616e05f3 [HOTFIX] Prevent path directory traversal attack for deploy 2020-06-14 15:54:56 +02:00
0ab185f143 impl trackingID for the UserController 2020-06-13 21:59:18 +02:00
1dd4b5cfa5 del update query and impl error for trackigID 2020-06-13 20:05:22 +02:00
266bba095a merged feature/customer_orders with master 2020-06-13 19:58:30 +02:00
fa7bdf2f7e impl error handling 2020-06-13 19:37:34 +02:00
76550be9e7 Merge pull request 'Allow partial discount on supplier orders' (#68) from fix/discount_calculation_in_supplier_service into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-13 12:21:26 +02:00
ef8aa826a3 Merge pull request 'Fix the cash booking sum on customer order' (#67) from fix/wrong_bookings_on_customer_order into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-13 12:19:18 +02:00
114453b5b9 Merge pull request 'Implement Arrival of Supplier Order.' (#62) from feature/supplier_order_arrived_button into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-13 11:59:17 +02:00
7397698929 fix check for missing article 2020-06-13 11:54:25 +02:00
9fa2c1f3a7 Allow partial discount on supplier orders
Closes #46
2020-06-13 11:46:16 +02:00
327ba182f5 Fix the cash booking sum on customer order
Closes #57
2020-06-13 11:10:20 +02:00
30226c5c19 Merge pull request 'fixes_ui' (#66) from fixes_ui into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-13 11:03:20 +02:00
e0e853a575 fixes from PR review 2020-06-13 10:41:59 +02:00
d2b98f083b Merge pull request 'fix missing cells in TODO-Warehouse. fixes #63' (#64) from feature/63_fix_todo_ui into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-13 10:26:36 +02:00
a41889b2cb login in extern loginController, RequestController cleanup, login right after register 2020-06-12 23:48:28 +02:00
0f7d248d40 add radio BTNs to register 2020-06-12 23:31:57 +02:00
11ade7b8f9 fix missing cells in TODO-Warehouse. fixes #63 2020-06-12 19:57:50 +02:00
a664b42853 Allow reuse of empty warehouse slots. Also fixes #59 2020-06-12 19:48:21 +02:00
56f4ec0dda Implement Arrival of Supplier Order. 2020-06-12 19:22:36 +02:00
1590821f64 delete bonuspoints and notifications html 2020-06-12 11:15:05 +02:00
16803d2b12 Merge pull request 'feature/customers' (#58) from feature/customers into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-12 00:52:53 +02:00
938d16301d fix stuff 2020-06-10 20:10:12 +02:00
5a59ac11b0 code cleanup 2020-06-10 19:28:12 +02:00
c194f44308 implement customers detail bookings 2020-06-10 19:28:12 +02:00
fc68e231d3 Allow the user to create manual bookings 2020-06-10 19:28:07 +02:00
6d8a36b7ac implement customers detail part 2 2020-06-10 19:27:38 +02:00
49e26039a3 implement customers detail part 1 2020-06-10 19:27:38 +02:00
28834431ce Display financial bookings in the ui 2020-06-10 19:27:38 +02:00
5691f0eeec implement customers index 2020-06-10 19:27:16 +02:00
7f643987f3 fix wrong closing tags in customerOrder/id.html 2020-06-10 19:12:34 +02:00
6b8bf25e0e Merge pull request 'feature/cash_bookings' (#55) from feature/cash_bookings into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-10 19:04:45 +02:00
ebeba72278 impl tracking ID 2020-06-10 17:03:59 +02:00
f671baf7f0 Error with package path 2020-06-10 14:51:12 +02:00
691916894f Apply some changes according to comments on the pullrequest 2020-06-10 11:48:38 +02:00
e7e2017825 Merge pull request 'Show a hyphen in supplier column if an article is not offered by anyone' (#56) from fix/null_pointer_deref_in_SupplierOfferController into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-09 14:06:51 +02:00
03d557d67b Show a hyphen in supplier column if an article is not offered by anyone
Closes #54
2020-06-08 18:56:35 +02:00
8fff0e2dca Merge remote-tracking branch 'origin/master' into feature/cash_bookings 2020-06-08 18:15:34 +02:00
6317780dfa Merge pull request 'Implement Warehouse....' (#47) from feature/intern_warehouse into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-08 13:40:10 +02:00
78a7ad053a Merge branch 'master' into feature/intern_warehouse 2020-06-08 09:22:06 +02:00
f6554629d7 Merge branch 'master' into feature/intern_warehouse 2020-06-08 09:14:50 +02:00
eb82d05f4f Use Spring model for template attributes 2020-06-08 09:14:11 +02:00
41320473d9 Merge pull request 'feature/supplier_page' (#52) from feature/supplier_page into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-07 15:00:56 +02:00
bd6be54149 removed space in SupplierOrderRepo 2020-06-07 11:45:53 +02:00
99612165f5 fixed review requests 2020-06-07 11:44:50 +02:00
9dff6adb3d rebase to master 2020-06-05 21:25:38 +02:00
445b504188 code cleanup 2020-06-05 21:20:54 +02:00
bd8b3db7f3 added post form for marking order as delivered 2020-06-05 21:18:04 +02:00
8a4ff4cfa5 added supplier bookings table 2020-06-05 21:18:04 +02:00
2245309198 added supplier balance label 2020-06-05 21:18:04 +02:00
d078c44027 finished supplier orders 2020-06-05 21:18:04 +02:00
bd8b07990b finished show orders based on supplier 2020-06-05 21:18:04 +02:00
2f4c45ed71 show orders based on supplier 2020-06-05 21:18:04 +02:00
b600040bf3 basic detail page for supplier 2020-06-05 21:18:04 +02:00
4f5e1fe185 list suppliers page 2020-06-05 21:18:04 +02:00
f348d33c94 Show the balances of the main and vat account in the dashboard 2020-06-05 19:17:44 +02:00
6f90b9c941 Fix a bug where bookings were invisible if they affected only one account 2020-06-05 18:58:16 +02:00
e53c1e0872 Allow the user to create manual bookings 2020-06-05 18:45:25 +02:00
e138476d76 code cleanup 2020-06-05 18:05:10 +02:00
c1b9588189 added post form for marking order as delivered 2020-06-05 17:37:19 +02:00
5e05100d21 added supplier bookings table 2020-06-05 15:43:46 +02:00
93a5863fbe added supplier balance label 2020-06-05 13:10:16 +02:00
7f652e38f0 fix nullpointer in category search 2020-06-05 12:32:34 +02:00
0061d25082 Display financial bookings in the ui 2020-06-05 07:49:11 +02:00
d4ddd8a9a3 Merge pull request 'feature/user' (#38) from feature/user into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-03 18:36:06 +02:00
a192f0ac51 Set Tracing Id in Warehouse/finish not in Checkout. This was wrong. 2020-06-03 16:55:36 +02:00
9660e52f34 Merge pull request 'feature/31_js_magic_article_edit' (#50) from feature/31_js_magic_article_edit into master 2020-06-02 07:47:28 +02:00
72ddfa42ef Merge pull request 'Show Tax in Article Edit View. Fixes #48' (#49) from feature/48_not_showing_tax_edit_view into master 2020-06-02 07:47:04 +02:00
fc239983a7 Fix article links. 2020-06-01 21:15:27 +02:00
5e1170839e Update Gross Price in Article Edit View. Fixes #31 2020-06-01 21:11:15 +02:00
2ef9eb29ac Show Tax in Article Edit View. Fixes #48 2020-06-01 20:46:00 +02:00
f4ba79a4cd add id's to form inputs 2020-06-01 20:27:19 +02:00
976e2d1949 Implement Warehouse....
Sry, only one commit. No time to make history ;D
2020-06-01 20:25:51 +02:00
b7134a60da rename CustomerOrderRepo in Cronjob 2020-06-01 20:25:31 +02:00
ff4c984f54 fix error message 2020-06-01 20:24:45 +02:00
21502a0b1c Merge branch 'master' into feature/user 2020-06-01 19:03:42 +02:00
b38ffdea34 Merge pull request 'feature/offered_article_supplier' (#40) from feature/offered_article_supplier into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-01 17:10:21 +02:00
6988d3f213 minor code clean up 2020-06-01 17:10:04 +02:00
f5ad05f49f Merge branch 'master' into feature/offered_article_supplier 2020-06-01 17:04:52 +02:00
e539a9433a Merge pull request 'implement better search' (#43) from feature/search into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-01 16:59:37 +02:00
b14c565e81 Merge pull request 'Store the cheapest supplier for each offered article in the database' (#41) from feature/reorder_cronjob into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-01 16:53:58 +02:00
b04d627695 Merge pull request 'check if article.image is null' (#44) from fix/image_null into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-06-01 16:51:23 +02:00
839bebcd89 trim searchterm 2020-06-01 11:58:08 +02:00
3775f96f3f implement getCustomerOrderDetail 2020-06-01 11:53:29 +02:00
2394157be8 implement getCustomerOrder 2020-06-01 11:31:12 +02:00
922e3cadef Bugfix register 2020-06-01 11:13:03 +02:00
0fb1d5704e Bufix: After register, you now logged in 2020-06-01 11:11:34 +02:00
dfa528484c Merge branch 'master' into feature/user 2020-06-01 10:57:55 +02:00
38fcda708f check if article.image is null 2020-06-01 10:53:10 +02:00
9238162a4c implement better search 2020-06-01 10:52:19 +02:00
1cb52a20d4 finished supplier orders 2020-05-30 23:32:01 +02:00
67c101ebea finished show orders based on supplier 2020-05-30 21:13:25 +02:00
657d315850 show orders based on supplier 2020-05-30 20:16:27 +02:00
e7e3864b4c Store the cheapest supplier for each offered article in the database 2020-05-30 18:25:23 +02:00
407229f15d changed cheapest supplier ref in offered article entity 2020-05-30 16:49:20 +02:00
5d7ecbdfb7 basic detail page for supplier 2020-05-30 16:43:07 +02:00
c8d3ab3ff0 list suppliers page 2020-05-30 16:16:14 +02:00
1b2e75a82c updates scripts 2020-05-30 12:29:40 +02:00
286edb33ed show supplier name at offered article page 2020-05-30 11:52:30 +02:00
1a1502b38c Merge pull request 'feature/reorder_cronjob' (#27) from feature/reorder_cronjob into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-29 16:20:04 +02:00
d55a50ab29 [supplier] update gradle to version 6.4 2020-05-29 16:18:22 +02:00
e4489ff3a6 Merge branch 'feature/supplier_api' into feature/reorder_cronjob 2020-05-29 16:13:29 +02:00
2c2b5c1d0f Add Missing Gradle Folder to Repo 2020-05-29 16:12:28 +02:00
e9a3cb51ba Merge pull request 'fix/intern_articles' (#39) from fix/intern_articles into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-28 13:23:01 +02:00
f4b0d6a576 fix html warnings [2] 2020-05-28 13:22:28 +02:00
2bf383b113 fix html warnings 2020-05-28 13:20:42 +02:00
ff5b0afc93 Merge pull request 'feature/delivery_api' (#25) from feature/delivery_api into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-28 12:19:29 +02:00
d5540c1979 Small changes according to comments on the pullrequest 2020-05-28 10:58:11 +02:00
e1df56147b Merge remote-tracking branch 'origin/master' into feature/reorder_cronjob 2020-05-28 10:39:38 +02:00
35861d3664 fixed styling for edit/add btn 2020-05-27 21:53:58 +02:00
08dc4bcb47 fixed spaces in textarea 2020-05-27 21:43:26 +02:00
a38b817f20 fixed empty input fields fixes #32 2020-05-27 21:07:31 +02:00
8a2eff1fe9 code cleanup 2020-05-27 19:03:18 +02:00
e4d6642d61 order orders by newest first 2020-05-27 15:52:51 +02:00
9406bbc4ac fix nullpointer again 2020-05-27 15:10:12 +02:00
e5b28250c2 fix payment method null pointer 2020-05-27 14:56:15 +02:00
db1d3d31b2 fix register 2020-05-27 14:55:51 +02:00
42a02effa6 fixed pull request #25 2020-05-27 14:24:05 +02:00
819cca7f2a Merge remote-tracking branch 'origin/feature/user' into feature/user 2020-05-27 13:41:04 +02:00
846e448f01 code cleanup 2020-05-27 13:40:44 +02:00
614a929592 code cleanup 2020-05-27 13:40:44 +02:00
60699ed847 fix error handling 2020-05-27 13:40:44 +02:00
83ad1f3999 remove advertisementflag 2020-05-27 13:40:44 +02:00
5b4c0be1c8 add Errorhandling to UpdateSettingsAction 2020-05-27 13:40:44 +02:00
0256c19e8f implement change User Settings 2020-05-27 13:40:44 +02:00
adcd840154 remove notification center 2020-05-27 13:40:44 +02:00
b5495bda3d show all Orders 2020-05-27 13:40:44 +02:00
106b00a907 show usersettings from db 2020-05-27 13:40:44 +02:00
7c73f69865 remove bonuspoints 2020-05-27 13:40:44 +02:00
7c467c8641 bugfix register 2020-05-27 12:22:24 +02:00
ffb683bdd0 Set the advertise flag if at least one supplier wants it to be set 2020-05-25 17:19:25 +02:00
8386629088 Implement the reorder cronjob 2020-05-25 17:08:15 +02:00
86a2e5d8c2 code cleanup 2020-05-25 12:17:09 +02:00
747eb1cde2 Merge pull request 'feature/register' (#24) from feature/register into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-25 10:51:33 +02:00
8d65998ac2 code cleanup 2020-05-25 10:21:36 +02:00
178f98d664 fix error handling 2020-05-25 10:10:42 +02:00
33ff754b9d remove advertisementflag 2020-05-25 09:36:40 +02:00
ac79e1cf22 Check for inactive accounts
Check for employee by access on /intern
2020-05-24 21:51:40 +02:00
40013f0812 Merge remote-tracking branch 'origin/feature/delivery_api' into feature/delivery_api 2020-05-24 20:06:43 +02:00
77892c9dfc fixed pull request #25 2020-05-24 20:05:50 +02:00
cff9417dc5 fixed pull request #24 2020-05-24 20:04:03 +02:00
e571e21281 Merge pull request 'feature/image' (#26) from feature/image into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-23 18:51:15 +02:00
019f5d8f1b code cleanup 2020-05-23 14:19:43 +02:00
620e163a14 added feature to change an article image 2020-05-23 14:18:33 +02:00
6892a11688 Merge branch 'feature/supplier_api' into feature/reorder_cronjob 2020-05-23 11:16:46 +02:00
fcdf0e776d set default img if article is added to listed articles 2020-05-23 10:45:14 +02:00
a3efa4092a removed old static product images 2020-05-23 09:40:52 +02:00
32c6b8cb68 Merge pull request 'feature/offeredArticle' (#23) from feature/offeredArticle into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-21 20:25:53 +02:00
525a5f7eb1 Merge branch 'master' into feature/offeredArticle 2020-05-21 20:23:47 +02:00
ba570852a7 added id´s to inputs 2020-05-21 10:27:26 +02:00
8ede86fdce add Errorhandling to UpdateSettingsAction 2020-05-20 12:08:57 +02:00
caf5430a06 delivery_api finished 2020-05-19 20:38:22 +02:00
9a24fa306d gitignore push 2020-05-19 20:37:26 +02:00
da78ab4990 register working 2020-05-19 18:47:15 +02:00
9cfb1cd0ad add offered article to listed article 2020-05-19 16:30:27 +02:00
7686c4cda6 Create rudimentary register class 2020-05-19 15:41:43 +02:00
39eefbdd3e implement change User Settings 2020-05-19 15:18:48 +02:00
6e3d1cbcf5 remove notification center 2020-05-19 14:17:38 +02:00
1ce9a971ba show all Orders 2020-05-19 11:52:41 +02:00
d8032c2bd7 load offeredArticles from DB and display basic info 2020-05-19 00:12:26 +02:00
4711527971 show usersettings from db 2020-05-18 14:41:33 +02:00
b7b5c7a6b3 remove bonuspoints 2020-05-18 12:49:37 +02:00
5c5df83872 Merge pull request 'feature/search' (#19) from feature/search into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-18 09:42:06 +02:00
7b6882b12b format code 2020-05-18 09:41:02 +02:00
d739b15410 fix missing import 2020-05-17 13:11:32 +02:00
0c66a713b4 add some comments 2020-05-17 13:10:04 +02:00
d0785308d4 code cleanup 2020-05-17 13:09:51 +02:00
bc350b3177 implement only show Searchresults which are in Stock 2020-05-17 13:09:26 +02:00
8d6a1f4053 implement only show advertisements which are in stock 2020-05-17 13:09:26 +02:00
6b9db3eed5 implement errorhandling 2020-05-17 13:09:26 +02:00
3f5b1efa0c implement search 2020-05-17 13:08:18 +02:00
d4be2b9e94 Revert "Revert "added link from listedArticles page to related offered article""
This reverts commit 3c69f38367.
2020-05-16 22:48:40 +02:00
14bef592c4 Revert "Revert "UImodel for offeredArticle page, html cleanup""
This reverts commit 0840eda369.
2020-05-16 22:48:20 +02:00
0840eda369 Revert "UImodel for offeredArticle page, html cleanup"
This reverts commit e0f638f0bd.
2020-05-16 22:46:42 +02:00
3c69f38367 Revert "added link from listedArticles page to related offered article"
This reverts commit 39fb735f21.
2020-05-16 22:46:18 +02:00
39fb735f21 added link from listedArticles page to related offered article 2020-05-16 21:49:31 +02:00
e0f638f0bd UImodel for offeredArticle page, html cleanup 2020-05-16 13:42:07 +02:00
4f6388e4b9 fixed links to offered articles page 2020-05-15 20:57:56 +02:00
2bbf8260f4 Merge pull request 'WIP feature/listedArticles' (#15) from feature/listedArticles into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-15 19:48:21 +02:00
b1840dd845 code cleanup 2020-05-15 19:47:26 +02:00
dc49bc2e8d code cleanuo 2020-05-15 19:45:10 +02:00
8c777ca1ff fixed merge bug: cascade = CascadeType.ALL in Article to Categories 2020-05-15 19:31:31 +02:00
c73435b2a0 Merge remote-tracking branch 'origin/master' into feature/listedArticles 2020-05-15 19:04:02 +02:00
ea8aaa3931 removed PW bypass 2020-05-15 18:16:03 +02:00
56efbd7940 code cleanup 2020-05-15 18:13:12 +02:00
a98782bc01 added new route in external controller 2020-05-15 14:14:29 +02:00
0de35f1a51 Implement scheduled execution of cronjobs 2020-05-15 13:47:54 +02:00
f403a6e1c4 fix in stock bug 2020-05-15 12:33:32 +02:00
d06fd57447 added new route for offered articles page 2020-05-15 11:57:20 +02:00
197a774fb2 removed data folder 2020-05-14 23:14:33 +02:00
af99e8107d added change for stock, price and autobuy values on article edit page 2020-05-14 22:16:06 +02:00
f2fc51384e Merge pull request 'update dependencies & gradle' (#12) from feature/spring-boot-2.2.7 into master
Reviewed-by: CodeSteak <codesteak@shellf.art>
2020-05-13 19:45:46 +02:00
922e21a454 update dependencies & gradle
* gradle 5.6.2 -> 6.4
* spring boot 2.2.2 -> 2.2.7
* sqlite-jdbc 3.28.0 -> 3.31.1
2020-05-13 18:28:21 +02:00
c69b20b914 added POST that changes the article WIP 2020-05-12 22:52:01 +02:00
c92e485018 Implement API Bindings for SupplierService 2020-05-12 22:42:25 +02:00
62d811db1d Implement First Draft of Supplier API 2020-05-12 22:41:08 +02:00
fd9dcf141e fixes in listed article page and converted form to POST 2020-05-11 15:32:39 +02:00
09c85fe8cb fixed route for /intern/articles and /intern/suppliers/articles 2020-05-11 14:32:07 +02:00
22d2744c8c GET article edit page 2020-05-11 11:58:26 +02:00
bba4173269 fixed inputstream once more 2020-05-10 22:19:58 +02:00
c14ae996be Merge branch 'feature/listedArticles' of git.mosad.xyz:localhorst/e-commerce into feature/listedArticles 2020-05-10 21:32:19 +02:00
3a3b7abad0 fix typo 2020-05-10 21:30:50 +02:00
a2f20938cd show listedArticles 2020-05-10 21:30:50 +02:00
2b3ecb2342 changed listedArticles Request to own Controller 2020-05-10 21:30:50 +02:00
143a53acf5 fix better quantities for UI 2020-05-10 21:30:50 +02:00
bb4aa79243 implement personalized suggestions 2020-05-10 21:30:50 +02:00
82dacef4c0 Advertised Articles now shown correctly 2020-05-10 21:30:50 +02:00
262640a2b4 change Databasename and add Advertisementflag 2020-05-10 21:30:50 +02:00
1e7266e554 implement imageserving and first part of ArticleRepository 2020-05-10 21:30:50 +02:00
4048d6c5ad Unify Style of error messages to match rest of ui. 2020-05-10 21:30:50 +02:00
572a999467 Implement proper querying of warehouse slot sums and booking accounts. 2020-05-10 21:30:50 +02:00
5f071939d3 Renice error handling 2020-05-10 21:30:50 +02:00
2ec3ad32ea Implement CreateCustomerOrderAction; Not implemented: correct booking and WarehouseBooking fetching...
Puhh, that was a struggle to get working. Damn JPA Shit
2020-05-10 21:30:50 +02:00
d2bf6e8c52 implement checkout for non logged in users. 2020-05-10 21:30:50 +02:00
7d83d723c1 Implement add Items to ShoppingCart 2020-05-10 21:30:50 +02:00
4338f188f0 fix local merge conflicts in req ctrl 2020-05-10 21:30:50 +02:00
e9e072b26b ShopIndexController without databasestuff 2020-05-10 21:30:50 +02:00
8a28aabaf3 ShopIndexController initial implementation 2020-05-10 21:30:50 +02:00
e1d7becc2e added yaml dump&parse class 2020-05-10 21:23:44 +02:00
89eaeaed40 Merge pull request 'feature/basic_functions' (#7) from feature/basic_functions into master
Reviewed-by: Jannik Seiler <seil0@mosad.xyz>
2020-05-10 17:48:31 +02:00
edcdb2e9cf fix use Math.min for loopcount 2020-05-10 17:25:48 +02:00
530034a40e fix unused imports and unneeded empty lines 2020-05-10 17:19:18 +02:00
8f24aee350 fix add should_be_advertised to script 2020-05-10 17:16:17 +02:00
bd2aeb63f6 Remove unneeded comment 2020-05-10 17:05:19 +02:00
713c8ebe86 Comment empty constructors 2020-05-10 17:03:40 +02:00
e406918ca2 Remove commend out code 2020-05-10 16:57:33 +02:00
e167832164 Merge branch 'feature/basic_functions' of git.mosad.xyz:localhorst/e-commerce into feature/basic_functions 2020-05-10 15:39:35 +02:00
777786f5b6 Remove old missleading comment 2020-05-10 15:39:24 +02:00
a62e3e8a63 fix only show ordered Articles from specific Customer 2020-05-10 15:28:39 +02:00
7f95cef13b fix personalized suggestions 2020-05-10 15:03:45 +02:00
95e52cc79d fix non-formatted and non-vatted price 2020-05-10 14:57:02 +02:00
d4d1426438 Fix decimals in checkout page 2020-05-10 14:34:20 +02:00
d1301f6988 Fix naming-convension-error in ArticleOffer 2020-05-10 14:30:00 +02:00
731f4761fa Show error if articles are not avail during checkout. 2020-05-10 14:29:08 +02:00
69b5b33af8 fix typo in 8dd4cc4459 2020-05-09 19:58:31 +02:00
8dd4cc4459 use application.properties when run via bootRun 2020-05-09 19:31:57 +02:00
312 changed files with 7983 additions and 127111 deletions

2
.gitignore vendored
View File

@ -91,3 +91,5 @@ local.properties
prototype/*.db
prototype/images
prototype/data

32
delivery/.gitignore vendored Normal file
View File

@ -0,0 +1,32 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/

30
delivery/build.gradle Normal file
View File

@ -0,0 +1,30 @@
plugins {
id 'org.springframework.boot' version '2.2.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'org.hso.ecommerce'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
compile 'org.json:json:20190722'
}
test {
useJUnitPlatform()
}

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Tue May 19 15:50:06 CEST 2020
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

183
delivery/gradlew vendored Executable file
View File

@ -0,0 +1,183 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

View File

@ -1,3 +1,19 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

1
delivery/settings.gradle Normal file
View File

@ -0,0 +1 @@
rootProject.name = 'delivery'

View File

@ -0,0 +1,11 @@
package org.hso.ecommerce.supplier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

View File

@ -0,0 +1,37 @@
package org.hso.ecommerce.supplier;
import org.hso.ecommerce.supplier.data.Delivery;
import org.hso.ecommerce.supplier.data.DeliveryManager;
import org.hso.ecommerce.supplier.data.ReturnStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
public class RequestController {
@PostMapping("/newDelivery")
public String supplier(HttpServletResponse response, HttpServletRequest request, @RequestBody Delivery delivery) {
DeliveryManager.getInstance().add(delivery);
return delivery.getUuid();
}
@GetMapping(value = "/status", produces = MediaType.APPLICATION_JSON_VALUE)
public ReturnStatus searchArticles(@RequestParam(value = "trackingID") String trackingID, HttpServletRequest request, HttpServletResponse response) {
Delivery delivery = DeliveryManager.getInstance().getDeliveryByID(trackingID);
if (delivery == null) {
Delivery lostDelivery = Delivery.lostDelivery(trackingID);
DeliveryManager.getInstance().add(lostDelivery);
delivery = lostDelivery;
}
return new ReturnStatus(delivery.getStatus(), delivery.getEstimatedArrival());
}
}

View File

@ -0,0 +1,78 @@
package org.hso.ecommerce.supplier.data;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
public class Delivery {
private String[] states = {"Bestellung eingegangen", "Bestellung auf dem Weg", "Lieferung erfolgreich"};
private int[] timeBorder = {4, 24};
private String name;
private String address;
// Why is this a string and creationTime a Date?!
private String estimatedArrival;
private Date creationTime;
private String uuid;
public Delivery(String name, String address) {
this.name = name;
this.address = address;
this.uuid = UUID.randomUUID().toString();
this.creationTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
this.estimatedArrival = formatter.format(addDays((Date) this.creationTime.clone(), 1));
}
public static Delivery lostDelivery(String uuid) {
Delivery delivery = new Delivery("", "");
delivery.uuid = uuid;
delivery.creationTime = addDays(new Date(), -1);
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
delivery.estimatedArrival = formatter.format(addDays((Date) delivery.creationTime.clone(), 1));
return delivery;
}
public String getStatus() {
Date now = new Date();
long timeNow = now.getTime();
long creationTime = this.creationTime.getTime();
// Wow, that's how calculate date diffs.
long diff = timeNow - creationTime;
double hour = (((diff / 1000.0) / 3600.0));
for (int i = 0; i < timeBorder.length; i++) {
if (hour < timeBorder[i])
return states[i];
}
return states[timeBorder.length];
}
public String getEstimatedArrival() {
return estimatedArrival;
}
private static Date addDays(Date date, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days);
return cal.getTime();
}
public String getUuid() {
return uuid;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,30 @@
package org.hso.ecommerce.supplier.data;
import java.util.HashMap;
public class DeliveryManager {
private HashMap<String, Delivery> deliveryList;
private static DeliveryManager deliveryManager;
private DeliveryManager()
{
deliveryList = new HashMap<>();
}
public static DeliveryManager getInstance() {
if (DeliveryManager.deliveryManager == null) {
DeliveryManager.deliveryManager = new DeliveryManager();
}
return DeliveryManager.deliveryManager;
}
public void add(Delivery delivery) {
deliveryList.put(delivery.getUuid(), delivery);
}
public Delivery getDeliveryByID(String uuid) {
return deliveryList.getOrDefault(uuid, null);
}
}

View File

@ -0,0 +1,20 @@
package org.hso.ecommerce.supplier.data;
public class ReturnStatus {
private String status;
private String estimatedArrival;
public ReturnStatus(String status, String estimatedArrival) {
this.status = status;
this.estimatedArrival = estimatedArrival;
}
public String getStatus() {
return status;
}
public String getEstimatedArrival() {
return estimatedArrival;
}
}

View File

@ -0,0 +1,2 @@
server.address=::1
server.port=8082

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,479 +0,0 @@
:root {
font-family: "Fira Sans";
line-height: 1.15;
--u5: calc(1em * 1.5 * 1.5 * 1.5 * 1.5 * 1.5 );
--u4: calc(1em * 1.5 * 1.5 * 1.5 * 1.5);
--u3: calc(1em * 1.5 * 1.5 * 1.5);
--u2: calc(1em * 1.5 * 1.5);
--u1: calc(1em * 1.5);
--u0: calc(1em);
--u-1: calc(1em * 0.666);
--u-2: calc(1em * 0.666 * 0.666);
--u-3: calc(1em * 0.666 * 0.666 * 0.666);
--u-4: calc(1em * 0.666 * 0.666 * 0.666 * 0.666);
--root-c-base: #ecf0f1;
--root-c-base-highlight: #bdc3c7;
--root-c-primary: #1abc9c;
--root-c-primary-highlight: #16a085;
--root-c-secondary: #9b59b6;
--root-c-secondary-highlight: #8e44ad;
--root-c-black: #2c3e50;
--root-c-black-highlight: #34495e;
--c-base: var(--root-c-base);
--c-base-highlight: var(--root-c-base-highlight);
--c-primary:var(--root-c-primary);
--c-primary-highlight: var(--root-c-primary-highlight);
--c-secondary: var(--c-secondary);
--c-secondary-highlight: var(--root-c-secondary-highlight);
--c-black: var(--root-c-black);
--c-black-highlight: var(--root-c-black-highlight);
}
.primary {
--c-base: var(--root-c-base);
--c-base-highlight: var(--root-c-base-highlight);
--c-primary:var(--root-c-primary);
--c-primary-highlight: var(--root-c-primary-highlight);
--c-secondary: var(--c-secondary);
--c-secondary-highlight: var(--root-c-secondary-highlight);
--c-black: var(--root-c-black);
--c-black: var(--root-c-black-highlight);
}
.secondary {
--c-base: var(--root-c-base);
--c-base-highlight: var(--root-c-base-highlight);
--c-primary:var(--root-c-secondary);
--c-primary-highlight: var(--root-c-secondary-highlight);
--c-secondary: var(--root-c-primary);
--c-secondary-highlight: var(--root-c-primary-highlight);
--c-black: var(--root-c-black);
--c-black-highlight: var(--root-c-black-highlight);
}
.inverted {
--c-base: var(--root-c-black);
--c-base-highlight: var(--root-c-black-highlight);
--c-primary:var(--root-c-primary);
--c-primary-highlight: var(--root-c-primary-highlight);
--c-secondary: var(--c-secondary);
--c-secondary-highlight: var(--root-c-secondary-highlight);
--c-black: var(--root-c-base);
--c-black-highlight: var(--root-c-base-highlight);
}
* {
margin: 0em;
padding: 0em;
box-sizing: border-box;
}
html, body {
font-size: var(--u0);
height: 100%;
background-color: var(--c-base);
color: var(--c-black)
}
main {
min-height: 100%;
}
h1, h2, h3, h4, h5 {
font-family: "Fira Mono";
padding-top: 1em;
padding-bottom: 0.618em;
text-transform: uppercase;
}
p {
padding-top: 1em;
}
h1 {
font-size: var(--u2);
}
h2 {
font-size: var(--u1);
}
h3, h4, h5 {
font-size: var(--u0);
}
img {
width: 100%;
object-fit: cover;
}
li {
list-style-type: none;
}
table {
width: 100%;
border-collapse: collapse;
}
table td,
table th {
padding: var(--u0);
text-align: center;
}
table th {
background-color: var(--c-primary);
color: var(--c-base);
}
table tr:nth-child(2n+1) {
background-color: var(--c-base-highlight);
}
/*
* NAV
*/
nav {
}
nav h1 {
font-size: var(--u0);
margin: 0rem;
}
nav li {
display: flex;
flex-direction: column;
}
nav li li {
margin-left: var(--u0);
}
nav li a {
padding: var(--u0);
transition: all 0.1s ease-out;
}
nav li a:hover,
nav li a.selected {
padding: var(--u0);
background-color: var(--c-primary);
color: var(--c-base);
}
/*
* FOOTER
*/
footer {
padding-top: var(--u3);
padding-bottom: var(--u1);
}
/*
* INPUTS
*/
form * {
width: 100%;
}
input[type="text"],
input[type="password"] {
background-color: var(--c-base);
border: none;
border-radius: var(--u-2);
margin-top: var(--u0);
margin-bottom: var(--u0);
padding: var(--u0);
font-size: var(--u0);
color: var(--c-black);
/* box-shadow: var(--s-0-secondary); */
}
input[type="text"]::placeholder,
input[type="password"]::placeholder {
color: var(--c-primary-highlight);
opacity: 50%;
}
button, .button {
font-family: "Fira Mono";
font-weight: bold;
background-color: var(--c-primary);
color: var(--c-base);
border: none;
border-radius: var(--u-2);
margin-bottom: var(--u0);
margin-top: var(--u0);
padding: var(--u0);
min-width: 10em;
font-family: "Fira Mono";
text-transform: uppercase;
font-size: var(--u0);
/* box-shadow: var(--s-0-secondary); */
}
button:active, .button:active {
background-color: var(--c-primary-highlight);
}
input[type="text"],
input[type="password"],
button,
.button {
transition: all 0.1s ease-out;
}
label {
display: block;
min-width: 10em;
font-weight: bold;
}
/*
* HERO
*/
.hero {
background-color: var(--c-primary);
color: var(--c-base);
}
.hero-black {
background-color: var(--c-black);
color: var(--c-base);
}
/*
* LAYOUT
*/
.content-width {
max-width: 80rem;
margin-left: auto;
margin-right: auto;
padding-left: var(--u0);
padding-right: var(--u0);
}
.bar-flex {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
}
.bar-flex > * {
margin: var(--u0);
}
.bar-flex > .spacer {
flex: 1;
}
.sidebar-layout {
display: flex;
align-items: stretch;
justify-content: center;
flex-wrap: wrap;
}
.sidebar-layout > *:nth-child(2) {
flex: 1;
}
.grid {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
}
.grid.vertical-center {
align-items: center;
height: 100%;
}
.grid.center {
justify-content: space-around;
}
.grid > * {
flex: 1;
margin: var(--u0);
padding: var(--u0);
border-radius: var(--u0);
}
.grid.base > * {
background-color: var(--c-base);
color: var(--c-black);
}
.grid.black > * {
background-color: var(--c-black);
color: var(--c-base);
}
.grid.primary > * {
background-color: var(--c-primary);
color: var(--c-base);
}
.grid.secondary > * {
background-color: var(--c-primary-highlight);
color: var(--c-base);
}
.hero-primary .grid.shadow > * {
/* box-shadow: var(--s-0-secondary); */
}
.hero-black .grid.shadow > * {
/* box-shadow: var(--s-0-secondary); */
}
.grid.s > .spacer {
box-shadow: none;
margin: calc(var(--u0) * 2);
padding: 0px;
width: 10rem;
max-width: 10rem;
min-width: 7.5rem;
height: 0px;
}
.grid.s > * {
max-width: 10rem;
min-width: 7.5rem;
}
.grid.m > .spacer {
box-shadow: none;
margin: calc(var(--u0) * 2);
padding: 0px;
width: 20rem;
max-width: 20rem;
min-width: 15rem;
height: 0px;
padding: 0px;
}
.grid.m > * {
width: 20rem;
max-width: 20rem;
min-width: 15rem;
}
.grid.l > .spacer {
box-shadow: none;
margin: calc(var(--u0) * 2);
padding: 0px;
width: 40rem;
max-width: 40rem;
min-width: 15rem;
height: 0px;
padding: 0px;
}
.grid.l > * {
width: 40rem;
max-width: 40rem;
min-width: 15rem;
}
.vertical-spacer.s {
min-height: 10rem;
}
.vertical-spacer.m {
min-height: 20rem;
}
.vertical-spacer.l {
min-height: 40rem;
}
/*
* Impov
*/
.input-icon {
/* box-shadow: var(--s-0-secondary); */
display: flex;
padding: 0px;
border-radius: var(--u0);
}
.input-icon > input {
flex: 1;
margin: 0px;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
box-shadow: none;
}
.input-icon > button {
margin: 0px;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
box-shadow: none;
}
/*
* CONTENT
*/
.price {
opacity: 75%;
font-size: var(--u1);
text-align: right;
}

View File

@ -1,124 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr">
<head>
<meta charset="utf-8">
<title>Frontpage</title>
<link rel="stylesheet" type="text/css" href="css/ecom.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
</head>
<body>
<nav class='hero'>
<div class='content-width bar-flex'>
<h1>Project eCommerce</h1>
<button>Angebote</button>
<div class='spacer input-icon secondary'>
<input type="text" placeholder="Nach Produkten suchen..."/>
<button>Finden</button>
</div>
<button>Login</button>
</div>
</nav>
<main>
<div class='hero'>
<div class='content-width'>
<h1>Angebote</h1>
<div class='grid m base shadow'>
<section>
<img src="pics/product-1.jpg">
<h2>Lorem Ipsum</h2>
<p class='price'> 25.14 €</p>
<p>
Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte.
</p>
</section>
<section>
<img src="pics/product-2.jpg">
<h2>Lorem Ipsum</h2>
<p class='price'> 10.14 €</p>
<p>
Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte.
</p>
</section>
<section>
<img src="pics/product-1.jpg">
<h2>Lorem Ipsum</h2>
<p class='price'> 25.14 €</p>
<p>
Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte.
</p>
</section>
<section>
<img src="pics/product-2.jpg">
<h2>Lorem Ipsum</h2>
<p class='price'> 10.14 €</p>
<p>
Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte.
</p>
</section>
<section>
<img src="pics/product-3.jpg">
<h2>Lorem Ipsum</h2>
<p class='price'> 44.14 €</p>
<p>
Als Gregor Samsa eines Morgens aus unruhigen Träumen erwachte.
</p>
</section>
<section class="spacer"></section>
<section class="spacer"></section>
<section class="spacer"></section>
<section class="spacer"></section>
</div>
</div>
<div class="vertical-spacer s"></div>
</div>
<div class=''>
<div class='content-width'>
<h1>Personalisierte Empfehlungen</h1>
<div class="grid l">
<img src="undraw/undraw_successful_purchase_secondary.svg"/>
<div>
<h2>Werde jetzt Kunde</h2>
<p> Jetzt Kunde werden und viele Vorteile sichern,
wie z.B. personalisierte Empfehlungen. </p>
<button>Registieren</button>
</div>
</div>
</div>
<div class="vertical-spacer s"></div>
</div>
</main>
<footer class="hero-black">
<div class='content-width bar-flex'>
<h3>Project eCommerce</h3>
<div class="spacer"></div>
<div>
<h4>Seite</h4>
<ul>
<li><a>Login</a></li>
<li><a>Angebote</a></li>
<li><a>Suche</a></li>
<li><a>Mitarbeiter Login</a></li>
</ul>
</div>
<div>
<h4>Mehr</h4>
<ul>
<li><a>Nutzungsbedingungen</a></li>
<li><a>Datenschutz</a></li>
<li><a>Über</a></li>
</ul>
</div>
</div>
</footer>
</body>
</html>

View File

@ -1,158 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr">
<head>
<meta charset="utf-8">
<title>Frontpage</title>
<link rel="stylesheet" type="text/css" href="css/ecom.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
</head>
<body>
<nav class='hero'>
<div class='content-width bar-flex'>
<h1>Project eCommerce</h1>
<button>Angebote</button>
<div class='spacer input-icon secondary'>
<input type="text" placeholder="Nach Produkten suchen..."/>
<button>Finden</button>
</div>
<button>Login</button>
</div>
</nav>
<main class="sidebar-layout content-width">
<nav>
<ul>
<li><a>Dashboard</a>
<ul>
<li><a>Artikel</a></li>
<li><a>Umsatzsteuer</a></li>
<li><a class='selected'>Geldbuchungen</a></li>
<li><a>Einstellungen</a></li>
</ul>
</li>
<li><a>Lieferanten</a>
<ul>
<li><a>Warenbuchungen</a></li>
<li><a>Geldbuchungen</a></li>
</ul>
</li>
<li><a>Lager</a>
<ul>
<li><a>Bestandsbuchungen</a></li>
</ul>
</li>
<li><a>Kunden</a>
<ul>
<li><a>Bestellungen</a></li>
<li><a>Geldbuchungen</a></li>
</ul>
</li>
</ul>
</nav>
<div class="content-width">
<h1>Geldbuchungen</h1>
<p>
<table>
<tr>
<th>Id</th>
<th>Datum</th>
<th>Betrag</th>
<th>Gegenkonto</th>
<th>Betreff</th>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
<tr>
<td>#100</td>
<td>2019-10-08</td>
<td>100,50 €</td>
<td>Lieferant: Hans</td>
<td>Bestellungen: #41</td>
</tr>
</table>
</p>
<p>
<a class="button">Manuelle Buchung</a>
</p>
</div>
</main>
<footer class="hero-black">
<div class='content-width bar-flex'>
<h3>Project eCommerce</h3>
<div class="spacer"></div>
<div>
<h4>Seite</h4>
<ul>
<li><a>Login</a></li>
<li><a>Angebote</a></li>
<li><a>Suche</a></li>
<li><a>Mitarbeiter Login</a></li>
</ul>
</div>
<div>
<h4>Mehr</h4>
<ul>
<li><a>Nutzungsbedingungen</a></li>
<li><a>Datenschutz</a></li>
<li><a>Über</a></li>
</ul>
</div>
</div>
</footer>
</body>
</html>

View File

@ -1,48 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr">
<head>
<meta charset="utf-8">
<title>Frontpage</title>
<link rel="stylesheet" type="text/css" href="css/ecom.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
</head>
<body>
<div class='grid m center vertical-center'>
<form class='hero primary'>
<p>
<label>Nutzername</label>
<input type="text" placeholder=""/>
</p>
<p>
<label>Passwort</label>
<input type="password" placeholder=""/>
</p>
<button class='secondary'>Login</button>
</form>
</div>
<footer class="hero-black">
<div class='content-width bar-flex'>
<h3>Project eCommerce</h3>
<div class="spacer"></div>
<div>
<h4>Seite</h4>
<ul>
<li><a>Login</a></li>
<li><a>Angebote</a></li>
<li><a>Suche</a></li>
<li><a>Mitarbeiter Login</a></li>
</ul>
</div>
<div>
<h4>Mehr</h4>
<ul>
<li><a>Nutzungsbedingungen</a></li>
<li><a>Datenschutz</a></li>
<li><a>Über</a></li>
</ul>
</div>
</div>
</footer>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

View File

@ -1,6 +0,0 @@
INSERT INTO article_offers ("manufacturer", "article_number", "vat_percent")
VALUES ("McDonalds", "1", 7);
INSERT INTO articles ("related_id", "shop_price_per_unit_net_cent", "warehouse_units_per_slot", "should_reorder", "reorder_max_price", "title", "description", "image_id")
VALUES (1, 19.99, 10, 1, 15, "Huge Hamburger", "This huge Hamburger is awesome!", NULL);

View File

@ -1,11 +0,0 @@
package org.hso.ecommerce.action.shop;
import org.hso.ecommerce.entities.shop.CustomerOrder;
public class EnableTrackingAction {
public static void addTrackingInfo(CustomerOrder customerOrder) {
// TODO:
customerOrder.trackingId = "555-NASE";
}
}

View File

@ -1,278 +0,0 @@
package org.hso.ecommerce.app;
import org.hso.ecommerce.repos.user.UserRepository;
import org.hso.ecommerce.entities.user.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Optional;
/**
* TODO clean up this class
*/
@Controller
public class RequestController {
@Autowired
private final UserRepository userRepository = null;
static int notSoRandom = 0;
// @GetMapping("/")
// public String home() {
// return "redirect:/shop/";
// }
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String loginPost(
HttpServletRequest request,
HttpServletResponse response,
@RequestParam("username") String username,
@RequestParam("password") String password,
HttpSession session
) {
String gto = (String) session.getAttribute("afterLogin");
Optional<User> user = userRepository.findByEmail(username);
if (!user.isPresent()) {
request.setAttribute("error", "Email Adresse falsch.");
response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
return "login";
}
if (!user.get().validatePassword(password)) {
request.setAttribute("error", "Passwort falsch.");
response.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
return "login";
}
session.setAttribute("userId", user.get().getId());
if (gto != null && gto.startsWith("/")) {
return "redirect:" + gto;
} else {
return "redirect:/";
}
}
@PostMapping("/logout")
public String logoutPost(HttpServletResponse response,
HttpSession session
) {
session.removeAttribute("userId");
return "redirect:/";
}
@GetMapping("/register")
public String register() {
return "register";
}
@PostMapping("/register")
public String registerPost(
@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("password2") String password2,
@RequestParam("type") String type
) {
return "redirect:/";
}
// @GetMapping("/shop/")
// public String shop() {
// return "shop/index";
// }
@GetMapping("/shop/search")
public String shopSearch() {
return "shop/search";
}
/* @GetMapping("/shop/checkout")
public String shopCheckout(HttpSession session, HttpServletRequest request) {
session.setAttribute("afterLogin", request.getRequestURI());
return "shop/checkout";
}
@PostMapping("/shop/checkoutFinish")
public String shopCheckoutFinish() {
return "shop/checkoutFinish";
}
@GetMapping("/shop/checkoutFinish")
public String shopCheckoutFinishGET() {
return "shop/checkoutFinish";
}*/
// @GetMapping("/shop/articles/{id}")
// public String shopArticlesById() {
// return "shop/articles/id";
// }
//
// @PostMapping("/shop/articles/{id}")
// public String shopArticlesByIdBuy(HttpSession session,
// @RequestAttribute(value = "user", required = false) User customer,
// @PathVariable("id") Integer id,
// @RequestParam("fastcheckout") Boolean fastcheckout
// ) {
// if (customer != null) {
// if (!fastcheckout) {
// return "shop/articles/post_add";
// } else {
// return "shop/checkout";
// }
// } else {
// session.setAttribute("afterLogin", "/shop/articles/" + id);
// return "redirect:/login";
// }
// }
// @GetMapping("/about")
// public String about() {
// return "about";
// }
//
// @GetMapping("/terms")
// public String terms() {
// return "terms";
// }
//
// @GetMapping("/privacy")
// public String privacy() {
// return "privacy";
// }
@GetMapping("/intern/")
public String intern() {
return "intern/index";
}
/*
@GetMapping("/intern/listedArticles/")
public String internListedArticles() {
return "intern/listedArticles/index";
}
@GetMapping("/intern/listedArticles/{id}")
public String internListedArticlesId() {
return "intern/listedArticles/id";
}
*/
@GetMapping("/intern/articles/")
public String internArticles() {
return "intern/articles/index";
}
@GetMapping("/intern/articles/{id}")
public String internArticlesId() {
return "intern/articles/id";
}
@GetMapping("/intern/customers/")
public String internCustomers() {
return "intern/customers/index";
}
@GetMapping("/intern/customers/{id}")
public String internCustomersId() {
return "intern/customers/id";
}
@GetMapping("/intern/customerOrders/")
public String internCustomerOrder() {
return "intern/customerOrders/index";
}
@GetMapping("/intern/customerOrders/{id}")
public String internCustomerOrdersId() {
return "intern/customerOrders/id";
}
@GetMapping("/intern/suppliers/")
public String internSuppliers() {
return "intern/suppliers/index";
}
@GetMapping("/intern/suppliers/{id}")
public String internSuppliersId() {
return "intern/suppliers/id";
}
@GetMapping("/intern/supplierOrders/")
public String internSupplierOrders() {
return "intern/supplierOrders/index";
}
@GetMapping("/intern/supplierOrders/{id}")
public String internSupplierOrdersId() {
return "intern/supplierOrders/id";
}
@GetMapping("/intern/accounting/")
public String accounting() {
return "intern/accounting/index";
}
@GetMapping("/intern/accounting/vat")
public String accountingVat() {
return "intern/accounting/vat";
}
@GetMapping("/intern/accounting/main")
public String accountingIntern() {
return "intern/accounting/main";
}
@GetMapping("/intern/accounting/addManual")
public String accountingAddManual() {
return "intern/accounting/addManual";
}
@GetMapping("/intern/warehouse/")
public String accountingWarehouse() {
return "intern/warehouse/index";
}
@GetMapping("/intern/warehouse/todo")
public String accountingWarehouseTodo() {
return "intern/warehouse/todo";
}
@GetMapping("/intern/warehouse/addManual")
public String accountingWarehouseAddManual() {
return "intern/warehouse/addManual";
}
@PostMapping("/intern/warehouse/progress/{id}")
public String accountingWarehouseProgressIdPost(HttpServletResponse response) {
if ((notSoRandom++) % 2 == 1) {
return "redirect:/intern/warehouse/progress/450";
} else {
response.setStatus(409);
return "intern/warehouse/error_progress_failed";
}
}
@GetMapping("/intern/warehouse/progress/{id}")
public String accountingWarehouseProgressId() {
return "intern/warehouse/id_progress";
}
@GetMapping("/intern/warehouse/slots/")
public String accountingWarehouseSlots() {
return "intern/warehouse/slots/index";
}
}

View File

@ -1,36 +0,0 @@
package org.hso.ecommerce.app;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("user")
public class UserRequestController {
@GetMapping("/")
public String user() {
return "redirect:/user/settings";
}
@GetMapping("/settings")
public String userSettings() {
return "user/settings";
}
@GetMapping("/orders/")
public String userOrdeers() {
return "user/orders/index";
}
@GetMapping("/bonuspoints")
public String userBonuspoints() {
return "user/bonuspoints";
}
@GetMapping("/notifications/")
public String userNotifications() {
return "user/notifications/index";
}
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class BookingController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class LoginController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class UserController {
}

View File

@ -1,81 +0,0 @@
package org.hso.ecommerce.controller.intern;
import java.util.ArrayList;
import java.util.List;
import org.hso.ecommerce.entities.shop.Article;
import org.hso.ecommerce.repos.shop.ArticleRepository;
import org.hso.ecommerce.repos.warehouse.WarehouseBookingPositionSlotEntryRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("intern/listedArticles")
public class InternArticleController
{
@Autowired
private final ArticleRepository articleRepository = null;
@Autowired
private final WarehouseBookingPositionSlotEntryRepository warehouseEntryRepository = null;
@GetMapping("/")
public String internListedArticles(Model model)
{
List<ListedArticlesListTotals> totals = new ArrayList<ListedArticlesListTotals>();
for (Article article : articleRepository.findAll()) {
ListedArticlesListTotals tmp = new ListedArticlesListTotals();
tmp.addListedArticle(article,
warehouseEntryRepository.getArticleStock(article.id).orElse(0));
totals.add(tmp);
}
model.addAttribute("ListedArticles", totals);
return "intern/listedArticles/index";
}
@GetMapping("/{id}")
public String internListedArticlesId()
{
return "intern/listedArticles/id";
}
public static class ListedArticlesListTotals
{
public String imgPath;
public String title;
public String price;
public String price_netto;
public String categorie;
public int stock;
public long offer_id;
public long id;
void addListedArticle(Article article, int stock)
{
this.imgPath = article.image.path;
this.title = article.title;
this.price_netto = String.format("%.2f",
((float) article.shopPricePerUnitNetCent / 100));
this.price = String.format("%.2f",
((float) article.getPriceGross() / 100));
this.categorie = article.getCategories();
this.stock = stock;
this.offer_id = article.related.id;
this.id = article.id;
}
}
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.intern;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class InternIndexController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.intern;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class WarehouseController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.intern.customers;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class CustomerOrderController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.intern.customers;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class CustomersIndexController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.intern.suppliers;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class SupplierIndexController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.intern.suppliers;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class SupplierOfferController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.intern.suppliers;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class SupplierOrderController {
}

View File

@ -1,8 +0,0 @@
package org.hso.ecommerce.controller.shop;
import org.springframework.stereotype.Controller;
@Controller
//@RequestMapping("...")
public class ShopSearchController {
}

View File

@ -1,63 +0,0 @@
package org.hso.ecommerce.entities.shop;
import org.hso.ecommerce.entities.supplier.ArticleOffer;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "articles")
public class Article
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic
public long id;
@ManyToOne(optional = false)
public ArticleOffer related;
public int shopPricePerUnitNetCent;
public int warehouseUnitsPerSlot;
public boolean shouldReorder;
public int reorderMaxPrice;
@NotNull
public String title;
@NotNull
public String description;
@OneToOne(optional = true)
@Basic(fetch = FetchType.LAZY)
public Image image;
@ManyToMany
@JoinTable(name = "article_categories_bindings")
public Set<Category> categories = new HashSet<>();
public String getCategories()
{
StringBuilder result = new StringBuilder();
for (Category temp : categories) {
result.append(temp.name);
}
return result.toString();
}
public int getVat()
{
return (shopPricePerUnitNetCent * related.vatPercent) / 100;
}
public int getPriceGross()
{
return shopPricePerUnitNetCent + getVat();
}
}

View File

@ -1,33 +0,0 @@
package org.hso.ecommerce.entities.warehouse;
import org.hso.ecommerce.entities.shop.CustomerOrder;
import org.hso.ecommerce.entities.supplier.SupplierOrder;
import javax.persistence.*;
@Entity
@Table(name = "warehouse_booking_reasons")
public class WarehouseBookingReason {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic
public long id;
public String comment;
@ManyToOne(optional = true)
public SupplierOrder causeSupplierOrder;
@ManyToOne(optional = true)
public CustomerOrder customerOrder;
public boolean isManuel;
public WarehouseBookingReason() {
}
public WarehouseBookingReason(CustomerOrder order) {
this.customerOrder = order;
}
}

View File

@ -1,12 +0,0 @@
package org.hso.ecommerce.repos.booking;
import org.hso.ecommerce.entities.booking.Booking;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookingRepository extends JpaRepository<Booking, Long> {
}

View File

@ -1,27 +0,0 @@
package org.hso.ecommerce.repos.shop;
import org.hso.ecommerce.entities.shop.Article;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long>
{
@Query("SELECT a FROM Article a WHERE a.id = :articleId")
Article findArticleById(@Param("articleId") long articleId);
@Query("SELECT a FROM Article a")
List<Article> findAll();
@Query("SELECT a FROM Article a JOIN a.related ao WHERE ao.should_be_advertised = true")
List<Article> getAdvertisedArticles();
@Query("SELECT a FROM CustomerOrderPosition cop JOIN cop.order co JOIN co.customer c JOIN cop.article a ORDER BY co.id DESC")
List<Article> getOrderedArticles();
}

View File

@ -1,11 +0,0 @@
package org.hso.ecommerce.repos.shop;
import org.hso.ecommerce.entities.shop.CustomerOrder;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CustomerOderRepository extends JpaRepository<CustomerOrder, Long> {
}

View File

@ -1,18 +0,0 @@
package org.hso.ecommerce.repos.user;
import org.hso.ecommerce.entities.user.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT c FROM User c WHERE c.email = :email")
Optional<User> findByEmail(String email);
}

View File

@ -1,24 +0,0 @@
package org.hso.ecommerce.repos.warehouse;
import org.hso.ecommerce.entities.warehouse.WarehouseBookingPositionSlotEntry;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface WarehouseBookingPositionSlotEntryRepository extends JpaRepository<WarehouseBookingPositionSlotEntry, Long> {
// TODO this is wrong. revisit.
// @Query("SELECT e FROM WarehouseBookingPositionSlotEntry e, Slot s WHERE e.slot = s AND e.article = :article GROUP BY e.slot.slotNum HAVING max(e.id)")
@Query(value = "Select e.id, e.article_id, e.new_sum_slot, e.slot_id from warehouse_booking_position_entries as e, warehouse_slots as s where e.slot_id = s.id AND e.article_id = :article GROUP BY s.slot_num HAVING max(e.id)", nativeQuery = true)
List<WarehouseBookingPositionSlotEntry> getByArticle(long article);
@Query(value = "SELECT SUM(w.new_sum_articles) FROM warehouse_booking_position_entries as w WHERE w.article_id = :articleid", nativeQuery = true)
Optional<Integer> getArticleStock(long articleid);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -1,22 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>e-commerce</title>
</head>
<body>
<nav th:fragment="sidebar">
<h1>Kategorien</h1>
<ul class="secondary">
<li><a href="/shop/search">Aufnahmegeräte</a></li>
<li><a href="/shop/search">Computer</a></li>
<li><a href="/shop/search">Fernseher</a></li>
<li><a href="/shop/search">Handys</a></li>
<li><a href="/shop/search">Unterhaltungselektronik</a></li>
<li><a href="/shop/search">Sonstiges</a></li>
</ul>
</nav>
</body>
</html>

View File

@ -1,140 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Händlerangebote</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Übersicht der von Lieferanten angebotenen Artikel</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zur Übersicht der von Lieferanten angebotenen Artikel."
data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="7">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Name</th>
<th>Hersteller</th>
<th>Artikelnummer</th>
<th>Lieferant</th>
<th>Kaufpreis (Netto)</th>
<th>Werbungs-<br/>anfrage</th>
<th>Status</th>
</tr>
<!--**********************************************************-->
<tr data-group="5420">
<td>Kamera</td>
<td>Sonjizu</td>
<td>K48431587EX</td>
<td colspan="3"></td>
<td><a th:href="@{/intern/listedArticles/48670}">Gelistet 44048</a></td>
</tr>
<tr data-group="5420">
<td colspan="3"></td>
<td><a th:href="@{/intern/suppliers/48670}">Hans Guck GmbH</a></td>
<td>584,50&nbsp;EUR</td>
<td></td>
<td></td>
</tr>
<tr data-group="5420">
<td colspan="3"></td>
<td><a th:href="@{/intern/suppliers/48670}">Cheap AG</a></td>
<td>84,54&nbsp;EUR</td>
<td>X</td>
<td></td>
</tr>
<tr data-group="5420">
<td colspan="3"></td>
<td><a th:href="@{/intern/suppliers/48670}">Not Cheap AG</a></td>
<td>184,54&nbsp;EUR</td>
<td></td>
<td></td>
</tr>
<!--**********************************************************-->
<tr data-group="1233">
<td>Earbuds</td>
<td>Sonjizu</td>
<td>G447#$X</td>
<td colspan="3"></td>
<td><a th:href="@{/intern/listedArticles/48670}">Gelistet 448</a></td>
</tr>
<tr data-group="1233">
<td colspan="3"></td>
<td><a th:href="@{/intern/suppliers/48670}">Cheap AG</a></td>
<td>50,54&nbsp;EUR</td>
<td>X</td>
<td></td>
</tr>
<!--**********************************************************-->
<tr data-group="42415">
<td>Mundschutz</td>
<td>Farma Corp</td>
<td>Mu-15415</td>
<td colspan="3"></td>
<td><a class="button smaller" th:href="@{/intern/listedArticles/48670}">Hinzufügen</a></td>
</tr>
<tr data-group="42415">
<td colspan="3"></td>
<td><a th:href="@{/intern/suppliers/48670}">Cheap AG</a></td>
<td>150,54&nbsp;EUR</td>
<td></td>
<td></td>
</tr>
<tr data-group="42415">
<td colspan="3"></td>
<td><a th:href="@{/intern/suppliers/48670}">Not Cheap AG</a></td>
<td>250,54&nbsp;EUR</td>
<td></td>
<td></td>
</tr>
<!--**********************************************************-->
<tr data-group="4580">
<td>Goldbaren</td>
<td>Bundesbank</td>
<td>G1KG</td>
<td colspan="3"></td>
<td><a th:href="@{/intern/listedArticles/48670}">Inaktiv 4888</a></td>
</tr>
<tr data-group="4580">
<td colspan="3"></td>
<td><a th:href="@{/intern/suppliers/48670}">Cheap AG</a></td>
<td>10000,54&nbsp;EUR</td>
<td>X</td>
<td></td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,118 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Artikelübersicht</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Bestellung 1010</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-insert="true"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<div>
<h2 id="20202701"> Bestellung vom 27.01.2020 </h2>
<div>
<table class="key-value">
<tr>
<th>Nutzer</th>
<td><a th:href="@{/intern/customers/498}">K-4850</a></td>
</tr>
<tr>
<th>Lieferstatus</th>
<td><b>Unterwegs</b> <br/> Vorraussichtliche Ankunft: 29.01.2020</td>
</tr>
<tr>
<th>Sendeverfolgungsnummer</th>
<td>XE51451436DE</td>
</tr>
<tr>
<th></th>
<td>
Hans Maier <br/>
Hauptstraße 12<br/>
74880 Musterstadt<br/>
Deutschland <br/>
</td>
</tr>
<tr>
<th>Eingelösste Bonuspunkte</th>
<td>10</td>
</tr>
</table>
</div>
<table>
<tr>
<th>Bild</th>
<th>Name</th>
<th>Menge</th>
<th>Preis (Brutto)</th>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-1.jpg}" class="s"/><a></td>
<td><a th:href="@{/shop/articles/4151}">Kamera<a/></td>
<td> 1</td>
<td>100,50&nbsp;EUR</td>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-2.jpg}" class="s"/><a/></td>
<td><a th:href="@{/shop/articles/4151}">Earbuds<a/></td>
<td> 3</td>
<td>63,95&nbsp;EUR</td>
</tr>
<tr>
<th></th>
<th></th>
<th>Position</th>
<th>Preis</th>
</tr>
<tr>
<td></td>
<td></td>
<td>Artikel (Netto)</td>
<td> 120,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Bonuspunkte</td>
<td> 5,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Umsatzsteuer (19%)</td>
<td> 42,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
<h3>Gesammtpreis</h3>
</td>
<td>
<h3>240,79&nbsp;EUR</h3>
</td>
</tr>
</table>
</div>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,129 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Kunden</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Kunden</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zur Kundenübersicht." data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="7">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Kundennummer</th>
<th>Beitrittsdatum</th>
<th>Name</th>
<th>E-Mail</th>
<th>Status</th>
<th></th>
</tr>
<tr>
<td>1209</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td>Geschäftskunde</td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1208</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td>Inaktiv, Geschäftskunde</td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1207</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td></td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1206</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td></td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1205</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td></td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1204</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td></td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1203</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td></td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1202</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td></td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1201</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>hans.maier@example.com</td>
<td>Inaktiv, Mitarbeiter</td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
<tr>
<td>1214</td>
<td>2019-11-10</td>
<td>Hans Maier</td>
<td>admin@example.com</td>
<td>Mitarbeiter</td>
<td><a th:href="@{/intern/customers/4884}" class="button smaller">Details</a></td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,119 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Gelistete Artikel</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Gelisteter Artikel 8450</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-insert="true"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<h2>Gelisteter Artikel 8450</h2>
<form class="detailgrid">
<p class="m">
<label for="title">Titel</label>
<input class=" full-width" type="text" name="title" value="Kamera"/>
</p>
<p class="s">
<label for="ref-article">Refernzierter Artikel</label>
<input class="" type="text" name="ref-article" value="8405" disabled/>
<td><a th:href="@{/intern/articles/#q=%2044048}">Details</a></td>
</p>
<div class="spacer"></div>
<div class="m">
<p>
<label for="img">Bild Hochladen</label>
<input class="full-width" type="file" name="img"/>
</p>
<p>
<img th:src="@{/img/product-1.jpg}" class="m"/>
</p>
</div>
<div class="s">
<p>
<label for="price">Preis (Netto)</label>
<input class="" type="number" step="0.01" name="price" value="84.45"/>&nbsp;EUR <br/>
(19% Mwst.)
<!-- Info von article ref--> <br/>
= 105.98&nbsp;EUR Brutto
</p>
<p>
<label for="max-price-buy">Maximaler Einkaufspreis (Netto)</label>
<input class="" type="number" step="0.01" name="price" value="80.98"/>&nbsp;EUR
</p>
<div>
<fieldset>
<input type="radio" name="autobuy" value="true" id="autobuy-yes" checked required>
<label for="autobuy-yes"> Automatisch nachbestellen.</label> <br/>
<input type="radio" name="autobuy" value="false" id="autobuy-no" required>
<label for="autobuy-no"> Nicht mehr nachkaufen.</label> <br/>
</fieldset>
</div>
</div>
<div class="m">
<label for="tags">Kategorien</label>
<p>
Bitte jede Kategorien in eine eigene Zeile
</p>
<textarea name="tags" class="full-width" rows="6">
Überwachung
Elektronik
</textarea>
</div>
<div class="s">
<p>
<label for="price">Einheiten pro Lagerplatz</label>
<input class="" type="number" name="units-per-slot" value="20"/>
</p>
<p>
<b>Lagerbestand: 12</b>
</p>
<p>
Der Wert wird nur für zukünftige Lagerbuchungen verwendet.
Bei Problemen kann können Einheiten aus- und wieder eingebucht werden.
<!-- TODO: set link g-->
</p>
<p>
<a href="/todo" class="button smaller">Lagerbuchung</a>
</p>
</div>
<p class="l">
<label for="description">Beschreibung</label>
<textarea name="description" class="full-width" rows="15">
Eine TOLLE Kamera
Jaja du denkst jetzt bestimmt: "Bei dem Preis kann sie gar nich sooo TOLL sein".
Aber glaub mir, sie is echt echt TOLL!
Indianerehrenwort!
</textarea>
</p>
<div class="l">
<button type="submit">Änderungen speichern</button>
<button type="reset">Zurücksetzen</button>
</div>
</form>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,72 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Gelistete Artikel</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Gelistete Artikel</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zu den gelisteten Artikeln." data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<h2>Artikel Hinzufügen</h2>
<p>
Weitere Artikel können über Artikelübersicht gelistet werden.
<a class="button smaller" th:href="@{/intern/articles/}"> Jetzt Hinzufügen </a>
</p>
<p>
<table id="main-table">
<tr>
<th colspan="8">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<thead>
<tr>
<th>Bild</th>
<th>Name</th>
<th>Preis</th>
<th>(Netto)</th>
<th>Kategorien</th>
<th>Lagerbestand</th>
<th>Angebot</th>
<th>ID</th>
</tr>
</thead>
<tbody>
<tr th:each="article : ${ListedArticles}">
<td><img th:src="${article.imgPath}" class="s"/></td>
<td><span th:text="${article.title}"></span></td>
<td><span th:text="${article.price}"></span></td>
<td><span th:text="${article.price_netto}"></span></td>
<td><span th:text="${article.categorie}"></span></td>
<td><span th:text="${article.stock}"></span></td>
<td><a th:href="@{/intern/articles/{id}(id = ${article.offer_id})}" th:text="${article.offer_id}"></a></td>
<td><a th:href="@{/intern/listedArticles/{id}(id = ${article.id})}" th:text="${article.id}"></a></td>
</tr>
</tbody>
</table>
<p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,103 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten Bestellungen</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lieferanten Bestellungen</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zu den Bestellungen bei Lieferanten."
data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="9">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Bestellnummer</th>
<th>Datum</th>
<th>Leiferant</th>
<th>Artikel</th>
<th>Preis/Stk (Netto)</th>
<th>Menge</th>
<th>Gesamtpreis (Netto)</th>
<th>Status</th>
</tr>
<tr>
<td>4545</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>10</td>
<td>200,00&nbsp;EUR</td>
<td>Unterwegs <br/><a th:href="@{/intern/warehouse/todo}" class="button smaller">Angekommen</a></td>
</tr>
<tr>
<td>2455</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Unterwegs <br/><a th:href="@{/intern/warehouse/todo}" class="button smaller">Angekommen</a></td>
</tr>
<tr>
<td>1224</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Angekommen</td>
</tr>
<tr>
<td>4520</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Angekommen</td>
</tr>
<tr>
<td>4521</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/suppliers/45015}">Cheap AG</a></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>11</td>
<td>220,00&nbsp;EUR</td>
<td>Angekommen</td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,86 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lieferanten Details</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lierfant Cheap AG</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-insert="true"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<h2>Bestellungen</h2>
<p>
<table id="main-table">
<tr>
<th colspan="9">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Bestellnummer</th>
<th>Datum</th>
<th>Artikel</th>
<th>Preis/Stk (Netto)</th>
<th>Menge</th>
<th>Gesamtpreis (Netto)</th>
<th>Status</th>
</tr>
<tr>
<td>4545</td>
<td>2019-18-10</td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>20,00&nbsp;EUR</td>
<td>10</td>
<td>200,00&nbsp;EUR</td>
<td>Unterwegs <br/><a th:href="@{/intern/warehouse/todo}" class="button smaller">Angekommen</a></td>
</tr>
</table>
</p>
<h2>Buchungen</h2>
<div>
<h4> Kontostand </h4>
<h3> -100,00&nbsp;EUR </h3>
</div>
<p>
<table id="main-table">
<tr>
<th>Zeitpunkt</th>
<th>Betrag</th>
<th>Von</th>
<th>Kontostand</th>
<th>Grund</th>
<th>Referenz</th>
</tr>
<tr>
<td>10.09.2019 13:45</td>
<td>100,00&nbsp;EUR</td>
<td><a th:href="@{/intern/accounting/main}">Hauptkonto</a></td>
<td>-100,00&nbsp;EUR</td>
<td>Lieferanten-Bestellung</td>
<td><a th:href="@{/intern/supplierOrders/#q=4520}">2504</a></td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,58 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>e-commerce</title>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<body>
<main class="modal l">
<div class="detailflex l">
<h1>Erfolgreich zugewiesen.</h1>
<p>
<table id="main-table">
<tr>
<th>Zeitpunkt</th>
<th>Artikel</th>
<th>Anzahl</th>
<th>Von</th>
<th>Nach</th>
</tr>
<!-------------------------------------------------------------->
<tr data-group="3">
<td>2020-01-12 12:18</td>
<td colspan="4" class="l">
<a th:href="@{/intern/customerOrders/4808}">Bestellung 8408</a>
<div>
Hans Maier <br/>
Hauptstraße 12<br/>
74880 Musterstadt<br/>
Deutschland <br/>
</div>
</td>
</tr>
<tr data-group="3">
<td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>1</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
<td> -</td>
</tr>
<tr data-group="3">
<td><img th:src="@{/img/product-2.jpg}" class="s"/></td>
<td><a th:href="@{/intern/listedArticles/4205}">Spielzeugauto</a></td>
<td>2</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%232}">Lagerplatz 02</a></td>
<td> -</td>
</tr>
</table>
</p>
<a class="secondary button" th:href="@{/intern/warehouse/todo}"> Abschließen </a>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,127 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Lager</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Lagerbuchungen</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zu den Lagerbuchungen." data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
Die Lagerbestände nach Artikel können Sie unter den <a th:href="@{/intern/listedArticles/}">gelisteten
Artikeln</a> einsehen.
</p>
<p>
<table id="main-table">
<tr>
<th colspan="7">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Zeitpunkt</th>
<th>Artikel</th>
<th>Anzahl</th>
<th>Von</th>
<th>Nach</th>
<th>Status</th>
</tr>
<!-------------------------------------------------------------->
<tr data-group="3">
<td>2020-01-12 12:18</td>
<td colspan="4" class="l">
<a th:href="@{/intern/customerOrders/4808}">Bestellung 8408</a>
</td>
<td>Auf Warteliste <br/>
</td>
</tr>
<tr data-group="3">
<td></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>1</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
<td> -</td>
<td></td>
</tr>
<tr data-group="3">
<td></td>
<td><a th:href="@{/intern/listedArticles/4205}">Spielzeugauto</a></td>
<td>2</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%232}">Lagerplatz 02</a></td>
<td> -</td>
<td></td>
</tr>
<!-------------------------------------------------------------->
<tr data-group="2">
<td>2020-01-12 12:15</td>
<td colspan="4" class="l">
Manuell: Ware war defekt.
</td>
<td>In Arbeit <br/>
</td>
</tr>
<tr data-group="2">
<td></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>1</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
<td> -</td>
<td></td>
</tr>
<!-------------------------------------------------------------->
<tr data-group="1">
<td>2020-01-12 12:11</td>
<td colspan="4" class="l">
<a th:href="@{/intern/supplierOrders/#q=4545}">Lieferung 4545</a>
</td>
<td>Fertig <br/></td>
</tr>
<tr data-group="1">
<td></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>10</td>
<td> -</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a>
</th>
<td></td>
</tr>
<tr data-group="1">
<td></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>1</td>
<td> -</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%234}">Lagerplatz 04</a></td>
<td></td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,105 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Packliste</title>
<script th:src="@{/js/filterTable.js}"></script>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Packliste</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="intern" data-name="Zurück zur Packliste." data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/intern :: sidebar"></nav>
<div class="content-width">
<p>
<table id="main-table">
<tr>
<th colspan="7">
<input type="text" placeholder="Filtern" class="smaller jsFilterTable full-width"
data-target-id="main-table"></input>
</th>
</tr>
<tr>
<th>Zeitpunkt</th>
<th>Artikel</th>
<th>Anzahl</th>
<th>Von</th>
<th>Nach</th>
<th>Status</th>
</tr>
<!-------------------------------------------------------------->
<tr data-group="3">
<td>2020-01-12 12:18</td>
<td colspan="4" class="l">
<a th:href="@{/intern/customerOrders/4808}">Bestellung 8408</a>
<div>
Hans Maier <br/>
Hauptstraße 12<br/>
74880 Musterstadt<br/>
Deutschland <br/>
</div>
</td>
<td>
<form th:action="@{/intern/warehouse/progress/5410}" method="post">
<button type="submit">Beginnen</button>
</form>
</td>
</tr>
<tr data-group="3">
<td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>1</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
<td> -</td>
<td></td>
</tr>
<tr data-group="3">
<td><img th:src="@{/img/product-2.jpg}" class="s"/></td>
<td><a th:href="@{/intern/listedArticles/4205}">Spielzeugauto</a></td>
<td>2</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%232}">Lagerplatz 02</a></td>
<td> -</td>
<td></td>
</tr>
<!-------------------------------------------------------------->
<tr data-group="2">
<td>2020-01-12 12:15</td>
<td colspan="4" class="l">
Manuell: Ware war defekt.
</td>
<td><a class="secondary button">Abschließen</a>
</td>
</tr>
<tr data-group="2">
<td><img th:src="@{/img/product-1.jpg}" class="s"/></td>
<td><a th:href="@{/intern/listedArticles/45015}">Kamera</a></td>
<td>1</td>
<td><a th:href="@{/intern/warehouse/slots/#q=%231}">Lagerplatz 01</a></td>
<td> -</td>
<td></td>
</tr>
</table>
</p>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,97 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Neuen Account erstellen</title>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
<script th:src="@{/js/scrollToContent.js}"></script>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<main class="modal">
<form class="detailflex m" th:action="@{/register}" method="POST">
<div>
<h1>Neuen Account erstellen</h1>
</div>
<div>
<h2> Login Daten </h2>
</div>
<div>
<label for="username">Email Adresse</label>
<input class="full-width" type="text" name="username" placeholder="Email Adresse" id="username" required>
</div>
<div>
<label for="password">Passwort</label>
<input class="full-width" type="password" name="password" placeholder="Passwort" id="password" required>
</div>
<div>
<label for="password2">Passwort wiederholen</label>
<input class="full-width" type="password" name="password2" placeholder="Passwort" id="password2" required>
</div>
<div>
<h2> Rechungs- und Lieferinformation </h2>
</div>
<div class="col-2">
<div>
<label for="salutation">Anrede</label>
<input class="full-width" list="salutationsOpt" name="salutation" id="salutation" placeholder="Anrede"
required/>
<datalist id="salutationsOpt">
<option value="Herr">
<option value="Frau">
<option value="Herr Dr.">
<option value="Frau Dr.">
</datalist>
</div>
<div>
<label for="name">Name</label>
<input class="full-width" type="text" name="name" id="name" placeholder="Nachname Vorname" required/>
</div>
</div>
<div>
<label for="address">Anschrift</label>
<textarea rows="5" class="full-width" type="text" name="address" id="address"
placeholder="Optional: Zusatz&#10;Optional: Unternehmen&#10;Straße Hausnummer&#10;Postleitzeit Ort&#10;Land"></textarea>
</div>
<fieldset>
<input type="radio" name="type" value="priv" id="type-priv" required>
<label for="type-priv">Ich bin Privatkunde.</label> <br/>
<input type="radio" name="type" value="bus" id="type-bus" required>
<label for="type-bus">Ich bin Geschäftskunde.</label> <br/>
</fieldset>
<div>
<h2> Werbung </h2>
</div>
<div>
<fieldset>
<input type="radio" name="ad" value="y" id="ad-y" required>
<label for="type-priv">Ich möchte Werbung erhalten.</label> <br/>
<input type="radio" name="ad" value="n" id="ad-n" required>
<label for="type-bus">Ich möchte keine Werbung erhalten.</label> <br/>
</fieldset>
</div>
<div>
<button class="full-width" type="submit" name="action" value="login">Registeren</button>
<a th:href="@{/terms}">
Unsere AGBs finden sie hier.
</a>
</div>
</form>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,93 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Sucherergebnisse</title>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<!-- Dirty hack to align the heading.-->
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Suchergebnisse</h1>
<script th:src="@{/js/back.js}"></script>
<div class="back" data-group="shop" data-name="Zurück zur Suche." data-insert="false"></div>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/shop :: sidebar"></nav>
<div class="content-width">
<div class='grid m condensed'>
<section><a th:href="@{/shop/articles/1234}" class="section">
<img th:src="@{/img/product-1.jpg}">
<h2>Tolle Kamera</h2>
<p class='price'> 25.14&nbsp;EUR</p>
<p>
Eine TOLLE Kamera <br>
Jaja du denkst jetzt bestimmt: "Bei dem Preis kann sie gar nich sooo TOLL sein". <br>
Aber glaub mir, sie is echt echt TOLL! <br>
Indianerehrenwort!
</p>
</a>
</section>
<section><a th:href="@{/shop/articles/1234}" class="section">
<img th:src="@{/img/product-2.jpg}">
<h2>Bluetooth Kopfhörer</h2>
<p class='price'> 10.14&nbsp;EUR</p>
<p>
Sind halt Kopfhörer ohne Kabel, mehr gibts da nich zu sagen.
</p>
</a>
</section>
<section><a th:href="@{/shop/articles/1234}" class="section">
<img th:src="@{/img/product-3.jpg}">
<h2>???</h2>
<p class='price'> 25.14&nbsp;EUR</p>
<p>
Ich weiß selbst nich was das genau sein soll.<br>
Wenn dus willst kannst es gern haben, musst nur das Geld überweisen.
</p>
</a>
</section>
<section><a th:href="@{/shop/articles/1234}" class="section">
<img th:src="@{/img/product-4.jpg}">
<h2>Kamera Stativ.</h2>
<p class='price'> 25.14&nbsp;EUR</p>
<p>
Das Stativ der Zukunft! Jetzt kaufen und verwenden für
wackelfreie Bilder aus der Zukunft!.
</p>
</a>
</section>
<section><a th:href="@{/shop/articles/1234}" class="section">
<img th:src="@{/img/product-5.jpg}">
<h2>Bluetooth Ersatzfernbedinung</h2>
<p class='price'> 10.14&nbsp;EUR</p>
<p>
Kann alles und jeden ausknippsen.
</p>
</a>
</section>
<section class="spacer"></section>
<section class="spacer"></section>
<section class="spacer"></section>
<section class="spacer"></section>
</div>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,57 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Bonusprogramm</title>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Bonusprogramm</h1>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/customer :: sidebar"></nav>
<div class="content-width">
<div class="grid xl">
<div class="card">
<h2> Ihr Bonuspunktestand beträgt: </h2>
<h1 class="huge"> 15 </h1>
</div>
<div class="s">
<h2> Bonuspunkte sichern </h2>
<p>
Sie sichern sich automatisch bei jedem Einkaufen pro Angefangenen
10&nbsp;EUR einen Bonuspunkt.
</p>
<p>
Eine Übersicht ihrer Bonuspunkt finden sie hier auf dieser
Bonus.
</p>
<p>
Um die Bonuspunkte einzulösen hacken sie einfach
"Bonuspunkte" verwenden beim Abschließen der Bestellung
an. Für jeden Bonuspunkt wird ihnen 0,50&nbsp;EUR gutgeschrieben.
</p>
</div>
<div class="s">
<img th:src="@{/img/undraw_gift.svg}"/>
</div>
<div class="spacer"></div>
<div class="spacer"></div>
<div class="spacer"></div>
</div>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,92 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Meine Benachrichtigungen</title>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Meine Benachrichtigungen</h1>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/customer :: sidebar"></nav>
<div>
<div class="grid xl">
<section class="notification unread">
<h2>Nachricht vom 17.08.2020, 14:38 Uhr</h2>
<h3>Ihre Bestellung kommt voraussichtlich am Donnerstag, den 20.08.2020</h3>
<p>
Vielen Dank für Ihre Bestellung der folgenden Artikel:<br>
<br>
2x tolle Kamera<br>
1x Bluetooth Kopfhörer<br>
3x USB-Magic Light<br>
<br>
Die Sendung wird Ihnen voraussichtlich am Donnerstag, den 20.08.2020 zugestellt.
Den aktuellen Status des Pakets können Sie jederzeit in der <a th:href="@{/shop/orders/}">Bestellübersicht</a>
nachvollziehen.
</p>
<button type="button" name="button">Als gelesen makieren</button>
</section>
<section class="notification">
<h2>Nachricht vom 15.08.2020, 16:38 Uhr</h2>
<h3>Jetzt unsere Tagesangebote entdecken.</h3>
<p>
Entdecken sie jetzt unseren neusten Angebote:
</p>
<div class="flowflex">
<div>
<a th:href="@{/shop/articles/1234}" class="section">
<h3>Lorem Ipsum</h3>
<img th:src="@{/img/product-2.jpg}" class="s"/>
<p>Nur 15,00&nbsp;EUR</p>
</a>
</div>
<div>
<a th:href="@{/shop/articles/1234}" class="section">
<h3>Stativ</h3>
<img th:src="@{/img/product-4.jpg}" class="s"/>
<p>Nur 7,00&nbsp;EUR</p>
</a>
</div>
<div>
<a th:href="@{/shop/articles/1234}" class="section">
<h3>Ersatzfernbedinung</h3>
<img th:src="@{/img/product-6.jpg}" class="s"/>
<p>Nur 17,00&nbsp;EUR</p>
</a>
</div>
</div>
</section>
<section class="notification">
<h2>Nachricht vom 13.08.2020, 14:38 Uhr</h2>
<h3>Ihre Bestellung ist angekommen.</h3>
<p>
Vielen Dank für Ihre Bestellung der folgenden Artikel:<br>
<br>
3x USB-Magic Light<br>
<br>
Ihre Bestellungen ist angekommen.
</p>
</section>
<section class="spacer"></section>
<section class="spacer"></section>
<section class="spacer"></section>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

View File

@ -1,193 +0,0 @@
<!DOCTYPE html>
<html lang="de" dir="ltr" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=0.75, user-scalable=no">
<title>Meine Bestellungen</title>
<link rel="stylesheet" th:href="@{/css/ecom.css}"/>
</head>
<body>
<nav th:replace="fragments/header :: header">Header</nav>
<div class="sidebar-layout content-width">
<nav></nav>
<div>
<h1>Meine Bestellungen</h1>
</div>
</div>
<main class="sidebar-layout content-width">
<nav th:replace="fragments/customer :: sidebar"></nav>
<div class="content-width detailflex">
<div>
<h2 id="20202701"> Bestellung vom 27.01.2020 </h2>
<div>
<table class="key-value">
<tr>
<th>Lieferstatus</th>
<td><b>Unterwegs</b> <br/> Vorraussichtliche Ankunft: 29.01.2020</td>
</tr>
<tr>
<th>Sendeverfolgungsnummer</th>
<td>XE51451436DE</td>
</tr>
<tr>
<th></th>
<td>
Hans Maier <br/>
Hauptstraße 12<br/>
74880 Musterstadt<br/>
Deutschland <br/>
</td>
</tr>
<tr>
<th>Eingelösste Bonuspunkte</th>
<td>10</td>
</tr>
</table>
</div>
<table>
<tr>
<th>Bild</th>
<th>Name</th>
<th>Menge</th>
<th>Preis (Brutto)</th>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-1.jpg}" class="s"/><a></td>
<td><a th:href="@{/shop/articles/4151}">Kamera<a/></td>
<td> 1</td>
<td>100,50&nbsp;EUR</td>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-2.jpg}" class="s"/><a/></td>
<td><a th:href="@{/shop/articles/4151}">Earbuds<a/></td>
<td> 3</td>
<td>63,95&nbsp;EUR</td>
</tr>
<tr>
<th></th>
<th></th>
<th>Position</th>
<th>Preis</th>
</tr>
<tr>
<td></td>
<td></td>
<td>Artikel (Netto)</td>
<td> 120,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Bonuspunkte</td>
<td> 5,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Umsatzsteuer (19%)</td>
<td> 42,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
<h3>Gesammtpreis</h3>
</td>
<td>
<h3>240,79&nbsp;EUR</h3>
</td>
</tr>
</table>
</div>
<div>
<h2 id="20200101"> Bestellung vom 01.01.2020 </h2>
<div>
<table class="key-value">
<tr>
<th>Lieferstatus</th>
<td><b>Angekommen</b> <br/> 03.01.2020</td>
</tr>
<tr>
<th>Sendeverfolgungsnummer</th>
<td>XE5140684351DE</td>
</tr>
<tr>
<th></th>
<td>
Hans Maier <br/>
Hauptstraße 12<br/>
74880 Musterstadt<br/>
Deutschland <br/>
</td>
</tr>
<tr>
<th>Gutgeschriebene Bonuspunkte</th>
<td>5</td>
</tr>
</table>
</div>
<table>
<tr>
<th>Bild</th>
<th>Name</th>
<th>Menge</th>
<th>Preis pro Artikel (Brutto)</th>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-1.jpg}" class="s"/><a></td>
<td><a th:href="@{/shop/articles/4151}"> Billige Kamera<a/></td>
<td> 1</td>
<td>40,50&nbsp;EUR</td>
</tr>
<tr>
<td><a th:href="@{/shop/articles/4151}"><img th:src="@{/img/product-5.jpg}" class="s"/><a></td>
<td><a th:href="@{/shop/articles/4151}">Apfel<a/></td>
<td> 5</td>
<td>1,00&nbsp;EUR</td>
</tr>
<tr>
<th></th>
<th></th>
<th>Position</th>
<th>Preis</th>
</tr>
<tr>
<td></td>
<td></td>
<td>Artikel (Netto)</td>
<td> 20,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Umsatzsteuer (19%)</td>
<td> 5,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Umsatzsteuer (7%)</td>
<td> 2,00&nbsp;EUR</td>
</tr>
<tr>
<td></td>
<td></td>
<td>
<h3>Gesammtpreis</h3>
</td>
<td>
<h3>50,79&nbsp;EUR</h3>
</td>
</tr>
</table>
</div>
</div>
</main>
<footer th:replace="fragments/footer :: footer"></footer>
</body>
</html>

32
supplier/.gitignore vendored Normal file
View File

@ -0,0 +1,32 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/

29
supplier/build.gradle Normal file
View File

@ -0,0 +1,29 @@
plugins {
id 'org.springframework.boot' version '2.2.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'org.hso.ecommerce'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}

26
supplier/config/bank.json Normal file
View File

@ -0,0 +1,26 @@
{
"id" : "bank",
"name" : "Bank of Cheese",
"discount" : {
"minimumDailySalesVolumeNetCent": 100,
"percentDiscount": 1
},
"articles": [
{
"title": "Big Mac",
"manufacturer": "Mc Donalds",
"articleNumber": "0x1 BIGMAC",
"vatPercent": 7,
"pricePerUnitNet": 700,
"shouldBeAdvertised": true
},
{
"title": "500£ Schein",
"manufacturer": "Bank",
"articleNumber": "500",
"vatPercent": 0,
"pricePerUnitNet": 50000,
"shouldBeAdvertised": false
}
]
}

View File

@ -0,0 +1,34 @@
{
"id" : "hans",
"name" : "Hans and more",
"discount" : {
"minimumDailySalesVolumeNetCent": 100000,
"percentDiscount": 2
},
"articles": [
{
"title": "Big Mac",
"manufacturer": "Mc Donalds",
"articleNumber": "0x1 BIGMAC",
"vatPercent": 7,
"pricePerUnitNet": 700,
"shouldBeAdvertised": true
},
{
"title": "Pommes",
"manufacturer": "Mc Donalds",
"articleNumber": "0x1 POmes",
"vatPercent": 7,
"pricePerUnitNet": 100,
"shouldBeAdvertised": false
},
{
"title": "Milchshake Premium 19%",
"manufacturer": "Mc Donalds",
"articleNumber": "0x2",
"vatPercent": 19,
"pricePerUnitNet": 50,
"shouldBeAdvertised": true
}
]
}

50
supplier/config/mda.json Normal file
View File

@ -0,0 +1,50 @@
{
"id" : "mda",
"name" : "MDA",
"discount" : {
"minimumDailySalesVolumeNetCent": 20,
"percentDiscount": 3
},
"articles": [
{
"title": "MDA Nezyr 7",
"manufacturer": "MDA",
"articleNumber": "n7",
"vatPercent": 19,
"pricePerUnitNet": 29990,
"shouldBeAdvertised": true
},
{
"title": "MDA Nezyr 5",
"manufacturer": "MDA",
"articleNumber": "n5",
"vatPercent": 19,
"pricePerUnitNet": 19700,
"shouldBeAdvertised": true
},
{
"title": "MDA Nezyr 3",
"manufacturer": "MDA",
"articleNumber": "n3",
"vatPercent": 19,
"pricePerUnitNet": 8990,
"shouldBeAdvertised": false
},
{
"title": "MDA Nezyr Threadcracker 3990",
"manufacturer": "MDA",
"articleNumber": "ntc3990",
"vatPercent": 19,
"pricePerUnitNet": 404900,
"shouldBeAdvertised": true
},
{
"title": "MDA Radon RX 5700",
"manufacturer": "MDA",
"articleNumber": "rrx5700",
"vatPercent": 19,
"pricePerUnitNet": 43624,
"shouldBeAdvertised": true
}
]
}

View File

@ -0,0 +1,34 @@
{
"id" : "nanosoft",
"name" : "Nanosoft",
"discount" : {
"minimumDailySalesVolumeNetCent": 50,
"percentDiscount": 0.5
},
"articles": [
{
"title": "Nanosoft Doors 10",
"manufacturer": "Nanosoft",
"articleNumber": "d10",
"vatPercent": 7,
"pricePerUnitNet": 2099,
"shouldBeAdvertised": true
},
{
"title": "Nanosoft Interior Pro 7",
"manufacturer": "Nanosoft",
"articleNumber": "ip7",
"vatPercent": 19,
"pricePerUnitNet": 90780,
"shouldBeAdvertised": false
},
{
"title": "Nanosoft Ybox Two",
"manufacturer": "Nanosoft",
"articleNumber": "ybox2",
"vatPercent": 19,
"pricePerUnitNet": 23500,
"shouldBeAdvertised": true
}
]
}

View File

@ -0,0 +1,42 @@
{
"id" : "outtel",
"name" : "Outtel",
"discount" : {
"minimumDailySalesVolumeNetCent": 20,
"percentDiscount": 1
},
"articles": [
{
"title": "Outtel Core o7",
"manufacturer": "Outtel",
"articleNumber": "o7",
"vatPercent": 19,
"pricePerUnitNet": 40000,
"shouldBeAdvertised": true
},
{
"title": "Outtel Core o5",
"manufacturer": "Outtel",
"articleNumber": "o5",
"vatPercent": 19,
"pricePerUnitNet": 25000,
"shouldBeAdvertised": true
},
{
"title": "Outtel Core o3",
"manufacturer": "Outtel",
"articleNumber": "o3",
"vatPercent": 7,
"pricePerUnitNet": 8000,
"shouldBeAdvertised": false
},
{
"title": "Outtel Core o9",
"manufacturer": "Outtel",
"articleNumber": "o9",
"vatPercent": 19,
"pricePerUnitNet": 55000,
"shouldBeAdvertised": true
}
]
}

50
supplier/config/pear.json Normal file
View File

@ -0,0 +1,50 @@
{
"id" : "pear",
"name" : "Pear",
"discount" : {
"minimumDailySalesVolumeNetCent": 100,
"percentDiscount": 2
},
"articles": [
{
"title": "Pear iMobile 10",
"manufacturer": "Pear",
"articleNumber": "iM10",
"vatPercent": 19,
"pricePerUnitNet": 31500,
"shouldBeAdvertised": true
},
{
"title": "Pear iPlate Plus",
"manufacturer": "Pear",
"articleNumber": "ipp",
"vatPercent": 19,
"pricePerUnitNet": 44900,
"shouldBeAdvertised": true
},
{
"title": "Pear iDonalds 9",
"manufacturer": "Pear",
"articleNumber": "id9",
"vatPercent": 19,
"pricePerUnitNet": 234800,
"shouldBeAdvertised": true
},
{
"title": "Pear GroundPods",
"manufacturer": "Pear",
"articleNumber": "gp",
"vatPercent": 7,
"pricePerUnitNet": 13599,
"shouldBeAdvertised": true
},
{
"title": "Pear Donalsbook Pro",
"manufacturer": "Pear",
"articleNumber": "dbp",
"vatPercent": 7,
"pricePerUnitNet": 145900,
"shouldBeAdvertised": true
}
]
}

View File

@ -0,0 +1,42 @@
{
"id" : "sumsang",
"name" : "Sumsang",
"discount" : {
"minimumDailySalesVolumeNetCent": 300,
"percentDiscount": 2
},
"articles": [
{
"title": "Sumsang Universe S10",
"manufacturer": "Sumsang",
"articleNumber": "us10",
"vatPercent": 19,
"pricePerUnitNet": 59000,
"shouldBeAdvertised": true
},
{
"title": "Sumsang Universe S10e",
"manufacturer": "Sumsang",
"articleNumber": "us10e",
"vatPercent": 19,
"pricePerUnitNet": 70231,
"shouldBeAdvertised": false
},
{
"title": "Sumsang DumbTV",
"manufacturer": "Sumsang",
"articleNumber": "dtv",
"vatPercent": 19,
"pricePerUnitNet": 38395,
"shouldBeAdvertised": true
},
{
"title": "Sumsang UniverseWatch",
"manufacturer": "Sumsang",
"articleNumber": "uw",
"vatPercent": 19,
"pricePerUnitNet": 20494,
"shouldBeAdvertised": true
}
]
}

View File

@ -0,0 +1,58 @@
{
"id" : "techdealer",
"name" : "Tech Dealer",
"discount" : {
"minimumDailySalesVolumeNetCent": 100,
"percentDiscount": 2
},
"articles": [
{
"title": "TROPIC Gehäuselüfter",
"manufacturer": "TROPIC",
"articleNumber": "tgl",
"vatPercent": 19,
"pricePerUnitNet": 459,
"shouldBeAdvertised": true
},
{
"title": "Pirate PC-Netzteil",
"manufacturer": "Pirate",
"articleNumber": "ppcn",
"vatPercent": 19,
"pricePerUnitNet": 9355,
"shouldBeAdvertised": true
},
{
"title": "Pirate Void Elite RGB Wireless Gaming Headset",
"manufacturer": "Pirate",
"articleNumber": "pvergbwgh",
"vatPercent": 7,
"pricePerUnitNet": 10999,
"shouldBeAdvertised": false
},
{
"title": "Aeroheat CYLON PC-Gehäuse",
"manufacturer": "Aeroheat",
"articleNumber": "acpcg",
"vatPercent": 19,
"pricePerUnitNet": 3999,
"shouldBeAdvertised": true
},
{
"title": "Illogitech C270 Webcam",
"manufacturer": "Illogitech",
"articleNumber": "ic270w",
"vatPercent": 19,
"pricePerUnitNet": 3499,
"shouldBeAdvertised": true
},
{
"title": "Illogitech Z607 Surround Sound Lautsprecher",
"manufacturer": "Illogitech",
"articleNumber": "iz607ssl",
"vatPercent": 19,
"pricePerUnitNet": 9495,
"shouldBeAdvertised": false
}
]
}

Binary file not shown.

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

185
supplier/gradlew vendored Executable file
View File

@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

104
supplier/gradlew.bat vendored Normal file
View File

@ -0,0 +1,104 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

1
supplier/settings.gradle Normal file
View File

@ -0,0 +1 @@
rootProject.name = 'supplier'

View File

@ -0,0 +1,11 @@
package org.hso.ecommerce.supplier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

View File

@ -0,0 +1,45 @@
package org.hso.ecommerce.supplier;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.hso.ecommerce.supplier.data.Supplier;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class ConfigurationReader {
public static List<Supplier> read() throws IOException {
File dir = new File("./config/");
System.out.println("Loading Config in " + dir.getAbsolutePath());
ArrayList<Supplier> ret = Files.list(dir.toPath()).map(path -> {
System.out.println("Iterating over; " + path);
if (path.toString().endsWith(".json")) {
try {
String jsonData = Files.readString(path, StandardCharsets.UTF_8);
ObjectMapper objectMapper = new ObjectMapper();
Supplier sup = objectMapper.readValue(jsonData, Supplier.class);
System.out.println("Loaded " + sup.id);
return sup;
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("Skipping because of file extension.");
}
return null;
}).collect(Collectors.toCollection(ArrayList::new));
ret.removeIf(Objects::isNull);
return ret;
}
}

View File

@ -0,0 +1,106 @@
package org.hso.ecommerce.supplier;
import org.hso.ecommerce.supplier.carrier.Avian;
import org.hso.ecommerce.supplier.carrier.Carrier;
import org.hso.ecommerce.supplier.carrier.Posaidon;
import org.hso.ecommerce.supplier.carrier.Shredder;
import org.hso.ecommerce.supplier.data.Article;
import org.hso.ecommerce.supplier.data.Order;
import org.hso.ecommerce.supplier.data.OrderConfirmation;
import org.hso.ecommerce.supplier.data.Supplier;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@RestController
public class RequestController {
private final HashMap<String, Integer> dailySalesVolumeCent = new HashMap<>();
private final HashMap<String, Supplier> knownSuppliers = new HashMap<>();
private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
private final Carrier[] carriers = new Carrier[]{
new Avian(), new Posaidon(), new Shredder()
};
@PostConstruct
public void init() throws IOException {
for (Supplier s : ConfigurationReader.read()) {
knownSuppliers.put(s.id, s);
}
}
@GetMapping("/")
public List<Supplier> index() {
return new ArrayList<>(knownSuppliers.values());
}
@GetMapping("/{supplier}/")
public Supplier supplier(HttpServletResponse res, @PathVariable("supplier") String supplierName) {
Supplier s = knownSuppliers.get(supplierName);
if (s == null) {
res.setStatus(HttpServletResponse.SC_NOT_FOUND);
}
return s;
}
@PostMapping("/{supplier}/order")
public OrderConfirmation order(HttpServletResponse res, @PathVariable("supplier") String supplierName, @RequestBody Order order) {
Supplier s = knownSuppliers.get(supplierName);
if (s == null) {
res.setStatus(HttpServletResponse.SC_NOT_FOUND);
return null;
}
String dateKey = simpleDateFormat.format(new Date());
int dailyVolume = dailySalesVolumeCent.getOrDefault(dateKey, 0);
Article a = s.findArticle(order.manufacturer, order.articleNumber);
if (a == null) {
res.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return null;
}
int priceNet = a.pricePerUnitNet * order.quantity;
int discountableNetAmount = 0;
if (dailyVolume >= s.discount.minimumDailySalesVolumeNetCent) {
// grant discount on the full price
discountableNetAmount = priceNet;
} else if (dailyVolume + priceNet > s.discount.minimumDailySalesVolumeNetCent) {
// grant partial discount
discountableNetAmount = dailyVolume + priceNet - s.discount.minimumDailySalesVolumeNetCent;
}
int discount = (discountableNetAmount * s.discount.percentDiscount) / 100;
Carrier selectedCarrier = carriers[Math.abs((supplierName + java.time.LocalDate.now()).hashCode()) % carriers.length];
OrderConfirmation confirmation = new OrderConfirmation();
confirmation.articleNumber = order.articleNumber;
confirmation.discountNetCent = discount;
confirmation.pricePerUnitNetCent = a.pricePerUnitNet;
confirmation.manufacturer = a.manufacturer;
confirmation.quantity = order.quantity;
confirmation.totalPriceNetCharged = priceNet - discount;
confirmation.carrier = selectedCarrier.getName();
confirmation.trackingId = selectedCarrier.generateTrackingId();
confirmation.estimatedArrival = selectedCarrier.arrivalEstimate();
if (confirmation.totalPriceNetCharged > order.maxTotalPriceCentNet) {
res.setStatus(HttpServletResponse.SC_EXPECTATION_FAILED);
return null;
}
dailyVolume += confirmation.totalPriceNetCharged;
dailySalesVolumeCent.put(dateKey, dailyVolume);
return confirmation;
}
}

View File

@ -0,0 +1,28 @@
package org.hso.ecommerce.supplier.carrier;
import java.time.LocalDateTime;
import java.util.Random;
public class Avian implements Carrier {
@Override
public String getName() {
return "Avian Carriers";
}
@Override
public String generateTrackingId() {
Random rnd = new Random();
return "2001-"
+ Integer.toHexString(rnd.nextInt(0xFFFF))
+ "--"
+ Integer.toHexString(rnd.nextInt(0xFFFF))
+ "-"
+ Integer.toHexString(rnd.nextInt(0xFFFF));
}
@Override
public LocalDateTime arrivalEstimate() {
return LocalDateTime.now().plusHours(8);
}
}

View File

@ -0,0 +1,12 @@
package org.hso.ecommerce.supplier.carrier;
import java.time.LocalDateTime;
public interface Carrier {
public String getName();
public String generateTrackingId();
public LocalDateTime arrivalEstimate();
}

View File

@ -0,0 +1,26 @@
package org.hso.ecommerce.supplier.carrier;
import java.time.LocalDateTime;
import java.util.Random;
public class Posaidon implements Carrier {
@Override
public String getName() {
return "Poseidon Inc.";
}
@Override
public String generateTrackingId() {
Random rnd = new Random();
return "WAT"
+ Integer.toString(rnd.nextInt(Short.MAX_VALUE))
+ "3"
+ Integer.toString(rnd.nextInt(Short.MAX_VALUE))
+ "R";
}
@Override
public LocalDateTime arrivalEstimate() {
return LocalDateTime.now().plusHours(50);
}
}

View File

@ -0,0 +1,31 @@
package org.hso.ecommerce.supplier.carrier;
import java.time.LocalDateTime;
import java.util.Random;
public class Shredder implements Carrier {
private Random rnd = new Random();
@Override
public String getName() {
return "Schree & Derr";
}
@Override
public String generateTrackingId() {
return "O" + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + d() + "0";
}
@Override
public LocalDateTime arrivalEstimate() {
return LocalDateTime.now().plusHours(22);
}
/**
* @return a random digit followed by a dash.
*/
private String d() {
return Integer.toString(rnd.nextInt(9)) + "-";
}
}

View File

@ -0,0 +1,11 @@
package org.hso.ecommerce.supplier.data;
public class Article {
public String title;
public String manufacturer;
public String articleNumber;
public int vatPercent;
public int pricePerUnitNet;
public boolean shouldBeAdvertised;
}

View File

@ -0,0 +1,9 @@
package org.hso.ecommerce.supplier.data;
public class Order {
public String manufacturer;
public String articleNumber;
public int quantity;
public int maxTotalPriceCentNet;
}

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