1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-18 23:42:25 +02:00

Proposals

This commit is contained in:
Hillel Coren 2018-02-13 12:06:50 +02:00
parent 202aa83b4a
commit 76e5001826
8 changed files with 101 additions and 60 deletions

View File

@ -16,7 +16,6 @@ use App\Ninja\Repositories\DocumentRepository;
use App\Ninja\Repositories\InvoiceRepository;
use App\Ninja\Repositories\PaymentRepository;
use App\Ninja\Repositories\TaskRepository;
use App\Ninja\Repositories\ProposalRepository;
use App\Services\PaymentService;
use Auth;
use Barracuda\ArchiveStream\ZipArchive;
@ -38,7 +37,6 @@ class ClientPortalController extends BaseController
private $invoiceRepo;
private $paymentRepo;
private $documentRepo;
private $propoosalRepo;
public function __construct(
InvoiceRepository $invoiceRepo,
@ -47,8 +45,7 @@ class ClientPortalController extends BaseController
DocumentRepository $documentRepo,
PaymentService $paymentService,
CreditRepository $creditRepo,
TaskRepository $taskRepo,
ProposalRepository $propoosalRepo)
TaskRepository $taskRepo)
{
$this->invoiceRepo = $invoiceRepo;
$this->paymentRepo = $paymentRepo;
@ -57,42 +54,6 @@ class ClientPortalController extends BaseController
$this->paymentService = $paymentService;
$this->creditRepo = $creditRepo;
$this->taskRepo = $taskRepo;
$this->propoosalRepo = $propoosalRepo;
}
public function viewProposal($invitationKey)
{
if (! $invitation = $this->propoosalRepo->findInvitationByKey($invitationKey)) {
return $this->returnError(trans('texts.proposal_not_found'));
}
$account = $invitation->account;
$proposal = $invitation->proposal;
$invoiceInvitation = Invitation::whereContactId($invitation->contact_id)
->whereInvoiceId($proposal->invoice_id)
->firstOrFail();
$data = [
'proposal' => $proposal,
'account' => $account,
'invoiceInvitation' => $invoiceInvitation,
'proposalInvitation' => $invitation,
];
return view('invited.proposal', $data);
}
public function downloadProposal($invitationKey)
{
if (! $invitation = $this->propoosalRepo->findInvitationByKey($invitationKey)) {
return $this->returnError(trans('texts.proposal_not_found'));
}
$proposal = $invitation->proposal;
$mpdf = new \mPDF();
$mpdf->WriteHTML($proposal->present()->htmlDocument);
$mpdf->Output($proposal->present()->filename, 'D');
}
public function viewInvoice($invitationKey)
@ -836,16 +797,6 @@ class ClientPortalController extends BaseController
}, 200);
}
/*
public function getProposalDocument($accountKey, $publicId)
{
$account = Account::whereAccountKey($accountKey)->firstOrFail();
$document = Document::whereAccountId($account->id)->wherePublicId($publicId)->firstOrFail();
return DocumentController::getDownloadResponse($document);
}
*/
public function getDocument($invitationKey, $publicId)
{
if (! $invitation = $this->invoiceRepo->findInvoiceByInvitation($invitationKey)) {

View File

@ -0,0 +1,70 @@
<?php
namespace App\Http\Controllers;
use mPDF;
use App\Models\Account;
use App\Models\Document;
use App\Models\Invitation;
use App\Ninja\Repositories\ProposalRepository;
class ClientPortalProposalController extends BaseController
{
private $invoiceRepo;
private $paymentRepo;
private $documentRepo;
private $propoosalRepo;
public function __construct(ProposalRepository $propoosalRepo)
{
$this->propoosalRepo = $propoosalRepo;
}
public function viewProposal($invitationKey)
{
if (! $invitation = $this->propoosalRepo->findInvitationByKey($invitationKey)) {
return $this->returnError(trans('texts.proposal_not_found'));
}
$account = $invitation->account;
$proposal = $invitation->proposal;
$invoiceInvitation = Invitation::whereContactId($invitation->contact_id)
->whereInvoiceId($proposal->invoice_id)
->firstOrFail();
$data = [
'proposal' => $proposal,
'account' => $account,
'invoiceInvitation' => $invoiceInvitation,
'proposalInvitation' => $invitation,
];
return view('invited.proposal', $data);
}
public function downloadProposal($invitationKey)
{
if (! $invitation = $this->propoosalRepo->findInvitationByKey($invitationKey)) {
return $this->returnError(trans('texts.proposal_not_found'));
}
$proposal = $invitation->proposal;
$mpdf = new mPDF();
$mpdf->WriteHTML($proposal->present()->htmlDocument);
$mpdf->Output($proposal->present()->filename, 'D');
}
public function getProposalImage($accountKey, $documentKey)
{
$account = Account::whereAccountKey($accountKey)
->firstOrFail();
$document = Document::whereAccountId($account->id)
->whereDocumentKey($documentKey)
->whereIsProposal(true)
->firstOrFail();
return DocumentController::getDownloadResponse($document);
}
}

View File

@ -108,7 +108,7 @@ class DocumentController extends BaseController
if ($request->grapesjs) {
$response = [
'data' => [
$result->getUrl()
$result->getProposalUrl()
]
];
} else {

View File

@ -38,7 +38,7 @@ class ProposalComposer
$data = [];
foreach ($documents as $document) {
$data[] = [
'src' => $document->getUrl(),
'src' => $document->getProposalUrl(),
'public_id' => $document->public_id,
];
}

View File

@ -272,6 +272,15 @@ class Document extends EntityModel
return url('client/documents/'.$invitation->invitation_key.'/'.$this->public_id.'/'.$this->name);
}
public function getProposalUrl()
{
if (! $this->is_proposal || ! $this->document_key) {
return '';
}
return url('proposal/image/'. $this->account->account_key . '/' . $this->document_key . '/' . $this->name);
}
/**
* @return bool
*/

View File

@ -54,11 +54,14 @@ class DocumentRepository extends BaseRepository
public function upload($data, &$doc_array = null)
{
if (! empty($data['files']) && is_array($data['files'])) {
if (! empty($data['grapesjs']) && $data['grapesjs']) {
$isProposal = true;
$uploaded = $data['files'][0];
} else {
$isProposal = false;
$uploaded = $data['file'];
}
$extension = strtolower($uploaded->getClientOriginalExtension());
if (empty(Document::$types[$extension]) && ! empty(Document::$extraExtensions[$extension])) {
$documentType = Document::$extraExtensions[$extension];
@ -91,6 +94,11 @@ class DocumentRepository extends BaseRepository
$document = Document::createNew();
$document->fill($data);
if ($isProposal) {
$document->is_proposal = true;
$document->document_key = strtolower(str_random(RANDOM_KEY_LENGTH));
}
$disk = $document->getDisk();
if (! $disk->exists($filename)) {// Have we already stored the same file
$stream = fopen($filePath, 'r');

File diff suppressed because one or more lines are too long

View File

@ -16,9 +16,8 @@ Route::post('/get_started', 'AccountController@getStarted');
// Client visible pages
Route::group(['middleware' => ['lookup:contact', 'auth:client']], function () {
Route::get('view/{invitation_key}', 'ClientPortalController@viewInvoice');
Route::get('proposal/{proposal_invitation_key}/download', 'ClientPortalController@downloadProposal');
Route::get('proposal/{proposal_invitation_key}', 'ClientPortalController@viewProposal');
//Route::get('proposal/document/{account_key}/{public_id}/{filename?}', 'ClientPortalController@getProposalDocument');
Route::get('proposal/{proposal_invitation_key}/download', 'ClientPortalProposalController@downloadProposal');
Route::get('proposal/{proposal_invitation_key}', 'ClientPortalProposalController@viewProposal');
Route::get('download/{invitation_key}', 'ClientPortalController@download');
Route::put('sign/{invitation_key}', 'ClientPortalController@sign');
Route::get('view', 'HomeController@viewLogo');
@ -107,6 +106,7 @@ Route::group(['middleware' => ['lookup:contact']], function () {
Route::post('/client/login', ['as' => 'login', 'uses' => 'ClientAuth\LoginController@login']);
Route::post('/client/recover_password', ['as' => 'forgot', 'uses' => 'ClientAuth\ForgotPasswordController@sendResetLinkEmail']);
Route::post('/client/password/reset', ['as' => 'forgot', 'uses' => 'ClientAuth\ResetPasswordController@reset']);
Route::get('/proposal/image/{account_key}/{document_key}/{filename?}', 'ClientPortalProposalController@getProposalImage');
});
if (Utils::isReseller()) {