mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-08 11:24:28 -04:00
Proposals
This commit is contained in:
parent
e822ec04b3
commit
3da023c1a6
@ -70,15 +70,27 @@ class ProposalTemplateController extends BaseController
|
|||||||
return redirect("proposals/templates/$publicId/edit");
|
return redirect("proposals/templates/$publicId/edit");
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit(ProposalTemplateRequest $request)
|
public function edit(ProposalTemplateRequest $request, $publicId = false, $clone = false)
|
||||||
{
|
{
|
||||||
$proposalTemplate = $request->entity();
|
$template = $request->entity();
|
||||||
|
|
||||||
|
if ($clone) {
|
||||||
|
$template->id = null;
|
||||||
|
$template->public_id = null;
|
||||||
|
$template->name = '';
|
||||||
|
$template->private_notes = '';
|
||||||
|
$method = 'POST';
|
||||||
|
$url = 'proposals/templates';
|
||||||
|
} else {
|
||||||
|
$method = 'PUT';
|
||||||
|
$url = 'proposals/templates/' . $template->public_id;
|
||||||
|
}
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'account' => auth()->user()->account,
|
'account' => auth()->user()->account,
|
||||||
'template' => $proposalTemplate,
|
'template' => $template,
|
||||||
'method' => 'PUT',
|
'method' => $method,
|
||||||
'url' => 'proposals/templates/' . $proposalTemplate->public_id,
|
'url' => $url,
|
||||||
'title' => trans('texts.edit_proposal_template'),
|
'title' => trans('texts.edit_proposal_template'),
|
||||||
'templates' => ProposalTemplate::scope()->orderBy('name')->get(),
|
'templates' => ProposalTemplate::scope()->orderBy('name')->get(),
|
||||||
];
|
];
|
||||||
@ -86,6 +98,11 @@ class ProposalTemplateController extends BaseController
|
|||||||
return View::make('proposals/templates/edit', $data);
|
return View::make('proposals/templates/edit', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function cloneProposal(ProposalTemplateRequest $request, $publicId)
|
||||||
|
{
|
||||||
|
return self::edit($request, $publicId, true);
|
||||||
|
}
|
||||||
|
|
||||||
public function store(CreateProposalTemplateRequest $request)
|
public function store(CreateProposalTemplateRequest $request)
|
||||||
{
|
{
|
||||||
$proposalTemplate = $this->proposalTemplateService->save($request->input());
|
$proposalTemplate = $this->proposalTemplateService->save($request->input());
|
||||||
|
@ -22,7 +22,7 @@ class CreateProposalCategoryRequest extends ProposalCategoryRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => 'required',
|
'name' => sprintf('required|unique:proposal_categories,name,,id,account_id,%s', $this->user()->account_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ class CreateProposalSnippetRequest extends ProposalSnippetRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => 'required',
|
'name' => sprintf('required|unique:proposal_snippets,name,,id,account_id,%s', $this->user()->account_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ class CreateProposalTemplateRequest extends ProposalTemplateRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'name' => 'required',
|
'name' => sprintf('required|unique:proposal_templates,name,,id,account_id,%s', $this->user()->account_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ class UpdateProposalCategoryRequest extends ProposalCategoryRequest
|
|||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'name' => 'required',
|
'name' => sprintf('required|unique:proposal_categories,name,,id,account_id,%s', $this->user()->account_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ class UpdateProposalSnippetRequest extends ProposalSnippetRequest
|
|||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'name' => 'required',
|
'name' => sprintf('required|unique:proposal_snippets,name,%s,id,account_id,%s', $this->entity()->id, $this->user()->account_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ class UpdateProposalTemplateRequest extends ProposalTemplateRequest
|
|||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'name' => 'required',
|
'name' => sprintf('required|unique:proposal_templates,name,%s,id,account_id,%s', $this->entity()->id, $this->user()->account_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,7 @@ class HistoryUtils
|
|||||||
ENTITY_TASK,
|
ENTITY_TASK,
|
||||||
ENTITY_EXPENSE,
|
ENTITY_EXPENSE,
|
||||||
ENTITY_PROJECT,
|
ENTITY_PROJECT,
|
||||||
|
ENTITY_PROPOSAL,
|
||||||
//ENTITY_RECURRING_EXPENSE,
|
//ENTITY_RECURRING_EXPENSE,
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -142,6 +143,9 @@ class HistoryUtils
|
|||||||
} elseif (method_exists($entity, 'client') && $entity->client) {
|
} elseif (method_exists($entity, 'client') && $entity->client) {
|
||||||
$object->client_id = $entity->client->public_id;
|
$object->client_id = $entity->client->public_id;
|
||||||
$object->client_name = $entity->client->getDisplayName();
|
$object->client_name = $entity->client->getDisplayName();
|
||||||
|
} elseif (method_exists($entity, 'invoice') && $entity->invoice) {
|
||||||
|
$object->client_id = $entity->invoice->client->public_id;
|
||||||
|
$object->client_name = $entity->invoice->client->getDisplayName();
|
||||||
} else {
|
} else {
|
||||||
$object->client_id = 0;
|
$object->client_id = 0;
|
||||||
$object->client_name = 0;
|
$object->client_name = 0;
|
||||||
|
@ -17,6 +17,10 @@ class Proposal extends EntityModel
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $dates = ['deleted_at'];
|
protected $dates = ['deleted_at'];
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $presenter = 'App\Ninja\Presenters\ProposalPresenter';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var array
|
||||||
@ -82,7 +86,7 @@ class Proposal extends EntityModel
|
|||||||
|
|
||||||
public function getDisplayName()
|
public function getDisplayName()
|
||||||
{
|
{
|
||||||
return 'TODO';
|
return $this->invoice->invoice_number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ class ExpenseDatatable extends EntityDatatable
|
|||||||
return URL::to("expenses/{$model->public_id}/clone");
|
return URL::to("expenses/{$model->public_id}/clone");
|
||||||
},
|
},
|
||||||
function ($model) {
|
function ($model) {
|
||||||
return Auth::user()->can('create', ENTITY_EXPENSE);
|
return Auth::user()->can('viewByOwner', [ENTITY_EXPENSE, $model->user_id]) && Auth::user()->can('create', ENTITY_EXPENSE);
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -96,7 +96,7 @@ class InvoiceDatatable extends EntityDatatable
|
|||||||
return URL::to("invoices/{$model->public_id}/clone");
|
return URL::to("invoices/{$model->public_id}/clone");
|
||||||
},
|
},
|
||||||
function ($model) {
|
function ($model) {
|
||||||
return Auth::user()->can('create', ENTITY_INVOICE);
|
return Auth::user()->can('viewByOwner', [ENTITY_INVOICE, $model->user_id]) && Auth::user()->can('create', ENTITY_INVOICE);
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@ -105,7 +105,7 @@ class InvoiceDatatable extends EntityDatatable
|
|||||||
return URL::to("quotes/{$model->public_id}/clone");
|
return URL::to("quotes/{$model->public_id}/clone");
|
||||||
},
|
},
|
||||||
function ($model) {
|
function ($model) {
|
||||||
return Auth::user()->can('create', ENTITY_QUOTE);
|
return Auth::user()->can('viewByOwner', [ENTITY_INVOICE, $model->user_id]) && Auth::user()->can('create', ENTITY_QUOTE);
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -53,6 +53,15 @@ class ProposalTemplateDatatable extends EntityDatatable
|
|||||||
return Auth::user()->can('editByOwner', [ENTITY_PROPOSAL_TEMPLATE, $model->user_id]);
|
return Auth::user()->can('editByOwner', [ENTITY_PROPOSAL_TEMPLATE, $model->user_id]);
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
trans('texts.clone_proposal_template'),
|
||||||
|
function ($model) {
|
||||||
|
return URL::to("proposals/templates/{$model->public_id}/clone");
|
||||||
|
},
|
||||||
|
function ($model) {
|
||||||
|
return Auth::user()->can('editByOwner', [ENTITY_PROPOSAL_TEMPLATE, $model->user_id]);
|
||||||
|
},
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
app/Ninja/Presenters/ProposalPresenter.php
Normal file
13
app/Ninja/Presenters/ProposalPresenter.php
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Ninja\Presenters;
|
||||||
|
|
||||||
|
use Utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ProposalPresenter.
|
||||||
|
*/
|
||||||
|
class ProposalPresenter extends EntityPresenter
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -2727,6 +2727,7 @@ $LANG = array(
|
|||||||
'icon' => 'Icon',
|
'icon' => 'Icon',
|
||||||
'proposal_not_found' => 'The requested proposal is not available',
|
'proposal_not_found' => 'The requested proposal is not available',
|
||||||
'create_proposal_category' => 'Create category',
|
'create_proposal_category' => 'Create category',
|
||||||
|
'clone_proposal_template' => 'Clone Template',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -218,6 +218,7 @@ Route::group(['middleware' => ['lookup:user', 'auth:user']], function () {
|
|||||||
Route::resource('proposals/snippets', 'ProposalSnippetController');
|
Route::resource('proposals/snippets', 'ProposalSnippetController');
|
||||||
Route::get('api/proposal_snippets', 'ProposalSnippetController@getDatatable');
|
Route::get('api/proposal_snippets', 'ProposalSnippetController@getDatatable');
|
||||||
|
|
||||||
|
Route::get('proposals/templates/{proposal_templates}/clone', 'ProposalTemplateController@cloneProposal');
|
||||||
Route::post('proposals/templates/bulk', 'ProposalTemplateController@bulk');
|
Route::post('proposals/templates/bulk', 'ProposalTemplateController@bulk');
|
||||||
Route::get('proposals/templates/{proposal_templates}/edit', 'ProposalTemplateController@edit');
|
Route::get('proposals/templates/{proposal_templates}/edit', 'ProposalTemplateController@edit');
|
||||||
Route::get('proposals/templates/create', 'ProposalTemplateController@create');
|
Route::get('proposals/templates/create', 'ProposalTemplateController@create');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user