diff --git a/app/Http/Controllers/Business/CourierAgreementSignatures.php b/app/Http/Controllers/Business/CourierAgreementSignatures.php index f62a789e..1547be58 100644 --- a/app/Http/Controllers/Business/CourierAgreementSignatures.php +++ b/app/Http/Controllers/Business/CourierAgreementSignatures.php @@ -283,6 +283,7 @@ class CourierAgreementSignatures extends Controller '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,account-proof,account-change', 'nullable', 'string', 'min:2', 'max:100'], + 'counterparty_organization_name' => ['required_if:document_type,account-proof,account-change', 'nullable', 'string', 'min:2', 'max:255'], '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'], @@ -369,7 +370,7 @@ class CourierAgreementSignatures extends Controller private function counterpartyOrganizationName(array $data): string { return match ($data['document_type']) { - 'account-proof', 'account-change' => trim((string) $data['courier_name']), + 'account-proof', 'account-change' => trim((string) $data['counterparty_organization_name']), 'shared-contract' => trim((string) (($data['shared_courier_names'][0] ?? null) ?: ($data['shared_courier_name'] ?? $data['courier_name']))), 'entity-change' => trim((string) ($data['former_company_name'] ?? $data['courier_name'])), 'authorization' => trim((string) ($data['principal_name'] ?? $data['courier_name'])), 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 861cbea9..46003042 100644 --- a/resources/views/business/pages/courier-payables/agreement-signing.blade.php +++ b/resources/views/business/pages/courier-payables/agreement-signing.blade.php @@ -1404,6 +1404,11 @@

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

+
+ + +

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

+
@@ -1882,6 +1887,8 @@ var subjectCodeInput = root.querySelector('[data-subject-code]'); var courierSelect = root.querySelector('[data-courier-select]'); var esignAccountInput = root.querySelector('input[name="esign_account"]'); + var accountOrganizationField = root.querySelector('[data-account-organization-field]'); + var accountOrganizationInput = root.querySelector('[data-account-organization-name]'); var operatorNameInput = root.querySelector('[data-account-operator-name]'); var operatorRequiredMark = root.querySelector('[data-account-operator-required]'); var sharedCourierList = root.querySelector('[data-shared-courier-list]'); @@ -2392,12 +2399,19 @@ var templateType = documentOption.value; var courier = fieldValue('[name="courier_name"]', '快递公司'); var companyName = fieldValue('[name="company_full_name"]', '待填写公司全称'); - var accountOperatorRequired = templateType === 'account-proof' || templateType === 'account-change'; + var accountAgreement = templateType === 'account-proof' || templateType === 'account-change'; + if (accountOrganizationField) { + accountOrganizationField.hidden = !accountAgreement; + } + if (accountOrganizationInput) { + accountOrganizationInput.disabled = !accountAgreement; + accountOrganizationInput.required = accountAgreement; + } if (operatorNameInput) { - operatorNameInput.required = accountOperatorRequired; + operatorNameInput.required = accountAgreement; } if (operatorRequiredMark) { - operatorRequiredMark.hidden = !accountOperatorRequired; + operatorRequiredMark.hidden = !accountAgreement; } activateTemplate(templateType); refreshSignerAccountLabels(templateType); @@ -2439,8 +2453,7 @@ setPreviewValue('proofAccountName', fieldValue('[name="account_proof_account_name"]', '待填写')); setPreviewValue('proofBankName', fieldValue('[name="account_proof_bank_name"]', '待填写')); setPreviewValue('proofBankAccount', fieldValue('[name="account_proof_bank_account"]', '待填写')); - var proofName = fieldValue('[name="account_proof_account_name"]', '待填写'); - setPreviewValue('proofSigner', proofName + (/(公司|有限公司|有限责任|企业|集团|合作社|事务所|中心|厂)/.test(proofName) ? ' 公司盖章' : ' 签字')); + setPreviewValue('proofSigner', '公司盖章'); } if (templateType === 'account-change') { @@ -2452,8 +2465,7 @@ setPreviewValue('newAccountName', fieldValue('[name="new_account_name"]', '待填写')); setPreviewValue('newBankName', fieldValue('[name="new_bank_name"]', '待填写')); setPreviewValue('newBankAccount', fieldValue('[name="new_bank_account"]', '待填写')); - var changeName = fieldValue('[name="new_account_name"]', '待填写'); - setPreviewValue('changeSigner', changeName + (/(公司|有限公司|有限责任|企业|集团|合作社|事务所|中心|厂)/.test(changeName) ? ' 公司盖章' : ' 签字')); + setPreviewValue('changeSigner', '公司盖章'); } if (templateType === 'entity-change') { diff --git a/tests/Feature/Business/AgreementSigningPageTest.php b/tests/Feature/Business/AgreementSigningPageTest.php index cf5778fc..0e7cb92a 100644 --- a/tests/Feature/Business/AgreementSigningPageTest.php +++ b/tests/Feature/Business/AgreementSigningPageTest.php @@ -74,8 +74,12 @@ class AgreementSigningPageTest extends FeatureTestCase ->assertSee("labels.secondary = '我方 E 签宝账号'", false) ->assertSee("labels.primary = '委托方 E 签宝账号'", false) ->assertSee("labels.secondary = '受托方 E 签宝账号'", false) + ->assertSeeText('对方签署企业全称') + ->assertSeeText('必须与对方 E 签宝企业认证名称一致') ->assertSeeText('对方 E 签宝实名认证姓名') ->assertSeeText('仅用于 E 签宝身份核验,不是收款人姓名') + ->assertSee("setPreviewValue('proofSigner', '公司盖章')", false) + ->assertSee("setPreviewValue('changeSigner', '公司盖章')", false) ->assertSeeText('合作合同统一使用我方账号 18052733960') ->assertSeeText('填写变量') ->assertSeeText('签署完成后自动归档') diff --git a/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php b/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php index 69ffeb1c..76e5d939 100644 --- a/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php +++ b/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php @@ -48,7 +48,7 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase $this->assertSame('TPL-ACCOUNT-CERT-V2', $signature->template_code); $this->assertSame(CourierAgreementSignature::STATUS_SIGNING, $signature->status); $this->assertSame('flow-agreement-001', $signature->esign_sign_flow_id); - $this->assertSame('新北中通', $signature->organization_name); + $this->assertSame('新北中通快递有限公司', $signature->organization_name); $this->assertSame('2026-09-21', $signature->payload['signature_date']); Storage::disk('uploads')->assertExists($signature->source_pdf_path); $this->assertSame('新北中通快递有限公司', $signature->payload['account_proof_account_name']); @@ -59,7 +59,7 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase } return data_get($request->data(), 'signers.0.signerType') === 1 - && data_get($request->data(), 'signers.0.orgSignerInfo.orgName') === '新北中通' + && data_get($request->data(), 'signers.0.orgSignerInfo.orgName') === '新北中通快递有限公司' && data_get($request->data(), 'signers.0.orgSignerInfo.transactorInfo.psnInfo.psnName') === '张经理'; }); @@ -88,7 +88,7 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase } return data_get($request->data(), 'signers.0.signerType') === 1 - && data_get($request->data(), 'signers.0.orgSignerInfo.orgName') === '新北中通' + && data_get($request->data(), 'signers.0.orgSignerInfo.orgName') === '新北中通快递有限公司' && data_get($request->data(), 'signers.0.orgSignerInfo.transactorInfo.psnInfo.psnName') === '张经理' && data_get($request->data(), 'signers.0.psnSignerInfo') === null; }); @@ -105,7 +105,7 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase ->assertRedirect(); $signature = CourierAgreementSignature::query()->firstOrFail(); - $this->assertSame('新北中通', $signature->organization_name); + $this->assertSame('新北中通快递有限公司', $signature->organization_name); $this->assertSame('李四', $signature->payload['new_account_name']); $this->assertSame('张经理', $signature->operator_name); @@ -115,7 +115,7 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase } return data_get($request->data(), 'signers.0.signerType') === 1 - && data_get($request->data(), 'signers.0.orgSignerInfo.orgName') === '新北中通' + && data_get($request->data(), 'signers.0.orgSignerInfo.orgName') === '新北中通快递有限公司' && data_get($request->data(), 'signers.0.orgSignerInfo.transactorInfo.psnInfo.psnName') === '张经理' && data_get($request->data(), 'signers.0.psnSignerInfo') === null; }); @@ -136,6 +136,21 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase Http::assertNothingSent(); } + public function test_account_change_requires_counterparty_esign_organization_name(): void + { + $this->fakeEsign(); + $payload = $this->accountChangePayload('request-missing-counterparty-organization'); + unset($payload['counterparty_organization_name']); + + $this->withExceptionHandling() + ->loginAs() + ->post(route('business.courier-agreement-signatures.store'), $payload) + ->assertSessionHasErrors('counterparty_organization_name'); + + $this->assertDatabaseCount('business_courier_agreement_signatures', 0); + Http::assertNothingSent(); + } + public function test_cooperation_contract_maps_party_variables_and_creates_two_signers(): void { $this->fakeEsign(); @@ -665,6 +680,7 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase 'signing_deadline' => now()->addDays(7)->toDateString(), 'esign_account' => '13800138000', 'operator_name' => '张经理', + 'counterparty_organization_name' => '新北中通快递有限公司', 'archive_mode' => 'auto', 'account_proof_effective_date' => now()->toDateString(), 'account_proof_account_name' => '新北中通快递有限公司', @@ -681,9 +697,11 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase 'document_type' => 'account-change', 'signing_subject' => $this->company->name, 'company_full_name' => $this->company->name, + 'signature_date' => '2026-09-21', 'signing_deadline' => now()->addDays(7)->toDateString(), 'esign_account' => '13800138000', 'operator_name' => '张经理', + 'counterparty_organization_name' => '新北中通快递有限公司', 'archive_mode' => 'auto', 'account_change_date' => now()->toDateString(), 'old_account_name' => '新北中通快递有限公司',