• File: BusinessController.php
  • Full Path: /var/www/imaliapi/app/Http/Controllers/BusinessController.php
  • Date Modified: 11/26/2025 7:23 PM
  • File size: 9.72 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\BusinessLogin;
use App\Imali\BusinessAccount;
use App\Store;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
use Illuminate\Validation\Rule;
use Laravel\Passport\Client;

class BusinessController extends Controller
{

    private $client;

    public function __construct()
    {
        $this->client = Client::find(27);
    }

    public function login(Request $request)
    {
        $this->validate($request, [
            'username' => 'required',
            'password' => 'required'
        ], [
            'username.required' => 'O Campo username é Obrigatório',
            'password.required' => 'O Campo Senha é Obrigatório',
        ]);

        $params = [
            'grant_type' => 'password',
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,
            'username' => request('username'),
            'password' => request('password'),
            'provider' => 'users',
            'scope' => '*'
        ];

        // return $request->username . ' ' . $request->password . ' ' . $params['client_id'];

        $request->request->add($params);

        Config::set('auth.guards.business-api.provider', $params['provider']);

        $proxy = Request::create('oauth/token', 'POST');

        return Route::dispatch($proxy);
    }

    // Get Authenticated User
    public function getUserBKP()
    {
        return response()->json(User::getUserAccount());
    }

    // Get Authenticated User
    public function getUser()
    {
        $user_business = auth()->user();
        $user_business['business'] = BusinessAccount::find($user_business->business_accounts_id);
        $user_business['user'] = User::find($user_business->user_id);
        return response()->json($user_business);
    }

    // todo 20/10/2025
    public function changePassword(Request $request)
    {
        $this->validate(
            $request,
            [
                'new_password' => ['required', 'min:8', 'confirmed'],
                'new_password_confirmation' => 'required|min:8',
                'name' => 'required',
                'last_name' => 'required',
                'email' => 'required',
                'username' => 'required|string|unique:business_logins,username',
            ],
            [

                'new_password.required' => 'O Campo Nova Senha é Obrigatório',
                'new_password_confirmation.required' => 'O Campo Confirmar Senha é Obrigatório',
                'new_password.confirmed' => 'Senhas incompatíveis',
                'new_password.min' => 'A senha deve ter 8 digitos no mínimo',
                'new_password_confirmation.min' => 'A senha deve ter 8 digitos no mínimo',

                'name.required' => 'O Campo Name é Obrigatório',
                'last_name.required' => 'O Campo Last_name é Obrigatório',
                'email.required' => 'O Campo email é Obrigatório',
                'username.required' => 'O Campo username é Obrigatório',
                'username.unique' => 'Este nome de utilizador já está em uso.',
            ]
        );

        if (Hash::check($request->new_password, $request->user()->password)) {

            return response()->json(['message' => 'Não deve usar a senha anterior'], 400);
        } else {
            // $request->user()->update([
            //     'password' => bcrypt($request->new_password),
            //     'session_status' => 1
            // ]);

            $user_id = auth()->user()->id;
            $business_login = BusinessLogin::find($user_id);

            if (!$business_login) return response()->json(['message' => 'Utilizador não autorizado'], 400);

            $business_login->password = Hash::make($request->new_password);
            $business_login->session_status = 1;
            $business_login->name = $request->name;
            $business_login->username = $request->username;
            $business_login->last_name = $request->last_name;
            $business_login->email = $request->email;
            $business_login->save();

            return response()->json(['message' => 'Senha Actualizada Com Sucesso!'], 200);
        }
    }

