unpaid()->sumTotalAmountDue()->first()->total_amount_due; } } public function paginateByCustomerId($customerId, PaginateBuilderAttr $paginateBuilderAttr, $isPaid = false): PaginateCollectionAttr { $retInvoice = RetainerInvoice::with('customer')->where('customer_id', $customerId); if ($isPaid) { $retInvoice = $retInvoice->paid(); } return (new PaginateCollectionAttrBuilder) ->build( $retInvoice, $paginateBuilderAttr, new PaginateSchemaRetainerInvoice ); } public function getRandomIds($limit = 10) { $retainerInvoice = RetainerInvoice::select('id')->limit($limit)->inRandomOrder(); return array_keys($retainerInvoice->get()->toArray(), 'id') ?? null; } public function getRandomId($limit = 10) { $retainerInvoice = RetainerInvoice::limit($limit)->inRandomOrder(); return $retainerInvoice->first()->id ?? null; } public function getLastRow() { return RetainerInvoice::orderBy('id', 'desc')->first(); } public function updateStatus($id, $status) { $retainerInvoice = $this->fetch($id); $retainerInvoice->update([ 'status' => $status ]); return $this->fetch($id); } public function select2Paginate(RetainerInvoiceSelect2PaginateAttr $retainerInvoiceSelect2PaginateAttr): PaginateCollectionAttr { $retainerInvoice = RetainerInvoice::selectRaw('id, no_invoice as text'); if ($customerId = $retainerInvoiceSelect2PaginateAttr->getHasCustomer()) { $retainerInvoice = $retainerInvoice->where('customer_id', $customerId); } if ($retainerInvoiceSelect2PaginateAttr->getUnpaidOnly()) { $retainerInvoice = $retainerInvoice->unpaid(); } return (new PaginateCollectionAttrBuilder) ->build( $retainerInvoice, $retainerInvoiceSelect2PaginateAttr, new PaginateSchemaRetainerInvoice ); } public function paginate(PaginateBuilderAttr $paginateBuilderAttr): PaginateCollectionAttr { return (new PaginateCollectionAttrBuilder) ->build( RetainerInvoice::with('customer'), $paginateBuilderAttr, new PaginateSchemaRetainerInvoice ); } public function fetch($id) { return RetainerInvoice::with('details', 'customer')->findOrFail($id); } public function create(RetainerInvoiceAttr $retainerInvoiceAttr, $noInvoice) { $retainerInvoice = RetainerInvoice::create([ 'no_invoice' => $noInvoice, 'customer_id' => $retainerInvoiceAttr->getCustomerId(), 'invoice_date' => formatDate($retainerInvoiceAttr->getInvoiceDate()), 'note' => $retainerInvoiceAttr->getNote(), 'status' => $retainerInvoiceAttr->getStatus() ?? 'draft' ]); return $this->fetch($retainerInvoice->id); } public function update(RetainerInvoiceAttr $retainerInvoiceAttr, $id) { $retainerInvoice = $this->fetch($id); $retainerInvoice->update([ 'customer_id' => $retainerInvoiceAttr->getCustomerId(), 'invoice_date' => formatDate($retainerInvoiceAttr->getInvoiceDate()), 'note' => $retainerInvoiceAttr->getNote(), ]); return $this->fetch($id); } public function delete($id) { $retainerInvoice = $this->fetch($id); $retainerInvoice->delete(); return $retainerInvoice; } }