From c2de72be74a1c5832580d0f2332482b5a46df14a Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Thu, 30 Nov 2023 14:00:30 +0100 Subject: [PATCH] 30-11-23 --- EnvelopeGenerator.Common/Constants.vb | 15 +- .../EnvelopeGenerator.Common.vbproj | 27 ++ .../Models/EnvelopeModel.vb | 2 +- .../My Project/licenses.licx | 1 + .../Reports/ReportCreator.vb | 16 + .../Reports/ReportItem.vb | 7 + .../Reports/ReportSource.vb | 3 + .../Reports/rptEnvelopeHistory.Designer.vb | 304 ++++++++++++++++++ .../Reports/rptEnvelopeHistory.resx | 123 +++++++ .../Reports/rptEnvelopeHistory.vb | 3 + .../Services/ActionService.vb | 34 +- .../EnvelopeGenerator.Test.vbproj | 19 ++ .../My Project/Application.Designer.vb | 2 +- .../My Project/Application.myapp | 2 +- .../frmReportViewer.Designer.vb | 91 ++++++ EnvelopeGenerator.Test/frmReportViewer.resx | 120 +++++++ EnvelopeGenerator.Test/frmReportViewer.vb | 45 +++ .../Controllers/BaseController.cs | 12 +- .../Controllers/DocumentController.cs | 26 ++ .../Controllers/EnvelopeController.cs | 24 +- .../Controllers/HistoryController.cs | 45 --- .../Services/DatabaseService.cs | 52 ++- .../Services/EnvelopeService.cs | 42 +-- EnvelopeGenerator.Web/wwwroot/js/app.js | 2 +- EnvelopeGenerator.Web/wwwroot/js/network.js | 6 +- 25 files changed, 875 insertions(+), 148 deletions(-) create mode 100644 EnvelopeGenerator.Common/My Project/licenses.licx create mode 100644 EnvelopeGenerator.Common/Reports/ReportCreator.vb create mode 100644 EnvelopeGenerator.Common/Reports/ReportItem.vb create mode 100644 EnvelopeGenerator.Common/Reports/ReportSource.vb create mode 100644 EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.Designer.vb create mode 100644 EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.resx create mode 100644 EnvelopeGenerator.Common/Reports/rptEnvelopeHistory.vb create mode 100644 EnvelopeGenerator.Test/frmReportViewer.Designer.vb create mode 100644 EnvelopeGenerator.Test/frmReportViewer.resx create mode 100644 EnvelopeGenerator.Test/frmReportViewer.vb delete mode 100644 EnvelopeGenerator.Web/Controllers/HistoryController.cs 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) => {