Sync custom Active Directory Fields to K2 SmartObject

ปกติแล้ว เวลาเราจะ Sync user properties จาก Active Directory ใน K2 เราก็มักจะใช้ Service Broker ที่ชื่อว่า AD Service2 แล้วก็เรียกใช้ Method GetUsers / GetUserDetails จาก AD User SmartObject

AD user

ซึ่งเราก็จะได้ Field มาตรฐานที่ใช้กันบ่อยๆ ประมาณนึง เช่น

ad user prop

ปัญหาคือ ถ้าใน Active Directory เรามีการสร้าง Custom Field เช่น EmployeeID แล้วเราต้องการเอา Field นั้นมาใช้งานใน K2 เราจะทำได้อย่างไร

นี่เป็นที่มาของการใช้ Dynamic Active Directory Service Broker ซึ่งสามารถโหลดได้ผ่าน Community ที่นี้เลย

โดยหลักการทำงานของ Service Broker นี้จะเปิดทางให้เราสามารถ Add Custom Field ได้ผ่าน Tools ที่ชื่อว่า Service Schema Configurator

service schema

โดยเมื่อเราทำการ Add Field ที่เราต้องการแล้วก็ให้ Save Schema แล้วก็ Refresh Service Broker นี้อีกครั้ง เราก็จะเห็น Field ใหม่มากับ SmartObject ล่ะ

DynamicADSMO

ถึงขั้นนี้เราก็สามารถนำ SmartObject นี้ไปใช้งาน พร้อมทั้งเห็นค่า Field Custom ที่เรา Config ไว้ได้แล้วนั้นเอง

Register K2 for SharePoint with SharePoint O365 for K2 Five

พอดีมีโอกาสจะต้อง Config K2 for SharePoint ของ K2 Five เพื่อ Upload เอกสารจาก K2 ขึ้น SharePoint O365 ซึ่งเจอปัญหาระหว่างทางพอสมควร จึงอยากเขียน Blog นี้มา เพื่อทำเป็น Reference เผื่อในอนาคตนะครับ เผื่อใครที่จะเจอปัญหาเดียวกัน

ก่อนจะเริ่มขออ้างอิงสมัยก่อน แต่ก่อนนั้น ตอนที่เป็น K2 4.7 และ O365 ใหม่ๆ เราจะสามารถโยนเอกสารขึ้น SharePoint ได้ง่ายๆ โดย Register ผ่าน Service Instance ที่ชื่อว่า SharePoint Content ซึ่งเคยเขียนรายละเอียดไว้ที่ Blog นี้

แต่อนิจจา Service Instance นี้ได้หายไปจาก K2 Five เนื่องด้วยเหตุผลที่ว่า O365 ต้องเป็นการ Authentication ผ่าน oAuth เท่านั้น จึงทำให้กระบวนการ COnfiguration จะยากขึ้นหน่อย แต่ไม่ยากเกินไปครับ

ก่อนอื่นเลย จะต้องมี Prerequisite ดังนี้ครับ

  • K2 ต้องมี SSL ซึ่งก็คือ URL ของ K2 ต้องเป็น https นั้นเอง
  • เครื่อง K2 จะต้องเปิด Site เหล่านี้ เพื่อให้ O365 วิ่งลงมาเชื่อมต่อได้
    • /Runtime
    • /Identity
    • /autodiscover
  • เครื่อง K2 จะต้องออก Internet ได้ เพราะว่าต้องวิ่งไปหา trust.k2.com
  • ต้องใช้ Account ที่เป็น Tenant Admin ของ 365 เพราะว่าต้องสร้าง App Catalog ด้วย
  • Tenant Admin นั้นต้องมีสิทธิ์เป็น Admin ใน Server Right ของ K2
  • K2 กับ O365 ใช้ AAD เดียวกัน

ถ้าเราทำ Prerequisite เรียบร้อย เราก็พร้อมล่ะ มาเริ่มกันได้เลย

