diff --git a/BealeEngineering/BealeEngineering.Accounts/frmMain.Designer.cs b/BealeEngineering/BealeEngineering.Accounts/frmMain.Designer.cs index 7c6d91f..f0445aa 100644 --- a/BealeEngineering/BealeEngineering.Accounts/frmMain.Designer.cs +++ b/BealeEngineering/BealeEngineering.Accounts/frmMain.Designer.cs @@ -192,7 +192,7 @@ // xeroInvoiceToolStripMenuItem // this.xeroInvoiceToolStripMenuItem.Name = "xeroInvoiceToolStripMenuItem"; - this.xeroInvoiceToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.xeroInvoiceToolStripMenuItem.Size = new System.Drawing.Size(139, 22); this.xeroInvoiceToolStripMenuItem.Text = "Xero Invoice"; this.xeroInvoiceToolStripMenuItem.Click += new System.EventHandler(this.xeroInvoiceToolStripMenuItem_Click); // diff --git a/BealeEngineering/BealeEngineering.Accounts/frmMain.cs b/BealeEngineering/BealeEngineering.Accounts/frmMain.cs index 1a066ab..8b550bb 100644 --- a/BealeEngineering/BealeEngineering.Accounts/frmMain.cs +++ b/BealeEngineering/BealeEngineering.Accounts/frmMain.cs @@ -20,16 +20,56 @@ namespace BealeEngineering.Accounts private bool isDirtyClientPo = true; private bool isDirtyProjectWork = true; - Core.Logic.Sale.SaleInvoiceAssign assignInvoice; + Core.Logic.Sale.AssignInvoice assignInvoice; public frmMain() { InitializeComponent(); sqlConnectionString = ConfigurationManager.ConnectionStrings["BealeEngSQLDb"].ToString(); - assignInvoice = new Core.Logic.Sale.SaleInvoiceAssign(sqlConnectionString); + assignInvoice = new Core.Logic.Sale.AssignInvoice(sqlConnectionString); UpdateInvoiceImportText(); } + public bool IsDirtyInvoiceAllocation + { + get { return isDirtyInvoiceAllocation; } + set + { + isDirtyInvoiceAllocation = value; + IsDirtyRefresh(); + } + } + + public bool IsDirtySaleInvoice + { + get { return isDirtySaleInvoice; } + set + { + isDirtySaleInvoice = value; + IsDirtyRefresh(); + } + } + + public bool IsDirtyClientPo + { + get { return isDirtyClientPo; } + set + { + isDirtyClientPo = value; + IsDirtyRefresh(); + } + } + + public bool IsDirtyProjectWork + { + get { return isDirtyProjectWork; } + set + { + isDirtyProjectWork = value; + IsDirtyRefresh(); + } + } + public List TableData { get; set; } private void Form1_Load(object sender, EventArgs e) @@ -39,32 +79,35 @@ namespace BealeEngineering.Accounts private void TabSetAllIsDirty() { - isDirtyInvoiceAllocation = true; - isDirtySaleInvoice = true; - isDirtyClientPo = true; - isDirtyProjectWork = true; + IsDirtyInvoiceAllocation = true; + IsDirtySaleInvoice = true; + IsDirtyClientPo = true; + IsDirtyProjectWork = true; + } - tabControl1_SelectedIndexChanged(null, null); + public void IsDirtyRefresh() + { + if (tabControl1.SelectedTab == tabControl1.TabPages["tabClientPoAllocation"] && IsDirtyInvoiceAllocation) + { + RefreshTabInvoiceAllocation(); + } + else if (tabControl1.SelectedTab == tabControl1.TabPages["tabSaleInvoice"] && IsDirtySaleInvoice) + { + btnRefreshSaleInvoice_Click(null, null); + } + else if (tabControl1.SelectedTab == tabControl1.TabPages["tabClientPo"] && IsDirtyClientPo) + { + btnRefreshClientPo_Click(null, null); + } + else if (tabControl1.SelectedTab == tabControl1.TabPages["tabProjectWork"] && IsDirtyProjectWork) + { + btnRefreshProjectWork_Click(null, null); + } } private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { - if (tabControl1.SelectedTab == tabControl1.TabPages["tabClientPoAllocation"] && isDirtyInvoiceAllocation) - { - RefreshTabInvoiceAllocation(); - } - else if (tabControl1.SelectedTab == tabControl1.TabPages["tabSaleInvoice"] && isDirtySaleInvoice) - { - btnRefreshSaleInvoice_Click(null, null); - } - else if (tabControl1.SelectedTab == tabControl1.TabPages["tabClientPo"] && isDirtyClientPo) - { - btnRefreshClientPo_Click(null, null); - } - else if (tabControl1.SelectedTab == tabControl1.TabPages["tabProjectWork"] && isDirtyProjectWork) - { - btnRefreshProjectWork_Click(null, null); - } + IsDirtyRefresh(); } private void RefreshTabInvoiceAllocation() @@ -72,7 +115,7 @@ namespace BealeEngineering.Accounts btnRefreshInvAllocation_Click(null, null); UpdateInvoiceCombo(); UpdateInvoiceImportText(); - isDirtyInvoiceAllocation = false; + IsDirtyInvoiceAllocation = false; } private void cmbInvoicePick_SelectedIndexChanged(object sender, EventArgs e) @@ -96,7 +139,7 @@ namespace BealeEngineering.Accounts private void UpdateInvoiceCombo() { - var idList = new Core.Data.Database.Client.ReadSaleInvoiceAllocation(sqlConnectionString).GetUnallocatedInvoice(); + var idList = new Core.Data.Database.Sale.ReadSaleInvoiceAllocation(sqlConnectionString).GetUnallocatedInvoice(); var readInvoice = new Core.Data.Database.Sale.ReadInvoiceHeader(sqlConnectionString); readInvoice.InvoiceNumber = idList; @@ -117,8 +160,9 @@ namespace BealeEngineering.Accounts var currentSaleInvoice = new Core.Data.Database.Sale.ReadInvoice(sqlConnectionString).BySaleInvoiceId(invoiceId); - var frmInvoice = new frmSaleInvoice(currentSaleInvoice); + var frmInvoice = new frmSaleInvoice(sqlConnectionString, currentSaleInvoice, this); frmInvoice.ShowDialog(); + IsDirtyRefresh(); } private void btnRefreshInvAllocation_Click(object sender, EventArgs e) @@ -338,7 +382,7 @@ namespace BealeEngineering.Accounts invoiceData.OrderByDescending(x => x.SaleInvoiceNumber .Substring(x.SaleInvoiceNumber.IndexOf("#") + 1, x.SaleInvoiceNumber.Length - x.SaleInvoiceNumber.IndexOf("#") - 1)); - isDirtySaleInvoice = false; + IsDirtySaleInvoice = false; } private void btnAssign_Click(object sender, EventArgs e) @@ -427,12 +471,12 @@ namespace BealeEngineering.Accounts var currentSaleInvoice = new Core.Data.Database.Sale.ReadInvoice(sqlConnectionString).BySaleInvoiceId(invoiceId); - var frmInvoice = new frmSaleInvoice(currentSaleInvoice); + var frmInvoice = new frmSaleInvoice(sqlConnectionString, currentSaleInvoice, this); frmInvoice.ShowDialog(); } - isDirtySaleInvoice = true; - tabControl1_SelectedIndexChanged(null, null); + IsDirtySaleInvoice = true; + IsDirtyRefresh(); } private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e) @@ -453,7 +497,7 @@ namespace BealeEngineering.Accounts purchaseOrderBindingSource.DataSource= poData.OrderByDescending(x => x.PurchaseOrderDate); - isDirtyClientPo = false; + IsDirtyClientPo = false; } private void btnOpenPo(object sender, EventArgs e) @@ -465,8 +509,7 @@ namespace BealeEngineering.Accounts frmPo.ShowDialog(); btnRefreshClientPo_Click(null, null); - isDirtyClientPo = true; - tabControl1_SelectedIndexChanged(null, null); + IsDirtyClientPo = true; } private void btnAddPurchaseOrder_Click_1(object sender, EventArgs e) @@ -474,15 +517,14 @@ namespace BealeEngineering.Accounts var frmPo = new frmClientPurchaseOrder(sqlConnectionString, null); frmPo.ShowDialog(); - isDirtyClientPo = true; - tabControl1_SelectedIndexChanged(null, null); + IsDirtyClientPo = true; } private void btnRefreshProjectWork_Click(object sender, EventArgs e) { dataGridView4.DataSource = new Core.Data.Database.Project.ReadProjectWorkItem(sqlConnectionString).Read(); - isDirtyProjectWork = false; + IsDirtyProjectWork = false; } private void xeroNewInvoiceToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.Designer.cs b/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.Designer.cs index f77a748..c8b1090 100644 --- a/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.Designer.cs +++ b/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.Designer.cs @@ -54,6 +54,7 @@ this.invoiceLineListDataGridView = new System.Windows.Forms.DataGridView(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.taxTotalTextBox = new System.Windows.Forms.TextBox(); + this.btnDeleteInvoice = new System.Windows.Forms.Button(); this.bsInvoice = new System.Windows.Forms.BindingSource(this.components); this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dataGridViewTextBoxColumn3 = new System.Windows.Forms.DataGridViewTextBoxColumn(); @@ -84,7 +85,7 @@ // contactNameLabel // contactNameLabel.AutoSize = true; - contactNameLabel.Location = new System.Drawing.Point(65, 27); + contactNameLabel.Location = new System.Drawing.Point(65, 105); contactNameLabel.Name = "contactNameLabel"; contactNameLabel.Size = new System.Drawing.Size(78, 13); contactNameLabel.TabIndex = 0; @@ -93,7 +94,7 @@ // currencyCodeLabel // currencyCodeLabel.AutoSize = true; - currencyCodeLabel.Location = new System.Drawing.Point(492, 27); + currencyCodeLabel.Location = new System.Drawing.Point(454, 27); currencyCodeLabel.Name = "currencyCodeLabel"; currencyCodeLabel.Size = new System.Drawing.Size(80, 13); currencyCodeLabel.TabIndex = 2; @@ -102,7 +103,7 @@ // dueDateLabel // dueDateLabel.AutoSize = true; - dueDateLabel.Location = new System.Drawing.Point(87, 106); + dueDateLabel.Location = new System.Drawing.Point(87, 80); dueDateLabel.Name = "dueDateLabel"; dueDateLabel.Size = new System.Drawing.Size(56, 13); dueDateLabel.TabIndex = 4; @@ -111,7 +112,7 @@ // invoiceDateLabel // invoiceDateLabel.AutoSize = true; - invoiceDateLabel.Location = new System.Drawing.Point(72, 80); + invoiceDateLabel.Location = new System.Drawing.Point(72, 54); invoiceDateLabel.Name = "invoiceDateLabel"; invoiceDateLabel.Size = new System.Drawing.Size(71, 13); invoiceDateLabel.TabIndex = 6; @@ -120,7 +121,7 @@ // invoiceTotalLabel // invoiceTotalLabel.AutoSize = true; - invoiceTotalLabel.Location = new System.Drawing.Point(500, 79); + invoiceTotalLabel.Location = new System.Drawing.Point(462, 79); invoiceTotalLabel.Name = "invoiceTotalLabel"; invoiceTotalLabel.Size = new System.Drawing.Size(72, 13); invoiceTotalLabel.TabIndex = 8; @@ -129,7 +130,7 @@ // isCreditNoteLabel // isCreditNoteLabel.AutoSize = true; - isCreditNoteLabel.Location = new System.Drawing.Point(498, 107); + isCreditNoteLabel.Location = new System.Drawing.Point(460, 107); isCreditNoteLabel.Name = "isCreditNoteLabel"; isCreditNoteLabel.Size = new System.Drawing.Size(74, 13); isCreditNoteLabel.TabIndex = 10; @@ -147,16 +148,16 @@ // saleInvoiceNumberLabel // saleInvoiceNumberLabel.AutoSize = true; - saleInvoiceNumberLabel.Location = new System.Drawing.Point(34, 53); + saleInvoiceNumberLabel.Location = new System.Drawing.Point(58, 27); saleInvoiceNumberLabel.Name = "saleInvoiceNumberLabel"; - saleInvoiceNumberLabel.Size = new System.Drawing.Size(109, 13); + saleInvoiceNumberLabel.Size = new System.Drawing.Size(85, 13); saleInvoiceNumberLabel.TabIndex = 14; - saleInvoiceNumberLabel.Text = "Sale Invoice Number:"; + saleInvoiceNumberLabel.Text = "Invoice Number:"; // // statusLabel // statusLabel.AutoSize = true; - statusLabel.Location = new System.Drawing.Point(532, 135); + statusLabel.Location = new System.Drawing.Point(494, 135); statusLabel.Name = "statusLabel"; statusLabel.Size = new System.Drawing.Size(40, 13); statusLabel.TabIndex = 16; @@ -165,7 +166,7 @@ // taxTotalLabel // taxTotalLabel.AutoSize = true; - taxTotalLabel.Location = new System.Drawing.Point(517, 53); + taxTotalLabel.Location = new System.Drawing.Point(479, 53); taxTotalLabel.Name = "taxTotalLabel"; taxTotalLabel.Size = new System.Drawing.Size(55, 13); taxTotalLabel.TabIndex = 18; @@ -174,7 +175,7 @@ // contactNameTextBox // this.contactNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsInvoice, "ContactName", true)); - this.contactNameTextBox.Location = new System.Drawing.Point(149, 24); + this.contactNameTextBox.Location = new System.Drawing.Point(149, 102); this.contactNameTextBox.Name = "contactNameTextBox"; this.contactNameTextBox.Size = new System.Drawing.Size(200, 20); this.contactNameTextBox.TabIndex = 1; @@ -182,7 +183,7 @@ // currencyCodeTextBox // this.currencyCodeTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsInvoice, "CurrencyCode", true)); - this.currencyCodeTextBox.Location = new System.Drawing.Point(578, 24); + this.currencyCodeTextBox.Location = new System.Drawing.Point(540, 24); this.currencyCodeTextBox.Name = "currencyCodeTextBox"; this.currencyCodeTextBox.Size = new System.Drawing.Size(100, 20); this.currencyCodeTextBox.TabIndex = 3; @@ -190,23 +191,23 @@ // dueDateDateTimePicker // this.dueDateDateTimePicker.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bsInvoice, "DueDate", true)); - this.dueDateDateTimePicker.Location = new System.Drawing.Point(149, 102); + this.dueDateDateTimePicker.Location = new System.Drawing.Point(149, 76); this.dueDateDateTimePicker.Name = "dueDateDateTimePicker"; - this.dueDateDateTimePicker.Size = new System.Drawing.Size(200, 20); + this.dueDateDateTimePicker.Size = new System.Drawing.Size(118, 20); this.dueDateDateTimePicker.TabIndex = 5; // // invoiceDateDateTimePicker // this.invoiceDateDateTimePicker.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bsInvoice, "InvoiceDate", true)); - this.invoiceDateDateTimePicker.Location = new System.Drawing.Point(149, 76); + this.invoiceDateDateTimePicker.Location = new System.Drawing.Point(149, 50); this.invoiceDateDateTimePicker.Name = "invoiceDateDateTimePicker"; - this.invoiceDateDateTimePicker.Size = new System.Drawing.Size(200, 20); + this.invoiceDateDateTimePicker.Size = new System.Drawing.Size(118, 20); this.invoiceDateDateTimePicker.TabIndex = 7; // // invoiceTotalTextBox // this.invoiceTotalTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsInvoice, "InvoiceTotal", true)); - this.invoiceTotalTextBox.Location = new System.Drawing.Point(578, 76); + this.invoiceTotalTextBox.Location = new System.Drawing.Point(540, 76); this.invoiceTotalTextBox.Name = "invoiceTotalTextBox"; this.invoiceTotalTextBox.Size = new System.Drawing.Size(100, 20); this.invoiceTotalTextBox.TabIndex = 9; @@ -214,7 +215,7 @@ // isCreditNoteCheckBox // this.isCreditNoteCheckBox.DataBindings.Add(new System.Windows.Forms.Binding("CheckState", this.bsInvoice, "IsCreditNote", true)); - this.isCreditNoteCheckBox.Location = new System.Drawing.Point(578, 102); + this.isCreditNoteCheckBox.Location = new System.Drawing.Point(540, 102); this.isCreditNoteCheckBox.Name = "isCreditNoteCheckBox"; this.isCreditNoteCheckBox.Size = new System.Drawing.Size(104, 24); this.isCreditNoteCheckBox.TabIndex = 11; @@ -232,15 +233,15 @@ // saleInvoiceNumberTextBox // this.saleInvoiceNumberTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsInvoice, "SaleInvoiceNumber", true)); - this.saleInvoiceNumberTextBox.Location = new System.Drawing.Point(149, 50); + this.saleInvoiceNumberTextBox.Location = new System.Drawing.Point(149, 24); this.saleInvoiceNumberTextBox.Name = "saleInvoiceNumberTextBox"; - this.saleInvoiceNumberTextBox.Size = new System.Drawing.Size(100, 20); + this.saleInvoiceNumberTextBox.Size = new System.Drawing.Size(118, 20); this.saleInvoiceNumberTextBox.TabIndex = 15; // // statusTextBox // this.statusTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsInvoice, "Status", true)); - this.statusTextBox.Location = new System.Drawing.Point(578, 132); + this.statusTextBox.Location = new System.Drawing.Point(540, 132); this.statusTextBox.Name = "statusTextBox"; this.statusTextBox.Size = new System.Drawing.Size(100, 20); this.statusTextBox.TabIndex = 17; @@ -275,10 +276,11 @@ dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; this.invoiceLineListDataGridView.DefaultCellStyle = dataGridViewCellStyle2; this.invoiceLineListDataGridView.Dock = System.Windows.Forms.DockStyle.Fill; + this.invoiceLineListDataGridView.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; this.invoiceLineListDataGridView.Location = new System.Drawing.Point(0, 0); this.invoiceLineListDataGridView.Name = "invoiceLineListDataGridView"; this.invoiceLineListDataGridView.ReadOnly = true; - this.invoiceLineListDataGridView.Size = new System.Drawing.Size(800, 296); + this.invoiceLineListDataGridView.Size = new System.Drawing.Size(800, 399); this.invoiceLineListDataGridView.TabIndex = 18; // // splitContainer1 @@ -292,6 +294,7 @@ // // splitContainer1.Panel1 // + this.splitContainer1.Panel1.Controls.Add(this.btnDeleteInvoice); this.splitContainer1.Panel1.Controls.Add(taxTotalLabel); this.splitContainer1.Panel1.Controls.Add(this.taxTotalTextBox); this.splitContainer1.Panel1.Controls.Add(this.saleInvoiceNumberTextBox); @@ -316,18 +319,28 @@ // splitContainer1.Panel2 // this.splitContainer1.Panel2.Controls.Add(this.invoiceLineListDataGridView); - this.splitContainer1.Size = new System.Drawing.Size(800, 475); + this.splitContainer1.Size = new System.Drawing.Size(800, 578); this.splitContainer1.SplitterDistance = 175; this.splitContainer1.TabIndex = 19; // // taxTotalTextBox // this.taxTotalTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsInvoice, "TaxTotal", true)); - this.taxTotalTextBox.Location = new System.Drawing.Point(578, 50); + this.taxTotalTextBox.Location = new System.Drawing.Point(540, 50); this.taxTotalTextBox.Name = "taxTotalTextBox"; this.taxTotalTextBox.Size = new System.Drawing.Size(100, 20); this.taxTotalTextBox.TabIndex = 19; // + // btnDeleteInvoice + // + this.btnDeleteInvoice.Location = new System.Drawing.Point(693, 24); + this.btnDeleteInvoice.Name = "btnDeleteInvoice"; + this.btnDeleteInvoice.Size = new System.Drawing.Size(77, 20); + this.btnDeleteInvoice.TabIndex = 20; + this.btnDeleteInvoice.Text = "Delete"; + this.btnDeleteInvoice.UseVisualStyleBackColor = true; + this.btnDeleteInvoice.Click += new System.EventHandler(this.btnDeleteInvoice_Click); + // // bsInvoice // this.bsInvoice.DataSource = typeof(BealeEngineering.Core.Model.Sale.Invoice); @@ -354,38 +367,38 @@ // dataGridViewTextBoxColumn4 // this.dataGridViewTextBoxColumn4.DataPropertyName = "Quantity"; - this.dataGridViewTextBoxColumn4.HeaderText = "Quantity"; - this.dataGridViewTextBoxColumn4.MinimumWidth = 30; + this.dataGridViewTextBoxColumn4.HeaderText = "Qty."; + this.dataGridViewTextBoxColumn4.MinimumWidth = 35; this.dataGridViewTextBoxColumn4.Name = "dataGridViewTextBoxColumn4"; this.dataGridViewTextBoxColumn4.ReadOnly = true; - this.dataGridViewTextBoxColumn4.Width = 30; + this.dataGridViewTextBoxColumn4.Width = 35; // // dataGridViewTextBoxColumn5 // this.dataGridViewTextBoxColumn5.DataPropertyName = "UnitAmount"; this.dataGridViewTextBoxColumn5.HeaderText = "Unit Amount"; - this.dataGridViewTextBoxColumn5.MinimumWidth = 40; + this.dataGridViewTextBoxColumn5.MinimumWidth = 60; this.dataGridViewTextBoxColumn5.Name = "dataGridViewTextBoxColumn5"; this.dataGridViewTextBoxColumn5.ReadOnly = true; - this.dataGridViewTextBoxColumn5.Width = 40; + this.dataGridViewTextBoxColumn5.Width = 60; // // dataGridViewTextBoxColumn7 // this.dataGridViewTextBoxColumn7.DataPropertyName = "AccountCode"; this.dataGridViewTextBoxColumn7.HeaderText = "Account Code"; - this.dataGridViewTextBoxColumn7.MinimumWidth = 50; + this.dataGridViewTextBoxColumn7.MinimumWidth = 80; this.dataGridViewTextBoxColumn7.Name = "dataGridViewTextBoxColumn7"; this.dataGridViewTextBoxColumn7.ReadOnly = true; - this.dataGridViewTextBoxColumn7.Width = 50; + this.dataGridViewTextBoxColumn7.Width = 80; // // dataGridViewTextBoxColumn8 // this.dataGridViewTextBoxColumn8.DataPropertyName = "TaxType"; this.dataGridViewTextBoxColumn8.HeaderText = "Tax Type"; - this.dataGridViewTextBoxColumn8.MinimumWidth = 50; + this.dataGridViewTextBoxColumn8.MinimumWidth = 80; this.dataGridViewTextBoxColumn8.Name = "dataGridViewTextBoxColumn8"; this.dataGridViewTextBoxColumn8.ReadOnly = true; - this.dataGridViewTextBoxColumn8.Width = 50; + this.dataGridViewTextBoxColumn8.Width = 80; // // dataGridViewTextBoxColumn9 // @@ -400,13 +413,14 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 475); + this.ClientSize = new System.Drawing.Size(800, 578); this.Controls.Add(this.splitContainer1); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "frmSaleInvoice"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "SaleInvoice"; + this.Text = "Sales Invoice"; + this.Load += new System.EventHandler(this.frmSaleInvoice_Load); ((System.ComponentModel.ISupportInitialize)(this.invoiceLineListBindingSource)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.invoiceLineListDataGridView)).EndInit(); this.splitContainer1.Panel1.ResumeLayout(false); @@ -443,5 +457,6 @@ private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn7; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn8; private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn9; + private System.Windows.Forms.Button btnDeleteInvoice; } } \ No newline at end of file diff --git a/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.cs b/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.cs index 19fd255..c7774e1 100644 --- a/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.cs +++ b/BealeEngineering/BealeEngineering.Accounts/frmSaleInvoice.cs @@ -1,4 +1,5 @@ -using System; +using BealeEngineering.Core.Model.Sale; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -12,12 +13,72 @@ namespace BealeEngineering.Accounts { public partial class frmSaleInvoice : Form { - public frmSaleInvoice(Core.Model.Sale.Invoice invoice = null) + private Core.Model.Sale.Invoice invoice; + private string sqlConnectionString; + private frmMain owner; + + public frmSaleInvoice(string sqlConnectionString, Core.Model.Sale.Invoice invoice = null, frmMain owner = null) { InitializeComponent(); - bsInvoice.DataSource = invoice; - invoiceLineListBindingSource.DataSource = invoice.InvoiceLineList; + this.sqlConnectionString = sqlConnectionString; + + if (owner != null) + { + this.owner = owner; + } + + if (invoice == null) + { + this.invoice = new Core.Model.Sale.Invoice(); + } + else + { + this.invoice = invoice; + } + + bsInvoice.DataSource = this.invoice; + invoiceLineListBindingSource.DataSource = this.invoice.InvoiceLineList; + } + + private void frmSaleInvoice_Load(object sender, EventArgs e) + { + + } + + private void btnDeleteInvoice_Click(object sender, EventArgs e) + { + string dialogText = "Delete invoice?"; + + DialogResult dialogResult = MessageBox.Show(dialogText, "Delete Invoice", MessageBoxButtons.OKCancel); + if (dialogResult == DialogResult.OK) + { + if (invoice.SaleInvoiceIdIsSet) + { + try + { + var inst = new Core.Logic.Sale.DeleteInvoice(sqlConnectionString); + bool ack = inst.Execute(invoice.SaleInvoiceID); + owner.IsDirtySaleInvoice = true; + if (ack == false) + { + MessageBox.Show("Invoice deletion failed: " + inst.ErrorMessage); + } + else + { + this.Close(); + } + } + catch (Exception ex) + { + MessageBox.Show("Exception caught: " + ex.Message); + } + } + else + { + this.Close(); + } + } } } } diff --git a/BealeEngineering/BealeEngineering.Core/BealeEngineering.Core.csproj b/BealeEngineering/BealeEngineering.Core/BealeEngineering.Core.csproj index b843b09..f1d2546 100644 --- a/BealeEngineering/BealeEngineering.Core/BealeEngineering.Core.csproj +++ b/BealeEngineering/BealeEngineering.Core/BealeEngineering.Core.csproj @@ -66,7 +66,9 @@ - + + + @@ -87,7 +89,8 @@ - + + diff --git a/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/DeleteInvoiceHeader.cs b/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/DeleteInvoiceHeader.cs new file mode 100644 index 0000000..0bc1f65 --- /dev/null +++ b/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/DeleteInvoiceHeader.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BealeEngineering.Core.Data.Database.Sale +{ + public class DeleteInvoiceHeader : Connection + { + public DeleteInvoiceHeader(string sqlConnectionString) : base(sqlConnectionString) + { + + } + + public bool ByInvoiceId(int invoiceId) + { + string sqlWhere = "SaleInvoiceID = @invoiceId"; + + return Execute(sqlWhere, new Dictionary { { "@invoiceId", invoiceId } }); + } + + public bool ByInvoiceNumber(string invoiceNumber) + { + string sqlWhere = "SaleInvoiceNumber = @invoiceNumber"; + + return Execute(sqlWhere, new Dictionary { { "@invoiceNumber", invoiceNumber } } ); + } + + private bool Execute(string sqlWhere, Dictionary paramters) + { + if (string.IsNullOrWhiteSpace(sqlWhere)) + { + throw new Exception("Where condition to SQL string required"); + } + + string sql = @" + DELETE + FROM SaleInvoice + WHERE " + sqlWhere; + + using (SqlConnection conn = new SqlConnection(sqlConnectionString)) + { + conn.Open(); + + // delete invoice header + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + foreach (var item in paramters) + { + cmd.Parameters.AddWithValue(item.Key, item.Value); + } + + int effected = cmd.ExecuteNonQuery(); + + if (effected > 0) + { + return true; + } + else + { + return false; + } + } + } + } + } +} diff --git a/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/DeleteInvoiceLine.cs b/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/DeleteInvoiceLine.cs new file mode 100644 index 0000000..2a5aa6a --- /dev/null +++ b/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/DeleteInvoiceLine.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BealeEngineering.Core.Data.Database.Sale +{ + public class DeleteInvoiceLine : Connection + { + public DeleteInvoiceLine(string sqlConnectionString) : base(sqlConnectionString) + { + + } + + /// + /// Deletes sales invoice line based on Sale Invoice ID + /// + /// Sale Invoice ID + /// Number of rows effected + public int ByInvoiceId(int invoiceId) + { + string sqlWhere = " SaleInvoiceID = @invoiceId"; + + return Execute(sqlWhere, new Dictionary { { "@invoiceId", invoiceId } }); + } + + /// + /// Deletes sales invoice line based on Sale Invoice Number + /// + /// Sale Invoice Number + /// Number of rows effected + public int ByInvoiceNumber(string invoiceNumber) + { + string sqlWhere = @"( + SELECT SaleInvoiceID + FROM SaleInvoice + WHERE (SaleInvoiceNumber = @invoiceNumber) + ) IS NOT NULL + AND ( + SaleInvoiceID = ISNULL(( + SELECT SaleInvoiceID + FROM SaleInvoice + WHERE (SaleInvoiceNumber = @invoiceNumber) + ), 0) + ) "; + + return Execute(sqlWhere, new Dictionary { { "@invoiceNumber", invoiceNumber } }); + } + + private int Execute(string sqlWhere, Dictionary parameters) + { + if (string.IsNullOrWhiteSpace(sqlWhere)) + { + throw new Exception("Where condition to SQL string required"); + } + + string sql = @" + DELETE + FROM SaleInvoiceLine + WHERE " + sqlWhere; + + using (SqlConnection conn = new SqlConnection(sqlConnectionString)) + { + conn.Open(); + + using (SqlCommand cmd = new SqlCommand(sql, conn)) + { + foreach (var item in parameters) + { + cmd.Parameters.AddWithValue(item.Key, item.Value); + } + + int effected = cmd.ExecuteNonQuery(); + + return effected; + } + } + } + } +} diff --git a/BealeEngineering/BealeEngineering.Core/Data/Database/Client/ReadSaleInvoiceAllocation.cs b/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/ReadSaleInvoiceAllocation.cs similarity index 60% rename from BealeEngineering/BealeEngineering.Core/Data/Database/Client/ReadSaleInvoiceAllocation.cs rename to BealeEngineering/BealeEngineering.Core/Data/Database/Sale/ReadSaleInvoiceAllocation.cs index d69d178..498429d 100644 --- a/BealeEngineering/BealeEngineering.Core/Data/Database/Client/ReadSaleInvoiceAllocation.cs +++ b/BealeEngineering/BealeEngineering.Core/Data/Database/Sale/ReadSaleInvoiceAllocation.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BealeEngineering.Core.Data.Database.Client +namespace BealeEngineering.Core.Data.Database.Sale { public class ReadSaleInvoiceAllocation : Connection { @@ -13,6 +13,44 @@ namespace BealeEngineering.Core.Data.Database.Client { } + + /// + /// Get the client purchase order line ID that has been assigned to an invoice + /// + /// Sales invoice Id + /// Client purchase order line ID where one has been assigned, else null + public int? GetPurchaseOrderLineId(int salesInvoiceId) + { + using (SqlConnection conn = new SqlConnection(sqlConnectionString)) + { + conn.Open(); + + using (SqlCommand cmd = new SqlCommand(@" + SELECT ClientPurchaseOrderLineID + FROM ClientPurchaseOrderLineSalesInvoice + WHERE SaleInvoiceID = @salesInvoiceId + ", conn)) + { + cmd.Parameters.AddWithValue("@salesInvoiceId", salesInvoiceId); + + object obj = cmd.ExecuteScalar(); + + if (obj == null || obj == DBNull.Value) + { + return null; + } + else + { + return (int)obj; + } + } + } + } + + /// + /// Gets a count of invoices that have not been allocated to a client purchase order line + /// + /// Count of unallocated sales invoices public int GetUnallocatedInvoiceCount() { using (SqlConnection conn = new SqlConnection(sqlConnectionString)) @@ -33,6 +71,11 @@ namespace BealeEngineering.Core.Data.Database.Client } } } + + /// + /// Gets list of invoices that have not been allocated to a client purchase order line + /// + /// List of sales invoice numbers public List GetUnallocatedInvoice() { using (SqlConnection conn = new SqlConnection(sqlConnectionString)) diff --git a/BealeEngineering/BealeEngineering.Core/Logic/Client/PurchaseOrderAutoAllocate.cs b/BealeEngineering/BealeEngineering.Core/Logic/Client/PurchaseOrderAutoAllocate.cs index 898f11c..cac09d2 100644 --- a/BealeEngineering/BealeEngineering.Core/Logic/Client/PurchaseOrderAutoAllocate.cs +++ b/BealeEngineering/BealeEngineering.Core/Logic/Client/PurchaseOrderAutoAllocate.cs @@ -27,7 +27,7 @@ namespace BealeEngineering.Core.Logic.Client Init(); // get list of unallocated invoices - var poAlloInstance = new Data.Database.Client.ReadSaleInvoiceAllocation(SqlConnectionString); + var poAlloInstance = new Data.Database.Sale.ReadSaleInvoiceAllocation(SqlConnectionString); var invoiceNumberList = poAlloInstance.GetUnallocatedInvoice(); // nothing to allocate diff --git a/BealeEngineering/BealeEngineering.Core/Logic/Sale/SaleInvoiceAssign.cs b/BealeEngineering/BealeEngineering.Core/Logic/Sale/AssignInvoice.cs similarity index 95% rename from BealeEngineering/BealeEngineering.Core/Logic/Sale/SaleInvoiceAssign.cs rename to BealeEngineering/BealeEngineering.Core/Logic/Sale/AssignInvoice.cs index 36b3bbc..ad4031c 100644 --- a/BealeEngineering/BealeEngineering.Core/Logic/Sale/SaleInvoiceAssign.cs +++ b/BealeEngineering/BealeEngineering.Core/Logic/Sale/AssignInvoice.cs @@ -8,7 +8,7 @@ using System.Transactions; namespace BealeEngineering.Core.Logic.Sale { - public class SaleInvoiceAssign + public class AssignInvoice { string statusModified = new Data.SaleInvoiceFormat().ReadStatusStringModified(); string statusNew = new Data.SaleInvoiceFormat().ReadStatusStringNew(); @@ -17,7 +17,7 @@ namespace BealeEngineering.Core.Logic.Sale DateTime timeCheckPostpone = new DateTime(); int timeCheckPostponeMinutes = 15; - public SaleInvoiceAssign(string sqlConnectionString) + public AssignInvoice(string sqlConnectionString) { this.sqlConnectionString = sqlConnectionString; } @@ -253,5 +253,16 @@ namespace BealeEngineering.Core.Logic.Sale { timeCheckPostpone = DateTime.Now.AddMinutes(timeCheckPostponeMinutes); } + + + /// + /// Checks if a sales invoice is assigned to a purchase order line + /// + /// Sales invoice Id + /// Purchase order line Id if true, null if false + public int? IsAssigned(int salesInvoiceId) + { + return new Data.Database.Sale.ReadSaleInvoiceAllocation(sqlConnectionString).GetPurchaseOrderLineId(salesInvoiceId); + } } } diff --git a/BealeEngineering/BealeEngineering.Core/Logic/Sale/DeleteInvoice.cs b/BealeEngineering/BealeEngineering.Core/Logic/Sale/DeleteInvoice.cs new file mode 100644 index 0000000..9d17e77 --- /dev/null +++ b/BealeEngineering/BealeEngineering.Core/Logic/Sale/DeleteInvoice.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; + +namespace BealeEngineering.Core.Logic.Sale +{ + public class DeleteInvoice + { + private string sqlConnectionString; + + public DeleteInvoice(string sqlConnectionString) + { + this.sqlConnectionString = sqlConnectionString; + } + + public string ErrorMessage { get; private set; } + + private void Init() + { + ErrorMessage = null; + } + + public bool Execute(int saleInvoiceId) + { + Init(); + + using (TransactionScope scope = new TransactionScope()) + { + // check for assigned purchase order line + var assignedPo = new Data.Database.Sale.ReadSaleInvoiceAllocation(sqlConnectionString).GetPurchaseOrderLineId(saleInvoiceId); + if (assignedPo != null) + { + ErrorMessage = "Invoice is assigned to Purchase Order Line ID:" + (int)assignedPo; + return false; + } + + int linesEffected = 0; + bool headerDeleted = false; + try + { + // delete invoice lines + linesEffected = new Data.Database.Sale.DeleteInvoiceLine(sqlConnectionString).ByInvoiceId(saleInvoiceId); + + // delete invoice header + headerDeleted = new Data.Database.Sale.DeleteInvoiceHeader(sqlConnectionString).ByInvoiceId(saleInvoiceId); + } + catch (Exception ex) + { + ErrorMessage = "Sale Invoice delete failed: " + ex.Message; + return false; + } + + if (headerDeleted) + { + scope.Complete(); + return true; + } + else + { + scope.Dispose(); + ErrorMessage = "Sale Invoice delete failed"; + return false; + } + } + } + } +} diff --git a/BealeEngineering/BealeEngineering.Core/Model/Client/PurchaseOrderAllocation.cs b/BealeEngineering/BealeEngineering.Core/Model/Client/PurchaseOrderAllocation.cs index b4d8291..dfc84cd 100644 --- a/BealeEngineering/BealeEngineering.Core/Model/Client/PurchaseOrderAllocation.cs +++ b/BealeEngineering/BealeEngineering.Core/Model/Client/PurchaseOrderAllocation.cs @@ -9,21 +9,34 @@ namespace BealeEngineering.Core.Model.Client public class PurchaseOrderAllocation { public DateTime PurchaseOrderDate { get; set; } + public string WorkNumber { get; set; } + public string ContactName { get; set; } + public string ProjectTitle { get; set; } + public string WorkTitle { get; set; } + public string WorkDescription { get; set; } + public string PurchaseOrderReference { get; set; } + public int PurchaseOrderLineID { get; set; } + public int PurchaseOrderLineNumber { get; set; } + public string PurchaseOrderLineDescription { get; set; } + public decimal PurchaseOrderLineNetAmount { get; set; } + public decimal InvoicedAmount { get; set; } + public decimal PurchaseOrderLineFacility { get { return PurchaseOrderLineNetAmount - InvoicedAmount; } } + public bool PurchaseOrderIsClosed { get; set; } } } diff --git a/BealeEngineering/BealeEngineering.Core/Model/Sale/InvoiceHeader.cs b/BealeEngineering/BealeEngineering.Core/Model/Sale/InvoiceHeader.cs index 7fd2495..80368ff 100644 --- a/BealeEngineering/BealeEngineering.Core/Model/Sale/InvoiceHeader.cs +++ b/BealeEngineering/BealeEngineering.Core/Model/Sale/InvoiceHeader.cs @@ -10,8 +10,18 @@ namespace BealeEngineering.Core.Model.Sale public class InvoiceHeader : ValidateModel { private DateTime? dueDate = null; + private int? saleInvoiceId = null; - public int SaleInvoiceID { get; set; } + public int SaleInvoiceID + { + get { return saleInvoiceId.GetValueOrDefault(); } + set { saleInvoiceId = value; } + } + + public bool SaleInvoiceIdIsSet + { + get { return saleInvoiceId != null; } + } [Required()] public string ContactName { get; set; } diff --git a/BealeEngineering/BealeEngineering.Core/Test/Client/PurchaseOrder.cs b/BealeEngineering/BealeEngineering.Core/Test/Client/PurchaseOrder.cs index 29c8ded..8444cb2 100644 --- a/BealeEngineering/BealeEngineering.Core/Test/Client/PurchaseOrder.cs +++ b/BealeEngineering/BealeEngineering.Core/Test/Client/PurchaseOrder.cs @@ -31,7 +31,7 @@ namespace BealeEngineering.Core.Test.Client } public void GetUnallocatedPo() { - var readPoAllo = new Data.Database.Client.ReadSaleInvoiceAllocation(SqlConnectionString); + var readPoAllo = new Data.Database.Sale.ReadSaleInvoiceAllocation(SqlConnectionString); var test = readPoAllo.GetUnallocatedInvoice(); } }