mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-09-20 00:11:35 +02:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
76f90b7ff3
@ -16,9 +16,19 @@ use App\Models\Account;
|
||||
use App\Models\AccountGateway;
|
||||
|
||||
use App\Ninja\Repositories\AccountRepository;
|
||||
use App\Services\AccountGatewayService;
|
||||
|
||||
class AccountGatewayController extends BaseController
|
||||
{
|
||||
protected $accountGatewayService;
|
||||
|
||||
public function __construct(AccountGatewayService $accountGatewayService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->accountGatewayService = $accountGatewayService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return Redirect::to('settings/' . ACCOUNT_PAYMENTS);
|
||||
@ -26,35 +36,7 @@ class AccountGatewayController extends BaseController
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$query = DB::table('account_gateways')
|
||||
->join('gateways', 'gateways.id', '=', 'account_gateways.gateway_id')
|
||||
->where('account_gateways.deleted_at', '=', null)
|
||||
->where('account_gateways.account_id', '=', Auth::user()->account_id)
|
||||
->select('account_gateways.public_id', 'gateways.name', 'account_gateways.deleted_at', 'account_gateways.gateway_id');
|
||||
|
||||
return Datatable::query($query)
|
||||
->addColumn('name', function ($model) { return link_to('gateways/'.$model->public_id.'/edit', $model->name); })
|
||||
->addColumn('payment_type', function ($model) { return Gateway::getPrettyPaymentType($model->gateway_id); })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
$actions = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at) {
|
||||
$actions .= '<li><a href="'.URL::to('gateways/'.$model->public_id).'/edit">'.uctrans('texts.edit_gateway').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="javascript:deleteAccountGateway('.$model->public_id.')">'.uctrans('texts.delete_gateway').'</a></li>';
|
||||
}
|
||||
|
||||
$actions .= '</ul>
|
||||
</div>';
|
||||
|
||||
return $actions;
|
||||
})
|
||||
->orderColumns(['name'])
|
||||
->make();
|
||||
return $this->accountGatewayService->getDatatable(Auth::user()->account_id);
|
||||
}
|
||||
|
||||
public function edit($publicId)
|
||||
@ -165,14 +147,14 @@ class AccountGatewayController extends BaseController
|
||||
];
|
||||
}
|
||||
|
||||
public function delete()
|
||||
|
||||
public function bulk()
|
||||
{
|
||||
$accountGatewayPublicId = Input::get('accountGatewayPublicId');
|
||||
$gateway = AccountGateway::scope($accountGatewayPublicId)->firstOrFail();
|
||||
$action = Input::get('bulk_action');
|
||||
$ids = Input::get('bulk_public_id');
|
||||
$count = $this->accountGatewayService->bulk($ids, $action);
|
||||
|
||||
$gateway->delete();
|
||||
|
||||
Session::flash('message', trans('texts.deleted_gateway'));
|
||||
Session::flash('message', trans('texts.archived_account_gateway'));
|
||||
|
||||
return Redirect::to('settings/' . ACCOUNT_PAYMENTS);
|
||||
}
|
||||
|
@ -7,46 +7,21 @@ use Utils;
|
||||
use View;
|
||||
use App\Models\Client;
|
||||
use App\Models\Activity;
|
||||
use App\Ninja\Repositories\ActivityRepository;
|
||||
use App\Services\ActivityService;
|
||||
|
||||
class ActivityController extends BaseController
|
||||
{
|
||||
protected $activityRepo;
|
||||
protected $activityService;
|
||||
|
||||
public function __construct(ActivityRepository $activityRepo)
|
||||
public function __construct(ActivityService $activityService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->activityRepo = $activityRepo;
|
||||
$this->activityService = $activityService;
|
||||
}
|
||||
|
||||
public function getDatatable($clientPublicId)
|
||||
{
|
||||
$clientId = Client::getPrivateId($clientPublicId);
|
||||
|
||||
if ( ! $clientId) {
|
||||
app()->abort(404);
|
||||
}
|
||||
|
||||
$query = $this->activityRepo->findByClientId($clientId);
|
||||
|
||||
return Datatable::query($query)
|
||||
->addColumn('activities.id', function ($model) { return Utils::timestampToDateTimeString(strtotime($model->created_at)); })
|
||||
->addColumn('activity_type_id', function ($model) {
|
||||
$data = [
|
||||
'client' => link_to('/clients/' . $model->client_public_id, Utils::getClientDisplayName($model)),
|
||||
'user' => $model->is_system ? '<i>' . trans('texts.system') . '</i>' : Utils::getPersonDisplayName($model->user_first_name, $model->user_last_name, $model->user_email),
|
||||
'invoice' => $model->invoice ? link_to('/invoices/' . $model->invoice_public_id, $model->is_recurring ? trans('texts.recurring_invoice') : $model->invoice) : null,
|
||||
'quote' => $model->invoice ? link_to('/quotes/' . $model->invoice_public_id, $model->invoice) : null,
|
||||
'contact' => $model->contact_id ? link_to('/clients/' . $model->client_public_id, Utils::getClientDisplayName($model)) : Utils::getPersonDisplayName($model->user_first_name, $model->user_last_name, $model->user_email),
|
||||
'payment' => $model->payment ?: '',
|
||||
'credit' => Utils::formatMoney($model->credit, $model->currency_id)
|
||||
];
|
||||
|
||||
return trans("texts.activity_{$model->activity_type_id}", $data);
|
||||
})
|
||||
->addColumn('balance', function ($model) { return Utils::formatMoney($model->balance, $model->currency_id); })
|
||||
->addColumn('adjustment', function ($model) { return $model->adjustment != 0 ? Utils::wrapAdjustment($model->adjustment, $model->currency_id) : ''; })
|
||||
->make();
|
||||
return $this->activityService->getDatatable($clientPublicId);
|
||||
}
|
||||
}
|
||||
|
@ -51,57 +51,13 @@ class ClientController extends BaseController
|
||||
'entityType' => ENTITY_CLIENT,
|
||||
'title' => trans('texts.clients'),
|
||||
'sortCol' => '4',
|
||||
'columns' => Utils::trans(['checkbox', 'client', 'contact', 'email', 'date_created', 'last_login', 'balance', 'action']),
|
||||
'columns' => Utils::trans(['checkbox', 'client', 'contact', 'email', 'date_created', 'last_login', 'balance', '']),
|
||||
));
|
||||
}
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$clients = $this->clientRepo->find(Input::get('sSearch'));
|
||||
|
||||
return Datatable::query($clients)
|
||||
->addColumn('checkbox', function ($model) { return '<input type="checkbox" name="ids[]" value="'.$model->public_id.'" '.Utils::getEntityRowClass($model).'>'; })
|
||||
->addColumn('name', function ($model) { return link_to('clients/'.$model->public_id, $model->name); })
|
||||
->addColumn('first_name', function ($model) { return link_to('clients/'.$model->public_id, $model->first_name.' '.$model->last_name); })
|
||||
->addColumn('email', function ($model) { return link_to('clients/'.$model->public_id, $model->email); })
|
||||
->addColumn('clients.created_at', function ($model) { return Utils::timestampToDateString(strtotime($model->created_at)); })
|
||||
->addColumn('last_login', function ($model) { return Utils::timestampToDateString(strtotime($model->last_login)); })
|
||||
->addColumn('balance', function ($model) { return Utils::formatMoney($model->balance, $model->currency_id); })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
|
||||
$str = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li><a href="'.URL::to('clients/'.$model->public_id.'/edit').'">'.trans('texts.edit_client').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="'.URL::to('tasks/create/'.$model->public_id).'">'.trans('texts.new_task').'</a></li>
|
||||
<li><a href="'.URL::to('invoices/create/'.$model->public_id).'">'.trans('texts.new_invoice').'</a></li>';
|
||||
|
||||
if (Auth::user()->isPro()) {
|
||||
$str .= '<li><a href="'.URL::to('quotes/create/'.$model->public_id).'">'.trans('texts.new_quote').'</a></li>';
|
||||
}
|
||||
|
||||
$str .= '<li class="divider"></li>
|
||||
<li><a href="'.URL::to('payments/create/'.$model->public_id).'">'.trans('texts.enter_payment').'</a></li>
|
||||
<li><a href="'.URL::to('credits/create/'.$model->public_id).'">'.trans('texts.enter_credit').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="javascript:archiveEntity('.$model->public_id.')">'.trans('texts.archive_client').'</a></li>';
|
||||
} else {
|
||||
$str .= '<li><a href="javascript:restoreEntity('.$model->public_id.')">'.trans('texts.restore_client').'</a></li>';
|
||||
}
|
||||
|
||||
if ($model->is_deleted) {
|
||||
return $str. '</ul></div>';
|
||||
}
|
||||
|
||||
return $str.'<li><a href="javascript:deleteEntity('.$model->public_id.')">'.trans('texts.delete_client').'</a></li></ul>
|
||||
</div>';
|
||||
})
|
||||
->make();
|
||||
return $this->clientService->getDatatable(Input::get('sSearch'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -16,7 +16,7 @@ use App\Http\Requests\CreateCreditRequest;
|
||||
class CreditController extends BaseController
|
||||
{
|
||||
protected $creditRepo;
|
||||
protected $CreditService;
|
||||
protected $creditService;
|
||||
|
||||
public function __construct(CreditRepository $creditRepo, CreditService $creditService)
|
||||
{
|
||||
@ -37,48 +37,13 @@ class CreditController extends BaseController
|
||||
'entityType' => ENTITY_CREDIT,
|
||||
'title' => trans('texts.credits'),
|
||||
'sortCol' => '4',
|
||||
'columns' => Utils::trans(['checkbox', 'client', 'credit_amount', 'credit_balance', 'credit_date', 'private_notes', 'action']),
|
||||
'columns' => Utils::trans(['checkbox', 'client', 'credit_amount', 'credit_balance', 'credit_date', 'private_notes', '']),
|
||||
));
|
||||
}
|
||||
|
||||
public function getDatatable($clientPublicId = null)
|
||||
{
|
||||
$credits = $this->creditRepo->find($clientPublicId, Input::get('sSearch'));
|
||||
|
||||
$table = Datatable::query($credits);
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('checkbox', function ($model) { return '<input type="checkbox" name="ids[]" value="'.$model->public_id.'" '.Utils::getEntityRowClass($model).'>'; })
|
||||
->addColumn('client_name', function ($model) { return link_to('clients/'.$model->client_public_id, Utils::getClientDisplayName($model)); });
|
||||
}
|
||||
|
||||
return $table->addColumn('amount', function ($model) { return Utils::formatMoney($model->amount, $model->currency_id).'<span '.Utils::getEntityRowClass($model).'/>'; })
|
||||
->addColumn('balance', function ($model) { return Utils::formatMoney($model->balance, $model->currency_id); })
|
||||
->addColumn('credit_date', function ($model) { return Utils::fromSqlDate($model->credit_date); })
|
||||
->addColumn('private_notes', function ($model) { return $model->private_notes; })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
if ($model->is_deleted) {
|
||||
return '<div style="height:38px"/>';
|
||||
}
|
||||
|
||||
$str = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li><a href="'.URL::to('payments/create/'.$model->client_public_id).'?paymentTypeId=1">'.trans('texts.apply_credit').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="javascript:archiveEntity('.$model->public_id.')">'.trans('texts.archive_credit').'</a></li>';
|
||||
} else {
|
||||
$str .= '<li><a href="javascript:restoreEntity('.$model->public_id.')">'.trans('texts.restore_credit').'</a></li>';
|
||||
}
|
||||
|
||||
return $str.'<li><a href="javascript:deleteEntity('.$model->public_id.')">'.trans('texts.delete_credit').'</a></li></ul>
|
||||
</div>';
|
||||
})
|
||||
->make();
|
||||
return $this->creditService->getDatatable($clientPublicId, Input::get('sSearch'));
|
||||
}
|
||||
|
||||
public function create($clientPublicId = 0)
|
||||
|
@ -32,8 +32,8 @@ use App\Ninja\Repositories\InvoiceRepository;
|
||||
use App\Ninja\Repositories\ClientRepository;
|
||||
use App\Events\InvoiceInvitationWasViewed;
|
||||
use App\Events\QuoteInvitationWasViewed;
|
||||
|
||||
use App\Services\InvoiceService;
|
||||
use App\Services\RecurringInvoiceService;
|
||||
use App\Http\Requests\SaveInvoiceRequest;
|
||||
|
||||
class InvoiceController extends BaseController
|
||||
@ -42,8 +42,9 @@ class InvoiceController extends BaseController
|
||||
protected $invoiceRepo;
|
||||
protected $clientRepo;
|
||||
protected $invoiceService;
|
||||
protected $recurringInvoiceService;
|
||||
|
||||
public function __construct(Mailer $mailer, InvoiceRepository $invoiceRepo, ClientRepository $clientRepo, InvoiceService $invoiceService)
|
||||
public function __construct(Mailer $mailer, InvoiceRepository $invoiceRepo, ClientRepository $clientRepo, InvoiceService $invoiceService, RecurringInvoiceService $recurringInvoiceService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
@ -51,6 +52,7 @@ class InvoiceController extends BaseController
|
||||
$this->invoiceRepo = $invoiceRepo;
|
||||
$this->clientRepo = $clientRepo;
|
||||
$this->invoiceService = $invoiceService;
|
||||
$this->recurringInvoiceService = $recurringInvoiceService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
@ -67,7 +69,7 @@ class InvoiceController extends BaseController
|
||||
'balance_due',
|
||||
'due_date',
|
||||
'status',
|
||||
'action'
|
||||
''
|
||||
]),
|
||||
];
|
||||
|
||||
@ -79,49 +81,15 @@ class InvoiceController extends BaseController
|
||||
$accountId = Auth::user()->account_id;
|
||||
$search = Input::get('sSearch');
|
||||
|
||||
return $this->invoiceRepo->getDatatable($accountId, $clientPublicId, ENTITY_INVOICE, $search);
|
||||
return $this->invoiceService->getDatatable($accountId, $clientPublicId, ENTITY_INVOICE, $search);
|
||||
}
|
||||
|
||||
public function getRecurringDatatable($clientPublicId = null)
|
||||
{
|
||||
$query = $this->invoiceRepo->getRecurringInvoices(Auth::user()->account_id, $clientPublicId, Input::get('sSearch'));
|
||||
$table = Datatable::query($query);
|
||||
$accountId = Auth::user()->account_id;
|
||||
$search = Input::get('sSearch');
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('checkbox', function ($model) { return '<input type="checkbox" name="ids[]" value="'.$model->public_id.'" '.Utils::getEntityRowClass($model).'>'; });
|
||||
}
|
||||
|
||||
$table->addColumn('frequency', function ($model) { return link_to('invoices/'.$model->public_id, $model->frequency); });
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('client_name', function ($model) { return link_to('clients/'.$model->client_public_id, Utils::getClientDisplayName($model)); });
|
||||
}
|
||||
|
||||
return $table->addColumn('start_date', function ($model) { return Utils::fromSqlDate($model->start_date); })
|
||||
->addColumn('end_date', function ($model) { return Utils::fromSqlDate($model->end_date); })
|
||||
->addColumn('amount', function ($model) { return Utils::formatMoney($model->amount, $model->currency_id); })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
|
||||
$str = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li><a href="'.URL::to('invoices/'.$model->public_id.'/edit').'">'.trans('texts.edit_invoice').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="javascript:archiveEntity('.$model->public_id.')">'.trans('texts.archive_invoice').'</a></li>
|
||||
<li><a href="javascript:deleteEntity('.$model->public_id.')">'.trans('texts.delete_invoice').'</a></li>';
|
||||
} else {
|
||||
$str .= '<li><a href="javascript:restoreEntity('.$model->public_id.')">'.trans('texts.restore_invoice').'</a></li>';
|
||||
}
|
||||
|
||||
return $str.'</ul>
|
||||
</div>';
|
||||
|
||||
})
|
||||
->make();
|
||||
return $this->recurringInvoiceService->getDatatable($accountId, $clientPublicId, ENTITY_RECURRING_INVOICE, $search);
|
||||
}
|
||||
|
||||
public function view($invitationKey)
|
||||
|
@ -46,57 +46,13 @@ class PaymentController extends BaseController
|
||||
return View::make('list', array(
|
||||
'entityType' => ENTITY_PAYMENT,
|
||||
'title' => trans('texts.payments'),
|
||||
'columns' => Utils::trans(['checkbox', 'invoice', 'client', 'transaction_reference', 'method', 'payment_amount', 'payment_date', 'action']),
|
||||
'columns' => Utils::trans(['checkbox', 'invoice', 'client', 'transaction_reference', 'method', 'payment_amount', 'payment_date', '']),
|
||||
));
|
||||
}
|
||||
|
||||
public function getDatatable($clientPublicId = null)
|
||||
{
|
||||
$payments = $this->paymentRepo->find($clientPublicId, Input::get('sSearch'));
|
||||
$table = Datatable::query($payments);
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('checkbox', function ($model) { return '<input type="checkbox" name="ids[]" value="'.$model->public_id.'" '.Utils::getEntityRowClass($model).'>'; });
|
||||
}
|
||||
|
||||
$table->addColumn('invoice_number', function ($model) { return $model->invoice_public_id ? link_to('invoices/'.$model->invoice_public_id.'/edit', $model->invoice_number, ['class' => Utils::getEntityRowClass($model)]) : ''; });
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('client_name', function ($model) { return link_to('clients/'.$model->client_public_id, Utils::getClientDisplayName($model)); });
|
||||
}
|
||||
|
||||
$table->addColumn('transaction_reference', function ($model) { return $model->transaction_reference ? $model->transaction_reference : '<i>Manual entry</i>'; })
|
||||
->addColumn('payment_type', function ($model) { return $model->payment_type ? $model->payment_type : ($model->account_gateway_id ? $model->gateway_name : ''); });
|
||||
|
||||
return $table->addColumn('amount', function ($model) { return Utils::formatMoney($model->amount, $model->currency_id); })
|
||||
->addColumn('payment_date', function ($model) { return Utils::dateToString($model->payment_date); })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
if ($model->invoice_is_deleted) {
|
||||
return '<div style="height:38px"/>';
|
||||
}
|
||||
|
||||
$str = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li><a href="payments/'.$model->public_id.'/edit">'.trans('texts.edit_payment').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="javascript:archiveEntity('.$model->public_id.')">'.trans('texts.archive_payment').'</a></li>';
|
||||
} else {
|
||||
$str .= '<li><a href="javascript:restoreEntity('.$model->public_id.')">'.trans('texts.restore_payment').'</a></li>';
|
||||
}
|
||||
|
||||
if ($model->is_deleted) {
|
||||
return $str;
|
||||
}
|
||||
|
||||
return $str.'<li><a href="javascript:deleteEntity('.$model->public_id.')">'.trans('texts.delete_payment').'</a></li></ul>
|
||||
</div>';
|
||||
})
|
||||
->make();
|
||||
return $this->paymentService->getDatatable($clientPublicId, Input::get('sSearch'));
|
||||
}
|
||||
|
||||
public function create($clientPublicId = 0, $invoicePublicId = 0)
|
||||
|
@ -13,9 +13,19 @@ use Redirect;
|
||||
|
||||
use App\Models\Product;
|
||||
use App\Models\TaxRate;
|
||||
use App\Services\ProductService;
|
||||
|
||||
class ProductController extends BaseController
|
||||
{
|
||||
protected $productService;
|
||||
|
||||
public function __construct(ProductService $productService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->productService = $productService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return Redirect::to('settings/' . ACCOUNT_PRODUCTS);
|
||||
@ -23,40 +33,7 @@ class ProductController extends BaseController
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$account = Auth::user()->account;
|
||||
|
||||
$query = DB::table('products')
|
||||
->leftJoin('tax_rates', function($join){
|
||||
$join->on('tax_rates.id', '=', 'products.default_tax_rate_id')
|
||||
->whereNull('tax_rates.deleted_at');
|
||||
})
|
||||
->where('products.account_id', '=', Auth::user()->account_id)
|
||||
->where('products.deleted_at', '=', null)
|
||||
->select('products.public_id', 'products.product_key', 'products.notes', 'products.cost', 'tax_rates.name as tax_name', 'tax_rates.rate as tax_rate');
|
||||
|
||||
$datatable = Datatable::query($query)
|
||||
->addColumn('product_key', function ($model) { return link_to('products/'.$model->public_id.'/edit', $model->product_key); })
|
||||
->addColumn('notes', function ($model) { return nl2br(Str::limit($model->notes, 100)); })
|
||||
->addColumn('cost', function ($model) { return Utils::formatMoney($model->cost); });
|
||||
|
||||
if ($account->invoice_item_taxes) {
|
||||
$datatable->addColumn('tax_rate', function ($model) { return $model->tax_rate ? ($model->tax_name . ' ' . $model->tax_rate . '%') : ''; });
|
||||
}
|
||||
|
||||
return $datatable->addColumn('dropdown', function ($model) {
|
||||
return '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="'.URL::to('products/'.$model->public_id).'/edit">'.uctrans('texts.edit_product').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="'.URL::to('products/'.$model->public_id).'/archive">'.uctrans('texts.archive_product').'</a></li>
|
||||
</ul>
|
||||
</div>';
|
||||
})
|
||||
->orderColumns(['cost', 'product_key', 'cost'])
|
||||
->make();
|
||||
return $this->productService->getDatatable(Auth::user()->account_id);
|
||||
}
|
||||
|
||||
public function edit($publicId)
|
||||
@ -122,10 +99,11 @@ class ProductController extends BaseController
|
||||
return Redirect::to('settings/' . ACCOUNT_PRODUCTS);
|
||||
}
|
||||
|
||||
public function archive($publicId)
|
||||
public function bulk()
|
||||
{
|
||||
$product = Product::scope($publicId)->firstOrFail();
|
||||
$product->delete();
|
||||
$action = Input::get('bulk_action');
|
||||
$ids = Input::get('bulk_public_id');
|
||||
$count = $this->productService->bulk($ids, $action);
|
||||
|
||||
Session::flash('message', trans('texts.archived_product'));
|
||||
|
||||
|
@ -73,7 +73,7 @@ class QuoteController extends BaseController
|
||||
$accountId = Auth::user()->account_id;
|
||||
$search = Input::get('sSearch');
|
||||
|
||||
return $this->invoiceRepo->getDatatable($accountId, $clientPublicId, ENTITY_QUOTE, $search);
|
||||
return $this->invoiceService->getDatatable($accountId, $clientPublicId, ENTITY_QUOTE, $search);
|
||||
}
|
||||
|
||||
public function create($clientPublicId = 0)
|
||||
@ -126,16 +126,16 @@ class QuoteController extends BaseController
|
||||
public function bulk()
|
||||
{
|
||||
$action = Input::get('bulk_action') ?: Input::get('action');;
|
||||
$ids = Input::get('bulk_public_id') ?: (Input::get('public_id') ?: Input::get('ids'));
|
||||
|
||||
if ($action == 'convert') {
|
||||
$invoice = Invoice::with('invoice_items')->scope(Input::get('id'))->firstOrFail();
|
||||
$invoice = Invoice::with('invoice_items')->scope($ids)->firstOrFail();
|
||||
$clone = $this->invoiceService->approveQuote($invoice);
|
||||
|
||||
Session::flash('message', trans('texts.converted_to_invoice'));
|
||||
return Redirect::to('invoices/'.$clone->public_id);
|
||||
}
|
||||
|
||||
$ids = Input::get('bulk_public_id') ?: (Input::get('public_id') ?: Input::get('ids'));
|
||||
$count = $this->invoiceService->bulk($ids, $action);
|
||||
|
||||
if ($count > 0) {
|
||||
|
@ -16,17 +16,20 @@ use App\Models\Client;
|
||||
use App\Models\Task;
|
||||
use App\Ninja\Repositories\TaskRepository;
|
||||
use App\Ninja\Repositories\InvoiceRepository;
|
||||
use App\Services\TaskService;
|
||||
|
||||
class TaskController extends BaseController
|
||||
{
|
||||
protected $taskRepo;
|
||||
protected $taskService;
|
||||
|
||||
public function __construct(TaskRepository $taskRepo, InvoiceRepository $invoiceRepo)
|
||||
public function __construct(TaskRepository $taskRepo, InvoiceRepository $invoiceRepo, TaskService $taskService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->taskRepo = $taskRepo;
|
||||
$this->invoiceRepo = $invoiceRepo;
|
||||
$this->taskService = $taskService;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -40,75 +43,15 @@ class TaskController extends BaseController
|
||||
'entityType' => ENTITY_TASK,
|
||||
'title' => trans('texts.tasks'),
|
||||
'sortCol' => '2',
|
||||
'columns' => Utils::trans(['checkbox', 'client', 'date', 'duration', 'description', 'status', 'action']),
|
||||
'columns' => Utils::trans(['checkbox', 'client', 'date', 'duration', 'description', 'status', '']),
|
||||
));
|
||||
}
|
||||
|
||||
public function getDatatable($clientPublicId = null)
|
||||
{
|
||||
$tasks = $this->taskRepo->find($clientPublicId, Input::get('sSearch'));
|
||||
|
||||
$table = Datatable::query($tasks);
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('checkbox', function ($model) { return '<input type="checkbox" name="ids[]" value="'.$model->public_id.'" '.Utils::getEntityRowClass($model).'>'; })
|
||||
->addColumn('client_name', function ($model) { return $model->client_public_id ? link_to('clients/'.$model->client_public_id, Utils::getClientDisplayName($model)) : ''; });
|
||||
return $this->taskService->getDatatable($clientPublicId, Input::get('sSearch'));
|
||||
}
|
||||
|
||||
return $table->addColumn('created_at', function($model) { return link_to("tasks/{$model->public_id}/edit", Task::calcStartTime($model)); })
|
||||
->addColumn('time_log', function($model) { return Utils::formatTime(Task::calcDuration($model)); })
|
||||
->addColumn('description', function($model) { return $model->description; })
|
||||
->addColumn('invoice_number', function($model) { return self::getStatusLabel($model); })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
$str = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li><a href="'.URL::to('tasks/'.$model->public_id.'/edit').'">'.trans('texts.edit_task').'</a></li>';
|
||||
}
|
||||
|
||||
if ($model->invoice_number) {
|
||||
$str .= '<li>' . link_to("/invoices/{$model->invoice_public_id}/edit", trans('texts.view_invoice')) . '</li>';
|
||||
} elseif ($model->is_running) {
|
||||
$str .= '<li><a href="javascript:stopTask('.$model->public_id.')">'.trans('texts.stop_task').'</a></li>';
|
||||
} elseif (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li><a href="javascript:invoiceTask('.$model->public_id.')">'.trans('texts.invoice_task').'</a></li>';
|
||||
}
|
||||
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li class="divider"></li>
|
||||
<li><a href="javascript:archiveEntity('.$model->public_id.')">'.trans('texts.archive_task').'</a></li>';
|
||||
} else {
|
||||
$str .= '<li><a href="javascript:restoreEntity('.$model->public_id.')">'.trans('texts.restore_task').'</a></li>';
|
||||
}
|
||||
|
||||
if (!$model->is_deleted) {
|
||||
$str .= '<li><a href="javascript:deleteEntity('.$model->public_id.')">'.trans('texts.delete_task').'</a></li></ul>';
|
||||
}
|
||||
|
||||
return $str . '</div>';
|
||||
})
|
||||
->make();
|
||||
}
|
||||
|
||||
private function getStatusLabel($model) {
|
||||
if ($model->invoice_number) {
|
||||
$class = 'success';
|
||||
$label = trans('texts.invoiced');
|
||||
} elseif ($model->is_running) {
|
||||
$class = 'primary';
|
||||
$label = trans('texts.running');
|
||||
} else {
|
||||
$class = 'default';
|
||||
$label = trans('texts.logged');
|
||||
}
|
||||
return "<h4><div class=\"label label-{$class}\">$label</div></h4>";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
|
@ -12,9 +12,19 @@ use Session;
|
||||
use Redirect;
|
||||
|
||||
use App\Models\TaxRate;
|
||||
use App\Services\TaxRateService;
|
||||
|
||||
class TaxRateController extends BaseController
|
||||
{
|
||||
protected $taxRateService;
|
||||
|
||||
public function __construct(TaxRateService $taxRateService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->taxRateService = $taxRateService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return Redirect::to('settings/' . ACCOUNT_TAX_RATES);
|
||||
@ -22,28 +32,7 @@ class TaxRateController extends BaseController
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$query = DB::table('tax_rates')
|
||||
->where('tax_rates.account_id', '=', Auth::user()->account_id)
|
||||
->where('tax_rates.deleted_at', '=', null)
|
||||
->select('tax_rates.public_id', 'tax_rates.name', 'tax_rates.rate');
|
||||
|
||||
return Datatable::query($query)
|
||||
->addColumn('name', function ($model) { return link_to('tax_rates/'.$model->public_id.'/edit', $model->name); })
|
||||
->addColumn('rate', function ($model) { return $model->rate . '%'; })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
return '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="'.URL::to('tax_rates/'.$model->public_id).'/edit">'.uctrans('texts.edit_tax_rate').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="'.URL::to('tax_rates/'.$model->public_id).'/archive">'.uctrans('texts.archive_tax_rate').'</a></li>
|
||||
</ul>
|
||||
</div>';
|
||||
})
|
||||
->orderColumns(['name', 'rate'])
|
||||
->make();
|
||||
return $this->taxRateService->getDatatable(Auth::user()->account_id);
|
||||
}
|
||||
|
||||
public function edit($publicId)
|
||||
@ -98,10 +87,11 @@ class TaxRateController extends BaseController
|
||||
return Redirect::to('settings/' . ACCOUNT_TAX_RATES);
|
||||
}
|
||||
|
||||
public function archive($publicId)
|
||||
public function bulk()
|
||||
{
|
||||
$tax_rate = TaxRate::scope($publicId)->firstOrFail();
|
||||
$tax_rate->delete();
|
||||
$action = Input::get('bulk_action');
|
||||
$ids = Input::get('bulk_public_id');
|
||||
$count = $this->taxRateService->bulk($ids, $action);
|
||||
|
||||
Session::flash('message', trans('texts.archived_tax_rate'));
|
||||
|
||||
|
@ -1,13 +1,4 @@
|
||||
<?php namespace App\Http\Controllers;
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Confide Controller Template
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the default Confide controller template for controlling user
|
||||
| authentication. Feel free to change to your needs.
|
||||
|
|
||||
*/
|
||||
|
||||
use Auth;
|
||||
use Session;
|
||||
@ -20,11 +11,20 @@ use Datatable;
|
||||
use URL;
|
||||
|
||||
use App\Models\AccountToken;
|
||||
|
||||
use App\Services\TokenService;
|
||||
use App\Ninja\Repositories\AccountRepository;
|
||||
|
||||
class TokenController extends BaseController
|
||||
{
|
||||
protected $tokenService;
|
||||
|
||||
public function __construct(TokenService $tokenService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->tokenService = $tokenService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
return Redirect::to('settings/' . ACCOUNT_API_TOKENS);
|
||||
@ -32,38 +32,7 @@ class TokenController extends BaseController
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$query = DB::table('account_tokens')
|
||||
->where('account_tokens.account_id', '=', Auth::user()->account_id);
|
||||
|
||||
if (!Session::get('show_trash:token')) {
|
||||
$query->where('account_tokens.deleted_at', '=', null);
|
||||
}
|
||||
|
||||
$query->select('account_tokens.public_id', 'account_tokens.name', 'account_tokens.token', 'account_tokens.public_id', 'account_tokens.deleted_at');
|
||||
|
||||
return Datatable::query($query)
|
||||
->addColumn('name', function ($model) { return link_to('tokens/'.$model->public_id.'/edit', $model->name); })
|
||||
->addColumn('token', function ($model) { return $model->token; })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
$actions = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at) {
|
||||
$actions .= '<li><a href="'.URL::to('tokens/'.$model->public_id).'/edit">'.uctrans('texts.edit_token').'</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="javascript:deleteToken('.$model->public_id.')">'.uctrans('texts.delete_token').'</a></li>';
|
||||
}
|
||||
|
||||
$actions .= '</ul>
|
||||
</div>';
|
||||
|
||||
return $actions;
|
||||
})
|
||||
->orderColumns(['name', 'token'])
|
||||
->make();
|
||||
return $this->tokenService->getDatatable(Auth::user()->account_id);
|
||||
}
|
||||
|
||||
public function edit($publicId)
|
||||
@ -107,15 +76,13 @@ class TokenController extends BaseController
|
||||
return View::make('accounts.token', $data);
|
||||
}
|
||||
|
||||
public function delete()
|
||||
public function bulk()
|
||||
{
|
||||
$tokenPublicId = Input::get('tokenPublicId');
|
||||
$token = AccountToken::where('account_id', '=', Auth::user()->account_id)
|
||||
->where('public_id', '=', $tokenPublicId)->firstOrFail();
|
||||
$action = Input::get('bulk_action');
|
||||
$ids = Input::get('bulk_public_id');
|
||||
$count = $this->tokenService->bulk($ids, $action);
|
||||
|
||||
$token->delete();
|
||||
|
||||
Session::flash('message', trans('texts.deleted_token'));
|
||||
Session::flash('message', trans('texts.archived_token'));
|
||||
|
||||
return Redirect::to('settings/' . ACCOUNT_API_TOKENS);
|
||||
}
|
||||
|
@ -19,20 +19,23 @@ use App\Http\Requests;
|
||||
use App\Ninja\Repositories\AccountRepository;
|
||||
use App\Ninja\Mailers\ContactMailer;
|
||||
use App\Ninja\Mailers\UserMailer;
|
||||
use App\Services\UserService;
|
||||
|
||||
class UserController extends BaseController
|
||||
{
|
||||
protected $accountRepo;
|
||||
protected $contactMailer;
|
||||
protected $userMailer;
|
||||
protected $userService;
|
||||
|
||||
public function __construct(AccountRepository $accountRepo, ContactMailer $contactMailer, UserMailer $userMailer)
|
||||
public function __construct(AccountRepository $accountRepo, ContactMailer $contactMailer, UserMailer $userMailer, UserService $userService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->accountRepo = $accountRepo;
|
||||
$this->contactMailer = $contactMailer;
|
||||
$this->userMailer = $userMailer;
|
||||
$this->userService = $userService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
@ -42,47 +45,7 @@ class UserController extends BaseController
|
||||
|
||||
public function getDatatable()
|
||||
{
|
||||
$query = DB::table('users')
|
||||
->where('users.account_id', '=', Auth::user()->account_id);
|
||||
|
||||
if (!Session::get('show_trash:user')) {
|
||||
$query->where('users.deleted_at', '=', null);
|
||||
}
|
||||
|
||||
$query->where('users.public_id', '>', 0)
|
||||
->select('users.public_id', 'users.first_name', 'users.last_name', 'users.email', 'users.confirmed', 'users.public_id', 'users.deleted_at');
|
||||
|
||||
return Datatable::query($query)
|
||||
->addColumn('first_name', function ($model) { return link_to('users/'.$model->public_id.'/edit', $model->first_name.' '.$model->last_name); })
|
||||
->addColumn('email', function ($model) { return $model->email; })
|
||||
->addColumn('confirmed', function ($model) { return $model->deleted_at ? trans('texts.deleted') : ($model->confirmed ? trans('texts.active') : trans('texts.pending')); })
|
||||
->addColumn('dropdown', function ($model) {
|
||||
$actions = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if ($model->deleted_at) {
|
||||
$actions .= '<li><a href="'.URL::to('restore_user/'.$model->public_id).'">'.uctrans('texts.restore_user').'</a></li>';
|
||||
} else {
|
||||
$actions .= '<li><a href="'.URL::to('users/'.$model->public_id).'/edit">'.uctrans('texts.edit_user').'</a></li>';
|
||||
|
||||
if (!$model->confirmed) {
|
||||
$actions .= '<li><a href="'.URL::to('send_confirmation/'.$model->public_id).'">'.uctrans('texts.send_invite').'</a></li>';
|
||||
}
|
||||
|
||||
$actions .= '<li class="divider"></li>
|
||||
<li><a href="javascript:deleteUser('.$model->public_id.')">'.uctrans('texts.delete_user').'</a></li>';
|
||||
}
|
||||
|
||||
$actions .= '</ul>
|
||||
</div>';
|
||||
|
||||
return $actions;
|
||||
})
|
||||
->orderColumns(['first_name', 'email', 'confirmed'])
|
||||
->make();
|
||||
return $this->userService->getDatatable(Auth::user()->account_id);
|
||||
}
|
||||
|
||||
public function setTheme()
|
||||
@ -163,15 +126,23 @@ class UserController extends BaseController
|
||||
return View::make('users.edit', $data);
|
||||
}
|
||||
|
||||
public function delete()
|
||||
public function bulk()
|
||||
{
|
||||
$userPublicId = Input::get('userPublicId');
|
||||
$action = Input::get('bulk_action');
|
||||
$id = Input::get('bulk_public_id');
|
||||
|
||||
$user = User::where('account_id', '=', Auth::user()->account_id)
|
||||
->where('public_id', '=', $userPublicId)->firstOrFail();
|
||||
->where('public_id', '=', $id)
|
||||
->withTrashed()
|
||||
->firstOrFail();
|
||||
|
||||
if ($action === 'archive') {
|
||||
$user->delete();
|
||||
} else {
|
||||
$user->restore();
|
||||
}
|
||||
|
||||
Session::flash('message', trans('texts.deleted_user'));
|
||||
Session::flash('message', trans("texts.{$action}d_user"));
|
||||
|
||||
return Redirect::to('settings/' . ACCOUNT_USER_MANAGEMENT);
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ Route::group(['middleware' => 'auth'], function() {
|
||||
|
||||
Route::get('api/users', array('as'=>'api.users', 'uses'=>'UserController@getDatatable'));
|
||||
Route::resource('users', 'UserController');
|
||||
Route::post('users/delete', 'UserController@delete');
|
||||
Route::post('users/bulk', 'UserController@bulk');
|
||||
Route::get('send_confirmation/{user_id}', 'UserController@sendConfirmation');
|
||||
Route::get('restore_user/{user_id}', 'UserController@restoreUser');
|
||||
Route::post('users/change_password', 'UserController@changePassword');
|
||||
@ -108,15 +108,15 @@ Route::group(['middleware' => 'auth'], function() {
|
||||
|
||||
Route::get('api/tokens', array('as'=>'api.tokens', 'uses'=>'TokenController@getDatatable'));
|
||||
Route::resource('tokens', 'TokenController');
|
||||
Route::post('tokens/delete', 'TokenController@delete');
|
||||
Route::post('tokens/bulk', 'TokenController@bulk');
|
||||
|
||||
Route::get('api/products', array('as'=>'api.products', 'uses'=>'ProductController@getDatatable'));
|
||||
Route::resource('products', 'ProductController');
|
||||
Route::get('products/{product_id}/archive', 'ProductController@archive');
|
||||
Route::post('products/bulk', 'ProductController@bulk');
|
||||
|
||||
Route::get('api/tax_rates', array('as'=>'api.tax_rates', 'uses'=>'TaxRateController@getDatatable'));
|
||||
Route::resource('tax_rates', 'TaxRateController');
|
||||
Route::get('tax_rates/{tax_rates_id}/archive', 'TaxRateController@archive');
|
||||
Route::post('tax_rates/bulk', 'TaxRateController@bulk');
|
||||
|
||||
Route::get('company/{section}/{subSection?}', 'AccountController@redirectLegacy');
|
||||
Route::get('settings/data_visualizations', 'ReportController@d3');
|
||||
@ -134,7 +134,7 @@ Route::group(['middleware' => 'auth'], function() {
|
||||
|
||||
Route::resource('gateways', 'AccountGatewayController');
|
||||
Route::get('api/gateways', array('as'=>'api.gateways', 'uses'=>'AccountGatewayController@getDatatable'));
|
||||
Route::post('gateways/delete', 'AccountGatewayController@delete');
|
||||
Route::post('account_gateways/bulk', 'AccountGatewayController@bulk');
|
||||
|
||||
Route::resource('clients', 'ClientController');
|
||||
Route::get('api/clients', array('as'=>'api.clients', 'uses'=>'ClientController@getDatatable'));
|
||||
@ -253,6 +253,12 @@ if (!defined('CONTACT_EMAIL')) {
|
||||
define('ENTITY_CREDIT', 'credit');
|
||||
define('ENTITY_QUOTE', 'quote');
|
||||
define('ENTITY_TASK', 'task');
|
||||
define('ENTITY_ACCOUNT_GATEWAY', 'account_gateway');
|
||||
define('ENTITY_USER', 'user');
|
||||
define('ENTITY_TOKEN', 'token');
|
||||
define('ENTITY_TAX_RATE', 'tax_rate');
|
||||
define('ENTITY_PRODUCT', 'product');
|
||||
define('ENTITY_ACTIVITY', 'activity');
|
||||
|
||||
define('PERSON_CONTACT', 'contact');
|
||||
define('PERSON_USER', 'user');
|
||||
|
@ -150,8 +150,10 @@ class Utils
|
||||
foreach ($input as $field) {
|
||||
if ($field == "checkbox") {
|
||||
$data[] = $field;
|
||||
} else {
|
||||
} elseif ($field) {
|
||||
$data[] = trans("texts.$field");
|
||||
} else {
|
||||
$data[] = '';
|
||||
}
|
||||
}
|
||||
|
||||
@ -652,11 +654,15 @@ class Utils
|
||||
|
||||
public static function getEntityRowClass($model)
|
||||
{
|
||||
$str = '';
|
||||
|
||||
if (property_exists($model, 'is_deleted')) {
|
||||
$str = $model->is_deleted || ($model->deleted_at && $model->deleted_at != '0000-00-00') ? 'DISABLED ' : '';
|
||||
|
||||
if ($model->is_deleted) {
|
||||
$str .= 'ENTITY_DELETED ';
|
||||
}
|
||||
}
|
||||
|
||||
if ($model->deleted_at && $model->deleted_at != '0000-00-00') {
|
||||
$str .= 'ENTITY_ARCHIVED ';
|
||||
|
@ -9,6 +9,11 @@ class AccountGateway extends EntityModel
|
||||
use SoftDeletes;
|
||||
protected $dates = ['deleted_at'];
|
||||
|
||||
public function getEntityType()
|
||||
{
|
||||
return ENTITY_ACCOUNT_GATEWAY;
|
||||
}
|
||||
|
||||
public function gateway()
|
||||
{
|
||||
return $this->belongsTo('App\Models\Gateway');
|
||||
|
@ -7,6 +7,11 @@ class AccountToken extends EntityModel
|
||||
use SoftDeletes;
|
||||
protected $dates = ['deleted_at'];
|
||||
|
||||
public function getEntityType()
|
||||
{
|
||||
return ENTITY_TOKEN;
|
||||
}
|
||||
|
||||
public function account()
|
||||
{
|
||||
return $this->belongsTo('App\Models\Account');
|
||||
|
@ -7,6 +7,11 @@ class Product extends EntityModel
|
||||
use SoftDeletes;
|
||||
protected $dates = ['deleted_at'];
|
||||
|
||||
public function getEntityType()
|
||||
{
|
||||
return ENTITY_PRODUCT;
|
||||
}
|
||||
|
||||
public static function findProductByKey($key)
|
||||
{
|
||||
return Product::scope()->where('product_key', '=', $key)->first();
|
||||
|
@ -6,4 +6,9 @@ class TaxRate extends EntityModel
|
||||
{
|
||||
use SoftDeletes;
|
||||
protected $dates = ['deleted_at'];
|
||||
|
||||
public function getEntityType()
|
||||
{
|
||||
return ENTITY_TAX_RATE;
|
||||
}
|
||||
}
|
||||
|
24
app/Ninja/Repositories/AccountGatewayRepository.php
Normal file
24
app/Ninja/Repositories/AccountGatewayRepository.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php namespace App\Ninja\Repositories;
|
||||
|
||||
use DB;
|
||||
use Utils;
|
||||
use Session;
|
||||
use App\Models\AccountGateway;
|
||||
use App\Ninja\Repositories\BaseRepository;
|
||||
|
||||
class AccountGatewayRepository extends BaseRepository
|
||||
{
|
||||
public function getClassName()
|
||||
{
|
||||
return 'App\Models\AccountGateway';
|
||||
}
|
||||
|
||||
public function find($accountId)
|
||||
{
|
||||
return DB::table('account_gateways')
|
||||
->join('gateways', 'gateways.id', '=', 'account_gateways.gateway_id')
|
||||
->where('account_gateways.deleted_at', '=', null)
|
||||
->where('account_gateways.account_id', '=', $accountId)
|
||||
->select('account_gateways.public_id', 'gateways.name', 'account_gateways.deleted_at', 'account_gateways.gateway_id');
|
||||
}
|
||||
}
|
@ -61,7 +61,7 @@ class ActivityRepository
|
||||
return $activity;
|
||||
}
|
||||
|
||||
public function findByClientId($clientId)
|
||||
public function findByClientPublicId($clientPublicId)
|
||||
{
|
||||
return DB::table('activities')
|
||||
->join('users', 'users.id', '=', 'activities.user_id')
|
||||
@ -70,7 +70,7 @@ class ActivityRepository
|
||||
->leftJoin('invoices', 'invoices.id', '=', 'activities.invoice_id')
|
||||
->leftJoin('payments', 'payments.id', '=', 'activities.payment_id')
|
||||
->leftJoin('credits', 'credits.id', '=', 'activities.credit_id')
|
||||
->where('activities.client_id', '=', $clientId)
|
||||
->where('clients.public_id', '=', $clientPublicId)
|
||||
->where('contacts.is_primary', '=', 1)
|
||||
->whereNull('contacts.deleted_at')
|
||||
->select(
|
||||
@ -96,7 +96,8 @@ class ActivityRepository
|
||||
'contacts.last_name as last_name',
|
||||
'contacts.email as email',
|
||||
'payments.transaction_reference as payment',
|
||||
'credits.amount as credit');
|
||||
'credits.amount as credit'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@ -23,8 +23,11 @@ class BaseRepository
|
||||
$entity->delete();
|
||||
|
||||
$className = $this->getEventClass($entity, 'Archived');
|
||||
|
||||
if (class_exists($className)) {
|
||||
event(new $className($entity));
|
||||
}
|
||||
}
|
||||
|
||||
public function restore($entity)
|
||||
{
|
||||
@ -38,8 +41,11 @@ class BaseRepository
|
||||
}
|
||||
|
||||
$className = $this->getEventClass($entity, 'Restored');
|
||||
|
||||
if (class_exists($className)) {
|
||||
event(new $className($entity, $fromDeleted));
|
||||
}
|
||||
}
|
||||
|
||||
public function delete($entity)
|
||||
{
|
||||
@ -49,8 +55,11 @@ class BaseRepository
|
||||
$entity->delete();
|
||||
|
||||
$className = $this->getEventClass($entity, 'Deleted');
|
||||
|
||||
if (class_exists($className)) {
|
||||
event(new $className($entity));
|
||||
}
|
||||
}
|
||||
|
||||
public function findByPublicIds($ids)
|
||||
{
|
||||
|
@ -75,7 +75,7 @@ class InvoiceRepository extends BaseRepository
|
||||
$query->where('clients.public_id', '=', $clientPublicId);
|
||||
}
|
||||
|
||||
if (!\Session::get('show_trash:invoice')) {
|
||||
if (!\Session::get('show_trash:recurring_invoice')) {
|
||||
$query->where('invoices.deleted_at', '=', null);
|
||||
}
|
||||
|
||||
@ -119,107 +119,6 @@ class InvoiceRepository extends BaseRepository
|
||||
->make();
|
||||
}
|
||||
|
||||
public function getDatatable($accountId, $clientPublicId = null, $entityType, $search)
|
||||
{
|
||||
$query = $this->getInvoices($accountId, $clientPublicId, $entityType, $search)
|
||||
->where('invoices.is_quote', '=', $entityType == ENTITY_QUOTE ? true : false);
|
||||
|
||||
$table = \Datatable::query($query);
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('checkbox', function ($model) { return '<input type="checkbox" name="ids[]" value="'.$model->public_id.'" '.Utils::getEntityRowClass($model).'>'; });
|
||||
}
|
||||
|
||||
$table->addColumn("invoice_number", function ($model) use ($entityType) { return link_to("{$entityType}s/".$model->public_id.'/edit', $model->invoice_number, ['class' => Utils::getEntityRowClass($model)]); });
|
||||
|
||||
if (!$clientPublicId) {
|
||||
$table->addColumn('client_name', function ($model) { return link_to('clients/'.$model->client_public_id, Utils::getClientDisplayName($model)); });
|
||||
}
|
||||
|
||||
$table->addColumn("invoice_date", function ($model) { return Utils::fromSqlDate($model->invoice_date); })
|
||||
->addColumn('amount', function ($model) { return Utils::formatMoney($model->amount, $model->currency_id); });
|
||||
|
||||
if ($entityType == ENTITY_INVOICE) {
|
||||
$table->addColumn('balance', function ($model) {
|
||||
return $model->partial > 0 ?
|
||||
trans('texts.partial_remaining', ['partial' => Utils::formatMoney($model->partial, $model->currency_id), 'balance' => Utils::formatMoney($model->balance, $model->currency_id)]) :
|
||||
Utils::formatMoney($model->balance, $model->currency_id);
|
||||
});
|
||||
}
|
||||
|
||||
return $table->addColumn('due_date', function ($model) { return Utils::fromSqlDate($model->due_date); })
|
||||
->addColumn('invoice_status_name', function ($model) { return $model->quote_invoice_id ? link_to("invoices/{$model->quote_invoice_id}/edit", trans('texts.converted')) : self::getStatusLabel($model->invoice_status_id, $model->invoice_status_name); })
|
||||
->addColumn('dropdown', function ($model) use ($entityType) {
|
||||
|
||||
$str = '<div class="btn-group tr-action" style="visibility:hidden;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
$str .= '<li><a href="'.\URL::to("{$entityType}s/".$model->public_id.'/edit').'">'.trans("texts.edit_{$entityType}").'</a></li>
|
||||
<li><a href="'.\URL::to("{$entityType}s/".$model->public_id.'/clone').'">'.trans("texts.clone_{$entityType}").'</a></li>
|
||||
<li><a href="' . \URL::to("{$entityType}s/{$entityType}_history/{$model->public_id}") . '">' . trans("texts.view_history") . '</a></li>
|
||||
<li class="divider"></li>';
|
||||
|
||||
if ($model->invoice_status_id < INVOICE_STATUS_SENT) {
|
||||
$str .= '<li><a href="javascript:markEntity('.$model->public_id.', '.INVOICE_STATUS_SENT.')">'.trans("texts.mark_sent").'</a></li>';
|
||||
}
|
||||
|
||||
if ($entityType == ENTITY_INVOICE) {
|
||||
if ($model->balance > 0) {
|
||||
$str .= '<li><a href="'.\URL::to('payments/create/'.$model->client_public_id.'/'.$model->public_id).'">'.trans('texts.enter_payment').'</a></li>';
|
||||
}
|
||||
|
||||
if ($model->quote_id) {
|
||||
$str .= '<li><a href="'.\URL::to("quotes/{$model->quote_id}/edit").'">'.trans("texts.view_quote").'</a></li>';
|
||||
}
|
||||
} elseif ($entityType == ENTITY_QUOTE) {
|
||||
if ($model->quote_invoice_id) {
|
||||
$str .= '<li><a href="'.\URL::to("invoices/{$model->quote_invoice_id}/edit").'">'.trans("texts.view_invoice").'</a></li>';
|
||||
} else {
|
||||
$str .= '<li><a href="javascript:convertEntity('.$model->public_id.')">'.trans("texts.convert_to_invoice").'</a></li>';
|
||||
}
|
||||
}
|
||||
|
||||
$str .= '<li class="divider"></li>
|
||||
<li><a href="javascript:archiveEntity('.$model->public_id.')">'.trans("texts.archive_{$entityType}").'</a></li>';
|
||||
|
||||
} else {
|
||||
$str .= '<li><a href="javascript:restoreEntity('.$model->public_id.')">'.trans("texts.restore_{$entityType}").'</a></li>';
|
||||
}
|
||||
|
||||
if (!$model->is_deleted) {
|
||||
$str .= '<li><a href="javascript:deleteEntity('.$model->public_id.')">'.trans("texts.delete_{$entityType}").'</a></li>';
|
||||
}
|
||||
|
||||
return $str.'</ul>
|
||||
</div>';
|
||||
})
|
||||
->make();
|
||||
}
|
||||
|
||||
private function getStatusLabel($statusId, $statusName) {
|
||||
$label = trans("texts.status_" . strtolower($statusName));
|
||||
$class = 'default';
|
||||
switch ($statusId) {
|
||||
case INVOICE_STATUS_SENT:
|
||||
$class = 'info';
|
||||
break;
|
||||
case INVOICE_STATUS_VIEWED:
|
||||
$class = 'warning';
|
||||
break;
|
||||
case INVOICE_STATUS_PARTIAL:
|
||||
$class = 'primary';
|
||||
break;
|
||||
case INVOICE_STATUS_PAID:
|
||||
$class = 'success';
|
||||
break;
|
||||
}
|
||||
return "<h4><div class=\"label label-{$class}\">$label</div></h4>";
|
||||
}
|
||||
|
||||
public function save($data)
|
||||
{
|
||||
$account = \Auth::user()->account;
|
||||
|
32
app/Ninja/Repositories/ProductRepository.php
Normal file
32
app/Ninja/Repositories/ProductRepository.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php namespace App\Ninja\Repositories;
|
||||
|
||||
use DB;
|
||||
use App\Ninja\Repositories\BaseRepository;
|
||||
|
||||
class ProductRepository extends BaseRepository
|
||||
{
|
||||
public function getClassName()
|
||||
{
|
||||
return 'App\Models\Product';
|
||||
}
|
||||
|
||||
public function find($accountId)
|
||||
{
|
||||
return DB::table('products')
|
||||
->leftJoin('tax_rates', function($join) {
|
||||
$join->on('tax_rates.id', '=', 'products.default_tax_rate_id')
|
||||
->whereNull('tax_rates.deleted_at');
|
||||
})
|
||||
->where('products.account_id', '=', $accountId)
|
||||
->where('products.deleted_at', '=', null)
|
||||
->select(
|
||||
'products.public_id',
|
||||
'products.product_key',
|
||||
'products.notes',
|
||||
'products.cost',
|
||||
'tax_rates.name as tax_name',
|
||||
'tax_rates.rate as tax_rate',
|
||||
'products.deleted_at'
|
||||
);
|
||||
}
|
||||
}
|
@ -1,10 +1,25 @@
|
||||
<?php namespace App\Ninja\Repositories;
|
||||
|
||||
use App\Models\TaxRate;
|
||||
use DB;
|
||||
use Utils;
|
||||
use App\Models\TaxRate;
|
||||
use App\Ninja\Repositories\BaseRepository;
|
||||
|
||||
class TaxRateRepository
|
||||
class TaxRateRepository extends BaseRepository
|
||||
{
|
||||
public function getClassName()
|
||||
{
|
||||
return 'App\Models\TaxRate';
|
||||
}
|
||||
|
||||
public function find($accountId)
|
||||
{
|
||||
return DB::table('tax_rates')
|
||||
->where('tax_rates.account_id', '=', $accountId)
|
||||
->where('tax_rates.deleted_at', '=', null)
|
||||
->select('tax_rates.public_id', 'tax_rates.name', 'tax_rates.rate', 'tax_rates.deleted_at');
|
||||
}
|
||||
|
||||
/*
|
||||
public function save($taxRates)
|
||||
{
|
||||
|
27
app/Ninja/Repositories/TokenRepository.php
Normal file
27
app/Ninja/Repositories/TokenRepository.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php namespace App\Ninja\Repositories;
|
||||
|
||||
use DB;
|
||||
use Utils;
|
||||
use Session;
|
||||
use App\Models\Token;
|
||||
use App\Ninja\Repositories\BaseRepository;
|
||||
|
||||
class TokenRepository extends BaseRepository
|
||||
{
|
||||
public function getClassName()
|
||||
{
|
||||
return 'App\Models\AccountToken';
|
||||
}
|
||||
|
||||
public function find($accountId)
|
||||
{
|
||||
$query = DB::table('account_tokens')
|
||||
->where('account_tokens.account_id', '=', $accountId);
|
||||
|
||||
if (!Session::get('show_trash:token')) {
|
||||
$query->where('account_tokens.deleted_at', '=', null);
|
||||
}
|
||||
|
||||
return $query->select('account_tokens.public_id', 'account_tokens.name', 'account_tokens.token', 'account_tokens.public_id', 'account_tokens.deleted_at');
|
||||
}
|
||||
}
|
30
app/Ninja/Repositories/UserRepository.php
Normal file
30
app/Ninja/Repositories/UserRepository.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php namespace App\Ninja\Repositories;
|
||||
|
||||
use DB;
|
||||
use Utils;
|
||||
use Session;
|
||||
use App\Models\User;
|
||||
use App\Ninja\Repositories\BaseRepository;
|
||||
|
||||
class UserRepository extends BaseRepository
|
||||
{
|
||||
public function getClassName()
|
||||
{
|
||||
return 'App\Models\User';
|
||||
}
|
||||
|
||||
public function find($accountId)
|
||||
{
|
||||
$query = DB::table('users')
|
||||
->where('users.account_id', '=', $accountId);
|
||||
|
||||
if (!Session::get('show_trash:user')) {
|
||||
$query->where('users.deleted_at', '=', null);
|
||||
}
|
||||
|
||||
$query->where('users.public_id', '>', 0)
|
||||
->select('users.public_id', 'users.first_name', 'users.last_name', 'users.email', 'users.confirmed', 'users.public_id', 'users.deleted_at');
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
68
app/Services/AccountGatewayService.php
Normal file
68
app/Services/AccountGatewayService.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use URL;
|
||||
use App\Models\Gateway;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\AccountGatewayRepository;
|
||||
|
||||
class AccountGatewayService extends BaseService
|
||||
{
|
||||
protected $accountGatewayRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(AccountGatewayRepository $accountGatewayRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->accountGatewayRepo = $accountGatewayRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
{
|
||||
return $this->accountGatewayRepo;
|
||||
}
|
||||
|
||||
/*
|
||||
public function save()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
*/
|
||||
|
||||
public function getDatatable($accountId)
|
||||
{
|
||||
$query = $this->accountGatewayRepo->find($accountId);
|
||||
|
||||
return $this->createDatatable(ENTITY_ACCOUNT_GATEWAY, $query, false);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'name',
|
||||
function ($model) {
|
||||
return link_to("gateways/{$model->public_id}/edit", $model->name);
|
||||
}
|
||||
],
|
||||
[
|
||||
'payment_type',
|
||||
function ($model) {
|
||||
return Gateway::getPrettyPaymentType($model->gateway_id);
|
||||
}
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
uctrans('texts.edit_gateway'),
|
||||
function ($model) {
|
||||
return URL::to("gateways/{$model->public_id}/edit");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
}
|
65
app/Services/ActivityService.php
Normal file
65
app/Services/ActivityService.php
Normal file
@ -0,0 +1,65 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Utils;
|
||||
use App\Models\Client;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\ActivityRepository;
|
||||
|
||||
class ActivityService extends BaseService
|
||||
{
|
||||
protected $activityRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(ActivityRepository $activityRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->activityRepo = $activityRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
public function getDatatable($clientPublicId = null)
|
||||
{
|
||||
$query = $this->activityRepo->findByClientPublicId($clientPublicId);
|
||||
|
||||
return $this->createDatatable(ENTITY_ACTIVITY, $query);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'activities.id',
|
||||
function ($model) {
|
||||
return Utils::timestampToDateTimeString(strtotime($model->created_at));
|
||||
}
|
||||
],
|
||||
[
|
||||
'activity_type_id',
|
||||
function ($model) {
|
||||
$data = [
|
||||
'client' => link_to('/clients/' . $model->client_public_id, Utils::getClientDisplayName($model)),
|
||||
'user' => $model->is_system ? '<i>' . trans('texts.system') . '</i>' : Utils::getPersonDisplayName($model->user_first_name, $model->user_last_name, $model->user_email),
|
||||
'invoice' => $model->invoice ? link_to('/invoices/' . $model->invoice_public_id, $model->is_recurring ? trans('texts.recurring_invoice') : $model->invoice) : null,
|
||||
'quote' => $model->invoice ? link_to('/quotes/' . $model->invoice_public_id, $model->invoice) : null,
|
||||
'contact' => $model->contact_id ? link_to('/clients/' . $model->client_public_id, Utils::getClientDisplayName($model)) : Utils::getPersonDisplayName($model->user_first_name, $model->user_last_name, $model->user_email),
|
||||
'payment' => $model->payment ?: '',
|
||||
'credit' => Utils::formatMoney($model->credit, $model->currency_id)
|
||||
];
|
||||
|
||||
return trans("texts.activity_{$model->activity_type_id}", $data);
|
||||
}
|
||||
],
|
||||
[
|
||||
'balance',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->balance, $model->currency_id);
|
||||
}
|
||||
],
|
||||
[
|
||||
'adjustment',
|
||||
function ($model) {
|
||||
return $model->adjustment != 0 ? Utils::wrapAdjustment($model->adjustment, $model->currency_id) : '';
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Illuminate\Foundation\Bus\DispatchesCommands;
|
||||
use App\Services\DatatableService;
|
||||
|
||||
class BaseService
|
||||
{
|
||||
@ -25,4 +26,22 @@ class BaseService
|
||||
|
||||
return count($entities);
|
||||
}
|
||||
|
||||
public function createDatatable($entityType, $query, $showCheckbox = true, $hideClient = false)
|
||||
{
|
||||
$columns = $this->getDatatableColumns($entityType, $hideClient);
|
||||
$actions = $this->getDatatableActions($entityType);
|
||||
|
||||
return $this->datatableService->createDatatable($entityType, $query, $columns, $actions, $showCheckbox);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,8 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Utils;
|
||||
use URL;
|
||||
use Auth;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\ClientRepository;
|
||||
|
||||
@ -7,10 +10,12 @@ use App\Ninja\Repositories\ClientRepository;
|
||||
class ClientService extends BaseService
|
||||
{
|
||||
protected $clientRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(ClientRepository $clientRepo)
|
||||
public function __construct(ClientRepository $clientRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->clientRepo = $clientRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
@ -22,4 +27,100 @@ class ClientService extends BaseService
|
||||
{
|
||||
return $this->clientRepo->save($data);
|
||||
}
|
||||
|
||||
public function getDatatable($search)
|
||||
{
|
||||
$query = $this->clientRepo->find($search);
|
||||
|
||||
return $this->createDatatable(ENTITY_CLIENT, $query);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'name',
|
||||
function ($model) {
|
||||
return link_to("clients/{$model->public_id}", $model->name);
|
||||
}
|
||||
],
|
||||
[
|
||||
'first_name',
|
||||
function ($model) {
|
||||
return link_to("clients/{$model->public_id}", $model->first_name.' '.$model->last_name);
|
||||
}
|
||||
],
|
||||
[
|
||||
'email',
|
||||
function ($model) {
|
||||
return link_to("clients/{$model->public_id}", $model->email);
|
||||
}
|
||||
],
|
||||
[
|
||||
'clients.created_at',
|
||||
function ($model) {
|
||||
return Utils::timestampToDateString(strtotime($model->created_at));
|
||||
}
|
||||
],
|
||||
[
|
||||
'last_login',
|
||||
function ($model) {
|
||||
return Utils::timestampToDateString(strtotime($model->last_login));
|
||||
}
|
||||
],
|
||||
[
|
||||
'balance',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->balance, $model->currency_id);
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
trans('texts.edit_client'),
|
||||
function ($model) {
|
||||
return URL::to("clients/{$model->public_id}/edit");
|
||||
}
|
||||
],
|
||||
[],
|
||||
[
|
||||
trans('texts.new_task'),
|
||||
function ($model) {
|
||||
return URL::to("tasks/create/{$model->public_id}");
|
||||
}
|
||||
],
|
||||
[
|
||||
trans('texts.new_invoice'),
|
||||
function ($model) {
|
||||
return URL::to("invoices/create/{$model->public_id}");
|
||||
}
|
||||
],
|
||||
[
|
||||
trans('texts.new_quote'),
|
||||
function ($model) {
|
||||
return URL::to("quotes/create/{$model->public_id}");
|
||||
},
|
||||
function ($model) {
|
||||
return Auth::user()->isPro();
|
||||
}
|
||||
],
|
||||
[],
|
||||
[
|
||||
trans('texts.enter_payment'),
|
||||
function ($model) {
|
||||
return URL::to("payments/create/{$model->public_id}");
|
||||
}
|
||||
],
|
||||
[
|
||||
trans('texts.enter_credit'),
|
||||
function ($model) {
|
||||
return URL::to("credits/create/{$model->public_id}");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Utils;
|
||||
use URL;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\CreditRepository;
|
||||
|
||||
@ -7,10 +9,12 @@ use App\Ninja\Repositories\CreditRepository;
|
||||
class CreditService extends BaseService
|
||||
{
|
||||
protected $creditRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(CreditRepository $creditRepo)
|
||||
public function __construct(CreditRepository $creditRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->creditRepo = $creditRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
@ -22,4 +26,60 @@ class CreditService extends BaseService
|
||||
{
|
||||
return $this->creditRepo->save($data);
|
||||
}
|
||||
|
||||
public function getDatatable($clientPublicId, $search)
|
||||
{
|
||||
$query = $this->creditRepo->find($clientPublicId, $search);
|
||||
|
||||
return $this->createDatatable(ENTITY_CREDIT, $query, !$clientPublicId);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'client_name',
|
||||
function ($model) {
|
||||
return $model->client_public_id ? link_to("clients/{$model->client_public_id}", Utils::getClientDisplayName($model)) : '';
|
||||
},
|
||||
! $hideClient
|
||||
],
|
||||
[
|
||||
'amount',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->amount, $model->currency_id) . '<span '.Utils::getEntityRowClass($model).'/>';
|
||||
}
|
||||
],
|
||||
[
|
||||
'balance',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->balance, $model->currency_id);
|
||||
}
|
||||
],
|
||||
[
|
||||
'credit_date',
|
||||
function ($model) {
|
||||
return Utils::fromSqlDate($model->credit_date);
|
||||
}
|
||||
],
|
||||
[
|
||||
'private_notes',
|
||||
function ($model) {
|
||||
return $model->private_notes;
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
trans('texts.apply_credit'),
|
||||
function ($model) {
|
||||
return URL::to("payments/create/{$model->client_public_id}") . '?paymentTypeId=1';
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
96
app/Services/DatatableService.php
Normal file
96
app/Services/DatatableService.php
Normal file
@ -0,0 +1,96 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Utils;
|
||||
use Datatable;
|
||||
|
||||
class DatatableService
|
||||
{
|
||||
public function createDatatable($entityType, $query, $columns, $actions = null, $showCheckbox = true)
|
||||
{
|
||||
$table = Datatable::query($query);
|
||||
$orderColumns = [];
|
||||
|
||||
if ($actions && $showCheckbox) {
|
||||
$table->addColumn('checkbox', function ($model) {
|
||||
return '<input type="checkbox" name="ids[]" value="' . $model->public_id . '" ' . Utils::getEntityRowClass($model) . '>';
|
||||
});
|
||||
}
|
||||
|
||||
foreach ($columns as $column) {
|
||||
// set visible to true by default
|
||||
if (count($column) == 2) {
|
||||
$column[] = true;
|
||||
}
|
||||
|
||||
list($field, $value, $visible) = $column;
|
||||
|
||||
if ($visible) {
|
||||
$table->addColumn($field, $value);
|
||||
$orderColumns[] = $field;
|
||||
}
|
||||
}
|
||||
|
||||
if ($actions) {
|
||||
$this->createDropdown($entityType, $table, $actions);
|
||||
}
|
||||
|
||||
return $table->orderColumns($orderColumns)->make();
|
||||
}
|
||||
|
||||
private function createDropdown($entityType, $table, $actions)
|
||||
{
|
||||
$table->addColumn('dropdown', function ($model) use ($entityType, $actions) {
|
||||
$str = '';
|
||||
|
||||
if (property_exists($model, 'is_deleted') && $model->is_deleted) {
|
||||
$str .= '<button type="button" class="btn btn-sm btn-danger tr-status" style="display:inline-block; width:80px">'.trans('texts.deleted').'</button>';
|
||||
} elseif ($model->deleted_at && $model->deleted_at !== '0000-00-00') {
|
||||
$str .= '<button type="button" class="btn btn-sm btn-warning tr-status" style="display:inline-block; width:80px">'.trans('texts.archived').'</button>';
|
||||
} else {
|
||||
$str .= '<div class="tr-status" style="display:inline-block; width:80px"></div>';
|
||||
}
|
||||
|
||||
$str .= '<div class="btn-group tr-action" style="display:none;">
|
||||
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" style="width:80px">
|
||||
'.trans('texts.select').' <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">';
|
||||
|
||||
$lastIsDivider = false;
|
||||
if (!$model->deleted_at || $model->deleted_at == '0000-00-00') {
|
||||
foreach ($actions as $action) {
|
||||
if (count($action)) {
|
||||
if (count($action) == 2) {
|
||||
$action[] = function() {
|
||||
return true;
|
||||
};
|
||||
}
|
||||
list($value, $url, $visible) = $action;
|
||||
if ($visible($model)) {
|
||||
$str .= "<li><a href=\"{$url($model)}\">{$value}</a></li>";
|
||||
$lastIsDivider = false;
|
||||
}
|
||||
} elseif ( ! $lastIsDivider) {
|
||||
$str .= "<li class=\"divider\"></li>";
|
||||
$lastIsDivider = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! $lastIsDivider) {
|
||||
$str .= "<li class=\"divider\"></li>";
|
||||
}
|
||||
|
||||
$str .= "<li><a href=\"javascript:archiveEntity({$model->public_id})\">" . trans("texts.archive_{$entityType}") . "</a></li>";
|
||||
} else {
|
||||
$str .= "<li><a href=\"javascript:restoreEntity({$model->public_id})\">" . trans("texts.restore_{$entityType}") . "</a></li>";
|
||||
}
|
||||
|
||||
if (property_exists($model, 'is_deleted') && !$model->is_deleted) {
|
||||
$str .= "<li><a href=\"javascript:deleteEntity({$model->public_id})\">" . trans("texts.delete_{$entityType}") . "</a></li>";
|
||||
}
|
||||
|
||||
return $str.'</ul></div>';
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Utils;
|
||||
use URL;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\InvoiceRepository;
|
||||
use App\Ninja\Repositories\ClientRepository;
|
||||
@ -10,11 +12,13 @@ class InvoiceService extends BaseService
|
||||
{
|
||||
protected $clientRepo;
|
||||
protected $invoiceRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(ClientRepository $clientRepo, InvoiceRepository $invoiceRepo)
|
||||
public function __construct(ClientRepository $clientRepo, InvoiceRepository $invoiceRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->clientRepo = $clientRepo;
|
||||
$this->invoiceRepo = $invoiceRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
@ -78,4 +82,159 @@ class InvoiceService extends BaseService
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getDatatable($accountId, $clientPublicId = null, $entityType, $search)
|
||||
{
|
||||
$query = $this->invoiceRepo->getInvoices($accountId, $clientPublicId, $entityType, $search)
|
||||
->where('invoices.is_quote', '=', $entityType == ENTITY_QUOTE ? true : false);
|
||||
|
||||
return $this->createDatatable($entityType, $query, !$clientPublicId);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'invoice_number',
|
||||
function ($model) use ($entityType) {
|
||||
return link_to("{$entityType}s/{$model->public_id}/edit", $model->invoice_number, ['class' => Utils::getEntityRowClass($model)]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'client_name',
|
||||
function ($model) {
|
||||
return link_to("clients/{$model->client_public_id}", Utils::getClientDisplayName($model));
|
||||
},
|
||||
! $hideClient
|
||||
],
|
||||
[
|
||||
'invoice_date',
|
||||
function ($model) {
|
||||
return Utils::fromSqlDate($model->invoice_date);
|
||||
}
|
||||
],
|
||||
[
|
||||
'amount',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->amount, $model->currency_id);
|
||||
}
|
||||
],
|
||||
[
|
||||
'balance',
|
||||
function ($model) {
|
||||
return $model->partial > 0 ?
|
||||
trans('texts.partial_remaining', [
|
||||
'partial' => Utils::formatMoney($model->partial, $model->currency_id),
|
||||
'balance' => Utils::formatMoney($model->balance, $model->currency_id)]
|
||||
) :
|
||||
Utils::formatMoney($model->balance, $model->currency_id);
|
||||
},
|
||||
$entityType == ENTITY_INVOICE
|
||||
],
|
||||
[
|
||||
'due_date',
|
||||
function ($model) {
|
||||
return Utils::fromSqlDate($model->due_date);
|
||||
},
|
||||
],
|
||||
[
|
||||
'invoice_status_name',
|
||||
function ($model) {
|
||||
return $model->quote_invoice_id ? link_to("invoices/{$model->quote_invoice_id}/edit", trans('texts.converted')) : self::getStatusLabel($model->invoice_status_id, $model->invoice_status_name);
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
trans("texts.edit_{$entityType}"),
|
||||
function ($model) use ($entityType) {
|
||||
return URL::to("{$entityType}s/{$model->public_id}/edit");
|
||||
}
|
||||
],
|
||||
[
|
||||
trans("texts.clone_{$entityType}"),
|
||||
function ($model) use ($entityType) {
|
||||
return URL::to("{$entityType}s/{$model->public_id}/clone");
|
||||
}
|
||||
],
|
||||
[
|
||||
trans("texts.view_history"),
|
||||
function ($model) use ($entityType) {
|
||||
return URL::to("{$entityType}s/{$entityType}_history/{$model->public_id}");
|
||||
}
|
||||
],
|
||||
[],
|
||||
[
|
||||
trans("texts.mark_sent"),
|
||||
function ($model) {
|
||||
return "javascript:markEntity({$model->public_id})";
|
||||
},
|
||||
function ($model) {
|
||||
return $model->invoice_status_id < INVOICE_STATUS_SENT;
|
||||
}
|
||||
],
|
||||
[
|
||||
trans('texts.enter_payment'),
|
||||
function ($model) {
|
||||
return URL::to("payments/create/{$model->client_public_id}/{$model->public_id}");
|
||||
},
|
||||
function ($model) use ($entityType) {
|
||||
return $entityType == ENTITY_INVOICE && $model->balance > 0;
|
||||
}
|
||||
],
|
||||
[
|
||||
trans("texts.view_quote"),
|
||||
function ($model) {
|
||||
return URL::to("quotes/{$model->quote_id}/edit");
|
||||
},
|
||||
function ($model) use ($entityType) {
|
||||
return $entityType == ENTITY_INVOICE && $model->quote_id;
|
||||
}
|
||||
],
|
||||
[
|
||||
trans("texts.view_invoice"),
|
||||
function ($model) {
|
||||
return URL::to("invoices/{$model->quote_invoice_id}/edit");
|
||||
},
|
||||
function ($model) use ($entityType) {
|
||||
return $entityType == ENTITY_QUOTE && $model->quote_invoice_id;
|
||||
}
|
||||
],
|
||||
[
|
||||
trans("texts.convert_to_invoice"),
|
||||
function ($model) {
|
||||
return "javascript:convertEntity({$model->public_id})";
|
||||
},
|
||||
function ($model) use ($entityType) {
|
||||
return $entityType == ENTITY_QUOTE && ! $model->quote_invoice_id;
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
private function getStatusLabel($statusId, $statusName)
|
||||
{
|
||||
$label = trans("texts.status_" . strtolower($statusName));
|
||||
$class = 'default';
|
||||
switch ($statusId) {
|
||||
case INVOICE_STATUS_SENT:
|
||||
$class = 'info';
|
||||
break;
|
||||
case INVOICE_STATUS_VIEWED:
|
||||
$class = 'warning';
|
||||
break;
|
||||
case INVOICE_STATUS_PARTIAL:
|
||||
$class = 'primary';
|
||||
break;
|
||||
case INVOICE_STATUS_PAID:
|
||||
$class = 'success';
|
||||
break;
|
||||
}
|
||||
return "<h4><div class=\"label label-{$class}\">$label</div></h4>";
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Utils;
|
||||
use URL;
|
||||
use DateTime;
|
||||
use Event;
|
||||
@ -18,9 +19,11 @@ use App\Events\PaymentWasCreated;
|
||||
class PaymentService extends BaseService
|
||||
{
|
||||
public $lastError;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(PaymentRepository $paymentRepo, AccountRepository $accountRepo)
|
||||
public function __construct(PaymentRepository $paymentRepo, AccountRepository $accountRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->datatableService = $datatableService;
|
||||
$this->paymentRepo = $paymentRepo;
|
||||
$this->accountRepo = $accountRepo;
|
||||
}
|
||||
@ -243,4 +246,68 @@ class PaymentService extends BaseService
|
||||
// create payment record
|
||||
return $this->createPayment($invitation, $ref);
|
||||
}
|
||||
|
||||
public function getDatatable($clientPublicId, $search)
|
||||
{
|
||||
$query = $this->paymentRepo->find($clientPublicId, $search);
|
||||
|
||||
return $this->createDatatable(ENTITY_PAYMENT, $query, !$clientPublicId);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'invoice_number',
|
||||
function ($model) {
|
||||
return link_to("invoices/{$model->invoice_public_id}/edit", $model->invoice_number, ['class' => Utils::getEntityRowClass($model)]);
|
||||
}
|
||||
],
|
||||
[
|
||||
'client_name',
|
||||
function ($model) {
|
||||
return $model->client_public_id ? link_to("clients/{$model->client_public_id}", Utils::getClientDisplayName($model)) : '';
|
||||
},
|
||||
! $hideClient
|
||||
],
|
||||
[
|
||||
'transaction_reference',
|
||||
function ($model) {
|
||||
return $model->transaction_reference ? $model->transaction_reference : '<i>Manual entry</i>';
|
||||
}
|
||||
],
|
||||
[
|
||||
'payment_type',
|
||||
function ($model) {
|
||||
return $model->payment_type ? $model->payment_type : ($model->account_gateway_id ? $model->gateway_name : '');
|
||||
}
|
||||
],
|
||||
[
|
||||
'amount',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->amount, $model->currency_id);
|
||||
}
|
||||
],
|
||||
[
|
||||
'payment_date',
|
||||
function ($model) {
|
||||
return Utils::dateToString($model->payment_date);
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
trans('texts.edit_payment'),
|
||||
function ($model) {
|
||||
return URL::to("payments/{$model->public_id}/edit");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
84
app/Services/ProductService.php
Normal file
84
app/Services/ProductService.php
Normal file
@ -0,0 +1,84 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use Utils;
|
||||
use Str;
|
||||
use DB;
|
||||
use Auth;
|
||||
use URL;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\ProductRepository;
|
||||
|
||||
class ProductService extends BaseService
|
||||
{
|
||||
protected $datatableService;
|
||||
protected $productRepo;
|
||||
|
||||
public function __construct(DatatableService $datatableService, ProductRepository $productRepo)
|
||||
{
|
||||
$this->datatableService = $datatableService;
|
||||
$this->productRepo = $productRepo;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
{
|
||||
return $this->productRepo;
|
||||
}
|
||||
|
||||
/*
|
||||
public function save()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
*/
|
||||
|
||||
public function getDatatable($accountId)
|
||||
{
|
||||
$query = $this->productRepo->find($accountId);
|
||||
|
||||
return $this->createDatatable(ENTITY_PRODUCT, $query, false);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'product_key',
|
||||
function ($model) {
|
||||
return link_to('products/'.$model->public_id.'/edit', $model->product_key);
|
||||
}
|
||||
],
|
||||
[
|
||||
'notes',
|
||||
function ($model) {
|
||||
return nl2br(Str::limit($model->notes, 100));
|
||||
}
|
||||
],
|
||||
[
|
||||
'cost',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->cost);
|
||||
}
|
||||
],
|
||||
[
|
||||
'tax_rate',
|
||||
function ($model) {
|
||||
return $model->tax_rate ? ($model->tax_name . ' ' . $model->tax_rate . '%') : '';
|
||||
},
|
||||
Auth::user()->account->invoice_item_taxes
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
uctrans('texts.edit_product'),
|
||||
function ($model) {
|
||||
return URL::to("products/{$model->public_id}/edit");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
}
|
73
app/Services/RecurringInvoiceService.php
Normal file
73
app/Services/RecurringInvoiceService.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use URL;
|
||||
use Utils;
|
||||
use App\Ninja\Repositories\InvoiceRepository;
|
||||
|
||||
class RecurringInvoiceService extends BaseService
|
||||
{
|
||||
protected $invoiceRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(InvoiceRepository $invoiceRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->invoiceRepo = $invoiceRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
public function getDatatable($accountId, $clientPublicId = null, $entityType, $search)
|
||||
{
|
||||
$query = $this->invoiceRepo->getRecurringInvoices($accountId, $clientPublicId, $search);
|
||||
|
||||
return $this->createDatatable(ENTITY_RECURRING_INVOICE, $query, !$clientPublicId);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'frequency',
|
||||
function ($model) {
|
||||
return link_to("invoices/{$model->public_id}", $model->frequency);
|
||||
}
|
||||
],
|
||||
[
|
||||
'client_name',
|
||||
function ($model) {
|
||||
return link_to("clients/{$model->client_public_id}", Utils::getClientDisplayName($model));
|
||||
},
|
||||
! $hideClient
|
||||
],
|
||||
[
|
||||
'start_date',
|
||||
function ($model) {
|
||||
return Utils::fromSqlDate($model->start_date);
|
||||
}
|
||||
],
|
||||
[
|
||||
'end_date',
|
||||
function ($model) {
|
||||
return Utils::fromSqlDate($model->end_date);
|
||||
}
|
||||
],
|
||||
[
|
||||
'amount',
|
||||
function ($model) {
|
||||
return Utils::formatMoney($model->amount, $model->currency_id);
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
trans('texts.edit_invoice'),
|
||||
function ($model) {
|
||||
return URL::to("invoices/{$model->public_id}/edit");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
134
app/Services/TaskService.php
Normal file
134
app/Services/TaskService.php
Normal file
@ -0,0 +1,134 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use URL;
|
||||
use Utils;
|
||||
use App\Models\Task;
|
||||
use App\Ninja\Repositories\TaskRepository;
|
||||
use App\Services\BaseService;
|
||||
|
||||
class TaskService extends BaseService
|
||||
{
|
||||
protected $datatableService;
|
||||
protected $taskRepo;
|
||||
|
||||
public function __construct(TaskRepository $taskRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->taskRepo = $taskRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
{
|
||||
return $this->taskRepo;
|
||||
}
|
||||
|
||||
/*
|
||||
public function save()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
*/
|
||||
|
||||
public function getDatatable($clientPublicId, $search)
|
||||
{
|
||||
$query = $this->taskRepo->find($clientPublicId, $search);
|
||||
|
||||
return $this->createDatatable(ENTITY_TASK, $query, !$clientPublicId);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'client_name',
|
||||
function ($model) {
|
||||
return $model->client_public_id ? link_to("clients/{$model->client_public_id}", Utils::getClientDisplayName($model)) : '';
|
||||
},
|
||||
! $hideClient
|
||||
],
|
||||
[
|
||||
'created_at',
|
||||
function ($model) {
|
||||
return link_to("tasks/{$model->public_id}/edit", Task::calcStartTime($model));
|
||||
}
|
||||
],
|
||||
[
|
||||
'time_log',
|
||||
function($model) {
|
||||
return Utils::formatTime(Task::calcDuration($model));
|
||||
}
|
||||
],
|
||||
[
|
||||
'description',
|
||||
function ($model) {
|
||||
return $model->description;
|
||||
}
|
||||
],
|
||||
[
|
||||
'invoice_number',
|
||||
function ($model) {
|
||||
return self::getStatusLabel($model);
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
trans('texts.edit_task'),
|
||||
function ($model) {
|
||||
return URL::to('tasks/'.$model->public_id.'/edit');
|
||||
},
|
||||
function ($model) {
|
||||
return !$model->deleted_at || $model->deleted_at == '0000-00-00';
|
||||
}
|
||||
],
|
||||
[
|
||||
trans('texts.view_invoice'),
|
||||
function ($model) {
|
||||
return URL::to("/invoices/{$model->invoice_public_id}/edit");
|
||||
},
|
||||
function ($model) {
|
||||
return $model->invoice_number;
|
||||
}
|
||||
],
|
||||
[
|
||||
trans('texts.stop_task'),
|
||||
function ($model) {
|
||||
return "javascript:stopTask({$model->public_id})";
|
||||
},
|
||||
function ($model) {
|
||||
return $model->is_running;
|
||||
}
|
||||
],
|
||||
[
|
||||
trans('texts.invoice_task'),
|
||||
function ($model) {
|
||||
return "javascript:invoiceTask({$model->public_id})";
|
||||
},
|
||||
function ($model) {
|
||||
return ! $model->invoice_number && (!$model->deleted_at || $model->deleted_at == '0000-00-00');
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
private function getStatusLabel($model)
|
||||
{
|
||||
if ($model->invoice_number) {
|
||||
$class = 'success';
|
||||
$label = trans('texts.invoiced');
|
||||
} elseif ($model->is_running) {
|
||||
$class = 'primary';
|
||||
$label = trans('texts.running');
|
||||
} else {
|
||||
$class = 'default';
|
||||
$label = trans('texts.logged');
|
||||
}
|
||||
|
||||
return "<h4><div class=\"label label-{$class}\">$label</div></h4>";
|
||||
}
|
||||
|
||||
}
|
68
app/Services/TaxRateService.php
Normal file
68
app/Services/TaxRateService.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use URL;
|
||||
use Auth;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\TaxRateRepository;
|
||||
|
||||
class TaxRateService extends BaseService
|
||||
{
|
||||
protected $taxRateRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(TaxRateRepository $taxRateRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->taxRateRepo = $taxRateRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
{
|
||||
return $this->taxRateRepo;
|
||||
}
|
||||
|
||||
/*
|
||||
public function save()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
*/
|
||||
|
||||
public function getDatatable($accountId)
|
||||
{
|
||||
$query = $this->taxRateRepo->find($accountId);
|
||||
|
||||
return $this->createDatatable(ENTITY_TAX_RATE, $query, false);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'name',
|
||||
function ($model) {
|
||||
return link_to("tax_rates/{$model->public_id}/edit", $model->name);
|
||||
}
|
||||
],
|
||||
[
|
||||
'rate',
|
||||
function ($model) {
|
||||
return $model->rate . '%';
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
uctrans('texts.edit_tax_rate'),
|
||||
function ($model) {
|
||||
return URL::to("tax_rates/{$model->public_id}/edit");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
}
|
67
app/Services/TokenService.php
Normal file
67
app/Services/TokenService.php
Normal file
@ -0,0 +1,67 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use URL;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\TokenRepository;
|
||||
|
||||
class TokenService extends BaseService
|
||||
{
|
||||
protected $tokenRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(TokenRepository $tokenRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->tokenRepo = $tokenRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
{
|
||||
return $this->tokenRepo;
|
||||
}
|
||||
|
||||
/*
|
||||
public function save()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
*/
|
||||
|
||||
public function getDatatable($accountId)
|
||||
{
|
||||
$query = $this->tokenRepo->find($accountId);
|
||||
|
||||
return $this->createDatatable(ENTITY_TOKEN, $query, false);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'name',
|
||||
function ($model) {
|
||||
return link_to("tokens/{$model->public_id}/edit", $model->name);
|
||||
}
|
||||
],
|
||||
[
|
||||
'token',
|
||||
function ($model) {
|
||||
return $model->token;
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
uctrans('texts.edit_token'),
|
||||
function ($model) {
|
||||
return URL::to("tokens/{$model->public_id}/edit");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
}
|
82
app/Services/UserService.php
Normal file
82
app/Services/UserService.php
Normal file
@ -0,0 +1,82 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use URL;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\UserRepository;
|
||||
|
||||
class UserService extends BaseService
|
||||
{
|
||||
protected $userRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(UserRepository $userRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->userRepo = $userRepo;
|
||||
$this->datatableService = $datatableService;
|
||||
}
|
||||
|
||||
protected function getRepo()
|
||||
{
|
||||
return $this->userRepo;
|
||||
}
|
||||
|
||||
/*
|
||||
public function save()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
*/
|
||||
|
||||
public function getDatatable($accountId)
|
||||
{
|
||||
$query = $this->userRepo->find($accountId);
|
||||
|
||||
return $this->createDatatable(ENTITY_USER, $query, false);
|
||||
}
|
||||
|
||||
protected function getDatatableColumns($entityType, $hideClient)
|
||||
{
|
||||
return [
|
||||
[
|
||||
'first_name',
|
||||
function ($model) {
|
||||
return link_to('users/'.$model->public_id.'/edit', $model->first_name.' '.$model->last_name);
|
||||
}
|
||||
],
|
||||
[
|
||||
'email',
|
||||
function ($model) {
|
||||
return $model->email;
|
||||
}
|
||||
],
|
||||
[
|
||||
'confirmed',
|
||||
function ($model) {
|
||||
return $model->deleted_at ? trans('texts.deleted') : ($model->confirmed ? trans('texts.active') : trans('texts.pending'));
|
||||
}
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
protected function getDatatableActions($entityType)
|
||||
{
|
||||
return [
|
||||
[
|
||||
uctrans('texts.edit_user'),
|
||||
function ($model) {
|
||||
return URL::to("users/{$model->public_id}/edit");
|
||||
}
|
||||
],
|
||||
[
|
||||
uctrans('texts.send_invite'),
|
||||
function ($model) {
|
||||
return URL::to("send_confirmation/{$model->public_id}");
|
||||
},
|
||||
function ($model) {
|
||||
return !$model->confirmed;
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
}
|
@ -125,12 +125,12 @@ return array(
|
||||
// list pages
|
||||
'archive' => 'Archive',
|
||||
'delete' => 'Delete',
|
||||
'archive_client' => 'Archive client',
|
||||
'delete_client' => 'Delete client',
|
||||
'archive_payment' => 'Archive payment',
|
||||
'delete_payment' => 'Delete payment',
|
||||
'archive_credit' => 'Archive credit',
|
||||
'delete_credit' => 'Delete credit',
|
||||
'archive_client' => 'Archive Client',
|
||||
'delete_client' => 'Delete Client',
|
||||
'archive_payment' => 'Archive Payment',
|
||||
'delete_payment' => 'Delete Payment',
|
||||
'archive_credit' => 'Archive Credit',
|
||||
'delete_credit' => 'Delete Credit',
|
||||
'show_archived_deleted' => 'Show archived/deleted',
|
||||
'filter' => 'Filter',
|
||||
'new_client' => 'New Client',
|
||||
@ -835,7 +835,7 @@ return array(
|
||||
'updated_tax_rate' => 'Successfully updated tax rate',
|
||||
'created_tax_rate' => 'Successfully created tax rate',
|
||||
'edit_tax_rate' => 'Edit tax rate',
|
||||
'archive_tax_rate' => 'Archive tax rate',
|
||||
'archive_tax_rate' => 'Archive Tax Rate',
|
||||
'archived_tax_rate' => 'Successfully archived the tax rate',
|
||||
'default_tax_rate_id' => 'Default Tax Rate',
|
||||
'tax_rate' => 'Tax Rate',
|
||||
@ -894,6 +894,18 @@ return array(
|
||||
'quote_is_approved' => 'This quote is approved',
|
||||
'apply_credit' => 'Apply Credit',
|
||||
'system_settings' => 'System Settings',
|
||||
|
||||
'archive_token' => 'Archive Token',
|
||||
'archived_token' => 'Successfully archived token',
|
||||
'archive_user' => 'Archive User',
|
||||
'archived_user' => 'Successfully archived user',
|
||||
'archive_account_gateway' => 'Archive Gateway',
|
||||
'archived_account_gateway' => 'Successfully archived gateway',
|
||||
'archive_recurring_invoice' => 'Archive Recurring Invoice',
|
||||
'archived_recurring_invoice' => 'Successfully archived recurring invoice',
|
||||
'delete_recurring_invoice' => 'Delete Recurring Invoice',
|
||||
'deleted_recurring_invoice' => 'Successfully deleted recurring invoice',
|
||||
'restore_recurring_invoice' => 'Restore Recurring Invoice',
|
||||
'restored_recurring_invoice' => 'Successfully restored recurring invoice',
|
||||
'archived' => 'Archived',
|
||||
|
||||
);
|
||||
|
@ -4,14 +4,6 @@
|
||||
@parent
|
||||
@include('accounts.nav', ['selected' => ACCOUNT_API_TOKENS, 'advanced' => true])
|
||||
|
||||
{!! Former::open('tokens/delete')->addClass('user-form') !!}
|
||||
|
||||
<div style="display:none">
|
||||
{!! Former::text('tokenPublicId') !!}
|
||||
</div>
|
||||
{!! Former::close() !!}
|
||||
|
||||
|
||||
<div class="pull-right">
|
||||
{!! Button::normal(trans('texts.documentation'))->asLinkTo(NINJA_WEB_URL.'/knowledgebase/api-documentation/')->withAttributes(['target' => '_blank'])->appendIcon(Icon::create('info-sign')) !!}
|
||||
@if (Utils::isNinja())
|
||||
@ -29,6 +21,8 @@
|
||||
</label>
|
||||
-->
|
||||
|
||||
@include('partials.bulk_form', ['entityType' => ENTITY_TOKEN])
|
||||
|
||||
{!! Datatable::table()
|
||||
->addColumn(
|
||||
trans('texts.name'),
|
||||
@ -58,15 +52,6 @@
|
||||
var checked = $('#trashed').is(':checked');
|
||||
window.location = '{!! URL::to('view_archive/token') !!}' + (checked ? '/true' : '/false');
|
||||
}
|
||||
|
||||
function deleteToken(id) {
|
||||
if (!confirm("{!! trans('texts.are_you_sure') !!}")) {
|
||||
return;
|
||||
}
|
||||
|
||||
$('#tokenPublicId').val(id);
|
||||
$('form.user-form').submit();
|
||||
}
|
||||
</script>
|
||||
|
||||
@stop
|
||||
|
@ -4,14 +4,6 @@
|
||||
@parent
|
||||
@include('accounts.nav', ['selected' => ACCOUNT_PAYMENTS])
|
||||
|
||||
{!! Former::open('gateways/delete')->addClass('user-form') !!}
|
||||
|
||||
<div style="display:none">
|
||||
{!! Former::text('accountGatewayPublicId') !!}
|
||||
</div>
|
||||
{!! Former::close() !!}
|
||||
|
||||
|
||||
@if ($showAdd)
|
||||
{!! Button::primary(trans('texts.add_gateway'))
|
||||
->asLinkTo(URL::to('/gateways/create'))
|
||||
@ -19,6 +11,8 @@
|
||||
->appendIcon(Icon::create('plus-sign')) !!}
|
||||
@endif
|
||||
|
||||
@include('partials.bulk_form', ['entityType' => ENTITY_ACCOUNT_GATEWAY])
|
||||
|
||||
{!! Datatable::table()
|
||||
->addColumn(
|
||||
trans('texts.name'),
|
||||
@ -43,22 +37,6 @@
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
function setTrashVisible() {
|
||||
var checked = $('#trashed').is(':checked');
|
||||
window.location = '{{ URL::to('view_archive/token') }}' + (checked ? '/true' : '/false');
|
||||
}
|
||||
*/
|
||||
|
||||
function deleteAccountGateway(id) {
|
||||
if (!confirm("{!! trans('texts.are_you_sure') !!}")) {
|
||||
return;
|
||||
}
|
||||
|
||||
$('#accountGatewayPublicId').val(id);
|
||||
$('form.user-form').submit();
|
||||
}
|
||||
</script>
|
||||
|
||||
@stop
|
@ -29,6 +29,8 @@
|
||||
->withAttributes(['class' => 'pull-right'])
|
||||
->appendIcon(Icon::create('plus-sign')) !!}
|
||||
|
||||
@include('partials.bulk_form', ['entityType' => ENTITY_PRODUCT])
|
||||
|
||||
{!! Datatable::table()
|
||||
->addColumn($columns)
|
||||
->setUrl(url('api/products/'))
|
||||
|
@ -49,6 +49,8 @@
|
||||
->withAttributes(['class' => 'pull-right'])
|
||||
->appendIcon(Icon::create('plus-sign')) !!}
|
||||
|
||||
@include('partials.bulk_form', ['entityType' => ENTITY_TAX_RATE])
|
||||
|
||||
{!! Datatable::table()
|
||||
->addColumn(
|
||||
trans('texts.name'),
|
||||
|
@ -4,13 +4,6 @@
|
||||
@parent
|
||||
@include('accounts.nav', ['selected' => ACCOUNT_USER_MANAGEMENT, 'advanced' => true])
|
||||
|
||||
{!! Former::open('users/delete')->addClass('user-form') !!}
|
||||
|
||||
<div style="display:none">
|
||||
{!! Former::text('userPublicId') !!}
|
||||
</div>
|
||||
{!! Former::close() !!}
|
||||
|
||||
|
||||
<div class="pull-right">
|
||||
@if (Utils::isPro())
|
||||
@ -24,6 +17,7 @@
|
||||
{!! Session::get('show_trash:user') ? 'checked' : ''!!}/> {!! trans('texts.show_deleted_users')!!}
|
||||
</label>
|
||||
|
||||
@include('partials.bulk_form', ['entityType' => ENTITY_USER])
|
||||
|
||||
{!! Datatable::table()
|
||||
->addColumn(
|
||||
@ -56,14 +50,6 @@
|
||||
window.location = '{!! URL::to('view_archive/user') !!}' + (checked ? '/true' : '/false');
|
||||
}
|
||||
|
||||
function deleteUser(id) {
|
||||
if (!confirm("{!! trans('texts.are_you_sure') !!}")) {
|
||||
return;
|
||||
}
|
||||
|
||||
$('#userPublicId').val(id);
|
||||
$('form.user-form').submit();
|
||||
}
|
||||
</script>
|
||||
|
||||
@stop
|
||||
|
@ -135,12 +135,17 @@
|
||||
});
|
||||
|
||||
$('tbody tr').mouseover(function() {
|
||||
$(this).closest('tr').find('.tr-action').css('visibility','visible');
|
||||
$(this).closest('tr').find('.tr-action').css('display', 'inline-block');
|
||||
$(this).closest('tr').find('.tr-status').css('display', 'none');
|
||||
}).mouseout(function() {
|
||||
//$(this).closest('tr').find('.tr-action').css('display', 'none');
|
||||
|
||||
$dropdown = $(this).closest('tr').find('.tr-action');
|
||||
if (!$dropdown.hasClass('open')) {
|
||||
$dropdown.css('visibility','hidden');
|
||||
$dropdown.css('display', 'none');
|
||||
$(this).closest('tr').find('.tr-status').css('display', 'inline-block');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
30
resources/views/partials/bulk_form.blade.php
Normal file
30
resources/views/partials/bulk_form.blade.php
Normal file
@ -0,0 +1,30 @@
|
||||
<div style="display:none">
|
||||
{!! Former::open($entityType . 's/bulk')->addClass('bulk-form') !!}
|
||||
{!! Former::text('bulk_action') !!}
|
||||
{!! Former::text('bulk_public_id') !!}
|
||||
{!! Former::close() !!}
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
function submitBulkForm(action, id) {
|
||||
if (action == 'delete') {
|
||||
if (!confirm('{!! trans("texts.are_you_sure") !!}')) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$('#bulk_public_id').val(id);
|
||||
$('#bulk_action').val(action);
|
||||
|
||||
$('form.bulk-form').submit();
|
||||
}
|
||||
function archiveEntity(id) {
|
||||
submitBulkForm('archive', id);
|
||||
}
|
||||
function restoreEntity(id) {
|
||||
submitBulkForm('restore', id);
|
||||
}
|
||||
function deleteEntity(id) {
|
||||
submitBulkForm('delete', id);
|
||||
}
|
||||
</script>
|
Loading…
Reference in New Issue
Block a user