Beispiel #1
0
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;
}
Beispiel #2
0
 static function ComputePayments($RequestID, &$installments, $pdo = null)
 {
     $installments = LON_installments::SelectAll("r.RequestID=?", array($RequestID), $pdo);
     $obj = new LON_ReqParts($RequestID);
     if ($obj->PayCompute == "installment") {
         return self::ComputePaymentsBaseOnInstallment($RequestID, $installments, $pdo);
     }
     $returnArr = array();
     $pays = PdoDataAccess::runquery("\r\n\t\t\tselect substr(p.PayDate,1,10) PayDate, sum(PayAmount) PayAmount, sum(PayAmount) FixPayAmount\r\n\t\t\t\tfrom LON_BackPays p\r\n\t\t\t\tleft join ACC_IncomeCheques i using(IncomeChequeID)\r\n\t\t\t\tleft join BaseInfo bi on(bi.TypeID=6 AND bi.InfoID=p.PayType)\r\n\t\t\t\twhere RequestID=? AND \r\n\t\t\t\t\tif(p.PayType=" . BACKPAY_PAYTYPE_CHEQUE . ",i.ChequeStatus=" . INCOMECHEQUE_VOSUL . ",1=1)\r\n\r\n\t\t\t\tgroup by substr(PayDate,1,10)\r\n\t\t\t\torder by substr(PayDate,1,10)", array($RequestID), $pdo);
     $PayRecord = count($pays) == 0 ? null : $pays[0];
     $payIndex = 1;
     $Forfeit = 0;
     for ($i = 0; $i < count($installments); $i++) {
         if ($installments[$i]["IsDelayed"] == "YES") {
             continue;
         }
         $installments[$i]["CurForfeitAmount"] = 0;
         $installments[$i]["ForfeitAmount"] = 0;
         $installments[$i]["ForfeitDays"] = 0;
         $installments[$i]["remainder"] = 0;
         $installments[$i]["FixPayAmount"] = 0;
         $installments[$i]["PayAmount"] = 0;
         $installments[$i]["UsedPayAmount"] = 0;
         $installments[$i]["TotalRemainder"] = 0;
         $installments[$i]["PayDate"] = '';
         if ($PayRecord == null) {
             $installments[$i]["TotalRemainder"] = $i == 0 ? 0 : (!isset($installments[$i - 1]["TotalRemainder"]) ? 0 : $installments[$i - 1]["TotalRemainder"]);
             $ToDate = DateModules::Now();
             $amount = $installments[$i]["InstallmentAmount"];
             $forfeitDays = DateModules::GDateMinusGDate($ToDate, $installments[$i]["InstallmentDate"]);
             $CurForfeit = round($amount * $installments[$i]["ForfeitPercent"] * $forfeitDays / 36500);
             if ($installments[$i]["InstallmentDate"] < $ToDate) {
                 $installments[$i]["ForfeitDays"] = $forfeitDays;
                 $Forfeit += $CurForfeit;
                 $installments[$i]["ForfeitAmount"] = $Forfeit;
                 $installments[$i]["CurForfeitAmount"] = $CurForfeit;
                 $installments[$i]["TotalRemainder"] += $amount + $CurForfeit;
                 $installments[$i]["remainder"] += $amount;
             } else {
                 $installments[$i]["remainder"] += $amount;
                 $installments[$i]["ForfeitDays"] = 0;
                 $installments[$i]["ForfeitAmount"] = $Forfeit;
                 $installments[$i]["CurForfeitAmount"] = 0;
                 $installments[$i]["TotalRemainder"] += $amount;
             }
             $returnArr[] = $installments[$i];
             continue;
         } else {
             $installments[$i]["TotalRemainder"] = 0;
         }
         $remainder = $installments[$i]["InstallmentAmount"];
         $StartDate = $installments[$i]["InstallmentDate"];
         while (true) {
             if ($remainder == 0) {
                 break;
             }
             $ToDate = $PayRecord == null ? DateModules::Now() : $PayRecord["PayDate"];
             if ($PayRecord != null) {
                 $installments[$i]["FixPayAmount"] = $PayRecord["FixPayAmount"] * 1;
                 $installments[$i]["PayAmount"] = $PayRecord["PayAmount"] * 1;
                 $installments[$i]["PayDate"] = $PayRecord["PayDate"];
             } else {
                 $installments[$i]["FixPayAmount"] = 0;
                 $installments[$i]["PayAmount"] = 0;
                 $installments[$i]["PayDate"] = DateModules::Now();
             }
             if ($StartDate < $ToDate) {
                 $forfeitDays = DateModules::GDateMinusGDate($ToDate, $StartDate);
                 $CurForfeit = round($remainder * $installments[$i]["ForfeitPercent"] * $forfeitDays / 36500);
                 $installments[$i]["ForfeitDays"] = $forfeitDays;
                 $installments[$i]["CurForfeitAmount"] = $CurForfeit;
                 $Forfeit += $CurForfeit;
                 $installments[$i]["ForfeitAmount"] = $Forfeit;
             }
             if ($PayRecord == null) {
                 $installments[$i]["TotalRemainder"] += $Forfeit;
                 $installments[$i]["remainder"] = $remainder;
                 $returnArr[] = $installments[$i];
                 break;
             }
             //----------------------------------------------
             if ($PayRecord["PayAmount"] * 1 <= $Forfeit) {
                 $Forfeit = $Forfeit - $PayRecord["PayAmount"] * 1;
                 $installments[$i]["TotalRemainder"] = $remainder + $Forfeit;
                 $installments[$i]["remainder"] = $remainder;
                 $StartDate = max($PayRecord["PayDate"], $installments[$i]["InstallmentDate"]);
                 $PayRecord = $payIndex < count($pays) ? $pays[$payIndex++] : null;
                 $returnArr[] = $installments[$i];
                 continue;
             }
             $PayRecord["PayAmount"] = $PayRecord["PayAmount"] * 1 - $Forfeit;
             $installments[$i]["UsedPayAmount"] += $Forfeit;
             $Forfeit = 0;
             if ($remainder < $PayRecord["PayAmount"] * 1) {
                 $PayRecord["PayAmount"] = $PayRecord["PayAmount"] * 1 - $remainder;
                 $installments[$i]["UsedPayAmount"] += $remainder;
                 if ($PayRecord["PayAmount"] == 0) {
                     $StartDate = max($PayRecord["PayDate"], $installments[$i]["InstallmentDate"]);
                     $PayRecord = $payIndex < count($pays) ? $pays[$payIndex++] : null;
                 }
                 if ($i == count($installments) - 1) {
                     $installments[$i]["TotalRemainder"] = -1 * $PayRecord["PayAmount"];
                     $installments[$i]["remainder"] = -1 * $PayRecord["PayAmount"];
                 } else {
                     $installments[$i]["TotalRemainder"] = 0;
                     $installments[$i]["remainder"] = 0;
                 }
                 $returnArr[] = $installments[$i];
                 break;
             }
             $remainder = $remainder - $PayRecord["PayAmount"] * 1;
             $StartDate = max($PayRecord["PayDate"], $installments[$i]["InstallmentDate"]);
             $installments[$i]["TotalRemainder"] = $remainder + $Forfeit;
             $installments[$i]["remainder"] = $remainder;
             $PayRecord = $payIndex < count($pays) ? $pays[$payIndex++] : null;
             $returnArr[] = $installments[$i];
         }
     }
     return $returnArr;
 }