From 3eaa9f0ed9b63c0b8bda506c6ceb2930c28afd10 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Mon, 11 Mar 2019 14:56:29 -0600 Subject: [PATCH] Add camp coupons, add submission code --- database.mwb | Bin 13332 -> 13333 bytes public/actions/submit.php | 385 ++++++++++++++----------------- public/parts/signup.php | 51 ++-- public/parts/template_person.php | 10 +- public/static/signup.js | 88 +++---- 5 files changed, 260 insertions(+), 274 deletions(-) diff --git a/database.mwb b/database.mwb index 5cc3a117838f8e4b58a8dc303a946c2c3c40f31a..7b28f0c296c17275cb8b13eb0d6676964c059091 100644 GIT binary patch delta 7093 zcmV;m8%pGqXq9LeP)h>@6aWAK2mlnRX-*8(K*5|U003;U7e5aIWI&Tx4_$u+?OD)n6mN%0AGm8r%dYe_K;5MtTX-48f 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 delta 7092 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 diff --git a/public/actions/submit.php b/public/actions/submit.php index bfebe35..7ca75b6 100644 --- a/public/actions/submit.php +++ b/public/actions/submit.php @@ -10,258 +10,215 @@ require_once __DIR__ . "/../../lib/requiredpublic.php"; require_once __DIR__ . "/../../lib/Email.lib.php"; -var_export($_POST); -die(); - function errorBack(string $errormsg) { + global $familyid; header("Location: ../?page=signup&error=" . htmlentities($errormsg)); + $database->delete("families", ["familyid" => $familyid]); die($errormsg); } -if (!empty($_SESSION['familyid']) && $database->has("families", ['familyid' => $_SESSION['familyid']])) { - $family = $_SESSION['familyid']; - $renewal = true; -} else if (!empty($_POST['renewing'])) { - // Session expired, but we're renewing, so kick them back to verification - header("Location: ../?page=renew&msg=sessionexpired"); - die("You took too long and were automatically logged out. Please try again."); -} - $database->action(function($database) { - global $family, $renewal, $SETTINGS; - - try { - $lastname = $_POST['familyname']; - $father = $_POST['fathername']; - $mother = $_POST['mothername']; + global $SETTINGS; - if (empty($lastname)) { - errorBack("Enter a last name."); - } - if (empty($father)) { - errorBack("Enter a father name."); - } - if (empty($mother)) { - errorBack("Enter a mother name."); - } + $database->insert("families", []); + $familyid = $database->id(); - $family->setName($lastname); - $family->setFather($father); - $family->setMother($mother); + $dueusd = 0.0; - $family->setPhone($_POST['phone']); - $family->setEmail($_POST['email']); + try { - if ($renewal) { - if ($database->has("families", ["AND" => ["email" => $family->getEmail(), "familyid[!]" => $family->getID()]])) { - errorBack("That email address is already in use with another family."); - } - } else { - if ($database->has("families", ["email" => $family->getEmail()])) { - errorBack("That email address is already in use with another family."); + $people = $_POST['people']; + + $requiredfields = [ + "firstname" => ".+", + "lastname" => ".+", + "address" => ".+", + "zip" => "[0-9]{5}(-?[0-9]{4})?", + "phone1" => "[0-9]{10}", + "email" => "_EMAIL_", + "shirt" => ["YS", "YM", "YL", "AS", "AM", "AL", "AX", "A2"], + "sex" => ["M", "F"] + ]; + + foreach ($people['ids'] as $pid) { + switch ($people["type"][$pid]) { + case "camper": + $checkfields = array_merge($requiredfields, [ + "parentname" => ".+", + "unit" => "[0-9]{3,4}", + "rank" => ["Tiger", "Wolf", "Bear", "Webelos", "Arrow of Light"] + ]); + break; + case "adult": + $checkfields = array_merge($requiredfields, [ + "position" => [ + "None", + "Den Walker", + "Station Leader", + "Tot Lot", + "First Aid", + "Floater" + ] + ]); + break; + case "youth": + $checkfields = array_merge($requiredfields, [ + "position" => [ + "None", + "Den Chief", + "Station", + "Tot Lot", + "Floater" + ] + ]); + break; + default: + errorBack("Invalid person type."); } - } - - $address = $_POST['streetaddress']; - $city = $_POST['city']; - $state = strtoupper($_POST['state']); - $zip = $_POST['zip']; - if (empty($address)) { - errorBack("Enter a street address."); - } - if (empty($city)) { - errorBack("Enter a city."); - } - $family->setAddress($address); - $family->setCity($city); - $family->setState($state); - $family->setZip($zip); - - - $newsletter = $_POST['newsletter_method']; - $membership_cost = 2500; - if (empty($newsletter)) { - errorBack("Select a newsletter preference."); - } - $family->setNewsletter($newsletter); - switch ($newsletter) { - case 1: // Email only - $membership_cost = 2500; - break; - case 2: // Print only - $membership_cost = 3500; - break; - case 3: // Email and print - $membership_cost = 3500; - break; - default: - errorBack("Select a valid newsletter preference."); - } - - $photopermission = $_POST['photo_permission']; - if (!empty($photopermission) && $photopermission == "1") { - $photopermission = true; - } else { - $photopermission = false; - } - $family->setPhotoPermission($photopermission); + foreach ($checkfields as $name => $regex) { + $validatefunction = function ($str) use ($regex) { + return preg_match("/$regex/", $str); + }; + + if (is_array($regex)) { + // Array of options + $validatefunction = function ($str) use ($regex) { + return in_array($str, $regex); + }; + } else if (strpos($regex, "_") === 0) { + // Special cases + switch ($regex) { + case "_EMAIL_": + $validatefunction = function ($str) { + return filter_var($str, FILTER_VALIDATE_EMAIL); + }; + break; + } + } - if ($renewal) { - // If membership lapsed, add a whole year, otherwise just extend it - if ($family->getExpires() < time()) { - $family->setExpires(strtotime("+1 year")); - } else { - $family->setExpires(strtotime("+1 year", $family->getExpires())); + // Validate + if (!$validatefunction($people[$name][$pid])) { + errorBack("Please check your input and try again ($name)."); + } } - } else { - $family->setExpires(strtotime("+1 year")); - } - - $family->save(); - - // - // Children - // - $children = $_POST['child']; - $childObjects = $family->getChildren(); - foreach ($children['ids'] as $cid) { - if (empty($children['name'][$cid])) { - continue; - } - - if (!preg_match("/^([1-9]|1[012])$/", $children['month'][$cid])) { - errorBack("Invalid birth month chosen for " . htmlentities($children['name'][$cid]) . "."); + $days = ""; + if (is_array($people["days"][$pid])) { + $validdays = ["Tu", "We", "Th", "Fr"]; + $days = ""; + foreach ($people["days"][$pid] as $day) { + if (in_array($day, $validdays)) { + $days .= $day; + } + } } - if (!is_numeric($children['year'][$cid])) { - errorBack("Invalid birth year chosen for " . htmlentities($children['name'][$cid]) . "."); - } - $children['year'][$cid] = $children['year'][$cid] * 1; - if ($children['year'][$cid] < 1980 || $children['year'][$cid] > date("Y")) { - errorBack("Invalid birth year chosen for " . htmlentities($children['name'][$cid]) . "."); + switch ($people["type"][$pid]) { + case "camper": + $dueusd += 50.0; + echo "\nAdding $50 to the total for a camper, dueusd is $dueusd\n"; + $database->insert("campers", [ + "parentname" => $people["parentname"][$pid], + "rank" => $people["rank"][$pid] + ]); + $camperid = $database->id(); + break; + case "adult": + $discount = 10.0 * (strlen($days) / 2); + $dueusd -= $discount; + echo "\Subtracting $$discount from the total for an adult volunteer, dueusd is $dueusd\n"; + $database->insert("adults", [ + "position" => $people["position"][$pid], + "days" => $days + ]); + $adultid = $database->id(); + break; + case "youth": + $database->insert("youth", [ + "position" => $people["position"][$pid], + "days" => $days + ]); + $youthid = $database->id(); + break; } - if (Child::exists($cid, $family->getID())) { - // iterate over existing children to find the correct one - for ($i = 0; $i < count($childObjects); $i++) { - if ($childObjects[$i]->getID() == $cid) { - $childObjects[$i]->setName($children['name'][$cid]); - $childObjects[$i]->setBirthday(null, $children['year'][$cid] . "-" . $children['month'][$cid] . "-00"); - $childObjects[$i]->setGraduated(empty($children['graduate'][$cid]) ? false : true); - } - } - } else { - $child = new Child(); - $child->setName($children['name'][$cid]); - $child->setBirthday(null, $children['year'][$cid] . "-" . $children['month'][$cid] . "-00"); - $child->setGraduated(empty($children['graduate'][$cid]) ? false : true); - $child->setFamilyID($family->getID()); - $childObjects[] = $child; - } - } - foreach ($childObjects as $child) { - $child->save(); + $database->insert("people", [ + "familyid" => $familyid, + "camperid" => $camperid, + "adultid" => $adultid, + "youthid" => $youthid, + "firstname" => $people["firstname"][$pid], + "lastname" => $people["lastname"][$pid], + "address" => $people["address"][$pid], + "zip" => $people["zip"][$pid], + "phone1" => empty($people["phone1"][$pid] ? "" : $people["phone1"][$pid]), + "phone2" => empty($people["phone2"][$pid] ? "" : $people["phone2"][$pid]), + "email" => empty($people["email"][$pid] ? "" : $people["email"][$pid]), + "unit" => $people["unit"][$pid], + "shirt" => $people["shirt"][$pid], + "sex" => $people["sex"][$pid] + ]); } } catch (Exception $ex) { errorBack($ex->getMessage()); } - // - // Interests - // - $database->delete('interests', ['familyid' => $family->getID()]); - if (!empty($_POST['events']) && is_array($_POST['events'])) { - $interests = []; - foreach ($_POST['events'] as $evt) { - if ($database->has("events", ['eventid' => $evt])) { - $interests[] = ["familyid" => $family->getID(), "eventid" => $evt]; - } - } - $database->insert("interests", $interests); - } - - // // Payment // - try { - \Stripe\Stripe::setApiKey($SETTINGS["stripe"]["seckey"]); - $charge = \Stripe\Charge::create([ - 'amount' => $membership_cost, - 'currency' => 'usd', - 'description' => 'HACHE Membership', - 'source' => $_POST['stripeToken'], - 'statement_descriptor' => 'HACHE Membership 1yr', - ]); - } catch (\Stripe\Error\Card $e) { - $body = $e->getJsonBody(); - $err = $body['error']; - errorBack("We couldn't process your card because it was declined. Your card issuer or bank sent us this message: " . $err["message"] . " That's all we know."); - } catch (\Stripe\Error\RateLimit $e) { - errorBack("We couldn't process your card because things are happening too fast. Please try again in a minute. (Error code: STRIPE_RATELIMIT)"); - } catch (\Stripe\Error\InvalidRequest $e) { - errorBack("We couldn't process your card because of a technical issue. Please try again later. (Error code: STRIPE_INVREQ)"); - } catch (\Stripe\Error\Authentication $e) { - errorBack("We can't connect to the card processor. Please try again later. (Error code: STRIPE_AUTH)"); - } catch (\Stripe\Error\ApiConnection $e) { - errorBack("We can't connect to the card processor. Please try again later. (Error code: STRIPE_NOAPI)"); - } catch (\Stripe\Error\Base $e) { - errorBack("An unknown payment error occurred. Please try again later."); - } catch (Exception $e) { - errorBack("An unknown error occurred. Please try again later."); - } + $campcoupons = (!empty($_POST['campcoupons']) && preg_match("/[0-9]+/", $_POST['campcoupons'])) ? $_POST['campcoupons'] * 1 : 0; - $database->insert("payments", [ - "familyid" => $family->getID(), - "amount" => ($membership_cost / 100.0), - "paid" => 1, - "date" => date("Y-m-d H:i:s"), - "type" => "Online" - ]); + $duecard = $dueusd - $campcoupons; - try { - $confirmation = new Email(); - $confirmation->addTo($family->getEmail()); - $confirmation->setFrom($SETTINGS["smtp"]["fromaddress"], $SETTINGS["smtp"]["fromname"]); - $confirmation->setSMTP($SETTINGS["smtp"]["host"], $SETTINGS["smtp"]["port"], $SETTINGS["smtp"]["auth"], $SETTINGS["smtp"]["user"], $SETTINGS["smtp"]["password"], $SETTINGS["smtp"]["secure"]); - if ($renewal) { - $confirmation->setSubject("HACHE renewal confirmation"); - $confirmation->setBody("Your membership renewal has been processed.\r\n" - . "Your membership will expire on" . date("F j Y", $family->getExpires()) . ".\r\n" - . "Thanks for being a HACHE member!"); - } else { - $confirmation->setSubject("HACHE membership confirmation"); - $confirmation->setBody("Your membership and payment have been recorded.\r\n" - . "A HACHE member will be in touch in the next few days.\r\n" - . "Thanks again and welcome to HACHE!"); - } - $confirmation->send(); - } catch (Exception $e) { + echo "\nCost $dueusd total: $duecard to Stripe, $campcoupons as coupons\n"; + if ($_POST['totalcharge'] != $dueusd) { + errorBack("There was a discrepency between the total you saw and the total the server calculated. The transaction has been cancelled and you were not charged."); } - try { - $notification = new Email(); - $notification->addTo($SETTINGS["smtp"]["notification_to"]); - $notification->setFrom($SETTINGS["smtp"]["fromaddress"], $SETTINGS["smtp"]["fromname"]); - $notification->setSMTP($SETTINGS["smtp"]["host"], $SETTINGS["smtp"]["port"], $SETTINGS["smtp"]["auth"], $SETTINGS["smtp"]["user"], $SETTINGS["smtp"]["password"], $SETTINGS["smtp"]["secure"]); - if ($renewal) { - $notification->setSubject("HACHE renewal notification"); - $notification->setBody("The " . $family->getName() . " family has renewed their HACHE membership."); - } else { - $notification->setSubject("HACHE membership notification"); - $notification->setBody("The " . $family->getName() . " family has registered for a HACHE membership."); + if ($duecard > 0) { + try { + \Stripe\Stripe::setApiKey($SETTINGS["stripe"]["seckey"]); + + $charge = \Stripe\Charge::create([ + 'amount' => $duecard * 100.0, + 'currency' => 'usd', + 'description' => 'Day Camp', + 'source' => $_POST['stripeToken'], + 'statement_descriptor' => 'PPD Day Camp', + ]); + } catch (\Stripe\Error\Card $e) { + $body = $e->getJsonBody(); + $err = $body['error']; + errorBack("We couldn't process your card because it was declined. Your card issuer or bank sent us this message: " . $err["message"] . " That's all we know."); + } catch (\Stripe\Error\RateLimit $e) { + errorBack("We couldn't process your card because things are happening too fast. Please try again in a minute. (Error code: STRIPE_RATELIMIT)"); + } catch (\Stripe\Error\InvalidRequest $e) { + errorBack("We couldn't process your card because of a technical issue. Please try again later. (Error code: STRIPE_INVREQ)"); + } catch (\Stripe\Error\Authentication $e) { + errorBack("We can't connect to the card processor. Please try again later. (Error code: STRIPE_AUTH)"); + } catch (\Stripe\Error\ApiConnection $e) { + errorBack("We can't connect to the card processor. Please try again later. (Error code: STRIPE_NOAPI)"); + } catch (\Stripe\Error\Base $e) { + errorBack("An unknown payment error occurred. Please try again later."); + } catch (Exception $e) { + errorBack("An unknown error occurred. Please try again later."); } - $notification->send(); - } catch (Exception $e) { - } + $database->insert("payments", [ + "familyid" => $familyid, + "amount" => ($dueusd), + "amountpaid" => ($duecard), + "date" => date("Y-m-d H:i:s"), + "type" => "Online" + ]); + header("Location: ../?page=thanks"); + var_dump($_POST); return true; }); diff --git a/public/parts/signup.php b/public/parts/signup.php index 477b2ba..98122d8 100644 --- a/public/parts/signup.php +++ b/public/parts/signup.php @@ -133,29 +133,48 @@ if (isset($_SESSION['familyid']) && $database->has('families', ['familyid' => $_

Total: $0

- - -