/// <summary>
        /// Read data from the the general ledger.
        /// </summary>
        /// <param name="requestOptions">The request options.</param>
        /// <returns></returns>
        public async Task <GeneralLedgerData> GetGeneralLedgerData(List <GeneralLedgerRequestOption> requestOptions)
        {
            var requestString          = GeneralLedgerRequestOptionsParser.Parse(requestOptions);
            var balanceSheetDataResult = await SoapClient.ProcessXmlDocumentAsync(
                await SoapHeader.GetHeaderAsync(new Header()),
                requestString.ToXmlNode()
                );

            var balanceSheetHeaders  = new Dictionary <string, TwinfieldDataLineHeader>();
            var balanceSheetDataList = new List <List <TwinfieldDataLine> >();
            var firstNode            = true;

            foreach (XmlNode row in balanceSheetDataResult.ProcessXmlDocumentResult)
            {
                if (firstNode)
                {
                    foreach (XmlNode el in row.ChildNodes)
                    {
                        if (el.Name.Equals("td"))
                        {
                            balanceSheetHeaders[el.InnerText] = new TwinfieldDataLineHeader()
                            {
                                ValueType = el.Attributes["type"]?.Value,
                                Label     = el.Attributes["label"]?.Value
                            };
                        }
                    }

                    firstNode = false;
                }
                else
                {
                    var rowData = new List <TwinfieldDataLine>();
                    foreach (XmlNode el in row)
                    {
                        if (el.Name.Equals("td"))
                        {
                            rowData.Add(new TwinfieldDataLine()
                            {
                                Field = el.Attributes["field"]?.Value,
                                Label = balanceSheetHeaders[el.Attributes["field"]?.Value]?.Label,
                                Value = new TwinfieldValue(balanceSheetHeaders[el.Attributes["field"]?.Value]?.ValueType, el.InnerText)
                            });
                        }
                    }

                    balanceSheetDataList.Add(rowData);
                }
            }

            return(new GeneralLedgerData()
            {
                Headers = balanceSheetHeaders,
                Data = balanceSheetDataList
            });
        }
        /// <summary>
        /// Gets the office list from Twinfield.
        /// </summary>
        /// <returns></returns>
        public async Task <List <Office> > GetOfficeList()
        {
            var document         = "<list><type>offices</type></list>";
            var officeListResult = await SoapClient.ProcessXmlDocumentAsync(
                await SoapHeader.GetHeaderAsync(new Header()),
                document.ToXmlNode()
                );

            var result = new List <Office>();

            foreach (XmlNode node in officeListResult.ProcessXmlDocumentResult.ChildNodes)
            {
                result.Add(new Office()
                {
                    Code      = node.InnerText,
                    Name      = node.Attributes["name"]?.Value,
                    ShortName = node.Attributes["shortname"]?.Value
                });
            }

            return(result);
        }
        /// <summary>
        /// Gets the general ledger request options.
        /// </summary>
        /// <param name="companyCode">The company code.</param>
        /// <returns></returns>
        public async Task <List <GeneralLedgerRequestOption> > GetGeneralLedgerRequestOptions(string companyCode)
        {
            var document           = $"<read><type>browse</type><code>030_2</code><office>{companyCode}</office></read>";
            var dataRequestOptions = await SoapClient.ProcessXmlDocumentAsync(
                await SoapHeader.GetHeaderAsync(new Header()),
                document.ToXmlNode()
                );

            var result = new List <GeneralLedgerRequestOption>();

            foreach (XmlNode node in dataRequestOptions.ProcessXmlDocumentResult.LastChild.ChildNodes)
            {
                var glro = new GeneralLedgerRequestOption()
                {
                    Id = node.Attributes["id"]?.Value
                };

                foreach (XmlNode childElement in node.ChildNodes)
                {
                    switch (childElement.Name)
                    {
                    case "label": glro.Label = childElement.InnerText; break;

                    case "field": glro.Field = childElement.InnerText; break;

                    case "operator": glro.Operator = childElement.InnerText; break;

                    case "visible": glro.Visible = childElement.InnerText.Equals("true"); break;

                    case "ask": glro.Ask = childElement.InnerText.Equals("true"); break;
                    }
                }

                result.Add(glro);
            }

            return(result);
        }
예제 #4
0
        /// <summary>
        /// Gets the fields for either a Balance Sheet or Profit and Loss.
        /// </summary>
        /// <param name="companyCode">The company code.</param>
        /// <param name="financialType">Type of the dim. BAS for Balance Sheet, PNL for Profit and Loss</param>
        /// <returns></returns>
        private async Task <Dictionary <string, string> > GetFields(string companyCode, string financialType)
        {
            var searchRequest = new SearchRequest()
            {
                Header   = await SoapHeader.GetHeaderAsync(new Header()),
                type     = "DIM",
                pattern  = "*",
                field    = 0,
                firstRow = 1,
                maxRows  = int.MaxValue,
                options  = new[]
                {
                    new [] { "section", "financials" },
                    new [] { "dimtype", financialType },
                    new [] { "office", companyCode }
                }
            };
            var searchResults = await SoapClient.SearchAsync(searchRequest);

            return(searchResults.data.Items
                   .Select(s => new { Code = s[0], Name = s[1] })
                   .ToDictionary(d => d.Code, d => d.Name));
        }