// Account management toosl #include "clog.h" #include "cgi.h" #include "input.h" #include "wrenchboard_api.h" #include "contract.h" #include "email.h" #include "payments.h" #include "safestring.h" #include #include "pgsql.h" #include "pgsql_wrapper.h" #include "cfg.h" #include long contract_calls(CVars in, CVars &out) { logfmt( logINFO, "contract_calls()" ); out["result"] = "YES I GET TO BACK END"; long action = REQ_LONG( in, "action", 0, -1); switch( action ) { case WRENCHBOARD_CONTRACT_MESSAGE: return WrenchContractMessage( in, out); break; case WRENCHBOARD_CONTRACT_STATUS: return WrenchContractStatus( in, out); break; case WRENCHBOARD_CONTRACT_MSGLIST: return WrenchContractMessageList( in, out); break; } logfmt( logINFO, "/contract_calls()" ); return 0; } long WrenchContractStatus( CVars in, CVars &out ) { long ret = -1; logfmt( logINFO, "WrenchContractStatus()" ); REQ_LONG( in, "member_id", 1, -1 ); REQ_STRING (in, "contract", 7, 25, "(.*)"); REQ_STRING (in, "contract_uid", 7, 125, "(.*)"); //REQ_LONG( in, "job_id", 1, -1 ); long job_action = REQ_LONG( in, "job_action", 1, -1 ); out["result"] = "Yes i go to this back end"; long extension = 0; logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() job_action == %lu", job_action); long retF = load_db_record( out, "SELECT id AS contract_id FROM members_jobs_contract WHERE contract='%s' AND uid = '%s'",in["contract"].c_str(),in["contract_uid"].c_str()); if (retF){ if ( out["contract_id"].Long() > 0 ){ logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ID found =%lu", out["contract_id"].Long()); } else{ logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ID not found 001" ); return ret; } } else{ logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ID not found 002" ); return ret; } /* 'uid' => '3119b744-42ad-4834-bb83-b737588754ca', 'contract' => 'X2Y9WR5632', 'contract_uid' => '10654dc5-f574-4aa6-b8e6-93b95ac5fcec', 'job_action' => ‘ACCEPT_COMPLETE’, */ in["contract_id"] = out["contract_id"]; in["contract_id"].set_valid( true ); // the email system uses contract_id in["job_contract"] = in["contract"]; in["job_contract"].set_valid( true ); switch( job_action ) { case CONTRACT_NOTIFY_COMPLETE: logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() CONTRACT_NOTIFY_COMPLETE" ); ret = load_db_record( out, "SELECT id AS jobs_contract_id, * FROM members_jobs_contract WHERE status IN (1,2) " " AND contract='%s' AND id=%lu AND client_id =%lu",in["job_contract"].c_str(),in["contract_id"].Long(),in["member_id"].Long() ); logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ret 1 = %lu",ret ); if (ret) { if ( out["jobs_contract_id"].Long() > 0 ){ pgsql_exec("UPDATE members_jobs_contract SET status = %lu,updated=now() WHERE id = %lu",CONTRACT_NOTIFY_COMPLETE, in["contract_id"].Long() ); if ( load_db_record( out, "SELECT * FROM members_jobs_contract " " WHERE status = %lu AND id=%lu AND client_id =%lu",CONTRACT_NOTIFY_COMPLETE,in["contract_id"].Long(),in["member_id"].Long() ) ) { project_email(CONTRACT_NOTIFY_COMPLETE, in, out); out["result"] = "We have notify the task owner of your completion. Expect a response soon"; } } } break; case CONTRACT_REQUEST_CANCEL: logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() CONTRACT_REQUEST_CANCEL" ); ret = load_db_record( out, "SELECT id AS jobs_contract_id,* FROM members_jobs_contract WHERE status IN (1,2) " " AND contract='%s' AND id=%lu AND client_id =%lu",in["job_contract"].c_str(),in["contract_id"].Long(),in["member_id"].Long() ); logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ret 1 = %lu",ret ); if (ret) { if ( out["jobs_contract_id"].Long() > 0 ){ pgsql_exec("UPDATE members_jobs_contract SET status = %lu,updated=now() " " WHERE id = %lu",CONTRACT_REQUEST_CANCEL, in["job_id"].Long() ); if ( load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status = %lu " " AND id=%lu AND client_id =%lu",CONTRACT_REQUEST_CANCEL,in["contract_id"].Long(),in["member_id"].Long() ) ) { project_email(CONTRACT_REQUEST_CANCEL, in, out); out["result"] = "We have notify the task owner of your request for cancellation."; } } } break; case CONTRACT_ACCEPT_COMPLETE: logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() CONTRACT_ACCEPT_COMPLETE" ); ret = load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status = %lu AND contract='%s' AND id=%lu " " AND member_id =%lu",CONTRACT_NOTIFY_COMPLETE,in["job_contract"].c_str(),in["contract_id"].Long(),in["member_id"].Long() ); logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ret 1 = %lu",ret ); if (ret) { pgsql_exec("UPDATE members_jobs_contract SET status = %lu,updated=now() WHERE id = %lu",CONTRACT_ACCEPT_COMPLETE, in["job_id"].Long() ); // make sure the update was done if ( load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status = %lu AND id=%lu " " AND member_id =%lu",CONTRACT_ACCEPT_COMPLETE,in["contract_id"].Long(),in["member_id"].Long() ) ) { //let us do the accounting parts here now CVars y; y["member_id"] = in["member_id"]; // note we are actually paying the client_id y["contract_id"] = in["contract_id"]; y["code"] = "COPAY"; y["dir"] = DIR_TARGET; if ( WrenchContractPayment(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_contract SET updated = now(),payment_date=now() WHERE id = %lu",out["contract_id"].Long()); } else { } //---------------------------------------- project_email(CONTRACT_ACCEPT_COMPLETE, in, out); //USES in["contract_id"] out["result"] = "This task is now complete. We have notified all parties accordingly"; } } break; case CONTRACT_REJECT_COMPLETE: logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() CONTRACT_REJECT_COMPLETE" ); ret = load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status = %lu AND contract='%s' AND id=%lu AND member_id =%lu",CONTRACT_NOTIFY_COMPLETE,in["job_contract"].c_str(),in["contract_id"].Long(),in["member_id"].Long() ); logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ret 1 = %lu",ret ); if (ret) { pgsql_exec("UPDATE members_jobs_contract SET status = %lu,updated=now() WHERE id = %lu",CONTRACT_REJECT_COMPLETE, in["contract_id"].Long() ); // make sure the update was done if ( load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status = %lu AND id=%lu AND member_id =%lu",CONTRACT_REJECT_COMPLETE,in["contract_id"].Long(),in["member_id"].Long() ) ) { project_email(CONTRACT_REJECT_COMPLETE, in, out); out["result"] = "You have rejected that this task is complete. We have notified all parties accordingly"; } } break; case CONTRACT_EXTEND_TIMELINE: logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() CONTRACT_EXTEND_TIMELINE" ); out["result"] = "CONTRACT_EXTEND_TIMELINE"; extension = REQ_LONG( in, "extension", 1, -1 ); ret = load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status IN (1,2) AND contract='%s' AND id=%lu AND member_id =%lu AND delivery_date < now()",in["job_contract"].c_str(),in["contract_id"].Long(),in["member_id"].Long() ); logfmt( logINFO, "~~~~ ~~~~~ WrenchContractStatus() ret 1 = %lu",ret ); if (ret) { pgsql_exec("UPDATE members_jobs_contract SET due_remind = NULL, delivery_date = now() +'%lu days' WHERE status IN (1,2) AND id = %lu AND contract='%s'",extension, in["contract_id"].Long() ,in["job_contract"].c_str()); // make sure the update was done if ( load_db_record( out, "SELECT * FROM members_jobs_contract WHERE id=%lu AND member_id =%lu AND delivery_date > now()",in["contract_id"].Long(),in["member_id"].Long() ) ) { project_email(CONTRACT_EXTEND_TIMELINE, in, out); out["result"] = "We have extended the timeline as requested"; } } break; case CONTRACT_CANCEL_CONTRACT: out["result"] = "CONTRACT_CANCEL_CONTRACT"; ret = load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status IN (1,2) AND delivery_date < now() AND contract='%s' AND id=%lu AND member_id =%lu",in["job_contract"].c_str(),in["contract_id"].Long(),in["member_id"].Long() ); if (ret) { pgsql_exec("UPDATE members_jobs_contract SET status = %lu,updated=now() WHERE id = %lu",CONTRACT_CANCEL_CONTRACT, in["job_id"].Long() ); // make sure the update was done if ( load_db_record( out, "SELECT * FROM members_jobs_contract WHERE status = %lu AND id=%lu AND member_id =%lu",CONTRACT_CANCEL_CONTRACT,in["contract_id"].Long(),in["member_id"].Long() ) ) { //let us do the accounting parts here now CVars y; y["member_id"] = in["member_id"]; // note we are actually paying the client_id y["contract_id"] = in["contract_id"]; y["code"] = "COCNL"; y["dir"] = DIR_TARGET; y["job_status"] = CONTRACT_CANCEL_CONTRACT; if ( WrenchCanceContractPayment(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_contract SET updated = now(),payment_date=now() WHERE id = %lu",out["contract_id"].Long()); } else { } //---------------------------------------- project_email(CONTRACT_CANCEL_CONTRACT, in, out); //USES in["contract_id"] out["result"] = "This task is now complete. We have notified all parties accordingly"; } } break; } //$mysql = "SELECT * FROM members_jobs_contract WHERE contract ='" . $data['job_contract'] . "' AND id =" . $data['job_id']; /* Array ( [member_id] => 3 [proc] => ACCEPTCMP [job_id] => 13 [job_contract] => 7BW9B9R8BB [job_action] => 5 ) #define CONTRACT_NOTIFY_COMPLETE 4 #define CONTRACT_REQUEST_CANCEL 3 #define CONTRACT_ACCEPT_COMPLETE 5 #define CONTRACT_REJECT_COMPLETE 1 */ logfmt( logINFO, "/WrenchContractStatus()" ); return 0; } long WrenchContractMessage( CVars in, CVars &out ) { out["message_sent"] = "0"; /* --- // note thet we did not refrenece members table - this is to ensure that the system can insert items too into the disucssion CREATE TABLE jobs_contract_message ( id SERIAL, member_id INT, contract VARCHAR(25) REFERENCES members_jobs_contract(contract), msg_type VARCHAR(5) NOT NULL, message TEXT, status INT DEFAULT 1, created timestamp without time zone DEFAULT now() ); $msgArray = array(); $msgArray['message'] = trim($this->input->post('jobmessage')); $msgArray['contract'] = $this->input->post('contractId'); $msgArray['msg_type'] = 'TEXT'; $msgArray['member_id'] = $_SESSION['member_id']; // = $ret->email; */ long ret = PHP_API_BAD_PARAM; logfmt( logINFO, "WrenchContractMessage()" ); ULONG message_id = 0; REQ_LONG( in, "member_id", 1, -1 ); REQ_STRING (in, "contract", 10, 25, "(.*)"); REQ_STRING (in, "msg_type", 1, 5, "(.*)"); REQ_STRING (in, "message", 1, 1299, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); in["loc"] = loc; in["loc"].set_valid(true); CVars x; x["member_id"] = in["member_id"]; x["member_id"].set_valid( true ); x["contract"] = in["contract"]; x["contract"].set_valid( true ); x["msg_type"] = in["msg_type"]; x["msg_type"].set_valid( true ); x["message"] = in["message"]; x["message"].set_valid( true ); message_id = insert_db_record( DBS_VALID, "jobs_contract_message", "jobs_contract_message_id_seq", x ); if (message_id) { ret = PHP_CREATED_OK; x["message_id"] = message_id; x["message_id"].set_valid( true ); job_email(JOBS_MESSAGE_ADDED,x,out); load_db_record( out, "SELECT *,id AS message_id FROM jobs_contract_message WHERE id = %lu ", message_id ); out["status"] = "Message Sent"; out["message_sent"] = "200"; } else { out["status"] = "Unable to send message"; } logfmt( logINFO, "/WrenchContractMessage()" ); return ret; } long WrenchContractMessageList( CVars in, CVars &out ) { long ret = PHP_API_BAD_PARAM; logfmt( logINFO, "WrenchContractMessageList()" ); char vname[30]; const char * loc = getenv("REMOTE_ADDR"); in["loc"] = loc; in["loc"].set_valid(true); try { long member_id = REQ_LONG(in, "member_id", 1, -1); REQ_STRING (in, "contract", 10, 25, "(.*)"); out["total_record"] = "0"; const PGresult *res; res = pgsql_query(" SELECT to_char(jc.created, 'YYYY-MM-DD HH24:MI') AS msg_date," " m.firstname AS msg_firstname,jc.id as msg_id,jc.message AS msg," " jc.msg_type, jc.message,jc.member_id AS sender_id, jc.uid AS msg_uid " " FROM jobs_contract_message jc " " LEFT JOIN members m ON m.id=jc.member_id " " WHERE jc.contract='%s' ORDER by jc.id DESC", in["contract"].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_date_%05d", i); out[vname] = rec["msg_date"]; snprintf(vname, sizeof (vname), "msg_firstname_%05d", i); out[vname] = rec["msg_firstname"]; snprintf(vname, sizeof (vname), "msg_id_%05d", i); out[vname] = rec["msg_id"]; snprintf(vname, sizeof (vname), "msg_%05d", i); out[vname] = rec["msg"]; snprintf(vname, sizeof (vname), "msg_type_%05d", i); out[vname] = rec["msg_type"]; snprintf(vname, sizeof (vname), "message_%05d", i); out[vname] = rec["message"]; snprintf(vname, sizeof (vname), "msg_uid_%05d", i); out[vname] = rec["msg_uid"]; snprintf(vname, sizeof (vname), "who_%05d", i); if( rec["sender_id"].Long() == member_id){ out[vname] = "SENDER"; } else{ out[vname] = "RECIPIENT"; } } } ret = PHP_API_OK; out["status"] = "OK"; } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long WrenchContractMessageList(CVars in, CVars &out)"); } logfmt( logINFO, "/WrenchContractMessageList()" ); return ret; } //******************************************************************************