private async Task <List <ItemProcessed> > GetItems(SqlConnection conn, EntityMapDefinition definition, EntityMapDefinition parentDefinition, StreamWriter fileMappingStream) { Console.WriteLine($"GetItems: {definition.SourceCode}"); var result = new List <ItemProcessed>(); using (var command = new SqlCommand( Queries.SourceQueries.EntityQuery(_sourceTenant, definition.SourceKind, definition.Attributes.Where(att => att.SourceCardinality == "1") .Select(c => MapSourceColumn(c.Source)) .Distinct() .ToArray() ), conn)) { command.Parameters.Add(new SqlParameter("@code", definition.SourceCode )); command.CommandTimeout = 360; using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { var mapping = new Dictionary <string, object>(); foreach (var attribute in definition.Attributes) { MapAttribute(mapping, reader, attribute); } foreach (var attribute in definition.Attributes.Where(a => a.TargetType.Equals(EntityMapDefinition.AttributeMap.AttributeType.File))) { if (mapping.ContainsKey(attribute.Target)) { mapping[attribute.Target] = await MapFile(mapping[attribute.Target]?.ToString(), parentDefinition.TargetCode, mapping["_code"]?.ToString(), fileMappingStream); } } if (!mapping.ContainsKey("_name") && mapping.ContainsKey("_code")) { mapping.Add("_name", mapping["_code"]); } var parentId = reader.GetInt64(reader.GetOrdinal("MisEntityID")); result.Add(new ItemProcessed(parentId, mapping)); } } } return(result); }
private async Task <Dictionary <long, List <Dictionary <string, object> > > > GetApprovalTrails(SqlConnection conn, string sourceCode, EntityMapDefinition trail, EntityMapDefinition parentDefinition, StreamWriter fileMappingStream) { var result = new Dictionary <long, List <Dictionary <string, object> > >(); if (trail == null) { return(result); } using (var command = new SqlCommand( Queries.SourceQueries.ApprovalTrailQuery(_sourceTenant), conn)) { command.Parameters.Add(new SqlParameter("@code", sourceCode )); command.CommandTimeout = 360; using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { var parentId = reader.GetInt64(reader.GetOrdinal("ParentID")); var mapping = new Dictionary <string, object>(); foreach (var attribute in trail.Attributes) { MapAttribute(mapping, reader, attribute); } if (!mapping.ContainsKey("_code")) { mapping.Add("_code", Guid.NewGuid()); } if (!mapping.ContainsKey("_name")) { mapping.Add("_name", $"Approval_{mapping["_code"]}"); } foreach (var attribute in trail.Attributes.Where(a => a.TargetType.Equals(EntityMapDefinition.AttributeMap.AttributeType.File))) { if (mapping.ContainsKey(attribute.Target)) { mapping[attribute.Target] = await MapFile(mapping[attribute.Target]?.ToString(), parentDefinition.TargetCode, mapping["_code"]?.ToString(), fileMappingStream); } } if (result.ContainsKey(parentId)) { result[parentId].Add(mapping); } else { result.Add(parentId, new List <Dictionary <string, object> > { { mapping } }); } } } } return(result); }
private async Task <IList <Dictionary <string, object> > > MapEntity(SqlConnection conn, EntityMapDefinition definition, StreamWriter fileMappingStream) { var currentNumber = 1; var result = new List <Dictionary <string, object> >(); var itemDictionary = new Dictionary <string, List <ItemProcessed> >(); var commitmentDictionary = new Dictionary <string, List <ItemProcessed> >(); var eventDictionary = new Dictionary <string, List <ItemProcessed> >(); foreach (var item in definition.Items) { itemDictionary.Add(item.SourceCode, await GetItems(conn, item, definition, fileMappingStream)); } foreach (var item in definition.Commitments) { commitmentDictionary.Add(item.SourceCode, await GetTransactionalEntity(conn, item, definition, fileMappingStream)); } foreach (var item in definition.Events) { eventDictionary.Add(item.SourceCode, await GetTransactionalEntity(conn, item, definition, fileMappingStream)); } var cardinalityDictionary = await GetAttributesWithCardinalityN(definition.SourceCode, conn); var approvalTrailDictionary = await GetApprovalTrails(conn, definition.SourceCode, definition.Trail, definition, fileMappingStream); using (var command = new SqlCommand( Queries.SourceQueries.EntityQuery(_sourceTenant, definition.SourceKind, definition.Attributes.Where(att => att.SourceCardinality == "1").Select(c => MapSourceColumn(c.Source)).Distinct().ToArray()), conn)) { command.Parameters.Add(new SqlParameter("@code", definition.SourceCode)); try { command.CommandTimeout = 360; using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { var sourceEntityId = reader.GetInt64(reader.GetOrdinal("ID")); var mapping = new Dictionary <string, object>(); foreach (var attribute in definition.Attributes) { if (attribute.SourceCardinality == "1") { MapAttribute(mapping, reader, attribute); } else if (cardinalityDictionary.ContainsKey(sourceEntityId) && cardinalityDictionary[sourceEntityId].ContainsKey(attribute.Source)) { mapping[attribute.Target] = cardinalityDictionary[sourceEntityId][attribute.Source]; } } foreach (var item in definition.Items) { var data = itemDictionary[item.SourceCode].Where(i => i.ParentId.Equals(sourceEntityId)) .Select(i => i.Data); foreach (var parentAttribute in item.Attributes.Where(a => a.Source.StartsWith("Parent."))) { foreach (var dataElement in data) { var attributeName = parentAttribute.Source.Split('.')[1]; if (mapping.ContainsKey(attributeName)) { dataElement[parentAttribute.Target] = mapping[attributeName]; } } } mapping[item.TargetCode] = data; } foreach (var item in definition.Commitments) { var data = commitmentDictionary[item.SourceCode].Where(i => i.ParentId.Equals(sourceEntityId)) .Select(i => i.Data); foreach (var parentAttribute in item.Attributes.Where(a => a.Source.StartsWith("Parent."))) { foreach (var dataElement in data) { var attributeName = parentAttribute.Source.Split('.')[1]; if (mapping.ContainsKey(attributeName)) { dataElement[parentAttribute.Target] = mapping[attributeName]; } } } mapping[item.TargetCode] = data; } foreach (var item in definition.Events) { var data = eventDictionary[item.SourceCode].Where(i => i.ParentId.Equals(sourceEntityId)) .Select(i => i.Data); foreach (var parentAttribute in item.Attributes.Where(a => a.Source.StartsWith("Parent."))) { foreach (var dataElement in data) { var attributeName = parentAttribute.Source.Split('.')[1]; if (mapping.ContainsKey(attributeName)) { dataElement[parentAttribute.Target] = mapping[attributeName]; } } } mapping[item.TargetCode] = data; } if (definition.Trail != null && approvalTrailDictionary.ContainsKey(sourceEntityId)) { mapping[definition.Trail.TargetCode] = approvalTrailDictionary[sourceEntityId]; } // Rewrite series in case of documents if (definition.TargetKind.Equals("Document", StringComparison.InvariantCultureIgnoreCase) && definition.SourceKind.Equals("Interaction", StringComparison.InvariantCultureIgnoreCase)) { if (mapping.ContainsKey("_serie")) { mapping["_serie"] = $"{reader.GetString(reader.GetOrdinal("CompanyCode"))}_{mapping["_serie"]}"; mapping["_code"] = $"{mapping["_serie"]}{mapping["_number"]}"; } else if (!mapping.ContainsKey("_code")) { mapping["_code"] = Guid.NewGuid().ToString("N"); } } else if (definition.TargetKind.Equals("Document", StringComparison.InvariantCultureIgnoreCase)) { mapping["_serie"] = "A"; mapping["_number"] = currentNumber++; } else if (definition.SourceKind.Equals("Interaction", StringComparison.InvariantCultureIgnoreCase) && !definition.TargetKind.Equals("Document", StringComparison.InvariantCultureIgnoreCase)) { if (!mapping.ContainsKey("_code")) { mapping["_code"] = $"{reader.GetString(reader.GetOrdinal("CompanyCode"))}_{reader.GetString(reader.GetOrdinal("NumberSerieCode"))}{reader.GetInt64(reader.GetOrdinal("Number"))}"; } } foreach (var attribute in definition.Attributes.Where(a => a.TargetType.Equals(EntityMapDefinition.AttributeMap.AttributeType.File))) { if (mapping.ContainsKey(attribute.Target)) { mapping[attribute.Target] = await MapFile(mapping[attribute.Target]?.ToString(), definition.TargetCode, mapping["_code"]?.ToString(), fileMappingStream); } } result.Add(mapping); } } } catch (Exception ex) { Console.WriteLine(ex.GetType().ToString()); Console.WriteLine(ex.Message); } } return(result); }