AdminController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\PaymentMethod;
  4. use App\Models\FinancialTransaction;
  5. use App\Models\PromoCode;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\Cookie;
  8. use App\Models\User;
  9. use App\Models\StoreOrder;
  10. use App\Http\Services\EmailService;
  11. use App\Models\AppSession;
  12. use App\Models\AppUserTransaction;
  13. use App\Models\Message;
  14. use App\Models\UserEvent;
  15. use Barryvdh\DomPDF\Facade\Pdf;
  16. use OpenTok\MediaMode;
  17. use OpenTok\OpenTok;
  18. class AdminController extends Controller
  19. {
  20. protected $emailService;
  21. public function __construct(EmailService $emailService)
  22. {
  23. parent::__construct();
  24. $this->emailService = $emailService;
  25. }
  26. public function dashboard(Request $request)
  27. {
  28. $ordersTotal = $this->getOrdersTotal();
  29. return view('app.my-account.admin.dashboard', compact('ordersTotal'));
  30. }
  31. public function getOrdersTotal(){
  32. $orders = StoreOrder::all();
  33. $total = 0;
  34. foreach($orders as $order){
  35. $total = $total + $order->total();
  36. }
  37. return $total;
  38. }
  39. public function users(Request $request)
  40. {
  41. $filters = $request->all();
  42. $users = User::query();
  43. $query = $request->get('query', null);
  44. $payment_profile = $request->get('payment_profile');
  45. if($payment_profile){
  46. if($payment_profile == 'YES'){
  47. $users = $users->whereHas('paymentMethods');
  48. }else{
  49. $users = $users->whereDoesntHave('paymentMethods');
  50. }
  51. }
  52. $customer_name = $request->get('customer_name');
  53. if($customer_name){
  54. $wildCardedCustomer = '%' . $customer_name . '%';
  55. $users = $users->where(function($qry)use($wildCardedCustomer){
  56. $qry->where('name_first', 'ilike', $wildCardedCustomer)
  57. ->orWhere('name_last', 'ilike', $wildCardedCustomer)
  58. ->orWhere('full_name', 'ilike', $wildCardedCustomer);
  59. });
  60. }
  61. $users = $users->orderBy('created_at', 'DESC')->paginate(30);
  62. return view('app.my-account.admin.users.index', compact('users', 'filters'));
  63. }
  64. public function userDashboard(User $user)
  65. {
  66. return view('app.my-account.admin.users.sub.dashboard', compact('user'));
  67. }
  68. public function userOrders(User $user)
  69. {
  70. $orders = StoreOrder::where('user_id', $user->id)->orderBy('created_at', 'DESC')->paginate(30);
  71. return view('app.my-account.admin.users.sub.orders', compact('user', 'orders'));
  72. }
  73. public function userTransactions(User $user)
  74. {
  75. $transactions = FinancialTransaction::where('user_id', $user->id)->orderBy('created_at', 'DESC')->paginate(30);
  76. return view('app.my-account.admin.users.sub.transactions', compact('transactions', 'user'));
  77. }
  78. public function userSessions(User $user)
  79. {
  80. $sessions = AppSession::where('user_id', $user->id)->orderBy('created_at', 'DESC')->paginate(30);
  81. return view('app.my-account.admin.users.sub.sessions', compact('sessions', 'user'));
  82. }
  83. public function userUserEvents(User $user)
  84. {
  85. $userEvents = UserEvent::where('performer_user_id', $user->id)->orderBy('created_at', 'DESC')->paginate(30);
  86. return view('app.my-account.admin.users.sub.user-events', compact('userEvents', 'user'));
  87. }
  88. public function userPaymentMethods(User $user){
  89. $userPaymentMethods = PaymentMethod::where('user_id', $user->id)->orderBy('created_at', 'DESC')->paginate(30);
  90. return view('app.my-account.admin.users.sub.payment-methods', compact('user', 'userPaymentMethods'));
  91. }
  92. public function paymentMethods(Request $request)
  93. {
  94. $filters = $request->all();
  95. $paymentMethods = PaymentMethod::query();
  96. $expirationDate = $request->get('expiration_date');
  97. if($expirationDate){
  98. $month = date("m",strtotime($expirationDate));
  99. $year = date("Y",strtotime($expirationDate));
  100. $paymentMethods = $paymentMethods->whereRaw("((stripe_detail_json)::json->'card'->>'exp_month')::integer <= $month AND ((stripe_detail_json)::json->'card'->>'exp_year')::integer <= $year");
  101. }
  102. $paymentMethods = $paymentMethods->orderBy('created_at', 'DESC')->paginate(30);
  103. return view('app.my-account.admin.payment-methods.index', compact('paymentMethods', 'filters'));
  104. }
  105. public function paymentMethodDashboard(PaymentMethod $paymentMethod)
  106. {
  107. return view('app.my-account.admin.payment-methods.sub.dashboard', compact('paymentMethod'));
  108. }
  109. public function financialTransactions(Request $request)
  110. {
  111. $filters = $request->all();
  112. $transactions = FinancialTransaction::query();
  113. $this->filterDateMultiQuery($request, $transactions, 'created_at', 'created_at_date_category', 'created_at_date_value_1', 'created_at_date_value_2');
  114. $customer = $request->get('customer');
  115. if($customer){
  116. $wildCardedCustomer = '%' . $customer . '%';
  117. $transactions = $transactions->whereHas('user', function($query) use($wildCardedCustomer){
  118. $query->where('name_first', 'ilike', $wildCardedCustomer)
  119. ->orWhere('name_last', 'ilike', $wildCardedCustomer)
  120. ->orWhere('full_name', 'ilike', $wildCardedCustomer);
  121. });
  122. }
  123. $transactions = $transactions->orderBy('created_at', 'DESC')->paginate(30);
  124. return view('app.my-account.admin.financial-transactions.index', compact('transactions', 'filters'));
  125. }
  126. public function financialTransactionDashboard()
  127. {
  128. return view('app.my-account.admin.financial-transactions.sub.dashboard');
  129. }
  130. public function orders(Request $request)
  131. {
  132. $filters = $request->all();
  133. $orders = StoreOrder::query();
  134. $name = $request->get('name', null);
  135. if ($name) {
  136. $wildCardedName = '%' . $name . '%';
  137. $orders = $orders->whereHas('User', function($query) use($wildCardedName){
  138. return $query->where('name_first', 'ilike', $wildCardedName)
  139. ->orWhere('name_last', 'ilike', $wildCardedName)
  140. ->orWhere('full_name', 'ilike', $wildCardedName);
  141. });
  142. }
  143. $orderNumber = $request->get('order_number');
  144. if($orderNumber){
  145. $wildCardedOrderNumber = '%' . $orderNumber . '%';
  146. $orders = $orders->where('iid', 'ilike', $wildCardedOrderNumber);
  147. }
  148. $this->filterDateMultiQuery($request, $orders, 'created_at', 'created_at_date_category', 'created_at_date_value_1', 'created_at_date_value_2');
  149. $orders = $orders->orderBy('created_at', 'DESC');
  150. $clonedOrdersQuery = clone $orders;
  151. $orders = $orders->paginate(30);
  152. return view('app.my-account.admin.orders.index', compact('orders', 'filters'));
  153. }
  154. public function orderDashboard(StoreOrder $order)
  155. {
  156. return view('app.my-account.admin.orders.sub.dashboard', compact('order'));
  157. }
  158. public function orderPreviewInvoice(StoreOrder $order)
  159. {
  160. return view('app.my-account.admin.orders.sub.preview-invoice', compact('order'));
  161. }
  162. public function orderFinancialTransactions(StoreOrder $order)
  163. {
  164. $transactions = FinancialTransaction::where('order_id', $order->id)->orderBy('created_at', 'DESC')->get();
  165. return view('app.my-account.admin.orders.sub.financial-transactions', compact('order', 'transactions'));
  166. }
  167. public function report(Request $request, $report) {
  168. $rows = [];
  169. switch ($report) {
  170. case 'new-orders-pending-processing':
  171. $rows = User::whereHas('storeOrdersAsClient', function($qry){
  172. return $qry->whereRaw('(store_order.id NOT IN (SELECT financial_transaction.order_id FROM financial_transaction))');
  173. })->paginate(30);
  174. break;
  175. default:
  176. break;
  177. }
  178. return view('app.my-account.reports.' . $report, compact('rows'));
  179. }
  180. public function sessions(Request $request){
  181. $filters = $request->all();
  182. $sessions = AppSession::query();
  183. if($request->get('name')){
  184. $wildCardedName = '%' . $request->get('name') . '%';
  185. $sessions = $sessions->whereHas('user', function($qry) use($wildCardedName){
  186. return $qry->where('name_first', 'ilike', $wildCardedName)
  187. ->orWhere('name_last', 'ilike', $wildCardedName)
  188. ->orWhere('full_name', 'ilike', $wildCardedName);
  189. });
  190. }
  191. $this->filterDateMultiQuery($request, $sessions, 'created_at', 'created_at_date_category', 'created_at_date_value_1', 'created_at_date_value_2');
  192. $sessions = $sessions->orderBy('created_at', 'DESC')->paginate(30);
  193. return view('app.my-account.admin.sessions.index', compact('sessions', 'filters'));
  194. }
  195. public function userEvents(Request $request){
  196. $filters = $request->all();
  197. $userEvents = UserEvent::query();
  198. if($request->get('name')){
  199. $wildCardedName = '%' . $request->get('name') . '%';
  200. $userEvents = $userEvents->whereHas('user', function($qry) use($wildCardedName){
  201. return $qry->where('name_first', 'ilike', $wildCardedName)
  202. ->orWhere('name_last', 'ilike', $wildCardedName)
  203. ->orWhere('full_name', 'ilike', $wildCardedName);
  204. });
  205. }
  206. $this->filterDateMultiQuery($request, $userEvents, 'created_at', 'created_at_date_category', 'created_at_date_value_1', 'created_at_date_value_2');
  207. $userEvents = $userEvents->orderBy('created_at', 'DESC')->paginate(30);
  208. return view('app.my-account.admin.user-events.index', compact('userEvents', 'filters'));
  209. }
  210. public function orderCharge(Request $request){
  211. $data = [
  212. 'orderUid' => $request->get('orderUid'),
  213. 'paymentMethodUid' => $request->get('paymentMethodUid'),
  214. 'amount' => $request->get('amount')
  215. ];
  216. $storeOrderUid = $request->get('orderUid');
  217. $storeOrder = StoreOrder::where('uid', $storeOrderUid)->first();
  218. $response = $this->callJava('/api/financialTransaction/createCharge', $data, $this->sessionKey);
  219. if (!@$response['success']) {
  220. if($storeOrder){
  221. $this->emailService->notifyUserOnFailedTransaction($storeOrder->user, $storeOrder);
  222. }
  223. return $this->fail($response['message'] ?? 'Failed!');
  224. }
  225. $message = $response['message'];
  226. if ($message == 'ORDER_NOT_CHARGED') {
  227. $message = 'Your order has been submitted but not charged.';
  228. $this->emailService->notifyUserOnFailedTransaction($storeOrder->user, $storeOrder);
  229. return $this->fail($message);
  230. }
  231. if($storeOrder){
  232. $user = $storeOrder->user;
  233. $this->emailService->sendUserOrderChargeSuccessful($user, $storeOrder);
  234. }
  235. return $this->pass();
  236. }
  237. public function userMessages(Request $request, User $user){
  238. $messages = Message::where('to_user_id', $user->id)->orWhere('from_user_id', $user->id);
  239. $messages = $messages->orderBy('created_at', 'ASC')->paginate(25);
  240. $opentok = null;
  241. $otSession = null;
  242. $otSessionId = null;
  243. $otToken = null;
  244. try {
  245. $opentok = new OpenTok(config('app.opentokApiKey'), config('app.opentokApiSecret'));
  246. $otSession = $opentok->createSession(array('mediaMode' => MediaMode::ROUTED));
  247. $otSessionId = $otSession->getSessionId();
  248. $otToken = $opentok->generateToken($otSessionId);
  249. } catch (\Exception $e) {
  250. return redirect()->back()->with('error', 'OpenTok issue!');
  251. }
  252. $toUser = $user;
  253. return view('app.my-account.admin.users.sub.messages', compact('otSessionId', 'otToken', 'messages', 'toUser', 'user'));
  254. }
  255. public function userMessageAttachments(Request $request, User $user, Message $message){
  256. if(!$message) return '';
  257. $output = [];
  258. foreach ($message->attachments as $attachment) {
  259. $output[] = '<a native target="_blank" ' .
  260. 'href="/api/systemFile/view/' . $attachment->systemFile->uid . '" ' .
  261. 'class="attachment text-sm my-1">' .
  262. '<i class="fa fa-paperclip"></i>&nbsp;' .
  263. $attachment->systemFile->file_name .
  264. '</a>';
  265. }
  266. return implode("", $output);
  267. }
  268. public function orderCreate(Request $request){
  269. $userUid = $request->get('userUid');
  270. $allTests = config('constants.tests');
  271. $selectedTests = $request->get('tests', []);
  272. if(!count($selectedTests)){
  273. return $this->fail('Please select a test!');
  274. }
  275. $tests = [];
  276. foreach($allTests as $key=>$title){
  277. $tests[$key] = in_array($key, $selectedTests) ? 1 : 0;
  278. }
  279. $data = [
  280. 'tests' => $tests,
  281. 'tests_total' => $request->get('total'),
  282. 'tests_lab_id' => $request->get('tests_lab_id')
  283. ];
  284. $detailJson = [
  285. 'selected_options' => json_encode($data)
  286. ];
  287. $javaResponse = $this->callJava('/api/customerStore/submitOrderAsAdmin', ['userUid' => $userUid, 'detailJson' => json_encode($detailJson)], $this->sessionKey);
  288. if (!@$javaResponse['success']) {
  289. return $this->fail($javaResponse['message']);
  290. }
  291. return $this->pass();
  292. }
  293. public function createNewUser(Request $request){
  294. $email = $request->get('email');
  295. $existingUser = User::where('email', $email)->first();
  296. if ($existingUser) {
  297. return $this->fail('This email account is in use!');
  298. }
  299. $nameFirst = $request->get('fname');
  300. $nameLast = $request->get('lname');
  301. $name = $nameFirst . ' ' . $nameLast;
  302. //call java
  303. $temporaryPassword = generate_password(10);
  304. $userCreateAccountResponse = $this->callJava('/api/auth/signUpWithEmail', [
  305. 'fullName' => $name,
  306. 'nameFirst' => $nameFirst,
  307. 'nameLast' => $nameLast,
  308. 'email' => $request->get('email'),
  309. 'phoneNumber' => $request->get('phoneNumber'),
  310. 'password' => $temporaryPassword,
  311. 'passwordConfirmation' => $temporaryPassword,
  312. ], null);
  313. if (!@$userCreateAccountResponse['success']) {
  314. return $this->fail($userCreateAccountResponse['message']);
  315. }
  316. $newUser = User::where('uid', $userCreateAccountResponse['data'])->first();
  317. //Send email via java
  318. if ($newUser) {
  319. $this->emailService->sendUserWelcomeEmail($newUser, $temporaryPassword);
  320. }
  321. $this->storeUserDetailJson($request, $newUser);
  322. return $this->pass($userCreateAccountResponse['data']);
  323. }
  324. public function storeUserDetailJson(Request $request, User $user)
  325. {
  326. $data = [
  327. 'uid' => $user->uid,
  328. 'phone_number' => $request->get('phoneNumber'),
  329. 'notification_option' => $request->get('notificationOption'),
  330. 'request_change_password' => 1,
  331. ];
  332. $res = $this->callJava('/api/user/upsertDetailJson', $data, $this->sessionKey);
  333. }
  334. }