static function CalcDifferences($pay_stub_id1, $pay_stub_id2, $ps_amendment_date = NULL) { //PayStub 1 is new. //PayStub 2 is old. if ($pay_stub_id1 == '') { return FALSE; } if ($pay_stub_id2 == '') { return FALSE; } if ($pay_stub_id1 == $pay_stub_id2) { return FALSE; } Debug::Text('Calculating the differences between Pay Stub: ' . $pay_stub_id1 . ' And: ' . $pay_stub_id2, __FILE__, __LINE__, __METHOD__, 10); $pslf = new PayStubListFactory(); $pslf->StartTransaction(); $pslf->getById($pay_stub_id1); if ($pslf->getRecordCount() > 0) { $pay_stub1_obj = $pslf->getCurrent(); } else { Debug::Text('Pay Stub1 does not exist: ', __FILE__, __LINE__, __METHOD__, 10); return FALSE; } $pslf->getById($pay_stub_id2); if ($pslf->getRecordCount() > 0) { $pay_stub2_obj = $pslf->getCurrent(); } else { Debug::Text('Pay Stub2 does not exist: ', __FILE__, __LINE__, __METHOD__, 10); return FALSE; } if ($pay_stub1_obj->getUser() != $pay_stub2_obj->getUser()) { Debug::Text('Pay Stubs are from different users!', __FILE__, __LINE__, __METHOD__, 10); return FALSE; } if ($ps_amendment_date == NULL or $ps_amendment_date == '') { Debug::Text('PS Amendment Date not set, trying to figure it out!', __FILE__, __LINE__, __METHOD__, 10); //Take a guess at the end of the newest open pay period. $ppslf = new PayPeriodScheduleListFactory(); $ppslf->getByUserId($pay_stub2_obj->getUser()); if ($ppslf->getRecordCount() > 0) { Debug::Text('Found Pay Period Schedule', __FILE__, __LINE__, __METHOD__, 10); $pplf = new PayPeriodListFactory(); $pplf->getByPayPeriodScheduleIdAndTransactionDate($ppslf->getCurrent()->getId(), time()); if ($pplf->getRecordCount() > 0) { Debug::Text('Using Pay Period End Date.', __FILE__, __LINE__, __METHOD__, 10); $ps_amendment_date = TTDate::getBeginDayEpoch($pplf->getCurrent()->getEndDate()); } } else { Debug::Text('Using Today.', __FILE__, __LINE__, __METHOD__, 10); $ps_amendment_date = time(); } } Debug::Text('Using Date: ' . TTDate::getDate('DATE+TIME', $ps_amendment_date), __FILE__, __LINE__, __METHOD__, 10); //Only do Earnings for now. //Get all earnings, EE/ER deduction PS entries. $pay_stub1_entry_ids = NULL; $pay_stub1_entries = new PayStubEntryListFactory(); $pay_stub1_entries->getByPayStubIdAndType($pay_stub1_obj->getId(), array(10, 20, 30)); if ($pay_stub1_entries->getRecordCount() > 0) { Debug::Text('Pay Stub1 Entries DO exist: ', __FILE__, __LINE__, __METHOD__, 10); foreach ($pay_stub1_entries as $pay_stub1_entry_obj) { $pay_stub1_entry_ids[] = $pay_stub1_entry_obj->getPayStubEntryNameId(); } } else { Debug::Text('Pay Stub1 Entries does not exist: ', __FILE__, __LINE__, __METHOD__, 10); return FALSE; } Debug::Arr($pay_stub1_entry_ids, 'Pay Stub1 Entry IDs: ', __FILE__, __LINE__, __METHOD__, 10); //var_dump($pay_stub1_entry_ids); $pay_stub2_entry_ids = NULL; $pay_stub2_entries = new PayStubEntryListFactory(); $pay_stub2_entries->getByPayStubIdAndType($pay_stub2_obj->getId(), array(10, 20, 30)); if ($pay_stub2_entries->getRecordCount() > 0) { Debug::Text('Pay Stub2 Entries DO exist: ', __FILE__, __LINE__, __METHOD__, 10); foreach ($pay_stub2_entries as $pay_stub2_entry_obj) { $pay_stub2_entry_ids[] = $pay_stub2_entry_obj->getPayStubEntryNameId(); } } else { Debug::Text('Pay Stub2 Entries does not exist: ', __FILE__, __LINE__, __METHOD__, 10); return FALSE; } Debug::Arr($pay_stub1_entry_ids, 'Pay Stub2 Entry IDs: ', __FILE__, __LINE__, __METHOD__, 10); $pay_stub_entry_ids = array_unique(array_merge($pay_stub1_entry_ids, $pay_stub2_entry_ids)); Debug::Arr($pay_stub_entry_ids, 'Pay Stub Entry Differences: ', __FILE__, __LINE__, __METHOD__, 10); //var_dump($pay_stub_entry_ids); $pself = new PayStubEntryListFactory(); if (count($pay_stub_entry_ids) > 0) { foreach ($pay_stub_entry_ids as $pay_stub_entry_id) { Debug::Text('Entry ID: ' . $pay_stub_entry_id, __FILE__, __LINE__, __METHOD__, 10); $pay_stub1_entry_arr = $pself->getSumByPayStubIdAndEntryNameIdAndNotPSAmendment($pay_stub1_obj->getId(), $pay_stub_entry_id); $pay_stub2_entry_arr = $pself->getSumByPayStubIdAndEntryNameIdAndNotPSAmendment($pay_stub2_obj->getId(), $pay_stub_entry_id); Debug::Text('Pay Stub1 Amount: ' . $pay_stub1_entry_arr['amount'] . ' Pay Stub2 Amount: ' . $pay_stub2_entry_arr['amount'], __FILE__, __LINE__, __METHOD__, 10); if ($pay_stub1_entry_arr['amount'] != $pay_stub2_entry_arr['amount']) { $amount_diff = bcsub($pay_stub1_entry_arr['amount'], $pay_stub2_entry_arr['amount'], 2); $units_diff = abs(bcsub($pay_stub1_entry_arr['units'], $pay_stub2_entry_arr['units'], 2)); Debug::Text('FOUND DIFFERENCE of: Amount: ' . $amount_diff . ' Units: ' . $units_diff, __FILE__, __LINE__, __METHOD__, 10); //Generate PS Amendment. $psaf = new PayStubAmendmentFactory(); $psaf->setUser($pay_stub1_obj->getUser()); $psaf->setStatus('ACTIVE'); $psaf->setType(10); $psaf->setPayStubEntryNameId($pay_stub_entry_id); if ($units_diff > 0) { //Re-calculate amount when units are involved, due to rounding issues. $unit_rate = Misc::MoneyFormat(bcdiv($amount_diff, $units_diff)); $amount_diff = Misc::MoneyFormat(bcmul($unit_rate, $units_diff)); Debug::Text('bFOUND DIFFERENCE of: Amount: ' . $amount_diff . ' Units: ' . $units_diff . ' Unit Rate: ' . $unit_rate, __FILE__, __LINE__, __METHOD__, 10); $psaf->setRate($unit_rate); $psaf->setUnits($units_diff); $psaf->setAmount($amount_diff); } else { $psaf->setAmount($amount_diff); } $psaf->setDescription('Adjustment from Pay Period Ending: ' . TTDate::getDate('DATE', $pay_stub2_obj->getEndDate())); $psaf->setEffectiveDate(TTDate::getBeginDayEpoch($ps_amendment_date)); if ($psaf->isValid()) { $psaf->Save(); } unset($amount_diff, $units_diff, $unit_rate); } else { Debug::Text('No DIFFERENCE!', __FILE__, __LINE__, __METHOD__, 10); } } } $pslf->CommitTransaction(); return TRUE; }