using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Web; using System.Xml; namespace Neo.Legitimate.NLTISWebService.Data { internal class OlasAssociation : OlasEntity { private const int AssociationStatusID = 9; private const string AssociatioStatusReason = "KZN OLAS Migration"; private const int DefaultModeID = 33002; private const int DefaultTypeID = 1; public OlasAssociation(XmlElement root) : base(root) { } protected override bool Exists() { bool exists = false; using (SqlConnection connection = new SqlConnection(base.ConnectionString)) { using (SqlCommand command = connection.CreateCommand()) { StringBuilder sql = new StringBuilder(); sql.Append(" SELECT A.pkiAssocId,A.sAssocRegistrationNum AS RegNum, A.sAssocName AS Name,P.sProvinceDesc AS Province,S.sAssocStatusDesc AS Status,AD.fkiProvinceId AS ProvinceId "); sql.Append(" FROM tblAssociation A INNER JOIN "); sql.Append(" tluAssocStatus S ON A.fkiAssocStatusId = S.pkiAssocStatusId INNER JOIN "); sql.Append(" tblAddress AD ON A.fkiPhysicalAddressId = AD.pkiAddressId INNER JOIN "); sql.Append(" tluProvince P ON AD.fkiProvinceId = P.pkiProvinceId "); sql.Append(" WHERE A.bActive = 1 AND AD.fkiProvinceId = @ProvinceID "); sql.Append(" AND REPLACE(A.sAssocName, ' ', '') LIKE REPLACE(@Name, ' ', '') + '%' "); int provinceID = NLTISDataBroker.ParseInt(base["provinceID"], 4); command.CommandType = CommandType.Text; command.CommandText = sql.ToString(); command.Parameters.Clear(); command.Parameters.AddWithValue("@Name", NLTISDataBroker.ParseDbString(base["associationName"])); command.Parameters.AddWithValue("@ProvinceID", provinceID); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { exists = true; base["provinceID"] = NLTISDataBroker.ToString(reader["ProvinceId"]); base["provinceName"] = NLTISDataBroker.ToString(reader["Province"]); base["associationID"] = NLTISDataBroker.ToString(reader["pkiAssocId"]); base["associationRegNumber"] = NLTISDataBroker.ToString(reader["RegNum"]); base["associationStatus"] = NLTISDataBroker.ToString(reader["Status"]); base["associationName"] = NLTISDataBroker.ToString(reader["Name"]); } else { exists = false; } } } } return exists; } protected override void Read() { using (SqlConnection connection = new SqlConnection(base.ConnectionString)) { using (SqlCommand command = connection.CreateCommand()) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "spAssocDetailL"; command.Parameters.AddWithValue("@AssocId", NLTISDataBroker.ParseInt(base["associationID"], -1)); connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { base["associationModeID"] = NLTISDataBroker.ToString(reader["fkiModeId"]); base["associationTypeID"] = NLTISDataBroker.ToString(reader["fkiAssocTypeId"]); base["associationStatus"] = NLTISDataBroker.ToString(reader["sAssocStatusDesc"]); base["associationName"] = NLTISDataBroker.ToString(reader["sAssocName"]); base["associationNameAbbrev"] = NLTISDataBroker.ToString(reader["sAssocAbbrevName"]); base["busRegNumber"] = NLTISDataBroker.ToString(reader["sBusRegistrationNum"]); base["taxNumber"] = NLTISDataBroker.ToString(reader["sTaxNum"]); base["applicationDate"] = NLTISDataBroker.ToDateString(reader["dtDateOfApplication"]); base["creationDate"] = NLTISDataBroker.ToDateString(reader["dtDateOfAssocCreation"]); base["agmDate"] = NLTISDataBroker.ToDateString(reader["dtDateOfAGM"]); base["memberCount"] = NLTISDataBroker.ToString(reader["iNumberOfMembers"]); base["vehicleCount"] = NLTISDataBroker.ToString(reader["iNumberOfVehicles"]); base["annualFee"] = NLTISDataBroker.ToFloatString(reader["cAnnualMembershipFee"]); base["joiningFee"] = NLTISDataBroker.ToFloatString(reader["cJoiningFee"]); base["telNumber"] = NLTISDataBroker.ToString(reader["sTelephoneNum"]); base["faxNumber"] = NLTISDataBroker.ToString(reader["sFaxNum"]); base["cellNumber"] = NLTISDataBroker.ToString(reader["sCellNum"]); base["email"] = NLTISDataBroker.ToString(reader["sEMailAddress"]); base["affiliations"] = NLTISDataBroker.ToString(reader["sAffiliations"]); base["physicalAddressID"] = NLTISDataBroker.ToString(reader["fkiPhysicalAddressId"]); base["physicalAddressLine1"] = NLTISDataBroker.ToString(reader["sAddressLine1"]); base["physicalAddressLine2"] = NLTISDataBroker.ToString(reader["sAddressLine2"]); base["physicalAddressLine3"] = NLTISDataBroker.ToString(reader["sAddressLine3"]); base["physicalAddressCode"] = NLTISDataBroker.ToString(reader["sPOCode"]); base["postalAddressID"] = NLTISDataBroker.ToString(reader["fkiPOAddressId"]); base["postalAddressLine1"] = NLTISDataBroker.ToString(reader[19]); base["postalAddressLine2"] = NLTISDataBroker.ToString(reader[20]); base["postalAddressLine3"] = NLTISDataBroker.ToString(reader[21]); base["postalAddressCode"] = NLTISDataBroker.ToString(reader[22]); } } } } } public override void Create(SqlCommand command) { int physicalAddressID; int postalAddressID; this.SaveAddress(command, out physicalAddressID, out postalAddressID); command.CommandType = CommandType.StoredProcedure; command.CommandText = "spAssocDetailI"; command.Parameters.Clear(); command.Parameters.AddWithValue("@fkiModeId", NLTISDataBroker.ParseInt(base["associationModeID"], 33002)); command.Parameters.AddWithValue("@fkiAssocTypeId", NLTISDataBroker.ParseInt(base["associationTypeID"], 1)); command.Parameters.AddWithValue("@fkiPOAddressId", postalAddressID); command.Parameters.AddWithValue("@fkiPhysicalAddressId", physicalAddressID); command.Parameters.AddWithValue("@sAssocName", NLTISDataBroker.ParseDbString(base["associationName"])); command.Parameters.AddWithValue("@sAssocAbbrevName", NLTISDataBroker.ParseDbString(base["associationNameAbbrev"])); command.Parameters.AddWithValue("@sTaxNum", NLTISDataBroker.ParseDbString(base["taxNumber"])); command.Parameters.AddWithValue("@sBusRegistrationNum", base["busRegNumber"]); command.Parameters.AddWithValue("@dtDateOfApplication", NLTISDataBroker.ParseDbDate(base["applicationDate"])); command.Parameters.AddWithValue("@dtDateOfAssocCreation", NLTISDataBroker.ParseDbDate(base["creationDate"])); command.Parameters.AddWithValue("@dtDateOfAGMInp", NLTISDataBroker.ParseDbDate(base["agmDate"])); command.Parameters.AddWithValue("@iNumberOfMembers", NLTISDataBroker.ParseInt(base["memberCount"], 0)); command.Parameters.AddWithValue("@cAnnualMembershipFee", NLTISDataBroker.ParseFloat(base["annualFee"], 0f)); command.Parameters.AddWithValue("@cJoiningFee", NLTISDataBroker.ParseFloat(base["joiningFee"], 0f)); command.Parameters.AddWithValue("@sTelephoneNum", NLTISDataBroker.ParseDbString(base["telNumber"])); command.Parameters.AddWithValue("@sFaxNum", NLTISDataBroker.ParseDbString(base["faxNumber)"])); command.Parameters.AddWithValue("@sCellNum", NLTISDataBroker.ParseDbString(base["cellNumber)"])); command.Parameters.AddWithValue("@sEMailAddress", NLTISDataBroker.ParseDbString(base["email)"])); command.Parameters.AddWithValue("@sAffiliations", NLTISDataBroker.ParseDbString(base["affiliations)"])); command.Parameters.AddWithValue("@sAuditInfo", base.UserAudit); int associationID = Convert.ToInt32(command.ExecuteScalar()); command.CommandType = CommandType.StoredProcedure; command.CommandText = "spAssocEntityI"; command.Parameters.Clear(); command.Parameters.AddWithValue("@AssocId", associationID); command.ExecuteNonQuery(); command.CommandType = CommandType.Text; command.CommandText = "SELECT sAssocRegistrationNum FROM tblAssociation\tWhere pkiAssocId = @AssocId"; command.Parameters.Clear(); command.Parameters.AddWithValue("@AssocId", associationID); string associationRegNumber = NLTISDataBroker.ToString(command.ExecuteScalar()); base["associationID"] = NLTISDataBroker.ToString(associationID); base["associationRegNumber"] = associationRegNumber; this.SaveRoutes(command); this.Uplift(command); base.UpdateStatus(0, MigrationStatus.Created.ToString()); } public override void Update(SqlCommand command) { int associationID = NLTISDataBroker.ParseInt(base["associationID"], -1); int physicalAddressID; int postalAddressID; this.SaveAddress(command, out physicalAddressID, out postalAddressID); command.CommandType = CommandType.StoredProcedure; command.CommandText = "spAssocDetailU"; command.Parameters.Clear(); command.Parameters.AddWithValue("@pkiAssocId", associationID); command.Parameters.AddWithValue("@fkiModeId", NLTISDataBroker.ParseInt(base["associationModeID"], 33002)); command.Parameters.AddWithValue("@fkiAssocTypeId", NLTISDataBroker.ParseInt(base["associationTypeID"], 1)); command.Parameters.AddWithValue("@sAssocName", NLTISDataBroker.ParseDbString(base["associationName"])); command.Parameters.AddWithValue("@sAssocAbbrevName", NLTISDataBroker.ParseDbString(base["associationNameAbbrev"])); command.Parameters.AddWithValue("@sTaxNum", NLTISDataBroker.ParseDbString(base["taxNumber"])); command.Parameters.AddWithValue("@sBusRegistrationNum", NLTISDataBroker.ParseDbString(base["busRegNumber"])); command.Parameters.AddWithValue("@dtDateOfApplication", NLTISDataBroker.ParseDbDate(base["applicationDate"])); command.Parameters.AddWithValue("@dtDateOfAssocCreation", NLTISDataBroker.ParseDbDate(base["creationDate"])); command.Parameters.AddWithValue("@dtDateOfAGMInp", NLTISDataBroker.ParseDbDate(base["agmDate"])); command.Parameters.AddWithValue("@iNumberOfMembers", NLTISDataBroker.ParseInt(base["memberCount"], 0)); command.Parameters.AddWithValue("@cAnnualMembershipFee", NLTISDataBroker.ParseFloat(base["annualFee"], 0f)); command.Parameters.AddWithValue("@cJoiningFee", NLTISDataBroker.ParseFloat(base["joiningFee"], 0f)); command.Parameters.AddWithValue("@sTelephoneNum", NLTISDataBroker.ParseDbString(base["telNumber"])); command.Parameters.AddWithValue("@sFaxNum", NLTISDataBroker.ParseDbString(base["faxNumber"])); command.Parameters.AddWithValue("@sCellNum", NLTISDataBroker.ParseDbString(base["cellNumber"])); command.Parameters.AddWithValue("@sEMailAddress", NLTISDataBroker.ParseDbString(base["email"])); command.Parameters.AddWithValue("@sAffiliations", NLTISDataBroker.ParseDbString(base["affiliations"])); command.Parameters.AddWithValue("@sAuditInfo", base.UserAudit); command.ExecuteNonQuery(); command.CommandType = CommandType.Text; command.CommandText = "UPDATE tblAssociation SET fkiPOAddressId = @fkiPOAddressId, fkiPhysicalAddressId = @fkiPhysicalAddressId WHERE pkiAssocId = @pkiAssocId"; command.Parameters.Clear(); command.Parameters.AddWithValue("@pkiAssocId", associationID); command.Parameters.AddWithValue("@fkiPOAddressId", postalAddressID); command.Parameters.AddWithValue("@fkiPhysicalAddressId", physicalAddressID); command.ExecuteNonQuery(); this.SaveRoutes(command); this.Uplift(command); base.UpdateStatus(1, MigrationStatus.Updated.ToString()); } private void Uplift(SqlCommand command) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "spAssocStatusU"; command.Parameters.Clear(); command.Parameters.AddWithValue("@AssocId", NLTISDataBroker.ParseInt(base["associationID"], -1)); command.Parameters.AddWithValue("@fkiAssocStatusId", 9); command.Parameters.AddWithValue("@sAssocStatusOverrideReason", "Western Cape OLAS Migration"); command.Parameters.AddWithValue("@sAuditInfo", base.UserAudit); command.ExecuteNonQuery(); } private void SaveRoutes(SqlCommand command) { IEnumerator enumerator = base.Root.SelectNodes("//Route").GetEnumerator(); try { while (enumerator.MoveNext()) { XmlElement route = (XmlElement)enumerator.Current; try { int groupID = NLTISDataBroker.ParseInt(base.GetAttribute(route, "groupID"), -1); this.SaveRoute(command, route); } catch (Exception ex) { base.SetStatus(route, 2, NLTISDataBroker.ToString(ex)); throw ex; } } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } } private void SaveRoute(SqlCommand command, XmlElement route) { XmlElement origin = route.ChildNodes.Item(0) as XmlElement; XmlElement destination = route.ChildNodes.Item(route.ChildNodes.Count - 1) as XmlElement; this.CheckPlaceExists(command, origin); this.CheckPlaceExists(command, destination); MigrationStatus status = MigrationStatus.Error; string reason = ""; int rasRouteID = NLTISDataBroker.ParseInt(base.GetAttribute(route, "rasRouteID"), -1); if (rasRouteID == -1) { status = MigrationStatus.Created; command.CommandType = CommandType.StoredProcedure; command.CommandText = "spAssocRouteI"; command.Parameters.Clear(); command.Parameters.AddWithValue("@AssocId", NLTISDataBroker.ParseInt(base["associationID"], -1)); command.Parameters.AddWithValue("@fkiRouteTypeId", NLTISDataBroker.ParseInt(base.GetAttribute(route, "routeTypeID"), 1)); command.Parameters.AddWithValue("@sRASRouteDesc", NLTISDataBroker.ParseDbString(base.GetAttribute(route, "description"))); command.Parameters.AddWithValue("@sAuditInfo", base.UserAudit); command.ExecuteNonQuery(); command.CommandType = CommandType.Text; command.CommandText = "SELECT MAX(pkiRASRouteId) FROM tblRASRoute"; command.Parameters.Clear(); rasRouteID = Convert.ToInt32(command.ExecuteScalar()); base.SetAttribute(route, "rasRouteID", NLTISDataBroker.ToString(rasRouteID)); } else { status = MigrationStatus.Updated; command.CommandType = CommandType.StoredProcedure; command.CommandText = "spRASRouteU"; command.Parameters.Clear(); command.Parameters.AddWithValue("@pkiRASRouteId", rasRouteID); command.Parameters.AddWithValue("@fkiRouteTypeId", NLTISDataBroker.ParseInt(base.GetAttribute(route, "routeTypeID"), 1)); command.Parameters.AddWithValue("@sRASRouteDesc", NLTISDataBroker.ParseDbString(base.GetAttribute(route, "description"))); command.Parameters.AddWithValue("@sAuditInfo", base.UserAudit); command.ExecuteNonQuery(); } reason = status.ToString().ToUpper(); int groupID = NLTISDataBroker.ParseInt(base.GetAttribute(route, "groupID"), -1); int approvedRouteID = NLTISDataBroker.ParseInt(base.GetAttribute(route, "routeID"), -1); if (groupID == -1 || approvedRouteID == -1) { command.CommandType = CommandType.Text; command.CommandText = "SELECT fkiGroupId, fkiApprovedRouteId FROM tblRasRoute WHERE pkiRASRouteId = @RasRouteID"; command.Parameters.Clear(); command.Parameters.AddWithValue("@RasRouteID", rasRouteID); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { groupID = NLTISDataBroker.ParseInt(NLTISDataBroker.ToString(reader["fkiGroupId"]), -1); approvedRouteID = NLTISDataBroker.ParseInt(NLTISDataBroker.ToString(reader["fkiApprovedRouteId"]), -1); } } float radius = 999f; bool updatingViaPoints = false; command.CommandType = CommandType.StoredProcedure; command.CommandText = "sp_NTR_AddRouteNoName"; command.Parameters.Clear(); command.Parameters.AddWithValue("@Routetype", NLTISDataBroker.ParseInt(base.GetAttribute(route, "routeTypeID"), 1)); command.Parameters.AddWithValue("@sRouteName", NLTISDataBroker.ParseDbString(base.GetAttribute(route, "name"))); command.Parameters.AddWithValue("@BRCode", NLTISDataBroker.ParseDbString(base.GetAttribute(route, "boardCode"))); command.Parameters.AddWithValue("@NRCode", DBNull.Value); command.Parameters.AddWithValue("@RDescp", NLTISDataBroker.ParseDbString(base.GetAttribute(route, "description"))); command.Parameters.AddWithValue("@Lengthkm", NLTISDataBroker.ParseFloat(base.GetAttribute(route, "length"), 1f)); command.Parameters.AddWithValue("@Radius", radius); command.Parameters.AddWithValue("@PlaceId1", NLTISDataBroker.ParseInt(base.GetAttribute(origin, "placeID"), 1)); command.Parameters.AddWithValue("@PlaceTypeId1", NLTISDataBroker.ParseInt(base.GetAttribute(origin, "placeTypeID"), 2)); command.Parameters.AddWithValue("@PlaceId2", NLTISDataBroker.ParseInt(base.GetAttribute(destination, "placeID"), 1)); command.Parameters.AddWithValue("@PlaceTypeId2", NLTISDataBroker.ParseInt(base.GetAttribute(destination, "placeTypeID"), 2)); command.Parameters.AddWithValue("@xmlid", base.UserAudit); command.Parameters.AddWithValue("@GID", groupID); command.Parameters.AddWithValue("@EntID", rasRouteID); command.Parameters.AddWithValue("@lRouteProvinceId", NLTISDataBroker.ParseInt(base["provinceID"], 4)); command.Parameters.AddWithValue("@bUpdatingViaStop", updatingViaPoints); using (SqlDataReader reader2 = command.ExecuteReader()) { if (reader2.Read()) { object result = reader2["ApprovedRouteID"]; if (result is int) { approvedRouteID = Convert.ToInt32(result); groupID = Convert.ToInt32(reader2["GroupID"]); } else { status = MigrationStatus.Error; reason = "sp_NTR_AddRouteNoName: " + result.ToString().ToUpper(); } } else { status = MigrationStatus.Error; reason = "sp_NTR_AddRouteNoName: RETURNED ZERO RECORDS"; } } } if (approvedRouteID != -1) { command.CommandType = CommandType.Text; command.CommandText = "SELECT sNationalRouteCode FROM tblApprovedRoute WHERE pkiApprovedRouteId=@ApprovedRouteID"; command.Parameters.Clear(); command.Parameters.AddWithValue("@ApprovedRouteID", approvedRouteID); base.SetAttribute(route, "nationalCode", Convert.ToString(command.ExecuteScalar())); command.CommandType = CommandType.Text; command.CommandText = "SELECT pkiRouteNodeId FROM tblRouteNode WHERE fkiWayPointTypeId = @WayPointTypeID AND fkiGroupId = @GroupID"; command.Parameters.Clear(); command.Parameters.AddWithValue("@GroupID", groupID); SqlParameter paramType = command.Parameters.AddWithValue("@WayPointTypeID", 8); paramType.Value = 1; base.SetAttribute(origin, "routeNodeID", Convert.ToString(command.ExecuteScalar())); paramType.Value = 4; base.SetAttribute(destination, "routeNodeID", Convert.ToString(command.ExecuteScalar())); } base.SetAttribute(route, "rasRouteID", NLTISDataBroker.ToString(rasRouteID)); base.SetAttribute(route, "groupID", NLTISDataBroker.ToString(groupID)); base.SetAttribute(route, "routeID", NLTISDataBroker.ToString(approvedRouteID)); base.SetStatus(route, (int)status, reason); if (status == MigrationStatus.Error) { throw new Exception(reason); } } public int GetEntityID(SqlCommand command) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "spReturnAssocEntity"; command.Parameters.Clear(); command.Parameters.AddWithValue("@AssocId", NLTISDataBroker.ParseInt(base["associationID"], -1)); return Convert.ToInt32(command.ExecuteScalar()); } private void CheckPlaceExists(SqlCommand command, XmlElement routeNode) { int placeTypeID = NLTISDataBroker.ParseInt(base.GetAttribute(routeNode, "placeTypeID"), -1); int placeID = NLTISDataBroker.ParseInt(base.GetAttribute(routeNode, "placeID"), -1); if (placeTypeID >= 1 && placeTypeID <= 3) { string sqlIdentity = null; string sqlCount = null; switch (placeTypeID) { case 1: sqlIdentity = "SELECT MAX(pkiTownID) FROM tblTown"; sqlCount = "SELECT COUNT(*) FROM tblTown WHERE pkiTownID=" + placeID.ToString(); break; case 2: sqlIdentity = "SELECT MAX(pkiPlaceNameID) FROM tblPlaceName"; sqlCount = "SELECT COUNT(*) FROM tblPlaceName WHERE pkiPlaceNameID=" + placeID.ToString(); break; case 3: sqlIdentity = "SELECT MAX(pkiRoadLinkID) FROM tblRoadLink"; sqlCount = "SELECT COUNT(*) FROM tblRoadLink WHERE pkiRoadLinkID=" + placeID.ToString(); break; } bool shouldAdd = placeID == -1; if (!shouldAdd) { command.CommandType = CommandType.Text; command.CommandText = sqlCount; command.Parameters.Clear(); shouldAdd = (Convert.ToInt32(command.ExecuteScalar()) == 0); } if (shouldAdd) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "sp_NTR_RouteNodeInsert"; command.Parameters.Clear(); command.Parameters.AddWithValue("@lProvinceId", NLTISDataBroker.ParseInt(base["provinceID"], 4)); command.Parameters.AddWithValue("@sNodeDesc", base.GetAttribute(routeNode, "placeName")); command.Parameters.AddWithValue("@lNodeTypeId", placeTypeID); command.Parameters.AddWithValue("@lNodeParentId", NLTISDataBroker.ParseInt(base.GetAttribute(routeNode, "parentPlaceID"), -1)); command.Parameters.AddWithValue("@sXMLAuditInfo", base.UserAudit); command.ExecuteNonQuery(); command.CommandType = CommandType.Text; command.CommandText = sqlIdentity; command.Parameters.Clear(); base.SetAttribute(routeNode, "placeID", Convert.ToInt32(command.ExecuteScalar()).ToString()); } } } private void SaveAddress(SqlCommand command, out int physicalAddressID, out int postalAddressID) { int provinceID = NLTISDataBroker.ParseInt(base["provinceID"], 4); physicalAddressID = NLTISDataBroker.ParseInt(base["physicalAddressID"], -1); postalAddressID = NLTISDataBroker.ParseInt(base["postalAddressID"], -1); physicalAddressID = base.SaveAddress(command, physicalAddressID, provinceID, base["physicalAddressLine1"], base["physicalAddressLine2"], base["physicalAddressLine3"], base["physicalAddressCode"], false); postalAddressID = base.SaveAddress(command, postalAddressID, provinceID, base["postalAddressLine1"], base["postalAddressLine2"], base["postalAddressLine3"], base["postalAddressCode"], true); base["physicalAddressID"] = NLTISDataBroker.ToString(physicalAddressID); base["postalAddressID"] = NLTISDataBroker.ToString(postalAddressID); } } }