2, 'portability' => DB_PORTABILITY_ALL, ); } $conn = DB::connect(getDSN(), $options); if(DB :: isError($conn)) { echo $conn->toString(); } else { if($fetch_mode != NULL) { $conn->setFetchMode($fetch_mode); } } /* Set character set */ $conn->query('SET NAMES utf8'); return $conn; } if( !function_exists('clean_phonenumber') ) { function clean_phonenumber($pn) { $pn = preg_replace('/[^0-9\+]/', '', $pn); // remove everything except valid chars $pn = preg_replace('/^00/', '+', $pn); // replace starting 00 with + // norwegian phone numbers if (strlen($pn) === 8 && ($pn[0] === "4" || $pn[0] === "9")) { $pn = "+47" . $pn; } // ...without + if (strlen($pn) === 10 && $pn[0] === "4" && $pn[1] === "7" && ($pn[2] === "4" || $pn[2] === "9")) { $pn = "+" . $pn; } return $pn; } } if( !function_exists('valid_phonenumber') ) { // E.164 function valid_phonenumber($phone) { return preg_match('/^\+?\d{8,15}$/i', $phone); } } function _get_cards($value) { if($value === "") { return array(); } $u_cs = array(); $u_cards = explode(",", $value); foreach ($u_cards as $c) { list($card_number, $card_is_active) = explode(";", $c); $u_cs[] = array( 'card_number' => $card_number, 'is_active' => $card_is_active ); } return $u_cs; } function get_user_data($ids) { if( !is_string($ids) ) { new Exception('Param ids should be a comma separated string of user ids'); } $ACTIVE_GROUP_ID = "2"; $conn = get_db_connection(DB_FETCHMODE_ASSOC); /* Get data */ $sql_is_member = "u.expires > NOW() OR u.expires IS NULL AS is_member"; $sql_groups = "GROUP_CONCAT(DISTINCT g.id,';',g.name SEPARATOR ',') AS groups"; $sql_cards = "GROUP_CONCAT(DISTINCT c.card_number,';',c.is_active SEPARATOR ',') AS cards"; $data_sql = "SELECT u.id,u.username,u.firstname,u.lastname,u.email,up.number,u.expires,$sql_cards,$sql_groups,$sql_is_member FROM din_user AS u LEFT JOIN din_userphonenumber AS up ON up.user_id=u.id LEFT JOIN din_card AS c ON c.user_id=u.id LEFT JOIN din_usergrouprelationship AS ug ON u.id=ug.user_id LEFT JOIN din_group AS g ON g.id=ug.group_id WHERE u.id IN ($ids) GROUP BY u.id ORDER BY u.firstname, u.lastname ASC"; $res = $conn->getAll($data_sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } $results = array(); /* Encode and output */ foreach($res as $result) { $is_active = "0"; foreach($result as $key => $value) { if($key == "groups") { if($value === "") { continue; // no groups } $u_gs = array(); $u_groups = explode(",",$value); foreach($u_groups as $g) { list($id,$name) = explode(";", $g); if($id == $ACTIVE_GROUP_ID) { $is_active = "1"; } $u_gs[] = array( 'id' => $id, 'name' => $name ); } $result[$key] = $u_gs; } elseif($key == "cards") { $result[$key] = _get_cards($value); } } $result['is_active'] = $is_active; $results[] = $result; } return $results; } function get_card($card_number) { $conn = get_db_connection(DB_FETCHMODE_ASSOC); $card_number = $conn->quoteSmart($card_number); // TODO Check if card has trial membership // TODO What happends when user wants a proper membership?? // TODO Test and enable trial memberships for cards $membership_trial = false; if($membership_trial) { // $expires = date_format(date_create("first day of january next year"), "Y-m-d"); // $expires_sql = "DATE_ADD(DATE(registered), INTERVAL 1 YEAR)"; // $has_valid_membership_sql = " <= $expires_sql AND owner_phone_number IS NOT NULL"; // $sql = "SELECT *,$has_valid_membership_sql AS has_valid_membership,$expires_sql AS expires FROM din_card WHERE card_number=$card_number"; } $expires_sql = "DATE_ADD(DATE(registered), INTERVAL 1 YEAR)"; $has_valid_membership_sql = "NOW() <= $expires_sql AND owner_phone_number IS NOT NULL"; $sql = "SELECT *,$has_valid_membership_sql AS has_valid_membership,$expires_sql AS expires FROM din_card WHERE card_number=$card_number"; $res = $conn->getAll($sql); if( DB::isError($res) ) { return array('error' => $res->getMessage(), 'sql' => $sql); } if( count($res) === 1) { return $res[0]; } return NULL; } 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 */ $res = $conn->query($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } } function update_card($user_id, $card_number) { /* Adds card relationship OR if relationship already exist, set inactive and then add new */ $conn = get_db_connection(DB_FETCHMODE_ORDERED); $card_number = $conn->quoteSmart($card_number); $user_id = $conn->quoteSmart($user_id); /* Set users existing cards inactive, if any */ $sql = "UPDATE din_card SET is_active=0 WHERE user_id=$user_id AND is_active=1"; $res = $conn->query($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } /* Update our card */ $sql = "UPDATE din_card SET user_id=$user_id,registered=NOW(),is_active=1 WHERE card_number=$card_number"; $res = $conn->query($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } } function get_user_id_by_card_number($card_number) { $conn = get_db_connection(DB_FETCHMODE_ORDERED); $card_number = $conn->quoteSmart($card_number); $sql = "SELECT c.user_id FROM din_card AS c LEFT JOIN din_user AS u ON c.user_id=u.id WHERE c.card_number=$card_number"; $res = $conn->getAll($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } if( count($res) === 0 ) { return NULL; } return $res[0][0]; } function get_card_by_phone_number($phone_number) { $conn = get_db_connection(DB_FETCHMODE_ORDERED); $phone_number = $conn->quoteSmart($phone_number); $sql = "SELECT card_number FROM din_card WHERE owner_phone_number=$phone_number"; $res = $conn->getAll($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } if( count($res) === 0 ) { return NULL; } return get_card($res[0][0]); } function get_card_owner_phone_number($card_number) { $conn = get_db_connection(DB_FETCHMODE_ORDERED); $card_number = $conn->quoteSmart($card_number); $sql = "SELECT c.owner_phone_number FROM din_card AS c LEFT JOIN din_user AS u ON c.user_id=u.id WHERE c.card_number=$card_number"; $res = $conn->getAll($sql); if( DB::isError($res) ) { new Exception($res->getMessage()); } if( count($res) === 0 ) { return NULL; } return $res[0][0]; } function get_active_card_number($cards) { foreach($cards as $card) { if($card['is_active'] == "1") { return $card['card_number']; } } return NULL; } function add_or_renew_membership($user_id, $purchased=NULL, $membership_trial=false) { assert($user_id !== NULL); $conn = get_db_connection(DB_FETCHMODE_ORDERED); /* Membership expiry */ /* One year from today (default) */ if( $purchased == NULL || $purchased === false) { $purchased = date_create(); } /* ...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) ) { new InsideDatabaseException($res->getMessage().". DEBUG: ".$res->getDebugInfo()); } } /* The purpose of this email is to - Give a positive confirmation after a membership purchase - Link to our webpage */ function send_membership_confirmation_mail($user, $first_user_membership) { $expires_msg = isset($user['expires']) ? "Det varer helt til ".$user['expires'].". " : ""; if( !isset($user['email']) ) { // No email set, bail. return; } $from_email = "Det Norske Studentersamfund "; $sendto = $user['email']; $subject = "Velkommen tilbake til Det Norske Studentersamfund"; if($first_user_membership) { $subject = "Velkommen til Det Norske Studentersamfund"; } $headers = "From: $from_email\r\n"; $headers .= "Reply-To: $from_email\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; $inside_url = "https://inside.studentersamfundet.no/"; $message = ''; if($first_user_membership) { $message .= '

Gratulerer med ditt nye medlemskap!

'; $message .= '

Du kan lese mer om hvilke fordeler medlemskapet ditt gir på studentersamfundet.no.

'; } else { $message .= '

Medlemskapet ditt er fornyet!

'; } $message .= '

'.$expires_msg.'Trykk på lenken under for å logge inn og se medlemskapet ditt.

'; $message .= '

Logg inn

'; $message .= "

Med vennlig hilsen
Det Norske Studentersamfund

"; $message .= ""; @mail($sendto, $subject, $message, $headers); }