Skip to content

Instantly share code, notes, and snippets.

@esmeromichael
Created August 30, 2019 13:27
Show Gist options
  • Save esmeromichael/e57f31ec586bb1e275f576f8d2fbbd2b to your computer and use it in GitHub Desktop.
Save esmeromichael/e57f31ec586bb1e275f576f8d2fbbd2b to your computer and use it in GitHub Desktop.
<?php
namespace App\Repositories\Backend;
use App\Models\Order;
use App\Repositories\BaseRepository;
use App\Helpers\Backend\Utils;
use Illuminate\Support\Facades\Crypt;
class OrderRepository
{
const MODEL = Order::class;
protected $properties = ['id', 'subscriber_id', 'status', 'order_code'];
protected $includes = [
'subscriber' => 'subscriber',
'order_entries' => 'order_entries',
'order_delivery_detail' => 'order_delivery_detail',
'order_delivery_address' => 'order_delivery_address'
];
public function all()
{
return Order::all();
}
public function getByStatus($status)
{
return Order::where('status', $status)->get();
}
public function get_all($parameters, $order_by = 'created_at', $sort = 'desc')
{
$limit = isset($parameters['limit']) ? (int) $parameters['limit'] : 10;
if (isset($parameters['psid'])) {
$psid_hashed = hash('sha256', $parameters['psid'], false);
$subscriber = Subscriber::where('psid_hashed', $psid_hashed)->first();
if ($subscriber) {
$parameters['subscriber_id'] = $subscriber->id;
} else {
return Utils::format_response(404, 'failed', 'subscriber not found');
}
}
$where_clauses = Utils::get_where_clause($this->properties, $parameters);
$with_keys = Utils::get_with_keys($this->includes, $parameters);
$rows = Order::with($with_keys)
->where($where_clauses)
->orderBy($order_by, $sort)
->paginate($limit)
->appends(app('request')->except('page'));
return $this->filter_all($rows, $with_keys);
}
protected function filter_all($rows, $keys = [])
{
if (count($rows) > 0) {
$data = [];
foreach ($rows as $row) {
$entry = $this->transform_record($row);
if (in_array('subscriber', $keys)) {
if (!empty($row->subscriber)) {
$entry['subscriber'] = [
'id' => $row->subscriber->id,
'psid' => Crypt::decryptString($row->subscriber->psid),
'first_name' => !empty($row->subscriber->first_name) ? Crypt::decryptString($row->subscriber->first_name) : '',
'last_name' => !empty($row->subscriber->last_name) ? Crypt::decryptString($row->subscriber->last_name) : '',
];
}
}
if (in_array('order_entries', $keys)) {
if (!empty($row->order_entries)) {
$entry['order_entries'] = $this->filter_order_entries($row->order_entries);
}
}
if (in_array('order_delivery_address', $keys)) {
if (!empty($row->order_delivery_address)) {
$entry['order_delivery_address'] = [
'id' => $row->order_delivery_address->id,
'order_id' => $row->order_delivery_address->order_id,
'type' => $row->order_delivery_address->type,
'label' => $row->order_delivery_address->label,
'company' => !empty($row->order_delivery_address->company) ? Crypt::decryptString($row->order_delivery_address->company) : '',
'building' => !empty($row->order_delivery_address->building) ? Crypt::decryptString($row->order_delivery_address->building) : '',
'floor' => !empty($row->order_delivery_address->floor) ? Crypt::decryptString($row->order_delivery_address->floor) : '',
'area' => !empty($row->order_delivery_address->area) ? Crypt::decryptString($row->order_delivery_address->area) : '',
'street' => !empty($row->order_delivery_address->street) ? Crypt::decryptString($row->order_delivery_address->street) : '',
'landmark' => $row->order_delivery_address->landmark,
'city_id' => $row->order_delivery_address->city_id,
'city_name' => $row->order_delivery_address->city_name,
'province_id' => $row->order_delivery_address->province_id,
'province_name' => $row->order_delivery_address->province_name,
'remarks' => $row->order_delivery_address->remarks
];
}
}
if (in_array('order_delivery_detail', $keys)) {
if (!empty($row->order_delivery_detail)) {
$entry['order_delivery_detail'] = [
'id' => $row->order_delivery_detail->id,
'order_id' => $row->order_delivery_detail->order_id,
'first_name' => !empty($row->order_delivery_detail->first_name) ? $row->order_delivery_detail->first_name : '',
'middle_name' => !empty($row->order_delivery_detail->middle_name) ? $row->order_delivery_detail->middle_name : '',
'last_name' => !empty($row->order_delivery_detail->last_name) ? $row->order_delivery_detail->last_name : '',
'mobile' => !empty($row->order_delivery_detail->mobile) ? $row->order_delivery_detail->mobile : '',
'email' => !empty($row->order_delivery_detail->email) ? $row->order_delivery_detail->email : '',
'remarks' => $row->order_delivery_detail->remarks,
'change_amount' => $row->order_delivery_detail->change_amount,
'delivery_time' => $row->order_delivery_detail->delivery_time
];
}
}
$data[] = $entry;
}
$paginator = [
'total' => $rows->total(),
'per_page' => $rows->perPage(),
'current_page' => $rows->currentPage(),
'last_page' => $rows->lastPage(),
'next_page_url' => $rows->nextPageUrl(),
'prev_page_url' => $rows->previousPageUrl(),
'from' => $rows->firstItem(),
'to' => $rows->lastItem(),
'has_more_pages' => $rows->hasMorePages(),
'links' => $rows->links(),
];
return Utils::format_response(200, 'success', 'records found', $data, $paginator);
} else {
return Utils::format_response(200, 'success', 'no record found');
}
}
protected function filter_order_entries($rows)
{
$data = [];
foreach ($rows as $row) {
$entry = [
'id' => $row->id,
'order_id' => $row->order_id,
'meal_type' => $row->meal_type,
'item_id' => $row->item_id,
'alacarte_id' => $row->alacarte_id,
'quantity' => $row->quantity,
'name' => $row->name,
'pos_code' => $row->pos_code,
'price' => $row->price,
];
if ($row->meal_type == 'bundle' || $row->meal_type == 'mcsharebox') {
// $entry['image'] = env('BASE_PUBLIC_URL') . '/img/items/' . $row->item->image;
$entry['item'] = $row->item;
$entry['order_entry_details'] = $this->filter_order_entry_details($row->order_entry_details);
} else {
// $entry['image'] = env('BASE_PUBLIC_URL') . '/img/lacarte/' . $row->alacarte->image;
$entry['alacarte'] = $row->alacarte;
}
$data[] = $entry;
}
return $data;
}
protected function filter_order_entry_details($rows)
{
$data = [];
foreach ($rows as $row) {
$entry = [
'id' => $row->id,
'order_entry_id' => $row->bag_entry_id,
'type' => $row->type,
'section' => $row->section,
'pos_code' => $row->pos_code,
'name' => $row->name,
'price' => $row->price,
'variance_id' => $row->variance_id,
'with_item_variance_id' => $row->with_item_variance_id,
'quantity' => $row->quantity
];
if ($row->section == 'variance') {
$entry['variance'] = $row->variance;
} else {
$entry['with_item_variance'] = $row->with_item_variance;
$entry['with_item_variance']['with_item'] = $row->with_item_variance->with_item;
}
$data[] = $entry;
}
return $data;
}
public function transform_record($row)
{
return [
'id' => $row->id,
'subscriber_id' => $row->subscriber_id,
'order_code' => $row->order_code,
'status' => $row->status,
'created_at' => $row->created_at,
'updated_at' => $row->updated_at
];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment