| row => Init.rowError ("listUsers", row)
fun listUsers trn =
- C.map (getDb ()) mkUserRow' ($`SELECT trn, id, name, rname, bal, joined, app, shares
+ C.map (getDb ()) mkUserRow' ($`SELECT trn, id, name, rname, bal, joined, app, shares, paypal, checkout
FROM WebUser LEFT OUTER JOIN Charge ON usr = id AND trn = ^(C.intToSql trn)
ORDER BY name`)
val (umap, amount) = walkNvs (nvs, SM.empty, #amount tran)
- val payers = Group.groupMembers paying
- val even = amount / real (length payers)
+ val db = getDb ()
+
+ val shares =
+ case C.oneRow db ($`SELECT SUM(shares)
+ FROM WebUser JOIN Membership ON usr = WebUser.id AND grp = ^(C.intToSql paying)`) of
+ [n] => C.intFromSql n
+ | row => Init.rowError ("Bad addHostingCharges share count result", row)
+
+ val even = amount / real shares
- fun doUser (usr : Init.user, umap) =
+ fun doUser ([uid, uname, shares], umap) =
let
+ val uid = C.intFromSql uid
+ val uname = C.stringFromSql uname
+ val shares = C.intFromSql shares
+
val (charge, umap) =
- case SM.find (umap, #name usr) of
- NONE => (even, umap)
- | SOME extra => (even - extra, #1 (SM.remove (umap, #name usr)))
+ case SM.find (umap, uname) of
+ NONE => (even * real shares, umap)
+ | SOME extra => (even * real shares - extra, #1 (SM.remove (umap, uname)))
in
- addCharge {trn = trn, usr = #id usr, amount = charge};
+ addCharge {trn = trn, usr = uid, amount = charge};
umap
end
- val _ = if SM.numItems (foldl doUser umap payers) = 0 then
+ val _ = if SM.numItems (C.fold db doUser umap
+ ($`SELECT id, name, shares
+ FROM WebUser JOIN Membership ON usr = WebUser.id AND grp = ^(C.intToSql paying)`))
+ = 0 then
applyCharges trn
else
raise Fail "Usage description contains an unknown username"
[share] => C.realFromSql share
| row => Init.rowError ("Bad costBase result", row)
+val monthlyCost = 900.0
+val graceMonths = 1
+
+fun delinquentPledgers () =
+ let
+ val costBase = costBase monthlyCost
+
+ fun makeRow [id, name, shares, amount] = {id = C.intFromSql id, name = C.stringFromSql name,
+ shares = C.intFromSql shares, balance = C.realFromSql amount}
+ | makeRow row = Init.rowError ("Bad delinquentPledgers", row)
+ in
+ C.map (getDb ()) makeRow ($`SELECT WebUserPaying.id, WebUserPaying.name, shares, amount
+ FROM WebUserPaying JOIN Balance ON Balance.id = bal
+ WHERE amount < shares * ^(C.realToSql costBase) * ^(C.intToSql graceMonths)
+ AND shares > 1
+ ORDER BY name`)
+ end
+
+fun resetPledges ids =
+ raise Fail ($`UPDATE WebUser SET shares = 1 WHERE id IN (^(String.concatWith ", " (List.map C.intToSql ids)))`)
+
end