845 lines
30 KiB
PHP
845 lines
30 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Class TimeTrexPaymentServices
|
||
|
*/
|
||
|
class TimeTrexPaymentServices {
|
||
|
protected $url = 'https://paymentservices.timetrex.com/api/soap/api.php';
|
||
|
|
||
|
protected $user_name = null;
|
||
|
protected $password = null;
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
* @param string $user_name
|
||
|
* @param string $password
|
||
|
*/
|
||
|
function __construct( $user_name = null, $password = null ) {
|
||
|
require_once( Environment::getBasePath() . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . 'modules' . DIRECTORY_SEPARATOR . 'other' . DIRECTORY_SEPARATOR . 'PaymentServicesClientAPI.class.php' );
|
||
|
|
||
|
global $PAYMENTSERVICES_USER, $PAYMENTSERVICES_PASSWORD, $PAYMENTSERVICES_URL;
|
||
|
$PAYMENTSERVICES_USER = $user_name;
|
||
|
$PAYMENTSERVICES_PASSWORD = $password;
|
||
|
$PAYMENTSERVICES_URL = $this->url;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts a remittance source account object to a remittance bank account array for uploading.
|
||
|
* @param $rs_obj
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertRemittanceSourceAccountObjectToBankAccountArray( $rs_obj ) {
|
||
|
$remittances_bank_account_data = [
|
||
|
'_kind' => 'BankAccount',
|
||
|
'remote_id' => $rs_obj->getID(),
|
||
|
|
||
|
'type_id' => 'S', //Settlement
|
||
|
|
||
|
'name' => $rs_obj->getName(),
|
||
|
|
||
|
'domiciled_country' => $rs_obj->getCountry(),
|
||
|
'currency_iso_code' => $rs_obj->getCurrencyObject()->getISOCode(),
|
||
|
|
||
|
'bank_account_type' => 'C', //Checking
|
||
|
'bank_routing_number' => ( $rs_obj->getCountry() == 'CA' ) ? str_pad( $rs_obj->getValue1(), 4, 0, STR_PAD_LEFT ) . str_pad( $rs_obj->getValue2(), 5, 0, STR_PAD_LEFT ) : $rs_obj->getValue2(),
|
||
|
'bank_account_number' => $rs_obj->getValue3(),
|
||
|
|
||
|
'deleted' => $rs_obj->getDeleted(),
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $remittances_bank_account_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $remittances_bank_account_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts a remittance agency object to a agency authorization array for uploading.
|
||
|
* @param $rae_obj
|
||
|
* @return array|bool
|
||
|
*/
|
||
|
function convertRemittanceAgencyEventObjectToAgencyAuthorizationArray( $rae_obj ) {
|
||
|
if ( !is_object( $rae_obj ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$remittance_agency_data = [
|
||
|
'_kind' => 'AgencyAuthorization',
|
||
|
'remote_id' => $rae_obj->getID(),
|
||
|
|
||
|
//'status_id' => 'P', //Pending Authorization -- This is handled automatically on the remote end.
|
||
|
'form_type_id' => $rae_obj->getType(),
|
||
|
'frequency_id' => $rae_obj->getFrequency(),
|
||
|
'agency_id' => $rae_obj->getPayrollRemittanceAgencyObject()->getAgency(),
|
||
|
|
||
|
'primary_identification' => $rae_obj->getPayrollRemittanceAgencyObject()->getPrimaryIdentification(),
|
||
|
'secondary_identification' => $rae_obj->getPayrollRemittanceAgencyObject()->getSecondaryIdentification(),
|
||
|
'tertiary_identification' => $rae_obj->getPayrollRemittanceAgencyObject()->getTertiaryIdentification(),
|
||
|
|
||
|
'deleted' => $rae_obj->getDeleted(),
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $remittance_agency_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $remittance_agency_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts a remittance destination account to a remittance bank account array for uploading.
|
||
|
* @param $rd_obj
|
||
|
* @param $rs_obj
|
||
|
* @param $u_obj
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertRemittanceDestinationAccountObjectToBankAccountArray( $rd_obj, $rs_obj, $u_obj ) {
|
||
|
$country = $rs_obj->getCountry();
|
||
|
|
||
|
$remittances_bank_account_data = [
|
||
|
'_kind' => 'BankAccount',
|
||
|
'remote_id' => $rd_obj->getID(),
|
||
|
|
||
|
'type_id' => 'N', //Normal
|
||
|
|
||
|
'name' => $u_obj->getFullName( true ),
|
||
|
|
||
|
'domiciled_country' => $country,
|
||
|
'currency_iso_code' => $rd_obj->getRemittanceSourceAccountObject()->getCurrencyObject()->getISOCode(),
|
||
|
|
||
|
'bank_account_type' => ( $rd_obj->getValue1() == '32' ) ? 'S' : 'C', //S=Savings, C=Checking
|
||
|
'bank_routing_number' => ( $country == 'CA' ) ? str_pad( $rd_obj->getValue1(), 4, 0, STR_PAD_LEFT ) . str_pad( $rd_obj->getValue2(), 5, 0, STR_PAD_LEFT ) : $rd_obj->getValue2(),
|
||
|
'bank_account_number' => $rd_obj->getValue3(),
|
||
|
|
||
|
'deleted' => $rd_obj->getDeleted(),
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $remittances_bank_account_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $remittances_bank_account_data;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param $end_date
|
||
|
* @param null $run_id
|
||
|
* @return false|string
|
||
|
*/
|
||
|
function generateBatchID( $end_date, $run_id = null ) {
|
||
|
//APR 02 R01 -- Only the first 7 characters are shown on settlement transactions.
|
||
|
//was: PP APR02 R01
|
||
|
//$batch_id = 'PP '. date( 'Md', $end_date ) .' R'. str_pad( $run_id, 2, 0, STR_PAD_LEFT ); //Must be 15 or less characters.
|
||
|
$batch_id = date( 'M d', $end_date );
|
||
|
|
||
|
if ( $run_id != '' ) {
|
||
|
$batch_id .= ' R' . str_pad( $run_id, 2, 0, STR_PAD_LEFT ); //Must be 15 or less characters.
|
||
|
}
|
||
|
|
||
|
Debug::Text( 'Batch ID: ' . $batch_id, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $batch_id;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts Pay Stub Transaction objects to a remittance transaction array for uploading.
|
||
|
* @param $pst_obj
|
||
|
* @param $ps_obj
|
||
|
* @param $rs_obj
|
||
|
* @param $uf_obj
|
||
|
* @param $confirmation_number
|
||
|
* @param $batch_id
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertPayStubTransactionObjectToTransactionArray( $pst_obj, $ps_obj, $rs_obj, $uf_obj, $confirmation_number, $batch_id ) {
|
||
|
$settlement_bank_account_data = $this->convertRemittanceSourceAccountObjectToBankAccountArray( $rs_obj );
|
||
|
$bank_account_data = $this->convertRemittanceDestinationAccountObjectToBankAccountArray( $pst_obj->getRemittanceDestinationAccountObject(), $rs_obj, $uf_obj );
|
||
|
|
||
|
if ( is_object( $ps_obj->getPayPeriodObject() ) ) {
|
||
|
//PP APR 02R01
|
||
|
$batch_id = $this->generateBatchID( $ps_obj->getPayPeriodObject()->getEndDate(), $ps_obj->getRun() );
|
||
|
//$batch_id = 'PP '. date( 'M d', $ps_obj->getPayPeriodObject()->getEndDate() ) .'R'. str_pad( $ps_obj->getRun(), 2, 0, STR_PAD_LEFT ); //Must be 15 or less characters.
|
||
|
}
|
||
|
|
||
|
$remittances_transaction_data = [
|
||
|
'_kind' => 'Transaction',
|
||
|
'remote_id' => $pst_obj->getID(),
|
||
|
'remote_batch_id' => $batch_id,
|
||
|
|
||
|
'settlement_bank_account_id' => $settlement_bank_account_data,
|
||
|
'bank_account_id' => $bank_account_data,
|
||
|
|
||
|
'category_id' => 'DD', //Direct Deposit
|
||
|
'type_id' => 'C', //Credit
|
||
|
|
||
|
'name' => $uf_obj->getFullName( true ),
|
||
|
'reference_number' => $confirmation_number,
|
||
|
|
||
|
//Use the Pay Stub Transaction Object Transaction Date, rather than the pay stub transaction date itself, as in cases where the customer might need to back-date the pay stub transaction date, but forward date the direct deposit itself.
|
||
|
// The batch_id is still based on the pay stub date itself, so that should continue to match.
|
||
|
'due_date' => TTDate::getISOTimeStamp( $pst_obj->getTransactionDate() ), //Don't pass epoch as the remote system won't know the timezone.
|
||
|
|
||
|
'amount' => $pst_obj->getAmount(),
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $remittances_transaction_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $remittances_transaction_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts a client payment object to a remittance bank account array for uploading.
|
||
|
* @param $invoice_transaction_obj TransactionFactory
|
||
|
* @param $client_payment_obj ClientPaymentFactory
|
||
|
* @param $client_obj ClientFactory
|
||
|
* @param $client_contact_obj ClientContactFactory
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertClientPaymentObjectToBankAccountArray( $invoice_transaction_obj, $client_payment_obj, $client_obj, $client_contact_obj ) { //$rd_obj, $rs_obj, $u_obj ) {
|
||
|
//$country = $client_contact_obj->getCountry();
|
||
|
if ( $client_payment_obj->getBankAccountType() == 200 ) {
|
||
|
Debug::Text( 'Using PaymentProcess Factory: EFT', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$country = 'CA';
|
||
|
} else if ( $client_payment_obj->getBankAccountType() == 201 ) {
|
||
|
Debug::Text( 'Using PaymentProcess Factory: ACH', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
$country = 'US';
|
||
|
}
|
||
|
|
||
|
$bank_account_data = [
|
||
|
'_kind' => 'BankAccount',
|
||
|
'remote_id' => $client_payment_obj->getID(),
|
||
|
|
||
|
'type_id' => 'N', //Normal
|
||
|
|
||
|
'name' => $client_obj->getCompanyName(),
|
||
|
|
||
|
'domiciled_country' => $country,
|
||
|
'currency_iso_code' => $invoice_transaction_obj->getCurrencyObject()->getISOCode(),
|
||
|
|
||
|
'bank_account_type' => 'C', //S=Savings, C=Checking
|
||
|
'bank_routing_number' => ( $country == 'CA' ) ? str_pad( $client_payment_obj->getInstitution(), 4, 0, STR_PAD_LEFT ) . str_pad( $client_payment_obj->getTransit(), 5, 0, STR_PAD_LEFT ) : $client_payment_obj->getTransit(),
|
||
|
'bank_account_number' => $client_payment_obj->getAccount(),
|
||
|
|
||
|
'deleted' => $invoice_transaction_obj->getDeleted(),
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $bank_account_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $bank_account_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts Invoice Transaction objects to a remittance transaction array for uploading.
|
||
|
* @param $invoice_transaction_obj TransactionFactory
|
||
|
* @param $client_payment_obj ClientPaymentFactory
|
||
|
* @param $client_obj ClientFactory
|
||
|
* @param $client_contact_obj ClientContactFactory
|
||
|
* @param $payment_gateway_obj PaymentGatewayFactory
|
||
|
* @param $confirmation_number
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertInvoiceTransactionObjectToTransactionArray( $invoice_transaction_obj, $client_payment_obj, $client_obj, $client_contact_obj, $payment_gateway_obj, $confirmation_number ) { //, $rs_obj, $uf_obj, $confirmation_number, $batch_id ) {
|
||
|
//$settlement_bank_account_data = $this->convertRemittanceSourceAccountObjectToBankAccountArray( $rs_obj );
|
||
|
$settlement_bank_account_data = $payment_gateway_obj->getCustomerID(); //Customer ID is the UUID of the payment services settlement bank account ID.
|
||
|
$bank_account_data = $this->convertClientPaymentObjectToBankAccountArray( $invoice_transaction_obj, $client_payment_obj, $client_obj, $client_contact_obj );
|
||
|
|
||
|
if ( is_object( $invoice_transaction_obj ) ) {
|
||
|
$batch_id = date( 'M d', $invoice_transaction_obj->getEffectiveDate() ); //Must be 9 or less characters, as its prepended with "TT AR " and has to be less than 15 characters overall.
|
||
|
}
|
||
|
|
||
|
$remittances_transaction_data = [
|
||
|
'_kind' => 'Transaction',
|
||
|
'remote_id' => $invoice_transaction_obj->getID(),
|
||
|
'remote_batch_id' => $batch_id,
|
||
|
|
||
|
'settlement_bank_account_id' => $settlement_bank_account_data,
|
||
|
'bank_account_id' => $bank_account_data,
|
||
|
|
||
|
'category_id' => 'AR', //Accounts Receivable
|
||
|
'type_id' => 'D', //Debit
|
||
|
|
||
|
'name' => $client_obj->getCompanyName(),
|
||
|
'reference_number' => $confirmation_number,
|
||
|
'due_date' => TTDate::getISOTimeStamp( $invoice_transaction_obj->getEffectiveDate() ), //Don't pass epoch as the remote system won't know the timezone.
|
||
|
|
||
|
'amount' => $invoice_transaction_obj->getAmount(),
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $remittances_transaction_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $remittances_transaction_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts a legal entity object to a remittance organization array for uploading.
|
||
|
* @param $le_obj
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertLegalEntityObjectToOrganizationArray( $le_obj ) {
|
||
|
$validator = new Validator();
|
||
|
|
||
|
$obj_class = "\124\124\114\x69\x63\x65\x6e\x73\x65"; $license = @new $obj_class;
|
||
|
|
||
|
$primary_identification = null;
|
||
|
|
||
|
//Get federal remittance agency in an attempt to get EIN/Business number.
|
||
|
$filter_data['legal_entity_id'] = $le_obj->getId();
|
||
|
|
||
|
if ( strtoupper( $le_obj->getCountry() ) == 'CA' ) {
|
||
|
$filter_data['agency_id'] = [ '10:CA:00:00:0010' ]; //CA federal
|
||
|
} else if ( strtoupper( $le_obj->getCountry() ) == 'US' ) {
|
||
|
$filter_data['agency_id'] = [ '10:US:00:00:0010' ]; //US federal
|
||
|
}
|
||
|
|
||
|
$ralf = TTnew( 'PayrollRemittanceAgencyListFactory' ); /** @var PayrollRemittanceAgencyListFactory $ralf */
|
||
|
$ralf->getAPISearchByCompanyIdAndArrayCriteria( $le_obj->getCompany(), $filter_data );
|
||
|
if ( $ralf->getRecordCount() > 0 ) {
|
||
|
$ra_obj = $ralf->getCurrent();
|
||
|
|
||
|
$primary_identification = $ra_obj->getPrimaryIdentification();
|
||
|
}
|
||
|
|
||
|
$legal_entity_data = [
|
||
|
'_kind' => 'Organization',
|
||
|
|
||
|
'remote_id' => $le_obj->getID(),
|
||
|
|
||
|
'legal_name' => $le_obj->getLegalName(),
|
||
|
'trade_name' => $le_obj->getTradeName(),
|
||
|
'short_name' => ( $le_obj->getShortName() != '' ) ? $le_obj->getShortName() : substr( $validator->stripNonAlphaNumeric( trim( $le_obj->getTradeName() ) ), 0, 15 ), //Short was recently added to legal entities, so if its not defined, use the first 15 chars of trade name instead.
|
||
|
'primary_identification' => $primary_identification, //Obtain from federal remittance agency
|
||
|
|
||
|
'address1' => $le_obj->getAddress1(),
|
||
|
'address2' => $le_obj->getAddress2(),
|
||
|
'city' => $le_obj->getCity(),
|
||
|
'province' => $le_obj->getProvince(),
|
||
|
'country' => $le_obj->getCountry(),
|
||
|
'postal_code' => $le_obj->getPostalCode(),
|
||
|
'work_phone' => $le_obj->getWorkPhone(),
|
||
|
|
||
|
'extra_data' => [
|
||
|
'company_name' => $le_obj->getCompanyObject()->getName(),
|
||
|
'registration_key' => SystemSettingFactory::getSystemSettingValueByKey( 'registration_key' ),
|
||
|
'hardware_id' => $license->getHardwareID(),
|
||
|
'company_id' => $le_obj->getCompany(),
|
||
|
'legal_entity_id' => $le_obj->getId(),
|
||
|
],
|
||
|
|
||
|
'deleted' => $le_obj->getDeleted(),
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $legal_entity_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $legal_entity_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts a user object to a remittance user array for uploading.
|
||
|
* @param $u_obj
|
||
|
* @param null $remote_organization_id
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertUserObjectToUserArray( $u_obj, $remote_organization_id = null ) {
|
||
|
$user_data = [
|
||
|
'_kind' => 'User',
|
||
|
'remote_id' => $u_obj->getID(),
|
||
|
|
||
|
'user_name' => $u_obj->getUserName(),
|
||
|
|
||
|
'first_name' => $u_obj->getFirstName(),
|
||
|
'middle_name' => $u_obj->getMiddleName(),
|
||
|
'last_name' => $u_obj->getLastName(),
|
||
|
|
||
|
'address1' => $u_obj->getAddress1(),
|
||
|
'address2' => $u_obj->getAddress2(),
|
||
|
'city' => $u_obj->getCity(),
|
||
|
'province' => $u_obj->getProvince(),
|
||
|
'country' => $u_obj->getCountry(),
|
||
|
'postal_code' => $u_obj->getPostalCode(),
|
||
|
'work_phone' => $u_obj->getWorkPhone(),
|
||
|
'work_phone_ext' => $u_obj->getWorkPhoneExt(),
|
||
|
'home_phone' => $u_obj->getHomePhone(),
|
||
|
'mobile_phone' => $u_obj->getMobilePhone(),
|
||
|
|
||
|
'birth_date' => ( $u_obj->getBirthDate() != '' ) ? TTDate::getISODateStamp( $u_obj->getBirthDate() ) : '',
|
||
|
'sin' => $u_obj->getSIN(),
|
||
|
|
||
|
'work_email' => $u_obj->getWorkEmail(),
|
||
|
'home_email' => $u_obj->getHomeEmail(),
|
||
|
|
||
|
'deleted' => $u_obj->getDeleted(),
|
||
|
];
|
||
|
|
||
|
if ( $remote_organization_id != '' ) {
|
||
|
$user_data['organization_id'] = $remote_organization_id;
|
||
|
}
|
||
|
|
||
|
Debug::Arr( $user_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $user_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts getPaymentServicesData() results to an AgencyReport array for uploading.
|
||
|
* @param array $report_data
|
||
|
* @param object $prae_obj
|
||
|
* @param object $pra_obj
|
||
|
* @param object $rs_obj
|
||
|
* @param object $pra_user_obj
|
||
|
* @return array|bool
|
||
|
*/
|
||
|
function convertReportPaymentServicesDataToAgencyReportArray( $report_data, $prae_obj, $pra_obj, $rs_obj, $pra_user_obj ) {
|
||
|
if ( !isset( $report_data['agency_report_data'] ) ) {
|
||
|
Debug::Arr( $report_data, 'ERROR! Invalid Agency Report Data! ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$settlement_bank_account_data = $this->convertRemittanceSourceAccountObjectToBankAccountArray( $rs_obj );
|
||
|
|
||
|
if ( isset( $report_data['object'] ) ) {
|
||
|
Debug::Text( 'Report Object: ' . $report_data['object'], __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
|
||
|
$agency_report_data = [
|
||
|
'_kind' => 'AgencyReport',
|
||
|
|
||
|
'agency_id' => $prae_obj->getPayrollRemittanceAgencyObject()->getAgency(),
|
||
|
|
||
|
'settlement_bank_account_id' => $settlement_bank_account_data,
|
||
|
|
||
|
'status_id' => 'P', //Pending
|
||
|
'type_id' => 'D', //Deposit/Estimate
|
||
|
'form_type_id' => $prae_obj->getType(),
|
||
|
|
||
|
'period_start_date' => TTDate::getISODateStamp( $prae_obj->getStartDate() ),
|
||
|
'period_end_date' => TTDate::getISODateStamp( $prae_obj->getEndDate() ),
|
||
|
'due_date' => TTDate::getISOTimeStamp( $prae_obj->getDueDate() ),
|
||
|
|
||
|
'frequency_id' => $prae_obj->getFrequency(),
|
||
|
|
||
|
];
|
||
|
|
||
|
$agency_report_data = array_merge( $agency_report_data, $report_data['agency_report_data'] );
|
||
|
|
||
|
Debug::Arr( $agency_report_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $agency_report_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts ROE objects to a agency report array for uploading.
|
||
|
* @param $form_obj
|
||
|
* @param $rae_obj
|
||
|
* @param $ra_obj
|
||
|
* @param $remote_id
|
||
|
* @param $batch_id
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertROEToAgencyReportArray( $form_obj, $rae_obj, $ra_obj, $batch_id ) {
|
||
|
//Separate ROE form object into a separate object for each record.
|
||
|
foreach( $form_obj->getForms() as $tmp_form_obj ) {
|
||
|
foreach( $tmp_form_obj->getRecords() as $tmp_form_record ) {
|
||
|
$gf = new GovernmentForms(); //Always start with a fresh GovernmentForm object so there is no way we can mix forms between employees.
|
||
|
$new_roe_obj = clone $tmp_form_obj; //Clone the form record we are on, so we can eliminate all other records.
|
||
|
$new_roe_obj->clearRecords(); //Clear all records so we start from a clean slate
|
||
|
$new_roe_obj->addRecord( $tmp_form_record ); //Add just this single employees record to the form.
|
||
|
$gf->addForm( $new_roe_obj ); //Add just this single employees form.
|
||
|
$xml_data = $gf->output( 'XML' ); //Make sure the ROEHEADER element is always retained as it contains ROE version numbers and such.
|
||
|
|
||
|
$agency_report_data[] = [
|
||
|
'_kind' => 'AgencyReport',
|
||
|
|
||
|
'agency_id' => $rae_obj->getPayrollRemittanceAgencyObject()->getAgency(),
|
||
|
|
||
|
'status_id' => 'P', //Pending
|
||
|
'type_id' => 'R', //Report
|
||
|
'form_type_id' => $rae_obj->getType(),
|
||
|
|
||
|
'period_start_date' => TTDate::getISODateStamp( $tmp_form_record['first_date'] ),
|
||
|
'period_end_date' => TTDate::getISODateStamp( $tmp_form_record['last_date'] ),
|
||
|
'due_date' => TTDate::getISOTimeStamp( TTDate::getMiddleDayEpoch( ( time() + 86400 ) ) ), //Set due date to the next day.
|
||
|
|
||
|
'total_employees' => 1,
|
||
|
'subject_wages' => 0,
|
||
|
'taxable_wages' => 0,
|
||
|
'amount_withheld' => 0,
|
||
|
'amount_due' => 0,
|
||
|
|
||
|
'extra_data' => $tmp_form_record,
|
||
|
|
||
|
'xml_data' => $xml_data,
|
||
|
|
||
|
'frequency_id' => $rae_obj->getFrequency(),
|
||
|
|
||
|
'remote_id' => $tmp_form_record['id'],
|
||
|
'remote_batch_id' => $batch_id,
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Debug::Arr( $agency_report_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return $agency_report_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Converts T4 objects to a agency report array for uploading.
|
||
|
* @param $form_obj
|
||
|
* @param $report_data
|
||
|
* @param $rae_obj
|
||
|
* @param $ra_obj
|
||
|
* @param $remote_id
|
||
|
* @param $batch_id
|
||
|
* @return array
|
||
|
*/
|
||
|
function convertT4ToAgencyReportArray( $form_obj, $report_data, $rae_obj, $ra_obj, $remote_id, $batch_id ) {
|
||
|
$xml_data = $form_obj->output( 'XML' );
|
||
|
|
||
|
$agency_report_data = [
|
||
|
'_kind' => 'AgencyReport',
|
||
|
|
||
|
'agency_id' => $rae_obj->getPayrollRemittanceAgencyObject()->getAgency(),
|
||
|
|
||
|
'status_id' => 'P', //Pending
|
||
|
'type_id' => 'R', //Report
|
||
|
'form_type_id' => $rae_obj->getType(),
|
||
|
|
||
|
'period_start_date' => TTDate::getISODateStamp( $rae_obj->getStartDate() ), //$pay_period_start_date,
|
||
|
'period_end_date' => TTDate::getISODateStamp( $rae_obj->getEndDate() ),
|
||
|
'due_date' => TTDate::getISOTimeStamp( $rae_obj->getDueDate() ), //They can be filed earlier than their due date.
|
||
|
|
||
|
'total_employees' => count( $report_data ),
|
||
|
'subject_wages' => 0,
|
||
|
'taxable_wages' => 0,
|
||
|
'amount_withheld' => 0,
|
||
|
'amount_due' => 0,
|
||
|
|
||
|
'extra_data' => $report_data,
|
||
|
|
||
|
'xml_data' => $xml_data,
|
||
|
|
||
|
'frequency_id' => $rae_obj->getFrequency(),
|
||
|
|
||
|
'remote_id' => $remote_id,
|
||
|
'remote_batch_id' => $batch_id,
|
||
|
];
|
||
|
|
||
|
Debug::Arr( $agency_report_data, 'Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $agency_report_data;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Uploads organization data to TimeTrex PaymentServices.
|
||
|
* @param $rows
|
||
|
* @return bool
|
||
|
*/
|
||
|
function setOrganization( $rows ) {
|
||
|
if ( isset( $rows['_kind'] ) ) {
|
||
|
$rows = [ $rows ];
|
||
|
}
|
||
|
|
||
|
foreach ( $rows as $row ) {
|
||
|
$api = new PaymentServicesClientAPI( 'APIOrganization' );
|
||
|
$api_result = $api->setOrganization( $row );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
} else {
|
||
|
//Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param $id
|
||
|
* @return bool
|
||
|
*/
|
||
|
function getUser( $id ) {
|
||
|
$api = new PaymentServicesClientAPI( 'APIOrganization' );
|
||
|
$api_result = $api->getUser( [ 'id' => $id ] );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $api_result->getResultData();
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Uploads user data to TimeTrex PaymentServices.
|
||
|
* @param $rows
|
||
|
* @return bool
|
||
|
*/
|
||
|
function setUser( $rows ) {
|
||
|
if ( isset( $rows['_kind'] ) ) {
|
||
|
$rows = [ $rows ];
|
||
|
}
|
||
|
|
||
|
foreach ( $rows as $row ) {
|
||
|
$api = new PaymentServicesClientAPI( 'APIUser' );
|
||
|
$api_result = $api->setUser( $row );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
} else {
|
||
|
//Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create organization from Legal Entity
|
||
|
* @param $row
|
||
|
* @return bool
|
||
|
*/
|
||
|
function createNewOrganization( $row ) {
|
||
|
if ( isset( $row['_kind'] ) ) {
|
||
|
$row = [ $row ];
|
||
|
}
|
||
|
|
||
|
$api = new PaymentServicesClientAPI( 'APIAuthentication' ); //Need to do this before logging in.
|
||
|
$api_result = $api->setNewOrganization( $row );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $api_result->getResult(); //Return the ID so we can link a user to it.
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
} else {
|
||
|
//Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $row
|
||
|
* @return bool
|
||
|
*/
|
||
|
function createNewUser( $row ) {
|
||
|
if ( isset( $row['_kind'] ) ) {
|
||
|
$row = [ $row ];
|
||
|
}
|
||
|
|
||
|
$api = new PaymentServicesClientAPI( 'APIAuthentication' ); //Need to do this before logging in.
|
||
|
$api_result = $api->setNewUser( $row );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Arr( $api_result->getResult(), 'PaymentServices API: Retval: ', __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $api_result->getResult(); //Return the ID so we can link a user to it.
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
} else {
|
||
|
//Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Deep validation of bank account.
|
||
|
* @param $row
|
||
|
* @return bool
|
||
|
*/
|
||
|
function validateBankAccount( $row ) {
|
||
|
$api = new PaymentServicesClientAPI( 'APIBankAccount' );
|
||
|
$api_result = $api->validateBankAccount( $row );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return true;
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $api_result; //Return raw result object so we can get validation errors from it.
|
||
|
//return FALSE; //This will trigger a general error to the user.
|
||
|
}
|
||
|
} else {
|
||
|
//Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Updates the remote remittance bank account information.
|
||
|
* @param $rows
|
||
|
* @return bool
|
||
|
*/
|
||
|
function setRemittanceSourceAccount( $rows ) {
|
||
|
if ( isset( $rows['_kind'] ) ) {
|
||
|
$rows = [ $rows ];
|
||
|
}
|
||
|
|
||
|
foreach ( $rows as $row ) {
|
||
|
if ( isset( $row['deleted'] ) && $row['deleted'] == true ) {
|
||
|
$api = new PaymentServicesClientAPI( 'APIBankAccount' );
|
||
|
$api_result = $api->getBankAccount( [ 'filter_data' => [ 'remote_id' => $row['remote_id'] ] ] );
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
$bank_account_id = $api_result->getResult()[0]['id'];
|
||
|
Debug::Text( 'PaymentServices API: Bank Account ID: ' . $bank_account_id, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
$api_result = $api->deleteBankAccount( $bank_account_id );
|
||
|
if ( $api_result->isValid() !== true ) {
|
||
|
Debug::Arr( $api_result->getResult(), 'PaymentServices API: Failed deleting Bank Account ID: ' . $bank_account_id, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$api = new PaymentServicesClientAPI( 'APIBankAccount' );
|
||
|
$api_result = $api->setBankAccount( $row );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
} else {
|
||
|
//Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Updates the remote remittance agency information.
|
||
|
* @param $rows
|
||
|
* @return bool
|
||
|
*/
|
||
|
function setAgencyAuthorization( $rows ) {
|
||
|
if ( isset( $rows['_kind'] ) ) {
|
||
|
$rows = [ $rows ];
|
||
|
}
|
||
|
|
||
|
foreach ( $rows as $row ) {
|
||
|
if ( isset( $row['deleted'] ) && $row['deleted'] == true ) {
|
||
|
$api = new PaymentServicesClientAPI( 'APIAgencyAuthorization' );
|
||
|
$api_result = $api->getAgencyAuthorization( [ 'filter_data' => [ 'remote_id' => $row['remote_id'] ] ] );
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
$agency_authorization_id = $api_result->getResult()[0]['id'];
|
||
|
Debug::Text( 'PaymentServices API: Agency Authorization ID: ' . $agency_authorization_id, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
$api_result = $api->deleteAgencyAuthorization( $agency_authorization_id );
|
||
|
if ( $api_result->isValid() !== true ) {
|
||
|
Debug::Arr( $api_result->getResult(), 'PaymentServices API: Failed deleting Agency Authorization ID: ' . $agency_authorization_id, __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$api = new PaymentServicesClientAPI( 'APIAgencyAuthorization' );
|
||
|
$api_result = $api->setAgencyAuthorization( $row );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
} else {
|
||
|
//Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
return false; //This will trigger a general error to the user.
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Uploads Agency Report for processing through TimeTrex PaymentServices.
|
||
|
* @param $rows
|
||
|
* @return bool
|
||
|
*/
|
||
|
function setAgencyReport( $rows ) {
|
||
|
if ( isset( $rows['_kind'] ) ) {
|
||
|
$rows = [ $rows ];
|
||
|
}
|
||
|
|
||
|
$api = new PaymentServicesClientAPI( 'APIAgencyReport' );
|
||
|
$api_result = $api->setAgencyReport( $rows );
|
||
|
|
||
|
return $api_result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Uploads Pay Stub transactions for processing through TimeTrex PaymentServices.
|
||
|
* @param $rows
|
||
|
* @return bool
|
||
|
*/
|
||
|
function setPayStubTransaction( $rows ) {
|
||
|
if ( isset( $rows['_kind'] ) ) {
|
||
|
$rows = [ $rows ];
|
||
|
}
|
||
|
|
||
|
$api = new PaymentServicesClientAPI( 'APITransaction' );
|
||
|
$api_result = $api->setTransaction( $rows );
|
||
|
|
||
|
return $api_result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param null $start_date
|
||
|
* @param null $end_date
|
||
|
* @return bool
|
||
|
*/
|
||
|
function getAccountStatementReport( $start_date = null, $end_date = null ) {
|
||
|
$api = new PaymentServicesClientAPI( 'APIOrganization' );
|
||
|
$api_result = $api->getAccountStatementReport( $start_date, $end_date );
|
||
|
if ( $api_result !== false ) {
|
||
|
if ( $api_result->isValid() === true ) {
|
||
|
Debug::Text( 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
|
||
|
return $api_result->getResultData();
|
||
|
} else {
|
||
|
Debug::Arr( $api_result, 'PaymentServices API: Retval: ' . $api_result->getResult(), __FILE__, __LINE__, __METHOD__, 10 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return mixed
|
||
|
*/
|
||
|
function ping() {
|
||
|
$api = new PaymentServicesClientAPI( 'APIAuthentication' );
|
||
|
|
||
|
return $api->ping();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
?>
|