// Topup management toosl #include "clog.h" #include "cgi.h" #include "input.h" #include "mermsemr_api.h" #include "safestring.h" #include #include "pgsql.h" #include "pgsql_wrapper.h" #include #include "medTEmails.h" #include #include #include /* #include #include #include */ /* -- */ #include "function_members.h" long MemberLogin(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; try { REQ_STRING(in, "username", 2, 49, "(.*)"); REQ_STRING(in, "password", 2, 49, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); ret = load_db_record(out, "SELECT UPPER( md5( now()::text) ) AS sessionid,m.*,mp.*,m.id AS member_id,mp.id AS member_profile_id FROM members m \ LEFT JOIN members_profile mp ON mp.member_id = m.id \ WHERE m.status=1 AND LOWER(m.username)=LOWER('%s') AND m.password= md5('%s')", in["username"].c_str(), in["password"].c_str()); if (ret && out["member_id"].Long() > 0) { // remove all existing session pgsql_exec("DELETE FROM members_session WHERE member_id=%ld ", out["member_id"].Long()); // Create New Session Now if (MemberSessionCheck(out["member_id"].Long(), out["sessionid"].c_str(), 1) > 0) { out["stauts"] = "OK"; /*LOAD THE SESSION INTO OUT now */ load_db_record(out, "SELECT session FROM members_session WHERE member_id=%lu ORDER BY id DESC LIMIT 1", out["member_id"].Long()); //Email-bad member_email_calls(in["action"].Long(), out, out); //=============================================================================================================================== pgsql_query("UPDATE members SET last_login = now() WHERE id = %lu", out["member_id"].Long()); // account_email(ACCOUNT_LOGIN_ALERT,out,out); // ALERT CUSTOMER OF LOGIN ret = PHP_LOGIN_OK; } else { out["status"] = "Session check failed"; } } else { out["status_message"] = "Invalid Username/Password"; } } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long medTMemberLogin(CVars in, CVars &out)"); } return ret; } long MemberSessionCheck(long uid, const char *sessionid, int create) { logfmt(logINFO, "long MemberSessionCheck(long uid, const char *sessionid, int create )"); // Sanity check long session_expired_minutes = 15; // load in the global if (uid < 1 || sessionid == NULL || strlen(sessionid) < 4) { return -1L; // Invalif parameters } logfmt(logINFO, "#######-#########-A"); // Clean old sessions if (create == 1) // Clean Previous session by force { pgsql_exec("DELETE FROM members_session WHERE member_id=%ld", uid); } logfmt(logINFO, "#######-#########-B"); pgsql_exec("DELETE FROM members_session WHERE member_id=%ld AND updated < (now() - interval '%lu minutes')", uid, session_expired_minutes); // Update/check existing session if (create == 0) { pgsql_exec("UPDATE members_session SET updated=NOW() WHERE member_id=%ld AND session='%s'", uid, sessionid); const PGresult *res = pgsql_query("SELECT * FROM members_session WHERE member_id=%ld AND session='%s'", uid, sessionid); if (res != NULL && pgsql_num_rows(res) > 0) { logfmt(logINFO, "VALID SESSION *****"); return 1L; // Session updated } else { logfmt(logINFO, "INVALID SESSION *****"); //INVALID SESSION DETECTED return -1L; // Invalid parameters } } if (create > 0) { // Check session i? const PGresult *res = pgsql_query("SELECT * FROM members_session WHERE member_id=%ld AND session<>'%s'", uid, sessionid); if (res != NULL && pgsql_num_rows(res) > 0) { return -2L; // Active sessions found } CVars sess; // Do we have the same session already? if (load_db_record(sess, "SELECT * FROM members_session WHERE member_id=%lu AND session='%s'", uid, sessionid) > 0) { pgsql_exec("UPDATE members_session SET updated=NOW() WHERE member_id=%ld AND session='%s'", uid, sessionid); return sess["id"].Long(); } // Create a new session const char * loc = getenv("REMOTE_ADDR"); sess["loc"] = loc; sess["loc"].set_valid(true); sess["member_id"] = uid; sess["member_id"].set_valid(true); sess["session"] = sessionid; sess["session"].set_valid(true); long sid = insert_db_record(DBS_VALID, "members_session", "members_session_id_seq", sess); //members_session_id_seq if (sid > 0) { return sid; // New session created } return -3L; // Failed to create new session } logfmt(logINFO, "/long MemberSessionCheck(long uid, const char *sessionid, int create )"); return 0L; // No route } long CreateMember(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "CreateMember()"); try { // REQ_LONG(in, "pid", 0, -1); REQ_STRING(in, "username", 5, 49, "(.*)"); REQ_STRING(in, "firstname", 2, 49, "(.*)"); REQ_STRING(in, "lastname", 2, 49, "(.*)"); OPTIONAL(in, "phone") REQ_STRING(in, "phone", 5, 23, "(.*)"); REQ_STRING(in, "password", 5, 49, "(.*)"); OPTIONAL(in, "phone") REQ_STRING(in, "loc", 5, 16, "(.*)"); OPTIONAL(in, "login") REQ_LONG(in, "login", 0, -1); long member_id = 0; //REQ_STRING (in, "sessionid", 4, 40, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); ret = load_db_record(out, "SELECT *,id AS member_id FROM members WHERE LOWER(username)=LOWER('%s') ", in["username"].c_str()); if (ret > 0) { // LETS CREATE THE ACOUNT NOW CVars x; x["username"] = in["username"]; x["username"].set_valid(true); x["firstname"] = in["firstname"]; x["firstname"].set_valid(true); x["lastname"] = in["lastname"]; x["lastname"].set_valid(true); x["phone"] = in["phone"]; x["phone"].set_valid(true); x["loc"] = in["loc"]; x["loc"].set_valid(true); x["email"] = in["email"]; x["email"].set_valid(true); x["password"] = in["email"]; x["password"].set_valid(true); out["member_id"] = insert_db_record(DBS_VALID, "members", "members_id_seq", x); if (out["member_id"].Long() > 0) { pgsql_query("UPDATE members SET password = md5('%s') WHERE id = %lu", in["password"].c_str(), out["member_id"].Long()); // setting the password MD5 now // Now Send Email ret = PHP_API_OK; out["status"] = "OK"; member_id = out["member_id"].Long(); //---emailbad member_email_calls(MERMS_USER_CREATEACCOUNT, out, out); // out["member_id"] = member_id; // if (in["login"] != "" && in["login"] == 1) { in["action"] = MERMS_USER_LOGIN; in["action"].set_valid(true); // needed for next action to know what email to send ret = MemberLogin(in, out); ret = 100; // needed if login is good // } // ============== } } else { // LETS CREATE THE ACOUNT NOW CVars x; x["username"] = in["username"]; x["username"].set_valid(true); x["firstname"] = in["firstname"]; x["firstname"].set_valid(true); x["lastname"] = in["lastname"]; x["lastname"].set_valid(true); x["phone"] = in["phone"]; x["phone"].set_valid(true); x["loc"] = in["loc"]; x["loc"].set_valid(true); x["email"] = in["email"]; x["email"].set_valid(true); x["password"] = in["email"]; x["password"].set_valid(true); out["member_id"] = insert_db_record(DBS_VALID, "members", "members_id_seq", x); if (out["member_id"].Long() > 0) { pgsql_query("UPDATE members SET password = md5('%s') WHERE id = %lu", in["password"].c_str(), out["member_id"].Long()); // setting the password MD5 now // Now Send Email ret = PHP_API_OK; out["status"] = "OK"; //Email bad member_email_calls(in["action"].Long(), out, out); // if (in["login"] != "" && in["login"] == 1) { in["action"] = MERMS_USER_LOGIN; in["action"].set_valid(true); // needed for next action to know what email to send ret = MemberLogin(in, out); ret = 100; // needed if login is good // } // ============== } } }catch (bad_parameter) { logfmt(logINFO, "ERROR CALL CreateMember"); } logfmt(logINFO, "/CreateMember()"); return ret; } long getMemberProfile(CVars in, CVars &out); long MemberProfile(CVars in, CVars &out){ try{ long task_mode = REQ_LONG(in, "task_mode", 0, -1); REQ_LONG(in, "member_id", 0, -1); switch (task_mode) { case MODE_SETVALUE: return medTrUpdateProfile(in, out); break; case MODE_GETVALUE: return getMemberProfile(in, out); break; } }catch (bad_parameter) { logfmt(logINFO, "ERROR CALL CreateMember"); } logfmt(logINFO, "/MemberReminders()"); return 0; } long getMemberProfile(CVars in, CVars &out) { long ret = load_db_record(out, "SELECT m.*,mp.*,m.id AS member_id,mp.id AS member_profile_id FROM members m \ LEFT JOIN members_profile mp ON mp.member_id = m.id \ WHERE m.id = %lu", in["member_id"].Long()); return ret; } long medTrUpdateStartProfile(CVars in, CVars &out) { long ret = medTrUpdateProfile(in, out); if (ret == PHP_API_OK) { load_db_record(out, "SELECT UPPER( md5( now()::text) ) AS sessionid,m.*,mp.*,m.id AS member_id,mp.id AS member_profile_id FROM members m \ LEFT JOIN members_profile mp ON mp.member_id = m.id \ WHERE m.id = %lu", in["member_id"].Long()); // We need to have the session back load_db_record(out, "SELECT * FROM members_session WHERE member_id = %lu ORDER BY id DESC limit 1", in["member_id"].Long()); } return ret; } long medTrUpdateProfile(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "medTrUpdateProfile()"); REQ_LONG(in, "member_id", 0, -1); REQ_STRING(in, "street1", 2, 49, "(.*)"); OPTIONAL(in, "street2") REQ_STRING(in, "street2", 1, 49, "(.*)"); REQ_STRING(in, "city", 5, 49, "(.*)"); // OPTIONAL(in, "phone") REQ_STRING(in, "phone", 5, 23, "(.*)"); REQ_STRING(in, "zipcode", 1, 12, "(.*)"); REQ_STRING(in, "state", 1, 59, "(.*)"); REQ_STRING(in, "country", 1, 3, "(.*)"); REQ_STRING(in, "loc", 5, 16, "(.*)"); //REQ_STRING (in, "sessionid", 4, 40, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); CVars x; // x["pid"] = in["pid"]; // x["pid"].set_valid(true); x["street1"] = in["street1"]; x["street1"].set_valid(true); x["street2"] = in["street2"]; x["street2"].set_valid(true); x["city"] = in["city"]; x["city"].set_valid(true); // x["phone"] = in["phone"]; // x["phone"].set_valid(true); x["zipcode"] = in["zipcode"]; x["zipcode"].set_valid(true); x["loc"] = in["loc"]; x["loc"].set_valid(true); x["state"] = in["state"]; x["state"].set_valid(true); x["country"] = in["country"]; x["country"].set_valid(true); ret = load_db_record(out, "SELECT *,id AS member_profile_id FROM members_profile WHERE member_id = %lu ", in["member_id"].Long()); if (ret > 0) { update_db_record(DBS_VALID, "members_profile", x, in["member_profile_id"].Long()); member_email_calls(in["action"].Long(), in, out); ret = PHP_API_OK; } else { // LETS CREATE THE ACOUNT NOW x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); out["member_profile_id"] = insert_db_record(DBS_VALID, "members_profile", "members_profile_id_seq", x); if (out["member_profile_id"].Long() > 0) { member_email_calls(in["action"].Long(), in, out); // Now Send Email ret = PHP_API_OK; // ============== } } logfmt(logINFO, "/medTrUpdateProfile()"); return ret; } /* "sessionid" => $sessionid, "practice_id" => 0, "encounter_id"=> 0, "member_id" => "1", "description"=> $description, "repeat" => $repeat, "start_date" => $start_date, "end_date" => $end_date, "reminder" => rand(0,3) */ long setMemberReminders(CVars in, CVars &out); long getMemberReminders(CVars in, CVars &out); long MemberReminders(CVars in, CVars &out) { try{ long task_mode = REQ_LONG(in, "task_mode", 0, -1); switch (task_mode) { case USER_CREATETASK: return setMemberReminders(in, out); break; case USER_LOADTASK: return getMemberReminders(in, out); break; } }catch (bad_parameter) { logfmt(logINFO, "ERROR CALL CreateMember"); } logfmt(logINFO, "/MemberReminders()"); return 0; } long setMemberReminders(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "CreateMember()"); try { REQ_LONG(in, "member_id", 0, -1); REQ_LONG(in, "practice_id", 0, -1); REQ_LONG(in, "encounter_id", 0, -1); REQ_STRING(in, "description", 5, 99, "(.*)"); REQ_LONG(in, "repeat", 0, -1); REQ_STRING(in, "start_date", 2, 15, "(.*)"); REQ_STRING(in, "end_date", 2, 15, "(.*)"); REQ_LONG(in, "reminder", 0, -1); //REQ_STRING (in, "sessionid", 4, 40, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); ret = load_db_record(out, "SELECT *,id AS member_id FROM members WHERE id=%lu ", in["member_id"].Long()); if (ret > 0) { // LETS CREATE REMINDER CVars x; x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["practice_id"] = in["practice_id"]; x["practice_id"].set_valid(true); x["encounter_id"] = in["encounter_id"]; x["encounter_id"].set_valid(true); x["description"] = in["description"]; x["description"].set_valid(true); x["loc"] = in["loc"]; x["loc"].set_valid(true); x["repeat"] = in["repeat"]; x["repeat"].set_valid(true); x["reminder"] = in["reminder"]; x["reminder"].set_valid(true); x["start_date"] = in["start_date"]; x["start_date"].set_valid(true); x["end_date"] = in["end_date"]; x["end_date"].set_valid(true); out["member_reminder_id"] = insert_db_record(DBS_VALID, "members_reminders", "members_reminders_id_seq", x); if (out["member_reminder_id"].Long() > 0) { //---emailbad member_email_calls(MERMS_USER_CREATEACCOUNT, out, out); } } }catch (bad_parameter) { logfmt(logINFO, "ERROR CALL CreateMember"); } logfmt(logINFO, "/CreateMember()"); return ret; } /* "sessionid" => $sessionid, "practice_id" => 0, "encounter_id"=> 0, "member_id" => "1", "description"=> $description, "repeat" => $repeat, "start_date" => $start_date, "end_date" => $end_date, "reminder" => rand(0,3) status = 1 */ long getMemberReminders(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[20]; try { // REQ_LONG(in, "status", 0, -1); REQ_LONG( in, "member_id", 0, -1); out["total_record"] = "0"; const PGresult *res = pgsql_query("SELECT * FROM members_reminders WHERE member_id = %lu status = 1 ORDER BY agent_name ASC",in["member_id"].Long()); 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), "description_%05d", i); out[vname] = rec["description"]; snprintf(vname, sizeof (vname), "repeat_%05d", i); out[vname] = rec["repeat"]; snprintf(vname, sizeof (vname), "start_date_%05d", i); out[vname] = rec["start_date"]; snprintf(vname, sizeof (vname), "end_date_%05d", i); out[vname] = rec["end_date"]; snprintf(vname, sizeof (vname), "reminder_%05d", i); out[vname] = rec["reminder"]; } } ret = PHP_API_OK; out["status"] = "OK"; } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long getMemberReminders(CVars in, CVars &out)"); } return ret; } //------------------------------------------------------ long serviceCost(long service_id, long discount_rate); long medTrMemberTransportById(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; ret = load_db_record(out, "SELECT * FROM members_service_request WHERE id = %lu ", in["transport_id"].Long()); if (ret > 0) { ret = PHP_API_OK; } return ret; } long DeletAallCards(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; out["status"] = "Pending"; try { REQ_LONG(in, "member_id", 0, -1); pgsql_query("UPDATE creditcard SET status = 7,active = 0 WHERE status <> 7 AND member_id = %lu", in["member_id"].Long()); pgsql_query("UPDATE members SET stripe_customer_id = NULL,def_card = NULL WHERE id = %lu", in["member_id"].Long()); ret = PHP_API_OK; out["status"] = "Completed"; } catch (bad_parameter) { out["status"] = "Error"; logfmt(logINFO, "ERROR CALL long DeletAallCards(CVars in, CVars &out)"); } return ret; } long medTrMemberServiceById(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, " CALL long medTrMemberServiceById(CVars in, CVars &out)"); try { REQ_LONG(in, "member_id", 0, -1); REQ_LONG(in, "service_id", 0, -1); ret = load_db_record(out, "SELECT s.service_date,s.quantity,a.agent_name,s.est_cost AS estimated_cost,s.flags,s.status," " TO_CHAR(s.service_date :: TIMESTAMP, 'Day Mon dd, yyyy HH:MM AM') AS long_date," " a.street,a.city,a.zipcode,a.phone,a.state, " " (CASE WHEN s.dt_confirmed IS NOT NULL THEN 'Confirmed' ELSE 'Not Confirmed' END) AS confirm_text,s.id AS service_id " " FROM members_service_request s " " LEFT JOIN agents a ON a.id = s.agent_id " " WHERE s.id = %lu ", in["service_id"].Long()); if (ret > 0) { // out["estimated_cost"] ="34.00"; getServiceDetail( out["service_id"].Long(), out); // snprintf(vname, sizeof (vname), "service_list_detail_%05d", i); // out[vname] = out["service_list"]; ret = PHP_API_OK; } ret = PHP_API_OK; out["status"] = "OK"; } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long medTrMemberServiceById(CVars in, CVars &out)"); } return ret; } long medTrLanguageList(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[20]; try { // REQ_LONG(in, "status", 0, -1); REQ_LONG( in, "member_id", 0, -1); out["total_record"] = "0"; const PGresult *res = pgsql_query("SELECT * FROM agents WHERE status = 1 ORDER BY agent_name ASC"); 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), "agent_name_%05d", i); out[vname] = rec["agent_name"]; snprintf(vname, sizeof (vname), "agent_id_%05d", i); out[vname] = rec["id"]; snprintf(vname, sizeof (vname), "street_%05d", i); out[vname] = rec["street"]; snprintf(vname, sizeof (vname), "city_%05d", i); out[vname] = rec["city"]; snprintf(vname, sizeof (vname), "zipcode_%05d", i); out[vname] = rec["zipcode"]; } } ret = PHP_API_OK; out["status"] = "OK"; } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long medTMemberLogin(CVars in, CVars &out)"); } return ret; } /* * street | city | zipcode kleen=> SELECT t.*,a.agent_name,TO_CHAR(t.service_date :: TIMESTAMP, 'Day Mon dd, yyyy HH:MM AM') AS long_date FROM members_service_request t LEFT JOIN agents a ON a.id=t.agent_id; id | pid | member_id | agent_id | service_type | service_date | quantity | added | status | flags | loc | dist_mode | miles | minutes | agent_name | long_date ----+-----+-----------+----------+--------------+---------------------+----------+----------------------------+--------+-------+-----------------+-----------+-------+---------+----------------------------+--------------------------------- 3 | 100 | 1 | 3 | 1 | 2018-05-12 23:05:00 | 3 | 2018-05-12 23:05:34.962922 | 1 | 1 | 104.238.127.115 | | 0 | 0 | Agenr Name with name 10003 | Saturday May 12, 2018 11:05 PM */ long medTrMemberTransportList(CVars in, CVars &out) { logfmt(FLOG_MAX, "long medTrMemberTransportList(CVars in, CVars &out)"); long ret = PHP_API_BAD_PARAM; char vname[30]; try { REQ_LONG(in, "limit", 0, -1); REQ_LONG(in, "member_id", 0, -1); out["total_record"] = "0"; const PGresult *res = pgsql_query("SELECT t.id AS service_id, t.*,a.agent_name," " TO_CHAR(t.service_date :: TIMESTAMP, 'Day Mon dd, yyyy HH:MM AM') AS long_date , " " (CASE WHEN t.dt_confirmed IS NOT NULL THEN 'Confirmed' ELSE 'Not Confirmed' END) AS confirm_text," " (CASE WHEN t.flags IN(0,1) THEN 'Not Confirmed' WHEN t.flags=2 THEN 'Confirmed' WHEN t.flags=4 THEN 'Assigned' ELSE 'Unknown' END) AS flag_text," " (CASE WHEN t.service_type=1 THEN 'Laundry' WHEN t.service_type=2 THEN 'Dryclean' ELSE 'Service' END) AS service_type_description" " FROM members_service_request t LEFT JOIN agents a ON a.id=t.agent_id " " WHERE t.member_id= %lu " " ORDER BY t.id DESC LIMIT %lu", in["member_id"].Long(), in["limit"].Long()); 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); long service_id = rec["service_id"].Long(); snprintf(vname, sizeof (vname), "service_date_%05d", i); out[vname] = rec["service_date"]; snprintf(vname, sizeof (vname), "long_date_%05d", i); out[vname] = rec["long_date"]; snprintf(vname, sizeof (vname), "service_id_%05d", i); out[vname] = rec["service_id"]; snprintf(vname, sizeof (vname), "agent_name_%05d", i); out[vname] = rec["agent_name"]; snprintf(vname, sizeof (vname), "status_%05d", i); out[vname] = rec["status"]; snprintf(vname, sizeof (vname), "flags_%05d", i); out[vname] = rec["flags"]; snprintf(vname, sizeof (vname), "from_city_%05d", i); out[vname] = rec["from_city"]; snprintf(vname, sizeof (vname), "quantity_%05d", i); out[vname] = rec["quantity"]; snprintf(vname, sizeof (vname), "confirm_text_%05d", i); out[vname] = rec["confirm_text"]; snprintf(vname, sizeof (vname), "service_fee_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "stype_desc_%05d", i); out[vname] = rec["service_type_description"]; getServiceDetail( service_id, out); snprintf(vname, sizeof (vname), "service_list_detail_%05d", i); out[vname] = out["service_list"]; snprintf(vname, sizeof (vname), "flag_text_%05d", i); out[vname] = rec["flag_text"]; } } ret = PHP_API_OK; out["status"] = "OK"; } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long medTMemberLogin(CVars in, CVars &out)"); } logfmt(FLOG_MAX, "/long medTrMemberTransportList(CVars in, CVars &out)"); return ret; } long getServiceDetail(long service_id, CVars &out) { out["service_list"] = ""; char vname[300]; long ret = 0; int icc=0; ret = load_db_record(out, "SELECT * FROM members_service_request WHERE id = %lu ", service_id); if (ret > 0) { switch (out["service_type"].Long()) { case 1: snprintf(vname, sizeof (vname), "%lu Bag(s)", out["quantity"].Long()); out["service_list"] = vname; out["total_detail_record"] ="1"; break; case 2: const PGresult *res = pgsql_query(" SELECT code,description,price*0.01 AS price,quantity,total*0.01 AS total " " FROM members_service_detail " " WHERE service_id=%lu", service_id); if (res != NULL && pgsql_num_rows(res) > 0) { out["total_detail_record"] = pgsql_num_rows(res); snprintf(vname, sizeof (vname), ""); // clean it up 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); out["lv"] = vname; if (icc > 0) { snprintf(vname, sizeof (vname), "%s, ", out["lv"].c_str()); } out["lv"] = vname; snprintf(vname, sizeof (vname), "%s %lu %s", out["lv"].c_str(), rec["quantity"].Long(), rec["description"].c_str()); icc++; } out["service_list"] = vname; } break; } } return 0; } vector split_string(const char *str, char c = ' ') { vector result; do { const char *begin = str; while(*str != c && *str) str++; result.push_back(string(begin, str)); } while (0 != *str++); return result; } // trim from start (in place) static inline void ltrim(std::string &s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace)))); } // trim from end (in place) static inline void rtrim(std::string &s) { s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(std::isspace))).base(), s.end()); } // trim from both ends (in place) static inline void trim(std::string &s) { ltrim(s); rtrim(s); } // trim from start (copying) static inline std::string ltrim_copy(std::string s) { ltrim(s); return s; } // trim from end (copying) static inline std::string rtrim_copy(std::string s) { rtrim(s); return s; } // trim from both ends (copying) static inline std::string trim_copy(std::string s) { trim(s); return s; } long kleenNewLundryPickUp(CVars in, CVars &out) { CVars k; out = in; long ret = PHP_API_BAD_PARAM; long service_total = 0; long discount_rate = 0; try { logfmt(logINFO, "kleenNewLundryPickUp Start()"); REQ_LONG(in, "pid", 0, -1); REQ_LONG(in, "member_id", 0, -1); REQ_LONG(in, "service_type", 0, -1); REQ_LONG(in, "agent_id", 0, -1); REQ_STRING(in, "service_date", 5, 23, "(.*)"); REQ_LONG(in, "quantity", 0, -1); REQ_LONG(in, "deliverydays", 0, -1); REQ_STRING(in, "deiverytime", 5, 11, "(.*)"); REQ_STRING(in, "service_list", 1, 120, "(.*)"); REQ_STRING(in, "loc", 5, 16, "(.*)"); OPTIONAL(in, "instruction") REQ_STRING(in, "instruction", 1, 100, "(.*)"); //REQ_STRING (in, "sessionid", 4, 40, "(.*)"); OPTIONAL(in, "coupon") REQ_STRING(in, "coupon", 1, 15, "(.*)"); OPTIONAL(in, "discount_rate") REQ_LONG(in, "discount_rate", 0, -1); discount_rate = in["discount_rate"].Long() + 0; const char * loc = getenv("REMOTE_ADDR"); long memberF = 0; logfmt(logINFO, "~~~~~SPLIT_IN1~~~~ MEMBER %lu", memberF); memberF = load_db_record(k, "SELECT *,id AS member_id FROM members WHERE id=%lu ", in["member_id"].Long()); logfmt(logINFO, "~~~~~SPLIT_IN2~~~~ MEMBER %lu", memberF); // memberF = 1; if (memberF > 0) { // LETS CREATE THE REQUEST NOW CVars x; x["pid"] = in["pid"]; x["pid"].set_valid(true); x["service_type"] = in["service_type"]; x["service_type"].set_valid(true); x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["agent_id"] = in["agent_id"]; x["agent_id"].set_valid(true); x["service_type"] = in["service_type"]; x["service_type"].set_valid(true); x["service_date"] = in["service_date"]; x["service_date"].set_valid(true); x["loc"] = loc; x["loc"].set_valid(true); x["quantity"] = in["quantity"]; x["quantity"].set_valid(true); x["deliverydays"] = in["deliverydays"]; x["deliverydays"].set_valid(true); x["deiverytime"] = in["deiverytime"]; x["deiverytime"].set_valid(true); x["coupon"] = in["coupon"]; x["coupon"].set_valid(true); //in["service_list"] = " S01-1@S02-1@S03-1@S04-1@S05-1@S06-4@S07-1@S08-1@S09-1@S10-1@ "; /* I want to spilit int S01 1 S02 2 S03 1 S04 1 S05 1 S06 2 S07 1 S08 1 S09 1 S10 1 INSERT INTO table (SO1, 1) */ out["service_id"] = insert_db_record(DBS_VALID, "members_service_request", "members_service_request_id_seq", x); if (out["service_id"].Long() > 0) { if (in["instruction"].length() > 0) { // let us save instruction to another table } if (x["service_type"].Long() == 2) { // dry clean service now logfmt(FLOG_MAX, "service_list=%s", in["service_list"].c_str()); vector result = split_string(in["service_list"].c_str(), '@'); vector::iterator it; char *key, *val; for (it = result.begin(); it != result.end(); it++) { string item = trim_copy(*it); if (item.empty()) { logfmt(FLOG_MAX, "item is empty"); } else { logfmt(FLOG_MAX, "item=%s", item.c_str()); key = strtok((char *) item.c_str(), "-"); val = strtok(NULL, "-"); logfmt(FLOG_MAX, "key=%s, val=%s", key, val); CVars v; if ( load_db_record(v, "SELECT * FROM dryclean_service WHERE code='%s' ", key) > 0 ) { CVars m; m["member_id"] = in["member_id"]; m["member_id"].set_valid(true); m["service_id"] = out["service_id"]; m["service_id"].set_valid(true); m["code"] = v["code"]; m["code"].set_valid(true); m["description"] = v["description"]; m["description"].set_valid(true); m["price"] = v["price"]; m["price"].set_valid(true); m["quantity"] = val; m["quantity"].set_valid(true); m["total"] = m["quantity"].Long() * v["price"].Long(); m["total"].set_valid(true); out["detail_id"] = insert_db_record(DBS_VALID, "members_service_detail", "members_service_detail_id_seq", m); service_total = m["total"].Long() + service_total; /* id | code | description | price | added ----+------+-------------------+-------+---------------------------- 1 | S01 | Shirt (Laundry) | 160 | 2018-07-19 09:43:21.379297 2 | S02 | Shirt (Dry Clean) | 400 | 2018-07-19 09:43:21.383512 3 | S03 | Shirt (Ladies) | 400 | 2018-07-19 09:43:21.386951 */ } } } } CVars t; if (in["service_type"].Long() == 2) { if (discount_rate < 100) { service_total = service_total * (100 - discount_rate)/100; } t["est_cost"] = service_total; } else { t["est_cost"] = serviceCost(out["service_id"].Long(), discount_rate); } pgsql_query("UPDATE members_service_request SET est_cost = %lu, discount_rate = %lu WHERE id = %lu", t["est_cost"].Long(),discount_rate, out["service_id"].Long()); serviceCost( out["service_id"].Long(),discount_rate ); load_db_record(out, "SELECT * FROM members_service_request WHERE id=%lu ", out["service_id"].Long()); // Now Send Email member_email_calls(in["action"].Long(), out, out); alert_email_calls(in["action"].Long(), out, out); // ============== ret = 100; } } else { } } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long kleenNewLundryPickUp(CVars in, CVars &out)"); } logfmt(logINFO, "/kleenNewLundryPickUp()"); return ret; } long serviceCost(long service_id, long discount_rate) { long service_cost = 0; CVars k; if (load_db_record(k, "SELECT * FROM members_service_request WHERE id=%lu ", service_id) > 0) { if (k["deliverydays"].Long() == 1) { service_cost = (k["quantity"].Long() * 3000 + 1000)*(1.10) *1.03; } else { service_cost = (k["quantity"].Long() * 3000 + 1000) *1.03; } } if (discount_rate < 100) { service_cost = service_cost * (100 - discount_rate)/100; } return service_cost; } // vi:ts=2