1. Set up App Catalog
ก็เข้าไปที่ O365 Portal Admin แล้วไปที่ SharePoint Admin Center แล้วกด Open ใน Menu Apps

หลังจากนั้น Click App Catalog แล้วก็ใส่ชื่อ App Catalog ที่เราต้องการ

เมื่อสร้างเสร็จก็จะได้ App Catalog หน้าตาประมาณนี้

2. Deploy K2 for SharePoint App ขึ้น App Catalog

ในกรณีที่เราต้องการเชื่อมต่อระหว่าง K2 on Premise ไปหา O365 ทาง K2 แนะนำให้ Deploy App จาก Folder Installer ขึ้นไป ซึ่งอยู่ที่ Installation/SharePoint Online/K2 for SharePoint.app เพื่อ Make sure ว่า App จะตรง version กัน

แต่ในกรณีที่เราต้องการเชื่อมต่อระหว่าง K2 Cloud ไปหา O365 อันนี้ให้ไป Download K2 Five for SharePoint จาก SharePoint Store ได้เลย

3. เมื่อทำการ Deploy App เสร็จ ก็ให้ไปที่ Add an app เพื่อ App “K2 for SharePoint” ขึ้นมาใน App Catalog

4. เมื่อ Add เสร็จแล้ว App นั้นจะไปอยู่ใน Site Contents เราก็ Click ที่ icon เพื่อทำการ Register ได้เลย

5. มาถึงขั้นตอนสำคัญ เมื่อ Click ไปจะขึ้นหน้า Wizard เพื่อให้เราใส่ URL ของ K2 ของเรา ซึ่งจำเป็นจะต้องใส่ https นะ เช่น ในที่นี้ เราก็ใส่ https://ventek-k2-53 แล้วกด Next ซึ่งการทำงานส่วนนี้ทาง K2 จะไปหา Description ของ Site ต่างๆ ผ่าน /autodiscover เพื่อทำการ Register ให้เรา (ผ่านหน้า relayingAdd)

6. จะมีการ Link ไปหา K2 URL จาก O365 เพื่อให้เราใส่ Login อีกครั้ง ถ้าสังเกตดู จะเห็นว่าตอนนี้ URL จะเป็นของ K2 ล่ะ ตรงนี้ให้เราใส่ Tenant Admin เหมือนเดิม เพื่อทำการ Register นะ ไม่อย่างนั้น จะเกิดปัญหา Authentication Error แบบนี้

ถ้าลงได้เรียบร้อยจะได้หน้าตาแบบนี้ ก็ปล่อยให้มันหมุนๆจนเสร็จ

สำหรับคนที่เจอปัญหา 404 File not found ซึ่งมักจะเป็นในกรณีที่มีการทำ Reverse Proxy

ให้ลองเข้า /Runtime/Runtime/Form/K2+Application+Configure+Server/ ดูว่าเข้าได้มั้ยเพราะว่าบาง Proxy เมื่อเห็น + ใน URL จะทำการ Ignore ไป เราต้องไป Allow มันนะ

สุดท้ายแล้วจะได้หน้าตาประมาณนี้มา

ณ ขั้นตอนนี้ คือเราทำการ Register เชื่อมต่อระหว่าง K2 ของเรา กับ O365 เป็นที่เรียบร้อย

7. ทำการ Registration Wizard โดย Click ที่ Menu “Registration Wizard” ภายใต้ Administration

8. Deploy App มาเราจะใช้ K2 for SharePoint ที่ Site ไหนบ้าง โดย Click ที่ Menu “Manage App Deployments (SharePoint)

ขั้นตอนนี้จะให้เราใส่ Site Collection บน O365 ที่เราต้องการ Enable App นี้ เราก็ใส่ URL ไปแล้วเลือก Apply All Paths ก็เป็นอันจบ

9. Activate App

เมื่อเราทำการ Setting ทั้งหมดเสร็จแล้วก็มาทำการ Activate App ภายใต้ Menu “Manage App Activation” ซึ่งจะให้เราเลือก Site Collection แล้วก็ทำการ Activate ได้เลย

