<?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\ImaliSubAccount; use App\Store; use App\StoreDevice; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Http; 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 getUserStore(Request $request) { $store = Store::query() ->leftJoin('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) ->where('stores.id', $request->store_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 getTransactionsStore(Request $request) { $size = $request->per_page ?? 5; $payment = Payment::query() ->join('stores', 'stores.id', 'payments.store_id') ->where('stores.id', $request->store_id) ->whereDate('payments.created_at', date('Y-m-d')) ->orderByDesc('payments.created_at') ->select( 'payments.id', 'payments.transaction_id as reference', 'payments.source as serviceName', 'payments.sender_account_number as clientNumber', 'payments.amount as amount', 'payments.created_at as date', 'payments.estado as status' ) // ->take(5) // ->get(); ->paginate($size); return response()->json(['data' => $payment]); // return response()->json($payment); } // todo -- 15-Setembro-2024 public function subAccountReport() { $subaccounts = ImaliSubAccount::query() ->leftJoin('users', 'users.id', 'imali_sub_accounts.user_id') ->select('imali_sub_accounts.*', 'users.email', 'users.name as username') ->where('balance', '<=', 300) ->get(); foreach ($subaccounts as $subaccount) { $message = 'Sr/a ' . $subaccount->username . ' a tua subconta ' . $subaccount->name . ' de número ' . $subaccount->card_number . ' está com saldo ' . $subaccount->balance . ', abaixo de 300MZN. Por favor recarregue para evitar questões de dívida.'; $is_sent = $this->sendEmail([$subaccount->email], $message); if ($is_sent) continue; } return response()->json(['message' => 'Email enviado com sucesso.']); } protected $portAppNotification = 3001; // todo -- 15-Setembro-2024 private function sendEmail($emails, $message) { $response = Http::post('http://localhost:' . $this->portAppNotification . '/api/send/email', [ 'messageType' => 'text', 'to' => $emails, 'from' => 'ivo.naftal@paytek-africa.com', 'subject' => 'Aviso de Saldo', 'message' => $message, ]); if ($response->status() == 200) { return true; } else { return false; } } 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(Request $request) { $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() ->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.*', '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', 'merchant_accounts.name as merchant_name', 'stores.name as store_name', 'stores.id as id_store' ) ->orderBy($orderBy, $orderType) ->paginate($perPage); // return response()->json(['data' => $store]); return response()->json(['data' => $stores], 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); } } }