Files
WrenchBoradWeb/wrenchboard/src/shared_tool/family_acc.cc
T
2024-07-23 12:11:16 -04:00

1382 lines
54 KiB
C++

#include "clog.h"
#include "cgi.h"
#include "input.h"
#include "wrenchboard_api.h"
#include "reco_engine.h" //error in file name
#include "email.h"
#include "safestring.h"
#include <string>
#include <iostream>
#include <cstdlib>
#include "pgsql.h"
#include "pgsql_wrapper.h"
#include <curl/curl.h>
#include "account.h"
#include "cards.h"
#include "twilo.h"
#include "mobile.h"
#include "jobs_manager.h"
#include "family_acc.h"
#include "common_tool.h"
#include "account.h"
#include "payments.h"
long WrenchFamilyList(CVars in, CVars &out);
long WrenchFamilyWallet(CVars in, CVars &out);
long WrenchFamilyAdd(CVars in, CVars &out);
long WrenchFamilyUpdate(CVars in, CVars &out);
long WrenchFamilyManage(CVars in, CVars &out);
long WrenchSampleTasks(CVars in, CVars &out);
long WrenchSuggestTasks(CVars in, CVars &out);
long WrenchSuggestList(CVars in, CVars &out);
long WrenchSuggestWaitingList(CVars in, CVars &out);
long WrenchSuggestTaskStatus(CVars in, CVars &out);
long WrenchFamilyTransferStart(CVars in, CVars &out);
long WrenchFamilyTransfer(CVars in, CVars &out);
long WrenchFamilyTransferHx(CVars in, CVars &out);
long WrenchFamilyInvite(CVars in, CVars &out);
long WrenchFamilyInviteList(CVars in, CVars &out);
long WrenchRelativesKidsEdit(CVars in, CVars &out);
long WrenchRelativesSettings(CVars in, CVars &out);
long WrenchRelativesReminder(CVars in, CVars &out);
long family_calls(CVars in, CVars &out){
logfmt(logINFO, "family_calls()");
out["result"] = "YES I GET TO BACK END";
long action = REQ_LONG(in, "action", 0, -1);
CVars x;
long ret = 0;
const char * loc = getenv("REMOTE_ADDR");
const PGresult *res;
logfmt(logINFO, "action = %ld", action);
switch (action) {
case WRENCHBOARD_FAMILY_LIST:
return WrenchFamilyList(in, out);
break;
case WRENCHBOARD_FAMILY_WALLET:
return WrenchFamilyWallet(in, out);
break;
case WRENCHBOARD_FAMILY_TRANSFERSTART:
return WrenchFamilyTransferStart(in, out);
break;
case WRENCHBOARD_FAMILY_TRANSFERHX:
return WrenchFamilyTransferHx(in, out);
break;
case WRENCHBOARD_FAMILY_TRANSFER:
return WrenchFamilyTransfer(in, out);
break;
case WRENCHBOARD_FAMILY_SAMPLETASKS:
return WrenchSampleTasks(in, out);
break;
case WRENCHBOARD_FAMILY_SGGESTSTATUS:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_FAMILY_SGGESTTASKS");
return WrenchSuggestTaskStatus(in, out);
break;
case WRENCHBOARD_FAMILY_ADD:
return WrenchFamilyAdd(in, out);
break;
case WRENCHBOARD_FAMILY_UPDATE:
return WrenchFamilyUpdate(in, out);
break;
case WRENCHBOARD_FAMILY_MANAGE:
return WrenchFamilyManage(in, out);
break;
case WRENCHBOARD_FAMILY_SGGESTTASKS:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_FAMILY_SGGESTTASKS");
return WrenchSuggestTasks(in, out);
break;
case WRENCHBOARD_FAMILY_SGGESTLIST:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_FAMILY_SGGESTLIST");
return WrenchSuggestList(in, out);
break;
//long WrenchSuggestWaitingList(CVars in, CVars &out)
case WRENCHBOARD_FAMILY_SGGESTWAITING:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_FAMILY_SGGESTWAITING");
return WrenchSuggestWaitingList(in, out); // this now the parent
break;
case WRENCHBOARD_FAMILY_RELINVITE:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_FAMILY_RELINVITE");
return WrenchFamilyInvite(in, out);
break;
case WRENCHBOARD_FAMILY_RELLIST:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_FAMILY_RELLIST");
return WrenchFamilyInviteList(in, out);
break;
case WRENCHBOARD_RELATIVES_SETTINGS:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_RELATIVES_SETTINGS");
return WrenchRelativesSettings(in, out);
break;
case WRENCHBOARD_RELATIVES_EDITKIDS:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_RELATIVES_SETTINGS");
return WrenchRelativesKidsEdit(in, out);
return 0;
break;
case WRENCHBOARD_RELATIVES_REMINDER:
logfmt(logINFO, "ENTER CALL long WRENCHBOARD_RELATIVES_SETTINGS");
return WrenchRelativesReminder(in, out);
return 0;
break;
}
return 0;
}
long WrenchRelativesReminder(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchRelativesReminder");
char vname[30];
long ret = PHP_API_BAD_PARAM;
long relative_kid_id = 0;
const PGresult *res;
CVars xx;
try{
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "relative_uid", 3, 150, "(.*)");
out["total_kid"] ="0";
load_db_record(out, "SELECT id AS member_id FROM members WHERE uid::text = '%s' ", in["uid"].c_str());
if ( out["member_id"].Long() > 0)
{
load_db_record(out, "SELECT id AS relative_id, uid AS relative_uid FROM members_family_relative WHERE member_id = %lu AND uid::text ='%s' ",out["member_id"].Long(), in["relative_uid"].c_str());
ret = PHP_API_OK;
out["status"] = "OK";
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchRelativesReminder");
}
logfmt(logINFO, "WrenchRelativesReminder()");
return ret;
}
long WrenchRelativesSettings(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchRelativesSettings");
char vname[30];
long ret = PHP_API_BAD_PARAM;
long relative_kid_id = 0;
const PGresult *res;
CVars xx;
try{
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "relative_uid", 3, 150, "(.*)");
out["total_kid"] ="0";
load_db_record(out, "SELECT id AS member_id FROM members WHERE uid::text = '%s' ", in["uid"].c_str());
if ( out["member_id"].Long() > 0)
{
res = pgsql_query("SELECT * FROM family_relative_kids WHERE relative_uid::text = '%s'::text AND member_id=%lu AND add_status > 0", in["relative_uid"].c_str(),out["member_id"].Long() );
if (res != NULL && pgsql_num_rows(res) > 0) {
out["total_kid"] = pgsql_num_rows(res);
for (int i = 0, n = pgsql_num_rows(res); i < n; i++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "family_uid_%05d", i);
out[vname] = rec["uid"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchRelativesSettings");
}
logfmt(logINFO, "WrenchRelativesSettings()");
return ret;
}
long WrenchRelativesKidsEdit(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchRelativesKidsEdit");
char vname[30];
long ret = PHP_API_BAD_PARAM;
long relative_kid_id = 0;
const PGresult *res;
CVars xx;
try{
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "relative_uid", 3, 150, "(.*)");
REQ_STRING(in, "family_uid", 3, 150, "(.*)");
long add = REQ_LONG(in, "add", 1, -1);
load_db_record(out, "SELECT id AS member_id FROM members WHERE uid::text = '%s' ", in["uid"].c_str());
if ( out["member_id"].Long() > 0)
{
load_db_record(out, "SELECT id AS relative_id, uid AS relative_uid FROM members_family_relative WHERE member_id = %lu AND uid::text ='%s' ",out["member_id"].Long(), in["relative_uid"].c_str());
load_db_record(out, "SELECT id AS family_id, uid AS family_uid FROM members_family WHERE member_id = %lu AND uid::text ='%s' ",out["member_id"].Long(), in["family_uid"].c_str());
out["relative_kid_id"] = "0";
res = pgsql_query("SELECT id AS relative_kid_id FROM family_relative_kids WHERE relative_uid::text = '%s'::text AND family_uid::text = '%s'::text ", in["relative_uid"].c_str(), in["family_uid"].c_str() );
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
out["relative_kid_id"] = rec["relative_kid_id"];
}
// if ( load_db_record(out, "SELECT id AS relative_kid_id FROM family_relative_kids WHERE relative_uid::text = '%s'::text AND family_uid::text = '%s'::text ", in["relative_uid"].c_str(), in["family_uid"].c_str())> 0){
// logfmt(logINFO, "WrenchRelativesKidsEdit() Previous Kids Entry");
// }
// else{
// out["relative_kid_id"] = "0";
// }
if ( out["relative_id"].Long() > 0 && out["family_id"].Long() > 0 ){
xx["add_status"] = in["add"];
xx["add_status"].set_valid(true);
if ( out["relative_kid_id"].Long() > 0 ){
update_db_record(DBS_VALID, "family_relative_kids", xx, out["relative_kid_id"].Long());
}else{
xx["member_id"] = out["member_id"];
xx["member_id"].set_valid(true);
xx["relative_uid"] = in["relative_uid"];
xx["relative_uid"].set_valid(true);
xx["family_uid"] = in["family_uid"];
xx["family_uid"].set_valid(true);
out["relative_kid_id"] = insert_db_record(DBS_VALID, "family_relative_kids", "family_relative_kids_id_seq", xx);
if(out["relative_kid_id"].Long() > 0 ){
// load_db_record( out, "SELECT id AS suggest_id,* FROM members_family_suggesttask WHERE id = %lu ", out["suggested_task_id"].Long());
// family_email(WRENCHBOARD_FAMILY_SGGESTTASKS, out, out); //
}
}
ret = PHP_API_OK;
out["status"] = "OK";
}
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchRelativesKidsEdit");
}
logfmt(logINFO, "WrenchRelativesKidsEdit()");
return ret;
}
long WrenchFamilyInviteList(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchFamilyInviteList");
char vname[30];
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
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);
out["total_record"] = "0";
res = pgsql_query("SELECT * "
" FROM members_family_relative "
" WHERE member_id = %lu "
" AND status IN (0, 1,2,3,4,5) "
" ORDER BY id DESC ", 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++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "uid_%05d", i);
out[vname] = rec["uid"];
snprintf(vname, sizeof (vname), "firstname_%05d", i);
out[vname] = rec["firstname"];
snprintf(vname, sizeof (vname), "lastname_%05d", i);
out[vname] = rec["lastname"];
snprintf(vname, sizeof (vname), "email_%05d", i);
out[vname] = rec["email"];
snprintf(vname, sizeof (vname), "status_%05d", i);
out[vname] = rec["status"];
snprintf(vname, sizeof (vname), "family_type_%05d", i);
out[vname] = rec["family_type"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyInviteList");
}
logfmt(logINFO, "WrenchFamilyInviteList()");
return ret;
}
long WrenchFamilyInvite(CVars in, CVars &out){
long ret = PHP_API_BAD_PARAM;
try{
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "firstname", 3, 35, "(.*)");
REQ_STRING(in, "lastname", 3, 35, "(.*)");
REQ_STRING(in, "email", 3, 299, "(.*)");
REQ_STRING(in, "family_type", 3, 25, "(.*)");
out["invite_id"] ="0";// we will set if all okay
// const PGresult *res = pgsql_query("SELECT id FROM members_family_relative "
// " WHERE LOWER('%s') = LOWER(email) AND member_id= %lu", in["email"].c_str(), member_id);
load_db_record(out, "SELECT count(id) AS prev_entry FROM members_family_relative "
" WHERE LOWER('%s') = LOWER(email) AND member_id= %lu", in["email"].c_str(), member_id);
if ( out["prev_entry"].Long() == 0)
{
//
// if ( out["prev_entry"].Long()> 0){
// out["status_msg"] = "Duplicate";
// out["status_msg"] = "DUPLICATE";
// }
// else{
CVars xx;
xx["member_id"] = member_id;
xx["member_id"].set_valid(true);
xx["member_uid"] = in["uid"];
xx["member_uid"].set_valid(true);
xx["firstname"] = in["firstname"];
xx["firstname"].set_valid(true);
xx["lastname"] = in["lastname"];
xx["lastname"].set_valid(true);
xx["email"] = in["email"];
xx["email"].set_valid(true);
xx["family_type"] = in["family_type"];
xx["family_type"].set_valid(true);
out["invite_id"] = insert_db_record(DBS_VALID, "members_family_relative", "members_family_relative_id_seq", xx);
if(out["invite_id"].Long() > 0 ){
// load_db_record( out, "SELECT id AS suggest_id,* FROM members_family_suggesttask WHERE id = %lu ", out["suggested_task_id"].Long());
// family_email(WRENCHBOARD_FAMILY_SGGESTTASKS, out, out); //
}
ret = PHP_API_OK;
out["status"] = "OK";
// }
}
else{
out["status_msg"] = "Duplicate";
out["status_msg"] = "DUPLICATE";
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyInvite");
}
logfmt(logINFO, "WrenchFamilyInvite()");
return ret;
}
long WrenchSuggestWaitingList(CVars in, CVars &out){ // this is the parent now
logfmt(logINFO, "ENTER CALL long WrenchSuggestWaitingList");
char vname[30];
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
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);
out["total_record"] = "0";
// res = pgsql_query("SELECT id FROM family_task_suggestion WHERE status=1 ");
// out["total_record"] = pgsql_num_rows(res);
res = pgsql_query("SELECT sg.*,mf.firstname,to_char(sg.created, 'Day Mon dd, yyyy HH:MI AM') AS formarted_added "
" FROM members_family_suggesttask sg "
" LEFT JOIN members_family mf ON mf.uid::text = sg.family_uid "
" WHERE sg.family_uid::text IN (SELECT uid::text FROM members_family "
" WHERE member_id = %lu ) "
" AND sg.status IN ( 1,2,3,4,5) "
" ORDER BY sg.created 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++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "uid_%05d", i);
out[vname] = rec["uid"];
snprintf(vname, sizeof (vname), "family_uid_%05d", i);
out[vname] = rec["family_uid"];
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), "added_%05d", i);
out[vname] = rec["formarted_added"];
snprintf(vname, sizeof (vname), "status_%05d", i);
out[vname] = rec["status"];
snprintf(vname, sizeof (vname), "banner_%05d", i);
out[vname] = rec["banner"];
snprintf(vname, sizeof (vname), "firstname_%05d", i);
out[vname] = rec["firstname"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchSuggestWaitingList");
}
logfmt(logINFO, "WrenchSuggestList()");
return ret;
}
long WrenchSuggestList(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchSuggestList");
char vname[30];
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
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);
out["total_record"] = "0";
// res = pgsql_query("SELECT id FROM family_task_suggestion WHERE status=1 ");
// out["total_record"] = pgsql_num_rows(res);
//ALTER TABLE members_family_suggesttask ADD remind timestamp;
res = pgsql_query(" SELECT * FROM members_family_suggesttask WHERE member_id = %lu AND status IN ( 1,2,3,4,5) "
" ORDER BY created 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++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "uid_%05d", i);
out[vname] = rec["uid"];
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), "added_%05d", i);
out[vname] = rec["created"];
snprintf(vname, sizeof (vname), "status_%05d", i);
out[vname] = rec["status"];
snprintf(vname, sizeof (vname), "banner_%05d", i);
out[vname] = rec["banner"];
snprintf(vname, sizeof (vname), "remind_%05d", i);
out[vname] = rec["remind"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchSuggestList");
}
logfmt(logINFO, "WrenchSuggestList()");
return ret;
}
long WrenchSuggestTaskStatus(CVars in, CVars &out){
long ret = PHP_API_BAD_PARAM;
CVars xy;
CVars xout;
// const PGresult *res;
try{
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "suggest_uid", 3, 150, "(.*)");
long suggest_action = REQ_LONG(in, "suggest_action", 1, -1);
out["suggested_task_id"] ="0";// we will set if all okay
const PGresult *res = pgsql_query("SELECT m.*,mf.uid AS family_uid FROM members m "
" LEFT JOIN members_family mf ON mf.family_member_id = m.id "
" WHERE m.id=%lu AND m.uid='%s'", member_id, in["uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
ret = PHP_API_OK;
out["status"] = "ACCOUNT FOUND";
//out = rec;
if (rec["family_uid"] != ""){ // we are sure you are a family now
// NOW LET US FIND THIS TASK
logfmt(logINFO, " CALL long WrenchSuggestTaskStatus- NOW LET US FIND THIS TASK");
const PGresult *res0 = pgsql_query("SELECT id AS suggest_id,* FROM members_family_suggesttask "
" WHERE member_id = %lu AND uid='%s' AND status IN (1,2)", member_id, in["suggest_uid"].c_str());
if (res0 != NULL && pgsql_num_rows(res0) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res0, 0);
CVars rec2;
map_to_cvars(f, rec2);
if (suggest_action == 555 ){
pgsql_exec("UPDATE members_family_suggesttask SET status=0,updated=now() "
" WHERE id=%lu AND uid='%s'", rec2["suggest_id"].Long(),in["suggest_uid"].c_str() );
out["status"] = "OK";
out["status_msg"] = "family_suggest_deleted";
ret = PHP_API_OK;
}
if (suggest_action == 222 ){
pgsql_exec("UPDATE members_family_suggesttask SET remind=now(),updated=now() "
" WHERE id=%lu AND uid='%s'", rec2["suggest_id"].Long(), in["suggest_uid"].c_str() );
family_email(WRENCHBOARD_FAMILY_SGGESTTASKS, rec2, rec2);
out["status"] = "OK";
out["status_msg"] = "family_suggest_reminder_sent";
ret = PHP_API_OK;
if ( load_db_record(xy, "SELECT m.id AS member_id, m.uid AS member_uid "
" FROM members_family f "
" LEFT JOIN members m ON m.id = f.member_id "
" WHERE f.family_member_id = %lu ",rec2["member_id"].Long()) > 0 ){
xy["msg"] = "You have received a suggested task reminder";
xy["msg"].set_valid(true);
plan_notification(xy, xout);
}
}
}
}
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchSuggestTaskStatus");
}
logfmt(logINFO, "WrenchSuggestTaskStatus()");
return ret;
}
long WrenchSuggestTasks(CVars in, CVars &out){
long ret = PHP_API_BAD_PARAM;
// const PGresult *res;
try{
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 3, 150, "(.*)");
REQ_STRING(in, "title", 3, 150, "(.*)");
REQ_STRING(in, "description", 3, 299, "(.*)");
REQ_STRING(in, "banner", 3, 25, "(.*)");
out["suggested_task_id"] ="0";// we will set if all okay
const PGresult *res = pgsql_query("SELECT m.*,mf.uid AS family_uid FROM members m "
" LEFT JOIN members_family mf ON mf.family_member_id = m.id "
" WHERE m.id=%lu AND m.uid='%s'", member_id, in["uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
ret = PHP_API_OK;
out["status"] = "ACCOUNT FOUND";
//out = rec;
if (rec["family_uid"] != ""){ // we are sure you are a family now
CVars xx;
xx["member_id"] = member_id;
xx["member_id"].set_valid(true);
xx["title"] = in["title"];
xx["title"].set_valid(true);
xx["description"] = in["description"];
xx["description"].set_valid(true);
xx["family_uid"] = rec["family_uid"];
xx["family_uid"].set_valid(true);
xx["banner"] = in["banner"];
xx["banner"].set_valid(true);
out["suggested_task_id"] = insert_db_record(DBS_VALID, "members_family_suggesttask", "members_family_suggesttask_id_seq", xx);
if(out["suggested_task_id"].Long() > 0 ){
load_db_record( out, "SELECT id AS suggest_id,* FROM members_family_suggesttask WHERE id = %lu ", out["suggested_task_id"].Long());
family_email(WRENCHBOARD_FAMILY_SGGESTTASKS, out, out); //
}
ret = PHP_API_OK;
out["status"] = "OK";
}
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchSuggestTasks");
}
logfmt(logINFO, "WrenchSuggestTasks()");
return ret;
}
long WrenchSampleTasks(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchSampleTasks");
char vname[30];
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
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);
out["total_record"] = "0";
// res = pgsql_query("SELECT id FROM family_task_suggestion WHERE status=1 ");
// out["total_record"] = pgsql_num_rows(res);
res = pgsql_query(" SELECT * FROM family_task_suggestion WHERE status = 1 "
" ORDER BY title DESC LIMIT %lu OFFSET %lu", 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++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "uid_%05d", i);
out[vname] = rec["uid"];
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), "added_%05d", i);
out[vname] = rec["added"];
snprintf(vname, sizeof (vname), "age_%05d", i);
out[vname] = rec["age"];
snprintf(vname, sizeof (vname), "banner_%05d", i);
out[vname] = rec["banner"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchSampleTasks");
}
logfmt(logINFO, "WrenchSampleTasks()");
return ret;
}
long WrenchFamilyTransfer(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchFamilyTransfer");
char vname[30];
long ret = PHP_API_BAD_PARAM;
long family_member_id = 0;
const PGresult *res0;
int err_count = 0;
try {
/*
member_id' => int 1
'sessionid' => string '64C3E325C554381B055233298A267198A1F19251E2DBD04634B3E6A58847DC0B' (length=64)
'uid' => string '3119b744-42ad-4834-bb83-b737588754ca' (length=36)
'family_uid' => string '1f385837-b5e6-420e-a17a-488c4b8ef015' (length=36)
'wallet_uid' => string 'aa6e6488-2e71-4f83-b265-27c3c4339f73' (length=36)
'origing_wallet_uid' => string 'cc0f8743-3f18-4214-ba4b-781e5dda9cb8' (length=36)
'currency' => string 'NAIRA' (length=5)
'amount' => int 100500
'family_transfer_mode' => int 100
*/
// }
long member_id = REQ_LONG(in, "member_id", 1, -1);
long amount = REQ_LONG(in, "amount", 1, -1);
REQ_STRING(in, "family_uid", 2, 50, "(.*)");
REQ_STRING(in, "uid", 2, 50, "(.*)");
REQ_STRING(in, "wallet_uid", 2, 50, "(.*)");
REQ_STRING(in, "origing_wallet_uid", 2, 50, "(.*)");
REQ_STRING(in, "sessionid", 2, 149, "(.*)");
REQ_STRING(in, "currency", 2, 20, "(.*)");
REQ_STRING(in, "description", 2, 100, "(.*)");
logfmt(logINFO, "WrenchFamilyWallet() Verify Session ");
CVars rec0;
if ( VerifySession(in, out) != PHP_API_OK ){
return ret;
}
res0 = pgsql_query("SELECT family_member_id FROM members_family WHERE member_id = %lu AND uid='%s' ", in["member_id"].Long(), in["family_uid"].c_str());
if (res0 != NULL && pgsql_num_rows(res0) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res0, 0);
map_to_cvars(f, rec0);
family_member_id = rec0["family_member_id"].Long();
}
else{
out["status"] = "Family not found";
return ret;
}
out["total_record"] = "0";
const PGresult *res;
res = pgsql_query("SELECT w.amount AS current_balance, w.currency, w.uid AS recipient_wallet_uid "
"FROM members_wallet w LEFT JOIN currency c ON c.code=w.currency "
"WHERE w.member_id = %lu AND w.uid='%s' ORDER BY c.lorder DESC", rec0["family_member_id"].Long(), in["wallet_uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
out["total_record"] = pgsql_num_rows(res);
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
out = rec;
// lets get the parent wallet too
if( load_db_record(out,"SELECT w.amount AS origing_current_balance,w.uid AS origing_wallet_uid,"
" w.transfer_limit AS origing_transfer_limit, w.currency as origing_currency "
" FROM members_wallet w "
" WHERE w.member_id = %lu AND w.currency='%s' AND w.uid='%s'", in["member_id"].Long(), out["currency"].c_str(), in["origing_wallet_uid"].c_str()) >0 ){
if (in["amount"].Long() > out["origing_transfer_limit"].Long() ){
err_count++;
out["error_limit"] = "amount_greater_than_limit";
}
if (in["amount"].Long() <= 0 ){
err_count++;
out["error_balance"] = "amount_inavlid";
}
if (in["amount"].Long() > out["origing_current_balance"].Long() ){
err_count++;
out["error_balance"] = "amount_greater_than_balance";
}
if (err_count> 0){
out["status"] = "Send Error";
return ret;
}
CVars inx;
inx["member_id"] = in["member_id"]; inx["member_id"].set_valid( true );
inx["recipient"] = rec0["family_member_id"]; inx["recipient"].set_valid( true );
inx["uid"] = in["uid"]; inx["uid"].set_valid( true );
inx["currency"] = in["currency"]; inx["currency"].set_valid( true );
inx["origing_wallet"] = in["origing_wallet_uid"]; inx["origing_wallet"].set_valid( true );
inx["target_wallet"] = out["recipient_wallet_uid"]; inx["target_wallet"].set_valid( true );
inx["amount"] = in["amount"]; inx["amount"].set_valid( true );
inx["description"] = in["description"]; inx["description"].set_valid( true );
long family_transfer_id = insert_db_record(DBS_VALID, "family_transfer", "family_transfer_id_seq", inx);
if ( family_transfer_id > 0 ){
CVars trx;
if ( load_db_record(trx, "SELECT * FROM family_transfer WHERE id =%lu",family_transfer_id) > 0 ){
trx["transfer_id"] = family_transfer_id; trx["transfer_id"].set_valid( true );
return WrenchFamilyPayment( trx, out );
}
else{
out["status"] = "System Error 02";
return ret;
}
}
else
{
out["status"] = "System Error 01";
return ret;
}
/*
CREATE TABLE family_transfer (
id SERIAL,
uid uuid DEFAULT uuid_generate_v4(),
member_id INT REFERENCES members(id) NOT NULL,
recipient INT REFERENCES members(id) NOT NULL,
origing_wallet VARCHAR(150) NOT NULL,
target_wallet VARCHAR(150) NOT NULL,
amount INT Default 0,
currency VARCHAR(5) REFERENCES currency(code),
description VARCHAR(150),
status INT DEFAULT 1,
flags INT DEFAULT 0,
added timestamp without time zone DEFAULT now(),
updated timestamp without time zone DEFAULT now()
);
ALTER TABLE ONLY family_transfer
ADD CONSTRAINT family_transfer_id_key UNIQUE (id);
*/
}
else{
out["status"] = "Originating wallet not found";
}
}
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyTransfer(CVars in, CVars &out)");
}
logfmt(logINFO, "EXIT CALL long WrenchFamilyTransfer");
return 0;
}
long WrenchFamilyTransferHx(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchFamilyTransferHx");
char vname[30];
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
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);
out["total_record"] = "0";
/*
wrenchboard=> \d family_transfer
Table "public.family_transfer"
Column | Type | Collation | Nullable | Default
----------------+-----------------------------+-----------+----------+---------------------------------------------
id | integer | | not null | nextval('family_transfer_id_seq'::regclass)
uid | uuid | | | uuid_generate_v4()
member_id | integer | | not null |
recipient | integer | | not null |
origing_wallet | character varying(150) | | not null |
target_wallet | character varying(150) | | not null |
amount | integer | | | 0
currency | character varying(5) | | |
description | character varying(150) | | |
status | integer | | | 1
flags | integer | | | 0
added | timestamp without time zone | | | now()
updated | timestamp without time zone | | | now()
pay_confirm | character varying(15) | | |
credit_confirm | character varying(15) | | |
Indexes:
*/
res = pgsql_query(" SELECT f.*, m.firstname, m.lastname FROM family_transfer f "
" LEFT JOIN members m ON m.id = f.recipient "
" WHERE member_id = %lu AND f.status IN ( 1 ) "
" ORDER BY 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++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "uid_%05d", i);
out[vname] = rec["uid"];
snprintf(vname, sizeof (vname), "amount_%05d", i);
out[vname] = rec["amount"];
snprintf(vname, sizeof (vname), "currency_%05d", i);
out[vname] = rec["currency"];
snprintf(vname, sizeof (vname), "recipient_%05d", i);
out[vname] = rec["recipient"];
snprintf(vname, sizeof (vname), "rec_firstname_%05d", i);
out[vname] = rec["firstname"];
snprintf(vname, sizeof (vname), "rec_lastname_%05d", i);
out[vname] = rec["lastname"];
snprintf(vname, sizeof (vname), "description_%05d", i);
out[vname] = rec["description"];
snprintf(vname, sizeof (vname), "flags_%05d", i);
out[vname] = rec["flags"];
snprintf(vname, sizeof (vname), "status_%05d", i);
out[vname] = rec["status"];
snprintf(vname, sizeof (vname), "confirmation_%05d", i);
out[vname] = rec["credit_confirm"];
snprintf(vname, sizeof (vname), "added_%05d", i);
out[vname] = rec["added"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyTransferHx");
}
logfmt(logINFO, "WrenchFamilyTransferHx()");
return ret;
}
long WrenchFamilyTransferStart(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchFamilyWallet");
char vname[30];
long ret = PHP_API_BAD_PARAM;
long family_member_id = 0;
const PGresult *res0;
try {
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "family_uid", 2, 50, "(.*)");
REQ_STRING(in, "uid", 2, 50, "(.*)");
REQ_STRING(in, "wallet_uid", 2, 50, "(.*)");
REQ_STRING(in, "sessionid", 2, 149, "(.*)");
logfmt(logINFO, "WrenchFamilyWallet() Verify Session ");
CVars rec0;
if ( VerifySession(in, out) != PHP_API_OK ){
return 0;
}
res0 = pgsql_query("SELECT family_member_id FROM members_family WHERE member_id = %lu AND uid='%s' ", in["member_id"].Long(), in["family_uid"].c_str());
if (res0 != NULL && pgsql_num_rows(res0) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res0, 0);
map_to_cvars(f, rec0);
family_member_id = rec0["family_member_id"].Long();
}
else{
return 0;
}
out["total_record"] = "0";
const PGresult *res;
res = pgsql_query("SELECT w.amount AS current_balance, w.currency, w.uid AS recipient_wallet_uid "
"FROM members_wallet w LEFT JOIN currency c ON c.code=w.currency "
"WHERE w.member_id = %lu AND w.uid='%s' ORDER BY c.lorder DESC", rec0["family_member_id"].Long(), in["wallet_uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
out["total_record"] = pgsql_num_rows(res);
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
out = rec;
// lets get the parent wallet too
if( load_db_record(out,"SELECT w.amount AS origing_current_balance,w.uid AS origing_wallet_uid,"
" w.transfer_limit AS origing_transfer_limit, w.currency as origing_currency "
" FROM members_wallet w "
" WHERE w.member_id = %lu AND w.currency='%s'", in["member_id"].Long(), out["currency"].c_str()) ){
ret = PHP_API_OK;
out["status"] = "OK";
out["exchange_rate"] ="1";
}
else{
out["status"] = "Originating wallet not found";
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyTransferStart(CVars in, CVars &out)");
}
logfmt(logINFO, "EXIT CALL long WrenchFamilyTransferStart");
return 0;
}
long WrenchFamilyWallet(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchFamilyWallet");
char vname[30];
long ret = PHP_API_BAD_PARAM;
long family_member_id = 0;
const PGresult *res0;
try {
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "family_uid", 2, 50, "(.*)");
REQ_STRING(in, "uid", 2, 50, "(.*)");
REQ_STRING(in, "sessionid", 2, 149, "(.*)");
logfmt(logINFO, "WrenchFamilyWallet() Verify Session ");
CVars rec0;
if ( VerifySession(in, out) != PHP_API_OK ){
return 0;
}
res0 = pgsql_query("SELECT family_member_id FROM members_family WHERE member_id = %lu AND uid='%s' ", in["member_id"].Long(), in["family_uid"].c_str());
if (res0 != NULL && pgsql_num_rows(res0) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res0, 0);
map_to_cvars(f, rec0);
family_member_id = rec0["family_member_id"].Long();
CVars vw;
if( load_db_record(vw, "SELECT c.code AS currency from members m LEFT JOIN currency c ON c.country = m.country WHERE m.id=%lu AND m.country IS NOT NULL",in["member_id"].Long())> 0 ){
logfmt(logINFO, "********~~~~~~~~ WrenchFamilyWallet() ------ CheckWallet(family_member_id) = %lu",family_member_id);
// vw["currency"] = "NAIRA"; // this might become a variable based on the country
//vw["currency"].set_valid( true );
long wallet_id = CheckWallet(family_member_id,vw); // making sure we have a wallet
}
}
else{
out["error_msg"] ="member_family_wallet_not_found";
return 0;
}
out["total_record"] = "0";
const PGresult *res;
res = pgsql_query("SELECT w.amount,c.*,w.amount AS current_balance,c.country,w.transfer_limit,w.uid AS wallet_uid "
"FROM members_wallet w LEFT JOIN currency c ON c.code=w.currency "
"WHERE w.member_id = %lu ORDER BY c.lorder DESC", rec0["family_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++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "amount_%05d", i);
out[vname] = rec["amount"];
snprintf(vname, sizeof (vname), "currency_%05d", i);
out[vname] = rec["currency"];
// amount | id | code | description | symbol | action_type | lorder | current_balance
snprintf(vname, sizeof (vname), "description_%05d", i);
out[vname] = rec["description"];
snprintf(vname, sizeof (vname), "symbol_%05d", i);
out[vname] = rec["symbol"];
snprintf(vname, sizeof (vname), "action_type_%05d", i);
out[vname] = rec["action_type"];
snprintf(vname, sizeof (vname), "code_%05d", i);
out[vname] = rec["code"];
snprintf(vname, sizeof (vname), "country_%05d", i);
out[vname] = rec["country"];
snprintf(vname, sizeof (vname), "transfer_limit_%05d", i);
out[vname] = rec["transfer_limit"];
snprintf(vname, sizeof (vname), "wallet_uid_%05d", i);
out[vname] = rec["wallet_uid"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyWallet(CVars in, CVars &out)");
}
logfmt(logINFO, "EXIT CALL long WrenchFamilyWallet");
return 0;
}
//,to_char(last_login, 'Day Mon dd, yyyy HH:MI AM')
long WrenchFamilyList(CVars in, CVars &out){
logfmt(logINFO, "ENTER CALL long WrenchFamilyList");
char vname[30];
long ret = PHP_API_BAD_PARAM;
const PGresult *res;
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);
out["total_record"] = "0";
res = pgsql_query("SELECT id FROM members_family WHERE member_id = %lu AND status=1 ", in["member_id"].Long());
out["total_record"] = pgsql_num_rows(res);
res = pgsql_query(" SELECT *,to_char(last_login, 'Day Mon dd, yyyy HH:MI AM') AS last_login_formatted FROM members_family WHERE member_id = %lu AND status=1 "
" ORDER BY id DESC LIMIT %lu OFFSET %lu", in["member_id"].Long(), 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++) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, i);
if (f.empty()) continue;
CVars rec;
map_to_cvars(f, rec);
snprintf(vname, sizeof (vname), "uid_%05d", i);
out[vname] = rec["uid"];
snprintf(vname, sizeof (vname), "firstname_%05d", i);
out[vname] = rec["firstname"];
snprintf(vname, sizeof (vname), "lastname_%05d", i);
out[vname] = rec["lastname"];
snprintf(vname, sizeof (vname), "added_%05d", i);
out[vname] = rec["added"];
snprintf(vname, sizeof (vname), "age_%05d", i);
out[vname] = rec["age"];
snprintf(vname, sizeof (vname), "last_login_%05d", i);
out[vname] = rec["last_login_formatted"];
snprintf(vname, sizeof (vname), "task_count_%05d", i);
out[vname] = rec["task_count"];
snprintf(vname, sizeof (vname), "username_%05d", i);
out[vname] = rec["username"];
snprintf(vname, sizeof (vname), "year_%05d", i);
out[vname] = rec["year"];
snprintf(vname, sizeof (vname), "month_%05d", i);
out[vname] = rec["month"];
snprintf(vname, sizeof (vname), "enable_traking_%05d", i);
out[vname] = rec["enable_traking"];
}
}
ret = PHP_API_OK;
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyList");
}
logfmt(logINFO, "WrenchFamilyList()");
return ret;
}
long WrenchFamilyInitializeAccount(CVars in, CVars &out);
long WrenchFamilyAdd(CVars in, CVars &out){
logfmt(logINFO, "WrenchFamilyAdd()");
long family_id = 0;
try {
REQ_LONG(in, "member_id", 1, -1);
//REQ_LONG(in, "age", 1, -1);
REQ_LONG(in, "year", 1, -1);
REQ_LONG(in, "month", 1, -1);
REQ_STRING(in, "firstname", 2, 34, "(.*)");
REQ_STRING(in, "lastname", 2, 34, "(.*)");
CVars x;
x["member_id"] = in["member_id"];
x["member_id"].set_valid(true);
x["age"] = "0";
x["age"].set_valid(true);
x["firstname"] = in["firstname"];
x["firstname"].set_valid(true);
x["lastname"] = in["lastname"];
x["lastname"].set_valid(true);
x["status"] = "1";
x["status"].set_valid(true);
x["year"] = in["year"];
x["year"].set_valid(true);
x["month"] = in["month"];
x["month"].set_valid(true);
family_id = insert_db_record(DBS_VALID, "members_family", "members_family_id_seq", x);
if (family_id > 0) {
load_db_record(out, "SELECT id AS family_id, * FROM members_family WHERE id =%lu",family_id);
WrenchFamilyInitializeAccount(out,out);
// send notice here
}
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyAdd(CVars in, CVars &out)");
}
logfmt(logINFO, "WrenchFamilyAdd()");
return family_id;
}
long WrenchFamilyUpdate(CVars in, CVars &out){
long ret = PHP_API_BAD_PARAM;
logfmt(logINFO, "WrenchFamilyUpdate()");
long family_id = 0;
try {
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "firstname", 2, 34, "(.*)");
REQ_STRING(in, "lastname", 2, 34, "(.*)");
REQ_STRING(in, "family_uid", 2, 50, "(.*)");
REQ_LONG(in, "year", 1, -1);
REQ_LONG(in, "month", 1, -1);
REQ_LONG(in, "enable_traking", 1, -1);
CVars x;
x["firstname"] = in["firstname"];
x["firstname"].set_valid(true);
x["lastname"] = in["lastname"];
x["lastname"].set_valid(true);
x["year"] = in["year"];
x["year"].set_valid(true);
x["month"] = in["month"];
x["month"].set_valid(true);
x["enable_traking"] = in["enable_traking"];
x["enable_traking"].set_valid(true);
const PGresult *res = pgsql_query(" SELECT id AS family_id FROM members_family "
" WHERE member_id=%lu AND uid='%s' ", member_id,in["family_uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
update_db_record(DBS_VALID, "members_family", x, rec["family_id"].Long());
ret = PHP_API_OK;
}
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyUpdate(CVars in, CVars &out)");
}
logfmt(logINFO, "WrenchFamilyUpdate()");
return ret;
}
long WrenchFamilyManage(CVars in, CVars &out){
/*
wrenchboard=> select * from members_family;
id | member_id | firstname | lastname | age | active | status | added | updated
----+-----------+-----------+----------+-----+--------+--------+-------+---------
(0 rows)
*/
long ret = PHP_API_BAD_PARAM;
logfmt(logINFO, "WrenchFamilyManage()");
long family_id = 0;
try {
long member_id = REQ_LONG(in, "member_id", 1, -1);
REQ_STRING(in, "uid", 2, 45, "(.*)");
REQ_STRING(in, "family_uid", 2, 45, "(.*)");
const PGresult *res = pgsql_query(" SELECT id AS family_id,* FROM members_family "
" WHERE member_id=%lu AND uid='%s' ", member_id,in["family_uid"].c_str());
if (res != NULL && pgsql_num_rows(res) > 0) {
map<const char*, const char*>f = pgsql_fetch_assoc(res, 0);
CVars rec;
map_to_cvars(f, rec);
if( rec["username"]=="" || rec["pin"]==""){
logfmt(logINFO, "WrenchFamilyManage()- NEED TI INITIALIZE USERNAME PIN");
WrenchFamilyInitializeAccount(rec,out);
}
if( rec["family_member_id"]==""){
WrenchBoardFamilyAccMemberID(in, out);
}
out = rec;
ret = PHP_API_OK;
}
out["status"] = "OK";
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL long WrenchFamilyUpdate(CVars in, CVars &out)");
}
logfmt(logINFO, "/WrenchFamilyManage()");
return ret;
}
/* WARNING: Unsafe function without buffer length check! */
void GeneratePIN(int length, char *buffer) {
if (length < 2) {
sprintf(buffer, "%d", rand() % 10); // if the PIN length is less than 2 - make a single digit
return;
}
// leading number must not be 0
long long randomNumber = (rand() % 9) + 1;
const int n = length - 1;
for (int i = 0; i<n; i++) {
randomNumber *= 10;
randomNumber += rand() % 10;
}
sprintf(buffer, "%0*ld", length, randomNumber);
}
long WrenchFamilyInitializeAccount(CVars in, CVars &out){
const PGresult *res;
char username[7] = "";
logfmt(logINFO, "WrenchFamilyInitializeAccount()");
try {
SetFamilyUsername(in["family_id"].Long(), username, 6);
} catch (bad_parameter) {
logfmt(logINFO, "ERROR CALL void SetFamilyUsername(CVars in, CVars &out)");
}
/*
int r1;
//srand(time(NULL));
r1 = 1000+(rand()%9000);
pgsql_exec("UPDATE members_family SET pin='%s' WHERE id=%lu", r1, in["family_id"].Long() );
*/
char pin[5]; // 4 digits + \0
bzero(pin, sizeof (pin));
GeneratePIN(4, pin);
pgsql_exec("UPDATE members_family SET pin='%s' WHERE id=%lu", pin, in["family_id"].Long() );
load_db_record(out, "SELECT * FROM members_family WHERE id = %lu", in["family_id"].Long());
return 0;
}
/*
#define WRENCHBOARD_FAMILY_LIST 22010
#define WRENCHBOARD_FAMILY_ADD 22015
#define WRENCHBOARD_FAMILY_UPDATE 22020
#define WRENCHBOARD_FAMILY_MANAGE 22025
*/