diff --git a/app/Http/Controllers/Business/CourierAgreementSignatures.php b/app/Http/Controllers/Business/CourierAgreementSignatures.php index b3ce5381..385548c9 100644 --- a/app/Http/Controllers/Business/CourierAgreementSignatures.php +++ b/app/Http/Controllers/Business/CourierAgreementSignatures.php @@ -56,7 +56,7 @@ class CourierAgreementSignatures extends Controller ]); } - if (in_array($requestedType, ['account-proof', 'account-change'], true) + if (in_array($requestedType, ['account-proof', 'account-change', 'entity-change', 'cooperation-contract', 'authorization'], true) && ! $request->filled('counterparty_signer_type')) { // Existing integrations omit this field and historically meant an // enterprise signer, so keep that behavior as the compatibility default. @@ -105,8 +105,45 @@ class CourierAgreementSignatures extends Controller $data['operator_name'] = trim((string) $data['counterparty_organization_name']); } } + if ($type === 'entity-change') { + $formerCompanyDeregistered = filter_var( + $data['entity_change_old_company_deregistered'] ?? false, + FILTER_VALIDATE_BOOLEAN, + ); + $data['entity_change_old_company_deregistered'] = $formerCompanyDeregistered; + $data['counterparty_signer_type'] = $formerCompanyDeregistered ? 'person' : 'organization'; + + if (blank($data['operator_name'] ?? null)) { + throw ValidationException::withMessages(['operator_name' => $formerCompanyDeregistered + ? '请填写原公司法人的 E 签宝实名认证姓名。' + : '请填写变更前主体签署人的 E 签宝实名认证姓名。']); + } + if ($formerCompanyDeregistered) { + $data['secondary_esign_account'] = null; + $data['secondary_operator_name'] = null; + } else { + if (blank($data['secondary_esign_account'] ?? null)) { + throw ValidationException::withMessages(['secondary_esign_account' => '普通主体变更需要填写变更后主体的 E 签宝账号。']); + } + if (blank($data['secondary_operator_name'] ?? null)) { + throw ValidationException::withMessages(['secondary_operator_name' => '请填写变更后主体签署人的 E 签宝实名认证姓名。']); + } + } + } if ($type === 'cooperation-contract') { - $companyNames = [trim($data['cooperation_party_a_name']), trim($data['cooperation_party_b_name'])]; + $data['counterparty_signer_type'] = $data['counterparty_signer_type'] ?? 'organization'; + if ($data['counterparty_signer_type'] === 'person') { + $data['operator_name'] = trim((string) $data['cooperation_party_b_name']); + } elseif (blank($data['operator_name'] ?? null)) { + throw ValidationException::withMessages(['operator_name' => '请填写快递方企业经办人的 E 签宝实名认证姓名。']); + } + if (blank($data['secondary_operator_name'] ?? null)) { + throw ValidationException::withMessages(['secondary_operator_name' => '请填写我方 E 签宝账号绑定的实名认证姓名。']); + } + $companyNames = [trim($data['cooperation_party_a_name'])]; + if ($data['counterparty_signer_type'] === 'organization') { + $companyNames[] = trim($data['cooperation_party_b_name']); + } foreach (['operator_name' => '快递方', 'secondary_operator_name' => '我方'] as $field => $party) { $data[$field] = trim($data[$field]); if (in_array($data[$field], $companyNames, true)) { @@ -116,6 +153,20 @@ class CourierAgreementSignatures extends Controller } } } + if ($type === 'authorization') { + $data['counterparty_signer_type'] = $data['counterparty_signer_type'] ?? 'organization'; + $data['secondary_signer_type'] = $data['secondary_signer_type'] ?? 'organization'; + if ($data['counterparty_signer_type'] === 'person') { + $data['operator_name'] = trim((string) $data['principal_name']); + } elseif (blank($data['operator_name'] ?? null)) { + throw ValidationException::withMessages(['operator_name' => '请填写委托方企业经办人的 E 签宝实名认证姓名。']); + } + if ($data['secondary_signer_type'] === 'person') { + $data['secondary_operator_name'] = trim((string) $data['trustee_name']); + } elseif (blank($data['secondary_operator_name'] ?? null)) { + throw ValidationException::withMessages(['secondary_operator_name' => '请填写受托方企业经办人的 E 签宝实名认证姓名。']); + } + } $this->validateEsignAccount($data['esign_account'], 'esign_account'); if (! empty($data['secondary_esign_account'])) { $this->validateEsignAccount($data['secondary_esign_account'], 'secondary_esign_account'); @@ -318,11 +369,13 @@ class CourierAgreementSignatures extends Controller 'signature_date' => ['required', 'date'], 'signing_deadline' => $date, 'esign_account' => ['required', 'string', 'max:255'], - 'secondary_esign_account' => ['required_if:document_type,entity-change,cooperation-contract,authorization', 'nullable', 'string', 'max:255'], - 'operator_name' => ['required_if:document_type,cooperation-contract,shared-contract', 'nullable', 'string', 'min:2', 'max:100'], - 'secondary_operator_name' => ['required_if:document_type,cooperation-contract', 'nullable', 'string', 'min:2', 'max:100'], + 'secondary_esign_account' => ['required_if:document_type,cooperation-contract,authorization', 'nullable', 'string', 'max:255'], + 'secondary_operator_name' => ['nullable', 'string', 'min:2', 'max:100'], + 'operator_name' => ['required_if:document_type,shared-contract', 'nullable', 'string', 'min:2', 'max:100'], 'counterparty_organization_name' => ['required_if:document_type,account-proof,account-change', 'nullable', 'string', 'min:2', 'max:255'], - 'counterparty_signer_type' => ['required_if:document_type,account-proof,account-change', 'nullable', 'in:organization,person'], + 'counterparty_signer_type' => ['required_if:document_type,account-proof,account-change,entity-change,cooperation-contract,authorization', 'nullable', 'in:organization,person'], + 'secondary_signer_type' => ['nullable', 'in:organization,person'], + 'entity_change_old_company_deregistered' => ['nullable', 'boolean'], 'archive_mode' => ['required', 'in:auto,manual'], 'account_proof_effective_date' => ['required_if:document_type,account-proof', 'date'], 'account_proof_account_name' => ['required_if:document_type,account-proof', 'string', 'max:255'], @@ -371,6 +424,10 @@ class CourierAgreementSignatures extends Controller $payload = array_intersect_key($data, array_flip($allowed)); unset($payload['esign_account'], $payload['idempotency_key'], $payload['operator_name']); $payload['authorization_items'] = array_values(array_map('strval', $data['authorization_items'] ?? [])); + if (($data['document_type'] ?? null) === 'entity-change') { + $payload['former_legal_representative'] = trim((string) ($data['operator_name'] ?? '')); + $payload['entity_proof_date'] = $data['signature_date'] ?? null; + } return $payload; } diff --git a/app/Support/CourierAgreementSignatureService.php b/app/Support/CourierAgreementSignatureService.php index 7084ad2a..8bfcc5df 100644 --- a/app/Support/CourierAgreementSignatureService.php +++ b/app/Support/CourierAgreementSignatureService.php @@ -319,6 +319,7 @@ final class CourierAgreementSignatureService ]; if ($signature->document_type === 'cooperation-contract') { + $counterpartyIsPerson = ($payload['counterparty_signer_type'] ?? 'organization') === 'person'; return [ [ 'signer_type' => 1, @@ -327,8 +328,8 @@ final class CourierAgreementSignatureService 'operator_account' => $payload['secondary_esign_account'] ?? $signature->operator_account, ], [ - 'signer_type' => 1, - 'organization_name' => $payload['cooperation_party_b_name'] ?? $signature->courier_name, + 'signer_type' => $counterpartyIsPerson ? 0 : 1, + 'organization_name' => $counterpartyIsPerson ? null : ($payload['cooperation_party_b_name'] ?? $signature->courier_name), 'operator_name' => $signature->operator_name, 'operator_account' => $signature->operator_account, ], @@ -336,27 +337,44 @@ final class CourierAgreementSignatureService } if ($signature->document_type === 'entity-change') { + $formerCompanyDeregistered = filter_var( + $payload['entity_change_old_company_deregistered'] ?? false, + FILTER_VALIDATE_BOOLEAN, + ); + if ($formerCompanyDeregistered || ($payload['counterparty_signer_type'] ?? 'organization') === 'person') { + return [[ + 'signer_type' => 0, + 'organization_name' => null, + 'operator_name' => $signature->operator_name, + 'operator_account' => $signature->operator_account, + ]]; + } + return [ array_merge($primary, ['organization_name' => $payload['former_company_name'] ?? $signature->organization_name]), [ 'signer_type' => 1, 'organization_name' => $payload['changed_company_name'] ?? $signature->organization_name, - 'operator_name' => $payload['changed_company_name'] ?? $signature->courier_name, + 'operator_name' => $payload['secondary_operator_name'] ?? $signature->operator_name, 'operator_account' => $payload['secondary_esign_account'] ?? $signature->operator_account, ], ]; } if ($signature->document_type === 'authorization') { + $principalIsPerson = ($payload['counterparty_signer_type'] ?? 'organization') === 'person'; + $trusteeIsPerson = ($payload['secondary_signer_type'] ?? 'organization') === 'person'; return [ - array_merge($primary, [ - 'organization_name' => $payload['principal_name'] ?? $signature->organization_name, - 'operator_name' => $payload['principal_name'] ?? $signature->operator_name, - ]), [ - 'signer_type' => 1, - 'organization_name' => $payload['trustee_name'] ?? $signature->organization_name, - 'operator_name' => $payload['trustee_name'] ?? $signature->courier_name, + 'signer_type' => $principalIsPerson ? 0 : 1, + 'organization_name' => $principalIsPerson ? null : ($payload['principal_name'] ?? $signature->organization_name), + 'operator_name' => $signature->operator_name, + 'operator_account' => $signature->operator_account, + ], + [ + 'signer_type' => $trusteeIsPerson ? 0 : 1, + 'organization_name' => $trusteeIsPerson ? null : ($payload['trustee_name'] ?? $signature->organization_name), + 'operator_name' => $payload['secondary_operator_name'], 'operator_account' => $payload['secondary_esign_account'] ?? $signature->operator_account, ], ]; diff --git a/resources/views/business/pages/courier-payables/agreement-signing.blade.php b/resources/views/business/pages/courier-payables/agreement-signing.blade.php index 629229a6..1438432d 100644 --- a/resources/views/business/pages/courier-payables/agreement-signing.blade.php +++ b/resources/views/business/pages/courier-payables/agreement-signing.blade.php @@ -1495,10 +1495,10 @@

选择快递公司后自动带出工作平台的“电子签章经办人”(dzqzjbr);如资料未维护,可手工填写对方在 E 签宝实名绑定的手机号或邮箱。

- 对方签署主体类型 + 对方签署主体类型
- - + +
@@ -1506,8 +1506,8 @@

必须与对方 E 签宝企业认证名称一致;这是签署主体,不要求与银行卡持卡人姓名一致。

-
- +
+

仅用于 E 签宝身份核验,不是收款人姓名;收款人姓名请填写在下方账户资料中。

@@ -1528,10 +1528,10 @@

主体变更、合作合同和授权委托书需要双方分别实名签署;合作合同统一使用我方账号 {{ $agreementCooperationSecondaryEsignAccount }}。

- @@ -1596,6 +1596,9 @@