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.
 
 
 
 
 
 

182 lines
4.0 KiB

package service;
import Common;
/**
* Payment Service
* @author web-wizard
*/
class PaymentService
{
/**
* Get all available payment types, including one from plugins
*/
public static function getAllPaymentTypes(){
var types = [
new payment.Cash(),
new payment.Check(),
new payment.Transfer(),
new payment.MoneyPot(),
];
var e = App.current.event(GetPaymentTypes({types:types}));
return switch(e){
case GetPaymentTypes(d): d.types;
default : null;
}
}
public static function getAllowedPaymentTypes(group:db.Amap):Array<payment.Payment>{
var out :Array<payment.Payment> = [];
//populate with activated payment types.
var all = getAllPaymentTypes();
if ( group.allowedPaymentsType == null ) return [];
for ( t in group.allowedPaymentsType){
var found = Lambda.find(all, function(a) return a.type == t);
if (found != null) out.push(found);
}
return out;
}
public static function getPaymentTypesForManualEntry(group:db.Amap){
var out = [];
var paymentTypes = [];
var allowedPaymentTypes = service.PaymentService.getAllowedPaymentTypes(group);
if ( !Lambda.exists(allowedPaymentTypes, function(obj) return obj.type == "moneypot" ) ) {
paymentTypes = allowedPaymentTypes;
}
else {
paymentTypes = service.PaymentService.getAllPaymentTypes();
}
for ( t in paymentTypes ){
if(t.type != "moneypot") out.push({label:t.name,value:t.type});
}
return out;
}
/**
* Auto validate a distribution.
* This is called by the hourly cron
*
* @param distrib
*/
public static function validateDistribution(distrib:db.Distribution) {
for ( user in distrib.getUsers()){
var basket = db.Basket.get(user, distrib.place, distrib.date);
validateBasket(basket);
}
//finally validate distrib
distrib.lock();
distrib.validated = true;
distrib.update();
}
public static function unvalidateDistribution(distrib:db.Distribution) {
for ( user in distrib.getUsers()){
var basket = db.Basket.get(user, distrib.place, distrib.date);
unvalidateBasket(basket);
}
//finally validate distrib
distrib.lock();
distrib.validated = false;
distrib.update();
}
/**
* Auto validate a basket
*
* @param basket
*/
public static function validateBasket(basket:db.Basket) {
if (basket == null || basket.isValidated()) return false;
//mark orders as paid
var orders = basket.getOrders();
for ( order in orders ){
order.lock();
order.paid = true;
order.update();
}
//validate order operation and payments
var operation = basket.getOrderOperation(false);
if (operation != null){
operation.lock();
operation.pending = false;
operation.update();
for ( payment in basket.getPayments()){
if ( payment.pending){
payment.lock();
payment.pending = false;
payment.update();
}
}
var o = orders.first();
updateUserBalance(o.user, o.distribution.place.amap);
}
return true;
}
public static function unvalidateBasket(basket:db.Basket) {
if (basket == null || !basket.isValidated()) return false;
//mark orders as paid
var orders = basket.getOrders();
for ( order in orders ){
order.lock();
order.paid = false;
order.update();
}
//validate order operation and payments
var operation = basket.getOrderOperation(false);
if (operation != null){
operation.lock();
operation.pending = true;
operation.update();
for ( payment in basket.getPayments()){
if (!payment.pending){
payment.lock();
payment.pending = true;
payment.update();
}
}
var o = orders.first();
updateUserBalance(o.user, o.distribution.place.amap);
}
return true;
}
/**
* update user balance
*/
public static function updateUserBalance(user:db.User,group:db.Amap){
var ua = db.UserAmap.getOrCreate(user, group);
var b = sys.db.Manager.cnx.request('SELECT SUM(amount) FROM Operation WHERE userId=${user.id} and groupId=${group.id} and !(type=2 and pending=1)').getFloatResult(0);
b = Math.round(b * 100) / 100;
ua.balance = b;
ua.update();
}
}