function ComputeWagesAndDelays($PartObj, $PayAmount, $StartDate, $PayDate) { $MaxWage = max($PartObj->CustomerWage * 1, $PartObj->FundWage); if ($PartObj->PayInterval > 0) { $YearMonths = $PartObj->IntervalType == "DAY" ? floor(365 / $PartObj->PayInterval) : 12 / $PartObj->PayInterval; } else { $YearMonths = 12; } $TotalWage = round(ComputeWage($PayAmount, $MaxWage / 100, $PartObj->InstallmentCount, $PartObj->IntervalType, $PartObj->PayInterval)); $CustomerFactor = $MaxWage == 0 ? 0 : $PartObj->CustomerWage / $MaxWage; $FundFactor = $MaxWage == 0 ? 0 : $PartObj->FundWage / $MaxWage; $AgentFactor = $MaxWage == 0 ? 0 : ($PartObj->CustomerWage - $PartObj->FundWage) / $MaxWage; ///........................................................... if ($PartObj->MaxFundWage * 1 > 0) { if ($PartObj->WageReturn == "INSTALLMENT") { $FundYears = YearWageCompute($PartObj, $PartObj->MaxFundWage * 1, $YearMonths); } else { $FundYears = array(); } } else { $years = YearWageCompute($PartObj, $TotalWage * 1, $YearMonths); $FundYears = array(); foreach ($years as $year => $amount) { $FundYears[$year] = round($FundFactor * $amount); } } $AgentYears = array(); foreach ($years as $year => $amount) { $AgentYears[$year] = round($amount - $FundYears[$year]); } //............................................................. $endDelayDate = DateModules::AddToGDate($PayDate, $PartObj->DelayDays * 1, $PartObj->DelayMonths * 1); $DelayDuration = DateModules::GDateMinusGDate($endDelayDate, $PayDate) + 1; if ($StartDate == $PayDate) { if ($PartObj->DelayDays * 1 > 0) { $CustomerDelay = round($PayAmount * $PartObj->DelayPercent * $DelayDuration / 36500); $FundDelay = round($PayAmount * $PartObj->FundWage * $DelayDuration / 36500); $AgentDelay = round($PayAmount * ($PartObj->DelayPercent - $PartObj->FundWage) * $DelayDuration / 36500); } else { $CustomerDelay = round($PayAmount * $PartObj->DelayPercent * $PartObj->DelayMonths / 1200); $FundDelay = round($PayAmount * $PartObj->FundWage * $PartObj->DelayMonths / 1200); $AgentDelay = round($PayAmount * ($PartObj->DelayPercent - $PartObj->FundWage) * $PartObj->DelayMonths / 1200); } } else { $endDelayDate = DateModules::AddToGDate($StartDate, $PartObj->DelayDays * 1, $PartObj->DelayMonths * 1); $DelayDuration = DateModules::GDateMinusGDate($endDelayDate, $PayDate) + 1; $CustomerDelay = round($PayAmount * $PartObj->DelayPercent * $DelayDuration / 36500); $FundDelay = round($PayAmount * $PartObj->FundWage * $DelayDuration / 36500); $AgentDelay = round($PayAmount * ($PartObj->DelayPercent - $PartObj->FundWage) * $DelayDuration / 36500); } $CustomerYearDelays = SplitYears($PayDate, $endDelayDate, $CustomerDelay); //............................................................. return array("TotalFundWage" => round($TotalWage * $FundFactor), "TotalAgentWage" => round($TotalWage * $AgentFactor), "TotalCustomerWage" => round($TotalWage * $CustomerFactor), "FundWageYears" => $FundYears, "AgentWageYears" => $AgentYears, "TotalCustomerDelay" => $CustomerDelay, "TotalFundDelay" => $FundDelay, "TotalAgentDelay" => $AgentDelay, "CustomerYearDelays" => $CustomerYearDelays); }
/** افزايش سنواتي */ private function compute_salary_item2_02($writ_rec) { //param1 : افزايش سنوات سال قبل //param2 : ضريب افزايش سنواتي //param3 : درصد بسيج //param4 : مبلغ افزايش سنواتي بدون در نظر گرفتن گروه تشويقي و درصد بسيج //_____________________________________ // چک کن که حکم قبلي وجود دارد يا خير $this_writ_year = substr(DateModules::Miladi_to_Shamsi($writ_rec['execute_date']), 0, 4); $one_year_ago = $this_writ_year - 1; $one_year_ago_first_day = $one_year_ago . "/01/01"; $one_year_ago_last_day = $one_year_ago . "/12/30"; $one_year_ago_last_day_writ = $one_year_ago . "/12/29"; $Gone_year_ago_first_day = DateModules::Shamsi_to_Miladi($one_year_ago_first_day); $Gone_year_ago_last_day = DateModules::Shamsi_to_Miladi($one_year_ago_last_day_writ); $prior_writ = manage_writ::get_last_writ_by_date($writ_rec['staff_id'], DateModules::AddToGDate($writ_rec['execute_date'], -1, 0, 0)); // در صورتی که حکم قبلی وجود داشته باشد که در همان سال باشد افزایش سنواتی آن تغییر نمی کند . if (!empty($prior_writ->writ_id)) { if (!DateModules::similar_year($writ_rec['execute_date'], $prior_writ->execute_date)) { $obj = new manage_writ_item($prior_writ->writ_id, $prior_writ->writ_ver, $prior_writ->staff_id, ($prior_writ->person_type == 5 ) ? SIT5_STAFF_ANNUAL_INC : SIT_STAFF_ANNUAL_INC); if (!empty($obj->writ_id)) { $this->param1 = $obj->param1; $this->param2 = $obj->param2; $this->param3 = $obj->param3; if (!$obj->param4) $this->param4 = $obj->value; return $obj->value; } } } //آخرين حکم قبل از سال شخص را استخراج مي کند. $prior_writ = manage_writ::get_last_writ_by_date($writ_rec['staff_id'], $Gone_year_ago_last_day); $prior_writ_year = substr(DateModules::Miladi_to_Shamsi($prior_writ->execute_date), 0, 4); //____________________________________________________ //اولين حكم- محاسبه افزايش سنواتي در بدو استخدام if (empty($prior_writ->writ_id)) { //در بدو استخدام: جانبازي + آزادگي + سربازي + جبهه $this->param1 = 0; $this->param2 = 0; $this->param3 = 0; $this->value = 0; if ($writ_rec['military_duration'] > 30) $writ_rec['military_duration'] = 30; //سربازي : هر ماه 0/25% سالي 3% ، حداكثر 2/5 سال $this->param2 += $writ_rec['military_duration'] * 0.0025; if ($writ_rec['execute_date'] < DateModules::Shamsi_to_Miladi('1384-11-12')) { $temp = manage_person_devotion::GetAllDevotions("d.PersonID=" . $writ_rec["personID"]); for ($i = 0; $i < count($temp); $i++) { switch ($temp[$i]['devotion_type']) { case DEVOTION_TYPE_FIGHTER://رزمندگي //جبهه : ماهي 5/0% سالي 6% (سوابق تا قبل از 29/5/69 $this->param2 += ($temp[$i]['amount'] / 30) * 0.005; break; case DEVOTION_TYPE_PRISONER://آزادگي //- آزادگي : ماهي 0.5% سالي 6% $this->param2 += ($temp[$i]['amount'] / 30) * 0.005; break; case DEVOTION_TYPE_WOUNDED://جانبازي //- جانبازي : هر 1% جانبازي 6/0% $this->param2 += $temp[$i]['amount'] * 0.006; break; } } } //____________________________________________ // حقوق مبنا $base_salary = manage_writ::get_base_salary($writ_rec["writ_id"], $writ_rec["writ_ver"], $writ_rec["staff_id"], $writ_rec["person_type"]); if (in_array($writ_rec['person_type'], array(1, 2, 3))) { // حقوق مبنا بدون گروه تشویقی $nh_base_salary = manage_writ::get_base_salary($writ_rec["writ_id"], $writ_rec["writ_ver"], $writ_rec["staff_id"], $writ_rec["person_type"], false); } $value = $base_salary * $this->param2; if (in_array($writ_rec['person_type'], array(1, 2, 3))) { $this->param4 = $nh_base_salary * $this->param2; } return $value; } //احكام طول دوره خدمت else { //افزايش سنواتي سال قبل $obj = new manage_writ_item($prior_writ->writ_id, $prior_writ->writ_ver, $prior_writ->staff_id, ($prior_writ->person_type == 5 ) ? SIT5_STAFF_ANNUAL_INC : SIT_STAFF_ANNUAL_INC); $this->param1 = $obj->value; $this->param2 = $obj->param2; $this->param3 = $obj->param3; $this->param4 = $obj->param4; $this->param5 = $obj->param5; $this->param6 = $obj->param6; $this->param7 = $obj->param7; if ($writ_rec['emp_mode'] != EMP_MODE_ENGAGEMENT && in_array($writ_rec['person_type'], array(1, 2, 3))) { //ضريب افزايش سنواتي سال قبل $this->param2 = manage_writ_item::get_annual_coef($prior_writ_year, $writ_rec['staff_id']); } else { $this->param2 = 0.05; } if ($writ_rec['execute_date'] < DateModules::Shamsi_to_Miladi('1384/11/12')) { //درصد بسيج سال قبل $this->param3 = manage_writ_item::get_mobilization_coef($prior_writ_year, $writ_rec['staff_id']); } else if (manage_writ_item::get_writSalaryItem_value($writ_rec["writ_id"], $writ_rec["writ_ver"], $writ_rec["staff_id"], 287) > 0) $this->param3 = 0; else $this->param3 = manage_writ_item::get_mobilization_coef($prior_writ_year, $writ_rec['staff_id']); $base_salary = manage_writ::get_base_salary($prior_writ->writ_id, $prior_writ->writ_ver, $prior_writ->staff_id, $prior_writ->person_type); if (in_array($writ_rec['person_type'], array(1, 2, 3))) { $nh_base_salary = manage_writ::get_base_salary($writ_rec["writ_id"], $writ_rec["writ_ver"], $writ_rec["staff_id"], $writ_rec["person_type"], false); } if (!($base_salary > 0)) return false; $duplicate_duration = 0; if (!empty($writ_rec['last_retired_pay'])) { if ($writ_rec['last_retired_pay'] >= $Gone_year_ago_first_day && $writ_rec['last_retired_pay'] < $Gone_year_ago_last_day) { $jlast_retired_pay = DateModules::Miladi_to_Shamsi($writ_rec['last_retired_pay']); $duplicate_duration = ceil(DateModules::getDateDiff($one_year_ago_last_day, $jlast_retired_pay)); } else if ($writ_rec['last_retired_pay'] <= $Gone_year_ago_first_day) { $duplicate_duration = 360; } } $year_work_days = manage_staff::compute_year_work_days($writ_rec['staff_id'], $Gone_year_ago_first_day, $Gone_year_ago_last_day); if ($year_work_days > 360) { $year_work_days = 360; } //نسبت کارکرد در سال قبل. $annual_inc_duration = ($year_work_days + $duplicate_duration) / 360; //فرمول محاسبه براي سال دوم به بعد. $value = (($base_salary + $this->param1) * $this->param2 * $annual_inc_duration) + ($this->param3 * $base_salary ) + $this->param1; if (in_array($writ_rec['person_type'], array(1, 2, 3))) { $this->param4 = (($nh_base_salary + $this->param1) * $this->param2 * $annual_inc_duration) + $this->param1; } } return $value; }
function SavePersonShift() { $obj = new ATN_PersonShifts(); PdoDataAccess::FillObjectByJsonData($obj, $_POST["record"]); //............. cut shifts ..................... $FromDate = DateModules::shamsi_to_miladi($obj->FromDate, "-"); $ToDate = DateModules::shamsi_to_miladi($obj->ToDate, "-"); $dt = PdoDataAccess::runquery("select * from ATN_PersonShifts \r\n\t\twhere PersonID=? AND FromDate>? AND FromDate<?", array($obj->PersonID, $FromDate, $ToDate)); if (count($dt) > 0) { $obj2 = new ATN_PersonShifts(); $obj2->RowID = $dt[0]["RowID"]; $obj2->FromDate = DateModules::AddToGDate($ToDate, 1); $obj2->Edit(); } //------------------- $dt = PdoDataAccess::runquery("select * from ATN_PersonShifts \r\n\t\twhere PersonID=? AND FromDate<? AND ToDate>?", array($obj->PersonID, $FromDate, $ToDate)); if (count($dt) > 0) { $obj2 = new ATN_PersonShifts(); $obj2->RowID = $dt[0]["RowID"]; $obj2->ToDate = DateModules::AddToGDate($FromDate, -1); $obj2->Edit(); $obj2 = new ATN_PersonShifts(); $obj2->ShiftID = $dt[0]["ShiftID"]; $obj2->PersonID = $obj->PersonID; $obj2->FromDate = DateModules::AddToGDate($ToDate, 1); $obj2->ToDate = $dt[0]["ToDate"]; $obj2->Add(); } //------------------- $dt = PdoDataAccess::runquery("select * from ATN_PersonShifts \r\n\t\twhere PersonID=? AND ToDate>? AND ToDate<?", array($obj->PersonID, $FromDate, $ToDate)); if (count($dt) > 0) { $obj2 = new ATN_PersonShifts(); $obj2->RowID = $dt[0]["RowID"]; $obj2->ToDate = DateModules::AddToGDate($FromDate, -1); $obj2->Edit(); } //............................................... if ($obj->RowID == "") { $result = $obj->Add(); } else { $result = $obj->Edit(); } //print_r(ExceptionHandler::PopAllExceptions()); echo Response::createObjectiveResponse($result, ExceptionHandler::GetExceptionsToString()); die; }
/** * تنها با استفاده از اين تابع مي توان حکم جديد صادر کرد * @return boolean : قرار مي دهد ExceptionHandler اگر صدور حکم با موفقيت انجام نشود توضيح خطا را در */ private function IssueWritAction($indiv = NULL) { $temp = parent::runquery("select last_writ_id,last_writ_ver,staff_id,PersonID,person_type from HRM_staff\n \t\t\t\t\t\t\t\t\t\t\twhere staff_id=" . $this->staff_id . " and person_type =" . $this->person_type); if (count($temp) == 0) { parent::PushException(ERROR_STAFF_ID_NOT_FOUND); return false; } $staff_rec = $temp[0]; $PersonID = $staff_rec['PersonID']; //___________________________________________________________ //در صورتي که روال ناتمام اصلاح وجود دارد if ($this->correct_is_not_completed($this->staff_id)) { parent::PushException(ERROR_CORRECT_IS_NOT_COMPLETED); return false; } //___________________________________________________________ //در صورتي که حکم خودکار است کنترلهاي زير اعمال شود $is_auto = $this->is_auto_writ($this->execute_date, $this->person_type); if ($is_auto) { //___________________________________________________________ $lastWritObj = manage_writ::GetLastWrit($this->staff_id); $writ_subtype_obj = new manage_writ_subType($this->person_type, $this->writ_type_id, $this->writ_subtype_id); //......................................................................................... if (($this->person_type == 5 || $writ_subtype_obj->emp_state == 2) && $this->contract_start_date != NULL && substr(DateModules::miladi_to_shamsi($this->execute_date), 0, 4) != substr(DateModules::miladi_to_shamsi($this->contract_start_date), 0, 4)) { parent::PushException(ER_CONTRACT_DATE); return false; } //......................................................................................... //..... در صورتی که فرد بازنشسته باشد ولی آزاده باشد امکان صدور حکم برای فرد میسر می باشد ................ //.... جانباز نیز بهمین صورت................................................................... $Azadegi = manage_person_devotion::get_person_devotions($PersonID, "(2,3)"); //................................................................................................... //کنترل مي کند که در صورتي که شخص بازنشسته شده باشد براي او حکمي صادر نشود. if (!empty($lastWritObj->writ_id) && $lastWritObj->execute_date < $this->execute_date && !$this->history_only) { if (($lastWritObj->emp_mode == EMP_MODE_RETIRE && $Azadegi[0]['amount'] <= 0 || $lastWritObj->emp_mode == EMP_MODE_RE_BUY || $lastWritObj->emp_mode == EMP_MODE_RUSTICATION || $lastWritObj->emp_mode == EMP_MODE_PERMANENT_BREAK || $lastWritObj->emp_mode == EMP_MODE_BREAKAWAY || $lastWritObj->emp_mode == EMP_MODE_CONVEYANCE && $writ_subtype_obj->emp_mode != 16) && $this->corrective_writ_id == PDONULL) { parent::PushException(ERROR_FOR_RETIRED_PERSONS_CAN_NOT_ISSUE_WRIT); return false; } } //___________________________________________________________ } if (!empty($lastWritObj->writ_id)) { parent::FillObjectByObject($lastWritObj, $this); //--------بررسی مجدد تیک مربوط به سرپرست خانواده ---------------------------- $query = "select family_responsible from HRM_writs\n\t\t\t\t\t\twhere staff_id=:stfid and (history_only != " . HISTORY_ONLY . " OR history_only IS NULL)\n\t\t\t\t\t\t\torder by execute_date DESC,writ_id DESC,writ_ver DESC "; $whereParam = array(":stfid" => $this->staff_id); $resResponsible = parent::runquery($query, $whereParam); $this->family_responsible = $resResponsible[0]['family_responsible']; //-------------------------------------------------------------------------- //اگر حكم قبلي در محاسبه حقوق استفاده شده باشد و يا در وضعيت مياني باشد //اين حكم كه اطلاعات حكم قبلي را كپي مي كند نبايد مقدار وضعيت آن را نيز كپي كند $this->state = 1; if (!$this->corrective_writ_id && !$this->corrective_writ_ver || $this->corrective_writ_id == PDONULL && $this->corrective_writ_ver == PDONULL) { $this->correct_completed = 0; } //___________________________________________________________ //در صورتي که حکم يکي از شرايط زير را داشته باشد مي تواند بدون // رعايت توالي تاريخي صادر شود : // خودکار نباشد - حکم اصلاحي و يا در حال اصلاح باشد - حکم فقط ثبت سابقه باشد if ($this->is_new_writ($this->execute_date, $this->person_type) && !$this->corrective && $this->corrective_writ_id == PDONULL && !$this->history_only) { if ($this->execute_date < $lastWritObj->execute_date && $indiv == NULL) { parent::PushException(EXECUTE_DATE_OF_NORMAL_WRIT_CANT_BEFORE_LAST_ONE_ERR); return false; } } //__________________________________________________________ // محاسبه سنوات خدمت فرد $duty_duration = $this->duty_year_month_day($this->staff_id, "", $this->execute_date); $this->onduty_year = !empty($duty_duration['year']) ? $duty_duration['year'] : 0; $this->onduty_month = !empty($duty_duration['month']) ? $duty_duration['month'] : 0; $this->onduty_day = !empty($duty_duration['day']) ? $duty_duration['day'] : 0; /* if( $this->person_type != HR_CONTRACT ){ $related_duty_duration = $this->related_duty_years($this->staff_id, $this->execute_date, $this->post_id, "INSERT"); $this->related_onduty_year = !empty($related_duty_duration['year']) ? $related_duty_duration['year'] : 0; $this->related_onduty_month = !empty($related_duty_duration['month']) ? $related_duty_duration['month'] : 0; $this->related_onduty_day = !empty($related_duty_duration['day']) ? $related_duty_duration['day'] : 0; } */ if ($this->person_type == HR_EMPLOYEE || $this->person_type == HR_CONTRACT) { /*if($lastWritObj->execute_date > '2014-03-20') $this->base = $lastWritObj->base ; else {*/ $Pqry = " select sex , military_duration_day ,military_duration \n\t\t\t\t\t\t\t\t\tfrom HRM_persons p inner join HRM_staff s on p.personid = s.personid \n\t\t\t\t\t\t\t\t\t\t\twhere s.staff_id=" . $this->staff_id; $Pres = parent::runquery($Pqry); if ($Pres[0]["sex"] == 1 && $this->person_type == 2 && ($Pres[0]["military_duration_day"] > 0 || $Pres[0]["military_duration"] > 0)) { $totalDayWrt = DateModules::ymd_to_days($this->onduty_year, $this->onduty_month, $this->onduty_day); $totalDaySar = DateModules::ymd_to_days(0, $Pres[0]["military_duration"], $Pres[0]["military_duration_day"]); $resDay = $totalDayWrt - $totalDaySar; $Vyear = 0; $Vmonth = $Vday = 0; DateModules::day_to_ymd($resDay, $Vyear, $Vmonth, $Vday); $Vyear = $Vyear; } else { /*$totalDayWrt = DateModules::ymd_to_days($this->onduty_year, $this->onduty_month , $this->onduty_day ) ; $diffYear = DateModules::getDateDiff(DateModules::Now(),'2014-03-21'); $remainDay = $totalDayWrt - $diffYear ; DateModules::day_to_ymd($remainDay, $Ryear, $Rmonth, $Rday) ; $Vyear = $Ryear ;*/ $Vyear = $this->onduty_year; } $this->base = $Vyear + 1; /*}*/ } if ($this->person_type == HR_WORKER) { $qry = " select job_id\n\t\t\t\t\tfrom HRM_writs\n\t\t\t\t\twhere execute_date < '" . $this->execute_date . "' and staff_id = " . $this->staff_id . "\n\t\t\t\t\torder by execute_date Desc\n\t\t\t\t\tlimit 1 "; $resJob = PdoDataAccess::runquery($qry); $this->job_id = empty($resJob[0]['job_id']) ? 0 : $resJob[0]['job_id']; } //__________________________________________________________ } else { //___________________________________________________________ $this->onduty_year = 0; $this->onduty_month = 0; $this->onduty_day = 0; /* $this->related_onduty_year = 0; $this->related_onduty_month = 0; $this->related_onduty_day = 0; */ //$this->grade = 1 ; $this->family_responsible = 0; $this->job_id = PDONULL; } //___________________________________________________________ // محاسبه اطلاعات مربوط به آخرين مدرک تحصيلي فرد $education_level_rec = manage_person_education::GetEducationLevelByDate($PersonID, $this->execute_date, $is_auto); if ($education_level_rec === false) { //در صورتي که حکم دستي است بدون مدرک مي توان حکم را ثبت نمود if ($is_auto) { return false; } else { // در صورتي که حکم دستي و براي فرد مدرک تحصيلي مشخص نشده ، تحصيلات بيسواد ثبت مي شود $education_level_rec['max_education_level'] = '101'; } } $this->education_level = $education_level_rec != 101 ? $education_level_rec['max_education_level'] : '101'; $this->sfid = isset($education_level_rec['sfid']) ? $education_level_rec['sfid'] : ""; $this->sbid = isset($education_level_rec['sbid']) ? $education_level_rec['sbid'] : ""; if ($this->person_type == HR_CONTRACT) { //$this->job_id = 1111; } //__________________________________________________________ // محاسبه تعداد فرزندان $where = "PersonID=" . $PersonID . "\n\t\t\t\t AND (dependency = 5 or dependency = 6)\n\t\t\t\t AND birth_date <='" . $this->execute_date . "'"; $no = manage_person_dependency::CountDependency($where); $this->children_count = $no; //__________________________________________________________ // محاسبه افراد تحت تکفل فرد $this->included_children_count = manage_person_dependency::bail_count($PersonID, $this->person_type, $this->execute_date, $this->execute_date); //__________________________________________________________ // تعيين وضعيت تاهل و ايثارگري $person_obj = new manage_person($PersonID); $this->marital_status = $person_obj->marital_status; $this->military_status = $person_obj->military_status; $this->military_type = $person_obj->military_type; //__________________________________________________________ $this->writ_ver = 1; if ($this->corrective == true) { $this->corrective = 1; $this->description = ""; } else { if ($this->corrective_writ_id == PDONULL && $this->corrective_writ_ver == PDONULL) { $this->corrective = 0; $this->corrective_writ_id = PDONULL; $this->corrective_writ_ver = PDONULL; $this->corrective_date = '0000-00-00'; //PDONULL; } } $this->send_letter_date = $this->issue_date; $this->pay_date = $this->execute_date > $this->issue_date ? $this->execute_date : $this->issue_date; $this->ref_letter_no = !empty($lastWritObj->ref_letter_no) ? $lastWritObj->ref_letter_no : PDONULL; //$this->ref_letter_date = (!empty($lastWritObj->ref_letter_date) ) ? $lastWritObj->ref_letter_date : PDONULL ; //__________________________________________________________ //جايگزيني مقادير مربوط به نوع اصلي و فرعي حکم if ($writ_subtype_obj->time_limited != 1) { $this->contract_start_date = '0000-00-00'; PDONULL; $this->contract_end_date = '0000-00-00'; //PDONULL; } if ($writ_subtype_obj->salary_pay_proc > 0) { $this->salary_pay_proc = $writ_subtype_obj->salary_pay_proc; } if ($writ_subtype_obj->annual_effect > 0) { $this->annual_effect = $writ_subtype_obj->annual_effect; } if ($writ_subtype_obj->emp_state > 0) { $this->emp_state = $writ_subtype_obj->emp_state; } if ($writ_subtype_obj->emp_mode > 0) { $this->emp_mode = $writ_subtype_obj->emp_mode; } if ($writ_subtype_obj->worktime_type > 0) { $this->worktime_type = $writ_subtype_obj->worktime_type; } if ($writ_subtype_obj->post_effect == FREE_POST_EFFECT) { $this->post_id = PDONULL; } if (!$writ_subtype_obj->remember_distance) { $writ_subtype_obj->remember_distance = 0; } if ($writ_subtype_obj->remember_distance > 0) { $this->warning_date = DateModules::AddToGDate($this->execute_date, 0, $writ_subtype_obj->remember_distance); } else { $this->warning_date = '0000-00-00'; } //PDONULL; $this->warning_message = $writ_subtype_obj->remember_message; $this->description = $writ_subtype_obj->comments; if ($this->corrective == true || $this->corrective == 1) { $this->description = PDONULL; } $this->writ_signature_post_owner = $this->issue_date > '2014-02-01' ? ' مهدی پور' : WRIT_SIGNATURE_POST_OWNER; $this->writ_signature_post_title = WRIT_SIGNATURE_POST_TITLE; // براي افراد پيماني هر حکم جديد قرارداد جديد مي باشد . // بنابراين تاريخ شروع قرارداد تاريخ اجراي حکم خواهد بود . // تاريخ خاتمه قرارداد پرسنل قراردادي پايان سال خواهد بود . if ($writ_subtype_obj->time_limited == 1 && ($this->emp_state == EMP_STATE_CONTRACTUAL || $this->emp_state == EMP_STATE_SOLDIER_CONTRACTUAL || $this->emp_state == EMP_STATE_ONUS_SOLDIER_CONTRACTUAL)) { $this->contract_start_date = $this->execute_date; $arr = preg_split('/\\//', DateModules::Miladi_to_Shamsi($this->execute_date)); $Jdate = $arr[0] . "/12/29"; $this->contract_end_date = DateModules::Shamsi_to_Miladi($Jdate); } //__________________________________________________________ $this->remembered = PDONULL; $this->dont_transfer = PDONULL; if ($this->history_only && ($this->state == WRIT_PERSONAL || $this->state == PDONULL)) { $this->history_only = 1; } else { $this->history_only = 0; } //__________________________________________________________ $this->job_id = empty($this->job_id) ? PDONULL : $this->job_id; //--------------------- $pObj = new manage_person("", $this->staff_id); if ($pObj->sex == 2 && $pObj->marital_status == 1) { $this->family_responsible = 0; } if ($pObj->sex == 1 && ($this->person_type == 3 || $this->person_type == 5) && $this->marital_status == 2) { $this->family_responsible = 1; } if ($pObj->sex == 2 && $this->person_type == 5 && $this->execute_date > '2014-03-20') { $this->family_responsible = 0; } //............................................. $pdo = parent::getPdoObject(); /*@var $pdo PDO*/ $pdo->beginTransaction(); $this->writ_id = manage_writ::LastID() + 1; if (empty($this->writ_id)) { parent::PushException("خطاي کد آخرين رکورد"); $pdo->rollBack(); return false; } if (!$this->onBeforeInsert()) { $pdo->rollBack(); return false; } $return = parent::insert("HRM_writs", $this); if (!$return) { parent::PushException("ايجاد با شکست مواجه شد"); $pdo->rollBack(); return false; } $this->onAfterInsert(); $pdo->commit(); return true; }
function staff_messages() { $current_date = date('Y-m-d'); $next_wheek_date = DateModules::AddToGDate($current_date, 7); $query = ' DROP TABLE IF EXISTS temp_cw; '; PdoDataAccess::runquery($query); $query = " DROP TABLE IF EXISTS temp_cwsi; "; PdoDataAccess::runquery($query); $query = " DROP TABLE IF EXISTS temp_messages; "; PdoDataAccess::runquery($query); $query = " CREATE TABLE temp_cw TYPE=MyISAM as\n SELECT writ_id,\n writ_ver,\n w.warning_date,\n w.warning_message,\n staff_id , w.ouid\n FROM writs w\n WHERE ( w.remembered != " . REMEMBERED . " OR w.remembered is null ) AND\n w.warning_date < '" . $next_wheek_date . "' AND w.warning_date <> '0000-00-00' "; PdoDataAccess::runquery($query); $query = ' CREATE TABLE temp_cwsi TYPE=MyISAM as SELECT wsi.writ_id, wsi.writ_ver, wsi.salary_item_type_id, wsi.remember_date, wsi.remember_message, w.staff_id , w.ouid FROM writ_salary_items wsi INNER JOIN writs w ON(wsi.writ_id = w.writ_id AND wsi.writ_ver = w.writ_ver AND wsi.staff_id = w.staff_id ) WHERE ( wsi.remembered != ' . REMEMBERED . ' OR w.remembered is null ) AND wsi.remember_date < \'' . $next_wheek_date . '\' AND wsi.salary_item_type_id NOT IN (10232 , 10233 ) '; PdoDataAccess::runquery($query); $query = " CREATE TABLE temp_messages TYPE=MyISAM as\n \t\t\t (SELECT p.pfname,\n\t\t\t\t\t\t p.plname,\n p.person_type,\n\t\t\t\t\t\t s.staff_id,\n\t\t\t\t\t\t NULL AS full_title,\n\t\t\t\t\t\t w.writ_id,\n\t\t\t\t\t\t w.writ_ver,\n\t\t\t\t\t\t w.warning_date,\n\t\t\t\t\t\t w.warning_message,w.ouid\n\n\t\t\t\t\t\tFROM temp_cw w\n\t\t\t\t\t\t INNER JOIN staff s\n\t\t\t\t\t\t \t ON (w.staff_id = s.staff_id)\n\t\t\t\t\t\t INNER JOIN persons p\n\t\t\t\t\t\t \t ON (s.PersonID = p.PersonID))\n \n\t\t\t\t\t\tUNION ALL\n\t\t\t\t\t\t(SELECT p.pfname,\n\t\t\t\t\t\t p.plname,\n p.person_type,\n\t\t\t\t\t\t s.staff_id,\n\t\t\t\t\t\t sit.full_title,\n\t\t\t\t\t\t wsi.writ_id,\n\t\t\t\t\t\t wsi.writ_ver,\n\t\t\t\t\t\t wsi.remember_date warning_date,\n\t\t\t\t\t\t wsi.remember_message warning_message , wsi.ouid\n\n\t\t\t\t\t\tFROM temp_cwsi wsi\n\t\t\t\t\t\t INNER JOIN salary_item_types sit\n\t\t\t\t\t\t \t ON (wsi.salary_item_type_id = sit.salary_item_type_id)\n\t\t\t\t\t\t INNER JOIN staff s\n\t\t\t\t\t\t \t ON (wsi.staff_id = s.staff_id)\n\t\t\t\t\t\t INNER JOIN persons p\n\t\t\t\t\t\t \t ON (s.PersonID = p.PersonID))\n \n\t\t\t\t\t\tORDER BY \tplname,pfname,writ_id\n "; PdoDataAccess::runquery($query); return true; }
function ShowReport($admin){ if($_POST["FromDate"] == "") { $StartDate = DateModules::shamsi_to_miladi($_POST["year"] . "-" . $_POST["month"] . "-01", "-"); $EndDate = DateModules::shamsi_to_miladi($_POST["year"] . "-" . $_POST["month"] ."-" . DateModules::DaysOfMonth($_POST["year"] ,$_POST["month"]), "-"); } else { $StartDate = DateModules::shamsi_to_miladi($_POST["FromDate"], "-"); $EndDate = DateModules::shamsi_to_miladi($_POST["ToDate"], "-"); } $holidays = ATN_holidays::Get(" AND TheDate between ? AND ? order by TheDate", array($StartDate, $EndDate)); $holidayRecord = $holidays->fetch(); $PersonID = $_SESSION["USER"]["PersonID"]; $PersonID = !empty($_POST["PersonID"]) ? $_POST["PersonID"] : $PersonID; $query = "select * from ( select 'normal' RecordType,'' ReqType, TrafficDate,TrafficTime,s.ShiftTitle,s.FromTime,s.ToTime ,ExceptFromTime,ExceptToTime from ATN_traffic t left join ATN_PersonShifts ps on(ps.IsActive='YES' AND t.PersonID=ps.PersonID AND TrafficDate between FromDate AND ToDate) left join ATN_shifts s on(ps.ShiftID=s.ShiftID) where t.IsActive='YES' AND t.PersonID=:p AND TrafficDate>= :sd AND TrafficDate <= :ed union All select 'start' RecordType,t.ReqType, t.FromDate,StartTime,s.ShiftTitle,s.FromTime,s.ToTime ,ExceptFromTime,ExceptToTime from ATN_requests t left join ATN_PersonShifts ps on(ps.IsActive='YES' AND t.PersonID=ps.PersonID AND t.FromDate between ps.FromDate AND ps.ToDate) left join ATN_shifts s on(ps.ShiftID=s.ShiftID) where t.PersonID=:p AND t.ToDate is null AND ReqStatus=2 AND t.FromDate>= :sd union all select 'end' RecordType,t.ReqType, t.FromDate,EndTime,s.ShiftTitle,s.FromTime,s.ToTime ,ExceptFromTime,ExceptToTime from ATN_requests t left join ATN_PersonShifts ps on(ps.IsActive='YES' AND t.PersonID=ps.PersonID AND t.FromDate between ps.FromDate AND ps.ToDate) left join ATN_shifts s on(ps.ShiftID=s.ShiftID) where t.PersonID=:p AND t.ToDate is null AND ReqStatus=2 AND t.FromDate>= :sd AND EndTime is not null )t2 order by TrafficDate,TrafficTime"; $dt = PdoDataAccess::runquery($query, array(":p" => $PersonID, ":sd" => $StartDate, ":ed" => $EndDate)); /*if($_SESSION["USER"]["UserName"] == "admin") { print_r(ExceptionHandler::PopAllExceptions()); echo PdoDataAccess::GetLatestQueryString(); }*/ //print_r($dt); //........................ create days array .................. $index = 0; $returnArr = array(); while($StartDate <= $EndDate) { if($index < count($dt) && $StartDate == $dt[$index]["TrafficDate"]) { while($index < count($dt) && $StartDate == $dt[$index]["TrafficDate"]) $returnArr[] = $dt[$index++]; $StartDate = DateModules::AddToGDate($StartDate, 1); continue; } $shiftRecord = ATN_PersonShifts::GetShiftOfDate($PersonID, $StartDate); $returnArr[] = array( "RecordType" => "normal", "TrafficID" => "", "TrafficDate" => $StartDate , "ShiftTitle" => $shiftRecord["ShiftTitle"], "FromTime" => $shiftRecord["FromTime"], "ToTime" => $shiftRecord["ToTime"], "ExceptFromTime" => $shiftRecord["ExceptFromTime"], "ExceptToTime" => $shiftRecord["ExceptToTime"], "TrafficTime" => ""); $StartDate = DateModules::AddToGDate($StartDate, 1); } //------------ holidays ------------------ for($i=0; $i<count($returnArr); $i++) { $holiday = false; $holidayTitle = "تعطیل"; if(FridayIsHoliday && DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "N") == "5") $holiday = true; if(ThursdayIsHoliday && DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "N") == "4") $holiday = true; if($holidayRecord && $holidayRecord["TheDate"] == $returnArr[$i]["TrafficDate"]) { $holidayTitle .= $holidayRecord["details"] != "" ? "(" . $holidayRecord["details"] . ")" : ""; $holiday = true; $holidayRecord = $holidays->fetch(); } $returnArr[$i]["holiday"] = $holiday; $returnArr[$i]["holidayTitle"] = $holidayTitle; } //........................................................... function ShowTime($arr){ if($arr[0] == "00" && $arr[1] == "00") return ""; return $arr[0] . ":" . $arr[1]; } $returnStr = ""; $SUM = array( "absence" => 0, "attend"=> 0, "firstAbsence" => 0, "lastAbsence" => 0, "extra" => 0, "Off" => 0, "mission" => 0, "DailyOff_1" => 0, "DailyOff_2" => 0, "DailyOff_3" => 0, "DailyMission" => 0, "DailyAbsence" => 0 ); for($i=0; $i < count($returnArr); $i++) { if(!$returnArr[$i]["holiday"]) { //........... Daily off and mission ................... $requests = PdoDataAccess::runquery(" select t.*, InfoDesc OffTypeDesc from ATN_requests t left join BaseInfo on(TypeID=20 AND InfoID=OffType) where ReqStatus=2 AND PersonID=:p AND FromDate <= :td AND if(ToDate is not null, ToDate >= :td, 1=1) order by ToDate desc,StartTime asc ", array( ":p" => $PersonID, ":td" => $returnArr[$i]["TrafficDate"] )); if(count($requests) > 0) { if($requests[0]["ReqType"] == "DayOFF") { $returnStr .= "<td>" . DateModules::$JWeekDays[ DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "N") ] . "</td> <td>" . DateModules::miladi_to_shamsi($returnArr[$i]["TrafficDate"]) . "</td> <td colspan=8> مرخصی " . $requests[0]["OffTypeDesc"] . "<td></tr>"; $SUM["DailyOff_" . $requests[0]["OffType"] ]++; $currentDay = $returnArr[$i]["TrafficDate"]; while($i < count($returnArr) && $currentDay == $returnArr[$i]["TrafficDate"]) $i++; $i--; continue; } if($requests[0]["ReqType"] == "DayMISSION") { $returnStr .= "<td>" . DateModules::$JWeekDays[ DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "N") ] . "</td> <td>" . DateModules::miladi_to_shamsi($returnArr[$i]["TrafficDate"]) . "</td> <td colspan=8> ماموریت " . $requests[0]["MissionSubject"] . "<td></tr>"; $SUM["DailyMission"]++; $currentDay = $returnArr[$i]["TrafficDate"]; while($i < count($returnArr) && $currentDay == $returnArr[$i]["TrafficDate"]) $i++; $i--; continue; } } } //.................................................... if( DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "l") == "Thursday") { $returnArr[$i]["FromTime"] = $returnArr[$i]["ExceptFromTime"]; $returnArr[$i]["ToTime"] = $returnArr[$i]["ExceptToTime"]; } //.................................................... $returnStr .= "<tr> <td>" . DateModules::$JWeekDays[ DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "N") ] . "</td>"; if($admin) $returnStr .= "<td><a class=link onclick=TraceTrafficObj.TrafficList('" . $returnArr[$i]["TrafficDate"] . "')>" . DateModules::miladi_to_shamsi($returnArr[$i]["TrafficDate"]) . "</a></td>"; else $returnStr .= "<td>" . DateModules::miladi_to_shamsi($returnArr[$i]["TrafficDate"]) . "</td>"; $returnStr .= "<td>" . ($returnArr[$i]["holiday"] ? $returnArr[$i]["holidayTitle"] : $returnArr[$i]["ShiftTitle"]) . "</td> <td>"; $firstAbsence = 0; $Off = 0; $mission = 0; $index = 1; $totalAttend = 0; $currentDay = $returnArr[$i]["TrafficDate"]; $startOff = 0; $endOff = 0; $extra = 0; if($returnArr[$i]["TrafficTime"] != "") { if(strtotime($returnArr[$i]["TrafficTime"]) > strtotime($returnArr[$i]["FromTime"])) $firstAbsence = strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i]["FromTime"]); else { if(strtotime($returnArr[$i+1]["TrafficTime"]) < strtotime($returnArr[$i]["FromTime"])) $extra += strtotime($returnArr[$i+1]["TrafficTime"]) - strtotime($returnArr[$i]["TrafficTime"]); else $extra += strtotime($returnArr[$i]["FromTime"]) - strtotime($returnArr[$i]["TrafficTime"]); } } while($i < count($returnArr) && $currentDay == $returnArr[$i]["TrafficDate"]) { //.................................................... if( DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "l") == "Thursday") { $returnArr[$i]["FromTime"] = $returnArr[$i]["ExceptFromTime"]; $returnArr[$i]["ToTime"] = $returnArr[$i]["ExceptToTime"]; } //.................................................... $returnStr .= substr($returnArr[$i]["TrafficTime"],0,5); $returnStr .= $index % 2 == 0 ? "<br>" : " - "; if($index % 2 == 0) { $totalAttend += strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["TrafficTime"]); if(strtotime($returnArr[$i]["TrafficTime"]) > strtotime($returnArr[$i]["ToTime"])) { if(strtotime($returnArr[$i-1]["TrafficTime"]) > strtotime($returnArr[$i]["ToTime"])) $extra += strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["TrafficTime"]); else $extra += strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["ToTime"]); } } if($returnArr[$i]["RecordType"] != "normal") { if($i>0 && $returnArr[$i-1]["TrafficDate"] == $currentDay && $returnArr[$i]["RecordType"] == "start") { if($i == 0 || $returnArr[$i-1]["TrafficDate"] != $currentDay) $startDiff = 0; else $startDiff = strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["TrafficTime"]); if($startDiff > Valid_Traffic_diff) $startOff = strtotime($returnArr[$i]["TrafficTime"]) - Valid_Traffic_diff; else $startOff = strtotime($returnArr[$i-1]["TrafficTime"]); } if( ($i==0 || $returnArr[$i-1]["TrafficDate"] != $currentDay) && $returnArr[$i]["RecordType"] == "start") { $startOff = strtotime($returnArr[$i]["TrafficTime"]); } if($returnArr[$i]["RecordType"] == "end") { if($i == count($returnArr)-1 || $returnArr[$i+1]["TrafficDate"] != $currentDay) $endDiff = 0; else $endDiff = strtotime($returnArr[$i+1]["TrafficTime"]) - strtotime($returnArr[$i]["TrafficTime"]); if($endDiff > Valid_Traffic_diff) $endOff = strtotime($returnArr[$i]["TrafficTime"]) - Valid_Traffic_diff; else $endOff = strtotime($returnArr[$i]["TrafficTime"]); if($returnArr[$i]["ReqType"] == "OFF") $Off += $endOff - $startOff; else $mission += $endOff - $startOff; } } $index++; $i++; } $i--; $lastAbsence = 0; if($returnArr[$i]["TrafficTime"] != "" && strtotime($returnArr[$i]["TrafficTime"]) < strtotime($returnArr[$i]["ToTime"])) $lastAbsence = strtotime($returnArr[$i]["ToTime"]) - strtotime($returnArr[$i]["TrafficTime"]); $ShiftDuration = strtotime($returnArr[$i]["ToTime"]) - strtotime($returnArr[$i]["FromTime"]); //$extra = ($totalAttend > $ShiftDuration) ? $totalAttend - $ShiftDuration : 0; $Absence = $totalAttend < $ShiftDuration ? $ShiftDuration - $totalAttend : 0; if($returnArr[$i]["holiday"]) { $extra = $totalAttend; $lastAbsence = 0; $firstAbsence = 0; $Absence = 0; $Off = 0; } if($Absence == $ShiftDuration) $SUM["DailyAbsence"]++; $SUM["absence"] += $Absence; $SUM["attend"] += $totalAttend; $SUM["firstAbsence"] += $firstAbsence; $SUM["lastAbsence"] += $lastAbsence; $SUM["extra"] += $extra; $SUM["Off"] += $Off; $SUM["mission"] += $mission; $totalAttend = TimeModules::SecondsToTime($totalAttend); $firstAbsence = TimeModules::SecondsToTime($firstAbsence); $lastAbsence = TimeModules::SecondsToTime($lastAbsence); $Absence = TimeModules::SecondsToTime($Absence); $extra = TimeModules::SecondsToTime($extra); $Off = TimeModules::SecondsToTime($Off); $mission = TimeModules::SecondsToTime($mission); $returnStr .= "</td><td class=attend>" . ShowTime($totalAttend) . "</td> <td class=extra>" . ShowTime($extra) . "</td> <td class=off>" . ShowTime($Off) . "</td> <td class=mission>" . ShowTime($mission) . "</td> <td class=sub>" . ShowTime($firstAbsence) . "</td> <td class=sub>" . ShowTime($lastAbsence) . "</td> <td class=sub>" . ShowTime($Absence) . "</td> </tr>"; } ?> <style> .reportTbl td {padding:4px;} .reportTbl th {padding:4px;text-align: center; background-color: #efefef; font-weight: bold} .reportTbl .attend { text-align:center} .reportTbl .extra { background-color: #D0F7E2; text-align:center} .reportTbl .off { background-color: #D7BAFF; text-align:center} .reportTbl .mission { text-align:center} .reportTbl .sub { background-color: #FFcfdd; text-align:center} .reportTbl .footer { background-color: #eee; text-align:center; line-height: 18px} </style> <table class="reportTbl" width="100%" border="1"> <tr class="blueText"> <th>روز</th> <th>تاریخ</th> <th>شیفت</th> <th style=width:70px>ورود/خروج</th> <th>حضور</th> <th class="extra">اضافه کار</th> <th class="off" >مرخصی</th> <th>ماموریت</th> <th class=sub>تاخیر</th> <th class=sub>تعجیل</th> <th class=sub>غیبت</th> </tr> <?= $returnStr ?> <tr class="footer"> <? $SUM["absence"] = TimeModules::SecondsToTime($SUM["absence"]); $SUM["attend"] = TimeModules::SecondsToTime($SUM["attend"] ); $SUM["firstAbsence"] = TimeModules::SecondsToTime($SUM["firstAbsence"]); $SUM["lastAbsence"] = TimeModules::SecondsToTime($SUM["lastAbsence"]); $SUM["extra"] = TimeModules::SecondsToTime($SUM["extra"]); $SUM["Off"] = TimeModules::SecondsToTime($SUM["Off"]); $SUM["mission"] = TimeModules::SecondsToTime($SUM["mission"]); ?> <td colspan="4"></td> <td><?= ShowTime($SUM["attend"]) ?></td> <td><?= ShowTime($SUM["extra"]) ?></td> <td><?= ShowTime($SUM["Off"]) ?></td> <td><?= ShowTime($SUM["mission"]) ?></td> <td><?= ShowTime($SUM["firstAbsence"]) ?></td> <td><?= ShowTime($SUM["lastAbsence"]) ?></td> <td><?= ShowTime($SUM["absence"]) ?></td> </tr> <tr class="footer"> <td colspan="4">مجموع عملکرد</td> <td colspan="3"> مجموع مرخصی استعلاجی : <?= $SUM["DailyOff_1"] ?><br> مجموع مرخصی استحقاقی : <?= $SUM["DailyOff_2"] ?><br> مجموع مرخصی بدون حقوق : <?= $SUM["DailyOff_3"] ?><br> </td> <td colspan="4"> مجموع ماموریت روزانه : <?= $SUM["DailyMission"] ?><br> مجموع غیبت روزانه : <?= $SUM["DailyAbsence"]?><br> </td> </tr> </table> <? die(); }
function DelayInstallments() { $RequestID = $_POST["RequestID"]; $InstallmentID = $_POST["InstallmentID"]; $newDate = $_POST["newDate"]; $PartObj = LON_ReqParts::GetValidPartObj($RequestID); $pdo = PdoDataAccess::getPdoObject(); $pdo->beginTransaction(); if ($_POST["IsRemainCompute"] == " 0") { $dt = LON_installments::SelectAll("r.RequestID=? AND InstallmentID>=?", array($RequestID, $InstallmentID)); $days = 0; for ($i = 0; $i < count($dt); $i++) { $obj = new LON_installments(); $obj->InstallmentID = $dt[$i]["InstallmentID"]; $obj->IsDelayed = "YES"; if (!$obj->EditInstallment($pdo)) { $pdo->rollBack(); echo Response::createObjectiveResponse(false, "1"); die; } //........................................... if ($days == 0) { $newDate = DateModules::shamsi_to_miladi($newDate, "-"); $days = DateModules::GDateMinusGDate($newDate, $dt[$i]["InstallmentDate"]); } $obj = new LON_installments(); $obj->RequestID = $RequestID; $obj->InstallmentDate = DateModules::AddToGDate($dt[$i]["InstallmentDate"], $days); $extraWage = round($dt[$i]["InstallmentAmount"] * $PartObj->CustomerWage * $days / 36500); $obj->InstallmentAmount = $dt[$i]["InstallmentAmount"] * 1 + $extraWage; if (!$obj->AddInstallment($pdo)) { $pdo->rollBack(); echo Response::createObjectiveResponse(false, "2"); die; } } } else { $dt = array(); $dt2 = LON_requests::ComputePayments($RequestID, $dt); $index = 0; $ComputeRecord = $dt2[$index++]; $days = 0; for ($i = 0; $i < count($dt); $i++) { if ($dt[$i]["InstallmentID"] < $InstallmentID) { while ($ComputeRecord["InstallmentID"] == $dt[$i]["InstallmentID"]) { $ComputeRecord = $dt2[++$index]; } continue; } $remain = 0; while ($ComputeRecord["InstallmentID"] == $dt[$i]["InstallmentID"]) { $remain = $ComputeRecord["remainder"]; $ComputeRecord = $index + 1 < count($dt2) ? $dt2[++$index] : null; } $obj = new LON_installments(); $obj->InstallmentID = $dt[$i]["InstallmentID"]; $obj->IsDelayed = "YES"; if (!$obj->EditInstallment($pdo)) { $pdo->rollBack(); echo Response::createObjectiveResponse(false, "1"); die; } //........................................... if ($days == 0) { $newDate = DateModules::shamsi_to_miladi($newDate, "-"); $days = DateModules::GDateMinusGDate($newDate, $dt[$i]["InstallmentDate"]); } $obj = new LON_installments(); $obj->RequestID = $RequestID; $obj->InstallmentDate = DateModules::AddToGDate($dt[$i]["InstallmentDate"], $days); $extraWage = round($remain * $PartObj->CustomerWage * $days / 36500); $obj->InstallmentAmount = $dt[$i]["InstallmentAmount"] * 1 + $extraWage; if (!$obj->AddInstallment($pdo)) { $pdo->rollBack(); echo Response::createObjectiveResponse(false, "2"); die; } } } if (ExceptionHandler::GetExceptionCount() > 0) { $pdo->rollBack(); print_r(ExceptionHandler::PopAllExceptions()); echo Response::createObjectiveResponse(false, ""); die; } $pdo->commit(); echo Response::createObjectiveResponse(true, ""); die; }
function ShowReport(){ if($_POST["FromDate"] == "") { $OrigStartDate = DateModules::shamsi_to_miladi($_POST["year"] . "-" . $_POST["month"] . "-01", "-"); $OrigEndDate = DateModules::shamsi_to_miladi($_POST["year"] . "-" . $_POST["month"] ."-" . DateModules::DaysOfMonth($_POST["year"] ,$_POST["month"]), "-"); } else { $OrigStartDate = DateModules::shamsi_to_miladi($_POST["FromDate"], "-"); $OrigEndDate = DateModules::shamsi_to_miladi($_POST["ToDate"], "-"); } $holidays = ATN_holidays::Get(" AND TheDate between ? AND ? order by TheDate", array($OrigStartDate, $OrigEndDate)); $holidayIndex = 0; $holidays = $holidays->fetchAll(); $where = ""; $param = array(); if(!empty($_POST["PersonID"])) { $where .= " AND PersonID = ?"; $param[] = $_POST["PersonID"]; } $PersonsDT = PdoDataAccess::runquery("select PersonID, concat(fname,' ',lname) fullname from BSC_persons where IsStaff='YES' " . $where, $param); $returnStr = ""; foreach($PersonsDT as $personRecord) { $holidayIndex = 0; $holidayRecord = $holidayIndex < count($holidays) ? $holidays[$holidayIndex++] : null; $PersonID = $personRecord["PersonID"]; $SUM = array( "absence" => 0, "attend"=> 0, "firstAbsence" => 0, "lastAbsence" => 0, "extra" => 0, "Off" => 0, "mission" => 0, "DailyOff_1" => 0, "DailyOff_2" => 0, "DailyOff_3" => 0, "DailyMission" => 0, "DailyAbsence" => 0 ); $StartDate = $OrigStartDate; $EndDate = $OrigEndDate; $query = "select * from ( select 'normal' RecordType,'' ReqType, TrafficDate,TrafficTime,s.ShiftTitle,s.FromTime,s.ToTime ,ExceptFromTime,ExceptToTime from ATN_traffic t left join ATN_PersonShifts ps on(ps.IsActive='YES' AND t.PersonID=ps.PersonID AND TrafficDate between FromDate AND ToDate) left join ATN_shifts s on(ps.ShiftID=s.ShiftID) where t.IsActive='YES' AND t.PersonID=:p AND TrafficDate>= :sd AND TrafficDate <= :ed union All select 'start' RecordType,t.ReqType, t.FromDate,StartTime,s.ShiftTitle,s.FromTime,s.ToTime ,ExceptFromTime,ExceptToTime from ATN_requests t left join ATN_PersonShifts ps on(ps.IsActive='YES' AND t.PersonID=ps.PersonID AND t.FromDate between ps.FromDate AND ps.ToDate) left join ATN_shifts s on(ps.ShiftID=s.ShiftID) where t.PersonID=:p AND t.ToDate is null AND ReqStatus=2 AND t.FromDate>= :sd union all select 'end' RecordType,t.ReqType, t.FromDate,EndTime,s.ShiftTitle,s.FromTime,s.ToTime ,ExceptFromTime,ExceptToTime from ATN_requests t left join ATN_PersonShifts ps on(ps.IsActive='YES' AND t.PersonID=ps.PersonID AND t.FromDate between ps.FromDate AND ps.ToDate) left join ATN_shifts s on(ps.ShiftID=s.ShiftID) where t.PersonID=:p AND t.ToDate is null AND ReqStatus=2 AND t.FromDate>= :sd AND EndTime is not null )t2 order by TrafficDate,TrafficTime"; $dt = PdoDataAccess::runquery($query, array(":p" => $PersonID, ":sd" => $StartDate, ":ed" => $EndDate)); //........................ create days array .................. $index = 0; $returnArr = array(); while($StartDate <= $EndDate) { if($index < count($dt) && $StartDate == $dt[$index]["TrafficDate"]) { while($index < count($dt) && $StartDate == $dt[$index]["TrafficDate"]) $returnArr[] = $dt[$index++]; $StartDate = DateModules::AddToGDate($StartDate, 1); continue; } $shiftRecord = ATN_PersonShifts::GetShiftOfDate($PersonID, $StartDate); $returnArr[] = array( "RecordType" => "normal", "TrafficID" => "", "TrafficDate" => $StartDate , "ShiftTitle" => $shiftRecord["ShiftTitle"], "FromTime" => $shiftRecord["FromTime"], "ToTime" => $shiftRecord["ToTime"], "ExceptFromTime" => $shiftRecord["ExceptFromTime"], "ExceptToTime" => $shiftRecord["ExceptToTime"], "TrafficTime" => ""); $StartDate = DateModules::AddToGDate($StartDate, 1); } //------------ holidays ------------------ for($i=0; $i<count($returnArr); $i++) { $holiday = false; if(FridayIsHoliday && DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "N") == "5") $holiday = true; if(ThursdayIsHoliday && DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "N") == "4") $holiday = true; if($holidayRecord && $holidayRecord["TheDate"] == $returnArr[$i]["TrafficDate"]) { $holiday = true; $holidayRecord = $holidayIndex < count($holidays) ? $holidays[$holidayIndex++] : null; } $returnArr[$i]["holiday"] = $holiday; } //........................................................... for($i=0; $i < count($returnArr); $i++) { if(!$returnArr[$i]["holiday"]) { //........... Daily off and mission ................... $requests = PdoDataAccess::runquery(" select t.*, InfoDesc OffTypeDesc from ATN_requests t left join BaseInfo on(TypeID=20 AND InfoID=OffType) where ReqStatus=2 AND PersonID=:p AND FromDate <= :td AND if(ToDate is not null, ToDate >= :td, 1=1) order by ToDate desc,StartTime asc ", array( ":p" => $PersonID, ":td" => $returnArr[$i]["TrafficDate"] )); if(count($requests) > 0) { if($requests[0]["ReqType"] == "DayOFF") { $SUM["DailyOff_" . $requests[0]["OffType"] ]++; $currentDay = $returnArr[$i]["TrafficDate"]; while($i < count($returnArr) && $currentDay == $returnArr[$i]["TrafficDate"]) $i++; $i--; continue; } if($requests[0]["ReqType"] == "DayMISSION") { $SUM["DailyMission"]++; $currentDay = $returnArr[$i]["TrafficDate"]; while($i < count($returnArr) && $currentDay == $returnArr[$i]["TrafficDate"]) $i++; $i--; continue; } } } //.................................................... if( DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "l") == "Thursday") { $returnArr[$i]["FromTime"] = $returnArr[$i]["ExceptFromTime"]; $returnArr[$i]["ToTime"] = $returnArr[$i]["ExceptToTime"]; } //.................................................... $firstAbsence = 0; $Off = 0; $mission = 0; $index = 1; $totalAttend = 0; if($returnArr[$i]["TrafficTime"] != "" && strtotime($returnArr[$i]["TrafficTime"]) > strtotime($returnArr[$i]["FromTime"])) $firstAbsence = strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i]["FromTime"]); $currentDay = $returnArr[$i]["TrafficDate"]; $startOff = 0; $endOff = 0; $extra = 0; while($i < count($returnArr) && $currentDay == $returnArr[$i]["TrafficDate"]) { //.................................................... if( DateModules::GetWeekDay($returnArr[$i]["TrafficDate"], "l") == "Thursday") { $returnArr[$i]["FromTime"] = $returnArr[$i]["ExceptFromTime"]; $returnArr[$i]["ToTime"] = $returnArr[$i]["ExceptToTime"]; } //.................................................... if($index % 2 == 0) { $totalAttend += strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["TrafficTime"]); if(strtotime($returnArr[$i]["TrafficTime"]) > strtotime($returnArr[$i]["ToTime"])) { if(strtotime($returnArr[$i-1]["TrafficTime"]) > strtotime($returnArr[$i]["ToTime"])) $extra += strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["TrafficTime"]); else $extra += strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["ToTime"]); } } if($returnArr[$i]["RecordType"] != "normal") { if($i>0 && $returnArr[$i-1]["TrafficDate"] == $currentDay && $returnArr[$i]["RecordType"] == "start") { if($i == 0 || $returnArr[$i-1]["TrafficDate"] != $currentDay) $startDiff = 0; else $startDiff = strtotime($returnArr[$i]["TrafficTime"]) - strtotime($returnArr[$i-1]["TrafficTime"]); if($startDiff > Valid_Traffic_diff) $startOff = strtotime($returnArr[$i]["TrafficTime"]) - Valid_Traffic_diff; else $startOff = strtotime($returnArr[$i-1]["TrafficTime"]); } if( ($i==0 || $returnArr[$i-1]["TrafficDate"] != $currentDay) && $returnArr[$i]["RecordType"] == "start") { $startOff = strtotime($returnArr[$i]["TrafficTime"]); } if($returnArr[$i]["RecordType"] == "end") { if($i == count($returnArr)-1 || $returnArr[$i+1]["TrafficDate"] != $currentDay) $endDiff = 0; else $endDiff = strtotime($returnArr[$i+1]["TrafficTime"]) - strtotime($returnArr[$i]["TrafficTime"]); if($endDiff > Valid_Traffic_diff) $endOff = strtotime($returnArr[$i]["TrafficTime"]) - Valid_Traffic_diff; else $endOff = strtotime($returnArr[$i]["TrafficTime"]); if($returnArr[$i]["ReqType"] == "OFF") $Off += $endOff - $startOff; else $mission += $endOff - $startOff; } } $index++; $i++; } $i--; $lastAbsence = 0; if($returnArr[$i]["TrafficTime"] != "" && strtotime($returnArr[$i]["TrafficTime"]) < strtotime($returnArr[$i]["ToTime"])) $lastAbsence = strtotime($returnArr[$i]["ToTime"]) - strtotime($returnArr[$i]["TrafficTime"]); $ShiftDuration = strtotime($returnArr[$i]["ToTime"]) - strtotime($returnArr[$i]["FromTime"]); $Absence = $totalAttend < $ShiftDuration ? $ShiftDuration - $totalAttend : 0; if($returnArr[$i]["holiday"]) { $extra = $totalAttend + $mission; $lastAbsence = 0; $firstAbsence = 0; $Absence = 0; $Off = 0; } if($Absence == $ShiftDuration) { $SUM["DailyAbsence"]++; $Absence = 0; } $SUM["absence"] += $Absence; $SUM["attend"] += $totalAttend; $SUM["firstAbsence"] += $firstAbsence; $SUM["lastAbsence"] += $lastAbsence; $SUM["extra"] += $extra; $SUM["Off"] += $Off; $SUM["mission"] += $mission; } $SUM["absence"] = TimeModules::SecondsToTime($SUM["absence"]); $SUM["attend"] = TimeModules::SecondsToTime($SUM["attend"] ); $SUM["firstAbsence"] = TimeModules::SecondsToTime($SUM["firstAbsence"]); $SUM["lastAbsence"] = TimeModules::SecondsToTime($SUM["lastAbsence"]); $SUM["extra"] = TimeModules::SecondsToTime($SUM["extra"]); $SUM["Off"] = TimeModules::SecondsToTime($SUM["Off"]); $SUM["mission"] = TimeModules::SecondsToTime($SUM["mission"]); $returnStr .= "<tr> <td>" . $personRecord["fullname"] . "</td> <td>" . ShowTime($SUM["attend"]) . "</td> <td>" . ShowTime($SUM["extra"]) . "</td> <td>" . ShowTime($SUM["Off"]) . "</td> <td>" . ShowTime($SUM["mission"]) . "</td> <td>" . ShowTime($SUM["firstAbsence"]) . "</td> <td>" . ShowTime($SUM["lastAbsence"]) . "</td> <td>" . ShowTime($SUM["absence"]) . "</td> <td>" . $SUM["DailyOff_1"] . "</td> <td>" . $SUM["DailyOff_2"] . "</td> <td>" . $SUM["DailyOff_3"] . "</td> <td>" . $SUM["DailyMission"] . "</td> <td>" . $SUM["DailyAbsence"] . "</td> </tr>"; } ?> <META http-equiv=Content-Type content="text/html; charset=UTF-8" ><body dir="rtl"> <link rel="stylesheet" type="text/css" href="/generalUI/fonts/fonts.css" /></head> <style> .reportTbl {border-collapse:collapse} .reportTbl td {padding:4px;font-family: nazanin; font-size:14px;} .reportTbl th {font-family: nazanin; font-size:14px;padding:4px;text-align: center; background-color: #efefef; font-weight: bold} .reportTbl .attend { text-align:center} .reportTbl .extra { background-color: #D0F7E2; text-align:center} .reportTbl .off { background-color: #D7BAFF; text-align:center} .reportTbl .mission { text-align:center} .reportTbl .sub { background-color: #FFcfdd; text-align:center} .reportTbl .footer { background-color: #eee; text-align:center; line-height: 18px} </style> <table style='border:2px groove #9BB1CD;border-collapse:collapse;width:100%'> <tr> <td width=60px><img src='/framework/icons/logo.jpg' style='width:120px'></td> <td align='center' style='height:100px;vertical-align:middle;font-family:b titr;font-size:15px'> گزارش خلاصه کارکرد پرسنل <br>از تاریخ <?= DateModules::miladi_to_shamsi($OrigStartDate) ?> تا تاریخ <?= DateModules::miladi_to_shamsi($OrigEndDate) ?> </td> <td width='200px' align='center' style='font-family:tahoma;font-size:11px'>تاریخ تهیه گزارش : <?= DateModules::shNow() ?> </td> </tr> </table> <table class="reportTbl" width="100%" border="1"> <tr class="blueText"> <th>نام و نام خانوادگی</th> <th>حضور</th> <th>اضافه کار</th> <th>مرخصی</th> <th>ماموریت</th> <th>تاخیر</th> <th>تعجیل</th> <th>غیبت</th> <th>مرخصی استعلاجی</th> <th>مرخصی استحقاقی</th> <th>مرخصی بدون حقوق</th> <th>ماموریت روزانه</th> <th>غیبت روزانه</th> </tr> <?= $returnStr ?> </table> <? die(); }