/**
  * 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]);
 }
Exemple #2
0
 /**
  * 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'));
 }
Exemple #6
0
 /**
  * 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();
 }
Exemple #7
0
 /**
  * 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);
 }
Exemple #8
0
 /**
  * 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();
             }
         }
     }
 }
Exemple #9
0
 /**
  * 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()]);
 }
Exemple #10
0
 /**
  * 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()]);
 }