2020-02-11 21:57:25 +01:00
< ? php
2020-05-09 00:35:49 +02:00
/**
2020-09-06 11:38:10 +02:00
* Invoice Ninja ( https :// invoiceninja . com ) .
2020-05-09 00:35:49 +02:00
*
* @ link https :// github . com / invoiceninja / invoiceninja source repository
*
2024-04-12 06:15:41 +02:00
* @ copyright Copyright ( c ) 2024. Invoice Ninja LLC ( https :// invoiceninja . com )
2020-05-09 00:35:49 +02:00
*
2021-06-16 08:58:16 +02:00
* @ license https :// www . elastic . co / licensing / elastic - license
2020-05-09 00:35:49 +02:00
*/
2020-02-11 21:57:25 +01:00
namespace App\Services\Quote ;
2023-10-26 04:57:44 +02:00
use App\Events\Quote\QuoteWasApproved ;
2023-06-26 13:05:15 +02:00
use App\Exceptions\QuoteConversion ;
2024-03-10 15:23:52 +01:00
use App\Jobs\EDocument\CreateEDocument ;
2023-10-26 04:57:44 +02:00
use App\Models\Project ;
use App\Models\Quote ;
2023-06-26 13:05:15 +02:00
use App\Repositories\QuoteRepository ;
2024-06-24 01:52:35 +02:00
use App\Services\Quote\UpdateReminder ;
2023-10-26 04:57:44 +02:00
use App\Utils\Ninja ;
use App\Utils\Traits\MakesHash ;
2023-06-30 07:43:28 +02:00
use Illuminate\Support\Facades\Storage ;
2020-02-11 21:57:25 +01:00
class QuoteService
{
2020-11-04 08:57:16 +01:00
use MakesHash ;
2022-06-21 11:57:17 +02:00
2021-01-14 00:00:32 +01:00
public $quote ;
2020-02-11 21:57:25 +01:00
2020-05-27 06:46:19 +02:00
public $invoice ;
2020-02-11 21:57:25 +01:00
public function __construct ( $quote )
{
$this -> quote = $quote ;
}
public function createInvitations ()
{
2021-01-14 00:00:32 +01:00
$this -> quote = ( new CreateInvitations ( $this -> quote )) -> run ();
2020-02-11 21:57:25 +01:00
return $this ;
}
2023-09-07 06:20:32 +02:00
public function convertToProject () : Project
{
$project = ( new ConvertQuoteToProject ( $this -> quote )) -> run ();
return $project ;
}
2024-01-14 05:05:00 +01:00
public function convert () : self
2020-05-27 06:46:19 +02:00
{
2020-09-06 11:38:10 +02:00
if ( $this -> quote -> invoice_id ) {
2023-06-26 13:05:15 +02:00
throw new QuoteConversion ();
2020-09-06 11:38:10 +02:00
}
2020-05-27 06:46:19 +02:00
2021-01-13 11:12:14 +01:00
$convert_quote = ( new ConvertQuote ( $this -> quote -> client )) -> run ( $this -> quote );
2020-05-28 02:04:48 +02:00
2021-01-13 11:12:14 +01:00
$this -> invoice = $convert_quote ;
2020-05-27 06:46:19 +02:00
$this -> quote -> fresh ();
2021-07-08 03:48:11 +02:00
if ( $this -> quote -> client -> getSetting ( 'auto_archive_quote' )) {
$quote_repo = new QuoteRepository ();
$quote_repo -> archive ( $this -> quote );
}
2020-05-27 06:46:19 +02:00
return $this ;
}
2020-05-09 00:35:49 +02:00
public function getQuotePdf ( $contact = null )
2020-02-15 10:01:15 +01:00
{
2020-07-06 06:16:24 +02:00
return ( new GetQuotePdf ( $this -> quote , $contact )) -> run ();
2020-02-15 10:01:15 +01:00
}
2024-03-10 15:23:52 +01:00
public function getEQuote ( $contact = null )
{
return ( new CreateEDocument ( $this -> quote )) -> handle ();
}
2024-04-04 23:42:31 +02:00
public function getEDocument ( $contact = null )
{
return $this -> getEQuote ( $contact );
}
2024-01-14 05:05:00 +01:00
public function sendEmail ( $contact = null ) : self
2020-02-15 10:01:15 +01:00
{
2020-05-09 00:35:49 +02:00
$send_email = new SendEmail ( $this -> quote , null , $contact );
2020-02-15 10:01:15 +01:00
2020-05-09 00:35:49 +02:00
$send_email -> run ();
2020-03-07 13:46:45 +01:00
return $this ;
2020-02-15 10:01:15 +01:00
}
2020-02-11 21:57:25 +01:00
/**
2020-09-06 11:38:10 +02:00
* Applies the invoice number .
2020-02-11 21:57:25 +01:00
* @ return $this InvoiceService object
*/
2024-01-14 05:05:00 +01:00
public function applyNumber () : self
2020-02-11 21:57:25 +01:00
{
$apply_number = new ApplyNumber ( $this -> quote -> client );
2020-02-14 04:32:22 +01:00
$this -> quote = $apply_number -> run ( $this -> quote );
2020-02-11 21:57:25 +01:00
return $this ;
}
2024-01-14 05:05:00 +01:00
public function markSent () : self
2020-02-11 21:57:25 +01:00
{
2021-01-13 09:58:01 +01:00
$this -> quote = ( new MarkSent ( $this -> quote -> client , $this -> quote )) -> run ();
2020-02-11 21:57:25 +01:00
return $this ;
}
2024-01-14 05:05:00 +01:00
public function setStatus ( $status ) : self
2020-02-11 21:57:25 +01:00
{
$this -> quote -> status_id = $status ;
return $this ;
}
2024-01-14 05:05:00 +01:00
public function approve ( $contact = null ) : self
2020-03-07 13:46:45 +01:00
{
$this -> setStatus ( Quote :: STATUS_APPROVED ) -> save ();
2022-06-21 11:57:17 +02:00
if ( ! $contact ) {
2020-11-03 13:35:05 +01:00
$contact = $this -> quote -> invitations -> first () -> contact ;
2020-11-25 15:19:52 +01:00
}
2020-11-03 13:35:05 +01:00
2020-03-21 06:37:30 +01:00
if ( $this -> quote -> client -> getSetting ( 'auto_convert_quote' )) {
2020-05-27 06:46:19 +02:00
$this -> convert ();
2021-01-19 22:30:04 +01:00
$this -> invoice
-> service ()
-> markSent ()
-> save ();
2020-03-07 13:46:45 +01:00
}
2021-12-17 12:11:36 +01:00
event ( new QuoteWasApproved ( $contact , $this -> quote , $this -> quote -> company , Ninja :: eventVars ()));
2020-03-07 13:46:45 +01:00
return $this ;
}
2022-04-01 04:46:55 +02:00
2022-03-17 03:41:46 +01:00
2024-01-14 05:05:00 +01:00
public function approveWithNoCoversion ( $contact = null ) : self
2022-03-17 03:41:46 +01:00
{
$this -> setStatus ( Quote :: STATUS_APPROVED ) -> save ();
2022-06-21 11:57:17 +02:00
if ( ! $contact ) {
2022-03-17 05:48:50 +01:00
$contact = $this -> quote -> invitations -> first () -> contact ;
}
2022-06-21 11:57:17 +02:00
2022-03-17 05:48:50 +01:00
event ( new QuoteWasApproved ( $contact , $this -> quote , $this -> quote -> company , Ninja :: eventVars ()));
2022-03-17 03:41:46 +01:00
return $this ;
}
2020-05-28 02:04:48 +02:00
public function convertToInvoice ()
2020-03-07 13:46:45 +01:00
{
2020-05-27 06:46:19 +02:00
$this -> convert ();
2020-03-07 13:46:45 +01:00
2021-01-19 22:30:04 +01:00
$this -> invoice -> service () -> createInvitations ();
2020-05-27 06:46:19 +02:00
return $this -> invoice ;
2020-03-07 13:46:45 +01:00
}
2024-01-14 05:05:00 +01:00
public function isConvertable () : bool
2020-05-28 02:04:48 +02:00
{
2020-09-06 11:38:10 +02:00
if ( $this -> quote -> invoice_id ) {
2020-05-28 02:04:48 +02:00
return false ;
2020-09-06 11:38:10 +02:00
}
2020-05-28 02:04:48 +02:00
2020-09-06 11:38:10 +02:00
if ( $this -> quote -> status_id == Quote :: STATUS_EXPIRED ) {
2020-05-28 02:04:48 +02:00
return false ;
2020-09-06 11:38:10 +02:00
}
2020-05-28 02:04:48 +02:00
return true ;
}
2020-11-04 07:02:15 +01:00
public function fillDefaults ()
{
$settings = $this -> quote -> client -> getMergedSettings ();
2022-06-21 11:57:17 +02:00
if ( ! $this -> quote -> design_id ) {
2020-11-04 07:02:15 +01:00
$this -> quote -> design_id = $this -> decodePrimaryKey ( $settings -> quote_design_id );
2022-06-21 11:57:17 +02:00
}
if ( ! isset ( $this -> quote -> footer )) {
2020-11-04 07:02:15 +01:00
$this -> quote -> footer = $settings -> quote_footer ;
2022-06-21 11:57:17 +02:00
}
if ( ! isset ( $this -> quote -> terms )) {
2020-11-04 07:02:15 +01:00
$this -> quote -> terms = $settings -> quote_terms ;
2022-06-21 11:57:17 +02:00
}
2021-01-18 21:02:32 +01:00
/* If client currency differs from the company default currency, then insert the client exchange rate on the model.*/
2022-06-21 11:57:17 +02:00
if ( ! isset ( $this -> quote -> exchange_rate ) && $this -> quote -> client -> currency () -> id != ( int ) $this -> quote -> company -> settings -> currency_id ) {
2021-01-18 21:02:32 +01:00
$this -> quote -> exchange_rate = $this -> quote -> client -> currency () -> exchange_rate ;
2022-06-21 11:57:17 +02:00
}
2020-11-04 07:02:15 +01:00
2022-06-21 11:57:17 +02:00
if ( ! isset ( $this -> quote -> public_notes )) {
2021-01-18 12:08:18 +01:00
$this -> quote -> public_notes = $this -> quote -> client -> public_notes ;
2022-06-21 11:57:17 +02:00
}
2020-11-25 15:19:52 +01:00
return $this ;
2020-11-04 07:02:15 +01:00
}
2021-09-15 03:12:36 +02:00
public function triggeredActions ( $request )
{
2022-04-20 03:55:33 +02:00
$this -> quote = ( new TriggeredActions ( $this -> quote -> load ( 'invitations' ), $request )) -> run ();
2021-09-15 03:12:36 +02:00
return $this ;
}
2021-03-01 00:40:18 +01:00
public function deletePdf ()
{
2022-06-21 11:57:17 +02:00
$this -> quote -> invitations -> each ( function ( $invitation ) {
2023-06-30 07:43:28 +02:00
// (new UnlinkFile(config('filesystems.default'), $this->quote->client->quote_filepath($invitation).$this->quote->numberFormatter().'.pdf'))->handle();
//30-06-2023
try {
// if (Storage::disk(config('filesystems.default'))->exists($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf')) {
Storage :: disk ( config ( 'filesystems.default' )) -> delete ( $this -> quote -> client -> quote_filepath ( $invitation ) . $this -> quote -> numberFormatter () . '.pdf' );
// }
// if (Ninja::isHosted() && Storage::disk('public')->exists($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf')) {
if ( Ninja :: isHosted ()) {
Storage :: disk ( 'public' ) -> delete ( $this -> quote -> client -> quote_filepath ( $invitation ) . $this -> quote -> numberFormatter () . '.pdf' );
}
} catch ( \Exception $e ) {
nlog ( $e -> getMessage ());
}
2021-06-12 13:50:01 +02:00
});
2021-03-01 00:40:18 +01:00
return $this ;
}
2024-03-10 15:23:52 +01:00
public function deleteEQuote ()
{
$this -> quote -> load ( 'invitations' );
$this -> quote -> invitations -> each ( function ( $invitation ) {
try {
// if (Storage::disk(config('filesystems.default'))->exists($this->invoice->client->e_invoice_filepath($invitation).$this->invoice->getFileName("xml"))) {
Storage :: disk ( config ( 'filesystems.default' )) -> delete ( $this -> quote -> client -> e_document_filepath ( $invitation ) . $this -> quote -> getFileName ( " xml " ));
// }
// if (Ninja::isHosted() && Storage::disk('public')->exists($this->invoice->client->e_invoice_filepath($invitation).$this->invoice->getFileName("xml"))) {
if ( Ninja :: isHosted ()) {
Storage :: disk ( 'public' ) -> delete ( $this -> quote -> client -> e_document_filepath ( $invitation ) . $this -> quote -> getFileName ( " xml " ));
}
} catch ( \Exception $e ) {
nlog ( $e -> getMessage ());
}
});
return $this ;
}
2021-03-01 00:40:18 +01:00
2024-06-21 11:40:56 +02:00
public function setReminder ( $settings = null )
{
$this -> quote = ( new UpdateReminder ( $this -> quote , $settings )) -> run ();
return $this ;
}
2024-06-24 01:52:35 +02:00
/*When a reminder is sent we want to touch the dates they were sent*/
public function touchReminder ( string $reminder_template )
{
nrlog ( now () -> format ( 'Y-m-d h:i:s' ) . " INV # { $this -> quote -> number } : Touching Reminder => { $reminder_template } " );
switch ( $reminder_template ) {
case 'reminder1' :
$this -> quote -> reminder1_sent = now ();
$this -> quote -> reminder_last_sent = now ();
$this -> quote -> last_sent_date = now ();
break ;
case 'reminder2' :
$this -> quote -> reminder2_sent = now ();
$this -> quote -> reminder_last_sent = now ();
$this -> quote -> last_sent_date = now ();
break ;
case 'reminder3' :
$this -> quote -> reminder3_sent = now ();
$this -> quote -> reminder_last_sent = now ();
$this -> quote -> last_sent_date = now ();
break ;
case 'endless_reminder' :
$this -> quote -> reminder_last_sent = now ();
$this -> invoice -> last_sent_date = now ();
break ;
default :
$this -> quote -> reminder1_sent = now ();
$this -> quote -> reminder_last_sent = now ();
$this -> quote -> last_sent_date = now ();
break ;
}
return $this ;
}
2020-02-11 21:57:25 +01:00
/**
2020-09-06 11:38:10 +02:00
* Saves the quote .
2020-02-11 21:57:25 +01:00
* @ return Quote | null
*/
2024-01-14 05:05:00 +01:00
public function save () : ? Quote
2020-02-11 21:57:25 +01:00
{
2021-10-10 11:56:05 +02:00
$this -> quote -> saveQuietly ();
2020-05-27 06:46:19 +02:00
2020-02-11 21:57:25 +01:00
return $this -> quote ;
}
}