HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/ipsremont-demo/app/Repository/Shipment/ShipmentRepository.php
<?php

namespace App\Repository\Shipment;

use App\Http\Requests\Shipment\CreateRequest;
use App\Http\Requests\Shipment\IndexRequest;
use App\Models\Order;
use App\Models\Service\Service;
use App\Models\Shipment;
use App\Models\ShipmentParts;
use App\Repository\BaseRepository;
use App\Repository\Order\OrderRepository;
use App\Services\Log\LogService;
use App\Services\Order\OrderService;
use App\Traits\GridTrait;
use Illuminate\Support\Facades\Validator;

class ShipmentRepository extends BaseRepository
{

    use GridTrait;

    public static function getQuery()
    {
        return Shipment::query();
    }

    /**
     * @param IndexRequest $request
     *
     * @return mixed
     */
    public function search(IndexRequest $request)
    {
        $query = self::getAvailable();

        $this->makeQueryOrdered(Shipment::class, $query, $request);

        if (isset($request->order_id) && !empty($request->order_id)) {
            $query->where('order_id', $request->order_id);
        }

        if (isset($request->repair_id) && !empty($request->repair_id)) {
            $query->whereHas('order', function ($query) use ($request) {
                $query->where('repair_id', $request->repair_id);
            });
        }

        if (isset($request->track_number) && !empty($request->track_number)) {
            $query->where('track_number', 'like', '%' . $request->track_number . '%');
        }

        if (isset($request->recipient_name) && !empty($request->recipient_name)) {
            $query->where('recipient_name', 'like', '%' . $request->recipient_name . '%');
        }

        if (isset($request->status) && !empty($request->status)) {
            $query->where('status', $request->status);
        }

        $perPage = $request->per_page ?? config('crud.defaultPerPage');

        return $query->paginate((int) $perPage)->appends($request->all());
    }

    /**
     * @param CreateRequest $request
     */
    public function save(CreateRequest $request)
    {
        $model = new Shipment();

        $request->validate($request->rules());
        $fields = $request->all();
        $model->fill($fields);
        $order = OrderService::getById($request->order_id);
        $model->recipient_address = ($order->city)
            ? $order->country . ', ' . $order->city . ', ' . $order->address
            : $order->country . ', ' . $order->address;
        $model->service_id = $order->service_id;
        $model->branch_id = $order->branch_id;
        $model->status = 'new';
        $model->save();

        $parts = json_decode($request->parts);
        foreach ($parts as $part) {
            $m = new ShipmentParts();
            $m->shipment_id = $model->id;
            $m->part_id = $part->part_id;
            $m->amount = $part->amount;
            $m->order_id = $part->order_id;
            $m->save();
        }

        LogService::updatedRelations($model, 'parts', $request->parts);

        $order = OrderService::getById($model->getOrderId());
        $order->status = 'delivery';
        $order->update();
    }

    public static function save1c($item)
    {
        $trackNumber = $item['track_number'];
        $postType = $item['post_type'];
        $code = $item['code'];

        $data = [
            'track_number' => $trackNumber,
            'delivery_service' => $postType,
            'departure_date' => date('Y-m-d'),
        ];
        $request = new CreateRequest();
        $validator = Validator::make($data, $request->rules());

        if ($validator->failed()) {
            return $validator->errors();
        }

        /** @var ?Order $order */
        $order = OrderRepository::getBy1sKey($code, date('Y', strtotime($item['created_at'])));
        if (empty($order)) {
            return ['external_id' => ['Отсутствует заявка']];
        }
        $shipment = new Shipment();
        $shipment->track_number = $data['track_number'];
        $shipment->delivery_service = $data['delivery_service'];
        $shipment->departure_date = $data['departure_date'];
        $shipment->order_id = $order->id;
        $shipment->service_id = $order->service->id;
        $shipment->branch_id = $order->service->branch->id;
        $shipment->status = 'new';
        $shipment->save();

        foreach ($order->order_items as $part) {
            $m = new ShipmentParts();
            $m->shipment_id = $shipment->id;
            $m->part_id = $part->part_id;
            $m->amount = $part->amount;
            $m->order_id = $order->id;
            $m->save();
        }

        LogService::updatedRelations($shipment, 'parts', $order->order_items);

        $order->status = 'delivery';
        $order->update();

        return 1;
    }

    public static function getShipments(string $deliveryService, int $limit)
    {
        return Shipment::query()
            ->whereNotIn('status', [Shipment::STATUS_DELIVERED, Shipment::STATUS_NOT_DELIVERED, Shipment::STATUS_INVALID])
            ->where('delivery_service', $deliveryService)
            ->where('last_status_date', '<', date('Y-m-d H:i:s', strtotime('-5 hours')))
            ->where('error', 0)
            ->limit($limit)->get();
    }

    public static function getSdekShipments($limit)
    {
        return self::getShipments(Service::TYPE_CDEK, $limit);
    }

    public static function getPekShipments($limit)
    {
        return Shipment::where('status', '!=', 'delivered')->where('delivery_service', Service::TYPE_PEK)
            ->where('last_status_date', '<', date("Y-m-d H:i:s", strtotime(now()) - 5 * 3600))
            ->limit($limit)->get();
    }

    public static function getDpdShipments($limit)
    {
        return self::getShipments(Service::TYPE_DPD, $limit);
    }

    public static function getCodeByName(string $shipmentName): ?string
    {
        $codes = array_flip(Shipment::deliveryService());

        return $codes[$shipmentName] ?? null;
    }

}