Files
shipping-portal/app/Transformers/OrderTransformer.php

136 lines
3.7 KiB
PHP

<?php
namespace App\Transformers;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\OrderRoleTypes;
use App\Classes\ValueObjects\Constants\PackingListType;
use App\Models\Order;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class OrderTransformer extends TransformerAbstract
{
/**
* List of resources to automatically include
*
* @var array
*/
protected $defaultIncludes = [
'company_module',
'warehouse',
'address',
'address_change_request',
'remarks'
];
/**
* List of resources possible to include
*
* @var array
*/
protected $availableIncludes = [
'parcels',
'invoices'
];
/**
* A Fractal transformer.
*
* @param Order $order
* @return array
*/
public function transform(Order $order): array
{
return [
'id' => $order->id,
'reference' => $order->reference,
'reference_contract' => $order->type,
'type' => $order->type,
'status' => $order->status,
'created_at' => $order->created_at->format('d-m-Y')
];
}
/**
* Include company module
* @param Order $order
* @return Item
*/
public function includeCompanyModule(Order $order): Item
{
return $this->item($order->companyModule, new CompanyModuleTransformer());
}
/**
*
* Include warehouse
* @param Order $order
* @return Item
*/
public function includeWarehouse(Order $order): Item
{
return $this->item($order->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee, new CompanyModuleTransformer());
}
/**
* include address
* @param Order $order
* @return Item
*/
public function includeAddress(Order $order): Item
{
return $this->item($order->addresses()->where('status', '=', ApprovalStatus::APPROVED)->first(), new AddressTransformer());
}
/**
* include address change request
* @param Order $order
* @return Item
*/
public function includeAddressChangeRequest(Order $order): Item
{
return $this->item($order->addressesPendingVerification()->first(), new AddressTransformer());
}
/**
* include parcels
* @param Order $order
* @return array
*/
public function includeParcels(Order $order): array
{
return [
'origin_warehouse_packages' => $this->collection($order->originWarehousePackages()->get(), new PackageListTransformer()),
'in_transit_packages' => $this->collection($order->inTransitPackages()->get(), new PackageListTransformer()),
'destination_warehouse_packages' => $this->collection($order->destinationWarehousePackages()->get(), new PackageListTransformer()),
'delivered_packages' => $this->collection($order->deliveredPackages()->get(), new PackageListTransformer()),
'received_packages' => $this->collection($order->packingLists()->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST)->whereHas('packages')->get(), new PackageListTransformer()),
];
}
/**
*
* include invoices
* @param Order $order
* @return Collection
*/
public function includeInvoices(Order $order): Collection
{
$invoices = $order->transactions()->whereNotIn('transactions.status', [0, 1])->get();
return $this->collection($invoices, new TransactionTransformer());
}
public function includeRemarks(Order $order): Collection
{
return $this->collection($order->remarks()->get(), new RemarkTransformer);
}
}