fix(WEB): 수주 페이지 필드 매핑 및 제품-부품 트리 구조 개선

- ApiClient 인터페이스: representative → manager_name, contact_person 변경
- transformApiToFrontend: client.representative → client.manager_name 수정
- ApiOrderItem에 floor_code, symbol_code 필드 추가 (제품-부품 매핑)
- ApiOrder에 options 타입 정의 추가
- ApiQuote에 calculation_inputs 타입 정의 추가
- 수주 상세 페이지 제품-부품 트리 구조 UI 개선
This commit is contained in:
2026-01-16 21:59:06 +09:00
committed by hskwon
parent 0b94da0741
commit 7246ac003f
52 changed files with 1105 additions and 115 deletions

View File

@@ -4,6 +4,7 @@
use App\Helpers\ApiResponse;
use App\Http\Controllers\Controller;
use App\Http\Requests\Construction\ContractFromBiddingRequest;
use App\Http\Requests\Construction\ContractStoreRequest;
use App\Http\Requests\Construction\ContractUpdateRequest;
use App\Services\Construction\ContractService;
@@ -96,4 +97,14 @@ public function stageCounts(Request $request)
return $this->service->stageCounts($request->all());
}, __('message.contract.fetched'));
}
/**
* 입찰에서 계약 생성 (낙찰 → 계약 전환)
*/
public function storeFromBidding(ContractFromBiddingRequest $request, int $biddingId)
{
return ApiResponse::handle(function () use ($request, $biddingId) {
return $this->service->storeFromBidding($biddingId, $request->validated());
}, __('message.contract.created'));
}
}

View File

@@ -46,6 +46,7 @@ public function index(Request $request)
public function show(Request $request, $id)
{
$id = (int) $id;
return ApiResponse::handle(function () use ($request, $id) {
// item_type 선택적 (없으면 ID만으로 items 테이블에서 조회)
$itemType = $request->input('type') ?? $request->input('item_type');
@@ -146,6 +147,7 @@ public function stats(Request $request)
public function destroy(Request $request, $id)
{
$id = (int) $id;
return ApiResponse::handle(function () use ($request, $id) {
// item_type 필수 (동적 테이블 라우팅에 사용)
$itemType = strtoupper($request->input('type') ?? $request->input('item_type') ?? '');

View File

@@ -151,6 +151,17 @@ public function convertToOrder(int $id)
}, __('message.quote.converted'));
}
/**
* 입찰 전환
* 시공 견적을 입찰로 변환합니다.
*/
public function convertToBidding(int $id)
{
return ApiResponse::handle(function () use ($id) {
return $this->quoteService->convertToBidding($id);
}, __('message.bidding.converted'));
}
/**
* 견적번호 미리보기
*/

View File

@@ -137,4 +137,24 @@ public function updateItemStatus(Request $request, int $workOrderId, int $itemId
return $this->service->updateItemStatus($workOrderId, $itemId, $request->input('status'));
}, __('message.work_order.item_status_updated'));
}
/**
* 자재 목록 조회
*/
public function materials(int $id)
{
return ApiResponse::handle(function () use ($id) {
return $this->service->getMaterials($id);
}, __('message.work_order.materials_fetched'));
}
/**
* 자재 투입 등록
*/
public function registerMaterialInput(Request $request, int $id)
{
return ApiResponse::handle(function () use ($request, $id) {
return $this->service->registerMaterialInput($id, $request->input('material_ids', []));
}, __('message.work_order.material_input_registered'));
}
}