Ejemplo n.º 1
0
        /// <summary>
        /// Copy items from one transaction, and add them as returns to another
        /// </summary>
        /// <param name="returnedItems"></param>
        /// <param name="transToReturn"></param>
        /// <param name="retailTransaction"></param>
        internal static void InsertReturnedItemsIntoTransaction(IEnumerable <int> returnedItems, RetailTransaction transToReturn, RetailTransaction retailTransaction)
        {
            SaleLineItem returnedItem;

            foreach (int lineNum in returnedItems)
            {
                returnedItem = transToReturn.GetItem(lineNum);

                // Transfer the lineId from the returned transaction to the proper property in the new transaction.
                returnedItem.ReturnLineId = returnedItem.LineId;

                // Transfer the transactionId from the returned transacton to the proper property in the new transaction.
                returnedItem.ReturnTransId    = returnedItem.Transaction.TransactionId;
                returnedItem.ReturnStoreId    = returnedItem.Transaction.StoreId;
                returnedItem.ReturnTerminalId = returnedItem.Transaction.TerminalId;

                returnedItem.Quantity           = returnedItem.ReturnQtyAllowed * -1;
                returnedItem.QuantityDiscounted = returnedItem.QuantityDiscounted * -1;

                retailTransaction.Add(returnedItem);
            }

            //Transfer the original customer information to the "actual" transaction
            //this.Application.BusinessLogic.CustomerSystem.SetCustomer(retailTransaction, transToReturn.Customer, transToReturn.Customer);
            retailTransaction.Customer.ReturnCustomer = true;

            SalesOrder.InternalApplication.Services.Tax.CalculateTax(retailTransaction);
            retailTransaction.CalcTotals();
        }
Ejemplo n.º 2
0
        public frmTenderRestriction(RetailTransaction transaction)
        {
            RetailTransaction retailTransaction = transaction as RetailTransaction;

            if (retailTransaction == null)
            {
                throw new ArgumentNullException("transaction");
            }

            try
            {
                InitializeComponent();

                btnNo.Text       = LSRetailPosis.ApplicationLocalizer.Language.Translate(50154);           //No
                btnYes.Text      = LSRetailPosis.ApplicationLocalizer.Language.Translate(50155);           //Yes
                lblContinue.Text = LSRetailPosis.ApplicationLocalizer.Language.Translate(50156);           //Do you want to continue?
                lblExcluded.Text = LSRetailPosis.ApplicationLocalizer.Language.Translate(50157);           //Items excluded from payment

                for (int i = 0; i < retailTransaction.SaleItems.Count; i++)
                {
                    SaleLineItem lineItem = retailTransaction.GetItem(i + 1);

                    if (string.IsNullOrEmpty(lineItem.TenderRestrictionId))
                    {
                        lstExcluded.Items.Add(lineItem.Description);
                    }
                }
                btnYes.Focus();
            }
            catch (Exception)
            {
                throw;
            }
        }
        public void ClearTenderRestriction(IRetailTransaction retailTransaction)
        {
            NetTracer.Information("TenderRestriction::ClearTenderRestriction - Start");
            RetailTransaction transaction = retailTransaction as RetailTransaction;

            if (transaction == null)
            {
                throw new ArgumentNullException("retailTransaction");
            }

            for (int i = 0; i < transaction.SaleItems.Count; i++)
            {
                ISaleLineItem lineItem = transaction.GetItem(i + 1);

                lineItem.TenderRestrictionId = string.Empty;
                lineItem.FleetCardNumber     = string.Empty;
                lineItem.PaymentIndex        = -1;
            }
            NetTracer.Information("TenderRestriction::ClearTenderRestriction - End");
        }
