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