我们正在开发一个处理向人们付款的数据库。我目前关注的领域是预定的付款方式。基本上,该系统每两周向人们发送一次付款。因此,每 14 天,在特定的一天(目前是星期三),系统必须处理付款并将其发送出去。
所以,举个例子。PersonA 每天获得 10 美元。每两周,系统会累积一个人的所有付款,将其汇总,然后发出付款。
因此,在第一次付款后,此人会收到 140 美元寄给他们。
但是比较复杂的是,如果支付日是公共假期,或者是停工期,比如圣诞假期(12月24日至1月2日),系统必须在支付日的前一天支付。公共假期或关闭期间,并处理该期间的任何未来付款。
例子:
付款期限为 6 月 1 日至 6 月 14 日。此期间的付款将在 14 日发送,并且是该期间所有付款的累积...因此,在 14 日,我们进行付款运行,收集该期间内的所有付款,并将其发送出去。但是,从 10 日到 18 日有一个公司停业期。所以,在 9 日,系统必须获得从 1 日到 14 日的所有付款(这些付款的构建已处理),并在 9 日创建付款。下一个时段(15 日至 29 日)将正常工作。
问题是:处理这个付款时间表。有人建议我们创建一个包含所有期间的日程表。所以,记录一:开始日期 = 6 月 1 日,结束日期,6 月 14 日。记录二的开始是 15 日,结束是 29 日……以此类推。未来还能走多远?不知道。但是……这对我来说似乎很奇怪。我认为我们只需要一个时间表行,其中“生效日期”为 6 月 1 日,“持续时间”为“两周”或其他内容。然后,使用 .Net 或 SQL,我们可以确定我们是否处于“触发”日期。因此,第一个触发日期将是生效日期加上 14 天。如果他们随后决定将其从星期三更改为星期一(例如),请添加一个新的计划行,其中包含计划生效的星期一日期,以及当系统日期到达该日期时,新的计划变为活动状态。必须有一些逻辑来处理这个问题,但计划日期中一行的基本概念是我的想法。举行所有未来两周的约会似乎 - 奇怪。
处理关闭期将通过“例外日期”类型表处理,该表仅包含公共假期和关闭期,基本上是无法处理付款的日期。
因此,每天晚上,都会运行一个进程。并获取活动时间表行,并确定我们是否在与该生效日期匹配的两周日期(如何?),并检查例外表以确定我们是否需要触发提前付款。
我们如何计算我们是否在基于生效日期的付款日期,然后检查“期间”可能会很棘手......但是,肯定存储所有未来的两周是 - 错误的?
这是我想做的基本开始......但是......不确定它是否可以满足要求:
此表包含计划的行。每次发生更改时,都会添加一个新行。
CREATE TABLE [dbo].[PaymentSchedule] (
[PaymentScheduleId] INT IDENTITY (1, 1) NOT NULL,
[EffectiveDate] DATE NOT NULL,
[EffectiveDays] INT NOT NULL,
CONSTRAINT [pk_PaymentSchedule] PRIMARY KEY CLUSTERED ([PaymentScheduleId] ASC)
);
此表包含例外日期。因此,一天将具有相同的开始日期和结束日期......一个范围将具有不同的开始日期和结束日期。
CREATE TABLE [dbo].[ExceptionDate]
(
[ExceptionDateId] INT NOT NULL IDENTITY,
[StartDate] DATE NOT NULL,
[EndDate] DATE NOT NULL,
[Description] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_ExceptionDate] PRIMARY KEY ([ExceptionDateId])
)
这可以保存与使用的时间表相关的付款历史记录。
CREATE TABLE [dbo].[PaymentScheduleHistory] (
[PaymentScheduleHistoryId] INT IDENTITY (1, 1) NOT NULL,
[PaymentScheduleId] INT NOT NULL,
CONSTRAINT [pk_PaymentScheduleHistory] PRIMARY KEY CLUSTERED ([PaymentScheduleHistoryId] ASC),
CONSTRAINT [fk_PaymentScheduleHistory_PaymentSchedule] FOREIGN KEY ([PaymentScheduleId]) REFERENCES [dbo].[PaymentSchedule] ([PaymentScheduleId])
);
所以,基于这些早期的桌子设计......我不知道如何让它工作。我需要根据时间表以某种方式确定今天的日期是否是触发日期。一旦它工作,我可以添加功能来管理异常日期。这似乎是在正确的轨道上吗?