/**
* Copyright (c) 2015 Mustafa DUMLUPINAR, mdumlupinar@gmail.com
*
* This file is part of seyhan project.
*
* seyhan is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package controllers.stock;
import static play.data.Form.form;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceException;
import meta.GridHeader;
import meta.PageExtend;
import models.StockPriceUpdate;
import models.search.NameOnlySearchParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.data.Form;
import play.i18n.Messages;
import play.mvc.Controller;
import play.mvc.Result;
import utils.AuthManager;
import utils.CacheUtils;
import utils.DateUtils;
import utils.Format;
import views.html.stocks.price_update.form;
import views.html.stocks.price_update.list;
import com.avaje.ebean.Page;
import controllers.Application;
import controllers.global.Profiles;
import enums.EffectType;
import enums.Right;
import enums.RightLevel;
/**
* @author mdpinar
*/
public class PriceUpdates extends Controller {
private final static Right RIGHT_SCOPE = Right.STOK_FIYAT_GUNCELLEME;
private final static Logger log = LoggerFactory.getLogger(PriceUpdates.class);
private final static Form<StockPriceUpdate> dataForm = form(StockPriceUpdate.class);
private final static Form<NameOnlySearchParam> paramForm = form(NameOnlySearchParam.class);
/**
* Liste formu basliklarini doner
*
* @return List<GridHeader>
*/
private static List<GridHeader> getHeaderList() {
List<GridHeader> headerList = new ArrayList<GridHeader>();
headerList.add(new GridHeader(Messages.get("name"), "20%", true).sortable("name"));
headerList.add(new GridHeader(Messages.get("date.execution"), "12%", "center", null).sortable("execDate"));
headerList.add(new GridHeader(Messages.get("description")));
headerList.add(new GridHeader(Messages.get("effect_type"), "8%", "center", null));
headerList.add(new GridHeader(Messages.get("effect"), "8%", "center", null));
headerList.add(new GridHeader(Messages.get("effect_dir"), "10%", "center", null));
return headerList;
}
/**
* Liste formunda gosterilecek verileri doner
*
* @return PageExtend
*/
private static PageExtend<StockPriceUpdate> buildPage(NameOnlySearchParam searchParam) {
List<Map<Integer, String>> dataList = new ArrayList<Map<Integer, String>>();
Page<StockPriceUpdate> page = StockPriceUpdate.page(searchParam);
List<StockPriceUpdate> modelList = page.getList();
if (modelList != null && modelList.size() > 0) {
for (StockPriceUpdate model : modelList) {
Map<Integer, String> dataMap = new HashMap<Integer, String>();
int i = -1;
dataMap.put(i++, model.id.toString());
dataMap.put(i++, model.name);
dataMap.put(i++, DateUtils.formatDate(model.execDate, "dd/MM/yyyy HH:mm"));
dataMap.put(i++, model.description);
dataMap.put(i++, Messages.get(model.effectType.name().toLowerCase()));
dataMap.put(i++, Format.asMoney(model.effect));
dataMap.put(i++, Messages.get(model.effectDirection.name().toLowerCase()));
dataList.add(dataMap);
}
}
return new PageExtend<StockPriceUpdate>(getHeaderList(), dataList, page);
}
public static Result GO_HOME = redirect(
controllers.stock.routes.PriceUpdates.list()
);
/**
* Uzerinde veri bulunan liste formunu doner
*/
public static Result list() {
Result hasProblem = AuthManager.hasProblem(RIGHT_SCOPE, RightLevel.Enable);
if (hasProblem != null) return hasProblem;
Form<NameOnlySearchParam> filledParamForm = paramForm.bindFromRequest();
return ok(
list.render(buildPage(filledParamForm.get()), filledParamForm)
);
}
/**
* Kayit formundaki bilgileri kaydeder
*/
public static Result save() {
if (! CacheUtils.isLoggedIn()) return Application.login();
Form<StockPriceUpdate> filledForm = dataForm.bindFromRequest();
if(filledForm.hasErrors()) {
return badRequest(form.render(filledForm));
} else {
StockPriceUpdate model = filledForm.get();
Result hasProblem = AuthManager.hasProblem(RIGHT_SCOPE, (model.id == null ? RightLevel.Insert : RightLevel.Update));
if (hasProblem != null) return hasProblem;
String editingConstraintError = model.checkEditingConstraints();
if (editingConstraintError != null) {
flash("error", editingConstraintError);
return badRequest(form.render(dataForm.fill(model)));
}
checkConstraints(filledForm);
if (filledForm.hasErrors()) {
return badRequest(form.render(filledForm));
}
try {
if (model.id == null) {
model.save();
} else {
model.update();
}
} catch (OptimisticLockException e) {
flash("error", Messages.get("exception.optimistic.lock"));
return badRequest(form.render(dataForm.fill(model)));
}
flash("success", Messages.get("saved", model.name));
if (Profiles.chosen().gnel_continuouslyRecording)
return create();
else
return GO_HOME;
}
}
/**
* Yeni bir kayit formu olusturur
*/
public static Result create() {
Result hasProblem = AuthManager.hasProblem(RIGHT_SCOPE, RightLevel.Insert);
if (hasProblem != null) return hasProblem;
return ok(form.render(dataForm.fill(new StockPriceUpdate())));
}
/**
* Secilen kayit icin duzenleme formunu acar
*
* @param id
*/
public static Result edit(Integer id) {
Result hasProblem = AuthManager.hasProblem(RIGHT_SCOPE, RightLevel.Enable);
if (hasProblem != null) return hasProblem;
if (id == null) {
flash("error", Messages.get("id.is.null"));
} else {
StockPriceUpdate model = StockPriceUpdate.findById(id);
if (model == null) {
flash("error", Messages.get("not.found", Messages.get("stock.price_update")));
} else {
return ok(form.render(dataForm.fill(model)));
}
}
return GO_HOME;
}
public static Result undoLast() {
Result hasProblem = AuthManager.hasProblem(RIGHT_SCOPE, RightLevel.Delete);
if (hasProblem != null) return hasProblem;
StockPriceUpdate model = StockPriceUpdate.findLastOne();
if (model == null) {
flash("error", Messages.get("not.found", Messages.get("stock.price_update")));
} else {
String editingConstraintError = model.checkEditingConstraints();
if (editingConstraintError != null) {
flash("error", editingConstraintError);
return badRequest(form.render(dataForm.fill(model)));
}
try {
model.delete();
flash("success", Messages.get("rolled_back", Messages.get("stock.price_update")));
} catch (PersistenceException pe) {
log.error(pe.getMessage());
flash("error", Messages.get("delete.violation", model.name));
return badRequest(form.render(dataForm.fill(model)));
}
}
return GO_HOME;
}
/**
* Kayit isleminden once form uzerinde bulunan verilerin uygunlugunu kontrol eder
*
* @param filledForm
*/
private static void checkConstraints(Form<StockPriceUpdate> filledForm) {
StockPriceUpdate model = filledForm.get();
if (StockPriceUpdate.isUsedForElse("name", model.name, model.id)) {
filledForm.reject("name", Messages.get("not.unique", model.name));
}
if (model.effectType.equals(EffectType.Percent) && model.effect.doubleValue() > 99.99) {
filledForm.reject("effect", Messages.get("error.max", 99.99));
}
if (model.effect == null || model.effect.doubleValue() <= 0) {
filledForm.reject("effect", Messages.get("error.min", 1));
}
boolean isPriceSelected = false;
if (! isPriceSelected && (model.buyPrice != null && model.buyPrice.equals(Boolean.TRUE))) isPriceSelected = true;
if (! isPriceSelected && (model.sellPrice != null && model.sellPrice.equals(Boolean.TRUE))) isPriceSelected = true;
if (! isPriceSelected) {
filledForm.reject("prices", "");
}
}
}