• File: MerchantController.php.save
  • Full Path: /var/www/imaliapi/app/Http/Controllers/MerchantController.php.save
  • Date Modified: 04/15/2024 8:53 PM
  • File size: 17.45 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Http\Controllers;

use App\Bank\Payment;
use App\Classes\CurrentPassword;
use App\Classes\TransactionGeneration;
use App\DayCloseStore;
use App\Imali\ImaliAccount;
use App\Imali\MerchantAccount;
use App\PeriodCloseStore;
use App\Store;
use App\StoreConfig;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class MerchantController extends Controller
{
    public function changePassword(Request $request) {

        $this->validate($request, [
            'current_password' => ['required', new CurrentPassword()],
            'new_password' => ['required', 'min:8', 'confirmed'],
            'new_password_confirmation' => 'required|min:8',
        ], [
                'current_password.required' => 'O Campo Senha Actual é Obrigatório',
                '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',
                'current_password.min' => 'A senha deve ter 8 digitos no mínimo',
                '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'
            ]
        );


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

            $request->user()->update([
                'password' => bcrypt($request->new_password),
                'session_status' => 1
            ]);

            return response()->json(['message' => trans('updated_successfully')]);
        } else {
            return response()->json(['message' => trans('invalid_old_password')], 400);
        }
    }

    public function getAccountNumber(Request $request)
    {
        $query=$request->route('query');
        $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'):'imali_accounts.id';

        $users = User::query()
            ->join('imali_accounts', 'users.id', '=', 'imali_accounts.user_id')
            ->join('imali_account_configs', 'imali_account_configs.id', '=', 'imali_accounts.imali_account_config')
            ->where('imali_accounts.account_number', 'like', '%' . $query . '%')
             ->orWhere('users.name', 'like', '%' . $query . '%')
             ->orWhere('users.last_name', 'like', '%' . $query . '%')
            ->orWhere('imali_accounts.reference', 'like', '%' . $query . '%')
            ->orderBy($orderBy,$orderType)
            ->select('imali_accounts.*', 'imali_account_configs.level', 'users.*')
           ->paginate($perPage);

         $imali = $users->setCollection($users->getCollection()
                 ->transform(function($item) {
                    $item['last_recharge']=$item->imaliAccount->recharges()->orderBy('id','desc')->first();
                    $item['document']= $item->documents()->where('status','=','actualizado')->orderBy('id','desc')->first();
                    return $item;
         }));

        $imali->makeHidden([
          'password', 'pin', 'imali_account_config', 'document_id', 'profile', 'remember_token', 'firebase_token'
        ]);

        return response()->json($imali);


    public function getStoreAccount($query)
    {
        $user = Store::query()
//            ->with(['documents'])
            ->join('merchant_accounts', 'merchant_accounts.id', '=', 'stores.merchant_account_id')
            ->where('stores.account_number', 'like', '%' . $query . '%')
            ->orWhere('stores.name', 'like', '%' . $query . '%')
//            ->orWhere('users.last_name', 'like', '%' . $query . '%')
//            ->orWhere('imali_accounts.reference', 'like', '%' . $query . '%')
            ->select('stores.*', 'merchant_accounts.name as merchant_name',
                'merchant_accounts.institution as merchant_company_name')
            ->paginate(10);

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

    public function getMerchantAccount($query)
    {
        $user = MerchantAccount::query()
//            ->with(['documents'])
//            ->join('merchant_accounts', 'merchant_accounts.id', '=', 'stores.merchant_account_id')
            ->where('account_number', 'like', '%' . $query . '%')
            ->orWhere('name', 'like', '%' . $query . '%')
//            ->orWhere('users.last_name', 'like', '%' . $query . '%')
//            ->orWhere('imali_accounts.reference', 'like', '%' . $query . '%')
            ->paginate(10);

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

    public function loggedUser(Request $request)
    {
        return response()->json($request->user());
    }

    public function getMerchantDashboard(Request $request)
    {
//        $dashboard = Payment::query()
//            ->whereDate('created_at', date('Y-m-d'))
//            ->sum('amount_credited');

        $amount = Store::query()
            ->join('payments', 'payments.store_id', '=', 'stores.id')
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->where('stores.merchant_account_id', $request->user()->id)
            ->sum('payments.amount');

//        $amount = Store::query()
//            ->join('payments', 'payments.store_id', '=', 'stores.id')
//            ->whereDate('payments.created_at', date('Y-m-d'))
//            ->where('stores.merchant_account_id', $request->user()->id)
//            ->count('payments.amount');
        $payments = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.merchant_account_id', $request->user()->id)
            ->distinct()
            ->count();

        $amountCredited = Store::query()
            ->join('payments', 'payments.store_id', '=', 'stores.id')
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->where('stores.merchant_account_id', $request->user()->id)
            ->sum('payments.amount_credited');

        $lojas = Store::query()
            ->where('stores.merchant_account_id', $request->user()->id)
            ->count();

        return response()->json([
            'amount' => $amount,
            'amountCredited' => $amountCredited,
            'payments' => $payments,
            'stores' => $lojas
        ]);
    }

    public function getStoreDashboard($storeId)
    {

        $payments = Payment::query()
            ->where('store_id', $storeId)
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->count();


        $amount = Payment::query()
            ->where('store_id', $storeId)
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->sum('amount');

        $amountCredited = Payment::query()
            ->where('store_id', $storeId)
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->sum('amount_credited');


        $comissao = Payment::query()
            ->where('store_id', $storeId)
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->sum('comissao');


        return response()->json([
            'amount' => $amount,
            'amountCredited' => $amountCredited,
            'payments' => $payments,
            'comissao' => $comissao
        ]);
    }

    public function getImaliAccount($accountNumber)
    {
        $account = ImaliAccount::query()
            ->join('users', 'users.id', '=', 'imali_accounts.user_id')
            ->where('imali_accounts.account_number', $accountNumber)
            ->select('users.name', 'imali_accounts.account_number', 'imali_accounts.reference')
            ->first();


        if ($account) {
            return response()->json($account);
        } else {
            return response()->json(['message' => trans('invalid_imali_account')], 400);
        }


    }

    public function getPeridos(Request $request)
    {
//        $closes = DayCloseStore::query()

        $closes = Store::query()
            ->join('day_close_stores', 'day_close_stores.store_id', '=', 'stores.id')
            ->where('stores.merchant_account_id', $request->user()->id)
            ->select('day_close_stores.*', 'stores.name as store_name', 'stores.account_number')
            ->get();

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

    public function getPeridosLoja(Request $request, $storeId)
    {

        $closes = Store::query()
            ->join('day_close_stores', 'day_close_stores.store_id', '=', 'stores.id')
            ->where('stores.merchant_account_id', $request->user()->id)
            ->where('stores.id', $storeId)
            ->select('day_close_stores.*', 'stores.name as store_name', 'stores.account_number')
            ->get();

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

    public function getPagamentosPeriodoLoja(Request $request, $storeId, $dateReference)
    {
        $payment = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'payments.sender_id')
            ->where('stores.id', $storeId)
            ->whereDate('payments.created_at', $dateReference)
            ->orderByDesc('payments.created_at')
            ->select('payments.*', 'imali_accounts.account_number as imali_account', 'users.name as username')
            ->get();

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

    public function refundCustomer(Request $request)
    {
        $this->validate($request, [
            'transaction' => 'required',
            'amount' => 'required',
            'description' => 'required',
            'account_number' => 'required',
            'merchant_id' => 'required',
            'imali_user_id' => 'required',
            'store_id' => 'required',
            'user_client_id' => 'required',
            'password' => 'required'
        ], [
            'transaction.required' => 'O Campo transaction é de carácter Obrigatório',
            'amount.required' => 'O Campo transaction é de carácter Obrigatório',
            'description.required' => 'O campo description é obrigatório',
            'account_number.required' => 'O campo account_number é obrigatório',
            'merchant_id.required' => 'O campo merchant_id é obrigatório',
            'imali_user_id.required' => 'O campo imali_user_id é obrigatório',
            'store_id.required' => 'O campo imali_user_id é obrigatório',
            'user_client_id.required' => 'O campo imali_user_id é obrigatório',
        ]);


    }

    public function getMerchantStores(Request $request)
    {
        $store = Store::query()
            ->where('stores.merchant_account_id', $request->user()->id)
            ->leftJoin('admins', 'admins.id', '=', 'stores.user_id')
            ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'stores.industry_activity')
            ->leftJoin('merchant_contracts', 'stores.merchant_contract_id', '=', 'merchant_contracts.id')
            ->join('merchant_accounts', 'stores.merchant_account_id', '=', 'merchant_accounts.id')
            ->select('stores.*', 'admins.name as username', 'ramo_activities.nome as industry', 'merchant_contracts.*', 'merchant_accounts.name as merchant_name', 'stores.name as store_name')
            ->get();

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

    public function getAllStores(Request $request)
    {
        $store = Store::query()
//            ->where('stores.merchant_account_id', $request->user()->id)
            ->leftJoin('admins', 'admins.id', '=', 'stores.user_id')
            ->leftJoin('ramo_activities', 'ramo_activities.id', '=', 'stores.industry_activity')
            ->leftJoin('merchant_contracts', 'stores.merchant_contract_id', '=', 'merchant_contracts.id')
            ->join('merchant_accounts', 'stores.merchant_account_id', '=', 'merchant_accounts.id')
            ->select('stores.name', 'stores.address', 'stores.longitude', 'stores.latitude', 'stores.mobile_phone')
            ->get();

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

    public function getPayments(Request $request)
    {
        $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('stores', 'stores.id', 'payments.store_id')
            ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
            ->where('stores.merchant_account_id', $request->user()->id)
            ->orderBy('payments.created_at', 'desc')
            ->select('payments.*', 'users.name as client_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account')
            ->get();

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

    public function getPaymentsWithDate(Request $request, $date1 , $date2)
    {
        if ($date1 === $date2) {

            $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id')
                ->join('stores', 'stores.id', 'payments.store_id')
                ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
                ->where('stores.merchant_account_id', $request->user()->id)
                ->whereDate('payments.created_at', '=', date('y-m-d'))
                ->orderBy('payments.created_at', 'desc')
                ->select('payments.*', 'users.name as client_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account')
                ->get();

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

        } else {
            $payments = Payment::query()->join('users', 'users.id', '=', 'payments.sender_id')
                ->join('stores', 'stores.id', 'payments.store_id')
                ->join('imali_accounts', 'imali_accounts.user_id', 'payments.sender_id')
                ->where('stores.merchant_account_id', $request->user()->id)
                ->where('payments.created_at', '>=', $date1)
                ->where('payments.created_at', '<=', $date2)
                ->orderBy('payments.created_at', 'desc')
                ->select('payments.*', 'users.name as client_name', 'stores.name as merchant_name', 'stores.account_number as merchant_account', 'imali_accounts.account_number as client_account')
                ->get();

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

    }

    public function getStorePeriods(Request $request, $storeId, $page)
    {
//        if ($page <= 0)
//            $page = 10;
//        elseif ($page == null || $page == "") {
//            $page = 10;
//        }
        $transactions = PeriodCloseStore::query()
            ->join('stores', 'stores.id', '=', 'period_close_stores.store_id')
            ->select('period_close_stores.*')
            ->where('period_close_stores.store_id', '=', $storeId)
            ->where('stores.merchant_account_id', '=', $request->user()->id)
            ->where('period_close_stores.status', '=', 'fechado')
            ->orderByDesc('period_close_stores.created_at')
            ->paginate(20);

        $lastPeriod = PeriodCloseStore::query()
            ->leftJoin('stores', 'stores.id', '=', 'period_close_stores.store_id')
            ->select('period_close_stores.*')
            ->where('period_close_stores.store_id', '=', $storeId)
            ->where('stores.merchant_account_id', '=', $request->user()->id)
            ->get()->last();

        $storeConfig = StoreConfig::query()
            ->where('store_id', '=', $storeId)
            ->first();


        if ($storeConfig) {
            $storeConfig->makeHidden(['id', 'store_id']);

            if (!$lastPeriod) {
                return response()->json(['data' => $transactions, 'lastPeriod' => null, 'storeConfig' => $storeConfig]);
            } else {
                return response()->json(['data' => $transactions, 'lastPeriod' => $lastPeriod, 'storeConfig' => $storeConfig]);
            }
        } else {
            if (!$lastPeriod) {
                return response()->json(['data' => $transactions, 'lastPeriod' => null, 'storeConfig' => null]);
            } else {
                return response()->json(['data' => $transactions, 'lastPeriod' => $lastPeriod, 'storeConfig' => null]);
            }
        }
    }

    public function getPeriodTransactions(Request $request, $storeId, $date1, $date2) {

        $payment = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('imali_accounts', 'imali_accounts.user_id', '=', 'payments.sender_id')
            ->where('stores.merchant_account_id', '=', $request->user()->id)
            ->where('stores.id', '=', $storeId)
            ->where('payments.created_at', '>=', $date1)
            ->where('payments.created_at', '<=', $date2)
            ->orderByDesc('payments.created_at')
            ->select('payments.*', 'imali_accounts.account_number as imali_account', 'users.name as username')
            ->get();

        return response()->json(['data' => $payment]);

    }
}