2015-03-24 09:21:12 +01:00
< ? php namespace App\Ninja\Repositories ;
2015-03-16 22:45:25 +01:00
2015-10-28 20:22:07 +01:00
use Utils ;
2015-03-31 11:38:24 +02:00
use App\Models\Payment ;
use App\Models\Credit ;
use App\Models\Invoice ;
use App\Models\Client ;
2015-10-28 20:22:07 +01:00
use App\Ninja\Repositories\BaseRepository ;
2015-03-16 22:45:25 +01:00
2015-10-28 20:22:07 +01:00
class PaymentRepository extends BaseRepository
2015-03-16 22:45:25 +01:00
{
2015-10-28 20:22:07 +01:00
public function getClassName ()
{
return 'App\Models\Payment' ;
}
2015-03-16 22:45:25 +01:00
public function find ( $clientPublicId = null , $filter = null )
{
$query = \DB :: table ( 'payments' )
-> join ( 'clients' , 'clients.id' , '=' , 'payments.client_id' )
-> join ( 'invoices' , 'invoices.id' , '=' , 'payments.invoice_id' )
-> join ( 'contacts' , 'contacts.client_id' , '=' , 'clients.id' )
-> leftJoin ( 'payment_types' , 'payment_types.id' , '=' , 'payments.payment_type_id' )
2015-06-04 22:53:58 +02:00
-> leftJoin ( 'account_gateways' , 'account_gateways.id' , '=' , 'payments.account_gateway_id' )
-> leftJoin ( 'gateways' , 'gateways.id' , '=' , 'account_gateways.gateway_id' )
2015-03-16 22:45:25 +01:00
-> where ( 'payments.account_id' , '=' , \Auth :: user () -> account_id )
-> where ( 'clients.deleted_at' , '=' , null )
-> where ( 'contacts.is_primary' , '=' , true )
-> where ( 'contacts.deleted_at' , '=' , null )
2015-10-30 13:56:25 +01:00
-> where ( 'invoices.deleted_at' , '=' , null )
-> select ( 'payments.public_id' ,
'payments.transaction_reference' ,
'clients.name as client_name' ,
'clients.public_id as client_public_id' ,
'payments.amount' ,
'payments.payment_date' ,
'invoices.public_id as invoice_public_id' ,
'invoices.invoice_number' ,
'clients.currency_id' ,
'contacts.first_name' ,
'contacts.last_name' ,
'contacts.email' ,
'payment_types.name as payment_type' ,
'payments.account_gateway_id' ,
'payments.deleted_at' ,
'payments.is_deleted' ,
'invoices.is_deleted as invoice_is_deleted' ,
'gateways.name as gateway_name'
);
2015-03-16 22:45:25 +01:00
if ( ! \Session :: get ( 'show_trash:payment' )) {
2015-10-30 13:56:25 +01:00
$query -> where ( 'payments.deleted_at' , '=' , null );
2015-03-16 22:45:25 +01:00
}
if ( $clientPublicId ) {
$query -> where ( 'clients.public_id' , '=' , $clientPublicId );
}
if ( $filter ) {
$query -> where ( function ( $query ) use ( $filter ) {
$query -> where ( 'clients.name' , 'like' , '%' . $filter . '%' );
});
}
return $query ;
}
public function findForContact ( $contactId = null , $filter = null )
{
$query = \DB :: table ( 'payments' )
-> join ( 'clients' , 'clients.id' , '=' , 'payments.client_id' )
-> join ( 'invoices' , 'invoices.id' , '=' , 'payments.invoice_id' )
-> join ( 'contacts' , 'contacts.client_id' , '=' , 'clients.id' )
-> leftJoin ( 'invitations' , function ( $join ) {
$join -> on ( 'invitations.invoice_id' , '=' , 'invoices.id' )
-> on ( 'invitations.contact_id' , '=' , 'contacts.id' );
})
-> leftJoin ( 'payment_types' , 'payment_types.id' , '=' , 'payments.payment_type_id' )
-> where ( 'clients.is_deleted' , '=' , false )
-> where ( 'payments.is_deleted' , '=' , false )
-> where ( 'invitations.deleted_at' , '=' , null )
-> where ( 'invoices.deleted_at' , '=' , null )
-> where ( 'invitations.contact_id' , '=' , $contactId )
-> select ( 'invitations.invitation_key' , 'payments.public_id' , 'payments.transaction_reference' , 'clients.name as client_name' , 'clients.public_id as client_public_id' , 'payments.amount' , 'payments.payment_date' , 'invoices.public_id as invoice_public_id' , 'invoices.invoice_number' , 'clients.currency_id' , 'contacts.first_name' , 'contacts.last_name' , 'contacts.email' , 'payment_types.name as payment_type' , 'payments.account_gateway_id' );
if ( $filter ) {
$query -> where ( function ( $query ) use ( $filter ) {
$query -> where ( 'clients.name' , 'like' , '%' . $filter . '%' );
});
}
return $query ;
}
2015-10-28 20:22:07 +01:00
public function save ( $input )
2015-03-16 22:45:25 +01:00
{
2015-10-28 20:22:07 +01:00
$publicId = isset ( $input [ 'public_id' ]) ? $input [ 'public_id' ] : false ;
2015-03-16 22:45:25 +01:00
if ( $publicId ) {
$payment = Payment :: scope ( $publicId ) -> firstOrFail ();
} else {
$payment = Payment :: createNew ();
}
2015-06-10 10:34:20 +02:00
$paymentTypeId = false ;
if ( isset ( $input [ 'payment_type_id' ])) {
$paymentTypeId = $input [ 'payment_type_id' ] ? $input [ 'payment_type_id' ] : null ;
$payment -> payment_type_id = $paymentTypeId ;
}
2015-07-05 10:01:16 +02:00
if ( isset ( $input [ 'payment_date_sql' ])) {
$payment -> payment_date = $input [ 'payment_date_sql' ];
} elseif ( isset ( $input [ 'payment_date' ])) {
$payment -> payment_date = Utils :: toSqlDate ( $input [ 'payment_date' ]);
} else {
$payment -> payment_date = date ( 'Y-m-d' );
}
2015-11-18 15:40:50 +01:00
if ( isset ( $input [ 'transaction_reference' ])) {
$payment -> transaction_reference = trim ( $input [ 'transaction_reference' ]);
}
2015-03-16 22:45:25 +01:00
if ( ! $publicId ) {
2015-11-18 15:40:50 +01:00
$clientId = Client :: getPrivateId ( isset ( $input [ 'client_id' ]) ? $input [ 'client_id' ] : $input [ 'client' ]);
2015-03-16 22:45:25 +01:00
$amount = Utils :: parseFloat ( $input [ 'amount' ]);
if ( $paymentTypeId == PAYMENT_TYPE_CREDIT ) {
$credits = Credit :: scope () -> where ( 'client_id' , '=' , $clientId )
-> where ( 'balance' , '>' , 0 ) -> orderBy ( 'created_at' ) -> get ();
$applied = 0 ;
foreach ( $credits as $credit ) {
$applied += $credit -> apply ( $amount );
if ( $applied >= $amount ) {
break ;
}
}
}
$payment -> client_id = $clientId ;
$payment -> amount = $amount ;
2015-11-18 15:40:50 +01:00
$invoicePublicId = isset ( $input [ 'invoice_id' ]) ? $input [ 'invoice_id' ] : $input [ 'invoice' ];
$payment -> invoice_id = Invoice :: getPrivateId ( $invoicePublicId );
2015-03-16 22:45:25 +01:00
}
$payment -> save ();
return $payment ;
}
2015-10-30 13:56:25 +01:00
public function delete ( $payment )
{
if ( $payment -> invoice -> is_deleted ) {
return false ;
}
parent :: delete ( $payment );
}
public function restore ( $payment )
{
if ( $payment -> invoice -> is_deleted ) {
return false ;
}
parent :: restore ( $payment );
}
2015-03-16 22:45:25 +01:00
}