Address.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. using System;
  2. using System.ComponentModel;
  3. using System.Linq;
  4. namespace InABox.Core
  5. {
  6. public class CountryLink : EntityLink<Country>
  7. {
  8. [NullEditor]
  9. public override Guid ID { get; set; }
  10. [CodeEditor(Editable=Editable.Disabled)]
  11. [EditorSequence(1)]
  12. public string Code { get; set; }
  13. [Caption("Country")]
  14. [EditorSequence(2)]
  15. public string Name { get; set; }
  16. }
  17. public class Country : Entity, IRemotable, IPersistent
  18. {
  19. [UniqueCodeEditor(Editable=Editable.Enabled)]
  20. [EditorSequence(1)]
  21. public string Code { get; set; }
  22. [Caption("Country")]
  23. [EditorSequence(2)]
  24. public string Name { get; set; }
  25. static Country()
  26. {
  27. DefaultColumns.Add<State>(x => x.Code, 100);
  28. DefaultColumns.Add<Country>(x => x.Name, caption: "Country");
  29. }
  30. }
  31. public class StateLink : EntityLink<State>
  32. {
  33. [LookupEditor(typeof(State))]
  34. public override Guid ID { get; set; }
  35. [NullEditor]
  36. public CountryLink Country => InitializeField(ref _country);
  37. private CountryLink? _country;
  38. [CodeEditor(Editable = Editable.Disabled)]
  39. [EditorSequence(1)]
  40. public string Code { get; set; }
  41. [Caption("State")]
  42. [EditorSequence(2)]
  43. public string Name { get; set; }
  44. }
  45. public class State : Entity, IRemotable, IPersistent
  46. {
  47. [EntityRelationship(DeleteAction.Cascade)]
  48. [EditorSequence(1)]
  49. public CountryLink Country => InitializeField(ref _country);
  50. private CountryLink? _country;
  51. [UniqueCodeEditor(Editable = Editable.Enabled)]
  52. [EditorSequence(2)]
  53. public string Code { get; set; }
  54. [EditorSequence(3)]
  55. public string Name { get; set; }
  56. static State()
  57. {
  58. DefaultColumns.Add<State>(x => x.Code, 100);
  59. DefaultColumns.Add<State>(x => x.Name, caption: "State");
  60. }
  61. }
  62. public class LocalityLink : EntityLink<Locality>
  63. {
  64. public override Guid ID { get; set; }
  65. [EditorSequence(1)]
  66. public StateLink State => InitializeField(ref _state);
  67. private StateLink? _state;
  68. [EditorSequence(3)]
  69. public string Name { get; set; }
  70. [EditorSequence(4)]
  71. public string PostCode { get; set; }
  72. }
  73. public class Locality : Entity, IRemotable, IPersistent
  74. {
  75. [EntityRelationship(DeleteAction.Cascade)]
  76. [EditorSequence(1)]
  77. public StateLink State => InitializeField(ref _state);
  78. private StateLink? _state;
  79. [EditorSequence(3)]
  80. public string? Name { get; set; }
  81. [EditorSequence(4)]
  82. public string? PostCode { get; set; }
  83. static Locality()
  84. {
  85. DefaultColumns.Add<Locality>(x => x.Name, caption: "Locality");
  86. DefaultColumns.Add<Locality>(x => x.PostCode, 100);
  87. }
  88. }
  89. public enum LocalityType
  90. {
  91. Country,
  92. State,
  93. Locality
  94. }
  95. public interface ILocalitySummary
  96. {
  97. Guid ID { get; set; }
  98. Guid ParentID { get; set; }
  99. LocalityType Type { get; set; }
  100. string CountryCode { get; set; }
  101. string CountryName { get; set; }
  102. string StateCode { get; set; }
  103. string StateName { get; set; }
  104. string LocalityCode { get; set; }
  105. string LocalityName { get; set; }
  106. string Name { get; set; }
  107. string Code { get; set; }
  108. }
  109. public class LocalitySummaryGenerator : AutoEntityUnionGenerator<ILocalitySummary>
  110. {
  111. protected override void Configure()
  112. {
  113. AddTable<Locality>()
  114. .AliasField(x => x.ParentID, x => x.State.ID)
  115. .AliasField(x =>x.CountryCode, x=>x.State.Country.Code)
  116. .AliasField(x =>x.CountryName, x=>x.State.Country.Name)
  117. .AliasField(x =>x.StateCode, x=>x.State.Code)
  118. .AliasField(x =>x.StateName, x=>x.State.Name)
  119. .AliasField(x =>x.LocalityCode, x=>x.PostCode)
  120. .AliasField(x =>x.LocalityName, x=>x.Name)
  121. .AliasField(x =>x.Code, x => x.PostCode)
  122. .AddConstant(x=>x.Type, LocalityType.Locality);
  123. AddTable<State>()
  124. .AliasField(x=>x.ParentID, x => x.Country.ID)
  125. .AliasField(x =>x.CountryCode, x=>x.Country.Code)
  126. .AliasField(x =>x.CountryName, x=>x.Country.Name)
  127. .AliasField(x =>x.StateCode, x=>x.Code)
  128. .AliasField(x =>x.StateName, x=>x.Name)
  129. .AddConstant(x=>x.LocalityCode, "")
  130. .AddConstant(x=>x.LocalityName, "")
  131. .AddConstant(x=>x.Type, LocalityType.State);
  132. AddTable<Country>()
  133. .AddConstant(x => x.ParentID, Guid.Empty)
  134. .AliasField(x =>x.CountryCode, x=>x.Code)
  135. .AliasField(x =>x.CountryName, x=>x.Name)
  136. .AddConstant(x=>x.StateCode, "")
  137. .AddConstant(x=>x.StateName, "")
  138. .AddConstant(x=>x.LocalityCode, "")
  139. .AddConstant(x=>x.LocalityName, "")
  140. .AddConstant(x=>x.Type, LocalityType.Country);
  141. }
  142. public override bool Distinct => false;
  143. public override Column<ILocalitySummary>[] IDColumns => Columns.None<ILocalitySummary>().Add(x => x.ID).ToArray();
  144. }
  145. [AutoEntity(typeof(LocalitySummaryGenerator))]
  146. public class LocalitySummary : Entity, IRemotable, IPersistent, ILocalitySummary
  147. {
  148. [NullEditor]
  149. public Guid ParentID { get; set; }
  150. [NullEditor]
  151. public LocalityType Type { get; set; }
  152. [EditorSequence(1)]
  153. public string Name { get; set; }
  154. [EditorSequence(2)]
  155. public string Code { get; set; }
  156. [EditorSequence(3)]
  157. public string CountryCode { get; set; }
  158. [EditorSequence(4)]
  159. public string CountryName { get; set; }
  160. [EditorSequence(5)]
  161. public string StateCode { get; set; }
  162. [EditorSequence(6)]
  163. public string StateName { get; set; }
  164. [EditorSequence(7)]
  165. public string LocalityCode { get; set; }
  166. [EditorSequence(8)]
  167. public string LocalityName { get; set; }
  168. static LocalitySummary()
  169. {
  170. DefaultColumns.Add<LocalitySummary>(x=>x.Name, caption: "Locality");
  171. DefaultColumns.Add<LocalitySummary>(x => x.Code, 100, "Code");
  172. }
  173. }
  174. public class Address : EnclosedEntity, IPersistent, IRemotable
  175. {
  176. [EditorSequence(1)]
  177. [MemoEditor]
  178. public string Street { get; set; } = "";
  179. [EditorSequence(2)] public LocalityLink LocalityLink => InitializeField(ref _locality);
  180. private LocalityLink _locality;
  181. [EditorSequence(2)]
  182. [TextBoxEditor]
  183. public string City { get; set; } = "";
  184. [EditorSequence(3)]
  185. [ComboLookupEditor(typeof(StateLookups))]
  186. public string State { get; set; } = "";
  187. [EditorSequence(4)]
  188. [CodeEditor(Editable = Editable.Enabled)]
  189. public string PostCode { get; set; } = "";
  190. [NullEditor]
  191. public Location Location => InitializeField(ref _location, nameof(Location));
  192. private Location? _location;
  193. [NullEditor]
  194. public string Geofence { get; set; } = "";
  195. private class StateLookups : LookupGenerator<object>
  196. {
  197. public StateLookups(object[] items) : base(items)
  198. {
  199. AddValue("Australian Capital Territory", "Australian Capital Territory");
  200. AddValue("New South Wales", "New South Wales");
  201. AddValue("Northern Territory", "Northern Territory");
  202. AddValue("Queensland", "Queensland");
  203. AddValue("South Australia", "South Australia");
  204. AddValue("Tasmania", "Tasmania");
  205. AddValue("Victoria", "Victoria");
  206. AddValue("Western Australia", "Western Australia");
  207. }
  208. }
  209. public void CopyFrom(Address address)
  210. {
  211. Street = address.Street;
  212. City = address.City;
  213. State = address.State;
  214. PostCode = address.PostCode;
  215. Location.CopyFrom(address.Location);
  216. }
  217. }
  218. }