]> git.mxchange.org Git - jfinancials-war.git/blob
b99eabd7a438b7ca0a0c1f7bcfff84171e48870b
[jfinancials-war.git] /
1 /*
2  * Copyright (C) 2016 - 2022 Free Software Foundation
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Affero General Public License as
6  * published by the Free Software Foundation, either version 3 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Affero General Public License for more details.
13  *
14  * You should have received a copy of the GNU Affero General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 package org.mxchange.jfinancials.beans.generic_product.action;
18
19 import java.math.BigDecimal;
20 import java.text.MessageFormat;
21 import java.util.Objects;
22 import javax.ejb.EJB;
23 import javax.enterprise.event.Event;
24 import javax.enterprise.inject.Any;
25 import javax.faces.FacesException;
26 import javax.faces.application.FacesMessage;
27 import javax.faces.view.ViewScoped;
28 import javax.faces.view.facelets.FaceletException;
29 import javax.inject.Inject;
30 import javax.inject.Named;
31 import org.mxchange.jcontactsbusiness.model.basicdata.BasicData;
32 import org.mxchange.jfinancials.beans.BaseFinancialsBean;
33 import org.mxchange.jfinancials.beans.generic_product.list.FinancialsProductListWebViewController;
34 import org.mxchange.jproduct.events.product.added.AddedProductEvent;
35 import org.mxchange.jproduct.events.product.added.ProductAddedEvent;
36 import org.mxchange.jproduct.events.product.updated.ObservableProductUpdatedEvent;
37 import org.mxchange.jproduct.events.product.updated.ProductUpdatedEvent;
38 import org.mxchange.jproduct.exceptions.product.ProductAlreadyAddedException;
39 import org.mxchange.jproduct.exceptions.product.ProductNotFoundException;
40 import org.mxchange.jproduct.model.category.Category;
41 import org.mxchange.jproduct.model.product.AdminProductSessionBeanRemote;
42 import org.mxchange.jproduct.model.product.GenericProduct;
43 import org.mxchange.jproduct.model.product.Product;
44 import org.mxchange.jproduct.model.product.agegroup.AgeGroup;
45
46 /**
47  * Main application class
48  * <p>
49  * @author Roland Häder<roland@mxchange.org>
50  */
51 @Named ("adminGenericProductActionController")
52 @ViewScoped
53 public class FinancialAdminGenericProductActionWebViewBean extends BaseFinancialsBean implements FinancialAdminProductActionWebViewController {
54
55         /**
56          * Serial number
57          */
58         private static final long serialVersionUID = 5_819_375_183_472_872L;
59
60         /**
61          * Event for added currentProduct
62          */
63         @Inject
64         @Any
65         private Event<AddedProductEvent> addedProductEvent;
66
67         /**
68          * Remote bean for products
69          */
70         @EJB (lookup = "java:global/jfinancials-ejb/adminProduct!org.mxchange.jproduct.model.product.AdminProductSessionBeanRemote")
71         private AdminProductSessionBeanRemote adminProductBean;
72
73         /**
74          * Product instance
75          */
76         private Product currentProduct;
77
78         /**
79          * Product's age group
80          */
81         private AgeGroup productAgeGroup;
82
83         /**
84          * Availability
85          */
86         private Boolean productAvailability;
87
88         /**
89          * Barcode number
90          */
91         private String productBarCodeNumber;
92
93         /**
94          * Category instance
95          */
96         private Category productCategory;
97
98         /**
99          * Product's price currency code like EUR or USD
100          */
101         private String productCurrencyCode;
102
103         /**
104          * Product's FSC number
105          */
106         private String productFscNumber;
107
108         /**
109          * Product's gross price
110          */
111         private BigDecimal productGrossPrice;
112
113         /**
114          * I18n key of currentProduct
115          */
116         private String productI18nKey;
117
118         /**
119          * Product id
120          */
121         private Long productId;
122
123         /**
124          * Product list controller
125          */
126         @Inject
127         private FinancialsProductListWebViewController productListController;
128
129         /**
130          * Product's manufacturing/producing company
131          */
132         private BasicData productManufacturer;
133
134         /**
135          * Product's net price
136          */
137         private BigDecimal productNetPrice;
138
139         /**
140          * Product number
141          */
142         private Long productNumber;
143
144         /**
145          * Product size (for shoes, clothings)
146          */
147         private String productSize;
148
149         /**
150          * Product's tax rate
151          */
152         private BigDecimal productTaxRate;
153
154         /**
155          * Product's unit amount
156          */
157         private BigDecimal productUnitAmount;
158
159         /**
160          * Product's i18n key
161          */
162         private String productUnitI18nKey;
163
164         /**
165          * Event for updated currentProduct
166          */
167         @Inject
168         @Any
169         private Event<ObservableProductUpdatedEvent> updatedProductEvent;
170
171         /**
172          * Default constructor
173          */
174         public FinancialAdminGenericProductActionWebViewBean () {
175                 // Call super constructor
176                 super();
177         }
178
179         /**
180          * Adds given product data from request to database
181          * <p>
182          * @throws FaceletException If something unexpected happened
183          */
184         public void addProduct () throws FaceletException {
185                 // Is product i18n key already used?
186                 if (this.productListController.isProductI18nKeyAdded(this.getProductI18nKey())) {
187                         // Then throw exception
188                         throw new FacesException(MessageFormat.format("Product i18n key {0} already added.", this.getProductI18nKey())); //NOI18N
189                 }
190
191                 // Create current product instance
192                 final Product product = this.createProductInstance();
193
194                 // Declare updated current product instance
195                 final Product updatedProduct;
196
197                 try {
198                         // Call EJB
199                         updatedProduct = this.adminProductBean.addGenericProduct(product);
200                 } catch (final ProductAlreadyAddedException ex) {
201                         // Continue to throw
202                         throw new FacesException(ex);
203                 }
204
205                 // Fire event
206                 this.addedProductEvent.fire(new ProductAddedEvent(updatedProduct));
207         }
208
209         /**
210          * Copies all currentProduct's properties back to this bean.
211          */
212         public void copyAllProductProperties () {
213                 // Validate current product instance
214                 if (this.getCurrentProduct() == null) {
215                         // Throw NPE
216                         throw new NullPointerException("this.product is null"); //NOI18N
217                 } else if (this.getCurrentProduct().getProductId() == null) {
218                         // Throw NPE again
219                         throw new NullPointerException("this.product.productId is null"); //NOI18N
220                 } else if (this.getCurrentProduct().getProductId() < 1) {
221                         // Not valid
222                         throw new IllegalStateException(MessageFormat.format("this.product.productId={0} is not valid.", this.getCurrentProduct().getProductId())); //NOI18N
223                 }
224
225                 // Now copy all fields
226                 this.setProductAgeGroup(this.getCurrentProduct().getProductAgeGroup());
227                 this.setProductAvailability(this.getCurrentProduct().getProductAvailability());
228                 this.setProductBarCodeNumber(this.getCurrentProduct().getProductBarCodeNumber());
229                 this.setProductCategory(this.getCurrentProduct().getProductCategory());
230                 this.setProductCurrencyCode(this.getCurrentProduct().getProductCurrencyCode());
231                 this.setProductFscNumber(this.getCurrentProduct().getProductFscNumber());
232                 this.setProductGrossPrice(this.getCurrentProduct().getProductGrossPrice());
233                 this.setProductI18nKey(this.getCurrentProduct().getProductI18nKey());
234                 this.setProductId(this.getCurrentProduct().getProductId());
235                 this.setProductManufacturer(this.getCurrentProduct().getProductManufacturer());
236                 this.setProductNetPrice(this.getCurrentProduct().getProductNetPrice());
237                 this.setProductNumber(this.getCurrentProduct().getProductNumber());
238                 this.setProductSize(this.getCurrentProduct().getProductSize());
239                 this.setProductTaxRate(this.getCurrentProduct().getProductTaxRate());
240                 this.setProductUnitAmount(this.getCurrentProduct().getProductUnitAmount());
241                 this.setProductUnitI18nKey(this.getCurrentProduct().getProductUnitI18nKey());
242         }
243
244         /**
245          * Getter for current product instance
246          * <p>
247          * @return Product instance
248          */
249         public Product getCurrentProduct () {
250                 return this.currentProduct;
251         }
252
253         /**
254          * Setter for current product instance
255          * <p>
256          * @param currentProduct Current product instance
257          */
258         public void setCurrentProduct (final Product currentProduct) {
259                 this.currentProduct = currentProduct;
260         }
261
262         /**
263          * Getter for product's age group
264          * <p>
265          * @return Product's age group
266          */
267         public AgeGroup getProductAgeGroup () {
268                 return this.productAgeGroup;
269         }
270
271         /**
272          * Setter for product's age group
273          * <p>
274          * @param productAgeGroup Product's age group
275          */
276         public void setProductAgeGroup (final AgeGroup productAgeGroup) {
277                 this.productAgeGroup = productAgeGroup;
278         }
279
280         /**
281          * Getter for product's available
282          * <p>
283          * @return Product's available
284          */
285         public Boolean getProductAvailability () {
286                 return this.productAvailability;
287         }
288
289         /**
290          * Setter for product's available
291          * <p>
292          * @param productAvailability Product's available
293          */
294         public void setProductAvailability (final Boolean productAvailability) {
295                 this.productAvailability = productAvailability;
296         }
297
298         /**
299          * Getter for product's bar-code number
300          * <p>
301          * @return Product's bar-code number
302          */
303         public String getProductBarCodeNumber () {
304                 return this.productBarCodeNumber;
305         }
306
307         /**
308          * Setter for product's bar-code number
309          * <p>
310          * @param productBarCodeNumber Product's bar-code number
311          */
312         public void setProductBarCodeNumber (final String productBarCodeNumber) {
313                 this.productBarCodeNumber = productBarCodeNumber;
314         }
315
316         /**
317          * Getter for product's category
318          * <p>
319          * @return Product's category
320          */
321         public Category getProductCategory () {
322                 return this.productCategory;
323         }
324
325         /**
326          * Setter for product's category instance
327          * <p>
328          * @param productCategory Product's category instance
329          */
330         public void setProductCategory (final Category productCategory) {
331                 this.productCategory = productCategory;
332         }
333
334         /**
335          * Getter for product's price currency code
336          * <p>
337          * @return Product's price currency code
338          */
339         public String getProductCurrencyCode () {
340                 return this.productCurrencyCode;
341         }
342
343         /**
344          * Setter for product's price currency code
345          * <p>
346          * @param productCurrencyCode Product's price currency code
347          */
348         public void setProductCurrencyCode (final String productCurrencyCode) {
349                 this.productCurrencyCode = productCurrencyCode;
350         }
351
352         /**
353          * Getter for product's FSC number
354          * <p>
355          * @return Product's FSC number
356          */
357         public String getProductFscNumber () {
358                 return this.productFscNumber;
359         }
360
361         /**
362          * Setter for product's FSC number
363          * <p>
364          * @param productFscNumber Product's FSC number
365          */
366         public void setProductFscNumber (final String productFscNumber) {
367                 this.productFscNumber = productFscNumber;
368         }
369
370         /**
371          * Getter for product's gross price
372          * <p>
373          * @return Product's gross price
374          */
375         public BigDecimal getProductGrossPrice () {
376                 return this.productGrossPrice;
377         }
378
379         /**
380          * Setter for product's gross price
381          * <p>
382          * @param productGrossPrice Product's gross price
383          */
384         public void setProductGrossPrice (final BigDecimal productGrossPrice) {
385                 this.productGrossPrice = productGrossPrice;
386         }
387
388         /**
389          * Getter for product unit's i18n key
390          * <p>
391          * @return Product's i18n key
392          */
393         public String getProductI18nKey () {
394                 return this.productI18nKey;
395         }
396
397         /**
398          * Setter for product unit's i18n key
399          * <p>
400          * @param productI18nKey Product's i18n key
401          */
402         public void setProductI18nKey (final String productI18nKey) {
403                 this.productI18nKey = productI18nKey;
404         }
405
406         /**
407          * Getter for product id
408          * <p>
409          * @return Product id
410          */
411         public Long getProductId () {
412                 return this.productId;
413         }
414
415         /**
416          * Setter for product id
417          * <p>
418          * @param productId Product id
419          */
420         public void setProductId (final Long productId) {
421                 this.productId = productId;
422         }
423
424         /**
425          * Getter for product's manufacturing/producing company
426          * <p>
427          * @return Product's manufacturing/producing company
428          */
429         public BasicData getProductManufacturer () {
430                 return this.productManufacturer;
431         }
432
433         /**
434          * Setter for product's manufacturing/producing company
435          * <p>
436          * @param productManufacturer Product's manufacturing/producing company
437          */
438         public void setProductManufacturer (final BasicData productManufacturer) {
439                 this.productManufacturer = productManufacturer;
440         }
441
442         /**
443          * Getter for product's net price
444          * <p>
445          * @return Product's net price
446          */
447         public BigDecimal getProductNetPrice () {
448                 return this.productNetPrice;
449         }
450
451         /**
452          * Setter for product's net price
453          * <p>
454          * @param productNetPrice Product's net price
455          */
456         public void setProductNetPrice (final BigDecimal productNetPrice) {
457                 this.productNetPrice = productNetPrice;
458         }
459
460         /**
461          * Getter for product's number
462          * <p>
463          * @return Product's number
464          */
465         public Long getProductNumber () {
466                 return this.productNumber;
467         }
468
469         /**
470          * Setter for product's number
471          * <p>
472          * @param productNumber Product's number
473          */
474         public void setProductNumber (final Long productNumber) {
475                 this.productNumber = productNumber;
476         }
477
478         /**
479          * Getter for product's size
480          * <p>
481          * @return Product's size
482          */
483         public String getProductSize () {
484                 return this.productSize;
485         }
486
487         /**
488          * Setter for product's size
489          * <p>
490          * @param productSize Product's size
491          */
492         public void setProductSize (final String productSize) {
493                 this.productSize = productSize;
494         }
495
496         /**
497          * Getter for product's tax rate
498          * <p>
499          * @return Product's tax rate
500          */
501         public BigDecimal getProductTaxRate () {
502                 return this.productTaxRate;
503         }
504
505         /**
506          * Setter for product's tax rate
507          * <p>
508          * @param productTaxRate Product's tax rate
509          */
510         public void setProductTaxRate (final BigDecimal productTaxRate) {
511                 this.productTaxRate = productTaxRate;
512         }
513
514         /**
515          * Getter for product's unit amount
516          * <p>
517          * @return Product's unit amount
518          */
519         public BigDecimal getProductUnitAmount () {
520                 return this.productUnitAmount;
521         }
522
523         /**
524          * Setter for product's unit amount
525          * <p>
526          * @param productUnitAmount Product's unit amount
527          */
528         public void setProductUnitAmount (final BigDecimal productUnitAmount) {
529                 this.productUnitAmount = productUnitAmount;
530         }
531
532         /**
533          * Getter for product unit's i18n key
534          * <p>
535          * @return Product's i18n key
536          */
537         public String getProductUnitI18nKey () {
538                 return this.productUnitI18nKey;
539         }
540
541         /**
542          * Setter for product unit's i18n key
543          * <p>
544          * @param productUnitI18nKey Product unit's i18n key
545          */
546         public void setProductUnitI18nKey (final String productUnitI18nKey) {
547                 this.productUnitI18nKey = productUnitI18nKey;
548         }
549
550         /**
551          * Updates given product data from request to database
552          * <p>
553          * @return Redirection outcome
554          * <p>
555          * @throws FaceletException If something unexpected happened
556          */
557         public String updateProduct () throws FaceletException {
558                 // Get new product instance
559                 final Product newProduct = this.createProductInstance();
560
561                 // Check if current product instance is in helper and valid
562                 if (null == newProduct) {
563                         // Throw NPE
564                         throw new NullPointerException("newProduct is null"); //NOI18N
565                 } else if (newProduct.getProductId() == null) {
566                         // Throw NPE again
567                         throw new NullPointerException("newProduct.productId is null"); //NOI18N
568                 } else if (newProduct.getProductId() < 1) {
569                         // Invalid id
570                         throw new IllegalStateException(MessageFormat.format("newProduct.productId={0} is invalid", newProduct.getProductId())); //NOI18N
571                 }
572
573                 // Has the product changed?
574                 if (Objects.equals(newProduct, this.getCurrentProduct())) {
575                         // Is the same product data, output message
576                         this.showFacesMessage("admin-form-edit-generic-product:productI18nKey", "ADMIN_GENERIC_PRODUCT_NOT_UPDATED", FacesMessage.SEVERITY_WARN); //NOI18N
577                         return ""; //NOI18N
578                 }
579
580                 // Init productr
581                 final Product updatedProduct;
582
583                 try {
584                         // Call EJB for updating product data
585                         updatedProduct = this.adminProductBean.updateProductData(newProduct);
586                 } catch (final ProductNotFoundException ex) {
587                         // Throw again
588                         throw new FacesException(ex);
589                 }
590
591                 // Fire event
592                 this.updatedProductEvent.fire(new ProductUpdatedEvent(updatedProduct));
593
594                 // Clear bean
595                 this.clear();
596
597                 // Return to admin-list view
598                 return "admin_list_generic_products"; //NOI18N
599         }
600
601         /**
602          * Clears this bean (example: product has been added)
603          */
604         private void clear () {
605                 // Clear all data
606                 this.setProductAgeGroup(null);
607                 this.setProductAvailability(Boolean.FALSE);
608                 this.setProductBarCodeNumber(null);
609                 this.setProductCategory(null);
610                 this.setProductFscNumber(null);
611                 this.setProductGrossPrice(null);
612                 this.setProductI18nKey(null);
613                 this.setProductId(null);
614                 this.setProductManufacturer(null);
615                 this.setProductNetPrice(null);
616                 this.setProductNumber(null);
617                 this.setProductSize(null);
618                 this.setProductTaxRate(null);
619                 this.setProductUnitAmount(null);
620                 this.setProductUnitI18nKey(null);
621         }
622
623         /**
624          * Creates a new product instance with all fields
625          * <p>
626          * @return Product instance
627          */
628         private Product createProductInstance () {
629                 // Create new product instance
630                 final Product newProduct = new GenericProduct(
631                                           this.getProductI18nKey(),
632                                           this.getProductGrossPrice(),
633                                           this.getProductCurrencyCode(),
634                                           this.getProductCategory(),
635                                           this.getProductAvailability(),
636                                           this.getProductUnitAmount(),
637                                           this.getProductUnitI18nKey()
638                           );
639
640                 // Set all optional fields
641                 newProduct.setProductAgeGroup(this.getProductAgeGroup());
642                 newProduct.setProductBarCodeNumber(this.getProductBarCodeNumber());
643                 newProduct.setProductFscNumber(this.getProductFscNumber());
644                 newProduct.setProductId(this.getProductId());
645                 newProduct.setProductManufacturer(this.getProductManufacturer());
646                 newProduct.setProductNetPrice(this.getProductNetPrice());
647                 newProduct.setProductNumber(this.getProductNumber());
648                 newProduct.setProductSize(this.getProductSize());
649                 newProduct.setProductTaxRate(this.getProductTaxRate());
650
651                 // Return it
652                 return newProduct;
653         }
654
655 }