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);
        }
예제 #2
0
 public TenderEntryForm(TenderTypes tendType)
 {
     InitializeComponent();
     TenderEntry            = new TenderEntryVO();
     TenderEntry.TenderType = tendType;
     IsValid = false;
 }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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;
            }
        }
예제 #6
0
        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;
            }
        }
예제 #7
0
        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);
        }
예제 #8
0
        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);
 }