完善收款账户协议签署主体校验
This commit is contained in:
parent
de2ded20b4
commit
fac31e1900
@ -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'])),
|
||||
|
||||
@ -1404,6 +1404,11 @@
|
||||
<input class="agreement-control" id="agreement-esign-account" name="esign_account" type="text" value="" data-esign-account placeholder="手机号或邮箱" autocomplete="email" required>
|
||||
<p class="agreement-help">选择快递公司后自动带出工作平台的“电子签章经办人”(dzqzjbr);如资料未维护,可手工填写对方在 E 签宝实名绑定的手机号或邮箱。</p>
|
||||
</div>
|
||||
<div class="agreement-field" data-account-organization-field>
|
||||
<label for="agreement-counterparty-organization">对方签署企业全称 <span class="agreement-required" aria-hidden="true">*</span></label>
|
||||
<input class="agreement-control" id="agreement-counterparty-organization" name="counterparty_organization_name" type="text" placeholder="填写对方在 E 签宝认证的企业全称" autocomplete="organization" data-account-organization-name required>
|
||||
<p class="agreement-help">必须与对方 E 签宝企业认证名称一致;这是签署主体,不要求与银行卡持卡人姓名一致。</p>
|
||||
</div>
|
||||
<div class="agreement-field">
|
||||
<label for="agreement-operator-name">对方 E 签宝实名认证姓名 <span class="agreement-required" data-account-operator-required aria-hidden="true">*</span></label>
|
||||
<input class="agreement-control" id="agreement-operator-name" name="operator_name" type="text" placeholder="填写与 E 签宝账号匹配的实名姓名" autocomplete="name" data-account-operator-name required>
|
||||
@ -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') {
|
||||
|
||||
@ -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('签署完成后自动归档')
|
||||
|
||||
@ -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' => '新北中通快递有限公司',
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user