CT-01/02/03 공통 컴포넌트 구현 — 페이지네이션/엑셀/인쇄
CT-01: 페이지네이션 - 커스텀 Tailwind 페이저 뷰 (components/pager.php) - 18개 admin 컨트롤러 findAll() → paginate(20) 전환 - Bag 컨트롤러 7개 리스트도 paginate 적용 - 19개 admin index 뷰에 페이저 링크 추가 CT-02: 엑셀 저장 - export_helper.php (UTF-8 BOM CSV) - 발주/판매/지정판매소/재고 4개 엑셀 내보내기 라우트+메서드 - 해당 뷰에 "엑셀저장" 버튼 추가 CT-03: 인쇄 - print_header.php (지자체명/제목/결재란 컴포넌트) - admin/bag 레이아웃에 @media print CSS 추가 - 23개 뷰에 인쇄 버튼 + print_header 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,8 +21,8 @@ class Pager extends BaseConfig
|
||||
* @var array<string, string>
|
||||
*/
|
||||
public array $templates = [
|
||||
'default_full' => 'CodeIgniter\Pager\Views\default_full',
|
||||
'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
|
||||
'default_full' => 'App\Views\components\pager',
|
||||
'default_simple' => 'App\Views\components\pager',
|
||||
'default_head' => 'CodeIgniter\Pager\Views\default_head',
|
||||
];
|
||||
|
||||
|
||||
@@ -114,6 +114,7 @@ $routes->group('admin', ['filter' => 'adminAuth'], static function ($routes): vo
|
||||
$routes->get('bag-prices/history/(:num)', 'Admin\BagPrice::history/$1');
|
||||
|
||||
// 발주 관리 (P3-01~05)
|
||||
$routes->get('bag-orders/export', 'Admin\BagOrder::export');
|
||||
$routes->get('bag-orders', 'Admin\BagOrder::index');
|
||||
$routes->get('bag-orders/create', 'Admin\BagOrder::create');
|
||||
$routes->post('bag-orders/store', 'Admin\BagOrder::store');
|
||||
@@ -127,6 +128,7 @@ $routes->group('admin', ['filter' => 'adminAuth'], static function ($routes): vo
|
||||
$routes->post('bag-receivings/store', 'Admin\BagReceiving::store');
|
||||
|
||||
// 재고 현황 (P3-10)
|
||||
$routes->get('bag-inventory/export', 'Admin\BagInventory::export');
|
||||
$routes->get('bag-inventory', 'Admin\BagInventory::index');
|
||||
|
||||
// 주문 접수 관리 (P4-01~03)
|
||||
@@ -136,6 +138,7 @@ $routes->group('admin', ['filter' => 'adminAuth'], static function ($routes): vo
|
||||
$routes->post('shop-orders/cancel/(:num)', 'Admin\ShopOrder::cancel/$1');
|
||||
|
||||
// 판매/반품 관리 (P4-04~07)
|
||||
$routes->get('bag-sales/export', 'Admin\BagSale::export');
|
||||
$routes->get('bag-sales', 'Admin\BagSale::index');
|
||||
$routes->get('bag-sales/create', 'Admin\BagSale::create');
|
||||
$routes->post('bag-sales/store', 'Admin\BagSale::store');
|
||||
@@ -193,6 +196,7 @@ $routes->group('admin', ['filter' => 'adminAuth'], static function ($routes): vo
|
||||
$routes->post('free-recipients/update/(:num)', 'Admin\FreeRecipient::update/$1');
|
||||
$routes->post('free-recipients/delete/(:num)', 'Admin\FreeRecipient::delete/$1');
|
||||
|
||||
$routes->get('designated-shops/export', 'Admin\DesignatedShop::export');
|
||||
$routes->get('designated-shops', 'Admin\DesignatedShop::index');
|
||||
$routes->get('designated-shops/create', 'Admin\DesignatedShop::create');
|
||||
$routes->post('designated-shops/store', 'Admin\DesignatedShop::store');
|
||||
|
||||
@@ -31,8 +31,7 @@ class Access extends BaseController
|
||||
{
|
||||
$start = $this->request->getGet('start');
|
||||
$end = $this->request->getGet('end');
|
||||
$builder = $this->memberLogModel->builder();
|
||||
$builder->select('member_log.*');
|
||||
$builder = $this->memberLogModel;
|
||||
$builder->orderBy('mll_regdate', 'DESC');
|
||||
if ($start !== null && $start !== '') {
|
||||
$builder->where('mll_regdate >=', $start . ' 00:00:00');
|
||||
@@ -40,10 +39,11 @@ class Access extends BaseController
|
||||
if ($end !== null && $end !== '') {
|
||||
$builder->where('mll_regdate <=', $end . ' 23:59:59');
|
||||
}
|
||||
$list = $builder->get()->getResult();
|
||||
$list = $builder->paginate(20);
|
||||
$pager = $this->memberLogModel->pager;
|
||||
return view('admin/layout', [
|
||||
'title' => '로그인 이력',
|
||||
'content' => view('admin/access/login_history', ['list' => $list, 'start' => $start, 'end' => $end]),
|
||||
'content' => view('admin/access/login_history', ['list' => $list, 'start' => $start, 'end' => $end, 'pager' => $pager]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -59,15 +59,14 @@ class Access extends BaseController
|
||||
$status = MemberApprovalRequestModel::STATUS_PENDING;
|
||||
}
|
||||
|
||||
$builder = $this->approvalModel->builder();
|
||||
$builder->select(
|
||||
'member_approval_request.*, member.mb_id, member.mb_name, member.mb_lg_idx, local_government.lg_name'
|
||||
);
|
||||
$builder->join('member', 'member.mb_idx = member_approval_request.mb_idx', 'left');
|
||||
$builder->join('local_government', 'local_government.lg_idx = member.mb_lg_idx', 'left');
|
||||
$builder->where('member_approval_request.mar_status', $status);
|
||||
$builder->orderBy('member_approval_request.mar_requested_at', 'DESC');
|
||||
$list = $builder->get()->getResult();
|
||||
$list = $this->approvalModel
|
||||
->select('member_approval_request.*, member.mb_id, member.mb_name, member.mb_lg_idx, local_government.lg_name')
|
||||
->join('member', 'member.mb_idx = member_approval_request.mb_idx', 'left')
|
||||
->join('local_government', 'local_government.lg_idx = member.mb_lg_idx', 'left')
|
||||
->where('member_approval_request.mar_status', $status)
|
||||
->orderBy('member_approval_request.mar_requested_at', 'DESC')
|
||||
->paginate(20);
|
||||
$pager = $this->approvalModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '승인 대기',
|
||||
@@ -75,6 +74,7 @@ class Access extends BaseController
|
||||
'list' => $list,
|
||||
'status' => $status,
|
||||
'roles' => $this->roles,
|
||||
'pager' => $pager,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -13,11 +13,41 @@ class BagInventory extends BaseController
|
||||
$lgIdx = admin_effective_lg_idx();
|
||||
if (!$lgIdx) return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||
|
||||
$list = model(BagInventoryModel::class)->where('bi_lg_idx', $lgIdx)->orderBy('bi_bag_code', 'ASC')->findAll();
|
||||
$invModel = model(BagInventoryModel::class);
|
||||
$list = $invModel->where('bi_lg_idx', $lgIdx)->orderBy('bi_bag_code', 'ASC')->paginate(20);
|
||||
$pager = $invModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '재고 현황',
|
||||
'content' => view('admin/bag_inventory/index', ['list' => $list]),
|
||||
'content' => view('admin/bag_inventory/index', ['list' => $list, 'pager' => $pager]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
helper(['admin', 'export']);
|
||||
$lgIdx = admin_effective_lg_idx();
|
||||
if (!$lgIdx) {
|
||||
return redirect()->to(site_url('admin/bag-inventory'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$list = model(BagInventoryModel::class)->where('bi_lg_idx', $lgIdx)->orderBy('bi_bag_code', 'ASC')->findAll();
|
||||
|
||||
$rows = [];
|
||||
foreach ($list as $row) {
|
||||
$rows[] = [
|
||||
$row->bi_idx,
|
||||
$row->bi_bag_code,
|
||||
$row->bi_bag_name,
|
||||
(int) $row->bi_qty,
|
||||
$row->bi_updated_at,
|
||||
];
|
||||
}
|
||||
|
||||
export_csv(
|
||||
'재고현황_' . date('Ymd') . '.csv',
|
||||
['번호', '봉투코드', '봉투명', '현재재고(낱장)', '최종갱신'],
|
||||
$rows
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,11 +29,12 @@ class BagIssue extends BaseController
|
||||
if ($startDate) $builder->where('bi2_issue_date >=', $startDate);
|
||||
if ($endDate) $builder->where('bi2_issue_date <=', $endDate);
|
||||
|
||||
$list = $builder->orderBy('bi2_issue_date', 'DESC')->orderBy('bi2_idx', 'DESC')->findAll();
|
||||
$list = $builder->orderBy('bi2_issue_date', 'DESC')->orderBy('bi2_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->issueModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '무료용 불출 관리',
|
||||
'content' => view('admin/bag_issue/index', compact('list', 'startDate', 'endDate')),
|
||||
'content' => view('admin/bag_issue/index', compact('list', 'startDate', 'endDate', 'pager')),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,8 @@ class BagOrder extends BaseController
|
||||
if ($endDate) $builder->where('bo_order_date <=', $endDate);
|
||||
if ($status) $builder->where('bo_status', $status);
|
||||
|
||||
$list = $builder->orderBy('bo_order_date', 'DESC')->orderBy('bo_idx', 'DESC')->findAll();
|
||||
$list = $builder->orderBy('bo_order_date', 'DESC')->orderBy('bo_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->orderModel->pager;
|
||||
|
||||
// 발주별 품목 합계
|
||||
$itemSummary = [];
|
||||
@@ -60,10 +61,56 @@ class BagOrder extends BaseController
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '발주 현황',
|
||||
'content' => view('admin/bag_order/index', compact('list', 'itemSummary', 'companyMap', 'agencyMap', 'startDate', 'endDate', 'status')),
|
||||
'content' => view('admin/bag_order/index', compact('list', 'itemSummary', 'companyMap', 'agencyMap', 'startDate', 'endDate', 'status', 'pager')),
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
helper(['admin', 'export']);
|
||||
$lgIdx = admin_effective_lg_idx();
|
||||
if (!$lgIdx) {
|
||||
return redirect()->to(site_url('admin/bag-orders'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$builder = $this->orderModel->where('bo_lg_idx', $lgIdx);
|
||||
$startDate = $this->request->getGet('start_date');
|
||||
$endDate = $this->request->getGet('end_date');
|
||||
$status = $this->request->getGet('status');
|
||||
if ($startDate) $builder->where('bo_order_date >=', $startDate);
|
||||
if ($endDate) $builder->where('bo_order_date <=', $endDate);
|
||||
if ($status) $builder->where('bo_status', $status);
|
||||
|
||||
$list = $builder->orderBy('bo_order_date', 'DESC')->orderBy('bo_idx', 'DESC')->findAll();
|
||||
|
||||
$rows = [];
|
||||
$statusMap = ['normal' => '정상', 'cancelled' => '취소', 'deleted' => '삭제'];
|
||||
foreach ($list as $row) {
|
||||
$items = $this->itemModel->where('boi_bo_idx', $row->bo_idx)->findAll();
|
||||
$totalQty = 0;
|
||||
$totalAmt = 0;
|
||||
foreach ($items as $it) {
|
||||
$totalQty += (int) $it->boi_qty_sheet;
|
||||
$totalAmt += (float) $it->boi_amount;
|
||||
}
|
||||
$rows[] = [
|
||||
$row->bo_idx,
|
||||
$row->bo_lot_no,
|
||||
$row->bo_order_date,
|
||||
count($items),
|
||||
$totalQty,
|
||||
$totalAmt,
|
||||
$statusMap[$row->bo_status] ?? $row->bo_status,
|
||||
];
|
||||
}
|
||||
|
||||
export_csv(
|
||||
'발주현황_' . date('Ymd') . '.csv',
|
||||
['번호', 'LOT번호', '발주일', '품목수', '총수량', '총금액', '상태'],
|
||||
$rows
|
||||
);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
helper('admin');
|
||||
|
||||
@@ -42,7 +42,8 @@ class BagPrice extends BaseController
|
||||
->groupEnd();
|
||||
}
|
||||
|
||||
$list = $builder->orderBy('bp_bag_code', 'ASC')->orderBy('bp_start_date', 'DESC')->findAll();
|
||||
$list = $builder->orderBy('bp_bag_code', 'ASC')->orderBy('bp_start_date', 'DESC')->paginate(20);
|
||||
$pager = $this->priceModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '봉투 단가 관리',
|
||||
@@ -50,6 +51,7 @@ class BagPrice extends BaseController
|
||||
'list' => $list,
|
||||
'startDate' => $startDate,
|
||||
'endDate' => $endDate,
|
||||
'pager' => $pager,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -30,11 +30,12 @@ class BagReceiving extends BaseController
|
||||
if ($startDate) $builder->where('br_receive_date >=', $startDate);
|
||||
if ($endDate) $builder->where('br_receive_date <=', $endDate);
|
||||
|
||||
$list = $builder->orderBy('br_receive_date', 'DESC')->orderBy('br_idx', 'DESC')->findAll();
|
||||
$list = $builder->orderBy('br_receive_date', 'DESC')->orderBy('br_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->recvModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '입고 현황',
|
||||
'content' => view('admin/bag_receiving/index', compact('list', 'startDate', 'endDate')),
|
||||
'content' => view('admin/bag_receiving/index', compact('list', 'startDate', 'endDate', 'pager')),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,14 +33,56 @@ class BagSale extends BaseController
|
||||
if ($endDate) $builder->where('bs_sale_date <=', $endDate);
|
||||
if ($type) $builder->where('bs_type', $type);
|
||||
|
||||
$list = $builder->orderBy('bs_sale_date', 'DESC')->orderBy('bs_idx', 'DESC')->findAll();
|
||||
$list = $builder->orderBy('bs_sale_date', 'DESC')->orderBy('bs_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->saleModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '판매/반품 관리',
|
||||
'content' => view('admin/bag_sale/index', compact('list', 'startDate', 'endDate', 'type')),
|
||||
'content' => view('admin/bag_sale/index', compact('list', 'startDate', 'endDate', 'type', 'pager')),
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
helper(['admin', 'export']);
|
||||
$lgIdx = admin_effective_lg_idx();
|
||||
if (!$lgIdx) {
|
||||
return redirect()->to(site_url('admin/bag-sales'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$builder = $this->saleModel->where('bs_lg_idx', $lgIdx);
|
||||
$startDate = $this->request->getGet('start_date');
|
||||
$endDate = $this->request->getGet('end_date');
|
||||
$type = $this->request->getGet('type');
|
||||
if ($startDate) $builder->where('bs_sale_date >=', $startDate);
|
||||
if ($endDate) $builder->where('bs_sale_date <=', $endDate);
|
||||
if ($type) $builder->where('bs_type', $type);
|
||||
|
||||
$list = $builder->orderBy('bs_sale_date', 'DESC')->orderBy('bs_idx', 'DESC')->findAll();
|
||||
|
||||
$typeMap = ['sale' => '판매', 'return' => '반품', 'cancel' => '취소'];
|
||||
$rows = [];
|
||||
foreach ($list as $row) {
|
||||
$rows[] = [
|
||||
$row->bs_idx,
|
||||
$row->bs_ds_name,
|
||||
$row->bs_sale_date,
|
||||
$row->bs_bag_code,
|
||||
$row->bs_bag_name,
|
||||
(int) $row->bs_qty,
|
||||
(int) $row->bs_unit_price,
|
||||
(int) $row->bs_amount,
|
||||
$typeMap[$row->bs_type] ?? $row->bs_type,
|
||||
];
|
||||
}
|
||||
|
||||
export_csv(
|
||||
'판매반품_' . date('Ymd') . '.csv',
|
||||
['번호', '판매소', '판매일', '봉투코드', '봉투명', '수량', '단가', '금액', '구분'],
|
||||
$rows
|
||||
);
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
helper('admin');
|
||||
|
||||
@@ -24,13 +24,15 @@ class CodeDetail extends BaseController
|
||||
return redirect()->to(site_url('admin/code-kinds'))->with('error', '코드 종류를 찾을 수 없습니다.');
|
||||
}
|
||||
|
||||
$list = $this->detailModel->getByKind($ckIdx);
|
||||
$list = $this->detailModel->where('cd_ck_idx', $ckIdx)->orderBy('cd_sort', 'ASC')->paginate(20);
|
||||
$pager = $this->detailModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '세부코드 관리 — ' . $kind->ck_name . ' (' . $kind->ck_code . ')',
|
||||
'content' => view('admin/code_detail/index', [
|
||||
'kind' => $kind,
|
||||
'list' => $list,
|
||||
'pager' => $pager,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,8 @@ class CodeKind extends BaseController
|
||||
|
||||
public function index()
|
||||
{
|
||||
$list = $this->kindModel->orderBy('ck_code', 'ASC')->findAll();
|
||||
$list = $this->kindModel->orderBy('ck_code', 'ASC')->paginate(20);
|
||||
$pager = $this->kindModel->pager;
|
||||
|
||||
// 세부코드 수 매핑
|
||||
$detailModel = model(CodeDetailModel::class);
|
||||
@@ -32,6 +33,7 @@ class CodeKind extends BaseController
|
||||
'content' => view('admin/code_kind/index', [
|
||||
'list' => $list,
|
||||
'countMap' => $countMap,
|
||||
'pager' => $pager,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -22,11 +22,12 @@ class Company extends BaseController
|
||||
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$list = $this->model->where('cp_lg_idx', $lgIdx)->orderBy('cp_idx', 'DESC')->findAll();
|
||||
$list = $this->model->where('cp_lg_idx', $lgIdx)->orderBy('cp_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->model->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '업체 관리',
|
||||
'content' => view('admin/company/index', ['list' => $list]),
|
||||
'content' => view('admin/company/index', ['list' => $list, 'pager' => $pager]),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,8 @@ class DesignatedShop extends BaseController
|
||||
$list = $this->shopModel
|
||||
->where('ds_lg_idx', $lgIdx)
|
||||
->orderBy('ds_idx', 'DESC')
|
||||
->findAll();
|
||||
->paginate(20);
|
||||
$pager = $this->shopModel->pager;
|
||||
|
||||
// 지자체 이름 매핑용
|
||||
$lgMap = [];
|
||||
@@ -59,10 +60,45 @@ class DesignatedShop extends BaseController
|
||||
'content' => view('admin/designated_shop/index', [
|
||||
'list' => $list,
|
||||
'lgMap' => $lgMap,
|
||||
'pager' => $pager,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function export()
|
||||
{
|
||||
helper(['admin', 'export']);
|
||||
$lgIdx = admin_effective_lg_idx();
|
||||
if (!$lgIdx) {
|
||||
return redirect()->to(site_url('admin/designated-shops'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$list = $this->shopModel->where('ds_lg_idx', $lgIdx)->orderBy('ds_idx', 'DESC')->findAll();
|
||||
|
||||
$rows = [];
|
||||
foreach ($list as $row) {
|
||||
$stateMap = [1 => '정상', 2 => '폐업', 3 => '직권해지'];
|
||||
$rows[] = [
|
||||
$row->ds_idx,
|
||||
$row->ds_shop_no,
|
||||
$row->ds_name,
|
||||
$row->ds_rep_name,
|
||||
$row->ds_biz_no,
|
||||
$row->ds_va_number,
|
||||
$row->ds_tel ?? '',
|
||||
$row->ds_addr ?? '',
|
||||
$stateMap[(int) $row->ds_state] ?? '',
|
||||
$row->ds_regdate ?? '',
|
||||
];
|
||||
}
|
||||
|
||||
export_csv(
|
||||
'지정판매소_' . date('Ymd') . '.csv',
|
||||
['번호', '판매소번호', '상호명', '대표자', '사업자번호', '가상계좌', '전화번호', '주소', '상태', '등록일'],
|
||||
$rows
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 지정판매소 등록 폼 (효과 지자체 기준)
|
||||
*/
|
||||
|
||||
@@ -30,11 +30,12 @@ class FreeRecipient extends BaseController
|
||||
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$list = $this->model->where('fr_lg_idx', $lgIdx)->orderBy('fr_idx', 'DESC')->findAll();
|
||||
$list = $this->model->where('fr_lg_idx', $lgIdx)->orderBy('fr_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->model->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '무료용 대상자 관리',
|
||||
'content' => view('admin/free_recipient/index', ['list' => $list]),
|
||||
'content' => view('admin/free_recipient/index', ['list' => $list, 'pager' => $pager]),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,11 +32,12 @@ class LocalGovernment extends BaseController
|
||||
->with('error', '지자체 관리는 상위 관리자만 접근할 수 있습니다.');
|
||||
}
|
||||
|
||||
$list = $this->lgModel->orderBy('lg_idx', 'DESC')->findAll();
|
||||
$list = $this->lgModel->orderBy('lg_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->lgModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '지자체 관리',
|
||||
'content' => view('admin/local_government/index', ['list' => $list]),
|
||||
'content' => view('admin/local_government/index', ['list' => $list, 'pager' => $pager]),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,11 +30,12 @@ class Manager extends BaseController
|
||||
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$list = $this->model->where('mg_lg_idx', $lgIdx)->orderBy('mg_idx', 'DESC')->findAll();
|
||||
$list = $this->model->where('mg_lg_idx', $lgIdx)->orderBy('mg_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->model->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '담당자 관리',
|
||||
'content' => view('admin/manager/index', ['list' => $list]),
|
||||
'content' => view('admin/manager/index', ['list' => $list, 'pager' => $pager]),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,12 +38,13 @@ class PackagingUnit extends BaseController
|
||||
$builder->groupStart()->where('pu_end_date IS NULL')->orWhere('pu_end_date <=', $endDate)->groupEnd();
|
||||
}
|
||||
|
||||
$list = $builder->orderBy('pu_bag_code', 'ASC')->orderBy('pu_start_date', 'DESC')->findAll();
|
||||
$list = $builder->orderBy('pu_bag_code', 'ASC')->orderBy('pu_start_date', 'DESC')->paginate(20);
|
||||
$pager = $this->unitModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '포장 단위 관리',
|
||||
'content' => view('admin/packaging_unit/index', [
|
||||
'list' => $list, 'startDate' => $startDate, 'endDate' => $endDate,
|
||||
'list' => $list, 'startDate' => $startDate, 'endDate' => $endDate, 'pager' => $pager,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -22,11 +22,12 @@ class SalesAgency extends BaseController
|
||||
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
|
||||
}
|
||||
|
||||
$list = $this->model->where('sa_lg_idx', $lgIdx)->orderBy('sa_idx', 'DESC')->findAll();
|
||||
$list = $this->model->where('sa_lg_idx', $lgIdx)->orderBy('sa_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->model->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '판매 대행소 관리',
|
||||
'content' => view('admin/sales_agency/index', ['list' => $list]),
|
||||
'content' => view('admin/sales_agency/index', ['list' => $list, 'pager' => $pager]),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -34,11 +34,12 @@ class ShopOrder extends BaseController
|
||||
if ($startDate) $builder->where('so_delivery_date >=', $startDate);
|
||||
if ($endDate) $builder->where('so_delivery_date <=', $endDate);
|
||||
|
||||
$list = $builder->orderBy('so_idx', 'DESC')->findAll();
|
||||
$list = $builder->orderBy('so_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->orderModel->pager;
|
||||
|
||||
return view('admin/layout', [
|
||||
'title' => '주문 접수 관리',
|
||||
'content' => view('admin/shop_order/index', compact('list', 'startDate', 'endDate')),
|
||||
'content' => view('admin/shop_order/index', compact('list', 'startDate', 'endDate', 'pager')),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,8 @@ class User extends BaseController
|
||||
*/
|
||||
public function index(): string
|
||||
{
|
||||
$list = $this->memberModel->orderBy('mb_idx', 'DESC')->findAll();
|
||||
$list = $this->memberModel->orderBy('mb_idx', 'DESC')->paginate(20);
|
||||
$pager = $this->memberModel->pager;
|
||||
$approvalMap = [];
|
||||
try {
|
||||
$memberIds = array_map(static fn ($row) => (int) $row->mb_idx, $list);
|
||||
@@ -56,6 +57,7 @@ class User extends BaseController
|
||||
'list' => $list,
|
||||
'roles' => $this->roles,
|
||||
'approvalMap' => $approvalMap,
|
||||
'pager' => $pager,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -73,7 +73,8 @@ class Bag extends BaseController
|
||||
$orderBuilder = model(BagOrderModel::class)->where('bo_lg_idx', $lgIdx);
|
||||
if ($startDate) $orderBuilder->where('bo_order_date >=', $startDate);
|
||||
if ($endDate) $orderBuilder->where('bo_order_date <=', $endDate);
|
||||
$data['orders'] = $orderBuilder->orderBy('bo_order_date', 'DESC')->findAll();
|
||||
$data['orders'] = $orderBuilder->orderBy('bo_order_date', 'DESC')->paginate(20, 'orders');
|
||||
$data['orderPager'] = model(BagOrderModel::class)->pager;
|
||||
|
||||
// 발주별 품목 합계
|
||||
$itemSummary = [];
|
||||
@@ -93,7 +94,8 @@ class Bag extends BaseController
|
||||
$recvBuilder = model(BagReceivingModel::class)->where('br_lg_idx', $lgIdx);
|
||||
if ($startDate) $recvBuilder->where('br_receive_date >=', $startDate);
|
||||
if ($endDate) $recvBuilder->where('br_receive_date <=', $endDate);
|
||||
$data['receivings'] = $recvBuilder->orderBy('br_receive_date', 'DESC')->findAll();
|
||||
$data['receivings'] = $recvBuilder->orderBy('br_receive_date', 'DESC')->paginate(20, 'receivings');
|
||||
$data['recvPager'] = model(BagReceivingModel::class)->pager;
|
||||
}
|
||||
|
||||
return $this->render('발주 입고 관리', 'bag/purchase_inbound', $data);
|
||||
@@ -116,7 +118,8 @@ class Bag extends BaseController
|
||||
$builder = model(BagIssueModel::class)->where('bi2_lg_idx', $lgIdx);
|
||||
if ($startDate) $builder->where('bi2_issue_date >=', $startDate);
|
||||
if ($endDate) $builder->where('bi2_issue_date <=', $endDate);
|
||||
$data['list'] = $builder->orderBy('bi2_issue_date', 'DESC')->findAll();
|
||||
$data['list'] = $builder->orderBy('bi2_issue_date', 'DESC')->paginate(20);
|
||||
$data['pager'] = model(BagIssueModel::class)->pager;
|
||||
}
|
||||
|
||||
return $this->render('불출 관리', 'bag/issue', $data);
|
||||
@@ -131,7 +134,9 @@ class Bag extends BaseController
|
||||
$data = ['list' => []];
|
||||
|
||||
if ($lgIdx) {
|
||||
$data['list'] = model(BagInventoryModel::class)->where('bi_lg_idx', $lgIdx)->orderBy('bi_bag_code', 'ASC')->findAll();
|
||||
$invModel = model(BagInventoryModel::class);
|
||||
$data['list'] = $invModel->where('bi_lg_idx', $lgIdx)->orderBy('bi_bag_code', 'ASC')->paginate(20);
|
||||
$data['pager'] = $invModel->pager;
|
||||
}
|
||||
|
||||
return $this->render('재고 관리', 'bag/inventory', $data);
|
||||
@@ -155,13 +160,15 @@ class Bag extends BaseController
|
||||
$saleBuilder = model(BagSaleModel::class)->where('bs_lg_idx', $lgIdx);
|
||||
if ($startDate) $saleBuilder->where('bs_sale_date >=', $startDate);
|
||||
if ($endDate) $saleBuilder->where('bs_sale_date <=', $endDate);
|
||||
$data['salesList'] = $saleBuilder->orderBy('bs_sale_date', 'DESC')->findAll();
|
||||
$data['salesList'] = $saleBuilder->orderBy('bs_sale_date', 'DESC')->paginate(20, 'sales');
|
||||
$data['salesPager'] = model(BagSaleModel::class)->pager;
|
||||
|
||||
// 주문 접수
|
||||
$orderBuilder = model(ShopOrderModel::class)->where('so_lg_idx', $lgIdx);
|
||||
if ($startDate) $orderBuilder->where('so_delivery_date >=', $startDate);
|
||||
if ($endDate) $orderBuilder->where('so_delivery_date <=', $endDate);
|
||||
$data['orderList'] = $orderBuilder->orderBy('so_idx', 'DESC')->findAll();
|
||||
$data['orderList'] = $orderBuilder->orderBy('so_idx', 'DESC')->paginate(20, 'shoporders');
|
||||
$data['orderPager'] = model(ShopOrderModel::class)->pager;
|
||||
}
|
||||
|
||||
return $this->render('판매 관리', 'bag/sales', $data);
|
||||
@@ -184,7 +191,8 @@ class Bag extends BaseController
|
||||
$builder = model(BagSaleModel::class)->where('bs_lg_idx', $lgIdx)->where('bs_type', 'sale');
|
||||
if ($startDate) $builder->where('bs_sale_date >=', $startDate);
|
||||
if ($endDate) $builder->where('bs_sale_date <=', $endDate);
|
||||
$data['result'] = $builder->orderBy('bs_sale_date', 'DESC')->findAll();
|
||||
$data['result'] = $builder->orderBy('bs_sale_date', 'DESC')->paginate(20);
|
||||
$data['pager'] = model(BagSaleModel::class)->pager;
|
||||
}
|
||||
|
||||
return $this->render('판매 현황', 'bag/sales_stats', $data);
|
||||
|
||||
69
app/Helpers/export_helper.php
Normal file
69
app/Helpers/export_helper.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* CSV 엑셀 내보내기 헬퍼
|
||||
*
|
||||
* UTF-8 BOM 포함으로 한글 엑셀 호환성 보장
|
||||
*/
|
||||
|
||||
if (! function_exists('export_csv')) {
|
||||
/**
|
||||
* CSV 파일을 브라우저로 다운로드 전송
|
||||
*
|
||||
* @param string $filename 파일명 (확장자 포함, 예: 'export.csv')
|
||||
* @param string[] $headers 컬럼 헤더 배열
|
||||
* @param array $rows 데이터 행 배열 (각 행은 배열)
|
||||
*/
|
||||
function export_csv(string $filename, array $headers, array $rows): void
|
||||
{
|
||||
// 파일명에 .csv 확장자 보장
|
||||
if (! str_ends_with($filename, '.csv')) {
|
||||
$filename .= '.csv';
|
||||
}
|
||||
|
||||
$response = service('response');
|
||||
$response->setHeader('Content-Type', 'text/csv; charset=UTF-8');
|
||||
$response->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"');
|
||||
$response->setHeader('Pragma', 'no-cache');
|
||||
$response->setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
|
||||
|
||||
// UTF-8 BOM (한글 엑셀 호환)
|
||||
$output = "\xEF\xBB\xBF";
|
||||
|
||||
// 헤더 행
|
||||
$output .= csv_encode_row($headers);
|
||||
|
||||
// 데이터 행
|
||||
foreach ($rows as $row) {
|
||||
$output .= csv_encode_row(array_values((array) $row));
|
||||
}
|
||||
|
||||
$response->setBody($output);
|
||||
$response->send();
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('csv_encode_row')) {
|
||||
/**
|
||||
* 배열 한 행을 CSV 문자열로 변환
|
||||
*
|
||||
* @param array $fields
|
||||
* @return string
|
||||
*/
|
||||
function csv_encode_row(array $fields): string
|
||||
{
|
||||
$escaped = [];
|
||||
foreach ($fields as $field) {
|
||||
$val = (string) ($field ?? '');
|
||||
// 쌍따옴표 이스케이프 및 감싸기
|
||||
if (str_contains($val, '"') || str_contains($val, ',') || str_contains($val, "\n") || str_contains($val, "\r")) {
|
||||
$val = '"' . str_replace('"', '""', $val) . '"';
|
||||
}
|
||||
$escaped[] = $val;
|
||||
}
|
||||
return implode(',', $escaped) . "\r\n";
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,9 @@
|
||||
<?= view('components/print_header', ['printTitle' => '권한 승인 대기']) ?>
|
||||
<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>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 p-4 mt-2">
|
||||
<form method="get" action="<?= base_url('admin/access/approvals') ?>" class="mb-4 flex flex-wrap items-center gap-2 text-sm">
|
||||
@@ -64,3 +68,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<?= view('components/print_header', ['printTitle' => '로그인 이력']) ?>
|
||||
<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">
|
||||
<div class="flex items-center gap-4 text-sm">
|
||||
@@ -9,6 +10,7 @@
|
||||
<button type="submit" 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">조회</button>
|
||||
</form>
|
||||
</div>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
@@ -35,3 +37,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '재고 현황']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="<?= base_url('admin/bag-inventory/export') ?>" class="no-print border border-btn-excel-border text-btn-excel-text px-3 py-1 rounded-sm text-sm hover:bg-green-50 transition">엑셀저장</a>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -28,3 +35,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '무료용 불출 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/bag-issues/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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/bag-issues') ?>" class="flex flex-wrap items-center gap-2">
|
||||
@@ -58,3 +62,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
<?= view('components/print_header', ['printTitle' => '발주 현황']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="<?= base_url('admin/bag-orders/export') . '?' . http_build_query(array_filter(['start_date' => $startDate ?? '', 'end_date' => $endDate ?? '', 'status' => $status ?? ''])) ?>" class="no-print border border-btn-excel-border text-btn-excel-text px-3 py-1 rounded-sm text-sm hover:bg-green-50 transition">엑셀저장</a>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/bag-orders/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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/bag-orders') ?>" class="flex flex-wrap items-center gap-2">
|
||||
@@ -73,3 +78,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '봉투 단가 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/bag-prices/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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/bag-prices') ?>" class="flex flex-wrap items-center gap-2">
|
||||
@@ -58,3 +62,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '입고 현황']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/bag-receivings/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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/bag-receivings') ?>" class="flex flex-wrap items-center gap-2">
|
||||
@@ -47,3 +51,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
<?= view('components/print_header', ['printTitle' => '판매/반품 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="<?= base_url('admin/bag-sales/export') . '?' . http_build_query(array_filter(['start_date' => $startDate ?? '', 'end_date' => $endDate ?? '', 'type' => $type ?? ''])) ?>" class="no-print border border-btn-excel-border text-btn-excel-text px-3 py-1 rounded-sm text-sm hover:bg-green-50 transition">엑셀저장</a>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/bag-sales/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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/bag-sales') ?>" class="flex flex-wrap items-center gap-2">
|
||||
@@ -61,3 +66,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<?= view('components/print_header', ['printTitle' => '세부코드 관리 - ' . esc($kind->ck_name)]) ?>
|
||||
<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">
|
||||
<div class="flex items-center gap-2">
|
||||
@@ -5,8 +6,11 @@
|
||||
<span class="text-gray-400">|</span>
|
||||
<span class="text-sm font-bold text-gray-700">세부코드 — <?= esc($kind->ck_name) ?> (<?= esc($kind->ck_code) ?>)</span>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/code-details/' . (int) $kind->ck_idx . '/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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -42,3 +46,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '기본코드 종류 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/code-kinds/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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -41,3 +45,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '업체 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -45,3 +49,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
<?= view('components/print_header', ['printTitle' => '지정판매소 목록']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<a href="<?= base_url('admin/designated-shops/export') ?>" class="no-print border border-btn-excel-border text-btn-excel-text px-3 py-1 rounded-sm text-sm hover:bg-green-50 transition">엑셀저장</a>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/designated-shops/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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -44,4 +49,5 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '무료용 대상자 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -47,3 +51,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -70,6 +70,14 @@ tailwind.config = {
|
||||
.data-table tbody tr:hover td { background-color: #e6f7ff !important; }
|
||||
.main-content-area { height: calc(100vh - 170px); overflow: auto; }
|
||||
body { overflow: hidden; }
|
||||
@media print {
|
||||
header, footer, .no-print, nav { display: none !important; }
|
||||
.main-content-area { height: auto !important; overflow: visible !important; }
|
||||
body { overflow: visible !important; }
|
||||
.bg-title-bar { display: none !important; }
|
||||
.bg-control-panel { break-inside: avoid; }
|
||||
.print-header { display: block !important; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-gray-100 text-gray-800 flex flex-col h-screen font-sans antialiased select-none">
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '지자체 목록']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/local-governments/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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -40,4 +44,5 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '담당자 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -45,3 +49,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '포장 단위 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/packaging-units/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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/packaging-units') ?>" class="flex flex-wrap items-center gap-2">
|
||||
@@ -58,3 +62,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '판매 대행소 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -43,3 +47,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<?= view('components/print_header', ['printTitle' => '일계표']) ?>
|
||||
<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>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/reports/daily-summary') ?>" class="flex flex-wrap items-center gap-2">
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<?= view('components/print_header', ['printTitle' => '기간별 판매현황']) ?>
|
||||
<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>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/reports/period-sales') ?>" class="flex flex-wrap items-center gap-2">
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<?= view('components/print_header', ['printTitle' => '판매 대장']) ?>
|
||||
<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>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/reports/sales-ledger') ?>" class="flex flex-wrap items-center gap-2">
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<?= view('components/print_header', ['printTitle' => '봉투 수불 현황']) ?>
|
||||
<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>
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/reports/supply-demand') ?>" class="flex flex-wrap items-center gap-2">
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '주문 접수 관리']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/shop-orders/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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="p-2 bg-white border-b border-gray-200">
|
||||
<form method="GET" action="<?= base_url('admin/shop-orders') ?>" class="flex flex-wrap items-center gap-2">
|
||||
@@ -73,3 +77,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?= view('components/print_header', ['printTitle' => '회원 목록']) ?>
|
||||
<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>
|
||||
<div class="flex items-center gap-2">
|
||||
<button onclick="window.print()" class="no-print border border-btn-print-border text-gray-600 px-3 py-1 rounded-sm text-sm hover:bg-gray-50 transition">인쇄</button>
|
||||
<a href="<?= base_url('admin/users/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>
|
||||
</div>
|
||||
</section>
|
||||
<div class="border border-gray-300 overflow-auto mt-2">
|
||||
<table class="w-full data-table">
|
||||
@@ -53,3 +57,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php if (isset($pager)): ?><div class="mt-3"><?= $pager->links() ?></div><?php endif; ?>
|
||||
|
||||
@@ -52,6 +52,14 @@ tailwind.config = {
|
||||
.data-table tbody tr:hover td { background-color: #e6f7ff !important; }
|
||||
.main-content-area { height: calc(100vh - 130px); overflow: auto; }
|
||||
body { overflow: hidden; }
|
||||
@media print {
|
||||
header, footer, .no-print, nav { display: none !important; }
|
||||
.main-content-area { height: auto !important; overflow: visible !important; }
|
||||
body { overflow: visible !important; }
|
||||
.bg-title-bar { display: none !important; }
|
||||
.bg-control-panel { break-inside: avoid; }
|
||||
.print-header { display: block !important; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-gray-100 text-gray-800 flex flex-col h-screen font-sans antialiased select-none">
|
||||
|
||||
38
app/Views/components/pager.php
Normal file
38
app/Views/components/pager.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Custom Tailwind CSS Pagination View for CodeIgniter 4
|
||||
*
|
||||
* @var \CodeIgniter\Pager\PagerRenderer $pager
|
||||
*/
|
||||
|
||||
$pager->setSurroundCount(2);
|
||||
?>
|
||||
|
||||
<?php if ($pager->hasPreviousPage() || $pager->hasNextPage()): ?>
|
||||
<nav aria-label="Page navigation" class="flex items-center justify-center gap-1 mt-3 mb-2 no-print">
|
||||
<?php if ($pager->hasPreviousPage()): ?>
|
||||
<a href="<?= $pager->getFirst() ?>" class="px-2 py-1 text-xs border border-gray-300 rounded hover:bg-gray-100 text-gray-600" title="처음">«</a>
|
||||
<a href="<?= $pager->getPreviousPage() ?>" class="px-2 py-1 text-xs border border-gray-300 rounded hover:bg-gray-100 text-gray-600" title="이전">‹</a>
|
||||
<?php else: ?>
|
||||
<span class="px-2 py-1 text-xs border border-gray-200 rounded text-gray-300">«</span>
|
||||
<span class="px-2 py-1 text-xs border border-gray-200 rounded text-gray-300">‹</span>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php foreach ($pager->links() as $link): ?>
|
||||
<?php if ($link['active']): ?>
|
||||
<span class="px-3 py-1 text-xs border border-blue-600 rounded bg-blue-600 text-white font-bold"><?= $link['title'] ?></span>
|
||||
<?php else: ?>
|
||||
<a href="<?= $link['uri'] ?>" class="px-3 py-1 text-xs border border-gray-300 rounded hover:bg-gray-100 text-gray-700"><?= $link['title'] ?></a>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php if ($pager->hasNextPage()): ?>
|
||||
<a href="<?= $pager->getNextPage() ?>" class="px-2 py-1 text-xs border border-gray-300 rounded hover:bg-gray-100 text-gray-600" title="다음">›</a>
|
||||
<a href="<?= $pager->getLast() ?>" class="px-2 py-1 text-xs border border-gray-300 rounded hover:bg-gray-100 text-gray-600" title="마지막">»</a>
|
||||
<?php else: ?>
|
||||
<span class="px-2 py-1 text-xs border border-gray-200 rounded text-gray-300">›</span>
|
||||
<span class="px-2 py-1 text-xs border border-gray-200 rounded text-gray-300">»</span>
|
||||
<?php endif; ?>
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
55
app/Views/components/print_header.php
Normal file
55
app/Views/components/print_header.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
/**
|
||||
* 인쇄용 문서 헤더 컴포넌트
|
||||
*
|
||||
* 사용 변수:
|
||||
* $printTitle - 문서 제목 (필수)
|
||||
* $printLgName - 지자체명 (선택, 미지정 시 세션에서 조회)
|
||||
* $printDate - 날짜 (선택, 기본 오늘)
|
||||
*/
|
||||
|
||||
if (! isset($printLgName)) {
|
||||
helper('admin');
|
||||
$lgIdx = admin_effective_lg_idx();
|
||||
$printLgName = '';
|
||||
if ($lgIdx) {
|
||||
$lgRow = model(\App\Models\LocalGovernmentModel::class)->find($lgIdx);
|
||||
$printLgName = $lgRow ? $lgRow->lg_name : '';
|
||||
}
|
||||
}
|
||||
$printDate = $printDate ?? date('Y-m-d');
|
||||
$printTitle = $printTitle ?? '';
|
||||
?>
|
||||
|
||||
<div class="print-header" style="display:none;">
|
||||
<table style="width:100%; border-collapse:collapse; margin-bottom:10px;">
|
||||
<tr>
|
||||
<td style="width:60%; vertical-align:bottom;">
|
||||
<div style="font-size:12px; color:#666; margin-bottom:4px;"><?= esc($printLgName) ?></div>
|
||||
<div style="font-size:20px; font-weight:bold; letter-spacing:2px;"><?= esc($printTitle) ?></div>
|
||||
<div style="font-size:11px; color:#888; margin-top:4px;">출력일: <?= esc($printDate) ?></div>
|
||||
</td>
|
||||
<td style="width:40%; vertical-align:top;">
|
||||
<table style="border-collapse:collapse; float:right; font-size:11px;">
|
||||
<tr>
|
||||
<th style="border:1px solid #333; padding:4px 12px; background:#f0f0f0; text-align:center;">담당</th>
|
||||
<th style="border:1px solid #333; padding:4px 12px; background:#f0f0f0; text-align:center;">팀장</th>
|
||||
<th style="border:1px solid #333; padding:4px 12px; background:#f0f0f0; text-align:center;">과장</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #333; padding:8px 12px; height:40px; min-width:60px;"> </td>
|
||||
<td style="border:1px solid #333; padding:8px 12px; height:40px; min-width:60px;"> </td>
|
||||
<td style="border:1px solid #333; padding:8px 12px; height:40px; min-width:60px;"> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<hr style="border:1px solid #333; margin-bottom:10px;"/>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
@media print {
|
||||
.print-header { display: block !important; }
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user