create procedure [dbo].[spCSMBuildStatement_XLedger]
@VendorClass varchar(15),
@DueDate datetime,
@CreatedBy int,
@CSHPriKey int output
as
set nocount on
declare @theLastStmtDate datetime
declare @TRUE bit
set @TRUE = 1
create table #Transactions
(
DocumentNumber varchar(21) not null default '',
DocumentDate datetime not null default '1/1/1900',
DocumentAmount money not null default 0,
OrderNumber varchar(23) not null default '',
ShipperName varchar(50) not null default '',
InvoiceAmount money not null default 0,
RevenueAmount money not null default 0,
CommissionType varchar(8) not null default '',
CommissionBasis varchar(15) not null default '',
CommissionAmount money not null default 0,
CommissionPerc float not null default 0,
CommissionFactor money not null default 0,
OrderWeight int not null default 0,
AmountAfterSplits money not null default 0,
ItemDescription varchar(128) not null default 'None',
AllocatedItemDescription varchar(128) null,
VoucherNumber varchar(21) not null default '',
AcctTransactionID int null,
VendorId char(15) null,
VendorName char(65) null,
NetAmount money not null default 0,
Miles int,
AccountingVendorFid int null
);
with SplitHold_CTE as (
select
SplitCommissionsFID,
HoldUpdateStatus,
row_number() over (partition by SplitCommissionsFID order by SplitCommissionsHoldID desc) as RowNumber
from SplitCommissionsHold
),
CommDetailHold_CTE as (
select
CommissionedDetailFID,
HoldUpdateStatus,
row_number() over (partition by CommissionedDetailFID order by CommissionedDetailHoldID desc) as RowNumber
from CommissionedDetailHold
)
insert into #Transactions
(
VendorID,
VendorName,
VoucherNumber,
DocumentNumber,
DocumentDate,
DocumentAmount,
OrderNumber,
ItemDescription,
AcctTransactionID,
AccountingVendorFid,
ShipperName,
InvoiceAmount,
RevenueAmount,
NetAmount,
CommissionType,
CommissionBasis,
CommissionAmount,
CommissionPerc,
CommissionFactor,
OrderWeight,
AmountAfterSplits,
AllocatedItemDescription,
Miles
)
select
VendorID = rtrim(Vendor.VendorID),
VendorName = rtrim(Vendor.[Name]),
VoucherNumber = AcctTransactions.VoucherNumber,
DocumentNumber = AcctTransactions.DocumentNumber,
DocumentDate = AcctTransactions.DocumentDate,
DocumentAmount =
case
when AcctTransactions.TransactionType = 'A/P Credit Memo' then -AcctTransactions.TransactionAmount
else AcctTransactions.TransactionAmount
end,
OrderNumber = AcctTransactions.OrderNo,
ItemDescription = AcctTransactions.ItemDescription,
AcctTransactionID = AcctTransactions.ATPriKey,
AccountingVendorFid = Vendor.AccountingVendorId,
ShipperName = isnull(AcctTransactions.ShipperName, ''),
InvoiceAmount =
case
when BillingMinorItem.Percentage is not null then isnull(BillingMajorItem.Amount, 0)
else isnull(BillingMinorItem.InvoiceAmount, 0)
end,
RevenueAmount =
case
when BillingMinorItem.Amount is null then isnull(BillingMinorDist.Amount, 0)
else isnull(BillingMinorItem.Amount, 0)
end,
NetAmount =
case
when BillingMinorItem.Percentage is not null then isnull(BillingMinorItem.InvoiceAmount, 0)
else isnull(BillingMinorItem.InvoiceAmount - BillingMinorItem.ReductionAmount, 0)
end,
CommissionType =
case
when CommissionedDetail.CDPriKey is null
then isnull(SplitCommissions.CommissionType, '0')
else isnull(CommissionedDetail.CommissionType, '')
end,
CommissionBasis = isnull(CommissionBasis.Basis, ''),
CommissionAmount =
case
when CommissionedDetail.CDPriKey is null
then isnull(SplitCommissions.Amount, 0)
else isnull(CommissionedDetail.Amount, 0)
end,
CommissionPerc =
case
when CommissionedDetail.CDPriKey is null
then isnull(SplitCommissions.CommissionPerc, 0)
else isnull(CommissionedDetail.CommissionPerc, 0)
end,
CommissionFactor = isnull(CommissionedDetail.CommissionFactor, 0),
OrderWeight = isnull(Orders.[Weight], 0),
AmountAfterSplits =
case
when CommissionedDetail.CDPriKey is null
then isnull(SplitCommissions.Amount, 0)
else isnull(CommissionedDetail.CommissionAfterSplit, 0)
end,
AllocatedItemDescription =
case
when BillingMinorItem.Percentage is not null then BillingMajorItem.[Description]
else null
end,
Miles =
case
when CommissionedDetail.CDPriKey is null
then CommissionedDetail_Split.Miles
else CommissionedDetail.Miles
end
from AcctTransactions
inner join Vendor_Synonym as Vendor on AcctTransactions.VendorNumber = Vendor.VendorID
left outer join Orders on Orders.PriKey = AcctTransactions.OrdPriKey
left outer join SplitCommissions on
AcctTransactions.SourceRecord = isnull(SplitCommissions.SCPriKey, 0) and
AcctTransactions.Source = 'SplitCommissions'
left outer join CommissionedDetail CommissionedDetail_Split on CommissionedDetail_Split.CDPriKey = SplitCommissions.CDPriKey
left outer join CommissionedDetail on
AcctTransactions.SourceRecord = isnull(CommissionedDetail.CDPriKey, 0) and
AcctTransactions.Source = 'CommissionedDetail'
left outer join BillingMinorItem on
CommissionedDetail.BMinPriKey = BillingMinorItem.BMinPriKey or
CommissionedDetail_Split.BMinPriKey = BillingMinorItem.BMinPriKey
left outer join BillingMajorItem on BillingMajorItem.BMajPriKey = BillingMinorItem.BMajPriKey
left outer join RevGroups on RevGroups.RGPriKey = BillingMajorItem.RevGroupPriKey
left outer join BillingMinorDist on
CommissionedDetail.BMinDistPrikey = BillingMinorDist.BMinDistPrikey or
CommissionedDetail_Split.BMinDistPrikey = BillingMinorDist.BMinDistPrikey
left outer join CommissionBasis on CommissionBasis.CBPriKey = CommissionedDetail.CBPriKey
left outer join CommStmtDetail on CommStmtDetail.VoucherNumber = AcctTransactions.VoucherNumber
left outer join SplitHold_CTE as SplitCommissionsOnHold on SplitCommissions.SCPriKey is not null and SplitCommissionsOnHold.SplitCommissionsFID = SplitCommissions.SCPriKey and SplitCommissionsOnHold.RowNumber = 1
left outer join CommDetailHold_CTE as CommissionsOnHold on CommissionedDetail.CDPriKey is not null and CommissionsOnHold.CommissionedDetailFID = CommissionedDetail.CDPriKey and CommissionsOnHold.RowNumber = 1
where
AcctTransactions.TransactionType LIKE 'A/P%' and
Vendor.VendorClass = @VendorClass and
AcctTransactions.DocumentDate <= @DueDate and
CommStmtDetail.VoucherNumber is null and
(
(AcctTransactions.Source = 'SplitCommissions' and isnull(SplitCommissionsOnHold.HoldUpdateStatus, 0) = 0)
or
(AcctTransactions.Source = 'CommissionedDetail' and isnull(CommissionsOnHold.HoldUpdateStatus, 0) = 0)
or
(AcctTransactions.Source not in ('SplitCommissions', 'CommissionedDetail') and AcctTransactions.OnHoldFlag = 0)
);
set @theLastStmtDate = ( select top 1 ToDate from CommStmtHeader where VendorClassId = @VendorClass and Final = @TRUE order by MSID desc )
set @theLastStmtDate = isnull( @theLastStmtDate, '1/1/1900' )
if( @theLastStmtDate is not null )
begin
insert into #Transactions
(
VendorID,
VendorName,
VoucherNumber,
DocumentNumber,
DocumentDate,
DocumentAmount,
OrderNumber,
ItemDescription,
AcctTransactionID,
AccountingVendorFid
)
select
VendorID = rtrim( Vendor.VendorID ),
VendorName = rtrim( Vendor.[Name] ),
VoucherNumber = '',
DocumentNumber = '',
DocumentDate = @theLastStmtDate,
DocumentAmount = CommStmtVendor.Balance,
OrderNumber = '',
ItemDescription = 'Balance Forward',
AcctTransactionID = null,
AccountingVendorFid = Vendor.AccountingVendorId
from Vendor_Synonym as Vendor
inner join CommStmtVendor_Synonym as CommStmtVendor on Vendor.VendorJoinField = CommStmtVendor.VendorJoinField
where
Vendor.VendorClass = @VendorClass and
CommStmtVendor.MSID =
(
select max( CommStmtVendor_max.MSID )
from CommStmtVendor as CommStmtVendor_max
where CommStmtVendor_max.VendorID = CommStmtVendor.VendorID
) and
isnull( CommStmtVendor.Balance, 0 ) != 0
end
create index IX_AcctTransactions on #Transactions( AcctTransactionID )
update #Transactions
set
InvoiceAmount = convert( decimal(10,2), isnull( BillingMajorItem.Amount, 0 ) * ( isnull( RevenueRatingImportedSplitHaul.Percentage, 100 ) / 100 ) ),
NetAmount = convert( decimal(10,2), isnull( BillingMinorItem.InvoiceAmount, 0 ) * ( isnull( RevenueRatingImportedSplitHaul.Percentage, 100 ) / 100 ) )
from #Transactions GP
inner join AcctTransactions on AcctTransactions.ATPriKey = GP.AcctTransactionID
left outer join CommissionedDetail on
AcctTransactions.SourceRecord = isnull( CommissionedDetail.CDPriKey, 0 ) and
AcctTransactions.Source = 'CommissionedDetail'
left outer join BillingMinorItem on CommissionedDetail.BMinPriKey = BillingMinorItem.BMinPriKey
left outer join BillingMajorItem on BillingMajorItem.BMajPriKey = BillingMinorItem.BMajPriKey
left outer join CommissionBasis on CommissionBasis.CBPriKey = CommissionedDetail.CBPriKey
inner join RevenueRatingImportedSplitHaul on BillingMinorItem.RevenueRatingImportedSplitHaulFID = RevenueRatingImportedSplitHaul.RevenueRatingImportedSplitHaulID
where
CommissionBasis.Basis in ( 'Invoice Amount', 'Net Amount' ) and
CommissionedDetail.CommissionType = 'P'
if exists ( select 1 from #Transactions where VendorID != '' )
begin
declare @theVendorClassName varchar(31)
declare @theAccountingVendorClassId int
select
@theVendorClassName = VendorClass.[Description],
@theAccountingVendorClassId = VendorClass.AccountingVendorClassId
from VendorClass_Synonym as VendorClass
where VendorClass.Code = @VendorClass
insert into CommStmtHeader( VendorClassID, VendorClass, DateCreated, ToDate, Final, CreatedBy, AccountingVendorClassFid )
select distinct
VendorClassID = @VendorClass,
VendorClass = @theVendorClassName,
DateCreated = convert( datetime, convert( varchar, getdate(), 101 ), 101 ),
ToDate = convert( datetime, convert( varchar, @DueDate, 101 ), 101 ),
Final = 0,
CreatedBy = @CreatedBy,
AccountingVendorClassFid = @theAccountingVendorClassId
set @CSHPriKey = scope_identity()
insert into CommStmtVendor( CommStmtHeader, VendorID, VendorName, Balance, AccountingVendorFid )
select distinct
CommStmtHeader = @CSHPriKey,
VendorID = VendorID,
VendorName = VendorName,
Balance = 0,
AccountingVendorFid = AccountingVendorFid
from #Transactions
insert into CommStmtDetail
(
VoucherNumber,
DocumentNumber,
DocumentDate,
DocumentAmount,
OrderNumber,
ShipperName,
InvoiceAmount,
RevenueAmount,
CommissionType,
CommissionBasis,
CommissionAmount,
CommissionPerc,
CommissionFactor,
OrderWeight,
AmountAfterSplits,
ItemDescription,
AllocatedItemDescription,
CommStmtVendor,
NetAmount,
Miles
)
select
VoucherNumber = Transactions.VoucherNumber,
DocumentNumber = Transactions.DocumentNumber,
DocumentDate = Transactions.DocumentDate,
DocumentAmount = Transactions.DocumentAmount,
OrderNumber = Transactions.orderNumber,
ShipperName = Transactions.ShipperName,
InvoiceAmount = Transactions.InvoiceAmount,
RevenueAmount = Transactions.RevenueAmount,
CommissionType = Transactions.CommissionType,
CommissionBasis = Transactions.CommissionBasis,
CommissionAmount = Transactions.CommissionAmount,
CommissionPerc = Transactions.CommissionPerc,
CommissionFactor = Transactions.CommissionFactor,
OrderWeight = Transactions.orderWeight,
AmountAfterSplits = Transactions.AmountAfterSplits,
ItemDescription = Transactions.ItemDescription,
AllocatedItemDescription = Transactions.AllocatedItemDescription,
CommStmtVendor = CommStmtVendor.MSID,
NetAmount = Transactions.NetAmount,
Miles = Transactions.Miles
from #Transactions Transactions
inner join CommStmtVendor on ( CommStmtVendor.VendorID = Transactions.VendorID )
where CommStmtVendor.CommStmtHeader = @CSHPriKey
update CommStmtVendor
set Balance =
isnull( ( select sum( csd.DocumentAmount )
from CommStmtDetail csd
where csd.CommStmtVendor = CommStmtVendor.MSID ), 0 )
where CommStmtHeader = @CSHPriKey
end
drop table #Transactions
GO
GRANT EXECUTE ON [dbo].[spCSMBuildStatement_XLedger] TO [MssExec]
GO