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; }
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; }