diff --git a/config.xml.dist b/config.xml.dist index 4486521..46fdeb1 100644 --- a/config.xml.dist +++ b/config.xml.dist @@ -1,19 +1,14 @@ diff --git a/lang/master/tpl/design.mtt b/lang/master/tpl/design.mtt index 10ec6a8..5b5ba08 100644 --- a/lang/master/tpl/design.mtt +++ b/lang/master/tpl/design.mtt @@ -13,11 +13,7 @@ ::if groupName!=null && noGroup!=true::

::groupName::

::else:: -
- - ::NAME:: - -
+

::_("Cagette.net")::

::end:: @@ -129,12 +125,15 @@ - ::if (false && user!=null && user.isAmapManager()):: - - ::end:: ::end:: diff --git a/src/controller/Contract.hx b/src/controller/Contract.hx index 27299e7..73d5bf2 100755 --- a/src/controller/Contract.hx +++ b/src/controller/Contract.hx @@ -1,4 +1,5 @@ package controller; + import db.UserContract; import sugoi.form.elements.DateDropdowns; import sugoi.form.elements.Input; @@ -7,145 +8,139 @@ import sugoi.form.Form; import db.Contract; import Common; import plugin.Tutorial; + using Std; + import service.OrderService; -class Contract extends Controller -{ - - public function new() - { +class Contract extends Controller { + public function new() { super(); } - + @tpl("contract/view.mtt") public function doView(c:db.Contract) { view.category = 'amap'; view.c = c; } - + /** * "my account" page */ @tpl("contract/default.mtt") function doDefault() { - - //Create the list of links to change the language + // Create the list of links to change the language var langs = App.config.get("langs").split(";"); - var langNames = App.config.get("langnames").split(";"); - var i=0; + var langNames = App.config.get("langnames", "Français").split(";"); + var i = 0; var langLinks = ""; - for (lang in langs) - { + for (lang in langs) { langLinks += "
  • " + langNames[i] + "
  • "; i++; } view.langLinks = langLinks; view.langText = langNames[langs.indexOf(app.session.lang)]; - //change account lang - if (app.params.exists("lang") && app.user!=null){ + // change account lang + if (app.params.exists("lang") && app.user != null) { app.user.lock(); app.user.lang = app.params.get("lang"); app.user.update(); } - + var ua = db.UserAmap.get(app.user, app.user.amap); - if (ua == null) throw Error("/", t._("You are not a member of this group")); - + if (ua == null) + throw Error("/", t._("You are not a member of this group")); + var constOrders = null; - var varOrders = new Map>(); - - var a = App.current.user.amap; + var varOrders = new Map>(); + + var a = App.current.user.amap; var oneMonthAgo = DateTools.delta(Date.now(), -1000.0 * 60 * 60 * 24 * 30); - - //constant orders - var contracts = db.Contract.manager.search($type == db.Contract.TYPE_CONSTORDERS && $amap == a && $endDate > oneMonthAgo, false); + + // constant orders + var contracts = db.Contract.manager.search($type == db.Contract.TYPE_CONSTORDERS && $amap == a && $endDate > oneMonthAgo, false); constOrders = []; - for ( c in contracts){ + for (c in contracts) { var orders = app.user.getOrdersFromContracts([c]); - if (orders.length == 0) continue; - constOrders.push({contract:c, orders:service.OrderService.prepare(orders) }); + if (orders.length == 0) + continue; + constOrders.push({contract: c, orders: service.OrderService.prepare(orders)}); } - - //variable orders, grouped by date + + // variable orders, grouped by date var contracts = db.Contract.manager.search($type == db.Contract.TYPE_VARORDER && $amap == a && $endDate > oneMonthAgo, false); - + for (c in contracts) { var ds = c.getDistribs(false); for (d in ds) { - //store orders in a stringmap like "2015-01-01" => [order1,order2,...] + // store orders in a stringmap like "2015-01-01" => [order1,order2,...] var k = d.date.toString().substr(0, 10); var orders = app.user.getOrdersFromDistrib(d); if (orders.length > 0) { if (!varOrders.exists(k)) { varOrders.set(k, Lambda.array(orders)); - }else { + } else { var z = varOrders.get(k).concat(Lambda.array(orders)); varOrders.set(k, z); - } + } } } } - - //final structure - var varOrders2 = new Array<{date:Date,orders:Array}>(); - for ( k in varOrders.keys()) { + // final structure + var varOrders2 = new Array<{date:Date, orders:Array}>(); + for (k in varOrders.keys()) { var d = new Date(k.split("-")[0].parseInt(), k.split("-")[1].parseInt() - 1, k.split("-")[2].parseInt(), 0, 0, 0); - var orders = service.OrderService.prepare( Lambda.list(varOrders[k]) ); - - varOrders2.push({date:d,orders:orders}); + var orders = service.OrderService.prepare(Lambda.list(varOrders[k])); + + varOrders2.push({date: d, orders: orders}); } - - //sort by date desc + + // sort by date desc varOrders2.sort(function(b, a) { - return Math.round(a.date.getTime()/1000)-Math.round(b.date.getTime()/1000); + return Math.round(a.date.getTime() / 1000) - Math.round(b.date.getTime() / 1000); }); - + view.varOrders = varOrders2; view.constOrders = constOrders; - - + // tutorials if (app.user.isAmapManager()) { - - - //actions - if (app.params.exists('startTuto') ) { - - //start a tuto + // actions + if (app.params.exists('startTuto')) { + // start a tuto app.user.lock(); - var t = app.params.get('startTuto'); - app.user.tutoState = {name:t,step:0}; + var t = app.params.get('startTuto'); + app.user.tutoState = {name: t, step: 0}; app.user.update(); } - - - //tuto state - var tutos = new Array<{name:String,completion:Float,key:String}>(); - - for ( k in Tutorial.all().keys() ) { + + // tuto state + var tutos = new Array<{name:String, completion:Float, key:String}>(); + + for (k in Tutorial.all().keys()) { var t = Tutorial.all().get(k); - + var completion = null; - if (app.user.tutoState!=null && app.user.tutoState.name == k) completion = app.user.tutoState.step / t.steps.length; - - tutos.push( { name:t.name, completion:completion , key:k } ); + if (app.user.tutoState != null && app.user.tutoState.name == k) + completion = app.user.tutoState.step / t.steps.length; + + tutos.push({name: t.name, completion: completion, key: k}); } - + view.tutos = tutos; } - - //should be able to stop tuto in any case + + // should be able to stop tuto in any case if (app.params.exists('stopTuto')) { - //stopped tuto from a tuto window + // stopped tuto from a tuto window app.user.lock(); app.user.tutoState = null; - app.user.update(); + app.user.update(); view.stopTuto = true; } - + checkToken(); view.userAmap = ua; } @@ -155,29 +150,30 @@ class Contract extends Controller */ @tpl("form.mtt") function doEdit(c:db.Contract) { - view.category = 'contractadmin'; - if (!app.user.isContractManager(c)) throw Error('/', t._("Forbidden action")); + if (!app.user.isContractManager(c)) + throw Error('/', t._("Forbidden action")); - view.title = t._("Edit contract ::contractName::",{contractName:c.name}); + view.title = t._("Edit contract ::contractName::", {contractName: c.name}); var group = c.amap; var currentContact = c.contact; - + var form = Form.fromSpod(c); - form.removeElement( form.getElement("amapId") ); + form.removeElement(form.getElement("amapId")); form.removeElement(form.getElement("type")); form.getElement("userId").required = true; - app.event(EditContract(c,form)); - + app.event(EditContract(c, form)); + if (form.checkToken()) { form.toSpod(c); c.amap = group; - - //checks & warnings - if (c.hasPercentageOnOrders() && c.percentageValue==null) throw Error("/contract/edit/"+c.id, t._("If you would like to add fees to the order, define a rate (%) and a label.")); - + + // checks & warnings + if (c.hasPercentageOnOrders() && c.percentageValue == null) + throw Error("/contract/edit/" + c.id, t._("If you would like to add fees to the order, define a rate (%) and a label.")); + if (c.hasStockManagement()) { for (p in c.getProducts()) { if (p.stock == null) { @@ -186,73 +182,72 @@ class Contract extends Controller } } } - - //no stock mgmt for constant orders - if (c.hasStockManagement() && c.type==db.Contract.TYPE_CONSTORDERS) { + + // no stock mgmt for constant orders + if (c.hasStockManagement() && c.type == db.Contract.TYPE_CONSTORDERS) { c.flags.unset(ContractFlags.StockManagement); app.session.addMessage(t._("Managing stock is not available for CSA contracts"), true); } - - + c.update(); - - //update rights - if ( c.contact != null && (currentContact==null || c.contact.id!=currentContact.id) ) { + + // update rights + if (c.contact != null && (currentContact == null || c.contact.id != currentContact.id)) { var ua = db.UserAmap.get(c.contact, app.user.amap, true); ua.giveRight(ContractAdmin(c.id)); ua.giveRight(Messages); ua.giveRight(Membership); ua.update(); - - //remove rights to old contact + + // remove rights to old contact if (currentContact != null) { var x = db.UserAmap.get(currentContact, c.amap, true); if (x != null) { x.removeRight(ContractAdmin(c.id)); - x.update(); + x.update(); } } - } - - throw Ok("/contractAdmin/view/"+c.id, t._("Contract updated")); + + throw Ok("/contractAdmin/view/" + c.id, t._("Contract updated")); } - + view.form = form; } - + @tpl("contract/insertChoose.mtt") function doInsertChoose() { - //checkToken(); - + // checkToken(); } - + /** * Créé un nouveau contrat */ @tpl("form.mtt") function doInsert(?type:Int) { - if (!app.user.canManageAllContracts()) throw Error('/', t._("Forbidden action")); - if (type == null) throw Redirect('/contract/insertChoose'); - - view.title = if (type == db.Contract.TYPE_CONSTORDERS)t._("Create a contract with fixed orders") else t._("Create a contract with variable orders"); - + if (!app.user.canManageAllContracts()) + throw Error('/', t._("Forbidden action")); + if (type == null) + throw Redirect('/contract/insertChoose'); + + view.title = if (type == db.Contract.TYPE_CONSTORDERS) t._("Create a contract with fixed orders") else t._("Create a contract with variable orders"); + var c = new db.Contract(); - + var form = Form.fromSpod(c); - form.removeElement( form.getElement("amapId") ); + form.removeElement(form.getElement("amapId")); form.removeElement(form.getElement("type")); form.getElement("userId").required = true; - + if (form.checkToken()) { form.toSpod(c); c.amap = app.user.amap; - //trace(app.user.amap); - //trace(c.amap); + // trace(app.user.amap); + // trace(c.amap); c.type = type; c.insert(); - - //right + + // right if (c.contact != null) { var ua = db.UserAmap.get(c.contact, app.user.amap, true); ua.giveRight(ContractAdmin(c.id)); @@ -260,51 +255,52 @@ class Contract extends Controller ua.giveRight(Membership); ua.update(); } - - throw Ok("/contractAdmin/view/"+c.id, t._("New contract created")); + + throw Ok("/contractAdmin/view/" + c.id, t._("New contract created")); } - + view.form = form; } - + /** * Delete a contract (... and its products, orders & distributions) */ function doDelete(c:db.Contract) { - - if (!app.user.canManageAllContracts()) throw Error("/contractAdmin", t._("You don't have the authorization to remove a contract")); - + if (!app.user.canManageAllContracts()) + throw Error("/contractAdmin", t._("You don't have the authorization to remove a contract")); + if (checkToken()) { c.lock(); - - //check if there is orders in this contract + + // check if there is orders in this contract var products = c.getProducts(); var orders = db.UserContract.manager.search($productId in Lambda.map(products, function(p) return p.id)); var qt = 0.0; - for ( o in orders) qt += o.quantity; //there could be "zero c qt" orders + for (o in orders) + qt += o.quantity; // there could be "zero c qt" orders if (qt > 0) { throw Error("/contractAdmin", t._("You cannot delete this contract because some orders are linked to it.")); } - - //remove admin rights and delete contract - if(c.contact!=null){ + + // remove admin rights and delete contract + if (c.contact != null) { var ua = db.UserAmap.get(c.contact, c.amap, true); if (ua != null) { ua.removeRight(ContractAdmin(c.id)); - ua.update(); - } + ua.update(); + } } - + app.event(DeleteContract(c)); - + c.delete(); throw Ok("/contractAdmin", t._("Contract deleted")); } - + throw Error("/contractAdmin", t._("Token error")); } - + /** * Make an order by contract ( standard mode ) * The form is prepopulated if orders have already been made. @@ -314,305 +310,301 @@ class Contract extends Controller * */ @tpl("contract/order.mtt") - function doOrder(c:db.Contract ) { - - //checks - if (app.user.amap.hasPayments()) throw Redirect("/contract/orderAndPay/" + c.id); - if (app.user.amap.hasShopMode()) throw Redirect("/shop"); - if (!c.isUserOrderAvailable()) throw Error("/", t._("This contract is not opened for orders")); + function doOrder(c:db.Contract) { + // checks + if (app.user.amap.hasPayments()) + throw Redirect("/contract/orderAndPay/" + c.id); + if (app.user.amap.hasShopMode()) + throw Redirect("/shop"); + if (!c.isUserOrderAvailable()) + throw Error("/", t._("This contract is not opened for orders")); - var distributions = []; // If its a varying contract, we display a column by distribution if (c.type == db.Contract.TYPE_VARORDER) { distributions = db.Distribution.getOpenToOrdersDeliveries(c); - }else{ + } else { distributions = [null]; } - - //list of distribs with a list of product and optionnaly an order - var userOrders = new Array< {distrib:db.Distribution,datas:Array<{order:db.UserContract,product:db.Product}>} >(); + + // list of distribs with a list of product and optionnaly an order + var userOrders = new Array<{distrib:db.Distribution, datas:Array<{order:db.UserContract, product:db.Product}>}>(); var products = c.getProducts(); - - if ( c.type == db.Contract.TYPE_VARORDER ){ - - for ( d in distributions){ + + if (c.type == db.Contract.TYPE_VARORDER) { + for (d in distributions) { var datas = []; - for ( p in products) { - var ua = { order:null, product:p }; - - var order = db.UserContract.manager.select($user == app.user && $productId == p.id && $distributionId==d.id, true); - - if (order != null) ua.order = order; + for (p in products) { + var ua = {order: null, product: p}; + + var order = db.UserContract.manager.select($user == app.user && $productId == p.id && $distributionId == d.id, true); + + if (order != null) + ua.order = order; datas.push(ua); } - - userOrders.push({distrib:d,datas:datas}); + + userOrders.push({distrib: d, datas: datas}); } - - }else{ - + } else { var datas = []; - for ( p in products) { - var ua = { order:null, product:p }; - + for (p in products) { + var ua = {order: null, product: p}; + var order = db.UserContract.manager.select($user == app.user && $productId == p.id, true); - - if (order != null) ua.order = order; + + if (order != null) + ua.order = order; datas.push(ua); } - - userOrders.push({distrib:null,datas:datas}); - + + userOrders.push({distrib: null, datas: datas}); } - - //form check + // form check if (checkToken()) { - - //get dsitrib if needed - //var distrib : db.Distribution = null; - //if (c.type == db.Contract.TYPE_VARORDER) { - //distrib = db.Distribution.manager.get(Std.parseInt(app.params.get("distribution")), false); - //} - + // get dsitrib if needed + // var distrib : db.Distribution = null; + // if (c.type == db.Contract.TYPE_VARORDER) { + // distrib = db.Distribution.manager.get(Std.parseInt(app.params.get("distribution")), false); + // } + for (k in app.params.keys()) { - - if (k.substr(0, 1) != "d") continue; + if (k.substr(0, 1) != "d") + continue; var qt = app.params.get(k); - if (qt == "") continue; - + if (qt == "") + continue; + var pid = null; var did = null; - try{ - pid = Std.parseInt(k.split("-")[1].substr(1)); - did = Std.parseInt(k.split("-")[0].substr(1)); - }catch (e:Dynamic){trace("unable to parse key "+k); } - - //find related element in userOrders + try { + pid = Std.parseInt(k.split("-")[1].substr(1)); + did = Std.parseInt(k.split("-")[0].substr(1)); + } catch (e:Dynamic) { + trace("unable to parse key " + k); + } + + // find related element in userOrders var uo = null; - for ( x in userOrders){ - if (x.distrib!=null && x.distrib.id != did) { + for (x in userOrders) { + if (x.distrib != null && x.distrib.id != did) { continue; - }else{ - for (a in x.datas){ - if (a.product.id == pid){ + } else { + for (a in x.datas) { + if (a.product.id == pid) { uo = a; break; } } } } - - if (uo == null) throw t._("Could not find the product ::produ:: and delivery ::deliv::", {produ:pid, deliv:did}); - + + if (uo == null) + throw t._("Could not find the product ::produ:: and delivery ::deliv::", {produ: pid, deliv: did}); + var q = 0.0; - - if (uo.product.hasFloatQt ) { + + if (uo.product.hasFloatQt) { var param = StringTools.replace(qt, ",", "."); q = Std.parseFloat(param); - }else { + } else { q = Std.parseInt(qt); } - - - if (uo.order != null) { + + if (uo.order != null) { OrderService.edit(uo.order, q); - }else { + } else { OrderService.make(app.user, q, uo.product, did); } - } - throw Ok("/contract/order/"+c.id, t._("Your order has been updated")); + throw Ok("/contract/order/" + c.id, t._("Your order has been updated")); } - + view.c = view.contract = c; view.userOrders = userOrders; } - - + /** * Make an order by contract ( standard mode ) + payment process */ @tpl("contract/orderAndPay.mtt") - function doOrderAndPay(c:db.Contract ) { - - //checks - if (!app.user.amap.hasPayments()) throw Redirect("/contract/order/" + c.id); - if (app.user.amap.hasShopMode()) throw Redirect("/"); - if (!c.isUserOrderAvailable()) throw Error("/", t._("This contract is not opened for orders")); - + function doOrderAndPay(c:db.Contract) { + // checks + if (!app.user.amap.hasPayments()) + throw Redirect("/contract/order/" + c.id); + if (app.user.amap.hasShopMode()) + throw Redirect("/"); + if (!c.isUserOrderAvailable()) + throw Error("/", t._("This contract is not opened for orders")); + var distributions = []; /* If its a varying contract, we display a column by distribution*/ if (c.type == db.Contract.TYPE_VARORDER) { distributions = db.Distribution.getOpenToOrdersDeliveries(c); } - - //list of distribs with a list of product and optionnaly an order - var userOrders = new Array< {distrib:db.Distribution,datas:Array<{order:db.UserContract,product:db.Product}>} >(); + + // list of distribs with a list of product and optionnaly an order + var userOrders = new Array<{distrib:db.Distribution, datas:Array<{order:db.UserContract, product:db.Product}>}>(); var products = c.getProducts(); - - for ( d in distributions){ + + for (d in distributions) { var datas = []; - for ( p in products) { - var ua = { order:null, product:p }; - - var order : db.UserContract = null; + for (p in products) { + var ua = {order: null, product: p}; + + var order:db.UserContract = null; if (c.type == db.Contract.TYPE_VARORDER) { - order = db.UserContract.manager.select($user == app.user && $productId == p.id && $distributionId==d.id, true); - }else { + order = db.UserContract.manager.select($user == app.user && $productId == p.id && $distributionId == d.id, true); + } else { order = db.UserContract.manager.select($user == app.user && $productId == p.id, true); } - - if (order != null) ua.order = order; + + if (order != null) + ua.order = order; datas.push(ua); } - - userOrders.push({distrib:d,datas:datas}); + + userOrders.push({distrib: d, datas: datas}); } - - - //form check + + // form check if (checkToken()) { - - //get distrib if needed + // get distrib if needed var distrib = null; if (c.type == db.Contract.TYPE_VARORDER) { distrib = db.Distribution.manager.get(Std.parseInt(app.params.get("distribution")), false); } - - var orders : OrderInSession = {products:[],userId:app.user.id,total:0}; - + + var orders:OrderInSession = {products: [], userId: app.user.id, total: 0}; + for (k in app.params.keys()) { - - if (k.substr(0, 1) != "d") continue; + if (k.substr(0, 1) != "d") + continue; var qt = app.params.get(k); - if (qt == "") continue; - + if (qt == "") + continue; + var pid = null; var did = null; - try{ + try { pid = Std.parseInt(k.split("-")[1].substr(1)); did = Std.parseInt(k.split("-")[0].substr(1)); - }catch (e:Dynamic){ - trace("unable to parse key "+k); + } catch (e:Dynamic) { + trace("unable to parse key " + k); } - - //find related element in userOrders + + // find related element in userOrders var uo = null; - for ( x in userOrders){ - if (x.distrib!=null && x.distrib.id != did) { + for (x in userOrders) { + if (x.distrib != null && x.distrib.id != did) { continue; - }else{ - for (a in x.datas){ - if (a.product.id == pid){ + } else { + for (a in x.datas) { + if (a.product.id == pid) { uo = a; break; } } } } - - if (uo == null) throw t._("Could not find the product ::produ:: and delivery ::deliv::", {produ:pid, deliv:did}); - - //quantity - var q = 0.0; - if (uo.product.hasFloatQt ) { + + if (uo == null) + throw t._("Could not find the product ::produ:: and delivery ::deliv::", {produ: pid, deliv: did}); + + // quantity + var q = 0.0; + if (uo.product.hasFloatQt) { var param = StringTools.replace(qt, ",", "."); q = Std.parseFloat(param); - }else { + } else { q = Std.parseInt(qt); } - - orders.products.push({productId:pid, quantity:q, distributionId:did}); - + + orders.products.push({productId: pid, quantity: q, distributionId: did}); + var p = db.Product.manager.get(pid, false); orders.total += p.getPrice() * q; - } - + App.current.session.data.order = orders; - - //Go to payments page + + // Go to payments page if (c.type == db.Contract.TYPE_CONSTORDERS) { - throw Ok("/contract/order/"+c.id, t._("Your CSA order has been saved")); - }else{ + throw Ok("/contract/order/" + c.id, t._("Your CSA order has been saved")); + } else { throw Ok("/transaction/pay/", t._("In order to save your order, please choose a means of payment.")); } - - - } - + view.c = view.contract = c; - view.userOrders = userOrders; + view.userOrders = userOrders; } - - + /** * A user edit an order for a multidistrib. */ @tpl("contract/orderByDate.mtt") function doEditOrderByDate(date:Date) { - if (app.user.amap.hasPayments()) { - //when payments are active, the user cannot modify his order + // when payments are active, the user cannot modify his order throw Redirect("/"); } - + // cannot edit order if date is in the past if (Date.now().getTime() > date.getTime()) { - var msg = t._("This delivery has already taken place, you can no longer modify the order."); - if (app.user.isContractManager()) msg += t._("
    As the manager of the contract you can modify the order from this page: Management of contracts"); - + if (app.user.isContractManager()) + msg += t._("
    As the manager of the contract you can modify the order from this page: Management of contracts"); + throw Error("/contract", msg); } - - // Il faut regarder le contrat de chaque produit et verifier si le contrat est toujours ouvert à la commande. + + // Il faut regarder le contrat de chaque produit et verifier si le contrat est toujours ouvert à la commande. var d1 = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); var d2 = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59); var cids = Lambda.map(app.user.amap.getActiveContracts(true), function(c) return c.id); - var distribs = db.Distribution.manager.search(($contractId in cids) && $date >= d1 && $date <=d2 , false); - var orders = db.UserContract.manager.search($userId==app.user.id && $distributionId in Lambda.map(distribs,function(d)return d.id) ); + var distribs = db.Distribution.manager.search(($contractId in cids) && $date >= d1 && $date <= d2, false); + var orders = db.UserContract.manager.search($userId == app.user.id + && $distributionId in Lambda.map(distribs, function(d) return d.id)); view.orders = service.OrderService.prepare(orders); view.date = date; - - //form check + + // form check if (checkToken()) { - var orders_out = []; - + for (k in app.params.keys()) { var param = app.params.get(k); if (k.substr(0, "product".length) == "product") { - - //trouve le produit dans userOrders + // trouve le produit dans userOrders var pid = Std.parseInt(k.substr("product".length)); var order = Lambda.find(orders, function(uo) return uo.product.id == pid); - if (order == null) throw t._("Error, could not find the order"); - + if (order == null) + throw t._("Error, could not find the order"); + var q = 0.0; - if (order.product.hasFloatQt ) { + if (order.product.hasFloatQt) { param = StringTools.replace(param, ",", "."); q = Std.parseFloat(param); - }else { + } else { q = Std.parseInt(param); } - - var quantity = Math.abs( q==null?0:q ); - if ( order.distribution.canOrderNow() ) { - //met a jour la commande + var quantity = Math.abs(q == null ? 0 : q); + + if (order.distribution.canOrderNow()) { + // met a jour la commande var o = OrderService.edit(order, quantity); - if(o!=null) orders_out.push( o ); - } + if (o != null) + orders_out.push(o); + } } } - + app.event(MakeOrder(orders_out)); - + throw Ok("/contract", t._("Your order has been updated")); } } diff --git a/src/controller/Messages.hx b/src/controller/Messages.hx index c0f2683..c8950d2 100755 --- a/src/controller/Messages.hx +++ b/src/controller/Messages.hx @@ -32,7 +32,7 @@ class Messages extends Controller { form.addElement(new StringInput("senderName", t._("Sender name"), senderName, true)); form.addElement(new StringInput("senderMail", t._("Sender E-Mail"), senderMail, true)); form.addElement(new StringSelect("list", t._("Recipients"), lists, "3", true, null, "style='width:500px;'")); - form.addElement(new StringInput("subject", t._("Subject:"), "", false, null, "style='width:500px;'")); + form.addElement(new StringInput("subject", t._("Subject:"), "", true, null, "style='width:500px;'")); form.addElement(new TextArea("text", t._("Message:"), "", false, null, "style='width:500px;height:350px;'")); if (form.checkToken()) { @@ -52,7 +52,7 @@ class Messages extends Controller { // send mail confirmation link var e = new sugoi.mail.Mail(); e.setSender(App.config.get("default_email"), t._("Cagette.net")); - e.setSubject(subject); + e.setSubject('[cagettepei] $subject'); var replyTo = form.getValueOf("senderMail"); var replyToName = form.getValueOf("senderName"); @@ -63,9 +63,13 @@ class Messages extends Controller { e.addRecipient(x); var text:String = form.getValueOf("text"); + if (text == null) + text = ""; var html = app.processTemplate("mail/message.mtt", {text: text, group: app.user.amap, list: getListName(listId)}); e.setHtmlBody(html); + App.log('text=[$text]'); + App.log('html= ${e.getHtmlBody()}'); App.sendMail(e, app.user.getAmap(), listId, app.user); // store message diff --git a/src/controller/User.hx b/src/controller/User.hx index e472b93..3c2f3af 100755 --- a/src/controller/User.hx +++ b/src/controller/User.hx @@ -1,4 +1,5 @@ package controller; + import haxe.crypto.Md5; import sugoi.form.elements.Input; import sugoi.form.Form; @@ -7,200 +8,192 @@ import sugoi.form.elements.StringInput; import sugoi.form.validators.EmailValidator; import ufront.mail.*; -class User extends Controller -{ - public function new() - { +class User extends Controller { + public function new() { super(); } - + @tpl("user/default.mtt") - function doDefault() { - - } - - + function doDefault() {} + @tpl("user/login.mtt") function doLogin() { - if (App.current.user != null) { throw Redirect('/'); } - - //if its needed to redirect after login - if (app.params.exists("redirect")){ + + // if its needed to redirect after login + if (app.params.exists("redirect")) { view.redirect = app.params.exists("redirect"); - }else{ + } else { view.redirect = "/"; } } - - + /** * Choose which group to connect to. */ @logged @tpl("user/choose.mtt") - function doChoose(?args: { amap:db.Amap } ) { - - if (app.user == null) throw t._("You are not connected"); - + function doChoose(?args:{amap:db.Amap}) { + if (app.user == null) + throw t._("You are not connected"); + var amaps = db.UserAmap.manager.search($user == app.user, false); - + if (amaps.length == 1 && !app.params.exists("show")) { - //qu'une amap + // qu'une amap app.session.data.amapId = amaps.first().amap.id; throw Redirect('/'); - }else{ - view.noGroup = true; //force template to not display current group + } else { + view.noGroup = true; // force template to not display current group } - - if (args!=null && args.amap!=null) { - //select a group - var which = app.session.data==null ? 0 : app.session.data.whichUser ; + + if (args != null && args.amap != null) { + // select a group + var which = app.session.data == null ? 0 : app.session.data.whichUser; app.session.data.order = null; app.session.data.newGroup = null; app.session.data.amapId = args.amap.id; app.session.data.whichUser = which; throw Redirect('/'); } - + view.amaps = amaps; view.wl = db.WaitingList.manager.search($user == app.user, false); - #if plugins view.pros = pro.db.PUserCompany.getCompanies(app.user); #end } - + function doLogout() { App.current.session.delete(); throw Redirect('/'); } - + /** * Ask for password renewal by mail * when password is forgotten */ @tpl("user/forgottenPassword.mtt") - function doForgottenPassword(?key:String, ?u:db.User){ - - //STEP 1 + function doForgottenPassword(?key:String, ?u:db.User) { + // STEP 1 var step = 1; - var error : String = null; + var error:String = null; var url = "/user/forgottenPassword"; - - //ask for mail + + // ask for mail var askmailform = new Form("askemail"); - askmailform.addElement(new StringInput("email", t._("Please key-in your E-Mail address"),null,true)); - - //change pass form + askmailform.addElement(new StringInput("email", t._("Please key-in your E-Mail address"), null, true)); + + // change pass form var chpassform = new Form("chpass"); - - var pass1 = new StringInput("pass1", t._("Your new password"),null,true); + + var pass1 = new StringInput("pass1", t._("Your new password"), null, true); pass1.password = true; chpassform.addElement(pass1); - - var pass2 = new StringInput("pass2", t._("Again your new password"),null,true); + + var pass2 = new StringInput("pass2", t._("Again your new password"), null, true); pass2.password = true; chpassform.addElement(pass2); - - var uid = new IntInput("uid","uid", u == null?null:u.id); + + var uid = new IntInput("uid", "uid", u == null ? null : u.id); uid.inputType = ITHidden; chpassform.addElement(uid); - + if (askmailform.isValid()) { - //STEP 2 - //send password renewal email + // STEP 2 + // send password renewal email step = 2; - - var email :String = askmailform.getValueOf("email"); + + var email:String = askmailform.getValueOf("email"); var user = db.User.manager.select(email == $email, false); - //could be user 2 - if(user==null) user = db.User.manager.select(email == $email2, false); - - //user not found - if (user == null) throw Error(url, t._("This E-mail is not linked to a known account")); - - //create token - var token = haxe.crypto.Md5.encode("chp"+Std.random(1000000000)); + // could be user 2 + if (user == null) + user = db.User.manager.select(email == $email2, false); + + // user not found + if (user == null) + throw Error(url, t._("This E-mail is not linked to a known account")); + + // create token + var token = haxe.crypto.Md5.encode("chp" + Std.random(1000000000)); sugoi.db.Cache.set(token, user.id, 60 * 60 * 24 * 30); - + var m = new sugoi.mail.Mail(); - m.setSender(App.config.get("default_email"), t._("Cagette.net")); - m.setRecipient(email, user.name); - m.setSubject( "["+App.config.NAME+"] : "+t._("Password change")); - m.setHtmlBody( app.processTemplate('mail/forgottenPassword.mtt', { user:user, link:'http://' + App.config.HOST + '/user/forgottenPassword/'+token+"/"+user.id }) ); - App.sendMail(m); + m.setSender(App.config.get("default_email"), t._("Cagette.net")); + m.setRecipient(email, user.name); + m.setSubject("[" + App.config.NAME + "] " + t._("Password change")); + m.setHtmlBody(app.processTemplate('mail/forgottenPassword.mtt', + {user: user, link: 'http://' + App.config.HOST + '/user/forgottenPassword/' + token + "/" + user.id})); + App.sendMail(m); } - - if (key != null && u!=null) { - //check key and propose to change pass + + if (key != null && u != null) { + // check key and propose to change pass step = 3; - - if ( u.id == sugoi.db.Cache.get(key) ) { + + if (u.id == sugoi.db.Cache.get(key)) { view.form = chpassform; - }else { + } else { error = t._("Invalid request"); } } - + if (chpassform.isValid()) { - //change pass + // change pass step = 4; - - if ( chpassform.getValueOf("pass1") == chpassform.getValueOf("pass2")) { - - var uid = Std.parseInt( chpassform.getValueOf("uid") ); + + if (chpassform.getValueOf("pass1") == chpassform.getValueOf("pass2")) { + var uid = Std.parseInt(chpassform.getValueOf("uid")); var user = db.User.manager.get(uid, true); var pass = chpassform.getValueOf("pass1"); user.setPass(pass); user.update(); var m = new sugoi.mail.Mail(); - m.setSender(App.config.get("default_email"), t._("Cagette.net")); - m.setRecipient(user.email, user.name); - if(user.email2!=null) m.setRecipient(user.email2, user.name); - m.setSubject( "["+App.config.NAME+"] : "+t._("New password confirmed")); + m.setSender(App.config.get("default_email"), t._("Cagette.net")); + m.setRecipient(user.email, user.name); + if (user.email2 != null) + m.setRecipient(user.email2, user.name); + m.setSubject("[" + App.config.NAME + "] : " + t._("New password confirmed")); var emails = [user.email]; - if(user.email2!=null) emails.push(user.email2); + if (user.email2 != null) + emails.push(user.email2); var params = { - user:user, - emails:emails.join(", "), - password:pass, - NAME:App.config.NAME + user: user, + emails: emails.join(", "), + password: pass, + NAME: App.config.NAME } - m.setHtmlBody( app.processTemplate('mail/newPasswordConfirmed.mtt', params) ); - App.sendMail(m); - - }else { + m.setHtmlBody(app.processTemplate('mail/newPasswordConfirmed.mtt', params)); + App.sendMail(m); + } else { error = t._("You must key-in two times the same password"); } } - + if (step == 1) { view.form = askmailform; } - + view.step = step; view.error = error; } - - + /** * generate a custom key for transactionnal emails, valid during the current day */ - //function getKey(m:db.User) { - //return haxe.crypto.Md5.encode(App.config.get("key")+m.email+(Date.now().getDate())).substr(0,12); - //} - - + // function getKey(m:db.User) { + // return haxe.crypto.Md5.encode(App.config.get("key")+m.email+(Date.now().getDate())).substr(0,12); + // } + @logged @tpl("form.mtt") - function doDefinePassword(?key:String, ?u:db.User){ - - if (app.user.isFullyRegistred()) throw Error("/", t._("You already have a password")); + function doDefinePassword(?key:String, ?u:db.User) { + if (app.user.isFullyRegistred()) + throw Error("/", t._("You already have a password")); var form = new Form("definepass"); var pass1 = new StringInput("pass1", t._("Your new password")); @@ -209,47 +202,39 @@ class User extends Controller pass2.password = true; form.addElement(pass1); form.addElement(pass2); - + if (form.isValid()) { - - if ( form.getValueOf("pass1") == form.getValueOf("pass2")) { - + if (form.getValueOf("pass1") == form.getValueOf("pass2")) { app.user.lock(); app.user.setPass(form.getValueOf("pass1")); app.user.update(); throw Ok('/', t._("Congratulations, your account is now protected by a password.")); - - }else { - form.addError( t._("You must key-in two times the same password")); + } else { + form.addError(t._("You must key-in two times the same password")); } } view.form = form; view.title = t._("Create a password for your account"); } - + /** * landing page when coming from an invitation * @param k */ - public function doValidate(k:String ) { - - var uid = Std.parseInt(sugoi.db.Cache.get("validation" + k)); - if (uid == null || uid==0) throw Error('/user/login', t._("Your invitation is invalid or expired ($k)")); + public function doValidate(k:String) { + var uid = Std.parseInt(sugoi.db.Cache.get("validation" + k)); + if (uid == null || uid == 0) + throw Error('/user/login', t._("Your invitation is invalid or expired ($k)")); var user = db.User.manager.get(uid, true); - + db.User.login(user, user.email); - + var groups = user.getAmaps(); - if(groups.length>0) app.session.data.amapId = groups.first().id; - + if (groups.length > 0) + app.session.data.amapId = groups.first().id; + sugoi.db.Cache.destroy("validation" + k); - - throw Ok("/user/definePassword", t._("Congratulations ::userName::, your account is validated!", {userName:user.getName()})); - - - + + throw Ok("/user/definePassword", t._("Congratulations ::userName::, your account is validated!", {userName: user.getName()})); } - - - -} \ No newline at end of file +} diff --git a/src/sugoi/Config.hx b/src/sugoi/Config.hx index 3e19938..2cb754d 100644 --- a/src/sugoi/Config.hx +++ b/src/sugoi/Config.hx @@ -3,61 +3,60 @@ package sugoi; import sugoi.Web; class Config { - - public var PATH :String; - //public var json : Dynamic; - public var xml : Xml; - public var LANG :String; - public var LANGS :Array; - public var TPL :String; - public var TPL_TMP :String; - public var DEBUG :Bool; - public var HOST :String; - public var NAME :String; - public var KEY :String; - public var DATA_HOST :String; - public var SQL_LOG :Bool; + public var PATH:String; + // public var json : Dynamic; + public var xml:Xml; + public var LANG:String; + public var LANGS:Array; + public var TPL:String; + public var TPL_TMP:String; + public var DEBUG:Bool; + public var HOST:String; + public var NAME:String; + public var KEY:String; + public var DATA_HOST:String; + public var SQL_LOG:Bool; public function new(?path:String) { PATH = (path != null) ? path : Web.getCwd() + "../"; - //json = haxe.Json.parse(sys.io.File.getContent(PATH + "config.json")); xml = Xml.parse(sys.io.File.getContent(PATH + "config.xml")).firstElement(); - - LANG = get("lang"); - LANGS = get("langs").split(";"); + + NAME = get("name", "cagettepei"); + LANG = get("lang", "fr"); + LANGS = get("langs", "fr").split(";"); + TPL = PATH + "lang/" + LANG + "/tpl/"; TPL_TMP = PATH + "lang/" + LANG + "/tmp/"; - DEBUG = get("debug","0") == "1"; + DEBUG = get("debug", "0") == "1"; HOST = get("host"); - NAME = get("name"); KEY = get("key"); - DATA_HOST = get("dataHost","data."+HOST); + DATA_HOST = get("dataHost", "data." + HOST); SQL_LOG = getBool("sqllog", false); } - - public function defined( val : String ) { - //return Reflect.field(xml,val) != null; + + public function defined(val:String) { + // return Reflect.field(xml,val) != null; return xml.get(val) != null; } - public function getBool( val : String, ?def ) { + public function getBool(val:String, ?def) { var v = get(val); - if( v == null ) return def; - return( v == "1" || v == "true" ); + if (v == null) + return def; + return (v == "1" || v == "true"); } - public function get( val : String, ?def : String ) : String { - //var v = Reflect.field(xml,val); + public function get(val:String, ?def:String):String { + // var v = Reflect.field(xml,val); var v = xml.get(val); - if( v == null ) + if (v == null) v = def; - if( v == null ) - throw "Missing config attribute : '"+val+"'"; + if (v == null) + throw "Missing config attribute : '" + val + "'"; return v; } - public function getInt( val : String, ?def : Int ) : Int { - return Std.parseInt(get(val,Std.string(def))); + public function getInt(val:String, ?def:Int):Int { + return Std.parseInt(get(val, Std.string(def))); } - } diff --git a/www/img/logo-mini.jpg b/www/img/logo-mini.jpg new file mode 100644 index 0000000..bb79db9 Binary files /dev/null and b/www/img/logo-mini.jpg differ diff --git a/www/img/logo.jpg b/www/img/logo.jpg new file mode 100644 index 0000000..bd51b36 Binary files /dev/null and b/www/img/logo.jpg differ diff --git a/www/lang/texts_fr.po b/www/lang/texts_fr.po index 80bf3c3..d29819e 100644 --- a/www/lang/texts_fr.po +++ b/www/lang/texts_fr.po @@ -2237,7 +2237,7 @@ msgid "" "Welcome in the group of ::name::!\n" " You can look at the delivery planning or make a new order." msgstr "" -"Bienvenue sur la cagette de ::name:: !\n" +"Bienvenue sur le CagettePéi de ::name:: !\n" " Vous pouvez consulter votre planning de distribution ou faire une nouvelle " "commande."