    public function changePasswordIDEA(Request $request)
    {
        $user = auth()->user();

        if (!$user) {
            return response()->json(['message' => 'Utilizador não autorizado'], 401);
        }

        // Validação condicional
        $rules = [];
        $messages = [];

        // Se a senha estiver sendo alterada
        if ($request->filled('new_password') || $request->filled('new_password_confirmation')) {
            $rules['new_password'] = ['required', 'min:8', 'confirmed'];
            $rules['new_password_confirmation'] = ['required', 'min:8'];

            $messages = array_merge($messages, [
                'new_password.required' => 'O Campo Nova Senha é Obrigatório',
                'new_password.min' => 'A senha deve ter 8 dígitos no mínimo',
                'new_password.confirmed' => 'Senhas incompatíveis',
                'new_password_confirmation.required' => 'O Campo Confirmar Senha é Obrigatório',
                'new_password_confirmation.min' => 'A senha deve ter 8 dígitos no mínimo',
            ]);
        }

        // Se o nome estiver sendo alterado
        if ($request->filled('name')) {
            $rules['name'] = 'required|string';
            $messages['name.required'] = 'O Campo Nome é Obrigatório';
        }

        // Se o último nome estiver sendo alterado
        if ($request->filled('last_name')) {
            $rules['last_name'] = 'required|string';
            $messages['last_name.required'] = 'O Campo Apelido é Obrigatório';
        }

        // Se o e-mail estiver sendo alterado
        if ($request->filled('email')) {
            $rules['email'] = 'required|email';
            $messages['email.required'] = 'O Campo Email é Obrigatório';
        }

        // Se o username estiver sendo alterado
        if ($request->filled('username')) {
            $rules['username'] = [
                'required',
                'string',
                Rule::unique('business_logins', 'username')->ignore($user->id)
            ];
            $messages['username.required'] = 'O Campo Username é Obrigatório';
            $messages['username.unique'] = 'Este nome de utilizador já está em uso.';
        }

        // Caso nenhum campo seja enviado
        if (empty($rules)) {
            return response()->json(['message' => 'Nenhuma alteração detectada.'], 400);
        }

        // Validar apenas os campos enviados
        $validated = $request->validate($rules, $messages);

        $business_login = \App\BusinessLogin::find($user->id);

        // return $business_login;

        if (!$business_login) {
            return response()->json(['message' => 'Utilizador não autorizado'], 401);
        }

        // Atualizar apenas os campos presentes no request
        foreach ($validated as $key => $value) {
            if ($key === 'new_password' || $key === 'new_password_confirmation') continue;
            $business_login->$key = $value;
        }

        // Se o utilizador quiser alterar a senha
        if ($request->filled('new_password')) {
            if (Hash::check($request->new_password, $business_login->password)) {
                return response()->json(['message' => 'Não deve usar a senha anterior'], 400);

                Log::warning("Conta business de ID: {$business_login->name}, Last Name: {$business_login->last_name}, Email:{$business_login->email} reutilizou a senha anterior.");
            }

            $business_login->password = Hash::make($request->new_password);
            $business_login->session_status = 1;
        }

        $business_login->save();

        return response()->json(['message' => 'Alterações salvas com sucesso!'], 200);
    }


    // LOJAS CONTA EMPRESA
    public function getAllStores(Request $request)
    {
        // $profile = User::getUserDetails(auth()->user()->id)->profile;
        // $u1 = BusinessLogin::find(auth()->user()->id);
        // if (!$u1) return ['data' => []];

        // $business = BusinessAccount::find($u1->business_accounts_id);
        // if (!$business) return ['data' => []];

        $user = User::getUserDetails(auth()->user()->user_id)->account_id;

        $perPage = !!$request->input('per_page') ? $request->input('per_page') : 10;
        $orderType = $request->input('order_type') === 'ASC' ? 'ASC' : 'DESC';
        $orderBy = !!$request->input('order_by') && $request->input('order_by') !== 'null' ? $request->input('order_by') : 'stores.id';

        $stores = Store::query()
            // ->join('users', 'users.id', '=', 'stores.user_id')
            ->join('ramo_activities', 'ramo_activities.id', '=', 'stores.industry_activity')
            ->join('merchant_contracts', 'stores.merchant_contract_id', '=', 'merchant_contracts.id')
            ->select(
                'stores.*',
                'ramo_activities.nome as industry',
                'merchant_contracts.id as merchant_contract_id',
                'merchant_contracts.taxa',
                'merchant_contracts.max_balance',
                'merchant_contracts.nr_transaction',
                'merchant_contracts.min_amount',
                'merchant_contracts.max_amount',
                'merchant_contracts.use_point_limit',
                'stores.name as store_name',
                'stores.id as id_store'
            )
            // ->where('users.profile', $profile)
            ->where('stores.business_account_id', $user)
            ->orderBy($orderBy, $orderType)
            ->paginate($perPage);

        return response()->json(['data' => $stores], 200);
    }
}