GrafiteInc/Commerce

View on GitHub
src/Services/TransactionService.php

Summary

Maintainability
A
45 mins
Test Coverage
<?php

namespace Grafite\Commerce\Services;

use Carbon\Carbon;
use Illuminate\Support\Facades\Config;
use Grafite\Commerce\Models\Order;
use Grafite\Commerce\Repositories\TransactionRepository;

class TransactionService
{
    public function __construct(TransactionRepository $transactionRepository)
    {
        $this->repo = $transactionRepository;
    }

    /**
     * Get all transactions.
     *
     * @return Collection
     */
    public function all()
    {
        return $this->repo->all();
    }

    /**
     * Get all Transactions from this year.
     *
     * @return Collection
     */
    public function overMonths($months = 1)
    {
        return $this->repo->overMonths($months);
    }

    /**
     * Get all Orders.
     *
     * @return Illuminate\Pagination\LengthAwarePaginator
     */
    public function paginated()
    {
        return $this->repo->paginated(config('cms.pagination', 25));
    }

    /**
     * Search the transactions.
     *
     * @param array $payload
     *
     * @return Collection
     */
    public function search($payload)
    {
        return $this->repo->search($payload, config('cms.pagination', 25));
    }

    /**
     * Find an transaction.
     *
     * @param int $id
     *
     * @return Orders
     */
    public function find($id)
    {
        return $this->repo->find($id);
    }

    /**
     * Find an order by Transaction.
     *
     * @param int $id
     *
     * @return Transaction
     */
    public function getTransactionOrder($id)
    {
        return app(Order::class)->where('transaction_id', $id)->first();
    }

    /**
     * Create an transaction.
     *
     * @param array $payload
     *
     * @return Transaction
     */
    public function create($payload)
    {
        $payload['tax'] = $payload['tax'] * 100;
        $payload['shipping'] = $payload['shipping'] * 100;
        $payload['subtotal'] = $payload['subtotal'] * 100;
        $payload['total'] = $payload['total'] * 100;

        return $this->repo->store($payload);
    }


    /**
     * Update an transaction.
     *
     * @param int   $id
     * @param array $payload
     *
     * @return Transaction
     */
    public function update($id, $payload)
    {
        $transaction = $this->find($id);

        return $this->repo->update($transaction, $payload);
    }

    /**
     * Refund a transaction.
     *
     * @param string $uuid
     *
     * @return bool
     */
    public function refund($uuid, $amount = null)
    {
        $transaction = $this->repo->findByUUID($uuid);

        $refund = app(StripeService::class)->refund($transaction->provider_id, $amount);

        if ($refund) {
            $transaction->update([
                'refund_date' => Carbon::now(),
            ]);

            app(LogisticService::class)->afterRefund($transaction);

            return $refund;
        }

        return false;
    }
}