Files
shipping-portal/app/Transformers/CompanyModuleTransformer.php
T

141 lines
3.8 KiB
PHP

<?php
namespace App\Transformers;
use App\Classes\ValueObjects\Constants\AddressType;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use App\Models\CompanyModule;
use App\Models\SegmentConstant;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class CompanyModuleTransformer extends TransformerAbstract
{
/**
* List of resources to automatically include
*
* @var array
*/
protected $defaultIncludes = [
'address',
'billingAddress',
];
/**
* List of resources possible to include
*
* @var array
*/
protected $availableIncludes = [
'company',
'remarks',
'contact'
];
/**
* A Fractal transformer.
*
* @param CompanyModule $module
* @return array
*/
public function transform(CompanyModule $module): array
{
return [
'id' => $module->id,
'type' => $module->type,
'name' => $module->name,
'reference' => $module->reference,
'connections' => $module->connections,
'marking' => $this->getMarkings($module),
'warehouseCharges' => $this->calculateWarehouseCharges($module),
];
}
/**
* Load Default Address
* @param CompanyModule $module
* @return Item
*/
public function includeAddress(CompanyModule $module): \League\Fractal\Resource\Item
{
$defaultAddress = $module->addresses()->defaultAddress()->first();
$defaultAddress = $defaultAddress ? $defaultAddress : $this->addresses()->first();
return $this->item($defaultAddress, new AddressTransformer());
}
/**
* Load Billing Address
* @param CompanyModule $module
* @return Item
*/
public function includeBillingAddress(CompanyModule $module): Item
{
$billingAddress = $module->addresses()->where('type', AddressType::BILLING)->where('status', ApprovalStatus::APPROVED)->first();
return $this->item($billingAddress, new AddressTransformer());
}
/**
* include the company
* @param CompanyModule $module
* @return Item
*/
public function includeCompany(CompanyModule $module): Item
{
$company = $module->company()->first();
return $this->item($company, new CompanyTransformer());
}
/**
* Load Remarks
* @param CompanyModule $module
* @return Collection
*/
public function includeRemarks(CompanyModule $module): Collection
{
$remarks = $module->remarks();
return $this->collection($remarks, new RemarkTransformer);
}
/**
* Get Markings
* @param CompanyModule $module
* @return string
*/
public function getMarkings(CompanyModule $module): string
{
$connection = $module->inviters()->withPivot('invitee_reference')->first();
return $connection ? $connection->pivot->invitee_reference : '';
}
/**
* calculate warehouse charges
* @param CompanyModule $module
* @return mixed|null
*/
public function calculateWarehouseCharges(CompanyModule $module)
{
$segmentConstantObject = SegmentConstant::where('reference', SegmentConstants::WAREHOUSE_RATE)->get();
$segmentConstant = $segmentConstantObject->isEmpty() ? [] : (array)$segmentConstantObject->first()->value;
return array_key_exists($module->id, $segmentConstant) ? $segmentConstant[$module->id] : null;
}
/**
* include the contact
* @param CompanyModule $module
* @return Item
*/
public function includeContact(CompanyModule $module): Item
{
$contact = $module->contacts()->first();
return $this->item($contact, new ContactTransformer());
}
}