package com.andreiolar.abms.client.widgets;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import com.andreiolar.abms.client.exception.PersonalUpkeepInformationNotFoundException;
import com.andreiolar.abms.client.rpc.DBPersonalCosts;
import com.andreiolar.abms.client.rpc.DBPersonalCostsAsync;
import com.andreiolar.abms.client.utils.DateUtil;
import com.andreiolar.abms.shared.PersonalUpkeepInformation;
import com.andreiolar.abms.shared.UserDetails;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import gwt.material.design.addins.client.popupmenu.MaterialPopupMenu;
import gwt.material.design.client.constants.Color;
import gwt.material.design.client.constants.Display;
import gwt.material.design.client.constants.IconType;
import gwt.material.design.client.constants.TextAlign;
import gwt.material.design.client.constants.WavesType;
import gwt.material.design.client.ui.MaterialButton;
import gwt.material.design.client.ui.MaterialLabel;
import gwt.material.design.client.ui.MaterialLink;
import gwt.material.design.client.ui.MaterialLoader;
import gwt.material.design.client.ui.MaterialModal;
import gwt.material.design.client.ui.MaterialPanel;
import gwt.material.design.client.ui.html.Div;
import gwt.material.design.client.ui.html.Hr;
public class PersonalCostsWidget extends Composite implements CustomWidget {
private UserDetails userDetails;
private String previousMonth;
private String year;
public PersonalCostsWidget(UserDetails userDetails) {
this.userDetails = userDetails;
this.previousMonth = DateUtil.getPreviousMonthAsString(new Date());
this.year = DateUtil.getYearForPreviousMonth(new Date());
initWidget(initializeWidget());
}
@Override
public Widget initializeWidget() {
MaterialPanel panel = new MaterialPanel();
MaterialLabel title = new MaterialLabel("Personal Costs View");
title.setTextColor(Color.BLUE);
title.setTextAlign(TextAlign.CENTER);
title.setFontSize("36px");
title.setFontWeight(FontWeight.BOLD);
panel.add(title);
panel.add(new Hr());
DBPersonalCostsAsync service = (DBPersonalCostsAsync) GWT.create(DBPersonalCosts.class);
ServiceDefTarget target = (ServiceDefTarget) service;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBPersonalCostsImpl";
target.setServiceEntryPoint(moduleRelativeURL);
MaterialLoader.showLoading(true);
service.getPersonalUpkeepInformation(userDetails, previousMonth + " " + year, new AsyncCallback<PersonalUpkeepInformation>() {
@Override
public void onSuccess(PersonalUpkeepInformation result) {
MaterialLoader.showLoading(false);
MaterialLabel label = new MaterialLabel();
label.getElement()
.setInnerHTML("Below you will find all informations needed about your personal upkeep costs for " + previousMonth + " " + year
+ "." + "<br/><br/>"
+ "Note: This view can be exported as PDF by right clicking anywere in the view and selecting Export as PDF");
label.setMarginTop(25.0);
label.setMarginLeft(25.0);
label.setFontSize("18px");
panel.add(label);
MaterialPanel costsDescriptionPanel = new MaterialPanel();
costsDescriptionPanel.setShadow(2);
costsDescriptionPanel.setStyleName("pay-personal-costs-view");
MaterialLabel month = new MaterialLabel();
month.getElement().setInnerHTML("Personalized upkeep report for <span style=\"color: #9e9e9e\">" + result.getLuna() + "</span>");
month.setMarginTop(25.0);
month.setMarginLeft(25.0);
costsDescriptionPanel.add(month);
MaterialLabel nameAndAptNumber = new MaterialLabel();
nameAndAptNumber.getElement()
.setInnerHTML("Upkeep report for apartment: <span style=\"color: #9e9e9e\">" + result.getAptNumber() + "</span>" + "<br/>"
+ "Responsible person: <span style=\"color: #9e9e9e\">" + result.getNume() + "</span>" + "<br/>"
+ "Number of persons: <span style=\"color: #9e9e9e\">" + result.getNumarPersoane() + "</span>");
nameAndAptNumber.setMarginTop(25.0);
nameAndAptNumber.setMarginLeft(25.0);
costsDescriptionPanel.add(nameAndAptNumber);
MaterialLabel spatiuComun = new MaterialLabel();
spatiuComun.getElement().setInnerHTML("Common space: <span style=\"color: #9e9e9e\">" + result.getSpatiuComun() + " mp</span>"
+ "<br/>Note: It will be reflected within the heating costs.");
spatiuComun.setMarginTop(25.0);
spatiuComun.setMarginLeft(25.0);
costsDescriptionPanel.add(spatiuComun);
MaterialLabel suprafataApt = new MaterialLabel();
suprafataApt.getElement()
.setInnerHTML("Apartment surface: <span style=\"color: #9e9e9e\">" + result.getSuprafataApt() + " mp</span>" + "<br/>"
+ "Note: It will be reflected within the heating costs." + "<br/>"
+ "Note: It will be 0 for tenants with own heating plants, otherwise the whole apartment surface will be displayed.");
suprafataApt.setMarginTop(25.0);
suprafataApt.setMarginLeft(25.0);
costsDescriptionPanel.add(suprafataApt);
MaterialLabel incalzire = new MaterialLabel();
incalzire.getElement().setInnerHTML("Heating: <span style=\"color: #9e9e9e\">" + result.getIncalzire() + " RON</span>" + "<br/>"
+ "Note: It is calculated based on the common space and the apartment surface.");
incalzire.setMarginTop(25.0);
incalzire.setMarginLeft(25.0);
costsDescriptionPanel.add(incalzire);
MaterialLabel apaCaldaMenajera = new MaterialLabel();
apaCaldaMenajera.getElement().setInnerHTML("Hot water: <span style=\"color: #9e9e9e\">" + result.getApaCaldaMenajera()
+ " RON</span><br>Note: It is calculated as following: TERMO-ACM + AR din ACM.<br>Note: It will be 0 for tenants with own heating plants.");
apaCaldaMenajera.setMarginTop(25.0);
apaCaldaMenajera.setMarginLeft(25.0);
costsDescriptionPanel.add(apaCaldaMenajera);
MaterialLabel apaReceSiCanalizare = new MaterialLabel();
apaReceSiCanalizare.getElement()
.setInnerHTML("Cold water and sewerage: <span style=\"color: #9e9e9e\">" + result.getApaReceSiCanalizare() + " RON</span>");
apaReceSiCanalizare.setMarginTop(25.0);
apaReceSiCanalizare.setMarginLeft(25.0);
costsDescriptionPanel.add(apaReceSiCanalizare);
MaterialLabel gunoi = new MaterialLabel();
gunoi.getElement().setInnerHTML("Garbage: <span style=\"color: #9e9e9e\">" + result.getGunoi() + " RON</span>" + "<br/>"
+ "Note: It is calculated as following: <span style=\"color: #9e9e9e\">10.43 RON * Number of persons</span>.");
gunoi.setMarginTop(25.0);
gunoi.setMarginLeft(25.0);
costsDescriptionPanel.add(gunoi);
MaterialLabel curent = new MaterialLabel();
curent.getElement()
.setInnerHTML("Electricity: <span style=\"color: #9e9e9e\">" + result.getCurent() + " RON</span>" + "<br/>"
+ "Note: Common apartment building consumpion. <br/>"
+ "Note: It is calculated as following: <span style=\"color: #9e9e9e\">1 RON * Number of persons</span>.");
curent.setMarginTop(25.0);
curent.setMarginLeft(25.0);
costsDescriptionPanel.add(curent);
MaterialLabel gaz = new MaterialLabel();
gaz.getElement().setInnerHTML("Gas: <span style=\"color: #9e9e9e\">" + result.getGaz() + " RON</span>");
gaz.setMarginTop(25.0);
gaz.setMarginLeft(25.0);
costsDescriptionPanel.add(gaz);
MaterialLabel servicii = new MaterialLabel();
servicii.getElement().setInnerHTML("Other services: <span style=\"color: #9e9e9e\">" + result.getServicii() + " RON</span>" + "<br/>"
+ "Note: Common services for the apartment building. For example: Cleaning.");
servicii.setMarginTop(25.0);
servicii.setMarginLeft(25.0);
costsDescriptionPanel.add(servicii);
MaterialLabel gospodaresti = new MaterialLabel();
gospodaresti.getElement()
.setInnerHTML("Other apartment costs: <span style=\"color: #9e9e9e\">" + result.getGospodaresti() + " RON</span>");
gospodaresti.setMarginTop(25.0);
gospodaresti.setMarginLeft(25.0);
costsDescriptionPanel.add(gospodaresti);
MaterialPanel moneyPanel = new MaterialPanel();
moneyPanel.setWidth("40%");
moneyPanel.setMarginTop(50.0);
moneyPanel.setMarginLeft(25.0);
moneyPanel.setPaddingBottom(25.0);
BigDecimal cost = new BigDecimal(result.getCostTotal());
BigDecimal costScaled = cost.setScale(2, RoundingMode.CEILING);
MaterialLabel sumLabel = new MaterialLabel();
sumLabel.getElement().setInnerHTML("<b>" + costScaled + "</b>" + " <sup>RON</sup>");
sumLabel.setFontSize("60px");
sumLabel.setTextColor(Color.BLUE);
moneyPanel.add(sumLabel);
MaterialLabel sumTextLabel = new MaterialLabel();
sumTextLabel.setText("Total to be paid");
sumTextLabel.setTextColor(Color.GREY);
moneyPanel.add(sumTextLabel);
costsDescriptionPanel.add(moneyPanel);
panel.add(costsDescriptionPanel);
MaterialPopupMenu contextMenu = new MaterialPopupMenu();
MaterialLink pdfLink = new MaterialLink();
pdfLink.setPadding(12.0);
pdfLink.setDisplay(Display.BLOCK);
pdfLink.setText("Export as PDF");
pdfLink.setIconType(IconType.PICTURE_AS_PDF);
pdfLink.setTextColor(Color.BLUE);
pdfLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
String url = GWT.getModuleBaseURL() + "pdfGenerator?username=" + userDetails.getUsername() + "&month=" + previousMonth + " "
+ year;
Window.open(url, "_blank", "status=0,toolbar=0,menubar=0,location=0");
}
});
contextMenu.add(pdfLink);
costsDescriptionPanel.sinkEvents(Event.ONCONTEXTMENU);
costsDescriptionPanel.addHandler(new ContextMenuHandler() {
@Override
public void onContextMenu(ContextMenuEvent event) {
event.preventDefault();
event.stopPropagation();
int x = event.getNativeEvent().getClientX();
int y = event.getNativeEvent().getClientY();
RootPanel.get().add(contextMenu);
contextMenu.setPopupPosition(x, y);
contextMenu.open();
}
}, ContextMenuEvent.getType());
Div buttonDiv = new Div();
buttonDiv.setStyleName("personal-costs-pay-center-button");
MaterialButton payNowButton = new MaterialButton();
payNowButton.setWaves(WavesType.LIGHT);
payNowButton.setWidth("100%");
payNowButton.setHeight("50px");
payNowButton.setText("PAY NOW");
payNowButton.setTextColor(Color.WHITE);
payNowButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Test: Va urma...");
}
});
buttonDiv.add(payNowButton);
panel.add(buttonDiv);
}
@Override
public void onFailure(Throwable caught) {
MaterialLoader.showLoading(false);
if (caught instanceof PersonalUpkeepInformationNotFoundException) {
} else {
MaterialModal materialModal = ModalCreator.createErrorModal("Something went wrong", caught);
RootPanel.get().add(materialModal);
materialModal.open();
}
}
});
return panel;
}
}