From 61fe0a0678eaedeb68a50fb6dadc13715c3c4305 Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Sat, 29 Aug 2015 18:19:26 +0200 Subject: [PATCH] API: Adds support for trial memberships --- api/api_functions.php | 20 +++++++++++++++++--- api/card.php | 10 +++++++--- api/membership.php | 9 +++++++-- inside/functions.php | 4 ++++ snapporder/lib/functions.php | 17 +++++++++++++---- 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/api/api_functions.php b/api/api_functions.php index 3734ab1..64533be 100644 --- a/api/api_functions.php +++ b/api/api_functions.php @@ -166,15 +166,23 @@ function get_card($card_number) { return NULL; } -function update_card_with_phone_number($card_number, $phone_number) { +function update_card_with_phone_number($card_number, $phone_number, $membership_trial=NULL) { /* Set card active and add phone number, phone number should not exist */ $conn = get_db_connection(DB_FETCHMODE_ORDERED); $card_number = $conn->quoteSmart($card_number); $phone_number = $conn->quoteSmart($phone_number); + /* Membership trial (special case) */ + $in_autumn = intval(date("n")) >= 8 && intval(date("n")) <= 12; + if( $membership_trial && $in_autumn ) { + $membership_trial = $conn->quoteSmart($membership_trial); + $sql = "UPDATE din_card SET owner_phone_number=$phone_number,registered=NOW(),is_active=1,owner_membership_trial=$membership_trial WHERE card_number=$card_number"; + } else { + $sql = "UPDATE din_card SET owner_phone_number=$phone_number,registered=NOW(),is_active=1 WHERE card_number=$card_number"; + } + /* Update our card */ - $sql = "UPDATE din_card SET owner_phone_number=$phone_number,registered=NOW(),is_active=1 WHERE card_number=$card_number"; $res = $conn->query($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } } @@ -260,7 +268,7 @@ function get_active_card_number($cards) { } return NULL; } -function add_or_renew_membership($user_id, $purchased=NULL) { +function add_or_renew_membership($user_id, $purchased=NULL, $membership_trial=false) { assert($user_id !== NULL); $conn = get_db_connection(DB_FETCHMODE_ORDERED); @@ -273,6 +281,12 @@ function add_or_renew_membership($user_id, $purchased=NULL) { /* ...or one year from specified date */ $expires = date_format(date_modify($purchased, "+1 year"), "Y-m-d"); + /* Membership trial (special case, ignored if not in autumn) */ + $in_autumn = intval(date("n")) >= 8 && intval(date("n")) <= 12; + if( $membership_trial && $in_autumn ) { + $expires = date_format(date_create("first day of january next year"), "Y-m-d"); + } + $res = $conn->autoExecute("din_user", array('expires' => $expires), DB_AUTOQUERY_UPDATE, "id=$user_id"); if( DB::isError($res) ) { diff --git a/api/card.php b/api/card.php index c2fa73a..3e90ca8 100644 --- a/api/card.php +++ b/api/card.php @@ -59,7 +59,13 @@ if($_SERVER['REQUEST_METHOD'] === 'POST') { return_json_response(array('error' => 'User with phone number: '.$phone_number.' already exists: '.$user_id.'.'), 400); } - update_card_with_phone_number($card_number, $phone_number); + /* Membership trial */ + $membership_trial = ''; + if( isset($data['membership_trial'])) { + $membership_trial = $data['membership_trial']; + } + + update_card_with_phone_number($card_number, $phone_number, $membership_trial); /* Return fresh card object */ return_json_response(array('user'=> NULL, 'card' => get_card($card_number))); @@ -99,8 +105,6 @@ if($_SERVER['REQUEST_METHOD'] === 'POST') { return_json_response(array('user' => get_user_data($data['user_id']))); } - - return_json_response(array('error' => 'Unknown action, gave up.'), 400); } else { /* Validate params */ diff --git a/api/membership.php b/api/membership.php index abb89b6..f09ad68 100644 --- a/api/membership.php +++ b/api/membership.php @@ -24,7 +24,7 @@ if($data === NULL) { $required_keys = array('apikey', 'user_id'); $valid_keys = $required_keys; -$valid_keys = array_merge($valid_keys, array('purchased', 'source')); +$valid_keys = array_merge($valid_keys, array('purchased', 'source', 'membership_trial')); $valid_sources = array('kassa'); @@ -80,10 +80,15 @@ if( isset($data['purchased']) ) { if( isset($data['source']) && !in_array($data['source'], $valid_sources) ) { return_json_response(array('error' => 'Invalid value in field source: '.$data['source']), 400); } +/* Optional membership trial */ +$membership_trial = false; +if( isset($data['membership_trial'])) { + $membership_trial = true; +} /* Add or renew membership */ try { - add_or_renew_membership($data['user_id'], $purchased); + add_or_renew_membership($data['user_id'], $purchased, $membership_trial); $success_message = "Medlemskap registrert via ".$data['source']."."; if(!$first_user_membership) { diff --git a/inside/functions.php b/inside/functions.php index 92d8e52..be87965 100644 --- a/inside/functions.php +++ b/inside/functions.php @@ -1722,6 +1722,10 @@ function clean_phonenumber($pn) { } // ISO-8601 Y-m-d function clean_date($date) { + if($date instanceof DateTime) { + return $date; // already cleaned, bail + } + // returns a DateTime object return date_create_from_format('Y-m-d', $date); } diff --git a/snapporder/lib/functions.php b/snapporder/lib/functions.php index b33132f..1a9f3a0 100644 --- a/snapporder/lib/functions.php +++ b/snapporder/lib/functions.php @@ -607,7 +607,7 @@ function validate_sms_form($data) { if( $purchased === false ) { throw new ValidationException("Ugyldig kortnummer/kode ".$data['activation_code']." eller kombinasjon med telefonnummer ".$data['phone']."."); } - $data['purchased'] = clean_timestamp($purchased); + $data['purchased'] = clean_date($purchased); $data['source'] = $source; if($logged_in_user_id) { @@ -679,14 +679,23 @@ function get_purchase_date_card($phone, $activation_code) { $phone = $conn->quoteSmart($phone); $activation_code = $conn->quoteSmart($activation_code); - $sql = "SELECT registered FROM din_card WHERE card_number=$activation_code AND owner_phone_number=$phone AND is_active=1"; - $res = $conn->getOne($sql); + $sql = "SELECT registered,owner_membership_trial FROM din_card WHERE card_number=$activation_code AND owner_phone_number=$phone AND is_active=1"; + $res = $conn->getAll($sql, DB_FETCHMODE_ASSOC); if( DB::isError($res) ) { throw new InsideDatabaseException($res->getMessage().". DEBUG: ".$res->getDebugInfo()); } + if(count($res) !== 1) { + return false; + } - return $res !== null ? $res : false; + /* Membership trial (special case) */ + if( $res[0]['owner_membership_trial'] ) { + // Dummy purchased date (1 year before expiry) + return date_format(date_modify(date_create("first day of january next year"), '-1 year'), "Y-m-d"); + } + + return $res[0]['registered']; } function get_purchase_date_tekstmelding($phone, $activation_code) {