| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- <?php
- namespace App\Http\Controllers;
- use App\Events\SendWebSocketMessageEvent;
- use App\Helpers\DateHelper;
- use App\Http\Requests\CreateScheduleFromOrderRequest;
- use App\Http\Requests\CreateScheduleFromReclamationRequest;
- use App\Http\Requests\ExportScheduleRequest;
- use App\Http\Requests\UpdateScheduleRequest;
- use App\Jobs\ExportScheduleJob;
- use App\Jobs\NotifyManagerNewOrderJob;
- use App\Jobs\NotifyOrderInScheduleJob;
- use App\Models\Dictionary\Area;
- use App\Models\Dictionary\District;
- use App\Models\Order;
- use App\Models\ProductSKU;
- use App\Models\Reclamation;
- use App\Models\Role;
- use App\Models\Schedule;
- use App\Models\User;
- use Illuminate\Http\Request;
- class ScheduleController extends Controller
- {
- protected array $data = [
- 'active' => 'schedule',
- 'title' => 'График монтажей',
- 'id' => 'schedule',
- ];
- public function index(Request $request)
- {
- $this->data['districts'] = District::query()->get()->pluck('name', 'id');
- $this->data['areas'] = Area::query()->get()->pluck('name', 'id');
- $this->data['brigadiers'] = User::query()->where('role', Role::BRIGADIER)->get()->pluck('name', 'id');
- $this->data['weekNumber'] = $request->get('week' ,date('W'));
- $weekDates = [
- 'mon' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber']),
- 'tue' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 2),
- 'wed' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 3),
- 'thu' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 4),
- 'fri' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 5),
- 'sat' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 6),
- 'sun' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 7),
- ];
- $this->data['weekDates'] = $weekDates;
- $schedules = [];
- foreach ($weekDates as $date) {
- $schedules[$date] = null;
- }
- $result = Schedule::query()
- ->whereBetween('installation_date', [$weekDates['mon'], $weekDates['sun']])
- ->get();
- foreach ($result as $schedule) {
- $schedules[$schedule->installation_date][] = $schedule;
- }
- $this->data['schedules'] = $schedules;
- return view('schedule.index', $this->data);
- }
- public function createFromOrder(CreateScheduleFromOrderRequest $request)
- {
- $validated = $request->validated();
- // delete all auto schedules for this order
- if(isset($validated['delete_old_records'])) {
- Schedule::query()
- ->where('order_id', $validated['order_id'])
- ->where('source', 'Площадки')
- ->where('manual', false)
- ->delete();
- }
- // create all records in schedule
- $order = Order::query()
- ->where('id', $validated['order_id'])
- ->first();
- if(empty($validated['skus'])) {
- foreach ($order->products_sku as $psku)
- $validated['skus'][] = $psku->id;
- }
- $mafs = [];
- foreach ($validated['skus'] as $skuId) {
- $sku = ProductSKU::query()->where('id', $skuId)->first();
- if(!isset($mafs[$sku->product->article])) {
- $mafs[$sku->product->article] = 1;
- } else {
- $mafs[$sku->product->article] += 1;
- }
- }
- $mafsText = '';
- $mafsCount = 0;
- foreach ($mafs as $article => $count) {
- $mafsText .= $article . ' - ' . $count . "\r\n";
- $mafsCount += $count;
- }
- $first = true;
- for ($iDays = 1; $iDays < $order->install_days + 1; $iDays++) {
- $instDate = date('Y-m-d', strtotime('+' . $iDays - 1 . ' days', strtotime($order->installation_date)));
- $schedule = Schedule::query()
- ->create([
- 'order_id' => $validated['order_id'],
- 'address_code' => $validated['order_id'],
- 'source' => 'Площадки',
- 'installation_date' => $instDate,
- 'manual' => false,
- 'district_id' => $order->district_id,
- 'area_id' => $order->area_id,
- 'object_address' => $order->object_address,
- 'object_type' => $order->objectType->name,
- 'mafs' => $mafsText,
- 'mafs_count' => $mafsCount,
- 'brigadier_id' => $order->brigadier_id,
- 'comment' => $validated['comment'],
- ]);
- if($first) {
- $first = false;
- NotifyOrderInScheduleJob::dispatch($schedule);
- }
- }
- return redirect()->route('schedule.index');
- }
- public function createFromReclamation(CreateScheduleFromReclamationRequest $request)
- {
- $validated = $request->validated();
- // delete all auto schedules for this order
- if(isset($validated['delete_old_records'])) {
- Schedule::query()
- ->where('address_code', 'РЕКЛ-' . $validated['reclamation_id'])
- ->where('source', 'Рекламации')
- ->where('manual', false)
- ->delete();
- }
- $reclamation = Reclamation::query()
- ->where('id', $validated['reclamation_id'])
- ->first();
- $order = $reclamation->order;
- $mafs = [];
- if(empty($validated['skus'])) {
- foreach ($reclamation->skus as $sku)
- if(!isset($mafs[$sku->product->article])) {
- $mafs[$sku->product->article] = 1;
- } else {
- $mafs[$sku->product->article] += 1;
- }
- }
- $mafsCount = 0;
- $mafsText = '';
- foreach ($mafs as $article => $count) {
- $mafsCount += $count;
- $mafsText .= $article . ' - ' . $count . "\r\n";
- }
- $first = true;
- for ($iDays = 1; $iDays < $reclamation->work_days + 1; $iDays++) {
- $instDate = date('Y-m-d', strtotime('+' . $iDays - 1 . ' days', strtotime($reclamation->start_work_date)));
- $schedule = Schedule::query()
- ->create([
- 'order_id' => $order->id,
- 'address_code' => 'РЕКЛ-' . $validated['reclamation_id'],
- 'source' => 'Рекламации',
- 'installation_date' => $instDate,
- 'manual' => false,
- 'district_id' => $order->district_id,
- 'area_id' => $order->area_id,
- 'object_address' => $order->object_address,
- 'object_type' => $reclamation->reason,
- 'mafs' => $mafsText,
- 'mafs_count' => $mafsCount,
- 'brigadier_id' => $reclamation->brigadier_id,
- 'comment' => $reclamation->guarantee,
- ]);
- if($first) {
- $first = false;
- NotifyOrderInScheduleJob::dispatch($schedule);
- }
- }
- return redirect()->route('schedule.index');
- }
- public function update(UpdateScheduleRequest $request)
- {
- $validated = $request->validated();
- if(isset($validated['id'])) {
- $schedule = Schedule::query()
- ->where('id', $validated['id'])
- ->update($validated);
- } else {
- $schedule = Schedule::query()
- ->create([
- 'address_code' => $validated['address_code'] ?? '-',
- 'installation_date' => $validated['installation_date'],
- 'manual' => true,
- 'district_id' => $validated['district_id'],
- 'area_id' => $validated['area_id'],
- 'object_address' => $validated['object_address'],
- 'object_type' => $validated['object_type'],
- 'mafs' => $validated['mafs'],
- 'mafs_count' => $validated['mafs_count'],
- 'brigadier_id' => $validated['brigadier_id'],
- 'comment' => $validated['comment'],
- ]);
- }
- NotifyOrderInScheduleJob::dispatch($schedule);
- return redirect()->back();
- }
- public function delete(Schedule $schedule)
- {
- $schedule->delete();
- return redirect()->back();
- }
- public function export(ExportScheduleRequest $request)
- {
- $startDate = $request->validated()['start_date'];
- $endDate = $request->validated()['end_date'];
- $schedules = Schedule::query()
- ->where('installation_date', '>=', $startDate)
- ->where('installation_date', '<=', $endDate)
- ->orderBy('installation_date')
- ->orderBy('brigadier_id')
- ->get();
- ExportScheduleJob::dispatch($schedules, $request->user()->id);
- return redirect()->route('schedule.index', ['week' => $request->validated()['week']])
- ->with(['success' => 'Задача генерации графика создана!']);
- }
- }
|