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); }
function ComputeInstallments($RequestID = "", $returnMode = false, $pdo2 = null) { $RequestID = empty($RequestID) ? $_REQUEST["RequestID"] : $RequestID; PdoDataAccess::runquery("delete from LON_installments where RequestID=? ", array($RequestID)); //----------------------------------------------- $obj2 = new LON_requests($RequestID); if ($obj2->ReqPersonID == SHEKOOFAI) { return ComputeInstallmentsShekoofa($RequestID, $returnMode); } //----------------------------------------------- $obj = LON_ReqParts::GetValidPartObj($RequestID); //----------------------------------------------- $YearMonths = 12; if ($obj->IntervalType == "DAY") { $YearMonths = floor(365 / $obj->PayInterval); } $TotalWage = round(ComputeWage($obj->PartAmount, $obj->CustomerWage / 100, $obj->InstallmentCount, $PartObj->IntervalType, $obj->PayInterval)); if ($obj->WageReturn == "CUSTOMER") { $TotalWage = 0; $obj->CustomerWage = 0; } $startDate = DateModules::miladi_to_shamsi($obj->PartDate); $DelayDuration = DateModules::JDateMinusJDate(DateModules::AddToJDate($startDate, $obj->DelayDays, $obj->DelayMonths), $startDate) + 1; if ($obj->DelayDays * 1 > 0) { $TotalDelay = round($obj->PartAmount * $obj->DelayPercent * $DelayDuration / 36500); } else { $TotalDelay = round($obj->PartAmount * $obj->DelayPercent * $obj->DelayMonths / 1200); } //-------------------------- installments ----------------------------- $MaxWage = max($obj->CustomerWage, $obj->FundWage); $CustomerFactor = $MaxWage == 0 ? 0 : $obj->CustomerWage / $MaxWage; $FundFactor = $MaxWage == 0 ? 0 : $obj->FundWage / $MaxWage; $AgentFactor = $MaxWage == 0 ? 0 : ($obj->CustomerWage - $obj->FundWage) / $MaxWage; $extraAmount = 0; if ($obj->WageReturn == "INSTALLMENT") { if ($obj->MaxFundWage * 1 > 0) { $extraAmount += $obj->MaxFundWage; } else { if ($obj->CustomerWage > $obj->FundWage) { $extraAmount += round($TotalWage * $FundFactor); } else { $extraAmount += round($TotalWage * $CustomerFactor); } } } if ($obj->AgentReturn == "INSTALLMENT" && $obj->CustomerWage > $obj->FundWage) { $extraAmount += round($TotalWage * $AgentFactor); } if ($obj->DelayReturn == "INSTALLMENT") { $extraAmount += $TotalDelay * ($obj->FundWage / $obj->DelayPercent); } if ($obj->AgentDelayReturn == "INSTALLMENT" && $obj->DelayPercent > $obj->FundWage) { $extraAmount += $TotalDelay * (($obj->DelayPercent - $obj->FundWage) / $obj->DelayPercent); } $TotalAmount = $obj->PartAmount * 1 + $extraAmount; $allPay = ComputeInstallmentAmount($TotalAmount, $obj->InstallmentCount, $obj->PayInterval); if ($obj->InstallmentCount > 1) { $allPay = roundUp($allPay, -3); } else { $allPay = round($allPay); } if ($obj->DelayReturn == "INSTALLMENT") { $allPay += $TotalDelay / $obj->InstallmentCount * 1; } $LastPay = $TotalAmount - $allPay * ($obj->InstallmentCount - 1); //--------------------------------------------------------------------- $jdate = DateModules::miladi_to_shamsi($obj->PartDate); $jdate = DateModules::AddToJDate($jdate, $obj->DelayDays, $obj->DelayMonths); if ($pdo2 == null) { $pdo = PdoDataAccess::getPdoObject(); $pdo->beginTransaction(); } else { $pdo = $pdo2; } for ($i = 0; $i < $obj->InstallmentCount - 1; $i++) { $obj2 = new LON_installments(); $obj2->RequestID = $RequestID; $obj2->InstallmentDate = DateModules::AddToJDate($jdate, $obj->IntervalType == "DAY" ? $obj->PayInterval * ($i + 1) : 0, $obj->IntervalType == "MONTH" ? $obj->PayInterval * ($i + 1) : 0); $obj2->InstallmentAmount = $allPay; if (!$obj2->AddInstallment($pdo)) { $pdo->rollBack(); print_r(ExceptionHandler::PopAllExceptions()); echo Response::createObjectiveResponse(false, ""); die; } } $obj2 = new LON_installments(); $obj2->RequestID = $RequestID; $obj2->InstallmentDate = DateModules::AddToJDate($jdate, $obj->IntervalType == "DAY" ? $obj->PayInterval * $obj->InstallmentCount : 0, $obj->IntervalType == "MONTH" ? $obj->PayInterval * $obj->InstallmentCount : 0); $obj2->InstallmentAmount = $LastPay; if (!$obj2->AddInstallment($pdo)) { $pdo->rollBack(); print_r(ExceptionHandler::PopAllExceptions()); echo Response::createObjectiveResponse(false, ""); die; } if ($returnMode) { return true; } $pdo->commit(); echo Response::createObjectiveResponse(true, ""); die; }