<?php
namespace App\Http\Controllers;
use App\Imali\BusinessAccount;
use App\Imali\ImaliAccount;
use App\PhoneValidation;
use App\User;
use App\UserDocument;
use Illuminate\Http\Request;
// Imports imagens
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\UploadedFile;
use URL;
use File;
class UserDocumentController extends Controller
{
private $baseUrl = '';
private $storagePath = '';
public function __construct()
{
$this->baseUrl = URL::to("/") . '/images/documentos/';
$this->storagePath = public_path() . '/images/documentos';
}
public function getDocuments($status)
{
// $data = UserDocument::query()
// ->join('users', 'users.id', '=', 'user_documents.user_id')
// ->join('imali_accounts', 'imali_accounts.user_id', '=', 'user_documents.user_id')
// ->select('users.name', 'users.last_name', 'imali_accounts.account_number', 'user_documents.*')
// ->where('user_documents.status', $status)
// ->paginate(10);
$data = UserDocument::query()
->join('users', 'users.id', '=', 'user_documents.user_id')
->leftJoin('imali_accounts', 'imali_accounts.user_id', '=', 'user_documents.user_id')
->leftJoin('business_accounts', 'business_accounts.user_id', '=', 'user_documents.user_id')
->select(
'users.name',
'users.last_name',
'imali_accounts.account_number',
'business_accounts.account_number',
'user_documents.*',
'business_accounts.municipal_license',
'business_accounts.alvara',
'business_accounts.commercial_registration_certificate',
'business_accounts.nuit'
)
->where('user_documents.status', $status)
->paginate(10);
return response()->json(['data' => $data], 200);
}
public function getUserDocuments($id)
{
$data = UserDocument::query()
->join('users', 'users.id', '=', 'user_documents.user_id')
->join('imali_accounts', 'imali_accounts.user_id', '=', 'user_documents.user_id')
->select('users.name', 'imali_accounts.account_number', 'user_documents.*')
->where('user_documents.user_id', $id)
->get();
return response()->json(['data' => $data], 200);
}
public function updateUserInformation(Request $request)
{
$this->validate($request, [
'id' => 'required',
'user_id' => 'required',
]);
$userDocument = UserDocument::query()
->where('id', $request->id)
->where('user_id', $request->user_id)
->first();
if ($userDocument) {
$user = User::find($request->user_id);
$imali = ImaliAccount::query()
->where('user_id', $request->user_id)
->first();
$imali2 = BusinessAccount::query()
->where('user_id', $request->user_id)
->first();
$userDocument->update([
'status' => 'updated',
'fathers_name' => $request->fathers_name,
'mothers_name' => $request->mothers_name,
'issue_date' => $request->issue_date,
'expiration_date' => $request->expiration_date,
'document_type' => $request->document_type,
'issuing_place' => $request->issuing_place,
'document_number' => $request->document_number,
'nationality' => $request->nationality,
'place_of_birth' => $request->place_of_birth,
'address1' => $request->address1,
'address2' => $request->address2,
'marital_status' => $request->marital_status,
'sex' => $request->sex,
'birthdate' => $request->birthdate,
'height' => $request->height,
'admin_id' => $request->user()->id,
//'imali_account_id' => $imali->id,
'imali_account_id' => ($user && ($user->profile == 'client')) ? $imali->id : $imali2->id,
]);
User::query()
->where('id', $request->user_id)
->update([
'update_info_status' => 'updated',
'info_status' => 1,
'status' => 1,
'name' => $request->name,
'last_name' => $request->last_name,
'user_update_info_status' => 1,
'birthday' => $request->birthdate,
'document_id' => $userDocument->id
]);
ImaliAccount::query()
->where('user_id', $request->user_id)
->update(['imali_account_config' => 2]);
BusinessAccount::query()
->where('user_id', $request->user_id)
->update(['imali_account_config' => 2]);
$notification = array(
'icon' => 'ic_imali_logo_verde_01',
// 'icon' => 'ic_i_mali_cover',
'title' => 'Actualização Documentos',
'body' => 'Caro cliente, os teus documentos foram actualizados com Succeso. Desfrute dos serviços que o iMali disponibiliza.',
'click_action' => 'com.imali.payapp.payment_NOTICIA',
// 'color' => '#008577'
'color' => '#ffffff'
);
$data = array(
'sms' => 'Parabéns, o teu pedido de actualização de documentos foi aprovado com Sucesso. Com os documentos actualizados, vai fazer transacções e pagamentos em montantes maiores.',
'route' => 'NOTICIA',
'terminal' => 'firebase'
);
$userData = User::query()
->where('id', $request->user_id)
->first();
$this->pushNotifification($userData->firebase_token, $notification, $data);
$userDocumentData = UserDocument::query()
->where('id', $request->id)
->where('user_id', $request->user_id)
->get();
foreach ($userDocumentData as $data) {
UserDocument::query()
->where('status', 'pending')
->where('id', '=', $data->id)
->update(['status' => 'rejected', 'message' => 'Pedido recusado, pois já foi aceite um pedido que reuniu as codições desejadas.']);
}
return response()->json(['message' => 'Dados Actualizados com Sucesso'], 200);
} else {
return response()->json(['message' => 'Conta Inválida'], 400);
}
}
public function negarPedidoActualizacaoDocumentosOLD(Request $request)
{
$this->validate($request, [
'id' => 'required',
'user_id' => 'required',
'message' => 'required|min:10',
]);
$userDocument = UserDocument::query()
->where('id', $request->id)
->where('user_id', $request->user_id)
->first();
if ($userDocument) {
$userDocument->update(['status' => 'rejected', 'message' => $request->message, 'admin_id' => $request->user()->id]);
User::query()
->where('id', $request->user_id)
->update(['info_status' => 0, 'update_info_status' => 'rejected']);
$notification = array(
'icon' => 'ic_imali_logo_verde_01',
// 'icon' => 'ic_i_mali_cover',
'title' => 'Actualização Documentos',
'body' => $request->message,
'click_action' => 'com.imali.payapp.payment_NOTICIA',
'color' => '#ffffff'
);
$data = array(
'sms' => $request->message,
'route' => 'NOTICIA',
'terminal' => 'firebase'
);
$userData = User::query()
->where('id', $request->user_id)
->first();
$this->pushNotifification($userData->firebase_token, $notification, $data);
return response()->json(['message' => 'Resposta Enviada com Sucesso'], 200);
} else {
return response()->json(['message' => 'Conta Inválida'], 400);
}
}
public function negarPedidoActualizacaoDocumentos(Request $request)
{
$this->validate($request, [
'id' => 'required',
'user_id' => 'required',
'message' => 'required|min:10',
]);
$user = User::find($request->user_id);
if (!$user) return response()->json(['message' => 'Conta Inválida'], 400);
$userDocument = UserDocument::query()
->where('id', $request->id)
->where('user_id', $request->user_id)
->first();
if ($userDocument && $user->profile == 'client') {
$userDocument->update(['status' => 'rejected', 'message' => $request->message, 'admin_id' => $request->user()->id]);
User::query()
->where('id', $request->user_id)
->update(['info_status' => 0, 'update_info_status' => 'rejected']);
$notification = array(
'icon' => 'ic_imali_logo_verde_01',
// 'icon' => 'ic_i_mali_cover',
'title' => 'Actualização Documentos',
'body' => $request->message,
'click_action' => 'com.imali.payapp.payment_NOTICIA',
'color' => '#ffffff'
);
$data = array(
'sms' => $request->message,
'route' => 'NOTICIA',
'terminal' => 'firebase'
);
$userData = User::query()
->where('id', $request->user_id)
->first();
$this->pushNotifification($userData->firebase_token, $notification, $data);
return response()->json(['message' => 'Resposta Enviada com Sucesso'], 200);
} else if ($userDocument && $user->profile == 'business') {
User::query()
->where('id', $request->user_id)
->update(['info_status' => 0, 'update_info_status' => 'rejected']);
$notification = array(
'icon' => 'ic_imali_logo_verde_01',
'title' => 'Actualização Documentos',
'body' => $request->message,
'click_action' => 'com.imali.payapp.payment_NOTICIA',
'color' => '#ffffff'
);
$data = array(
'sms' => $request->message,
'route' => 'NOTICIA',
'terminal' => 'firebase'
);
$userData = User::query()
->where('id', $request->user_id)
->first();
$this->pushNotifification($userData->firebase_token, $notification, $data);
$business = BusinessAccount::where('user_id', $user->id)->first();
// PhoneValidation::where('phone', $user->phone)->first()->forceDelete();
// UserDocument::where('user_id', $user->id)->first()->delete();
// $user->forceDelete();
// $imgUploader = new ImageUploader();
$this->deleteImageFile($business, 'alvara', '/images/documentos/');
$this->deleteImageFile($business, 'nuit', '/images/documentos/');
$this->deleteImageFile($business, 'municipal_license', '/images/documentos/');
$this->deleteImageFile($business, 'commercial_registration_certificate', '/images/documentos/');
// $business->delete();
$this->deleteImageFile($userDocument, 'image_selfie', '/images/documentos/');
$this->deleteImageFile($userDocument, 'image_front', '/images/documentos/');
$this->deleteImageFile($userDocument, 'image_back', '/images/documentos/');
return response()->json(['message' => 'Resposta Enviada com Sucesso'], 200);
} else {
return response()->json(['message' => 'Conta Inválida'], 400);
}
}
//? NOVO CODIGO DE UPDATE DOCUMENT
# actualizar no server
public function imageCompress($image, $newImageName, $imgDefaultRatio)
{
$image = \Image::make(file_get_contents($image));
$image->save($this->storagePath . '/' . $newImageName, $imgDefaultRatio);
}
#actualizar no server
public function imageUpload($image, $newImageName)
{
$image->move($this->storagePath, $newImageName);
}
# actualizar no server
public function generateImageUrl(Request $request, $imageAttr)
{
if ($request->hasFile($imageAttr) && $request->file($imageAttr)->isValid()) {
// Validar imagem
$this->validate(
$request,
[
$imageAttr => 'mimes:jpeg,jpg,png|max:4096'
],
[
'photo.required' => 'O campo photo é Obrigatório',
'photo.mimes' => 'Formato de imagem invalido, formatos permitidos jpeg,jpg,png',
'photo.max' => 'O tamanho de imagem permitido somente abaixo de 4 MB',
]
);
//fazer o upload
$image = $request[$imageAttr];
$newImageName = time() . $image->getClientOriginalName();
//verificar size
$imageSizeMB = round($request->file($imageAttr)->getSize() / (1024 * 1024), 2);
// Diminuir tamanho..
if ($imageSizeMB >= 1) {
$imgDefaultRatio = 65;
if ($imageSizeMB >= 3) {
$imgDefaultRatio = 35;
}
//comprimir e fazer upload
$this->imageCompress($image, $newImageName, $imgDefaultRatio);
} else {
$this->imageUpload($image, $newImageName);
}
return $this->baseUrl . $newImageName;
} else {
$exploded = explode(',', $request[$imageAttr]);
$decoded = base64_decode($exploded[$this->is_string_encoded($request[$imageAttr]) ? 0 : 1], True);
$f = finfo_open();
$mime_type = finfo_buffer($f, $decoded, FILEINFO_MIME_TYPE);
$valiExtension = ['jpeg', 'jpg', 'png'];
$imageExtention = substr($mime_type, 6, strlen($mime_type));
if (!in_array($imageExtention, $valiExtension)) return response()->json(['message' => "Formato de imagem invalido, formatos permitidos jpeg,jpg,png"], 400);
if ($this->getImageSizeMB($decoded) > 4) return response()->json(['message' => "O tamanho de imagem permitido somente abaixo de 4 MB"], 400);
// if (base64_encode($decoded) !== $exploded[$this->is_string_encoded($request[$imageAttr])?0:1]) return response()->json(['message' => 'Imagem invalida.'],400);
//faz o upload temporario no storage - by Rodrigues Mafumo
$tempFileName = $imageAttr . '.jpg';
if (Storage::put($tempFileName, $decoded)) {
$path = storage_path('app/') . $tempFileName;
$tempFile = new \Symfony\Component\HttpFoundation\File\File($path);
$file = UploadedFile::createFromBase(new UploadedFile($tempFile->getPathname(), $tempFile->getFilename(), $tempFile->getMimeType(), null, true));
$newRequest = new Request();
$newRequest->files->set($imageAttr, $file);
return $this->generateImageUrl($newRequest, $imageAttr);
}
}
}
#server
private function getImageSizeMB($imagebase64)
{
$size_in_bytes = (int) (strlen(rtrim($imagebase64, '=')) * 1);
$size_in_kb = $size_in_bytes / 1024;
$size_in_mb = round($size_in_kb / 1024, 2);
return $size_in_mb;
}
#server
// Check if there are valid base64 characters
function is_string_encoded($s)
{
return !startsWith("data:image/", $s);
}
private function deleteImageFile($obj, $param, $location)
{
//? Retorna a posicao do documentos
$posicao = strrpos($obj[$param], '/') + 1;
$imageName = substr($obj[$param], $posicao, strlen($obj[$param]));
File::delete(public_path($location . $imageName));
}
public function updateDocoment(Request $request)
{
$documentType = strtolower($request->document_type);
$imageFront = '';
$imageBack = '';
$imageSelfie = '';
$this->validate(
$request,
[
'document_type' => 'required'
],
[
'document_type.required' => 'O tipo de documento é obrigatório'
]
);
if ($documentType === 'bi' || $documentType === 'dire') {
$this->validate(
$request,
[
'image_front' => 'required',
'image_back' => 'required',
'image_selfie' => 'required'
],
[
'image_front.required' => 'A foto frontal é obrigatória',
'image_back.required' => 'A foto traseira é obrigatória',
'image_selfie.required' => 'A selfie é obrigatória',
]
);
$imageFront = $this->generateImageUrl($request, 'image_front');
$imageBack = $this->generateImageUrl($request, 'image_back');
$imageSelfie = $this->generateImageUrl($request, 'image_selfie');
} else {
$this->validate(
$request,
[
'image_front' => 'required',
'image_selfie' => 'required'
],
[
'image_front.required' => 'A foto frontal é obrigatória',
'image_selfie.required' => 'A selfie é obrigatória',
]
);
$imageFront = $this->generateImageUrl($request, 'image_front');
$imageSelfie = $this->generateImageUrl($request, 'image_selfie');
}
$user = User::find($request->user()->id);
//? Codigo novo ...
$userDocument = UserDocument::query()->where('user_id', $user->id)->orderBy('id', 'desc')->get();
if ($userDocument->count() > 1) {
foreach ($userDocument as $key => $ud) {
if ($key != 0) {
# code...
$this->deleteImageFile($ud, 'image_front', '/images/documentos/');
$this->deleteImageFile($ud, 'image_back', '/images/documentos/');
$this->deleteImageFile($ud, 'image_selfie', '/images/documentos/');
$doc = UserDocument::findOrFail($ud->id);
$doc->delete();
}
}
}
$userDocument = UserDocument::query()->where('user_id', $user->id)->orderBy('id', 'desc')->get()->toArray();
// if($userDocument->document_type === 'BI' || $userDocument->document_type === 'DIRE'){
if (count($userDocument) === 1) {
//? Retorna a posicao do documentos
$this->deleteImageFile($userDocument[0], 'image_front', '/images/documentos/');
$this->deleteImageFile($userDocument[0], 'image_back', '/images/documentos/');
$this->deleteImageFile($userDocument[0], 'image_selfie', '/images/documentos/');
}
// else {
// //? Retorna a posicao do documentos
// $this->deleteImageFile($userDocument, 'image_front', '/images/documentos/');
// $this->deleteImageFile($userDocument, 'image_selfie', '/images/documentos/');
// }
// return response()->json(['message' => 'Documento Carregado com Sucesso']);
//? Codigo novo ...
$imaliUser = ImaliAccount::query()
->where('user_id', $user->id)
->first();
if (!is_string($imageFront)) return $imageFront;
if (!is_string($imageBack)) return $imageBack;
if (!is_string($imageSelfie)) return $imageSelfie;
if (count($userDocument) == 1) {
UserDocument::query()
->where('user_id', $user->id)->orderBy('id', 'desc')->first()
->where('user_id', $user->id)->first()
->update([
'image_front' => $imageFront,
'image_back' => $imageBack,
'image_selfie' => $imageSelfie,
'status' => 'pending',
'document_type' => strtoupper($request->document_type)
]);
} else {
UserDocument::create([
'image_front' => $imageFront,
'image_back' => $imageBack,
'image_selfie' => $imageSelfie,
'document_type' => strtoupper($request->document_type),
'user_id' => $user->id,
'status' => 'pending',
'imali_account_id' => $imaliUser->id
]);
}
User::query()
->where('id', $request->user()->id)
->update(['info_status' => 1, 'update_info_status' => 'pending']);
$notification = array(
'icon' => 'ic_i_mali_cover',
'title' => 'Actualização Documentos',
'body' => 'Caro cliente, os teus documentos foram submetidos com Sucesso.',
'click_action' => 'com.imali.payapp.payment_NOTICIA',
'color' => '#ffffff'
);
$data = array(
'sms' => 'Parabéns, os teus documentos foram submetidos com Sucesso. Com os documentos actualizados, tens a possibilidade de fazer transacções e pagamentos com montantes maiores. Os teus documentos estão em avaliação e o iMali vai responder o teu pedido em breve. iMali, Diferente Como Tu!',
'route' => 'NOTICIA',
'terminal' => 'firebase'
);
$userData = User::query()
->where('id', $request->user()->id)
->first();
$this->pushNotifification($userData->firebase_token, $notification, $data);
//return response()->json(['message' => 'Documento Carregado com Sucesso']);
return response()->json(['message' => 'Parabéns, os teus documentos foram submetidos com Sucesso. Com os documentos actualizados, tens a possibilidade de fazer transacções e pagamentos com montantes maiores. Os teus documentos estão em avaliação e o iMali vai responder o teu pedido em breve. iMali, Diferente Como Tu!']);
}
//? NOVO CODIGO DE UPDATE DOCUMENT
public function pushNotifification($token, $notification = array(), $data = array())
{
$apiKey = 'AAAA8zVzEPQ:APA91bHl_DXB6UGb_6gZlmFnaLTQoANtX_OBjvl3nOy2bSlnFhxedvk6EhGj7cZoIvmlbKeCnqGxXbuyMH_rEPuhRXvuitXzo6Pfl2TMXLar1PlifXqEhYq6tS55UMrY2Kffzj-P_UH-';
$fields = array('to' => $token, 'notification' => $notification, 'data' => $data);
$headers = array('Authorization: key=' . $apiKey, 'Content-Type: application/json');
$url = 'https://fcm.googleapis.com/fcm/send';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($curl);
curl_close($curl);
return json_decode($result, true);
}
}