Ejemplo n.º 4
0
        private void checkItemPrice(string barcode)
        {
            System.Diagnostics.Debug.Assert(barcode != null, "barcode should not be null.");

            if (string.IsNullOrEmpty(barcode))
            {
                return;
            }

            SaleLineItem saleLineItem = (SaleLineItem)Dialog.InternalApplication.BusinessLogic.Utility.CreateSaleLineItem(
                ApplicationSettings.Terminal.StoreCurrency,
                Dialog.InternalApplication.Services.Rounding,
                posTransaction);

            IScanInfo scaninfo = Dialog.InternalApplication.BusinessLogic.Utility.CreateScanInfo();

            scaninfo.ScanDataLabel = barcode;
            IBarcodeInfo barcodeInfo = Dialog.InternalApplication.Services.Barcode.ProcessBarcode(scaninfo);

            if ((barcodeInfo.InternalType == BarcodeInternalType.Item) && (barcodeInfo.ItemId != null))
            {
                // The entry was a barcode which was found and now we have the item id...
                saleLineItem.ItemId    = barcodeInfo.ItemId;
                saleLineItem.BarcodeId = barcodeInfo.BarcodeId;
                saleLineItem.SalesOrderUnitOfMeasure = barcodeInfo.UnitId;

                if (barcodeInfo.BarcodeQuantity > 0)
                {
                    saleLineItem.Quantity = barcodeInfo.BarcodeQuantity;
                }
                else
                {
                    saleLineItem.Quantity = 1;
                }

                if (barcodeInfo.BarcodePrice > 0)
                {
                    saleLineItem.Price = barcodeInfo.BarcodePrice;
                }

                saleLineItem.EntryType = barcodeInfo.EntryType;
                //saleLineItem.DimensionGroupId = barcodeInfo.DimensionGroupId;
                saleLineItem.Dimension.ColorId   = barcodeInfo.InventColorId;
                saleLineItem.Dimension.SizeId    = barcodeInfo.InventSizeId;
                saleLineItem.Dimension.StyleId   = barcodeInfo.InventStyleId;
                saleLineItem.Dimension.VariantId = barcodeInfo.VariantId;
            }
            else
            {
                saleLineItem.ItemId    = barcodeInfo.BarcodeId;
                saleLineItem.EntryType = barcodeInfo.EntryType;
                saleLineItem.Quantity  = 1;
            }

            Dialog.InternalApplication.Services.Item.ProcessItem(saleLineItem, true);

            if (!saleLineItem.Found)
            {
                LSRetailPosis.POSProcesses.POSFormsManager.ShowPOSMessageDialog(3341);
            }
            else
            {
                //Color,Size,Style,Config
                if (saleLineItem.Dimension.EnterDimensions)
                {
                    if (!SetItemDimensions(saleLineItem))
                    {
                        return;
                    }
                }

                // Create a deep copy of the transaction to get the correct price calculation.
                RetailTransaction tempTransaction = (RetailTransaction)this.posTransaction.CloneTransaction();
                tempTransaction.Add(saleLineItem);

                // Get the item info...
                // Get the price, tax and discount info
                Dialog.InternalApplication.BusinessLogic.ItemSystem.CalculatePriceTaxDiscount(tempTransaction);

                saleLineItem = tempTransaction.GetItem(saleLineItem.LineId);
                saleLineItem.CalculateLine();

                // Find the last ItemSale entry..
                LinkedListNode <SaleLineItem> lastItem = tempTransaction.SaleItems.Last;

                ISaleLineItem lineItem = lastItem.Value;
                this.ItemId          = lineItem.ItemId;
                this.ItemDescription = lineItem.Description;
                this.Price           = lineItem.NetAmount;

                this.CustomerId   = tempTransaction.Customer.CustomerId;
                this.CustomerName = tempTransaction.Customer.Name;
                loadItemInfo();
                this.barcode = numPad1.EnteredValue;
            }

            numPad1.ClearValue();
        }
