TimeTrex/classes/modules/message/MessageControlListFactory.class.php

830 lines
32 KiB
PHP
Raw Normal View History

2022-12-13 07:10:06 +01:00
<?php
/*********************************************************************************
*
* TimeTrex is a Workforce Management program developed by
* TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License version 3 as published by
* the Free Software Foundation with the addition of the following permission
* added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
* WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
* WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
*
* You should have received a copy of the GNU Affero General Public License along
* with this program; if not, see http://www.gnu.org/licenses or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
*
* You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
* #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
*
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
*
* In accordance with Section 7(b) of the GNU Affero General Public License
* version 3, these Appropriate Legal Notices must retain the display of the
* "Powered by TimeTrex" logo. If the display of the logo is not reasonably
* feasible for technical reasons, the Appropriate Legal Notices must display
* the words "Powered by TimeTrex".
*
********************************************************************************/
/**
* @package Modules\Message
*/
class MessageControlListFactory extends MessageControlFactory implements IteratorAggregate {
/**
* @param int $limit Limit the number of records returned
* @param int $page Page number of records to return for pagination
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return $this
*/
function getAll( $limit = null, $page = null, $where = null, $order = null ) {
$query = '
select *
from ' . $this->getTable() . '
WHERE deleted = 0';
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order );
$this->rs = $this->ExecuteSQL( $query, null, $limit, $page );
return $this;
}
/**
* @param string $id UUID
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return bool|MessageControlListFactory
*/
function getById( $id, $where = null, $order = null ) {
if ( $id == '' ) {
return false;
}
$ph = [
'id' => TTUUID::castUUID( $id ),
];
$query = '
select *
from ' . $this->getTable() . '
where id = ?
AND deleted = 0';
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order );
$this->rs = $this->ExecuteSQL( $query, $ph );
return $this;
}
/**
* @param string $company_id UUID
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return bool|MessageControlListFactory
*/
function getByCompanyId( $company_id, $where = null, $order = null ) {
if ( $company_id == '' ) {
return false;
}
$mrf = new MessageRecipientFactory();
$uf = new UserFactory();
$ph = [
'company_id' => TTUUID::castUUID( $company_id ),
];
$query = '
select a.*
from ' . $this->getTable() . ' as a
LEFT JOIN ' . $mrf->getTable() . ' as mrf ON a.id = mrf.message_sender_id
LEFT JOIN ' . $uf->getTable() . ' as uf ON mrf.user_id = uf.id
where uf.company_id = ?
AND ( a.deleted = 0 AND uf.deleted = 0 )';
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order );
$this->rs = $this->ExecuteSQL( $query, $ph );
return $this;
}
/**
* @param string $company_id UUID
* @param string $user_id UUID
* @return bool|int|mixed
*/
function getNewMessagesByCompanyIdAndUserId( $company_id, $user_id ) {
if ( $company_id == '' ) {
return false;
}
if ( $user_id == '' ) {
return false;
}
$this->setCacheLifeTime( 600 );
$unread_messages = $this->getCache( $user_id );
if ( $unread_messages === false ) {
$mrf = new MessageRecipientFactory();
$msf = new MessageSenderFactory();
$uf = new UserFactory();
$rf = new RequestFactory();
$pptsvf = new PayPeriodTimeSheetVerifyFactory();
$ph = [
'user_id' => TTUUID::castUUID( $user_id ),
'company_id' => TTUUID::castUUID( $company_id ),
];
//Need to include all threads that user has posted to.
$query = '
SELECT count(*)
FROM ' . $mrf->getTable() . ' as a
LEFT JOIN ' . $msf->getTable() . ' as b ON a.message_sender_id = b.id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
LEFT JOIN ' . $this->getTable() . ' as c ON b.message_control_id = c.id
LEFT JOIN ' . $uf->getTable() . ' as d ON c.object_type_id = 5 AND c.object_id = d.id
LEFT JOIN ' . $rf->getTable() . ' as f ON c.object_type_id = 50 AND c.object_id = f.id
LEFT JOIN ' . $pptsvf->getTable() . ' as h ON c.object_type_id = 90 AND c.object_id = h.id
WHERE
a.user_id = ?
AND bb.company_id = ?
AND c.object_type_id in (5, 50, 90)
AND a.status_id = 10
AND ( ( a.deleted = 0 AND c.deleted = 0 )
AND ( CASE WHEN c.object_type_id = 5 THEN d.deleted = 0 ELSE d.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 50 THEN f.deleted = 0 ELSE f.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 90 THEN h.deleted = 0 ELSE h.id IS NULL END )
)
';
//Debug::Arr($ph, ' Query: '. $query, __FILE__, __LINE__, __METHOD__, 10);
$unread_messages = (int)$this->db->GetOne( $query, $ph );
$this->saveCache( $unread_messages, $user_id );
}
return $unread_messages;
}
/**
* @param string $company_id UUID
* @param string $user_id UUID
* @param $folder
* @param int $limit Limit the number of records returned
* @param int $page Page number of records to return for pagination
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return bool|MessageControlListFactory
*/
function getByCompanyIDAndUserIdAndFolder( $company_id, $user_id, $folder, $limit = null, $page = null, $where = null, $order = null ) {
if ( $company_id == '' ) {
return false;
}
if ( $user_id == '' ) {
return false;
}
$strict = true;
if ( $order == null ) {
$strict = false;
$order = [ 'a.status_id' => '= 10 desc', 'a.created_date' => 'desc' ];
}
//Folder is: INBOX, SENT
$mrf = new MessageRecipientFactory();
$msf = new MessageSenderFactory();
$rf = new RequestFactory();
$uf = new UserFactory();
//$udf = new UserDateFactory();
$pptsvf = new PayPeriodTimeSheetVerifyFactory();
$ph = [
'user_id' => TTUUID::castUUID( $user_id ),
'company_id' => TTUUID::castUUID( $company_id ),
];
if ( $folder == 10 ) { //Inbox
$additional_order_fields = [ 'from_last_name' ];
//Need to include all threads that user has posted to.
$query = '
SELECT
c.*,
a.*,
b.id as id,
b.user_id as from_user_id,
bb.first_name as from_first_name,
bb.middle_name as from_middle_name,
bb.last_name as from_last_name
FROM ' . $mrf->getTable() . ' as a
LEFT JOIN ' . $msf->getTable() . ' as b ON a.message_sender_id = b.id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
LEFT JOIN ' . $this->getTable() . ' as c ON b.message_control_id = c.id
LEFT JOIN ' . $uf->getTable() . ' as d ON c.object_type_id = 5 AND c.object_id = d.id
LEFT JOIN ' . $rf->getTable() . ' as f ON c.object_type_id = 50 AND c.object_id = f.id
LEFT JOIN ' . $pptsvf->getTable() . ' as h ON c.object_type_id = 90 AND c.object_id = h.id
WHERE
a.user_id = ?
AND bb.company_id = ?
AND c.object_type_id in (5, 50, 90)
AND ( a.deleted = 0 AND c.deleted = 0
AND ( CASE WHEN c.object_type_id = 5 THEN d.deleted = 0 ELSE d.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 50 THEN f.deleted = 0 ELSE f.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 90 THEN h.deleted = 0 ELSE h.id IS NULL END )
)
';
} else { //Sent
//Need to include all threads that user has posted to.
$additional_order_fields = [ 'to_last_name' ];
$query = '
SELECT
c.*,
a.*,
b.id as id,
a.user_id as to_user_id,
bb.first_name as to_first_name,
bb.middle_name as to_middle_name,
bb.last_name as to_last_name
FROM ' . $mrf->getTable() . ' as a
LEFT JOIN ' . $msf->getTable() . ' as b ON a.message_sender_id = b.id
LEFT JOIN ' . $uf->getTable() . ' as bb ON a.user_id = bb.id
LEFT JOIN ' . $this->getTable() . ' as c ON b.message_control_id = c.id
LEFT JOIN ' . $uf->getTable() . ' as d ON c.object_type_id = 5 AND c.object_id = d.id
LEFT JOIN ' . $rf->getTable() . ' as f ON c.object_type_id = 50 AND c.object_id = f.id
LEFT JOIN ' . $pptsvf->getTable() . ' as h ON c.object_type_id = 90 AND c.object_id = h.id
WHERE
b.user_id = ?
AND bb.company_id = ?
AND c.object_type_id in (5, 50, 90)
AND ( b.deleted = 0 AND c.deleted = 0
AND ( CASE WHEN c.object_type_id = 5 THEN d.deleted = 0 ELSE d.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 50 THEN f.deleted = 0 ELSE f.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 90 THEN h.deleted = 0 ELSE h.id IS NULL END )
)
';
}
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order, $strict, $additional_order_fields );
$this->rs = $this->ExecuteSQL( $query, $ph, $limit, $page );
return $this;
}
/**
* @param string $company_id UUID
* @param string $user_id UUID
* @param string $id UUID
* @param $folder
* @param int $limit Limit the number of records returned
* @param int $page Page number of records to return for pagination
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return bool|MessageControlListFactory
*/
function getByCompanyIDAndUserIdAndIdAndFolder( $company_id, $user_id, $id, $folder, $limit = null, $page = null, $where = null, $order = null ) {
if ( $company_id == '' ) {
return false;
}
if ( $user_id == '' ) {
return false;
}
if ( $id == '' ) {
return false;
}
$strict = true;
if ( $order == null ) {
$strict = false;
$order = [ 'c.status_id' => '= 10 desc', 'a.created_date' => 'desc' ];
}
$mrf = new MessageRecipientFactory();
$msf = new MessageSenderFactory();
$uf = new UserFactory();
$ph = [
'company_id' => TTUUID::castUUID( $company_id ),
'id' => TTUUID::castUUID( $id ),
'id_b' => TTUUID::castUUID( $id ),
'id_c' => TTUUID::castUUID( $id ),
'id_d' => TTUUID::castUUID( $id ),
'user_id' => TTUUID::castUUID( $user_id ),
'user_id_b' => TTUUID::castUUID( $user_id ),
//'id_b' => $id,
//'parent_id' => TTUUID::castUUID($id),
];
//Need to include all threads that user has posted to.
$query = '
SELECT a.*,
b.id as id,
c.status_id as status_id,
b.user_id as from_user_id,
bb.first_name as from_first_name,
bb.middle_name as from_middle_name,
bb.last_name as from_last_name,
c.user_id as to_user_id,
cb.first_name as to_first_name,
cb.middle_name as to_middle_name,
cb.last_name as to_last_name
FROM ' . $this->getTable() . ' as a
LEFT JOIN ' . $msf->getTable() . ' as b ON a.id = b.message_control_id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
LEFT JOIN ' . $mrf->getTable() . ' as c ON b.id = c.message_sender_id
LEFT JOIN ' . $uf->getTable() . ' as cb ON c.user_id = cb.id
WHERE
cb.company_id = ? AND cb.company_id = bb.company_id
AND ( b.id = ?
OR b.id = ( select parent_id from ' . $msf->getTable() . ' where id = ? AND parent_id != \'' . TTUUID::getZeroID() . '\' )
OR b.parent_id = ( select parent_id from ' . $msf->getTable() . ' where id = ? AND parent_id != \'' . TTUUID::getZeroID() . '\' )
OR ( b.parent_id = ? )
)
AND ( b.user_id = ? OR c.user_id = ? )
AND ( a.deleted = 0 AND c.deleted = 0 )
';
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order, $strict, [ 'from_last_name', 'to_last_name' ] );
$this->rs = $this->ExecuteSQL( $query, $ph, $limit, $page );
return $this;
}
/**
* @param string $company_id UUID
* @param string $user_id UUID
* @param int $object_type_id
* @param string $object_id UUID
* @param int $limit Limit the number of records returned
* @param int $page Page number of records to return for pagination
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return bool|MessageControlListFactory
*/
function getByCompanyIDAndUserIdAndObjectTypeAndObject( $company_id, $user_id, $object_type_id, $object_id, $limit = null, $page = null, $where = null, $order = null ) {
if ( $company_id == '' ) {
return false;
}
if ( $user_id == '' ) {
return false;
}
if ( $object_type_id == '' ) {
return false;
}
if ( $object_id == '' ) {
return false;
}
$additional_order_fields = [ 'from_last_name', 'to_last_name', 'subject', 'object_type_id' ];
$strict = true;
if ( $order == null ) {
$strict = false;
$order = [ 'a.created_date' => 'desc' ];
}
$msf = new MessageSenderFactory();
//$mrf = new MessageRecipientFactory();
$uf = new UserFactory();
$ph = [
'company_id' => TTUUID::castUUID( $company_id ),
'object_type_id' => (int)$object_type_id,
'object_id' => TTUUID::castUUID( $object_id ),
];
//Return status_id column so we can optimize marking messages as read or not.
//Make sure we don't display duplicate messages when it was sent to multiple superiors.
//Include messages even if sender/recipeints have deleted theirs.
//The sub-selects are required so we attempt to return message_ids that were sent to the user currently viewing the messages, that way we can mark them as read.
// without this we are unable to mark messages as read, because we are returning essentially random message_recipient id's.
// Because PostgreSQL doesn't come with first() aggregate functions, this is pretty much the fastest way to work around it.
$query = '
SELECT DISTINCT a.object_type_id,
a.object_id,
a.require_ack,
a.priority_id,
a.subject,
a.body,
(SELECT xx.id FROM message_recipient as zz LEFT JOIN message_sender as xx ON zz.message_sender_id = xx.id where xx.message_control_id = a.id ORDER BY zz.user_id = \'' . TTUUID::castUUID( $user_id ) . '\' DESC LIMIT 1 ) as id,
(SELECT zz.status_id FROM message_recipient as zz LEFT JOIN message_sender as xx ON zz.message_sender_id = xx.id where xx.message_control_id = a.id ORDER BY zz.user_id = \'' . TTUUID::castUUID( $user_id ) . '\' DESC LIMIT 1 ) as status_id,
b.user_id as from_user_id,
bb.first_name as from_first_name,
bb.middle_name as from_middle_name,
bb.last_name as from_last_name,
a.created_date,
a.created_by,
a.updated_date,
a.updated_by,
a.deleted_date,
a.deleted
FROM ' . $this->getTable() . ' as a
LEFT JOIN ' . $msf->getTable() . ' as b ON a.id = b.message_control_id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
WHERE
bb.company_id = ?
AND ( a.object_type_id = ? AND a.object_id = ? )
AND ( a.deleted = 0 )
';
/*
//This query works as well, but is about twice as slow interestingly enough.
$query = '
SELECT a.*,
b.id,
c.status_id,
b.user_id as from_user_id,
bb.first_name as from_first_name,
bb.middle_name as from_middle_name,
bb.last_name as from_last_name
FROM '. $this->getTable() .' as a
LEFT JOIN (
select a.message_control_id, CASE WHEN min(CASE WHEN b.user_id = ? THEN b.id*-1 ELSE b.id END) < 0 THEN min(CASE WHEN b.user_id = ? THEN b.id*-1 ELSE b.id END)*-1 ELSE min(CASE WHEN b.user_id = ? THEN b.id*-1 ELSE b.id END) END as message_sender_id from message_sender as a LEFT JOIN message_recipient as b ON a.id = b.message_sender_id group by message_control_id
) as z ON a.id = z.message_control_id
LEFT JOIN '. $msf->getTable() .' as b ON b.id = z.message_sender_id
LEFT JOIN '. $uf->getTable() .' as bb ON b.user_id = bb.id
LEFT JOIN '. $mrf->getTable() .' as c ON b.id = c.message_sender_id
WHERE
bb.company_id = ?
AND ( a.object_type_id = ? AND a.object_id = ? )
AND ( a.deleted = 0 )
';
*/
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order, $strict, $additional_order_fields );
//Debug::Arr($ph, $query, __FILE__, __LINE__, __METHOD__, 10);
$this->rs = $this->ExecuteSQL( $query, $ph, $limit, $page );
return $this;
}
/**
* Returns all parties involved in a thread, for finding out who "Reply All" should go to.
* @param string $company_id UUID
* @param int $object_type_id
* @param string $object_id UUID
* @param int $user_id
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return array|bool
*/
function getByCompanyIdAndObjectTypeAndObjectAndNotUser( $company_id, $object_type_id, $object_id, $user_id = 0, $where = null, $order = null ) {
if ( $company_id == '' ) {
return false;
}
if ( $object_type_id == '' ) {
return false;
}
if ( $object_id == '' ) {
return false;
}
if ( $user_id === 0 ) {
$user_id = TTUUID::getZeroID();
}
$msf = new MessageSenderFactory();
$mrf = new MessageRecipientFactory();
$uf = new UserFactory();
$ph = [
'company_id' => TTUUID::castUUID( $company_id ),
'object_type_id' => (int)$object_type_id,
'object_id' => TTUUID::castUUID( $object_id ),
];
$query = '
SELECT b.user_id as from_user_id,
c.user_id as to_user_id
FROM ' . $this->getTable() . ' as a
LEFT JOIN ' . $msf->getTable() . ' as b ON a.id = b.message_control_id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
LEFT JOIN ' . $mrf->getTable() . ' as c ON c.message_sender_id = b.id
LEFT JOIN ' . $uf->getTable() . ' as cc ON c.user_id = cc.id
WHERE
bb.company_id = ? AND bb.company_id = cc.company_id
AND ( a.object_type_id = ? AND a.object_id = ? )
AND ( a.deleted = 0 AND bb.deleted = 0 AND cc.deleted = 0 )
';
$rs = $this->ExecuteSQL( $query, $ph );
$retarr = [];
if ( $rs->RecordCount() > 0 ) {
foreach ( $rs as $row ) {
if ( $user_id != $row['from_user_id'] ) {
$retarr[] = $row['from_user_id'];
}
if ( $user_id != $row['to_user_id'] ) {
$retarr[] = $row['to_user_id'];
}
}
$retarr = array_unique( $retarr );
//Debug::Arr($retarr, ' Retarr: ', __FILE__, __LINE__, __METHOD__, 10);
return $retarr;
}
return false;
}
/**
* @param string $company_id UUID
* @param $filter_data
* @param int $limit Limit the number of records returned
* @param int $page Page number of records to return for pagination
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return bool|MessageControlListFactory
*/
function getAPISearchByCompanyIdAndArrayCriteria( $company_id, $filter_data, $limit = null, $page = null, $where = null, $order = null ) {
if ( $company_id == '' ) {
return false;
}
if ( !isset( $filter_data['current_user_id'] ) ) {
return false;
}
if ( !is_array( $order ) ) {
//Use Filter Data ordering if its set.
if ( isset( $filter_data['sort_column'] ) && $filter_data['sort_order'] ) {
$order = [ Misc::trimSortPrefix( $filter_data['sort_column'] ) => $filter_data['sort_order'] ];
}
}
$additional_order_fields = [ 'status_id', 'aa.first_name', 'aa.middle_name', 'aa.last_name', 'bb.first_name', 'bb.middle_name', 'bb.last_name' ];
$sort_column_aliases = [
'status' => 'a.status_id',
'object_type' => 'c.object_type_id',
'to_first_name' => 'aa.first_name',
'to_middle_name' => 'aa.middle_name',
'to_last_name' => 'aa.last_name',
'from_first_name' => 'bb.first_name',
'from_middle_name' => 'bb.middle_name',
'from_last_name' => 'bb.last_name',
'created_date' => 'c.created_date',
'created_by' => 'c.created_by',
];
$order = $this->getColumnsFromAliases( $order, $sort_column_aliases );
if ( $order == null ) {
$order = [ 'a.status_id' => '= 10 desc', 'a.created_date' => 'desc' ];
$strict = false;
} else {
$strict = true;
}
//Debug::Arr($order, 'Order Data:', __FILE__, __LINE__, __METHOD__, 10);
//Debug::Arr($filter_data, 'Filter Data:', __FILE__, __LINE__, __METHOD__, 10);
if ( !isset( $filter_data['folder_id'] ) ) {
$filter_data['folder_id'] = 10; //Inbox.
}
$mrf = new MessageRecipientFactory();
$msf = new MessageSenderFactory();
$rf = new RequestFactory();
$uf = new UserFactory();
$pptsvf = new PayPeriodTimeSheetVerifyFactory();
$ph = [
'user_id' => $filter_data['current_user_id'],
'company_id' => TTUUID::castUUID( $company_id ),
];
if ( $filter_data['folder_id'] == 10 ) { //Inbox
$additional_order_fields = array_merge( $additional_order_fields, [ 'from_last_name' ] );
//Need to include all threads that user has posted to.
$query = '
SELECT
c.*,
a.*,
c.created_date as created_date,
c.created_by as created_by,
b.id as id,
a.user_id as to_user_id,
aa.first_name as to_first_name,
aa.middle_name as to_middle_name,
aa.last_name as to_last_name,
b.user_id as from_user_id,
bb.first_name as from_first_name,
bb.middle_name as from_middle_name,
bb.last_name as from_last_name
FROM ' . $mrf->getTable() . ' as a
LEFT JOIN ' . $uf->getTable() . ' as aa ON a.user_id = aa.id
LEFT JOIN ' . $msf->getTable() . ' as b ON a.message_sender_id = b.id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
LEFT JOIN ' . $this->getTable() . ' as c ON b.message_control_id = c.id
LEFT JOIN ' . $uf->getTable() . ' as d ON c.object_type_id = 5 AND c.object_id = d.id
LEFT JOIN ' . $rf->getTable() . ' as f ON c.object_type_id = 50 AND c.object_id = f.id
LEFT JOIN ' . $pptsvf->getTable() . ' as h ON c.object_type_id = 90 AND c.object_id = h.id
WHERE
a.user_id = ?
AND ( bb.company_id = ? AND aa.company_id = bb.company_id )
AND c.object_type_id in (5, 50, 90)';
$query .= ( isset( $filter_data['id'] ) ) ? $this->getWhereClauseSQL( 'b.id', $filter_data['id'], 'uuid_list', $ph ) : null;
$query .= ( isset( $filter_data['object_type_id'] ) ) ? $this->getWhereClauseSQL( 'c.object_type_id', $filter_data['object_type_id'], 'numeric_list', $ph ) : null;
$query .= ( isset( $filter_data['status_id'] ) ) ? $this->getWhereClauseSQL( 'a.status_id', $filter_data['status_id'], 'numeric_list', $ph ) : null;
$query .= ( isset( $filter_data['user_id'] ) ) ? $this->getWhereClauseSQL( 'b.user_id', $filter_data['user_id'], 'uuid_list', $ph ) : null;
$query .= ( isset( $filter_data['subject'] ) ) ? $this->getWhereClauseSQL( 'c.subject', $filter_data['subject'], 'text', $ph ) : null;
$query .= ( isset( $filter_data['body'] ) ) ? $this->getWhereClauseSQL( 'c.body', $filter_data['body'], 'text', $ph ) : null;
$query .= ' AND ( a.deleted = 0 AND c.deleted = 0
AND ( CASE WHEN c.object_type_id = 5 THEN d.deleted = 0 ELSE d.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 50 THEN f.deleted = 0 ELSE f.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 90 THEN h.deleted = 0 ELSE h.id IS NULL END )
)
';
} else { //Sent
//Need to include all threads that user has posted to.
$additional_order_fields = array_merge( $additional_order_fields, [ 'to_last_name' ] );
$query = '
SELECT
c.*,
a.*,
b.id as id,
a.user_id as to_user_id,
aa.first_name as to_first_name,
aa.middle_name as to_middle_name,
aa.last_name as to_last_name,
b.user_id as from_user_id,
bb.first_name as from_first_name,
bb.middle_name as from_middle_name,
bb.last_name as from_last_name
FROM ' . $mrf->getTable() . ' as a
LEFT JOIN ' . $uf->getTable() . ' as aa ON a.user_id = aa.id
LEFT JOIN ' . $msf->getTable() . ' as b ON a.message_sender_id = b.id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
LEFT JOIN ' . $this->getTable() . ' as c ON b.message_control_id = c.id
LEFT JOIN ' . $uf->getTable() . ' as d ON c.object_type_id = 5 AND c.object_id = d.id
LEFT JOIN ' . $rf->getTable() . ' as f ON c.object_type_id = 50 AND c.object_id = f.id
LEFT JOIN ' . $pptsvf->getTable() . ' as h ON c.object_type_id = 90 AND c.object_id = h.id
WHERE
b.user_id = ?
AND ( bb.company_id = ? AND aa.company_id = bb.company_id )
AND c.object_type_id in (5, 50, 90)';
$query .= ( isset( $filter_data['id'] ) ) ? $this->getWhereClauseSQL( 'b.id', $filter_data['id'], 'uuid_list', $ph ) : null;
$query .= ( isset( $filter_data['object_type_id'] ) ) ? $this->getWhereClauseSQL( 'c.object_type_id', $filter_data['object_type_id'], 'numeric_list', $ph ) : null;
$query .= ( isset( $filter_data['status_id'] ) ) ? $this->getWhereClauseSQL( 'a.status_id', $filter_data['status_id'], 'numeric_list', $ph ) : null;
$query .= ( isset( $filter_data['user_id'] ) ) ? $this->getWhereClauseSQL( 'a.user_id', $filter_data['user_id'], 'uuid_list', $ph ) : null;
$query .= ( isset( $filter_data['subject'] ) ) ? $this->getWhereClauseSQL( 'c.subject', $filter_data['subject'], 'text', $ph ) : null;
$query .= ( isset( $filter_data['body'] ) ) ? $this->getWhereClauseSQL( 'c.body', $filter_data['body'], 'text', $ph ) : null;
$query .= ' AND ( b.deleted = 0 AND c.deleted = 0
AND ( CASE WHEN c.object_type_id = 5 THEN d.deleted = 0 ELSE d.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 50 THEN f.deleted = 0 ELSE f.id IS NULL END )
AND ( CASE WHEN c.object_type_id = 90 THEN h.deleted = 0 ELSE h.id IS NULL END )
)
';
}
$query .= ( isset( $filter_data['created_by'] ) ) ? $this->getWhereClauseSQL( 'a.created_by', $filter_data['created_by'], 'uuid_list', $ph ) : null;
$query .= ( isset( $filter_data['updated_by'] ) ) ? $this->getWhereClauseSQL( 'a.updated_by', $filter_data['updated_by'], 'uuid_list', $ph ) : null;
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order, $strict, $additional_order_fields );
$this->rs = $this->ExecuteSQL( $query, $ph, $limit, $page );
//Debug::Arr($ph, ' Query: '. $query, __FILE__, __LINE__, __METHOD__, 10);
return $this;
}
/**
* @param string $company_id UUID
* @param $filter_data
* @param int $limit Limit the number of records returned
* @param int $page Page number of records to return for pagination
* @param array $where Additional SQL WHERE clause in format of array( $column => $filter, ... ). ie: array( 'id' => 1, ... )
* @param array $order Sort order passed to SQL in format of array( $column => 'asc', 'name' => 'desc', ... ). ie: array( 'id' => 'asc', 'name' => 'desc', ... )
* @return bool|MessageControlListFactory
*/
function getAPIMessageByCompanyIdAndArrayCriteria( $company_id, $filter_data, $limit = null, $page = null, $where = null, $order = null ) {
if ( $company_id == '' ) {
return false;
}
if ( !is_array( $order ) ) {
//Use Filter Data ordering if its set.
if ( isset( $filter_data['sort_column'] ) && $filter_data['sort_order'] ) {
$order = [ Misc::trimSortPrefix( $filter_data['sort_column'] ) => $filter_data['sort_order'] ];
}
}
$strict = true;
if ( $order == null ) {
$strict = false;
$order = [ 'a.created_date' => 'asc' ];
}
$mrf = new MessageRecipientFactory();
$msf = new MessageSenderFactory();
$uf = new UserFactory();
$ph = [
'company_id' => TTUUID::castUUID( $company_id ),
'id' => $filter_data['id'],
'id_b' => $filter_data['id'],
'id_c' => $filter_data['id'],
'id_d' => $filter_data['id'],
'user_id' => $filter_data['current_user_id'],
'user_id_b' => $filter_data['current_user_id'],
//'id_b' => $id,
//'parent_id' => TTUUID::castUUID($id),
];
//Need to include all threads that user has posted to.
$query = '
SELECT a.*,
b.id as id,
c.status_id as status_id,
b.user_id as from_user_id,
bb.first_name as from_first_name,
bb.middle_name as from_middle_name,
bb.last_name as from_last_name,
c.user_id as to_user_id,
cb.first_name as to_first_name,
cb.middle_name as to_middle_name,
cb.last_name as to_last_name
FROM ' . $this->getTable() . ' as a
LEFT JOIN ' . $msf->getTable() . ' as b ON a.id = b.message_control_id
LEFT JOIN ' . $uf->getTable() . ' as bb ON b.user_id = bb.id
LEFT JOIN ' . $mrf->getTable() . ' as c ON b.id = c.message_sender_id
LEFT JOIN ' . $uf->getTable() . ' as cb ON c.user_id = cb.id
WHERE
cb.company_id = ? AND cb.company_id = bb.company_id
AND ( b.id = ?
OR b.id = ( select parent_id from ' . $msf->getTable() . ' where id = ? AND parent_id != \'' . TTUUID::getZeroID() . '\' )
OR b.parent_id = ( select parent_id from ' . $msf->getTable() . ' where id = ? AND parent_id != \'' . TTUUID::getZeroID() . '\' )
OR ( b.parent_id = ? )
)
AND ( b.user_id = ? OR c.user_id = ? )
AND ( a.deleted = 0 )
'; //Don't check c.deleted = 0 (message recipient table), as the recipient could delete the message and that would cause the sender to no longer be able to view it.
$query .= $this->getWhereSQL( $where );
$query .= $this->getSortSQL( $order, $strict, [ 'from_last_name', 'to_last_name' ] );
$this->rs = $this->ExecuteSQL( $query, $ph, $limit, $page );
return $this;
}
}
?>