Working on Invoice Invitations

This commit is contained in:
David Bomba 2019-05-29 14:33:53 +10:00
parent e898494b72
commit 866111cbbb
5 changed files with 224 additions and 0 deletions

View File

@ -0,0 +1,41 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Factory;
use App\Models\InvoiceInvitation;
class InvoiceInvitationFactory
{
public static function create(int $company_id, int $user_id) :InvoiceInvitation
{
$ii = new InvoiceInvitation;
$ii->company_id = $company_id;
$ii->user_id = $user_id;
$ii->client_contact_id = null;
$ii->invoice_id = null;
$ii->invitation_key = str_random(config('ninja.key_length'));
$ii->transaction_reference = null;
$ii->message_id = null;
$ii->email_error = '';
$ii->signature_base64 = '';
$ii->signature_date = null;
$ii->sent_date = null;
$ii->viewed_date = null;
$ii->opened_date = null;
return $ii;
}
}

View File

@ -0,0 +1,68 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Jobs\Invitation;
use App\Models\Invoice;
use App\Models\Payment;
use App\Repositories\InvoiceRepository;
use App\Utils\Traits\NumberFormatter;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Mail;
class MarkOpened implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, NumberFormatter;
public $message_id;
public $entity;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(string $message_id, string $entity)
{
$this->message_id = $message_id;
$this->entity = $entity;
}
/**
* Execute the job.
*
*
* @return void
*/
public function handle()
{
$invitation = $this->entity::with('user', 'contact')
->whereMessageId($this->message_id)
->first();
if (! $invitation) {
return false;
}
$invitation->email_error = $error;
$invitation->save();
}
}

68
app/Mail/BouncedEmail.php Normal file
View File

@ -0,0 +1,68 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Mail;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class BouncedEmail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public $invitation;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($invitation)
{
$this->invitation = $invitation;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$entity_type = class_basename(lcfirst($this->invitation->getEntityType()));
$subject = ctrans("texts.notification_{$entity_type}_bounced_subject", ['invoice' => $invoice->invoice_number]);
return
$this->from($invitation->user->email)
->text()
->subject($subject);
//todo
/*
//todo determine WHO is notified!! In this instance the _user_ is notified
Mail::to($invitation->user->email)
//->cc('')
//->bcc('')
->queue(new BouncedEmail($invitation));
*/
return $this->from('turbo124@gmail.com') //todo
->subject(ctrans('texts.confirmation_subject'))
->markdown('email.auth.verify', ['user' => $this->user])
->text('email.auth.verify_text');
*/
}
}

View File

@ -11,6 +11,7 @@
namespace App\Models;
use App\Models\Invoice;
use App\Utils\Traits\MakesDates;
use Illuminate\Database\Eloquent\Model;
@ -23,6 +24,11 @@ class InvoiceInvitation extends BaseModel
'id',
];
public function entityType()
{
return Invoice::class;
}
/**
* @return mixed
*/

View File

@ -13,10 +13,13 @@ namespace App\Repositories;
use App\Events\Invoice\InvoiceWasCreated;
use App\Events\Invoice\InvoiceWasUpdated;
use App\Factory\InvoiceInvitationFactory;
use App\Helpers\Invoice\InvoiceCalc;
use App\Jobs\Company\UpdateCompanyLedgerWithInvoice;
use App\Models\Invoice;
use App\Models\InvoiceInvitation;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
/**
* InvoiceRepository
@ -82,10 +85,48 @@ class InvoiceRepository extends BaseRepository
$invoice->status_id = Invoice::STATUS_SENT;
$this->markInvitationsSent();
$invoice->save();
return $invoice;
}
private function markInvitationsSent(Invoice $invoice) :Invoice
{
$invoice->invitations->each(function($invitation, $key) {
$invitation->sent_date = Carbon::now()->format('Y-m-d H:i');
$invitation->save();
});
}
private function saveInvitations(Invoice $invoice) :Invoice
{
$contact_list = (array)$invoice->settings->invoice_email_list;
$contacts = ClientContact::findMany($contacts);
if (! $contacts->count()) {
return $invoice;
}
$contacts->each(function($contact, $key) use ($invoice){
$invitation = InvoiceInvitation::whereClientContactId($contact->id)->whereInvoiceId($invoice->id)->first();
if($!invitation){
$invitation = InvoiceInvitationFactory::create($invoice->company_id, $invoice->user_id);
$invitation->client_contact_id = $contact->id;
$invitation->invoice_id = $invoice->id;
$invitation->save();
}
});
return $invoice;
}
}