Ejemplo n.º 5
0
        public bool ProcessInfoCode(IPosTransaction posTransaction, decimal quantity, decimal amount, string refRelation, string refRelation2, string refRelation3,
                                    InfoCodeTableRefType tableRefId, string linkedInfoCodeId, IInfoCodeLineItem orgInfoCode, InfoCodeType infoCodeType)
        {
            RetailTransaction      retailTransaction      = posTransaction as RetailTransaction;
            TenderCountTransaction tenderCountTransaction = posTransaction as TenderCountTransaction;

            // Other possible transaction types at this point include CustomerPayment

            if (refRelation == null)
            {
                refRelation = string.Empty;
            }

            if (refRelation2 == null)
            {
                refRelation2 = string.Empty;
            }

            if (refRelation3 == null)
            {
                refRelation3 = string.Empty;
            }

            //Infocode
            IInfoCodeSystem infoCodeSystem = this.Application.BusinessLogic.InfoCodeSystem;

            IInfoCodeLineItem[] infoCodes = new IInfoCodeLineItem[0];

            if (!string.IsNullOrEmpty(linkedInfoCodeId))
            {
                infoCodes = infoCodeSystem.GetInfocodes(linkedInfoCodeId);
            }
            else if (tableRefId == InfoCodeTableRefType.FunctionalityProfile)
            {
                infoCodes    = infoCodeSystem.GetInfocodes(refRelation2);
                refRelation2 = string.Empty;
            }
            else if (tableRefId == InfoCodeTableRefType.PreItem)
            {
                // Pre item is just a table ref id of item, but handled during different processing
                infoCodes = infoCodeSystem.GetInfocodes(refRelation, refRelation2, refRelation3, InfoCodeTableRefType.Item);
            }
            else
            {
                infoCodes = infoCodeSystem.GetInfocodes(refRelation, refRelation2, refRelation3, tableRefId);
            }

            foreach (InfoCodeLineItem infoCode in infoCodes)
            {
                if (infoCode.InfocodeId == null)
                {
                    return(false);
                }                                                  //If no infocode is found

                // Process age limit info codes as pre item.  I.e. stop processing on this info code if it is pre item
                // and not of type age limit.
                // Low impact fix that should be reevaluated if any info code other than age limit is ever added
                // pre item.  Using continue because indentation of if/else sequence already too much.
                if (((tableRefId == InfoCodeTableRefType.PreItem) && (infoCode.InputType != InfoCodeInputType.AgeLimit)))
                {
                    continue;
                }

                //If bug in data, fixes division by zero
                if (infoCode.RandomFactor == 0)
                {
                    infoCode.RandomFactor = 100;
                }

                infoCode.OriginType   = infoCodeType;
                infoCode.RefRelation  = refRelation;
                infoCode.RefRelation2 = refRelation2;
                infoCode.RefRelation3 = refRelation3;
                switch (infoCode.OriginType)
                {
                case InfoCodeType.Header:
                    infoCode.Amount = amount;
                    break;

                case InfoCodeType.Sales:
                    infoCode.Amount = (amount * -1);
                    break;

                case InfoCodeType.Payment:
                    infoCode.Amount = amount;
                    break;

                case InfoCodeType.IncomeExpense:
                    infoCode.Amount = amount;
                    break;
                }

                int    randomFactor = (int)(100 / infoCode.RandomFactor); //infoCode.RandomFactor = 100 means ask 100% for a infocode
                Random random       = new Random();
                int    randomNumber = random.Next(randomFactor);          //Creates numbers from 0 to randomFactor-1
                //Only get the infocode if randomfactor is set to zero or generated random number is the sama as the randomfactor-1
                if (infoCode.RandomFactor == 100 || randomNumber == (randomFactor - 1))
                {
                    Boolean infoCodeNeeded = true;
                    if (infoCode.OncePerTransaction)
                    {
                        if (tenderCountTransaction != null)
                        {
                            infoCodeNeeded = tenderCountTransaction.InfoCodeNeeded(infoCode.InfocodeId);
                        }
                        else
                        {
                            infoCodeNeeded = retailTransaction.InfoCodeNeeded(infoCode.InfocodeId);
                        }
                    }

                    if (infoCodeNeeded)
                    {
                        // If the required type is negative but the quantity is positive, do not continue
                        if (infoCode.InputRequiredType == InfoCodeInputRequiredType.Negative && quantity > 0)
                        {
                            infoCodeNeeded = false;
                        }

                        // If the required type is positive but the quantity is negative, do not continue
                        if (infoCode.InputRequiredType == InfoCodeInputRequiredType.Positive && quantity < 0)
                        {
                            infoCodeNeeded = false;
                        }
                    }
                    // If there is some infocodeID existing, and infocod is needed
                    if (infoCode.InfocodeId != null && infoCodeNeeded == true)
                    {
                        #region Text and General
                        if (infoCode.InputType == InfoCodeInputType.Text || infoCode.InputType == InfoCodeInputType.General)
                        {
                            Boolean inputValid = true;
                            bool    abort      = false;
                            // Get a infocode text
                            do
                            {
                                inputValid = true;

                                InputConfirmation inputConfirmation = new InputConfirmation()
                                {
                                    MaxLength  = MaxInfocodeInformationLengh,
                                    PromptText = infoCode.Prompt,
                                };

                                InteractionRequestedEventArgs request = new InteractionRequestedEventArgs(inputConfirmation, () =>
                                {
                                    if (inputConfirmation.Confirmed)
                                    {
                                        if (string.IsNullOrEmpty(inputConfirmation.EnteredText))
                                        {
                                            abort = true;
                                            POSFormsManager.ShowPOSMessageDialog(3593);
                                        }
                                        else
                                        {
                                            int textId = 0;
                                            if (inputConfirmation.EnteredText.Length == 0 && infoCode.InputRequired)
                                            {
                                                textId     = 3590; //The input text is required
                                                inputValid = false;
                                            }

                                            if (inputValid && infoCode.MinimumLength > 0 && inputConfirmation.EnteredText.Length < infoCode.MinimumLength)
                                            {
                                                textId     = 3591; //The input text is too short.
                                                inputValid = false;
                                            }

                                            if (inputValid && infoCode.MaximumLength > 0 && inputConfirmation.EnteredText.Length > infoCode.MaximumLength)
                                            {
                                                textId     = 3592; //The input text exceeds the maximum length.
                                                inputValid = false;
                                            }

                                            if (inputValid && infoCode.AdditionalCheck == 1)
                                            {
                                                inputValid = CheckKennitala(inputConfirmation.EnteredText);
                                                if (!inputValid)
                                                {
                                                    textId = 3603;
                                                }
                                            }

                                            if (!inputValid)
                                            {
                                                POSFormsManager.ShowPOSMessageDialog(textId);
                                            }
                                        }
                                        infoCode.Information = inputConfirmation.EnteredText;
                                    }
                                    else
                                    {
                                        inputValid = infoCode.InputRequired;
                                    }
                                }
                                                                                                          );


                                Application.Services.Interaction.InteractionRequest(request);

                                if (abort)
                                {
                                    return(false);
                                }
                            } while (!inputValid);
                            //Adding the result to the infocode
                        }

                        #endregion

                        #region Date
                        else if (infoCode.InputType == InfoCodeInputType.Date)
                        {
                            Boolean inputValid = true;
                            do
                            {
                                inputValid = true;

                                string inputText;
                                //Show the input form
                                using (frmInputNumpad inputDialog = new frmInputNumpad())
                                {
                                    inputDialog.EntryTypes = NumpadEntryTypes.Date;
                                    inputDialog.PromptText = infoCode.Prompt;
                                    POSFormsManager.ShowPOSForm(inputDialog);
                                    // Quit if cancel is pressed...
                                    if (inputDialog.DialogResult == System.Windows.Forms.DialogResult.Cancel && !infoCode.InputRequired)
                                    {
                                        return(false);
                                    }

                                    inputText = inputDialog.InputText;
                                }

                                //Is input valid?
                                if (!string.IsNullOrEmpty(inputText))
                                {
                                    int      textId   = 0;
                                    bool     isDate   = true;
                                    DateTime infoDate = DateTime.Now;

                                    try
                                    {
                                        infoDate = Convert.ToDateTime(inputText, (IFormatProvider)Thread.CurrentThread.CurrentCulture.DateTimeFormat);
                                    }
                                    catch
                                    {
                                        isDate = false;
                                    }

                                    if (!isDate)
                                    {
                                        textId     = 3602; //Date entered is not valid
                                        inputValid = false;
                                    }

                                    if (inputText.Length == 0 && infoCode.InputRequired)
                                    {
                                        textId     = 3594; //A number input is required
                                        inputValid = false;
                                    }

                                    if (!inputValid)
                                    {
                                        POSFormsManager.ShowPOSMessageDialog(textId);
                                    }
                                    else
                                    {
                                        //Setting the result to the infocode
                                        infoCode.Information = infoDate.ToString(Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern);
                                    }
                                }
                                else if (infoCode.InputRequired)
                                {
                                    inputValid = false;
                                    POSFormsManager.ShowPOSMessageDialog(3597);//A number input is required
                                }
                            } while (!inputValid);
                        }

                        #endregion

                        #region Numeric and Operator/Staff

                        else if (infoCode.InputType == InfoCodeInputType.Numeric || infoCode.InputType == InfoCodeInputType.Operator)
                        {
                            Boolean inputValid = true;

                            do
                            {
                                inputValid = true;

                                string inputText = string.Empty;
                                //Show the input form
                                using (frmInputNumpad inputDialog = new frmInputNumpad())
                                {
                                    inputDialog.EntryTypes = NumpadEntryTypes.Price;
                                    inputDialog.PromptText = infoCode.Prompt;
                                    POSFormsManager.ShowPOSForm(inputDialog);
                                    // Quit if cancel is pressed and input not required...
                                    if (inputDialog.DialogResult == System.Windows.Forms.DialogResult.Cancel && !infoCode.InputRequired)
                                    {
                                        return(false);
                                    }

                                    // If input required then only valid result is Ok.
                                    if (inputDialog.DialogResult == System.Windows.Forms.DialogResult.OK)
                                    {
                                        inputText = inputDialog.InputText;
                                    }
                                }

                                //Is input empty?
                                if (!string.IsNullOrWhiteSpace(inputText))
                                {
                                    int textId = 0;
                                    if (inputText.Length == 0 && infoCode.InputRequired)
                                    {
                                        textId     = 3594; //A number input is required
                                        inputValid = false;
                                    }

                                    if (infoCode.MinimumValue != 0 && Convert.ToDecimal(inputText) < infoCode.MinimumValue)
                                    {
                                        textId     = 3595; //The number is lower than the minimum value
                                        inputValid = false;
                                    }

                                    if (infoCode.MaximumValue != 0 && Convert.ToDecimal(inputText) > infoCode.MaximumValue)
                                    {
                                        textId     = 3596; //The number exceeds the maximum value
                                        inputValid = false;
                                    }

                                    if (!inputValid)
                                    {
                                        POSFormsManager.ShowPOSMessageDialog(textId);
                                    }
                                }
                                else
                                {
                                    inputValid = false;
                                    POSFormsManager.ShowPOSMessageDialog(3597); //A number input is required
                                }

                                //Setting the result to the infocode
                                infoCode.Information = inputText;
                            } while (!inputValid);
                        }

                        #endregion

                        #region Customer

                        else if (infoCode.InputType == InfoCodeInputType.Customer)
                        {
                            bool inputValid = true;
                            do
                            {
                                inputValid = true;
                                Contracts.DataEntity.ICustomer customer = this.Application.Services.Customer.Search();
                                if (customer != null)
                                {
                                    infoCode.Information = customer.CustomerId;
                                    inputValid           = true;
                                }
                                else
                                {
                                    if (infoCode.InputRequired)
                                    {
                                        inputValid = false;
                                        POSFormsManager.ShowPOSMessageDialog(3598); //A customer needs to be selected
                                    }
                                }
                            } while (!inputValid);
                        }
                        #endregion

                        #region Item

                        else if (infoCode.InputType == InfoCodeInputType.Item)
                        {
                            Boolean inputValid = true;
                            do
                            {
                                string       selectedItemID = string.Empty;
                                DialogResult dialogResult   = this.Application.Services.Dialog.ItemSearch(500, ref selectedItemID);
                                // Quit if cancel is pressed...
                                if (dialogResult == System.Windows.Forms.DialogResult.Cancel && !infoCode.InputRequired)
                                {
                                    return(false);
                                }

                                if (!string.IsNullOrEmpty(selectedItemID))
                                {
                                    infoCode.Information = selectedItemID;
                                    inputValid           = true;
                                }
                                else
                                {
                                    if (infoCode.InputRequired)
                                    {
                                        inputValid = false;
                                        POSFormsManager.ShowPOSMessageDialog(3599);//A items needs to be selected
                                    }
                                }
                            } while (!inputValid);
                        }
                        #endregion

                        #region SubCode

                        else if ((infoCode.InputType == InfoCodeInputType.SubCodeList) || (infoCode.InputType == InfoCodeInputType.SubCodeButtons))
                        {
                            FormInfoCodeSubCodeBase infoSubCodeDialog;
                            if (infoCode.InputType == InfoCodeInputType.SubCodeList)
                            {
                                infoSubCodeDialog = new FormInfoCodeSubCodeList();
                            }
                            else
                            {
                                infoSubCodeDialog = new FormInfoSubCode();
                            }

                            using (infoSubCodeDialog)
                            {
                                bool inputValid = false;
                                do
                                {
                                    infoSubCodeDialog.InfoCodePrompt = infoCode.Prompt;
                                    infoSubCodeDialog.InfoCodeId     = infoCode.InfocodeId;
                                    infoSubCodeDialog.InputRequired  = infoCode.InputRequired;

                                    POSFormsManager.ShowPOSForm(infoSubCodeDialog);
                                    switch (infoSubCodeDialog.DialogResult)
                                    {
                                    case DialogResult.OK:
                                        inputValid = true;
                                        break;

                                    case DialogResult.No:
                                        return(false);

                                    default:
                                        if (!infoCode.InputRequired)
                                        {
                                            return(false);
                                        }
                                        break;
                                    }

                                    //if InputValid is false then nothing was selected in the dialog and there is no point in going through this code
                                    if (inputValid)
                                    {
                                        infoCode.Information = infoSubCodeDialog.SelectedDescription;
                                        infoCode.Subcode     = infoSubCodeDialog.SelectedSubcodeId;

                                        //TenderDeclarationTransaction also has infocodes but it can't have any sale items so no need
                                        //to go through this code.
                                        if (retailTransaction != null)
                                        {
                                            //Look through the information on the subcode that was selected and see if an item is to be sold
                                            //and if a discount and/or price needs to be modified
                                            //foreach (SubcodeInfo subcodeInfo in infoSubCodeDialog.SubCodes)
                                            //{
                                            if ((infoSubCodeDialog.SelectedTriggerFunction == (int)TriggerFunctionEnum.Item) && (infoSubCodeDialog.SelectedTriggerCode.Length != 0))
                                            {
                                                OperationInfo opInfo = new OperationInfo();

                                                ItemSale itemSale = new ItemSale();
                                                itemSale.OperationID    = PosisOperations.ItemSale;
                                                itemSale.OperationInfo  = opInfo;
                                                itemSale.Barcode        = infoSubCodeDialog.SelectedTriggerCode;
                                                itemSale.POSTransaction = retailTransaction;
                                                itemSale.RunOperation();

                                                //The infocode item has been added.
                                                //Look at the last item on the transaction and if it is the same item that the ItemSale was supposed to sell
                                                //then check to see if it is to have a special price or discount
                                                if (retailTransaction.SaleItems.Last.Value.ItemId == infoSubCodeDialog.SelectedTriggerCode)
                                                {
                                                    //set the property of that item to being an infocode item such that if the same item is added again, then
                                                    //these will not be aggregated (since the item as infocode item might receive a different discount than the same
                                                    //item added regularly.
                                                    retailTransaction.SaleItems.Last.Value.IsInfoCodeItem = true;

                                                    infoCode.SubcodeSaleLineId = retailTransaction.SaleItems.Last.Value.LineId;

                                                    if (infoSubCodeDialog.SelectedPriceType == (int)PriceTypeEnum.Price)
                                                    {
                                                        PriceOverride priceOverride = new PriceOverride();

                                                        opInfo.NumpadValue = infoSubCodeDialog.SelectedAmountPercent.ToString("n2");
                                                        opInfo.ItemLineId  = retailTransaction.SaleItems.Last.Value.LineId;

                                                        priceOverride.OperationInfo  = opInfo;
                                                        priceOverride.OperationID    = PosisOperations.PriceOverride;
                                                        priceOverride.POSTransaction = retailTransaction;
                                                        priceOverride.LineId         = retailTransaction.SaleItems.Last.Value.LineId;
                                                        priceOverride.RunOperation();
                                                    }
                                                    else if (infoSubCodeDialog.SelectedPriceType == (int)PriceTypeEnum.Percent)
                                                    {
                                                        LineDiscountPercent lineDiscount = new LineDiscountPercent();

                                                        opInfo.NumpadValue = infoSubCodeDialog.SelectedAmountPercent.ToString("n2");
                                                        opInfo.ItemLineId  = retailTransaction.SaleItems.Last.Value.LineId;

                                                        lineDiscount.OperationInfo  = opInfo;
                                                        lineDiscount.OperationID    = PosisOperations.LineDiscountPercent;
                                                        lineDiscount.POSTransaction = retailTransaction;
                                                        lineDiscount.RunOperation();
                                                    }
                                                }
                                            }
                                        }
                                    }
                                } while (!inputValid);
                            }
                        }
                        #endregion

                        #region Age limit

                        else if ((infoCode.InputType == InfoCodeInputType.AgeLimit))
                        {
                            int ageLimit = (int)infoCode.MinimumValue;
                            if (ageLimit >= 0)
                            {
                                //Calculate birthdate corresponding to minimum age limit
                                DateTime dtBirthDate = DateTime.Today.AddYears(-ageLimit);

                                //Convert the date time value according to the current culture information
                                string birthDate = dtBirthDate.ToString(System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern);
                                string msg       = ApplicationLocalizer.Language.Translate(3606, ageLimit, birthDate);

                                // Process age limit info codes if it is pre item and prompt the message to user for processing.
                                // Also Info Code type is an item and Age Limit is a link to reason code then process the info code with prompt to user.
                                if (((tableRefId == InfoCodeTableRefType.PreItem) && (infoCode.InputType == InfoCodeInputType.AgeLimit)) || (!string.IsNullOrEmpty(linkedInfoCodeId) && tableRefId == InfoCodeTableRefType.Item))
                                {
                                    using (frmMessage frmMsg = new frmMessage(msg, MessageBoxButtons.YesNo, MessageBoxIcon.Information, false))
                                    {
                                        POSFormsManager.ShowPOSForm(frmMsg);
                                        if (frmMsg.DialogResult != DialogResult.Yes)
                                        {
                                            return(false);
                                        }
                                    }
                                }
                                infoCode.Information = msg;
                            }
                        }
                        #endregion

                        else
                        {
                            POSFormsManager.ShowPOSMessageDialog(3589);
                            return(false);
                        }

                        // Add the infocode to the transaction
                        if (infoCode.Information != null && infoCode.Information.Length > 0)
                        {
                            string infoComment = string.Empty;
                            if (infoCode.PrintPromptOnReceipt || infoCode.PrintInputOnReceipt || infoCode.PrintInputNameOnReceipt)
                            {
                                if (infoCode.PrintPromptOnReceipt && (infoCode.Prompt.Length != 0))
                                {
                                    infoComment = infoCode.Prompt;
                                }

                                if (infoCode.PrintInputOnReceipt && (infoCode.Subcode != null) && (infoCode.Subcode.Length != 0))
                                {
                                    if (infoComment.Length != 0)
                                    {
                                        infoComment += " - " + infoCode.Subcode;
                                    }
                                    else
                                    {
                                        infoComment = infoCode.Subcode;
                                    }
                                }

                                if (infoCode.PrintInputNameOnReceipt && (infoCode.Information.Length != 0))
                                {
                                    if (infoComment.Length != 0)
                                    {
                                        infoComment += " - " + infoCode.Information;
                                    }
                                    else
                                    {
                                        infoComment = infoCode.Information;
                                    }
                                }
                            }

                            if (infoCodeType == InfoCodeType.Sales)
                            {
                                int lineId;
                                if (infoCode.SubcodeSaleLineId != -1)
                                {
                                    SaleLineItem saleLineItem = retailTransaction.GetItem(infoCode.SubcodeSaleLineId - 1);
                                    saleLineItem.Add(infoCode);
                                    lineId = saleLineItem.LineId;
                                }
                                else
                                {
                                    // don't save if this is pre-item. the same infocodes will be found next pass for normal item infocodes.
                                    if (tableRefId == InfoCodeTableRefType.PreItem)
                                    {
                                        continue;
                                    }
                                    else
                                    {
                                        LinkedListNode <SaleLineItem> saleLineItem = retailTransaction.SaleItems.Last;
                                        saleLineItem.Value.Add(infoCode);
                                        lineId = saleLineItem.Value.LineId;
                                    }
                                }

                                if (infoComment.Trim().Length != 0)
                                {
                                    OperationInfo opInfo = new OperationInfo();
                                    opInfo.NumpadValue = infoComment.Trim();
                                    opInfo.ItemLineId  = lineId;

                                    ItemComment itemComment = new ItemComment();
                                    itemComment.OperationID    = PosisOperations.ItemComment;
                                    itemComment.POSTransaction = (PosTransaction)posTransaction;
                                    itemComment.OperationInfo  = opInfo;
                                    itemComment.RunOperation();
                                }
                            }
                            else if (infoCodeType == InfoCodeType.Payment)
                            {
                                if (retailTransaction != null)
                                {
                                    LinkedListNode <TenderLineItem> tenderLineItem = retailTransaction.TenderLines.Last;
                                    tenderLineItem.Value.Add(infoCode);

                                    if (infoComment.Trim().Length != 0)
                                    {
                                        tenderLineItem.Value.Comment = infoComment.Trim();
                                    }
                                }
                                else
                                {
                                    LSRetailPosis.Transaction.CustomerPaymentTransaction custPayTrans = posTransaction as LSRetailPosis.Transaction.CustomerPaymentTransaction;
                                    LinkedListNode <TenderLineItem> tenderLineItem = custPayTrans.TenderLines.Last;
                                    tenderLineItem.Value.Add(infoCode);

                                    if (infoComment.Trim().Length != 0)
                                    {
                                        tenderLineItem.Value.Comment = infoComment.Trim();
                                    }
                                }

                                //LinkedListNode<TenderLineItem> tenderLineItem = retailTransaction.TenderLines.Last; //
                                //tenderLineItem.Value.Add(infoCode);

                                //if (infoComment.Trim().Length != 0)
                                //{
                                //    tenderLineItem.Value.Comment = infoComment.Trim();
                                //}
                            }
                            else
                            {
                                if (retailTransaction != null)
                                {
                                    retailTransaction.Add(infoCode);
                                    if (infoComment.Trim().Length != 0)
                                    {
                                        retailTransaction.InvoiceComment += infoComment.Trim();
                                    }
                                }
                                else
                                {
                                    tenderCountTransaction.Add(infoCode);
                                    //No invoice comment on TenderDeclarationTransaction
                                }
                            }
                        }
                    }
                }
            }

            return(true);
        }