Example #1
0
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);
}
Example #2
0
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;
}