ณ ตอนนี้เราลง App สมบูรณ์แล้ว ขั้นตอนต่อไปก็จะไปสร้าง SMO ที่ Site Collection ที่เราเชื่อมต่อ

10. สร้าง SMO ที่ Site Collection

ให้ไปที่ Site Contents แล้วเลือก Documents Library ที่เราต้องการ Upload เอกสารไป ที่ Site Contents

จะเห็นว่าที่ Ribbon Menu จะมี Menu K2 ขึ้นมาล่ะ เราก็เลือก Application

เราก็เลือกจะสร้าง SMO ซึ่งพอเสร็จขั้นตอนนี้ เราจะเห็นว่าจะมีการสร้าง Service Instance ใหม่ให้เรา ภายใต้ SharePoint 2013 Service Instance แล้วเราก็จะสามารถสร้าง SMO จาก Document Library ได้ล่ะ

servicetester

โดย SMO นี้ก็จะมี Method ให้เราใช้หลายอย่าง แต่ที่เราจะใช้ก็คือ Upload Documents นั้นเอง

ลองเอา test.txt ขึ้นไป ก็จะได้ประมาณนี้บน O365

เป็นอันว่าจบกระบวนการ

Key Takeaway ก็คือ

  1. ใช้ Account Tenant ในการ Login และเชื่อมต่อ ของทั้งกระบวนการ
  2. ถ้ามีการใช้ Reverse Proxy ต้องระวังเรื่องเครื่องหมาย + ที่โดน Ignore
  3. ถ้าเจอ Error เรื่อง Authenticate SignoutURL ลอง run อีกรอบ เพราะว่าเจอเหมือนกัน

How to use K2 Menu with Role Permission

ในกรณีปกติแล้ว K2 Menu สามารถกำหนด Permission ในการเห็นแต่ละ Menu ได้ 3 ลักษณะคือ

  1. Everyone
  2. Active Directory Group
  3. Custom Security

Reference: https://www.dropbox.com/s/k5alk0if414lxxz/K2%20Menu%20System%20User%20Manual%20v1.0.1.pdf?dl=0

ซึ่งในบางกรณี เรามีความต้องการที่จะ Set K2 Menu Permission ตาม K2 Roles ที่เรามีการ Set อยู่แล้ว เราจะทำอย่างไรดี

Blog นี้จะเป็น Walk through Step ว่าเราจะเปลี่ยนจาก Custom Security มาเป็น K2 Roles ได้อย่างไร

Assumption

ควรจะมีความเข้าใจการทำงานของ Custom Security ของ K2 Menu ก่อน

K2Menu

หลักการสรุปของ K2 Menu Permission แบบ Custom Security ก็คือ เราสามารถ set ค่าว่าในแต่ละ menu จะต้องมี Custom Security อะไร ตอน Set menu

แล้วก็เราต้องเอาชื่อคนไป Resolve Table Permission อะไรซักอย่างเพื่อดูว่าคนๆนั้นมีค่า Permission ตรงกับ Menu มั้ย เช่น เรา set Menu A มีค่า custom security = 1,2 แล้วเราไป resolve ชื่อคนๆนั้น ว่ามี permission เป็น 1 เมื่อเอา 2 ค่านี้มาเปรียบเทียบกัน คนๆนี้ ก็จะสามารถเห็น Menu A ได้

เมื่อเราเข้าใจหลักการนี้ ก็ง่ายล่ะ เราก็แค่เปลี่ยนค่า 1,2 พวกนั้นเป็นชื่อ K2 Roles แทน แล้วตอน resolve ว่าคนๆนั้นมี permission อะไร ก็ไป resolve ว่าคนๆนั้น อยู่ Role อะไรแทน … เอ้าเริ่ม

  1. เปลี่ยนจากค่า Custom Security เป็นค่า Role โดยไปแก้ที่ K2MenuSystem.Level1MenuItems View โดยให้ไป get ค่า roles แทน ซึ่งอ้างอิง UMRole ได้เลย ฝั่ง setting ก็ทำแค่นี้

