• File: StoreController.php
  • Full Path: /var/www/imalipartnersapi/app/Http/Controllers/StoreController.php
  • Date Modified: 02/07/2023 8:01 PM
  • File size: 23.94 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\MerchantContract;
use App\Store;
use App\StoreDevice;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Webpatser\Uuid\Uuid;

class StoreController extends Controller
{

    public function changePassword(Request $request)
    {

        $this->validate($request, [
            'new_password' => ['required', 'min:8', 'confirmed'],
            'new_password_confirmation' => 'required|min:8',
        ], [

                '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'
            ]
        );

        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
            ]);

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


    }

    public function getStoreTransactions($id)
    {
        $payments = Payment::query()
            ->join('users', 'users.id', '=', 'payments.sender_id')
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('payments.store_id', $id)
            ->select('payments.*', 'users.name as client', 'stores.name as store_name')
            ->get();

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

    public function getUser(Request $request)
    {
        $store = Store::query()
            ->join('merchant_accounts', 'merchant_accounts.id', '=', 'stores.merchant_account_id')
            ->join('ramo_activities', 'ramo_activities.id', '=', 'stores.industry_activity')
            ->leftJoin('store_devices', 'store_devices.store_id', '=', 'stores.id')
            ->where('stores.id', $request->user()->id)
            ->select('merchant_accounts.institution as institution_name', 'ramo_activities.nome as industry', 'ramo_activities.nome as category', 'ramo_activities.logo as logo_category', 'stores.*', 'stores.name as institution',
                'store_devices.device_name as storeDeviceName', 'store_devices.status as storeDeviceStatus', 'store_devices.firebase_token as storeDeviceFirebaseToken')
            ->first();

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

    public function getTransactions($id)
    {
        $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')
            ->leftJoin('store_configs', 'store_configs.store_id', '=', 'payments.store_id')
            ->where('stores.id', '=', $id)
            ->whereDate('payments.created_at', '=', date('Y-m-d'))
            ->orderByDesc('payments.created_at')
            ->select('payments.*', 'imali_accounts.account_number as imali_account', 'users.name as username', 'store_configs.use_refund', 'store_configs.use_period')
            ->take(5)
            ->get();

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

    public function getPeriodTransactions(Request $request, $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.id', '=', $request->user()->id)
            ->where('payments.created_at', '>=', $date1)
            ->where('payments.created_at', '<=', $date2)
//            ->whereDate('payments.created_at', '>=',$date1)
//            ->whereDate('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]);
    }

    public function getPeriodTransactionsMerchant($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.id', '=', $storeId)
            ->where('payments.created_at', '>=', $date1)
            ->where('payments.created_at', '<=', $date2)
//            ->whereDate('payments.created_at', '>=',$date1)
//            ->whereDate('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]);
    }

    public function getAllTransactions(Request $request)
    {

        $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', $request->user()->id)
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->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 getClosedTransactions(Request $request)
    {

        $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', $request->user()->id)
            ->whereDate('payments.created_at', $request->date_reference)
            ->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 getDashboard($id)
    {
        $payment = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', $id)
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->count();

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

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

        return response()->json(['amount' => $amount, 'payments' => $payment, 'commission' => $commission]);

    }

    public function getDailyDashboard(Request $request)
    {
        $payment = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', '=', $request->user()->id)
            ->where('payments.payment_type', '=', 'directo')
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->count();

        $countRefund = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', '=', $request->user()->id)
            ->where('payments.payment_type', '=', 'reembolso')
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->count();

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

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

        $commission = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', '=', $request->user()->id)
            ->where('payments.payment_type', '=', 'directo')
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->sum('payments.comissao');

        $feeRefund = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', '=', $request->user()->id)
            ->where('payments.payment_type', '=', 'reembolso')
            ->whereDate('payments.created_at', date('Y-m-d'))
            ->sum('payments.comissao');

        return response()->json([
            'amount' => $amount,
            'payments' => $payment,
            'commission' => $commission,
            'amountRefund' => $amountRefund,
            'feeRefund' => $feeRefund,
            'refunds' => $countRefund
        ]);

    }

    public function getDashboard2(Request $request)
    {
        $payment = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', $request->user()->id)
            ->whereDate('payments.created_at', $request->date_reference)
            ->count();

        $amount = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', $request->user()->id)
            ->whereDate('payments.created_at', $request->date_reference)
            ->sum('payments.amount');

        $comissao = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', $request->user()->id)
            ->whereDate('payments.created_at', $request->date_reference)
            ->sum('payments.comissao');

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

    public function getStoreDayCloses(Request $request)
    {
        $transactions = DayCloseStore::query()
            ->join('stores', 'stores.id', '=', 'day_close_stores.store_id')
            ->select('day_close_stores.*')
            ->where('day_close_stores.store_id', $request->user()->id)
            ->orderByDesc('day_close_stores.created_at')
            ->get();

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

    public function getStoreCloses($store_id)
    {
        $transactions = DayCloseStore::query()
            ->join('stores', 'stores.id', '=', 'day_close_stores.store_id')
            ->select('day_close_stores.*', 'stores.name as store_name')
            ->where('day_close_stores.store_id', $store_id)
            ->orderByDesc('day_close_stores.created_at')
            ->get();

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

    public function getAdminStoresCloses($date1, $date2)
    {
        if ($date1 === 'null' || $date2 === 'null') {

            $transactions = DayCloseStore::query()
                ->join('stores', 'stores.id', '=', 'day_close_stores.store_id')
                ->select('day_close_stores.*', 'stores.name as store_name')
                ->orderByDesc('day_close_stores.created_at')
                ->get();

            return response()->json(['data' => $transactions]);
        } else {

            if ($date1 == $date2) {

                $transactions = DayCloseStore::query()
                    ->join('stores', 'stores.id', '=', 'day_close_stores.store_id')
                    ->select('day_close_stores.*', 'stores.name as store_name')
                    ->whereDate('day_close_stores.created_at', $date1)
                    ->orderByDesc('day_close_stores.created_at')
                    ->get();

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

            } else {
                $transactions = DayCloseStore::query()
                    ->join('stores', 'stores.id', '=', 'day_close_stores.store_id')
                    ->select('day_close_stores.*', 'stores.name as store_name')
                    ->whereDate('day_close_stores.created_at', '>=', $date1)
                    ->whereDate('day_close_stores.created_at', '<=', $date2)
                    ->orderByDesc('day_close_stores.created_at')
                    ->get();

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

        }

    }

    public function getStoresCloses(Request $request)
    {
        $transactions = DayCloseStore::query()
            ->join('stores', 'stores.id', '=', 'day_close_stores.store_id')
            ->select('day_close_stores.*')
            ->orderByDesc('day_close_stores.created_at')
            ->get();

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

    public function getChartDashboard(Request $request)
    {
//        $amount  = Payment::query()
//            ->join('stores', 'stores.id', '=', 'payments.store_id')
//            ->where('stores.id', $request->user()->id)
////            ->whereDate('payments.created_at', date('Y-m-d'))
//            ->where('payments.created_at', 1)
//            ->sum('payments.amount');

        $amount = Payment::query()
            ->join('stores', 'stores.id', '=', 'payments.store_id')
            ->where('stores.id', 1)
//            ->whereDate('payments.created_at', date('Y-m-d'))
            ->whereDay('payments.created_at', 22)
            ->sum('payments.amount');

        $weekMap = [
            0 => 'SU',
            1 => 'MO',
            2 => 'TU',
            3 => 'WE',
            4 => 'TH',
            5 => 'FR',
            6 => 'SA',
        ];
        $dayOfTheWeek = Carbon::now()->dayOfWeek;
        $weekday = $weekMap[$dayOfTheWeek];

        $records = Payment::all();
        $filteredArraySunday = array();
        $filteredArrayMonday = array();
        $filteredArrayTusday = array();
        $filteredArrayWenesday = array();
        $filteredArrayThusday = array();
        $filteredArrayFriday = array();
        $filteredArraySaturday = array();

        foreach ($records as $record) {
            if (Carbon::parse($record->created_at)->dayOfWeek == Carbon::SUNDAY) {
                $filteredArraySunday[] = $record;
            }
            if (Carbon::parse($record->created_at)->dayOfWeek == Carbon::MONDAY) {
                $filteredArrayMonday[] = $record;
            }
            if (Carbon::parse($record->created_at)->dayOfWeek == Carbon::TUESDAY) {
                $filteredArrayTusday[] = $record;
            }
            if (Carbon::parse($record->created_at)->dayOfWeek == Carbon::WEDNESDAY) {
                $filteredArrayWenesday[] = $record;
            }
            if (Carbon::parse($record->created_at)->dayOfWeek == Carbon::THURSDAY) {
                $filteredArrayThusday[] = $record;
            }
            if (Carbon::parse($record->created_at)->dayOfWeek == Carbon::FRIDAY) {
                $filteredArrayFriday[] = $record;
            }
            if (Carbon::parse($record->created_at)->dayOfWeek == Carbon::SATURDAY) {
                $filteredArraySaturday[] = $record;
            }

        }

        return response()->json(['amount' => $amount, $dayOfTheWeek, $weekday, $filteredArrayFriday]);

    }

    public function getStores()
    {
//        $comerciante = Store::query()
//            ->join('ramo_activities', 'ramo_activities.id', '=', 'stores.industry_activity')
//            ->leftJoin('admins', 'admins.id', '=', 'stores.user_id')
////            ->leftJoin('user_clients', 'stores.user_client_id', '=', 'user_clients.id')
//            ->join('merchant_contracts', 'stores.merchant_contract_id', '=', 'merchant_contracts.id')
//            ->join('merchant_accounts', 'stores.merchant_account_id', '=', 'merchant_accounts.id')
//            ->select('stores.*','ramo_activities.nome as ramo', 'admins.name as user_name', 'merchant_contracts.*', 'merchant_accounts.*')
//            ->get();

        $store = Store::query()
            ->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')
            ->leftJoin('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', 'stores.id as id_store')
            ->paginate(10);

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

    public function getStorePayments($datainicial, $datafinal, $id)
    {
        if ($datainicial === $datafinal) {

            $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')
                ->orderBy('payments.created_at', 'desc')
                ->whereDate('payments.created_at', $datafinal)
                ->where('stores.id', $id)
                ->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')
                ->orderBy('payments.created_at', 'desc')
//                ->whereBetween('payments.created_at', [$datainicial, $datafinal])
                ->whereDate('payments.created_at', '>=', $datainicial)
                ->whereDate('payments.created_at', '<=', $datafinal)
                ->where('stores.id', $id)
                ->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 updateStore(Request $request)
    {
        $store = Store::query()->where('id', $request->id)->first();

        if ($store) {

            $store->update([
                'name' => $request->name,
                'nuit' => $request->nuit,
                'nib' => $request->nib,
                'username' => $request->username,
                'address' => $request->address,
                'balance' => 0,
                'manager' => $request->manager,
                'manager_phone_number' => $request->manager_phone_number,
                'mobile_phone' => $request->mobile_phone,
                'email' => $request->email,
                'merchant_account_id' => $request->merchant_account_id,
//                'merchant_contract_id' => $request->merchant_contract_id,
                'industry_activity' => $request->industry_activity,
                'longitude' => $request->longitude,
                'latitude' => $request->latitude,
            ]);

            $contract = MerchantContract::query()->where('id', $store->merchant_contract_id)->first();

            $contract->update([
                'taxa' => $request->taxa,
                'max_balance' => $request->max_balance,
                'nr_transaction' => $request->nr_transaction,
                'status' => 'activo',
                'min_amount' => $request->min_amount,
                'max_amount' => $request->max_amount,
                'use_point' => true,
                'use_point_limit' => $request->use_point_limit,
                'merchant_account_id' => $request->merchant_account_id,
            ]);
            return response()->json(['message' => 'Loja ' . $store->name . ' Actualizada com Sucesso por ' . $request->user()->name]);
        } else {

            return response()->json(['message' => 'Loja Não Encontrada'], 404);
        }
    }

    public function updateFirebaseToken(Request $request)
    {

        $devices = StoreDevice::query()
            ->join('stores', 'stores.id', '=', 'store_devices.store_id')
            ->where('store_devices.store_id', $request->user()->id)
            ->select('store_devices.*')
            ->get();

        if ($devices->count() === 0) {

            StoreDevice::create([
                'device_name' => $request->device_name,
                'firebase_token' => $request->firebase_token,
                'store_id' => $request->user()->id
            ]);
            return response()->json(['message' => 'Token Gerado com Sucesso']);


        } else {

            $devicesCheck = StoreDevice::query()
                ->join('stores', 'stores.id', '=', 'store_devices.store_id')
                ->where('store_devices.store_id', $request->user()->id)
                ->where('store_devices.firebase_token', $request->firebase_token)
                ->select('store_devices.*')
                ->first();

            if ($devicesCheck) {

            } else {
                StoreDevice::create([
                    'device_name' => $request->device_name,
                    'firebase_token' => $request->firebase_token,
                    'store_id' => $request->user()->id
                ]);
                return response()->json(['message' => 'Token Gerado com Sucesso']);
            }

        }

    }

    public function updateStoreImage(Request $request)
    {
        $this->validate($request, [
            'imagem' => 'required'
        ]);

//        $data = new Store();
        $store = Store::query()->where('id', $request->id)->first();

        if ($store) {

            if ($request->file('imagem')) {
                $file = $request->file('imagem');
                $filename = date('YmdHi') . $store->id . $file->getClientOriginalName();
                $file->move(public_path('/images/comerciante/logo'), $filename);
//            $data['logo'] = $filename;
//            $data['photo'] = $filename;
                $store->update([
                    'logo' => url('/') . '/images/comerciante/logo/' . $filename,
                    'photo' => url('/') . '/images/comerciante/logo/' . $filename
                ]);
            }
//        $data->save();

            return response()->json(['message' => 'Actualizado com sucesso']);

        } else {
            return response()->json(['message' => 'Loja invalida'], 400);
        }


    }


}