feature: form upload reklame

This commit is contained in:
2025-02-11 16:57:53 +07:00
parent 9c41fad232
commit ecf9096149
17 changed files with 1748 additions and 263 deletions

View File

@@ -9,6 +9,9 @@ use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use App\Http\Resources\AdvertisementResource;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\AdvertisementImport;
class AdvertisementController extends Controller
{
@@ -18,7 +21,32 @@ class AdvertisementController extends Controller
public function index(Request $request)
{
$perPage = $request->input('per_page', 15); // Default 15 jika tidak dikirim oleh client
$advertisements = Advertisement::paginate($perPage);
$search = $request->input('search', ''); // Ambil parameter 'search' jika ada
// Query dasar untuk mengambil iklan
$query = Advertisement::query();
// Jika ada pencarian, filter berdasarkan kolom yang diinginkan
if ($search) {
$query->where(function ($q) use ($search) {
$q->where('business_name', 'like', "%$search%")
->orWhere('npwpd', 'like', "%$search%")
->orWhere('advertisement_content', 'like', "%$search%")
->orWhere('business_address', 'like', "%$search%")
->orWhere('advertisement_location', 'like', "%$search%")
->orWhereIn('village_code', function ($subQuery) use ($search) {
$subQuery->select('village_code')
->from('villages')
->where('village_name', 'like', "%$search%");
})
->orWhereIn('district_code', function ($subQuery) use ($search) {
$subQuery->select('district_code')
->from('districts')
->where('district_name', 'like', "%$search%");
});
});
}
$advertisements = $query->paginate($perPage);
$advertisements->getCollection()->transform(function ($advertisement) {
$village = DB::table('villages')->where('village_code', $advertisement->village_code)->first();
@@ -47,24 +75,58 @@ class AdvertisementController extends Controller
{
$data = $request->validated();
// Transformasi village_name dan district_name menjadi village_code dan district_code
if (isset($data['village_name'])) {
// Ambil village_code berdasarkan village_name dari database
$data['village_code'] = DB::table('villages')->where('village_name', $data['village_name'])->value('village_code');
unset($data['village_name']); // Hapus village_name jika sudah tidak diperlukan
}
// Cari village_code berdasarkan village_name
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->value('village_code');
// Cari district_code berdasarkan district_name
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
if (isset($data['district_name'])) {
// Ambil district_code berdasarkan district_name dari database
$data['district_code'] = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
unset($data['district_name']); // Hapus district_name jika sudah tidak diperlukan
}
// Tambahkan village_code dan district_code ke data
$data['village_code'] = $village_code;
$data['district_code'] = $district_code;
// Log data setelah transformasi
info($data);
return Advertisement::create($data);
}
/**
* Import advertisements from Excel or CSV.
*/
public function importFromFile(Request $request)
{
// Validasi file
info($request);
$validator = Validator::make($request->all(), [
'file' => 'required|mimes:xlsx,xls|max:10240', // Max 10MB
]);
if ($validator->fails()) {
return response()->json([
'message' => 'File validation failed.',
'errors' => $validator->errors()
], 400);
}
try {
// Ambil file dari request
$file = $request->file('file');
// Menggunakan Laravel Excel untuk mengimpor file
Excel::import(new AdvertisementImport, $file);
// Jika sukses, kembalikan respons sukses
return response()->json([
'message' => 'File uploaded and imported successfully!'
], 200);
} catch (\Exception $e) {
// Jika ada error, kembalikan error response
return response()->json([
'message' => 'Error during file import.',
'error' => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
@@ -79,21 +141,19 @@ class AdvertisementController extends Controller
public function update(AdvertisementRequest $request, Advertisement $advertisement): Advertisement
{
$data = $request->validated();
// Transformasi village_name dan district_name menjadi village_code dan district_code
if (isset($data['village_name'])) {
// Ambil village_code berdasarkan village_name dari database
$data['village_code'] = DB::table('villages')->where('village_name', $data['village_name'])->value('village_code');
unset($data['village_name']); // Hapus village_name jika sudah tidak diperlukan
}
if (isset($data['district_name'])) {
// Ambil district_code berdasarkan district_name dari database
$data['district_code'] = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
unset($data['district_name']); // Hapus district_name jika sudah tidak diperlukan
}
// Cari village_code berdasarkan village_name
$village_code = DB::table('villages')->where('village_name', $data['village_name'])->value('village_code');
// Cari district_code berdasarkan district_name
$district_code = DB::table('districts')->where('district_name', $data['district_name'])->value('district_code');
// Tambahkan village_code dan district_code ke data
$data['village_code'] = $village_code;
$data['district_code'] = $district_code;
// Log data setelah transformasi
info($data);
$advertisement->update($data);
return $advertisement;
@@ -105,4 +165,35 @@ class AdvertisementController extends Controller
return response()->noContent();
}
public function searchOptionsInAdvertisements(Request $request)
{
$query = $request->input('query');
$field = $request->input('field');
$district = $request->input('district'); // Ambil kecamatan jika ada
info("Query: $query, Field: $field, District: $district");
if ($field === 'district_name') {
$results = DB::table('districts')
->where('district_name', 'like', '%' . $query . '%')
->limit(10)
->get(['district_name AS name', 'district_code AS code']);
} elseif ($field === 'village_name' && $district) {
$results = DB::table('villages')
->where('village_name', 'like', '%' . $query . '%')
->whereExists(function ($query) use ($district) {
$query->select(DB::raw(1))
->from('districts')
->whereColumn('villages.district_code', 'districts.district_code')
->where('districts.district_name', $district);
})
->limit(10)
->get(['village_name AS name', 'village_code AS code']);
} else {
$results = collect();
}
return response()->json($results);
}
}

View File

@@ -17,6 +17,15 @@ class AdvertisementController extends Controller
return view('data.advertisements.index');
}
/**
* Show the form for uploading a file.
*/
public function bulkCreate()
{
// Mengembalikan view form-upload
return view('data.advertisements.form-upload');
}
/**
* Show the form for creating a new resource.
*/
@@ -38,7 +47,7 @@ class AdvertisementController extends Controller
// $route = 'advertisements.create';
// info("AdvertisementController@edit diakses dengan ID: $title");
return view('form-create-update.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
return view('data.advertisements.form', compact('title', 'subtitle', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
/**
@@ -77,7 +86,7 @@ class AdvertisementController extends Controller
// $route = 'advertisements.update'; // Menggunakan route update untuk form edit
// info("AdvertisementController@edit diakses dengan route: $route");
return view('form-create-update.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
return view('data.advertisements.form', compact('title', 'subtitle', 'modelInstance', 'fields', 'fieldTypes', 'apiUrl', 'dropdownOptions'));
}
private function getFields()
@@ -90,8 +99,8 @@ class AdvertisementController extends Controller
"advertisement_content" => "Isi Reklame",
"business_address" => "Alamat Wajib Pajak",
"advertisement_location" => "Lokasi Reklame",
"village_name" => "Desa",
"district_name" => "Kecamatan",
"village_name" => "Desa",
"length" => "Panjang",
"width" => "Lebar",
"viewing_angle" => "Sudut Pandang",