// Account management toosl #include "clog.h" #include "cgi.h" #include "input.h" #include "wrenchboard_api.h" #include "jobs.h" #include "email.h" #include "payments.h" #include "safestring.h" #include #include "common_tool.h" #include "pgsql.h" #include "pgsql_wrapper.h" #include "cfg.h" #include #include "common_tool.h" #include "reco_engine.h" #include "jobs_manager.h" long jobs_calls(CVars in, CVars &out) { logfmt(logINFO, "jobs_calls()"); out["result"] = "YES I GET TO BACK END"; long action = REQ_LONG(in, "action", 0, -1); long job_mode = 0; logfmt(logINFO, "jobs_calls() action=%lu",action); switch (action) { case WRENCHBOARD_JOB_POSTAGREE: return WrenchJobPostAgree(in, out); break; case WRENCHBOARD_JOB_LISTJOBS: return WrenchJobManagerList(in, out); break; case WRENCHBOARD_JOB_JOBFILES: logfmt(logINFO, "jobs_calls() ~~WRENCHBOARD_JOB_JOBFILES~~ action=%lu",action); return WrenchJobListFiles(in, out); break; case WRENCHBOARD_JOB_OFFERS: return WrenchJobManagerOffers(in, out); break; case WRENCHBOARD_JOB_ACTIVE: // return WrenchJobManagerActiveTasksList(in, out); break; case WRENCHBOARD_JOB_USERACTIVE: return WrenchUsersActiveTasksList( in, out); break; case WRENCHBOARD_JOB_REPORT: return WrenchUsersTasksReportList( in, out); break; case WRENCHBOARD_JOB_CREATEJOB: job_mode = REQ_LONG(in, "job_mode", 1, -1); switch(job_mode){ case ADD_JOB: return WrenchCreateJobs(in, out); break; case UPDATE_JOB: return WrenchEditJobs(in, out); break; } break; case WRENCHBOARD_JOB_DELETEJOB: return WrenchDeleteJobs(in, out); break; case WRENCHBOARD_JOB_GROUP_MEMBER: return WrenchAddJobsGroupMember(in, out); break; case WRENCHBOARD_JOB_CREATE_GROUP: return WrenchCreateJobsGroup(in, out); break; case WRENCHBOARD_JOB_DELETE_GROUP: return WrenchDeleteJobsGroup(in, out); break; case WRENCHBOARD_JOB_DELETE_GROUPMEMBER: return WrenchDeleteJobsGroupMember(in, out); break; case WRENCHBOARD_JOB_OFFER_SYSTEM: return WrenchJobOfferSystems(in, out); break; case WRENCHBOARD_JOB_OFFER_FAMILY: break; case WRENCHBOARD_JOB_OFFER_INDVI: return WrenchSendJobsOfferIndividual(in, out); break; case WRENCHBOARD_JOB_OFFER_GROUP: return WrenchSendJobsOfferGroup(in, out); break; case WRENCHBOARD_JOB_OFFER_PUBLIC: return WrenchSendJobsOfferPublic(in, out); break; case WRENCHBOARD_JOB_OFFER_CONCLUDE: return WrenchConcludeJobsOffer(in, out); break; case WRENCHBOARD_JOB_OFFER_INTLIST: return WrenchJobsOfferInterestList(in, out); // people looking at your job break; case WRENCHBOARD_JOB_WAITING_INT: // waiting interest return WrenchUserJobsInterestList(in, out); // me looking at your job break; case WRENCHBOARD_JOB_SEND_INTEREST: return WrenchJobsOfferInterest(in, out); break; case WRENCHBOARD_JOB_STATS_INTEREST: return WrenchJobsInterestStats(in, out); break; case WRENCHBOARD_JOB_PROC_INTEREST: return WrenchJobsProcessInterest(in, out); break; case WRENCHBOARD_JOB_SEND_QUESTION: return WrenchJobsQuestion(in, out); break; case WRENCHBOARD_JOB_MRKTINT_QUEST: return WrenchMarketInterestQuestion(in, out); break; case WRENCHBOARD_JOB_INT_QUESTLST: return WrenchMarketInterestQuestionList(in, out); break; case WRENCHBOARD_JOB_REPLY_QUESTION: return WrenchReplyMessage(in, out); break; case WRENCHBOARD_JOB_EXTEND_EXPIRE: return WrenchJobPostExtendTime(in, out); break; case WRENCHBOARD_JOB_RESEND_MESSAGE: return WrenchJobPostNotifyOffer(in, out); break; case WRENCHBOARD_JOB_CANCEL_OFFER: return WrenchJobPostCancelOffer(in, out); break; case WRENCHBOARD_JOB_JOBGROUPS: // 13045 return WrenchJobsGroupList(in, out); break; case WRENCHBOARD_JOB_JOBGROUPADD: break; } logfmt(logINFO, "/jobs_calls()"); return 0; } long WrenchJobOfferSystems(CVars in, CVars &out){ long ret = PHP_API_BAD_PARAM; try { long assign_mode = REQ_LONG(in, "assign_mode", 1, -1); switch(assign_mode){ case ASSIGN_MODE_MEDIA_FAMILY: logfmt(logINFO, "WrenchJobOfferSystems()->ASSIGN_MODE_MEDIA_FAMILY"); return WrenchSendMediaOfferFamily(in, out); break; case ASSIGN_MODE_FAMILY: logfmt(logINFO, "WrenchJobOfferSystems()->ASSIGN_MODE_FAMILY"); return WrenchSendJobsOfferFamily(in, out); break; case ASSIGN_MODE_CREATEASSIGN: logfmt(logINFO, "WrenchJobOfferSystems()->ASSIGN_MODE_CREATEASSIGN"); return WrenchSendJobsOfferCreateAssign(in, out); break; case ASSIGN_MODE_INDIVIDUAL: logfmt(logINFO, "WrenchJobOfferSystems()->ASSIGN_MODE_INDIVIDUAL"); return WrenchSendJobsOfferPublic(in, out); break; case ASSIGN_MODE_EMAIL: logfmt(logINFO, "WrenchJobOfferSystems()->ASSIGN_MODE_EMAIL"); return WrenchSendJobsOfferIndividual(in, out); break; case ASSIGN_MODE_GROUP: logfmt(logINFO, "WrenchJobOfferSystems()->ASSIGN_MODE_GROUP"); return WrenchSendJobsOfferGroup(in, out); break; } } catch (bad_parameter) { out["log_status"] = "error..."; } return ret; } long WrenchSendJobsOfferCreateAssign(CVars in, CVars &out){ logfmt(logINFO, "******* ~~~~ WrenchSendJobsOfferCreateAssign()"); long ret = PHP_API_BAD_PARAM; try { CVars xx; long member_id = REQ_LONG(in, "member_id", 1, -1); // REQ_LONG(in, "job_id", 1, -1); // REQ_STRING(in, "job_uid", 1, 59, "(.*)"); REQ_STRING(in, "family_uid", 1, 59, "(.*)"); // REQ_STRING(in, "job_description", 1, 5500, "(.*)"); if ( WrenchCreateJobs(in, xx) == PHP_CREATED_OK ){ in["job_id"] = xx["job_id"]; xx["job_id"].set_valid( true ); in["job_uid"] = xx["job_uid"]; xx["job_uid"].set_valid( true ); in["job_description"] = xx["job_detail"]; xx["job_description"].set_valid( true ); // UPDATE THE JOB TO FAMILY MODE - This is a family job pgsql_exec("UPDATE members_jobs SET job_mode = 'FAMILY' WHERE id = %lu AND uid = '%s' ",in["job_id"].Long(), in["job_uid"].c_str()); ret = WrenchSendJobsOfferFamily(in, out); } } catch (bad_parameter) { out["log_status"] = "error..."; } logfmt(logINFO, "/******* ~~~~ WrenchSendJobsOfferCreateAssign()"); return ret; } long WrenchJobPostExtendTime(CVars in, CVars &out){ long ret = PHP_API_BAD_PARAM; try { out["status"] = "Started"; long member_id = REQ_LONG(in, "member_id", 1, -1); long extend_days = REQ_LONG(in, "extend_days", 1, -1); REQ_STRING(in, "job_uid", 1, 55, "(.*)"); //offer_code REQ_STRING(in, "offer_code", 1, 15, "(.*)"); //offer_code const PGresult *res = pgsql_query("SELECT id AS offer_id FROM members_jobs_offer WHERE offer_code = '%s' AND member_id=%lu AND status =1", in["offer_code"].c_str(),member_id); if (res != NULL && pgsql_num_rows(res) > 0) { mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); pgsql_exec("UPDATE members_jobs_offer SET expire = now() + '%lu days()' WHERE offer_code = '%s' AND member_id=%lu AND status =1",extend_days, in["offer_code"].c_str(),member_id); out["status"] = "Completed"; out["status_msg"] = "offer_expiration_data_extended"; load_db_record(out, "SELECT expire, uid AS job_uid FROM members_jobs_offer WHERE offer_code = '%s' ", in["offer_code"].c_str()); ret = PHP_UPDATED_OK; } } } catch (bad_parameter) { out["log_status"] = "error..."; } return ret; } long WrenchJobPostNotifyOffer(CVars in, CVars &out){ long ret = PHP_API_BAD_PARAM; try { out["status"] = "Started"; long member_id = REQ_LONG(in, "member_id", 1, -1); long mode = REQ_LONG(in, "mode", 1, -1); REQ_STRING(in, "job_uid", 1, 55, "(.*)"); //offer_code REQ_STRING(in, "offer_code", 1, 15, "(.*)"); //offer_code const PGresult *res = pgsql_query("SELECT id AS offer_id FROM members_jobs_offer WHERE offer_code = '%s' AND member_id=%lu AND status =1", in["offer_code"].c_str(),member_id); if (res != NULL && pgsql_num_rows(res) > 0) { mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { logfmt(logINFO, "******* ~~~~ WrenchJobPostNotifyOffer()"); job_email(JOBS_OFFER_SENDTOME_MAIL, in, out); // the email will come from out["status"] = "Completed"; out["status_msg"] = "offer_notification_resent"; ret = PHP_UPDATED_OK; } } } catch (bad_parameter) { out["log_status"] = "error..."; } return ret; } long WrenchJobPostCancelOffer(CVars in, CVars &out){ // case OFFER_CANCEL: // note status 4 logfmt(logINFO, "WrenchJobPostCancelOffer()"); long ret = PHP_API_BAD_PARAM; try { REQ_LONG(in, "member_id", 1, -1); //long offer_result = REQ_LONG(in, "offer_result", 1, -1); REQ_STRING(in, "offer_code", 1, 15, "(.*)"); long job_id = 0; long owner_member_id = 0; long offer_id = 0; long rc = 0; CVars outx; // rc = 0 + load_db_record( out, "SELECT * FROM members_jobs_offer WHERE offer_code='%s' AND status = 1", in["offer_code"].c_str() ); const PGresult *res = pgsql_query("SELECT *,member_id AS owner_member_id, id AS offer_id " " FROM members_jobs_offer WHERE offer_code='%s' AND status = 1 AND member_id = %lu", in["offer_code"].c_str(), in["member_id"].Long()); if (res != NULL && pgsql_num_rows(res) > 0) { // now job is valid // good to continue mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); job_id = rec["job_id"]; offer_id = rec["offer_id"]; owner_member_id = rec["owner_member_id"]; } logfmt(logINFO, "WrenchConcludeJobsOffer() rc=OFFER_CANCEL"); if (load_db_record(out, " SELECT id AS offer_id,*,(CASE WHEN payment_id IS NULL THEN 0 ELSE payment_id END ) AS payment_id_val" " FROM members_jobs_offer WHERE offer_code ='%s' AND status = 1", in["offer_code"].c_str())) { // valid load of offer needed CVars y; y["member_id"] = out["member_id"]; y["member_id"].set_valid(true); y["offer_id"] = out["offer_id"]; y["offer_id"].set_valid(true); y["code"] = "OFRFD"; y["code"].set_valid(true); y["dir"] = DIR_SOURCE; y["dir"].set_valid(true); y["payment_id"] = out["payment_id_val"]; y["payment_id"].set_valid(true); // if (WrenchRefundoffer(y, out) == PHP_CREATED_OK) { pgsql_exec("UPDATE members_jobs_offer SET status = 4 WHERE id = %lu AND offer_code='%s' ", offer_id, in["offer_code"].c_str()); // REFUND THE MONEY ret = PHP_CREATED_OK; job_email(JOBS_OFFER_CANCEL_MAIL, y, out); // the email will come from offer table // } } } } catch (bad_parameter) { out["log_status"] = "Error WrenchJobPostCancelOffer"; } logfmt(logINFO, "/WrenchJobPostCancelOffer()"); return ret; } long WrenchJobPostAgree(CVars in, CVars &out) { logfmt(logINFO, "WrenchJobPostAgree()"); long ret = PHP_API_BAD_PARAM; try { long member_id = REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "uid", 1, 500, "(.*)"); //uid if (load_db_record(out, "SELECT id AS member_id, * FROM members WHERE id = %lu AND uid='%s' AND post_jobs IS NULL", in["member_id"].Long(), in["uid"].c_str()) ){ if ( out["member_id"].Long() > 0 ) { pgsql_exec("UPDATE members SET post_jobs = now() WHERE id = %lu AND uid='%s'", member_id, in["uid"].c_str()); load_db_record(out, "SELECT * FROM members WHERE id = %lu AND uid='%s' AND post_jobs IS NOT NULL", in["member_id"].Long(), in["uid"].c_str()); out["status"] = "Completed"; out["advise"] = "Refresh Session Profile"; ret = PHP_CREATED_OK; } else{ load_db_record(out, "SELECT * FROM members WHERE id = %lu AND uid='%s' AND post_jobs IS NOT NULL", in["member_id"].Long(), in["uid"].c_str()); out["advise"] = "Probably Already Set"; out["status"] = "Invalid Update"; } } } catch (bad_parameter) { out["log_status"] = "Error WrenchJobPostAgree"; } logfmt(logINFO, "/WrenchJobPostAgree()"); return ret; } long WrenchUserJobsInterestList(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[30]; out = in; try { long member_id = REQ_LONG(in, "member_id", 1, -1); long offset = REQ_LONG(in, "offset", 1, -1); long limit = REQ_LONG(in, "limit", 1, -1); const PGresult *res = pgsql_query("SELECT mm.id AS client_id, mm.uid AS client_uid,j.uid AS job_uid, " " mm.firstname AS client_name, m.offer_code, m.uid AS offer_uid, " " mo.member_id, mm.added::date AS client_added, to_char(mo.added, 'Dy Mon dd, yyyy HH:MI AM') AS sent, " " j.title,j.description,m.job_id,to_char( m.expire, 'Dy Mon dd, yyyy HH:MI AM') AS expire,j.price AS job_price,mo.uid AS interest_uid, " " c.code AS currency_code, c.description AS currency_description,j.country " " FROM members_offer_interest mo " " LEFT JOIN members_jobs_offer m ON m.id = mo.offer_id " " LEFT JOIN members_jobs j ON j.id=m.job_id " " LEFT JOIN members mm ON mm.id = mo.member_id " " LEFT JOIN currency c ON c.country=j.country " " WHERE m.status = 1 AND m.client_id=0 AND mo.status = 1 " " AND m.expire IS NOT NULL AND m.expire> now() " " AND mo.member_id = %lu AND j.status = 1 " " ORDER BY mo.added DESC LIMIT %lu OFFSET %lu",member_id, limit, offset); 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), "interest_uid_%05d", i); out[vname] = rec["interest_uid"]; snprintf(vname, sizeof (vname), "client_id_%05d", i); out[vname] = rec["client_id"]; snprintf(vname, sizeof (vname), "client_uid_%05d", i); out[vname] = rec["client_uid"]; snprintf(vname, sizeof (vname), "client_name_%05d", i); out[vname] = rec["client_name"]; snprintf(vname, sizeof (vname), "client_added_%05d", i); out[vname] = rec["client_added"]; snprintf(vname, sizeof (vname), "client_jobs_completed_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_jobs_active_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_addedclient_jobs_missed_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_offers_pending_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_percent_completion_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_ratings_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "offer_code_%05d", i); out[vname] = rec["offer_code"]; snprintf(vname, sizeof (vname), "offer_uid_%05d", i); out[vname] = rec["offer_uid"]; snprintf(vname, sizeof (vname), "sent_%05d", i); out[vname] = rec["sent"]; snprintf(vname, sizeof (vname), "title_%05d", i); out[vname] = rec["title"]; snprintf(vname, sizeof (vname), "description_%05d", i); out[vname] = rec["description"]; snprintf(vname, sizeof (vname), "job_id_%05d", i); out[vname] = rec["job_id"]; snprintf(vname, sizeof (vname), "job_uid_%05d", i); out[vname] = rec["job_uid"]; snprintf(vname, sizeof (vname), "expire_%05d", i); out[vname] = rec["expire"]; snprintf(vname, sizeof (vname), "price_%05d", i); out[vname] = rec["job_price"]; snprintf(vname, sizeof (vname), "job_country_%05d", i); out[vname] = rec["country"]; snprintf(vname, sizeof (vname), "currency_%05d", i); out[vname] = rec["currency_description"]; snprintf(vname, sizeof (vname), "currency_code_%05d", i); out[vname] = rec["currency_code"]; } } ret = PHP_CREATED_OK; } catch (bad_parameter) { out["log_status"] = "Error WrenchJobsOfferInterestList"; } return ret; } long WrenchJobsInterestStats(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[30]; float pcnt = 0; //out = in; float x = 0.61; char buf[10]; try { out["job_completed"] = "0"; out["job_active"] = "0"; out["job_percent_complete"] = "0.0 %"; out["job_uncompleted"] = "0"; out["job_rejected"] = "0"; out["job_pending"] = "0"; out["job_last_date"] = "0000-00-00"; REQ_STRING(in, "uid", 1, 95, "(.*)"); //uid REQ_STRING(in, "interest_uid", 1, 95, "(.*)"); //interest_uid REQ_STRING(in, "client_uid", 1, 95, "(.*)"); //client_uid if (load_db_record(out, "SELECT id as client_id FROM members WHERE uid::text = '%s' ", in["client_uid"].c_str())) { load_db_record(out, "SELECT count(id) AS job_pending FROM members_jobs_offer WHERE client_id = %lu AND expire > now()", out["client_id"].Long()); //pending jobs load_db_record(out, "SELECT count(id) job_active FROM members_jobs_contract WHERE client_id = %lu AND delivery_date> now() AND status = 1", out["client_id"].Long()); //job_active load_db_record(out, "SELECT delivery_date::date AS job_last_date FROM members_jobs_contract WHERE client_id = %lu AND status =7 ORDER BY delivery_date DESC LIMIT 1", out["client_id"].Long()); //job_active load_db_record(out, "SELECT count(id) AS job_completed FROM members_jobs_contract WHERE client_id = %lu AND status =7", out["client_id"].Long()); //pending jobs if ( out["job_completed"].Long() > 0 ){ load_db_record(out, "SELECT count(id) AS total_jobs FROM members_jobs_contract WHERE client_id = %lu AND status IN (7,4,5)", out["client_id"].Long()); //pendi logfmt(logINFO, "~~~~~~~~~~~~~ *********** DIR ******************** %d", 100* out["job_completed"].Long() / out["total_jobs"].Long()); sprintf(buf, "%d %", 100* out["job_completed"].Long() / out["total_jobs"].Long()); logfmt(logINFO, "~~~~~~~~~~~~~ *********** Buf ******************** %s", buf); out["job_percent_complete"] = buf; } } // SELECT id as client_id FROM members WHERE uid::text = 'dfc9d601-780f-4d78-839f-422f0928f911'; // SELECT count(id), status FROM members_jobs_contract WHERE client_id = 2 GROUP BY status; ret = PHP_CREATED_OK; } catch (bad_parameter) { out["log_status"] = "Error WrenchJobsInterestStats"; logfmt(logINFO, "/Error WrenchJobsInterestStats "); } return ret; } long WrenchJobsOfferInterestList(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[30]; out = in; try { long member_id = REQ_LONG(in, "member_id", 1, -1); long offset = REQ_LONG(in, "offset", 1, -1); long limit = REQ_LONG(in, "limit", 1, -1); const PGresult *res = pgsql_query("SELECT mm.id AS client_id, mm.uid AS client_uid, j.timeline_days, " " mm.firstname AS client_name, m.offer_code, m.uid AS offer_uid,j.uid AS job_uid, " " mo.member_id, mm.added::date AS client_added, to_char(mo.added, 'Dy Mon dd, yyyy HH:MI AM') AS sent, " " j.title,j.description,m.job_id,to_char( m.expire, 'Dy Mon dd, yyyy HH:MI AM') AS expire,j.price AS job_price,mo.uid AS interest_uid ," " c.code AS currency_code, c.description AS currency_description,j.country " " FROM members_offer_interest mo " " LEFT JOIN members_jobs_offer m ON m.id = mo.offer_id " " LEFT JOIN members_jobs j ON j.id=m.job_id " " LEFT JOIN members mm ON mm.id = mo.member_id " " LEFT JOIN currency c ON c.country=j.country " " WHERE m.status = 1 AND m.client_id=0 AND mo.status = 1 " " AND m.expire IS NOT NULL AND m.expire> now() " " AND m.member_id = %lu AND j.status = 1 " " ORDER BY mo.added DESC LIMIT %lu OFFSET %lu",member_id, limit, offset); 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), "interest_uid_%05d", i); out[vname] = rec["interest_uid"]; snprintf(vname, sizeof (vname), "timeline_days_%05d", i); out[vname] = rec["timeline_days"]; snprintf(vname, sizeof (vname), "client_id_%05d", i); out[vname] = rec["client_id"]; snprintf(vname, sizeof (vname), "client_uid_%05d", i); out[vname] = rec["client_uid"]; snprintf(vname, sizeof (vname), "job_uid_%05d", i); out[vname] = rec["job_uid"]; snprintf(vname, sizeof (vname), "client_name_%05d", i); out[vname] = rec["client_name"]; snprintf(vname, sizeof (vname), "client_added_%05d", i); out[vname] = rec["client_added"]; snprintf(vname, sizeof (vname), "client_jobs_completed_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_jobs_active_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_addedclient_jobs_missed_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_offers_pending_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_percent_completion_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "client_ratings_%05d", i); out[vname] = "0"; snprintf(vname, sizeof (vname), "offer_code_%05d", i); out[vname] = rec["offer_code"]; snprintf(vname, sizeof (vname), "offer_uid_%05d", i); out[vname] = rec["offer_uid"]; snprintf(vname, sizeof (vname), "sent_%05d", i); out[vname] = rec["sent"]; snprintf(vname, sizeof (vname), "title_%05d", i); out[vname] = rec["title"]; snprintf(vname, sizeof (vname), "description_%05d", i); out[vname] = rec["description"]; snprintf(vname, sizeof (vname), "job_id_%05d", i); out[vname] = rec["job_id"]; snprintf(vname, sizeof (vname), "expire_%05d", i); out[vname] = rec["expire"]; snprintf(vname, sizeof (vname), "price_%05d", i); out[vname] = rec["job_price"]; snprintf(vname, sizeof (vname), "job_country_%05d", i); out[vname] = rec["country"]; snprintf(vname, sizeof (vname), "currency_%05d", i); out[vname] = rec["currency_description"]; snprintf(vname, sizeof (vname), "currency_code_%05d", i); out[vname] = rec["currency_code"]; } } ret = PHP_CREATED_OK; } catch (bad_parameter) { out["log_status"] = "Error WrenchJobsOfferInterestList"; logfmt(logINFO, "/Error WrenchJobsOfferInterestList"); } return ret; } long WrenchReplyMessage(CVars in, CVars &out) { long member_id = REQ_LONG(in, "member_id", 1, -1); long message_id = REQ_LONG(in, "message_id", 1, -1); REQ_STRING(in, "yourmessage", 1, 500, "(.*)"); //offer_code REQ_STRING(in, "memo", 1, 15, "(.*)"); //offer_code // read current message if (load_db_record(out, "SELECT * FROM members_messages WHERE id = %lu", in["message_id"].Long())) { CVars x; x["senders_id"] = out["member_id"]; x["senders_id"].set_valid(true); x["member_id"] = out["senders_id"]; x["member_id"].set_valid(true); // note the swap - you are relying x["msg"] = in["yourmessage"]; x["msg"].set_valid(true); x["msg_type"] = out["msg_type"]; x["msg_type"].set_valid(true); x["memo"] = out["memo"]; x["memo"].set_valid(true); long msg_id = insert_db_record(DBS_VALID, "members_messages", "members_messages_id_seq", x); if (msg_id > 0) { pgsql_exec("UPDATE members_messages SET reply = now() WHERE id = %lu", message_id); x["reply_id"] = msg_id; x["reply_id"].set_valid(true); job_email(WRENCHBOARD_JOB_REPLY_QUESTION, x, out); } } logfmt(logINFO, "/WrenchReplyMessage()"); return 0; } /* wrenchboard=> SELECT * FROM members_messages ORDER BY id DESC LIMIT 3; id | member_id | added | msg | status | senders_id | msg_type | memo | reply | uid -----+-----------+----------------------------+----------------------------------------------------------+--------+------------+----------+------------+-------+-------------------------------------- 172 | 4 | 2023-06-23 15:15:36.499482 | YES YES YES YES 1 2 3 4 5 6 67 7 7 5 5 5 5 5 5 76 7 7 7 | 1 | 1 | MRKTINT | R17BX6RW87 | | b30d993f-c92f-42c6-b272-d76c86e5789b 171 | 4 | 2023-06-23 15:12:53.640241 | I am testing today again | 1 | 1 | MRKTINT | R17BX6RW87 | | c7da1200-489c-47ac-923c-adfd6136dc4f 170 | 4 | 2023-06-21 12:09:38.378594 | Testing this | 1 | 1 | MRKTINT | R17BX6RW87 | | 342e13b7-809d-4d1a-882d-8db6e35a8703 (3 rows) wrenchboard=> */ long WrenchMarketInterestQuestionList(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[30]; out = in; try { out["status"] = "0"; long member_id = REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "offer_uid", 1, 55, "(.*)"); REQ_STRING(in, "interest_uid", 1, 55, "(.*)"); const PGresult *res = pgsql_query("SELECT moi.offer_id,mjo.offer_code,mm.* " "FROM members_offer_interest moi " "LEFT JOIN members_jobs_offer mjo ON mjo.id=moi.offer_id " "LEFT JOIN members_messages mm ON mm.memo=mjo.offer_code " "WHERE moi.uid = '%s' ", in["interest_uid"].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), "msg_uid_%05d", i); out[vname] = rec["uid"]; snprintf(vname, sizeof (vname), "added_%05d", i); out[vname] = rec["added"]; snprintf(vname, sizeof (vname), "msg_%05d", i); out[vname] = rec["msg"]; } } ret = PHP_API_OK; out["status"] = "OK"; } catch (bad_parameter) { out["log_status"] = "Error WrenchMarketInterestQuestionList"; } return ret; } long WrenchMarketInterestQuestion(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; out = in; try { out["status"] = "0"; long member_id = REQ_LONG(in, "member_id", 1, -1); //long interest_id = REQ_LONG(in, "interest_id", 1, -1); REQ_STRING(in, "offer_uid", 1, 55, "(.*)"); REQ_STRING(in, "interest_uid", 1, 55, "(.*)"); REQ_STRING(in, "yourmessage", 1, 500, "(.*)"); //offer_code //REQ_STRING(in, "offer_code", 1, 15, "(.*)"); //offer_code REQ_STRING(in, "msg_type", 1, 15, "(.*)"); //msg_type const PGresult *res = pgsql_query("SELECT o.*,o.member_id AS client_id,jo.offer_code " " FROM members_offer_interest o " " LEFT JOIN members_jobs_offer jo ON jo.id=o.offer_id WHERE jo.uid='%s' AND o.uid='%s'", in["offer_uid"].c_str(), in["interest_uid"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); out = rec; CVars x; x["senders_id"] = in["member_id"]; x["member_id"].set_valid(true); x["msg"] = in["yourmessage"]; x["msg"].set_valid(true); x["msg_type"] = "MRKTINT"; x["msg_type"].set_valid(true); x["member_id"] = out["member_id"]; x["member_id"].set_valid(true); x["memo"] = rec["offer_code"]; x["memo"].set_valid(true); long msg_id = insert_db_record(DBS_VALID, "members_messages", "members_messages_id_seq", x); if (msg_id > 0) { x["msg_id"] = msg_id; x["msg_id"].set_valid(true); x["offer_id"] = out["offer_id"]; x["offer_id"].set_valid(true); job_email(WRENCHBOARD_JOB_MRKTINT_QUEST, x, out); } // out["client_id"] = x["member_id"]; } } ret = PHP_CREATED_OK; } catch (bad_parameter) { out["log_status"] = "Error WrenchMarketInterestQuestion"; } return ret; } long WrenchJobsQuestion(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; //out = in; try { out["status"] = "Started"; long member_id = REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "yourmessage", 1, 500, "(.*)"); //offer_code REQ_STRING(in, "offer_code", 1, 15, "(.*)"); //offer_code REQ_STRING(in, "msg_type", 1, 15, "(.*)"); //msg_type const PGresult *res = pgsql_query("SELECT * FROM members_jobs_offer WHERE offer_code = '%s'", in["offer_code"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); out = rec; CVars x; x["senders_id"] = in["member_id"]; x["member_id"].set_valid(true); x["msg"] = in["yourmessage"]; x["msg"].set_valid(true); x["msg_type"] = "JOB"; x["msg_type"].set_valid(true); x["member_id"] = out["member_id"]; x["member_id"].set_valid(true); x["memo"] = in["offer_code"]; x["memo"].set_valid(true); long msg_id = insert_db_record(DBS_VALID, "members_messages", "members_messages_id_seq", x); if (msg_id > 0) { x["status"] = "Sent"; x["msg_id"] = msg_id; x["msg_id"].set_valid(true); //x["offer_id"] = out["offer_id"]; //x["offer_id"].set_valid(true); job_email(WRENCHBOARD_JOB_SEND_QUESTION, x, out); } else{ x["status"] = "Error"; } out = x; //out["status"] = ""; } } ret = PHP_CREATED_OK; } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } return ret; } /* id | integer | not null default nextval('members_messages_id_seq'::regclass) member_id | integer | added | timestamp without time zone | default now() msg | text | status | integer | default 1 senders_id | integer | Indexes: "members_messages_id_key" action : 13034 client_uid : "43c766d9-403d-4125-9983-63c21960b187" member_id : "1" offer_code : "XWT8B7W377" offer_uid : "10088dc3-c1ed-4782-808c-ae64940d3405" proc : "ACCEPT" sessionid : "800EDEE8AECA96EDAE0380537F5DE4546032B0709CD8FDA1BBAF5CAC0BF2ED1E" uid : "3119b744-42ad-4834-bb83-b737588754ca" */ long WrenchJobsProcessInterest(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; out = in; out["status"] = "Recieved"; REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "client_uid", 1, 55, "(.*)"); REQ_STRING(in, "offer_uid", 1, 55, "(.*)"); long interest = REQ_LONG(in, "interest", 1, -1); const PGresult *res0 = pgsql_query("SELECT mo.id AS interest_id, mo.*,mm.uid,jo.uid " " FROM members_offer_interest mo " " LEFT JOIN members mm ON mm.id= mo.member_id " " LEFT JOIN members_jobs_offer jo ON jo.id=mo.offer_id " " WHERE mm.uid = '%s' AND jo.uid='%s' ",in["client_uid"].c_str(),in["offer_uid"].c_str() ); if (res0 != NULL && pgsql_num_rows(res0) > 0) { mapf = pgsql_fetch_assoc(res0, 0); if (!f.empty()) { CVars rec1; map_to_cvars(f, rec1); in = rec1; } }else { out["status"] = "Not found."; return ret; } long interest_id = REQ_LONG(in, "interest_id", 1, -1); //REQ_STRING (in, "offer_code", 1, 15, "(.*)"); //offer_code if (interest == JOB_INTEREST_ACCEPT || interest == JOB_INTEREST_REJECT || interest == JOB_INTEREST_CANCEL) { // is job still valid const PGresult *res = pgsql_query("SELECT mi.id,mi.member_id AS job_interest_client_id, mo.*,mo.id AS offer_id " " FROM members_offer_interest mi LEFT JOIN members_jobs_offer mo ON mo.id=mi.offer_id " " WHERE mo.status IN (1,4) AND mi.status=1 AND mi.id = %lu", in["interest_id"].Long()); if (res != NULL && pgsql_num_rows(res) > 0) { mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); out = rec; load_db_record(out, "SELECT email FROM members WHERE id = %lu", rec["job_interest_client_id"].Long()); if (interest == JOB_INTEREST_ACCEPT) { /* $in["job_id"] = $jobID; $in["email"] = $email; $in["job_description"] = $descr; $in['member_id'] = $_SESSION['member_id']; // var_dump($in); $in['action'] = WRENCHBOARD_JOB_OFFER_INDVI; */ CVars x; x["job_id"] = rec["job_id"]; x["job_id"].set_valid(true); x["email"] = out["email"]; x["email"].set_valid(true); x["job_description"] = out["job_description"]; x["job_description"].set_valid(true); x["member_id"] = out["member_id"]; x["member_id"].set_valid(true); ret = WrenchSendJobsOfferIndividual(x, out); if (ret == PHP_CREATED_OK) { pgsql_exec("UPDATE members_offer_interest SET status = 5 WHERE status=1 AND id = %lu", interest_id); } } if (interest == JOB_INTEREST_REJECT) { pgsql_exec("UPDATE members_offer_interest SET status = 3 WHERE status=1 AND id = %lu", interest_id); // Implement emails latter ret = PHP_CREATED_OK; } if (interest == JOB_INTEREST_CANCEL) { pgsql_exec("UPDATE members_offer_interest SET status = 3 WHERE status=1 AND id = %lu", interest_id); // Implement emails latter pgsql_exec("UPDATE members_jobs_offer SET status = 3 WHERE status = 1 AND payment_id IS NULL AND id = %lu", rec["offer_id"].Long()); ret = PHP_CREATED_OK; } } } else { out["status"] = "Invalid Task Status"; } } return ret; } long WrenchJobsOfferInterest(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; out = in; REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "offer_code", 1, 15, "(.*)"); //offer_code const PGresult *res = pgsql_query("SELECT *,id as offer_id FROM members_jobs_offer WHERE offer_code ='%s' AND expire>= now() AND status = 1 AND public_view > 0", in["offer_code"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); out = rec; if (rec["member_id"] == in["member_id"]) { out["status"] = "You cannot accept your job"; return ret; } const PGresult *res1 = pgsql_query("SELECT * FROM members_offer_interest WHERE offer_id =%lu AND member_id = %lu AND status IN(1,5)", rec["offer_id"].Long(), in["member_id"].Long()); if (res1 != NULL && pgsql_num_rows(res1) > 0) { out["status"] = "You have sent or completed a request for this task already."; return ret; } CVars x; x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["offer_id"] = rec["offer_id"]; x["offer_id"].set_valid(true); long interest_id = insert_db_record(DBS_VALID, "members_offer_interest", "members_offer_interest_id_seq", x); if (interest_id > 0) { out["status"] = "Offer interest sent"; ret = PHP_CREATED_OK; x["interest_id"] = interest_id; x["interest_id"].set_valid(true); job_email(JOBS_OFFER_INTEREST_MAIL, x, out); // note I need interest_id to } } } //out["status"] = "Yes from backend"; return ret; } long WrenchConcludeJobsOffer(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; try { REQ_LONG(in, "member_id", 1, -1); long offer_result = REQ_LONG(in, "offer_result", 1, -1); REQ_STRING(in, "offer_code", 1, 15, "(.*)"); long job_id = 0; long owner_member_id = 0; long offer_id = 0; long rc = 0; CVars outx; // rc = 0 + load_db_record( out, "SELECT * FROM members_jobs_offer WHERE offer_code='%s' AND status = 1", in["offer_code"].c_str() ); const PGresult *res = pgsql_query("SELECT *,member_id AS owner_member_id, id AS offer_id FROM members_jobs_offer WHERE offer_code='%s' AND status = 1", in["offer_code"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { // now job is valid // good to continue mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); job_id = rec["job_id"]; offer_id = rec["offer_id"]; owner_member_id = rec["owner_member_id"]; } if( offer_result == OFFER_RESEND){ if (load_db_record(outx, "SELECT o.id AS offer_id, o.*,to_char(o.expire, 'Day Mon dd, yyyy HH:MI AM') AS expire2,j.title,j.description,j.timeline_days,j.price FROM members_jobs_offer o LEFT JOIN members_jobs j ON j.id =o.job_id WHERE o.offer_code='%s' AND o.email IS NOT NULL", in["offer_code"].c_str())) { job_email(JOBS_INDIVIDUAL_OFFER_MAIL, outx, out); // make sure job went to individual out["result"] = "OK"; } return PHP_CREATED_OK; } load_db_record(out, "SELECT jo.member_id AS owner_member_id,jo.id AS offer_id, j.id AS job_id,jo.added::date AS added_date,j.title,j.description, j.timeline_days, j.price,jo.offer_code,jo.job_description,jo.expire FROM members_jobs_offer jo LEFT JOIN members_jobs j ON j.id = jo.job_id WHERE jo.expire > now() AND jo.status = 1 AND jo.client_id = %lu AND jo.offer_code='%s'", in["member_id"].Long(), in["offer_code"].c_str()); in["offer_id"] = out["offer_id"]; in["offer_id"].set_valid(true); CVars x; const char * loc = getenv("REMOTE_ADDR"); long contract_id = 0; switch (offer_result) { case OFFER_EXTEND: logfmt(logINFO, "WrenchConcludeJobsOffer() rc=OFFER_EXTEND"); // You can only extend your jobs only if( load_db_record(outx, "SELECT id AS offer_id,* FROM members_jobs_offer WHERE offer_code='%s' AND status = 1 AND member_id=%lu", in["offer_code"].c_str(),in["member_id"].Long()) ){ pgsql_exec("UPDATE members_jobs_offer SET expire = expire +'7 days' WHERE id = %lu AND offer_code='%s' ", outx["offer_id"].Long(), outx["offer_code"].c_str()); } break; case OFFER_SENDTOME: job_email(JOBS_OFFER_SENDTOME_MAIL, in, out); // the email will come from break; case OFFER_ACCEPT: x["job_id"] = job_id; x["job_id"].set_valid(true); x["contract"] = in["offer_code"]; x["contract"].set_valid(true); x["member_id"] = owner_member_id; //out["owner_member_id"]; x["member_id"].set_valid(true); // this is the owner of the job - from job database read x["client_id"] = in["member_id"]; x["client_id"].set_valid(true); // be care full, you are the client accepting job x["title"] = out["title"]; x["title"].set_valid(true); x["description"] = out["description"]; x["description"].set_valid(true); x["job_detail"] = out["job_description"]; x["job_detail"].set_valid(true); x["price"] = out["price"]; x["price"].set_valid(true); x["timeline_days"] = out["timeline_days"]; x["timeline_days"].set_valid(true); x["loc"] = loc; x["loc"].set_valid(true); //x[""] = out[""]; x[""].set_valid( true ); contract_id = insert_db_record(DBS_VALID, "members_jobs_contract", "members_jobs_contract_id_seq", x); if (contract_id > 0) { in["contract_id"] = contract_id; in["contract_id"].set_valid(true); pgsql_exec("UPDATE members_jobs_contract SET delivery_date = now() +'%lu days' WHERE id = %lu", x["timeline_days"].Long(), contract_id); pgsql_exec("UPDATE members_jobs_offer SET status = 5 WHERE id = %lu AND offer_code='%s' ", offer_id, in["offer_code"].c_str()); pgsql_exec("UPDATE members_payments SET what_contract = %lu WHERE what_offer = %lu ", contract_id, offer_id); job_email(JOBS_OFFER_ACCEPT_MAIL, in, out); // note the email will come from contract table now } break; case OFFER_REJECT: // note status= 3 logfmt(logINFO, "WrenchConcludeJobsOffer() rc=OFFER_REJECT"); if (load_db_record(out, " SELECT id AS offer_id,* FROM members_jobs_offer WHERE offer_code ='%s' AND status = 1", in["offer_code"].c_str())) { // valid load of offer needed CVars y; y["member_id"] = out["member_id"]; y["member_id"].set_valid(true); y["offer_id"] = out["offer_id"]; y["offer_id"].set_valid(true); y["code"] = "OFRFD"; y["code"].set_valid(true); y["dir"] = DIR_SOURCE; y["dir"].set_valid(true); y["payment_id"] = out["payment_id"]; y["payment_id"].set_valid(true); if (WrenchRefundoffer(y, out) == PHP_CREATED_OK) { pgsql_exec("UPDATE members_jobs_offer SET status = 3 WHERE id = %lu AND offer_code='%s' ", offer_id, in["offer_code"].c_str()); // REFUND THE MONEY job_email(JOBS_OFFER_REJECT_MAIL, in, out); // the email will come from offer table } } break; case OFFER_CANCEL: // note status 4 logfmt(logINFO, "WrenchConcludeJobsOffer() rc=OFFER_CANCEL"); if (load_db_record(out, " SELECT id AS offer_id,*,(CASE WHEN payment_id IS NULL THEN 0 ELSE payment_id END ) AS payment_id_val FROM members_jobs_offer WHERE offer_code ='%s' AND status = 1", in["offer_code"].c_str())) { // valid load of offer needed CVars y; y["member_id"] = out["member_id"]; y["member_id"].set_valid(true); y["offer_id"] = out["offer_id"]; y["offer_id"].set_valid(true); y["code"] = "OFRFD"; y["code"].set_valid(true); y["dir"] = DIR_SOURCE; y["dir"].set_valid(true); y["payment_id"] = out["payment_id_val"]; y["payment_id"].set_valid(true); if (WrenchRefundoffer(y, out) == PHP_CREATED_OK) { pgsql_exec("UPDATE members_jobs_offer SET status = 4 WHERE id = %lu AND offer_code='%s' ", offer_id, in["offer_code"].c_str()); // REFUND THE MONEY job_email(JOBS_OFFER_CANCEL_MAIL, y, out); // the email will come from offer table } } break; case OFFER_EXPIRE: // note status 4 case OFFER_NOREFU: logfmt(logINFO, "WrenchConcludeJobsOffer() rc=OFFER_EXPIRE"); if (load_db_record(out, "SELECT id AS offer_id,* FROM members_jobs_offer WHERE offer_code ='%s' AND status = 1", in["offer_code"].c_str())) { // valid load of offer needed CVars y; y["member_id"] = out["member_id"]; y["member_id"].set_valid(true); y["offer_id"] = out["offer_id"]; y["offer_id"].set_valid(true); y["code"] = "OFRFD"; y["code"].set_valid(true); y["dir"] = DIR_SOURCE; y["dir"].set_valid(true); y["payment_id"] = out["payment_id"]; y["payment_id"].set_valid(true); if ( offer_result == OFFER_EXPIRE){ if (WrenchRefundoffer(y, out) == PHP_CREATED_OK) { pgsql_exec("UPDATE members_jobs_offer SET status = 4 WHERE id = %lu AND offer_code='%s' ", offer_id, in["offer_code"].c_str()); // REFUND THE MONEY //job_email(JOBS_OFFER_CANCEL_MAIL, in, out); // the email will come from offer table } } if ( offer_result == OFFER_NOREFU){ if (WrenchZeroRefundOffer(y, out) == PHP_CREATED_OK) { logfmt(logINFO, "********* NO REFUND ************* NO REFUND WrenchConcludeJobsOffer() rc=FOUND"); pgsql_exec("UPDATE members_jobs_offer SET status = 4 WHERE id = %lu AND offer_code='%s' ", offer_id, in["offer_code"].c_str()); } } // if (WrenchRefundoffer(y, out) == PHP_CREATED_OK) { // pgsql_exec("UPDATE members_jobs_offer SET status = 4 WHERE id = %lu AND offer_code='%s' ", offer_id, in["offer_code"].c_str()); // // REFUND THE MONEY // //job_email(JOBS_OFFER_CANCEL_MAIL, in, out); // the email will come from offer table // } } break; } logfmt(logINFO, "WrenchConcludeJobsOffer() rc=FOUND"); out["result"] = "OK"; } else { out["result"] = "Invalid Offer..."; logfmt(logINFO, "WrenchConcludeJobsOffer() rc=NOT FOUND"); } // check if the offer is still valid // set up the work as active // if work is rejected, refund the member balance // send message to client_id // send message to the member // alert wrench board of work //pgsql_exec("UPDATE members_job_group SET status = 0 WHERE status = 1 AND member_id = %lu AND id = %lu",in["member_id"].Long(),in["group_id"].Long()); ret = PHP_CREATED_OK; } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } return ret; } long WrenchSendMediaOfferFamily(CVars in, CVars &out) { logfmt(logINFO, "ENTER WrenchJobOfferSystems()->WrenchSendMediaOfferFamily"); long ret = PHP_API_BAD_PARAM; // logfmt(logINFO, "WrenchSendMediaOfferFamily()"); long member_id = REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "uid", 1, 59, "(.*)"); REQ_STRING(in, "media_uid", 1, 59, "(.*)"); REQ_STRING(in, "family_uid", 1, 59, "(.*)"); REQ_STRING(in, "job_description", 1, 5500, "(.*)"); long amount = REQ_LONG(in, "amount", 1, -1); REQ_LONG(in, "timeline_days", 1, -1); REQ_STRING(in, "currency", 2, 4, "(.*)"); long job_id = 0; srand((unsigned) time(NULL)); int r = rand(); in["offer_code"] = 10000000 * r*r; in["offer_code"].set_valid(true); long offer_id = 0; out = in; in["client_id"] = "0"; CVars x; CVars y; CVars u; CVars z; CVars kx; CVars xy; CVars xout; bool family_found = false; try { // let us use this email to see if this already a user on the system if (load_db_record(out, "SELECT family_member_id AS client_id FROM members_family WHERE member_id = %lu AND uid='%s';",member_id, in["family_uid"].c_str())) { in["client_id"] = out["client_id"]; // overidding if account is found if (out["client_id"].length() > 0) { x["client_id"] = in["client_id"]; x["client_id"].set_valid(true); family_found = true; } } if (family_found == false){ out["status"] = "Family not Found...."; return ret; } // we need this job id if (load_db_record(y, " SELECT * FROM common_media WHERE uid ='%s'", in["media_uid"].c_str())) { // valid load of job needed } else { out["status"] = "Unable to create offer"; return ret; } load_db_record(u,"SELECT code AS currency FROM currency WHERE country = '%s'", in["currency"].c_str() ); logfmt(logINFO, " The Currency code = %s", u["currency"].c_str()); long wallet_id = CheckWallet( in["member_id"].Long() , u); logfmt(logINFO, " The wallet_id = %lu", wallet_id); if (in["client_id"].Long() == in["member_id"].Long()) { out["status"] = "Unable to create offer"; return ret; } // same client and member not allowed if (in["amount"].Long() > 0) { } else { out["status"] = "Unable to create offer"; return ret; } // no price zero for job on this path // Now do you have money to do this .... z["balance"] = "0"; z["balance"].set_valid(true); // just initialize it if (load_db_record(z, " SELECT * FROM members_wallet WHERE id =%lu AND member_id =%lu AND amount >= %lu",wallet_id, in["member_id"].Long(), in["amount"].Long())) { } else { out["status"] = "Insufficient balance to create this offer"; logfmt(logINFO, "Price2 = %lu Balance = %lu", in["amount"].Long(), z["amount"].Long()); } //*************************************** const char * loc = getenv("REMOTE_ADDR"); logfmt(logINFO, "ENTER WrenchJobOfferSystems()->DATA for hidden Job"); kx["member_id"] = in["member_id"]; kx["member_id"].set_valid(true); kx["title"] = y["title"]; kx["title"].set_valid(true); kx["price"] = in["amount"]; kx["price"].set_valid(true); kx["timeline_days"] = in["timeline_days"]; kx["timeline_days"].set_valid(true); kx["description"] = y["description"]; kx["description"].set_valid(true); kx["loc"] = loc; kx["loc"].set_valid(true); kx["job_detail"] = in["job_description"]; kx["job_detail"].set_valid(true); //country added kx["country"] = in["currency"]; // currency in the input data kx["country"].set_valid(true); kx["job_type"] = "MEDIA"; kx["job_type"].set_valid(true); kx["media_uid"] = in["media_uid"]; kx["media_uid"].set_valid(true); kx["status"] ="77"; // need the job to be hidden , data needed for payment systems kx["status"].set_valid(true); logfmt(logINFO, "ENTER WrenchJobOfferSystems()->DATA for hidden Job -- Ready"); job_id = insert_db_record(DBS_VALID, "members_jobs", "members_jobs_id_seq", kx); logfmt(logINFO, "ENTER WrenchJobOfferSystems()->DATA for hidden Job Inserted job_id = %lu",job_id); if (job_id) { } //*************************************** // we re ready to create the offer now x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["job_id"] = job_id; x["job_id"].set_valid(true); x["media_uid"] = in["media_uid"]; x["media_uid"].set_valid(true); x["job_description"] = in["job_description"]; x["job_description"].set_valid(true); x["offer_code"] = in["offer_code"]; x["offer_code"].set_valid(true); x["loc"] = loc; x["loc"].set_valid(true); offer_id = insert_db_record(DBS_VALID, "members_jobs_offer", "members_jobs_offer_id_seq", x); if (offer_id > 0) { CVars y; y["member_id"] = x["member_id"]; y["offer_id"] = offer_id; y["code"] = "OFDPS"; y["dir"] = DIR_TARGET; if (WrenchOfferPayment(y, out) == PHP_CREATED_OK) { // if you reserve pauments char offer_code[15] = ""; GetOfferCode(offer_id, offer_code, sizeof (offer_code)); // this stamp the offer code directly in that call pgsql_exec("UPDATE members_jobs_offer SET expire = now() + '2 day',payment_id=%lu WHERE id = %lu", out["payment_id"].Long(), offer_id); // date of expiration will be dynamic latter ret = PHP_CREATED_OK; x["offer_id"] = offer_id; x["offer_id"].set_valid(true); job_email(JOBS_INDIVIDUAL_OFFER_MAIL, x, out); load_db_record(out, "SELECT *,id AS offer_id FROM members_jobs_offer WHERE id = %lu ", offer_id); out["status"] = "Offer sent to recipient"; recommendation_engine(RECOMMEND_OFFERS , y, out); // trigger the card interaction in apps if ( load_db_record(xy, "SELECT mj.client_id AS member_id, m.uid AS member_uid " " FROM members_jobs_offer mj " " LEFT JOIN members m ON m.id = mj.client_id " " WHERE mj.id = %lu ",offer_id ) > 0 ){ xy["msg"] = "You have a task to start !"; xy["msg"].set_valid(true); plan_notification(xy, xout); } } else { out["error_msg"] = "error_unable_to_create_fund_for_task"; out["status"] = "Unable to create this offer"; } } else { out["status"] = "Unable to create offer"; } } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } logfmt(logINFO, "/WrenchSendMediaOfferFamily()"); return ret; } long WrenchSendJobsOfferFamily(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "WrenchSendJobsOfferFamily()"); long member_id = REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "job_id", 1, -1); REQ_STRING(in, "job_uid", 1, 59, "(.*)"); REQ_STRING(in, "family_uid", 1, 59, "(.*)"); REQ_STRING(in, "job_description", 1, 5500, "(.*)"); srand((unsigned) time(NULL)); int r = rand(); in["offer_code"] = 10000000 * r*r; in["offer_code"].set_valid(true); long offer_id = 0; out = in; /* 'member_id' => int 1 'sessionid' => string 'DFD8812B9A3ABE7FCF920B71A22AA3E93BB9F9C33AE22E90AAC47537367B2E2B' (length=64) 'uid' => string '3119b744-42ad-4834-bb83-b737588754ca' (length=36) 'job_id' => string '98' (length=2) 'job_uid' => string '473d3239-ecd7-4eb5-859c-78261720cb8e' (length=36) 'family_uid' => string 'a24f1193-7885-4c26-afac-3e5ad744ef40' (length=36) 'job_description' => string 'Nitetronic Z6 Anti Snoring Pillow, Best Snore Stopper Device, Clinically Proven Snoring Solution for Snorers, Smart Stop Snoring Technology Suitable for All Sleepers' (length=165) 'action' => int 13025 'assign_mode' => int 110011 CREATE TABLE members_jobs_offer ( id SERIAL, offer_code varchar(15) UNIQUE NOT NULL, member_id INT REFERENCES members(id), client_id INT DEFAULT 0, group_id INT DEFAULT 0, job_id INT REFERENCES members_jobs(id), email varchar(50), job_description varchar(500), status integer DEFAULT 1, sent_count integer DEFAULT 0, added timestamp without time zone DEFAULT now() ); */ in["client_id"] = "0"; CVars x; CVars y; CVars u; CVars z; CVars xy; CVars xout; bool family_found = false; try { // let us use this email to see if this already a user on the system if (load_db_record(out, "SELECT family_member_id AS client_id FROM members_family WHERE member_id = %lu AND uid='%s';",member_id, in["family_uid"].c_str())) { in["client_id"] = out["client_id"]; // overidding if account is found if (out["client_id"].length() > 0) { x["client_id"] = in["client_id"]; x["client_id"].set_valid(true); family_found = true; } } if (family_found == false){ out["status"] = "Family not Found...."; return ret; } // we need this job id if (load_db_record(y, " SELECT * FROM members_jobs WHERE id =%lu", in["job_id"].Long())) { // valid load of job needed } else { out["status"] = "Unable to create offer"; return ret; } load_db_record(u,"SELECT code AS currency FROM currency WHERE country = '%s'", y["country"].c_str() ); logfmt(logINFO, " The Currency code = %s", u["currency"].c_str()); long wallet_id = CheckWallet( in["member_id"].Long() , u); logfmt(logINFO, " The wallet_id = %lu", wallet_id); if (in["client_id"].Long() == in["member_id"].Long()) { out["status"] = "Unable to create offer"; return ret; } // same client and member not allowed if (y["price"].Long() > 0) { } else { out["status"] = "Unable to create offer"; return ret; } // no price zero for job on this path // Now do you have money to do this .... z["balance"] = "0"; z["balance"].set_valid(true); // just initialize it if (load_db_record(z, " SELECT * FROM members_wallet WHERE id =%lu AND member_id =%lu AND amount >= %lu",wallet_id, in["member_id"].Long(), y["price"].Long())) { } else { out["status"] = "Insufficient balance to create this offer"; logfmt(logINFO, "Price2 = %lu Balance = %lu", y["price"].Long(), z["amount"].Long()); } // we re ready to create the offer now x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["job_id"] = in["job_id"]; x["job_id"].set_valid(true); x["email"] = in["email"]; x["email"].set_valid(true); x["job_description"] = in["job_description"]; x["job_description"].set_valid(true); x["offer_code"] = in["offer_code"]; x["offer_code"].set_valid(true); const char * loc = getenv("REMOTE_ADDR"); x["loc"] = loc; x["loc"].set_valid(true); offer_id = insert_db_record(DBS_VALID, "members_jobs_offer", "members_jobs_offer_id_seq", x); if (offer_id > 0) { CVars y; y["member_id"] = x["member_id"]; y["offer_id"] = offer_id; y["code"] = "OFDPS"; y["dir"] = DIR_TARGET; if (WrenchOfferPayment(y, out) == PHP_CREATED_OK) { // if you reserve pauments char offer_code[15] = ""; GetOfferCode(offer_id, offer_code, sizeof (offer_code)); // this stamp the offer code directly in that call pgsql_exec("UPDATE members_jobs_offer SET expire = now() + '1 day',payment_id=%lu WHERE id = %lu", out["payment_id"].Long(), offer_id); // date of expiration will be dynamic latter ret = PHP_CREATED_OK; x["offer_id"] = offer_id; x["offer_id"].set_valid(true); job_email(JOBS_INDIVIDUAL_OFFER_MAIL, x, out); load_db_record(out, "SELECT *,id AS offer_id FROM members_jobs_offer WHERE id = %lu ", offer_id); out["status"] = "Offer sent to recipient"; recommendation_engine(RECOMMEND_OFFERS , y, out); // trigger the card interaction in apps if ( load_db_record(xy, "SELECT mj.client_id AS member_id, m.uid AS member_uid " " FROM members_jobs_offer mj " " LEFT JOIN members m ON m.id = mj.client_id " " WHERE mj.id = %lu ",offer_id ) > 0 ){ xy["msg"] = "You have a task to start !"; xy["msg"].set_valid(true); plan_notification(xy, xout); } } else { out["error_msg"] = "error_unable_to_create_fund_for_task"; out["status"] = "Unable to create this offer"; } } else { out["status"] = "Unable to create offer"; } } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } logfmt(logINFO, "/WrenchSendJobsOfferFamily()"); return ret; } long WrenchSendJobsOfferIndividual(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "WrenchSendJobsOfferIndividual()"); REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "job_id", 1, -1); REQ_STRING(in, "email", 1, 59, "(.*)"); REQ_STRING(in, "job_description", 1, 5500, "(.*)"); srand((unsigned) time(NULL)); int r = rand(); in["offer_code"] = 10000000 * r*r; in["offer_code"].set_valid(true); long offer_id = 0; out = in; in["client_id"] = "0"; CVars x; CVars y; CVars u; CVars z; try { // let us use this email to see if this already a user on the system if (load_db_record(out, " SELECT username,id AS client_id FROM members WHERE LOWER(username) =LOWER(TRIM('%s'));", in["email"].c_str())) { in["client_id"] = out["client_id"]; // overiddind if account is found if (out["client_id"].length() > 0) { x["client_id"] = in["client_id"]; x["client_id"].set_valid(true); } } // we need this job id if (load_db_record(y, " SELECT * FROM members_jobs WHERE id =%lu", in["job_id"].Long())) { // valid load of job needed } else { out["status_msg"] = "Job not found"; out["status"] = "Unable to create offer"; return ret; } load_db_record(u,"SELECT code AS currency FROM currency WHERE country = '%s'", y["country"].c_str() ); logfmt(logINFO, " The Currency code = %s", u["currency"].c_str()); long wallet_id = CheckWallet( in["member_id"].Long() , u); logfmt(logINFO, " The wallet_id = %lu", wallet_id); if (in["client_id"].Long() == in["member_id"].Long()) { out["status_msg"] = "You cannot send job to yourself"; out["status"] = "Unable to create offer"; return ret; } // same client and member not allowed if (y["price"].Long() > 0) { } else { out["status_msg"] = "Price cannot be zero"; out["status"] = "Unable to create offer"; return ret; } // no price zero for job on this path // Now do you have money to do this .... z["balance"] = "0"; z["balance"].set_valid(true); // just initialize it if (load_db_record(z, " SELECT * FROM members_wallet WHERE id =%lu AND member_id =%lu AND amount >= %lu",wallet_id, in["member_id"].Long(), y["price"].Long())) { } else { out["status"] = "Insufficient balance to create this offer"; logfmt(logINFO, "Price2 = %lu Balance = %lu", y["price"].Long(), z["amount"].Long()); return ret; } // we re ready to create the offer now x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["job_id"] = in["job_id"]; x["job_id"].set_valid(true); x["email"] = in["email"]; x["email"].set_valid(true); x["job_description"] = in["job_description"]; x["job_description"].set_valid(true); x["offer_code"] = in["offer_code"]; x["offer_code"].set_valid(true); const char * loc = getenv("REMOTE_ADDR"); x["loc"] = loc; x["loc"].set_valid(true); offer_id = insert_db_record(DBS_VALID, "members_jobs_offer", "members_jobs_offer_id_seq", x); if (offer_id > 0) { CVars y; y["member_id"] = x["member_id"]; y["offer_id"] = offer_id; y["code"] = "OFDPS"; y["dir"] = DIR_TARGET; if (WrenchOfferPayment(y, out) == PHP_CREATED_OK) { // if you reserve pauments char offer_code[15] = ""; GetOfferCode(offer_id, offer_code, sizeof (offer_code)); // this stamp the offer code directly in that call pgsql_exec("UPDATE members_jobs_offer SET expire = now() + '1 day',payment_id=%lu WHERE id = %lu", out["payment_id"].Long(), offer_id); // date of expiration will be dynamic latter ret = PHP_CREATED_OK; x["offer_id"] = offer_id; x["offer_id"].set_valid(true); job_email(JOBS_INDIVIDUAL_OFFER_MAIL, x, out); load_db_record(out, "SELECT *,id AS offer_id FROM members_jobs_offer WHERE id = %lu ", offer_id); out["status"] = "Offer sent to recipient"; recommendation_engine(RECOMMEND_OFFERS , y, out); // trigger the card interaction in apps CVars xy; if ( load_db_record(xy, "SELECT id AS member_id, uid AS member_uid, 'alert.svg' AS icon " " FROM members WHERE LOWER(username) = LOWER('%s') ",in["email"].c_str()) > 0 ){ xy["msg"] = "You have received a new offer !!!"; xy["msg"].set_valid(true); plan_notification(xy, out); } } else { out["error_msg"] = "error_unable_to_create_fund_for_task"; out["status"] = "Unable to create this offer"; } } else { out["status"] = "Unable to create offer"; } } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } logfmt(logINFO, "/WrenchSendJobsOfferIndividual()"); return ret; } long WrenchSendJobsOfferPublic(CVars in, CVars &out) { logfmt(logINFO, "WrenchSendJobsOfferPublic()"); long ret = PHP_API_BAD_PARAM; REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "job_id", 1, -1); REQ_LONG(in, "duration", 1, -1); //REQ_STRING (in, "email", 1, 59, "(.*)"); REQ_STRING(in, "job_description", 1, 5500, "(.*)"); srand((unsigned) time(NULL)); int r = rand(); in["offer_code"] = 10000000 * r*r; long offer_id = 0; out = in; CVars x; CVars y; CVars z; CVars u; // we need this job id if (load_db_record(y, " SELECT * FROM members_jobs WHERE id =%lu", in["job_id"].Long())) { // valid load of job needed } else { out["status"] = "Unable to create offer"; return ret; } load_db_record(u,"SELECT code AS currency FROM currency WHERE country = '%s'", y["country"].c_str() ); logfmt(logINFO, " The Currency code = %s", u["currency"].c_str()); long wallet_id = CheckWallet( in["member_id"].Long() , u); logfmt(logINFO, " The wallet_id = %lu", wallet_id); if (y["price"].Long() > 0) { } else { out["status"] = "Unable to create offer"; return ret; } // no price zero for job on this path // Now do you have money to do this .... z["balance"] = "0"; z["balance"].set_valid(true); // just initialize it if (load_db_record(z, " SELECT * FROM members_wallet WHERE id =%lu AND member_id =%lu AND amount >= %lu",wallet_id, in["member_id"].Long(), y["price"].Long())) { } else { out["status"] = "Insufficient balance to create this offer"; logfmt(logINFO, "Price2 = %lu Balance = %lu", y["price"].Long(), z["amount"].Long()); } if (y["price"].Long() >= z["amount"].Long()) { out["status"] = "Insufficient balance to create this offer"; logfmt(logINFO, "Price = %lu Balance = %lu", y["price"].Long(), z["amount"].Long()); return ret; } logfmt(logINFO, "Price = %lu Balance = %lu", y["price"].Long(), z["amount"].Long()); try { x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["job_id"] = in["job_id"]; x["job_id"].set_valid(true); x["group_id"] = "0"; x["group_id"].set_valid(true); x["client_id"] = "0"; x["client_id"].set_valid(true); x["job_description"] = in["job_description"]; x["job_description"].set_valid(true); x["offer_code"] = in["offer_code"]; x["offer_code"].set_valid(true); x["depend_uid"] = in["depend_uid"]; x["depend_uid"].set_valid(true); x["strict_timeline"] = in["strict_timeline"]; x["strict_timeline"].set_valid(true); if ( x["depend_uid"] != ""){ logfmt(logINFO, "****** Let us confirm this job is in the market === > %s", x["depend_uid"].c_str()); const PGresult *resF = pgsql_query(" SELECT c.public_view,c.expire,c.job_id " " FROM members_jobs_offer c " " LEFT JOIN members_jobs j ON j.id = c.job_id " " WHERE c.public_view = 1 and c.expire> now() AND j.uid::text ='%s' ", x["depend_uid"].c_str()); if (resF != NULL && pgsql_num_rows(resF) > 0) { logfmt(logINFO, "ALL Good ****** Let us confirm this job is in the market === > %s", x["depend_uid"].c_str()); } else{ out["status"] = "Depended task must be active in the market"; return ret; } } const char * loc = getenv("REMOTE_ADDR"); x["loc"] = loc; x["loc"].set_valid(true); offer_id = insert_db_record(DBS_VALID, "members_jobs_offer", "members_jobs_offer_id_seq", x); if (offer_id > 0) { char offer_code[15] = ""; GetOfferCode(offer_id, offer_code, sizeof (offer_code)); // this stamp the offer code directly in that call pgsql_exec("UPDATE members_jobs_offer SET expire = now() + '%lu day',public_view=1 WHERE id = %lu", in["duration"].Long(), offer_id); ret = PHP_CREATED_OK; x["offer_id"] = offer_id; x["offer_id"].set_valid(true); job_email(JOBS_GROUP_OFFER_PUBLIC, x, out); load_db_record(out, "SELECT *,id AS offer_id FROM members_jobs_offer WHERE id = %lu ", offer_id); out["status"] = "Offer sent to recipient"; } else { out["status"] = "Unanble to create offer"; } } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } logfmt(logINFO, "/WrenchSendJobsOfferPublic()"); return ret; } long WrenchSendJobsOfferGroup(CVars in, CVars &out) { logfmt(logINFO, "WrenchSendJobsOfferGroup()"); long ret = PHP_API_BAD_PARAM; long sum_ret = 0; REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "job_id", 1, -1); REQ_LONG(in, "group_id", 1, -1); //REQ_STRING (in, "email", 1, 59, "(.*)"); REQ_STRING(in, "job_description", 1, 5000, "(.*)"); long bypass = REQ_LONG(in, "bypass", 1, -1); srand((unsigned) time(NULL)); int r = rand(); in["offer_code"] = 10000000 * r*r; long offer_id = 0; out = in; CVars x; CVars y; CVars z; CVars u; long total_member = 0; load_db_record(out, "SELECT count(id) AS m_count " " FROM members_job_groupmember " " WHERE group_id = %lu AND member_id= %lu", in["group_id"].Long(), in["member_id"].Long()); // valid load of job needed total_member = out["m_count"].Long() + 0; if (total_member == 0) { out["status"] = "Empty members in group"; out["status_message"] = "cannot_send_offer_to_empty_group"; return ret; } // we need this job id // make sure job is valid if (load_db_record(y, " SELECT * FROM members_jobs " " WHERE id =%lu AND status = 1", in["job_id"].Long())) { // valid load of job needed } else { out["status"] = "Unable to create offer"; out["status_message"] = "cannot_find_valid_offer"; return ret; } load_db_record(u,"SELECT code AS currency FROM currency WHERE country = '%s'", y["country"].c_str() ); logfmt(logINFO, " The Currency code = %s", u["currency"].c_str()); long wallet_id = CheckWallet( in["member_id"].Long() , u); logfmt(logINFO, " The wallet_id = %lu", wallet_id); if (y["price"].Long() > 0) { } else { out["status"] = "Unable to create offer"; return ret; } // no price zero for job on this path // Now do you have money to do this .... z["balance"] = "0"; z["balance"].set_valid(true); // just initialize it if (load_db_record(z, " SELECT * FROM members_wallet WHERE id =%lu " " AND member_id =%lu AND amount >= %lu",wallet_id, in["member_id"].Long(), y["price"].Long())) { } else { out["status"] = "Insufficient balance to create this offer"; logfmt(logINFO, "Price2 = %lu Balance = %lu", y["price"].Long(), z["balance"].Long()); } if (y["price"].Long() >= z["amount"].Long()) { out["status"] = "Insufficient balance to create this offer"; logfmt(logINFO, "Price = %lu Balance = %lu", y["price"].Long(), z["balance"].Long()); return ret; } logfmt(logINFO, "Price = %lu Balance = %lu", y["price"].Long() * total_member, z["amount"].Long()); if (total_member > 2 && bypass == 0 ){ // REQ_LONG(in, "member_id", 1, -1); // REQ_LONG(in, "job_id", 1, -1); // REQ_LONG(in, "group_id", 1, -1); // //REQ_STRING (in, "email", 1, 59, "(.*)"); // REQ_STRING(in, "job_description", 1, 5000, "(.*)"); CVars jj; jj["member_id"] = in["member_id"]; jj["member_id"].set_valid( true ); jj["job_id"] = in["job_id"]; jj["job_id"].set_valid( true ); jj["group_id"] = in["group_id"]; jj["group_id"].set_valid( true ); jj["job_description"] = in["job_description"]; jj["job_description"].set_valid( true ); jj["total_member"] = total_member; jj["total_member"].set_valid( true ); out["planned_offer_id"] = insert_db_record(DBS_VALID, "group_offer_schedule", "group_offer_schedule_id_seq", jj); out["status_msg"] = "Offer is scheduled to be sent in few minutes"; ret = PHP_CREATED_OK; return ret; } try { const PGresult *res = pgsql_query("SELECT email FROM members_job_groupmember " " WHERE group_id = %lu " " AND member_id = %lu " " AND status=1", in["group_id"].Long(), in["member_id"].Long()); if (res != NULL && pgsql_num_rows(res) > 0) { 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); rec["job_id"] = in["job_id"]; rec["job_id"].set_valid(true); rec["job_description"] = in["job_description"]; rec["job_description"].set_valid(true); rec["member_id"] = in["member_id"]; rec["member_id"].set_valid(true); long call_ret = WrenchSendJobsOfferIndividual(rec, out); sum_ret = sum_ret + call_ret; // a way to know all came back positive if (call_ret == PHP_CREATED_OK) { ret = PHP_CREATED_OK; } } if (ret == PHP_CREATED_OK && sum_ret == 0 ) { out["status_msg"] = "Completed"; ret = PHP_CREATED_OK; } else{ out["status_msg"] = "Completed"; ret = sum_ret; } } } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } logfmt(logINFO, "/WrenchSendJobsOfferGroup()"); return ret; } long WrenchJobsGroupList(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; char vname[30]; CVars rec; out = in; try { long member_id = REQ_LONG(in, "member_id", 1, -1); // long offset = REQ_LONG(in, "offset", 1, -1); // long limit = REQ_LONG(in, "limit", 1, -1); const PGresult *res = pgsql_query("SELECT * FROM members_job_group " " WHERE member_id= %lu AND status = 1 " " ORDER BY group_name ASC",member_id); 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; map_to_cvars(f, rec); snprintf(vname, sizeof (vname), "group_uid_%05d", i); out[vname] = rec["uid"]; snprintf(vname, sizeof (vname), "group_id_%05d", i); out[vname] = rec["id"]; snprintf(vname, sizeof (vname), "group_name_%05d", i); out[vname] = rec["group_name"]; } } const PGresult *res1 = pgsql_query("SELECT * FROM members_job_groupmember " " WHERE member_id= %lu AND status =1",member_id); if (res1 != NULL && pgsql_num_rows(res1) > 0) { out["gm_total_record"] = pgsql_num_rows(res1); for (int i = 0, n = pgsql_num_rows(res1); i < n; i++) { mapf = pgsql_fetch_assoc(res1, i); if (f.empty()) continue; map_to_cvars(f, rec); snprintf(vname, sizeof (vname), "gm_uid_%05d", i); out[vname] = rec["uid"]; snprintf(vname, sizeof (vname), "gm_group_id_%05d", i); out[vname] = rec["group_id"]; snprintf(vname, sizeof (vname), "gm_firstname_%05d", i); out[vname] = rec["firstname"]; snprintf(vname, sizeof (vname), "gm_lastname_%05d", i); out[vname] = rec["lastname"]; snprintf(vname, sizeof (vname), "gm_email_%05d", i); out[vname] = rec["email"]; } } /* wrenchboard=> SELECT group_id,count(id) FROM members_job_groupmember WHERE member_id = 1 GROUP BY group_id; group_id | count ----------+------- 10 | 1 1 | 1 4 | 1 (3 rows) wrenchboard=> */ const PGresult *res2 = pgsql_query("SELECT group_id,count(id) AS group_count " " FROM members_job_groupmember WHERE member_id = %lu GROUP BY group_id",member_id); if (res2 != NULL && pgsql_num_rows(res2) > 0) { for (int i = 0, n = pgsql_num_rows(res2); i < n; i++) { mapf = pgsql_fetch_assoc(res2, i); if (f.empty()) continue; map_to_cvars(f, rec); snprintf(vname, sizeof (vname), "group_count_id_%d", rec["group_id"].Long()); out[vname] = rec["group_count"]; } } ret = PHP_API_OK; } catch (bad_parameter) { out["log_status"] = "Error WrenchJobsGroupList"; } return ret; } long WrenchDeleteJobsGroup(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; try { REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "group_id", 1, -1); pgsql_exec("UPDATE members_job_group SET status = 0 WHERE status = 1 AND member_id = %lu AND id = %lu", in["member_id"].Long(), in["group_id"].Long()); ret = PHP_CREATED_OK; out["result"] = "OK"; //#include "common_tool.h" CVars xx, yy; xx["member_id"] = in["member_id"]; xx["member_id"].set_valid( true ); xx["title"] = "A job was deleted"; xx["title"].set_valid( true ); xx["description"] = "A job was deleted"; xx["description"].set_valid( true ); WrenchLogRecent(xx, yy); } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } return ret; } long WrenchDeleteJobsGroupMember(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; try { REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "group_id", 1, -1); REQ_LONG(in, "group_member_id", 1, -1); pgsql_exec("UPDATE members_job_groupmember SET status = 0 WHERE status = 1 AND member_id = %lu AND group_id = %lu AND id = %lu", in["member_id"].Long(), in["group_id"].Long(), in["group_member_id"].Long()); ret = PHP_CREATED_OK; out["result"] = "OK"; } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } return ret; } long WrenchCreateJobsGroup(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "WrenchCreateJobsGroup()"); ULONG group_id = 0; REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "group_name", 1, 29, "(.*)"); CVars x; try { if (load_db_record(out, "SELECT count(id) AS duplicate_name FROM members_job_group WHERE LOWER(group_name)=LOWER('%s') AND member_id =%lu AND status = 1", in["group_name"].c_str(), in["member_id"].Long())) { if (out["duplicate_name"].Long() > 0) { out["error_status_message"] = "Duplicate Name"; return PHP_API_BAD_PARAM; } // return no duplicate on any active name } // this action blocks out duplicate x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["group_name"] = in["group_name"]; x["group_name"].set_valid(true); const char * loc = getenv("REMOTE_ADDR"); x["loc"] = loc; x["loc"].set_valid(true); group_id = insert_db_record(DBS_VALID, "members_job_group", "members_job_group_id_seq", x); if (group_id > 0) { ret = PHP_CREATED_OK; x["group_id"] = group_id; x["group_id"].set_valid(true); //JobAddedMail(x); load_db_record(out, "SELECT *,id AS group_id FROM members_job_group WHERE id = %lu ", group_id); } else { out["status"] = "Unable to create job group"; } } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } return ret; } long WrenchAddJobsGroupMember(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "WrenchAddJobsGroupMember()"); ULONG group_member_id = 0; REQ_LONG(in, "group_id", 1, -1); REQ_LONG(in, "member_id", 1, -1); REQ_STRING(in, "firstname", 1, 29, "(.*)"); REQ_STRING(in, "lastname", 1, 29, "(.*)"); REQ_STRING(in, "email", 1, 149, "(.*)"); CVars x; try { x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["group_id"] = in["group_id"]; x["group_id"].set_valid(true); x["firstname"] = in["firstname"]; x["firstname"].set_valid(true); x["lastname"] = in["lastname"]; x["lastname"].set_valid(true); x["email"] = in["email"]; x["email"].set_valid(true); const char * loc = getenv("REMOTE_ADDR"); x["loc"] = loc; x["loc"].set_valid(true); group_member_id = insert_db_record(DBS_VALID, "members_job_groupmember", "members_job_groupmember_id_seq", x); if (group_member_id > 0) { ret = PHP_CREATED_OK; x["group_member_id"] = group_member_id; x["group_member_id"].set_valid(true); //JobAddedMail(x); load_db_record(out, "SELECT *,id AS group_member_id FROM members_job_groupmember WHERE id = %lu AND member_id = %lu ", group_member_id, in["member_id"].Long()); } else { out["status"] = "Uanble to create job group member"; } } catch (bad_parameter) { out["log_status"] = "Invalid Log Action"; } return ret; } long WrenchDeleteJobs(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; long member_id = REQ_LONG(in, "member_id", 1, -1); long job_id = REQ_LONG(in, "job_id", 1, -1); REQ_STRING(in, "job_uid", 15, 149, "(.*)"); const PGresult *res = pgsql_query("SELECT *,id AS job_id FROM members_jobs WHERE id = %lu AND member_id = %lu AND uid='%s'", job_id, member_id,in["job_uid"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { pgsql_exec("UPDATE members_jobs SET status = 0 WHERE status = 1 AND id = %lu AND member_id = %lu AND uid='%s'", job_id, member_id,in["job_uid"].c_str()); ret = PHP_CREATED_OK; out["status"] = "Job/Task Deleted"; } else { out["status"] = "Valid Job/Task Not Found"; } return ret; } long WrenchCreateJobs(CVars in, CVars &out) { long ret = PHP_API_BAD_PARAM; logfmt(logINFO, "WrenchCreateJobs()"); ULONG job_id = 0; REQ_LONG(in, "member_id", 1, -1); REQ_LONG(in, "price", 1, -1); REQ_LONG(in, "timeline_days", 1, -1); REQ_STRING(in, "title", 5, 149, "(.*)"); REQ_STRING(in, "country", 2, 3, "(.*)"); REQ_STRING(in, "description", 5, 299, "(.*)"); REQ_STRING (in, "job_detail", 4, 1440, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); in["loc"] = loc; in["loc"].set_valid(true); if (in["price"].Long()<=0){ out["status"] = "Unable to create job, price cannot be zero"; return ret; } CVars x; x["member_id"] = in["member_id"]; x["member_id"].set_valid(true); x["title"] = in["title"]; x["title"].set_valid(true); x["price"] = in["price"]; x["price"].set_valid(true); x["timeline_days"] = in["timeline_days"]; x["timeline_days"].set_valid(true); x["description"] = in["description"]; x["description"].set_valid(true); x["loc"] = in["loc"]; x["loc"].set_valid(true); x["job_detail"] = in["job_detail"]; x["job_detail"].set_valid(true); //country added x["country"] = in["country"]; x["country"].set_valid(true); x["category"] = in["category"]; x["category"].set_valid(true); x["banner"] = in["banner"]; x["banner"].set_valid(true); x["depend_uid"] = in["depend_uid"]; x["depend_uid"].set_valid(true); job_id = insert_db_record(DBS_VALID, "members_jobs", "members_jobs_id_seq", x); if (job_id) { ret = PHP_CREATED_OK; x["job_id"] = job_id; x["job_id"].set_valid(true); JobAddedMail(x); load_db_record(out, "SELECT *,id AS job_id, uid AS job_uid FROM members_jobs WHERE id = %lu ", job_id); CVars xxx, yy; xxx["member_id"] = in["member_id"]; xxx["member_id"].set_valid( true ); xxx["title"] = "A job was created"; xxx["title"].set_valid( true ); xxx["description"] = "Added a new job"; xxx["description"].set_valid( true ); WrenchLogRecent(xxx, yy); } else { out["status"] = "Unable to create job"; } logfmt(logINFO, "/WrenchCreateJobs()"); return ret; } long WrenchEditJobs(CVars in, CVars &out) { logfmt(logINFO, "WrenchEditJobs()"); long ret = PHP_API_BAD_PARAM; ULONG job_id = 0; long member_id = REQ_LONG(in, "member_id", 1, -1); job_id = REQ_LONG(in, "job_id", 1, -1); REQ_STRING(in, "job_uid", 15, 149, "(.*)"); REQ_LONG(in, "timeline_days", 1, -1); REQ_STRING(in, "title", 5, 149, "(.*)"); REQ_STRING(in, "description", 5, 299, "(.*)"); REQ_STRING (in, "job_detail", 4, 1440, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); in["loc"] = loc; in["loc"].set_valid(true); if (in["price"].Long()<=0){ out["status"] = "Unable to update job, price cannot be zero"; return ret; } const PGresult *res = pgsql_query("SELECT *,id AS job_id FROM members_jobs WHERE id = %lu AND member_id = %lu AND uid='%s'", job_id, member_id,in["job_uid"].c_str()); if (res != NULL && pgsql_num_rows(res) > 0) { // good to continue mapf = pgsql_fetch_assoc(res, 0); if (!f.empty()) { CVars rec; map_to_cvars(f, rec); job_id = rec["job_id"]; } } else { out["status"] = "Valid Job/Task Not Found"; return ret; } CVars x; x["title"] = in["title"]; x["title"].set_valid(true); x["price"] = in["price"]; x["price"].set_valid(true); x["timeline_days"] = in["timeline_days"]; x["timeline_days"].set_valid(true); x["description"] = in["description"]; x["description"].set_valid(true); x["loc"] = in["loc"]; x["loc"].set_valid(true); x["job_detail"] = in["job_detail"]; x["job_detail"].set_valid(true); x["category"] = in["category"]; x["category"].set_valid(true); if ( in["banner"] != ""){ x["banner"] = in["banner"]; x["banner"].set_valid(true); } // job_id = insert_db_record(DBS_VALID, "members_jobs", "members_jobs_id_seq", x); if (job_id> 0) { update_db_record(DBS_VALID, "members_jobs", x, job_id) ; load_db_record(out, "SELECT *,id AS job_id FROM members_jobs WHERE id = %lu ", job_id); ret = PHP_UPDATED_OK; CVars xxx, yy; xxx["member_id"] = in["member_id"]; xxx["member_id"].set_valid( true ); xxx["title"] = "A job was updated"; xxx["title"].set_valid( true ); xxx["description"] = "A job was updated"; xxx["description"].set_valid( true ); WrenchLogRecent(xxx, yy); } else { out["status"] = "Unable to create job"; } logfmt(logINFO, "/WrenchEditJobs()"); return ret; } //****************************************************************************** /* vi:ts=2 */