/// <summary>
        /// extracts expenditures from xml file found at xmlFilePath based on format of an entryTemplate. There are 6 extraction
        /// types - 0: dominant tag, 1: associated tags, 2: people, 3: date, 4: expenditure, 5: xmlID
        /// </summary>
        //internal static List<IExpenditureEntry> ExtractExpendituresFromXml(IExpenditureEntry entryTemplate, string xmlFilePath,
        //    int extractionType)
        //{
        //    List<IExpenditureEntry> entries = new List<IExpenditureEntry>();
        //    XmlDocument doc = new XmlDocument();
        //    doc.Load(xmlFilePath);
        //    foreach (XmlNode node in doc.ChildNodes)
        //    {
        //        if (node.Name == "Expenditures")
        //        {
        //            foreach (XmlNode IExpenditureEntry in node.ChildNodes)
        //            {
        //                if (IExpenditureEntry.Name != "LatestID")
        //                {
        //                    switch (IExpenditureEntry.Attributes[0].Value) // For  version compatibility
        //                    {
        //                        case "1":
        //                            IExpenditureEntry entry = ReadData(IExpenditureEntry);
        //                            switch (extractionType)
        //                            {
        //                                case 0: // Base on Dominant Tag
        //                                    if (entry.dominantTag == entryTemplate.dominantTag)
        //                                    {
        //                                        entries.Add(entry);
        //                                    }
        //                                    break;
        //                                case 1: // Base on Associated Tags
        //                                    foreach (string tag in entryTemplate.associatedTags)
        //                                    {
        //                                        if (entry.associatedTags.Contains(tag))
        //                                        {
        //                                            entries.Add(entry);
        //                                        }
        //                                    }
        //                                    break;
        //                                case 2: // Base on People
        //                                    foreach (string person in entryTemplate.people)
        //                                    {
        //                                        if (entry.people.Contains(person))
        //                                        {
        //                                            entries.Add(entry);
        //                                        }
        //                                    }
        //                                    break;
        //                                case 3: // Base on Date
        //                                    if (entry.date.IsTheSameDateAs(entryTemplate.date))
        //                                    {
        //                                        entries.Add(entry);
        //                                    }
        //                                    break;
        //                                case 4: // Base on Expenditure
        //                                    break;
        //                                case 5: // Base on ID
        //                                    break;
        //                                default:
        //                                    break;
        //                            }
        //                            break;
        //                        default:
        //                            break;
        //                    }
        //                }

        //            }
        //        }
        //    }
        //    return entries;
        //}

        internal List <IExpenditureEntry> ExtractAllExpendituresFromXml()
        {
            List <IExpenditureEntry> entries = new List <IExpenditureEntry>();
            XmlDocument doc = new XmlDocument();

            doc.Load(xmlFilePath);
            foreach (XmlNode node in doc.ChildNodes)
            {
                if (node.Name == "Expenditures")
                {
                    foreach (XmlNode IExpenditureEntry in node.ChildNodes)
                    {
                        if (IExpenditureEntry.Name != "LatestID")
                        {
                            switch (IExpenditureEntry.Attributes[0].Value) // For  version compatibility
                            {
                            case "1":
                                IExpenditureEntry entry = ReadData(IExpenditureEntry);
                                entries.Add(entry);
                                break;

                            default:
                                break;
                            }
                        }
                    }
                }
            }
            return(entries);
        }
 public void RecordExpenditureData(IExpenditureEntry expenditureEntry)
 {
     if (File.Exists(xmlFilePath))
     {
         UpdateXmlFile(expenditureEntry, xmlFilePath);
     }
     else
     {
         XmlWriterSettings settings = new XmlWriterSettings();
         settings.Indent          = true;
         settings.CheckCharacters = true;
         CreateXmlFile(expenditureEntry, settings, xmlFilePath);
     }
 }
        internal static void CreateXmlFile(IExpenditureEntry expenditureEntry, XmlWriterSettings settings, string xmlFilePath)
        {
            using (XmlWriter writer = XmlWriter.Create(xmlFilePath, settings))
            {
                writer.WriteStartDocument();

                writer.WriteStartElement("Expenditures");
                writer.WriteStartElement("LatestID");
                writer.WriteElementString("LatestID", "0");
                writer.WriteEndElement();

                writer.WriteEndDocument();
            }
            UpdateXmlFile(expenditureEntry, xmlFilePath);
        }
        internal static void UpdateXmlFile(IExpenditureEntry expenditureEntry, string xmlFilePath)
        {
            string      currentVersion = "1"; //Change when change xml!
            XmlDocument doc            = new XmlDocument();

            doc.Load(xmlFilePath);
            latestID = latestID + 1;

            foreach (XmlNode node in doc.ChildNodes)
            {
                if (node.Name == "Expenditures")
                {
                    CreateNewEntry(doc, node, currentVersion, expenditureEntry);

                    node.ChildNodes[0].InnerText = latestID.ToString();
                }
            }

            doc.Save(xmlFilePath);
        }
        private static void CreateNewEntry(XmlDocument doc, XmlNode node, string currentVersion, IExpenditureEntry entry)
        {
            XmlElement   newExpenditureEntry = doc.CreateElement("ExpenditureEntry");
            XmlAttribute versionNumber       = doc.CreateAttribute("version");

            versionNumber.Value = currentVersion;
            newExpenditureEntry.Attributes.Append(versionNumber);

            XmlElement iDElement = doc.CreateElement("ID");

            iDElement.InnerText = latestID.ToString();

            XmlElement dominantTag = doc.CreateElement("DominantTag");

            dominantTag.InnerText = entry.dominantTag;

            XmlElement associatedTags = doc.CreateElement("AssociatedTags");

            foreach (string tag in entry.associatedTags)
            {
                XmlElement asTag = doc.CreateElement("Tag");
                asTag.InnerText = tag;
                associatedTags.AppendChild(asTag);
            }

            XmlElement people = doc.CreateElement("People");

            foreach (string person in entry.people)
            {
                XmlElement p = doc.CreateElement("Person");
                p.InnerText = person;
                people.AppendChild(p);
            }

            XmlElement expenditure = doc.CreateElement("Expenditure");

            expenditure.InnerText = entry.expenditure.ToString("0.00");

            XmlElement newExpenditureDate = doc.CreateElement("Date");
            XmlElement newExpenditureDay  = doc.CreateElement("Day");

            newExpenditureDay.InnerText = entry.date.day.ToString("00");
            XmlElement newExpenditureMonth = doc.CreateElement("Month");

            newExpenditureMonth.InnerText = entry.date.month.ToString("00");
            XmlElement newExpenditureYear = doc.CreateElement("Year");

            newExpenditureYear.InnerText = entry.date.year.ToString();
            newExpenditureDate.AppendChild(newExpenditureDay);
            newExpenditureDate.AppendChild(newExpenditureMonth);
            newExpenditureDate.AppendChild(newExpenditureYear);


            newExpenditureEntry.AppendChild(iDElement);
            newExpenditureEntry.AppendChild(dominantTag);
            newExpenditureEntry.AppendChild(associatedTags);
            newExpenditureEntry.AppendChild(people);
            newExpenditureEntry.AppendChild(expenditure);
            newExpenditureEntry.AppendChild(newExpenditureDate);

            node.AppendChild(newExpenditureEntry);
        }