diff --git a/EnvelopeGenerator.Common/Constants.vb b/EnvelopeGenerator.Common/Constants.vb
index acb80343..678219e7 100644
--- a/EnvelopeGenerator.Common/Constants.vb
+++ b/EnvelopeGenerator.Common/Constants.vb
@@ -2,6 +2,7 @@
#Region "Status Fields"
Public Enum EnvelopeStatus
+ Invalid = 0
EnvelopeCreated = 1001
EnvelopeSaved = 1002
EnvelopeQueued = 1003
@@ -29,20 +30,6 @@
Unsigned = 0
Signed = 1
End Enum
-
- '''
- ''' This is a status, which is called Type because it fits with the other action fields
- '''
- 'Public Enum EnvelopeHistoryActionType
- ' Created = 0
- ' Saved = 1
- ' Sent = 2
- ' EmailSent = 3
- ' Delivered = 4
- ' Seen = 5
- ' Signed = 6
- ' Rejected = 7
- 'End Enum
#End Region
#Region "Type Fields"
diff --git a/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj b/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj
index 9d95b57b..484a9531 100644
--- a/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj
+++ b/EnvelopeGenerator.Common/EnvelopeGenerator.Common.vbproj
@@ -45,7 +45,21 @@
On
+
+
+
+
+
+
+
+
+
+
+
+
+
+
False
..\..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll
@@ -137,6 +151,15 @@
Settings.settings
True
+
+
+
+
+ rptEnvelopeHistory.vb
+
+
+ Component
+
@@ -172,12 +195,16 @@
+
VbMyResourcesResXFileCodeGenerator
Resources.Designer.vb
My.Resources
Designer
+
+ rptEnvelopeHistory.vb
+
ResXFileCodeGenerator
Email.en.Designer.vb
diff --git a/EnvelopeGenerator.Common/Models/EnvelopeModel.vb b/EnvelopeGenerator.Common/Models/EnvelopeModel.vb
index d1026686..e9fbcb90 100644
--- a/EnvelopeGenerator.Common/Models/EnvelopeModel.vb
+++ b/EnvelopeGenerator.Common/Models/EnvelopeModel.vb
@@ -71,7 +71,7 @@ Public Class EnvelopeModel
Public Function List() As IEnumerable(Of Envelope)
Try
- Dim oSql = $"SELECT * FROM [dbo].[TBSIG_ENVELOPE] WHERE USER_ID = {State.UserId} AND STATUS IN (0,1,2,3)"
+ Dim oSql = $"SELECT * FROM [dbo].[TBSIG_ENVELOPE] WHERE USER_ID = {State.UserId} AND STATUS IN (1001,1002,1003,1004,1005)"
Dim oTable = Database.GetDatatable(oSql)
Return oTable?.Rows.Cast(Of DataRow).
diff --git a/EnvelopeGenerator.Common/My Project/licenses.licx b/EnvelopeGenerator.Common/My Project/licenses.licx
new file mode 100644
index 00000000..a3683bf4
--- /dev/null
+++ b/EnvelopeGenerator.Common/My Project/licenses.licx
@@ -0,0 +1 @@
+DevExpress.XtraReports.UI.XtraReport, DevExpress.XtraReports.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
diff --git a/EnvelopeGenerator.Common/Reports/ReportCreator.vb b/EnvelopeGenerator.Common/Reports/ReportCreator.vb
new file mode 100644
index 00000000..63eff514
--- /dev/null
+++ b/EnvelopeGenerator.Common/Reports/ReportCreator.vb
@@ -0,0 +1,16 @@
+Imports System.IO
+Imports DevExpress.XtraPrinting
+
+Public Class ReportCreator
+ Public Shared Async Function CreateReport(pReportItems As List(Of ReportItem)) As Task(Of Byte())
+ Dim oSource As New ReportSource With {.Items = pReportItems}
+ Dim oReport As New rptEnvelopeHistory() With {.DataSource = oSource, .DataMember = "Items"}
+
+ Await oReport.CreateDocumentAsync()
+
+ Using oStream As New MemoryStream()
+ Await oReport.ExportToPdfAsync(oStream, New PdfExportOptions)
+ Return oStream.ToArray()
+ End Using
+ End Function
+End Class
diff --git a/EnvelopeGenerator.Common/Reports/ReportItem.vb b/EnvelopeGenerator.Common/Reports/ReportItem.vb
new file mode 100644
index 00000000..33ccdfef
--- /dev/null
+++ b/EnvelopeGenerator.Common/Reports/ReportItem.vb
@@ -0,0 +1,7 @@
+Public Class ReportItem
+
+ Public Property ItemStatus As Constants.EnvelopeStatus
+ Public Property ItemUserReference As String
+ Public Property ItemDate As Date
+
+End Class
diff --git a/EnvelopeGenerator.Common/Reports/ReportSource.vb b/EnvelopeGenerator.Common/Reports/ReportSource.vb
new file mode 100644
index 00000000..56fa87eb
--- /dev/null
+++ b/EnvelopeGenerator.Common/Reports/ReportSource.vb
@@ -0,0 +1,3 @@
+Public Class ReportSource
+ Public Property Items As List(Of ReportItem)
+End Class
diff --git a/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.Designer.vb b/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.Designer.vb
new file mode 100644
index 00000000..5113936f
--- /dev/null
+++ b/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.Designer.vb
@@ -0,0 +1,304 @@
+ _
+Partial Public Class rptEnvelopeHistory
+ Inherits DevExpress.XtraReports.UI.XtraReport
+
+ 'XtraReport overrides dispose to clean up the component list.
+ _
+ Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+ If disposing AndAlso components IsNot Nothing Then
+ components.Dispose()
+ End If
+ MyBase.Dispose(disposing)
+ End Sub
+
+ 'Required by the Designer
+ Private components As System.ComponentModel.IContainer
+
+ 'NOTE: The following procedure is required by the Designer
+ 'It can be modified using the Designer.
+ 'Do not modify it using the code editor.
+ _
+ Private Sub InitializeComponent()
+ Me.components = New System.ComponentModel.Container()
+ Me.TopMargin = New DevExpress.XtraReports.UI.TopMarginBand()
+ Me.BottomMargin = New DevExpress.XtraReports.UI.BottomMarginBand()
+ Me.ReportHeader = New DevExpress.XtraReports.UI.ReportHeaderBand()
+ Me.GroupHeader1 = New DevExpress.XtraReports.UI.GroupHeaderBand()
+ Me.Detail = New DevExpress.XtraReports.UI.DetailBand()
+ Me.pageInfo1 = New DevExpress.XtraReports.UI.XRPageInfo()
+ Me.pageInfo2 = New DevExpress.XtraReports.UI.XRPageInfo()
+ Me.label1 = New DevExpress.XtraReports.UI.XRLabel()
+ Me.table1 = New DevExpress.XtraReports.UI.XRTable()
+ Me.tableRow1 = New DevExpress.XtraReports.UI.XRTableRow()
+ Me.tableCell1 = New DevExpress.XtraReports.UI.XRTableCell()
+ Me.tableCell2 = New DevExpress.XtraReports.UI.XRTableCell()
+ Me.tableCell3 = New DevExpress.XtraReports.UI.XRTableCell()
+ Me.table2 = New DevExpress.XtraReports.UI.XRTable()
+ Me.tableRow2 = New DevExpress.XtraReports.UI.XRTableRow()
+ Me.tableCell4 = New DevExpress.XtraReports.UI.XRTableCell()
+ Me.tableCell5 = New DevExpress.XtraReports.UI.XRTableCell()
+ Me.tableCell6 = New DevExpress.XtraReports.UI.XRTableCell()
+ Me.ObjectDataSource1 = New DevExpress.DataAccess.ObjectBinding.ObjectDataSource(Me.components)
+ Me.Title = New DevExpress.XtraReports.UI.XRControlStyle()
+ Me.DetailCaption1 = New DevExpress.XtraReports.UI.XRControlStyle()
+ Me.DetailData1 = New DevExpress.XtraReports.UI.XRControlStyle()
+ Me.DetailData3_Odd = New DevExpress.XtraReports.UI.XRControlStyle()
+ Me.PageInfo = New DevExpress.XtraReports.UI.XRControlStyle()
+ CType(Me.table1, System.ComponentModel.ISupportInitialize).BeginInit()
+ CType(Me.table2, System.ComponentModel.ISupportInitialize).BeginInit()
+ CType(Me.ObjectDataSource1, System.ComponentModel.ISupportInitialize).BeginInit()
+ CType(Me, System.ComponentModel.ISupportInitialize).BeginInit()
+ '
+ 'TopMargin
+ '
+ Me.TopMargin.Dpi = 254.0!
+ Me.TopMargin.HeightF = 254.0!
+ Me.TopMargin.Name = "TopMargin"
+ '
+ 'BottomMargin
+ '
+ Me.BottomMargin.Controls.AddRange(New DevExpress.XtraReports.UI.XRControl() {Me.pageInfo1, Me.pageInfo2})
+ Me.BottomMargin.Dpi = 254.0!
+ Me.BottomMargin.HeightF = 254.0!
+ Me.BottomMargin.Name = "BottomMargin"
+ '
+ 'ReportHeader
+ '
+ Me.ReportHeader.Controls.AddRange(New DevExpress.XtraReports.UI.XRControl() {Me.label1})
+ Me.ReportHeader.Dpi = 254.0!
+ Me.ReportHeader.HeightF = 152.4!
+ Me.ReportHeader.Name = "ReportHeader"
+ '
+ 'GroupHeader1
+ '
+ Me.GroupHeader1.Controls.AddRange(New DevExpress.XtraReports.UI.XRControl() {Me.table1})
+ Me.GroupHeader1.Dpi = 254.0!
+ Me.GroupHeader1.GroupUnion = DevExpress.XtraReports.UI.GroupUnion.WithFirstDetail
+ Me.GroupHeader1.HeightF = 71.12!
+ Me.GroupHeader1.Name = "GroupHeader1"
+ '
+ 'Detail
+ '
+ Me.Detail.Controls.AddRange(New DevExpress.XtraReports.UI.XRControl() {Me.table2})
+ Me.Detail.Dpi = 254.0!
+ Me.Detail.HeightF = 63.42!
+ Me.Detail.HierarchyPrintOptions.Indent = 50.8!
+ Me.Detail.Name = "Detail"
+ '
+ 'pageInfo1
+ '
+ Me.pageInfo1.Dpi = 254.0!
+ Me.pageInfo1.LocationFloat = New DevExpress.Utils.PointFloat(0!, 0!)
+ Me.pageInfo1.Name = "pageInfo1"
+ Me.pageInfo1.PageInfo = DevExpress.XtraPrinting.PageInfo.DateTime
+ Me.pageInfo1.SizeF = New System.Drawing.SizeF(796.0!, 58.0!)
+ Me.pageInfo1.StyleName = "PageInfo"
+ '
+ 'pageInfo2
+ '
+ Me.pageInfo2.Dpi = 254.0!
+ Me.pageInfo2.LocationFloat = New DevExpress.Utils.PointFloat(796.0!, 0!)
+ Me.pageInfo2.Name = "pageInfo2"
+ Me.pageInfo2.SizeF = New System.Drawing.SizeF(796.0!, 58.0!)
+ Me.pageInfo2.StyleName = "PageInfo"
+ Me.pageInfo2.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight
+ Me.pageInfo2.TextFormatString = "Seite {0} von {1}"
+ '
+ 'label1
+ '
+ Me.label1.Dpi = 254.0!
+ Me.label1.LocationFloat = New DevExpress.Utils.PointFloat(0!, 0!)
+ Me.label1.Name = "label1"
+ Me.label1.SizeF = New System.Drawing.SizeF(1592.0!, 61.45361!)
+ Me.label1.StyleName = "Title"
+ Me.label1.Text = "Envelope History"
+ '
+ 'table1
+ '
+ Me.table1.Dpi = 254.0!
+ Me.table1.LocationFloat = New DevExpress.Utils.PointFloat(0!, 0!)
+ Me.table1.Name = "table1"
+ Me.table1.Rows.AddRange(New DevExpress.XtraReports.UI.XRTableRow() {Me.tableRow1})
+ Me.table1.SizeF = New System.Drawing.SizeF(1592.0!, 71.12!)
+ '
+ 'tableRow1
+ '
+ Me.tableRow1.Cells.AddRange(New DevExpress.XtraReports.UI.XRTableCell() {Me.tableCell1, Me.tableCell2, Me.tableCell3})
+ Me.tableRow1.Dpi = 254.0!
+ Me.tableRow1.Name = "tableRow1"
+ Me.tableRow1.Weight = 1.0R
+ '
+ 'tableCell1
+ '
+ Me.tableCell1.Borders = DevExpress.XtraPrinting.BorderSide.None
+ Me.tableCell1.Dpi = 254.0!
+ Me.tableCell1.Name = "tableCell1"
+ Me.tableCell1.StyleName = "DetailCaption1"
+ Me.tableCell1.StylePriority.UseBorders = False
+ Me.tableCell1.Text = "Item Status"
+ Me.tableCell1.Weight = 0.28459106138603174R
+ '
+ 'tableCell2
+ '
+ Me.tableCell2.Dpi = 254.0!
+ Me.tableCell2.Name = "tableCell2"
+ Me.tableCell2.StyleName = "DetailCaption1"
+ Me.tableCell2.Text = "Item User Reference"
+ Me.tableCell2.Weight = 0.46912142499607412R
+ '
+ 'tableCell3
+ '
+ Me.tableCell3.Dpi = 254.0!
+ Me.tableCell3.Name = "tableCell3"
+ Me.tableCell3.StyleName = "DetailCaption1"
+ Me.tableCell3.Text = "Item Date"
+ Me.tableCell3.Weight = 0.24628753278722715R
+ '
+ 'table2
+ '
+ Me.table2.Dpi = 254.0!
+ Me.table2.LocationFloat = New DevExpress.Utils.PointFloat(0!, 0!)
+ Me.table2.Name = "table2"
+ Me.table2.OddStyleName = "DetailData3_Odd"
+ Me.table2.Rows.AddRange(New DevExpress.XtraReports.UI.XRTableRow() {Me.tableRow2})
+ Me.table2.SizeF = New System.Drawing.SizeF(1592.0!, 63.42!)
+ '
+ 'tableRow2
+ '
+ Me.tableRow2.Cells.AddRange(New DevExpress.XtraReports.UI.XRTableCell() {Me.tableCell4, Me.tableCell5, Me.tableCell6})
+ Me.tableRow2.Dpi = 254.0!
+ Me.tableRow2.Name = "tableRow2"
+ Me.tableRow2.Weight = 11.683999633789062R
+ '
+ 'tableCell4
+ '
+ Me.tableCell4.Borders = DevExpress.XtraPrinting.BorderSide.None
+ Me.tableCell4.Dpi = 254.0!
+ Me.tableCell4.ExpressionBindings.AddRange(New DevExpress.XtraReports.UI.ExpressionBinding() {New DevExpress.XtraReports.UI.ExpressionBinding("BeforePrint", "Text", "[ItemStatus]")})
+ Me.tableCell4.Name = "tableCell4"
+ Me.tableCell4.StyleName = "DetailData1"
+ Me.tableCell4.StylePriority.UseBorders = False
+ Me.tableCell4.Weight = 0.28459106138603174R
+ '
+ 'tableCell5
+ '
+ Me.tableCell5.Dpi = 254.0!
+ Me.tableCell5.ExpressionBindings.AddRange(New DevExpress.XtraReports.UI.ExpressionBinding() {New DevExpress.XtraReports.UI.ExpressionBinding("BeforePrint", "Text", "[ItemUserReference]")})
+ Me.tableCell5.Name = "tableCell5"
+ Me.tableCell5.StyleName = "DetailData1"
+ Me.tableCell5.Weight = 0.46912142499607412R
+ '
+ 'tableCell6
+ '
+ Me.tableCell6.Dpi = 254.0!
+ Me.tableCell6.ExpressionBindings.AddRange(New DevExpress.XtraReports.UI.ExpressionBinding() {New DevExpress.XtraReports.UI.ExpressionBinding("BeforePrint", "Text", "[ItemDate]")})
+ Me.tableCell6.Name = "tableCell6"
+ Me.tableCell6.StyleName = "DetailData1"
+ Me.tableCell6.Weight = 0.24628751361789417R
+ '
+ 'ObjectDataSource1
+ '
+ Me.ObjectDataSource1.DataMember = "Items"
+ Me.ObjectDataSource1.DataSource = GetType(EnvelopeGenerator.Common.ReportSource)
+ Me.ObjectDataSource1.Name = "ObjectDataSource1"
+ '
+ 'Title
+ '
+ Me.Title.BackColor = System.Drawing.Color.Transparent
+ Me.Title.BorderColor = System.Drawing.Color.Black
+ Me.Title.Borders = DevExpress.XtraPrinting.BorderSide.None
+ Me.Title.BorderWidth = 1.0!
+ Me.Title.Font = New System.Drawing.Font("Arial", 14.25!)
+ Me.Title.ForeColor = System.Drawing.Color.FromArgb(CType(CType(75, Byte), Integer), CType(CType(75, Byte), Integer), CType(CType(75, Byte), Integer))
+ Me.Title.Name = "Title"
+ Me.Title.Padding = New DevExpress.XtraPrinting.PaddingInfo(15, 15, 0, 0, 254.0!)
+ '
+ 'DetailCaption1
+ '
+ Me.DetailCaption1.BackColor = System.Drawing.Color.FromArgb(CType(CType(75, Byte), Integer), CType(CType(75, Byte), Integer), CType(CType(75, Byte), Integer))
+ Me.DetailCaption1.BorderColor = System.Drawing.Color.White
+ Me.DetailCaption1.Borders = DevExpress.XtraPrinting.BorderSide.Left
+ Me.DetailCaption1.BorderWidth = 2.0!
+ Me.DetailCaption1.Font = New System.Drawing.Font("Arial", 8.25!, System.Drawing.FontStyle.Bold)
+ Me.DetailCaption1.ForeColor = System.Drawing.Color.White
+ Me.DetailCaption1.Name = "DetailCaption1"
+ Me.DetailCaption1.Padding = New DevExpress.XtraPrinting.PaddingInfo(15, 15, 0, 0, 254.0!)
+ Me.DetailCaption1.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft
+ '
+ 'DetailData1
+ '
+ Me.DetailData1.BorderColor = System.Drawing.Color.Transparent
+ Me.DetailData1.Borders = DevExpress.XtraPrinting.BorderSide.Left
+ Me.DetailData1.BorderWidth = 2.0!
+ Me.DetailData1.Font = New System.Drawing.Font("Arial", 8.25!)
+ Me.DetailData1.ForeColor = System.Drawing.Color.Black
+ Me.DetailData1.Name = "DetailData1"
+ Me.DetailData1.Padding = New DevExpress.XtraPrinting.PaddingInfo(15, 15, 0, 0, 254.0!)
+ Me.DetailData1.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft
+ '
+ 'DetailData3_Odd
+ '
+ Me.DetailData3_Odd.BackColor = System.Drawing.Color.FromArgb(CType(CType(231, Byte), Integer), CType(CType(231, Byte), Integer), CType(CType(231, Byte), Integer))
+ Me.DetailData3_Odd.BorderColor = System.Drawing.Color.Transparent
+ Me.DetailData3_Odd.Borders = DevExpress.XtraPrinting.BorderSide.None
+ Me.DetailData3_Odd.BorderWidth = 1.0!
+ Me.DetailData3_Odd.Font = New System.Drawing.Font("Arial", 8.25!)
+ Me.DetailData3_Odd.ForeColor = System.Drawing.Color.Black
+ Me.DetailData3_Odd.Name = "DetailData3_Odd"
+ Me.DetailData3_Odd.Padding = New DevExpress.XtraPrinting.PaddingInfo(15, 15, 0, 0, 254.0!)
+ Me.DetailData3_Odd.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleLeft
+ '
+ 'PageInfo
+ '
+ Me.PageInfo.Font = New System.Drawing.Font("Arial", 8.25!, System.Drawing.FontStyle.Bold)
+ Me.PageInfo.ForeColor = System.Drawing.Color.FromArgb(CType(CType(75, Byte), Integer), CType(CType(75, Byte), Integer), CType(CType(75, Byte), Integer))
+ Me.PageInfo.Name = "PageInfo"
+ Me.PageInfo.Padding = New DevExpress.XtraPrinting.PaddingInfo(15, 15, 0, 0, 254.0!)
+ '
+ 'rptEnvelopeHistory
+ '
+ Me.Bands.AddRange(New DevExpress.XtraReports.UI.Band() {Me.TopMargin, Me.BottomMargin, Me.ReportHeader, Me.GroupHeader1, Me.Detail})
+ Me.ComponentStorage.AddRange(New System.ComponentModel.IComponent() {Me.ObjectDataSource1})
+ Me.DataSource = Me.ObjectDataSource1
+ Me.Dpi = 254.0!
+ Me.Font = New System.Drawing.Font("Arial", 9.75!)
+ Me.Margins = New System.Drawing.Printing.Margins(254, 254, 254, 254)
+ Me.PageHeight = 2970
+ Me.PageWidth = 2100
+ Me.PaperKind = System.Drawing.Printing.PaperKind.A4
+ Me.ReportUnit = DevExpress.XtraReports.UI.ReportUnit.TenthsOfAMillimeter
+ Me.SnapGridSize = 25.0!
+ Me.StyleSheet.AddRange(New DevExpress.XtraReports.UI.XRControlStyle() {Me.Title, Me.DetailCaption1, Me.DetailData1, Me.DetailData3_Odd, Me.PageInfo})
+ Me.Version = "21.2"
+ CType(Me.table1, System.ComponentModel.ISupportInitialize).EndInit()
+ CType(Me.table2, System.ComponentModel.ISupportInitialize).EndInit()
+ CType(Me.ObjectDataSource1, System.ComponentModel.ISupportInitialize).EndInit()
+ CType(Me, System.ComponentModel.ISupportInitialize).EndInit()
+
+ End Sub
+
+ Friend WithEvents TopMargin As DevExpress.XtraReports.UI.TopMarginBand
+ Friend WithEvents BottomMargin As DevExpress.XtraReports.UI.BottomMarginBand
+ Friend WithEvents pageInfo1 As DevExpress.XtraReports.UI.XRPageInfo
+ Friend WithEvents pageInfo2 As DevExpress.XtraReports.UI.XRPageInfo
+ Friend WithEvents ReportHeader As DevExpress.XtraReports.UI.ReportHeaderBand
+ Friend WithEvents label1 As DevExpress.XtraReports.UI.XRLabel
+ Friend WithEvents GroupHeader1 As DevExpress.XtraReports.UI.GroupHeaderBand
+ Friend WithEvents table1 As DevExpress.XtraReports.UI.XRTable
+ Friend WithEvents tableRow1 As DevExpress.XtraReports.UI.XRTableRow
+ Friend WithEvents tableCell1 As DevExpress.XtraReports.UI.XRTableCell
+ Friend WithEvents tableCell2 As DevExpress.XtraReports.UI.XRTableCell
+ Friend WithEvents tableCell3 As DevExpress.XtraReports.UI.XRTableCell
+ Friend WithEvents Detail As DevExpress.XtraReports.UI.DetailBand
+ Friend WithEvents table2 As DevExpress.XtraReports.UI.XRTable
+ Friend WithEvents tableRow2 As DevExpress.XtraReports.UI.XRTableRow
+ Friend WithEvents tableCell4 As DevExpress.XtraReports.UI.XRTableCell
+ Friend WithEvents tableCell5 As DevExpress.XtraReports.UI.XRTableCell
+ Friend WithEvents tableCell6 As DevExpress.XtraReports.UI.XRTableCell
+ Friend WithEvents ObjectDataSource1 As DevExpress.DataAccess.ObjectBinding.ObjectDataSource
+ Friend WithEvents Title As DevExpress.XtraReports.UI.XRControlStyle
+ Friend WithEvents DetailCaption1 As DevExpress.XtraReports.UI.XRControlStyle
+ Friend WithEvents DetailData1 As DevExpress.XtraReports.UI.XRControlStyle
+ Friend WithEvents DetailData3_Odd As DevExpress.XtraReports.UI.XRControlStyle
+ Friend WithEvents PageInfo As DevExpress.XtraReports.UI.XRControlStyle
+End Class
diff --git a/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.resx b/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.resx
new file mode 100644
index 00000000..014e1c08
--- /dev/null
+++ b/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.vb b/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.vb
new file mode 100644
index 00000000..b7711ad5
--- /dev/null
+++ b/EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.vb
@@ -0,0 +1,3 @@
+Public Class rptEnvelopeHistory
+
+End Class
\ No newline at end of file
diff --git a/EnvelopeGenerator.Common/Services/ActionService.vb b/EnvelopeGenerator.Common/Services/ActionService.vb
index cb3ce0fa..2a6d1d32 100644
--- a/EnvelopeGenerator.Common/Services/ActionService.vb
+++ b/EnvelopeGenerator.Common/Services/ActionService.vb
@@ -1,32 +1,52 @@
-Imports DigitalData.Modules.Base
+Imports DevExpress.DataAccess.Native.Web
+Imports DigitalData.Modules.Base
Public Class ActionService
Inherits BaseClass
- Private ReadOnly State As State
+ Private ReadOnly EmailService As EmailService
+ Private ReadOnly HistoryService As HistoryService
- Private EmailService As EmailService
- Private HistoryService As HistoryService
+ Private ReadOnly ReceiverModel As ReceiverModel
Public Sub New(pState As State)
MyBase.New(pState.LogConfig)
- State = pState
EmailService = New EmailService(pState)
HistoryService = New HistoryService(pState)
+
+ ReceiverModel = New ReceiverModel(pState)
End Sub
Public Function DeleteEnvelope(pEnvelope As Envelope) As Boolean
-
HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.EnvelopeDeleted, pEnvelope.User.Email)
For Each oReceiver As EnvelopeReceiver In pEnvelope.Receivers
EmailService.SendEnvelopeDeletedEmail(oReceiver.Id, pEnvelope.Id)
Next
-
Return True
End Function
+ Public Function OpenEnvelope(pEnvelope As Envelope, pReceiverId As Integer) As Boolean
+ Dim oReceiver As EnvelopeReceiver = ReceiverModel.GetById(pReceiverId)
+ Dim oUserReference = oReceiver.Email
+
+ Return HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.DocumentOpened, oUserReference)
+ End Function
+
+ Public Function SignEnvelope(pEnvelope As Envelope, pReceiverId As Integer) As Boolean
+ Dim oReceiver As EnvelopeReceiver = ReceiverModel.GetById(pReceiverId)
+ Dim oUserReference = oReceiver.Email
+
+ If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.DocumentSigned, oUserReference) = False Then
+ Return False
+ End If
+
+ Return EmailService.SendSignedEmail(oReceiver.Id, pEnvelope.Id)
+ End Function
+
+
+
End Class
\ No newline at end of file
diff --git a/EnvelopeGenerator.Test/EnvelopeGenerator.Test.vbproj b/EnvelopeGenerator.Test/EnvelopeGenerator.Test.vbproj
index 264b041f..41a703af 100644
--- a/EnvelopeGenerator.Test/EnvelopeGenerator.Test.vbproj
+++ b/EnvelopeGenerator.Test/EnvelopeGenerator.Test.vbproj
@@ -65,6 +65,10 @@
False
..\..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll
+
+ False
+ ..\..\DDModules\Config\bin\Debug\DigitalData.Modules.Config.dll
+
..\..\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll
@@ -117,6 +121,12 @@
Form
+
+ frmReportViewer.vb
+
+
+ Form
+
True
Application.myapp
@@ -130,6 +140,9 @@
frmFinalizePDF.vb
+
+ frmReportViewer.vb
+
VbMyResourcesResXFileCodeGenerator
@@ -159,6 +172,12 @@
Application.Designer.vb
+
+
+ {6ea0c51f-c2b1-4462-8198-3de0b32b74f8}
+ EnvelopeGenerator.Common
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/EnvelopeGenerator.Test/frmReportViewer.vb b/EnvelopeGenerator.Test/frmReportViewer.vb
new file mode 100644
index 00000000..5d480601
--- /dev/null
+++ b/EnvelopeGenerator.Test/frmReportViewer.vb
@@ -0,0 +1,45 @@
+Imports DigitalData.Modules.Logging
+Imports DigitalData.Modules.Database
+Imports DigitalData.Modules.Config
+Imports DigitalData.Modules.Base
+Imports EnvelopeGenerator.Common
+
+Public Class frmReportViewer
+ Private LogConfig As LogConfig
+ Private Logger As Logger
+ Private ConfigManager As ConfigManager(Of Config)
+ Private Database As MSSQLServer
+
+ Private Async Sub frmReportViewer_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+ LogConfig = New LogConfig(LogConfig.PathType.CustomPath, Application.StartupPath, CompanyName:="Digital Data", ProductName:="EnvelopeGenerator")
+ Logger = LogConfig.GetLogger()
+ ConfigManager = New ConfigManager(Of Config)(LogConfig, "C:\Users\JenneJ\AppData\Roaming\Digital Data\Envelope Generator\1.0.0.0")
+
+ Database = New MSSQLServer(LogConfig, MSSQLServer.DecryptConnectionString(ConfigManager.Config.ConnectionString))
+
+ Dim oTable As DataTable = Database.GetDatatable("SELECT * FROM VWSIG_ENVELOPE_REPORT")
+ Dim oItems = GetReportSource(oTable)
+
+ Dim oBuffer = Await ReportCreator.CreateReport(oItems)
+
+ Using oStream As New IO.MemoryStream(oBuffer)
+ PdfViewer1.LoadDocument(oStream)
+ End Using
+ End Sub
+
+ Private Function GetReportSource(pDataTable As DataTable) As List(Of ReportItem)
+ Return pDataTable.Rows.
+ Cast(Of DataRow).
+ Select(AddressOf ToReportItem).
+ OrderByDescending(Function(r) r.ItemDate).
+ ToList()
+ End Function
+
+ Private Function ToReportItem(pRow As DataRow) As ReportItem
+ Return New ReportItem() With {
+ .ItemDate = pRow.ItemEx(Of Date)("POS_WHEN", Nothing),
+ .ItemStatus = pRow.ItemEx("POS_STATUS", 0),
+ .ItemUserReference = pRow.ItemEx("POS_WHO", "")
+ }
+ End Function
+End Class
\ No newline at end of file
diff --git a/EnvelopeGenerator.Web/Controllers/BaseController.cs b/EnvelopeGenerator.Web/Controllers/BaseController.cs
index 4b69c619..23caa188 100644
--- a/EnvelopeGenerator.Web/Controllers/BaseController.cs
+++ b/EnvelopeGenerator.Web/Controllers/BaseController.cs
@@ -18,7 +18,7 @@ namespace EnvelopeGenerator.Web.Controllers
this.database = database;
this.logConfig = logging.LogConfig;
this.logger = logging.LogConfig.GetLoggerFor(GetType().Name);
- this.state = GetState();
+ this.state = database.State;
}
internal ObjectResult ErrorResponse(Exception e)
@@ -29,15 +29,5 @@ namespace EnvelopeGenerator.Web.Controllers
detail: e.Message,
type: ErrorType.ServerError.ToString());
}
-
- internal State GetState()
- {
- return new State
- {
- Database = database.MSSQL,
- LogConfig = logConfig,
- UserId = 2 // TODO
- };
- }
}
}
diff --git a/EnvelopeGenerator.Web/Controllers/DocumentController.cs b/EnvelopeGenerator.Web/Controllers/DocumentController.cs
index d13dbfa4..1801dc23 100644
--- a/EnvelopeGenerator.Web/Controllers/DocumentController.cs
+++ b/EnvelopeGenerator.Web/Controllers/DocumentController.cs
@@ -1,16 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using EnvelopeGenerator.Common;
using EnvelopeGenerator.Web.Services;
+using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Web.Controllers
{
public class DocumentController : BaseController
{
private readonly EnvelopeService envelopeService;
+ private readonly ActionService? actionService;
public DocumentController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging)
{
envelopeService = envelope;
+ actionService = database.Services?.actionService;
}
[HttpGet]
@@ -40,5 +43,28 @@ namespace EnvelopeGenerator.Web.Controllers
return ErrorResponse(e);
}
}
+
+ [HttpPost]
+ [Route("api/document/{envelopeKey}")]
+ public IActionResult Open(string envelopeKey)
+ {
+ try
+ {
+ logger.Info("DocumentController/Open");
+
+ // Validate Envelope Key and load envelope
+ envelopeService.EnsureValidEnvelopeKey(envelopeKey);
+ EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey);
+
+ actionService.OpenEnvelope(response.Envelope, response.Receiver.Id);
+
+ return Ok();
+ }
+ catch (Exception e)
+ {
+ return ErrorResponse(e);
+ }
+ }
+
}
}
diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs
index 56d57eae..308f5361 100644
--- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs
+++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs
@@ -7,12 +7,12 @@ namespace EnvelopeGenerator.Web.Controllers
public class EnvelopeController : BaseController
{
private readonly EnvelopeService envelopeService;
- private readonly EmailService emailService;
+ private readonly ActionService actionService;
public EnvelopeController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging)
{
envelopeService = envelope;
- emailService = new(state);
+ actionService = database.Services?.actionService;
}
[HttpGet]
@@ -52,17 +52,19 @@ namespace EnvelopeGenerator.Web.Controllers
string annotationData = await envelopeService.EnsureValidAnnotationData(Request);
- envelopeService.InsertDocumentStatus(new DocumentStatus()
- {
- EnvelopeId = response.Envelope.Id,
- ReceiverId = response.Receiver.Id,
- Value = annotationData,
- Status = Common.Constants.DocumentStatus.Signed
- });
+ //envelopeService.InsertDocumentStatus(new DocumentStatus()
+ //{
+ // EnvelopeId = response.Envelope.Id,
+ // ReceiverId = response.Receiver.Id,
+ // Value = annotationData,
+ // Status = Common.Constants.DocumentStatus.Signed
+ //});
- envelopeService.InsertHistoryEntrySigned(response);
+ //envelopeService.InsertHistoryEntrySigned(response);
- emailService.SendSignedEmail(response.Receiver.Id, response.Envelope.Id);
+ //emailService.SendSignedEmail(response.Receiver.Id, response.Envelope.Id);
+
+ var signResult = actionService?.SignEnvelope(response.Envelope, response.Receiver.Id);
return Ok();
}
diff --git a/EnvelopeGenerator.Web/Controllers/HistoryController.cs b/EnvelopeGenerator.Web/Controllers/HistoryController.cs
deleted file mode 100644
index 604b2540..00000000
--- a/EnvelopeGenerator.Web/Controllers/HistoryController.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using EnvelopeGenerator.Common;
-using EnvelopeGenerator.Web.Services;
-using Microsoft.AspNetCore.Mvc;
-using static EnvelopeGenerator.Common.Constants;
-
-namespace EnvelopeGenerator.Web.Controllers
-{
- public class HistoryController : BaseController
- {
- private readonly EnvelopeService envelopeService;
-
- public HistoryController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging)
- {
- envelopeService = envelope;
- }
-
- [HttpPost]
- [Route("api/history/{envelopeKey}")]
- public IActionResult Get(string envelopeKey)
- {
- try
- {
- logger.Info("HistoryController/Post");
-
- // Validate Envelope Key and load envelope
- envelopeService.EnsureValidEnvelopeKey(envelopeKey);
- EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey);
-
- envelopeService.InsertHistoryEntry(new EnvelopeHistoryEntry()
- {
- ActionDate = DateTime.Now,
- Status = EnvelopeStatus.DocumentOpened,
- EnvelopeId = response.Envelope.Id,
- UserReference = response.Receiver.Email
- });
-
- return Ok();
- }
- catch (Exception e)
- {
- return ErrorResponse(e);
- }
- }
- }
-}
diff --git a/EnvelopeGenerator.Web/Services/DatabaseService.cs b/EnvelopeGenerator.Web/Services/DatabaseService.cs
index 1a7d3595..1d646d44 100644
--- a/EnvelopeGenerator.Web/Services/DatabaseService.cs
+++ b/EnvelopeGenerator.Web/Services/DatabaseService.cs
@@ -7,6 +7,18 @@ namespace EnvelopeGenerator.Web.Services
{
public MSSQLServer MSSQL { get; set; }
+ public State State { get; set; }
+
+ public class ServiceContainer
+ {
+ public ActionService actionService;
+
+ public ServiceContainer(State state)
+ {
+ actionService = new(state);
+ }
+ }
+
public class ModelContainer
{
public EnvelopeModel envelopeModel;
@@ -31,6 +43,7 @@ namespace EnvelopeGenerator.Web.Services
}
}
public readonly ModelContainer? Models;
+ public readonly ServiceContainer? Services;
public DatabaseService(IConfiguration Config, LoggingService Logging) : base(Config, Logging)
{
@@ -41,19 +54,14 @@ namespace EnvelopeGenerator.Web.Services
if (MSSQL.DBInitialized == true)
{
- logger.Debug("MSSQL Connection: [{0}]", MSSQL.CurrentConnectionString);
-
- // There is a circular dependency between state and models
- // All models need a state object, including the config Model
- // The state object needs to be filled with the DbConfig property,
- // which is obtained by the config Model.
- // So first, the config model is initialized with an incomplete state object,
- // then all the other models with the DbConfig property filled.
+ logger.Debug("MSSQL Connection established: [{0}]", MSSQL.MaskedConnectionString);
+
var state = GetState();
- var configModel = new ConfigModel(state);
- state.DbConfig = configModel.LoadConfiguration();
- Models = new(state);
+ Models = new(state);
+ Services = new(state);
+
+ State = state;
}
else
{
@@ -61,13 +69,31 @@ namespace EnvelopeGenerator.Web.Services
}
}
- public State GetState()
+ ///
+ /// There is a circular dependency between state and models
+ /// All models need a state object, including the config Model
+ /// The state object needs to be filled with the DbConfig property,
+ /// which is obtained by the config Model.
+ /// So first, the config model is initialized with an incomplete state object,
+ /// then all the other models with the DbConfig property filled.
+ ///
+ private State GetState()
+ {
+ var state = GetInitialState();
+ var configModel = new ConfigModel(state);
+ state.DbConfig = configModel.LoadConfiguration();
+
+ return state;
+ }
+
+ private State GetInitialState()
{
return new State
{
Database = MSSQL,
LogConfig = logConfig,
- UserId = 2 // TODO
+ UserId = 0,
+ DbConfig = null
};
}
}
diff --git a/EnvelopeGenerator.Web/Services/EnvelopeService.cs b/EnvelopeGenerator.Web/Services/EnvelopeService.cs
index 0ece8ac4..773b7910 100644
--- a/EnvelopeGenerator.Web/Services/EnvelopeService.cs
+++ b/EnvelopeGenerator.Web/Services/EnvelopeService.cs
@@ -8,11 +8,8 @@ namespace EnvelopeGenerator.Web.Services
{
public class EnvelopeService : BaseService
{
- private ReceiverModel receiverModel;
- private EnvelopeModel envelopeModel;
- private HistoryModel historyModel;
- private DocumentModel documentModel;
- private DocumentStatusModel documentStatusModel;
+ private readonly ReceiverModel receiverModel;
+ private readonly EnvelopeModel envelopeModel;
public EnvelopeService(IConfiguration Config, LoggingService Logging, DatabaseService database) : base(Config, Logging)
{
@@ -25,9 +22,6 @@ namespace EnvelopeGenerator.Web.Services
receiverModel = database.Models.receiverModel;
envelopeModel = database.Models.envelopeModel;
- historyModel = database.Models.historyModel;
- documentModel = database.Models.documentModel;
- documentStatusModel = database.Models.documentStatusModel;
}
public void EnsureValidEnvelopeKey(string envelopeKey)
@@ -48,7 +42,6 @@ namespace EnvelopeGenerator.Web.Services
throw new ArgumentNullException("ReceiverSignature");
}
-
public EnvelopeResponse LoadEnvelope(string pEnvelopeKey)
{
Tuple result = Helpers.DecodeEnvelopeReceiverId(pEnvelopeKey);
@@ -101,27 +94,6 @@ namespace EnvelopeGenerator.Web.Services
return (List)envelopeModel.List(pReceiverId);
}
- public bool InsertHistoryEntry(EnvelopeHistoryEntry historyEntry)
- {
- return historyModel.Insert(historyEntry);
- }
-
- public bool InsertHistoryEntrySigned(EnvelopeResponse response)
- {
- return historyModel.Insert(new EnvelopeHistoryEntry()
- {
- ActionDate = DateTime.Now,
- Status = EnvelopeStatus.DocumentSigned,
- EnvelopeId = response.Envelope.Id,
- UserReference = response.Receiver.Email
- });
- }
-
- public bool InsertDocumentStatus(Common.DocumentStatus documentStatus)
- {
- return documentStatusModel.InsertOrUpdate(documentStatus);
- }
-
public async Task EnsureValidAnnotationData(HttpRequest request)
{
try
@@ -183,16 +155,6 @@ namespace EnvelopeGenerator.Web.Services
return document;
}
- public async Task UpdateDocument(Stream fileStream, string filePath)
- {
- logger.Debug("Writing document to path [{0}]..", filePath);
-
- using FileStream fs = new(filePath, FileMode.Open);
- await fileStream.CopyToAsync(fs);
-
- logger.Debug("Document written!");
- }
-
public async Task GetDocumentContents(EnvelopeDocument document)
{
logger.Debug("Loading file [{0}]", document.Filepath);
diff --git a/EnvelopeGenerator.Web/wwwroot/js/app.js b/EnvelopeGenerator.Web/wwwroot/js/app.js
index a97b59c1..7efd2c2d 100644
--- a/EnvelopeGenerator.Web/wwwroot/js/app.js
+++ b/EnvelopeGenerator.Web/wwwroot/js/app.js
@@ -90,7 +90,7 @@ class App {
)
const createdAnnotations = await this.Instance.create(annotations)
- await this.Network.postHistory(this.envelopeKey)
+ await this.Network.openDocument(this.envelopeKey)
} catch (e) {
console.error(e)
}
diff --git a/EnvelopeGenerator.Web/wwwroot/js/network.js b/EnvelopeGenerator.Web/wwwroot/js/network.js
index 2a4ccb42..a98ca049 100644
--- a/EnvelopeGenerator.Web/wwwroot/js/network.js
+++ b/EnvelopeGenerator.Web/wwwroot/js/network.js
@@ -32,8 +32,8 @@
})
}
- postHistory(envelopeKey) {
- const url = `/api/history/${envelopeKey}`
+ openDocument(envelopeKey) {
+ const url = `/api/document/${envelopeKey}`
const options = {
credentials: 'include',
@@ -44,7 +44,7 @@
body: JSON.stringify({}),
}
- console.debug('PostHistory/Calling url: ' + url)
+ console.debug('OpenDocument/Calling url: ' + url)
return fetch(url, this.withCSRFToken(options))
.then(this.handleResponse)
.then((res) => {