P2-07~14 판매대행소/담당자/업체/무료대상자 CRUD 일괄 구현
- 4개 테이블 생성 (sales_agency, manager, company, free_recipient) - 4개 Model + 4개 Controller + 12개 View - 담당자: 소속(S)/직위(T) 코드 연동 - 업체: 협회/제작업체/회수업체 유형 분류 - 무료대상자: 무상지급구분(H)/동코드(D) 연동 - 모두 지자체별 멀티테넌시 적용 - 24개 라우트 추가 - E2E 테스트 9개 전체 통과 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -83,6 +83,38 @@ $routes->group('admin', ['filter' => 'adminAuth'], static function ($routes): vo
|
|||||||
$routes->post('packaging-units/delete/(:num)', 'Admin\PackagingUnit::delete/$1');
|
$routes->post('packaging-units/delete/(:num)', 'Admin\PackagingUnit::delete/$1');
|
||||||
$routes->get('packaging-units/history/(:num)', 'Admin\PackagingUnit::history/$1');
|
$routes->get('packaging-units/history/(:num)', 'Admin\PackagingUnit::history/$1');
|
||||||
|
|
||||||
|
// 판매 대행소 관리 (P2-07/08)
|
||||||
|
$routes->get('sales-agencies', 'Admin\SalesAgency::index');
|
||||||
|
$routes->get('sales-agencies/create', 'Admin\SalesAgency::create');
|
||||||
|
$routes->post('sales-agencies/store', 'Admin\SalesAgency::store');
|
||||||
|
$routes->get('sales-agencies/edit/(:num)', 'Admin\SalesAgency::edit/$1');
|
||||||
|
$routes->post('sales-agencies/update/(:num)', 'Admin\SalesAgency::update/$1');
|
||||||
|
$routes->post('sales-agencies/delete/(:num)', 'Admin\SalesAgency::delete/$1');
|
||||||
|
|
||||||
|
// 담당자 관리 (P2-09/10)
|
||||||
|
$routes->get('managers', 'Admin\Manager::index');
|
||||||
|
$routes->get('managers/create', 'Admin\Manager::create');
|
||||||
|
$routes->post('managers/store', 'Admin\Manager::store');
|
||||||
|
$routes->get('managers/edit/(:num)', 'Admin\Manager::edit/$1');
|
||||||
|
$routes->post('managers/update/(:num)', 'Admin\Manager::update/$1');
|
||||||
|
$routes->post('managers/delete/(:num)', 'Admin\Manager::delete/$1');
|
||||||
|
|
||||||
|
// 업체 관리 (P2-11/12)
|
||||||
|
$routes->get('companies', 'Admin\Company::index');
|
||||||
|
$routes->get('companies/create', 'Admin\Company::create');
|
||||||
|
$routes->post('companies/store', 'Admin\Company::store');
|
||||||
|
$routes->get('companies/edit/(:num)', 'Admin\Company::edit/$1');
|
||||||
|
$routes->post('companies/update/(:num)', 'Admin\Company::update/$1');
|
||||||
|
$routes->post('companies/delete/(:num)', 'Admin\Company::delete/$1');
|
||||||
|
|
||||||
|
// 무료용 대상자 관리 (P2-13/14)
|
||||||
|
$routes->get('free-recipients', 'Admin\FreeRecipient::index');
|
||||||
|
$routes->get('free-recipients/create', 'Admin\FreeRecipient::create');
|
||||||
|
$routes->post('free-recipients/store', 'Admin\FreeRecipient::store');
|
||||||
|
$routes->get('free-recipients/edit/(:num)', 'Admin\FreeRecipient::edit/$1');
|
||||||
|
$routes->post('free-recipients/update/(:num)', 'Admin\FreeRecipient::update/$1');
|
||||||
|
$routes->post('free-recipients/delete/(:num)', 'Admin\FreeRecipient::delete/$1');
|
||||||
|
|
||||||
$routes->get('designated-shops', 'Admin\DesignatedShop::index');
|
$routes->get('designated-shops', 'Admin\DesignatedShop::index');
|
||||||
$routes->get('designated-shops/create', 'Admin\DesignatedShop::create');
|
$routes->get('designated-shops/create', 'Admin\DesignatedShop::create');
|
||||||
$routes->post('designated-shops/store', 'Admin\DesignatedShop::store');
|
$routes->post('designated-shops/store', 'Admin\DesignatedShop::store');
|
||||||
|
|||||||
126
app/Controllers/Admin/Company.php
Normal file
126
app/Controllers/Admin/Company.php
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Controllers\BaseController;
|
||||||
|
use App\Models\CompanyModel;
|
||||||
|
|
||||||
|
class Company extends BaseController
|
||||||
|
{
|
||||||
|
private CompanyModel $model;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->model = model(CompanyModel::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$lgIdx = admin_effective_lg_idx();
|
||||||
|
if (!$lgIdx) {
|
||||||
|
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = $this->model->where('cp_lg_idx', $lgIdx)->orderBy('cp_idx', 'DESC')->findAll();
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '업체 관리',
|
||||||
|
'content' => view('admin/company/index', ['list' => $list]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '업체 등록',
|
||||||
|
'content' => view('admin/company/create'),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$rules = [
|
||||||
|
'cp_type' => 'required|in_list[협회,제작업체,회수업체]',
|
||||||
|
'cp_name' => 'required|max_length[100]',
|
||||||
|
'cp_biz_no' => 'permit_empty|max_length[20]',
|
||||||
|
'cp_rep_name' => 'permit_empty|max_length[50]',
|
||||||
|
'cp_tel' => 'permit_empty|max_length[20]',
|
||||||
|
'cp_addr' => 'permit_empty|max_length[255]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->insert([
|
||||||
|
'cp_lg_idx' => admin_effective_lg_idx(),
|
||||||
|
'cp_type' => $this->request->getPost('cp_type'),
|
||||||
|
'cp_name' => $this->request->getPost('cp_name'),
|
||||||
|
'cp_biz_no' => $this->request->getPost('cp_biz_no') ?? '',
|
||||||
|
'cp_rep_name' => $this->request->getPost('cp_rep_name') ?? '',
|
||||||
|
'cp_tel' => $this->request->getPost('cp_tel') ?? '',
|
||||||
|
'cp_addr' => $this->request->getPost('cp_addr') ?? '',
|
||||||
|
'cp_state' => 1,
|
||||||
|
'cp_regdate' => date('Y-m-d H:i:s'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/companies'))->with('success', '업체가 등록되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->cp_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/companies'))->with('error', '업체를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '업체 수정',
|
||||||
|
'content' => view('admin/company/edit', ['item' => $item]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->cp_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/companies'))->with('error', '업체를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$rules = [
|
||||||
|
'cp_type' => 'required|in_list[협회,제작업체,회수업체]',
|
||||||
|
'cp_name' => 'required|max_length[100]',
|
||||||
|
'cp_state' => 'required|in_list[0,1]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->update($id, [
|
||||||
|
'cp_type' => $this->request->getPost('cp_type'),
|
||||||
|
'cp_name' => $this->request->getPost('cp_name'),
|
||||||
|
'cp_biz_no' => $this->request->getPost('cp_biz_no') ?? '',
|
||||||
|
'cp_rep_name' => $this->request->getPost('cp_rep_name') ?? '',
|
||||||
|
'cp_tel' => $this->request->getPost('cp_tel') ?? '',
|
||||||
|
'cp_addr' => $this->request->getPost('cp_addr') ?? '',
|
||||||
|
'cp_state' => (int) $this->request->getPost('cp_state'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/companies'))->with('success', '업체가 수정되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->cp_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/companies'))->with('error', '업체를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->delete($id);
|
||||||
|
return redirect()->to(site_url('admin/companies'))->with('success', '업체가 삭제되었습니다.');
|
||||||
|
}
|
||||||
|
}
|
||||||
139
app/Controllers/Admin/FreeRecipient.php
Normal file
139
app/Controllers/Admin/FreeRecipient.php
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Controllers\BaseController;
|
||||||
|
use App\Models\FreeRecipientModel;
|
||||||
|
use App\Models\CodeKindModel;
|
||||||
|
use App\Models\CodeDetailModel;
|
||||||
|
|
||||||
|
class FreeRecipient extends BaseController
|
||||||
|
{
|
||||||
|
private FreeRecipientModel $model;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->model = model(FreeRecipientModel::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getCodeOptions(string $ckCode): array
|
||||||
|
{
|
||||||
|
$kind = model(CodeKindModel::class)->where('ck_code', $ckCode)->first();
|
||||||
|
return $kind ? model(CodeDetailModel::class)->getByKind((int) $kind->ck_idx, true) : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$lgIdx = admin_effective_lg_idx();
|
||||||
|
if (!$lgIdx) {
|
||||||
|
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = $this->model->where('fr_lg_idx', $lgIdx)->orderBy('fr_idx', 'DESC')->findAll();
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '무료용 대상자 관리',
|
||||||
|
'content' => view('admin/free_recipient/index', ['list' => $list]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '무료용 대상자 등록',
|
||||||
|
'content' => view('admin/free_recipient/create', [
|
||||||
|
'typeCodes' => $this->getCodeOptions('H'),
|
||||||
|
'dongCodes' => $this->getCodeOptions('D'),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$rules = [
|
||||||
|
'fr_type_code' => 'required|max_length[20]',
|
||||||
|
'fr_name' => 'required|max_length[100]',
|
||||||
|
'fr_end_date' => 'permit_empty|valid_date[Y-m-d]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->insert([
|
||||||
|
'fr_lg_idx' => admin_effective_lg_idx(),
|
||||||
|
'fr_type_code' => $this->request->getPost('fr_type_code'),
|
||||||
|
'fr_name' => $this->request->getPost('fr_name'),
|
||||||
|
'fr_phone' => $this->request->getPost('fr_phone') ?? '',
|
||||||
|
'fr_addr' => $this->request->getPost('fr_addr') ?? '',
|
||||||
|
'fr_dong_code' => $this->request->getPost('fr_dong_code') ?? '',
|
||||||
|
'fr_note' => $this->request->getPost('fr_note') ?? '',
|
||||||
|
'fr_end_date' => $this->request->getPost('fr_end_date') ?: null,
|
||||||
|
'fr_state' => 1,
|
||||||
|
'fr_regdate' => date('Y-m-d H:i:s'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/free-recipients'))->with('success', '무료용 대상자가 등록되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->fr_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/free-recipients'))->with('error', '대상자를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '무료용 대상자 수정',
|
||||||
|
'content' => view('admin/free_recipient/edit', [
|
||||||
|
'item' => $item,
|
||||||
|
'typeCodes' => $this->getCodeOptions('H'),
|
||||||
|
'dongCodes' => $this->getCodeOptions('D'),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->fr_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/free-recipients'))->with('error', '대상자를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$rules = [
|
||||||
|
'fr_name' => 'required|max_length[100]',
|
||||||
|
'fr_state' => 'required|in_list[0,1]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->update($id, [
|
||||||
|
'fr_type_code' => $this->request->getPost('fr_type_code') ?? $item->fr_type_code,
|
||||||
|
'fr_name' => $this->request->getPost('fr_name'),
|
||||||
|
'fr_phone' => $this->request->getPost('fr_phone') ?? '',
|
||||||
|
'fr_addr' => $this->request->getPost('fr_addr') ?? '',
|
||||||
|
'fr_dong_code' => $this->request->getPost('fr_dong_code') ?? '',
|
||||||
|
'fr_note' => $this->request->getPost('fr_note') ?? '',
|
||||||
|
'fr_end_date' => $this->request->getPost('fr_end_date') ?: null,
|
||||||
|
'fr_state' => (int) $this->request->getPost('fr_state'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/free-recipients'))->with('success', '무료용 대상자가 수정되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->fr_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/free-recipients'))->with('error', '대상자를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->delete($id);
|
||||||
|
return redirect()->to(site_url('admin/free-recipients'))->with('success', '무료용 대상자가 삭제되었습니다.');
|
||||||
|
}
|
||||||
|
}
|
||||||
138
app/Controllers/Admin/Manager.php
Normal file
138
app/Controllers/Admin/Manager.php
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Controllers\BaseController;
|
||||||
|
use App\Models\ManagerModel;
|
||||||
|
use App\Models\CodeKindModel;
|
||||||
|
use App\Models\CodeDetailModel;
|
||||||
|
|
||||||
|
class Manager extends BaseController
|
||||||
|
{
|
||||||
|
private ManagerModel $model;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->model = model(ManagerModel::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getCodeOptions(string $ckCode): array
|
||||||
|
{
|
||||||
|
$kind = model(CodeKindModel::class)->where('ck_code', $ckCode)->first();
|
||||||
|
return $kind ? model(CodeDetailModel::class)->getByKind((int) $kind->ck_idx, true) : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$lgIdx = admin_effective_lg_idx();
|
||||||
|
if (!$lgIdx) {
|
||||||
|
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = $this->model->where('mg_lg_idx', $lgIdx)->orderBy('mg_idx', 'DESC')->findAll();
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '담당자 관리',
|
||||||
|
'content' => view('admin/manager/index', ['list' => $list]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '담당자 등록',
|
||||||
|
'content' => view('admin/manager/create', [
|
||||||
|
'deptCodes' => $this->getCodeOptions('S'),
|
||||||
|
'positionCodes' => $this->getCodeOptions('T'),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$rules = [
|
||||||
|
'mg_name' => 'required|max_length[50]',
|
||||||
|
'mg_tel' => 'permit_empty|max_length[20]',
|
||||||
|
'mg_phone' => 'permit_empty|max_length[20]',
|
||||||
|
'mg_email' => 'permit_empty|valid_email|max_length[100]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->insert([
|
||||||
|
'mg_lg_idx' => admin_effective_lg_idx(),
|
||||||
|
'mg_name' => $this->request->getPost('mg_name'),
|
||||||
|
'mg_dept_code' => $this->request->getPost('mg_dept_code') ?? '',
|
||||||
|
'mg_position_code' => $this->request->getPost('mg_position_code') ?? '',
|
||||||
|
'mg_tel' => $this->request->getPost('mg_tel') ?? '',
|
||||||
|
'mg_phone' => $this->request->getPost('mg_phone') ?? '',
|
||||||
|
'mg_email' => $this->request->getPost('mg_email') ?? '',
|
||||||
|
'mg_state' => 1,
|
||||||
|
'mg_regdate' => date('Y-m-d H:i:s'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/managers'))->with('success', '담당자가 등록되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->mg_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/managers'))->with('error', '담당자를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '담당자 수정',
|
||||||
|
'content' => view('admin/manager/edit', [
|
||||||
|
'item' => $item,
|
||||||
|
'deptCodes' => $this->getCodeOptions('S'),
|
||||||
|
'positionCodes' => $this->getCodeOptions('T'),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->mg_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/managers'))->with('error', '담당자를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$rules = [
|
||||||
|
'mg_name' => 'required|max_length[50]',
|
||||||
|
'mg_state' => 'required|in_list[0,1]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->update($id, [
|
||||||
|
'mg_name' => $this->request->getPost('mg_name'),
|
||||||
|
'mg_dept_code' => $this->request->getPost('mg_dept_code') ?? '',
|
||||||
|
'mg_position_code' => $this->request->getPost('mg_position_code') ?? '',
|
||||||
|
'mg_tel' => $this->request->getPost('mg_tel') ?? '',
|
||||||
|
'mg_phone' => $this->request->getPost('mg_phone') ?? '',
|
||||||
|
'mg_email' => $this->request->getPost('mg_email') ?? '',
|
||||||
|
'mg_state' => (int) $this->request->getPost('mg_state'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/managers'))->with('success', '담당자가 수정되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->mg_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/managers'))->with('error', '담당자를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->delete($id);
|
||||||
|
return redirect()->to(site_url('admin/managers'))->with('success', '담당자가 삭제되었습니다.');
|
||||||
|
}
|
||||||
|
}
|
||||||
122
app/Controllers/Admin/SalesAgency.php
Normal file
122
app/Controllers/Admin/SalesAgency.php
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Controllers\BaseController;
|
||||||
|
use App\Models\SalesAgencyModel;
|
||||||
|
|
||||||
|
class SalesAgency extends BaseController
|
||||||
|
{
|
||||||
|
private SalesAgencyModel $model;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->model = model(SalesAgencyModel::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$lgIdx = admin_effective_lg_idx();
|
||||||
|
if (!$lgIdx) {
|
||||||
|
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$list = $this->model->where('sa_lg_idx', $lgIdx)->orderBy('sa_idx', 'DESC')->findAll();
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '판매 대행소 관리',
|
||||||
|
'content' => view('admin/sales_agency/index', ['list' => $list]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '판매 대행소 등록',
|
||||||
|
'content' => view('admin/sales_agency/create'),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store()
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$rules = [
|
||||||
|
'sa_name' => 'required|max_length[100]',
|
||||||
|
'sa_biz_no' => 'permit_empty|max_length[20]',
|
||||||
|
'sa_rep_name' => 'permit_empty|max_length[50]',
|
||||||
|
'sa_tel' => 'permit_empty|max_length[20]',
|
||||||
|
'sa_addr' => 'permit_empty|max_length[255]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->insert([
|
||||||
|
'sa_lg_idx' => admin_effective_lg_idx(),
|
||||||
|
'sa_name' => $this->request->getPost('sa_name'),
|
||||||
|
'sa_biz_no' => $this->request->getPost('sa_biz_no') ?? '',
|
||||||
|
'sa_rep_name' => $this->request->getPost('sa_rep_name') ?? '',
|
||||||
|
'sa_tel' => $this->request->getPost('sa_tel') ?? '',
|
||||||
|
'sa_addr' => $this->request->getPost('sa_addr') ?? '',
|
||||||
|
'sa_state' => 1,
|
||||||
|
'sa_regdate' => date('Y-m-d H:i:s'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/sales-agencies'))->with('success', '판매 대행소가 등록되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->sa_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/sales-agencies'))->with('error', '대행소를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('admin/layout', [
|
||||||
|
'title' => '판매 대행소 수정',
|
||||||
|
'content' => view('admin/sales_agency/edit', ['item' => $item]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->sa_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/sales-agencies'))->with('error', '대행소를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$rules = [
|
||||||
|
'sa_name' => 'required|max_length[100]',
|
||||||
|
'sa_state' => 'required|in_list[0,1]',
|
||||||
|
];
|
||||||
|
if (! $this->validate($rules)) {
|
||||||
|
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->update($id, [
|
||||||
|
'sa_name' => $this->request->getPost('sa_name'),
|
||||||
|
'sa_biz_no' => $this->request->getPost('sa_biz_no') ?? '',
|
||||||
|
'sa_rep_name' => $this->request->getPost('sa_rep_name') ?? '',
|
||||||
|
'sa_tel' => $this->request->getPost('sa_tel') ?? '',
|
||||||
|
'sa_addr' => $this->request->getPost('sa_addr') ?? '',
|
||||||
|
'sa_state' => (int) $this->request->getPost('sa_state'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return redirect()->to(site_url('admin/sales-agencies'))->with('success', '판매 대행소가 수정되었습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete(int $id)
|
||||||
|
{
|
||||||
|
helper('admin');
|
||||||
|
$item = $this->model->find($id);
|
||||||
|
if (!$item || (int) $item->sa_lg_idx !== admin_effective_lg_idx()) {
|
||||||
|
return redirect()->to(site_url('admin/sales-agencies'))->with('error', '대행소를 찾을 수 없습니다.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->model->delete($id);
|
||||||
|
return redirect()->to(site_url('admin/sales-agencies'))->with('success', '판매 대행소가 삭제되었습니다.');
|
||||||
|
}
|
||||||
|
}
|
||||||
17
app/Models/CompanyModel.php
Normal file
17
app/Models/CompanyModel.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class CompanyModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'company';
|
||||||
|
protected $primaryKey = 'cp_idx';
|
||||||
|
protected $returnType = 'object';
|
||||||
|
protected $useTimestamps = false;
|
||||||
|
protected $allowedFields = [
|
||||||
|
'cp_lg_idx', 'cp_type', 'cp_name', 'cp_biz_no', 'cp_rep_name',
|
||||||
|
'cp_tel', 'cp_addr', 'cp_state', 'cp_regdate',
|
||||||
|
];
|
||||||
|
}
|
||||||
17
app/Models/FreeRecipientModel.php
Normal file
17
app/Models/FreeRecipientModel.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class FreeRecipientModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'free_recipient';
|
||||||
|
protected $primaryKey = 'fr_idx';
|
||||||
|
protected $returnType = 'object';
|
||||||
|
protected $useTimestamps = false;
|
||||||
|
protected $allowedFields = [
|
||||||
|
'fr_lg_idx', 'fr_type_code', 'fr_name', 'fr_phone', 'fr_addr',
|
||||||
|
'fr_dong_code', 'fr_note', 'fr_end_date', 'fr_state', 'fr_regdate',
|
||||||
|
];
|
||||||
|
}
|
||||||
17
app/Models/ManagerModel.php
Normal file
17
app/Models/ManagerModel.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class ManagerModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'manager';
|
||||||
|
protected $primaryKey = 'mg_idx';
|
||||||
|
protected $returnType = 'object';
|
||||||
|
protected $useTimestamps = false;
|
||||||
|
protected $allowedFields = [
|
||||||
|
'mg_lg_idx', 'mg_name', 'mg_dept_code', 'mg_position_code',
|
||||||
|
'mg_tel', 'mg_phone', 'mg_email', 'mg_state', 'mg_regdate',
|
||||||
|
];
|
||||||
|
}
|
||||||
17
app/Models/SalesAgencyModel.php
Normal file
17
app/Models/SalesAgencyModel.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use CodeIgniter\Model;
|
||||||
|
|
||||||
|
class SalesAgencyModel extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'sales_agency';
|
||||||
|
protected $primaryKey = 'sa_idx';
|
||||||
|
protected $returnType = 'object';
|
||||||
|
protected $useTimestamps = false;
|
||||||
|
protected $allowedFields = [
|
||||||
|
'sa_lg_idx', 'sa_name', 'sa_biz_no', 'sa_rep_name',
|
||||||
|
'sa_tel', 'sa_addr', 'sa_state', 'sa_regdate',
|
||||||
|
];
|
||||||
|
}
|
||||||
48
app/Views/admin/company/create.php
Normal file
48
app/Views/admin/company/create.php
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">업체 등록</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/companies/store') ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">업체유형 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_type" required>
|
||||||
|
<option value="">선택</option>
|
||||||
|
<option value="협회" <?= old('cp_type') === '협회' ? 'selected' : '' ?>>협회</option>
|
||||||
|
<option value="제작업체" <?= old('cp_type') === '제작업체' ? 'selected' : '' ?>>제작업체</option>
|
||||||
|
<option value="회수업체" <?= old('cp_type') === '회수업체' ? 'selected' : '' ?>>회수업체</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">업체명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_name" type="text" value="<?= esc(old('cp_name')) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">사업자번호</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_biz_no" type="text" value="<?= esc(old('cp_biz_no')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대표자</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_rep_name" type="text" value="<?= esc(old('cp_rep_name')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_tel" type="text" value="<?= esc(old('cp_tel')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">주소</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="cp_addr" type="text" value="<?= esc(old('cp_addr')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">등록</button>
|
||||||
|
<a href="<?= base_url('admin/companies') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
56
app/Views/admin/company/edit.php
Normal file
56
app/Views/admin/company/edit.php
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">업체 수정</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/companies/update/' . (int) $item->cp_idx) ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">업체유형 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_type" required>
|
||||||
|
<option value="">선택</option>
|
||||||
|
<option value="협회" <?= old('cp_type', $item->cp_type) === '협회' ? 'selected' : '' ?>>협회</option>
|
||||||
|
<option value="제작업체" <?= old('cp_type', $item->cp_type) === '제작업체' ? 'selected' : '' ?>>제작업체</option>
|
||||||
|
<option value="회수업체" <?= old('cp_type', $item->cp_type) === '회수업체' ? 'selected' : '' ?>>회수업체</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">업체명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_name" type="text" value="<?= esc(old('cp_name', $item->cp_name)) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">사업자번호</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_biz_no" type="text" value="<?= esc(old('cp_biz_no', $item->cp_biz_no)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대표자</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_rep_name" type="text" value="<?= esc(old('cp_rep_name', $item->cp_rep_name)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="cp_tel" type="text" value="<?= esc(old('cp_tel', $item->cp_tel)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">주소</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="cp_addr" type="text" value="<?= esc(old('cp_addr', $item->cp_addr)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">상태 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-32" name="cp_state" required>
|
||||||
|
<option value="1" <?= (int) old('cp_state', $item->cp_state) === 1 ? 'selected' : '' ?>>사용</option>
|
||||||
|
<option value="0" <?= (int) old('cp_state', $item->cp_state) === 0 ? 'selected' : '' ?>>미사용</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">수정</button>
|
||||||
|
<a href="<?= base_url('admin/companies') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
47
app/Views/admin/company/index.php
Normal file
47
app/Views/admin/company/index.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<div class="flex flex-wrap items-center justify-between gap-y-2">
|
||||||
|
<span class="text-sm font-bold text-gray-700">업체 관리</span>
|
||||||
|
<a href="<?= base_url('admin/companies/create') ?>" class="bg-btn-search text-white px-4 py-1.5 rounded-sm flex items-center gap-1 text-sm shadow hover:opacity-90 transition border border-transparent">업체 등록</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 overflow-auto mt-2">
|
||||||
|
<table class="w-full data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="w-16">번호</th>
|
||||||
|
<th>업체유형</th>
|
||||||
|
<th>업체명</th>
|
||||||
|
<th>사업자번호</th>
|
||||||
|
<th>대표자</th>
|
||||||
|
<th>전화</th>
|
||||||
|
<th>주소</th>
|
||||||
|
<th class="w-20">상태</th>
|
||||||
|
<th class="w-36">작업</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($list as $row): ?>
|
||||||
|
<tr>
|
||||||
|
<td class="text-center"><?= esc($row->cp_idx) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->cp_type) ?></td>
|
||||||
|
<td class="text-left pl-2"><?= esc($row->cp_name) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->cp_biz_no) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->cp_rep_name) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->cp_tel) ?></td>
|
||||||
|
<td class="text-left pl-2"><?= esc($row->cp_addr) ?></td>
|
||||||
|
<td class="text-center"><?= (int) $row->cp_state === 1 ? '사용' : '미사용' ?></td>
|
||||||
|
<td class="text-center">
|
||||||
|
<a href="<?= base_url('admin/companies/edit/' . (int) $row->cp_idx) ?>" class="text-blue-600 hover:underline text-sm mr-1">수정</a>
|
||||||
|
<form action="<?= base_url('admin/companies/delete/' . (int) $row->cp_idx) ?>" method="POST" class="inline" onsubmit="return confirm('삭제하시겠습니까?');">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
<button type="submit" class="text-red-600 hover:underline text-sm">삭제</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<?php if (empty($list)): ?>
|
||||||
|
<tr><td colspan="9" class="text-center text-gray-400 py-4">등록된 데이터가 없습니다.</td></tr>
|
||||||
|
<?php endif; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
62
app/Views/admin/free_recipient/create.php
Normal file
62
app/Views/admin/free_recipient/create.php
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">대상자 등록</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/free-recipients/store') ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">구분 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_type_code" required>
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($typeCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('fr_type_code') === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대상자명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_name" type="text" value="<?= esc(old('fr_name')) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">연락처</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_phone" type="text" value="<?= esc(old('fr_phone')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">주소</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="fr_addr" type="text" value="<?= esc(old('fr_addr')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">동코드</label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_dong_code">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($dongCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('fr_dong_code') === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">비고</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="fr_note" type="text" value="<?= esc(old('fr_note')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">종료일</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-44" name="fr_end_date" type="date" value="<?= esc(old('fr_end_date')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">등록</button>
|
||||||
|
<a href="<?= base_url('admin/free-recipients') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
70
app/Views/admin/free_recipient/edit.php
Normal file
70
app/Views/admin/free_recipient/edit.php
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">대상자 수정</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/free-recipients/update/' . (int) $item->fr_idx) ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">구분 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_type_code" required>
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($typeCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('fr_type_code', $item->fr_type_code) === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대상자명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_name" type="text" value="<?= esc(old('fr_name', $item->fr_name)) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">연락처</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_phone" type="text" value="<?= esc(old('fr_phone', $item->fr_phone)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">주소</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="fr_addr" type="text" value="<?= esc(old('fr_addr', $item->fr_addr)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">동코드</label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="fr_dong_code">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($dongCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('fr_dong_code', $item->fr_dong_code) === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">비고</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="fr_note" type="text" value="<?= esc(old('fr_note', $item->fr_note)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">종료일</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-44" name="fr_end_date" type="date" value="<?= esc(old('fr_end_date', $item->fr_end_date)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">상태 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-32" name="fr_state" required>
|
||||||
|
<option value="1" <?= (int) old('fr_state', $item->fr_state) === 1 ? 'selected' : '' ?>>사용</option>
|
||||||
|
<option value="0" <?= (int) old('fr_state', $item->fr_state) === 0 ? 'selected' : '' ?>>미사용</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">수정</button>
|
||||||
|
<a href="<?= base_url('admin/free-recipients') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
49
app/Views/admin/free_recipient/index.php
Normal file
49
app/Views/admin/free_recipient/index.php
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<div class="flex flex-wrap items-center justify-between gap-y-2">
|
||||||
|
<span class="text-sm font-bold text-gray-700">무료용 대상자 관리</span>
|
||||||
|
<a href="<?= base_url('admin/free-recipients/create') ?>" class="bg-btn-search text-white px-4 py-1.5 rounded-sm flex items-center gap-1 text-sm shadow hover:opacity-90 transition border border-transparent">대상자 등록</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 overflow-auto mt-2">
|
||||||
|
<table class="w-full data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="w-16">번호</th>
|
||||||
|
<th>구분</th>
|
||||||
|
<th>대상자명</th>
|
||||||
|
<th>연락처</th>
|
||||||
|
<th>주소</th>
|
||||||
|
<th>동코드</th>
|
||||||
|
<th>비고</th>
|
||||||
|
<th>종료일</th>
|
||||||
|
<th class="w-20">상태</th>
|
||||||
|
<th class="w-36">작업</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($list as $row): ?>
|
||||||
|
<tr>
|
||||||
|
<td class="text-center"><?= esc($row->fr_idx) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->fr_type_code) ?></td>
|
||||||
|
<td class="text-left pl-2"><?= esc($row->fr_name) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->fr_phone) ?></td>
|
||||||
|
<td class="text-left pl-2"><?= esc($row->fr_addr) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->fr_dong_code) ?></td>
|
||||||
|
<td class="text-left pl-2"><?= esc($row->fr_note) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->fr_end_date) ?></td>
|
||||||
|
<td class="text-center"><?= (int) $row->fr_state === 1 ? '사용' : '미사용' ?></td>
|
||||||
|
<td class="text-center">
|
||||||
|
<a href="<?= base_url('admin/free-recipients/edit/' . (int) $row->fr_idx) ?>" class="text-blue-600 hover:underline text-sm mr-1">수정</a>
|
||||||
|
<form action="<?= base_url('admin/free-recipients/delete/' . (int) $row->fr_idx) ?>" method="POST" class="inline" onsubmit="return confirm('삭제하시겠습니까?');">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
<button type="submit" class="text-red-600 hover:underline text-sm">삭제</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<?php if (empty($list)): ?>
|
||||||
|
<tr><td colspan="10" class="text-center text-gray-400 py-4">등록된 데이터가 없습니다.</td></tr>
|
||||||
|
<?php endif; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
57
app/Views/admin/manager/create.php
Normal file
57
app/Views/admin/manager/create.php
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">담당자 등록</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/managers/store') ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">담당자명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_name" type="text" value="<?= esc(old('mg_name')) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">소속</label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_dept_code">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($deptCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('mg_dept_code') === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">직위</label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_position_code">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($positionCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('mg_position_code') === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_tel" type="text" value="<?= esc(old('mg_tel')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">휴대전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_phone" type="text" value="<?= esc(old('mg_phone')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">이메일</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_email" type="email" value="<?= esc(old('mg_email')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">등록</button>
|
||||||
|
<a href="<?= base_url('admin/managers') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
65
app/Views/admin/manager/edit.php
Normal file
65
app/Views/admin/manager/edit.php
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">담당자 수정</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/managers/update/' . (int) $item->mg_idx) ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">담당자명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_name" type="text" value="<?= esc(old('mg_name', $item->mg_name)) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">소속</label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_dept_code">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($deptCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('mg_dept_code', $item->mg_dept_code) === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">직위</label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_position_code">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<?php foreach ($positionCodes as $cd): ?>
|
||||||
|
<option value="<?= esc($cd->cd_code) ?>" <?= old('mg_position_code', $item->mg_position_code) === $cd->cd_code ? 'selected' : '' ?>>
|
||||||
|
<?= esc($cd->cd_name) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_tel" type="text" value="<?= esc(old('mg_tel', $item->mg_tel)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">휴대전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_phone" type="text" value="<?= esc(old('mg_phone', $item->mg_phone)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">이메일</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="mg_email" type="email" value="<?= esc(old('mg_email', $item->mg_email)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">상태 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-32" name="mg_state" required>
|
||||||
|
<option value="1" <?= (int) old('mg_state', $item->mg_state) === 1 ? 'selected' : '' ?>>사용</option>
|
||||||
|
<option value="0" <?= (int) old('mg_state', $item->mg_state) === 0 ? 'selected' : '' ?>>미사용</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">수정</button>
|
||||||
|
<a href="<?= base_url('admin/managers') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
47
app/Views/admin/manager/index.php
Normal file
47
app/Views/admin/manager/index.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<div class="flex flex-wrap items-center justify-between gap-y-2">
|
||||||
|
<span class="text-sm font-bold text-gray-700">담당자 관리</span>
|
||||||
|
<a href="<?= base_url('admin/managers/create') ?>" class="bg-btn-search text-white px-4 py-1.5 rounded-sm flex items-center gap-1 text-sm shadow hover:opacity-90 transition border border-transparent">담당자 등록</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 overflow-auto mt-2">
|
||||||
|
<table class="w-full data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="w-16">번호</th>
|
||||||
|
<th>담당자명</th>
|
||||||
|
<th>소속</th>
|
||||||
|
<th>직위</th>
|
||||||
|
<th>전화</th>
|
||||||
|
<th>휴대전화</th>
|
||||||
|
<th>이메일</th>
|
||||||
|
<th class="w-20">상태</th>
|
||||||
|
<th class="w-36">작업</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($list as $row): ?>
|
||||||
|
<tr>
|
||||||
|
<td class="text-center"><?= esc($row->mg_idx) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->mg_name) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->mg_dept_code) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->mg_position_code) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->mg_tel) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->mg_phone) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->mg_email) ?></td>
|
||||||
|
<td class="text-center"><?= (int) $row->mg_state === 1 ? '사용' : '미사용' ?></td>
|
||||||
|
<td class="text-center">
|
||||||
|
<a href="<?= base_url('admin/managers/edit/' . (int) $row->mg_idx) ?>" class="text-blue-600 hover:underline text-sm mr-1">수정</a>
|
||||||
|
<form action="<?= base_url('admin/managers/delete/' . (int) $row->mg_idx) ?>" method="POST" class="inline" onsubmit="return confirm('삭제하시겠습니까?');">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
<button type="submit" class="text-red-600 hover:underline text-sm">삭제</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<?php if (empty($list)): ?>
|
||||||
|
<tr><td colspan="9" class="text-center text-gray-400 py-4">등록된 데이터가 없습니다.</td></tr>
|
||||||
|
<?php endif; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
38
app/Views/admin/sales_agency/create.php
Normal file
38
app/Views/admin/sales_agency/create.php
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">대행소 등록</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/sales-agencies/store') ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대행소명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_name" type="text" value="<?= esc(old('sa_name')) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">사업자번호</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_biz_no" type="text" value="<?= esc(old('sa_biz_no')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대표자</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_rep_name" type="text" value="<?= esc(old('sa_rep_name')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_tel" type="text" value="<?= esc(old('sa_tel')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">주소</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="sa_addr" type="text" value="<?= esc(old('sa_addr')) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">등록</button>
|
||||||
|
<a href="<?= base_url('admin/sales-agencies') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
46
app/Views/admin/sales_agency/edit.php
Normal file
46
app/Views/admin/sales_agency/edit.php
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<span class="text-sm font-bold text-gray-700">대행소 수정</span>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 p-4 mt-2 bg-white max-w-3xl">
|
||||||
|
<form action="<?= base_url('admin/sales-agencies/update/' . (int) $item->sa_idx) ?>" method="POST" class="space-y-4">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대행소명 <span class="text-red-500">*</span></label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_name" type="text" value="<?= esc(old('sa_name', $item->sa_name)) ?>" required/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">사업자번호</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_biz_no" type="text" value="<?= esc(old('sa_biz_no', $item->sa_biz_no)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">대표자</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_rep_name" type="text" value="<?= esc(old('sa_rep_name', $item->sa_rep_name)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">전화</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-60" name="sa_tel" type="text" value="<?= esc(old('sa_tel', $item->sa_tel)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">주소</label>
|
||||||
|
<input class="border border-gray-300 rounded px-3 py-1.5 text-sm w-96" name="sa_addr" type="text" value="<?= esc(old('sa_addr', $item->sa_addr)) ?>"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-wrap items-center gap-2">
|
||||||
|
<label class="block text-sm font-bold text-gray-700 w-28">상태 <span class="text-red-500">*</span></label>
|
||||||
|
<select class="border border-gray-300 rounded px-3 py-1.5 text-sm w-32" name="sa_state" required>
|
||||||
|
<option value="1" <?= (int) old('sa_state', $item->sa_state) === 1 ? 'selected' : '' ?>>사용</option>
|
||||||
|
<option value="0" <?= (int) old('sa_state', $item->sa_state) === 0 ? 'selected' : '' ?>>미사용</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-2 pt-2">
|
||||||
|
<button type="submit" class="bg-btn-search text-white px-6 py-1.5 rounded-sm text-sm shadow hover:opacity-90 transition">수정</button>
|
||||||
|
<a href="<?= base_url('admin/sales-agencies') ?>" class="bg-gray-200 text-gray-700 px-6 py-1.5 rounded-sm text-sm hover:bg-gray-300 transition">취소</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
45
app/Views/admin/sales_agency/index.php
Normal file
45
app/Views/admin/sales_agency/index.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<section class="border-b border-gray-300 p-2 shrink-0 bg-control-panel">
|
||||||
|
<div class="flex flex-wrap items-center justify-between gap-y-2">
|
||||||
|
<span class="text-sm font-bold text-gray-700">판매 대행소 관리</span>
|
||||||
|
<a href="<?= base_url('admin/sales-agencies/create') ?>" class="bg-btn-search text-white px-4 py-1.5 rounded-sm flex items-center gap-1 text-sm shadow hover:opacity-90 transition border border-transparent">대행소 등록</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="border border-gray-300 overflow-auto mt-2">
|
||||||
|
<table class="w-full data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="w-16">번호</th>
|
||||||
|
<th>대행소명</th>
|
||||||
|
<th>사업자번호</th>
|
||||||
|
<th>대표자</th>
|
||||||
|
<th>전화</th>
|
||||||
|
<th>주소</th>
|
||||||
|
<th class="w-20">상태</th>
|
||||||
|
<th class="w-36">작업</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($list as $row): ?>
|
||||||
|
<tr>
|
||||||
|
<td class="text-center"><?= esc($row->sa_idx) ?></td>
|
||||||
|
<td class="text-left pl-2"><?= esc($row->sa_name) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->sa_biz_no) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->sa_rep_name) ?></td>
|
||||||
|
<td class="text-center"><?= esc($row->sa_tel) ?></td>
|
||||||
|
<td class="text-left pl-2"><?= esc($row->sa_addr) ?></td>
|
||||||
|
<td class="text-center"><?= (int) $row->sa_state === 1 ? '정상' : '미사용' ?></td>
|
||||||
|
<td class="text-center">
|
||||||
|
<a href="<?= base_url('admin/sales-agencies/edit/' . (int) $row->sa_idx) ?>" class="text-blue-600 hover:underline text-sm mr-1">수정</a>
|
||||||
|
<form action="<?= base_url('admin/sales-agencies/delete/' . (int) $row->sa_idx) ?>" method="POST" class="inline" onsubmit="return confirm('삭제하시겠습니까?');">
|
||||||
|
<?= csrf_field() ?>
|
||||||
|
<button type="submit" class="text-red-600 hover:underline text-sm">삭제</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<?php if (empty($list)): ?>
|
||||||
|
<tr><td colspan="8" class="text-center text-gray-400 py-4">등록된 데이터가 없습니다.</td></tr>
|
||||||
|
<?php endif; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
73
e2e/phase2-entities.spec.js
Normal file
73
e2e/phase2-entities.spec.js
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
// @ts-check
|
||||||
|
const { test, expect } = require('@playwright/test');
|
||||||
|
const { login } = require('./helpers/auth');
|
||||||
|
|
||||||
|
async function loginAsAdmin(page) {
|
||||||
|
await login(page, 'admin');
|
||||||
|
await page.locator('input[name="lg_idx"]').first().check();
|
||||||
|
await page.click('button[type="submit"]');
|
||||||
|
await page.waitForURL(url => !url.pathname.includes('select-local-government'), { timeout: 15000 });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loginAsLocal(page) {
|
||||||
|
await login(page, 'local');
|
||||||
|
}
|
||||||
|
|
||||||
|
test.describe('P2-07/08: 판매 대행소 관리', () => {
|
||||||
|
test('목록 접근 (Super Admin)', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/sales-agencies');
|
||||||
|
await expect(page).toHaveURL(/\/admin\/sales-agencies/);
|
||||||
|
});
|
||||||
|
test('등록 폼 표시', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/sales-agencies/create');
|
||||||
|
await expect(page.locator('input[name="sa_name"]')).toBeVisible();
|
||||||
|
});
|
||||||
|
test('지자체관리자 접근', async ({ page }) => {
|
||||||
|
await loginAsLocal(page);
|
||||||
|
await page.goto('/admin/sales-agencies');
|
||||||
|
await expect(page).toHaveURL(/\/admin\/sales-agencies/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('P2-09/10: 담당자 관리', () => {
|
||||||
|
test('목록 접근', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/managers');
|
||||||
|
await expect(page).toHaveURL(/\/admin\/managers/);
|
||||||
|
});
|
||||||
|
test('등록 폼 표시', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/managers/create');
|
||||||
|
await expect(page.locator('input[name="mg_name"]')).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('P2-11/12: 업체 관리', () => {
|
||||||
|
test('목록 접근', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/companies');
|
||||||
|
await expect(page).toHaveURL(/\/admin\/companies/);
|
||||||
|
});
|
||||||
|
test('등록 폼 표시', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/companies/create');
|
||||||
|
await expect(page.locator('select[name="cp_type"]')).toBeVisible();
|
||||||
|
await expect(page.locator('input[name="cp_name"]')).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('P2-13/14: 무료용 대상자 관리', () => {
|
||||||
|
test('목록 접근', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/free-recipients');
|
||||||
|
await expect(page).toHaveURL(/\/admin\/free-recipients/);
|
||||||
|
});
|
||||||
|
test('등록 폼 표시', async ({ page }) => {
|
||||||
|
await loginAsAdmin(page);
|
||||||
|
await page.goto('/admin/free-recipients/create');
|
||||||
|
await expect(page.locator('select[name="fr_type_code"]')).toBeVisible();
|
||||||
|
await expect(page.locator('input[name="fr_name"]')).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
18
writable/database/company_tables.sql
Normal file
18
writable/database/company_tables.sql
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
-- ============================================
|
||||||
|
-- 업체 테이블 (P2-11, P2-12)
|
||||||
|
-- ============================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `company` (
|
||||||
|
`cp_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`cp_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
|
||||||
|
`cp_type` VARCHAR(20) NOT NULL COMMENT '협회/제작업체/회수업체',
|
||||||
|
`cp_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '업체명',
|
||||||
|
`cp_biz_no` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '사업자번호',
|
||||||
|
`cp_rep_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '대표자명',
|
||||||
|
`cp_tel` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '전화번호',
|
||||||
|
`cp_addr` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '주소',
|
||||||
|
`cp_state` TINYINT UNSIGNED NOT NULL DEFAULT 1,
|
||||||
|
`cp_regdate` DATETIME NOT NULL,
|
||||||
|
PRIMARY KEY (`cp_idx`),
|
||||||
|
KEY `idx_cp_lg_idx` (`cp_lg_idx`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='업체(협회/제작/회수)';
|
||||||
19
writable/database/free_recipient_tables.sql
Normal file
19
writable/database/free_recipient_tables.sql
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
-- ============================================
|
||||||
|
-- 무료용 대상자 테이블 (P2-13, P2-14)
|
||||||
|
-- ============================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `free_recipient` (
|
||||||
|
`fr_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`fr_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
|
||||||
|
`fr_type_code` VARCHAR(20) NOT NULL COMMENT '무상지급구분 code_detail(H)',
|
||||||
|
`fr_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '대상자/기관명',
|
||||||
|
`fr_phone` VARCHAR(20) NOT NULL DEFAULT '',
|
||||||
|
`fr_addr` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
|
`fr_dong_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '동코드 code_detail(D)',
|
||||||
|
`fr_note` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '비고',
|
||||||
|
`fr_end_date` DATE NULL DEFAULT NULL COMMENT '종료일자',
|
||||||
|
`fr_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=정상, 0=삭제',
|
||||||
|
`fr_regdate` DATETIME NOT NULL,
|
||||||
|
PRIMARY KEY (`fr_idx`),
|
||||||
|
KEY `idx_fr_lg_idx` (`fr_lg_idx`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료용 대상자';
|
||||||
18
writable/database/manager_tables.sql
Normal file
18
writable/database/manager_tables.sql
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
-- ============================================
|
||||||
|
-- 담당자 테이블 (P2-09, P2-10)
|
||||||
|
-- ============================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `manager` (
|
||||||
|
`mg_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`mg_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
|
||||||
|
`mg_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '담당자명',
|
||||||
|
`mg_dept_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '소속 code_detail(S)',
|
||||||
|
`mg_position_code` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '직위 code_detail(T)',
|
||||||
|
`mg_tel` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '전화번호',
|
||||||
|
`mg_phone` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '휴대전화',
|
||||||
|
`mg_email` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '이메일',
|
||||||
|
`mg_state` TINYINT UNSIGNED NOT NULL DEFAULT 1,
|
||||||
|
`mg_regdate` DATETIME NOT NULL,
|
||||||
|
PRIMARY KEY (`mg_idx`),
|
||||||
|
KEY `idx_mg_lg_idx` (`mg_lg_idx`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='담당자';
|
||||||
17
writable/database/sales_agency_tables.sql
Normal file
17
writable/database/sales_agency_tables.sql
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
-- ============================================
|
||||||
|
-- 판매 대행소 테이블 (P2-07, P2-08)
|
||||||
|
-- ============================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `sales_agency` (
|
||||||
|
`sa_idx` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`sa_lg_idx` INT UNSIGNED NOT NULL COMMENT '지자체 FK',
|
||||||
|
`sa_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '대행소명',
|
||||||
|
`sa_biz_no` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '사업자번호',
|
||||||
|
`sa_rep_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '대표자명',
|
||||||
|
`sa_tel` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '전화번호',
|
||||||
|
`sa_addr` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '주소',
|
||||||
|
`sa_state` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1=정상, 0=미사용',
|
||||||
|
`sa_regdate` DATETIME NOT NULL,
|
||||||
|
PRIMARY KEY (`sa_idx`),
|
||||||
|
KEY `idx_sa_lg_idx` (`sa_lg_idx`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='판매 대행소';
|
||||||
Reference in New Issue
Block a user