CaiWuXiTong/modules/EcommerceFinance/Services/SupplierPayableMaintenanceRegistry.php

168 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Modules\EcommerceFinance\Services;
use Illuminate\Validation\ValidationException;
class SupplierPayableMaintenanceRegistry
{
/** @return array<string,array{label:string,type:string}> */
public function fields(string $dataset): array
{
$money = static fn (string $label): array => ['label' => $label, 'type' => 'number'];
$text = static fn (string $label): array => ['label' => $label, 'type' => 'text'];
$date = static fn (string $label): array => ['label' => $label, 'type' => 'date'];
$month = static fn (string $label): array => ['label' => $label, 'type' => 'month'];
return match ($dataset) {
'payment-reconciliation' => [
'supplier' => $text('供应商'), 'skuCode' => $text('货号'), 'productCode' => $text('商品编码'),
'skuName' => $text('规格名称'), 'qty' => $money('数量'), 'unitPrice' => $money('单价'),
'amount' => $money('金额'), 'guessUnitPrice' => $money('预估单价'), 'guessAmount' => $money('预估金额'),
'supplierGoodsCode' => $text('供应商商品编码'), 'remark' => $text('备注'),
'warehouse' => $text('仓库名称'), 'expressName' => $text('快递名称'), 'expressNo' => $text('快递单号'),
],
'return-reconciliation', 'return-unpriced' => [
'send_time' => $date('发货时间'), 'supplier' => $text('明细供应商'), 'barcode' => $text('条形码'),
'sku_name' => $text('商品名称'), 'qty' => $money('发货量'), 'unit_price' => $money('单价'),
'amount' => $money('金额'), 'guess_unit_price' => $money('预估单价'), 'guess_amount' => $money('预估金额'),
'supplier_barcode' => $text('供应商条码'), 'remark' => $text('备注'), 'title' => $text('标题'),
'warehouse' => $text('仓库名称'), 'express_no' => $text('快递单号'),
'express_name' => $text('快递名称'), 'labels' => $text('标记多标签'), 'reconciler' => $text('对账人'),
],
'invoice-deductions' => [
'month_str' => $month('日期'), 'category' => $text('类别'), 'payee' => $text('打款抬头'),
'receiver' => $text('收款方'), 'board_factory' => $text('供板材厂家/代扣厂家'),
'subsidy_fee' => $money('补贴费用'), 'remark' => $text('备注'), 'price' => $money('对私打款金额'),
'detail' => $text('明细'), 'note' => $text('注明'), 'person_charge' => $text('负责人'),
],
'compensation-details' => [
'month' => $month('日期'), 'supplier' => $text('供应商'), 'amount' => $money('赔付金额'),
'reason' => $text('赔付原因'), 'remark' => $text('备注'),
],
'advance-details' => [
'supplier' => $text('供应商'), 'contract_name' => $text('协议签订名称'),
'advance_amount' => $money('借支金额'), 'actual_pay' => $money('实际打款金额'),
'month_deduct' => $money('本月扣款金额'), 'should_deduct' => $money('应扣金额'),
'deduct_start_month' => $month('分期起始扣款月份'), 'deduct_end_month' => $month('分期最后扣款月份'),
'remain_periods' => $money('分期剩余期数'), 'month_str' => $month('借支日期'),
'loan_term' => $text('借款期限'), 'remark' => $text('备注'), 'is_paid' => $text('是否打款'),
'pay_month' => $month('打款月份'), 'serial_no' => $text('流水号'),
'loan_agreement' => $text('借支协议'), 'person_charge' => $text('负责人'),
],
'sample-deductions' => [
'finish_time' => $date('日期'), 'department' => $text('部门'), 'creator' => $text('申请人'),
'sku_id' => $text('商品代码'), 'skuName' => $text('商品名称'), 'num' => $money('数量'),
'supplier' => $text('厂家'), 'purchase' => $text('对应采购'), 'productCode' => $text('扣款厂家商品代码'),
'shipping_fee' => $money('运费'), 'cost_price' => $money('成本价'),
'total_amount' => $money('合计扣款金额'), 'estimated_price' => $money('预估价'),
'estimated_price_all' => $money('预估金额'), 'remark' => $text('备注'),
],
'delivery-unpriced' => [
'transactionNo' => $text('来源单号'), 'distributionNo' => $text('单据编号(采购单号)'),
'date' => $date('创建时间'), 'supplier' => $text('供应商'), 'sku' => $text('货号'),
'barCode' => $text('条码'), 'skuName' => $text('规格名'), 'supplier_barcode' => $text('供应商条码'),
'remark' => $text('备注'), 'warehouse' => $text('仓库'), 'expressName' => $text('快递名称'),
'expressNo' => $text('快递单号'), 'purchase' => $text('负责人'),
],
'other-adjustments' => [
'project' => $text('项目'), 'month_str' => $month('日期'), 'supplier' => $text('厂家'),
'supplement_amount' => $money('补款金额'), 'supplement_reason' => $text('补款原因'),
'remark' => $text('备注'), 'remark2' => $text('备注2'), 'person_charge' => $text('负责人'),
],
'dropshipping-express' => [
'reconciliation_person' => $text('对账人'), 'month_str' => $month('日期'), 'supplier' => $text('供应商'),
'express_freight' => $money('快递运费'), 'express_account' => $money('快递记账'),
'replenish_freight' => $money('补运费'), 'replenish_account' => $money('补记账'),
'return_fee' => $money('退回费'), 'intercept_fee' => $money('拦截'),
'change_address_fee' => $money('改地址'), 'turnover_fee' => $money('翻箱费'),
'overlong_fee' => $money('超长费'), 'total_freight' => $money('合计运费'),
'remark' => $text('备注'), 'express_name' => $text('快递'), 'remark2' => $text('备注2'),
],
'board-deductions' => [
'stock_in_date' => $date('入库日期'), 'stock_out_date' => $date('出库日期'),
'furniture_factory' => $text('家具厂'), 'lamination_factory' => $text('压贴厂'),
'deduction_type' => $text('类型'), 'specification' => $text('规格'), 'material_name' => $text('原料名称'),
'received_quantity' => $money('实收数量'), 'unit_price' => $money('单价'), 'amount' => $money('金额'),
'unit' => $text('单位'), 'batch_date' => $date('批次日期'), 'stock_out_number' => $text('出库单号'),
'stock_out_remark' => $text('出库备注'), 'claim_number' => $text('申领单号'),
'number_type' => $text('单号类型'), 'delivery_number' => $text('送货单号'),
],
'supplier-payables-report' => [
'checker' => $text('对账人'), 'settlement_method' => $text('结算方式'), 'company' => $text('供应商公司主体名称'),
'supplier' => $text('供应商简称'), 'express_freight' => $money('快递运费'),
'beginning_payable' => $money('月初未付'), 'unpriced' => $money('之前未定价-本月定价'),
'advance_loan' => $money('预支借款'), 'loan' => $money('货款金额'), 'refund' => $money('退货金额'),
'procurement' => $money('采购小计'), 'invoice_deduction' => $money('发票扣款'),
'board_deduction' => $money('板材扣款'), 'sample_deduction' => $money('样品扣款'),
'total_compensation' => $money('总赔偿金额'), 'other_adjustment' => $money('其他费用'),
'supplier_supplement' => $money('补给厂家'), 'supplier_balance' => $money('供应商余额'),
'should_pay' => $money('应付余额'), 'estimated_price' => $money('预估金额'),
'to_corporate' => $money('对公打款金额'), 'to_private' => $money('对私打款金额'),
'cashier_paid' => $money('已销账金额'), 'remarks' => $text('备注'),
'private_reason' => $text('对私原因'), 'deposit' => $money('押款金额'),
'negative_reason' => $text('负数原因'),
],
default => throw ValidationException::withMessages(['dataset' => '不支持该供应商应付页面。']),
};
}
public function normalize(string $dataset, array $input): array
{
$fields = $this->fields($dataset);
$values = [];
foreach ($fields as $field => $definition) {
if (! array_key_exists($field, $input)) {
continue;
}
$value = $input[$field];
if ($value === null || trim((string) $value) === '') {
$values[$field] = null;
continue;
}
if ($definition['type'] === 'number') {
$number = str_replace([',', ',', '¥', '¥'], '', trim((string) $value));
if (preg_match('/^-?(?:\d+(?:\.\d{1,4})?|\.\d{1,4})$/', $number) !== 1
|| bccomp(ltrim($number, '-'), '9999999999999999.9999', 4) === 1) {
throw ValidationException::withMessages([
$field => $definition['label'] . '必须是最多 4 位小数的有效数字。',
]);
}
$values[$field] = $number;
continue;
}
$text = trim((string) $value);
if (mb_strlen($text) > 5000) {
throw ValidationException::withMessages([$field => $definition['label'] . '内容过长。']);
}
if ($definition['type'] === 'date' && preg_match('/^\d{4}-\d{2}-\d{2}$/', $text) !== 1) {
throw ValidationException::withMessages([$field => $definition['label'] . '日期格式无效。']);
}
if ($definition['type'] === 'month' && preg_match('/^\d{4}-\d{2}$/', $text) !== 1) {
throw ValidationException::withMessages([$field => $definition['label'] . '月份格式无效。']);
}
$values[$field] = $text;
}
if ($values === []) {
throw ValidationException::withMessages(['values' => '没有可保存的字段。']);
}
return $values;
}
public function publicDefinition(string $dataset): array
{
return [
'dataset' => $dataset,
'fields' => collect($this->fields($dataset))->map(
static fn (array $definition, string $name): array => ['name' => $name] + $definition
)->values()->all(),
];
}
}