TimeTrex/classes/GovernmentForms/country/ca/roe.class.php

1265 lines
34 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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".
*
********************************************************************************/
include_once( 'CA.class.php' );
/**
* @package GovernmentForms
*/
class GovernmentForms_CA_ROE extends GovernmentForms_CA {
public $xml_schema = 'PayrollExtractXmlV2.xsd'; //http://www.esdc.gc.ca/en/ei/roe/user_requirements/appendix_d.page
public $pdf_template = 'roe.pdf';
public $template_offsets = [ -10, 0 ];
function getOptions( $name ) {
$retval = null;
switch ( $name ) {
case 'status':
$retval = [
'-1010-O' => TTi18n::getText( 'Original' ),
'-1020-A' => TTi18n::getText( 'Amended' ),
'-1030-C' => TTi18n::getText( 'Cancel' ),
];
break;
case 'type':
$retval = [
'government' => TTi18n::gettext( 'Government (Multiple Employees/Page)' ),
'employee' => TTi18n::gettext( 'Employee (One Employee/Page)' ),
];
break;
}
return $retval;
}
//Set the type of form to display/print. Typically this would be:
// government or employee.
function getType() {
if ( isset( $this->type ) ) {
return $this->type;
}
return false;
}
function setType( $value ) {
$this->type = trim( $value );
return true;
}
//Set the submission status. Original, Amended, Cancel.
function getStatus() {
if ( isset( $this->status ) ) {
return $this->status;
}
return 'O'; //Original
}
function setStatus( $value ) {
$this->status = strtoupper( trim( $value ) );
return true;
}
function getShowInstructionPage() {
if ( isset( $this->show_instruction_page ) ) {
return $this->show_instruction_page;
}
return false;
}
function setShowInstructionPage( $value ) {
$this->show_instruction_page = (bool)trim( $value );
return true;
}
public function getTemplateSchema( $name = null ) {
$template_schema = [
//Initialize page1, replace years on template.
[
'page' => 1,
'template_page' => 1,
'on_background' => true,
],
//Serial
'serial' => [
'coordinates' => [
'x' => 35,
'y' => 58,
'h' => 8,
'w' => 115,
'halign' => 'R',
],
'font' => [
'size' => 12,
'type' => '',
],
],
'payroll_reference_number' => [
'coordinates' => [
'x' => 370,
'y' => 58,
'h' => 10,
'w' => 210,
'halign' => 'R',
],
'font' => [
'size' => 12,
'type' => '',
],
],
//Employer Info
//Company information
'company_name' => [
'coordinates' => [
'x' => 35,
'y' => 90,
'h' => 10,
'w' => 310,
'halign' => 'L',
],
'font' => [
'size' => 12,
'type' => '',
],
],
'company_address' => [
'function' => [ 'draw' => [ 'filterCompanyAddress', 'drawNormal' ] ],
'coordinates' => [
'x' => 35,
'y' => 105,
'h' => 10,
'w' => 310,
'halign' => 'L',
],
'font' => [
'size' => 12,
'type' => '',
],
'multicell' => true,
],
'company_postal_code' => [
'coordinates' => [
'x' => 280,
'y' => 138,
'h' => 10,
'w' => 65,
'halign' => 'C',
],
'font' => [
'size' => 10,
'type' => '',
],
],
//Business Number
'business_number' => [
'coordinates' => [
'x' => 370,
'y' => 85,
'h' => 10,
'w' => 210,
'halign' => 'R',
],
'font' => [
'size' => 12,
'type' => '',
],
],
//Employee info
'employee_full_name' => [
'coordinates' => [
'x' => 35,
'y' => 165,
'h' => 10,
'w' => 310,
'halign' => 'L',
],
'font' => [
'size' => 12,
'type' => '',
],
],
'employee_address' => [
'function' => [ 'draw' => [ 'filterEmployeeAddress', 'drawNormal' ] ],
'coordinates' => [
'x' => 35,
'y' => 180,
'h' => 10,
'w' => 310,
'halign' => 'L',
],
'font' => [
'size' => 12,
'type' => '',
],
'multicell' => true,
],
//Pay Period Type
'pay_period_type' => [
'coordinates' => [
'x' => 370,
'y' => 112,
'h' => 10,
'w' => 210,
'halign' => 'R',
],
'font' => [
'size' => 12,
'type' => '',
],
],
//SIN
'sin' => [
'coordinates' => [
'x' => 370,
'y' => 136,
'h' => 10,
'w' => 210,
'halign' => 'R',
],
'font' => [
'size' => 12,
'type' => '',
],
],
//Employee Title
'title' => [
'coordinates' => [
'x' => 35,
'y' => 240,
'h' => 10,
'w' => 310,
'halign' => 'L',
],
'font' => [
'size' => 12,
'type' => '',
],
],
//First Day Worked
'first_date' => [
'function' => [ 'draw' => [ 'filterDate', 'drawSegments' ] ],
'coordinates' => [
[
'x' => 490,
'y' => 160,
'h' => 15,
'w' => 20,
'halign' => 'C',
],
[
'x' => 512,
'y' => 160,
'h' => 15,
'w' => 26,
'halign' => 'C',
],
[
'x' => 540,
'y' => 160,
'h' => 15,
'w' => 40,
'halign' => 'C',
],
],
'font' => [
'size' => 10,
'type' => '',
],
],
//Last day paid
'last_date' => [
'function' => [ 'draw' => [ 'filterDate', 'drawSegments' ] ],
'coordinates' => [
[
'x' => 490,
'y' => 185,
'h' => 17,
'w' => 21,
'halign' => 'C',
],
[
'x' => 513,
'y' => 185,
'h' => 17,
'w' => 25,
'halign' => 'C',
],
[
'x' => 540,
'y' => 185,
'h' => 17,
'w' => 40,
'halign' => 'C',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
//Pay Period End Date
'pay_period_end_date' => [
'function' => [ 'draw' => [ 'filterDate', 'drawSegments' ] ],
'coordinates' => [
[
'x' => 490,
'y' => 210,
'h' => 18,
'w' => 21,
'halign' => 'C',
],
[
'x' => 513,
'y' => 210,
'h' => 18,
'w' => 25,
'halign' => 'C',
],
[
'x' => 540,
'y' => 210,
'h' => 18,
'w' => 40,
'halign' => 'C',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'recall_date' => [
'function' => [ 'draw' => [ 'filterDate', 'drawSegments' ] ],
'coordinates' => [
[
'x' => 490,
'y' => 240,
'h' => 18,
'w' => 21,
'halign' => 'C',
],
[
'x' => 513,
'y' => 240,
'h' => 18,
'w' => 25,
'halign' => 'C',
],
[
'x' => 540,
'y' => 240,
'h' => 18,
'w' => 40,
'halign' => 'C',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
// not returning
'not_returning' => [
'function' => [ 'draw' => [ 'drawCheckBox' ] ],
'coordinates' => [
[
'x' => 423,
'y' => 242,
'h' => 8,
'w' => 11,
'halign' => 'C',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
//Insurable Hours
'insurable_hours' => [
'coordinates' => [
'x' => 170,
'y' => 268,
'h' => 10,
'w' => 85,
'halign' => 'R',
],
'font' => [
'type' => '',
'size' => 10,
],
],
//Insurable Earnings
'insurable_earnings' => [
'function' => [ 'draw' => [ 'drawSplitDecimalFloat' ] ],
'coordinates' => [
[
'x' => 180,
'y' => 298,
'h' => 10,
'w' => 60,
'halign' => 'R',
],
[
'x' => 239,
'y' => 298,
'h' => 10,
'w' => 15,
'halign' => 'L',
],
],
'font' => [
'type' => '',
'size' => 10,
//'text_color' => array( 255, 0, 0 ),
],
],
'insurable_earnings_pay_periods' => [
'function' => [ 'draw' => [ 'filterInsurableEarningsPayPeriods', 'drawNormal' ] ],
'coordinates' => [
'x' => 37,
'y' => 304,
'h' => 5,
'w' => 70,
'halign' => 'C',
],
'font' => [
'type' => '',
'size' => 8,
],
],
//Enter Code
'code_id' => [
'coordinates' => [
'x' => 542,
'y' => 268,
'h' => 10,
'w' => 20,
'halign' => 'L',
],
'font' => [
'type' => '',
'size' => 10,
],
],
//Further Information Contact Name
'created_user_full_name' => [
'function' => [ 'draw' => [ 'drawPiecemeal' ] ],
'coordinates' => [
[
'x' => 270,
'y' => 294,
'h' => 10,
'w' => 310,
'halign' => 'L',
],
[
'x' => 275,
'y' => 710,
'h' => 10,
'w' => 210,
'halign' => 'L',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'created_user_work_phone' => [
'function' => [ 'draw' => [ 'drawPiecemeal' ] ],
'coordinates' => [
[
'x' => 330,
'y' => 305,
'h' => 8,
'w' => 250,
'halign' => 'L',
],
[
'x' => 155,
'y' => 715,
'h' => 10,
'w' => 110,
'halign' => 'L',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'vacation_pay' => [
'function' => [ 'draw' => [ 'drawSplitDecimalFloat', 'showVacationPayWarning' ] ],
'coordinates' => [
[
'x' => 510,
'y' => 351,
'h' => 10,
'w' => 42,
'halign' => 'R',
],
[
'x' => 552,
'y' => 351,
'h' => 10,
'w' => 16,
'halign' => 'L',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'comments' => [
'coordinates' => [
'x' => 290,
'y' => 540,
'h' => 45,
'w' => 290,
'halign' => 'L',
],
'font' => [
'type' => '',
'size' => 10,
],
],
//English
'english' => [
'function' => [ 'draw' => [ 'drawCheckBox' ] ],
'coordinates' => [
[
'x' => 40,
'y' => 713,
'h' => 8,
'w' => 15,
'halign' => 'L',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'created_date' => [
'function' => [ 'draw' => [ 'filterDate', 'drawSegments' ] ],
'coordinates' => [
[
'x' => 490,
'y' => 717,
'h' => 8,
'w' => 25,
'halign' => 'C',
],
[
'x' => 518,
'y' => 717,
'h' => 8,
'w' => 25,
'halign' => 'C',
],
[
'x' => 544,
'y' => 717,
'h' => 8,
'w' => 35,
'halign' => 'C',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'pay_period_earnings' => [
'function' => [ 'draw' => [ 'drawGrid', 'showPayPeriod1Warning' ] ],
'grid' => [
'column' => 3, // total columns
'top_left_x' => 35, // start x
'top_left_y' => 368, // start y
'h' => 18, // Each of the height of the grid
'w' => 60, // Each of the width of the grid
'step_x' => 84,
'step_y' => 18,
],
'coordinates' => [
'halign' => 'R',
// not in here handle .
//'x' => 35,
//'y' => 368,
//'h' => 18,
//'w' => 60,
],
'font' => [
'type' => '',
'size' => 8,
],
],
'statutory_holiday' => [
'function' => [ 'draw' => [ 'drawSplitDecimalFloatGrid' ] ],
'coordinates' => [
[
[
'x' => 352,
'y' => 380,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 396,
'y' => 380,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 507,
'y' => 380,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 380,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 352,
'y' => 397,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 396,
'y' => 397,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 507,
'y' => 397,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 397,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 352,
'y' => 414,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 396,
'y' => 414,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 507,
'y' => 414,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 414,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 352,
'y' => 429,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 396,
'y' => 429,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 507,
'y' => 429,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 429,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 352,
'y' => 446,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 396,
'y' => 446,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 507,
'y' => 446,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 446,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'other_monies' => [
'function' => [ 'draw' => [ 'drawSplitDecimalFloatGrid' ] ],
'coordinates' => [
[
[
'x' => 507,
'y' => 476,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 476,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 507,
'y' => 494,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 494,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
[
[
'x' => 507,
'y' => 514,
'h' => 10,
'w' => 47,
'halign' => 'R',
],
[
'x' => 551,
'y' => 514,
'h' => 10,
'w' => 17,
'halign' => 'L',
],
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
'other_monies_label' => [
'function' => [ 'draw' => [ 'drawNormalGrid' ] ],
'coordinates' => [
[
'x' => 285,
'y' => 476,
'h' => 10,
'w' => 207,
'halign' => 'R',
],
[
'x' => 285,
'y' => 494,
'h' => 10,
'w' => 207,
'halign' => 'R',
],
[
'x' => 285,
'y' => 514,
'h' => 10,
'w' => 207,
'halign' => 'R',
],
],
'font' => [
'type' => '',
'size' => 10,
],
],
];
if ( isset( $template_schema[$name] ) ) {
return $name;
} else {
return $template_schema;
}
}
function filterMiddleName( $value ) {
//Return just initial
$value = substr( $value, 0, 1 );
return $value;
}
function filterCompanyAddress( $value ) {
//Combine company address for multicell display.
//Dont specify postal code though, as thats in a separate box.
return Misc::formatAddress( null, $this->company_address1, $this->company_address2, $this->company_city, $this->company_province );
}
function filterEmployeeAddress( $value ) {
//Combine employee address for multicell display.
return Misc::formatAddress( null, $this->employee_address1, $this->employee_address2, $this->employee_city, $this->employee_province, $this->employee_postal_code );
}
function filterDate( $value ) {
if ( $value != '' || $value != null ) {
$value = getdate( $value );
$value = [ $value['mday'], $value['mon'], $value['year'] ];
}
return $value;
}
function filterInsurableEarningsPayPeriods( $value ) {
$retval = (int)$value;
$total_pay_periods_with_earnings = ( is_array( $this->pay_period_earnings ) ) ? count( $this->pay_period_earnings ) : 0;
if ( $value > $total_pay_periods_with_earnings ) {
return null; //No need to display this msg as all PPs are included.
} else {
return '*' . TTi18n::getText( 'Includes PP: 1 to %1', [ $retval ] );
}
}
function showPayPeriod1Warning() {
if ( isset( $this->pay_period_earnings ) && is_array( $this->pay_period_earnings ) && count( $this->pay_period_earnings ) > 0 && isset( $this->pay_period_earnings[0] ) ) {
$last_pay_period_earnings = $this->pay_period_earnings[0];
Debug::Text( 'First PP Earnings: ' . $last_pay_period_earnings, __FILE__, __LINE__, __METHOD__, 10 );
if ( $last_pay_period_earnings < 1.00 ) { //Pay Period #1 (last PP) can not be less than $1.
Debug::Text( 'Pay Period #1 must have insurable earnings of at least $1', __FILE__, __LINE__, __METHOD__, 10 );
$this->addMessage( 'warning', 'Pay Period #1 must have insurable earnings of at least $1.', [ 'page' => $this->getCurrentPage(), 'x' => ( 33 + $this->getTempPageOffsets( 'x' ) + $this->getPageMargins( 'x' ) ), 'y' => ( 368 + $this->getTempPageOffsets( 'y' ) + $this->getPageMargins( 'y' ) ) ] );
}
}
return true;
}
function showVacationPayWarning() {
if ( isset( $this->vacation_pay ) && $this->vacation_pay > 0 && isset( $this->pay_period_earnings ) && is_array( $this->pay_period_earnings ) && count( $this->pay_period_earnings ) > 0 && isset( $this->pay_period_earnings[0] ) ) {
$last_pay_period_earnings = $this->pay_period_earnings[0];
Debug::Text( 'First PP Earnings: ' . $last_pay_period_earnings . ' Vacation Pay: ' . $this->vacation_pay, __FILE__, __LINE__, __METHOD__, 10 );
if ( $this->vacation_pay >= $last_pay_period_earnings ) {
Debug::Text( 'Vacation Pay equals or exceeds last PP earnings, which is not allowed, as there must also be some insurable earnings in that pay period too.', __FILE__, __LINE__, __METHOD__, 10 );
$this->addMessage( 'warning', 'Vacation pay must not match Pay Period #1 earnings.', [ 'page' => $this->getCurrentPage(), 'x' => ( 322 + $this->getTempPageOffsets( 'x' ) + $this->getPageMargins( 'x' ) ), 'y' => ( 330 + $this->getTempPageOffsets( 'y' ) + $this->getPageMargins( 'y' ) ) ] );
}
}
return true;
}
function _outputXML( $type = null ) {
$records = $this->getRecords();
Debug::Arr( $records, 'Output XML Records: ', __FILE__, __LINE__, __METHOD__, 10 );
if ( is_array( $records ) && count( $records ) > 0 ) {
$pay_period_type_options = [
//5 => TTi18n::gettext('Manual'),
10 => 'W',
20 => 'B',
30 => 'S',
50 => 'M',
100 => 'W', //Weekly 53/year
200 => 'B', //Bi-Weekly 27/year
];
$xml = new SimpleXMLElement( '<ROEHEADER FileVersion="W-2.0" SoftwareVendor="' . APPLICATION_NAME . '" ProductName="' . APPLICATION_NAME . '"></ROEHEADER>' );
$this->setXMLObject( $xml );
$e = 0;
foreach ( $records as $employee_data ) {
//Debug::Arr($employee_data, 'Employee Data: ', __FILE__, __LINE__, __METHOD__,10);
$this->arrayToObject( $employee_data ); //Convert record array to object
$xml->addChild( 'ROE' );
$xml->ROE[$e]->addAttribute( 'PrintingLanguage', 'E' ); //E=English, F=French
$xml->ROE[$e]->addAttribute( 'Issue', 'S' ); //S=Submit, D=Draft
// Box2
if ( $this->serial != '' ) {
$xml->ROE[$e]->addChild( 'B2', substr( $this->serial, 0, 9 ) ); //maxLength 9 minOccurs="0" -- This is the serial number of the ROE amended or replaced.
}
// Box3
if ( $this->payroll_reference_number != '' ) {
$xml->ROE[$e]->addChild( 'B3', substr( $this->payroll_reference_number, 0, 15 ) ); //maxLength 15 minOccurs="0"
}
// Box5
$xml->ROE[$e]->addChild( 'B5', substr( str_replace( ' ', '', $this->business_number ), 0, 15 ) ); //maxLength 15 - Remove any spaces as well, to prevent business numbers like: 123456789 RP 0001 from causing problems.
// Box6
$xml->ROE[$e]->addChild( 'B6', $pay_period_type_options[$this->pay_period_type_id] ); //maxLength 1
// Box8
$xml->ROE[$e]->addChild( 'B8', ( $this->sin != '' ) ? $this->sin : '999999999' ); //maxLength 9 - This must be specified, but allow all 9's for cases where the employee may be out of the country?
// Box9
$xml->ROE[$e]->addChild( 'B9' );
$xml->ROE[$e]->B9->addChild( 'FN', substr( $this->first_name, 0, 20 ) ); //maxLength 20
if ( $this->middle_name != '' ) {
$xml->ROE[$e]->B9->addChild( 'MN', substr( $this->middle_name, 0, 4 ) ); //maxLength 4 minOccurs="0"
}
$xml->ROE[$e]->B9->addChild( 'LN', substr( $this->last_name, 0, 28 ) ); //maxLength 28
$xml->ROE[$e]->B9->addChild( 'A1', substr( Misc::stripHTMLSpecialChars( $this->employee_address1 ) . ' ' . Misc::stripHTMLSpecialChars( $this->employee_address2 ), 0, 35 ) ); //maxLength 35
if ( $this->employee_city != '' ) {
$xml->ROE[$e]->B9->addChild( 'A2', substr( $this->employee_city, 0, 35 ) );//maxLength 35 minOccurs="0"
}
if ( $this->employee_province != '' ) {
$xml->ROE[$e]->B9->addChild( 'A3', $this->employee_province ); //maxLength 35 minOccurs="0"
}
if ( $this->employee_postal_code != '' ) {
$xml->ROE[$e]->B9->addChild( 'PC', $this->employee_postal_code );
}
// Box10
$xml->ROE[$e]->addChild( 'B10', date( 'Y-m-d', $this->first_date ) ); //maxLength 8
// Box11
$xml->ROE[$e]->addChild( 'B11', date( 'Y-m-d', $this->last_date ) ); //maxLength 8
// Box12
$xml->ROE[$e]->addChild( 'B12', date( 'Y-m-d', $this->pay_period_end_date ) ); //maxLength 8
// Box13
if ( $this->title != '' ) {
$xml->ROE[$e]->addChild( 'B13', substr( Misc::stripHTMLSpecialChars( $this->title ), 0, 40 ) ); //maxLength 40 minOccurs="0"
}
// Box14
$xml->ROE[$e]->addChild( 'B14' ); // minOccurs="0"
$xml->ROE[$e]->B14->addChild( 'CD', ( ( $this->recall_date != '' ) ? 'Y' : 'N' ) ); //maxLength 1
$xml->ROE[$e]->B14->addChild( 'DT', ( ( $this->recall_date != '' ) ? date( 'Y-m-d', $this->recall_date ) : '' ) ); //maxLength 8 minOccurs="0"
// Box15A
$xml->ROE[$e]->addChild( 'B15A', substr( round( $this->insurable_hours ), 0, 4 ) ); //maxLength 4
// Box15B
//$xml->ROE[$e]->addChild('B15B', (float)substr($this->insurable_earnings, -9, 9)); //maxLength 9
// Box15C
$xml->ROE[$e]->addChild( 'B15C' );
if ( is_array( $this->pay_period_earnings ) ) {
$i = 1;
$x = 0;
foreach ( $this->pay_period_earnings as $pay_period_earning ) {
if ( $x == 53 ) {
break;
}
$xml->ROE[$e]->B15C->addChild( 'PP' ); //maxOccurs="53"
$xml->ROE[$e]->B15C->PP[$x]->addAttribute( 'nbr', $i );
$xml->ROE[$e]->B15C->PP[$x]->addChild( 'AMT', (float)substr( $pay_period_earning, -9, 9 ) ); //maxLength 9
$i++;
$x++;
}
} else {
$xml->ROE[$e]->B15C->addChild( 'PP' ); //maxOccurs="53"
$xml->ROE[$e]->B15C->PP->addAttribute( 'nbr', 1 );
$xml->ROE[$e]->B15C->PP->addChild( 'AMT', 0 ); //maxLength 9
}
// Box16
$xml->ROE[$e]->addChild( 'B16' );
$xml->ROE[$e]->B16->addChild( 'CD', $this->code_id ); //maxLength 1
$xml->ROE[$e]->B16->addChild( 'FN', substr( $this->created_user_first_name, 0, 20 ) ); //maxLength 20
$xml->ROE[$e]->B16->addChild( 'LN', substr( $this->created_user_last_name, 0, 28 ) ); //maxLength 28
if ( $this->created_user_work_phone != '' ) {
$phone = $this->created_user_work_phone;
} else if ( $this->company_work_phone != '' ) {
$phone = $this->company_work_phone;
}
$validator = new Validator();
$phone = $validator->stripNonNumeric( $phone );
$xml->ROE[$e]->B16->addChild( 'AC', substr( $phone, 0, 3 ) ); //maxLength 3
$xml->ROE[$e]->B16->addChild( 'TEL', substr( $phone, 3, 7 ) ); //maxLength 7
// Box17A
if ( $this->vacation_pay > 0 ) {
//$xml->ROE[$e]->addChild('B17A', (float)substr($this->vacation_pay, -9, 9)); // maxLength 9 minOccurs="0"
$xml->ROE[$e]->addChild( 'B17A' );
$xml->ROE[$e]->B17A->addChild( 'VP' );
$xml->ROE[$e]->B17A->VP->addAttribute( 'nbr', 1 );
$xml->ROE[$e]->B17A->VP->addChild( 'CD', 2 ); //1=Included with each pay, 2=Paid because no longer working
$xml->ROE[$e]->B17A->VP->addChild( 'AMT', (float)substr( $this->vacation_pay, -9, 9 ) );
}
// Box17B
if ( is_array( $this->statutory_holiday ) ) {
$xml->ROE[$e]->addChild( 'B17B' ); // minOccurs="0"
$x = 0;
$i = 0;
foreach ( $this->statutory_holiday as $holiday ) {
if ( $x == 3 ) {
break;
}
if ( is_array( $holiday ) ) {
$xml->ROE[$e]->B17B->addChild( 'SH' ); //minOccurs="0" maxOccurs="3"
$xml->ROE[$e]->B17B->SH[$x]->addAttribute( 'nbr', $i );
$xml->ROE[$e]->B17B->SH[$x]->addChild( 'DT', date( 'Y-m-d', $holiday['date'] ) ); //maxLength 8
$xml->ROE[$e]->B17B->SH[$x]->addChild( 'AMT', (float)substr( $holiday['amount'], -9, 9 ) ); //maxLength 9
$x++;
$i++;
} else {
continue;
}
}
}
// Box17C
if ( is_array( $this->other_monies ) ) {
$xml->ROE[$e]->addChild( 'B17C' ); //minOccurs="0"
$x = 0;
$i = 1;
foreach ( $this->other_monies as $monies ) {
if ( $x == 3 ) {
break;
}
if ( is_array( $monies ) ) {
$xml->ROE[$e]->B17C->addChild( 'OM' ); //minOccurs="0" maxOccurs="3"
$xml->ROE[$e]->B17C->OM[$x]->addAttribute( 'nbr', $i );
$xml->ROE[$e]->B17C->OM[$x]->addChild( 'CD', $monies['code'] ); //minLength: 3 maxLength: 3 See Other Monies Codes: https://www.canada.ca/en/employment-social-development/programs/ei/ei-list/ei-roe/user-requirements/appendix-d.html -- "Table 12: 17C.1 Other Monies Information"
$xml->ROE[$e]->B17C->OM[$x]->addChild( 'AMT', (float)substr( $monies['amount'], -9, 9 ) ); //maxLength 9
$x++;
$i++;
} else {
continue;
}
}
}
// Box18
if ( $this->comments != '' ) {
$xml->ROE[$e]->addChild( 'B18', substr( Misc::stripHTMLSpecialChars( $this->comments ), 0, 160 ) ); //minOccurs="0", maxLength=160
}
// Box19 //minOccurs="0"
// Box20
$xml->ROE[$e]->addChild( 'B20', 'E' ); //Language //minOccurs="0" //maxLength 1
$this->revertToOriginalDataState();
$e++;
}
}
return true;
}
function _outputPDF( $type ) {
//Initialize PDF with template.
$pdf = $this->getPDFObject();
if ( $this->getShowBackground() == true ) {
$pdf->setSourceFile( $this->getTemplateDirectory() . DIRECTORY_SEPARATOR . $this->pdf_template );
$this->template_index[1] = $pdf->ImportPage( 1 );
//$this->template_index[2] = $pdf->ImportPage(2);
//$this->template_index[3] = $pdf->ImportPage(3);
}
if ( $this->year == '' ) {
$this->year = $this->getYear();
}
//Get location map, start looping over each variable and drawing
$records = $this->getRecords();
if ( is_array( $records ) && count( $records ) > 0 ) {
$template_schema = $this->getTemplateSchema();
$e = 0;
foreach ( $records as $employee_data ) {
//Debug::Arr($employee_data, 'Employee Data: ', __FILE__, __LINE__, __METHOD__,10);
$this->arrayToObject( $employee_data ); //Convert record array to object
foreach ( $template_schema as $field => $schema ) {
//Debug::text('Drawing Cell... Field: '. $field, __FILE__, __LINE__, __METHOD__, 10);
$this->Draw( $this->$field, $schema );
}
$this->resetTemplatePage();
$this->revertToOriginalDataState();
$e++;
}
}
$this->drawMessages();
return true;
}
}
?>