GetRoles

UMROLE2.

2. ฝั่ง resolve คนว่าอยู่ group ไหน ต้องอาศัย StoreProcedure นิดหน่อย ซึ่งมีเขียนใน K2Ranger ไว้แล้ว ตามนี้

CREATE PROCEDURE [dbo].[sp_FindRoleByUser] (

@pUserName NVARCHAR(447)

) AS

BEGIN

SELECT i.[Name]

FROM   [K2].[Identity].[Identity] i

INNER JOIN    [K2].[Identity].[RoleItem] r

ON     i.ID = r.IdentityID

WHERE  i.[Type] = 2

AND    r.[FQN] = @pUserName

END

เมื่อเราสร้าง Store Procedure นี้เสร็จ ก็ไปสร้าง SmartObject แล้วก็เอาคนไป Resolve เป็น Role ผ่าน Template View ที่ชื่อว่า K2MenuSystem.UserMemberShipCheck

membershipcheck

เท่านี้ก็ได้แล้ว คือหลังบ้าน set เป็น roles ส่วนหน้าบ้านก็เอาคนไป resolve กลับมาเป็น Roles

ถ้าใครเคยทำ Custom Security แบบปกติ… อ่าน blog นี้ก็น่าจะทำ Custom Security แบบ Roles ได้ไม่ยากเลยยยยย

How to update Folio from workflow management dll

พอดีได้ Requirements จากลูกค้ามาว่า ต้องการที่จะ Update Folio ของ Process Instance ที่วิ่งอยู่ในกระบวนการ เพื่อให้คนที่ได้รับงาน สามารถรับทราบถึง Status ของงานผ่าน Folio ได้ จึงได้มาศึกษาเรื่องของการใช้ dll เพื่อไป Update Folio

ซึ่ง dll ที่จะต้องใช้มีประมาณนี้ครับ

  • SourceCode.HostClientAPI เอาไว้ใช้ในการสร้าง Connection String และ Open Connection ไปหา K2 Server
  • SourceCode.SmartObject.Client เอาไว้ใช้ Query ข้อมูล SmartObject
  • SourceCode.Workflow.Client เอาไว้ใช้ในการเข้าถึงข้อมูลของแต่ Process Instance เพื่อทำการ Update ค่าต่างๆ
  • SourceCode.Workflow.Management เอาไว้ใช้ในการจัดการ Process Instance เช่น Start, Delete Process

ใน Requirements นี้ ได้ตัดสินใจไปใช้แนวทางสร้าง Custom Assembly ขึ้นมา เพื่อทำการ Update ครับ

เริ่มแรก เมื่อเราสร้าง Class Library project ขึ้นมาแล้ว ก็ให้ Add Reference ที่บอกข้างต้น โดย dll เหล่านี้ อยู่ที่ %K2_Home%/Bin

ต่อสร้าง ConnectionString จาก Object SCConnectionStringBuilder ประมาณนี้

SCConnectionStringBuilder K2Con = new SCConnectionStringBuilder();
K2Con.Host = “localhost”;
K2Con.Port = 5252;
K2Con.IsPrimaryLogin = true;
K2Con.Integrated = true;

สังเกตว่าจะใช้ Port 5252 เพราะว่า Port 5252 นี้จะเชื่อมต่อกับ Port Workflow Management

ในกรณีที่เราต้องการเชื่อมต่อ SmartObject ก็ใช้ Port 5555 ตามปกติครับ

หลังจากนั้นทำการเปิด Connection ไปหา K2 Server ด้วย Connection String ที่ set ไว้

SourceCode.Workflow.Client.Connection connection = new SourceCode.Workflow.Client.Connection();
connection.Open(“localhost”, K2Con.ToString());

