Browse Source

cagettepéi

master
pvincent 3 years ago
parent
commit
ef7b09454c
  1. 4
      Makefile
  2. 100
      js/react/user/LoginBox.hx
  3. 2
      lang/master/tpl/base.mtt
  4. 4
      lang/master/tpl/design.mtt
  5. 2
      src/App.hx
  6. 4
      src/controller/Cron.hx
  7. 786
      src/controller/Member.hx
  8. 470
      src/service/OrderService.hx

4
Makefile

@ -41,7 +41,7 @@ install_dev:
#compile backend to Neko #compile backend to Neko
compile: compile:
@if [ $(PLUGINS) = 1 ]; then \ @if [ $(PLUGINS) = 1 ]; then \
echo "compile Cagette.net with plugins"; \
echo "compile CagettePéi plugins"; \
haxe cagetteAllPlugins.hxml; \ haxe cagetteAllPlugins.hxml; \
else \ else \
echo "compile CagettePéi core"; \ echo "compile CagettePéi core"; \
@ -74,7 +74,7 @@ templates:
@make LANG=fr ctemplates @make LANG=fr ctemplates
msgfmt www/lang/texts_fr.po -o www/lang/texts_fr.mo msgfmt www/lang/texts_fr.po -o www/lang/texts_fr.mo
chown www-data:www-data -R www chown www-data:www-data -R www
chown www-data:www-data -R lang
chown www-data:www-data -R lang/fr
ctemplates: ctemplates:
(cd lang/$(LANG)/tpl; temploc2 -macros macros.mtt -output ../tmp/ *.mtt */*.mtt */*/*.mtt) (cd lang/$(LANG)/tpl; temploc2 -macros macros.mtt -output ../tmp/ *.mtt */*.mtt */*/*.mtt)

100
js/react/user/LoginBox.hx

@ -1,4 +1,5 @@
package react.user; package react.user;
import react.ReactComponent; import react.ReactComponent;
import react.ReactMacro.jsx; import react.ReactMacro.jsx;
import Common; import Common;
@ -19,23 +20,21 @@ typedef LoginBoxState = {
* Login Box * Login Box
* @author fbarbut * @author fbarbut
*/ */
class LoginBox extends react.ReactComponentOfPropsAndState<LoginBoxProps,LoginBoxState>
{
public function new(props:LoginBoxProps)
{
if (props.redirectUrl == null) props.redirectUrl = "/";
if (props.message == "") props.message = null;
super(props);
this.state = {email:"", password:"", error:null};
class LoginBox extends react.ReactComponentOfPropsAndState<LoginBoxProps, LoginBoxState> {
public function new(props:LoginBoxProps) {
if (props.redirectUrl == null)
props.redirectUrl = "/";
if (props.message == "")
props.message = null;
super(props);
this.state = {email: "", password: "", error: null};
} }
function setError(err:String){
this.setState(cast {error:err});
function setError(err:String) {
this.setState(cast {error: err});
} }
override public function render(){
override public function render() {
return jsx('<div onKeyPress=$onKeyPress> return jsx('<div onKeyPress=$onKeyPress>
<$Error error="${state.error}" /> <$Error error="${state.error}" />
<$Message message="${props.message}" /> <$Message message="${props.message}" />
@ -62,78 +61,75 @@ class LoginBox extends react.ReactComponentOfPropsAndState<LoginBoxProps,LoginBo
<!-- <!--
<hr/> <hr/>
<p className="text-center"> <p className="text-center">
<b>C\'est votre première visite sur Cagette.net ?</b>&nbsp;&nbsp;
<b>C\'est votre première visite sur CagettePéi ?</b>&nbsp;&nbsp;
<a onClick={registerBox} className="btn btn-default"><span className="glyphicon glyphicon-chevron-right"></span> S\'inscrire</a> <a onClick={registerBox} className="btn btn-default"><span className="glyphicon glyphicon-chevron-right"></span> S\'inscrire</a>
</p> </p>
--> -->
</div>'); </div>');
} }
/** /**
* @doc https://facebook.github.io/react/docs/forms.html * @doc https://facebook.github.io/react/docs/forms.html
*/ */
function onChange(e:js.html.Event){
function onChange(e:js.html.Event) {
e.preventDefault(); e.preventDefault();
var name :String = untyped e.target.name;
var value :String = untyped /*(e.target.value == "") ? null :*/ e.target.value;
var name:String = untyped e.target.name;
var value:String = untyped /*(e.target.value == "") ? null :*/ e.target.value;
Reflect.setField(state, name, value); Reflect.setField(state, name, value);
this.setState(this.state); this.setState(this.state);
} }
/** /**
* displays a registerBox * displays a registerBox
*/ */
public function registerBox(){
public function registerBox() {
var body = js.Browser.document.querySelector('#myModal .modal-body'); var body = js.Browser.document.querySelector('#myModal .modal-body');
ReactDOM.unmountComponentAtNode( body );
ReactDOM.unmountComponentAtNode(body);
js.Browser.document.querySelector("#myModal .modal-title").innerHTML = "Inscription"; js.Browser.document.querySelector("#myModal .modal-title").innerHTML = "Inscription";
ReactDOM.render(jsx('<$RegisterBox redirectUrl="${props.redirectUrl}" phoneRequired="${props.phoneRequired}"/>'), body );
ReactDOM.render(jsx('<$RegisterBox redirectUrl="${props.redirectUrl}" phoneRequired="${props.phoneRequired}"/>'), body);
} }
public function submit(?e:js.html.Event){
if (state.email == ""){
public function submit(?e:js.html.Event) {
if (state.email == "") {
setError("Veuillez saisir votre email"); setError("Veuillez saisir votre email");
return; return;
} }
if (state.password == ""){
if (state.password == "") {
setError("Veuillez saisir votre mot de passe"); setError("Veuillez saisir votre mot de passe");
return; return;
} }
//lock button
var el: js.html.Element = null;
if(e!=null){
// lock button
var el:js.html.Element = null;
if (e != null) {
el = cast e.target; el = cast e.target;
el.classList.add("disabled"); el.classList.add("disabled");
} }
var req = new haxe.Http("/api/user/login"); var req = new haxe.Http("/api/user/login");
req.addParameter("email", state.email); req.addParameter("email", state.email);
req.addParameter("password", state.password); req.addParameter("password", state.password);
req.addParameter("redirecturl", props.redirectUrl); req.addParameter("redirecturl", props.redirectUrl);
req.onData = req.onError = function(d){
req.onData = req.onError = function(d) {
var d = req.responseData; var d = req.responseData;
if(e!=null) el.classList.remove("disabled");
if (e != null)
el.classList.remove("disabled");
var d = haxe.Json.parse(d); var d = haxe.Json.parse(d);
if (Reflect.hasField(d, "error")) setError(d.error.message);
if (Reflect.hasField(d, "success")) js.Browser.window.location.href = props.redirectUrl;
if (Reflect.hasField(d, "error"))
setError(d.error.message);
if (Reflect.hasField(d, "success"))
js.Browser.window.location.href = props.redirectUrl;
} }
req.request(true); req.request(true);
} }
function onKeyPress(e:js.html.KeyboardEvent){
if(e.key=="Enter") submit();
function onKeyPress(e:js.html.KeyboardEvent) {
if (e.key == "Enter")
submit();
} }
}
}

2
lang/master/tpl/base.mtt

@ -11,7 +11,7 @@
::end:: ::end::
</title> </title>
<!-- Cagette CSS -->
<!-- CagettePéi CSS -->
<link rel="stylesheet" type="text/css" href="/css/::getVariable('css')::/style.css"/> <link rel="stylesheet" type="text/css" href="/css/::getVariable('css')::/style.css"/>
<!-- <!--
<link rel="stylesheet" type="text/css" href="/css/::getVariable('css')::/shop.css"/> <link rel="stylesheet" type="text/css" href="/css/::getVariable('css')::/shop.css"/>

4
lang/master/tpl/design.mtt

@ -14,7 +14,7 @@
<h1>::groupName::</h1> <h1>::groupName::</h1>
::else:: ::else::
<div style="margin-bottom:22px;" > <div style="margin-bottom:22px;" >
<a href="https://git.artcode.re/cagetters/cagette" target="_blank">
<a href="https://git.artcode.re/cagetters/cagettepei" target="_blank">
<img src="/img/logo3.png" alt="::NAME::" /> <img src="/img/logo3.png" alt="::NAME::" />
</a> </a>
</div> </div>
@ -121,7 +121,7 @@
<!--<div class="row"> <!--<div class="row">
<div class="col-md-12 alert-danger text-center" style="border-radius: 8px;margin:8px 0;padding:8px 0;"> <div class="col-md-12 alert-danger text-center" style="border-radius: 8px;margin:8px 0;padding:8px 0;">
<span class="glyphicon glyphicon-cog"></span> <span class="glyphicon glyphicon-cog"></span>
Attention : Cagette.net sera indisponible le <b>mardi 7 août de 9:00 à 11:00</b>.
Attention : CagettePéi sera indisponible le <b>mardi 7 août de 9:00 à 11:00</b>.
<br/> <br/>
Nous déménageons sur un nouveau serveur pour plus de rapidité et de fiabilité. Nous déménageons sur un nouveau serveur pour plus de rapidité et de fiabilité.
</div> </div>

2
src/App.hx

@ -287,7 +287,7 @@ class App extends sugoi.BaseApp {
var e = new sugoi.mail.Mail(); var e = new sugoi.mail.Mail();
e.setSubject(subject); e.setSubject(subject);
e.setRecipient(to); e.setRecipient(to);
e.setSender(App.config.get("default_email"), "Cagette.net");
e.setSender(App.config.get("default_email"), t._("Cagette.net"));
var html = App.current.processTemplate("mail/message.mtt", {text: html, group: group}); var html = App.current.processTemplate("mail/message.mtt", {text: html, group: group});
e.setHtmlBody(html); e.setHtmlBody(html);
App.sendMail(e); App.sendMail(e);

4
src/controller/Cron.hx

@ -77,7 +77,7 @@ class Cron extends Controller {
} }
var m = new Mail(); var m = new Mail();
m.setSender(App.config.get("default_email"), "Cagette.net");
m.setSender(App.config.get("default_email"), t._("Cagette.net"));
m.addRecipient(App.config.get("webmaster_email")); m.addRecipient(App.config.get("webmaster_email"));
m.setSubject(App.config.NAME + " Errors"); m.setSubject(App.config.NAME + " Errors");
m.setHtmlBody(app.processTemplate("mail/message.mtt", {text: report.toString()})); m.setHtmlBody(app.processTemplate("mail/message.mtt", {text: report.toString()}));
@ -306,7 +306,7 @@ class Cron extends Controller {
try { try {
var m = new Mail(); var m = new Mail();
m.setSender(App.config.get("default_email"), "Cagette.net");
m.setSender(App.config.get("default_email"), t._("Cagette.net"));
if (group.contact != null) if (group.contact != null)
m.setReplyTo(group.contact.email, group.name); m.setReplyTo(group.contact.email, group.name);
m.addRecipient(u.user.email, u.user.getName()); m.addRecipient(u.user.email, u.user.getName());

786
src/controller/Member.hx
File diff suppressed because it is too large
View File

470
src/service/OrderService.hx

@ -1,4 +1,5 @@
package service; package service;
import Common; import Common;
import tink.core.Error; import tink.core.Error;
@ -6,10 +7,8 @@ import tink.core.Error;
* Order Service * Order Service
* @author web-wizard,fbarbut * @author web-wizard,fbarbut
*/ */
class OrderService
{
static function canHaveFloatQt(product:db.Product):Bool{
class OrderService {
static function canHaveFloatQt(product:db.Product):Bool {
return product.hasFloatQt || product.wholesale || product.variablePrice; return product.hasFloatQt || product.wholesale || product.variablePrice;
} }
@ -20,42 +19,45 @@ class OrderService
* @param productId * @param productId
*/ */
public static function make(user:db.User, quantity:Float, product:db.Product, ?distribId:Int, ?paid:Bool, ?user2:db.User, ?invert:Bool):db.UserContract { public static function make(user:db.User, quantity:Float, product:db.Product, ?distribId:Int, ?paid:Bool, ?user2:db.User, ?invert:Bool):db.UserContract {
var t = sugoi.i18n.Locale.texts; var t = sugoi.i18n.Locale.texts;
if(product.contract.type==db.Contract.TYPE_VARORDER && distribId==null) throw "You have to provide a distribId";
if(quantity==null) throw "Quantity is null";
if (product.contract.type == db.Contract.TYPE_VARORDER && distribId == null)
throw "You have to provide a distribId";
if (quantity == null)
throw "Quantity is null";
//quantity
if ( !canHaveFloatQt(product) ){
if( !tools.FloatTool.isInt(quantity) ) {
throw new tink.core.Error(t._("Error : product \"::product::\" quantity should be integer",{product:product.name}));
// quantity
if (!canHaveFloatQt(product)) {
if (!tools.FloatTool.isInt(quantity)) {
throw new tink.core.Error(t._("Error : product \"::product::\" quantity should be integer", {product: product.name}));
} }
} }
//multiweight : make one row per product
if (product.multiWeight && quantity > 1.0){
if (product.multiWeight && quantity != Math.abs(quantity)) throw t._("multi-weighing products should be ordered only with integer quantities");
// multiweight : make one row per product
if (product.multiWeight && quantity > 1.0) {
if (product.multiWeight && quantity != Math.abs(quantity))
throw t._("multi-weighing products should be ordered only with integer quantities");
var o = null; var o = null;
for ( i in 0...Math.round(quantity)){
for (i in 0...Math.round(quantity)) {
o = make(user, 1, product, distribId, paid, user2, invert); o = make(user, 1, product, distribId, paid, user2, invert);
}
}
return o; return o;
} }
//checks
if (quantity <= 0) return null;
//check for previous orders on the same distrib
// checks
if (quantity <= 0)
return null;
// check for previous orders on the same distrib
var prevOrders = new List<db.UserContract>(); var prevOrders = new List<db.UserContract>();
if (distribId == null) { if (distribId == null) {
prevOrders = db.UserContract.manager.search($product==product && $user==user, true);
}else {
prevOrders = db.UserContract.manager.search($product==product && $user==user && $distributionId==distribId, true);
prevOrders = db.UserContract.manager.search($product == product && $user == user, true);
} else {
prevOrders = db.UserContract.manager.search($product == product && $user == user && $distributionId == distribId, true);
} }
//Create order object
// Create order object
var o = new db.UserContract(); var o = new db.UserContract();
o.product = product; o.product = product;
o.quantity = quantity; o.quantity = quantity;
@ -66,214 +68,214 @@ class OrderService
o.user = user; o.user = user;
if (user2 != null) { if (user2 != null) {
o.user2 = user2; o.user2 = user2;
if (invert != null) o.flags.set(InvertSharedOrder);
if (invert != null)
o.flags.set(InvertSharedOrder);
} }
if (paid != null) o.paid = paid;
if (distribId != null) o.distribution = db.Distribution.manager.get(distribId);
//cumulate quantities if there is a similar previous order
if (paid != null)
o.paid = paid;
if (distribId != null)
o.distribution = db.Distribution.manager.get(distribId);
// cumulate quantities if there is a similar previous order
if (prevOrders.length > 0 && !product.multiWeight) { if (prevOrders.length > 0 && !product.multiWeight) {
for (prevOrder in prevOrders) { for (prevOrder in prevOrders) {
//if (!prevOrder.paid) {
o.quantity += prevOrder.quantity;
prevOrder.delete();
//}
// if (!prevOrder.paid) {
o.quantity += prevOrder.quantity;
prevOrder.delete();
// }
} }
} }
//create a basket object
if (distribId != null){
// create a basket object
if (distribId != null) {
var dist = o.distribution; var dist = o.distribution;
var basket = db.Basket.getOrCreate(user, dist.place, dist.date);
o.basket = basket;
var basket = db.Basket.getOrCreate(user, dist.place, dist.date);
o.basket = basket;
} }
o.insert(); o.insert();
//Stocks
// Stocks
if (o.product.stock != null) { if (o.product.stock != null) {
var c = o.product.contract; var c = o.product.contract;
if (c.hasStockManagement()) { if (c.hasStockManagement()) {
//trace("stock for "+quantity+" x "+product.name);
// trace("stock for "+quantity+" x "+product.name);
if (o.product.stock == 0) { if (o.product.stock == 0) {
if (App.current.session != null) { if (App.current.session != null) {
App.current.session.addMessage(t._("There is no more '::productName::' in stock, we removed it from your order", {productName:o.product.name}), true);
App.current.session.addMessage(t._("There is no more '::productName::' in stock, we removed it from your order",
{productName: o.product.name}), true);
} }
o.quantity -= quantity; o.quantity -= quantity;
if ( o.quantity <= 0 ) {
if (o.quantity <= 0) {
o.delete(); o.delete();
return null;
return null;
} }
}else if (o.product.stock - quantity < 0) {
} else if (o.product.stock - quantity < 0) {
var canceled = quantity - o.product.stock; var canceled = quantity - o.product.stock;
o.quantity -= canceled; o.quantity -= canceled;
o.update(); o.update();
if (App.current.session != null) { if (App.current.session != null) {
var msg = t._("We reduced your order of '::productName::' to quantity ::oQuantity:: because there is no available products anymore", {productName:o.product.name, oQuantity:o.quantity});
var msg = t._("We reduced your order of '::productName::' to quantity ::oQuantity:: because there is no available products anymore",
{productName: o.product.name, oQuantity: o.quantity});
App.current.session.addMessage(msg, true); App.current.session.addMessage(msg, true);
} }
o.product.lock(); o.product.lock();
o.product.stock = 0; o.product.stock = 0;
o.product.update(); o.product.update();
App.current.event(StockMove({product:o.product, move:0 - (quantity - canceled) }));
}else {
App.current.event(StockMove({product: o.product, move: 0 - (quantity - canceled)}));
} else {
o.product.lock(); o.product.lock();
o.product.stock -= quantity; o.product.stock -= quantity;
o.product.update();
App.current.event(StockMove({product:o.product, move:0 - quantity}));
o.product.update();
App.current.event(StockMove({product: o.product, move: 0 - quantity}));
} }
}
}
} }
return o; return o;
} }
/** /**
* Edit an existing order (quantity) * Edit an existing order (quantity)
*/ */
public static function edit(order:db.UserContract, newquantity:Float, ?paid:Bool , ?user2:db.User,?invert:Bool) {
public static function edit(order:db.UserContract, newquantity:Float, ?paid:Bool, ?user2:db.User, ?invert:Bool) {
var t = sugoi.i18n.Locale.texts; var t = sugoi.i18n.Locale.texts;
order.lock(); order.lock();
//quantity
if (newquantity == null) newquantity = 0;
if ( !canHaveFloatQt(order.product) ){
if( !tools.FloatTool.isInt(newquantity) ) {
throw new tink.core.Error(t._("Error : product \"::product::\" quantity should be integer",{product:order.product.name}));
// quantity
if (newquantity == null)
newquantity = 0;
if (!canHaveFloatQt(order.product)) {
if (!tools.FloatTool.isInt(newquantity)) {
throw new tink.core.Error(t._("Error : product \"::product::\" quantity should be integer", {product: order.product.name}));
} }
} }
//paid
// paid
if (paid != null) { if (paid != null) {
order.paid = paid; order.paid = paid;
}else {
if (order.quantity < newquantity) order.paid = false;
} else {
if (order.quantity < newquantity)
order.paid = false;
} }
//shared order
if (user2 != null){
order.user2 = user2;
if (invert == true) order.flags.set(InvertSharedOrder);
if (invert == false) order.flags.unset(InvertSharedOrder);
}else{
// shared order
if (user2 != null) {
order.user2 = user2;
if (invert == true)
order.flags.set(InvertSharedOrder);
if (invert == false)
order.flags.unset(InvertSharedOrder);
} else {
order.user2 = null; order.user2 = null;
order.flags.unset(InvertSharedOrder); order.flags.unset(InvertSharedOrder);
} }
//stocks
var e : Event = null;
// stocks
var e:Event = null;
if (order.product.stock != null) { if (order.product.stock != null) {
var c = order.product.contract; var c = order.product.contract;
if (c.hasStockManagement()) { if (c.hasStockManagement()) {
if (newquantity < order.quantity) { if (newquantity < order.quantity) {
//on commande moins que prévu : incrément de stock
// on commande moins que prévu : incrément de stock
order.product.lock(); order.product.lock();
order.product.stock += (order.quantity-newquantity);
e = StockMove({product:order.product, move:0 - (order.quantity-newquantity) });
}else {
//on commande plus que prévu : décrément de stock
order.product.stock += (order.quantity - newquantity);
e = StockMove({product: order.product, move: 0 - (order.quantity - newquantity)});
} else {
// on commande plus que prévu : décrément de stock
var addedquantity = newquantity - order.quantity; var addedquantity = newquantity - order.quantity;
if (order.product.stock - addedquantity < 0) { if (order.product.stock - addedquantity < 0) {
//stock is not enough, reduce order
// stock is not enough, reduce order
newquantity = order.quantity + order.product.stock; newquantity = order.quantity + order.product.stock;
if( App.current.session!=null) App.current.session.addMessage(t._("We reduced your order of '::productName::' to quantity ::oQuantity:: because there is no available products anymore", {productName:order.product.name, oQuantity:newquantity}), true);
e = StockMove({product:order.product, move: 0 - order.product.stock });
if (App.current.session != null)
App.current.session.addMessage(t._("We reduced your order of '::productName::' to quantity ::oQuantity:: because there is no available products anymore",
{
productName: order.product.name,
oQuantity: newquantity
}), true);
e = StockMove({product: order.product, move: 0 - order.product.stock});
order.product.lock(); order.product.lock();
order.product.stock = 0; order.product.stock = 0;
}else{
//stock is big enough
} else {
// stock is big enough
order.product.lock(); order.product.lock();
order.product.stock -= addedquantity; order.product.stock -= addedquantity;
e = StockMove({ product:order.product, move: 0 - addedquantity });
}
}
order.product.update();
}
e = StockMove({product: order.product, move: 0 - addedquantity});
}
}
order.product.update();
}
} }
//update order
// update order
if (newquantity == 0) { if (newquantity == 0) {
order.quantity = 0;
order.quantity = 0;
order.paid = true; order.paid = true;
order.update(); order.update();
}else {
} else {
order.quantity = newquantity; order.quantity = newquantity;
order.update();
}
order.update();
}
App.current.event(e);
App.current.event(e);
return order; return order;
} }
/** /**
* Delete an order * Delete an order
*/ */
public static function delete(order:db.UserContract) { public static function delete(order:db.UserContract) {
var t = sugoi.i18n.Locale.texts; var t = sugoi.i18n.Locale.texts;
if(order==null) throw new Error(t._("This order has already been deleted."));
if (order == null)
throw new Error(t._("This order has already been deleted."));
order.lock(); order.lock();
if (order.quantity == 0) {
if (order.quantity == 0) {
var contract = order.product.contract; var contract = order.product.contract;
var user = order.user; var user = order.user;
//Amap Contract
if ( contract.type == db.Contract.TYPE_CONSTORDERS ) {
// Amap Contract
if (contract.type == db.Contract.TYPE_CONSTORDERS) {
order.delete(); order.delete();
if( contract.amap.hasPayments() ){
if (contract.amap.hasPayments()) {
var orders = contract.getUserOrders(user); var orders = contract.getUserOrders(user);
if( orders.length == 0 ){
if (orders.length == 0) {
var operation = db.Operation.findCOrderTransactionFor(contract, user); var operation = db.Operation.findCOrderTransactionFor(contract, user);
if(operation!=null) operation.delete();
if (operation != null)
operation.delete();
} }
} }
}
else { //Variable orders contract
//Get the basket for this user
} else { // Variable orders contract
// Get the basket for this user
var place = order.distribution.place; var place = order.distribution.place;
var basket = db.Basket.get(user, place, order.distribution.date); var basket = db.Basket.get(user, place, order.distribution.date);
if( contract.amap.hasPayments() ){
if (contract.amap.hasPayments()) {
var orders = basket.getOrders(); var orders = basket.getOrders();
//Check if it is the last order, if yes then delete the related operation
if( orders.length == 1 && orders.first().id==order.id ){
// Check if it is the last order, if yes then delete the related operation
if (orders.length == 1 && orders.first().id == order.id) {
var operation = db.Operation.findVOrderTransactionFor(order.distribution.getKey(), user, place.amap); var operation = db.Operation.findVOrderTransactionFor(order.distribution.getKey(), user, place.amap);
if(operation!=null) operation.delete();
if (operation != null)
operation.delete();
} }
} }
order.delete(); order.delete();
} }
}
else {
} else {
throw new Error(t._("Deletion not possible: quantity is not zero.")); throw new Error(t._("Deletion not possible: quantity is not zero."));
} }
} }
/** /**
@ -285,21 +287,20 @@ class OrderService
var view = App.current.view; var view = App.current.view;
var t = sugoi.i18n.Locale.texts; var t = sugoi.i18n.Locale.texts;
for (o in orders) { for (o in orders) {
var x : UserOrder = cast { };
var x:UserOrder = cast {};
x.id = o.id; x.id = o.id;
x.userId = o.user.id; x.userId = o.user.id;
x.userName = o.user.getCoupleName(); x.userName = o.user.getCoupleName();
x.userEmail = o.user.email; x.userEmail = o.user.email;
//shared order
if (o.user2 != null){
// shared order
if (o.user2 != null) {
x.userId2 = o.user2.id; x.userId2 = o.user2.id;
x.userName2 = o.user2.getCoupleName(); x.userName2 = o.user2.getCoupleName();
x.userEmail2 = o.user2.email; x.userEmail2 = o.user2.email;
} }
//deprecated
// deprecated
x.productId = o.product.id; x.productId = o.product.id;
x.productRef = o.product.ref; x.productRef = o.product.ref;
x.productQt = o.product.qt; x.productQt = o.product.qt;
@ -308,161 +309,160 @@ class OrderService
x.productImage = o.product.getImage(); x.productImage = o.product.getImage();
x.productHasFloatQt = o.product.hasFloatQt; x.productHasFloatQt = o.product.hasFloatQt;
x.productHasVariablePrice = o.product.variablePrice; x.productHasVariablePrice = o.product.variablePrice;
//new way
// new way
x.product = o.product.infos(); x.product = o.product.infos();
x.product.price = o.productPrice;//do not use current price, but price of the order
x.product.price = o.productPrice; // do not use current price, but price of the order
x.quantity = o.quantity; x.quantity = o.quantity;
//smartQt
if (x.quantity == 0.0){
// smartQt
if (x.quantity == 0.0) {
x.smartQt = t._("Canceled"); x.smartQt = t._("Canceled");
}else if(x.productHasFloatQt || x.productHasVariablePrice || o.product.wholesale){
} else if (x.productHasFloatQt || x.productHasVariablePrice || o.product.wholesale) {
x.smartQt = view.smartQt(x.quantity, x.productQt, x.productUnit); x.smartQt = view.smartQt(x.quantity, x.productQt, x.productUnit);
}else{
} else {
x.smartQt = Std.string(x.quantity); x.smartQt = Std.string(x.quantity);
} }
//product name.
if ( x.productHasVariablePrice || x.productQt==null || x.productUnit==null ){
x.productName = o.product.name;
}else{
x.productName = o.product.name + " " + view.formatNum(x.productQt) +" "+ view.unit(x.productUnit,x.productQt>1);
// product name.
if (x.productHasVariablePrice || x.productQt == null || x.productUnit == null) {
x.productName = o.product.name;
} else {
x.productName = o.product.name + " " + view.formatNum(x.productQt) + " " + view.unit(x.productUnit, x.productQt > 1);
} }
x.subTotal = o.quantity * o.productPrice; x.subTotal = o.quantity * o.productPrice;
var c = o.product.contract; var c = o.product.contract;
if ( o.feesRate!=0 ) {
x.fees = x.subTotal * (o.feesRate/100);
if (o.feesRate != 0) {
x.fees = x.subTotal * (o.feesRate / 100);
x.percentageName = c.percentageName; x.percentageName = c.percentageName;
x.percentageValue = o.feesRate; x.percentageValue = o.feesRate;
x.total = x.subTotal + x.fees; x.total = x.subTotal + x.fees;
}else {
} else {
x.total = x.subTotal; x.total = x.subTotal;
} }
//flags
// flags
x.paid = o.paid; x.paid = o.paid;
x.invertSharedOrder = o.flags.has(InvertSharedOrder); x.invertSharedOrder = o.flags.has(InvertSharedOrder);
x.contractId = c.id; x.contractId = c.id;
x.contractName = c.name; x.contractName = c.name;
x.canModify = o.canModify();
x.canModify = o.canModify();
out.push(x); out.push(x);
} }
return sort(out); return sort(out);
} }
/** /**
* Confirms an order : create real orders from tmp orders in session * Confirms an order : create real orders from tmp orders in session
* @param order * @param order
*/ */
public static function confirmSessionOrder(tmpOrder:OrderInSession){
public static function confirmSessionOrder(tmpOrder:OrderInSession) {
var orders = []; var orders = [];
var user = db.User.manager.get(tmpOrder.userId); var user = db.User.manager.get(tmpOrder.userId);
for (o in tmpOrder.products){
for (o in tmpOrder.products) {
o.product = db.Product.manager.get(o.productId); o.product = db.Product.manager.get(o.productId);
orders.push( make(user, o.quantity, o.product, o.distributionId) );
orders.push(make(user, o.quantity, o.product, o.distributionId));
} }
App.current.event(MakeOrder(orders)); App.current.event(MakeOrder(orders));
App.current.session.data.order = null;
App.current.session.data.order = null;
return orders; return orders;
} }
/** /**
* Send an order-by-products report to the coordinator * Send an order-by-products report to the coordinator
*/ */
public static function sendOrdersByProductReport(d:db.Distribution){
public static function sendOrdersByProductReport(d:db.Distribution) {
var t = sugoi.i18n.Locale.texts;
var m = new sugoi.mail.Mail(); var m = new sugoi.mail.Mail();
m.addRecipient(d.contract.contact.email , d.contract.contact.getName());
m.setSender(App.config.get("default_email"),"Cagette.net");
m.addRecipient(d.contract.contact.email, d.contract.contact.getName());
m.setSender(App.config.get("default_email"), t._("Cagette.net"));
m.setSubject('[${d.contract.amap.name}] Distribution du ${App.current.view.dDate(d.date)} (${d.contract.name})'); m.setSubject('[${d.contract.amap.name}] Distribution du ${App.current.view.dDate(d.date)} (${d.contract.name})');
var orders = service.ReportService.getOrdersByProduct(d); var orders = service.ReportService.getOrdersByProduct(d);
var html = App.current.processTemplate("mail/ordersByProduct.mtt", {
contract:d.contract,
distribution:d,
orders:orders,
formatNum:App.current.view.formatNum,
currency:App.current.view.currency,
dDate:App.current.view.dDate,
hHour:App.current.view.hHour,
group:d.contract.amap
} );
m.setHtmlBody(html);
App.sendMail(m);
var html = App.current.processTemplate("mail/ordersByProduct.mtt", {
contract: d.contract,
distribution: d,
orders: orders,
formatNum: App.current.view.formatNum,
currency: App.current.view.currency,
dDate: App.current.view.dDate,
hHour: App.current.view.hHour,
group: d.contract.amap
});
m.setHtmlBody(html);
App.sendMail(m);
} }
/** /**
* Order summary for a member * Order summary for a member
* WARNING : its for one distrib, not for a whole basket ! * WARNING : its for one distrib, not for a whole basket !
*/ */
public static function sendOrderSummaryToMembers(d:db.Distribution){
public static function sendOrderSummaryToMembers(d:db.Distribution) {
var t = sugoi.i18n.Locale.texts;
var title = '[${d.contract.amap.name}] Votre commande pour le ${App.current.view.dDate(d.date)} (${d.contract.name})'; var title = '[${d.contract.amap.name}] Votre commande pour le ${App.current.view.dDate(d.date)} (${d.contract.name})';
for( user in d.getUsers() ){
for (user in d.getUsers()) {
var m = new sugoi.mail.Mail(); var m = new sugoi.mail.Mail();
m.addRecipient(user.email , user.getName(),user.id);
if(user.email2!=null) m.addRecipient(user.email2 , user.getName(),user.id);
m.setSender(App.config.get("default_email"),"Cagette.net");
m.addRecipient(user.email, user.getName(), user.id);
if (user.email2 != null)
m.addRecipient(user.email2, user.getName(), user.id);
m.setSender(App.config.get("default_email"), t._("Cagette.net"));
m.setSubject(title); m.setSubject(title);
var orders = prepare(d.contract.getUserOrders(user,d));
var html = App.current.processTemplate("mail/orderSummaryForMember.mtt", {
contract:d.contract,
distribution:d,
orders:orders,
formatNum:App.current.view.formatNum,
currency:App.current.view.currency,
dDate:App.current.view.dDate,
hHour:App.current.view.hHour,
group:d.contract.amap
} );
var orders = prepare(d.contract.getUserOrders(user, d));
var html = App.current.processTemplate("mail/orderSummaryForMember.mtt", {
contract: d.contract,
distribution: d,
orders: orders,
formatNum: App.current.view.formatNum,
currency: App.current.view.currency,
dDate: App.current.view.dDate,
hHour: App.current.view.hHour,
group: d.contract.amap
});
m.setHtmlBody(html); m.setHtmlBody(html);
App.sendMail(m); App.sendMail(m);
} }
} }
public static function sort(orders:Array<UserOrder>){
//order by lastname (+lastname2 if exists), then contract
public static function sort(orders:Array<UserOrder>) {
// order by lastname (+lastname2 if exists), then contract
orders.sort(function(a, b) { orders.sort(function(a, b) {
if (a.userName + a.userId + a.userName2 + a.userId2 + a.contractId > b.userName + b.userId + b.userName2 + b.userId2 + b.contractId ) {
if (a.userName
+ a.userId
+ a.userName2
+ a.userId2
+ a.contractId > b.userName
+ b.userId
+ b.userName2
+ b.userId2
+ b.contractId) {
return 1; return 1;
} }
if (a.userName + a.userId + a.userName2 + a.userId2 + a.contractId < b.userName + b.userId + b.userName2 + b.userId2 + b.contractId ) {
if (a.userName
+ a.userId
+ a.userName2
+ a.userId2
+ a.contractId < b.userName
+ b.userId
+ b.userName2
+ b.userId2
+ b.contractId) {
return -1; return -1;
} }
return 0; return 0;
}); });
return orders; return orders;
} }
}
}
Loading…
Cancel
Save