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