From d3e56311f6967b49d486abd81b5dc9380fc2f2e2 Mon Sep 17 00:00:00 2001 From: Binod Date: Thu, 19 Sep 2013 02:50:30 +0545 Subject: [PATCH] Updated comments on ProductControl. --- MixERP.Net.Common/MixERP.Net.Common.csproj | 1 + .../Models/Core/ProductControlModel.cs | 9 + .../Products/ProductControl.ascx.cs | 192 +++++++++++++++--- MixERP.Net.v11.suo | Bin 678400 -> 699392 bytes 4 files changed, 175 insertions(+), 27 deletions(-) create mode 100644 MixERP.Net.Common/Models/Core/ProductControlModel.cs diff --git a/MixERP.Net.Common/MixERP.Net.Common.csproj b/MixERP.Net.Common/MixERP.Net.Common.csproj index a1e41442f..f02c6ee9b 100644 --- a/MixERP.Net.Common/MixERP.Net.Common.csproj +++ b/MixERP.Net.Common/MixERP.Net.Common.csproj @@ -63,6 +63,7 @@ + diff --git a/MixERP.Net.Common/Models/Core/ProductControlModel.cs b/MixERP.Net.Common/Models/Core/ProductControlModel.cs new file mode 100644 index 000000000..298032b9f --- /dev/null +++ b/MixERP.Net.Common/Models/Core/ProductControlModel.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MixERP.Net.Common.Models.Core +{ + +} diff --git a/MixERP.Net.FrontEnd/UserControls/Products/ProductControl.ascx.cs b/MixERP.Net.FrontEnd/UserControls/Products/ProductControl.ascx.cs index b852642fc..02edab615 100644 --- a/MixERP.Net.FrontEnd/UserControls/Products/ProductControl.ascx.cs +++ b/MixERP.Net.FrontEnd/UserControls/Products/ProductControl.ascx.cs @@ -6,41 +6,77 @@ http://mozilla.org/MPL/2.0/. ***********************************************************************************/ using System; -using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Globalization; using System.Linq; -using System.Threading; -using System.Web; using System.Web.UI; using System.Web.UI.WebControls; -using Microsoft.VisualBasic; namespace MixERP.Net.FrontEnd.UserControls.Products { + /// + /// Stay warned, this is very very big class and maybe complex as well and needs improvements. + /// This UserControl provides a common interface for all transactions that are related to + /// stock and/or inventory. Everything is handled in this class, except for the Save event. + /// The save event is exposed to the page containing this control and should be handled there. + /// public partial class ProductControl : System.Web.UI.UserControl { + /// + /// Transaction book for products are Sales and Purchase. + /// public MixERP.Net.Common.Models.Transactions.TranBook Book { get; set; } + + /// + /// Sub transaction books are maintained for breaking down the Purchase and Sales transaction into smaller steps + /// such as Quotations, Orders, Deliveries, e.t.c. + /// public MixERP.Net.Common.Models.Transactions.SubTranBook SubBook { get; set; } + + /// + /// The title displayed in the form. + /// public string Text { get; set; } - public GridView Grid { get { return ProductGridView; } } + + /// + /// A readonly instance of the GridView + /// + //public GridView Grid { get { return ProductGridView; } } + + /// + /// This property when set to true will display the RadioButtonList control which contains the transaction types. + /// Transaction types are Cash and Credit. + /// public bool DisplayTransactionTypeRadioButtonList { get; set; } + + /// + /// This property when set to true will verify the stock against the credit inventory transactions or "Sales". + /// Since negative stock is not allowed, you will not be able to add a product to the grid. + /// This property must be enabled for Sales transaction which affect the available inventory on hand. + /// Please also note that even when this property is enabled, the products having the switch "Maintain Stock" set to "Off" + /// will not be checked for stock availability. + /// This property should be disabled or set to false for stock transactions that do not affect stock such as "Quotations", "Orders", e.t.c. + /// public bool VerifyStock { get; set; } + + /// + /// This property when enabled will display cash repositories and their available balance. + /// Not all availble cash repositories will be displayed here but those which belong to the current (or logged in) branch office. + /// This property must be enabled for transactions which have affect on cash ledger, namely "Direct Purchase" and "Direct Sales". + /// public bool ShowCashRepository { get; set; } /// - /// Representation of pre assigned data for presentation. + /// This property is used to temporarily store pre assigned instance of transactions for merging transactions + /// and creating a batch transactions. + /// Some cases: + /// Multiple Sales Quotations --> Sales Order. + /// Multiple Sales Quotations --> Sales Delivery. /// private MixERP.Net.Common.Models.Transactions.MergeModel model = new Common.Models.Transactions.MergeModel(); - public ControlCollection GetForm - { - get - { - return this.GetControls(); - } - } - + /// + /// This class is a representation of the controls in this UserControl. + /// public class ControlCollection { public MixERP.Net.FrontEnd.UserControls.DateTextBox DateTextBox { get; set; } @@ -64,6 +100,10 @@ public class ControlCollection public TextBox StatementReferenceTextBox { get; set; } } + /// + /// This function returns a new instance of ControlCollection class. + /// + /// private ControlCollection GetControls() { ControlCollection collection = new ControlCollection(); @@ -89,7 +129,22 @@ private ControlCollection GetControls() return collection; } + /// + /// This property provides a read-only acess to all the controls of this UserControl. + /// This property is accessed after the user clicks the "Save" button. + /// The values of each control is read and then sent to the database layer. + /// + public ControlCollection GetForm + { + get + { + return this.GetControls(); + } + } + /// + /// This property set the width of the top panel. + /// public Unit TopPanelWidth { get @@ -103,73 +158,156 @@ public Unit TopPanelWidth } - public event EventHandler SaveButtonClick; - public virtual void OnSaveButtonClick(object sender, EventArgs e) - { - if(SaveButtonClick != null) - { - this.SaveButtonClick(sender, e); - } - } + /// + /// This event will be raised on SaveButon's click event. + /// + public event EventHandler SaveButtonClick; protected void SaveButton_Click(object sender, EventArgs e) { //Validation Check Start + + //Check the number of products in the grid. if(ProductGridView.Rows.Count.Equals(0)) { ErrorLabel.Text = Resources.Warnings.NoItemFound; return; } + //If this is a purchase on cash transaction, we need to make sure + //that the selected cash repository has enough balance for the credit transaction. + //Remember: + //1. MixERP does not allow negative cash transaction. + //2. Cash is maintained on LIFO principal. + + //The MixERP LIFO principal + + //LAST IN + //The cash would be in at last --> Last In. + //This means that you would have to first approve a transaction which has cash on the debit side before it shows up in the effective balance. + //If you approve the transaction, cash is in-->Last In. + //If you reject or ignore the transaction, there is no effect. + + //FIRST OUT + //The cash would be out at first --> First Out. + //This means that even when you have not approved a transaction which has cash on the credit side, it reduces the cash balance. + //So, if you approve the transaction, there is no effect since the cash was already out-->First Out. + //The actual cash balance is restored only when you reject the transaction. + + //So, no point on getting confused here. This calculations is happened on the database level. + //If anything goes wrong, throw stones to your DBAs. + if(this.Book == Common.Models.Transactions.TranBook.Purchase && CashRepositoryRow.Visible) { + //Update cash repository balance. this.UpdateRepositoryBalance(); + //Get the balance of the cash repository. decimal repositoryBalance = MixERP.Net.Common.Conversion.TryCastDecimal(CashRepositoryBalanceTextBox.Text); + + //Get the grand total credit amount. decimal grandTotal = MixERP.Net.Common.Conversion.TryCastDecimal(GrandTotalTextBox.Text); + //If the amount to pay is greater than available cash balance. if(grandTotal > repositoryBalance) { + //Display an error message to the user stating that there's not enough cash to post this transaction. ErrorLabel.Text = Resources.Warnings.NotEnoughCash; return; } } + //Check if the shipping charge textbox has a value. if(!string.IsNullOrWhiteSpace(ShippingChargeTextBox.Text)) { + //Check if the value actually was a number. if(!MixERP.Net.Common.Conversion.IsNumeric(ShippingChargeTextBox.Text)) { + //You could never guess in your wildest dream how insanse a user could behave. MixERP.Net.BusinessLayer.Helpers.FormHelper.MakeDirty(ShippingChargeTextBox); return; } } - - //Validation Check End + //I am happy now. //Now exposing the button click event. this.OnSaveButtonClick(sender, e); } + /// + ///This method when called will raise a "SaveButtonClick" event. + /// + /// + /// + public virtual void OnSaveButtonClick(object sender, EventArgs e) + { + //Check if the event can be used. + if (SaveButtonClick != null) + { + //Raise the event. + this.SaveButtonClick(sender, e); + } + } + + + /// + /// This method handles the grid view's row command event. + /// + /// + /// protected void ProductGridView_RowCommand(object sender, GridViewCommandEventArgs e) { + //We only expect a delete command here. + //Be careful if this GridView implements other commands in the future. + //Needs refactoring. + + + //Get an instance of the collection of the products stored in the grid. Collection table = this.GetTable(); + + //Get the instance of grid view row on which the the command was triggered. GridViewRow row = (GridViewRow)(((ImageButton)e.CommandSource).NamingContainer); + + //Get the index of the row. int index = row.RowIndex; + //Remove the product from the collection at the specified index. table.RemoveAt(index); + + //Store the new product collection on the session. Session[this.ID] = table; + + //Call the method to bind the gridview once again. this.BindGridView(); + //UpdatePanel1.Update(); } + /// + /// This method is called for each grid view rows' databound event. + /// + /// + /// protected void ProductGridView_RowDataBound(object sender, GridViewRowEventArgs e) { + //Check the row type. if(e.Row.RowType == DataControlRowType.DataRow) { - ImageButton lb = e.Row.FindControl("DeleteImageButton") as ImageButton; - ScriptManager.GetCurrent(this.Page).RegisterAsyncPostBackControl(lb); + //Yeaaaaa! This is a data row. Yipeee!!!!! + + //Find the image button in this row. + ImageButton deleteImageButton = e.Row.FindControl("DeleteImageButton") as ImageButton; + + //Make sure that we found the image button we were looking for. + if (deleteImageButton != null) + { + //Wowowowow, we found the button. + + //Tell the script manager that this button should fire an asynchronous postback event. + ScriptManager.GetCurrent(this.Page).RegisterAsyncPostBackControl(deleteImageButton); + } } } diff --git a/MixERP.Net.v11.suo b/MixERP.Net.v11.suo index 7c320576754aa922606ca722c8c8f2b1c285b5b2..04ce6315eb71ebdc2607dd5f5efbfbbefb5d509c 100644 GIT binary patch delta 35884 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�l)Cle#s9HZ=@Ge4-QH1T`2t2xV= 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 f@Z74GS~+`8mQlI`$a