![]() 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/ |
<?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; } }