create procedure [dbo].[CustomerStatementGenerate_XLedger]
@inBranchID int,
@inBranchList varchar(8000),
@inClassList varchar(8000),
@inCycleList varchar(8000),
@inCustomerNumber varchar(15),
@inCustomerName varchar(65),
@inStatementDate datetime,
@inSummarizeToDate datetime,
@inCutOffDate datetime,
@inUseDocDate bit,
@inMessage varchar(128),
@inSuppressZeroBalancesFlag bit,
@inExcludeCreditBalancesFlag bit,
@inPastDueBalancesFlag bit,
@inNonInvoicedItemsFlag bit,
@inExcludeUnappliedPaymentsFlag bit,
@inShowDetail bit,
@inGeneratedBySysUserFID int,
@inGeneratedBySysUserBranchFID int,
@inCustomerStatementProfileID int,
@inCustomerStatementTitleID int,
@inHeaderBranchAddressFID int,
@inHeaderVanlineAddressFID int,
@inRemittanceBranchAddressFID int,
@inRemittanceVanlineAddressFID int,
@outStatementRunID int output,
@outErrorCode int output,
@inGenerateUnitTestOutput bit = null
as
set nocount on
declare @theOpenDateString varchar(512)
declare @theOrderBalanceDateString varchar(4096)
declare @theSummarizeDateString varchar(10)
declare @theCutOffDateString varchar(10)
declare @theStatementDateString varchar(64)
declare @theBBFPaymentDocTypeID int
declare @theCustomerClassFilter varchar(4096)
declare @theStatementCycleFilter varchar(4096)
declare @theBranchFilter varchar(4096)
declare @theCustomerNumberFilter varchar(4096)
declare @theTempErrorCode int
set @outErrorCode = 0
set @theTempErrorCode = 0
set @inGenerateUnitTestOutput = isnull( @inGenerateUnitTestOutput, 0 )
create table #Detail
(
DetailID int identity (1, 1) not null,
CustomerStatementDocumentTypeFID integer not null,
DocumentNumber varchar(21) not null,
Description varchar(128) not null,
Amount money not null,
DocumentDate datetime not null,
Visible bit not null default( 0 ),
CustomerNumber varchar(15) not null,
OrderNumber varchar(23) not null default(''),
ShipperName varchar(64) not null default(''),
InvoiceNumber varchar(30) not null,
InvoiceDate datetime null,
Status varchar(32) not null default(''),
ApplyToDocumentDate datetime null,
ApplyToDocumentType integer null,
ApplyToDocument varchar(21) null default(''),
ApplyToInvoiceNumber varchar(30) null default(''),
ApplyToInvoiceDate datetime null
)
create table #OrderBalance
(
Description varchar(128) not null default(''),
OrderNumber varchar(23) not null default(''),
ShipperName varchar(64) not null default(''),
BalanceForwardDate datetime not null,
CustomerNumber varchar(15) not null,
CustomerStatementDocumentTypeFID int not null,
Amount money not null,
Status varchar(32) not null default(''),
ApplyToDocumentDate datetime null,
ApplyToInvoiceDate datetime null,
ApplyToInvoiceNumber varchar(30) null default('')
)
set @theBBFPaymentDocTypeID =
(
select CustomerStatementDocumentTypeID
from CustomerStatementDocumentType
where DocumentType = 'BBF'
)
if( 1 = @inUseDocDate )
begin
set @theOpenDateString = 'AcctTransactions.DocumentDate'
end
else
begin
set @theOpenDateString = 'case when isnull( AcctTransactions.InvoiceDate, ''1900-01-01'' ) = ''1900-01-01'' then AcctTransactions.DocumentDate else AcctTransactions.InvoiceDate end'
end
declare @theDateFormat int
set @theDateFormat = dbo.GetDefaultDateFormat()
set @theSummarizeDateString = convert( varchar(10), @inSummarizeToDate, @theDateFormat )
set @theCutOffDateString = convert( varchar(10), @inCutOffDate, @theDateFormat )
set @theStatementDateString = convert( varchar(10), @inStatementDate, @theDateFormat )
set transaction isolation level read uncommitted
begin transaction
insert into CustomerStatementRun
(
CustomerStatementProfileFID,
CustomerStatementTitleFID,
CustomerNumber,
CustomerName,
StatementDate,
SummarizeToDate,
CutOffDate,
Message,
SuppressZeroBalancesFlag,
ExcludeCreditBalancesFlag,
PastDueBalancesFlag,
NonInvoicedItemsFlag,
ExcludeUnappliedPaymentsFlag,
ShowInvoiceDetailsFlag,
GeneratedDate,
GeneratedBySysUserFID,
GeneratedBySysUserBranchFID,
HeaderBranchAddressFID,
HeaderVanlineAddressFID,
RemittanceBranchAddressFID,
RemittanceVanlineAddressFID
)
select
CustomerStatementProfileFID = @inCustomerStatementProfileID,
CustomerStatementTitleFID = @inCustomerStatementTitleID,
CustomerNumber = @inCustomerNumber,
CustomerName = @inCustomerName,
StatementDate = @theStatementDateString,
SummarizeToDate = @theSummarizeDateString,
CutOffDate = @theCutOffDateString,
Message = @inMessage,
SuppressZeroBalancesFlag = @inSuppressZeroBalancesFlag,
ExcludeCreditBalancesFlag = @inExcludeCreditBalancesFlag,
PastDueBalancesFlag = @inPastDueBalancesFlag,
NonInvoicedItemsFlag = @inNonInvoicedItemsFlag,
ExcludeUnappliedPaymentsFlag = @inExcludeUnappliedPaymentsFlag,
ShowInvoiceDetailsFlag = @inShowDetail,
GeneratedDate = getdate(),
GeneratedBySysUserFID = @inGeneratedBySysUserFID,
GeneratedBySysUserBranchFID = @inGeneratedBySysUserBranchFID,
HeaderBranchAddressFID = @inHeaderBranchAddressFID,
HeaderVanlineAddressFID = @inHeaderVanlineAddressFID,
RemittanceBranchAddressFID = @inRemittanceBranchAddressFID,
RemittanceVanlineAddressFID = @inRemittanceVanlineAddressFID
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
set @outStatementRunID = scope_identity()
exec CustomerStatementInsertRunBranches @outStatementRunID, @inBranchList
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
exec CustomerStatementInsertRunClasses @outStatementRunID, @inClassList
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
if( 0 != @outErrorCode )
begin
rollback transaction
end
else
begin
commit transaction
end
if( '' != @inClassList and '' = @inCustomerNumber )
begin
set @theCustomerClassFilter = 'inner join CustomerStatementRunCustomerClass on CustomerStatementRunCustomerClass.AccountingCustomerClassFid = AccountingCustomer.AccountingCustomerClassFid and CustomerStatementRunCustomerClass.CustomerStatementRunFID = ' + rtrim( str( @outStatementRunID ) )
end
else
begin
set @theCustomerClassFilter = ''
end
set @theStatementCycleFilter = ''
if( '' != @inBranchList )
begin
set @theBranchFilter = 'inner join CustomerStatementRunBranches on CustomerStatementRunBranches.BranchID = AcctTransactions.BranchID and CustomerStatementRunBranches.CustomerStatementRunFID = ' + rtrim( str( @outStatementRunID ) )
end
else
begin
set @theBranchFilter = ''
end
if( '' != @inCustomerNumber )
begin
set @theCustomerNumberFilter = ' and ' + dbo.QuoteString( @inCustomerNumber ) + ' = AccountingCustomer.CustomerNumber '
end
else
begin
set @theCustomerNumberFilter = ''
end
exec
(
'insert into #Detail
(
CustomerStatementDocumentTypeFID,
DocumentNumber,
Description,
Amount,
DocumentDate,
Visible,
CustomerNumber,
OrderNumber,
ShipperName,
InvoiceNumber,
InvoiceDate,
Status
)
select
CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID,
DocumentNumber = AcctTransactions.DocumentNumber,
Description = AcctTransactions.ItemDescription,
Amount = case AcctTransactions.TransactionType
when ''A/R Credit Memo'' then -AcctTransactions.TransactionAmount
when ''A/R Cash Receipt'' then -AcctTransactions.TransactionAmount
else AcctTransactions.TransactionAmount
end,
DocumentDate = AcctTransactions.DocumentDate,
Visible = case
when isnull( case
when LastInvoicedHeader.IHPriKey is null then null
else AcctTransactions.InvoiceNumber
end, '''' ) = '''' then 1
else ' + @inShowDetail + '
end,
CustomerNumber = AccountingCustomer.CustomerNumber,
OrderNumber = isnull( case
when AcctTransactions.OrdPriKey < 0 then null
when rtrim( AcctTransactions.OrderNo ) = '''' then null
else rtrim( AcctTransactions.OrderNo )
end, '''' ),
ShipperName = isnull( case
when AcctTransactions.OrdPriKey < 0 then null
when AcctTransactions.ShipperName = '''' then null
else AcctTransactions.ShipperName
end, '''' ),
InvoiceNumber = isnull( case
when LastInvoicedHeader.IHPriKey is null then null
else AcctTransactions.InvoiceNumber
end, '''' ),
InvoiceDate = case
when case
when LastInvoicedHeader.IHPriKey is null then null
else AcctTransactions.InvoiceDate
end is null then AcctTransactions.DocumentDate
else AcctTransactions.InvoiceDate
end,
Status = case AcctTransactions.TransactionType
when ''A/R Cash Receipt'' then ''Open'' --''ApplyTo''
else ''Open''
end
from XLedgerJournalEntryBatchItem
inner join AcctTransactions on AcctTransactions.ATPriKey = XLedgerJournalEntryBatchItem.AcctTransactionFid
left outer join AcctTransactionsApplyToInfo on AcctTransactionsApplyToInfo.AcctTransactionsFID = AcctTransactions.ATPriKey
inner join XLedgerCustomer on XLedgerCustomer.ExternalDbId = XLedgerJournalEntryBatchItem.XLedgerCustomerXLedgerDbId
inner join AccountingCustomer on
AccountingCustomer.AccountingCustomerId = XLedgerCustomer.AccountingCustomerFid' + @theCustomerNumberFilter + ' ' +
@theCustomerClassFilter + ' ' +
@theStatementCycleFilter + ' ' +
@theBranchFilter + '
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.DocumentTypeID = case AcctTransactions.TransactionType
' +
'when ''A/R Sales / Invoice'' then 1 ' +
'when ''A/R Debit Memo'' then 3 ' +
'when ''A/R Credit Memo'' then 7 ' +
'when ''A/R Cash Receipt'' then 9 ' +
'else 0
end
outer apply (
select top 1
InvoicedHeader.IHPriKey
from InvoicedHeader
where InvoicedHeader.InvoiceNumber = AcctTransactions.InvoiceNumber
order by InvoicedHeader.IHPriKey desc
) as LastInvoicedHeader
where XLedgerJournalEntryBatchItem.XLedgerTransactionHeaderFid is not null and
AcctTransactions.TransactionType in ( ''A/R Sales / Invoice'', ''A/R Debit Memo'', ''A/R Credit Memo'', ''A/R Cash Receipt'' ) and
AcctTransactionsApplyToInfo.AcctTransactionsApplyToInfoId is null and
AcctTransactions.CustomerNumber != ''ZZZZZ'' and
( ' +
@theOpenDateString + ' > ''' + @theSummarizeDateString + ''' and ' +
@theOpenDateString + ' <= ''' + @theCutOffDateString + ''' and
(
' + @inExcludeUnappliedPaymentsFlag + ' = 0 or
AcctTransactions.TransactionType != ''A/R Cash Receipt'' --RM20101.RMDTYPAL != 9
)
)'
)
exec
(
'insert into #Detail
(
CustomerStatementDocumentTypeFID,
DocumentNumber,
Description,
Amount,
DocumentDate,
Visible,
CustomerNumber,
OrderNumber,
ShipperName,
InvoiceNumber,
InvoiceDate,
Status,
ApplyToDocumentDate,
ApplyToDocumentType,
ApplyToDocument,
ApplyToInvoiceNumber,
ApplyToInvoiceDate
)
select
CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID,
DocumentNumber = AcctTransactions.DocumentNumber,
Description = AcctTransactions.ItemDescription,
Amount = -AcctTransactionsApplyToInfo.ApplyAmount,
DocumentDate= AcctTransactions.DocumentDate,
Visible = case
when isnull( case
when LastInvoicedHeader.IHPriKey is null then null
else AcctTransactions.InvoiceNumber
end, '''' ) = '''' then 1
else ' + @inShowDetail + '
end,
CustomerNumber = AccountingCustomer.CustomerNumber,
OrderNumber = isnull( case
when AcctTransactions.OrdPriKey < 0 then null
when rtrim( AcctTransactions.OrderNo ) = '''' then null
else rtrim( AcctTransactions.OrderNo )
end, '''' ),
ShipperName = isnull( case
when AcctTransactions.OrdPriKey < 0 then null
when AcctTransactions.ShipperName = '''' then null
else AcctTransactions.ShipperName
end, '''' ),
InvoiceNumber = '''',
InvoiceDate = AcctTransactions.DocumentDate,
Status = ''Open ApplyTo'',
ApplyToDocumentDate = AppliedToDocument.DocumentDate,
ApplyToDocumentType = case AcctTransactionsApplyToInfo.ApplyToDocumentType ' +
'when ''A/R Sales / Invoice'' then 1 ' +
'when ''A/R Debit Memo'' then 3 ' +
'when ''A/R Credit Memo'' then 7 ' +
'when ''A/R Cash Receipt'' then 9 ' +
'else 0
end,
ApplyToDocument = AcctTransactionsApplyToInfo.ApplyToDocument,
ApplyToInvoiceNumber = isnull( AppliedToDocument.InvoiceNumber, '''' ),
ApplyToInvoiceDate = case
when isnull( AppliedToDocument.InvoiceDate, ''1900-01-01'' ) = ''1900-01-01'' then AppliedToDocument.DocumentDate
else AppliedToDocument.InvoiceDate
end
from XLedgerJournalEntryBatchItem
inner join AcctTransactions on AcctTransactions.ATPriKey = XLedgerJournalEntryBatchItem.AcctTransactionFid
inner join AcctTransactionsApplyToInfo on AcctTransactionsApplyToInfo.AcctTransactionsFID = AcctTransactions.ATPriKey
inner join XLedgerCustomer on XLedgerCustomer.ExternalDbId = XLedgerJournalEntryBatchItem.XLedgerCustomerXLedgerDbId
inner join AccountingCustomer on
AccountingCustomer.AccountingCustomerId = XLedgerCustomer.AccountingCustomerFid' + @theCustomerNumberFilter + ' ' +
@theCustomerClassFilter + ' ' +
@theStatementCycleFilter + ' ' +
@theBranchFilter + '
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.DocumentTypeID = case AcctTransactions.TransactionType
' +
'when ''A/R Sales / Invoice'' then 1 ' +
'when ''A/R Debit Memo'' then 3 ' +
'when ''A/R Credit Memo'' then 7 ' +
'when ''A/R Cash Receipt'' then 9 ' +
'else 0
end
outer apply (
select top 1
InvoiceDate = ApplyToTrxn.InvoiceDate,
InvoiceNumber = ApplyToTrxn.InvoiceNumber,
DocumentDate = ApplyToTrxn.DocumentDate,
OrdPriKey = ApplyToTrxn.OrdPriKey
from AcctTransactions as ApplyToTrxn
where ApplyToTrxn.DocumentNumber = AcctTransactionsApplyToInfo.ApplyToDocument
order by ApplyToTrxn.ATPriKey desc
) as AppliedToDocument
outer apply (
select top 1
InvoicedHeader.IHPriKey
from InvoicedHeader
where InvoicedHeader.InvoiceNumber = AppliedToDocument.InvoiceNumber
order by InvoicedHeader.IHPriKey desc
) as LastInvoicedHeader
where XLedgerJournalEntryBatchItem.XLedgerTransactionHeaderFid is not null and
AcctTransactions.TransactionType in ( ''A/R Sales / Invoice'', ''A/R Debit Memo'', ''A/R Credit Memo'', ''A/R Cash Receipt'' ) and
AcctTransactions.CustomerNumber != ''ZZZZZ'' and
( ' +
@theOpenDateString + ' > ''' + @theSummarizeDateString + ''' and ' +
@theOpenDateString + ' <= ''' + @theCutOffDateString + ''' ' +
' )'
)
exec
(
'insert into #OrderBalance
(
CustomerStatementDocumentTypeFID,
OrderNumber,
ShipperName,
Description,
Amount,
BalanceForwardDate,
CustomerNumber,
Status,
ApplyToDocumentDate,
ApplyToInvoiceDate,
ApplyToInvoiceNumber
)
select
CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID,
OrderNumber = isnull( case
when AcctTransactions.OrdPriKey < 0 then null
when rtrim( AcctTransactions.OrderNo ) = '''' then null
else rtrim( AcctTransactions.OrderNo )
end, '''' ),
ShipperName = isnull( case
when AcctTransactions.OrdPriKey < 0 then null
when AcctTransactions.ShipperName = '''' then null
else AcctTransactions.ShipperName
end, '''' ),
Description = ''Beginning Balance Forward'',
Amount = case AcctTransactions.TransactionType
when ''A/R Credit Memo'' then -AcctTransactions.TransactionAmount
when ''A/R Cash Receipt'' then -AcctTransactions.TransactionAmount
else AcctTransactions.TransactionAmount - isnull( ExistingPayments.TotalAmount, 0 )
end,
BalanceForwardDate = ''' + @theSummarizeDateString + ''',
CustomerNumber = AccountingCustomer.CustomerNumber,
Status = case AcctTransactions.TransactionType
when ''A/R Cash Receipt'' then ''Open''
else ''Open''
end,
ApplyToDocumentDate = AcctTransactions.DocumentDate,
ApplyToInvoiceDate = isnull( AcctTransactions.InvoiceDate, AcctTransactions.DocumentDate ),
ApplyToInvoiceNumber = ''''
from XLedgerJournalEntryBatchItem
inner join AcctTransactions on AcctTransactions.ATPriKey = XLedgerJournalEntryBatchItem.AcctTransactionFid
left outer join AcctTransactionsApplyToInfo on AcctTransactionsApplyToInfo.AcctTransactionsFID = AcctTransactions.ATPriKey
inner join XLedgerCustomer on XLedgerCustomer.ExternalDbId = XLedgerJournalEntryBatchItem.XLedgerCustomerXLedgerDbId
inner join AccountingCustomer on
AccountingCustomer.AccountingCustomerId = XLedgerCustomer.AccountingCustomerFid' + @theCustomerNumberFilter + ' ' +
@theCustomerClassFilter + ' ' +
@theStatementCycleFilter + ' ' +
@theBranchFilter + '
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.DocumentTypeID = case AcctTransactions.TransactionType
' +
'when ''A/R Sales / Invoice'' then 1 ' +
'when ''A/R Debit Memo'' then 3 ' +
'when ''A/R Credit Memo'' then 7 ' +
'when ''A/R Cash Receipt'' then 9 ' +
'else 0
end
outer apply (
select
TotalAmount = sum( AppliedPayments.ApplyAmount )
from AcctTransactionsApplyToInfo as AppliedPayments
inner join XLedgerJournalEntryBatchItem on XLedgerJournalEntryBatchItem.AcctTransactionFid = AppliedPayments.AcctTransactionsFID
where AppliedPayments.ApplyToDocument = AcctTransactions.DocumentNumber and
XLedgerJournalEntryBatchItem.XLedgerTransactionHeaderFid is not null
) as ExistingPayments
where XLedgerJournalEntryBatchItem.XLedgerTransactionHeaderFid is not null and
AcctTransactions.TransactionType in ( ''A/R Sales / Invoice'', ''A/R Debit Memo'', ''A/R Credit Memo'', ''A/R Cash Receipt'' ) and
AcctTransactionsApplyToInfo.AcctTransactionsApplyToInfoId is null and
AcctTransactions.CustomerNumber != ''ZZZZZ'' and
(
' + @theOpenDateString + ' <= ''' + @theSummarizeDateString + ''' and
(
' + @inNonInvoicedItemsFlag + ' = 1 or
isnull( case AcctTransactions.TransactionType
' +
'when ''A/R Sales / Invoice'' then AcctTransactions.InvoiceNumber ' +
'when ''A/R Debit Memo'' then AcctTransactions.InvoiceNumber ' +
'when ''A/R Credit Memo'' then AcctTransactions.InvoiceNumber ' +
'when ''A/R Cash Receipt'' then null ' +
'else null
end, '''' ) != ''''
)
and (
' + @inExcludeUnappliedPaymentsFlag + ' = 0 or
AcctTransactionsApplyToInfo.AcctTransactionsApplyToInfoID is not null or
AcctTransactions.TransactionType != ''A/R Cash Receipt''
)
)
group by
CustomerStatementDocumentType.CustomerStatementDocumentTypeID,
AcctTransactions.OrderNo,
AcctTransactions.ShipperName,
AcctTransactions.TransactionType,
AcctTransactions.TransactionAmount,
AcctTransactions.ATPriKey,
AccountingCustomer.CustomerNumber,
AcctTransactions.DocumentNumber,
AcctTransactions.DocumentDate,
AcctTransactions.InvoiceDate,
AcctTransactions.OrdPriKey,
ExistingPayments.TotalAmount'
)
if( 1 = @inUseDocDate )
begin
set @theOrderBalanceDateString = 'AcctTransactions.DocumentDate'
end
else
begin
set @theOrderBalanceDateString = 'isnull( AcctTransactions.InvoiceDate, AcctTransactions.DocumentDate )'
end
exec
(
'insert into #OrderBalance
(
CustomerStatementDocumentTypeFID,
OrderNumber,
ShipperName,
Description,
Amount,
BalanceForwardDate,
CustomerNumber,
Status,
ApplyToDocumentDate,
ApplyToInvoiceDate,
ApplyToInvoiceNumber
)
select
CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID,
OrderNumber = Detail.OrderNumber,
ShipperName = isnull( AppliedToDocument.ShipperName, '''' ),
Description = ''Beginning Balance Forward'',
Amount = case
when CustomerStatementDocumentType.DocumentTypeID in ( 7, 9 ) then -AcctTransactionsApplyToInfo.ApplyAmount
else AcctTransactionsApplyToInfo.ApplyAmount
end,
BalanceForwardDate = ''' + @theSummarizeDateString + ''',
CustomerNumber = Detail.CustomerNumber,
Status = ''Open ApplyTo'',
ApplyToDocumentDate = AppliedToDocument.DocumentDate,
ApplyToInvoiceDate = isnull( AppliedToDocument.InvoiceDate, AcctTransactions.DocumentDate ),
ApplyToInvoiceNumber = isnull( AppliedToDocument.InvoiceNumber, '''' )
from #Detail as Detail
inner join CustomerStatementDocumentType as DetailDocType on DetailDocType.CustomerStatementDocumentTypeID = Detail.CustomerStatementDocumentTypeFID
inner join AcctTransactionsApplyToInfo on AcctTransactionsApplyToInfo.ApplyToDocument = Detail.DocumentNumber and
case AcctTransactionsApplyToInfo.ApplyToDocumentType
' +
'when ''A/R Sales / Invoice'' then 1 ' +
'when ''A/R Debit Memo'' then 3 ' +
'when ''A/R Credit Memo'' then 7 ' +
'when ''A/R Cash Receipt'' then 9 ' +
'else 0
end = DetailDocType.DocumentTypeID and
Detail.Status = ''Open''
inner join XLedgerJournalEntryBatchItem on XLedgerJournalEntryBatchItem.AcctTransactionFid = AcctTransactionsApplyToInfo.AcctTransactionsFID
inner join AcctTransactions on AcctTransactions.ATPriKey = AcctTransactionsApplyToInfo.AcctTransactionsFID
inner join XLedgerCustomer on XLedgerCustomer.ExternalDbId = XLedgerJournalEntryBatchItem.XLedgerCustomerXLedgerDbId
inner join AccountingCustomer on
AccountingCustomer.AccountingCustomerId = XLedgerCustomer.AccountingCustomerFid' + @theCustomerNumberFilter + ' ' +
@theCustomerClassFilter + ' ' +
@theStatementCycleFilter + ' ' +
@theBranchFilter + '
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.DocumentTypeID = case AcctTransactions.TransactionType
' +
'when ''A/R Sales / Invoice'' then 1 ' +
'when ''A/R Debit Memo'' then 3 ' +
'when ''A/R Credit Memo'' then 7 ' +
'when ''A/R Cash Receipt'' then 9 ' +
'else 0
end
outer apply (
select top 1
ShipperName = ApplyToTrxn.ShipperName,
DocumentDate = ApplyToTrxn.DocumentDate,
InvoiceNumber = ApplyToTrxn.InvoiceNumber,
InvoiceDate = ApplyToTrxn.InvoiceDate
from AcctTransactions as ApplyToTrxn
where ApplyToTrxn.DocumentNumber = AcctTransactionsApplyToInfo.ApplyToDocument
order by ApplyToTrxn.ATPriKey desc
) as AppliedToDocument
where
(
XLedgerJournalEntryBatchItem.XLedgerTransactionHeaderFid is not null and
(
' + @inNonInvoicedItemsFlag + ' = 1 or
Detail.InvoiceNumber != ''''
) and ' +
@theOrderBalanceDateString + ' <= ''' + @theSummarizeDateString + '''
)
group by
CustomerStatementDocumentType.CustomerStatementDocumentTypeID,
Detail.OrderNumber,
AppliedToDocument.ShipperName,
CustomerStatementDocumentType.DocumentTypeID,
AcctTransactionsApplyToInfo.ApplyAmount,
AcctTransactions.ATPriKey,
Detail.CustomerNumber,
AcctTransactions.DocumentDate,
AppliedToDocument.DocumentDate,
AppliedToDocument.InvoiceNumber,
AppliedToDocument.InvoiceDate'
)
if( 1 = @inUseDocDate )
begin
set @theOrderBalanceDateString =
' ApplyTable.APFRDCDT > ''' + @theSummarizeDateString + ''' and
ApplyTable.APFRDCDT <= ''' + @theCutOffDateString + ''' and
ApplyTable.APTODCDT <= ''' + @theSummarizeDateString + ''' and '
end
else
begin
set @theOrderBalanceDateString =
' isnull( ApplyTable.APFRINVDT, ApplyTable.APFRDCDT ) > ''' + @theSummarizeDateString + ''' and
isnull( ApplyTable.APFRINVDT, ApplyTable.APFRDCDT ) <= ''' + @theCutOffDateString + ''' and
isnull( ApplyTable.APTOINVDT, ApplyTable.APTODCDT ) <= ''' + @theSummarizeDateString + ''' and '
end
exec
(
'insert into #OrderBalance
(
CustomerStatementDocumentTypeFID,
OrderNumber,
ShipperName,
Description,
Amount,
BalanceForwardDate,
CustomerNumber,
Status,
ApplyToDocumentDate,
ApplyToInvoiceDate,
ApplyToInvoiceNumber
)
select
CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID,
OrderNumber = isnull( ApplyTable.OrderNo, '''' ),
ShipperName = isnull( ApplyTable.ShipperName, '''' ),
Description = ''Beginning Balance Forward'',
Amount = abs( ApplyTable.APPTOAMT ),
BalanceForwardDate = ''' + @theSummarizeDateString + ''',
CustomerNumber = AccountingCustomer.CustomerNumber,
Status = ''ApplyTo'',
ApplyToDocumentDate = ApplyTable.APTODCDT,
ApplyToInvoiceDate = isnull( ApplyTable.APTOINVDT, ApplyTable.APTODCDT ),
ApplyToInvoiceNumber = isnull( ApplyTable.APTOINVNO, '''' )
from
(
select
APPTOAMT = AcctTransactionsApplyToInfo.ApplyAmount,
AccountingCustomerFid = XLedgerCustomer.AccountingCustomerFid,
APTODCDT = AppliedToDocument.DocumentDate,
APTODCNM = AcctTransactionsApplyToInfo.ApplyToDocument,
APTOINVDT = AppliedToDocument.InvoiceDate,
OrderNo = AppliedToDocument.OrderNo,
ShipperName = AppliedToDocument.ShipperName,
APTOINVNO = AppliedToDocument.InvoiceNumber,
APFRDCTY = case AcctTransactions.TransactionType ' +
'when ''A/R Sales / Invoice'' then 1 ' +
'when ''A/R Debit Memo'' then 3 ' +
'when ''A/R Credit Memo'' then 7 ' +
'when ''A/R Cash Receipt'' then 9 ' +
'else 0
end,
APFRDCDT = AcctTransactions.DocumentDate,
APFRDCNM = AcctTransactions.DocumentNumber,
APFRINVDT = AcctTransactions.InvoiceDate
from XLedgerJournalEntryBatchItem
inner join AcctTransactions on AcctTransactions.ATPriKey = XLedgerJournalEntryBatchItem.AcctTransactionFid
' + @theBranchFilter + '
inner join AcctTransactionsApplyToInfo on AcctTransactionsApplyToInfo.AcctTransactionsFID = AcctTransactions.ATPriKey
inner join XLedgerCustomer on XLedgerCustomer.ExternalDbId = XLedgerJournalEntryBatchItem.XLedgerCustomerXLedgerDbId
outer apply (
select top 1
DocumentDate = ApplyToTrxn.DocumentDate,
InvoiceDate = ApplyToTrxn.InvoiceDate,
InvoiceNumber = ApplyToTrxn.InvoiceNumber,
OrderNo = ApplyToTrxn.OrderNo,
ShipperName = ApplyToTrxn.ShipperName
from AcctTransactions as ApplyToTrxn
where ApplyToTrxn.DocumentNumber = AcctTransactionsApplyToInfo.ApplyToDocument
order by ApplyToTrxn.ATPriKey desc
) as AppliedToDocument
) ApplyTable
inner join AccountingCustomer on
AccountingCustomer.AccountingCustomerId = ApplyTable.AccountingCustomerFid' + @theCustomerNumberFilter + ' ' +
@theCustomerClassFilter + ' ' +
@theStatementCycleFilter + '
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.DocumentTypeID = ApplyTable.APFRDCTY
where
(
' + @theOrderBalanceDateString + '
(
( ' + @inNonInvoicedItemsFlag + ' = 1 or
isnull( ApplyTable.APTOINVNO, '''' ) != '''' )
)
)'
)
set transaction isolation level read uncommitted
begin transaction
exec
(
'insert into CustomerStatement
(
CustomerStatementRunFID,
CustomerName,
StatementName,
CustomerNumber,
CustomerAddress1,
CustomerAddress2,
CustomerAddress3,
CustomerCity,
CustomerState,
CustomerPostalCode,
CustomerCountry,
PaymentTerms,
CurrentAmount,
From30To60Amount,
From61To90Amount,
From91To120Amount,
GreaterThan120Amount,
CustomerClass,
StatementCycle,
EmailAddress
)
select
CustomerStatementRunFID = ' + @outStatementRunID + ',
CustomerName = isnull( AccountingCustomer.[Name], concat( ''Customer '', Detail.CustomerNumber, '' not found'' ) ),
StatementName = isnull( AccountingCustomer.[Name], concat( ''Customer '', Detail.CustomerNumber, '' not found'' ) ), --RM00101.STMTNAME
CustomerNumber = Detail.CustomerNumber,
CustomerAddress1 = isnull( AccountingCustomerAddress.Address1, '''' ),
CustomerAddress2 = isnull( AccountingCustomerAddress.Address2, '''' ),
CustomerAddress3 = isnull( AccountingCustomerAddress.Address3, '''' ),
CustomerCity = isnull( AccountingCustomerAddress.City, '''' ),
CustomerState = isnull( AccountingCustomerAddress.[State], '''' ),
CustomerPostalCode = isnull( AccountingCustomerAddress.PostalCode, '''' ),
CustomerCountry = case
when CountryCodeStandard.CountryName is null then ''''
when len( CountryCodeStandard.CountryName ) > 61 then substring( CountryCodeStandard.CountryName, 1, 61 )
else CountryCodeStandard.CountryName
end,
PaymentTerms = case
when AccountingCustomerPaymentTerms.TermsDescription is null then ''''
when len( AccountingCustomerPaymentTerms.TermsDescription ) > 21 then substring( AccountingCustomerPaymentTerms.TermsDescription, 1, 21 )
else AccountingCustomerPaymentTerms.TermsDescription
end,
CurrentAmount = 0,
From30To60Amount = 0,
From61To90Amount = 0,
From91To120Amount = 0,
GreaterThan120Amount = 0,
CustomerClass = isnull( AccountingCustomerClass.ClassCode, '''' ),
StatementCycle = CustomerStatementStatementCycle.StatementCycle,
EmailAddress = isnull( AccountingCustomer.Email, '''' )
from
(
select
DocumentDate,
InvoiceDate,
Amount,
CustomerNumber,
Status
from #Detail
union
select
''1900-01-01'' as DocumentDate,
''1900-01-01'' as InvoiceDate,
0 as Amount,
CustomerNumber,
Status
from #OrderBalance
) as Detail
inner join AccountingCustomerAddressType on AccountingCustomerAddressType.TypeName = dbo.GetDefaultAccountingCustomerAddressTypeName()
left outer join AccountingCustomer on AccountingCustomer.CustomerNumber = Detail.CustomerNumber
left outer join AccountingCustomerAddress on AccountingCustomerAddress.AccountingCustomerFid = AccountingCustomer.AccountingCustomerId and
AccountingCustomerAddress.AccountingCustomerAddressTypeFid = AccountingCustomerAddressType.AccountingCustomerAddressTypeId
left outer join CountryCodeStandard on CountryCodeStandard.CountryCodeStandardId = AccountingCustomerAddress.CountryCodeStandardFid
left outer join AccountingCustomerClass on
AccountingCustomerClass.AccountingCustomerClassId = AccountingCustomer.AccountingCustomerClassFid
left outer join AccountingCustomerPaymentTerms on
AccountingCustomerPaymentTerms.AccountingCustomerPaymentTermsId = AccountingCustomer.AccountingCustomerPaymentTermsFid
left outer join CustomerStatementStatementCycle on CustomerStatementStatementCycle.StatementCycleID = 5
where Detail.Status != ''ApplyTo''
group by
AccountingCustomer.[Name],
--RM00101.STMTNAME,
Detail.CustomerNumber,
AccountingCustomerAddress.Address1,
AccountingCustomerAddress.Address2,
AccountingCustomerAddress.Address3,
AccountingCustomerAddress.City,
AccountingCustomerAddress.[State],
AccountingCustomerAddress.PostalCode,
CountryCodeStandard.CountryName,
AccountingCustomerPaymentTerms.TermsDescription,
AccountingCustomerClass.ClassCode,
CustomerStatementStatementCycle.StatementCycle,
AccountingCustomer.Email'
)
update CustomerStatement
set
CurrentAmount = isnull( AgingTable.CurrentAmount, 0 ),
From30To60Amount = isnull( AgingTable.From30To60Amount, 0 ),
From61To90Amount = isnull( AgingTable.From61To90Amount, 0 ),
From91To120Amount = isnull( AgingTable.From91To120Amount, 0 ),
GreaterThan120Amount = isnull( AgingTable.GreaterThan120Amount, 0 )
from
(
select
CustomerNumber = Detail.CustomerNumber,
CurrentAmount =
isnull( sum(
case
when
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end >= dateadd( day, -30, @inStatementDate )
then Detail.Amount
else 0
end
), 0 ),
From30To60Amount =
isnull( sum(
case
when
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end >= dateadd( day, -60, @inStatementDate ) and
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end <= convert( datetime, @theStatementDateString ) - 31
then Detail.Amount
else 0
end
), 0 ),
From61To90Amount =
isnull( sum(
case
when
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end >= dateadd( day, -90, @inStatementDate ) and
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end <= convert( datetime, @theStatementDateString ) - 61
then Detail.Amount
else 0
end
), 0 ),
From91To120Amount =
isnull( sum(
case
when
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end >= dateadd( day, -120, @inStatementDate ) and
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end <= convert( datetime, @theStatementDateString ) - 91
then Detail.Amount
else 0
end
), 0 ),
GreaterThan120Amount =
isnull( sum(
case
when
case
when Detail.Status not like '%ApplyTo' then
case
when @inUseDocDate = 1 or isnull( Detail.InvoiceDate, '1900-01-01' ) = '1900-01-01' then Detail.DocumentDate
else Detail.InvoiceDate
end
else
case
when @inUseDocDate = 1 then Detail.ApplyToDocumentDate
else Detail.ApplyToInvoiceDate
end
end <= convert( datetime, @theStatementDateString ) - 121
then Detail.Amount
else 0
end
), 0 )
from #Detail as Detail
inner join CustomerStatementDocumentType on Detail.CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID
where
(
@inNonInvoicedItemsFlag = 1 or
Detail.InvoiceNumber != '' or
CustomerStatementDocumentType.DocumentTypeID = 9
)
group by Detail.CustomerNumber
) as AgingTable
where
(
AgingTable.CustomerNumber = CustomerStatement.CustomerNumber and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
)
update CustomerStatement
set
CurrentAmount = CustomerStatement.CurrentAmount + isnull( AgingTable.CurrentAmount, 0 ),
From30To60Amount = CustomerStatement.From30To60Amount + isnull( AgingTable.From30To60Amount, 0 ),
From61To90Amount = CustomerStatement.From61To90Amount + isnull( AgingTable.From61To90Amount, 0 ),
From91To120Amount = CustomerStatement.From91To120Amount + isnull( AgingTable.From91To120Amount, 0 ),
GreaterThan120Amount = CustomerStatement.GreaterThan120Amount + isnull( AgingTable.GreaterThan120Amount, 0 )
from
(
select
CustomerNumber = OrderBalance.CustomerNumber,
CurrentAmount =
isnull( sum(
case
when
case
when @inUseDocDate = 1
then OrderBalance.ApplyToDocumentDate
else OrderBalance.ApplyToInvoiceDate
end >= dateadd( day, -30, @inStatementDate )
then OrderBalance.Amount
else 0
end
), 0 ),
From30To60Amount =
isnull( sum(
case
when
case
when @inUseDocDate = 1
then OrderBalance.ApplyToDocumentDate
else OrderBalance.ApplyToInvoiceDate
end between dateadd( day, -60, @inStatementDate ) and convert( datetime, @theStatementDateString ) - 31
then OrderBalance.Amount
else 0
end
), 0 ),
From61To90Amount =
isnull( sum(
case
when
case
when @inUseDocDate = 1
then OrderBalance.ApplyToDocumentDate
else OrderBalance.ApplyToInvoiceDate
end between dateadd( day, -90, @inStatementDate ) and convert( datetime, @theStatementDateString ) - 61
then OrderBalance.Amount
else 0
end
), 0 ),
From91To120Amount =
isnull( sum(
case
when
case
when @inUseDocDate = 1
then OrderBalance.ApplyToDocumentDate
else OrderBalance.ApplyToInvoiceDate
end between dateadd( day, -120, @inStatementDate ) and convert( datetime, @theStatementDateString ) - 91
then OrderBalance.Amount
else 0
end
), 0 ),
GreaterThan120Amount =
isnull( sum(
case
when
case
when @inUseDocDate = 1
then OrderBalance.ApplyToDocumentDate
else OrderBalance.ApplyToInvoiceDate
end <= convert( datetime, @theStatementDateString ) - 121
then OrderBalance.Amount
else 0
end
), 0 )
from #OrderBalance OrderBalance
group by OrderBalance.CustomerNumber
) as AgingTable
where
(
AgingTable.CustomerNumber = CustomerStatement.CustomerNumber and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
)
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementOrderGroup
(
CustomerStatementFID,
Amount,
OrderNumber,
Shipper,
Description,
CustomerStatementDocumentTypeFID,
BalanceForwardDate,
Status
)
select
CustomerStatementFID = CustomerStatement.CustomerStatementID,
Amount = 0,
OrderNumber = Detail.OrderNumber,
Shipper = Detail.ShipperName,
Description = 'Beginning Balance Forward',
CustomerStatementDocumentTypeFID = @theBBFPaymentDocTypeID,
BalanceForwardDate = @theSummarizeDateString,
Status = 'Order'
from #Detail as Detail
inner join CustomerStatement on CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on Detail.CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID
where
(
Detail.OrderNumber != '' and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
(
@inNonInvoicedItemsFlag = 1 or
Detail.InvoiceNumber != '' or
CustomerStatementDocumentType.DocumentTypeID = 9
)
)
group by
CustomerStatement.CustomerStatementID,
Detail.OrderNumber,
Detail.ShipperName
set @theTempErrorCode = @@error
if 0 != @theTempErrorCode
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementOrderGroup
(
CustomerStatementFID,
Amount,
OrderNumber,
Description,
CustomerStatementDocumentTypeFID,
BalanceForwardDate,
Status,
Balance
)
select
CustomerStatementFID = CustomerStatement.CustomerStatementID,
Amount = Detail.Amount,
OrderNumber = Detail.DocumentNumber,
Description = Detail.Description,
CustomerStatementDocumentTypeFID = Detail.CustomerStatementDocumentTypeFID,
BalanceForwardDate = Detail.DocumentDate,
Status = Detail.Status,
Balance = Detail.Amount
from #Detail as Detail
inner join CustomerStatement on CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on Detail.CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID
where
(
Detail.OrderNumber = '' and
Detail.InvoiceNumber = '' and
(
@inNonInvoicedItemsFlag = 1 or
CustomerStatementDocumentType.DocumentTypeID = 9
) and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
)
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
update CustomerStatementOrderGroup
set
Amount =
(
select isnull( sum( InnerOrderBalance.Amount ), 0 )
from #OrderBalance InnerOrderBalance
where
(
CustomerStatementOrderGroup.OrderNumber = InnerOrderBalance.OrderNumber and
CustomerStatementOrderGroup.Shipper = InnerOrderBalance.ShipperName and
CustomerStatement.CustomerNumber = InnerOrderBalance.CustomerNumber
)
)
from #OrderBalance OrderBalance
inner join CustomerStatementOrderGroup on
(
CustomerStatementOrderGroup.OrderNumber = OrderBalance.OrderNumber and
CustomerStatementOrderGroup.Shipper = OrderBalance.ShipperName
)
inner join CustomerStatement on CustomerStatement.CustomerStatementID = CustomerStatementOrderGroup.CustomerStatementFID
where
(
OrderBalance.OrderNumber != '' and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
)
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementOrderGroup
(
CustomerStatementFID,
Amount,
OrderNumber,
Shipper,
Description,
CustomerStatementDocumentTypeFID,
BalanceForwardDate,
Status,
Balance
)
select
CustomerStatementFID = CustomerStatement.CustomerStatementID,
Amount = sum( OrderBalance.Amount ),
OrderNumber = rtrim( OrderBalance.OrderNumber ),
Shipper = rtrim( OrderBalance.ShipperName ),
Description = OrderBalance.Description,
CustomerStatementDocumentTypeFID = @theBBFPaymentDocTypeID,
BalanceForwardDate = OrderBalance.BalanceForwardDate,
Status = 'Order',
Balance = sum( OrderBalance.Amount )
from #OrderBalance OrderBalance
inner join CustomerStatement on CustomerStatement.CustomerNumber = OrderBalance.CustomerNumber
left outer join CustomerStatementOrderGroup OrderGroup on
(
OrderGroup.OrderNumber = OrderBalance.OrderNumber and
OrderGroup.Shipper = OrderBalance.ShipperName and
OrderGroup.CustomerStatementFID = CustomerStatement.CustomerStatementID
)
where
(
OrderGroup.CustomerStatementOrderGroupID is null and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
)
group by
CustomerStatement.CustomerStatementID,
OrderBalance.OrderNumber,
OrderBalance.ShipperName,
OrderBalance.BalanceForwardDate,
OrderBalance.Description
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
declare @theInvoiceGroupDocTypeID int
set @theInvoiceGroupDocTypeID =
(
select CustomerStatementDocumentTypeID
from CustomerStatementDocumentType
where DocumentTypeID = 0
)
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementInvoiceGroup
(
CustomerStatementOrderGroupFID,
Amount,
InvoiceNumber,
Description,
CustomerStatementDocumentTypeFID,
InvoiceDate,
Status,
Visible
)
select
CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID,
Amount = sum( Detail.Amount ),
InvoiceNumber = Detail.InvoiceNumber,
Description = 'Invoice Number',
CustomerStatementDocumentTypeFID = @theInvoiceGroupDocTypeID,
InvoiceDate = Detail.InvoiceDate,
Status = '1-InvGroup',
Visible = 1
from #Detail as Detail
inner join CustomerStatementOrderGroup on
(
CustomerStatementOrderGroup.OrderNumber = Detail.OrderNumber and
CustomerStatementOrderGroup.Shipper = Detail.ShipperName
)
inner join CustomerStatement on CustomerStatement.CustomerStatementID = CustomerStatementOrderGroup.CustomerStatementFID and CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.CustomerStatementDocumentTypeID = Detail.CustomerStatementDocumentTypeFID
where
(
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
Detail.InvoiceNumber != ''
)
group by
CustomerStatementOrderGroup.CustomerStatementOrderGroupID,
Detail.InvoiceNumber,
Detail.InvoiceDate
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementInvoiceGroup
(
CustomerStatementOrderGroupFID,
Amount,
InvoiceNumber,
Description,
CustomerStatementDocumentTypeFID,
InvoiceDate,
Status,
Visible
)
select
CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID,
Amount = Detail.Amount,
InvoiceNumber = Detail.DocumentNumber,
Description = Detail.Description,
CustomerStatementDocumentTypeFID = Detail.CustomerStatementDocumentTypeFID,
InvoiceDate = Detail.DocumentDate,
Status = '3-' + Detail.Status,
Visible = 1
from #Detail as Detail
inner join CustomerStatementOrderGroup on
(
CustomerStatementOrderGroup.OrderNumber = Detail.OrderNumber and
CustomerStatementOrderGroup.Shipper = Detail.ShipperName
)
inner join CustomerStatement on CustomerStatement.CustomerStatementID = CustomerStatementOrderGroup.CustomerStatementFID and CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.CustomerStatementDocumentTypeID = Detail.CustomerStatementDocumentTypeFID
where
(
Detail.InvoiceNumber = '' and
isnull( Detail.ApplyToDocument, '' ) = '' and
(
@inNonInvoicedItemsFlag = 1 or
CustomerStatementDocumentType.DocumentTypeID = 9
) and
Detail.OrderNumber != '' and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
)
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementInvoiceGroup
(
CustomerStatementOrderGroupFID,
Amount,
InvoiceNumber,
Description,
CustomerStatementDocumentTypeFID,
InvoiceDate,
Status,
Visible
)
select
CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID,
Amount = sum( Detail.Amount ),
InvoiceNumber = Detail.DocumentNumber,
Description = Detail.Description,
CustomerStatementDocumentTypeFID = Detail.CustomerStatementDocumentTypeFID,
InvoiceDate = Detail.DocumentDate,
Status = '4-' + Detail.Status,
Visible = 1
from #Detail as Detail
inner join CustomerStatementOrderGroup on
(
CustomerStatementOrderGroup.OrderNumber = Detail.OrderNumber and
CustomerStatementOrderGroup.Shipper = Detail.ShipperName
)
inner join CustomerStatement on CustomerStatement.CustomerStatementID = CustomerStatementOrderGroup.CustomerStatementFID and CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on CustomerStatementDocumentType.CustomerStatementDocumentTypeID = Detail.CustomerStatementDocumentTypeFID
left outer join CustomerStatementInvoiceGroup on
(
CustomerStatementInvoiceGroup.CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID and
CustomerStatementInvoiceGroup.InvoiceNumber = Detail.ApplyToInvoiceNumber
)
where
(
Detail.InvoiceNumber = '' and
isnull( Detail.ApplyToDocument, '' ) != '' and
(
@inNonInvoicedItemsFlag = 1 or
CustomerStatementDocumentType.DocumentTypeID = 9
) and
Detail.OrderNumber != '' and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
CustomerStatementInvoiceGroup.CustomerStatementInvoiceGroupID is null and
not exists
(
select 1
from #Detail as subDetail
inner join CustomerStatementDocumentType as subType on subType.CustomerStatementDocumentTypeID = subDetail.CustomerStatementDocumentTypeFID
where
subDetail.DocumentNumber = Detail.ApplyToDocument and
subType.DocumentTypeID = Detail.ApplyToDocumentType and
(
@inNonInvoicedItemsFlag = 1 or
Detail.ApplyToInvoiceNumber != ''
)
)
)
group by
CustomerStatementOrderGroup.CustomerStatementOrderGroupID,
Detail.DocumentNumber,
Detail.Description,
Detail.CustomerStatementDocumentTypeFID,
Detail.DocumentDate,
Detail.Status
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementDetail
(
CustomerStatementInvoiceGroupFID,
CustomerStatementDocumentTypeFID,
DocumentNumber,
Description,
Amount,
DocumentDate,
Visible,
Status,
IncludedOnInvoiceFlag
)
select
CustomerStatementInvoiceGroupFID = CustomerStatementInvoiceGroup.CustomerStatementInvoiceGroupID,
CustomerStatementDocumentTypeFID = Detail.CustomerStatementDocumentTypeFID,
DocumentNumber = Detail.DocumentNumber,
Description = Detail.Description,
Amount = Detail.Amount,
DocumentDate = Detail.DocumentDate,
Visible = Detail.Visible,
Status = '1-' + Detail.Status,
IncludedOnInvoiceFlag = 1
from #Detail as Detail
inner join CustomerStatementInvoiceGroup on CustomerStatementInvoiceGroup.InvoiceNumber = Detail.InvoiceNumber
inner join CustomerStatementOrderGroup on CustomerStatementInvoiceGroup.CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID and CustomerStatementOrderGroup.OrderNumber = Detail.OrderNumber
inner join CustomerStatement on CustomerStatementOrderGroup.CustomerStatementFID = CustomerStatement.CustomerStatementID and CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on CustomerStatementInvoiceGroup.CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID
where
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementDetail
(
CustomerStatementInvoiceGroupFID,
CustomerStatementDocumentTypeFID,
DocumentNumber,
Description,
Amount,
DocumentDate,
Visible,
Status
)
select
CustomerStatementInvoiceGroupFID = CustomerStatementInvoiceGroup.CustomerStatementInvoiceGroupID,
CustomerStatementDocumentTypeFID = Detail.CustomerStatementDocumentTypeFID,
DocumentNumber = Detail.DocumentNumber,
Description = Detail.Description,
Amount = sum( Detail.Amount ),
DocumentDate = Detail.DocumentDate,
Visible = 1,
Status = '2-' + Detail.Status
from #Detail as Detail
inner join CustomerStatementInvoiceGroup on CustomerStatementInvoiceGroup.InvoiceNumber = Detail.ApplyToInvoiceNumber
inner join CustomerStatementOrderGroup on CustomerStatementInvoiceGroup.CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID and CustomerStatementOrderGroup.OrderNumber = Detail.OrderNumber
inner join CustomerStatement on CustomerStatementOrderGroup.CustomerStatementFID = CustomerStatement.CustomerStatementID and CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on CustomerStatementInvoiceGroup.CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID
inner join CustomerStatementDocumentType DocumentType on Detail.CustomerStatementDocumentTypeFID = DocumentType.CustomerStatementDocumentTypeID
where
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
CustomerStatementDocumentType.DocumentTypeID = 0 and
Detail.InvoiceNumber = '' and
(
@inNonInvoicedItemsFlag = 1 or
DocumentType.DocumentTypeID = 9
)
group by
CustomerStatementInvoiceGroup.CustomerStatementInvoiceGroupID,
Detail.CustomerStatementDocumentTypeFID,
Detail.DocumentNumber,
Detail.Description,
Detail.DocumentDate,
Detail.Status
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
insert into CustomerStatementDetail
(
CustomerStatementInvoiceGroupFID,
CustomerStatementDocumentTypeFID,
DocumentNumber,
Description,
Amount,
DocumentDate,
Visible,
Status
)
select
CustomerStatementInvoiceGroupFID = CustomerStatementInvoiceGroup.CustomerStatementInvoiceGroupID,
CustomerStatementDocumentTypeFID = Detail.CustomerStatementDocumentTypeFID,
DocumentNumber = Detail.DocumentNumber,
Description = Detail.Description,
Amount = Detail.Amount,
DocumentDate = Detail.DocumentDate,
Visible = Detail.Visible,
Status = '3-' + Detail.Status
from #Detail as Detail
inner join CustomerStatementInvoiceGroup on CustomerStatementInvoiceGroup.InvoiceNumber = Detail.ApplyToDocument
inner join CustomerStatementOrderGroup on CustomerStatementInvoiceGroup.CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID and CustomerStatementOrderGroup.OrderNumber = Detail.OrderNumber
inner join CustomerStatement on CustomerStatementOrderGroup.CustomerStatementFID = CustomerStatement.CustomerStatementID and CustomerStatement.CustomerNumber = Detail.CustomerNumber
inner join CustomerStatementDocumentType on CustomerStatementInvoiceGroup.CustomerStatementDocumentTypeFID = CustomerStatementDocumentType.CustomerStatementDocumentTypeID
where
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
CustomerStatementDocumentType.DocumentTypeID = Detail.ApplyToDocumentType and
Detail.InvoiceNumber = '' and
@inNonInvoicedItemsFlag = 1
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
update CustomerStatementOrderGroup
set
Balance = CustomerStatementOrderGroup.Amount +
isnull( (
select sum( CustomerStatementInvoiceGroup.Amount )
from CustomerStatementInvoiceGroup
where CustomerStatementInvoiceGroup.CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID
), 0 ) +
isnull( (
select sum( CustomerStatementDetail.Amount )
from CustomerStatementInvoiceGroup
inner join CustomerStatementDetail on CustomerStatementDetail.CustomerStatementInvoiceGroupFID = CustomerStatementInvoiceGroup.CustomerStatementInvoiceGroupID
where
CustomerStatementInvoiceGroup.CustomerStatementOrderGroupFID = CustomerStatementOrderGroup.CustomerStatementOrderGroupID and
CustomerStatementDetail.IncludedOnInvoiceFlag = 0
), 0 )
from CustomerStatementOrderGroup
inner join CustomerStatement on CustomerStatement.CustomerStatementID = CustomerStatementOrderGroup.CustomerStatementFID
where CustomerStatement.CustomerStatementRunFID = @outStatementRunID
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
update CustomerStatement
set Balance =
isnull( (
select sum( CustomerStatementOrderGroup.Balance )
from CustomerStatementOrderGroup
where CustomerStatementOrderGroup.CustomerStatementFID = CustomerStatement.CustomerStatementID
), 0 )
from CustomerStatement
where CustomerStatement.CustomerStatementRunFID = @outStatementRunID
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
if( 1 = @inSuppressZeroBalancesFlag )
begin
delete from CustomerStatementOrderGroup
from CustomerStatementOrderGroup
inner join CustomerStatement on CustomerStatement.CustomerStatementID = CustomerStatementOrderGroup.CustomerStatementFID
where
(
CustomerStatementOrderGroup.Balance = 0 and
CustomerStatement.CustomerStatementRunFID = @outStatementRunID
)
end
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
if( 1 = @inPastDueBalancesFlag )
begin
delete
from CustomerStatement
where
(
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
not exists
(
select *
from CustomerStatementOrderGroup
inner join CustomerStatement on CustomerStatement.CustomerStatementID = CustomerStatementOrderGroup.CustomerStatementFID
where
(
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
CustomerStatementOrderGroup.CustomerStatementFID = CustomerStatement.CustomerStatementID and
CustomerStatementOrderGroup.Amount != 0 and
CustomerStatementOrderGroup.Status = 'Order'
)
)
)
end
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
if( 1 = @inExcludeCreditBalancesFlag )
begin
delete
from CustomerStatement
where
(
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
CustomerStatement.Balance < 0
)
end
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
delete
from CustomerStatement
from CustomerStatement
left outer join CustomerStatementOrderGroup on CustomerStatementOrderGroup.CustomerStatementFID = CustomerStatement.CustomerStatementID
where
(
CustomerStatement.CustomerStatementRunFID = @outStatementRunID and
CustomerStatement.Balance = 0 and
CustomerStatementOrderGroup.CustomerStatementOrderGroupID is null
)
set @theTempErrorCode = @@error
if( 0 != @theTempErrorCode )
begin
set @outErrorCode = @theTempErrorCode
end
if( 0 != @outErrorCode )
begin
rollback transaction
end
else
begin
commit transaction
end
drop table #Detail
drop table #OrderBalance
GO
GRANT EXECUTE ON [dbo].[CustomerStatementGenerate_XLedger] TO [MssExec]
GO