package it.agilis.mens.azzeroCO2.client.mvc.controllers;
import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import it.agilis.mens.azzeroCO2.client.MyInfo;
import it.agilis.mens.azzeroCO2.client.mvc.events.AzzeroCO2Events;
import it.agilis.mens.azzeroCO2.client.mvc.events.ConoscoCO2Events;
import it.agilis.mens.azzeroCO2.client.mvc.events.LoginEvents;
import it.agilis.mens.azzeroCO2.client.mvc.events.PagamentoSellaEvents;
import it.agilis.mens.azzeroCO2.client.mvc.views.ConoscoCO2View;
import it.agilis.mens.azzeroCO2.client.services.AzzerroCO2UtilsClientHelper;
import it.agilis.mens.azzeroCO2.shared.Eventi;
import it.agilis.mens.azzeroCO2.shared.Profile;
import it.agilis.mens.azzeroCO2.shared.model.CouponType;
import it.agilis.mens.azzeroCO2.shared.model.OrdineModel;
import it.agilis.mens.azzeroCO2.shared.model.amministrazione.CouponModel;
import it.agilis.mens.azzeroCO2.shared.model.pagamento.Esito;
import it.agilis.mens.azzeroCO2.shared.model.pagamento.PagamentoModel;
import it.agilis.mens.azzeroCO2.shared.model.registrazione.UserInfoModel;
import it.agilis.mens.azzeroCO2.shared.vto.OrdineVTO;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
* User: giovannilt
* Date: 7/2/11
* Time: 11:39 PM
* To change this template use File | Settings | File Templates.
*/
public class ConoscoCO2Controller extends BaseController {
private ConoscoCO2View conoscoCO2View = new ConoscoCO2View(this);
public ConoscoCO2Controller() {
registerEventTypes(AzzeroCO2Events.Init);
registerEventTypes(AzzeroCO2Events.Error);
registerEventTypes(ConoscoCO2Events.Next);
registerEventTypes(ConoscoCO2Events.NextText);
registerEventTypes(ConoscoCO2Events.Previous);
registerEventTypes(ConoscoCO2Events.PreviousText);
registerEventTypes(AzzeroCO2Events.LoggedIn);
registerEventTypes(ConoscoCO2Events.ClearPanel);
registerEventTypes(ConoscoCO2Events.Save);
registerEventTypes(ConoscoCO2Events.Riepilogo);
registerEventTypes(ConoscoCO2Events.Acquisto);
registerEventTypes(ConoscoCO2Events.CaricaCoefficienti);
registerEventTypes(ConoscoCO2Events.CaricaProgettiDiCompensazione);
registerEventTypes(ConoscoCO2Events.PreviousText);
registerEventTypes(ConoscoCO2Events.NextText);
registerEventTypes(ConoscoCO2Events.Conferma);
registerEventTypes(ConoscoCO2Events.ShowConfermDialog);
registerEventTypes(ConoscoCO2Events.GoToBegin);
registerEventTypes(ConoscoCO2Events.ClearStep);
registerEventTypes(ConoscoCO2Events.InAttesaDiConfermaPagamento);
registerEventTypes(ConoscoCO2Events.NorthPanelShowButtons);
registerEventTypes(ConoscoCO2Events.RemoveModel);
registerEventTypes(ConoscoCO2Events.UseCoupon);
}
@Override
public void handleEvent(AppEvent event) {
if (event.getType().equals(AzzeroCO2Events.LoggedIn)) {
setUserInfoModel((UserInfoModel) event.getData());
} else if (event.getType().equals(ConoscoCO2Events.InAttesaDiConfermaPagamento)) {
final MyAsyncCallback asyncCallback = new MyAsyncCallback();
final Timer timer = new Timer() {
public void run() {
OrdineModel riepilogo = conoscoCO2View.getRiepilogo();
riepilogo.setEventiType(Eventi.CONOSCI_CO2.name());
getHustonService().isPagato(AzzerroCO2UtilsClientHelper.getDettaglioVTO(riepilogo), getUserInfoModel(), asyncCallback);
asyncCallback.setTimer(this);
}
};
timer.schedule(10000);
} else if (event.getType().equals(ConoscoCO2Events.Riepilogo)) {
setCoefficientiConoscoCO2View();
} else if (event.getType().equals(AzzeroCO2Events.Init)) {
setCoefficienti();
forwardToView(conoscoCO2View, event);
if (getProgettiDiCompensazioneList().size() == 0) {
setProgettiDiCompensazione();
}
} else if (event.getType().equals(ConoscoCO2Events.Acquisto)) {
if (getProgettiDiCompensazioneList().size() == 0) {
setProgettiDiCompensazione();
}
conoscoCO2View.setProgettiDiCompensazione(getProgettiDiCompensazioneList());
conoscoCO2View.riepilogo(getCoefficientiMAP());
} else if (event.getType().equals(ConoscoCO2Events.UseCoupon)) {
String couponCode = event.getData();
if (couponCode != null && !"".equalsIgnoreCase(couponCode)) {
AsyncCallback<CouponModel> asyncCallback = new AsyncCallback<CouponModel>() {
public void onFailure(Throwable caught) {
MyInfo.show("Error", "Errore impossibile connettersi al server", 7000);
}
@Override
public void onSuccess(CouponModel result) {
if (result != null) {
conoscoCO2View.setCoupon(result);
} else {
MyInfo.show("Warn", "Coupon non Utilizzabile", 7000);
}
}
};
getHustonService().getValidCouponByCode(couponCode, asyncCallback);
}
} else if (event.getType().equals(ConoscoCO2Events.Conferma)) {
if (getUserInfoModel().getProfilo() == Profile.Guest.ordinal()) {
Dispatcher.forwardEvent(LoginEvents.ShowForm);
} else {
OrdineModel model = conoscoCO2View.getRiepilogo();
model.setEventiType(Eventi.CONOSCI_CO2.name());
double kgCO2 = getTotaleKgCO2(model, conoscoCO2View);
Double importo = new Double(0.0);
// TODO Calcolare il totale togliendo lo sconto COUPON
PagamentoModel pagamentoModel = null;
if (model.getProgettoDiCompensazioneModel() != null) {
CouponModel couponModel = model.getCouponModel();
if (couponModel != null && !"".equalsIgnoreCase(couponModel.getTipo())) {
couponModel.setAttivo(false);
try {
Double totale = model.getProgettoDiCompensazioneModel().getPrezzo();
if (couponModel.getTipo().equalsIgnoreCase(CouponType.EURO.toString())) {
Double val = (kgCO2 * totale) - couponModel.getValore();
if (val < 0) {
val = 0.0;
}
pagamentoModel = new PagamentoModel(number.format(val));
importo = val;
} else if (couponModel.getTipo().equalsIgnoreCase(CouponType.PERCENTO.toString())) {
importo = (kgCO2 * totale) * couponModel.getValore() / 100;
pagamentoModel = new PagamentoModel(number.format(importo));
} else if (couponModel.getTipo().equalsIgnoreCase(CouponType.OMAGGIO.toString())) {
pagamentoModel = new PagamentoModel(number.format(0.0));
}
} catch (Exception e) {
MyInfo.show("ERROR", e.getMessage(), 7000);
}
} else {
importo = kgCO2 * model.getProgettoDiCompensazioneModel().getPrezzo();
pagamentoModel = new PagamentoModel(number.format(importo));
}
pagamentoModel.setLastUpdate(new Date());
pagamentoModel.setKgCO2(kgCO2);
model.setPagamentoModel(pagamentoModel);
model.setCouponModel(couponModel);
if (couponModel == null || (couponModel != null &&
!couponModel.getTipo().equalsIgnoreCase(CouponType.OMAGGIO.toString()))) {
if (importo > 0.01) {// mettere 10 euro dopo la fase di test
Dispatcher.forwardEvent(PagamentoSellaEvents.ShowForm, model);
} else {
MyInfo.show("Non e' possibile comperare ordini inferiori ai 10 euro");
}
} else {
PagamentoModel p = model.getPagamentoModel();
p.setEsito(Esito.OMAGGIO.name());
model.setPagamentoModel(p);
save(model);
conoscoCO2View.showConferma(AzzerroCO2UtilsClientHelper.getDettaglioVTO(model));
}
} else {
MyInfo.show("Seleziona il Progetto di compensazione");
}
}
} else if (event.getType().equals(ConoscoCO2Events.CaricaProgettiDiCompensazione)) {
if (getProgettiDiCompensazioneList().size() == 0) {
setProgettiDiCompensazione();
}
conoscoCO2View.setProgettiDiCompensazione(getProgettiDiCompensazioneList());
} else if (event.getType().equals(ConoscoCO2Events.CaricaCoefficienti)) {
setCoefficienti();
} else if (event.getType().equals(AzzeroCO2Events.LoggedIn)) {
setUserInfoModel((UserInfoModel) event.getData());
conoscoCO2View.setUserInfo(getUserInfoModel());
} else if (event.getType().equals(ConoscoCO2Events.Save)) {
if (event.getData() instanceof OrdineModel) {
OrdineModel model = (OrdineModel) event.getData();
model.setEventiType(Eventi.CONOSCI_CO2.name());
save(model);
} else {
save(null);
}
} else {
forwardToView(conoscoCO2View, event);
}
}
private void save(OrdineModel model) {
if (getUserInfoModel().getProfilo() == Profile.Guest.ordinal()) {
Dispatcher.forwardEvent(LoginEvents.ShowForm);
} else if (model == null) {
OrdineModel riepilogo = conoscoCO2View.getRiepilogo();
riepilogo.setEventiType(Eventi.CONOSCI_CO2.name());
saveVTO(AzzerroCO2UtilsClientHelper.getDettaglioVTO(riepilogo));
} else if (model != null) {
model.setEventiType(Eventi.CONOSCI_CO2.name());
saveVTO(AzzerroCO2UtilsClientHelper.getDettaglioVTO(model));
}
}
private void saveVTO(final OrdineVTO riepilogo) {
AsyncCallback<OrdineVTO> dettaglio = new AsyncCallback<OrdineVTO>() {
public void onFailure(Throwable caught) {
MyInfo.show("Error", "Errore impossibile connettersi al server " + caught, 7000);
}
@Override
public void onSuccess(OrdineVTO result) {
if (result != null) {
OrdineModel model = AzzerroCO2UtilsClientHelper.getDettaglioModel(result);
conoscoCO2View.setDettaglioModel(model);
MyInfo.show("Evento " + riepilogo.getNome() + " salvato con successo.");
if(model.getPagamentoModel().getEsito().equalsIgnoreCase(Esito.OMAGGIO.name())){
openConfermaToAzzeroCO2_IT(model);
}
}
}
};
getHustonService().saveOrdine(riepilogo, getUserInfoModel(), dettaglio);
}
class MyAsyncCallback implements AsyncCallback<OrdineVTO> {
private Timer timer;
private int numeroDiVolte = 60;
public void onFailure(Throwable caught) {
MyInfo.show("Error", "Errore impossibile connettersi al server " + caught, 7000);
}
@Override
public void onSuccess(OrdineVTO result) {
if (result != null) {
if (result.getPagamentoModel().getEsito().equalsIgnoreCase(Esito.PAGATO.toString())) {
MyInfo.show("Pagamento Avvenuto con sucesso");
Dispatcher.forwardEvent(PagamentoSellaEvents.CloseForm);
conoscoCO2View.showConferma(result);
sentMail(result);
}
if (result.getPagamentoModel().getEsito().equalsIgnoreCase(Esito.PAGAMENTO_NON_AVVENUTO.toString())) {
MyInfo.show("La Banca ha rifiutato la transazione, il pagamento si ritiene annullato.");
Dispatcher.forwardEvent(PagamentoSellaEvents.CloseForm);
} else {
if (numeroDiVolte > 0) {
MyInfo.show("Non Ancora pagato");
getTimer().schedule(10000);
numeroDiVolte--;
} else {
MyInfo.show("Evento non pagato, atteso pagamento per piu' di 10 minuti, si consiglia di ricaricare ");
Dispatcher.forwardEvent(PagamentoSellaEvents.EnableButton);
}
}
OrdineModel model = AzzerroCO2UtilsClientHelper.getDettaglioModel(result);
conoscoCO2View.setDettaglioModel(model);
} else {
MyInfo.show("Error", "Errore impossibile connettersi al server ERRORE DI SISTEMA", 7000);
}
}
public void setTimer(Timer timer) {
this.timer = timer;
}
public Timer getTimer() {
return timer;
}
}
private void setCoefficientiConoscoCO2View() {
if (getCoefficientiMAP() == null || getCoefficientiMAP().values().size() == 0) {
setCoefficienti();
if (getCoefficientiMAP() == null || getCoefficientiMAP().values().size() == 0) {
MyInfo.show("Error", "Errore impossibile recuperare i coefficenti dal server 001", 7000);
}
}
if (getCoefficientiMAP() == null || getCoefficientiMAP().values().size() == 0) {
MyInfo.show("Error", "Errore impossibile recuperare i coefficenti dal server 002", 7000);
} else {
conoscoCO2View.riepilogo(getCoefficientiMAP());
}
}
}