else
Real.fmt (StringCvt.FIX (SOME 2)) n
+val basePerMonth = 5.0
+
fun main _ =
let
val db = C.conn dbstring
val shares = C.intFromSql shares
val amount = C.realFromSql amount
- val minimum = 900.0 * real shares / real totalShares * 2.0
+ val perMonth = basePerMonth * real shares
+ val deposit = perMonth * 3.0
+ val headsUp = deposit + perMonth * 2.0
in
- if amount >= minimum then
+ if amount >= headsUp then
()
else
let
val m = Mail.mopen ()
fun write msg = Mail.mwrite (m, msg)
-
- val minBal = 900.0 * real shares / real totalShares * 2.0
in
- if amount < 0.0 then
+ if amount < deposit then
write "Subject: Your NEGATIVE HCoop balance\n"
else
write "Subject: Your low HCoop balance\n";
write "\nCc: payment@hcoop.net";
write "\n\n";
- if amount < 0.0 then
+ if amount < deposit then
(write "Your HCoop balance is negative. This means that you've paid less than you've\n";
- write "been charged to date. Our bylaws allow our board of directors to vote you out\n";
- write "of the co-op, without any obligation to contact you first, when your balance\n";
- write "stays negative for three months. Please make a payment as soon as possible, so\n";
- write "that we don't need to do this!\n\n")
+ write "been charged to date, excluding your required deposit. If your account hasn't\n";
+ write "been frozen yet, expect that to happen very soon. Our bylaws allow our board\n";
+ write "of directors to vote you out of the co-op, without any obligation to contact\n";
+ write "you first, when your balance stays negative for three months. Please make a\n";
+ write "payment as soon as possible, so that we don't need to do this!\n\n")
else
- (write "Your HCoop balance has dropped below your requested minimum, based on your\n";
- write "sliding scale pledge amount. Please make a payment as soon as you can.\n\n");
+ (write "With our current dues projections, you have less than two months left until\n";
+ write "your HCoop balance becomes negative, based on your sliding scale pledge amount.\n";
+ write "Please make a payment as soon as you can. We will freeze your account if your\n";
+ write "balance does become negative, and the board of directors will probably vote you\n";
+ write "out of the cooperative shortly thereafter if you don't make a payment.\n\n");
write "Your balance: US$";
- write (printReal amount);
+ write (printReal (amount - deposit));
write "\nTotal number of members linked to your balance: ";
write (Int.toString members);
write "\nTotal pledge amount: ";
write (Int.toString shares);
- write "\nRequested minimum balance: US$";
- write (printReal minBal);
- write "\nPayment to get there: US$";
- write (printReal (minBal - amount));
+ write "\nDeposit: US$";
+ write (printReal deposit);
+ write "\nMinimum amount to pay to not see this message again for two months: US$";
+ write (printReal (headsUp - amount));
- write "\n\nYour minimum was calculated by dividing our total monthly expenses ($900) by the\n";
- write "sum of all members' pledge amounts, multiplying by your pledge amount, and then\n";
- write "multiplying by 2. That is, the amount covers your share of two months' expenses.\n\n";
+ write "\n\nThe deposit requirement was calculated as three months of dues at $5/mo..\n\n";
write "To make a payment, visit:\n";
write " https://members.hcoop.net/\n";
write "\nIf for whatever reason you don't plan to pay the amount suggested in this e-mail,\n";
write "_please_ don't stay silent. Reply to this message explaining your circumstances.\n";
- write "We are doing limited-time monetary grants on request, due to the extra costs\n";
- write "associated with setting up our new servers.\n";
ignore (Mail.mclose m)
end
end
| doOne _ = raise Fail "Bad SQL row"
in
- C.app db doOne "SELECT Balance.name, COUNT(*), SUM(WebUserPaying.shares) AS shrs, Balance.amount FROM WebUserPaying JOIN Balance ON WebUserPaying.bal = Balance.id GROUP BY Balance.name, Balance.amount HAVING amount < 10";
+ C.app db doOne ("SELECT Balance.name, COUNT(*), SUM(WebUserPaying.shares) AS shrs, Balance.amount FROM WebUserPaying JOIN Balance ON WebUserPaying.bal = Balance.id GROUP BY Balance.name, Balance.amount HAVING amount < " ^ C.realToSql (basePerMonth * 5.0) ^ " * SUM(WebUserPaying.shares)");
C.close db;
OS.Process.success
end handle C.Sql s => (print ("SQL failure: " ^ s ^ "\n");