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;
}
}