2015-03-17 02:30:56 +01:00
< ? php namespace App\Http\Controllers ;
2015-03-26 07:24:02 +01:00
use Auth ;
2015-03-17 02:30:56 +01:00
use DB ;
2015-03-26 07:24:02 +01:00
use View ;
use App\Models\Activity ;
use App\Models\Invoice ;
2015-07-29 21:55:12 +02:00
use App\Models\Payment ;
2015-03-16 22:45:25 +01:00
2015-03-26 07:24:02 +01:00
class DashboardController extends BaseController
2015-03-16 22:45:25 +01:00
{
public function index ()
{
// total_income, billed_clients, invoice_sent and active_clients
$select = DB :: raw ( ' COUNT ( DISTINCT CASE WHEN invoices . id IS NOT NULL THEN clients . id ELSE null END ) billed_clients ,
SUM ( CASE WHEN invoices . invoice_status_id >= '.INVOICE_STATUS_SENT.' THEN 1 ELSE 0 END ) invoices_sent ,
COUNT ( DISTINCT clients . id ) active_clients ' );
$metrics = DB :: table ( 'accounts' )
-> select ( $select )
-> leftJoin ( 'clients' , 'accounts.id' , '=' , 'clients.account_id' )
-> leftJoin ( 'invoices' , 'clients.id' , '=' , 'invoices.client_id' )
-> where ( 'accounts.id' , '=' , Auth :: user () -> account_id )
-> where ( 'clients.is_deleted' , '=' , false )
-> where ( 'invoices.is_deleted' , '=' , false )
-> where ( 'invoices.is_recurring' , '=' , false )
-> where ( 'invoices.is_quote' , '=' , false )
-> groupBy ( 'accounts.id' )
-> first ();
$select = DB :: raw ( 'SUM(clients.paid_to_date) as value, clients.currency_id as currency_id' );
$paidToDate = DB :: table ( 'accounts' )
-> select ( $select )
-> leftJoin ( 'clients' , 'accounts.id' , '=' , 'clients.account_id' )
-> where ( 'accounts.id' , '=' , Auth :: user () -> account_id )
-> where ( 'clients.is_deleted' , '=' , false )
-> groupBy ( 'accounts.id' )
-> groupBy ( DB :: raw ( 'CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END' ))
-> get ();
$select = DB :: raw ( 'AVG(invoices.amount) as invoice_avg, clients.currency_id as currency_id' );
$averageInvoice = DB :: table ( 'accounts' )
-> select ( $select )
-> leftJoin ( 'clients' , 'accounts.id' , '=' , 'clients.account_id' )
-> leftJoin ( 'invoices' , 'clients.id' , '=' , 'invoices.client_id' )
-> where ( 'accounts.id' , '=' , Auth :: user () -> account_id )
-> where ( 'clients.is_deleted' , '=' , false )
-> where ( 'invoices.is_deleted' , '=' , false )
2015-07-24 16:13:17 +02:00
-> where ( 'invoices.is_quote' , '=' , false )
-> where ( 'invoices.is_recurring' , '=' , false )
2015-03-16 22:45:25 +01:00
-> groupBy ( 'accounts.id' )
-> groupBy ( DB :: raw ( 'CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END' ))
-> get ();
2015-07-29 21:55:12 +02:00
$select = DB :: raw ( 'SUM(clients.balance) as value, clients.currency_id as currency_id' );
$balances = DB :: table ( 'accounts' )
-> select ( $select )
-> leftJoin ( 'clients' , 'accounts.id' , '=' , 'clients.account_id' )
-> where ( 'accounts.id' , '=' , Auth :: user () -> account_id )
-> where ( 'clients.is_deleted' , '=' , false )
-> groupBy ( 'accounts.id' )
-> groupBy ( DB :: raw ( 'CASE WHEN clients.currency_id IS NULL THEN CASE WHEN accounts.currency_id IS NULL THEN 1 ELSE accounts.currency_id END ELSE clients.currency_id END' ))
-> get ();
2015-03-16 22:45:25 +01:00
$activities = Activity :: where ( 'activities.account_id' , '=' , Auth :: user () -> account_id )
2015-10-28 20:22:07 +01:00
-> with ( 'client.contacts' , 'user' , 'invoice' , 'payment' , 'credit' )
2015-05-05 11:48:23 +02:00
-> where ( 'activity_type_id' , '>' , 0 )
2015-07-29 21:55:12 +02:00
-> orderBy ( 'created_at' , 'desc' )
-> take ( 50 )
-> get ();
$pastDue = DB :: table ( 'invoices' )
-> leftJoin ( 'clients' , 'clients.id' , '=' , 'invoices.client_id' )
-> leftJoin ( 'contacts' , 'contacts.client_id' , '=' , 'clients.id' )
-> where ( 'invoices.account_id' , '=' , Auth :: user () -> account_id )
-> where ( 'clients.deleted_at' , '=' , null )
-> where ( 'contacts.deleted_at' , '=' , null )
-> where ( 'invoices.is_recurring' , '=' , false )
2015-09-07 11:07:55 +02:00
//->where('invoices.is_quote', '=', false)
2015-07-29 21:55:12 +02:00
-> where ( 'invoices.balance' , '>' , 0 )
-> where ( 'invoices.is_deleted' , '=' , false )
2015-10-06 19:55:55 +02:00
-> where ( 'invoices.deleted_at' , '=' , null )
2015-07-29 21:55:12 +02:00
-> where ( 'contacts.is_primary' , '=' , true )
-> where ( 'invoices.due_date' , '<' , date ( 'Y-m-d' ))
2015-10-06 19:55:55 +02:00
-> select ([ 'invoices.due_date' , 'invoices.balance' , 'invoices.public_id' , 'invoices.invoice_number' , 'clients.name as client_name' , 'contacts.email' , 'contacts.first_name' , 'contacts.last_name' , 'clients.currency_id' , 'clients.public_id as client_public_id' , 'is_quote' ])
2015-07-29 21:55:12 +02:00
-> orderBy ( 'invoices.due_date' , 'asc' )
-> take ( 50 )
-> get ();
$upcoming = DB :: table ( 'invoices' )
-> leftJoin ( 'clients' , 'clients.id' , '=' , 'invoices.client_id' )
-> leftJoin ( 'contacts' , 'contacts.client_id' , '=' , 'clients.id' )
-> where ( 'invoices.account_id' , '=' , Auth :: user () -> account_id )
-> where ( 'clients.deleted_at' , '=' , null )
-> where ( 'contacts.deleted_at' , '=' , null )
2015-10-06 19:55:55 +02:00
-> where ( 'invoices.deleted_at' , '=' , null )
2015-07-29 21:55:12 +02:00
-> where ( 'invoices.is_recurring' , '=' , false )
2015-09-07 11:07:55 +02:00
//->where('invoices.is_quote', '=', false)
2015-07-29 21:55:12 +02:00
-> where ( 'invoices.balance' , '>' , 0 )
-> where ( 'invoices.is_deleted' , '=' , false )
-> where ( 'contacts.is_primary' , '=' , true )
-> where ( 'invoices.due_date' , '>=' , date ( 'Y-m-d' ))
-> orderBy ( 'invoices.due_date' , 'asc' )
-> take ( 50 )
2015-10-06 19:55:55 +02:00
-> select ([ 'invoices.due_date' , 'invoices.balance' , 'invoices.public_id' , 'invoices.invoice_number' , 'clients.name as client_name' , 'contacts.email' , 'contacts.first_name' , 'contacts.last_name' , 'clients.currency_id' , 'clients.public_id as client_public_id' , 'is_quote' ])
2015-07-29 21:55:12 +02:00
-> get ();
2015-03-16 22:45:25 +01:00
2015-07-29 21:55:12 +02:00
$payments = DB :: table ( 'payments' )
-> leftJoin ( 'clients' , 'clients.id' , '=' , 'payments.client_id' )
-> leftJoin ( 'contacts' , 'contacts.client_id' , '=' , 'clients.id' )
-> leftJoin ( 'invoices' , 'invoices.id' , '=' , 'payments.invoice_id' )
-> where ( 'payments.account_id' , '=' , Auth :: user () -> account_id )
2015-11-02 19:43:22 +01:00
-> where ( 'payments.deleted_at' , '=' , null )
2015-11-17 09:55:33 +01:00
-> where ( 'invoices.deleted_at' , '=' , null )
2015-07-29 21:55:12 +02:00
-> where ( 'clients.deleted_at' , '=' , null )
-> where ( 'contacts.deleted_at' , '=' , null )
-> where ( 'contacts.is_primary' , '=' , true )
-> select ([ 'payments.payment_date' , 'payments.amount' , 'invoices.public_id' , 'invoices.invoice_number' , 'clients.name as client_name' , 'contacts.email' , 'contacts.first_name' , 'contacts.last_name' , 'clients.currency_id' , 'clients.public_id as client_public_id' ])
2015-07-30 16:44:47 +02:00
-> orderBy ( 'payments.id' , 'desc' )
2015-07-29 21:55:12 +02:00
-> take ( 50 )
-> get ();
2015-03-16 22:45:25 +01:00
2015-10-06 19:55:55 +02:00
$hasQuotes = false ;
foreach ([ $upcoming , $pastDue ] as $data ) {
foreach ( $data as $invoice ) {
if ( $invoice -> is_quote ) {
$hasQuotes = true ;
}
}
}
2015-03-16 22:45:25 +01:00
$data = [
2015-08-20 17:09:04 +02:00
'account' => Auth :: user () -> account ,
'paidToDate' => $paidToDate ,
'balances' => $balances ,
'averageInvoice' => $averageInvoice ,
'invoicesSent' => $metrics ? $metrics -> invoices_sent : 0 ,
'activeClients' => $metrics ? $metrics -> active_clients : 0 ,
'activities' => $activities ,
'pastDue' => $pastDue ,
'upcoming' => $upcoming ,
'payments' => $payments ,
'title' => trans ( 'texts.dashboard' ),
2015-10-06 19:55:55 +02:00
'hasQuotes' => $hasQuotes ,
2015-08-20 17:09:04 +02:00
];
2015-03-16 22:45:25 +01:00
return View :: make ( 'dashboard' , $data );
}
}