fix:전자서명 필드 위치 설정/복사 시 field_value 누락 수정

configureFields()와 copyFieldsFromContract()에서 기존 필드를
삭제 후 재생성할 때 field_value를 설정하지 않아 계약서 PDF에
서명자명, 날짜 등 기본값이 빠지는 문제 수정.
buildVariableMap()으로 변수 맵을 구성하여 값을 채우도록 개선.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
김보곤
2026-02-14 13:27:38 +09:00
parent 9cde5f56f0
commit 70bfccf5fb

View File

@@ -641,12 +641,22 @@ public function configureFields(Request $request, int $id): JsonResponse
]);
$tenantId = session('selected_tenant_id', 1);
$contract = EsignContract::forTenant($tenantId)->findOrFail($id);
$contract = EsignContract::forTenant($tenantId)->with('signers')->findOrFail($id);
// 변수 맵 구성 (field_variable → 실제 값 매핑)
$variableValues = $this->buildVariableMap($contract);
// 기존 필드 삭제 후 새로 생성
EsignSignField::where('contract_id', $contract->id)->delete();
foreach ($request->input('fields') as $i => $field) {
// field_variable이 있으면 변수 맵에서 값 조회
$fieldValue = null;
$fieldVariable = $field['field_variable'] ?? null;
if ($fieldVariable && isset($variableValues[$fieldVariable])) {
$fieldValue = $variableValues[$fieldVariable];
}
EsignSignField::create([
'tenant_id' => $tenantId,
'contract_id' => $contract->id,
@@ -658,9 +668,10 @@ public function configureFields(Request $request, int $id): JsonResponse
'height' => $field['height'],
'field_type' => $field['field_type'],
'field_label' => $field['field_label'] ?? null,
'field_variable' => $field['field_variable'] ?? null,
'field_variable' => $fieldVariable,
'font_size' => $field['font_size'] ?? null,
'text_align' => $field['text_align'] ?? 'L',
'field_value' => $fieldValue,
'is_required' => $field['is_required'] ?? true,
'sort_order' => $i,
]);
@@ -1347,7 +1358,10 @@ public function copyFieldsFromContract(Request $request, int $id, int $sourceId)
$targetSignerMap[$signer->sign_order] = $signer->id;
}
DB::transaction(function () use ($targetContract, $sourceContract, $tenantId, $sourceSignerOrderMap, $targetSignerMap) {
// 대상 계약 기준 변수 맵 구성
$variableValues = $this->buildVariableMap($targetContract);
DB::transaction(function () use ($targetContract, $sourceContract, $tenantId, $sourceSignerOrderMap, $targetSignerMap, $variableValues) {
// 기존 필드 삭제
EsignSignField::where('contract_id', $targetContract->id)->delete();
@@ -1357,6 +1371,12 @@ public function copyFieldsFromContract(Request $request, int $id, int $sourceId)
$targetSignerId = $signOrder ? ($targetSignerMap[$signOrder] ?? null) : null;
if (!$targetSignerId) continue;
// field_variable이 있으면 대상 계약의 변수 맵에서 값 조회
$fieldValue = null;
if ($field->field_variable && isset($variableValues[$field->field_variable])) {
$fieldValue = $variableValues[$field->field_variable];
}
EsignSignField::create([
'tenant_id' => $tenantId,
'contract_id' => $targetContract->id,
@@ -1370,6 +1390,7 @@ public function copyFieldsFromContract(Request $request, int $id, int $sourceId)
'field_label' => $field->field_label,
'field_variable' => $field->field_variable,
'font_size' => $field->font_size,
'field_value' => $fieldValue,
'is_required' => $field->is_required,
'sort_order' => $field->sort_order,
]);
@@ -1388,7 +1409,7 @@ public function copyFieldsFromContract(Request $request, int $id, int $sourceId)
/**
* 변수 해석 맵 구성 (시스템 변수 + 커스텀 변수)
*/
private function buildVariableMap(EsignContract $contract, EsignFieldTemplate $template): array
private function buildVariableMap(EsignContract $contract, ?EsignFieldTemplate $template = null): array
{
$map = [];