feat: enhance order sales inventory workflows

This commit is contained in:
taekyoungc
2026-04-08 00:20:09 +09:00
parent 984ddb403e
commit c2dc2fd38a
42 changed files with 764 additions and 459 deletions

View File

@@ -11,8 +11,6 @@ use App\Models\CompanyModel;
use App\Models\SalesAgencyModel;
use App\Models\CodeKindModel;
use App\Models\CodeDetailModel;
use Ramsey\Uuid\Uuid;
class BagOrder extends BaseController
{
private BagOrderModel $orderModel;
@@ -28,8 +26,8 @@ class BagOrder extends BaseController
{
helper('admin');
$lgIdx = admin_effective_lg_idx();
if (!$lgIdx) {
return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');
if (! $lgIdx) {
return redirect()->to(work_area_home_url())->with('error', '지자체를 선택해 주세요.');
}
$builder = $this->orderModel->where('bo_lg_idx', $lgIdx);
@@ -57,20 +55,19 @@ class BagOrder extends BaseController
// 제작업체/대행소 이름 매핑
$companyMap = []; $agencyMap = [];
foreach (model(CompanyModel::class)->where('cp_lg_idx', $lgIdx)->findAll() as $c) $companyMap[$c->cp_idx] = $c->cp_name;
foreach (model(SalesAgencyModel::class)->where('sa_lg_idx', $lgIdx)->findAll() as $a) $agencyMap[$a->sa_idx] = $a->sa_name;
foreach (model(SalesAgencyModel::class)->where('sa_lg_idx', $lgIdx)->orderForDisplay()->findAll() as $a) {
$agencyMap[$a->sa_idx] = '[' . ($a->sa_kind ?? '') . '] ' . ($a->sa_code ?? '') . ' — ' . ($a->sa_name ?? '');
}
return view('admin/layout', [
'title' => '발주 현황',
'content' => view('admin/bag_order/index', compact('list', 'itemSummary', 'companyMap', 'agencyMap', 'startDate', 'endDate', 'status', 'pager')),
]);
return $this->renderWorkPage('발주 현황', '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', '지자체를 선택해 주세요.');
if (! $lgIdx) {
return redirect()->to(mgmt_url('bag-orders'))->with('error', '지자체를 선택해 주세요.');
}
$builder = $this->orderModel->where('bo_lg_idx', $lgIdx);
@@ -115,20 +112,19 @@ class BagOrder extends BaseController
{
helper('admin');
$lgIdx = admin_effective_lg_idx();
if (!$lgIdx) return redirect()->to(site_url('admin/bag-orders'))->with('error', '지자체를 선택해 주세요.');
if (! $lgIdx) {
return redirect()->to(mgmt_url('bag-orders'))->with('error', '지자체를 선택해 주세요.');
}
// 봉투 종류 + 단가 + 포장단위
$kind = model(CodeKindModel::class)->where('ck_code', 'O')->first();
$bagCodes = $kind ? model(CodeDetailModel::class)->getByKind((int) $kind->ck_idx, true) : [];
$kind = model(CodeKindModel::class)->where('ck_code', 'O')->first();
$bagCodes = $kind ? model(CodeDetailModel::class)->getByKind((int) $kind->ck_idx, true, $lgIdx) : [];
$prices = model(BagPriceModel::class)->where('bp_lg_idx', $lgIdx)->where('bp_state', 1)->findAll();
$units = model(PackagingUnitModel::class)->where('pu_lg_idx', $lgIdx)->where('pu_state', 1)->findAll();
$companies = model(CompanyModel::class)->where('cp_lg_idx', $lgIdx)->where('cp_type', '제작업체')->where('cp_state', 1)->findAll();
$agencies = model(SalesAgencyModel::class)->where('sa_lg_idx', $lgIdx)->where('sa_state', 1)->findAll();
$agencies = model(SalesAgencyModel::class)->where('sa_lg_idx', $lgIdx)->orderForDisplay()->findAll();
return view('admin/layout', [
'title' => '발주 등록',
'content' => view('admin/bag_order/create', compact('bagCodes', 'prices', 'units', 'companies', 'agencies')),
]);
return $this->renderWorkPage('발주 등록', 'admin/bag_order/create', compact('bagCodes', 'prices', 'units', 'companies', 'agencies'));
}
public function store()
@@ -200,8 +196,8 @@ class BagOrder extends BaseController
$unitPrice = $price ? (float) $price->bp_order_price : 0;
// 봉투명
$kindO = model(CodeKindModel::class)->where('ck_code', 'O')->first();
$detail = $kindO ? model(CodeDetailModel::class)->where('cd_ck_idx', $kindO->ck_idx)->where('cd_code', $code)->first() : null;
$kindO = model(CodeKindModel::class)->where('ck_code', 'O')->first();
$detail = $kindO ? model(CodeDetailModel::class)->findResolvedByKindAndCode((int) $kindO->ck_idx, (string) $code, $lgIdx) : null;
$this->itemModel->insert([
'boi_bo_idx' => $boIdx,
@@ -216,7 +212,7 @@ class BagOrder extends BaseController
$db->transComplete();
return redirect()->to(site_url('admin/bag-orders'))->with('success', '발주가 등록되었습니다. LOT: ' . $lotNo);
return redirect()->to(mgmt_url('bag-orders'))->with('success', '발주가 등록되었습니다. LOT: ' . $lotNo);
}
public function detail(int $id)
@@ -224,7 +220,7 @@ class BagOrder extends BaseController
helper('admin');
$order = $this->orderModel->find($id);
if (!$order || (int) $order->bo_lg_idx !== admin_effective_lg_idx()) {
return redirect()->to(site_url('admin/bag-orders'))->with('error', '발주를 찾을 수 없습니다.');
return redirect()->to(mgmt_url('bag-orders'))->with('error', '발주를 찾을 수 없습니다.');
}
$items = $this->itemModel->where('boi_bo_idx', $id)->findAll();
@@ -237,13 +233,12 @@ class BagOrder extends BaseController
$agencyName = '';
if ($order->bo_agency_idx) {
$a = model(SalesAgencyModel::class)->find($order->bo_agency_idx);
$agencyName = $a ? $a->sa_name : '';
if ($a) {
$agencyName = '[' . ($a->sa_kind ?? '') . '] ' . ($a->sa_code ?? '') . ' — ' . ($a->sa_name ?? '');
}
}
return view('admin/layout', [
'title' => '발주 상세 — ' . $order->bo_lot_no,
'content' => view('admin/bag_order/detail', compact('order', 'items', 'companyName', 'agencyName')),
]);
return $this->renderWorkPage('발주 상세 — ' . $order->bo_lot_no, 'admin/bag_order/detail', compact('order', 'items', 'companyName', 'agencyName'));
}
public function cancel(int $id)
@@ -251,14 +246,15 @@ class BagOrder extends BaseController
helper('admin');
$order = $this->orderModel->find($id);
if (!$order || (int) $order->bo_lg_idx !== admin_effective_lg_idx()) {
return redirect()->to(site_url('admin/bag-orders'))->with('error', '발주를 찾을 수 없습니다.');
return redirect()->to(mgmt_url('bag-orders'))->with('error', '발주를 찾을 수 없습니다.');
}
$before = (array) $order;
$this->orderModel->update($id, ['bo_status' => 'cancelled', 'bo_moddate' => date('Y-m-d H:i:s')]);
helper('audit');
audit_log('update', 'bag_order', $id, $before, ['bo_status' => 'cancelled']);
return redirect()->to(site_url('admin/bag-orders'))->with('success', '발주가 취소되었습니다.');
return redirect()->to(mgmt_url('bag-orders'))->with('success', '발주가 취소되었습니다.');
}
public function delete(int $id)
@@ -266,13 +262,14 @@ class BagOrder extends BaseController
helper('admin');
$order = $this->orderModel->find($id);
if (!$order || (int) $order->bo_lg_idx !== admin_effective_lg_idx()) {
return redirect()->to(site_url('admin/bag-orders'))->with('error', '발주를 찾을 수 없습니다.');
return redirect()->to(mgmt_url('bag-orders'))->with('error', '발주를 찾을 수 없습니다.');
}
$before = (array) $order;
$this->orderModel->update($id, ['bo_status' => 'deleted', 'bo_moddate' => date('Y-m-d H:i:s')]);
helper('audit');
audit_log('delete', 'bag_order', $id, $before, ['bo_status' => 'deleted']);
return redirect()->to(site_url('admin/bag-orders'))->with('success', '발주가 삭제 처리되었습니다.');
return redirect()->to(mgmt_url('bag-orders'))->with('success', '발주가 삭제 처리되었습니다.');
}
}