Example #1
0
function DeleteCosts()
{
    $obj = new LON_costs($_POST["CostID"]);
    $DocRecord = $obj->GetAccDoc();
    if ($DocRecord) {
        if ($DocRecord["DocStatus"] != "RAW") {
            echo Response::createObjectiveResponse(false, "سند مربوطه تایید شده و قابل حذف نمی باشد");
            die;
        }
        ACC_docs::Remove($DocRecord["DocID"]);
    }
    $result = $obj->Remove();
    echo Response::createObjectiveResponse($result, ExceptionHandler::GetExceptionsToString());
    die;
}
Example #2
0
function RegisterDifferncePartsDoc($RequestID, $NewPartID, $pdo, $DocID = "")
{
    $ReqObj = new LON_requests($RequestID);
    $NewPartObj = new LON_ReqParts($NewPartID);
    $dt = PdoDataAccess::runquery("select * from LON_ReqParts \r\n\t\twhere RequestID=? AND IsHistory='YES' order by PartID desc limit 1", array($RequestID));
    $PreviousPartObj = new LON_ReqParts($dt[0]["PartID"]);
    //------------- get CostCodes --------------------
    $LoanObj = new LON_loans($ReqObj->LoanID);
    $CostCode_Loan = FindCostID("110" . "-" . $LoanObj->_BlockCode);
    $CostCode_wage = FindCostID("750" . "-" . $LoanObj->_BlockCode);
    $CostCode_FutureWage = FindCostID("760" . "-" . $LoanObj->_BlockCode);
    $CostCode_agent_wage = FindCostID("750" . "-52");
    $CostCode_agent_FutureWage = FindCostID("760" . "-52");
    $CostCode_todiee = FindCostID("200-" . $LoanObj->_BlockCode . "-01");
    //------------------------------------------------
    $CycleID = substr(DateModules::shNow(), 0, 4);
    //--------------------------------------------------
    $LoanMode = "";
    if (!empty($ReqObj->ReqPersonID)) {
        $PersonObj = new BSC_persons($ReqObj->ReqPersonID);
        if ($PersonObj->IsAgent == "YES") {
            $LoanMode = "Agent";
        }
    } else {
        $LoanMode = "Customer";
    }
    //------------------ find tafsilis ---------------
    $LoanPersonTafsili = FindTafsiliID($ReqObj->LoanPersonID, TAFTYPE_PERSONS);
    if (!$LoanPersonTafsili) {
        ExceptionHandler::PushException("تفصیلی مربوطه یافت نشد.[" . $ReqObj->LoanPersonID . "]");
        return false;
    }
    if ($LoanMode == "Agent") {
        $ReqPersonTafsili = FindTafsiliID($ReqObj->ReqPersonID, TAFTYPE_PERSONS);
        if (!$ReqPersonTafsili) {
            ExceptionHandler::PushException("تفصیلی مربوطه یافت نشد.[" . $ReqObj->ReqPersonID . "]");
            return false;
        }
        $SubAgentTafsili = "";
        if (!empty($ReqObj->SubAgentID)) {
            $SubAgentTafsili = FindTafsiliID($ReqObj->SubAgentID, TAFTYPE_SUBAGENT);
            if (!$SubAgentTafsili) {
                ExceptionHandler::PushException("تفصیلی زیر واحد سرمایه گذار یافت نشد.[" . $ReqObj->SubAgentID . "]");
                return false;
            }
        }
    }
    //------------------------------------------------
    // check for partAmount not greater than todiee
    if ($NewPartObj->PartAmount * 1 != $PreviousPartObj->PartAmount * 1) {
        $dt = PdoDataAccess::runquery("select ifnull(sum(CreditorAmount-DebtorAmount),0) amount\r\n\t\t\tfrom ACC_DocItems where CostID=? AND TafsiliID=? AND sourceID=?", array($CostCode_todiee, $LoanPersonTafsili, $ReqObj->RequestID));
        if ($PreviousPartObj->PartAmount * 1 - $NewPartObj->PartAmount * 1 > $dt[0]["amount"] * 1) {
            ExceptionHandler::PushException("مبلغ جدید کمتر از مبلغی است که تاکنون پرداخت شده است ");
            return false;
        }
    }
    //---------------- add doc header --------------------
    if ($DocID == "") {
        $obj = new ACC_docs();
        $obj->RegDate = PDONOW;
        $obj->regPersonID = $_SESSION['USER']["PersonID"];
        $obj->DocDate = PDONOW;
        $obj->CycleID = $CycleID;
        $obj->BranchID = $ReqObj->BranchID;
        $obj->DocType = DOCTYPE_LOAN_DIFFERENCE;
        $obj->description = "اختلاف حاصل از شرایط جدید برای وام شماره " . $ReqObj->RequestID;
        if (!$obj->Add($pdo)) {
            ExceptionHandler::PushException("خطا در ایجاد سند");
            return false;
        }
    } else {
        $obj = new ACC_docs($DocID);
        PdoDataAccess::runquery("delete from ACC_DocItems where DocID=?", array($DocID), $pdo);
    }
    //--------------------------------------------------------
    // compute the previous amounts
    $diferences = array("FundWageYears" => array(), "AgentWageYears" => array(), "CustomerYearDelays" => array());
    $dt = PdoDataAccess::runquery("select * from LON_payments where RequestID=?", array($RequestID), $pdo);
    $firstPayDate = $dt[0]["PayDate"];
    $totalPaid = 0;
    foreach ($dt as $PayRow) {
        $totalPaid += $PayRow["PayAmount"];
        $result_old = ComputeWagesAndDelays($PreviousPartObj, $PayRow["PayAmount"], $firstPayDate, $PayRow["PayDate"]);
        $result_new = ComputeWagesAndDelays($NewPartObj, $PayRow["PayAmount"], $firstPayDate, $PayRow["PayDate"]);
        foreach ($result_new["FundWageYears"] as $year => $amount) {
            if (!isset($diferences["FundWageYears"][$year])) {
                $diferences["FundWageYears"][$year] = 0;
            }
            $diferences["FundWageYears"][$year] += $amount;
        }
        foreach ($result_old["FundWageYears"] as $year => $amount) {
            if (!isset($diferences["FundWageYears"][$year])) {
                $diferences["FundWageYears"][$year] = 0;
            }
            $diferences["FundWageYears"][$year] -= $amount;
        }
        //.....................................................
        foreach ($result_new["CustomerYearDelays"] as $year => $amount) {
            if (!isset($diferences["CustomerYearDelays"][$year])) {
                $diferences["CustomerYearDelays"][$year] = 0;
            }
            $diferences["CustomerYearDelays"][$year] += $amount;
        }
        foreach ($result_old["CustomerYearDelays"] as $year => $amount) {
            if (!isset($diferences["CustomerYearDelays"][$year])) {
                $diferences["CustomerYearDelays"][$year] = 0;
            }
            $diferences["CustomerYearDelays"][$year] -= $amount;
        }
    }
    $MaxWage = max($NewPartObj->CustomerWage * 1, $NewPartObj->FundWage);
    $AgentFactor = $MaxWage == 0 ? 0 : ($NewPartObj->CustomerWage - $NewPartObj->FundWage) / $MaxWage;
    $result = ComputeWagesAndDelays($NewPartObj, $NewPartObj->PartAmount, $firstPayDate, $NewPartObj->PartDate);
    $TotalFundWage = $result["TotalFundWage"];
    $TotalAgentWage = $result["TotalAgentWage"];
    $TotalCustomerWage = $result["TotalCustomerWage"];
    $FundYears = $result["FundWageYears"];
    $AgentYears = $result["AgentWageYears"];
    $TotalFundDelay = $result["TotalFundDelay"];
    $TotalAgentDelay = $result["TotalAgentDelay"];
    $ExtraAmount = 0;
    //----------------- add Doc items ------------------------
    $itemObj = new ACC_DocItems();
    $itemObj->DocID = $obj->DocID;
    $itemObj->TafsiliType = TAFTYPE_PERSONS;
    $itemObj->TafsiliID = $LoanPersonTafsili;
    if ($LoanMode == "Agent") {
        $itemObj->TafsiliType2 = TAFTYPE_PERSONS;
        $itemObj->TafsiliID2 = $ReqPersonTafsili;
    }
    $itemObj->locked = "YES";
    $itemObj->SourceType = DOCTYPE_LOAN_DIFFERENCE;
    $itemObj->SourceID = $ReqObj->RequestID;
    $itemObj->SourceID2 = $NewPartObj->PartID;
    $extraAmount = 0;
    if ($NewPartObj->WageReturn == "INSTALLMENT") {
        if ($NewPartObj->MaxFundWage * 1 > 0) {
            $extraAmount += $NewPartObj->MaxFundWage;
        } else {
            if ($NewPartObj->CustomerWage > $NewPartObj->FundWage) {
                $extraAmount += $TotalFundWage;
            } else {
                $extraAmount += $TotalCustomerWage;
            }
        }
    }
    if ($NewPartObj->AgentReturn == "INSTALLMENT" && $NewPartObj->CustomerWage > $NewPartObj->FundWage) {
        $extraAmount += $TotalAgentWage;
    }
    if ($NewPartObj->DelayReturn == "INSTALLMENT") {
        $extraAmount += $TotalFundDelay;
    }
    if ($TotalAgentDelay > 0 && $NewPartObj->AgentDelayReturn == "INSTALLMENT") {
        $extraAmount += $TotalAgentDelay;
    }
    function GetAmount($RequestID, $CostID, $TafsiliID = "")
    {
        $query = "select ifnull(sum(DebtorAmount-CreditorAmount),0) amount \r\n\t\t\tfrom ACC_DocItems \r\n\t\t\twhere SourceType in(" . DOCTYPE_LOAN_PAYMENT . "," . DOCTYPE_LOAN_DIFFERENCE . " )\r\n\t\t\tAND SourceID=? AND CostID=?";
        $params = array($RequestID, $CostID);
        if ($TafsiliID != "") {
            $query .= " AND TafsiliID=?";
            $params[] = $TafsiliID;
        }
        $dt = PdoDataAccess::runquery($query, $params);
        return $dt[0]["amount"] * 1;
    }
    //...............Loan ..............................
    $CostCode_LoanAmount = GetAmount($RequestID, $CostCode_Loan) - ($NewPartObj->PartAmount * 1 + $extraAmount);
    if ($CostCode_LoanAmount != 0) {
        unset($itemObj->ItemID);
        $itemObj->DocID = $obj->DocID;
        $itemObj->CostID = $CostCode_Loan;
        $itemObj->DebtorAmount = $CostCode_LoanAmount < 0 ? abs($CostCode_LoanAmount) : 0;
        $itemObj->CreditorAmount = $CostCode_LoanAmount > 0 ? $CostCode_LoanAmount : 0;
        $itemObj->Add($pdo);
    }
    //.......... Todiee ....................................
    if ($NewPartObj->PartAmount * 1 != $PreviousPartObj->PartAmount) {
        $CostCode_todieeAmount = GetAmount($RequestID, $CostCode_todiee) - ($NewPartObj->PartAmount * 1 - $totalPaid);
        unset($itemObj->ItemID);
        $itemObj->CostID = $CostCode_todiee;
        $itemObj->DebtorAmount = $CostCode_todieeAmount < 0 ? abs($CostCode_todieeAmount) : 0;
        $itemObj->CreditorAmount = $CostCode_todieeAmount > 0 ? $CostCode_todieeAmount : 0;
        $itemObj->Add($pdo);
    }
    //------------------------ delay -------------------------------
    $curYear = substr(DateModules::miladi_to_shamsi($NewPartObj->PartDate), 0, 4) * 1;
    $index = 0;
    foreach ($diferences["CustomerYearDelays"] as $year => $value) {
        $FundYearAmount = $NewPartObj->FundWage / $NewPartObj->DelayPercent * $value;
        $AgentYearAmount = ($NewPartObj->CustomerWage * 1 - $NewPartObj->FundWage * 1) / $NewPartObj->DelayPercent * 1 * $value;
        if ($FundYearAmount != 0) {
            unset($itemObj->ItemID);
            unset($itemObj->TafsiliType2);
            unset($itemObj->TafsiliID2);
            $itemObj->CostID = $year == $curYear ? $CostCode_wage : $CostCode_FutureWage;
            $itemObj->TafsiliType = TAFTYPE_YEARS;
            $itemObj->TafsiliID = FindTafsiliID($year, TAFTYPE_YEARS);
            $itemObj->DebtorAmount = $FundYearAmount < 0 ? abs($FundYearAmount) : 0;
            $itemObj->CreditorAmount = $FundYearAmount > 0 ? $FundYearAmount : 0;
            $itemObj->details = "کارمزد دوره تنفس وام شماره " . $ReqObj->RequestID;
            if (!$itemObj->Add($pdo)) {
                ExceptionHandler::PushException("خطا در ایجاد ردیف کارمزد تنفس");
                return false;
            }
            $ExtraAmount += $FundYearAmount > 0 ? $FundYearAmount : 0;
        }
        if ($AgentYearAmount > 0) {
            unset($itemObj->ItemID);
            $itemObj->CostID = $year == $curYear ? $CostCode_agent_wage : $CostCode_agent_FutureWage;
            $itemObj->DebtorAmount = $AgentYearAmount;
            $itemObj->CreditorAmount = 0;
            $itemObj->details = "اختلاف کارمزد تنفس وام شماره " . $ReqObj->RequestID;
            if (!$itemObj->Add($pdo)) {
                ExceptionHandler::PushException("خطا در ایجاد ردیف کارمزد تنفس");
                return false;
            }
        }
        if ($AgentYearAmount < 0) {
            unset($itemObj->ItemID);
            $itemObj->CostID = $year == $curYear ? $CostCode_agent_wage : $CostCode_agent_FutureWage;
            $itemObj->DebtorAmount = 0;
            $itemObj->CreditorAmount = $AgentYearAmount;
            $itemObj->details = "سهم کارمزد تنفس وام شماره " . $ReqObj->RequestID;
            if (!$itemObj->Add($pdo)) {
                ExceptionHandler::PushException("خطا در ایجاد ردیف کارمزد تنفس");
                return false;
            }
        }
        $index++;
    }
    //------------------------ کارمزد---------------------
    foreach ($diferences["FundWageYears"] as $Year => $amount) {
        if ($amount == 0) {
            continue;
        }
        $YearTafsili = FindTafsiliID($Year, TAFTYPE_YEARS);
        if (!$YearTafsili) {
            ExceptionHandler::PushException("تفصیلی مربوطه یافت نشد.[" . $Year . "]");
            return false;
        }
        unset($itemObj->ItemID);
        $itemObj->CostID = $Year == $curYear ? $CostCode_wage : $CostCode_FutureWage;
        $itemObj->TafsiliType = TAFTYPE_YEARS;
        $itemObj->TafsiliID = $YearTafsili;
        $itemObj->details = "کارمزد وام شماره " . $ReqObj->RequestID;
        unset($itemObj->TafsiliType2);
        unset($itemObj->TafsiliID2);
        $itemObj->DebtorAmount = $amount < 0 ? abs($amount) : 0;
        $itemObj->CreditorAmount = $amount > 0 ? $amount : 0;
        $itemObj->Add($pdo);
        //$ExtraAmount += $amount<0 ? abs($amount) : 0;
        if ($NewPartObj->AgentReturn == "INSTALLMENT") {
            if ($LoanMode == "Agent" && $NewPartObj->FundWage * 1 > $NewPartObj->CustomerWage) {
                unset($itemObj->ItemID);
                $itemObj->details = "اختلاف کارمزد وام شماره " . $ReqObj->RequestID;
                $itemObj->CostID = $Year == $curYear ? $CostCode_wage : $CostCode_FutureWage;
                $itemObj->DebtorAmount = $amount * $AgentFactor < 0 ? abs($amount * $AgentFactor) : 0;
                $itemObj->CreditorAmount = $amount * $AgentFactor > 0 ? $amount * $AgentFactor : 0;
                $itemObj->TafsiliType = TAFTYPE_YEARS;
                $itemObj->TafsiliID = $YearTafsili;
                $itemObj->TafsiliType2 = TAFTYPE_PERSONS;
                $itemObj->TafsiliID2 = $ReqPersonTafsili;
                $itemObj->Add($pdo);
            }
            if ($LoanMode == "Agent" && $NewPartObj->FundWage * 1 < $NewPartObj->CustomerWage) {
                unset($itemObj->ItemID);
                $itemObj->details = "سهم کارمزد وام شماره " . $ReqObj->RequestID;
                $itemObj->CostID = $Year == $curYear ? $CostCode_wage : $CostCode_FutureWage;
                $itemObj->DebtorAmount = $amount * $AgentFactor > 0 ? $amount * $AgentFactor : 0;
                $itemObj->CreditorAmount = $amount * $AgentFactor < 0 ? abs($amount * $AgentFactor) : 0;
                $itemObj->TafsiliType = TAFTYPE_YEARS;
                $itemObj->TafsiliID = $YearTafsili;
                $itemObj->TafsiliType2 = TAFTYPE_PERSONS;
                $itemObj->TafsiliID2 = $ReqPersonTafsili;
                $itemObj->Add($pdo);
            }
        }
    }
    /*if($NewPartObj->AgentReturn == "CUSTOMER" && $NewPartObj->CustomerWage > $NewPartObj->FundWage)
    	{
    		unset($itemObj->ItemID);
    		$itemObj->details = "سهم کارمزد وام شماره " . $ReqObj->RequestID;
    		$itemObj->CostID = $CostCode_deposite;
    		$itemObj->DebtorAmount = 0;
    		$itemObj->CreditorAmount = $TotalAgentWage;
    		$itemObj->TafsiliType = TAFTYPE_PERSONS;
    		$itemObj->TafsiliID = $ReqPersonTafsili;
    		if($LoanMode == "Agent")
    		{
    			$itemObj->TafsiliType2 = TAFTYPE_PERSONS;
    			$itemObj->TafsiliID2 = $ReqPersonTafsili;
    		}
    		$itemObj->Add($pdo);
    	}*/
    // ---------------------------- ExtraAmount --------------------------------
    if ($ExtraAmount > 0) {
        $itemObj = new ACC_DocItems();
        $itemObj->DocID = $obj->DocID;
        $itemObj->CostID = $CostCode_Loan;
        $itemObj->DebtorAmount = $ExtraAmount;
        $itemObj->CreditorAmount = 0;
        $itemObj->locked = "YES";
        $itemObj->SourceID = $ReqObj->RequestID;
        $itemObj->SourceID2 = $NewPartObj->PartID;
        $itemObj->Add($pdo);
        //-------------------- add loan cost for difference --------------------
        $dt = PdoDataAccess::runquery("select * from LON_costs where RequestID=? AND PartID=?", array($NewPartObj->RequestID, $NewPartObj->PartID));
        if (count($dt) > 0) {
            $obj = new LON_costs($dt[0]["CostID"]);
            $obj->CostAmount = $ExtraAmount;
            $obj->Edit($pdo);
        } else {
            $obj = new LON_costs();
            $obj->RequestID = $NewPartObj->RequestID;
            $obj->CostDesc = "اختلافت حاصل از تغییر شرایط پرداخت";
            $obj->CostAmount = $ExtraAmount;
            $obj->CostID = $CostCode_Loan;
            $obj->IsPartDiff = "YES";
            $obj->PartID = $NewPartObj->PartID;
            $obj->Add($pdo);
        }
    }
    //---------------------------------------------------------
    if (ExceptionHandler::GetExceptionCount() > 0) {
        return false;
    }
    return true;
}