saleModel = model(BagSaleModel::class); } public function index() { helper('admin'); $lgIdx = admin_effective_lg_idx(); if (!$lgIdx) return redirect()->to(site_url('admin'))->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')->paginate(20); $pager = $this->saleModel->pager; return view('admin/layout', [ 'title' => '판매/반품 관리', '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'); $lgIdx = admin_effective_lg_idx(); if (!$lgIdx) return redirect()->to(site_url('admin/bag-sales'))->with('error', '지자체를 선택해 주세요.'); $shops = model(DesignatedShopModel::class)->where('ds_lg_idx', $lgIdx)->where('ds_state', 1)->findAll(); $kind = model(CodeKindModel::class)->where('ck_code', 'O')->first(); $bagCodes = $kind ? model(CodeDetailModel::class)->getByKind((int) $kind->ck_idx, true) : []; return view('admin/layout', [ 'title' => '판매 등록', 'content' => view('admin/bag_sale/create', compact('shops', 'bagCodes')), ]); } public function store() { helper('admin'); $lgIdx = admin_effective_lg_idx(); $rules = [ 'bs_ds_idx' => 'required|is_natural_no_zero', 'bs_bag_code' => 'required|max_length[50]', 'bs_qty' => 'required|is_natural_no_zero', 'bs_sale_date' => 'required|valid_date[Y-m-d]', 'bs_type' => 'required|in_list[sale,return]', ]; if (! $this->validate($rules)) { return redirect()->back()->withInput()->with('errors', $this->validator->getErrors()); } $dsIdx = (int) $this->request->getPost('bs_ds_idx'); $bagCode = $this->request->getPost('bs_bag_code'); $qty = (int) $this->request->getPost('bs_qty'); $type = $this->request->getPost('bs_type'); $shop = model(DesignatedShopModel::class)->find($dsIdx); $kindO = model(CodeKindModel::class)->where('ck_code', 'O')->first(); $detail = $kindO ? model(CodeDetailModel::class)->where('cd_ck_idx', $kindO->ck_idx)->where('cd_code', $bagCode)->first() : null; $price = model(BagPriceModel::class)->where('bp_lg_idx', $lgIdx)->where('bp_bag_code', $bagCode)->where('bp_state', 1)->first(); $unitPrice = $price ? (float) $price->bp_consumer : 0; $actualQty = ($type === 'return') ? -$qty : $qty; $db = \Config\Database::connect(); $db->transStart(); $saleData = [ 'bs_lg_idx' => $lgIdx, 'bs_ds_idx' => $dsIdx, 'bs_ds_name' => $shop ? $shop->ds_name : '', 'bs_sale_date' => $this->request->getPost('bs_sale_date'), 'bs_bag_code' => $bagCode, 'bs_bag_name' => $detail ? $detail->cd_name : '', 'bs_qty' => $actualQty, 'bs_unit_price'=> $unitPrice, 'bs_amount' => $unitPrice * abs($actualQty), 'bs_type' => $type, 'bs_regdate' => date('Y-m-d H:i:s'), ]; $this->saleModel->insert($saleData); $bsIdx = (int) $this->saleModel->getInsertID(); // CT-05: 감사 로그 helper('audit'); audit_log('create', 'bag_sale', $bsIdx, null, array_merge($saleData, ['bs_idx' => $bsIdx])); // 재고 감산(판매) / 가산(반품) model(BagInventoryModel::class)->adjustQty($lgIdx, $bagCode, $detail ? $detail->cd_name : '', -$actualQty); $db->transComplete(); $msg = ($type === 'sale') ? '판매 처리되었습니다.' : '반품 처리되었습니다.'; return redirect()->to(site_url('admin/bag-sales'))->with('success', $msg); } }