ต่อมาก็ get Process Instance ที่ต้องการ โดยจะต้องอ้างอิง ID แล้วก็สั่ง update ได้ตรงๆเลย

SourceCode.Workflow.Client.ProcessInstance processInstance = connection.OpenProcessInstance(processInstanceID);
processInstance.Folio = “NEW FOLIO”;
processInstance.Update();

สุดท้ายอย่าลืม add try catch แล้วก็ปิด Connection ทุกครั้งด้วยนะครับ

พอเราได้ dll ตัวนี้มาแล้ว ก็เอาเข้าไป Register กับ EndPointAssembly แล้วก็สร้าง SmartObject มาใช้งานได้เลย

ของแถม

บางกรณีเราต้องการ Delete Process Instance บ้าง วิธีทำก็คล้ายๆข้างต้นเลยครับ แต่ต้องใช้ SourceCode.Workflow.Management เพราะเป็นตัวจัดการ ของแต่ละ Process Instance

วิธีทำก็สร้าง Connection String และ  Open Connection คล้ายๆเดิม

SourceCode.Workflow.Management.WorkflowManagementServer wms = new SourceCode.Workflow.Management.WorkflowManagementServer();
wms.Open(K2ConProcess.ToString());

หลังจากนั้นก็ลบได้เลยยยยยย

wms.DeleteProcessInstances(deleteProcessInstanceID, true);

วันนี้ก็พอแค่นี้ครับ น่าจะสามารถ update folio, ลบ Process Instance ผ่าน dll กันได้ล่ะ

ทำหน้า Search View เพื่อสนับสนุนการ Search พร้อมกันหลาย fields ด้วย Store Procedure Smart Object

ในกรณีที่เราต้องการสร้าง Search View จาก Smart Object ของ K2 นั้น ในกรณีปกติ เราก็จะสร้าง list view ซึ่งก็จะสามารถ Search ได้ด้วยการใช้ Filter หรือ Quick Search ที่จะให้เราเลือก Field ได้

แต่ในกรณีที่เราต้องการสร้างหน้า Search form ที่ต้องการให้ Search ได้หลายๆ Field พร้อมกันล่ะ ต้องทำยังไง

เมื่อลองคิดไปคิดมา ก็จะเห็นว่า Solution ที่ตรงไปตรงมาที่สุดก็คือ ไปสร้าง View ที่มี textbox หลายๆตัว แล้วก็เขียน Rules ครอบ ว่าถ้า textbox ไหนมีค่า ก็เอามา AND แล้ว Search พร้อมกัน

แต่เมื่อคิดดีๆ วิธีนี้จะยุ่งยากมาก ตอนที่เขียน rules ยิ่งมี Field เยอะ rules ยิ่ง complex

วันนี้เรามาเสนอทางวิธีการสร้าง Search View แล้วใช้ Store Procedure Smart Object ช่วย

วิธีทำมีดังนี้

  1.  ไปสร้าง Store Procedure ที่รับ Parameter หลายๆ Field ใน MSSQL (ใน SQL Management Studio มี tools ที่ช่วยสร้าง Store procedure อยู่แล้ว)

2. เมื่อเราสร้างและทดสอบ Store procedure ของเราแล้ว ว่าเวลารับ parameter มา query ได้ถูกต้อง งานของเราก็เสร็จไปแล้วกว่า 50%

(ความคิดเห็นส่วนตัว: เราสามารถเขียน Store Procedure handle กรณีที่มีหลายๆ Field ได้ดีกว่าไปเขียน Rules บน K2 เช่น จากตัวอย่างข้างล่าง คือถ้ามีค่า ก็เอาไป And ไม่มีค่า ก็ set เป็น NULL)

