• File: MoneyRequestController.php
  • Full Path: /var/www/sandbox/app/Http/Controllers/MoneyRequestController.php
  • Date Modified: 04/29/2025 10:04 PM
  • File size: 13.73 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\Classes\PushNotification;
use App\Classes\TransactionGeneration;
use App\Imali\BusinessAccount;
use App\Imali\ImaliAccount;
use App\MoneyRequest;
use App\User;
use App\UserMoneyRequest;
use Google\Client as GoogleClient;
use Illuminate\Http\Request;

class MoneyRequestController extends Controller
{
    public function getPedido($id, $clientId)
    {
        $pedidos = MoneyRequest::query()
            //            ->join('users', 'users.id', '=', 'money_requests.user_id')
            ->join('user_money_requests', 'user_money_requests.money_request_id', '=', 'money_requests.id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'user_money_requests.user_id')
            //            ->join('imali_accounts as imali_accounts_clients', 'imali_accounts_clients.user_id', '=', 'user_money_requests.user_id')
            ->join('imali_accounts as imali_accounts_clients', 'imali_accounts_clients.user_id', '=', 'user_money_requests.client_id')
            ->join('users as client', 'client.id', '=', 'user_money_requests.client_id')
            //            ->join('users as client', 'client.id', '=', 'user_money_requests.user_id')
            //            ->where('user_money_requests.user_id', $request->user()->id)
            ->where('money_requests.id', $id)
            ->where('user_money_requests.user_id', $clientId)
            ->select('money_requests.*', 'client.name', 'client.phone', 'imali_accounts_clients.account_number', 'user_money_requests.user_status')
            //                ->select('money_requests.*', 'user_money_requests.user_status')
            ->orderByDesc('money_requests.created_at')
            ->first();

        return response()->json($pedidos);
    }

    public function getMeusPedidos(Request $request)
    {

        //        $pedidos = MoneyRequest::query()
        //            ->join('users', 'users.id', '=', 'money_requests.user_id')
        //            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'money_requests.user_id')
        //            ->join('imali_accounts as imali_accounts_clients', 'imali_accounts_clients.user_id', '=', 'money_requests.client_id')
        //            ->join('users as client', 'client.id', '=', 'money_requests.client_id')
        //            ->where('money_requests.user_id', $request->user()->id)
        //            ->select('money_requests.*', 'client.name', 'client.phone', 'imali_accounts_clients.account_number')
        //            ->orderByDesc('money_requests.created_at')
        //            ->get();
        $size = (!request()->per_page) ? 4 : request()->per_page;

        $pedidos = MoneyRequest::query()
            //            ->join('users', 'users.id', '=', 'money_requests.user_id')
            ->join('user_money_requests', 'user_money_requests.money_request_id', '=', 'money_requests.id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'user_money_requests.user_id')
            //            ->join('imali_accounts as imali_accounts_clients', 'imali_accounts_clients.user_id', '=', 'user_money_requests.user_id')
            ->join('imali_accounts as imali_accounts_clients', 'imali_accounts_clients.user_id', '=', 'user_money_requests.client_id')
            ->join('users as client', 'client.id', '=', 'user_money_requests.client_id')
            //            ->join('users as client', 'client.id', '=', 'user_money_requests.user_id')
            ->where('user_money_requests.user_id', $request->user()->id)
            ->select('money_requests.*', 'client.name', 'client.phone', 'imali_accounts_clients.account_number', 'user_money_requests.user_status')
            //                ->select('money_requests.*', 'user_money_requests.user_status')
            ->orderByDesc('money_requests.created_at')
            // ->get();
            ->paginate($size);

        return response()->json($pedidos, 200);


        //return response()->json(['data' => $pedidos]);
    }

    public function requestMoney(Request $request)
    {
        $client = User::query()->where('phone', $request->phone)->first();
        $token = new TransactionGeneration();
        $imali = ImaliAccount::query()->where('user_id', $request->user()->id)->first();

        if (!$imali) {
            $imali = BusinessAccount::query()
                ->where('user_id', $request->user()->id)
                ->first();
        }

        $response = MoneyRequest::create([
            'transaction' => $token->generateTransaction(),
            'amount' => $request->amount,
            'fee' => 0,
            'description' => $request->description,
            'user_id' => $request->user()->id,
            'client_id' => $client->id,
            //'user_id' => $client->id,
            //'client_id' => $request->user()->id,
            'status' => 'pendente'
        ]);
        //        MoneyRequest::create([
        //            'transaction' => $token->generateTransaction(),
        //            'amount' => $request->amount,
        //            'fee' => 0,
        //            'status_user' => 'receptor',
        //            'description' => $request->description,
        //            'user_id' => $client->id,
        //            'client_id' => $request->user()->id
        //        ]);

        UserMoneyRequest::create([
            'user_status' => 'remetente',
            'user_id' => $request->user()->id,
            'fee' => 0,
            'money_request_id' => $response->id,
            'client_id' => $client->id
        ]);

        UserMoneyRequest::create([
            'user_status' => 'receptor',
            'user_id' => $client->id,
            'fee' => 0,
            'money_request_id' => $response->id,
            'client_id' => $request->user()->id
        ]);


        // notificar o utilizador que fez o pagamento
        $push_userPayer = new PushNotification(
            'Pedido ' . $request->amount . ' MT',
            $request->user()->name . ' pediu ' . $request->amount . ' MT',
            $client->firebase_token,
            'com.imali.payapp.payment_PAGAR_NOTIFICATION'
        );


        // $notification = array(
        //     'icon' => 'ic_i_mali_cover',
        //     'title' => 'Pedido ' . $request->amount . ' MT',
        //     'body' => $request->user()->name . ' pediu ' . $request->amount . ' MT',
        //     'click_action' => 'com.imali.payapp.payment_TARGET_NOTIFICATION',
        //     'color' => '#008577'
        // );

        $data = array(
            'id' => $response->id,
            'client_id' => $client->id,
            'cliente' => $response->user_id,
            'name' => $request->user()->name,
            'amount' => $response->amount,
            'user_id' => $request->user()->id,
            'account_number' => $imali->account_number,
            'phone' => $request->user()->phone,
            'description' => $response->description,
            'status' => $response->status,
            'route' => 'TARGET_NOTIFICATION',
            'createdAt' => $response->created_at,
            'updatedAt' => $response->updated_at,
            'terminal' => 'firebase'
        );

        // $this->pushNotifification($client->firebase_token, $notification, $data);
        $push_userPayer->sendPush($data);

        return response()->json(['message' => 'Pedido de dinheiro enviado com Sucesso', 'transaction' => $response->transaction]);
    }

    public function recusarPedido(Request $request)
    {
        $moneyRequest = MoneyRequest::find($request->id);

        $imali = ImaliAccount::query()
            ->where('user_id', $moneyRequest->user_id)
            ->first();

        if (!$imali) {
            $imali = BusinessAccount::query()
                ->where(
                    'user_id',
                    $moneyRequest->user_id
                )
                ->first();
        }

        if ($moneyRequest) {
            $moneyRequest->update([
                'status' => 'recusado'
            ]);

            $notification = array(
                //                'icon' => 'ic_i_mali_cover',
                'icon' => 'ic_imali_logo_verde_01',
                'title' => 'Pedido Recusado',
                'body' => $request->user()->name . ' recusou o seu pedido de ' . $moneyRequest->amount . ' MT',
                //                'click_action' => 'com.imali.payapp.payment_TARGET_NOTIFICATION',
                'click_action' => 'com.imali.payapp.payment_NOTICIA',
                //                'color' => '#008577'
                'color' => '#fff'
            );


            $data = array(
                'id' => $moneyRequest->id,
                'name' => $request->user()->name,
                'client_id' => $request->client_id,
                'user_id' => $imali->id,
                'amount' => $moneyRequest->amount,
                'account_number' => $imali->account_number,
                'sms' => $request->user()->name . ' recusou o seu pedido de ' . $moneyRequest->amount . ' MT',
                'phone' => $request->user()->phone,
                'description' => $moneyRequest->description,
                'route' => 'NOTICIA',
                'terminal' => 'firebase'
            );

            // notificar o utilizador que fez o pagamento
            $push_userPayer = new PushNotification(
                'Pedido Recusado',
                $request->user()->name . ' recusou o seu pedido de ' . $moneyRequest->amount . ' MT',
                $imali->firebase_token,
                'com.imali.payapp.payment_PAGAR_NOTIFICATION'
            );


            $clientUser = User::find($moneyRequest->user_id);
            $this->pushNotifification($clientUser->firebase_token, $notification, $data);
            // $push_userPayer->sendPush($data);

            return response()->json(['message' => 'Pedido Recusado com Sucesso '], 200);
        }
    }

    // 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);
    // }

    private function getAccessToken()
    {
        $client = new GoogleClient();
        // $client->setAuthConfig(storage_path('app/imaliapp-5155e-firebase-adminsdk-gv3wp-2713d42c5b.json')); // Caminho do arquivo JSON da conta de serviço
        $client->setAuthConfig($this->getFirebaseAuthConf()); // Caminho do arquivo JSON da conta de serviço
        $client->addScope($_ENV['FIREBASE_MESSAGE_SCOPE']);
        $client->setAccessType('offline');

        $token = $client->fetchAccessTokenWithAssertion();
        return $token['access_token'];
    }

    private function getFirebaseAuthConf()
    {
        return [
            "type" => $_ENV['TYPE'],
            "project_id" => $_ENV['PROJECT_ID'],
            "private_key_id" => $_ENV['PRIVATE_KEY_ID'],
            "private_key" => $_ENV['PRIVATE_KEY'],
            "client_email" => $_ENV['CLIENT_EMAIL'],
            "client_id" => $_ENV['CLIENT_ID'],
            "auth_uri" => $_ENV['AUTH_URI'],
            "token_uri" => $_ENV['TOKEN_URI'],
            "auth_provider_x509_cert_url" => $_ENV['AUTH_PROVIDER_X509_CERT_URL'],
            "client_x509_cert_url" => $_ENV['CLIENT_X509_CERT_URL'],
            "universe_domain" => $_ENV['UNIVERSE_DOMAIN']
        ];
    }

    public function pushNotifification($token, $notification = array(), $data = array())
    {
        $fields = [
            'message' => [
                'token' => $token,
                'android' => [
                    'notification' => $notification
                ],
                "apns" => [
                    "payload" => [
                        "aps" => [
                            "category" => "NEW_MESSAGE_CATEGORY"
                        ]
                    ]
                ],
                'data' => $this->convert_array_values_to_string($data) ?? [],
            ]
        ];

        $headers = array('Authorization: Bearer ' . $this->getAccessToken(), 'Content-Type: application/json');
        $url = $_ENV['FIREBASE_NEW_URL'];

        $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);
    }

    private function convert_array_values_to_string($array)
    {
        return array_map(function ($value) {
            return (string) $value; // Convert each value to a string
        }, array_combine(array_map('strval', array_keys($array)), $array));
    }
}