Skip to content

Instantly share code, notes, and snippets.

Created November 20, 2014 11:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/0203c377fcc0bd670863 to your computer and use it in GitHub Desktop.
Save anonymous/0203c377fcc0bd670863 to your computer and use it in GitHub Desktop.
<?php
class ContractForm_Step1 extends MultiFormStep {
protected static $fields;
public static $can_go_back = true;
public static $next_steps = 'ContractForm_Step2';
function Title() {
return _t("ContractForm.StepNum", "Step", array("num" => 1));
}
function Subtitle() {
return "Contract details";
}
function onBeforeWrite(){
parent::onBeforeWrite();
//if we're coming from the init step
if(
isset($_POST['Step']) &&
$_POST['Step'] == "ContractForm_Check" &&
isset($_POST['Template'])
) {
$defaults = unserialize($this->Session()->Template()->Data);
$this->Data = serialize($defaults[$this->ClassName]);
$data = unserialize($this->Data);
$data['PlaceOfWork'] = Member::currentUser()->Organisation()->HeadOfficeAddress;
$this->Data = serialize($data);
}
if(isset($_POST['ChosenEmployee'])) {
$employee = Member::get()->filter(array(
'ID' => $_POST['ChosenEmployee'],
'OrganisationID' => Member::currentUser()->OrganisationID
))->First();
//if they've selected a chosen employee
if($employee->ID) {
$data = unserialize($this->Data);
$data['EmployeeName'] = $employee->Name;
$data['EmployeeAddress'] = $employee->Address;
$this->Data = serialize($data);
}
}
}
function getFields() {
if(!self::$fields) {
$employment_types = array(
'full-time' => _t('ContractForm.EmploymentType_FullTime'),
'part-time' => _t('ContractForm.EmploymentType_PartTime')
);
$number_range = range(1, 31);
$date_range = array();
foreach($number_range as &$number) {
$ends = array('th','st','nd','rd','th','th','th','th','th','th');
if (($number %100) >= 11 && ($number%100) <= 13)
$ord = $number. 'th';
else
$ord = $number. $ends[$number % 10];
$date_range[$ord] = $ord;
}
unset($number);
$months = array("January" => "January","February" => "February","March" => "March", "April" => "April", "May" => "May","June" => "June","July" =>"July", "August" => "August","September" => "September", "October" => "October","November" => "November", "December" =>"December");
$weeks_or_months = array(
'Weeks' => _t('Common.Weeks'),
'Months' => _t('Common.Months')
);
$yes_no = array('Yes' => _t('Common.Yes'), 'No' => _t('Common.No'));
$overtimepay_days = array(
'All week' => 'All week',
'Monday - Friday' => 'Monday - Friday',
'Saturday' => 'Saturday',
'Sunday' => 'Sunday',
'Saturday & Sunday' => 'Saturday & Sunday',
'Public Holiday' => 'Public Holiday'
);
$overtimepay_times = array(
'All times' => 'All times',
'After 5pm' => 'After 5pm',
'After 6pm' => 'After 6pm',
'After 7pm' => 'After 7pm',
'After 8pm' => 'After 8pm',
'After 9pm' => 'After 9pm',
'After 10pm' => 'After 10pm',
'After 11pm' => 'After 11pm',
'After midnight' => 'After midnight',
'Before 12 noon' => 'Before 12 noon',
'After 12 noon' => 'After 12 noon'
);
$overtimepay_rates = array(
'Normal hourly rate' => 'Normal hourly rate',
'1.5 times your normal hourly rate' => '1.5 times the normal hourly rate',
'2.0 times your normal hourly rate' => '2.0 times the normal hourly rate',
'3.0 times your normal hourly rate' => '3.0 times the normal hourly rate',
'As agreed with your line manager' => 'As agreed with your line manager'
);
$fields = new FieldList(
TextField::create('EmployeeName'),
AddressField::create('EmployeeAddress', 'Employee Address'),
DateField::create('EmploymentStartDate')
->setConfig('dateformat', 'd MMMM yyyy')
->setConfig('datavalueformat', 'd MMMM yyyy')
->setRightTitle('This is the original start date of the employment <strong>not</strong> when the contract is issued.'),
HeaderField::create('Section_PositionAndDuties', _t('ContractForm.Section_PositionAndDuties')),
TextField::create('EmployeeJobTitle')
->setRightTitle('e.g. Administrator, Electrician, Receptionist'),
DropdownField::create('EmploymentType', null, $employment_types),
OptionsetField::create('HaveJobDescription', 'Do you have a job description in place for this contract?', $yes_no),
DropdownField::create('WhereCanEmployeesFindJobDescription', null, array(
'LineManager' => _t('Common.CanBeObtainedFrom_LineManager'),
'Office' => _t('Common.CanBeObtainedFrom_Office'),
'HR' => _t('Common.CanBeObtainedFrom_HR'),
'ThisContract' => _t('Common.CanBeObtainedFrom_ThisContract'),
'FinanceDept' => _t('Common.CanBeObtainedFrom_FinanceDept'),
'ConsultManager' => "Please consult your Manager for an outline of your duties"
))->displayIf('HaveJobDescription')->isEqualTo('Yes')->end(),
HeaderField::create('Section_ProbationaryPeriod', _t('ContractForm.Section_ProbationaryPeriod')),
OptionsetField::create('HaveProbationaryPeriod', null, $yes_no)
->setRightTitle('\'Yes\' is recommended'),
DropdownField::create('ProbationaryPeriodLength', '', array(
'3 months' => '3 months',
'6 months' => '6 months'
))
->setRightTitle('3 months is recommended')
->setValue('3 months')
->displayIf('HaveProbationaryPeriod')->isEqualTo('Yes')->end(),
HeaderField::create('Section_Remuneration', _t('ContractForm.Section_Remuneration')),
OptionsetField::create('ForHourlyOrSalaried', 'Is this contract for hourly paid or salaried employees?', array(
'Hourly' => 'Hourly',
'Salaried' => 'Salaried'
))->setValue('Salaried'),
TextField::create('HourlyAmount')
->setRightTitle('e.g. 8.00 - not £8.00')
->validateIf('ForHourlyOrSalaried')->isEqualTo('Hourly')->end()
->displayIf('ForHourlyOrSalaried')->isEqualTo('Hourly')->end(),
TextField::create('SalaryAmount')
->setRightTitle('e.g. 25,000 - not £25,000')
->validateIf('ForHourlyOrSalaried')->isEqualTo('Salaried')->end()
->displayIf('ForHourlyOrSalaried')->isEqualTo('Salaried')->end(),
DropdownField::create('FrequencyOfPay', 'What is their frequency of pay?', array(
'Weekly' => _t('ContractForm.Weekly'),
'Fortnightly' => _t('ContractForm.Fortnightly'),
'Four weekly' => _t('ContractForm.FourWeekly'),
'Monthly' => _t('ContractForm.Monthly')
)),
GroupedDropdownField::create('DateOfPayment_Week', 'When are they paid?', array(
'Days' => array(
'Every Monday' => 'Every Monday',
'Every Tuesday' => 'Every Tuesday',
'Every Wednesday' => 'Every Wednesday',
'Every Thursday' => 'Every Thursday',
'Every Friday' => 'Every Friday'
)
))->displayIf('FrequencyOfPay')->isEqualTo('Weekly')->end(),
GroupedDropdownField::create('DateOfPayment_Fortnight', 'When are they paid?', array(
'Days' => array(
'Every second Monday' => 'Every second Monday',
'Every second Tuesday' => 'Every second Tuesday',
'Every second Wednesday' => 'Every second Wednesday',
'Every second Thursday' => 'Every second Thursday',
'Every second Friday' => 'Every second Friday'
)
))->displayIf("FrequencyOfPay")->isEqualTo("Fortnightly")->end(),
GroupedDropdownField::create('DateOfPayment_Fourweek', 'When are they paid?', array(
'Days' => array(
'Every fourth Monday' => 'Every fourth Monday',
'Every fourth Tuesday' => 'Every fourth Tuesday',
'Every fourth Wednesday' => 'Every fourth Wednesday',
'Every fourth Thursday' => 'Every fourth Thursday',
'Every fourth Friday' => 'Every fourth Friday'
)
))->displayIf("FrequencyOfPay")->isEqualTo("Four weekly")->end(),
GroupedDropdownField::create('DateOfPayment_Month', 'When are they paid?', array(
'On the...' => array(
'Last day of the month' => 'Last day of the month',
'Last working day of the month' => 'Last working day of the month',
'Last Friday of the month' => 'Last Friday of the month',
'Second last working day of the month' => 'Second last working day of the month',
'Pay dates will be advised in advance' => 'Pay dates will be advised in advance'
),
'Dates' => $date_range
))->displayIf("FrequencyOfPay")->isEqualTo("Monthly")->end(),
DropdownField::create('MethodOfPay', 'How are they paid?', array('BACS' => 'BACS', 'Cheque' => 'Cheque', 'Cash' => 'Cash', 'Credit Transfer' => 'Credit Transfer')),
DropdownField::create('WageRateReviewInterval', 'When do you review wage rates?', array(
'Annually' => 'Annually (Do not wish to specify date)',
'AnnuallyWithDate' => 'Annually (please specify date)',
'Quarterly' => 'Quarterly',
'No review date' => 'No review date'
)),
FieldGroup::create(array(
DropdownField::create('WageRateReviewIntervalDay', 'Day', array_combine(range(1, 31), range(1, 31))),
DropdownField::create('WageRateReviewIntervalMonth', 'Month', $months)
))->displayIf("WageRateReviewInterval")->isEqualTo("AnnuallyWithDate")->end(),
OptionsetField::create('EmployeesClaimExpenses', null, $yes_no),
HeaderField::create('Section_HoursOfWork', _t('ContractForm.Section_HoursOfWork')),
OptionsetField::create('SpecifyTotalHoursOrHoursPerDay', 'Specify working hours per day or per week?', array(
'Daily' => 'Daily',
'Weekly' => 'Weekly'
))->setValue('Daily')
->setRightTitle('Select \'weekly\' if the employee works flexitime'),
FieldGroup::create(array(
CheckboxField::create('WorkingOnMon', 'Monday')->setValue(true),
TimePickerField::create('MonWorkStartTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("0900")
->setAttribute('readonly', true),
TimePickerField::create('MonWorkEndTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("1700")
->setAttribute('readonly', true)
))->setColumnCount(3)
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end(),
FieldGroup::create(array(
CheckboxField::create('WorkingOnTue', 'Tuesday')->setValue(true),
TimePickerField::create('TueWorkStartTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("0900")
->setAttribute('readonly', true),
TimePickerField::create('TueWorkEndTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("1700")
->setAttribute('readonly', true)
))->setColumnCount(3)
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end(),
FieldGroup::create(array(
CheckboxField::create('WorkingOnWed', 'Wednesday')->setValue(true),
TimePickerField::create('WedWorkStartTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("0900")
->setAttribute('readonly', true),
TimePickerField::create('WedWorkEndTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setAttribute('readonly', true)
->setValue("1700")
))->setColumnCount(3)
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end(),
FieldGroup::create(array(
CheckboxField::create('WorkingOnThu', 'Thursday')->setValue(true),
TimePickerField::create('ThuWorkStartTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("0900")
->setAttribute('readonly', true),
TimePickerField::create('ThuWorkEndTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("1700")
->setAttribute('readonly', true)
))->setColumnCount(3)
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end(),
FieldGroup::create(array(
CheckboxField::create('WorkingOnFri', 'Friday')->setValue(true),
TimePickerField::create('FriWorkStartTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("0900")
->setAttribute('readonly', true),
TimePickerField::create('FriWorkEndTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("1700")
->setAttribute('readonly', true)
))->setColumnCount(3)
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end(),
FieldGroup::create(array(
CheckboxField::create('WorkingOnSat', 'Saturday'),
TimePickerField::create('SatWorkStartTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("0900")
->setAttribute('readonly', true),
TimePickerField::create('SatWorkEndTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("1700")
->setAttribute('readonly', true)
))->setColumnCount(3)
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end(),
FieldGroup::create(array(
CheckboxField::create('WorkingOnSun', 'Sunday'),
TimePickerField::create('SunWorkStartTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("0900")
->setAttribute('readonly', true),
TimePickerField::create('SunWorkEndTime', '')
->setConfig('timeformat', 'HH:mm')
->setConfig('datavalueformat', 'HH:mm')
->setValue("1700")
->setAttribute('readonly', true)
))->setColumnCount(3)
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end(),
OptionsetField::create('EligibleForLunchBreak', 'Is the employee eligible for a lunch break?', $yes_no)
->setRightTitle('Select \'Yes\' if they work more than 6 hours in a shift, or if they should be entitled to it as part of their contract)'),
DropdownField::create('LunchBreakLength', 'How long do employees get for lunch?', array(
'1 hour' => '1 hour',
'45 minutes' => '45 minutes',
'30 minutes' => '30 minutes',
'15 minutes' => '15 minutes'
))->displayIf('EligibleForLunchBreak')->isEqualTo('Yes')->end(),
OptionsetField::create('IsLunchBreakPaid', 'Is lunch break paid?', $yes_no)
->displayIf('EligibleForLunchBreak')->isEqualTo('Yes')->end(),
OptionsetField::create('OtherPaidBreaks', 'Are there any other paid breaks?', $yes_no),
FieldGroup::create(array(
DropdownField::create('NumberOfOtherPaidBreaks', '', array_combine(range(1, 10), range(1, 10)))->setRightTitle('breaks'),
DropdownField::create('OtherPaidBreaksLength', '', array_combine(range(5, 30, 5), range(5, 30, 5)))->setRightTitle('minutes each')
))->displayIf("OtherPaidBreaks")->isEqualTo("Yes")->end(),
OptionsetField::create('OtherUnpaidBreaks', 'Are there any other unpaid breaks?', $yes_no),
FieldGroup::create(array(
DropdownField::create('NumberOfOtherUnpaidBreaks', '', array_combine(range(1, 10), range(1, 10)))->setRightTitle('breaks'),
DropdownField::create('OtherUnpaidBreaksLength', '', array_combine(range(5, 30, 5), range(5, 30, 5)))->setRightTitle('minutes each')
))->displayIf("OtherUnpaidBreaks")->isEqualTo("Yes")->end(),
TextField::create('ContractedHoursPerWeek_DailyNote', 'Total contracted hours per week')
->performReadonlyTransformation()
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Daily')->end()
->addExtraClass('highlighted-field'),
HiddenField::create('ContractedHoursPerWeek_Daily'),
TextField::create('ContractedHoursPerWeek_Weekly', 'Total contracted hours per week')
->displayIf('SpecifyTotalHoursOrHoursPerDay')->isEqualTo('Weekly')->end(),
OptionsetField::create('ExpectedToWorkShifts', 'Will the employee by expected to work shifts?', $yes_no),
OptionsetField::create('ExpectedToWorkNightShifts', 'Will the employee by expected to work night shifts?', $yes_no)
->displayIf('ExpectedToWorkShifts')->isEqualTo('Yes')->end(),
DropdownField::create('WorkShiftNotification', 'How will the employee be notified of their shifts?', array(
'detailed on a weekly rota' => 'detailed on a weekly rota',
'advised by your line manager' => 'advised by their line manager',
'advised on a noticeboard' => 'advised on a noticeboard'
))->displayIf('ExpectedToWorkShifts')->isEqualTo('Yes')->orIf('ExpectedToWorkNightShifts')->isEqualTo('Yes')->end(),
HeaderField::create('Section_WorkingTimeDirective', _t('ContractForm.Section_WorkingTimeDirective')),
OptionsetField::create('RequiredToWorkMoreThan48Hours', 'Are employees ever required to work more than 48 hours in a week?', $yes_no),
FieldGroup::create(
HeaderField::create('WorkingTimeOptOutNote', '<em>As you have selected yes, you must offer a working time directive opt out form to the employee which will be provided at the end of the process</em>', 4)
)
->displayIf('RequiredToWorkMoreThan48Hours')->isEqualTo('Yes')->end(),
HeaderField::create('Section_AdditionalHours', _t('ContractForm.Section_AdditionalHours')),
OptionsetField::create('RequiredToWorkOvertime', 'Are employees required to work additional hours or overtime?', $yes_no),
OptionsetField::create('IsOvertimePaid', 'Is overtime paid?', $yes_no),
FieldGroup::create(array(
HeaderField::create('OvertimePay_Day', 'Day', 6),
HeaderField::create('OvertimePay_Time', 'Time', 6),
HeaderField::create('OvertimePay_Rate', 'Rate', 6),
DropdownField::create('OvertimeRate_1_Day', '', $overtimepay_days),
DropdownField::create('OvertimeRate_1_Time', '', $overtimepay_times),
DropdownField::create('OvertimeRate_1_Rate', '', $overtimepay_rates),
DropdownField::create('OvertimeRate_2_Day', '', $overtimepay_days)->setEmptyString(''),
DropdownField::create('OvertimeRate_2_Time', '', $overtimepay_times)->setEmptyString(''),
DropdownField::create('OvertimeRate_2_Rate', '', $overtimepay_rates)->setEmptyString(''),
DropdownField::create('OvertimeRate_3_Day', '', $overtimepay_days)->setEmptyString(''),
DropdownField::create('OvertimeRate_3_Time', '', $overtimepay_times)->setEmptyString(''),
DropdownField::create('OvertimeRate_3_Rate', '', $overtimepay_rates)->setEmptyString(''),
DropdownField::create('OvertimeRate_4_Day', '', $overtimepay_days)->setEmptyString(''),
DropdownField::create('OvertimeRate_4_Time', '', $overtimepay_times)->setEmptyString(''),
DropdownField::create('OvertimeRate_4_Rate', '', $overtimepay_rates)->setEmptyString('')
))->setName('WhatRateOvertimePaid')
->setColumnCount(3)->displayIf('IsOvertimePaid')->isEqualTo('Yes')->end(),
OptionsetField::create('TimeOffGivenForOvertime', null, $yes_no),
DropdownField::create('TimeOffGivenForOvertimeLimit', null, array(
'within 1 week' => 'within 1 week',
'within 1 month' => 'within 1 month',
'at mutual convenience' => 'at mutual convenience'
))->displayIf('TimeOffGivenForOvertime')->isEqualTo('Yes')->end(),
HeaderField::create('Section_PlaceOfWork', _t('ContractForm.Section_PlaceOfWork')),
AddressField::create('PlaceOfWork'),
OptionsetField::create('RequiredToTravel', 'Will the employee be required to travel as part of their duties?', $yes_no),
OptionsetField::create('RequiredToTravelInternational', 'Outside the UK?', $yes_no)
->displayIf('RequiredToTravel')->isEqualTo('Yes')->end()
);
$this->extend('updateFields', $fields);
//loop through all top-level fields, check if any i18n values have been defined and set them
$i = 0;
foreach ($fields as &$field) {
if($name = _t('ContractForm.'.$field->Name)) {
$field->setTitle($name);
}
if($description = _t('ContractForm.'.$field->Name.'_help')) {
$field->setDescription($description);
}
if($constraints = $this->getValidator()->getConstraints($field->name)) {
if(in_array('Constraint_required', $constraints)) {
$field->addExtraClass('required');
}
}
}
self::$fields = $fields;
}
Requirements::javascript('framework/javascript/DateField.js');
Requirements::javascript($this->ThemeDir()."/js/hours-of-work.js");
Requirements::javascript($this->ThemeDir()."/js/startdate.js");
return self::$fields;
}
function getValidator() {
$validator = ZenValidator::create();
$validator->addRequiredFields(array(
'EmployeeName',
'EmployeeJobTitle',
'EmploymentStartDate',
'PlaceOfWork',
'HourlyAmount',
'SalaryAmount'
));
$this->extend('updateValidator', $validator);
return $validator;
}
function onAfterWrite(){
if(isset($_POST['ContractName'])){
$this->Session()->Title = $_POST['ContractName'];
$this->Session()->write();
}
parent::onAfterWrite();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment