• File: UserDocumentController.php
  • Full Path: /var/www/imaliapi/app/Http/Controllers/UserDocumentController.php
  • Date Modified: 07/15/2025 4:35 PM
  • File size: 23.99 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?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);
    }
}