示例#1
0
        public void RecordField_SetValue_5()
        {
            bool save = RecordField.TrimValue;

            RecordField.TrimValue = true;
            try
            {
                RecordField field = new RecordField(200);
                field.SetValue(" Value ");
                Assert.AreEqual("Value", field.Value);
            }
            finally
            {
                RecordField.TrimValue = save;
            }
        }
示例#2
0
 /// <summary>
 /// Asserts that the field must not contains subfields.
 /// </summary>
 protected void MustNotContainSubfields
 (
     [NotNull] RecordField field
 )
 {
     if (field.SubFields.Count != 0)
     {
         AddDefect
         (
             field,
             20,
             "Поле {0} содержит подполя",
             field.Tag
         );
     }
 }
示例#3
0
        public void RecordField_GetSubFieldValue_1()
        {
            const string expected1 = "SubfieldA1";
            const string expected2 = "SubfieldA2";
            RecordField  field     = new RecordField();
            SubField     subField1 = new SubField('a', expected1);

            field.SubFields.Add(subField1);
            SubField subField2 = new SubField('a', expected2);

            field.SubFields.Add(subField2);
            Assert.AreEqual(expected1, field.GetSubFieldValue('a', 0));
            Assert.AreEqual(expected2, field.GetSubFieldValue('a', 1));
            Assert.IsNull(field.GetSubFieldValue('a', 2));
            Assert.IsNull(field.GetSubFieldValue('b', 0));
        }
示例#4
0
        /// <summary>
        /// Decode the field.
        /// </summary>
        public RecordField DecodeField
        (
            [NotNull] MstDictionaryEntry32 entry
        )
        {
            string catenated = string.Format
                               (
                "{0}#{1}",
                entry.Tag,
                entry.Text
                               );

            RecordField result = RecordField.Parse(catenated);

            return(result);
        }
示例#5
0
        private void _fixPlaceButton_Click
        (
            object sender,
            EventArgs e
        )
        {
            if (_currentRecord == null ||
                _currentExemplar == null)
            {
                XtraMessageBox.Show
                (
                    "Нечего исправлять!"
                );
                return;
            }

            RecordField field = _currentExemplar.Field;

            if (field == null)
            {
                return;
            }
            field.SetSubField('a', "0");
            field.SetSubField('d', CurrentFond);
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            _client.WriteRecord
            (
                _currentRecord,
                false,
                true
            );
            stopwatch.Stop();
            _logBox.Output.WriteLine
            (
                "Исправлено место/статус для номера {0}: {1} ({2})",
                _currentExemplar.Number,
                _currentRecord.UserData,
                stopwatch.Elapsed
            );

            _SetHtml(string.Empty);

            _currentRecord   = null;
            _currentExemplar = null;
        }
示例#6
0
        public static MarcRecord ParseResponseForAllFormat
        (
            [NotNull] string line,
            [NotNull] MarcRecord record
        )
        {
            Sure.NotNull(record, "record");

            if (string.IsNullOrEmpty(line))
            {
                return(null);
            }

            try
            {
                record.Fields.BeginUpdate();
                record.Fields.Clear();

                string[] split = line.Split('\x1F');
                ParseMfnStatusVersion
                (
                    split[1],
                    split[2],
                    record
                );

                for (int i = 3; i < split.Length; i++)
                {
                    line = split[i];
                    if (!string.IsNullOrEmpty(line))
                    {
                        RecordField field = ParseLine(line);
                        if (field.Tag > 0)
                        {
                            record.Fields.Add(field);
                        }
                    }
                }
            }
            finally
            {
                record.Fields.EndUpdate();
                record.Modified = false;
            }

            return(record);
        }
