1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-14 07:02:34 +01:00
invoiceninja/app/Services/Chart/ChartQueries.php

266 lines
9.8 KiB
PHP
Raw Normal View History

2022-01-20 10:09:08 +01:00
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
2023-01-28 23:21:40 +01:00
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
2022-01-20 10:09:08 +01:00
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Services\Chart;
use Illuminate\Support\Facades\DB;
/**
* Class ChartQueries.
*/
trait ChartQueries
{
2022-05-20 12:05:23 +02:00
/**
* Expenses
*/
2022-01-20 10:09:08 +01:00
public function getExpenseQuery($start_date, $end_date)
{
$user_filter = $this->is_admin ? '' : 'AND expenses.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2022-01-20 10:09:08 +01:00
SELECT sum(expenses.amount) as amount,
2022-01-21 02:25:13 +01:00
IFNULL(expenses.currency_id, :company_currency) as currency_id
2022-01-20 10:09:08 +01:00
FROM expenses
WHERE expenses.is_deleted = 0
AND expenses.company_id = :company_id
AND (expenses.date BETWEEN :start_date AND :end_date)
{$user_filter}
2022-01-20 10:09:08 +01:00
GROUP BY currency_id
2023-09-04 02:27:28 +02:00
", ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]);
2022-01-20 10:09:08 +01:00
}
2022-05-20 12:05:23 +02:00
public function getExpenseChartQuery($start_date, $end_date, $currency_id)
2022-01-21 04:35:16 +01:00
{
$user_filter = $this->is_admin ? '' : 'AND expenses.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2022-01-21 04:35:16 +01:00
SELECT
2022-05-20 12:05:23 +02:00
sum(expenses.amount) as total,
expenses.date,
IFNULL(expenses.currency_id, :company_currency) AS currency_id
FROM expenses
WHERE (expenses.date BETWEEN :start_date AND :end_date)
AND expenses.company_id = :company_id
AND expenses.is_deleted = 0
{$user_filter}
2022-05-20 12:05:23 +02:00
GROUP BY expenses.date
2022-01-21 04:35:16 +01:00
HAVING currency_id = :currency_id
2023-09-04 02:27:28 +02:00
", [
2022-05-20 12:05:23 +02:00
'company_currency' => $this->company->settings->currency_id,
2022-01-21 04:35:16 +01:00
'currency_id' => $currency_id,
'company_id' => $this->company->id,
'start_date' => $start_date,
'end_date' => $end_date,
2022-01-21 04:35:16 +01:00
]);
2022-01-21 07:04:01 +01:00
}
2022-01-21 04:35:16 +01:00
2022-05-20 12:05:23 +02:00
/**
* Payments
*/
public function getPaymentQuery($start_date, $end_date)
2022-01-21 07:04:01 +01:00
{
$user_filter = $this->is_admin ? '' : 'AND payments.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2022-05-20 12:05:23 +02:00
SELECT sum(payments.amount) as amount,
IFNULL(payments.currency_id, :company_currency) as currency_id
2022-01-21 07:04:01 +01:00
FROM payments
2022-05-20 12:05:23 +02:00
WHERE payments.is_deleted = 0
{$user_filter}
2022-01-21 07:04:01 +01:00
AND payments.company_id = :company_id
2022-05-20 12:05:23 +02:00
AND (payments.date BETWEEN :start_date AND :end_date)
GROUP BY currency_id
2023-09-04 02:27:28 +02:00
", [
'company_currency' => $this->company->settings->currency_id,
'company_id' => $this->company->id,
'start_date' => $start_date,
'end_date' => $end_date,
2022-01-21 07:04:01 +01:00
]);
}
2022-05-20 12:05:23 +02:00
public function getPaymentChartQuery($start_date, $end_date, $currency_id)
2022-01-21 07:04:01 +01:00
{
$user_filter = $this->is_admin ? '' : 'AND payments.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2022-01-21 07:04:01 +01:00
SELECT
2022-05-20 12:05:23 +02:00
sum(payments.amount - payments.refunded) as total,
payments.date,
IFNULL(payments.currency_id, :company_currency) AS currency_id
FROM payments
2023-05-12 03:19:10 +02:00
WHERE payments.company_id = :company_id
2022-05-20 12:05:23 +02:00
AND payments.is_deleted = 0
{$user_filter}
2023-05-12 03:19:10 +02:00
AND payments.status_id IN (4,5,6)
2023-05-12 02:52:06 +02:00
AND (payments.date BETWEEN :start_date AND :end_date)
2022-05-20 12:05:23 +02:00
GROUP BY payments.date
2022-01-21 07:04:01 +01:00
HAVING currency_id = :currency_id
2023-09-04 02:27:28 +02:00
", [
2022-01-21 07:04:01 +01:00
'company_currency' => $this->company->settings->currency_id,
'currency_id' => $currency_id,
'company_id' => $this->company->id,
'start_date' => $start_date,
'end_date' => $end_date,
2022-01-21 07:04:01 +01:00
]);
}
2022-01-21 04:35:16 +01:00
/**
2022-05-20 12:05:23 +02:00
* Invoices
*/
public function getOutstandingQuery($start_date, $end_date)
2022-01-21 04:35:16 +01:00
{
$user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2022-01-21 04:35:16 +01:00
SELECT
2022-05-20 12:05:23 +02:00
sum(invoices.balance) as amount,
2023-05-14 01:25:08 +02:00
COUNT(*) as outstanding_count,
2023-05-12 02:52:06 +02:00
IFNULL(CAST(JSON_UNQUOTE(JSON_EXTRACT( clients.settings, '$.currency_id' )) AS SIGNED), :company_currency) AS currency_id
2022-01-21 04:35:16 +01:00
FROM clients
JOIN invoices
on invoices.client_id = clients.id
WHERE invoices.status_id IN (2,3)
AND invoices.company_id = :company_id
AND clients.is_deleted = 0
{$user_filter}
2022-01-21 04:35:16 +01:00
AND invoices.is_deleted = 0
2023-05-12 03:19:10 +02:00
AND invoices.balance > 0
2022-05-20 12:05:23 +02:00
AND (invoices.date BETWEEN :start_date AND :end_date)
2022-01-21 04:35:16 +01:00
GROUP BY currency_id
2023-09-04 02:27:28 +02:00
", ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]);
2022-01-21 04:35:16 +01:00
}
2023-08-02 11:47:26 +02:00
public function getRevenueQueryX($start_date, $end_date)
2022-05-20 12:05:23 +02:00
{
$user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2022-05-20 12:05:23 +02:00
SELECT
sum(invoices.paid_to_date) as paid_to_date,
2023-05-12 02:52:06 +02:00
IFNULL(CAST(JSON_UNQUOTE(JSON_EXTRACT( clients.settings, '$.currency_id' )) AS SIGNED), :company_currency) AS currency_id
2022-05-20 12:05:23 +02:00
FROM clients
JOIN invoices
on invoices.client_id = clients.id
2023-05-12 03:19:10 +02:00
WHERE invoices.company_id = :company_id
AND clients.is_deleted = 0
{$user_filter}
2023-05-12 03:19:10 +02:00
AND invoices.is_deleted = 0
AND invoices.amount > 0
AND invoices.status_id IN (3,4)
AND (invoices.date BETWEEN :start_date AND :end_date)
GROUP BY currency_id
2023-09-04 02:27:28 +02:00
", ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]);
2023-05-12 03:19:10 +02:00
}
2023-08-02 11:47:26 +02:00
public function getRevenueQuery($start_date, $end_date)
{
$user_filter = $this->is_admin ? '' : 'AND payments.user_id = '.$this->user->id;
2023-09-04 02:34:14 +02:00
return DB::select("
2023-08-02 11:47:26 +02:00
SELECT
sum(payments.amount - payments.refunded) as paid_to_date,
payments.currency_id AS currency_id
FROM payments
WHERE payments.company_id = :company_id
AND payments.is_deleted = 0
{$user_filter}
AND payments.status_id IN (1,4,5,6)
AND (payments.date BETWEEN :start_date AND :end_date)
GROUP BY payments.currency_id
2023-09-04 02:27:28 +02:00
", ['company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]);
2023-08-02 11:47:26 +02:00
}
2023-08-02 11:10:39 +02:00
2023-05-12 03:19:10 +02:00
public function getInvoicesQuery($start_date, $end_date)
{
$user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2023-05-12 03:19:10 +02:00
SELECT
sum(invoices.amount) as invoiced_amount,
IFNULL(CAST(JSON_UNQUOTE(JSON_EXTRACT( clients.settings, '$.currency_id' )) AS SIGNED), :company_currency) AS currency_id
FROM clients
JOIN invoices
on invoices.client_id = clients.id
WHERE invoices.status_id IN (2,3,4)
2022-05-20 12:05:23 +02:00
AND invoices.company_id = :company_id
{$user_filter}
2022-05-20 12:05:23 +02:00
AND invoices.amount > 0
AND clients.is_deleted = 0
AND invoices.is_deleted = 0
AND (invoices.date BETWEEN :start_date AND :end_date)
GROUP BY currency_id
2023-09-04 02:27:28 +02:00
", ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]);
2022-05-20 12:05:23 +02:00
}
2022-01-21 04:35:16 +01:00
2023-05-12 02:52:06 +02:00
public function getOutstandingChartQuery($start_date, $end_date, $currency_id)
{
$user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2023-05-12 02:52:06 +02:00
SELECT
sum(invoices.balance) as total,
invoices.date,
IFNULL(CAST(JSON_UNQUOTE(JSON_EXTRACT( clients.settings, '$.currency_id' )) AS SIGNED), :company_currency) AS currency_id
FROM clients
JOIN invoices
on invoices.client_id = clients.id
WHERE invoices.status_id IN (2,3,4)
AND invoices.company_id = :company_id
AND clients.is_deleted = 0
AND invoices.is_deleted = 0
{$user_filter}
2023-05-12 02:52:06 +02:00
AND (invoices.date BETWEEN :start_date AND :end_date)
GROUP BY invoices.date
HAVING currency_id = :currency_id
2023-09-04 02:27:28 +02:00
", [
2023-05-12 02:52:06 +02:00
'company_currency' => (int) $this->company->settings->currency_id,
'currency_id' => $currency_id,
'company_id' => $this->company->id,
'start_date' => $start_date,
'end_date' => $end_date,
]);
}
2022-05-20 12:05:23 +02:00
public function getInvoiceChartQuery($start_date, $end_date, $currency_id)
{
$user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id;
2023-09-04 02:27:28 +02:00
return DB::select("
2022-05-20 12:05:23 +02:00
SELECT
sum(invoices.amount) as total,
invoices.date,
2023-05-12 02:52:06 +02:00
IFNULL(CAST(JSON_UNQUOTE(JSON_EXTRACT( clients.settings, '$.currency_id' )) AS SIGNED), :company_currency) AS currency_id
2022-05-20 12:05:23 +02:00
FROM clients
JOIN invoices
on invoices.client_id = clients.id
2023-05-12 03:19:10 +02:00
WHERE invoices.company_id = :company_id
2022-05-20 12:05:23 +02:00
AND clients.is_deleted = 0
AND invoices.is_deleted = 0
{$user_filter}
2023-05-12 03:19:10 +02:00
AND invoices.status_id IN (2,3,4)
2023-05-12 02:52:06 +02:00
AND (invoices.date BETWEEN :start_date AND :end_date)
2022-05-20 12:05:23 +02:00
GROUP BY invoices.date
HAVING currency_id = :currency_id
2023-09-04 02:27:28 +02:00
", [
'company_currency' => (int) $this->company->settings->currency_id,
2022-05-20 12:05:23 +02:00
'currency_id' => $currency_id,
'company_id' => $this->company->id,
'start_date' => $start_date,
'end_date' => $end_date,
2022-05-20 12:05:23 +02:00
]);
}
}