/** * Return the item listings view. * * @return \Illuminate\View\View */ public function getIndex(Request $request, $path = null) { $items = Item::active(); if ($request->input('q')) { $items->keywords($request->input('q')); } // Handle root if (is_null($path)) { $category = null; } else { $tree = explode('/', $path); $category = Category::findBySlug(array_slice($tree, -1)[0]); $items->whereHas('categories', function ($query) use($category) { $query->whereIn('categories.category_id', array_merge($category->getDescendantIds(), [$category->getKey()])); }); } $table = new ListingItems($items, $request); $table->with('categories'); if (mustard_loaded('auctions')) { $table->with('bids'); } if (mustard_loaded('media')) { $table->with('photos'); } return view('mustard::listings.list', ['categories' => Category::roots()->with('children')->orderBy('sort', 'asc')->orderBy('name', 'asc')->get(), 'table' => $table, 'items' => $table->paginate(), 'view_category' => $category]); }
/** * Include users with purchases only. * * @return void */ public function filterTypeBuyer() { if (!mustard_loaded('commerce')) { return; } $this->db->buyers(); }
/** * Return the admin messages view. * * @return \Illuminate\View\View */ public function getMessages() { $table = new AdminMessages(Message::query()); $table->with(['recipient', 'sender']); if (mustard_loaded('feedback')) { $table->with(['recipient.feedbackReceived', 'sender.feedbackReceived']); } return view('mustard::admin.messages', ['table' => $table, 'messages' => $table->paginate()]); }
/** * Return the inventory sold items view. * * @return \Illuminate\View\View */ public function getSold() { $items = Auth::user()->items()->leftJoin('purchases')->where(function ($query) { $query->typeFixed()->whereNotNull('purchases.purchase_id'); }); // Allows sorting by buyer username $items->getBaseQuery()->join('users', 'users.user_id', '=', 'purchases.user_id'); if (mustard_loaded('auctions')) { $items->leftJoin('winningBid')->orWhere(function ($query) { $query->typeAuction()->whereNotNull('bids.bid_id'); }); } $table = new InventorySold($items); return view('mustard::inventory.sold', ['table' => $table, 'items' => $table->paginate()]); }
/** * Close an account. * * @return \Illuminate\Http\RedirectResponse */ public function closeAccount(Request $request) { $this->validate($request, ['confirm' => 'required|regex:/close my account/']); Auth::user()->watching()->detach(); if (mustard_loaded('commerce')) { Auth::user()->bankDetails()->delete(); } if (mustard_loaded('feedback')) { Auth::user()->feedbackReceived()->update(['subject_user_id' => null]); } if (mustard_loaded('messaging')) { Auth::user()->messages()->delete(); } return redirect()->back()->withStatus(trans('mustard::account.close_confirmed')); }
/** * End an item, marking a winning bid. * * @return void */ public function end() { if (mustard_loaded('auctions') && $this->auction) { $bid = $this->getBidHistory()->first(); if ($bid) { $this->winningBid()->associate($bid); } } $now = time(); if ($this->endDate > $now) { $this->endedEarly = true; $this->endDate = $now; } $this->save(); }
/** * Create a new item. * * @param \Illuminate\Http\Request $request * * @return \Illuminate\Http\RedirectResponse */ public function postNew(ItemNew $request) { $file = $request->file('doc'); $item = new Item(); $item->name = $request->input('name'); $item->description = $request->input('description'); $item->auction = $request->input('type') == 'auction'; $item->quantity = $request->input('type') == 'auction' ? 1 : $request->input('quantity'); $item->commission = 0; $item->startPrice = $request->input('start_price'); $item->biddingPrice = $request->input('type') == 'auction' ? $request->input('start_price') : null; $item->fixedPrice = $request->input('fixed_price'); $item->reservePrice = $request->input('reserve_price'); $item->startDate = strtotime($request->input('start_date') . ' ' . $request->input('start_time')); $item->startDate = $item->startDate < time() ? time() : $item->startDate; $item->duration = ListingDuration::where('duration', $request->input('duration'))->value('duration'); $item->endDate = $item->getEndDate(); $item->collectionLocation = $request->input('collection_location'); $item->paymentOther = (bool) $request->input('payment_other'); $item->returnsPeriod = $request->input('returns_period'); $item->created = time(); $item->condition()->associate($request->input('condition')); $item->seller()->associate(Auth::user()); $item->save(); foreach ((array) $request->input('categories') as $category_id) { if ($category = Category::find($category_id)) { $item->categories()->save($category); } } if (mustard_loaded('media')) { $photos = []; if ($request->hasFile('photos')) { foreach ($request->file('photos') as $file) { $photos[] = ['real_path' => $file->getRealPath(), 'filename' => $file->getClientOriginalName()]; } } if ($request->session()->has('photos')) { foreach ($request->session()->pull('photos') as $file) { $photos[] = $file; } } $primary_set = false; foreach ($photos as $file) { $pp = new \PhotoProcessor($file['real_path']); try { $pp->validate(); } catch (\PhotoFormatUnknownException $e) { self::formFlash(array_keys(array_except($request->all(), ['photos']))); return redirect()->back()->withErrors([$file['filename'] . ' is not an image format we could recognise.']); } $photo = new \Hamjoint\Mustard\Media\Photo(); if (!$primary_set) { $photo->primary = $primary_set = true; } $photo->processed = false; $photo->item()->associate($item); $photo->save(); $pp->process($photo); } } foreach ((array) $request->input('delivery_options') as $delivery_option) { $validator = \Validator::make($delivery_option, ['name' => 'required|min:3', 'price' => 'required|monetary', 'arrival_time' => 'required|intrange']); // Skip if fails validation if ($validator->fails()) { continue; } $do = new DeliveryOption(); $do->name = $delivery_option['name']; $do->price = $delivery_option['price']; if (preg_match('/(\\d+)-(\\d+)/', $delivery_option['arrival_time'], $matches)) { $do->minArrivalTime = $matches[1]; $do->maxArrivalTime = $matches[2]; } else { $do->minArrivalTime = $do->maxArrivalTime = $delivery_option['arrival_time']; } $item->deliveryOptions()->save($do); } $item->seller->sendEmail('You have listed an item', 'mustard::emails.item.listed', ['item_id' => $item->itemId, 'item_name' => $item->name]); return redirect($item->url); }
/** * Run the seeder. * * @return void */ public function run() { $this->faker = FakerFactory::create('en_GB'); // Returns a random element from an array function mt_rand_arr($array, $exclude = []) { if ($exclude) { $array = array_diff($array, $exclude); } return $array[mt_rand(0, count($array) - 1)]; } DB::connection()->disableQueryLog(); $this->now = time(); $this->itemConditions = ItemCondition::all(); $this->listingDurations = ListingDuration::all(); $this->command->info('Adding categories'); for ($i = 1; $i <= self::TOTAL_CATEGORIES; $i++) { $category = new Category(); $category->name = implode(' ', $this->faker->words(2)); $category->slug = str_slug($category->name); $category->sort = mt_rand(0, 10); $category->save(); $this->categories[] = $category; } foreach ($this->categories as $category) { if (mt_rand(0, 1)) { continue; } $category->parentCategoryId = mt_rand_arr($this->categories)->categoryId; $category->save(); } $this->command->info('Adding users'); for ($i = 1; $i <= self::TOTAL_USERS; $i++) { $user = new User(); $user->username = $this->faker->userName; while (User::findByEmail($user->email = $this->faker->email)) { } $user->password = Hash::make('password'); $user->verified = true; $user->joined = mt_rand($this->now - mt_rand(0, 86400 * 200), $this->now); $user->locale = $this->faker->locale; $user->currency = $this->faker->currencyCode; $user->lastLogin = mt_rand($user->joined, $this->now); $user->save(); //if ($i == 1) $user->grantAdmin(); $this->users[] = $user; } if (mustard_loaded('commerce')) { $this->command->info('Adding postal addresses'); foreach ($this->users as $user) { for ($i = 0; $i <= mt_rand(1, 3); $i++) { $postal_address = new \Hamjoint\Mustard\Commerce\PostalAddress(); $postal_address->user()->associate($user); $postal_address->name = $user->username; $postal_address->street1 = $this->faker->secondaryAddress; $postal_address->street2 = $this->faker->streetAddress; $postal_address->city = $this->faker->city; $postal_address->county = $this->faker->county; $postal_address->postcode = $this->faker->postcode; $postal_address->country = $this->faker->countryCode; $postal_address->save(); } } } $this->command->info('Adding items'); for ($i = 1; $i <= self::TOTAL_ITEMS; $i++) { $item = new Item(); $item->seller()->associate(mt_rand_arr($this->users)); $item->condition()->associate($this->itemConditions->random()); $item->name = implode(' ', $this->faker->words(mt_rand(2, 5))); $item->description = implode("\n\n", $this->faker->paragraphs(2)); $item->auction = mustard_loaded('auctions') ? (bool) mt_rand(0, 1) : false; $item->quantity = !$item->auction ? mt_rand(1, 100) : 1; $item->startPrice = $item->biddingPrice = mt_rand(50, 500000) / 100; $item->reservePrice = mt_rand($item->startPrice * 100, 500000) / 100; $item->fixedPrice = !$item->auction || !mt_rand(0, 3) ? $item->startPrice + mt_rand(50, 500000) / 100 : 0; $item->commission = 0.07000000000000001; $item->duration = $this->listingDurations->random()->duration; $item->created = mt_rand($item->seller->joined, $this->now); $item->startDate = mt_rand($item->created, $this->now + 86400 * 14); $item->endDate = $item->getEndDate(); $item->collectionLocation = $this->faker->city; $item->paymentOther = mt_rand(0, 1); $item->returnsPeriod = mt_rand(7, 21); $item->save(); // Add to categories for ($ii = 0; $ii < mt_rand(1, 3); $ii++) { $category = Category::leaves()->get()->random(); try { $item->categories()->save($category); } catch (\Exception $e) { // } } // Add delivery options for ($ii = 0; $ii < mt_rand(0, 3); $ii++) { $delivery_option = new \Hamjoint\Mustard\DeliveryOption(); $delivery_option->name = implode(' ', $this->faker->words(3)); $delivery_option->price = mt_rand(50, 1000) / 100; $delivery_option->min_arrival_time = mt_rand(2, 10); $delivery_option->max_arrival_time = mt_rand($delivery_option->min_arrival_time, $delivery_option->min_arrival_time + 20); $delivery_option->item()->associate($item); $delivery_option->save(); } $watchers = []; // Add watchers for ($ii = 0; $ii < mt_rand(0, 3); $ii++) { $watchers[] = mt_rand_arr($this->users); } foreach (array_unique($watchers) as $watcher) { $item->watchers()->save($watcher, ['added' => mt_rand($item->startDate, $item->endDate)]); } } if (mustard_loaded('auctions')) { $this->command->info('Adding bids'); foreach (Item::where('auction', true)->where('start_date', '<=', $this->now)->get() as $item) { $bid_amount = $item->startPrice; $bid_time = $item->startDate; $end_time = $item->endDate < $this->now ? $item->endDate : $this->now; for ($i = 0; $i < mt_rand(0, 10); $i++) { if ($bid_time == $end_time) { break; } $bid = new \Hamjoint\Mustard\Auctions\Bid(); do { $user = mt_rand_arr($this->users); } while ($user->userId == $item->seller->userId); $bid->bidder()->associate($user); $minimum_bid = \Hamjoint\Mustard\Auctions\BidIncrement::getMinimumNextBid($bid_amount); $bid->amount = $bid_amount = $i == 0 ? $item->startPrice : mt_rand($minimum_bid * 100, ($minimum_bid + $bid_amount) * 100) / 100; $bid->placed = $bid_time = mt_rand($bid_time, $end_time); $item->bids()->save($bid); } $last_bids = $item->bids()->orderBy('placed', 'desc')->take(2)->get(); if ($last_bids->count()) { $item->biddingPrice = \Hamjoint\Mustard\Auctions\BidIncrement::getMinimumNextBid($last_bids->last()->amount); } if (!$item->isActive()) { $bid = $item->bids()->where('amount', DB::raw('(select max(`amount`) from `bids` where `item_id` = ' . $item->itemId . ')'))->first(); if ($bid) { $item->winningBid()->associate($bid); } } $item->save(); } } if (mustard_loaded('commerce')) { $this->command->info('Adding purchases'); foreach (Item::all() as $item) { if ($item->auction && $item->isEnded()) { $item->end(); } if (!$item->isStarted() || mustard_loaded('auctions') && $item->auction && !$item->winningBid) { continue; } if (mt_rand(0, 5)) { $purchase = new \Hamjoint\Mustard\Commerce\Purchase(); $purchase->item()->associate($item); $purchase->buyer()->associate(mustard_loaded('auctions') && $item->auction ? $item->winningBid->bidder : mt_rand_arr($this->users)); if ($item->deliveryOptions->count() && ($delivery_option = $item->deliveryOptions->random())) { $purchase->deliveryOption()->associate($delivery_option); } $purchase->useAddress($purchase->buyer->postalAddresses->random()); $purchase->created = mt_rand($item->startDate, min($item->endDate, $this->now)); $purchase->unitPrice = $purchase->total = $item->biddingPrice; $purchase->quantity = 1; if (mt_rand(0, 5)) { $purchase->received = $purchase->grandTotal; $purchase->paid = mt_rand($purchase->created, $this->now); if (mt_rand(0, 2)) { $purchase->dispatched = mt_rand($purchase->paid, $this->now); if (mt_rand(0, 2)) { $purchase->trackingNumber = str_random(16); } if (mt_rand(0, 1)) { $purchase->refunded = mt_rand($purchase->dispatched, $this->now); if (mt_rand(0, 1)) { $purchase->refundedAmount = $purchase->grandTotal; } else { $purchase->refundedAmount = mt_rand(1, $purchase->grandTotal); } } } } $purchase->save(); } } } if (mustard_loaded('feedback')) { $this->command->info('Adding feedback'); foreach (\Hamjoint\Mustard\Commerce\Purchase::all() as $purchase) { for ($i = 0; $i < 1; $i++) { if (!mt_rand(0, 5)) { continue; } $rater = $purchase->buyer; $subject = $purchase->item->seller; if ($i) { list($rater, $subject) = [$subject, $rater]; } $feedback = new \Hamjoint\Mustard\Feedback\UserFeedback(); $feedback->rating = mt_rand(0, 10) - 5; $feedback->message = $this->faker->sentence; $feedback->placed = mt_rand($purchase->created, $this->now); $feedback->rater()->associate($rater); $feedback->subject()->associate($subject); $feedback->purchase()->associate($purchase); $feedback->save(); } } } if (mustard_loaded('messaging')) { $this->command->info('Adding messages'); foreach (User::all() as $user) { for ($i = 0; $i < mt_rand(5, 50); $i++) { $message = new \Hamjoint\Mustard\Messaging\Message(); $message->subject = $this->faker->sentence; $message->body = implode("\n\n", $this->faker->paragraphs(2)); $recipient = mt_rand_arr($this->users, [$user]); $sender = $user; $message->sent = mt_rand(max($sender->joined, $recipient->joined), $this->now); $message->read = (bool) mt_rand(0, 1); $message->recipient()->associate($recipient); $message->sender()->associate($sender); $message->user()->associate($sender); $recipient_copy = clone $message; $recipient_copy->user()->associate($recipient); $recipient_copy->save(); $message->save(); } } } }
/** * Return the user profile view. * * @return \Illuminate\View\View */ public function getIndex(Request $request, $userId) { $user = User::findOrFail($userId); $items = $user->items()->where('start_date', '<=', time())->where('end_date', '>=', time())->orderBy('end_date', 'asc')->paginate(); return view('mustard::user.profile', ['user' => $user, 'items' => $items, 'feedbacks' => mustard_loaded('feedback') ? $user->feedbackReceived()->orderBy('placed')->take(3)->get() : new Collection()]); }
/** * Return the admin users view. * * @return \Illuminate\View\View */ public function showUsersTable() { $table = new AdminUsers(User::query()); if (mustard_loaded('feedback')) { $table->with('feedbackReceived'); } return view('mustard::admin.users', ['table' => $table, 'users' => $table->paginate()]); }