示例#7
0
        public static ExemplarInfo Parse
        (
            [JetBrains.Annotations.NotNull] RecordField field
        )
        {
            if (ReferenceEquals(field, null))
            {
                throw new ArgumentNullException("field");
            }

            ExemplarInfo result = new ExemplarInfo
            {
                Status         = field.GetSubFieldText('a', 0),
                Number         = field.GetSubFieldText('b', 0),
                Date           = field.GetSubFieldText('c', 0),
                Place          = field.GetSubFieldText('d', 0),
                Collection     = field.GetSubFieldText('q', 0),
                ShelfIndex     = field.GetSubFieldText('r', 0),
                Price          = field.GetSubFieldText('e', 0),
                Barcode        = field.GetSubFieldText('h', 0),
                Amount         = field.GetSubFieldText('1', 0),
                Purpose        = field.GetSubFieldText('t', 0),
                Coefficient    = field.GetSubFieldText('=', 0),
                OffBalance     = field.GetSubFieldText('4', 0),
                KsuNumber1     = field.GetSubFieldText('u', 0),
                ActNumber1     = field.GetSubFieldText('y', 0),
                Channel        = field.GetSubFieldText('f', 0),
                OnHand         = field.GetSubFieldText('2', 0),
                ActNumber2     = field.GetSubFieldText('v', 0),
                WriteOff       = field.GetSubFieldText('x', 0),
                Completion     = field.GetSubFieldText('k', 0),
                ActNumber3     = field.GetSubFieldText('w', 0),
                Moving         = field.GetSubFieldText('z', 0),
                NewPlace       = field.GetSubFieldText('m', 0),
                CheckedDate    = field.GetSubFieldText('s', 0),
                CheckedAmount  = field.GetSubFieldText('0', 0),
                RealPlace      = field.GetSubFieldText('!', 0),
                BindingIndex   = field.GetSubFieldText('p', 0),
                BindingNumber  = field.GetSubFieldText('i', 0),
                OtherSubFields = field.SubFields
                                 .Where(sub => KnownCodes
                                        .IndexOf(char.ToLower(sub.Code)) < 0)
                                 .ToArray()
            };

            return(result);
        }
示例#8
0
        public void RecordField_SetValue_6()
        {
            const string expected = " Value ";
            bool         save     = RecordField.TrimValue;

            RecordField.TrimValue = false;
            try
            {
                RecordField field = new RecordField(200);
                field.SetValue(expected);
                Assert.AreEqual(expected, field.Value);
            }
            finally
            {
                RecordField.TrimValue = save;
            }
        }
示例#9
0
        public void RecordField_ToString_1()
        {
            RecordField field = _GetField();

            string actual = field.ToString();
            int    result = string.CompareOrdinal
                            (
                "200#Значение^aЗаглавие^eподзаголовочные^fоб ответственности",
                actual
                            );

            Assert.AreEqual
            (
                0,
                result
            );
        }
        private void CheckField
        (
            [NotNull] RecordField field
        )
        {
            List <string> result = CheckText(field.Text);

            if (result.Count != 0)
            {
                AddDefect
                (
                    field,
                    15,
                    FormatDefect(result)
                );
            }
        }
示例#11
0
        public void RecordField_AssignFrom_1()
        {
            RecordField source = new RecordField(100, "Value")
                                 .AddSubField('a', "SubfieldA")
                                 .AddSubField('b', "SubfieldB");
            RecordField target = new RecordField(200);

            target.AssignFrom(source);
            Assert.AreEqual(200, target.Tag);
            Assert.AreEqual(source.Value, target.Value);
            Assert.AreEqual(source.SubFields.Count, target.SubFields.Count);
            for (int i = 0; i < source.SubFields.Count; i++)
            {
                Assert.AreEqual(source.SubFields[i].Code, target.SubFields[i].Code);
                Assert.AreEqual(source.SubFields[i].Value, target.SubFields[i].Value);
            }
        }
示例#12
0
        public void RecordField_GetSubField_2()
        {
            RecordField field     = new RecordField();
            SubField    subField1 = new SubField('a', "SubfieldA1");

            field.SubFields.Add(subField1);
            SubField subField2 = new SubField('a', "SubfieldA2");

            field.SubFields.Add(subField2);
            SubField found = field.GetSubField('a', 0);

            Assert.AreSame(subField1, found);
            found = field.GetSubField('a', 1);
            Assert.AreEqual(subField2, found);
            found = field.GetSubField('a', 2);
            Assert.IsNull(found);
        }