3. เรา Create SmartObject ผ่าน Store Procedure ที่เราสร้างผ่าน Smart Object Service Tester (SQL Server Service -> Stored Procedures -> Create Smart Object

4. เมื่อเราได้ Smart Object เราก็ไปสร้าง view ได้ ซึ่งจะมี Method List ไว้ให้เราใช้

5. พอเราสร้าง Form เสร็จ เราก็ไปสร้าง Rules ตอนที่ กด submit Search ให้เอาค่าจาก textbox แต่ละช่องไปเป็น Parameter ใน View ที่เราสร้างมาจาก Store Procedure Smart Object

ซึ่งผลที่ได้ก็คือเป็นการ Execute View Method ที่รับ Parameter ได้หลายตัวนั้นเอง

เราก็เลยทำ Search View แบบหลายๆ Field ได้สะดวกมากๆ

ปล. รูปและเนื้อหาส่วนใหญ่ในนี้เอามาจาก http://community.k2.com/t5/K2-blackpearl/Filter-List-View-based-on-Text-Box-Value/td-p/82761 ซึ่งเขียนดีอยู่แล้ว ไปอ่านกันได้เลย

K2 OnPremise + SharePoint Online

สวัสดีครับชาว K2 Ranger ทุกท่าน

พอดีได้มีโอกาสทำการเชื่อมต่อระหว่าง K2 On Premise กับ SharePoint 365 จึงอยากมาแชร์ช้อมูลครับ

Scenario

  1. มี K2 On Premise
  2. มี SharePoint Team Site อยู่บน Office 365  (เคสนี้ยังไม่ได้ทำ Office 365 เป็นแบบ Hybrid)
  3. ต้องการสร้าง Approval Workflow ในกรณีที่ต้องการเปลี่ยนเบอร์โทรศัพท์ใน Contact List

โดยสิ่งที่เราทำ ก็คือ เราเชื่อมต่อ K2 กับ SharePoint ด้วยการใช้ SharePoint Contant Broker ในการสร้าง Service Instance

K2SPO

ทริกเล็กน้อยคือ การกำหนดค่า “Office 365 – Required”  ให้เป็น “true”  (ค่า default จะเป็น false)

K2SPO-00

หลังจากนั้นก็เหมือนวิธีการปกติเลยครับ ซึ่งจะมีการกำหนด System Name, Display Name, Description, GUID ของ Service Instance แบบที่เคยทำกัน และเราก็จะสามารถสร้าง SmartObject เชื่อมต่อกับ List บน SharePoint Online ได้แล้ว

K2SPO-01

ซึ่งนี้เป็นขั้นตอนที่สำคัญที่สุดแล้วครับ หลังจากการเชื่อมต่อได้แล้ว เราก็จะสามารถเชื่อมกับ List ผ่าน SmartObject ได้ พอเราสร้าง SmartObject ในการเชื่อมต่อได้แล้ว สิ่งที่เหลือก็เพียงแค่การสร้าง SmartForm, Workflow บน K2 On Premise ครับ

K2SPO-02

เพียงเท่านี้ เราก็สามารถ update ค่าจาก K2 SmartForm ของเราไป Update ค่าบน SharePoint 365 ได้ล่ะ

K2SPO-04

K2SPO-03

หวังว่าจะมีประโยชน์บ้างครับ กับลูกค้าที่มี K2 และใช้ SharePoint Online หรือ Office 365

Amornthep Chanajarunwit

Business Development Consultant

[Smart Object] – K2 & MySQL (แบบไทย)

 

สวัสดีครับ ก่อนอื่นต้องขอต้อนรับ นักเขียนหน้าใหม่ ซึ่งขอเป็น Ranger สีดำ คุณโอ๋ แห่งค่าย Venteck นะครับ พอดีคุณโอ๋ มาขอไกด์ไลน์การต่อกับ MySQL แล้วไปลองดู พอได้ความก็เลยเขียนมาเล่าให้เราฟัง เราเห็นว่ามีประโยชน์ดี ก็ไม่รอช้า (จริงๆ ก็นานแล้วแต่เพิ่งมีเวลา) นำมาแปะไว้โดยไว  เชิญเสพโดยพลัน

clip_image002[5]

Continue reading [Smart Object] – K2 & MySQL (แบบไทย)