diff --git a/server/AyaNova/Controllers/UserController.cs b/server/AyaNova/Controllers/UserController.cs
index c422c9db..5b351ffc 100644
--- a/server/AyaNova/Controllers/UserController.cs
+++ b/server/AyaNova/Controllers/UserController.cs
@@ -319,6 +319,33 @@ namespace AyaNova.Api.Controllers
return Ok(ApiOkResponse.Response(ret));
}
+ ///
+ /// Get list of Customer Contact Users
+ /// (Rights to Customer object required)
+ ///
+ /// Customer contact users
+ [HttpGet("customer-contacts/{customerId}")]
+ public async Task GetClientContactList(long customerId)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+
+ if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Customer))
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+
+ var ret = await ct.User.Where(z => z.UserType == UserType.Customer && z.CustomerId==customerId).Select(z => new dtUser
+ {
+ Id = z.Id,
+ Active = z.Active,
+ Name = z.Name,
+ UserType = z.UserType,
+ LastLogin = z.LastLogin
+
+ }).ToListAsync();
+ return Ok(ApiOkResponse.Response(ret));
+ }
+
+
///
/// Fetch user type (inside meaning staff or subcontractor or outside meaning customer or headoffice type user)
diff --git a/server/AyaNova/PickList/CustomerPickList.cs b/server/AyaNova/PickList/CustomerPickList.cs
new file mode 100644
index 00000000..97a96abc
--- /dev/null
+++ b/server/AyaNova/PickList/CustomerPickList.cs
@@ -0,0 +1,56 @@
+using System.Collections.Generic;
+using Newtonsoft.Json.Linq;
+using AyaNova.Biz;
+namespace AyaNova.PickList
+{
+ internal class CustomerPickList : AyaPickList
+ {
+ public CustomerPickList()
+ {
+
+ DefaultListObjectType = AyaType.Customer;
+ SQLFrom = "from acustomer";
+ AllowedRoles = BizRoles.GetRoleSet(DefaultListObjectType).Select;
+ dynamic dTemplate = new JArray();
+
+ dynamic cm = new JObject();
+ cm.fld = "customername";
+ dTemplate.Add(cm);
+
+ cm = new JObject();
+ cm.fld = "customertags";
+ dTemplate.Add(cm);
+
+ base.DefaultTemplate = dTemplate.ToString(Newtonsoft.Json.Formatting.None);
+
+ //NOTE: Due to the join, all the sql id and name fields that can conflict with the joined table need to be specified completely
+ ColumnDefinitions = new List();
+ ColumnDefinitions.Add(new AyaPickListFieldDefinition
+ {
+ TKey = "Active",
+ FieldKey = "customeractive",
+ ColumnDataType = UiFieldDataType.Bool,
+ SqlValueColumnName = "acustomer.active",
+ IsActiveColumn = true
+ });
+ ColumnDefinitions.Add(new AyaPickListFieldDefinition
+ {
+ TKey = "Name",
+ FieldKey = "customername",
+ ColumnDataType = UiFieldDataType.Text,
+ SqlIdColumnName = "acustomer.id",
+ SqlValueColumnName = "acustomer.name",
+ IsRowId = true
+ });
+
+ ColumnDefinitions.Add(new AyaPickListFieldDefinition
+ {
+ TKey = "Tags",
+ FieldKey = "customertags",
+ ColumnDataType = UiFieldDataType.Tags,
+ SqlValueColumnName = "acustomer.tags"
+ });
+
+ }
+ }//eoc
+}//eons
\ No newline at end of file
diff --git a/server/AyaNova/PickList/PickListFactory.cs b/server/AyaNova/PickList/PickListFactory.cs
index 58928710..8b7ea491 100644
--- a/server/AyaNova/PickList/PickListFactory.cs
+++ b/server/AyaNova/PickList/PickListFactory.cs
@@ -16,6 +16,8 @@ namespace AyaNova.PickList
//CoreBizObject add here
case AyaType.Contract:
return new ContractPickList() as IAyaPickList;
+ case AyaType.Customer:
+ return new CustomerPickList() as IAyaPickList;
case AyaType.HeadOffice:
return new HeadOfficePickList() as IAyaPickList;
case AyaType.Widget: