PQT_Gestionnaire_vent_stock/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenModel.java

231 lines
7.3 KiB
Java

package com.pqt.client.gui.modules.sale_screen;
import com.pqt.client.gui.modules.sale_screen.listeners.ISaleScreenModelListener;
import com.pqt.client.module.account.AccountService;
import com.pqt.client.module.account.listeners.IAccountListener;
import com.pqt.client.module.sale.SaleBuilder;
import com.pqt.client.module.sale.SaleService;
import com.pqt.client.module.sale.listeners.ISaleListener;
import com.pqt.client.module.stock.Listeners.IStockListener;
import com.pqt.client.module.stock.StockService;
import com.pqt.core.entities.product.Product;
import com.pqt.core.entities.sale.Sale;
import com.pqt.core.entities.sale.SaleStatus;
import com.pqt.core.entities.sale.SaleType;
import com.pqt.core.entities.user_account.Account;
import com.pqt.core.entities.user_account.AccountLevel;
import javax.swing.event.EventListenerList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
class SaleScreenModel {
private EventListenerList listeners;
private AccountService accountService;
private StockService stockService;
private SaleService saleService;
private SaleBuilder currentSaleBuilder;
private long tempSaleId;
SaleScreenModel(AccountService accountService, StockService stockService, SaleService saleService) {
if(accountService==null || stockService==null || saleService==null)
throw new NullPointerException("At least one of the following services is null : account, stock, sale");
listeners = new EventListenerList();
this.accountService = accountService;
this.stockService = stockService;
this.saleService = saleService;
saleService.addListener(new ISaleListener() {
@Override
public void onSaleValidationSuccess(long saleId) {
if(saleId == SaleScreenModel.this.tempSaleId){
SaleScreenModel.this.fireSaleValidatedEvent();
}
}
@Override
public void onSaleValidationError(long saleId, Throwable cause) {
if(saleId == SaleScreenModel.this.tempSaleId){
SaleScreenModel.this.fireSaleNotValidatedEvent(SaleStatus.ABORTED, cause);
}
}
@Override
public void onSaleValidationRefused(long saleId, Throwable cause) {
if(saleId == SaleScreenModel.this.tempSaleId){
SaleScreenModel.this.fireSaleNotValidatedEvent(SaleStatus.REFUSED, cause);
}
}
});
stockService.addListener(new IStockListener() {
@Override
public void onGetProductListSuccessEvent() {
}
@Override
public void onGetProductListErrorEvent(Throwable cause) {
}
@Override
public void onGetProductListRefusedEvent(Throwable cause) {
}
@Override
public void onProductListUpdateSuccessEvent(long id) {
}
@Override
public void onProductListUpdateErrorEvent(long id, Throwable cause) {
}
@Override
public void onProductListUpdateRefusedEvent(long id, Throwable cause) {
}
@Override
public void onProductListChangedEvent() {
fireStockUpdatedEvent();
}
});
accountService.addListener(new IAccountListener() {
@Override
public void onAccountStatusChangedEvent(boolean status) {
fireAccountConnectedStatusUpdateEvent();
}
@Override
public void onAccountStatusNotChangedEvent(Throwable cause) {
}
@Override
public void onAccountListChangedEvent() {
fireAccountListUpdatedEvent();
}
});
clearSale();
}
private void fireSaleValidatedEvent() {
Arrays.stream(listeners.getListeners(ISaleScreenModelListener.class))
.forEach(ISaleScreenModelListener::onSaleValidatedEvent);
}
private void fireSaleNotValidatedEvent(SaleStatus status, Throwable cause) {
Arrays.stream(listeners.getListeners(ISaleScreenModelListener.class))
.forEach(l->l.onSaleNotValidatedEvent(status, cause));
}
private void fireStockUpdatedEvent(){
Arrays.stream(listeners.getListeners(ISaleScreenModelListener.class))
.forEach(ISaleScreenModelListener::onStockUpdatedEvent);
}
private void fireAccountListUpdatedEvent(){
Arrays.stream(listeners.getListeners(ISaleScreenModelListener.class))
.forEach(ISaleScreenModelListener::onAccountListUpdatedEvent);
}
private void fireAccountConnectedStatusUpdateEvent() {
Arrays.stream(listeners.getListeners(ISaleScreenModelListener.class))
.forEach(ISaleScreenModelListener::onAccountConnectedStateUpdatedEvent);
}
Collection<Account> getAccountList() {
return accountService.getAllAccounts();
}
List<SaleType> getSaleTypeList() {
return saleService.getSaleTypes();
}
Sale getCurrentSale() {
return currentSaleBuilder!=null?currentSaleBuilder.build():null;
}
List<Product> getProductList() {
return stockService.getProducts().stream().filter(Product::isSellable).collect(Collectors.toList());
}
void clearSale() {
currentSaleBuilder = getNewSaleBuilder();
tempSaleId = -1;
}
private SaleBuilder getNewSaleBuilder(){
SaleBuilder saleBuilder = saleService.getNewSaleBuilder();
saleBuilder.orderedBy(accountService.getCurrentAccount());
saleBuilder.saleType(SaleType.CASH);
return saleBuilder;
}
boolean commitSale() {
if(!checkValidity(currentSaleBuilder.build()))
return false;
tempSaleId = saleService.commitSale(currentSaleBuilder);
return tempSaleId!=-1;
}
boolean checkValidity(Sale sale) {
return sale.getProducts().size()>0
&& sale.getOrderedBy()!=null
&& sale.getType()!=null;
}
long getTempSaleId(){
return tempSaleId;
}
void addProductToSale(Product product) {
if(currentSaleBuilder!=null)
currentSaleBuilder.addProduct(product);
}
void removeProductFromSale(Product product) {
if(currentSaleBuilder!=null)
currentSaleBuilder.removeProduct(product);
}
void setSaleType(SaleType saleType) {
if(currentSaleBuilder!=null)
currentSaleBuilder.saleType(saleType);
}
void setSaleBeneficiary(Account saleBeneficiary) {
if(currentSaleBuilder!=null)
currentSaleBuilder.orderedFor(saleBeneficiary);
}
void addListener(ISaleScreenModelListener listener){
listeners.add(ISaleScreenModelListener.class, listener);
}
void removeListener(ISaleScreenModelListener listener){
listeners.remove(ISaleScreenModelListener.class, listener);
}
boolean isCurrentAccountConnected() {
return accountService.isCurrentAccountLoggedIn();
}
AccountLevel getCurrentAccountLevel() {
if(accountService.getCurrentAccount()!=null)
return accountService.getCurrentAccount().getPermissionLevel();
else
return AccountLevel.getLowest();
}
}