diff --git a/app/Http/Controllers/ClientPortalController.php b/app/Http/Controllers/ClientPortalController.php
index 353c2dcf05d0..3bfd6e01e13c 100644
--- a/app/Http/Controllers/ClientPortalController.php
+++ b/app/Http/Controllers/ClientPortalController.php
@@ -15,6 +15,7 @@ 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;
@@ -36,6 +37,7 @@ class ClientPortalController extends BaseController
private $invoiceRepo;
private $paymentRepo;
private $documentRepo;
+ private $propoosalRepo;
public function __construct(
InvoiceRepository $invoiceRepo,
@@ -44,7 +46,8 @@ class ClientPortalController extends BaseController
DocumentRepository $documentRepo,
PaymentService $paymentService,
CreditRepository $creditRepo,
- TaskRepository $taskRepo)
+ TaskRepository $taskRepo,
+ ProposalRepository $propoosalRepo)
{
$this->invoiceRepo = $invoiceRepo;
$this->paymentRepo = $paymentRepo;
@@ -53,9 +56,36 @@ class ClientPortalController extends BaseController
$this->paymentService = $paymentService;
$this->creditRepo = $creditRepo;
$this->taskRepo = $taskRepo;
+ $this->propoosalRepo = $propoosalRepo;
}
- public function view($invitationKey)
+ public function viewProposal($invitationKey)
+ {
+ if (! $invitation = $this->propoosalRepo->findInvitationByKey($invitationKey)) {
+ return $this->returnError(trans('texts.proposal_not_found'));
+ }
+
+ $account = $invitation->account;
+ $proposal = $invitation->proposal;
+
+ $data = [
+ 'proposalInvitation' => $invitation,
+ 'proposal' => $proposal,
+ 'account' => $account,
+ ];
+
+ if (request()->raw) {
+ return view('invited.proposal_raw', $data);
+ }
+
+ $data['invitation'] = Invitation::whereContactId($invitation->contact_id)
+ ->whereInvoiceId($proposal->invoice_id)
+ ->firstOrFail();
+
+ return view('invited.proposal', $data);
+ }
+
+ public function viewInvoice($invitationKey)
{
if (! $invitation = $this->invoiceRepo->findInvoiceByInvitation($invitationKey)) {
return $this->returnError();
diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php
index c233ac7e770d..d9412a90126c 100644
--- a/app/Http/Middleware/Authenticate.php
+++ b/app/Http/Middleware/Authenticate.php
@@ -4,6 +4,7 @@ namespace App\Http\Middleware;
use App\Models\Contact;
use App\Models\Invitation;
+use App\Models\ProposalInvitation;
use Auth;
use Closure;
use Session;
@@ -25,13 +26,14 @@ class Authenticate
public function handle($request, Closure $next, $guard = 'user')
{
$authenticated = Auth::guard($guard)->check();
+ $invitationKey = $request->invitation_key ?: $request->proposal_invitation_key;
if ($guard == 'client') {
- if (! empty($request->invitation_key)) {
+ if (! empty($request->invitation_key) || ! empty($request->proposal_invitation_key)) {
$contact_key = session('contact_key');
if ($contact_key) {
$contact = $this->getContact($contact_key);
- $invitation = $this->getInvitation($request->invitation_key);
+ $invitation = $this->getInvitation($invitationKey, ! empty($request->proposal_invitation_key));
if (! $invitation) {
return response()->view('error', [
@@ -59,7 +61,7 @@ class Authenticate
$contact = false;
if ($contact_key) {
$contact = $this->getContact($contact_key);
- } elseif ($invitation = $this->getInvitation($request->invitation_key)) {
+ } elseif ($invitation = $this->getInvitation($invitationKey, ! empty($request->proposal_invitation_key))) {
$contact = $invitation->contact;
Session::put('contact_key', $contact->contact_key);
}
@@ -108,7 +110,7 @@ class Authenticate
*
* @return \Illuminate\Database\Eloquent\Model|null|static
*/
- protected function getInvitation($key)
+ protected function getInvitation($key, $isProposal = false)
{
if (! $key) {
return false;
@@ -118,7 +120,12 @@ class Authenticate
list($key) = explode('&', $key);
$key = substr($key, 0, RANDOM_KEY_LENGTH);
- $invitation = Invitation::withTrashed()->where('invitation_key', '=', $key)->first();
+ if ($isProposal) {
+ $invitation = ProposalInvitation::withTrashed()->where('invitation_key', '=', $key)->first();
+ } else {
+ $invitation = Invitation::withTrashed()->where('invitation_key', '=', $key)->first();
+ }
+
if ($invitation && ! $invitation->is_deleted) {
return $invitation;
} else {
diff --git a/app/Models/Invitation.php b/app/Models/Invitation.php
index d9fc6164b5c1..8fa8a23b73c0 100644
--- a/app/Models/Invitation.php
+++ b/app/Models/Invitation.php
@@ -58,6 +58,15 @@ class Invitation extends EntityModel
{
return $this->belongsTo('App\Models\Account');
}
+
+ public function signatureDiv()
+ {
+ if (! $this->signature_base64) {
+ return false;
+ }
+
+ return sprintf('