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