付款时间表的表格设计

时间:2013-06-08 03:39:12

标签: sql sql-server database-design

我们正在开发一个处理人员付款的数据库。我目前关注的领域是预定的付款方式。基本上,系统每两周向人们发送一次付款。因此,每隔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个结束......依此类推。未来走多远?不知道。但是......这对我来说似乎很奇怪。我认为我们只需要一个Schedule行,一个是六月一日的“生效日期”,另一个是“持续时间”,即“两周”,或者其他什么。然后,使用.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])
);

所以,基于这些早期的表设计...我不知道如何让它工作。如果今天的日期是基于时间表的触发日期,我需要以某种方式计算出来。一旦有效,我可以添加管理例外日期的功能。这似乎是在正确的轨道上?

1 个答案:

答案 0 :(得分:0)

您现有的设计对我来说很好看。

我考虑使用一个计划周期表,每个期间有一个单独的记录的唯一原因是,如果每个期间的长度实际上是任意的。鉴于计划周期遵循一套相当简单的规则,我不会打扰。

设置此类表的另一个原因可能是其他程序员的易用性,这些程序员不希望每次编写查询时都必须重新编写计划周期日期的规则。解决这个问题的一种方法是编写一个模拟这样一个表的视图。