Я могу попытаться сохранить значения счетов и платежей в соединительной таблице. Например, при вводе платежей пользователь применяет платеж к счету. Система будет определять, какие значения вводить в запись, которую пользователь пытается создать, за 3 шага. # 1 Он рассчитал бы оставшееся сальдо путем суммирования сумм текущего счета-фактуры, уже находящихся в соединительной таблице, с последующим вычитанием этого значения из первоначальной суммы счета-фактуры. # 2 Он будет рассчитывать оставшиеся средства для оплаты аналогичным образом. # 3 он сравнил бы оставшийся остаток с доступными средствами и ввел меньшую из обеих сумм как для оплаты, так и для счета в таблицу соединений. Я вижу три варианта:
а) Если остаток на счете равен 0, платеж и счет закрываются для дальнейшего использования.
б) Если остаток счета-фактуры меньше, чем платеж, счет закрывается, и платеж остается доступным для применения к другому счету.
c) Если остаток на счете превышает платеж, платеж закрывается, а счет остается открытым. Кроме сложности, я не вижу проблем с этой идеей ...
Я могу назначить BillToParty для партии счетов-фактур, партия счетов-фактур будет родительской как для счетов-фактур, так и для платежей. Если клиент недоплачивает, мы можем рассчитать оставшийся остаток и сгенерировать новый «счет» (не в первоначальном смысле, и, вероятно, не хотите его хранить ???). Если они переплатят, мы должны оформить кредит, потому что мы не можем применить платеж к другой партии.
CREATE TABLE #inv
(
invID int NOT NULL,
invAMT int NULL
) ON [PRIMARY]
GO
ALTER TABLE #inv ADD CONSTRAINT
PK_inv PRIMARY KEY CLUSTERED
(
invID
)
CREATE TABLE #pay
(
payID varchar(50) NOT NULL,
payAMT int NULL
) ON [PRIMARY]
GO
ALTER TABLE #pay ADD CONSTRAINT
PK_pay PRIMARY KEY CLUSTERED
(
payID
)
CREATE TABLE #payinv
(
payID varchar(50) NOT NULL,
invID int NOT NULL,
relType varchar(50) not null
) ON [PRIMARY]
GO
ALTER TABLE #payinv ADD CONSTRAINT
PK_payinv PRIMARY KEY CLUSTERED
(
payID,
invID
)
INSERT INTO #inv (invID, invAMT)
select 1,110
union
select 2,400
union
select 3,600
union
select 4,100000
union
select 5,10000
union
select 6,1000000;
INSERT INTO #pay (payID,payAMT)
select 'a',10
union
select 'b',100
union
select 'c',1000
union
select 'd',10000
union
select 'e',100000
union
select 'f',1000000;
INSERT INTO #payinv(payID,invID,relType)
select 'a',1,'1:M'
union
select 'b',1,'1:M'
union
select 'c',2,'M:1'
union
select 'c',3,'M:1'
union
select 'd',4,'M:M'
union
select 'e',4,'M:M'
union
select 'e',5,'M:M'
union
select 'f',6,'1:1';
select #inv.invAMT, #inv.invID, #pay.payID, #pay.payAMT, #payinv.relType
from #inv inner join #payinv on #inv.invID = #payinv.invID inner join #pay on #payinv.payID = #pay.payID