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

179 lines
5.7 KiB
PHP

<?php
namespace App\Transformers;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Models\Transaction;
use Illuminate\Support\Carbon;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use League\Fractal\TransformerAbstract;
class TransactionTransformer extends TransformerAbstract
{
/**
* List of resources to automatically include
*
* @var array
*/
protected $defaultIncludes = [
'order',
'documents',
'currency',
'original_currency',
'details',
'transactions',
'payment_attempts',
'payment_history',
'remarks'
];
/**
* List of resources possible to include
*
* @var array
*/
protected $availableIncludes = [
//
];
/**
* A Fractal transformer.
*
* @param Transaction $transaction
* @return array
*/
public function transform(Transaction $transaction): array
{
return [
'id' => $transaction->id,
'type' => (int)$transaction->type,
'bill_no' => $transaction->bill_no,
'amount' => (double)$transaction->amount,
'payment_method' => (int)$transaction->payment_method,
'payment_reference' => $transaction->payment_reference,
'outstanding' => $this->getOutstandingAmount($transaction),
'floating' => $this->getFloatingAmount($transaction),
'service_charge' => (double)$transaction->service_charge,
'tax' => (double)$transaction->tax,
'original_amount' => (double)$transaction->original_amount,
'currency_rate' => (double)$transaction->currency_rate,
'status' => $transaction->status,
'expires_on' => Carbon::parse($transaction->expires_on)->format('d-m-Y h:s:i'),
'updated_at' => Carbon::parse($transaction->updated_at)->format('d-m-Y'),
'created_at' => Carbon::parse($transaction->created_at)->format('d-m-Y')
];
}
/**
* Include order
* @param Transaction $transaction
* @return Item
*/
public function includeOrder(Transaction $transaction): Item
{
return ($transaction->owner instanceof Transaction) ? $this->item($transaction->owner->owner->owner, new OrderTransformer) : $this->item($transaction->owner->owner, new OrderTransformer);
}
/**
* Include documents
* @param Transaction $transaction
* @return Collection
*/
public function includeDocuments(Transaction $transaction): Collection
{
return $this->collection($transaction->documents, new DocumentTransformer());
}
/**
* Get outstanding amount
* @param Transaction $transaction
* @return float
*/
public function getOutstandingAmount(Transaction $transaction): float
{
return (float)$transaction->amount - ($transaction->transactions()->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount'));
}
/**
* Get floating amount
* @param Transaction $transaction
* @return float
*/
public function getFloatingAmount(Transaction $transaction): float
{
return (double)$transaction->transactions()->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION])->sum('amount');
}
/**
* Include currency
* @param Transaction $transaction
* @return Item
*/
public function includeCurrency(Transaction $transaction): Item
{
return $this->item($transaction->currency, new CurrencyTransformer);
}
/**
* include original currency
* @param Transaction $transaction
* @return Item
*/
public function includeOriginalCurrency(Transaction $transaction): Item
{
return $this->item($transaction->original_currency, new CurrencyTransformer);
}
/**
* Include transaction details details
* @param Transaction $transaction
* @return Collection
*/
public function includeDetails(Transaction $transaction): Collection
{
return $this->collection($transaction->transactionDetails, new TransactionDetailTransformer());
}
/**
* include transactions
* @param Transaction $transaction
* @return Collection
*/
public function includeTransactions(Transaction $transaction): Collection
{
return $this->collection($transaction->transactions, new TransactionTransformer());
}
/**
* include payment attempts
* @param Transaction $transaction
* @return Collection
*/
public function includePaymentAttempts(Transaction $transaction): Collection
{
return $this->collection($transaction->transactions()->payments()->where('status', ApprovalStatus::PENDING_SUBMISSION)->get(), new TransactionTransformer());
}
/**
* include payment history
* @param Transaction $transaction
* @return Collection
*/
public function includePaymentHistory(Transaction $transaction): Collection
{
return $this->collection($transaction->transactions()->payments()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::COMPLETED, ApprovalStatus::REJECTED])->get(), new TransactionTransformer());
}
/**
* include remarks
* @param Transaction $transaction
* @return Collection
*/
public function includeRemarks(Transaction $transaction): Collection
{
return $this->collection($transaction->remarks, new RemarkTransformer());
}
}