// Account management toosl #include "clog.h" #include "cgi.h" #include "input.h" #include "wrenchboard_api.h" #include "coupons.h" #include "email.h" #include "safestring.h" #include #include "pgsql.h" #include "pgsql_wrapper.h" #include "cfg.h" #include #include "smoney.h" #include "account_mngt.h" #include "creditcards.h" #include "payments.h" #include "reco_engine.h" /* #define WRENCHBOARD_COUPON_START 85000 #define WRENCHBOARD_COUPON_CREATE 85010 #define WRENCHBOARD_COUPON_ACTIVATE 85015 #define WRENCHBOARD_COUPON_REDEEM 85020 #define WRENCHBOARD_COUPON_MEMLIST 85025 #define WRENCHBOARD_COUPON_PENDLIST 85030 #define WRENCHBOARD_COUPON_END 85999 ****** */ long MemberCouponList( CVars in, CVars &out ); long coupons_calls(CVars in, CVars &out){ logfmt(logINFO, "coupons_calls()"); out["result"] = "YES I GET TO BACK END"; long action = REQ_LONG(in, "action", 0, -1); CVars x; long ret = 0; const char * loc = getenv("REMOTE_ADDR"); const PGresult *res; logfmt(logINFO, "action = %ld", action); switch (action) { case WRENCHBOARD_COUPON_CREATE: return CreateCoupon(in, out); break; case WRENCHBOARD_COUPON_ACTIVATE: return AssignCoupon(in, out); break; case WRENCHBOARD_COUPON_REDEEM: return RedeemCoupon(in, out); break; case WRENCHBOARD_COUPON_MEMLIST: // member list in["mode"] = 100; in["mode"].set_valid( true ); return MemberCouponList(in, out); break; case WRENCHBOARD_COUPON_PENDLIST: // member list in["mode"] = 200; in["mode"].set_valid( true ); return MemberCouponList(in, out); break; } logfmt(logINFO, "/coupons_calls()"); return ret; } long RedeemCoupon( CVars in, CVars &out ){ logfmt(logINFO, "long RedeemCoupon( CVars in, CVars &out )()"); long ret = PHP_API_BAD_PARAM; const PGresult *res; try{ REQ_STRING(in, "code", 5, 49, "(.*)"); REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "code_id", 1, -1); const char * loc = getenv("REMOTE_ADDR"); long payment_id = 0; payment_id = WrenchMemberCouponPayment( in, out ); if( payment_id > 0 ){ out["payment_id"] = payment_id; out["status"] = "COMPLETED"; out["status_text"] = "The coupon was redeemed successfully."; ret = PHP_API_OK; } else{ out["status_text"] = "Unable to redeem the coupon."; } } catch (bad_parameter) { out["status_text"] = "Unable to redeem the coupon."; ret = PHP_API_BAD_PARAM; } return ret; } // for coupon table #define COUPON_ALLOC_STARTED 100 #define COUPON_ALLOC_ALLOCATED 200 // for allocation table #define COUPON_ACTIVE 500 long AssignCoupon( CVars in, CVars &out ){ long ret = 0; const char * loc = getenv("REMOTE_ADDR"); const PGresult *res; try{ REQ_STRING(in, "code", 5, 49, "(.*)"); REQ_LONG(in, "member_id", 1, -1); long coupon_id = 0; res = pgsql_query("SELECT * FROM coupons WHERE code='%s' AND status = 0", in["code"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { mapf = pgsql_fetch_assoc(res, 0); CVars rec; map_to_cvars(f, rec); pgsql_exec("UPDATE coupons SET status=%lu WHERE code='%s' AND status=%lu",COUPON_ALLOC_ALLOCATED,in["code"].c_str(),COUPON_ALLOC_STARTED); // Now We start /* CREATE TABLE coupons_allocation ( id SERIAL, code VARCHAR(15) UNIQUE REFERENCES coupons( code ) NOT NULL, amount INT DEFAULT 0, member_id INT REFERENCES members(id) NOT NULL, added timestamp without time zone DEFAULT now(), active timestamp DEFAULT NULL, loc INET, status INT DEFAULT 0 ); wrenchboard=> SELECT substring(ca.code,0,4)||'XXXXXXXX' as code, ca.amount,m.email,m.firstname FROM coupons_allocation ca LEFT JOIN members m ON m.id=ca.member_id; code | amount | email | firstname -------------+--------+----------------------+----------- 1M5XXXXXXXX | 0 | ses66181+1@gmail.com | Olusesan */ CVars xx; xx["member_id"] = in["member_id"]; xx["member_id"].set_valid(true); xx["code"] = rec["code"]; xx["code"].set_valid(true); xx["amount"] = rec["amount"]; xx["amount"].set_valid(true); xx["status"] = COUPON_ACTIVE; xx["status"].set_valid(true); coupon_id = insert_db_record(DBS_VALID, "coupons_allocation", "coupons_allocation_id_seq", xx); if (coupon_id > 0 ){ CVars inx; inx["member_id"] = xx["member_id"]; inx["member_id"].set_valid(true); inx["coupon_id"] = coupon_id; inx["coupon_id"].set_valid(true); // mark status on coupon pgsql_exec("UPDATE coupons SET active=now(), status=%lu WHERE code='%s' AND status=0",COUPON_ALLOC_STARTED,in["code"].c_str()); // send allocation email coupon_email(WRENCHBOARD_COUPON_ACTIVATE, inx, out); recommendation_engine(RECOMMEND_COUPON , inx, out); // trigger the card interaction in apps CVars xy; if ( load_db_record(xy, "SELECT id AS member_id, uid AS member_uid, 'message.svg' AS icon " " FROM members WHERE id = %lu ",in["member_id"].Long()) > 0 ){ xy["msg"] = "You have received a free coupon !!!"; xy["msg"].set_valid(true); plan_notification(xy, out); } } } else{ CVars xx; // xx["member_id"] = in["member_id"]; xx["member_id"].set_valid(true); // xx["pref_id"] = in["pref_id"]; xx["pref_id"].set_valid(true); // xx["status"] = in["status"]; xx["status"].set_valid(true); // insert_db_record(DBS_VALID, "members_settings", "members_settings_id_seq", xx); } ret = PHP_API_OK; } catch (bad_parameter) { ret = PHP_API_BAD_PARAM; } return ret; } long MemberCouponList( CVars in, CVars &out ){ logfmt(logINFO, "MemberCouponList()"); char vname[30]; long ret = PHP_API_BAD_PARAM; try { REQ_LONG(in, "member_id", 1, -1); long mode = REQ_LONG(in, "mode", 1, -1); in["active_q"] = "ca.active IS NOT NULL"; if ( mode == 200 ){ in["active_q"] = "ca.active IS NULL"; } in["active_q"].set_valid( true ); out["total_record"] = "0"; const PGresult *res; res = pgsql_query(" SELECT id AS coupon_id, ca.code, ca.amount, ca.added::date,ca.status,ca.active,ca.uid AS allocation_uid " " FROM coupons_allocation ca WHERE ca.member_id = %lu " " AND %s ORDER BY ca.id DESC", in["member_id"].Long(),in["active_q"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { out["total_record"] = pgsql_num_rows(res); for (int i = 0, n = pgsql_num_rows(res); i < n; i++) { mapf = pgsql_fetch_assoc(res, i); if (f.empty()) continue; CVars rec; map_to_cvars(f, rec); snprintf(vname, sizeof (vname), "coupon_id_%05d", i); out[vname] = rec["coupon_id"]; snprintf(vname, sizeof (vname), "code_%05d", i); out[vname] = rec["code"]; snprintf(vname, sizeof (vname), "added_%05d", i); out[vname] = rec["added"]; snprintf(vname, sizeof (vname), "amount_%05d", i); out[vname] = rec["amount"]; snprintf(vname, sizeof (vname), "status_%05d", i); out[vname] = rec["status"]; snprintf(vname, sizeof (vname), "active_%05d", i); out[vname] = rec["active"]; snprintf(vname, sizeof (vname), "allocation_uid_%05d", i); out[vname] = rec["allocation_uid"]; } } ret = PHP_API_OK; out["status"] = "OK"; } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long MemberCouponList(CVars in, CVars &out)"); } logfmt(logINFO, "/MemberCouponList()"); return ret; } long CreateCoupon( CVars in, CVars &out ){ long ret = 0; logfmt(logINFO, "CreateCoupon()"); REQ_STRING(in, "code", 5, 49, "(.*)"); REQ_LONG(in, "amount", 1, -1); CVars x; x["code"] = in["code"]; x["code"].set_valid(true); x["amount"] = in["amount"]; x["amount"].set_valid(true); x["description"] = in["description"]; x["description"].set_valid(true); ret = insert_db_record(DBS_VALID, "coupons", "coupons_id_seq", x); if (ret > 0) { x["coupon_id"] = ret; x["coupon_id"].set_valid(true); // account_email(ACCOUNT_CONTACT_ALERT, x, out); } return 0; }