private bool validateRefundTenderMatrix(TenderEntryVO entry, out string validationErrorMsg) { validationErrorMsg = string.Empty; if (entry.TenderType == TenderTypes.CREDITCARD || entry.TenderType == TenderTypes.DEBITCARD) { List <TenderEntryVO> tendCredDebitEntries; decimal amount; //Attempt to find a refund amount entry whose tender type matches that of a potential //refund line item if (!findRefundAmountByTenderType(entry.TenderType, entry.CardTypeString, out tendCredDebitEntries, out amount)) { validationErrorMsg = "You cannot refund onto a credit/debit card when one was not used in the original transaction"; } //If entry amount exceeds credit used in original transaction, entry is not valid decimal previousAmount = 0.0M; if (RowIdx >= 0) { previousAmount = Utilities.GetDecimalValue(tenderOutRefundDataGridView.Rows[RowIdx].Cells[3].Value.ToString().Substring(1)); } if (entry.Amount - previousAmount > amount) { validationErrorMsg = "You cannot refund more onto a credit/debit card than was used in the original transaction."; return(false); } } return(true); }
public TenderEntryForm(TenderTypes tendType) { InitializeComponent(); TenderEntry = new TenderEntryVO(); TenderEntry.TenderType = tendType; IsValid = false; }
private void internalTenderTypeSelectorHandler(TenderTypePanel.TenderTypeButton t) { //Check to see if amount out matches the balance already if (this.tenderTablePanel.TenderAmount > this.amountDueToCustomer) { MessageBox.Show( "Amount tendered to the customer already meets or exceeds " + System.Environment.NewLine + "the total due to the customer.", "Process Tender Warning"); return; } TenderEntryVO tEVO = null; TenderEntryForm tEntryForm = null; switch (t) { case TenderTypePanel.TenderTypeButton.CASH: tEntryForm = new TenderEntryForm(TenderTypes.CASHOUT); break; case TenderTypePanel.TenderTypeButton.CHECK: tEntryForm = new TenderEntryForm(TenderTypes.CHECK); break; case TenderTypePanel.TenderTypeButton.CREDITORBILLAP: tEntryForm = new TenderEntryForm(TenderTypes.CREDITCARD); break; case TenderTypePanel.TenderTypeButton.DEBIT: tEntryForm = new TenderEntryForm(TenderTypes.DEBITCARD); break; case TenderTypePanel.TenderTypeButton.SHOPCREDIT: tEntryForm = new TenderEntryForm(TenderTypes.STORECREDIT); break; case TenderTypePanel.TenderTypeButton.PAYPAL: tEntryForm = new TenderEntryForm(TenderTypes.PAYPAL); break; } if (tEntryForm != null) { var res = tEntryForm.ShowDialog(this); if (res == DialogResult.OK) { //Get the tender entry tEVO = tEntryForm.TenderEntry; } } previousAmount = 0.0M; this.tenderTablePanel.RowIdx = -1; ProcessTenderEntered(tEVO); }
void tenderTablePanel_EditTenderDetails(string tenderType, string referenceNumber, string cardType, string amount) { TenderEntryForm tEntryForm = null; TenderEntryVO tEVO = null; switch (tenderType) { case "Credit Card": tEntryForm = new TenderEntryForm(TenderTypes.CREDITCARD); break; case "Debit Card": tEntryForm = new TenderEntryForm(TenderTypes.DEBITCARD); break; case "Cash": tEntryForm = new TenderEntryForm(TenderTypes.CASHIN); break; case "Store Credit": tEntryForm = new TenderEntryForm(TenderTypes.STORECREDIT); break; case "Check": tEntryForm = new TenderEntryForm(TenderTypes.CHECK); break; case "Coupon": tEntryForm = new TenderEntryForm(TenderTypes.COUPON); break; case "PayPal": tEntryForm = new TenderEntryForm(TenderTypes.PAYPAL); break; default: tEntryForm = new TenderEntryForm(TenderTypes.CASHIN); break; } tEntryForm.SetReferenceNumber = referenceNumber; tEntryForm.SetCardType = cardType; tEntryForm.SetAmount = Utilities.GetDecimalValue(amount); previousAmount = Utilities.GetDecimalValue(amount); var res = tEntryForm.ShowDialog(this); if (res == DialogResult.OK) { //Get the tender entry tEVO = tEntryForm.TenderEntry; } ProcessTenderEntered(tEVO); }
private static void ProcessPaidTenderData(IEnumerable <TenderData> tenderDataDetails, string receiptID) { TenderTypes tType; CreditCardTypes cType; DebitCardTypes dType; var voidTenderEntries = new List <TenderEntryVO>(); foreach (var j in tenderDataDetails) { var newRefEntry = new TenderEntryVO(); newRefEntry.Amount = j.TenderAmount; bool isInbound; if (j.ReceiptNumber == receiptID) { if (Commons.GetTenderAndCardTypeFromOpCode( j.TenderType, out tType, out cType, out dType, out isInbound)) { newRefEntry.TenderType = tType; if (newRefEntry.TenderType == TenderTypes.CREDITCARD) { newRefEntry.CardTypeString = cType.ToString(); newRefEntry.CreditCardType = cType; } else if (newRefEntry.TenderType == TenderTypes.DEBITCARD) { newRefEntry.CardTypeString = dType.ToString(); newRefEntry.DebitCardType = dType; } } else { //Assume it is cash out being refunded newRefEntry.TenderType = TenderTypes.CASHOUT; } if (newRefEntry.TenderType != TenderTypes.CASHIN && newRefEntry.TenderType != TenderTypes.CASHOUT) { newRefEntry.ReferenceNumber = j.TenderAuth ?? " "; } voidTenderEntries.Add(newRefEntry); } } GlobalDataAccessor.Instance.DesktopSession.TenderData = new List <TenderEntryVO>(); if (voidTenderEntries.Count > 0) { GlobalDataAccessor.Instance.DesktopSession.TenderData = voidTenderEntries; } }
private void ProcessTenderEntered(TenderEntryVO tEVO) { if (tEVO != null) { decimal cashAmt = 0.0M; if (tEVO.TenderType == TenderTypes.CASHOUT) { var cashTender = (from tenderData in RefundTenderEntries where tenderData.TenderType == TenderTypes.CASHOUT select tenderData).FirstOrDefault(); if (cashTender != null) { cashAmt = cashTender.Amount; } } if (tEVO.Amount + (this.tenderTablePanel.TenderAmount - cashAmt - previousAmount) > this.totalAmountDueToCustomer) { MessageBox.Show( "You cannot tender more money to the customer than they are owed.", "Process Tender Warning"); return; } this.tenderTablePanel.AddTenderEntry(tEVO, true); GlobalDataAccessor.Instance.DesktopSession.TotalServiceAmount -= tEVO.Amount; } //Check to see if remaining amount is zero, if so, enable continue button if (this.tenderTablePanel.RemainingAmount == 0.00M) { this.continueButton.Enabled = true; } else { this.continueButton.Enabled = false; } }
private void internalTenderTypeSelectorHandler(TenderTypePanel.TenderTypeButton t) { //Check to see if amount out matches the balance already if (this.tenderTablePanel.TenderAmount > this.amountDueFromCustomer) { MessageBox.Show( "Amount received from the customer already meets or exceeds " + System.Environment.NewLine + "the total amount due from the customer.", "Process Tender Warning"); return; } TenderEntryVO tEVO = null; TenderEntryForm tEntryForm = null; List <TenderEntryVO> currentTenders = this.tenderTablePanel.GetTenderList; switch (t) { case TenderTypePanel.TenderTypeButton.CASH: { var cashTender = (from tenderData in currentTenders where tenderData.TenderType == TenderTypes.CASHIN select tenderData.Amount).FirstOrDefault(); tEntryForm = new TenderEntryForm(TenderTypes.CASHIN); if (Utilities.GetDecimalValue(cashTender, 0) > 0) { tEntryForm.SetAmount = Utilities.GetDecimalValue(cashTender, 0); } } break; case TenderTypePanel.TenderTypeButton.CHECK: tEntryForm = new TenderEntryForm(TenderTypes.CHECK); break; case TenderTypePanel.TenderTypeButton.CREDITORBILLAP: tEntryForm = new TenderEntryForm(TenderTypes.CREDITCARD); break; case TenderTypePanel.TenderTypeButton.DEBIT: tEntryForm = new TenderEntryForm(TenderTypes.DEBITCARD); break; case TenderTypePanel.TenderTypeButton.SHOPCREDIT: //Check if the customer is looked up if (GlobalDataAccessor.Instance.DesktopSession.ActiveCustomer == null || string.IsNullOrEmpty(GlobalDataAccessor.Instance.DesktopSession.ActiveCustomer.CustomerNumber)) { GlobalDataAccessor.Instance.DesktopSession.ShopCreditFlow = true; LookupCustomer(); } else { var screditTender = (from tenderData in currentTenders where tenderData.TenderType == TenderTypes.STORECREDIT select tenderData.Amount).FirstOrDefault(); tEntryForm = new TenderEntryForm(TenderTypes.STORECREDIT); if (Utilities.GetDecimalValue(screditTender, 0) > 0) { tEntryForm.SetAmount = Utilities.GetDecimalValue(screditTender, 0); } } break; case TenderTypePanel.TenderTypeButton.PAYPAL: tEntryForm = new TenderEntryForm(TenderTypes.PAYPAL); break; } if (tEntryForm != null) { var res = tEntryForm.ShowDialog(this); if (res == DialogResult.OK) { //Get the tender entry tEVO = tEntryForm.TenderEntry; } } previousAmount = 0.0M; this.tenderTablePanel.RowIdx = -1; ProcessTenderEntered(tEVO); }
private void ProcessTenderEntered(TenderEntryVO tEVO) { if (tEVO != null) { if (tEVO.TenderType == TenderTypes.COUPON) { if (tEVO.Amount > GlobalDataAccessor.Instance.DesktopSession.TenderTransactionAmount.SubTotalAmount) { MessageBox.Show("Change will exceed amount of cash tendered"); return; } } decimal totalAmtCollectedFromCustomer = 0.0M; if (this.tenderTablePanel.RemainingAmount < 0) { totalAmtCollectedFromCustomer = this.tenderTablePanel.TenderAmount + this.tenderTablePanel.RemainingAmount; } else { totalAmtCollectedFromCustomer = this.tenderTablePanel.TenderAmount; } if (((tEVO.TenderType != TenderTypes.CASHIN && (tEVO.Amount + totalAmtCollectedFromCustomer - previousAmount) > this.amountDueFromCustomer) || (tEVO.TenderType == TenderTypes.CASHIN && tenderTablePanel.RemainingAmount == 0))) { MessageBox.Show( "You cannot take more money from the customer than what they owe.", "Process Tender Warning"); return; } if (tEVO.TenderType == TenderTypes.STORECREDIT) { if (tEVO.Amount > customerStoreCreditBalance) { MessageBox.Show("Amount entered exceeds available shop credit", "Process Tender Error"); return; } } this.tenderTablePanel.AddTenderEntry(tEVO, true); if (tEVO.TenderType == TenderTypes.STORECREDIT) { var tenders = tenderTablePanel.GetTenderList; var scTender = (from tenderData in tenders where tenderData.TenderType == TenderTypes.STORECREDIT select tenderData).FirstOrDefault(); if (scTender != null) { customerStoreCreditBalance = customerStoreCreditAmount - scTender.Amount; string shopCreditAmt = customerStoreCreditBalance.ToString("C"); this.shopCreditLabel.Text = customerStoreCreditAmount.ToString("C") + shopCreditStatement + shopCreditAmt + @")"; } } /* SR 6/15/2011 Not needed anymore since coupon will not be a mop in process tender * //If tender is coupon disable the coupon button on successful addition * if (tEVO.TenderType == TenderTypes.COUPON) * { * var tenders = tenderTablePanel.GetTenderList; * var couponTender = (from tenderData in tenders * where tenderData.TenderType == TenderTypes.COUPON * select tenderData).FirstOrDefault(); * if (couponTender != null) * { * * this.tenderTypeSelector.SetEnableButton(TenderTypePanel.TenderTypeButton.COUPON, false); * } * } * */ } //Check to see if remaining amount is 0.00, then enable continue button if (this.tenderTablePanel.RemainingAmount <= 0.00M) { this.continueButton.Enabled = true; } else { this.continueButton.Enabled = false; } }
public void AddTenderEntry(TenderEntryVO tenderEntry, bool addToInternalList) { if (tenderEntry == null) { return; } string cardType = string.Empty; DataGridView dV; cardType = tenderEntry.CardTypeString ?? string.Empty; //Determine table to create data row from if (this.tenderTableType == TenderTablePanelType.TENDERIN) { dV = this.tenderInDataGridView; } else { if (this.tenderTableType == TenderTablePanelType.TENDEROUT_REFUND || this.tenderTableType == TenderTablePanelType.TENDEROUT_PARTIALREFUND) { dV = (this.tenderTableType == TenderTablePanelType.TENDEROUT_REFUND) ? this.tenderOutRefundDataGridView : this.tenderOutPurchaseDataGridView; if (!addToInternalList) { if (this.tenderTableType == TenderTablePanelType.TENDEROUT_PARTIALREFUND) { dV = this.tenderOutPartialRefundDataGridView; } else { //Initial loading of purchases noted for refund dV = this.tenderOutPurchaseDataGridView; } } else { if (initialTenderAdded) { dV = this.tenderOutRefundDataGridView; } } } else { dV = this.tenderOutPurchaseDataGridView; } } //Add common data row types string tenderType = TenderTypeStrings[(int)tenderEntry.TenderType]; //Enum.Format(typeof(TenderTypes), tenderEntry.TenderType, "g"); string refNumber = tenderEntry.ReferenceNumber ?? string.Empty; string amount = tenderEntry.Amount.ToString("C"); //Construct data row array object[] rowData = null; rowData = new string[] { tenderType, refNumber, cardType, amount }; if ((this.tenderTableType == TenderTablePanelType.TENDEROUT_REFUND || this.tenderTableType == TenderTablePanelType.TENDEROUT_PARTIALREFUND) && addToInternalList && initialTenderAdded) { string msg; if (!this.validateRefundTenderMatrix(tenderEntry, out msg)) { MessageBox.Show("Improper tender added: " + msg); return; } } /* SR 6/15/2011 Removing coupon as a MOP * //SR 12/27/2010 If the current tender entry type is coupon make sure this is the * //first type selected * if (this.tenderTableType == TenderTablePanelType.TENDERIN && tenderEntry.TenderType == TenderTypes.COUPON) * { * if (GetTenderList.Count > 0) * { * MessageBox.Show("Coupon Tender needs to be applied first. " + System.Environment.NewLine + "Please remove previously used tender types.", "Process Tender Warning"); * return; * } * }*/ //SR 03/12/2011 If the current tender entry for tender in is store credit ask for manager override //if the transaction is sale if (this.tenderTableType == TenderTablePanelType.TENDERIN && tenderEntry.TenderType == TenderTypes.STORECREDIT && GlobalDataAccessor.Instance.DesktopSession.CompleteSale) { var overrideTypes = new List <ManagerOverrideType>(); var transactionTypes = new List <ManagerOverrideTransactionType>(); var messageToShow = new StringBuilder(); messageToShow.Append("Store Credit is being used "); overrideTypes.Add(ManagerOverrideType.SCRDT); transactionTypes.Add(ManagerOverrideTransactionType.SALE); var overrideFrm = new ManageOverrides(ManageOverrides.OVERRIDE_TRIGGER) { MessageToShow = messageToShow.ToString(), ManagerOverrideTypes = overrideTypes, ManagerOverrideTransactionTypes = transactionTypes }; overrideFrm.ShowDialog(); if (!overrideFrm.OverrideAllowed) { MessageBox.Show("Manager override needed to proceed with using store credit"); return; } } //SR 12/27/2010 Check if the current tender type is cash and there is already a cash tender //type entered. In that case the amount needs to be added to the original row and should not //enter a new row //SR 2/23/2011 The same logic applies for Shop credit bool addRow = true; decimal currentRowAmount = 0.0m; if (RowIdx == -1) { if ((tenderTableType == TenderTablePanelType.TENDERIN && (tenderEntry.TenderType == TenderTypes.CASHIN || tenderEntry.TenderType == TenderTypes.STORECREDIT)) || ((tenderTableType == TenderTablePanelType.TENDEROUT_REFUND || tenderTableType == TenderTablePanelType.TENDEROUT_PARTIALREFUND) && (tenderEntry.TenderType == TenderTypes.CASHOUT || (tenderEntry.TenderType == TenderTypes.STORECREDIT && addToInternalList)))) { foreach (DataGridViewRow dgvr in dV.Rows) { var strObjVal = (dgvr.Cells.Count > 0) ? dgvr.Cells[0].Value : null; if (strObjVal != null && tenderType == strObjVal.ToString() && (tenderEntry.TenderType == TenderTypes.CASHIN || tenderEntry.TenderType == TenderTypes.CASHOUT) && (strObjVal.ToString().Equals("Cash", StringComparison.OrdinalIgnoreCase))) { var strObjVal2 = (dgvr.Cells.Count > 3) ? dgvr.Cells[3].Value : null; if (strObjVal2 != null) { var cellValStr = strObjVal2.ToString(); if (!string.IsNullOrEmpty(cellValStr) && cellValStr.Length > 1) { currentRowAmount = Utilities.GetDecimalValue(cellValStr.Substring(1)); currentCardType = string.Empty; dgvr.Cells[3].Value = amount; addRow = false; } } } if (strObjVal != null && tenderEntry.TenderType == TenderTypes.STORECREDIT && (strObjVal.ToString().Equals("Store Credit", StringComparison.OrdinalIgnoreCase))) { var strObjVal2 = (dgvr.Cells.Count > 3) ? dgvr.Cells[3].Value : null; if (strObjVal2 != null) { var cellValStr = strObjVal2.ToString(); if (!string.IsNullOrEmpty(cellValStr) && cellValStr.Length > 1) { currentRowAmount = Utilities.GetDecimalValue(cellValStr.Substring(1)); currentCardType = string.Empty; dgvr.Cells[3].Value = amount; addRow = false; } } } } } } else { currentRowAmount = Utilities.GetDecimalValue(dV.Rows[RowIdx].Cells[3].Value.ToString().Substring(1)); currentCardType = Utilities.GetStringValue(dV.Rows[RowIdx].Cells[2].Value); dV.Rows.RemoveAt(RowIdx); dV.Rows.Insert(RowIdx, rowData); addRow = false; } //Add data row array to appropriate data grid view if (addRow) { dV.Rows.Add(rowData); } //Add entry to tender list if (addToInternalList) { if (this.tenderTableType == TenderTablePanelType.TENDERIN) { if (!addRow) { int rowIdx = GetTenderList.FindIndex(tenderData => tenderData.TenderType == tenderEntry.TenderType && tenderData.CardTypeString == currentCardType); if (rowIdx >= 0) { GetTenderList.RemoveAt(rowIdx); GetTenderList.Insert(rowIdx, tenderEntry); this.adjustAmount(-currentRowAmount); } } else { this.GetTenderList.Add(tenderEntry); } } else if (this.tenderTableType == TenderTablePanelType.TENDEROUT_REFUND || this.tenderTableType == TenderTablePanelType.TENDEROUT_PARTIALREFUND) { if (!addRow) { int rowIdx = GetRefundTenderList.FindIndex(tenderData => tenderData.TenderType == tenderEntry.TenderType && tenderData.CardTypeString == currentCardType); if (rowIdx >= 0) { GetRefundTenderList.RemoveAt(rowIdx); GetRefundTenderList.Insert(rowIdx, tenderEntry); this.adjustAmount(-currentRowAmount); } } else if (initialTenderAdded) { this.GetRefundTenderList.Add(tenderEntry); } } decimal adjustTenderAmount = tenderEntry.Amount; if (this.tenderTableType == TenderTablePanelType.TENDERIN) { this.adjustAmount(adjustTenderAmount); } else if (dV != this.tenderOutPurchaseDataGridView) { this.adjustAmount(adjustTenderAmount); } } }
public void AddTenderEntry(TenderEntryVO tenderEntry) { this.AddTenderEntry(tenderEntry, false); }