diff --git a/app/Models/userCardBehaviors.php b/app/Models/userCardBehaviors.php new file mode 100644 index 0000000..7749b2f --- /dev/null +++ b/app/Models/userCardBehaviors.php @@ -0,0 +1,317 @@ +weeklyMemberSpending($member, $out); + if ($out["weekly_total"] == 0) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*User didn't set budget on sign-up*/ +public function behavior_BH0006($member, $out) +{ + $ret = CARD_ADD_DENIED; + $out = $member; + if ($out["max_budget"] == 0) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*Timezone hits a certain time, card displays for 1 hour.*/ +public function behavior_BH0007($in, $out) +{ + $ret = CARD_ADD_DENIED; + return $ret; +} + +/*Users spending exceeds budget, card displayed on Tuesdays & Fridays*/ +public function behavior_BH0008($member, $out) +{ + $ret = CARD_ADD_DENIED; +$this->weeklyMemberSpending($member, $out); + if ($out["over_spending"] > 0 && $out["under_spending"] == 0) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*Users spending falls below budget, card displayed on Tuesdays & Fridays*/ +public function behavior_BH0009($in, $out) +{ + $ret = CARD_ADD_DENIED; +$this->weeklyMemberSpending($member, $out); + if ($out["under_spending"] > 0 && $out["over_spending"] == 0 && $out["user_budget_percentbelow"] > 0) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*Use selects 'allow' to GPS permission*/ +public function behavior_BH0010($in, $out) +{ + $ret = CARD_ADD_DENIED; + $member_id = $in['id']; + if (enableGPS($member_id)) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*CC Synced, Email Synced, Transations coming through, GPS Sycned*/ +public function behavior_BH0011($in, $out) +{ + $ret = CARD_ADD_DENIED; + $member_id = $in['id']; + + $out = $in; // loadMemberDescisionData(member_id, $out); + $member_id = $in['id']; + if (enableGPS($member_id) == false && $out["last_acct"] != "" && $out["last_email"] != "") { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*Users selects 'no' to GPS permission*/ +public function behavior_BH0013($in, $out) +{ + // for version 01, the only way is if I see no GPS entery + $ret = CARD_ADD_DENIED; + $member_id = $in['id']; + if (enableGPS($member_id) == false) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*Back office identifies a 'Uber' receipt*/ +public function behavior_BH0012($in, $out) +{ + $ret = CARD_ADD_DENIED; + $member_id = $in['id']; + return $ret; +} + +/*User Spending Above Average*/ +public function behavior_BH0014($member, $out) +{ + $ret = CARD_ADD_DENIED; +$this->weeklyMemberSpending($member, $out); + if ($out["user_budget_percentabove"] > 0) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*User Spending Below Average*/ +public function behavior_BH0015($member, $out) +{ + $ret = CARD_ADD_DENIED; +$this->weeklyMemberSpending($member, $out); + if ($out["user_budget_percentbelow"] > 0) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +/*Show if The User Country is Known*/ +public function behavior_BH0016($in, $out) +{ + $ret = CARD_ADD_DENIED; + /* $member_id = $in['id']; + detectMemberLocation($member_id, $out); */ + return $ret; +} + +/*Show if The User Country Not Known*/ +public function behavior_BH0017($in, $out) +{ + $ret = CARD_ADD_DENIED; + /* $member_id = $in['id']; + detectMemberLocation($member_id, $out); */ + return $ret; +} + +/*No Budgt Set*/ +public function behavior_BH0018($in, $out) +{ + $ret = CARD_ADD_DENIED; + /* $member_id = $in['id']; + detectMemberLocation($member_id, $out); */ + if ($in["min_budget"] + $in["max_budget"] == 0) { + $ret = CARD_ADD_ALLOWED; + } + return $ret; +} + +public function enableGPS($member_id) +{ + global $pgconn_gps; + $r = pg_query($pgconn_gps, "SELECT count(*) as num FROM members_tracking WHERE member_id=" . $member_id . ""); + if ($r && pg_num_rows($r) && $f = pg_fetch_assoc($r)) { + if ($f['num'] > 0) { + return true; + } + } + return false; +} +public function weeklyMemberSpending($member, &$out) +{ + { + global $pgconn; + $member_id = $member['id']; + $out["over_spending"] = "0"; + $out["under_spending"] = "0"; + $out["weekly_total"] = "0"; + + $total_bank = 0; + $total_email = 0; + $total_weekly_spend = 0; + + // loadMemberDescisionData( member_id, out); + $out["user_budget_percentbelow"] = "0"; + $out["user_budget_percentabove"] = "0"; + + // LOCAL AVERAGE ----------------------------------------------- + $out["user_less_localavergperm"] = "0"; + $out["user_more_localavergperm"] = "0"; // we start with zero + $out["population_average"] = 0; // we start with zero + $out["member_average"] = 0; // we start with zero + + $population = fetchRow("SELECT avg(amount) *0.01 AS population_average FROM members_bankimport WHERE category IN (SELECT category FROM activity_listcategory) AND currency='USD'"); + if ($population) { + $out['population_average'] = $population['population_average']; + } + $member_average = fetchRow("SELECT avg(amount) *0.01 AS member_average FROM members_bankimport WHERE category IN (SELECT category FROM activity_listcategory) AND member_id = " . $member_id . " AND currency='USD'"); + if ($member_average) { + $out['member_average'] = $member_average['member_average']; + } + if ($out['member_average'] > 0 && $out['member_average'] > $out['population_average']) { + $out["user_more_localavergperm"] = $out['member_average'] - $out['population_average']; + } + if ($out['member_average'] > 0 && $out['member_average'] < $out['population_average']) { + $out["user_less_localavergperm"] = $out['population_average'] - $out['member_average']; + } + // END LOCAL AVERAGE ------------------------------------- + + $total_weekly_budget = ($member["min_budget"] + $member["max_budget"]) / 200; + + // bank import total + $bankImport = fetchRow("SELECT * FROM (SELECT round(0.01*sum(amount),2) AS total FROM members_bankimport + WHERE member_id= " . $member_id . " AND LOWER(category) IN (SELECT LOWER(category) FROM activity_listcategory) + AND date_trunc('day', time) > (current_date - 8) + AND date_trunc('day', time) < current_date) AS c WHERE c.total IS NOT NULL"); + + if ($bankimport) { + $total_bank = $bankImport["total"]; + } + + $totalEmail = fetchRow("SELECT * FROM (SELECT round(sum(a.cost),2) AS total + FROM parsedemail_item a, trackedemail_item b WHERE b.id=a.trackedemail_item_id + AND b.member_id= " . $member_id . " AND a.dup_id IS NULL AND date_trunc('day', a.travel_date_end) > (current_date - 8) + AND date_trunc('day', a.travel_date_end) < current_date) AS c WHERE c.total IS NOT NULL"); + + if ($totalEmail) { + $total_email = $totalEmail["total"]; + } + + $total_weekly_spend = $total_bank + $total_email; + + if ($total_weekly_spend > $total_weekly_budget && $total_weekly_budget > 0) { + $over_spending = $total_weekly_spend - $total_weekly_budget; + $out["over_spending"] = $over_spending; + $out["user_budget_percentabove"] = ($over_spending / $total_weekly_budget); + } + + if ($total_weekly_budget > $total_weekly_spend && $total_weekly_budget > 0) { + $under_spending = $total_weekly_budget - $total_weekly_spend; + $out["under_spending"] = $under_spending; + $out["user_budget_percentbelow"] = ($under_spending / $total_weekly_budget); + } + + $out["weekly_total"] = $total_weekly_spend; + + return 0; + } +} + +public function detectMemberLocation($member_id, &$out) +{ + return 0; +} + + + + +} diff --git a/app/Models/userCards.php b/app/Models/userCards.php new file mode 100644 index 0000000..5f852ca --- /dev/null +++ b/app/Models/userCards.php @@ -0,0 +1,373 @@ +getCardBySurvey($member); + $this->getCardsByType($out, $member, $card_type, $card_count); + + } + + } + + + private function getCardBySurvey($member) + { + global $pgconn; + $member_id = $member['id']; + $q = "SELECT card_id FROM members_onboarding_survey mos + LEFT JOIN onboarding_survey_cards ca ON ca.answers_key = mos.answers_key + LEFT JOIN main_cards a ON a.id=ca.card_id + WHERE mos.member_id = " . $member_id . " AND a.status = 1 + AND card_id NOT IN (SELECT card_id FROM members_card_assign WHERE member_id =" . $member_id . " AND status=1) + GROUP BY card_id"; + $r = pg_query($pgconn, $q); + if ($r && pg_num_rows($r) && $f = pg_fetch_assoc($r)) { + return $f; + } + return null; + } + + private function getCardsByType(&$out, $member, $card_type, $limit = 10) + { + global $pgconn; + $member_id = $member['id']; + switch ($card_type) { + case 33000: + $query = "SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude, + EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire + FROM main_cards a + LEFT JOIN card_actions b ON (b.id=a.card_action_id) + LEFT JOIN address adr ON adr.id = a.card_location + LEFT JOIN members_card_assign ca ON ca.card_id=a.id AND ca.member_id=" . $member_id . " AND ca.status=1 + WHERE a.status = 1 AND a.deleted IS NULL AND a.button1_action IN ('GOOFFERS','CARPOOL') ORDER BY a.card_order ASC"; + break; + case 22000: + $query = "SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude,ca.trigger_key,ca.message,ca.cat, + EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire + FROM members_card_assign ca + LEFT JOIN main_cards a ON a.id=ca.card_id + LEFT JOIN address adr ON adr.id = a.card_location + LEFT JOIN card_actions b ON (b.id=a.card_action_id) + WHERE ca.member_id = " . $member_id . " AND ca.status =1 AND a.status=1 AND show_area IN (" . CARD_LOCATION_DEFAULT . "," . CARD_LOCATION_MAINFEED . ") AND a.deleted IS NULL AND ca.subscribe IS NULL AND ca.completed IS NULL ORDER BY a.card_order ASC"; + break; + + case 55000: + $query = "SELECT ca.id AS assign_id, ca.subscribe, a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data,adr.latitude,adr.longitude,ca.trigger_key,ca.message,ca.cat, + EXTRACT(DAY FROM (CASE WHEN a.card_expiration IS NULL THEN now() -now() ELSE a.card_expiration -now() END)) AS expr_val, a.card_canexpire + FROM members_card_assign ca + LEFT JOIN main_cards a ON a.id=ca.card_id + LEFT JOIN address adr ON adr.id = a.card_location + LEFT JOIN card_actions b ON (b.id=a.card_action_id) + WHERE ca.member_id = " . $member_id . " AND a.button1_action IN ('GOOFFERS') AND ca.subscribe IS NOT NULL ORDER BY ca.subscribe ASC"; + break; + + case 11000: + $query = "SELECT a.*, a.id AS card_id,b.name AS card_action_name,b.type AS card_action_type,b.data AS card_action_data + FROM main_cards a LEFT JOIN card_actions b ON (b.id=a.card_action_id) + WHERE a.status = 1 AND a.deleted IS NULL ORDER BY RANDOM()"; + break; + } + $deal_card_count = 0; + $survey_card_count = 0; + $blog_card_count = 0; + $r = pg_query($pgconn, $query); + $out['total_record_raw'] = pg_num_rows($r); + $out['total_record'] = pg_num_rows($r); + $out['retval'] = PHP_API_OK; + $out['internal_return'] = PHP_API_OK; + $query = $query . " LIMIT " . $limit . ""; + $r = pg_query($pgconn, $query); + $result = []; + if ($r && $total_record_raw = pg_num_rows($r)) { + $ic = 0; + while ($f = pg_fetch_assoc($r)) { + $test_card_allowed = CARD_ADD_ALLOWED; + if ($card_type == 22000) { + $test_card_allowed = verifyMemberCardDescision($f, $member, $out); + } + $card_country_allow = true; + + if ($f["card_country"] != "") { + $card_country_allow = false; + + if ($f["card_country"] == $member["country"]) { + $card_country_allow = true; + } + + } + + $count_block = false; + + // let see i card expired + $expr_value = $f["expr_val"]; + if ($f["card_canexpire"] == 1 && $expr_value < 0) { + $count_block = true; + } else { + if ($card_type == 22000) { + + if ($f["button1_action"] == "GOOFFERS") { + if ($deal_card_count > 0) { + $count_block = true; + } + if ($f["card_country"] == "" || $f["card_country"] == $member["country"]) { + $deal_card_count++; + } + } + + if ($f["button1_action"] == "SURVEYA") { + if ($fsurvey_card_count > 0) { + $count_block = true; + } + $survey_card_count++; + } + + if ($f["button1_action"] == "BLOGCARD") { + if ($blog_card_count > 0) { + $count_block = true; + } + $blog_card_count++; + } + + } + } //card is not expired + + if (CARD_ADD_ALLOWED == $test_card_allowed && true == $card_country_allow && false == $count_block) { + $suffix = str_pad($ic, 5, '0', STR_PAD_LEFT); + //fillSuffixCard($out, $f, $suffix); + $out['name_' . $suffix] = $f['name']; + $out['assign_id_' . $suffix] = $f['assign_id']; + $out['card_id_' . $suffix] = $f['card_id']; + $out['can_save_' . $suffix] = $f['can_save']; + $out['short_title_' . $suffix] = $f['short_title']; + $out['title_' . $suffix] = $f['short_title']; + $out['background_picture_' . $suffix] = $f['background_picture']; + $out['button1_' . $suffix] = $f['button1']; + $out['button1_text_' . $suffix] = $f['button1_text']; + $out['button1_action_' . $suffix] = $f['button1_action']; + $out['expires_' . $suffix] = $f['card_expiration']; + $out['template_' . $suffix] = $f['template']; + $out['card_canexpire_' . $suffix] = $f['card_canexpire']; + $out['card_action_type_' . $suffix] = $f['card_action_type']; + $out['card_action_data_' . $suffix] = $f['card_action_data']; + $out['titleshow_' . $suffix] = $f['titleshow']; + $out['multiple_answer_' . $suffix] = $f['multiple_answer']; + $out['use_short_title_' . $suffix] = $f['use_short_title']; + $out['target_key_' . $suffix] = $f['target_key']; + $out['target_text_' . $suffix] = $f['target_text']; + $out['description_' . $suffix] = $f['description']; + $out['long_description_' . $suffix] = $f['long_description']; + $out['card_behavior_' . $suffix] = $f['card_behavior']; + $out['card_type_' . $suffix] = $f['card_type']; + $out['card_time_' . $suffix] = $f['card_time']; + $out['card_country_' . $suffix] = $f['card_country']; + $out['card_location_' . $suffix] = $f['card_location']; + $out['latitude_' . $suffix] = $f['latitude']; + $out['longitude_' . $suffix] = $f['longitude']; + $out['card_order_' . $suffix] = $f['card_order']; + $out['background_color_' . $suffix] = $f['background_color']; + $out['blog_id_' . $suffix] = $f['blog_id']; + $out['expiration_' . $suffix] = $f['expiration']; + if ($f["button1_action"] == "CARPOOL") { + + $carPool = fetchRow("SELECT * FROM members_carpool_friends WHERE carpool_id IN (select id from members_carpool WHERE member_id = " . $member_id . ") AND status = 1"); + + if ($carPool && $carPool['added']) { + $out['subscribe_' . $suffix] = $carPool["added"]; + } else { + $out['subscribe_' . $suffix] = ""; + } + + } else { + $out['subscribe_' . $suffix] = $f["subscribe"]; + } + $ic++; + } + } + $out['total_record'] = $ic; + } + + } + + function verifyMemberCardDescision($cardData, $memberData, &$out) + { + $permCard = CARD_ADD_ALLOWED; + $behaviour = $cardData["card_behavior"]; + + if (function_exists("behaviour_" . $behaviour)) { + $permCard = call_user_func("behaviour_" . $behaviour, $memberData, $out); + } else { + $permCard = CARD_ADD_ALLOWED; + } + + return $permCard; + } + + function saveDashCard($in, &$out) + { + $ret = PHP_API_BAD_PARAM; + $member_id = $in['member_id']; + $card_id = $in['card_id']; + $out["saved_card_id"] = "0"; + $saveCard = fetchRow("SELECT id FROM member_saved_cards WHERE member_id=" . $member_id . " AND card_id=" . $card_id . ""); + + if (empty($saveCard)) { + $insertCard = "INSERT INTO member_saved_cards (member_id,card_id) VALUES (" . $member_id . "," . $card_id . ") RETURNING id"; + $out["saved_card_id"] = insertQuery($insertCard); + if ($out['saved_card_id'] > 0) { + $ret = PHP_API_OK; + } + } + return $ret; + } + + function loadSavedCard($in, &$out) + { + $ret = PHP_API_BAD_PARAM; + + $member_id = $in['member_id']; + + $out["total_record"] = 0; + $out['session_valid'] = ''; + $out['internal_return'] = PHP_API_OK; + $saveCards = selectData("SELECT m.id AS saved_card_id, mc.*,mc.id AS card_id FROM member_saved_cards m LEFT JOIN main_cards mc ON m.card_id = mc.id WHERE m.member_id = " . $member_id . " AND m.status = 1"); + if ($saveCards != null) { + $out["total_record"] = pg_num_rows($saveCards); + $ic = 0; + + while ($f = pg_fetch_assoc($saveCards)) { + $suffix = str_pad($ic, 5, '0', STR_PAD_LEFT); + $out['name_' . $suffix] = $f['name']; + $out['short_title_' . $suffix] = $f['short_title']; + $out['title_' . $suffix] = $f['title']; + $out['description_' . $suffix] = $f['description']; + $out['short_title_' . $suffix] = $f['short_title']; + $out['title_' . $suffix] = $f['short_title']; + $out['background_picture_' . $suffix] = $f['background_picture']; + $out['button1_' . $suffix] = $f['button1']; + $out['button1_text_' . $suffix] = $f['button1_text']; + $out['button1_action_' . $suffix] = $f['button1_action']; + $out['can_save_' . $suffix] = $f['can_save']; + $out['card_id_' . $suffix] = $f['card_id']; + $out['template_' . $suffix] = $f['template']; + $out['card_canexpire_' . $suffix] = $f['card_canexpire']; + $out['card_canexpire_' . $suffix] = $f['card_canexpire']; + $out['expires_' . $suffix] = $f['card_expiration']; + //$out['card_action_type_' . $suffix] = $f['card_action_type']; + //$out['card_action_data_' . $suffix] = $f['card_action_data']; + $out['titleshow_' . $suffix] = $f['titleshow']; + $ic++; + } + } + $ret = PHP_API_OK; + $out["status"] = "OK"; + return $ret; + } + + function userTrackCardClick($in, &$out) + { + $ret = PHP_API_BAD_PARAM; + $member_id = $in['member_id']; + $card_id = $in['card_id']; + + processCard($in, $out); // see if cleanout is needed + + $insertCard = "INSERT INTO members_cardclicktrack (member_id,card_id) VALUES (" . $member_id . "," . $card_id . ") RETURNING id"; + $out["card_track_id"] = insertQuery($insertCard); + if ($out['card_track_id'] > 0) { + $ret = PHP_API_OK; + } + return $ret; + } + + function processCard($in, &$out) + { + + $ret = PHP_API_BAD_PARAM; + $member_id = $in['member_id']; + $card_id = $in['card_id']; + + $card = fetchRow("SELECT id,button1_action,title,expiration FROM main_cards WHERE id=" . $card_id . ""); + if ($card) { + if ($card["button1_action"] == "CARPOOL") { + updateQuery("UPDATE members_card_assign SET status = 0,completed=now(),updated=now() WHERE card_id=" . $card_id . " AND member_id=" . $member_id . ""); + } + + if ($card["expiration"] == 100) { + updateQuery("UPDATE members_card_assign SET status = 0,updated=now() WHERE card_id=" . $card_id . " AND member_id=" . $member_id . ""); + } + + // let us see if this is a dynamic card + $assignCard = fetchRow("SELECT mca.id AS assign_id,mc.dynamic_key,et.expiration,EXTRACT(EPOCH FROM now() - mca.updated)/3600 AS card_age + FROM members_card_assign mca LEFT JOIN main_cards mc ON mc.id=mca.card_id LEFT JOIN email_trigger et ON et.dynamic_key = mc.dynamic_key + WHERE mca.member_id =" . $member_id . " AND mca.trigger_key IS NOT NULL AND mca.card_id = " . $card_id . " "); + if ($assignCard) { + if ($assignCard["expiration"] == "EXP00002") { + // rule 1 expire on first contact + updateQuery("UPDATE members_card_assign SET status = 0 WHERE id= " . $assignCard['assign_id'] . " AND member_id=" . $member_id . ""); + } + + } + } + + return $ret; + } + + function userCardAdd($member_id, $card_id, &$out) + { + global $pgconn; + $ret = PHP_API_BAD_PARAM; + $assignCard = fetchRow("SELECT id AS assign_id,status AS card_status FROM members_card_assign WHERE card_id=" . $card_id . " AND member_id=" . $member_id . " AND status IN (0,1)"); + + if ($assignCard) { + if ($assignCard['card_status'] == 0) { + $click = fetchRow("SELECT expiration FROM members_cardclicktrack mc LEFT JOIN main_cards a ON a.id=mc.card_id WHERE a.id=" . $card_id . " AND mc.member_id=" . $member_id . " LIMIT 1"); + if ($click && $click['expiration'] == 0) { + $out["status"] = "This card is expired"; + } else { + $ret = PHP_API_OK; + } + $ret = updateQuery("UPDATE members_card_assign SET status = 1, updated=NOW() WHERE id = " . $assignCard['assign_id'] . " AND member_id = " . $member_id . ""); + + } else { + $out["status"] = "This card was already added"; + } + } else { + //insert assign card + $insertCard = "INSERT INTO members_card_assign (card_id,member_id) VALUES (" . $card_id . "," . $member_id . ") RETURNING id"; + $out['id'] = insertQuery($insertCard); + if ($out['id'] > 0) { + $ret = PHP_API_OK; + } + } + + return $ret; + } + + + +} \ No newline at end of file