diff --git a/app/DataMapper/EmailTemplateDefaults.php b/app/DataMapper/EmailTemplateDefaults.php index b63dba59c705..93be2e4e9805 100644 --- a/app/DataMapper/EmailTemplateDefaults.php +++ b/app/DataMapper/EmailTemplateDefaults.php @@ -92,6 +92,11 @@ class EmailTemplateDefaults case 'email_subject_custom3': return self::emailInvoiceSubject(); + case 'email_vendor_notification_subject': + return self::emailVendorNotificationSubject(); + + case 'email_vendor_notification_body': + return self::emailVendorNotificationBody(); default: return self::emailInvoiceTemplate(); @@ -99,6 +104,16 @@ class EmailTemplateDefaults } } + public static function emailVendorNotificationSubject() + { + return self::transformText('vendor_notification_subject'); + } + + public static function emailVendorNotificationBody() + { + return self::transformText('vendor_notification_body'); + } + public static function emailInvoiceSubject() { return ctrans('texts.invoice_subject', ['number'=>'$number', 'account'=>'$company.name']); diff --git a/app/Jobs/Expense/VendorExpenseNotify.php b/app/Jobs/Expense/VendorExpenseNotify.php new file mode 100644 index 000000000000..16a6b83a33d0 --- /dev/null +++ b/app/Jobs/Expense/VendorExpenseNotify.php @@ -0,0 +1,99 @@ +db); + + $this->expense->vendor->contacts->filter(function(VendorContact $contact){ + return $contact->send_email && $contact->email; + })->each(function(VendorContact $contact){ + $this->notify($contact); + }); + } + + private function notify(VendorContact $contact) + { + + $mo = new EmailObject; + $mo->contact = $contact; + $mo->vendor_contact_id = $contact->id; + $mo->user_id = $this->expense->user_id; + $mo->company_key = $this->expense->company->company_key; + $mo->subject = ctrans('texts.vendor_notification_subject', [ + 'amount' => Number::formatMoney($this->expense->amount, $contact->vendor), + 'vendor' => $contact->vendor->present()->name(), + ]); + $mo->body = ctrans('texts.vendor_notification_body', [ + 'vendor' => $this->expense->vendor->present()->name(), + 'amount' => Number::formatMoney($this->expense->amount, $contact->vendor), + 'contact' => $contact->present()->name(), + 'payment_date' => $this->translateDate($this->expense->payment_date, $this->expense->company->date_format(), $this->expense->vendor->locale()), + 'transaction_reference' => $this->expense->transaction_reference ?? '', + 'number' => $this->expense->number, + ]); + $mo->template = ''; + $mo->email_template_body = 'vendor_notification_subject'; + $mo->email_template_subject = 'vendor_notification_body'; + $mo->vendor_id = $contact->vendor_id ?? null; + $mo->variables = [ + 'amount' => Number::formatMoney($this->expense->amount, $contact->vendor), + 'contact' => $contact->present()->name(), + 'vendor' => $contact->vendor->present()->name(), + 'payment_date' => $this->translateDate($this->expense->payment_date, $this->expense->company->date_format(), $this->expense->vendor->locale()), + 'transaction_reference' => $this->expense->transaction_reference ?? '', + 'number' => $this->expense->number, + ]; + + Email::dispatch($mo, $this->expense->company); + + $fields = new \stdClass(); + $fields->expense_id = $this->expense->id; + $fields->vendor_id = $contact->vendor_id; + $fields->vendor_contact_id = $contact->id; + $fields->user_id = $this->expense->user_id; + $fields->company_id = $contact->company_id; + $fields->activity_type_id = Activity::VENDOR_NOTIFICATION_EMAIL; + $fields->account_id = $this->expense->company->account_id; + + $activity_repo = new ActivityRepository(); + $activity_repo->save($fields, $this->expense, Ninja::eventVars()); + + } +} \ No newline at end of file diff --git a/app/Models/Activity.php b/app/Models/Activity.php index e8b1a7f05d2b..311ee6b614b4 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -257,6 +257,8 @@ class Activity extends StaticModel const PAYMENT_EMAILED = 138; + const VENDOR_NOTIFICATION_EMAIL = 139; + protected $casts = [ 'is_system' => 'boolean', 'updated_at' => 'timestamp', diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index 243a38691370..d6365f7e65b7 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -13,6 +13,7 @@ namespace App\Models; use App\DataMapper\CompanySettings; use App\Models\Presenters\VendorPresenter; +use App\Services\Vendor\VendorService; use App\Utils\Traits\AppSetup; use App\Utils\Traits\GeneratesCounter; use Illuminate\Database\Eloquent\SoftDeletes; @@ -280,4 +281,9 @@ class Vendor extends BaseModel { return $this->company->company_key.'/'.$this->vendor_hash.'/backups'; } + + public function service() + { + return new VendorService($this); + } } diff --git a/app/Repositories/ExpenseRepository.php b/app/Repositories/ExpenseRepository.php index d71006e9bb8f..307ccdaeecf4 100644 --- a/app/Repositories/ExpenseRepository.php +++ b/app/Repositories/ExpenseRepository.php @@ -18,9 +18,10 @@ use App\Factory\ExpenseFactory; use App\Models\ExpenseCategory; use App\Utils\Traits\GeneratesCounter; use Illuminate\Database\QueryException; +use App\Jobs\Expense\VendorExpenseNotify; +use Illuminate\Database\Eloquent\Collection; use Carbon\Exceptions\InvalidFormatException; use App\Libraries\Currency\Conversion\CurrencyApi; -use Illuminate\Database\Eloquent\Collection; /** * ExpenseRepository. @@ -31,6 +32,7 @@ class ExpenseRepository extends BaseRepository private $completed = true; + private $notify_vendor = false; /** * Saves the expense and its contacts. * @@ -41,10 +43,15 @@ class ExpenseRepository extends BaseRepository */ public function save(array $data, Expense $expense): Expense { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if(isset($data['payment_date']) && $data['payment_date'] == $expense->payment_date) { //do nothing - } elseif(isset($data['payment_date']) && strlen($data['payment_date']) > 1 && $expense->company->notify_vendor_when_paid) { - nlog("NOT SAME"); + } + elseif(isset($data['payment_date']) && strlen($data['payment_date']) > 1 && $user->company()->notify_vendor_when_paid && ($data['vendor_id'] || $expense->vendor_id)) { + nlog("ping"); + $this->notify_vendor = true; } $expense->fill($data); @@ -63,6 +70,9 @@ class ExpenseRepository extends BaseRepository $this->saveDocuments($data['documents'], $expense); } + if($this->notify_vendor) + VendorExpenseNotify::dispatch($expense, $expense->company->db); + return $expense; } diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 0484b5228aa2..35413125db18 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -166,7 +166,6 @@ class EmailDefaults if (strlen($this->email->email_object->body) > 3) { // A Custom Message has been set in the email screen. - // return $this; } elseif (strlen($this->email->email_object->settings?->{$this->email->email_object->email_template_body}) > 3) { // A body has been saved in the settings. $this->email->email_object->body = $this->email->email_object->settings?->{$this->email->email_object->email_template_body}; diff --git a/app/Services/Vendor/VendorService.php b/app/Services/Vendor/VendorService.php new file mode 100644 index 000000000000..100438957feb --- /dev/null +++ b/app/Services/Vendor/VendorService.php @@ -0,0 +1,21 @@ + 'Payment Email To All Contacts', 'payment_email_all_contacts_help' => 'Sends the payment email to all contacts when enabled', 'add_line' => 'Add Line', + 'activity_139' => 'Expense :expense notification sent to :contact', + 'vendor_notification_subject' => 'Confirmation of payment :amount sent to :vendor', + 'vendor_notification_body' => 'Payment processed for :amount dated :payment_date.
[Transaction Reference: :transaction_reference]', + ); return $LANG;