1
0
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:
David Bomba 2015-11-06 17:16:38 +11:00
commit 76f90b7ff3
48 changed files with 1533 additions and 670 deletions

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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'));
}
/**

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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'));

View File

@ -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) {

View File

@ -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.
*

View File

@ -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'));

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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');

View File

@ -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 ';

View File

@ -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');

View File

@ -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');

View File

@ -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();

View File

@ -6,4 +6,9 @@ class TaxRate extends EntityModel
{
use SoftDeletes;
protected $dates = ['deleted_at'];
public function getEntityType()
{
return ENTITY_TAX_RATE;
}
}

View 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');
}
}

View File

@ -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'
);
}
}

View File

@ -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)
{

View File

@ -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;

View 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'
);
}
}

View File

@ -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)
{

View 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');
}
}

View 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;
}
}

View 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");
}
]
];
}
}

View 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) : '';
}
]
];
}
}

View File

@ -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 [];
}
}

View File

@ -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}");
}
]
];
}
}

View File

@ -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';
}
]
];
}
}

View 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>';
});
}
}

View File

@ -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>";
}
}

View File

@ -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");
}
]
];
}
}

View 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");
}
]
];
}
}

View 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");
}
]
];
}
}

View 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>";
}
}

View 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");
}
]
];
}
}

View 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");
}
]
];
}
}

View 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;
}
]
];
}
}

View File

@ -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',
);

View File

@ -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

View File

@ -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

View File

@ -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/'))

View File

@ -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'),

View File

@ -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

View File

@ -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');
}
});
}

View 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>