Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/ts.corals.io/corals-api/Corals/modules/Timesheet/Services/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/ts.corals.io/corals-api/Corals/modules/Timesheet/Services/InvoiceService.php
<?php

namespace Corals\Modules\Timesheet\Services;


use Corals\Foundation\Services\BaseServiceClass;
use Corals\Modules\Timesheet\Models\Entry;
use Corals\Modules\Timesheet\Models\Expense;
use Corals\Modules\Timesheet\Models\Invoice;
use Corals\Modules\Timesheet\Transformers\API\EntryPresenter;

class InvoiceService extends BaseServiceClass
{
    public function preStore($request, &$additionalData)
    {
        $code = Invoice::getCode('INV');
        $invoice_date = now();
        $due_date = now();

        if ($request->get('invoice_date')) {
            $invoice_date = $request->get('invoice_date');
        }

        if ($request->get('due_date')) {
            $due_date = $request->get('due_date');
        }

        $additionalData['code'] = $code;
        $additionalData['invoice_date'] = $invoice_date;
        $additionalData['due_date'] = $due_date;
    }

    public function preStoreUpdate($request, &$additionalData)
    {
        $items = $this->getInvoiceItemsFromRequest($request);
        $totals = $this->calculateInvoiceTotals($items);

        foreach ($totals as $key => $value) {
            if ($key == 'total_hours') {
                $additionalData['properties'][$key] = $value;
                continue;
            }

            $additionalData[$key] = $value;
        }
    }

    public function calculateInvoiceTotals($items)
    {
        $subtotalAmount = 0;
        $totalAmount = 0;
        $tax_total = 0;
        $discount_total = 0;
        $hours = 0;

        foreach ($items as $item) {
            $quantity = $item['quantity'];
            $amount = $item['amount'];

            switch ($item['type']) {
                case 'hours':
                    $subtotalAmount += $amount;
                    $hours += $quantity;
                    break;
                case 'tax':
                    $tax_total += $amount;
                    break;
                case 'discount':
                    $discount_total += $amount;
                    break;
                default:
                    $subtotalAmount += $amount;
            }

            $totalAmount += $amount;
        }

        return [
            'total' => $totalAmount,
            'subtotal' => $subtotalAmount,
            'tax_total' => $tax_total,
            'discount_total' => $discount_total,
            'total_hours' => $hours,
        ];
    }

    /**
     * @param $request
     * @param $model
     */
    public function preDestroy($request, $model)
    {
        $model->items()->forceDelete();

        Entry::query()->where('invoice_id', $model->id)
            ->update([
                'invoice_id' => null,
            ]);

        Expense::query()->where('invoice_id', $model->id)
            ->update([
                'status' => 'pending',
                'invoice_id' => null,
            ]);
    }

    /**
     * @return array
     */
    public function getFormData()
    {
        if (!user()->canAny(['create', 'update'], new Invoice())) {
            return [];
        }

        return [
            'status_options' => apiPluck(config('timesheet.models.invoice.status_options'), 'id', 'label')
        ];
    }

    public function invoiceEntries($query, $dataTable)
    {
        $this->setPresenter(new EntryPresenter);

        $result = parent::index($query, $dataTable, false);

        $data = $this->groupedEntries(data_get($result, 'data'));

        $data_result = [];

        foreach ($data as $indexId => $project) {
            $i = 0;
            foreach ($project as $index => $entries) {
                $data_result[$indexId][$i] = array_values(collect($entries)->sortBy('user')->toArray());
                if ($i < count($project)) {
                    $i++;
                }
            }
        }
        return $data_result;
    }

    /**
     * @param $data
     * @param string $groupBy
     * @return array
     */
    protected function groupedEntries($data, array $groupBy = ['project_id', 'spent_at'])
    {
        return collect($data)->groupBy($groupBy)->values()->all();
    }

    public function postStoreUpdate($request, &$additionalData)
    {
        $invoice = $this->model;

        $items = $this->getInvoiceItemsFromRequest($request);

        $invoice->items()->forceDelete();
        $invoice->items()->createMany($items);
    }

    public function getInvoiceItemsFromRequest($request)
    {
        $items = $request->get('items');
        foreach ($items as $index => $item) {
            $rate = $item['rate'];
            $quantity = $item['quantity'];
            $amount = $rate * $quantity;
            if ($item['type'] == 'discount') {
                $amount *= -1;
            }
            $items[$index]['amount'] = $amount;
        }
        return $items;
    }
}

Spamworldpro Mini