<?php
/*!
* Jetpack CRM
* https://jetpackcrm.com
* V1.1.15
*
* Copyright 2020 Automattic
*
* Date: 30/08/16
*/
defined( 'ZEROBSCRM_PATH' ) || exit( 0 );
/* ======================================================
Setup Internal Automator Recipes:
====================================================== */
// Note on contact.vitals.update vs contact.update,
// ... if contact.vitals.update fires, it will fire AS WELL as contact.update.
// ... if contact.email.update fires, it will fire AS WELL as contact.update.
#} Set IA Recipes (CREATED)
zeroBSCRM_AddInternalAutomatorRecipe('contact.new','zeroBSCRM_IA_NewCustomerClientPortal',array());
zeroBSCRM_AddInternalAutomatorRecipe('contact.new','zeroBSCRM_IA_NewCustomerLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('contact.status.update','zeroBSCRM_IA_CustomerStatusChangePortalAndLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('contact.status.update','zeroBSCRM_IA_CustomerStatusChangeAutoLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('contact.new','zeroBSCRM_IA_ContactSegmentCompiler',array()); // for edit + new
zeroBSCRM_AddInternalAutomatorRecipe('contact.update','zeroBSCRM_IA_ContactSegmentCompiler',array()); // for edit + new
zeroBSCRM_AddInternalAutomatorRecipe('company.new','zeroBSCRM_IA_NewCompanyLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('quote.new','zeroBSCRM_IA_NewQuoteLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('quote.new','zeroBSCRM_IA_quoteSegmentCompiler',array());
zeroBSCRM_AddInternalAutomatorRecipe('quote.update','zeroBSCRM_IA_quoteSegmentCompiler',array());
zeroBSCRM_AddInternalAutomatorRecipe('quote.accepted','zeroBSCRM_IA_AcceptedQuoteLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('invoice.new','zeroBSCRM_IA_NewInvoiceLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('invoice.new','zeroBSCRM_IA_invoiceSegmentCompiler',array());
zeroBSCRM_AddInternalAutomatorRecipe('invoice.update','zeroBSCRM_IA_invoiceSegmentCompiler',array());
zeroBSCRM_AddInternalAutomatorRecipe('log.new','zeroBSCRM_IA_NewLogCatchContactsDB2',array());
zeroBSCRM_AddInternalAutomatorRecipe('transaction.new','zeroBSCRM_IA_NewTransactionLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('transaction.new','zeroBSCRM_IA_transactionSegmentCompiler',array());
zeroBSCRM_AddInternalAutomatorRecipe('transaction.update','zeroBSCRM_IA_transactionSegmentCompiler',array());
zeroBSCRM_AddInternalAutomatorRecipe('event.new','zeroBSCRM_IA_NewEventLog',array());
zeroBSCRM_AddInternalAutomatorRecipe('clientwpuser.new','zeroBSCRM_IA_NewClientPortalUserLog',array());
#} Set IA Recipes (UPDATED)
#} - WH commented out, you need to have a corresponding function for any of these you add:
#// zeroBSCRM_AddInternalAutomatorRecipe('status.change','zeroBSCRM_IA_StatusChange',array());
// WP Hook tie-ins (for Mike [and 3rd party developers!], mostly).
zeroBSCRM_AddInternalAutomatorRecipe( 'contact.new', 'zeroBSCRM_IA_NewCustomerWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'contact.update', 'zeroBSCRM_IA_EditCustomerWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'contact.status.update', 'zeroBSCRM_IA_EditCustomerWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'contact.vitals.update', 'zeroBSCRM_IA_EditCustomerVitalsWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'contact.email.update', 'zeroBSCRM_IA_EditCustomerEmailWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'contact.delete', 'zeroBSCRM_IA_DeleteCustomerWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'company.new', 'zeroBSCRM_IA_NewCompanyWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'company.delete', 'zeroBSCRM_IA_DeleteCompanyWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'quote.new', 'zeroBSCRM_IA_NewQuoteWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'quote.accepted', 'zeroBSCRM_IA_AcceptedQuoteWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'quote.update', 'zeroBSCRM_IA_EditInvoiceWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'quote.status.update', 'zeroBSCRM_IA_EditInvoiceWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'quote.delete', 'zeroBSCRM_IA_DeleteQuoteWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'invoice.new', 'zeroBSCRM_IA_NewInvoiceWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'invoice.update', 'zeroBSCRM_IA_EditInvoiceWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'invoice.status.update', 'zeroBSCRM_IA_EditInvoiceWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'invoice.delete', 'zeroBSCRM_IA_DeleteInvoiceWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'transaction.new', 'zeroBSCRM_IA_NewTransactionWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'transaction.delete', 'zeroBSCRM_IA_DeleteTransactionWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'event.new', 'zeroBSCRM_IA_NewEventWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'event.update', 'zeroBSCRM_IA_UpdateEventWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'event.delete', 'zeroBSCRM_IA_DeleteEventWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'clientwpuser.new', 'zeroBSCRM_IA_NewClientPortalUserHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'segment.delete', 'zeroBSCRM_IA_DeleteSegmentWPHook', array() );
zeroBSCRM_AddInternalAutomatorRecipe( 'contact.before.delete', 'zeroBSCRM_IA_BeforeDeleteCustomerWPHook', array() );
// don't need to expose tbh
//zeroBSCRM_AddInternalAutomatorRecipe('form.delete','zeroBSCRM_IA_DeleteFormWPHook',array());
// DAL3.0 + can use these:
/*
company.new
company.update
company.status.update
quote.new
quote.update
log.update
event.new
event.update
form.new
form.update
invoice.new
invoice.update
invoice.status.update
transaction.new
transaction.update
transaction.status.update
quotetemplate.new
quotetemplate.update
*/
/* ======================================================
/ Setup Internal Automator Recipes:
====================================================== */
/* ======================================================
Internal Automator Recipe Functions
====================================================== */
#} Adds a "created" log to users (if setting)
function zeroBSCRM_IA_NewCustomerLog($obj=array()){
# if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_customer_new');
if ($autoLogThis > 0){
#} Retrieve necessary info:
$zbsNoteAgainstPostID = -1; if (is_array($obj) && isset($obj['id'])) $zbsNoteAgainstPostID = (int)$obj['id'];
if (isset($zbsNoteAgainstPostID) && !empty($zbsNoteAgainstPostID)){
#} First check if an override is passed...
if (isset($obj['automatorpassthrough']) && is_array($obj['automatorpassthrough']) && isset($obj['automatorpassthrough']['note_override']) && is_array($obj['automatorpassthrough']['note_override']) && isset($obj['automatorpassthrough']['note_override']['type'])){
#} An overriding note has been passed, just use that
#} Add log
$newLogID = zeroBS_addUpdateContactLog($zbsNoteAgainstPostID,-1,-1,$obj['automatorpassthrough']['note_override']);
} else {
#} No override, use default processing...
#} Set Deets
$newCustomerName = ''; if (is_array($obj) && isset($obj['id']) && isset($obj['customerMeta']) && is_array($obj['customerMeta'])) $newCustomerName = zeroBS_customerName($obj['id'],$obj['customerMeta'],false,true);
$noteShortDesc = 'Customer Created'; if (!empty($newCustomerName)) $noteShortDesc = $newCustomerName;
$note_long_description = '';
// Custom short desc for external source creations
if (isset($obj['extsource']) && !empty($obj['extsource'])){
$uid = '';
// We seem to pass either the external source array (woo)
// ... or a string 'pay', so lets select the right one...
if ( is_array( $obj['extsource'] ) && isset( $obj['extsource']['source'] ) ){
$source_key = $obj['extsource']['source'];
// if we have this we also have UID
$uid = $obj['extsource']['uid'];
} else {
$source_key = $obj['extsource'];
}
switch ( $source_key ){
case 'pay':
$note_long_description = __( 'Created from PayPal', 'zero-bs-crm' ) . '<i class="fa fa-paypal"></i>';
break;
case 'woo':
$note_long_description = __( 'Created from WooCommerce Order', 'zero-bs-crm' ) . ' <i class="fa fa-shopping-cart"></i>';
break;
case 'env':
$note_long_description = __( 'Created from Envato', 'zero-bs-crm' ) . '<i class="fa fa-envira"></i>';
break;
case 'form':
$note_long_description = __( 'Created from Form Capture', 'zero-bs-crm' ) . '<i class="fa fa-wpforms"></i>';
break;
case 'csv':
$note_long_description = __( 'Created from CSV Import', 'zero-bs-crm' ) . '<i class="fa fa-file-text"></i>';
break;
case 'gra':
$note_long_description = __( 'Created from Gravity Forms', 'zero-bs-crm' ) . '<i class="fa fa-wpforms"></i>';
break;
default:
// Generic fallback (shouldn't ever fire)
$note_long_description = __( 'Created from External Source', 'zero-bs-crm' ) . ' <i class="fa fa-users"></i>';
break;
}
// allow extension override via filter (e.g. WooSync)
$note_long_description = apply_filters( 'jpcrm_new_contact_log', $note_long_description, $source_key, $uid );
}
#} Add log
$newLogID = zeroBS_addUpdateContactLog($zbsNoteAgainstPostID,-1,-1,array(
'type' => 'Created',
'shortdesc' => $noteShortDesc,
'longdesc' => $note_long_description
));
} # / end of if no override
}
}
}
#} Adds a "created" log to users (if setting)
function zeroBSCRM_IA_NewCompanyLog($obj=array()){
# if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_company_new');
if ($autoLogThis > 0){
#} Retrieve necessary info:
$zbsNoteAgainstPostID = -1; if (is_array($obj) && isset($obj['id'])) $zbsNoteAgainstPostID = (int)$obj['id'];
if (isset($zbsNoteAgainstPostID) && !empty($zbsNoteAgainstPostID)){
#} First check if an override is passed...
if (isset($obj['automatorpassthrough']) && is_array($obj['automatorpassthrough']) && isset($obj['automatorpassthrough']['note_override']) && is_array($obj['automatorpassthrough']['note_override']) && isset($obj['automatorpassthrough']['note_override']['type'])){
#} An overriding note has been passed, just use that
#} Add log
$newLogID = zeroBS_addUpdateLog($zbsNoteAgainstPostID,-1,-1,$obj['automatorpassthrough']['note_override'],'zerobs_company');
} else {
#} No override, use default processing...
#} Set Deets
$newCompanyName = ''; if (is_array($obj) && isset($obj['id']) && isset($obj['companyMeta']) && is_array($obj['companyMeta'])) $newCompanyName = zeroBS_companyName($obj['id'],$obj['companyMeta'],false,true);
$noteShortDesc = 'Company Created'; if (!empty($newCompanyName)) $noteShortDesc = $newCompanyName;
$note_long_description = '';
// Custom short desc for external source creations
if (isset($obj['extsource']) && !empty($obj['extsource'])){
// We seem to pass either the external source array (woo)
// ... or a string 'pay', so lets select the right one...
if ( is_array( $obj['extsource'] ) && isset( $obj['extsource']['source'] ) ){
$source_key = $obj['extsource']['source'];
// if we have this we also have UID
$uid = $obj['extsource']['uid'];
} else {
$source_key = $obj['extsource'];
}
switch ( $source_key ){
case 'pay':
$note_long_description = 'Created from PayPal <i class="fa fa-paypal"></i>';
break;
case 'woo':
if ( isset( $uid ) ){
$note_long_description = sprintf( __( 'Created from WooCommerce Order #%s', 'zero-bs-crm' ), $uid ) . ' <i class="fa fa-shopping-cart"></i>';
} else {
$note_long_description = __( 'Created from WooCommerce Order', 'zero-bs-crm' ) . ' <i class="fa fa-shopping-cart"></i>';
}
break;
case 'env':
$note_long_description = 'Created from Envato <i class="fa fa-envira"></i>';
break;
case 'form':
$note_long_description = 'Created from Form Capture <i class="fa fa-wpforms"></i>';
break;
case 'csv':
$note_long_description = 'Created from CSV Import <i class="fa fa-file-text"></i>';
break;
default:
#} Generic for now (SHOULD NEVER CALL)
$note_long_description = 'Created from External Source <i class="fa fa-users"></i>';
break;
}
}
#} Add log
$newLogID = zeroBS_addUpdateLog($zbsNoteAgainstPostID,-1,-1,array(
'type' => 'Created',
'shortdesc' => $noteShortDesc,
'longdesc' => $note_long_description
),'zerobs_company');
} # / end of if no override
}
}
}
#} Adds a "created" log to customer (of quotes) (if setting)
function zeroBSCRM_IA_NewQuoteLog($obj=array()){
# if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_quote_new');
if ($autoLogThis > 0){
// 3.0+
#} Retrieve necessary info:
$noteAgainstIDs = array('contacts'=>array(),'companies'=>array());
if (is_array($obj) && isset($obj['againstids']) && is_array($obj['againstids'])){
// trusting they're correctly passed...
if (isset($obj['againstids']['contacts']) && is_array($obj['againstids']['contacts'])) $noteAgainstIDs['contacts'] = $obj['againstids']['contacts'];
if (isset($obj['againstids']['companies']) && is_array($obj['againstids']['companies'])) $noteAgainstIDs['companies'] = $obj['againstids']['companies'];
}
$quoteID = ''; if (is_array($obj) && isset($obj['id'])) $quoteID = $obj['id'];
$quoteTitle = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['title']) && !empty($obj['data']['title'])) $quoteTitle = $obj['data']['title'];
$quoteValue = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['value']) && !empty($obj['data']['value'])) $quoteValue = zeroBSCRM_formatCurrency($obj['data']['value']);
$extsource = ''; if (is_array($obj) && is_array($obj['extsource']) && isset($obj['extsource']['source']) && !empty($obj['extsource']['source'])) $extsource = $obj['extsource']['source'];
$extsourceID = ''; if (is_array($obj) && is_array($obj['extsource']) && isset($obj['extsource']['uid']) && !empty($obj['extsource']['uid'])) $extsourceID = $obj['extsource']['uid'];
// build str
$note_long_description = '';
$noteShortDesc = '';
if (!empty($quoteID)) $noteShortDesc .= '#'.$quoteID;
if (!empty($quoteTitle)) $noteShortDesc .= $quoteTitle;
if (!empty($quoteValue)) $noteShortDesc .= ' ('.$quoteValue.')';
if (!empty($extsource) && !empty($extsourceID)) $note_long_description = __('Created by','zero-bs-crm').' '.zeroBS_getExternalSourceTitle($extsource,$extsourceID);
if (is_array($noteAgainstIDs['contacts']) && count($noteAgainstIDs['contacts']) > 0) foreach ($noteAgainstIDs['contacts'] as $cID){
#} Add log
$newLogID = zeroBS_addUpdateLog($cID,-1,-1,array(
'type' => __('Quote Created','zero-bs-crm'),
'shortdesc' => $noteShortDesc,
'longdesc' => $note_long_description
),'zerobs_customer');
}
}
}
// Adds an "accepted" log to contact (of quote) (if setting)
function zeroBSCRM_IA_AcceptedQuoteLog($obj=array()){
# if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_quote_accepted');
if ($autoLogThis > 0){
global $zbs;
// retrieve quote
$quoteID = ''; if (is_array($obj) && isset($obj['id'])) $quoteID = $obj['id'];
$quote = $zbs->DAL->quotes->getQuote($quoteID);
if ( is_array($quote) && count($quote['contact']) > 0 ){
// get signed by if passed
$signedBy = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['signed']) && !empty($obj['data']['signed'])) $signedBy = $obj['data']['signed'];
// could get `ip` but not really user friendly/needed
// build str
$note_long_description = '';
$noteShortDesc = '';
if (!empty($quoteID)) $noteShortDesc .= '#'.$quoteID;
if (!empty($quoteTitle)) $noteShortDesc .= $quote['title'];
if (!empty($quoteValue)) $noteShortDesc .= ' ('.zeroBSCRM_formatCurrency($quote['value']).')';
if (!empty($signedBy)) $note_long_description = __('Signed','zero-bs-crm').' '.$signedBy;
if (is_array($quote['contact'])) foreach ($quote['contact'] as $contact){
#} Add log
$newLogID = zeroBS_addUpdateLog($contact['id'],-1,-1,array(
'type' => __('Quote: Accepted','zero-bs-crm'),
'shortdesc' => $noteShortDesc,
'longdesc' => $note_long_description
),'zerobs_customer');
}
}
}
}
#} Adds a "created" log to customer (of quotes) (if setting)
function zeroBSCRM_IA_NewInvoiceLog($obj=array()){
# if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_invoice_new');
if ($autoLogThis > 0){
#} Retrieve necessary info:
$noteAgainstIDs = array('contacts'=>array(),'companies'=>array());
if (is_array($obj) && isset($obj['againstids']) && is_array($obj['againstids'])){
// trusting they're correctly passed...
if (isset($obj['againstids']['contacts']) && is_array($obj['againstids']['contacts'])) $noteAgainstIDs['contacts'] = $obj['againstids']['contacts'];
if (isset($obj['againstids']['companies']) && is_array($obj['againstids']['companies'])) $noteAgainstIDs['companies'] = $obj['againstids']['companies'];
}
$invoiceID = ''; if (is_array($obj) && isset($obj['id'])) $invoiceID = $obj['id'];
$invoiceRef = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['id_override']) && !empty($obj['data']['id_override'])) $invoiceRef = $obj['data']['id_override'];
$invoiceValue = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['total']) && !empty($obj['data']['total'])) $invoiceValue = zeroBSCRM_formatCurrency($obj['data']['total']);
$extsource = ''; if (is_array($obj) && is_array($obj['extsource']) && isset($obj['extsource']['source']) && !empty($obj['extsource']['source'])) $extsource = $obj['extsource']['source'];
$extsourceID = ''; if (is_array($obj) && is_array($obj['extsource']) && isset($obj['extsource']['uid']) && !empty($obj['extsource']['uid'])) $extsourceID = $obj['extsource']['uid'];
// build str
$note_long_description = '';
$noteShortDesc = '';
if (!empty($invoiceID) && empty($invoiceRef)) $noteShortDesc .= '#'.$invoiceID;
if (!empty($invoiceRef)) $noteShortDesc .= $invoiceRef;
if (!empty($invoiceValue)) $noteShortDesc .= ' ('.$invoiceValue.')';
if (!empty($extsource) && !empty($extsourceID)) $note_long_description = __('Created by','zero-bs-crm').' '.zeroBS_getExternalSourceTitle($extsource,$extsourceID);
if (is_array($noteAgainstIDs['contacts']) && count($noteAgainstIDs['contacts']) > 0) foreach ($noteAgainstIDs['contacts'] as $cID){
#} Add log
$newLogID = zeroBS_addUpdateLog($cID,-1,-1,array(
'type' => __('Invoice Created','zero-bs-crm'),
'shortdesc' => $noteShortDesc,
'longdesc' => $note_long_description
),'zerobs_customer');
}
}
}
#} Adds a "created" log to customer (of trans) (if setting)
function zeroBSCRM_IA_NewTransactionLog($obj=array()){
$newLogID = false;
#} if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_transaction_new');
if ($autoLogThis > 0){
#} Retrieve necessary info:
$noteAgainstIDs = array('contacts'=>array(),'companies'=>array());
if (is_array($obj) && isset($obj['againstids']) && is_array($obj['againstids'])){
// trusting they're correctly passed...
if (isset($obj['againstids']['contacts']) && is_array($obj['againstids']['contacts'])) $noteAgainstIDs['contacts'] = $obj['againstids']['contacts'];
if (isset($obj['againstids']['companies']) && is_array($obj['againstids']['companies'])) $noteAgainstIDs['companies'] = $obj['againstids']['companies'];
}
$transactionID = ''; if (is_array($obj) && isset($obj['id'])) $transactionID = $obj['id'];
$transactionRef = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['ref']) && !empty($obj['data']['ref'])) $transactionRef = $obj['data']['ref'];
$transactionValue = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['total']) && !empty($obj['data']['total'])) $transactionValue = zeroBSCRM_formatCurrency($obj['data']['total']);
$extsource = ''; if (is_array($obj) && is_array($obj['extsource']) && isset($obj['extsource']['source']) && !empty($obj['extsource']['source'])) $extsource = $obj['extsource']['source'];
$extsourceID = ''; if (is_array($obj) && is_array($obj['extsource']) && isset($obj['extsource']['uid']) && !empty($obj['extsource']['uid'])) $extsourceID = $obj['extsource']['uid'];
// build str
$note_long_description = '';
$noteShortDesc = '';
if (!empty($transactionID) && empty($transactionRef)) $noteShortDesc .= '#'.$transactionID;
if (!empty($transactionRef)) $noteShortDesc .= $transactionRef;
if (!empty($transactionValue)) $noteShortDesc .= ' ('.$transactionValue.')';
if (!empty($extsource) && !empty($extsourceID)) $note_long_description = __('Created by','zero-bs-crm').' '.zeroBS_getExternalSourceTitle($extsource,$extsourceID);
if (is_array($noteAgainstIDs['contacts']) && count($noteAgainstIDs['contacts']) > 0) foreach ($noteAgainstIDs['contacts'] as $cID){
#} Add log
$newLogID = zeroBS_addUpdateLog($cID,-1,-1,array(
'type' => __('Transaction Created','zero-bs-crm'),
'shortdesc' => $noteShortDesc,
'longdesc' => $note_long_description
),'zerobs_customer');
}
} // / if autolog
return $newLogID;
}
#} Adds a "created" log to customer (of task) (if setting)
function zeroBSCRM_IA_NewEventLog($obj=array()){
$newLogID = false;
#} if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_event_new');
#} if has id
$zbsNoteAgainstPostID = -1; if (is_array($obj) && isset($obj['againstid']) && $obj['againstid'] > 0) $zbsNoteAgainstPostID = (int)$obj['againstid'];
if ($autoLogThis > 0 && isset($zbsNoteAgainstPostID) && !empty($zbsNoteAgainstPostID)){
#} Retrieve necessary info:
$noteAgainstIDs = array('contacts'=>array(),'companies'=>array());
if (is_array($obj) && isset($obj['againstids']) && is_array($obj['againstids'])){
// trusting they're correctly passed...
if (isset($obj['againstids']['contacts']) && is_array($obj['againstids']['contacts'])) $noteAgainstIDs['contacts'] = $obj['againstids']['contacts'];
if (isset($obj['againstids']['companies']) && is_array($obj['againstids']['companies'])) $noteAgainstIDs['companies'] = $obj['againstids']['companies'];
}
$taskID = ''; if (is_array($obj) && isset($obj['id'])) $taskID = $obj['id'];
$taskTitle = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['title']) && !empty($obj['data']['title'])) $taskTitle = $obj['data']['title'];
$taskDescription = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['desc']) && !empty($obj['data']['desc'])) $taskDescription = $obj['data']['desc'];
$taskStart = ''; if (is_array($obj) && is_array($obj['data']) && isset($obj['data']['start']) && !empty($obj['data']['start'])) $taskStart = zeroBSCRM_locale_utsToDatetime($obj['data']['start']);
// build str
$note_long_description = '';
$noteShortDesc = '';
if (!empty($taskID) && empty($taskTitle)) $noteShortDesc .= '#'.$taskID;
if (!empty($taskTitle)) $noteShortDesc .= $taskTitle;
if (!empty($taskDescription)) $note_long_description = $taskDescription;
if (!empty($taskStart)) {
// pad if filled
if (!empty($note_long_description)) $note_long_description .= '<br />';
// add starting date
$note_long_description .= __('Starts at ','zero-bs-crm').' '.$taskStart;
}
if (is_array($noteAgainstIDs['contacts']) && count($noteAgainstIDs['contacts']) > 0) foreach ($noteAgainstIDs['contacts'] as $cID){
#} Add log
$newLogID = zeroBS_addUpdateLog($cID,-1,-1,array(
'type' => __('Task Created','zero-bs-crm'),
'shortdesc' => $noteShortDesc,
'longdesc' => $note_long_description
),'zerobs_customer');
}
}
return $newLogID;
}
/**
* Catches new logs and updates contact 'last contacted' if contact type log
*
* @param array $obj Array containing log details.
*/
function zeroBSCRM_IA_NewLogCatchContactsDB2( $obj = array() ) {
global $zbs;
// for now, only contacts
if ( is_array( $obj ) && isset( $obj['logagainsttype'] ) && ( $obj['logagainsttype'] === 'zerobs_customer' || $obj['logagainsttype'] === ZBS_TYPE_CONTACT ) ) {
// check if 'contact' type
$log_type = '';
if ( is_array( $obj ) && isset( $obj['logtype'] ) ) {
$log_type = $obj['logtype'];
}
if ( ! empty( $log_type ) && in_array( $log_type, $zbs->DAL->logs->contact_log_types, true ) ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
// checks out..proceed
// retrieve
$contact_id = -1;
if ( is_array( $obj ) && isset( $obj['logagainst'] ) ) {
$contact_id = (int) $obj['logagainst'];
}
if ( ! empty( $contact_id ) && $contact_id > 0 ) {
// update contact
$zbs->DAL->contacts->setContactLastContactUTS( $contact_id, time() ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
}
} // is a contact type log
} // is log against contact
}
#} Adds a "created" log to customer (if setting)
function zeroBSCRM_IA_NewClientPortalUserLog($obj=array()){
# if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_clientportal_new');
if ($autoLogThis > 0){
#} Retrieve necessary info:
$zbsNoteAgainstPostID = -1; if (is_array($obj) && isset($obj['againstid']) && $obj['againstid'] > 0) $zbsNoteAgainstPostID = (int)$obj['againstid'];
#TRANSITIONTOMETANO
$userID = -1; if (is_array($obj) && isset($obj['id']) && $obj['id'] > 0) $userID = (int)$obj['id'];
$userEmail = ''; if (is_array($obj) && isset($obj['userEmail'])) $userEmail = $obj['userEmail'];
$noteShortDesc = ''; if (!empty($userEmail)) $noteShortDesc = __('Created with email',"zero-bs-crm").': '.$userEmail;
if ($userID > 0) $noteShortDesc .= ' (#'.$userID.')';
if (isset($zbsNoteAgainstPostID) && !empty($zbsNoteAgainstPostID)){
#} Add log
$newLogID = zeroBS_addUpdateContactLog($zbsNoteAgainstPostID,-1,-1,array(
'type' => 'Client Portal User Created',
'shortdesc' => $noteShortDesc,
'longdesc' => ''
));
}
}
}
#} creates customer client portal user (if setting)
function zeroBSCRM_IA_NewCustomerClientPortal($obj=array()){
# if setting
$autoFireThis = zeroBSCRM_getSetting('portalusers');
if ($autoFireThis > 0){
#} Retrieve necessary info:
$userID = -1; if (is_array($obj) && isset($obj['id']) && $obj['id'] > 0) $userID = (int)$obj['id'];
// yup
$okayToFire = true;
// Specific status mode ==================================
#} If using "specific statuses only"
$statusList = zeroBSCRM_getSetting('portalusers_status');
if (!is_array($statusList) && (empty($statusList) || $statusList == 'all')){
// nothing to do
} else {
if (is_array($statusList)){
// generate a list of "Okay" statuses that this'll check later on...
$zbsStatusStr = zeroBSCRM_getCustomerStatuses();
$zbsStatuses = explode(',', $zbsStatusStr);
$okayStatuses = array();
// cycle through settings + copy "full str" rather than "full_str" that it'll be saved as
foreach ($zbsStatuses as $statusStr){
// permify
$statusKey = strtolower(str_replace(' ','_',str_replace(':','_',$statusStr)));
// present?
if (in_array($statusKey, $statusList)) $okayStatuses[] = $statusStr;
}
// is user's status in one of these?
$customerStatus = ''; if (isset($obj['customerMeta']) && is_array($obj['customerMeta']) && isset($obj['customerMeta']['status'])) $customerStatus = $obj['customerMeta']['status'];
// if no status, try fill from (whatever was added) to db
if (empty($customerStatus)){
$cMeta = zeroBS_getCustomerMeta($userID);
if (is_array($cMeta) && isset($cMeta['status'])) $customerStatus = $cMeta['status'];
}
// check status
if (!empty($customerStatus) && in_array($customerStatus,$okayStatuses))
$okayToFire = true;
else
$okayToFire = false; // customer status empty or not in approved list :)
} else {
// non-standard val for status list, override it to all
global $zbs;
$zbs->settings->update('portalusers_status','all');
// and let it fire..
}
}
// / Specific status mode ==================================
if ($okayToFire){
// this'll check itself if already exists, so no harm in letting it (potentially) multifire
if ($userID > 0) zeroBSCRM_createClientPortalUserFromRecord($userID);
}
}
}
#} Compiles any segments which this contact fits in
// works for new contacts + contact edits
function zeroBSCRM_IA_ContactSegmentCompiler($obj=array()){
# if setting
$autoCompileSegments = 1;
if ($autoCompileSegments > 0){
#} Retrieve necessary info:
$zbsNoteAgainstPostID = -1; if (is_array($obj) && isset($obj['id'])) $zbsNoteAgainstPostID = (int)$obj['id'];
$contactWasInSegments = array(); if (is_array($obj) && isset($obj['prevSegments']) && is_array($obj['prevSegments'])) $contactWasInSegments = $obj['prevSegments'];
if (isset($zbsNoteAgainstPostID) && !empty($zbsNoteAgainstPostID)){
global $zbs;
$zbs->DAL->segments->compileSegmentsAffectedByContact($zbsNoteAgainstPostID,$contactWasInSegments);
}
}
}
/*
* Recompiles any segments affected by quote change
*
* Fires on:
* quote.new
* quote.update
*
*/
function zeroBSCRM_IA_quoteSegmentCompiler( $obj=array() ){
global $zbs;
// if quote passed:
if ( is_array( $obj ) && isset( $obj['data'] ) ) {
$zbs->DAL->segments->compileSegmentsAffectedByQuote( $obj['data'] ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
}
}
/*
* Recompiles any segments affected by invoice change
*
* Fires on:
* invoice.new
* invoice.update
*
*/
function zeroBSCRM_IA_invoiceSegmentCompiler( $obj=array() ){
global $zbs;
// if quote passed:
if ( is_array( $obj ) && isset( $obj['data'] ) ) {
$zbs->DAL->segments->compileSegmentsAffectedByInvoice( $obj['data'] ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
}
}
/*
* Recompiles any segments affected by transaction change
*
* Fires on:
* transaction.new
* transaction.update
*
*/
function zeroBSCRM_IA_transactionSegmentCompiler( $obj=array() ){
global $zbs;
// if quote passed:
if ( is_array( $obj ) && isset( $obj['data'] ) ) {
$zbs->DAL->segments->compileSegmentsAffectedByTransaction( $obj['data'] ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
}
}
#} when customer status changes, portal access can be revoked/added based on status (if setting)
function zeroBSCRM_IA_CustomerStatusChangePortalAndLog($obj=array()){
# if setting
$autoFireThis = zeroBSCRM_getSetting('portalusers');
if ($autoFireThis > 0){
#} Retrieve necessary info:
$userID = -1; if (is_array($obj) && isset($obj['id']) && $obj['id'] > 0) $userID = (int)$obj['id'];
#} If using "specific statuses only"
$statusList = zeroBSCRM_getSetting('portalusers_status');
if (!is_array($statusList) && (empty($statusList) || $statusList == 'all')){
// nothing to do - all statuses allowed
} else {
if (is_array($statusList)){
// generate a list of "Okay" statuses that this'll check later on...
$zbsStatusStr = zeroBSCRM_getCustomerStatuses();
$zbsStatuses = explode(',', $zbsStatusStr);
$okayStatuses = array();
// cycle through settings + copy "full str" rather than "full_str" that it'll be saved as
foreach ($zbsStatuses as $statusStr){
// permify
$statusKey = strtolower(str_replace(' ','_',str_replace(':','_',$statusStr)));
// present?
if (in_array($statusKey, $statusList)) $okayStatuses[] = $statusStr;
}
// is user's status in one of these?
$customerStatus = ''; if (isset($obj['customerMeta']) && is_array($obj['customerMeta']) && isset($obj['customerMeta']['status'])) $customerStatus = $obj['customerMeta']['status'];
// if no status, try fill from (whatever was added) to db
if (empty($customerStatus)){
$cMeta = zeroBS_getCustomerMeta($userID);
if (is_array($cMeta) && isset($cMeta['status'])) $customerStatus = $cMeta['status'];
}
// check status
if (!empty($customerStatus) && in_array($customerStatus,$okayStatuses)){
// NEEDS account access
// already got?
$portalID = zeroBSCRM_getClientPortalUserID($userID);
if (!empty($portalID) && $portalID > 0){
$isDisabled = zeroBSCRM_isCustomerPortalDisabled($userID);
// if disabled
if ($isDisabled){
// already got acc, make sure enabled
zeroBSCRM_customerPortalDisableEnable($userID,'enable');
$noteShortDesc = __('Access enabled (by change of status to',"zero-bs-crm").' "'.$customerStatus.'"';
#} Add log
$newLogID = zeroBS_addUpdateContactLog($userID,-1,-1,array(
'type' => 'Client Portal Access Changed',
'shortdesc' => $noteShortDesc,
'longdesc' => ''
));
}
} else {
// make acc
if ($userID > 0) {
zeroBSCRM_createClientPortalUserFromRecord($userID);
$noteShortDesc = __('Access created (by change of status to',"zero-bs-crm").' "'.$customerStatus.'"';
#} Add log
$newLogID = zeroBS_addUpdateContactLog($userID,-1,-1,array(
'type' => 'Client Portal Access Changed',
'shortdesc' => $noteShortDesc,
'longdesc' => ''
));
}
}
} else {
// SHOULD Not have account
// already got?
$portalID = zeroBSCRM_getClientPortalUserID($userID);
if (!empty($portalID) && $portalID > 0){
$isDisabled = zeroBSCRM_isCustomerPortalDisabled($userID);
// if not already disabled
if (!$isDisabled){
// disable if found
zeroBSCRM_customerPortalDisableEnable($userID,'disable');
$noteShortDesc = __('Access disabled (by change of status to',"zero-bs-crm").' "'.$customerStatus.'"';
#} Add log
$newLogID = zeroBS_addUpdateContactLog($userID,-1,-1,array(
'type' => 'Client Portal Access Changed',
'shortdesc' => $noteShortDesc,
'longdesc' => ''
));
}
}
}
} else {
// non-standard val for status list, override it to all
global $zbs;
$zbs->settings->update('portalusers_status','all');
// and... nothing to do - all statuses allowed
}
}
// / Specific status mode ==================================
} // / if autofire on :)
}
#} Adds a "changed" log when customer status change (if setting)
function zeroBSCRM_IA_CustomerStatusChangeAutoLog($obj=array()){
# if setting
$autoLogThis = zeroBSCRM_getSetting('autolog_customer_statuschange');
if ($autoLogThis > 0){
#} Retrieve necessary info:
$zbsNoteAgainstPostID = -1; if (is_array($obj) && isset($obj['againstid']) && $obj['againstid'] > 0) $zbsNoteAgainstPostID = (int)$obj['againstid'];
#TRANSITIONTOMETANO
// I nicely pass these...
$from = ''; if (is_array($obj) && isset($obj['from']) && !empty($obj['from'])) $from = $obj['from'];
$to = ''; if (is_array($obj) && isset($obj['to']) && !empty($obj['to'])) $to = $obj['to'];
if (isset($zbsNoteAgainstPostID) && !empty($zbsNoteAgainstPostID) && isset($to) && !empty($to)){
$shortDesc = '';
if (!empty($from))
$shortDesc = __('From',"zero-bs-crm").' "'.$from.'" '.__('to',"zero-bs-crm").' "'.$to.'"';
else
$shortDesc = __('To',"zero-bs-crm").' "'.$to.'"';
#} Add log
$newLogID = zeroBS_addUpdateContactLog($zbsNoteAgainstPostID,-1,-1,array(
'type' => 'Status Change',
'shortdesc' => $shortDesc,
'longdesc' => ''
));
}
}
}
/* ======================================================
/ Internal Automator Recipe Functions
====================================================== */
/* ======================================================
Internal Automator Recipe Functions - WP HOOK tieins... just middlemen here really
====================================================== */
#} Fires the hook & passes in the obj, for those who still want to use wp_hook's rather than IA Automator
#} Fires on 'customer.new' IA
function zeroBSCRM_IA_NewCustomerWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) {
do_action( 'jpcrm_after_contact_insert', $obj['id'] );
// legacy, use `jpcrm_after_contact_insert` from 5.3+
do_action( 'zbs_new_customer', $obj['id'] );
}
}
/**
* Fires on 'contact.update', 'contact.email.update', and 'contact.status.update IA.
*
* @param array $obj An array holding contact object data.
*/
function zeroBSCRM_IA_EditCustomerWPHook( $obj = array() ) {
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
do_action( 'jpcrm_after_contact_update', $obj['id'] );
// legacy, use `jpcrm_after_contact_update` from 5.3+
do_action( 'zbs_edit_customer', $obj['id'] );
}
}
#} Fires on 'customer.vitals.edit' IA.
function zeroBSCRM_IA_EditCustomerVitalsWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_edit_customer_vitals', $obj['id']);
}
/**
* Fires on 'contact.email.update' IA. Now legacy, redirecting to zeroBSCRM_IA_EditCustomerWPHook
*
* @param array $obj An array holding contact object data.
*/
function zeroBSCRM_IA_EditCustomerEmailWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_edit_customer_email', $obj['id']);
}
/**
* Fires on 'contact.delete' IA.
*
* @param array $obj An array holding contact object data.
*/
function zeroBSCRM_IA_DeleteCustomerWPHook( $obj = array() ) {
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
// Legacy:
do_action( 'zbs_delete_customer', $obj['id'] );
}
}
/**
* Fires on 'contact.before.delete' IA.
*
* @param array $obj An array holding contact object data.
*/
function zeroBSCRM_IA_BeforeDeleteCustomerWPHook($obj=array()){
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
do_action( 'jpcrm_before_delete_contact', $obj );
}
}
/**
* Fires on 'company.new' IA.
*
* @param array $obj An array holding company object data.
*/
function zeroBSCRM_IA_NewCompanyWPHook( $obj = array() ) {
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
// Legacy:
do_action( 'zbs_new_company', $obj['id'] );
}
}
/**
* Fires on 'company.delete' IA.
*
* @param array $obj An array holding company object data.
*/
function zeroBSCRM_IA_DeleteCompanyWPHook( $obj = array() ) {
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
// Legacy:
do_action( 'zbs_delete_company', $obj['id'] );
}
}
#} Fires on 'quote.new' IA
function zeroBSCRM_IA_NewQuoteWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_new_quote', $obj['id']);
}
#} Fires on 'quote.accepted' IA
function zeroBSCRM_IA_AcceptedQuoteWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('jpcrm_quote_accepted', $obj['id']);
}
#} Fires on 'quote.delete' IA
function zeroBSCRM_IA_DeleteQuoteWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_delete_quote', $obj['id']);
}
/**
* Fires on 'invoice.new' IA.
*
* @param array $obj An array holding invoice object data.
*/
function zeroBSCRM_IA_NewInvoiceWPHook( $obj = array() ) {
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
do_action( 'zbs_new_invoice', $obj['id'] );
}
}
/**
* Fires on 'invoice.update' and 'invoice.status.update' IA.
*
* @param array $obj An array holding invoice object data.
*/
function zeroBSCRM_IA_EditInvoiceWPHook( $obj = array() ) {
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
do_action( 'zbs_new_invoice', $obj['id'] );
}
}
/**
* Fires on 'invoice.delete' IA.
*
* @param array $obj An array holding invoice object data.
*/
function zeroBSCRM_IA_DeleteInvoiceWPHook( $obj = array() ) {
if ( is_array( $obj ) && isset( $obj['id'] ) && ! empty( $obj['id'] ) ) {
do_action( 'zbs_delete_invoice', $obj['id'] );
}
}
#} Fires on 'transaction.new' IA
function zeroBSCRM_IA_NewTransactionWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_new_transaction', $obj['id']);
}
#} Fires on 'transaction.delete' IA
function zeroBSCRM_IA_DeleteTransactionWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_delete_transaction', $obj['id']);
}
#} Fires on 'event.new' IA
function zeroBSCRM_IA_NewEventWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_new_event', $obj['id']);
}
#} Fires on 'event.update' IA
function zeroBSCRM_IA_UpdateEventWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_update_event', $obj['id']);
}
#} Fires on 'event.delete' IA
function zeroBSCRM_IA_DeleteEventWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_delete_event', $obj['id']);
}
#} Fires on 'clientwpuser.new' IA
function zeroBSCRM_IA_NewClientPortalUserHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_new_client_portal_user', $obj['id']);
}
#} Fires on 'form.delete' IA
function zeroBSCRM_IA_DeleteFormWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_delete_form', $obj['id']);
}
#} Fires on 'segment.delete' IA
function zeroBSCRM_IA_DeleteSegmentWPHook($obj=array()){
if (is_array($obj) && isset($obj['id']) && !empty($obj['id'])) do_action('zbs_delete_segment', $obj['id']);
}
/* ======================================================
/ Internal Automator Recipe Functions - WP HOOK tieins
====================================================== */