示例#13
0
        public void RecordField_GetValueOrFirstSubField_1()
        {
            const string expected0 = "Value";
            const string expected1 = "SubfieldA1";
            const string expected2 = "SubfieldA2";
            RecordField  field     = new RecordField(200, expected0)
                                     .AddSubField('a', expected1)
                                     .AddSubField('a', expected2);

            Assert.AreEqual(expected0, field.GetValueOrFirstSubField());
            field.Value = null;
            Assert.AreEqual(expected1, field.GetValueOrFirstSubField());
            field.SubFields.RemoveAt(0);
            Assert.AreEqual(expected2, field.GetValueOrFirstSubField());
            field.SubFields.Clear();
            Assert.IsNull(field.GetValueOrFirstSubField());
        }
示例#14
0
        /// <summary>
        ///
        /// </summary>
        private void AddColumnToGridPanel()
        {
            var arguments = ArgumentController.GetAll(null, false, KpiStatus.Active, null, null, null);
            var count     = 0;

            foreach (var item in arguments)
            {
                var recordField = new RecordField()
                {
                    Name    = item.Code,
                    Mapping = "ArgumentDetailModels[{0}].Value".FormatWith(count++)
                };

                var col = new Column
                {
                    ColumnID  = recordField.Name,
                    Header    = item.Name,
                    DataIndex = recordField.Name,
                    Width     = 150,
                    Renderer  = { Fn = "RenderArgument" }
                };
                switch (item.ValueType)
                {
                case KpiValueType.Percent:
                    col.Renderer.Fn = "RenderPercent";
                    col.Align       = Alignment.Left;
                    break;

                case KpiValueType.String:
                    col.Align = Alignment.Center;
                    break;

                case KpiValueType.Number:
                    break;

                case KpiValueType.Formula:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
                storeEmployeeArgument.AddField(recordField);
                gpEmployeeArgument.ColumnModel.Columns.Add(col);
            }
        }
示例#15
0
        /*========================================================*/

        public MarcRecord Execute
        (
            IrbisConnection client,
            MarcRecord record
        )
        {
            MarcRecord result = new MarcRecord();

            foreach (FstLine fstLine in Lines)
            {
                string formatted = client.FormatRecord
                                   (
                    fstLine.Code,
                    record
                                   );
                if (!string.IsNullOrEmpty(formatted))
                {
                    formatted = formatted.Trim();
                    if (!string.IsNullOrEmpty(formatted))
                    {
                        formatted = formatted.Replace("\r", string.Empty);
                        string[] parts = formatted.Split
                                         (
                            new[] { '\n' },
                            StringSplitOptions.RemoveEmptyEntries
                                         );
                        foreach (string part in parts)
                        {
                            string trimmed = part.Trim();
                            if (!string.IsNullOrEmpty(trimmed))
                            {
                                RecordField field = RecordFieldUtility.Parse
                                                    (
                                    fstLine.Tag,
                                    trimmed
                                                    );
                                result.Fields.Add(field);
                            }
                        }
                    }
                }
            }

            return(result);
        }
示例#16
0
        private MarcRecord _GetRecord
        (
            int titleNumber
        )
        {
            MarcRecord result = new MarcRecord();

            RecordField field = new RecordField("700");

            field.AddSubField('a', "Иванов");
            field.AddSubField('b', "И. И.");
            result.Fields.Add(field);

            field = new RecordField("701");
            field.AddSubField('a', "Петров");
            field.AddSubField('b', "П. П.");
            result.Fields.Add(field);

            field = new RecordField("200");
            field.AddSubField('a', "Заглавие " + titleNumber);
            field.AddSubField('e', "подзаголовочное");
            field.AddSubField('f', "И. И. Иванов, П. П. Петров");
            result.Fields.Add(field);

            field = new RecordField("210");
            field.AddSubField('a', "Иркутск");
            field.AddSubField('d', "2016");
            result.Fields.Add(field);

            field = new RecordField("215");
            field.AddSubField('a', "123");
            result.Fields.Add(field);

            field = new RecordField("300", "Первое примечание");
            result.Fields.Add(field);
            field = new RecordField("300", "Второе примечание");
            result.Fields.Add(field);
            field = new RecordField("300", "Третье примечание");
            result.Fields.Add(field);

            field = new RecordField("920", "PAZK");
            result.Fields.Add(field);

            return(result);
        }
示例#17
0
        public RecordField ToField()
        {
            RecordField result = new RecordField("900")
                                 .AddNonEmptySubField('t', DocumentType)
                                 .AddNonEmptySubField('b', DocumentKind)
                                 .AddNonEmptySubField('c', DocumentCharacter1)
                                 .AddNonEmptySubField('2', DocumentCharacter2)
                                 .AddNonEmptySubField('3', DocumentCharacter3)
                                 .AddNonEmptySubField('4', DocumentCharacter4)
                                 .AddNonEmptySubField('5', DocumentCharacter5)
                                 .AddNonEmptySubField('6', DocumentCharacter6)
                                 .AddNonEmptySubField('x', PurposeCode1)
                                 .AddNonEmptySubField('y', PurposeCode2)
                                 .AddNonEmptySubField('9', PurposeCode3)
                                 .AddNonEmptySubField('z', AgeRestrictions);

            return(result);
        }
示例#18
0
        public Dictionary <Guid, RecordField> GetAllRecordFields(Record record, Form form)
        {
            string sql = "SELECT * FROM UFRecordFields where Record = @record";
            Dictionary <Guid, RecordField> l = new Dictionary <Guid, RecordField>();

            IRecordsReader rr = sqlHelper.ExecuteReader(sql, sqlHelper.CreateParameter("@record", record.Id));

            while (rr.Read())
            {
                RecordField r = RecordField.CreateFromDataReader(rr);
                r.Values = recordFieldValueStorage.GetRecordFieldValues(r);
                l.Add(r.FieldId, r);
            }

            rr.Dispose();

            return(l);
        }
示例#19
0
        public IrbisRecord DecodeRecord()
        {
            IrbisRecord result = new IrbisRecord
            {
                Mfn            = Leader.Mfn,
                Status         = (RecordStatus)Leader.Status,
                PreviousOffset = Leader.Previous,
                Version        = Leader.Version
            };

            foreach (MstDictionaryEntry64 entry in Dictionary)
            {
                RecordField field = DecodeField(entry);
                result.Fields.Add(field);
            }

            return(result);
        }
    private void LoadFieldForStore(DataTable datatable)
    {
        JsonReader jsonReader = new JsonReader();

        jsonReader.Root = "Data";
        if (PageSize <= 0)
        {
            PageSize = 30;
        }
        Store1.BaseParams.Add(new Ext.Net.Parameter("PageSize", PageSize.ToString()));
        StaticPagingToolbar.PageSize = PageSize;

        jsonReader.IDProperty    = IDProperty;
        jsonReader.TotalProperty = "TotalRecords";

        jsonReader.Fields.Add(new RecordField()
        {
            Name = IDProperty
        });

        foreach (DataColumn item in datatable.Columns)
        {
            RecordField field = new RecordField();
            field.Name = item.ColumnName;
            jsonReader.Fields.Add(field);
        }
        if (!string.IsNullOrEmpty(MoreStoreField))
        {
            foreach (var item in MoreStoreField.Split(','))
            {
                if (!string.IsNullOrEmpty(item))
                {
                    RecordField field = new RecordField();
                    field.Name = item;
                    jsonReader.Fields.Add(field);
                }
            }
        }
        Store1.Reader.Add(jsonReader);
        if (!string.IsNullOrEmpty(GroupField))
        {
            Store1.GroupField = GroupField;
        }
    }
示例#21
0
 /// <summary>
 /// Subfields of the field must not contain bad characters.
 /// </summary>
 protected void MustNotContainWhitespace
 (
     [NotNull] RecordField field,
     params char[] codes
 )
 {
     foreach (char code in codes)
     {
         SubField[] subFields = field.GetSubField(code);
         foreach (SubField subField in subFields)
         {
             MustNotContainWhitespace
             (
                 field,
                 subField
             );
         }
     }
 }
示例#22
0
        /// <summary>
        /// The field must not contain whitespace.
        /// </summary>
        /// <param name="field"></param>
        protected void MustNotContainWhitespace
        (
            [NotNull] RecordField field
        )
        {
            string text = field.Text;

            if (!string.IsNullOrEmpty(text) &&
                text.ContainsWhitespace())
            {
                AddDefect
                (
                    field,
                    3,
                    "Поле {0} содержит пробельные символы",
                    field.Tag
                );
            }
        }
示例#23
0
        /// <summary>
        /// Add the detected defect.
        /// </summary>
        protected void AddDefect
        (
            [NotNull] RecordField field,
            int damage,
            [NotNull] string format,
            params object[] args
        )
        {
            FieldDefect defect = new FieldDefect
            {
                Field       = field.Tag,
                FieldRepeat = field.Repeat,
                Value       = field.ToText(),
                Damage      = damage,
                Message     = string.Format(format, args)
            };

            Report.Defects.Add(defect);
        }
示例#24
0
        public void RecordField_SetValue_2()
        {
            bool save = RecordField.BreakOnValueContainDelimiters;

            RecordField.BreakOnValueContainDelimiters = false;
            try
            {
                RecordField field = new RecordField(200);
                field.SetValue("Value^aSubfieldA^bSubfieldB");
                Assert.AreEqual(2, field.SubFields.Count);
                Assert.AreEqual("SubfieldA", field.GetFirstSubFieldValue('a'));
                Assert.AreEqual("SubfieldB", field.GetFirstSubFieldValue('b'));
                Assert.AreEqual("Value", field.Value);
            }
            finally
            {
                RecordField.BreakOnValueContainDelimiters = save;
            }
        }
示例#25
0
        private void CheckField
        (
            [NotNull] RecordField field
        )
        {
            MustNotContainText(field);

            SubField isbn = field.GetFirstSubField('a');

            if (!ReferenceEquals(isbn, null))
            {
                if (Utilities.SafeContains
                    (
                        isbn.Text,
                        "(", " ", ".", ";", "--"
                    ))
                {
                    AddDefect
                    (
                        field,
                        isbn,
                        1,
                        "Неверно введен ISBN в поле 10"
                    );
                }
            }

            SubField price = field.GetFirstSubField('d');

            if (price != null)
            {
                if (!Regex.IsMatch(price.Text, @"\d+\.\d{2}"))
                {
                    AddDefect
                    (
                        field,
                        price,
                        5,
                        "Неверный формат цены в поле 10"
                    );
                }
            }
        }
示例#26
0
        /// <summary>
        /// Sinh cột và record field động
        /// </summary>
        private void InitDynamicColumn()
        {
            if (string.IsNullOrEmpty(hdfSalaryBoardListID.Text))
            {
                return;
            }

            // get payroll
            var payroll = PayrollController.GetById(Convert.ToInt32(hdfSalaryBoardListID.Text));

            if (payroll == null)
            {
                return;
            }

            // get payroll config
            var salaryBoardConfigs = SalaryBoardConfigController.GetAll(payroll.ConfigId, true, null, null,
                                                                        SalaryConfigDataType.DynamicValue, null, null);

            foreach (var salaryBoardConfig in salaryBoardConfigs)
            {
                // init record field
                var recordField = new RecordField
                {
                    Name = salaryBoardConfig.ColumnCode,
                };

                // init column
                var column = new Column
                {
                    DataIndex = recordField.Name,
                    Header    = salaryBoardConfig.Display,
                    Width     = 120,
                    Align     = Alignment.Right,
                    Tooltip   = salaryBoardConfig.Description,
                    Editor    = { new TextField() },
                    Renderer  = { Fn = "RenderValue" }
                };

                storeAdjustment.AddField(recordField);
                gridColumnDynamic.ColumnModel.Columns.Add(column);
            }
        }
示例#27
0
        private void CheckField
        (
            [NotNull] RecordField field
        )
        {
            MustNotContainSubfields(field);

            string text = field.Text;

            if (Utilities.SafeContains(text, "."))
            {
                AddDefect
                (
                    field,
                    1,
                    "Ключевые слова с сокращениями"
                );
            }
        }
示例#28
0
 private void CheckField
 (
     [NotNull] RecordField field
 )
 {
     MustNotContainSubfields
     (
         field
     );
     if (!CheckForMenu(_menu, field.Text))
     {
         AddDefect
         (
             field,
             10,
             "Поле 102 (страна) не из словаря"
         );
     }
 }
示例#29
0
        public void RecordFieldUtility_GetFirstField_2()
        {
            IEnumerable <RecordField> enumeration = _GetFieldEnumeration();
            RecordField field = RecordFieldUtility.GetFirstField(enumeration, 100, 200);

            Assert.IsNotNull(field);

            enumeration = _GetFieldEnumeration();
            field       = RecordFieldUtility.GetFirstField(enumeration, 200);
            Assert.IsNotNull(field);

            enumeration = _GetFieldEnumeration();
            field       = RecordFieldUtility.GetFirstField(enumeration, 900, 1000);
            Assert.IsNull(field);

            enumeration = _GetFieldEnumeration();
            field       = RecordFieldUtility.GetFirstField(enumeration, 900, 200);
            Assert.IsNotNull(field);
        }
示例#30
0
        private ServerResponse ExecuteFormatCommand
        (
            [NotNull] FormatCommand command,
            bool emptyRecords
        )
        {
            IIrbisConnection connection = command.Connection;
            List <int>       list       = command.MfnList;
            int count = list.Count;

            command.FormatResult = new string[count];
            for (int i = 0; i < count; i++)
            {
                MarcRecord record = new MarcRecord
                {
                    Database = connection.Database,
                    Mfn      = list[i],
                    Version  = 1,
                    Status   = RecordStatus.Last
                };
                if (!emptyRecords)
                {
                    record.Fields.Add(RecordField.Parse(100, "Field100"));
                    record.Fields.Add(RecordField.Parse(300, "Field200"));
                    record.Fields.Add(RecordField.Parse(300, "Field300"));
                }
                string line = EncodeRecord(record);
                command.FormatResult[i] = line;
            }

            byte[]         rawAnswer  = new byte[0];
            byte[]         rawRequest = new byte[0];
            ServerResponse response   = new ServerResponse
                                        (
                connection,
                rawAnswer,
                rawRequest,
                true
                                        );

            return(response);
        }
示例#31
0
        /// <summary>
        /// record_stmt                                 = identifier ":" type
        /// </summary>
        private RecordField parseRecordStmt()
        {
            var node = new RecordField();

            node.Name = ensure(LexemType.Identifier, ParserMessages.RecordFieldIdentifierExpected).Value;
            ensure(LexemType.Colon, ParserMessages.SymbolExpected, ':');
            node.Type = ensure(parseType, ParserMessages.RecordFieldTypeExpected);

            return node;
        }
        public static string SaveToContour(this DynaForm dynaform, string formGuid, out string insertedRecordId, string userIpAddress = "", int umbracoPageId = 0)
        {
            var message = "";
            insertedRecordId = "";

            using (var recordStorage = new RecordStorage())
            using (var formStorage = new FormStorage())
            {
                var form = formStorage.GetForm(new Guid(formGuid));

                using (var recordService = new RecordService(form))
                {
                    recordService.Open();

                    var record = recordService.Record;
                    record.IP = userIpAddress;
                    record.UmbracoPageId = umbracoPageId;
                    recordStorage.InsertRecord(record, form);

                    foreach (var field in recordService.Form.AllFields)
                    {

                        string currentFieldValue = "";
                        string contourFieldName = field.Caption.TrimStart('#');

                        if (dynaform.ModelDictionary.ContainsKey("f" + field.Id.ToString().Replace('-', '_')))
                        {
                            currentFieldValue = dynaform.ModelDictionary["f" + field.Id.ToString().Replace('-', '_')].ToString();
                        }
                        else if (dynaform.ModelDictionary.ContainsKey(contourFieldName))
                        {
                            currentFieldValue = dynaform.ModelDictionary[contourFieldName].ToString();
                        }

                        var key = Guid.NewGuid();
                        var recordField = new RecordField
                        {
                            Field = field,
                            Key = key,
                            Record = record.Id,
                            Values = new List<object> { currentFieldValue }
                        };

                        using (var recordFieldStorage = new RecordFieldStorage())
                            recordFieldStorage.InsertRecordField(recordField);

                        record.RecordFields.Add(key, recordField);

                        insertedRecordId = record.Id.ToString();
                    }
                    recordService.Submit();
                    recordService.SaveFormToRecord();

                }
                message=form.MessageOnSubmit;
            }
            return message;
        }
		/// <summary>
		/// Stores a form record.
		/// </summary>
		/// <param name="form">The form to store a record to.</param>
		/// <param name="fieldValues">The field values to store.</param>
		/// <param name="ipAddress">The user's IP address.</param>
		/// <param name="pageId">The current page ID.</param>
		/// <param name="recordId">Outputs the ID of the record stored to Contour.</param>
		/// <returns>True, if the record was stored; otherwise, false.</returns>
		private static bool StoreRecord(Form form, Dictionary<string, List<object>> fieldValues,
			string ipAddress, int pageId, out Guid recordId) {
			using (var recordStorage = new RecordStorage())
			using (var recordService = new RecordService(form)) {

				// Open record service.
				recordService.Open();

				// Create record.
				var record = recordService.Record;
				record.IP = ipAddress;
				record.UmbracoPageId = pageId;
				record = recordStorage.InsertRecord(record, form);

				// Assign field values for record.
				foreach (var field in recordService.Form.AllFields) {

					// Check which field this is.
					var knownField = false;
					var values = default(List<object>);
					if (fieldValues.TryGetValue((field.Caption ?? string.Empty).ToLower(), out values)) {
						knownField = true;
					}

					// If the field is one of those that are known, store it.
					if (knownField && values != null && values.Any(x => x != null)) {

						// Create field.
						var key = Guid.NewGuid();
						var recordField = new RecordField {
							Field = field,
							Key = key,
							Record = record.Id,
							Values = values
						};

						// Store field.
						using (var recordFieldStorage = new RecordFieldStorage()) {
							recordFieldStorage.InsertRecordField(recordField);
						}

						// Add field to record.
						record.RecordFields.Add(key, recordField);

					}

				}

				// Submit / save record.
				recordService.Submit();
				var result = recordService.SaveFormToRecord();
				recordId = record.Id;
				return result;

			}
		}
 private bool IsFileUpload(RecordField r)
 {
     return
         r.Field.FieldTypeId == Guid_FileUpload ||
         r.Field.FieldTypeId == Guid_PerplexFileUpload ||
         r.Field.FieldTypeId == Guid_PerplexImageUpload;
 }
        /// <summary>
        /// Dit levert een List van EmailTags op omdat sommige RecordFields tot meerdere
        /// EmailTags leiden. Bijvoorbeeld een File Upload is standaard type multiple, dus kan leiden
        /// tot meer dan 1 EmailTag ([#file-1#], [#file-2#], etc.). Het was dus noodzakelijk hier
        /// meerdere EmailTags op te kunnen leveren per RecordField.
        /// </summary>
        /// <param name="recordField"></param>
        /// <returns></returns>
        private List<EmailTag> ParseRecordField(RecordField recordField)
        {
            string tag = "[#" + recordField.Field.Caption + "#]";

            // Over het algemeen hebben we de eerste waarde nodig, we handelen hier meteen
            // de case af dat de waarde niet is meegestuurd en/of null is.
            string value = recordField.Values.Count == 0 || recordField.Values[0] == null
                ? ""
                : recordField.Values[0].ToString();

            // Hoe we de value uitlezen is afhankelijk van het datatype
            // Guids kunnen niet in een switch staan, dus we gebruiken simpelweg if / else statements
            Guid fieldTypeId = recordField.Field.FieldTypeId;

            if(fieldTypeId == Guid_Checkbox)
            {
                // Bij een checkbox gaat het om een boolean waarde, deze geven we dus ook als zodanig terug en niet als string
                return new List<EmailTag>() { new EmailTag(tag, bool.Parse(value)) };
            }
            else if(fieldTypeId == Guid_TextArea)
            {
                // Newlines vervangen door HTMl newlines
                value = value.Replace("\n", "<br/>");
            }
            else if(fieldTypeId == Guid_DatePicker)
            {
                // De .ToString van de DateTime moeten we wellicht instelbaar maken in de WorkFlow
                // Dan kan je per formulier aangeven hoe de datum naar een string moet worden omgezet
                if (value != "")
                {
                    DateTime dateTime;
                    if (DateTime.TryParse(value, out dateTime))
                    {
                        value = dateTime.ToShortDateString();
                    }
                    else
                    {
                        value = "The DatePicker value could not be parsed into a DateTime instance. The DatePicker value was " + value;
                    }
                }
            }
            else if(IsFileUpload(recordField))
            {
                // Een FileUpload kan meerdere waardes hebben (voor elk geüpload bestand)
                // We gaan nog steeds 1 tag genereren, maar die kan dan dus meerdere linkjes
                // bevatten, 1 voor elk bestand.

                // Lijstje met <a href="...">'s
                List<string> links = recordField.Values.Select((filePath, idx) =>
                {
                    // filePath is een relatief pad, iets als "~/media/forms/upload/<GUID>/bestandsnaam.txt
                    string fileName = Path.GetFileName(filePath.ToString());

                    var httpContext = HttpContext.Current;
                    string host = ""; // Root van website
                    if (httpContext != null)
                    {
                        host = httpContext.Request.Url.GetLeftPart(UriPartial.Authority);
                    }
                    string url = host + filePath.ToString().Replace("~", "");

                    string link = "<a title=\"" + fileName + "\" href=\"" + url + "\">" + fileName + "</a>";

                    // Eerder hadden we losse tags voor Bestandsnaam en URL,
                    // maar in de praktijk zijn die niet zinnig om terug te geven
                    // want in de formsautogenerate toont hij alle tags + values.
                    // Daar willen we echter alleen maar een aanklikbare link en niet
                    // ook nog los bestandsnaam + url.
                    // Nu dus alleen nog een anchor tag met aanklikbare link
                    return link;
                }).ToList();

                string htmlValue;

                // Indien het 1 bestand is leveren we 1 <a> tag op, verder niets.
                // Indien er meer dan 1 bestand is zetten we er enters tussen en doen we
                // ook een enter voor het eerste bestand zodat we een lijstje onder elkaar krijgen.
                if (links.Count == 1)
                {
                    htmlValue = links.First();
                }
                else
                {
                    htmlValue = "<br/>" + string.Join("<br/>", links);
                }

                return new List<EmailTag>() { new EmailTag("[#" + recordField.Field.Caption + "#]", htmlValue) };
            }

            // Default case voor de overige waardes:
            // Value wordt de stringwaarde (bij 1 waarde),
            // ofwel een kommagescheiden lijst van de stringwaardes (bij 2+ waardes)
            else
            {
                value = string.Join(", ", recordField.Values.Where(v => v != null).Select(v => v.ToString()));
            }

            return new List<EmailTag>() { new EmailTag(tag, value) };
        }