//this set of functions is here to help certain actions in the system be pushed through an approval process
//and once that approval is given, the system tracks the approval and allows the action to continue, while keeping all parties in the loop.
define("QUEUEAPPROVAL_UNREQUESTED","Not Requested");
define("QUEUEAPPROVAL_GIVEN","Given");
define("QUEUEAPPROVAL_REJECTED","Rejected");
define("QUEUEAPPROVAL_PENDING","Requested/Pending");
define("QUEUEAPPROVAL_INVALIDTYPE","Invalid Approval Type");
define("QUEUEAPPROVAL_TYPELIST","clientoffer,propertyextensiongrouprequest");
function queueapproval_getbyarray($arr)
{
$type=queueapproval_gettype($arr);
return queueapproval_get($type, $arr[$type."id"],$arr[queueapprovalmodifier]);
}
function queueapproval_gettype($arr)
{
$allowedtypes=explode(',',QUEUEAPPROVAL_TYPELIST);
foreach($allowedtypes as $type) {
if($arr["$type"."id"])
return $type;
}
ddie("Invalid queueapproval_type Type $arr");
}
function queueapproval_get($type, $id,$modifier='')
{ //$type could be clientoffer,xxxx,yyyyy (add more here as they are allowed)
//$modifier (future use, this will be so that different kinds of approval can be requested and given on the same '$type:$id'
$allowedtypes=explode(',',QUEUEAPPROVAL_TYPELIST);
if(!in_array($type,$allowedtypes))
{
d(debug_backtrace());
return QUEUEAPPROVAL_INVALIDTYPE.$type;
}
$sql = "
select *
from tblqueueapproval
where {$type}id = $id
and queueapprovalmodifier = '".db_col($modifier)."' ";
if($type==clientoffer && clientcompanyid()) //restrict amc to only seeing their own
$sql .=" and clientofferid in (select clientofferid from tblclientoffer join tblclientnegotiation j using(clientnegotiationid) where clientcompanyid = ".clientcompanyid().")";
$sql.="
order by queueapprovalid desc
limit 1";
//d(__LINE__,$sql);
$qry = db_first($sql);
$sql = "
select *
from tblqueueapprovalinvite
where queueapprovalid = ".db_number($qry[queueapprovalid ])."
order by queueapprovalinviteid desc";
//d(__LINE__,$sql);
$invites= db_query($sql);
//d(invites,$invites);
$qry[type]=$type;
$typeid=$type.'id';
if(!$qry[$typeid])
$qry[$typeid]=$id;
queueapproval_setaddeddata($type,$modifier,$qry);
if(!$qry[queueapprovalid])
unset($qry[$typeid]);
$qry[id] = $qry[$type."id"];
foreach($invites as &$invite)
{
//d(invite,$invite);
if($invite[contactid])
{
if(contactid()==$invite[contactid])
$qry[i_was_invited]=1;
$c = contact_get($invite[contactid]);
$invite[email] = $c[contactemail];
$invite[name] = trim($c[contactcname].' '.$c[contactname]);
//d(invite,$invite);
}
if($invite[clientcompanyid])
{
if(clientcompanyid()==$invite[clientcompanyid])
$qry[i_was_invited]=1;
$c = get_clientcompany($invite[clientcompanyid]);
$invite[email] = $c[clientcompanyemail];
$invite[name] = trim($c[clientcompanyname]);
//d(invite,$invite);
}
if(!isset($invite[name]))
{
//fore each methodof person thace can be invited, lets mark that type of user as invited if they are the ones logged in
if(contactid()==$invite[contactid])
$qry[i_was_invited]=1;
d("invalid invite",$invite);
ddie("Invalid Invite, not configured for this yet");
}
}
$qry[status] = queueapproval_statusfromarray($qry);
$qry[invites]=$invites;
return $qry;
}
function queueapproval_sendnotice($queueapproval)
{
//d("Function queueapproval_sendnotice queueapproval", $queueapproval);
//loop through all invites and send an email, update the invite table with the most recent invite
if(!$queueapproval[invites] || !is_array($queueapproval[invites])) {
if($queueapproval[requestto] && is_array($queueapproval[requestto])) {
foreach($queueapproval[requestto] as $k_type=>$carr) {
foreach($carr as $cid) {
$sql = "insert into tblqueueapprovalinvite
(
queueapprovalid
, queueapprovalinvitecreatedby
, {$k_type}id)
values
(
".db_number($queueapproval[queueapprovalid])."
,".db_number($queueapproval[queueapprovalcreatedby])."
,".db_number($cid)."
)";
db_exec($sql,1);
}
}
$queueapproval = queueapproval_get($queueapproval[type],$queueapproval[queueapprovalid],$queueapproval[queueapprovalmodifier]);
}
}
$emailvars[lowerlevelcontacts]="";
//d('Function queueapproval_sendnotice queueapproval: ',$queueapproval);
if($queueapproval[data][clientcompanyproperty][clientcompanyclientid] && $queueapproval[queueapprovalparam2])
{
//d('clientcompanyclientid: ', $queueapproval[data][clientcompanyproperty][clientcompanyclientid]);
$lowerescalationcontacts=get_lowerescalationcontacts($queueapproval[data][clientcompanyproperty][clientcompanyclientid], $queueapproval[queueapprovalparam2]);
//d("lowerescalationcontacts", $lowerescalationcontacts);
if($lowerescalationcontacts && is_array($lowerescalationcontacts))
{
//d('lowerescalationcontacts: ', $lowerescalationcontacts);
$emailarr[lowerlevelcontacts]='';
foreach($lowerescalationcontacts as $contactkey=>$contactid)
{
$lowerlevelemail = contact_getfield($contactid, contactemail);
//d("lowerlevelemail", $lowerlevelemail);
if($lowerlevelemail)
{
$emailvars[lowerlevelcontacts].=contact_getfield($contactid, contactcname)." ";
}
}
}
}
$emailvars[loannumber]="";
if($queueapproval[data][clientcompanyproperty][clientcompanypropertyid])
$emailvars[loannumber]=get_clientpropertyextensionentry($queueapproval[data][clientcompanyproperty][clientcompanypropertyid],propertyextensionloannumber);
$emailvars[requestername]= get_login_info($queueapproval[queueapprovalcreatedby]);
$emailvars[level]=$queueapproval[queueapprovalparam2];
$emailvars[invitedcontacts]="";
if($queueapproval[invites] && is_array($queueapproval[invites])) {
foreach($queueapproval[invites] as $invite)
{
$externalusertype = externalusertype_get(approvalcontact);
$data = array();
// Contact doesn't get clientcompanyid or property
$data[new_companyidfieldlabel] = 'clientcompanyid';
$data[new_companyidfieldvalue] = 0;
$data[new_propertyidfieldlabel] = 'propertyid';
$data[new_externaluserinviteemail] = contact_getfield($invite[contactid], contactemail);
$data[externalusertypeid] = $externalusertype[externalusertypeid];
$data[new_contactid] = $invite[contactid];
$externaluserinviteid = externaluserinvite_create($data);
d(__SENDING_INVITE__, $invitearr);
$proto="https";
if($_SERVER[SERVER_PORT]==80)
$proto="http";
$emailvars["link"] = "$proto://$_SERVER[HTTP_HOST]?redirect_queueapprovalid=".$queueapproval[queueapprovalid];
$emailvars["additionallinkinfo"]="&redirect_queueapprovalid=".$queueapproval[queueapprovalid];
$emailvars[additionalinfo] = '';
if($queueapproval[additionalinfo])
$emailvars[additionalinfo] = implode(' ',$queueapproval[additionalinfo]);
// Send email notification
externaluserinvite_sendinvite($externaluserinviteid, 'approvalrequestinvite',$emailvars);
$sql = "update tblqueueapprovalinvite set queueapprovalinvitelastnoticesentdate = now() where queueapprovalinviteid = $invite[queueapprovalinviteid]";
db_exec($sql);
if($invite[name])
$emailvars[invitedcontacts].=$invite[name]." ";
}
}
//d("Pulling clientcompanyclient for current clientproperty", $queueapproval[data][clientcompanyproperty][clientcompanyclient]);
if($lowerescalationcontacts && is_array($lowerescalationcontacts))
{
//d(emailvars,$emailvars);
$em = get_email('approvalrequestinvitenotice');
$emailvars[additionalinfo] = '';
if($queueapproval[additionalinfo])
$emailvars[additionalinfo] = implode(' ',$queueapproval[additionalinfo]);
$emailtext = $em[emailtext];
$emailtext = email_replace_arr($emailtext,$emailvars);
$emailsubject = $em[emailsubject];
$emailsubject = email_replace_arr($emailsubject,$emailvars);
foreach($lowerescalationcontacts as $contactkey=>$contactid)
{
$emailto = contact_getfield($contactid, contactemail);
//d("emailto", $emailto);
if($emailto)
html_mail($emailto,$em[emailfrom],$emailsubject,$emailtext);
}
}
}
function queueapproval_request($type, $id,$modifier,$param1, $param2, $requestto,$comment)
{ //$type could be clientoffer,xxxx,yyyyy (add more here as they are allowed)
//$modifier (future use, this will be so that different kinds of approval can be requested and given on the same '$type:$id'
//Removed the following lines so this function could be called and wouldn't die even if $requestto wasn't sent or wasn't an array.
//if(!$requestto && !is_array($requestto))
// ddie("Invalid, this request is being made to NOONE!!");
$arr = queueapproval_get($type, $id,$modifier);
d(arr,$arr);
if($arr[id])
return $arr;
$qaid =db_nextid('queueapproval');
$sql = "insert into tblqueueapproval
(
queueapprovalid
,queueapprovalcreatedby
,{$type}id
,queueapprovalmodifier
,queueapprovalparam1
,queueapprovalparam2
,queueapprovalcreatorcomment
)values(
$qaid
,".loginid()."
,".db_number($id)."
,'".db_col($modifier)."'
,'".db_col($param1)."'
,'".db_col($param2)."'
,'".db_col($comment)."'
)";
d(queueapprovalinsert,$sql);
db_exec($sql,1);
if($requestto && is_array($requestto)) { //Only add invites if we have a requestto
foreach($requestto as $k_type=>$carr)
{
foreach($carr as $cid)
{
$sql = "insert into tblqueueapprovalinvite
(
queueapprovalid
, queueapprovalinvitecreatedby
, {$k_type}id)
values
(
$qaid
,".loginid()."
,".db_number($cid)."
)";
db_exec($sql,1);
}
}
}
$queueapproval = queueapproval_get($type,$id,$modifier);
d(queueapproval,$queueapproval);
queueapproval_sendnotice($queueapproval);
$queueapproval = queueapproval_get($type,$id,$modifier);
return $queueapproval ;
}
function queueapproval_status($type, $id,$modifier='')
{ //$type could be clientoffer,xxxx,yyyyy (add more here as they are allowed)
//$modifier (future use, this will be so that different kinds of approval can be requested and given on the same '$type:$id'
$allowedtypes=explode(',',QUEUEAPPROVAL_TYPELIST);
if(!in_array($type,$allowedtypes))
{
d(debug_backtrace());
return QUEUEAPPROVAL_INVALIDTYPE.$type;
}
$sql = "
select *
from tblqueueapproval
where {$type}id = $id
and queueapprovalmodifier = '".db_col($modifier)."'
order by queueapprovalid desc
limit 1";
$qry = db_first($sql);
return queueapproval_statusfromarray($qry);
}
function queueapproval_statusfromarray($arr)
{
if(!$arr[queueapprovalid])
return QUEUEAPPROVAL_UNREQUESTED;
if($arr[queueapprovalgivendate])
return QUEUEAPPROVAL_GIVEN;
if($arr[queueapprovalrejecteddate])
return QUEUEAPPROVAL_REJECTED;
return QUEUEAPPROVAL_PENDING;
}
function queueapproval_given($type,$id,$modifier='')
{
//this function will only return true if approval has been given
//the function should be used to show / hide functionality in the system which should only be shown if it has been approved
return (queueapproval_status($type, $id,$modifier) == QUEUEAPPROVAL_GIVEN);
}
function queueapproval_getdisplay($type,$id,$modifier,$param1='', $param2='',$options='')
{
if(!$options)
$options=array();
//this function will echo out the step of a queue approval
/*
1) if no queue approval has been requested, a button which allows it to be requested is display
2) if the approval has been requested details of the request will be displayed
3) if the approval has been accepted or rejected that will display
4) a link will display which will give full details of the request
this function will ONLY return true, if the approval has been given, otherwise it returns false
*/
// define the methods / types that could be used to define who could approe the items and what option1 and option2 paramaeters are
$modifiers[clientofferaccept] = array(1=>clientcompanyclientid,2=>escalationlevel) ;
$modifiers[clientoffercounter] = array(1=>clientcompanyclientid,2=>escalationlevel) ;
$modifiers[grouprequestaccept] = array(1=>clientcompanyclientid,2=>escalationlevel) ;
if(!in_array($modifier,array_keys($modifiers)))
ddie("Not a valid modifier type: $modifier");
$paramlist = $modifiers[$modifier];
foreach($paramlist as $paramnum=>$param)
{
$varname = "param$paramnum";
$params[$param] = $$varname;
$params[param.$paramnum] = $$varname;
}
//d(params,$params);
if(!$options)
$options = array();
if(!$options[unrequestedstatus])
$options[unrequestedstatus] = QUEUEAPPROVAL_UNREQUESTED;
if(!$options[button_pending])
$options[button_pending] = "Approval Pending: Details";
if(!$options[button_given])
$options[button_given] = "Approved: Details";
if(!$options[button_rejected])
$options[button_rejected] = "Rejected: Details";
if(!$options[button_unrequested])
$options[button_unrequested] = "Request Approval";
if($options[button_new])
$options[button_unrequested] = $options[button_new];
if(!$options[unrequestedstatus])
$options[unrequestedstatus] = QUEUEAPPROVAL_UNREQUESTED;
/*
posible options: unrequestedstatus - overrides the status
*/
$status = queueapproval_status($type,$id,$modifier);
$statusout = $status;
if($status == QUEUEAPPROVAL_UNREQUESTED)
$statusout = $options[unrequestedstatus];
$buttontext = $options[button_unrequested];
if($status == QUEUEAPPROVAL_PENDING)
$buttontext=$options[button_pending];
if($status == QUEUEAPPROVAL_REJECTED)
$buttontext=$options[button_rejected];
if($status == QUEUEAPPROVAL_GIVEN)
$buttontext=$options[button_given];
$r = 'queueapprovaldetail'.rand(time()/2,time());
// d($params);
foreach($params as $param=>$val)
{
$val = str_replace('"',"",$val); // dont allow the input code to break out of the attributes
$added.=" $param=\"$val\"";
}
$out.= "
";
//echo "Approval: $statusout";
return $out;
}
function queueapproval_paramlabels($type,$modifier)
{
//d(type,$type);
//d(modifier,$modifier);
if($type==clientoffer)
$arr[clientoffer][''][queueapprovalparam2]='Escalation Level';
elseif($type==propertyextensiongrouprequest)
$arr[propertyextensiongrouprequest][''][queueapprovalparam2]='Escalation Level';
if(!$arr[$type][$modifier])
$modifier='';
$arr = $arr[$type][$modifier];
if($arr)
return $arr;
return array();
}
function queueapproval_setaddeddata($type,$modifier, &$data)
{
$params= queueapproval_paramlabels($type,$modifier);
//d(params,$params);
foreach($params as $param=>$label)
$data[addeddata][$label] = $data[$param];
if($type==clientoffer)
{
// d(data,$data);
$data[name]="Approve Client Offer #$data[clientofferid]";
$offer = clientoffer_get('',$data[clientofferid]);
//d(offer,$offer);
$data[data][clientoffer]=$offer;
$neg = clientnegotiation_get('',$offer[clientnegotiationid]);
//d(neg,$neg);
$neg=$neg[0];
$prop = get_clientcompanyproperty($neg[clientcompanypropertyid]);
//d(prop,$prop);
$data[data][clientoffer]=$offer;
$data[data][clientnegotiation]=$neg;
$data[data][clientcompanyproperty]=$prop;
$data[address] = $prop[clientcompanypropertyaddress];
$data[descr] = "On $prop[clientcompanypropertyaddress] ";
if($data[addeddata] && is_array($data[addeddata])){
foreach($data[addeddata] as $label => $value)
$data[descr] .=" $label $value ";
}
} elseif($type==propertyextensiongrouprequest) {
//d(data,$data);
$grouprequest = get_grouprequest($data[propertyextensiongrouprequestid]);
//d(grouprequest,$grouprequest);
//$data[name]="Approve Group Request #$data[propertyextensiongrouprequestid]";
$data[name]="Approve ".$grouprequest[0][propertyextensiongroupname]." Change#".$data[propertyextensiongrouprequestid];
$data[data][propertyextensiongrouprequest]=$grouprequest;
$prop = get_clientcompanyproperty($grouprequest[0][clientcompanypropertyid]);
//d(prop,$prop);
$data[data][clientcompanyproperty]=$prop;
$data[address] = $prop[clientcompanypropertyaddress];
$data[descr] = "On $prop[clientcompanypropertyaddress] ";
if($data[addeddata] && is_array($data[addeddata])){
foreach($data[addeddata] as $label => $value)
{
if($value==0)
$data[descr] .=" $label Auto Approved ";
else
$data[descr] .=" $label $value ";
}
}
}
if($data[data][clientcompanyproperty][clientcompanypropertyid]) {
$loannumber=clientcompanyproperty_get_propertyextension($data[data][clientcompanyproperty][clientcompanypropertyid], 'propertyextensionloannumber');
if($loannumber)
$data[data][loannumber]=$loannumber;
}
$additionalinfo=array();
if($data[address])
$additionalinfo[]=" Address: $data[address]";
if($data[name])
$additionalinfo[]=" Request: $data[name]";
if($data[addeddata])
foreach($data[addeddata] as $k=>$v)
$additionalinfo[]=" $k: $v";
if($additionalinfo)
$data[additionalinfo] = $additionalinfo;
//d(data,$data);
}
function queueapproval_displaydetail($queueapproval)
{
d("In Function: queueapproval_displaydetail",$queueapproval);
$status = $queueapproval[status];
echo "";
echo "