option('con'); $param = $this->option('param'); if(!empty($con)) { switch ($con) { case 'jobs': $id = Arr::get($param,'id',null); $applicant_type = (int) Arr::get($param, 'applicant_type', 1); $applicant_type = in_array($applicant_type, [1, 2]) ? $applicant_type : 1; if($id) { try { $cwFactory = new CloudWatchLoggerFactory(); $application = ConsumerApplication::with('merchant')->where('id', $id)->first(['id','merchant_id', 'state', 'co_applicant_name', 'updated_by']); $electricityNameChange = DB::selectOne("select electricity_name_change from consumer_application_element where application_id = ?", [$id]); if($application->merchant && ($application->merchant->is_auto_approve || $application->merchant->is_auto_doc || $application->merchant->pre_approval) && $application->merchant->grade_id) { $param['co_applicant'] = !empty($application->co_applicant_name) ? true : false; $utilityValidationExists = DB::table('utility_validation') ->where('consumer_application_id', $id) ->exists(); if ($utilityValidationExists) { $param['electricity_bill_validation'] = 'Success'; } $applicationController = new ConsumerApplicationController(); $applicationController->updateProforma($id); $applicationController->isRoot = false; $testImport = new TestImport(new Request()); $requestID = $testImport->random_strings(8); \request()->merge(['request_ap_id' => $requestID, 'log_decision' => true]); $runBRE = true; $electricityBillExists = DB::selectOne('select id from consumer_application_files caf where consumer_application_id = ? and file_type = "electricity_bill"', [$id]); $electricity_bill_upload = !empty($electricityBillExists) ? 1 : 0; if (isset($param['electricity_bill_validation']) && $param['electricity_bill_validation'] == 'Fail' && isset($electricity_bill_upload) && !$electricity_bill_upload && $application->updated_by == 'MERCHANT API') { $runBRE = false; } // calculate LTV for MERCHANT API applications (offer_id and gross_project_amount are mandatory in this source) if ($application->updated_by == 'MERCHANT API' && $application->isSolar()) { $ltvApplication = ConsumerApplication::with(['offer'])->find($id); if ($ltvApplication && $ltvApplication->offer) { $gradeController = new GradeController(new Request()); $ltv = $gradeController->calculateLTV($ltvApplication, $ltvApplication->offer); $applicationAdditionObject = ConsumerApplicationAdditional::where('application_id', $id)->first(); if (!isset($applicationAdditionObject->id)) { $applicationAdditionObject = new ConsumerApplicationAdditional(); $applicationAdditionObject->application_id = $id; } $applicationAdditionObject->loan_to_value_limit = [ 'ltv_gross_project_amount' => $ltv['ltv_gross_project_amount'], 'ltv_net_loan_amount' => $ltv['ltv_net_loan_amount'], ]; $applicationAdditionObject->save(); $comment = "Initial LTV Value Set.
LTV (Gross Project Amount): " . number_format($ltv['ltv_gross_project_amount'], 2) . "%
LTV (Net Loan Amount): " . number_format($ltv['ltv_net_loan_amount'], 2) . "%
Loan Amount: " . $ltv['loan_amount'] . "
Gross Project Amount: " . $ltv['inverter_gross_project_amount'] . "
Net Loan Amount: " . $ltv['net_loan_amount']; $gradeController->addComment($id, 107, $comment); ContentLogger::insert([ 'application_id' => $id, 'data' => json_encode([ 'ltv_gross_project_amount' => ['old' => '', 'new' => round((float)$ltv['ltv_gross_project_amount'], 2)], 'ltv_net_loan_amount' => ['old' => '', 'new' => round((float)$ltv['ltv_net_loan_amount'], 2)], ]), 'status' => $ltvApplication->state ?? '', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 107, 'model' => 'consumer_application' ]); } } $cwFactory->logger(json_encode(array('title' => 'AutoDecisionQueueLog', 'application_id' => $id ?? '', 'applicant_type' => $applicant_type))); if ($applicant_type == 2) { Input::merge(['applicant_type' => 2]); // align input bag for co-applicant; worker process reuses Input across jobs $response = $applicationController->generateSoftBureauReport($id, 'autoBRE', 2, false); $responseData = $response->getData(); if ($responseData->status != 'OK') { return Utility::handlerSendFailed([\Config::get("constants.txt.txt_errors") => [$responseData->message]]); } return; } Input::merge(['applicant_type' => 1]); // Added here to overwrite the value set in input for hard pull of co-applicant $response = $applicationController->generateSoftBureauReport($id, 'autoBRE', 1, $runBRE); $responseData = $response->getData(); if ($responseData->status == 'OK' && !$responseData->is_rejected && !$responseData->is_pre_approved) { // Dont change status in case, application is rejected or pre approved $consumerApplicationController = new ConsumerApplicationController(); $hasApproval = $this->getApprovedRules($id); if (isset($responseData->is_approved) && $responseData->is_approved && $hasApproval->status) { // SSE Mconnect Integration block if ($application->merchant->id == _env('SSE_MERCHANT_ID') && !optional($electricityNameChange)->electricity_name_change) { $status = $this->sseSetStatus($id, $responseData->is_approved, $consumerApplicationController, $param, $electricity_bill_upload); } else { $status = 'approved'; if ($applicationController->isMultiLender($application->merchant_id) > 1) { $status = 'cf approved'; } } $cwFactory->logger(json_encode(array('title' => 'AutoDecisionQueueLog', 'application_id' => $id ?? '', 'status' => $status, 'is_approved' => $responseData->is_approved))); } else if (isset($responseData->is_approved) && !$responseData->is_approved) { $status = ($application->merchant->id == _env('SSE_MERCHANT_ID') && !optional($electricityNameChange)->electricity_name_change) ? $this->sseSetStatus($id, $responseData->is_approved, $consumerApplicationController, $param, $electricity_bill_upload) : 'waiting for decision'; } if ($status != $application->state) { $cwFactory->logger(json_encode(array('title' => 'AutoDecisionQueueLog', 'application_id' => $id ?? '', 'status' => $status, 'is_approved' => $responseData->is_approved))); \request()->merge(['state' => $status, 'autoDecisionQueue' => true]); $consumerApplicationController->updateStatus($id, true); } } else { return Utility::handlerSendFailed([\Config::get("constants.txt.txt_errors") => [$responseData->message]]); } } }catch (\Exception $e){ return Utility::handlerSendFailed([\Config::get("constants.txt.txt_errors") => [$e->getMessage().'|'.$e->getLine().'|'.$e->getTraceAsString()]]); } } else { return Utility::handlerSendFailed([\Config::get("constants.txt.txt_errors") => ['Missing parameter ExecuteJob']]); } break; default: return Utility::handlerSendFailed([\Config::get("constants.txt.txt_errors") => ['No case found to handle in ExecuteJob']]); } } else { return Utility::handlerSendFailed([Config::get("constants.txt.txt_errors") => ['Context is missing']]); } } public function sseSetStatus($id, $bre_status, $applicationController, $param, $electricity_bill_upload) { $status = 'waiting for documents'; $reasonString = 'Co-applicant needed for Ebill Match'; $addn_data = ['user_id' => Input::get('auth_user_id'), 'reason' => $reasonString]; $webhookName = 'Add-Co-applicant'; $fileTyepQuery = DB::select('select id, file_type, ebill_name_verify from consumer_application_files caf where consumer_application_id ='.$id.' and file_type in ("electricity_bill_validation_report", "electricity_bill") and ebill_name_verify is not null order by created_at desc limit 1'); // Electricity bill validation failed, document uploaded or only doc uploaded flow if (isset($param['electricity_bill_validation']) && isset($electricity_bill_upload) && $param['electricity_bill_validation'] == 'Fail' && $electricity_bill_upload) { $status = 'waiting for decision'; $comment = $bre_status ? 'BRE approved. Electricity bill document verification is pending.' : 'BRE not approved. Electricity bill document verification is pending.'; // Electricity bill validation failed and no doc uploaded } else if (isset($param['electricity_bill_validation']) && isset($electricity_bill_upload) && $param['electricity_bill_validation'] == 'Fail' && !$electricity_bill_upload) { $comment = 'Electricity bill validation failed. Electricity bill document required.'; } else if (isset($param['electricity_bill_validation']) && $param['electricity_bill_validation'] == 'Success') { $eBill = isset($fileTyepQuery[0]->ebill_name_verify) ? json_decode($fileTyepQuery[0]->ebill_name_verify, true) : ''; if ($bre_status) { // Approved if (isset($eBill['applicant_match']) && $eBill['applicant_match'] < 80) { if (isset($param['co_applicant']) && !$param['co_applicant']) { if (isset($eBill['applicant_match']) && $eBill['applicant_match'] >= 51) { $status = 'waiting for decision'; // Approved, applicant fuzzy between 51-89 but no co-applicant $comment = 'Auto approved rules passed. Please check Owner name as per E-bill and take action accordingly.'; } if (isset($eBill['applicant_match']) && $eBill['applicant_match'] <= 50) { // Approved, applicant fuzzy less than 50 but no co-applicant $comment = 'Auto approved rules passed. Applicant name mismatched with E-bill. Please add owner in the co-applicant details.'; $applicationController->webhook($id, ['merchant_id' => _env('SSE_MERCHANT_ID'), 'type' => 'Application-Webhook', 'status' => $webhookName, 'data' => $applicationController->getMConnectPayload($id, $webhookName, $addn_data)]); } } else { if (isset($eBill['co_applicant_match']) && $eBill['co_applicant_match'] <= 50 && $eBill['applicant_match'] < 50) { // Approved, applicant fuzzy less than 50 and co-applicant fuzzy less than 50 $comment = 'Add Co-Applicant using the name mentioned on the e-bill.'; $applicationController->webhook($id, ['merchant_id' => _env('SSE_MERCHANT_ID'), 'type' => 'Application-Webhook', 'status' => $webhookName, 'data' => $applicationController->getMConnectPayload($id, $webhookName, $addn_data)]); } else if (isset($eBill['co_applicant_match']) && $eBill['co_applicant_match'] >= 80) { $status = 'approved'; // Approved, applicant fuzzy less than 50 and co-applicant fuzzy more than 80 if ($applicationController->isMultiLender(_env('SSE_MERCHANT_ID')) > 1) { $status = 'cf approved'; } } else { $status = 'waiting for decision'; // Approved, applicant fuzzy less than 50 or 51-89 and co-applicant fuzzy greater than 80 or 51-79 $comment = 'Auto approved rules passed. Please check Owner name as per E-bill and take action accordingly.'; } } } else { $status = 'approved'; // Approved & applicant fuzzy match success if ($applicationController->isMultiLender(_env('SSE_MERCHANT_ID')) > 1) { $status = 'cf approved'; } } } else { // Not approved if (isset($eBill['applicant_match']) && $eBill['applicant_match'] < 50) { if ((!$param['co_applicant']) || (isset($eBill['co_applicant_match']) && $eBill['co_applicant_match'] <= 50)) { $applicationController->webhook($id, ['merchant_id' => _env('SSE_MERCHANT_ID'), 'type' => 'Application-Webhook', 'status' => $webhookName, 'data' => $applicationController->getMConnectPayload($id, $webhookName, $addn_data)]); $comment = 'Add Co-applicant using the name mentioned on the e-bill. Bank Statement required of the applicant'; } else if (!$param['co_applicant'] || (isset($eBill['co_applicant_match']) && $eBill['co_applicant_match'] > 50 && $eBill['co_applicant_match'] < 80)) { $comment = 'Bank Statement required of the applicant. Please perform manual name validation, as the match result for applicant - '.$eBill['applicant_match'].' & co-applicant - '.$eBill['co_applicant_match']; } else { $comment = 'Bank Statement required for decision'; } } else if (isset($eBill['applicant_match']) && $eBill['applicant_match'] < 80) { $comment = 'Bank Statement required of the applicant. Please perform manual name validation, as the match result for applicant - '.$eBill['applicant_match']; } else { $comment = 'Bank Statement required for decision'; $status = 'waiting for decision'; } } } if (isset($comment)) { (new GradeController(new Request))->addComment($id, 107, $comment); } if ($status === 'waiting for documents' && isset($comment)) { $docToAdd = null; if (strpos($comment, 'Electricity bill validation failed') !== false) { $docToAdd = 'electricity_bill'; } else if (strpos($comment, 'Bank Statement required') !== false) { $docToAdd = 'bank_statement'; } if ($docToAdd) { $element = ConsumerApplicationElement::select('id', 'mandatory_document_list') ->where('application_id', $id) ->first(); if ($element) { $mandatoryDocs = !empty($element->mandatory_document_list) ? explode(',', $element->mandatory_document_list) : []; if (!in_array($docToAdd, $mandatoryDocs)) { $mandatoryDocs[] = $docToAdd; $element->mandatory_document_list = implode(',', $mandatoryDocs); $element->save(); } } } } return $status; } public function getApprovedRules($id) { if (_env('JSON_BRE_ACTIVE')) { $approvalStatus = DB::connection('mysql_primary')->selectOne(" SELECT EXISTS ( SELECT 1 FROM jsonbre_approval_status_log WHERE application_id = ? AND request_batch_id = ( SELECT request_batch_id FROM jsonbre_approval_status_log WHERE application_id = ? ORDER BY created_at DESC LIMIT 1 ) AND status = 1 ) as status", [$id, $id]); } else { $approvalStatus = DB::connection('mysql_primary')->selectOne(" SELECT EXISTS ( SELECT 1 FROM approval_status_log WHERE application_id = ? AND request_batch_id = ( SELECT request_batch_id FROM approval_status_log WHERE application_id = ? ORDER BY created_at DESC LIMIT 1 ) AND status = 1 ) as status", [$id, $id]); } return $approvalStatus; } }