You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

367 lines
9.8 KiB

package controller;
import db.UserAmap;
import haxe.Http;
import neko.Web;
import sugoi.form.Form;
import Common;
import sugoi.form.elements.IntSelect;
import sugoi.form.elements.StringInput;
class AmapAdmin extends Controller
{
public function new()
{
super();
if (!app.user.isAmapManager()) throw Error("/", t._("Access forbidden"));
//lance un event pour demander aux plugins si ils veulent ajouter un item dans la nav
var nav = new Array<Link>();
if (app.user.amap.hasPayments()){
nav.push({id:"payments",link:"/amapadmin/payments",name: t._("Payments") });
}
var e = Nav(nav,"groupAdmin");
app.event(e);
view.nav = e.getParameters()[0];
}
@tpl("amapadmin/default.mtt")
function doDefault() {
view.membersNum = UserAmap.manager.count($amap == app.user.amap);
view.contractsNum = app.user.amap.getActiveContracts().length;
//ping cagette groups directory
if (Std.random(10) == 0 && app.user.amap.flags.has(db.Amap.AmapFlags.CagetteNetwork)){
var req = new Http("http://annuaire.cagette.net/api/ping?url="+StringTools.urlEncode( "http://" + App.config.HOST ) );
try{
req.request();
}catch (e:Dynamic){
App.current.logError("Error while contacting annuaire.cagette.net : "+e);
}
}
}
@tpl("amapadmin/addimage.mtt")
function doAddimage() {
if (!app.user.isAmapManager()) throw Error("/", t._("Access forbidden"));
var user = app.user;
view.image = user.amap.image;
var request = new Map();
try {
request = sugoi.tools.Utils.getMultipart(1024 * 1024 * 12); //12Mb
}catch (e:Dynamic) {
throw Error("/amapadmin", t._("The sent image was too big. The maximum allowed size is 12MB"));
}
if (request.exists("image")) {
//Image
var image = request.get("image");
if (image != null && image.length > 0) {
var img : sugoi.db.File = null;
if ( Sys.systemName() == "Windows") {
img = sugoi.db.File.create(request.get("image"), request.get("image_filename"));
}else {
img = sugoi.tools.UploadedImage.resizeAndStore(request.get("image"), request.get("image_filename"), 400, 400);
}
user.amap.lock();
if (user.amap.image != null) {
//delete previous file
user.amap.image.lock();
user.amap.image.delete();
}
user.amap.image = img;
user.amap.update();
throw Ok('/amapadmin/', t._("Image updated"));
}
}
}
@tpl("amapadmin/rights.mtt")
public function doRights() {
//liste les gens qui ont des droits dans le groupe
var users = db.UserAmap.manager.search($rights != null && $amap == app.user.amap, false);
//cleaning
for ( u in Lambda.array(users)) {
//rights peut etre null (null seralisé) et pas null en DB
if (u.rights == null || u.rights.length == 0) {
u.lock();
Reflect.setField(u, "rights", null);
u.update();
users.remove(u);
continue;
}
//rights on a deleted contract
for ( r in u.rights) {
switch(r) {
case ContractAdmin(cid):
if (cid == null) continue;
var c = db.Contract.manager.get(cid);
if (c == null) {
u.lock();
u.removeRight(r);
u.update();
}
default :
}
}
}
view.users = users;
}
@tpl("form.mtt")
public function doEditRight(?u:db.User) {
var form = new sugoi.form.Form("editRight");
if (u == null) {
form.addElement( new IntSelect("user", t._("Member") , app.user.amap.getMembersFormElementData(), null, true) );
}
var data = [];
//for (r in db.UserAmap.Right.getConstructors()) {
//if (r == "ContractAdmin") continue; //managed later
//data.push({label:r,value:r});
//}
data.push({label:t._("Group administrator"), value:"GroupAdmin"});
data.push({label:t._("Membership management"),value:"Membership"});
data.push({label:t._("Messages"),value:"Messages"});
var ua : db.UserAmap = null;
var populate :Array<String> = null;
if (u != null) {
ua = db.UserAmap.get(u, app.user.amap, true);
if (ua == null) throw "no user";
if (ua.rights == null) ua.rights = [];
//populate form
populate = ua.rights.map(function(x) return x.getName());
}
form.addElement( new sugoi.form.elements.CheckboxGroup("rights", t._("Rights"), data, populate, true, true) );
form.addElement( new sugoi.form.elements.Html("html","<hr/>"));
//Rights on contracts
var data = [];
var populate :Array<String> = [];
data.push({value:"contractAll",label:t._("All contracts")});
for (r in app.user.amap.getActiveContracts(true)) {
data.push( { label:r.name , value:"contract"+Std.string(r.id) } );
}
if(ua!=null && ua.rights!=null){
for ( r in ua.rights) {
switch(r) {
case Right.ContractAdmin(cid):
if (cid == null) {
populate.push("contractAll");
}else {
populate.push("contract"+cid);
}
default://
}
}
}
form.addElement( new sugoi.form.elements.CheckboxGroup("rights", t._("Contracts management") , data, populate, true, true) );
if (form.checkToken()) {
var wasManager = app.user.isAmapManager();
if (u == null) {
ua = db.UserAmap.manager.select($userId == Std.parseInt(form.getValueOf("user")) && $amapId == app.user.amap.id, true);
}
ua.rights = [];
var arr : Array<String> = cast form.getElement("rights").value;
for ( r in arr) {
if (r.substr(0, 8) == "contract") {
if (r == "contractAll") {
ua.rights.push( Right.ContractAdmin() );
}else {
ua.rights.push( Right.ContractAdmin(Std.parseInt(r.substr(8)) ) );
}
}else {
ua.rights.push( db.UserAmap.Right.createByName(r) );
}
}
//avoid "cut my own hands" problem
if (ua.user.id == app.user.id && wasManager ) {
var isManager = false;
for ( r in ua.rights) {
if (r.equals(db.UserAmap.Right.GroupAdmin)) {
isManager = true;
break;
}
}
if (isManager == false) {
throw Error("/amapadmin/rights", t._("You cannot strip yourself of admin rights."));
}
}
if (ua.rights.length == 0) ua.rights = null;
ua.update();
if (ua.rights == null) {
throw Ok("/amapadmin/rights", t._("Rights removed"));
}else {
throw Ok("/amapadmin/rights", t._("Rights created or modified"));
}
}
if (u == null) {
view.title = t._("Give rights to a user");
}else {
view.title = t._("Modify the rights of ::user::",{user:u.getName()});
}
view.form = form;
}
@tpl('form.mtt')
public function doVatRates() {
var f = new sugoi.form.Form("vat");
var a = app.user.amap;
if (a.vatRates == null) {
a.lock();
var x = new db.Amap();
a.vatRates = x.vatRates;
a.update();
}
var i = 1;
for (k in a.vatRates.keys()) {
f.addElement(new StringInput(i+"-k", t._("Name ")+i, k));
f.addElement(new StringInput(i + "-v", t._("Rate ")+i, Std.string(a.vatRates.get(k)) ));
//f.addElement(new sugoi.form.elements.Html("<hr/>"));
i++;
}
var j = i;
for (x in 0...5 - i) {
f.addElement(new StringInput(i+"-k", t._("Name ")+i, ""));
f.addElement(new StringInput(i + "-v", t._("Rate ")+i, ""));
//f.addElement(new sugoi.form.elements.Html("<hr/>"));
i++;
}
if (f.isValid()) {
var d = f.getData();
var vats = new Map<String,Float>();
var filter = new sugoi.form.filters.FloatFilter();
for (i in 1...5) {
if (d.get(i + "-k") == null) continue;
vats.set(d.get(i + "-k"), filter.filter( d.get(i + "-v")) );
}
a.lock();
a.vatRates = vats;
a.update();
throw Ok("/amapadmin", t._("Rate updated"));
}
view.title = t._("Edit VAT rates");
view.form = f;
}
function doCategories(d:haxe.web.Dispatch) {
d.dispatch(new controller.Categories());
}
/**
* Set up group currency. Default is EURO
*/
@tpl("form.mtt")
function doCurrency(){
view.title = t._("Currency used by your group.");
var f = new sugoi.form.Form("curr");
f.addElement(new sugoi.form.elements.StringInput("currency", t._("Currency symbol"), app.user.amap.getCurrency()));
f.addElement(new sugoi.form.elements.StringInput("currencyCode", t._("3 digit ISO code"), app.user.amap.currencyCode));
if ( f.isValid()){
app.user.amap.lock();
app.user.amap.currency = f.getValueOf("currency");
app.user.amap.currencyCode = f.getValueOf("currencyCode");
app.user.amap.update();
throw Ok("/amapadmin/currency", t._("Currency updated"));
}
view.form = f;
}
/**
* payment configuration
*/
@tpl("form.mtt")
function doPayments(){
var f = new sugoi.form.Form("paymentTypes");
var types = service.PaymentService.getAllPaymentTypes();
var formdata = [for (t in types){label:t.name, value:t.type}];
var selected = app.user.amap.allowedPaymentsType;
f.addElement(new sugoi.form.elements.CheckboxGroup("paymentTypes", t._("Authorized payment types"),formdata, selected) );
if (app.user.amap.checkOrder == ""){
app.user.amap.lock();
app.user.amap.checkOrder = app.user.amap.name;
app.user.amap.update();
}
f.addElement( new sugoi.form.elements.StringInput("checkOrder", t._("Make the check payable to"), app.user.amap.checkOrder, false));
f.addElement( new sugoi.form.elements.StringInput("IBAN", t._("IBAN of your bank account for transfers"), app.user.amap.IBAN, false));
f.addElement(new sugoi.form.elements.Checkbox("allowMoneyPotWithNegativeBalance", t._("Allow money pots with negative balance"), app.user.amap.allowMoneyPotWithNegativeBalance));
if (f.isValid()){
var p = f.getValueOf("paymentTypes");
var a = app.user.amap;
a.lock();
a.allowedPaymentsType = p;
a.checkOrder = f.getValueOf("checkOrder");
a.IBAN = f.getValueOf("IBAN");
a.allowMoneyPotWithNegativeBalance = f.getValueOf("allowMoneyPotWithNegativeBalance");
a.update();
throw Ok("/amapadmin/payments", t._("Payment options updated"));
}
view.title = t._("Options of payment");
view.form = f;
}
}