diff --git a/.env b/.env index e49cef4..52d43bc 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -APP_NAME=Laravel +APP_NAME=Xpendify APP_ENV=local APP_KEY=base64:nkxevDI1XtmExvpntHABxwR+rjZ5TMIcXAUxgntuKdM= APP_DEBUG=true @@ -51,13 +51,13 @@ REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 -MAIL_MAILER=log -MAIL_HOST=127.0.0.1 -MAIL_PORT=2525 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS="hello@example.com" +MAIL_MAILER=smtp +MAIL_HOST=mail.tia-pharma.com +MAIL_PORT=465 +MAIL_USERNAME="mkt.alert@tia-pharma.com" +MAIL_PASSWORD="alert!2024" +MAIL_ENCRYPTION=ssl +MAIL_FROM_ADDRESS="mkt.alert@tia-pharma.com" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= diff --git a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php index 4719137..eb9a47c 100644 --- a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php +++ b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php @@ -14,6 +14,9 @@ use App\Models\UserHasCabang; use App\Models\Kategori; use App\Helpers\NextCloudHelper; use Illuminate\Support\Str; +use Illuminate\Support\Facades\Mail; +use App\Mail\ExpenseApproved; +use App\Mail\ExpenseRejected; class FormEntertainmentPresentationController extends Controller { @@ -245,6 +248,34 @@ class FormEntertainmentPresentationController extends Controller 'status' => 'Approved' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been approved.'); return redirect()->back(); } @@ -293,6 +324,34 @@ class FormEntertainmentPresentationController extends Controller 'status' => 'Rejected' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseRejected( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been rejected.'); return redirect()->back(); } diff --git a/app/Http/Controllers/Forms/FormMeetingSeminarController.php b/app/Http/Controllers/Forms/FormMeetingSeminarController.php index d66d6c2..75baf34 100644 --- a/app/Http/Controllers/Forms/FormMeetingSeminarController.php +++ b/app/Http/Controllers/Forms/FormMeetingSeminarController.php @@ -14,6 +14,9 @@ use App\Models\UserHasCabang; use App\Models\Kategori; use App\Helpers\NextCloudHelper; use Illuminate\Support\Str; +use Illuminate\Support\Facades\Mail; +use App\Mail\ExpenseApproved; +use App\Mail\ExpenseRejected; class FormMeetingSeminarController extends Controller { @@ -231,6 +234,34 @@ class FormMeetingSeminarController extends Controller 'status' => 'Approved' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been approved.'); return redirect()->back(); } @@ -279,6 +310,34 @@ class FormMeetingSeminarController extends Controller 'status' => 'Rejected' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseRejected( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been rejected.'); return redirect()->back(); } diff --git a/app/Http/Controllers/Forms/FormOtherController.php b/app/Http/Controllers/Forms/FormOtherController.php index df9b4f8..2c2ffa5 100644 --- a/app/Http/Controllers/Forms/FormOtherController.php +++ b/app/Http/Controllers/Forms/FormOtherController.php @@ -14,6 +14,10 @@ use App\Models\UserHasCabang; use App\Models\Kategori; use Illuminate\Support\Str; use App\Helpers\NextCloudHelper; +use Illuminate\Support\Facades\Mail; +use App\Mail\ExpenseApproved; +use App\Mail\ExpenseRejected; + class FormOtherController extends Controller { @@ -236,6 +240,34 @@ class FormOtherController extends Controller 'status' => 'Approved' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been approved.'); return redirect()->back(); } @@ -284,6 +316,34 @@ class FormOtherController extends Controller 'status' => 'Rejected' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseRejected( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been rejected.'); return redirect()->back(); } diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index a11ae1c..9e21c96 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -14,6 +14,9 @@ use App\Models\UserHasCabang; use App\Models\Kategori; use App\Helpers\NextCloudHelper; use Illuminate\Support\Str; +use Illuminate\Support\Facades\Mail; +use App\Mail\ExpenseApproved; +use App\Mail\ExpenseRejected; class FormUpCountryController extends Controller { @@ -253,6 +256,34 @@ class FormUpCountryController extends Controller 'status' => 'Approved' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been approved.'); return redirect()->back(); } @@ -266,6 +297,34 @@ class FormUpCountryController extends Controller 'status' => 'Rejected' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseRejected( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been rejected.'); return redirect()->back(); } diff --git a/app/Http/Controllers/Forms/FormVehicleController.php b/app/Http/Controllers/Forms/FormVehicleController.php index 53fc52a..ce95848 100644 --- a/app/Http/Controllers/Forms/FormVehicleController.php +++ b/app/Http/Controllers/Forms/FormVehicleController.php @@ -14,6 +14,9 @@ use App\Models\UserHasCabang; use App\Models\Kategori; use App\Helpers\NextCloudHelper; use Illuminate\Support\Str; +use Illuminate\Support\Facades\Mail; +use App\Mail\ExpenseApproved; +use App\Mail\ExpenseRejected; class FormVehicleController extends Controller { @@ -246,6 +249,34 @@ class FormVehicleController extends Controller 'status' => 'Approved' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseApproved( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been approved.'); return redirect()->back(); } @@ -294,6 +325,34 @@ class FormVehicleController extends Controller 'status' => 'Rejected' ]); + $heads = $form->user->getCabangAndRegionHead(); + $name = $form->user->name; + $expense_number = $form->expense_number; + $tanggal = $form->tanggal; + $total = $form->total; + + // Collect all recipients + $recipients = [$form->user->email]; + + if ($heads['cabang_head']) { + $recipients[] = $heads['cabang_head']['email']; + } + + if ($heads['region_head']) { + $recipients[] = $heads['region_head']['email']; + } + + // Remove duplicate email addresses, if any + $recipients = array_unique($recipients); + + // Send bulk email + Mail::to($recipients)->send(new ExpenseRejected( + $name, + $expense_number, + $tanggal, + $total + )); + session()->flash('success', 'Form has been rejected.'); return redirect()->back(); } diff --git a/app/Mail/ExpenseApproved.php b/app/Mail/ExpenseApproved.php new file mode 100644 index 0000000..973075f --- /dev/null +++ b/app/Mail/ExpenseApproved.php @@ -0,0 +1,61 @@ + $this->name, + 'expense_number' => $this->expense_number, + 'tanggal' => $this->tanggal, + 'total' => $this->total, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Mail/ExpenseRejected.php b/app/Mail/ExpenseRejected.php new file mode 100644 index 0000000..f1945a3 --- /dev/null +++ b/app/Mail/ExpenseRejected.php @@ -0,0 +1,61 @@ + $this->name, + 'expense_number' => $this->expense_number, + 'tanggal' => $this->tanggal, + 'total' => $this->total, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Models/Admin.php b/app/Models/Admin.php index 9f3e39d..67a2d23 100644 --- a/app/Models/Admin.php +++ b/app/Models/Admin.php @@ -77,4 +77,31 @@ class Admin extends Authenticatable } return $hasPermission; } + + public function getCabangAndRegionHead() + { + // Fetch the UserHasCabang entry for this admin + $userHasCabang = $this->hasOne(UserHasCabang::class, 'user_id')->with('cabang')->first(); + + if ($userHasCabang && $userHasCabang->cabang) { + $cabang = $userHasCabang->cabang; + + // Fetch the cabang head + $cabangHead = $cabang->head; + + // Fetch the region and its head + $region = $cabang->region; + $regionHead = $region ? $region->head : null; + + return [ + 'cabang_head' => $cabangHead, + 'region_head' => $regionHead, + ]; + } + + return [ + 'cabang_head' => null, + 'region_head' => null, + ]; + } } diff --git a/app/Models/Cabang.php b/app/Models/Cabang.php index 66b91eb..b669d0f 100644 --- a/app/Models/Cabang.php +++ b/app/Models/Cabang.php @@ -11,9 +11,20 @@ class Cabang extends Model protected $table = 'cabang'; protected $fillable = [ + 'head_id', 'region_id', 'cost_id', 'code', 'name', ]; + + public function head() + { + return $this->belongsTo(Admin::class, 'head_id'); + } + + public function region() + { + return $this->belongsTo(Region::class, 'region_id'); + } } diff --git a/app/Models/Region.php b/app/Models/Region.php index 628e9cb..16d2f43 100644 --- a/app/Models/Region.php +++ b/app/Models/Region.php @@ -11,7 +11,13 @@ class Region extends Model protected $table = 'region'; protected $fillable = [ + 'head_id', 'code', 'name', ]; + + public function head() + { + return $this->belongsTo('App\Models\Admin'); + } } diff --git a/database/migrations/2024_12_24_070343_add_head_to_region_table.php b/database/migrations/2024_12_24_070343_add_head_to_region_table.php new file mode 100644 index 0000000..7bfbe44 --- /dev/null +++ b/database/migrations/2024_12_24_070343_add_head_to_region_table.php @@ -0,0 +1,29 @@ +foreignId('head_id')->nullable()->constrained('admins')->onDelete('set null')->after('id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('region', function (Blueprint $table) { + $table->dropForeign(['head_id']); + $table->dropColumn('head_id'); + }); + } +}; diff --git a/database/migrations/2024_12_24_070500_add_head_to_cabang_table.php b/database/migrations/2024_12_24_070500_add_head_to_cabang_table.php new file mode 100644 index 0000000..68c24d4 --- /dev/null +++ b/database/migrations/2024_12_24_070500_add_head_to_cabang_table.php @@ -0,0 +1,29 @@ +foreignId('head_id')->nullable()->constrained('admins')->onDelete('set null')->after('id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('cabang', function (Blueprint $table) { + $table->dropForeign(['head_id']); + $table->dropColumn('head_id'); + }); + } +}; diff --git a/resources/views/backend/pages/forms/entertainment/index.blade.php b/resources/views/backend/pages/forms/entertainment/index.blade.php index 7e54237..a0997ec 100644 --- a/resources/views/backend/pages/forms/entertainment/index.blade.php +++ b/resources/views/backend/pages/forms/entertainment/index.blade.php @@ -39,7 +39,7 @@
-

Rp {{ number_format($forms->where('status', 'Approved')->sum('total'), 0, ',', '.') }}

+

Rp {{ number_format($forms->whereIn('status', ['Approved', 'Closed'])->sum('total'), 0, ',', '.') }}

Approved Expenses

diff --git a/resources/views/backend/pages/forms/meeting/index.blade.php b/resources/views/backend/pages/forms/meeting/index.blade.php index 3f5ccc7..e4c5f49 100644 --- a/resources/views/backend/pages/forms/meeting/index.blade.php +++ b/resources/views/backend/pages/forms/meeting/index.blade.php @@ -39,7 +39,7 @@
-

Rp {{ number_format($forms->where('status', 'Approved')->sum('total'), 0, ',', '.') }}

+

Rp {{ number_format($forms->whereIn('status', ['Approved', 'Closed'])->sum('total'), 0, ',', '.') }}

Approved Expenses

diff --git a/resources/views/backend/pages/forms/other/index.blade.php b/resources/views/backend/pages/forms/other/index.blade.php index b83f338..a85fac5 100644 --- a/resources/views/backend/pages/forms/other/index.blade.php +++ b/resources/views/backend/pages/forms/other/index.blade.php @@ -39,7 +39,7 @@
-

Rp {{ number_format($forms->where('status', 'Approved')->sum('total'), 0, ',', '.') }}

+

Rp {{ number_format($forms->whereIn('status', ['Approved', 'Closed'])->sum('total'), 0, ',', '.') }}

Approved Expenses

diff --git a/resources/views/backend/pages/forms/upcountry/index.blade.php b/resources/views/backend/pages/forms/upcountry/index.blade.php index 3d395d0..2b913f1 100644 --- a/resources/views/backend/pages/forms/upcountry/index.blade.php +++ b/resources/views/backend/pages/forms/upcountry/index.blade.php @@ -39,7 +39,7 @@
-

Rp {{ number_format($forms->where('status', 'Approved')->sum('total'), 0, ',', '.') }}

+

Rp {{ number_format($forms->whereIn('status', ['Approved', 'Closed'])->sum('total'), 0, ',', '.') }}

Approved Expenses

diff --git a/resources/views/backend/pages/forms/vehicle/index.blade.php b/resources/views/backend/pages/forms/vehicle/index.blade.php index 77c0cfe..f1f5d80 100644 --- a/resources/views/backend/pages/forms/vehicle/index.blade.php +++ b/resources/views/backend/pages/forms/vehicle/index.blade.php @@ -39,7 +39,7 @@
-

Rp {{ number_format($forms->where('status', 'Approved')->sum('total'), 0, ',', '.') }}

+

Rp {{ number_format($forms->whereIn('status', ['Approved', 'Closed'])->sum('total'), 0, ',', '.') }}

Approved Expenses

diff --git a/resources/views/mail/approved.blade.php b/resources/views/mail/approved.blade.php new file mode 100644 index 0000000..0b937d9 --- /dev/null +++ b/resources/views/mail/approved.blade.php @@ -0,0 +1,365 @@ + + + + + + Expense Approved + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/mail/rejected.blade.php b/resources/views/mail/rejected.blade.php new file mode 100644 index 0000000..9e12216 --- /dev/null +++ b/resources/views/mail/rejected.blade.php @@ -0,0 +1,365 @@ + + + + + + Expense Rejected + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/mail/template.html b/resources/views/mail/template.html new file mode 100644 index 0000000..9307660 --- /dev/null +++ b/resources/views/mail/template.html @@ -0,0 +1,364 @@ + + + + + + Expense Approved + + + + + + + + + + + + \ No newline at end of file