param = $param;
}
/**
* Execute the job.
*
* @return mixed
*/
public function handle()
{
$param = $this->param;
$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->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') {
$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)));
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();
$consumerApplicationController->updateProforma($id);
$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']]);
}
}
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;
}
}