X-Git-Url: https://git.hcoop.net/hcoop/portal.git/blobdiff_plain/5c705bcb58ea122dbd2b8163edc3e24c194d2ab1..f2bab7c8c21cd0dde8c63b8450ce628ff654cb80:/money.sml diff --git a/money.sml b/money.sml index d0668a4..55330c2 100644 --- a/money.sml +++ b/money.sml @@ -276,7 +276,7 @@ fun costBase amt = val monthlyCost = 900.0 val graceMonths = 1 -val baseDues = 5.0 +val baseDues = 7.0 fun delinquentPledgers () = let @@ -292,17 +292,15 @@ fun delinquentPledgers () = end fun resetPledges ids = - raise Fail ($`UPDATE WebUser SET shares = 1 WHERE id IN (^(String.concatWith ", " (List.map C.intToSql ids)))`) + ignore (C.dml (getDb ()) ($`UPDATE WebUser SET shares = 1 WHERE id IN (^(String.concatWith ", " (List.map C.intToSql ids)))`)) fun freezeworthyPledgers () = let - val baseDues = 5.0 - - fun makeRow [id, name, amount] = {id = C.intFromSql id, name = C.stringFromSql name, - balance = C.realFromSql amount} + fun makeRow [id, name, amount, j] = {id = C.intFromSql id, name = C.stringFromSql name, + balance = C.realFromSql amount, joinedThisMonth = C.boolFromSql j} | makeRow row = Init.rowError ("Bad freezeworthyPledgers", row) in - C.map (getDb ()) makeRow ($`SELECT WebUserPaying.id, WebUserPaying.name, amount + C.map (getDb ()) makeRow ($`SELECT WebUserPaying.id, WebUserPaying.name, amount, CURRENT_TIMESTAMP - joined < INTERVAL '1 month' FROM WebUserPaying JOIN Balance ON Balance.id = bal WHERE amount >= ^(C.realToSql baseDues) * ^(C.intToSql graceMonths) AND amount < ^(C.realToSql baseDues) * ^(C.intToSql (graceMonths + 1)) @@ -311,13 +309,11 @@ fun freezeworthyPledgers () = fun bootworthyPledgers () = let - val baseDues = 5.0 - - fun makeRow [id, name, amount] = {id = C.intFromSql id, name = C.stringFromSql name, - balance = C.realFromSql amount} + fun makeRow [id, name, amount, j] = {id = C.intFromSql id, name = C.stringFromSql name, + balance = C.realFromSql amount, joinedThisMonth = C.boolFromSql j} | makeRow row = Init.rowError ("Bad bootworthyPledgers", row) in - C.map (getDb ()) makeRow ($`SELECT WebUserPaying.id, WebUserPaying.name, amount + C.map (getDb ()) makeRow ($`SELECT WebUserPaying.id, WebUserPaying.name, amount, CURRENT_TIMESTAMP - joined < INTERVAL '1 month' FROM WebUserPaying JOIN Balance ON Balance.id = bal WHERE amount < ^(C.realToSql baseDues) * ^(C.intToSql graceMonths) ORDER BY name`) @@ -362,4 +358,74 @@ fun billDues {descr, base, date} = applyCharges receive end +(* Stripe *) + +type stripePayment = {charge_id : string, webuser_id : int, card_name : string, paid_on : string, gross_cents : int, fee_cents : int, net : real} + +fun mkStripeRow [charge_id, webuser_id, name, paid_on, gross, fee] = + {charge_id = C.stringFromSql charge_id, webuser_id = C.intFromSql webuser_id, + card_name = C.stringFromSql name, paid_on = C.stringFromSql paid_on, + gross_cents = C.intFromSql gross, fee_cents = C.intFromSql fee, net = real (C.intFromSql gross - C.intFromSql fee) / 100.0 } + | mkStripeRow row = Init.rowError ("stripe_payment", row) + +fun listUserPendingStripePayments uid = + C.map (getDb ()) mkStripeRow ($`SELECT charge_id, webuser_id, card_name, paid_on, gross, fee FROM stripe_payment + WHERE webuser_id = ^(C.intToSql uid) + AND charge_id NOT IN (SELECT stripe_charge_id FROM stripe_handled) + ORDER BY paid_on DESC`) + +fun listAllPendingStripePayments _ = + C.map (getDb ()) mkStripeRow ($`SELECT charge_id, webuser_id, card_name, paid_on, gross, fee FROM stripe_payment + WHERE charge_id NOT IN (SELECT stripe_charge_id FROM stripe_handled) + ORDER BY paid_on DESC`) + +fun lookupStripePayment id = + let + val c = getDb () + in + (case C.oneOrNoRows c ($`SELECT charge_id, webuser_id, card_name, paid_on, gross, fee FROM stripe_payment WHERE charge_id = ^(C.stringToSql id)`) of + NONE => raise Fail "Stripe Payment Not Found" + | SOME r => mkStripeRow r) + end + +(* Not Used *) +val stripeNotify : stripePayment -> bool = +fn pmt => + let + val user = Init.lookupUser (#webuser_id pmt) + val mail = Mail.mopen () + in + Mail.mwrite (mail, "From: Hcoop Support System \nTo: payment"); + Mail.mwrite (mail, emailSuffix); + Mail.mwrite (mail, "\n"); + Mail.mwrite (mail, "Subject: Stripe Payment Received"); + Mail.mwrite (mail, "\n\n"); + + Mail.mwrite (mail, "A member has paid us via Stripe. Visit the money page to process the payment."); + Mail.mwrite (mail, "Member: "); + Mail.mwrite (mail, #name user); + Mail.mwrite (mail, "\n"); + Mail.mwrite (mail, "Amount (after fees): "); + Mail.mwrite (mail, Real.toString (#net pmt)); + Mail.mwrite (mail, "\n\n"); + + OS.Process.isSuccess (Mail.mclose mail) + end + +val applyStripePayment : stripePayment -> int = + fn pmt => + let + val _ = Group.requireGroupName "money"; + val amount = #net pmt; + val txid = addTransaction ("Stripe", amount, #paid_on pmt) + in + addCharge {trn = txid, usr = #webuser_id pmt, amount = amount}; + applyCharges txid; + C.dml (getDb ()) ($`INSERT INTO stripe_processed (stripe_charge_id, transaction_id) + VALUES (^(C.stringToSql (#charge_id pmt)), ^(C.intToSql txid))`); + txid + end end +