|
@@ -2,12 +2,18 @@
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
|
|
+use App\Helpers\DateHelper;
|
|
|
|
|
+use App\Helpers\DBHelper;
|
|
|
|
|
+use App\Http\Requests\Order\StoreOrderRequest;
|
|
|
use App\Models\Brigadier;
|
|
use App\Models\Brigadier;
|
|
|
use App\Models\Dictionary\Area;
|
|
use App\Models\Dictionary\Area;
|
|
|
use App\Models\Dictionary\District;
|
|
use App\Models\Dictionary\District;
|
|
|
use App\Models\ObjectType;
|
|
use App\Models\ObjectType;
|
|
|
|
|
+use App\Models\Order;
|
|
|
use App\Models\OrderStatus;
|
|
use App\Models\OrderStatus;
|
|
|
|
|
+use App\Models\User;
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Request;
|
|
|
|
|
+use Illuminate\Support\Str;
|
|
|
|
|
|
|
|
class OrderController extends Controller
|
|
class OrderController extends Controller
|
|
|
{
|
|
{
|
|
@@ -15,32 +21,124 @@ class OrderController extends Controller
|
|
|
'active' => 'orders',
|
|
'active' => 'orders',
|
|
|
'title' => 'Заказы',
|
|
'title' => 'Заказы',
|
|
|
'id' => 'orders',
|
|
'id' => 'orders',
|
|
|
-// 'header' => [
|
|
|
|
|
-// 'id' => 'ID',
|
|
|
|
|
-// 'year' => 'Год',
|
|
|
|
|
-// 'nomenclature_number' => 'Номер номенклатуры',
|
|
|
|
|
-// 'article' => 'Артикул',
|
|
|
|
|
-// 'manufacturer' => 'Производитель',
|
|
|
|
|
-// 'name_tz' => 'Наименование ТЗ',
|
|
|
|
|
-// 'type_tz' => 'Тип по ТЗ',
|
|
|
|
|
-// 'type' => 'Тип',
|
|
|
|
|
-// 'manufacturer_name' => 'Наименование производителя',
|
|
|
|
|
-// 'sizes' => 'Размеры',
|
|
|
|
|
-// 'price_status' => 'Статус цены',
|
|
|
|
|
-// 'product_price_txt' => 'Цена товара',
|
|
|
|
|
-// 'installation_price_txt' => 'Цена установки',
|
|
|
|
|
-// 'service_price_txt' => 'Цена обслуживания',
|
|
|
|
|
-// 'total_price_txt' => 'Итоговая цена',
|
|
|
|
|
-// 'note' => 'Примечания',
|
|
|
|
|
-// 'created_at' => 'Дата создания',
|
|
|
|
|
-// ]
|
|
|
|
|
|
|
+ 'header' => [
|
|
|
|
|
+ 'id' => 'ID',
|
|
|
|
|
+ 'user_id' => 'Менеджер',
|
|
|
|
|
+ 'district_id' => 'Округ',
|
|
|
|
|
+ 'area_id' => 'Район',
|
|
|
|
|
+ 'object_address' => 'Адрес объекта',
|
|
|
|
|
+ 'object_type_id' => 'Тип объекта',
|
|
|
|
|
+ 'contract_date' => 'Дата договора',
|
|
|
|
|
+ 'contract_number' => 'Номер договора',
|
|
|
|
|
+ 'comment' => 'Комментарий',
|
|
|
|
|
+ 'installation_date' => 'Дата выхода на монтаж',
|
|
|
|
|
+ 'brigadier_id' => 'Бригадир',
|
|
|
|
|
+ 'order_status_id' => 'Статус',
|
|
|
|
|
+ 'tg_group_name' => 'Имя группы в ТГ',
|
|
|
|
|
+ 'tg_group_link' => 'Ссылка на группу в ТГ',
|
|
|
|
|
+ ]
|
|
|
];
|
|
];
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* Display a listing of the resource.
|
|
* Display a listing of the resource.
|
|
|
*/
|
|
*/
|
|
|
- public function index()
|
|
|
|
|
|
|
+ public function index(Request $request)
|
|
|
{
|
|
{
|
|
|
|
|
+ $this->data['searchFields'] = [
|
|
|
|
|
+ 'comment',
|
|
|
|
|
+ 'object_address',
|
|
|
|
|
+ 'tg_group_name',
|
|
|
|
|
+ 'tg_group_link',
|
|
|
|
|
+ 'contract_number',
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ $filters = [
|
|
|
|
|
+ 'user_id' => [
|
|
|
|
|
+ 'title' => 'Менеджер',
|
|
|
|
|
+ 'values' => DBHelper::getFilters('user_id', Order::class),
|
|
|
|
|
+ ],
|
|
|
|
|
+ 'district_id' => [
|
|
|
|
|
+ 'title' => 'Округ',
|
|
|
|
|
+ 'values' => DBHelper::getFilters('district_id', Order::class),
|
|
|
|
|
+ ],
|
|
|
|
|
+ 'area_id' => [
|
|
|
|
|
+ 'title' => 'Район',
|
|
|
|
|
+ 'values' => DBHelper::getFilters('area_id', Order::class),
|
|
|
|
|
+ ],
|
|
|
|
|
+ 'object_type_id' => [
|
|
|
|
|
+ 'title' => 'Тип объекта',
|
|
|
|
|
+ 'values' => DBHelper::getFilters('object_type_id', Order::class),
|
|
|
|
|
+ ],
|
|
|
|
|
+ 'brigadier_id' => [
|
|
|
|
|
+ 'title' => 'Бригадир',
|
|
|
|
|
+ 'values' => DBHelper::getFilters('brigadier_id', Order::class),
|
|
|
|
|
+ ],
|
|
|
|
|
+ 'order_status_id' => [
|
|
|
|
|
+ 'title' => 'Статус',
|
|
|
|
|
+ 'values' => DBHelper::getFilters('order_status_id', Order::class),
|
|
|
|
|
+ ],
|
|
|
|
|
+ ];
|
|
|
|
|
+ $ranges = [];
|
|
|
|
|
+ $dates = [];
|
|
|
|
|
+
|
|
|
|
|
+ // fill filters
|
|
|
|
|
+ $this->data['filters'] = $filters;
|
|
|
|
|
+ $this->data['dates'] = $dates;
|
|
|
|
|
+ $this->data['ranges'] = $ranges;
|
|
|
|
|
+
|
|
|
|
|
+ $q = Order::query();
|
|
|
|
|
+
|
|
|
|
|
+ // accept filters
|
|
|
|
|
+ if(!empty($request->filters) && is_array($request->filters)) {
|
|
|
|
|
+ foreach ($request->filters as $filterName => $filterValue) {
|
|
|
|
|
+ if(!$filterValue) continue;
|
|
|
|
|
+
|
|
|
|
|
+ if(Str::contains($filterName, 'price')) {
|
|
|
|
|
+ $filterValue = $filterValue * 100;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(Str::endsWith($filterName, '_from')) {
|
|
|
|
|
+ if(is_string($filterValue) && DateHelper::isDate($filterValue)) {
|
|
|
|
|
+ $filterValue .= ' 00:00:00';
|
|
|
|
|
+ }
|
|
|
|
|
+ $q->where(Str::replace('_from', '', $filterName), '>=', $filterValue);
|
|
|
|
|
+ } elseif(Str::endsWith($filterName, '_to')) {
|
|
|
|
|
+ if(is_string($filterValue) && DateHelper::isDate($filterValue)) {
|
|
|
|
|
+ $filterValue .= ' 23:59:59';
|
|
|
|
|
+ }
|
|
|
|
|
+ $q->where(Str::replace('_to', '', $filterName), '<=', $filterValue);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $q->where($filterName, '=', $filterValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // accept search
|
|
|
|
|
+ if(!empty($request->s)) {
|
|
|
|
|
+ $s = $request->s;
|
|
|
|
|
+ $searchFields = $this->data['searchFields'];
|
|
|
|
|
+ $q->where(function ($query) use ($searchFields, $s) {
|
|
|
|
|
+ foreach ($searchFields as $searchField) {
|
|
|
|
|
+ $query->orWhere($searchField, 'LIKE', '%' . $s . '%');
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ // ------- setup sort and order --------------------------------------------------------------------------------
|
|
|
|
|
+ $this->data['sortBy'] = (!empty($request->sortBy))
|
|
|
|
|
+ ? Str::replace('_txt', '', $request->sortBy) // remove '_txt' fields modifier
|
|
|
|
|
+ : Order::DEFAULT_SORT_BY;
|
|
|
|
|
+
|
|
|
|
|
+ // check for sortBy is valid field
|
|
|
|
|
+ $p = new Order();
|
|
|
|
|
+ if(!in_array($this->data['sortBy'], array_merge(['id', 'created_at'], $p->getFillable()))) {
|
|
|
|
|
+ $this->data['sortBy'] = Order::DEFAULT_SORT_BY;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // set order
|
|
|
|
|
+ $this->data['orderBy'] = (!empty($request->order)) ? 'desc' : 'asc';
|
|
|
|
|
+ $q->orderBy($this->data['sortBy'], $this->data['orderBy']);
|
|
|
|
|
+ $this->data['orders'] = $q->paginate()->withQueryString();
|
|
|
|
|
+
|
|
|
return view('orders.index', $this->data);
|
|
return view('orders.index', $this->data);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -54,15 +152,22 @@ class OrderController extends Controller
|
|
|
$this->data['objectTypes'] = ObjectType::query()->get()->pluck('name', 'id');
|
|
$this->data['objectTypes'] = ObjectType::query()->get()->pluck('name', 'id');
|
|
|
$this->data['orderStatuses'] =OrderStatus::query()->get()->pluck('name', 'id');
|
|
$this->data['orderStatuses'] =OrderStatus::query()->get()->pluck('name', 'id');
|
|
|
$this->data['brigadiers'] = Brigadier::query()->get()->pluck('name', 'id');
|
|
$this->data['brigadiers'] = Brigadier::query()->get()->pluck('name', 'id');
|
|
|
|
|
+ $this->data['users'] = User::query()->get()->pluck('name', 'id');
|
|
|
return view('orders.edit', $this->data);
|
|
return view('orders.edit', $this->data);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* Store a newly created resource in storage.
|
|
* Store a newly created resource in storage.
|
|
|
*/
|
|
*/
|
|
|
- public function store(Request $request)
|
|
|
|
|
|
|
+ public function store(StoreOrderRequest $request)
|
|
|
{
|
|
{
|
|
|
- //
|
|
|
|
|
|
|
+ $data = $request->validated();
|
|
|
|
|
+ if(isset($data['id'])) {
|
|
|
|
|
+ Order::query()->where('id', $data['id'])->update($data);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ Order::query()->create($data);
|
|
|
|
|
+ }
|
|
|
|
|
+ return redirect()->route('order.index');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|