preserve payable partner in fee snapshots
This commit is contained in:
@@ -24,7 +24,8 @@ public interface FirstlegFeeSourceClient {
|
||||
record Snapshot(long tenantId, String sourceType, long feeId, int feeVersion,
|
||||
Long inboundId, String inboundCode, Long orderId, Long containerId,
|
||||
Long containerBookingId, String containerNo, long customerId,
|
||||
String customerName, Long feeItemId, String feeItemCode,
|
||||
String customerName, Long partnerId, String partnerName,
|
||||
Long feeItemId, String feeItemCode,
|
||||
String feeItemName, String direction, LocalDate businessDate,
|
||||
String currency, BigDecimal totalAmount, String reviewStatus,
|
||||
String publicationStatus, boolean settlementIncluded,
|
||||
|
||||
@@ -173,7 +173,7 @@ class FinanceFeeSourceEventServiceTest {
|
||||
String publicationStatus, BigDecimal amount) {
|
||||
return new FirstlegFeeSourceClient.Snapshot(customerId, sourceType, 31, version, inboundId,
|
||||
inboundId == null ? null : "IB-21", 51L, containerId, null,
|
||||
containerId == null ? null : "C-41", customerId, "客户", 61L, "CUSTOMS",
|
||||
containerId == null ? null : "C-41", customerId, "客户", null, null, 61L, "CUSTOMS",
|
||||
"清关费", "RECEIVABLE", LocalDate.of(2026, 8, 11), "CNY", amount,
|
||||
"APPROVED", publicationStatus, true, LocalDateTime.of(2026, 8, 11, 1, 0),
|
||||
BigDecimal.ONE, "SHIPMENT", BigDecimal.TEN, BigDecimal.ONE, "source-hash", version);
|
||||
|
||||
@@ -18,6 +18,8 @@ public record FinanceFeeSourceSnapshot(
|
||||
String containerNo,
|
||||
long customerId,
|
||||
String customerName,
|
||||
Long partnerId,
|
||||
String partnerName,
|
||||
Long feeItemId,
|
||||
String feeItemCode,
|
||||
String feeItemName,
|
||||
|
||||
@@ -22,12 +22,14 @@ public final class InboundFeeDetailDtos {
|
||||
@NotBlank @Pattern(regexp = "[A-Z]{3}") String currency,
|
||||
@NotNull @DecimalMin("0.00") BigDecimal amount,
|
||||
@NotNull Boolean settlementIncluded,
|
||||
Long partnerId,
|
||||
@Size(max = 200) String partnerName,
|
||||
@Size(max = 500) String remark
|
||||
) {
|
||||
public SaveRequest(Long feeItemId, String direction, LocalDate businessDate,
|
||||
BigDecimal unitPrice, String currency, BigDecimal amount,
|
||||
String remark) {
|
||||
this(feeItemId, direction, businessDate, unitPrice, currency, amount, false, remark);
|
||||
this(feeItemId, direction, businessDate, unitPrice, currency, amount, false, null, null, remark);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@ public class InboundFeeDetailEntity extends BaseEntity {
|
||||
private String sourceFeeNo;
|
||||
private String inboundCode;
|
||||
private String direction;
|
||||
private Long partnerId;
|
||||
private String partnerName;
|
||||
private LocalDate businessDate;
|
||||
private Long customerId;
|
||||
private String customerName;
|
||||
|
||||
+2
-2
@@ -44,7 +44,7 @@ public class FinanceFeeSourceSnapshotService {
|
||||
nullSafe(detail.getCurrency()), String.valueOf(detail.getSettlementIncluded()));
|
||||
return new FinanceFeeSourceSnapshot(detail.getTenantId(), "INBOUND_FEE", sourceFeeId,
|
||||
version, inboundId, inbound.getInboundCode(), inbound.getOrderId(), null, null, null,
|
||||
detail.getTenantId(), inbound.getCustomerName(), item.getId(), item.getFeeCode(),
|
||||
detail.getTenantId(), inbound.getCustomerName(), detail.getPartnerId(), detail.getPartnerName(), item.getId(), item.getFeeCode(),
|
||||
detail.getFeeTypeNameSnapshot(), detail.getDirection(), detail.getBusinessDate(),
|
||||
detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(),
|
||||
detail.getPublicationStatus(), Boolean.TRUE.equals(detail.getSettlementIncluded()),
|
||||
@@ -65,7 +65,7 @@ public class FinanceFeeSourceSnapshotService {
|
||||
String.valueOf(detail.getSettlementIncluded()));
|
||||
return new FinanceFeeSourceSnapshot(detail.getTenantId(), "CONTAINER_FEE", feeId,
|
||||
version, null, null, null, containerId, detail.getContainerBookingId(),
|
||||
detail.getContainerNo(), detail.getTenantId(), null, detail.getFeeItemId(),
|
||||
detail.getContainerNo(), detail.getTenantId(), null, null, null, detail.getFeeItemId(),
|
||||
detail.getFeeItemCodeSnapshot(), detail.getFeeItemNameSnapshot(), detail.getDirection(),
|
||||
detail.getBusinessDate(), detail.getCurrency(), detail.getAmount(), detail.getReviewStatus(),
|
||||
publicationStatus, Boolean.TRUE.equals(detail.getSettlementIncluded()),
|
||||
|
||||
@@ -310,6 +310,8 @@ public class InboundFeeDetailService {
|
||||
value.setFeeItemId(item.getId());
|
||||
value.setInboundCode(inbound.getInboundCode());
|
||||
value.setDirection(request.direction());
|
||||
value.setPartnerId("PAYABLE".equals(request.direction()) ? request.partnerId() : null);
|
||||
value.setPartnerName("PAYABLE".equals(request.direction()) ? request.partnerName() : null);
|
||||
value.setBusinessDate(request.businessDate());
|
||||
value.setFeeCategorySnapshot(item.getCategory());
|
||||
value.setTradeScopeSnapshot(item.getTradeScope());
|
||||
|
||||
@@ -108,12 +108,14 @@ async function loadFeeItem(context, direction) {
|
||||
? item.warehouseReceivable === true : item.warehousePayable === true)) || null
|
||||
}
|
||||
|
||||
async function createManualFee(context, resource, feeItem, direction, amount, basis, businessDate) {
|
||||
async function createManualFee(context, resource, feeItem, direction, amount, basis, businessDate, partner = null) {
|
||||
if (context.financeFixtureHooks?.createManualFee) return context.financeFixtureHooks.createManualFee(context, resource, feeItem, direction, amount, basis, businessDate)
|
||||
const basePath = `/api/platform/v1/inbounds/${encodeURIComponent(resource.inboundId)}/fee-details`
|
||||
const listPath = `${basePath}?accountId=${encodeURIComponent(resource.tenantId)}`
|
||||
const body = { feeItemId: Number(feeItem.id), direction, businessDate,
|
||||
unitPrice: amount, currency: 'CNY', amount, settlementIncluded: true, remark: `${context.marker}-${basis}` }
|
||||
unitPrice: amount, currency: 'CNY', amount, settlementIncluded: true,
|
||||
partnerId: partner?.id ? String(partner.id) : null, partnerName: partner?.partnerName || null,
|
||||
remark: `${context.marker}-${basis}` }
|
||||
const response = await request(context, 'POST', listPath, body)
|
||||
const detail = context.apiSuccess(MODULE, `${basis}人工费用明细`, response, `inboundId=${resource.inboundId}`, OPTIONS)
|
||||
const feeId = id(detail?.id)
|
||||
@@ -342,7 +344,7 @@ export async function run(context) {
|
||||
if (feeItems.PAYABLE && supplier?.id) {
|
||||
for (const [index, manualResource] of manualResources.entries()) {
|
||||
const fee = await createManualFee(context, manualResource, feeItems.PAYABLE, 'PAYABLE', 80 + index * 10,
|
||||
'MANUAL_ORDER_FEE', dateOffset(-3 - index))
|
||||
'MANUAL_ORDER_FEE', dateOffset(-3 - index), supplier)
|
||||
if (fee) fixtures.push({ ...fee, supplierId: id(supplier.id), partnerId: id(supplier.id), supplierName: supplier.partnerName || null })
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user