diff --git a/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php b/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php index 1d2c0415..1bf91f38 100644 --- a/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php +++ b/app/Http/Controllers/V1/Admin/Customer/CustomerStatsController.php @@ -103,6 +103,7 @@ class CustomerStatsController extends Controller ) ->whereCompany() ->whereCustomer($customer->id) + ->where('status', '<>', Invoice::STATUS_DRAFT) ->sum('total'); $totalReceipts = Payment::whereBetween( 'payment_date', diff --git a/app/Http/Controllers/V1/Admin/Dashboard/DashboardController.php b/app/Http/Controllers/V1/Admin/Dashboard/DashboardController.php index 4e1d96d2..a92fbc23 100644 --- a/app/Http/Controllers/V1/Admin/Dashboard/DashboardController.php +++ b/app/Http/Controllers/V1/Admin/Dashboard/DashboardController.php @@ -104,6 +104,7 @@ class DashboardController extends Controller 'invoice_date', [$startDate->format('Y-m-d'), $start->format('Y-m-d')] ) + ->where('status', '<>', Invoice::STATUS_DRAFT) ->whereCompany() ->sum('base_total'); @@ -141,6 +142,7 @@ class DashboardController extends Controller $recent_due_invoices = Invoice::with('customer') ->whereCompany() ->where('base_due_amount', '>', 0) + ->where('status', '<>', Invoice::STATUS_DRAFT) ->take(5) ->latest() ->get(); diff --git a/app/Http/Controllers/V1/Admin/Invoice/InvoicesController.php b/app/Http/Controllers/V1/Admin/Invoice/InvoicesController.php index 9aeefe51..3890d289 100644 --- a/app/Http/Controllers/V1/Admin/Invoice/InvoicesController.php +++ b/app/Http/Controllers/V1/Admin/Invoice/InvoicesController.php @@ -24,6 +24,7 @@ class InvoicesController extends Controller $limit = $request->has('limit') ? $request->limit : 10; $invoices = Invoice::whereCompany() + ->whereTabFilters($request->tab_status) ->join('customers', 'customers.id', '=', 'invoices.customer_id') ->applyFilters($request->all()) ->select('invoices.*', 'customers.name') diff --git a/app/Http/Resources/EstimateResource.php b/app/Http/Resources/EstimateResource.php index 46b69ea3..e7284bd7 100644 --- a/app/Http/Resources/EstimateResource.php +++ b/app/Http/Resources/EstimateResource.php @@ -23,7 +23,7 @@ class EstimateResource extends JsonResource 'reference_number' => $this->reference_number, 'tax_per_item' => $this->tax_per_item, 'discount_per_item' => $this->discount_per_item, - 'notes' => $this->getNotes(), + 'notes' => $this->notes, 'discount' => $this->discount, 'discount_type' => $this->discount_type, 'discount_val' => $this->discount_val, diff --git a/app/Http/Resources/PaymentResource.php b/app/Http/Resources/PaymentResource.php index 0ac625f8..7350a912 100644 --- a/app/Http/Resources/PaymentResource.php +++ b/app/Http/Resources/PaymentResource.php @@ -18,7 +18,7 @@ class PaymentResource extends JsonResource 'id' => $this->id, 'payment_number' => $this->payment_number, 'payment_date' => $this->payment_date, - 'notes' => $this->getNotes(), + 'notes' => $this->notes, 'amount' => $this->amount, 'unique_hash' => $this->unique_hash, 'invoice_id' => $this->invoice_id, diff --git a/app/Models/Estimate.php b/app/Models/Estimate.php index 5b7c3b8f..8c916c6a 100644 --- a/app/Models/Estimate.php +++ b/app/Models/Estimate.php @@ -483,7 +483,8 @@ class Estimate extends Model implements HasMedia '{ESTIMATE_DATE}' => $this->formattedEstimateDate, '{ESTIMATE_EXPIRY_DATE}' => $this->formattedExpiryDate, '{ESTIMATE_NUMBER}' => $this->estimate_number, - '{ESTIMATE_REF_NUMBER}' => $this->reference_number, + '{PDF_LINK}' => $this->estimatePdfUrl, + '{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency) ]; } diff --git a/app/Models/Expense.php b/app/Models/Expense.php index bd0aa1e3..8c38268f 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -240,7 +240,7 @@ class Expense extends Model implements HasMedia } if ($request->hasFile('attachment_receipt')) { - $expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts'); + $expense->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local'); } if ($request->customFields) { @@ -267,7 +267,7 @@ class Expense extends Model implements HasMedia } if ($request->hasFile('attachment_receipt')) { $this->clearMediaCollection('receipts'); - $this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts'); + $this->addMediaFromRequest('attachment_receipt')->toMediaCollection('receipts', 'local'); } if ($request->customFields) { diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index bef7c61c..5637678b 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -187,16 +187,6 @@ class Invoice extends Model implements HasMedia return Carbon::parse($this->invoice_date)->format($dateFormat); } - public function scopeWhereStatus($query, $status) - { - return $query->where('invoices.status', $status); - } - - public function scopeWherePaidStatus($query, $status) - { - return $query->where('invoices.paid_status', $status); - } - public function scopeWhereDueStatus($query, $status) { return $query->whereIn('invoices.paid_status', [ @@ -234,6 +224,40 @@ class Invoice extends Model implements HasMedia $query->orderBy($orderByField, $orderBy); } + public function scopeWhereStatus($query, $status) + { + return $query->where('invoices.status', $status); + } + + public function scopeWherePaidStatus($query, $status) + { + return $query->where('invoices.paid_status', $status); + } + + public function scopeWhereTabFilters($query, $status) + { + if ($status == "DRAFT") { + return $query->where('invoices.status', $status); + } + + if ($status == "SENT") { + return $query->whereIn('invoices.status', [ + self::STATUS_SENT, + self::STATUS_VIEWED, + self::STATUS_COMPLETED + ]); + } + + if ($status == 'DUE') { + return $query->whereIn('invoices.paid_status', [ + self::STATUS_UNPAID, + self::STATUS_PARTIALLY_PAID, + ]); + } + + return ; + } + public function scopeApplyFilters($query, array $filters) { $filters = collect($filters); @@ -249,17 +273,11 @@ class Invoice extends Model implements HasMedia $filters->get('status') == self::STATUS_PAID ) { $query->wherePaidStatus($filters->get('status')); - } elseif ($filters->get('status') == 'DUE') { - $query->whereDueStatus($filters->get('status')); } else { $query->whereStatus($filters->get('status')); } } - if ($filters->get('paid_status')) { - $query->wherePaidStatus($filters->get('status')); - } - if ($filters->get('invoice_id')) { $query->whereInvoice($filters->get('invoice_id')); } @@ -650,7 +668,9 @@ class Invoice extends Model implements HasMedia '{INVOICE_DATE}' => $this->formattedInvoiceDate, '{INVOICE_DUE_DATE}' => $this->formattedDueDate, '{INVOICE_NUMBER}' => $this->invoice_number, - '{INVOICE_REF_NUMBER}' => $this->reference_number, + '{PDF_LINK}' => $this->invoicePdfUrl, + '{DUE_AMOUNT}' => format_money_pdf($this->due_amount, $this->customer->currency), + '{TOTAL_AMOUNT}' => format_money_pdf($this->total, $this->customer->currency) ]; } diff --git a/app/Models/Payment.php b/app/Models/Payment.php index 83a17441..68a6d6a3 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -435,7 +435,8 @@ class Payment extends Model implements HasMedia '{PAYMENT_DATE}' => $this->formattedPaymentDate, '{PAYMENT_MODE}' => $this->paymentMethod ? $this->paymentMethod->name : null, '{PAYMENT_NUMBER}' => $this->payment_number, - '{PAYMENT_AMOUNT}' => $this->reference_number, + '{PDF_LINK}' => $this->paymentPdfUrl, + '{PAYMENT_AMOUNT}' => format_money_pdf($this->amount, $this->customer->currency) ]; } diff --git a/package.json b/package.json index c8da7a6d..87db66fe 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "vite": "^2.6.1" }, "dependencies": { - "@headlessui/vue": "^1.4.0", + "@headlessui/vue": "^1.5.0", "@heroicons/vue": "^1.0.1", "@popperjs/core": "^2.9.2", "@stripe/stripe-js": "^1.21.2", @@ -48,7 +48,7 @@ "mini-svg-data-uri": "^1.3.3", "moment": "^2.29.1", "pinia": "^2.0.4", - "v-money3": "^3.13.5", + "v-money3": "3.16.1", "v-tooltip": "^4.0.0-alpha.1", "vue": "^3.2.0-beta.5", "vue-flatpickr-component": "^9.0.3", diff --git a/resources/scripts/admin/views/invoices/Index.vue b/resources/scripts/admin/views/invoices/Index.vue index c1b21874..0844278f 100644 --- a/resources/scripts/admin/views/invoices/Index.vue +++ b/resources/scripts/admin/views/invoices/Index.vue @@ -56,7 +56,7 @@ - - - - - + + + + + diff --git a/resources/scripts/admin/views/payments/Create.vue b/resources/scripts/admin/views/payments/Create.vue index 39888302..60b704b3 100644 --- a/resources/scripts/admin/views/payments/Create.vue +++ b/resources/scripts/admin/views/payments/Create.vue @@ -82,9 +82,9 @@ required > { }) const value = computed({ - get: () => props.modelValue, + get: () => (props.modelValue ? props.modelValue : ''), set: (value) => { emit('update:modelValue', value) }, @@ -195,7 +195,9 @@ async function getFields() { { label: 'Date', value: 'INVOICE_DATE' }, { label: 'Due Date', value: 'INVOICE_DUE_DATE' }, { label: 'Number', value: 'INVOICE_NUMBER' }, - { label: 'Ref Number', value: 'INVOICE_REF_NUMBER' }, + { label: 'PDF Link', value: 'PDF_LINK' }, + { label: 'Due Amount', value: 'DUE_AMOUNT' }, + { label: 'Total Amount', value: 'TOTAL_AMOUNT' }, ...invoiceFields.value.map((i) => ({ label: i.label, value: i.slug, @@ -211,7 +213,8 @@ async function getFields() { { label: 'Date', value: 'ESTIMATE_DATE' }, { label: 'Expiry Date', value: 'ESTIMATE_EXPIRY_DATE' }, { label: 'Number', value: 'ESTIMATE_NUMBER' }, - { label: 'Ref Number', value: 'ESTIMATE_REF_NUMBER' }, + { label: 'PDF Link', value: 'PDF_LINK' }, + { label: 'Total Amount', value: 'TOTAL_AMOUNT' }, ...estimateFields.value.map((i) => ({ label: i.label, value: i.slug, @@ -228,6 +231,7 @@ async function getFields() { { label: 'Number', value: 'PAYMENT_NUMBER' }, { label: 'Mode', value: 'PAYMENT_MODE' }, { label: 'Amount', value: 'PAYMENT_AMOUNT' }, + { label: 'PDF Link', value: 'PDF_LINK' }, ...paymentFields.value.map((i) => ({ label: i.label, value: i.slug, diff --git a/resources/scripts/components/base/BaseTabGroup.vue b/resources/scripts/components/base/BaseTabGroup.vue index ea84ca12..96fdf1de 100644 --- a/resources/scripts/components/base/BaseTabGroup.vue +++ b/resources/scripts/components/base/BaseTabGroup.vue @@ -1,6 +1,10 @@