412 lines
12 KiB
PHP
412 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Forms;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\FormOthers;
|
|
use App\Models\Rayon;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use App\Models\Region;
|
|
use App\Models\Cabang;
|
|
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;
|
|
use App\Mail\FinalApprove;
|
|
use App\Helpers\WhatsappHelper;
|
|
|
|
class FormOtherController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['forms.other.view']);
|
|
|
|
// get user role
|
|
$role = auth()->user()->getRoleNames()[0];
|
|
$forms = null;
|
|
|
|
if($role == 'Marketing Information System' || $role == 'superadmin') {
|
|
$forms = FormOthers::get();
|
|
} else {
|
|
$forms = FormOthers::where('user_id', auth()->user()->id)->get();
|
|
}
|
|
|
|
session()->put('redirect_url', route('forms.other'));
|
|
return view('backend.pages.forms.other.index', [
|
|
'forms' => $forms
|
|
]);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['forms.other.create']);
|
|
|
|
return view('backend.pages.forms.other.create', [
|
|
'kategori' => Kategori::whereNotIn('name', ['Up Country', 'Vehicle Running Cost', 'Entertainment & Presentation', 'Meeting & Seminar'])->get()
|
|
]);
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['forms.other.create']);
|
|
|
|
$request->validate([
|
|
'kategori_id' => 'required',
|
|
'tanggal' => 'required|date',
|
|
'keterangan' => 'required',
|
|
'total' => 'required',
|
|
'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
|
|
'bukti2' => 'nullable|file|mimes:xlsx,xls,csv',
|
|
'bukti3' => 'nullable|file|mimes:pdf',
|
|
]);
|
|
|
|
$cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang;
|
|
$region = Region::where('id', $cabang->region_id)->first();
|
|
$kategori = Kategori::where('id', $request->kategori_id)->first();
|
|
|
|
$filePaths = [];
|
|
$folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/other';
|
|
|
|
if ($request->hasFile('bukti1')) {
|
|
$bukti1 = $request->file('bukti1');
|
|
$filename = Str::uuid() . '.' . $bukti1->extension();
|
|
|
|
$filePaths['bukti1'] = $folderPath . '/' . $filename;
|
|
|
|
NextCloudHelper::uploadFile(
|
|
$folderPath,
|
|
$bukti1->getContent(),
|
|
$filename
|
|
);
|
|
|
|
}
|
|
if ($request->hasFile('bukti2')) {
|
|
$bukti2 = $request->file('bukti2');
|
|
$filename = Str::uuid() . '.' . $bukti2->extension();
|
|
|
|
$filePaths['bukti2'] = $folderPath . '/' . $filename;
|
|
|
|
NextCloudHelper::uploadFile(
|
|
$folderPath,
|
|
$bukti2->getContent(),
|
|
$filename
|
|
);
|
|
}
|
|
if ($request->hasFile('bukti3')) {
|
|
$bukti3 = $request->file('bukti3');
|
|
$filename = Str::uuid() . '.' . $bukti3->extension();
|
|
|
|
$filePaths['bukti3'] = $folderPath . '/' . $filename;
|
|
|
|
NextCloudHelper::uploadFile(
|
|
$folderPath,
|
|
$bukti3->getContent(),
|
|
$filename
|
|
);
|
|
}
|
|
|
|
// Generate sequence number and expense number
|
|
$sequence_number = FormOthers::withTrashed()->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-OTH-' . date('ym') . '%')->count() + 1;
|
|
$formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT);
|
|
$expense_number = $region->code . '-' . $cabang->code . '-OTH-' . date('ym') . $formatted_sequence_number;
|
|
|
|
// Save the form data
|
|
FormOthers::create([
|
|
'expense_number' => $expense_number,
|
|
'user_id' => auth()->user()->id,
|
|
'kategori_id' => $request->kategori_id,
|
|
'tanggal' => $request->tanggal,
|
|
'keterangan' => $request->keterangan,
|
|
'total' => $request->total,
|
|
'bukti1' => $filePaths['bukti1'] ?? null,
|
|
'bukti2' => $filePaths['bukti2'] ?? null,
|
|
'bukti3' => $filePaths['bukti3'] ?? null,
|
|
'account_number' => $kategori->account_number,
|
|
'status' => 'On Progress',
|
|
]);
|
|
|
|
session()->flash('success', 'Form has been created.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function edit($id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['forms.other.edit']);
|
|
|
|
$form = FormOthers::findOrfail($id);
|
|
if($form->status == 'Closed') {
|
|
session()->flash('error', 'Form has been closed, you cannot edit it.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
return view('backend.pages.forms.other.edit', [
|
|
'form' => $form,
|
|
'kategori' => Kategori::whereNotIn('name', ['Up Country', 'Vehicle Running Cost', 'Entertainment & Presentation', 'Meeting & Seminar'])->get()
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['forms.other.edit']);
|
|
|
|
$request->validate([
|
|
'kategori_id' => 'required',
|
|
'tanggal' => 'required|date',
|
|
'keterangan' => 'required',
|
|
'total' => 'required',
|
|
'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
|
|
'bukti2' => 'nullable|file|mimes:xlsx,xls,csv',
|
|
'bukti3' => 'nullable|file|mimes:pdf',
|
|
]);
|
|
|
|
$form = FormOthers::findOrfail($id);
|
|
if($form->status == 'Closed') {
|
|
session()->flash('error', 'Form has been closed, you cannot edit it.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
$cabang = UserHasCabang::with('cabang')->where('user_id', $form->user_id)->first()->cabang;
|
|
$region = Region::where('id', $cabang->region_id)->first();
|
|
$kategori = Kategori::where('id', $request->kategori_id)->first();
|
|
|
|
$filePaths = [];
|
|
$folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/other';
|
|
|
|
if ($request->hasFile('bukti1')) {
|
|
$bukti1 = $request->file('bukti1');
|
|
$filename = Str::uuid() . '.' . $bukti1->extension();
|
|
|
|
$filePaths['bukti1'] = $folderPath . '/' . $filename;
|
|
|
|
NextCloudHelper::uploadFile(
|
|
$folderPath,
|
|
$bukti1->getContent(),
|
|
$filename
|
|
);
|
|
|
|
}
|
|
if ($request->hasFile('bukti2')) {
|
|
$bukti2 = $request->file('bukti2');
|
|
$filename = Str::uuid() . '.' . $bukti2->extension();
|
|
|
|
$filePaths['bukti2'] = $folderPath . '/' . $filename;
|
|
|
|
NextCloudHelper::uploadFile(
|
|
$folderPath,
|
|
$bukti2->getContent(),
|
|
$filename
|
|
);
|
|
}
|
|
if ($request->hasFile('bukti3')) {
|
|
$bukti3 = $request->file('bukti3');
|
|
$filename = Str::uuid() . '.' . $bukti3->extension();
|
|
|
|
$filePaths['bukti3'] = $folderPath . '/' . $filename;
|
|
|
|
NextCloudHelper::uploadFile(
|
|
$folderPath,
|
|
$bukti3->getContent(),
|
|
$filename
|
|
);
|
|
}
|
|
|
|
// Save the form data
|
|
$form->update([
|
|
'kategori_id' => $request->kategori_id,
|
|
'tanggal' => $request->tanggal,
|
|
'keterangan' => $request->keterangan,
|
|
'total' => $request->total,
|
|
'bukti1' => $filePaths['bukti1'] ?? $form->bukti1,
|
|
'bukti2' => $filePaths['bukti2'] ?? $form->bukti2,
|
|
'bukti3' => $filePaths['bukti3'] ?? $form->bukti3,
|
|
'account_number' => $kategori->account_number,
|
|
]);
|
|
|
|
session()->flash('success', 'Form has been updated.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function approve($id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['approval.approve']);
|
|
|
|
$form = FormOthers::findOrfail($id);
|
|
$form->update([
|
|
'approved_at' => now(),
|
|
'approved_by' => auth()->user()->id,
|
|
'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, auth()->user()->email];
|
|
$phoneNumbers = [$form->user->phone, auth()->user()->phone];
|
|
|
|
if ($heads['cabang_head']) {
|
|
$recipients[] = $heads['cabang_head']['email'];
|
|
$phoneNumbers[] = $heads['cabang_head']['phone'];
|
|
}
|
|
|
|
if ($heads['region_head']) {
|
|
$recipients[] = $heads['region_head']['email'];
|
|
$phoneNumbers[] = $heads['region_head']['phone'];
|
|
}
|
|
|
|
// Remove duplicate email addresses, if any
|
|
$recipients = array_unique($recipients);
|
|
$phoneNumbers = array_unique($phoneNumbers);
|
|
|
|
// Send bulk email
|
|
Mail::to($recipients)->send(new ExpenseApproved(
|
|
$name,
|
|
$expense_number,
|
|
$tanggal,
|
|
$total
|
|
));
|
|
|
|
// Send bulk WhatsApp message
|
|
WhatsappHelper::approveExpense($phoneNumbers, $expense_number);
|
|
|
|
session()->flash('success', 'Form has been approved.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function finalApprove($id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['final_approval.approve']);
|
|
|
|
$form = FormOthers::findOrfail($id);
|
|
if($form->approved_at == null) {
|
|
session()->flash('error', 'Form must be approved by MIS first.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
$form->update([
|
|
'final_approved_at' => now(),
|
|
'final_approved_by' => auth()->user()->id,
|
|
'status' => 'Closed'
|
|
]);
|
|
|
|
$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, auth()->user()->email];
|
|
$phoneNumbers = [$form->user->phone, auth()->user()->phone];
|
|
|
|
if ($heads['cabang_head']) {
|
|
$recipients[] = $heads['cabang_head']['email'];
|
|
$phoneNumbers[] = $heads['cabang_head']['phone'];
|
|
}
|
|
|
|
if ($heads['region_head']) {
|
|
$recipients[] = $heads['region_head']['email'];
|
|
$phoneNumbers[] = $heads['region_head']['phone'];
|
|
}
|
|
|
|
// Remove duplicate email addresses, if any
|
|
$recipients = array_unique($recipients);
|
|
$phoneNumbers = array_unique($phoneNumbers);
|
|
|
|
// Send bulk email
|
|
Mail::to($recipients)->send(new FinalApprove(
|
|
$name,
|
|
$expense_number,
|
|
$tanggal,
|
|
$total
|
|
));
|
|
|
|
// send whatsapp message
|
|
WhatsappHelper::finalApprove($phoneNumbers, $expense_number);
|
|
|
|
session()->flash('success', 'Form has been final approved.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function open($id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['final_approval.open']);
|
|
|
|
$form = FormOthers::findOrfail($id);
|
|
$form->update([
|
|
'final_approved_at' => null,
|
|
'final_approved_by' => null,
|
|
'status' => 'Approved'
|
|
]);
|
|
|
|
session()->flash('success', 'Form has been opened.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function reject($id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['approval.approve']);
|
|
|
|
$form = FormOthers::findOrfail($id);
|
|
$form->update([
|
|
'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, auth()->user()->email];
|
|
$phoneNumbers = [$form->user->phone, auth()->user()->phone];
|
|
|
|
if ($heads['cabang_head']) {
|
|
$recipients[] = $heads['cabang_head']['email'];
|
|
$phoneNumbers[] = $heads['cabang_head']['phone'];
|
|
}
|
|
|
|
if ($heads['region_head']) {
|
|
$recipients[] = $heads['region_head']['email'];
|
|
$phoneNumbers[] = $heads['region_head']['phone'];
|
|
}
|
|
|
|
// Remove duplicate email addresses, if any
|
|
$recipients = array_unique($recipients);
|
|
$phoneNumbers = array_unique($phoneNumbers);
|
|
|
|
// Send bulk email
|
|
Mail::to($recipients)->send(new ExpenseRejected(
|
|
$name,
|
|
$expense_number,
|
|
$tanggal,
|
|
$total
|
|
));
|
|
|
|
// Send bulk WhatsApp message
|
|
WhatsappHelper::rejectExpense($phoneNumbers, $expense_number);
|
|
|
|
session()->flash('success', 'Form has been rejected.');
|
|
return redirect()->back();
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
$this->checkAuthorization(auth()->user(), ['forms.other.delete']);
|
|
|
|
$form = FormOthers::findOrfail($id);
|
|
$form->delete();
|
|
|
|
session()->flash('success', 'Form has been deleted.');
|
|
return redirect()->back();
|
|
}
|
|
} |