Thông tin về lịch khai giảng tại Viện đào tạo và quản lý CNTT ROBUSTA Hà nội


Nếu quý khách có yêu cầu chương trình học ngoài lịch khai giảng trên xin vui lòng liên hệ với Robusta

STT

Tên khóa học

Ngày KG

Giờ học

Ngày học

Thời lượng

Học phí

Giảng viên

Các khóa đào tạo công nghệ VMware

1

 Triển khai, quản trị hạ tầng ảo hóa với VMware vSphere 5.5

05-05-2014 18h-21h Thứ 2-6 40 giờ Liên hệ Việt Nam
2
10-05-2014 09h-17h Thứ 7,CN 40 giờ Liên hệ Việt Nam
3
12-05-2014 09h-17h Trong tuần 40 giờ Liên hệ Việt Nam
4

VMware vSphere: Optimize & Scale [v5.1]

26-05-2014 09h-17h Trong tuần

40 giờ

Liên hệ Việt Nam

 

5

Ảo hóa máy trạm và ứng dụng VMware [v5.5]

 

19-05-2014

18h-21h

Trong tuần

40 giờ

Liên hệ

Việt Nam

6

09-06-2014

18h-21h

Thứ 2,4,6

40 giờ

Liên hệ

Việt Nam

 

7

VMware vCenter Configuration Manager for Virtual Infrastructure Management [V5.x]

04-06-2014

09h-17h

Trong tuần

40 giờ

Liên hệ

Nước ngoài

8

VMware vCenter Operations Manager: Analyze and Predict [V5.x]

02-06-2014

09h-17h

Trong tuần

16 giờ

Liên hệ

Nước ngoài

9

VMware vCenter Configuration Manager for Virtual Infrastructure Management [V5.x]

04-06-2014 09h-17h Trong tuần 24 giờ Liên hệ Nước ngoài

Các khóa đào tạo Microsoft

1

Office365 Tổng hợp

 

05-05-2014 09h-17h Trong tuần 24 giờ 06 triệu Việt Nam
2 05-05-2014 18h-21h Thứ 2,4,6 24 giờ 06 triệu Việt Nam
3

 

Manage Projects with Microsoft Project 2010

 

12-05-2014
18h-21h

Thứ 2,4,6

24 giờ 05 triệu Việt Nam
4

Phát triển Biztalk Server dành cho người lập trình

12-05-2014 09-17h

Trong tuần

40 giờ Liên hệ Việt Nam
5

Quản trị Biztalk Server

26-05-2014 09-17h

Trong tuần

40 giờ Liên hệ Việt Nam
6 Phát triển Biztalk trong tích hợp ứng dụng doanh nghiệp 02-06-2014 09-17h Trong tuần 40 giờ Liên hệ Việt Nam
7 02-06-2014 18h-21h Thứ 3,5,7 40 giờ Liên hệ Việt Nam
8 Thiết kế và phát triển Ứng dụng Microsoft Sharepoint 19-05-2014 18h-21h Thứ 2,4,6 40 giờ Liên hệ Việt Nam
9 Thiết kế kiến trúc hạ tầng Microsoft Sharepoint 26-05-2014 09h-17h Trong tuần 40 giờ Liên hệ Việt Nam
10

KHOÁ ĐÀO TẠO NÂNG CAO

ĐIỀU CHỈNH SHAREPOINT 2010 CHO HIỆU SUẤT CAO

23-06-2014 09h-17h Trong tuần 40 giờ Liên hệ Việt Nam
11 Thiết kế các giải pháp BI với  Microsoft SQL Server 09-06-2014 09h-17h Trong tuần 40 giờ Liên hệ Việt Nam
Các khóa đào tạo khác
1 Quản lý CNTT và An toàn thông tin 19-05-2014 09h-17h Trong tuần 40 giờ Liên hệ Việt Nam
2 19-05-2014 18h-21h Thứ 2,4,6 40 giờ Liên hệ Việt Nam
3 IT Management Skills – Các kỹ năng quản lý công nghệ thông tin 16-06-2014 09h- 17h Trong tuần 40 giờ Liên hệ Việt Nam
4 ITIL – Information Technology Infrastructure Library Foundation V3 16-06-2014 18h-21h Thứ 2,4,6
24 giờ Liên hệ Việt Nam
5
Thiết kế Website PHP và HTML5 bằng phương pháp sản xuất công nghiệp
27-4-2014
08h-12h
Chủ nhật
4 giờ
01 triệu
Việt Nam

 

Thông tin ưu đãi:

– Giảm giá đặc biệt cho các học viên đăng ký và thanh toán trước ngày khai giảng tối thiểu 02 tuần hoặc đăng ký nhóm 02 người trở lên.

 

Thông tin chi tiết vui lòng liên hệ:

Lê Trường Sơn (Mr.) – Mobile : (+84) 0904 411 933 – Email: son.le@robusta.vn

Lê Toàn Thắng (Mr.) – Mobile : (+84) 943 851 178 – Email: thang.le@robusta.vn

Xin cám ơn và mong được hợp tác và hỗ trợ Quý Anh/Chị cùng đơn vị trong thời gian tới!

Advertisements

WORKFLOW VÀ INFOPATH TRONG SHAREPOINT 2013 – PHÁT TRIỂN KHÔNG CẦN CODE


1.     Giới thiệu khóa học:

 

         Chúng ta mong đợi gì từ khóa học này,

o   Với 4 ngày học nghiên cứu sâu rồi bắt đầu vào công việc làm lab

o   Một giảng viên chuyên gia về InfoPath và SharePoint Workflow

o   Tham gia vào các lớp học có kinh nghiệm hoặc các lớp học kinh nghiệm Online – tùy theo bạn lựa chọn

o   Sự kết hợp hoàn hoàn giữa bào giảng, chứng minh và các bài lab

o   Một khóa học hướng dẫn phát triển toàn diện bằng bởi các chuyên gia về SharePoint bằng các giải pháp PermierPoint hơn chương trình đào tạo mà các nhà cung cấp đưa ra.

         Bạn sẽ học các nội dung sau:

o   Các ứng dụng InfoPath và sự kết hợp nó với SharePoint Office và SharePoint

o   Các yếu tố trong việc thiết kế form tốt, và tại sao điều đó quan trọng với quá trình kinh doanh của bạn

o   Để làm việc với các trường dũ liệu, các điều kiển form và các lựa chọn form sử dụng thời gian lưu trữ và lý thuật sắp xếp hợp lý.

o   Để đẩy các form InfoPath đến một SharePoint Server từ thư viện

o   Để tùy chỉnh các form danh sách SharePoint với InfoPath

o   Sử dụng các quy định của InfoPath để tự động hoàn thiện các form và cung cấp một kinh nghiệm người dùng một cách năng động

o   Khả năng viết mạnh mẽ, các workflow tùy chỉnh phức tạp mà không cần code sử dụng SharePoint Designer 2013.

o   Để thiết kế và khắc phục sự cố các workflow sử dụng Visio 2013

o   Để sử dụng giúp tăng cường chức năng của nền tảng SharePoint 2013 workflow

         Lợi ích với bạn và tổ chức của bạn:

o   Thực hiện được quá trình tự động hóa trong văn phòng của bạn mà không cần đến chuyên môn lập trình

o   Tạo những khả năng đặc biệt, các hình thức kinh doanh điện tử đặc biệt

o   Giảm thời gian sản suất và thời gian duy trì bằng các sử dụng các phương pháp hiệu quả từ việc tạo ra các form và quản lý.

o   Tạo ra năng lượng, hoàn thành các tiến trình workflow mà không yêu cầu code

o   Tạo điều kiện để các kỹ năng mới của bạn vào công việc một cách đúng nhất.

2.     Đối tượng nên tham gia

         Ai là những người hưởng lợi ích trên:

o   Những người sử dụng năng lượng – người muốn:

+ Tạo ra các dạng số hóa InfoPath để kết nối đến dữ liệu

+ Tạo ra một hệ thống InfoPath với SharePoint

+ Tạo ra các tùy chỉnh workflow trong SharePoint Designer để xử lý kinh doanh một cách tự động

o   Những IT Pros và những người phát triển – thích thú tìm hiểu out-of-the-box, các chức năng không cần code và các tính năng.

3.     Điều kiện tham dự khóa học

         Đã làm quen và có kinh nghiệm với SharePoint 2010 hoặc 2013

         Có kinh nghiệm với InfoPath 2010 hoặc 2013 và SharePoint Designer 2010 hoặc 2013 là một lợi thế nhưng không bắt buộc

4.     Thời lượng

 

Khóa học kéo dài trong 4 ngày

 

5.     Môi trường học tập

         Một khóa học hướng dẫn toàn diện bao gồm nội dung bài giảng, slide PowerPoint, và những bài thực hành

         Không có cài đặt sẵn các phần mềm cần thiết theo yêu cầu ngoại trừ phía khách hàng có các ứng dụng Gotomeeting Online.

         Cho phép bạn truy cập vào các môi trường lab của SharePoint 2013/ Infopath 2013/ Microsoft Office 2013/ SharePoint Designer 2013 qua các máy chủ ảo trong vòng một tuần.

         Mỗi học viên khi tham gia khóa học cần mang một máy laptop có đủ khả năng để đáp ứng yêu cầu cho buổi học.

6.     Nội dung khóa học

 

Ngày

Buổi

Nội dung chính

Thứ nhất

Module 1: Các mẫu và các mẫu InfoPath

         Nhận biết InfoPath là một dạng thiết kế XML và ứng dụng phụ

         Hiểu được sự tích hợp của InfoPath với Microsoft Office và SharePoint

         Biết được những lợi thế và bất lợi của InfoPath so với ASPX

         Tìm hiểu cách mà SharePoint Workflow có thể tự động xử lý kinh doanh

Module 2: Thiết kế các hình thức cho công việc

         Học cách thiết kế một form tốt để có thể cải thiện được tiến trình xử lý và làm tăng tính tuân thủ và chính xác

         Hiểu được vai trò của một form là một bước trong tiến trình xử lý kinh doanh

         Phát triển một phương thức cho form câu hỏi

         Tạo các form thân thiện người dùng – cái đó là thực sự cần thiết trong kinh doanh

 

Module 3: Bắt đầu với InfoPath: Tạo một Form cơ bản

         Chọn một mẫu InfoPath chuẩn cho form

         Tìm hiểu về các tính năng có sẵn trong các form phụ với các form chính

         Lên kế hoạch dưới hình thức các trường dữ liệu, tổ chức và chức năng

         Hiểu được mối quan hệ giữa các trường dữ liệu và các trình điều khiển form

         Tạo một giao diện form

         Sử dụng các phương pháp hiệu quả để phát triển các form

Module 4: Đẩy các Form InfoPath vào SharePoint

  Học các kĩ thuật để đẩy các form vào SharePoint thông qua các phương pháp phân phối khác

   Đẩy một Form mới vào SharePoint và tạo thư viện mẫu trên fly

    Nâng cao các trường form để tạo các cột dữ liệu lớn trong thư viện form

    Tùy chỉnh thư viện form

     Điền và lưu một form cho thư viện form

Module 5: Tạo các kết nối dữ liệu để gửi dữ liệu

         Tìm hiểu về các kết nối dữ liệu trong InfoPath

         Hiểu biết về sự khác nhau giữa gửi một form và lưu một form

         Tạo một kết nối dữ liệu gửi

         Nâng cao trải nghiệm người dùng và quản lý form bằng cách cấu hình các lựa chọn gửi và các lựa chọn nâng cao của Form

Module 6: Tạo các kết nối dữ liệu để nhận dữ liệu

         Hiểu được lợi ích của việc tận dụng các nguồn dữ liệu bên ngoài của form

         Tạo một kết nối dữ liệu nhận

         Cấu hình các điều khiển drop-dow để dử dụng các item trong SharePoint List như là các lựa chọn trường

Thứ hai

Module 7: Sử dụng các hành động và các quy tắc phê duyệt

    Hiểu được cách các quy tắc trong InfoPath có thể tăng cường các chức năng của form và sắp xếp việc nhập dữ liệu một cách tự động

    Tìm hiểu về 3 loại quy tắc

     Tìm hiểu về 4 kích tố có thể khởi động một Rule

    Hiểu được các thành phần của quy tắc logic

    Làm việc với các cửa sổ quản lý quy tắc để đưa ra hành động cho các quy tắc và xác nhận các quy tắc

Module 8: Sử dụng các quy tắc dạng điều kiện

         Hiểu được các dạng điều kiện trong Infopath

         Sử dụng InfoPath View để hỗ trợ phát triển form

         Tạo các Action Rule phức tạp để thực hiện các so sánh theo ngày và các trường ẩn

         Tạo các quy tắc dạng điều kiện để triển khai các KPI đồ họa trong các form dựa trên các so sánh ngày

Module 9: Thúc đẩy vai trò người dùng

         Tìm hiểu cách InfoPath nhận biết người dùng nào đã mở một form và điều đó hữu ích như thế nào.

         Tìm hiểu lý do tại sao việc xây dựng tính năng quyền người dùng trên InfoPath không phải là một lựa chọn tốt nhất cho tất cả các form

         Sử dụng các quy tắc để tìm kiếm dữ liệu người dùng trong một SharePoint List

         Tạo các View định dạng khác nhau cho các đối tượng khác nhau

         Sử dụng các quy tắc để đưa ra một định dạng View chính xác cho người sử dụng dựa trên quyền của họ

         Sử dụng các quy tắc để tạo một tên file linh động cho một định dạng khi nó được gửi đi.

Module  10: SharePoint Workflow

          Hiểu được SharePoint Workflow có thể làm được những gì.

         Tìm hiểu về các lựa chọn khác nhau sẵn sàng cho việc thêm các Workflow vào SharePoint.

         Hiểu được phạm vi của các lựa chọn, đặc biệt là các workflow không có code của SharePoint Designer.

Module 11: Bắt đầu với tùy chỉnh các WorkFlow của SharePoint Designer

         Hiểu được 3 loại workflow của SharePoint

         Hiểu được tính logic và kiến trúc của workflow

         Lên kế hoạch cho workflow

         Cấu hình các cài đặt và các lựa chọn bắt đầu cho workflow List

         Tìm hiểu về cac cải tiến quy trình làm việc trong nền tảng quản lý Workflow của tùy chọn SharePoint 2013.

         Tạo, kiểm tra và sửa đổi một workflow cơ bản

         Hiểu được các trường hợp trong workflow

         Xem lịch sử các trường hợp trong workflow

Module 12: Quản lý các Workflow của SharePoint

         Làm việc với các thiết lập của List/Library trong workflow

         Dừng, phục hồi và loại bỏ các workflow

         Xem lịch sử đăng nhập ẩn của một workflow

Thứ ba

Module 13: Làm việc với các điều kiện, Logic và các tìm kiếm trong Workflow

         Sử dụng các điều kiện để tạo ra logic nhánh

         Hiểu được các nhóm của các hành động sẵn có cho các kiểu khác nhau của workflow

         Cấu hình một workflow để thực hiện các tính toán và các biến

         Nâng cấp các cột dữ liệu lớn các List/Library với một workflow

Module 14: Gửi Email và nâng cấp các trường định dạng trong InfoPath với một Workflow

         Sử dụng các Workflow để gửi các thông báo email – bao gồm các thông tin động

         Tìm hiểu các lời khuyên cho việc giải quyết sự cố trong cáo email workflow

         Nâng cấp các trường định dạng dữ liệu trong InfoPath thông qua một Workflow

Module 15: Tạo các tác vụ với một workflow

         Hiểu được cách làm mà workflow có thể tạo ra các tác vụ trong SharePoint

         Tìm hiểu các lựa chọn khác nhau cho việc sử dụng các tác vụ được sinh ra từ workflow

         Tạo và kiểm tra một workflow – cái đã thêm các tác vụ vào một danh sách tác vụ trong SharePoint

Module 16: Sử dụng các định dạng InfoPath Brower và các dịch vụ SharePoint định dạng

         Hiểu vể các dịch vụ định dạng doanh nghiệp trong SharePoint Server

         Tìm hiểu các công nghệ và các giới hạn của các đinh dạng InfoPath Browser

         Tạo một định dạng Infopath sử dụng các hình thức trình duyệt mẫu

         Cấu hình các lựa chọn Form để nâng cao khả năng người dùng

Module 17: Các dịch vụ Web và cơ sở dữ liệu hồ sơ người dùng

         Tìm hiểu về việc kết nối InfoPath đến các nguồn tài nguyên bên ngoài của các SharePoint site

         Hiểu được các dịch vụ Web

         Tạo một kết nối nhận dữ liệu cho dịch vụ web của cơ sở dữ liệu hồ sơ người dùng SharePoint

         Sử dụng các quy tắc trong InfoPth để phổ biến các trường thông tin người dùng từ cơ sở dữ liệu hồ sơ người dùng SharePoint

Module 18: Truy cập đến dữ liệu SQL thông qua các loại nội dung bên ngoài và các danh sách bên ngoài

         Tìm hiểu về các vấn đề an ninh để làm việc với các dữ liệu bên ngoài trong SharePoint

         Hiểu được cách sử dụng SharePoint như là một front-end cho các dữ liệu SQL thông qua các danh sách bên ngoài.

         Tạo một loại nội dung bên ngoài và một danh sách bên ngoài trong SharePoint Designer

         Thêm các kết nối dữ liệu đến một định dạng của InfoPath để sử dụng dữ liệu trong danh sách bên ngoài.

Thứ tư

Modue 19: Sử dụng Visio Professional 2013 để thiết kế và giải quyết các sự cố trong các workflow

    Tìm hiểu về việc thêm các hoạt động và các tính năng có sẵn cho các workflow

    Thiết kế một workflow sử dụng Visio Proffesional 2013 cho việc định tuyến và cập nhật dữ liệu

    Nhập một thiết kế workflow bằng Visio vào SharePoint Designer và hoàn thành workflow

    Xuất bản và kiểm tra workflow

Module 20: Tùy chỉnh các định dạng Item trong sharePoint List với InfoPath

         Tùy chỉnh định dạng cho một SharePoint List với InfoPath

         Tạo các điều khiển tầng drop-down

         Thêm các điều khiển lặp lại bảng

         Xuất bản định dạng đã được tùy chỉnh và cấu hình các lựa chọn dữ liệu lặp lại

Module 21: Công bố các định dạng InfoPath được xem như là các kiểu nội dung

         Hiểu về các kiểu nội dung trong SharePoint

         Tạo một định dạng Infopath dựa trên một fle XML

         Công bố định dạng đó như là một kiểu nội dung

Module 22:  Kết hợp các workflow có thể tái sử dụng thành một tổng thể

   Hiểu về các workflow tái sử dụng là các workflow có thể tái sử dụng tổng thể

   Sử dụng App Step trong một workflow để khắc phục các hạn chế theo một cách an toàn

   Thêm mộ workflow có thể tái sử dụng tổng thể vào một workflow cho khách hàng và chỉnh sửa nó

Module 23: Lưu trữ định dạng dữ liệu cho SQL thông qua một Web Service

         Tạo một định dạng Infopath sử dụng các mẫu Web Service

         Đẩy form đó đến một thư viện Form mới của SharePoint

         Tùy chỉnh tiêu đề trang chủ SharePoint và thêm định dạng InfoPath vào Web Part.

         Mở SQL để kiểm chứng dữ liệu

 

 

Tổng kết và bế giảng lớp học

 

 

Sửa Workflow trong MojoPortal


MojoPortal đã thiết kế sẵn trường “DraftEditOnlyRoles” của bảng Pages và “DraftEditRoles” của bảng Modules. Đây là 2 quyền cho phép User chỉ có quyền được viết Draft và sửa Draft của mình.

– Đầu tiên chúng ta cần sửa lại ModuleTile để cho phép những User có quyền được viết Draft có thể nhìn thấy Link Add/Edit.

– Cấu hình Cho phép người sử dụng vào phần thêm bài mới.

– Cho phép những User có quyền EditDraft được sửa các bài Draft của mình.

1. Cho phép Role Draft thấy link Add/Edit:

Ta sẽ sửa File CS: mojoPortal.Web\Controls\SiteModuleControl.cs .

<những phần màu đỏ là những phần thêm vào trong Code>

namespace mojoPortal.Web

{

#if !MONO

public abstract class SiteModuleControl : mojoUserControl, IWebPart

#else

public abstract class SiteModuleControl : UserControl

#endif

{

private Module moduleConfiguration;

private bool isEditable = false;

//sử dụng biến isAddNew để kiểm tra xem User có thuộc Roles có quyền //được viết Draft trong Page hoặc Module hay không.

private bool isAddNew = false;

private bool forbidModuleSettings = false;

private int siteID = -1;

private Hashtable settings;

private bool renderInWebPartMode = false;

private string imageSiteRoot = string.Empty;

private bool isSiteEditor = false;

private bool enableWorkflow = false;

private bool IsOnInitExecuted = false;

protected PageSettings currentPage;

protected SiteSettings siteSettings;

protected ScriptManager ScriptController;

protected override void OnInit(EventArgs e)

{

// Alexander Yushchenko: workaround to make old custom modules work

// Before 03.19.2007 this method was “new” and called from descendant classes

// To avoid multiple self-calls a boolean flag is used

if (IsOnInitExecuted) return;

IsOnInitExecuted = true;

base.OnInit(e);

if (HttpContext.Current == null) { return; }

siteSettings = CacheHelper.GetCurrentSiteSettings();

currentPage = CacheHelper.GetCurrentPage();

ScriptController = (ScriptManager)Page.Master.FindControl(“ScriptManager1”);

if (siteSettings != null)

{

this.siteID = siteSettings.SiteId;

if (!WebUser.IsAdminOrContentAdmin)

{

forbidModuleSettings = WebUser.IsInRoles(siteSettings.RolesNotAllowedToEditModuleSettings);

}

}

if (Page.Request.IsAuthenticated)

{

isSiteEditor = SiteUtils.UserIsSiteEditor();

if (WebUser.IsAdminOrContentAdmin || isSiteEditor || WebUser.IsInRoles(currentPage.EditRoles)

|| ((moduleConfiguration != null)

&& (WebUser.IsInRoles(moduleConfiguration.AuthorizedEditRoles))

)

)

{

isEditable = true;

}

// kiểm tra User có quyền được DraftEditRoles trong Page hoặc Module:

if (WebUser.IsInRoles(currentPage.DraftEditOnlyRoles)

|| ((moduleConfiguration != null)

&& (WebUser.IsInRoles(moduleConfiguration.DraftEditRoles))

)

)

{

isAddNew = true;

}

if (WebConfigSettings.EnableContentWorkflow && siteSettings.EnableContentWorkflow && (this is IWorkflow))

{

enableWorkflow = true;

if (!isEditable)

{

if ((WebUser.IsInRoles(currentPage.DraftEditOnlyRoles)) || (WebUser.IsInRoles(moduleConfiguration.DraftEditRoles)))

{

isEditable = true;

}

}

}

if (!isEditable && (moduleConfiguration != null) && (moduleConfiguration.EditUserId > 0))

{

SiteUser siteUser = SiteUtils.GetCurrentSiteUser();

if (

(siteUser != null)

&&(moduleConfiguration.EditUserId == siteUser.UserId)

)

{

isEditable = true;

}

}

}

if (moduleConfiguration != null)

{

this.m_title = moduleConfiguration.ModuleTitle;

this.m_description = moduleConfiguration.FeatureName;

}

}

#if !MONO

[Personalizable(PersonalizationScope.Shared)]

#endif

public bool RenderInWebPartMode

{

get { return renderInWebPartMode; }

set { renderInWebPartMode = value; }

}

#if !MONO

[Personalizable(PersonalizationScope.Shared)]

#endif

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public int ModuleId

{

get { return moduleConfiguration == null ? 0 : moduleConfiguration.ModuleId; }

set

{

if (moduleConfiguration == null) moduleConfiguration = new Module(value);

moduleConfiguration.ModuleId = value;

}

}

public Guid ModuleGuid

{

get { return moduleConfiguration == null ? Guid.Empty : moduleConfiguration.ModuleGuid; }

set

{

if (moduleConfiguration == null) moduleConfiguration = new Module(value);

moduleConfiguration.ModuleGuid = value;

}

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public int PageId

{

get { return moduleConfiguration == null ? 0 : moduleConfiguration.PageId; }

}

public string SiteRoot

{

get

{

if ((siteSettings != null)

&&(siteSettings.SiteFolderName.Length > 0))

{

return siteSettings.SiteRoot;

}

return WebUtils.GetSiteRoot();

}

}

public string ImageSiteRoot

{

get

{

if (imageSiteRoot.Length == 0)

{

imageSiteRoot = WebUtils.GetSiteRoot();

}

return imageSiteRoot;

}

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public int SiteId

{

get { return siteID; }

set { siteID = value; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public bool IsEditable

{

get { return isEditable; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public bool IsAddNew

{

get { return isAddNew; }

}

public bool ForbidModuleSettings

{

get { return forbidModuleSettings; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public bool EnableWorkflow

{

get { return enableWorkflow; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public Module ModuleConfiguration

{

get { return moduleConfiguration; }

set { moduleConfiguration = value; }

}

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

public Hashtable Settings

{

get

{

if (settings == null) settings = ModuleSettings.GetModuleSettings(ModuleId);

return settings;

}

}

#region IWebPart Members

private string m_title = String.Empty;

private string m_subTitle = String.Empty;

private string m_description = String.Empty;

private string m_titleUrl = String.Empty;

private string m_titleIconImageUrl = String.Empty;

private string m_catalogIconImageUrl = String.Empty;

// Title

public string Title

{

get

{

return m_title;

}

set

{

m_title = value;

}

}

// Subtitle

public string Subtitle

{

get

{

return m_subTitle;

}

set

{

m_subTitle = value;

}

}

// Description

public string Description

{

get

{

return m_description;

}

set

{

m_description = value;

}

}

// TitleUrl

public string TitleUrl

{

get

{

return m_titleUrl;

}

set

{

m_titleUrl = value;

}

}

// TitleIconImageUrl

public string TitleIconImageUrl

{

get

{

return m_titleIconImageUrl;

}

set

{

m_titleIconImageUrl = value;

}

}

// CatalogIconImageUrl

public string CatalogIconImageUrl

{

get

{

return m_catalogIconImageUrl;

}

set

{

m_catalogIconImageUrl = value;

}

}

#endregion

}

}

Sửa file CS: mojoPortal.Web\Controls\ModuleTitleControl.cs

<những phần màu đỏ là những phần thêm vào trong Code>

namespace mojoPortal.Web.UI

{

public class ModuleTitleControl : WebControl, INamingContainer

{

#region Constructors

public ModuleTitleControl()

{

//if (this.Site != null && this.Site.DesignMode)

//{

// this.Visible = false;

// return;

//}

if (HttpContext.Current == null) { return; }

EnsureChildControls();

}

#endregion

#region Control Declarations

protected Literal litModuleTitle;

protected HyperLink lnkModuleSettings;

protected HyperLink lnkModuleEdit;

protected ImageButton ibPostDraftContentForApproval;

protected ImageButton ibApproveContent;

protected HyperLink lnkRejectContent;

protected ImageButton ibCancelChanges;

protected ClueTipHelpLink statusLink;

#endregion

private string literalExtraMarkup = string.Empty;

private bool disabledModuleSettingsLink = false;

private Module module = null;

private string editUrl = string.Empty;

private string editText = string.Empty;

//private bool useHTag = true;

private bool canEdit = false;

//khai báo biến canAdd cho phép hiển thị Link Add/Edit

private bool canAdd = false;

private bool forbidModuleSettings = false;

private bool showEditLinkOverride = false;

private bool enableWorkflow = false;

private SiteModuleControl siteModule = null;

private ContentWorkflowStatus workflowStatus = ContentWorkflowStatus.None;

private string siteRoot = string.Empty;

private bool isAdminEditor = false;

private bool useHeading = true;

private string columnId = UIHelper.CenterColumnId;

private string artHeader = UIHelper.ArtisteerPostMetaHeader;

private string artHeadingCss = UIHelper.ArtPostHeader;

#region Public Properties

public Module ModuleInstance

{

get { return module; }

set { module = value; }

}

public string LiteralExtraMarkup

{

get { return literalExtraMarkup; }

set { literalExtraMarkup = value; }

}

public string EditUrl

{

get { return editUrl; }

set { editUrl = value; }

}

public string EditText

{

get { return editText; }

set { editText = value; }

}

public bool UseHeading

{

get { return useHeading; }

set { useHeading = value; }

}

public bool DisabledModuleSettingsLink

{

get { return disabledModuleSettingsLink; }

set { disabledModuleSettingsLink = value; }

}

public bool CanEdit

{

get { return canEdit; }

set { canEdit = value; }

}

public bool CanAdd

{

get { return canAdd; }

set { canAdd = value; }

}

public bool IsAdminEditor

{

get { return isAdminEditor; }

set { isAdminEditor = value; }

}

public bool ShowEditLinkOverride

{

get { return showEditLinkOverride; }

set { showEditLinkOverride = value; }

}

public ContentWorkflowStatus WorkflowStatus

{

get { return workflowStatus; }

set { workflowStatus = value; }

}

private bool renderArtisteer = false;

public bool RenderArtisteer

{

get { return renderArtisteer; }

set { renderArtisteer = value; }

}

private bool useLowerCaseArtisteerClasses = false;

public bool UseLowerCaseArtisteerClasses

{

get { return useLowerCaseArtisteerClasses; }

set { useLowerCaseArtisteerClasses = value; }

}

#endregion

private SiteModuleControl GetParentAsSiteModelControl(Control child)

{

if (HttpContext.Current == null) { return null; }

if (child.Parent == null)

{

return null;

}

else if (child.Parent is SiteModuleControl)

{

return child.Parent as SiteModuleControl;

}

else

{

return GetParentAsSiteModelControl(child.Parent);

}

}

protected override void Render(HtmlTextWriter writer)

{

if (HttpContext.Current == null)

{

writer.Write(“[” + this.ID + “]”);

return;

}

else

{

if ((useHeading)&&(renderArtisteer))

{

writer.Write(“<div class=\”” + artHeader + “\”>\n”);

if ((artHeader == UIHelper.ArtisteerBlockHeader)||(artHeader == UIHelper.ArtisteerBlockHeaderLower))

{

writer.Write(“<div class=\”l\”></div>”);

writer.Write(“<div class=\”r\”></div>”);

writer.Write(“<div class=\”art-header-tag-icon\”>”);

writer.Write(“<div class=\”t\”>”);

}

}

if (module != null)

{

writer.Write(“<a id=’module” + module.ModuleId.ToString(CultureInfo.InvariantCulture) + “‘></a>”);

}

string headingTag = WebConfigSettings.ModuleTitleTag;

if ((useHeading)&&(headingTag.Length > 0))

{

writer.WriteBeginTag(headingTag);

writer.WriteAttribute(“class”, artHeadingCss + ” moduletitle”);

writer.Write(HtmlTextWriter.TagRightChar);

}

litModuleTitle.RenderControl(writer);

if (CanEdit)

{

if (!forbidModuleSettings)

{

writer.Write(HtmlTextWriter.SpaceChar);

lnkModuleSettings.RenderControl(writer);

}

if (ibCancelChanges != null && ibCancelChanges.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

ibCancelChanges.RenderControl(writer);

}

if (ibPostDraftContentForApproval != null && ibPostDraftContentForApproval.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

ibPostDraftContentForApproval.RenderControl(writer);

}

if (lnkRejectContent != null && lnkRejectContent.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

lnkRejectContent.RenderControl(writer);

}

if (ibApproveContent != null && ibApproveContent.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

ibApproveContent.RenderControl(writer);

}

if (statusLink != null && statusLink.Visible)

{

writer.Write(HtmlTextWriter.SpaceChar);

statusLink.ToolTip = Resource.WorkflowStatus;

statusLink.RenderControl(writer);

}

}

if (

(lnkModuleEdit != null)

&& (EditUrl != null)

&& (EditText != null)

)

{

writer.Write(HtmlTextWriter.SpaceChar);

lnkModuleEdit.RenderControl(writer);

}

if (literalExtraMarkup.Length > 0)

{

writer.Write(literalExtraMarkup);

}

if ((useHeading)&&(headingTag.Length > 0))

{

writer.WriteEndTag(headingTag);

}

if ((useHeading) && (renderArtisteer))

{

writer.Write(“</div>”);

if ((artHeader == UIHelper.ArtisteerBlockHeader) || (artHeader == UIHelper.ArtisteerBlockHeaderLower))

{

writer.Write(“</div>”);

writer.Write(“</div>”);

}

}

}

}

void ibApproveContent_Click(object sender, ImageClickEventArgs e)

{

SiteModuleControl siteModule = GetParentAsSiteModelControl(this);

if (siteModule == null) { return; }

if (!(siteModule is IWorkflow)) { return; }

IWorkflow workflow = siteModule as IWorkflow;

workflow.Approve();

}

protected void ibPostDraftContentForApproval_Click(object sender, ImageClickEventArgs e)

{

SiteModuleControl siteModule = GetParentAsSiteModelControl(this);

if (siteModule == null) { return; }

if (!(siteModule is IWorkflow)) { return; }

IWorkflow workflow = siteModule as IWorkflow;

workflow.SubmitForApproval();

}

protected void ibCancelChanges_Click(object sender, ImageClickEventArgs e)

{

SiteModuleControl siteModule = GetParentAsSiteModelControl(this);

if (siteModule == null) { return; }

if (!(siteModule is IWorkflow)) { return; }

IWorkflow workflow = siteModule as IWorkflow;

workflow.CancelChanges();

}

protected override void OnPreRender(EventArgs e)

{

base.OnPreRender(e);

if (HttpContext.Current == null) { return; }

if ((useHeading) && (renderArtisteer))

{

columnId = this.GetColumnId();

if (useLowerCaseArtisteerClasses)

{

artHeader = UIHelper.ArtisteerPostMetaHeaderLower;

artHeadingCss = UIHelper.ArtPostHeaderLower;

}

switch (columnId)

{

case UIHelper.LeftColumnId:

case UIHelper.RightColumnId:

if (useLowerCaseArtisteerClasses)

{

if ((artHeader == UIHelper.ArtisteerPostMetaHeader)||(artHeader == UIHelper.ArtisteerPostMetaHeaderLower))

{

artHeader = UIHelper.ArtisteerBlockHeaderLower;

}

}

else

{

if (artHeader == UIHelper.ArtisteerPostMetaHeader)

{

artHeader = UIHelper.ArtisteerBlockHeader;

}

}

artHeadingCss = string.Empty;

break;

case UIHelper.CenterColumnId:

default:

break;

}

}

Initialize();

}

private void Initialize()

{

if (HttpContext.Current == null) { return; }

siteModule = GetParentAsSiteModelControl(this);

bool useTextLinksForFeatureSettings = true;

mojoBasePage basePage = Page as mojoBasePage;

if (basePage != null)

{

useTextLinksForFeatureSettings = basePage.UseTextLinksForFeatureSettings;

}

if (siteModule != null)

{

module = siteModule.ModuleConfiguration;

CanEdit = siteModule.IsEditable;

CanAdd = siteModule.IsAddNew;

enableWorkflow = siteModule.EnableWorkflow;

forbidModuleSettings = siteModule.ForbidModuleSettings;

}

if (module != null)

{

if (module.ShowTitle)

{

litModuleTitle.Text = Page.Server.HtmlEncode(module.ModuleTitle);

}

else

{

useHeading = false;

}

if (CanEdit)

{

if (!disabledModuleSettingsLink)

{

lnkModuleSettings.Visible = true;

lnkModuleSettings.Text = Resource.SettingsLink;

lnkModuleSettings.ToolTip = Resource.ModuleEditSettings;

if (!useTextLinksForFeatureSettings)

{

lnkModuleSettings.ImageUrl = Page.ResolveUrl(“~/Data/SiteImages/” + WebConfigSettings.EditPropertiesImage);

}

else

{

// if its a text link make it small like the edit link

lnkModuleSettings.CssClass = “ModuleEditLink”;

}

siteRoot = SiteUtils.GetNavigationSiteRoot();

lnkModuleSettings.NavigateUrl = siteRoot

+ “/Admin/ModuleSettings.aspx?mid=” + module.ModuleId.ToInvariantString()

+ “&pageid=” + module.PageId.ToInvariantString();

if ((enableWorkflow) && (siteModule != null) && (siteModule is IWorkflow))

{

SetupWorkflowControls();

}

}

}

// thêm CanAdd=true thì sẽ hiện Link Add/Edit

if (

((CanEdit) || (ShowEditLinkOverride) || (CanAdd))

&& ((EditText != null) && (EditUrl != null)))

{

lnkModuleEdit.Text = EditText;

if (this.ToolTip.Length > 0)

{

lnkModuleEdit.ToolTip = this.ToolTip;

}

else

{

lnkModuleEdit.ToolTip = EditText;

}

lnkModuleEdit.NavigateUrl = EditUrl

+ “?mid=” + module.ModuleId.ToInvariantString()

+ “&pageid=” + module.PageId.ToInvariantString();

if (!useTextLinksForFeatureSettings)

{

lnkModuleEdit.ImageUrl = Page.ResolveUrl(“~/Data/SiteImages/” + WebConfigSettings.EditContentImage);

}

}

}

}

private void SetupWorkflowControls()

{

if (HttpContext.Current == null) { return; }

if (siteModule == null) { return; }

if (module == null) { return; }

CmsPage cmsPage = this.Page as CmsPage;

if ((cmsPage != null) && (cmsPage.ViewMode == PageViewMode.WorkInProgress))

{

switch (workflowStatus)

{

case ContentWorkflowStatus.Draft:

ibPostDraftContentForApproval.ImageUrl = Page.ResolveUrl(WebConfigSettings.RequestApprovalImage);

ibPostDraftContentForApproval.ToolTip = Resource.RequestApprovalToolTip;

ibPostDraftContentForApproval.Visible = true;

statusLink.HelpKey = “workflowstatus-draft-help”;

break;

case ContentWorkflowStatus.AwaitingApproval:

//if (WebUser.IsAdminOrContentAdminOrContentPublisher)

if(

(cmsPage.CurrentPage != null)

&&(

(isAdminEditor || WebUser.IsInRoles(cmsPage.CurrentPage.EditRoles)) || (WebUser.IsInRoles(this.module.AuthorizedEditRoles))

)

)

{

//add in the reject and approve links:

ibApproveContent.ImageUrl = Page.ResolveUrl(WebConfigSettings.ApproveContentImage);

ibApproveContent.Visible = true;

ibApproveContent.ToolTip = Resource.ApproveContentToolTip;

lnkRejectContent.NavigateUrl =

siteRoot

+ “/Admin/RejectContent.aspx?mid=” + module.ModuleId.ToInvariantString()

+ “&pageid=” + module.PageId.ToInvariantString();

lnkRejectContent.ImageUrl = Page.ResolveUrl(WebConfigSettings.RejectContentImage);

lnkRejectContent.ToolTip = Resource.RejectContentToolTip;

lnkRejectContent.Visible = true;

}

statusLink.HelpKey = “workflowstatus-awaitingapproval-help”;

break;

case ContentWorkflowStatus.ApprovalRejected:

statusLink.HelpKey = “workflowstatus-rejected-help”;

break;

}

if (

(workflowStatus != ContentWorkflowStatus.Cancelled)

&& (workflowStatus != ContentWorkflowStatus.Approved)

&& (workflowStatus != ContentWorkflowStatus.None)

)

{

//allow changes to be cancelled:

ibCancelChanges.ImageUrl = Page.ResolveUrl(WebConfigSettings.CancelContentChangesImage);

ibCancelChanges.ToolTip = Resource.CancelChangesToolTip;

ibCancelChanges.Visible = true;

}

}

}

protected override void CreateChildControls()

{

if (HttpContext.Current == null) { return; }

litModuleTitle = new Literal();

//this.Controls.Add(litModuleTitle);

lnkModuleSettings = new HyperLink();

lnkModuleSettings.CssClass = “modulesettingslink”;

//this.Controls.Add(lnkModuleSettings);

lnkModuleEdit = new HyperLink();

//this.Controls.Add(lnkModuleEdit);

lnkModuleEdit.CssClass = “ModuleEditLink”;

lnkModuleEdit.SkinID = “plain”;

ibPostDraftContentForApproval = new ImageButton();

ibPostDraftContentForApproval.ID = “lbPostDraftContentForApproval”;

ibPostDraftContentForApproval.CssClass = “ModulePostDraftForApprovalLink”;

ibPostDraftContentForApproval.SkinID = “plain”;

ibPostDraftContentForApproval.Visible = false;

ibPostDraftContentForApproval.Click += new ImageClickEventHandler(ibPostDraftContentForApproval_Click);

this.Controls.Add(ibPostDraftContentForApproval);

ibApproveContent = new ImageButton();

ibApproveContent.ID = “ibApproveContent”;

ibApproveContent.CssClass = “ModuleApproveContentLink”;

ibApproveContent.SkinID = “plain”;

ibApproveContent.Visible = false;

ibApproveContent.Click += new ImageClickEventHandler(ibApproveContent_Click);

this.Controls.Add(ibApproveContent);

lnkRejectContent = new HyperLink();

lnkRejectContent.ID = “ibRejectContent”;

lnkRejectContent.CssClass = “ModuleRejectContentLink”;

lnkRejectContent.SkinID = “plain”;

lnkRejectContent.Visible = false;

ibCancelChanges = new ImageButton();

ibCancelChanges.ID = “ibCancelChanges”;

ibCancelChanges.CssClass = “ModuleCancelChangesLink”;

ibCancelChanges.SkinID = “plain”;

ibCancelChanges.Visible = false;

UIHelper.AddConfirmationDialog(ibCancelChanges, Resource.CancelContentChangesButtonWarning);

ibCancelChanges.Click += new ImageClickEventHandler(ibCancelChanges_Click);

this.Controls.Add(ibCancelChanges);

statusLink = new ClueTipHelpLink();

this.Controls.Add(statusLink);

}

}

}

2. Cho phép những User có quyền Draft được vào thêm và sửa bài:

Sửa File CS: Web\Components\MojoBasePage.cs

<phần màu đỏ là được thêm vào>

//Ta sửa lại Method UserCanEditModule, Method này cho phép những User //có Roles Admin hoặc Edit Page và Mudole sẽ trả về true. Ta thêm những //User có Roles Draft của Page và Module cũng trả vè True.

public bool UserCanEditModule(int moduleId)

{

if(!Request.IsAuthenticated)return false;

if (WebUser.IsAdminOrContentAdmin) return true;

if (SiteUtils.UserIsSiteEditor()) { return true; }

if (CurrentPage == null) return false;

bool moduleFoundOnPage = false;

foreach (Module m in CurrentPage.Modules)

{

if (m.ModuleId == moduleId) moduleFoundOnPage = true;

}

if (!moduleFoundOnPage) return false;

if (WebUser.IsInRoles(CurrentPage.EditRoles)) return true;

//

if (WebUser.IsInRoles(CurrentPage.DraftEditOnlyRoles)) return true;

SiteUser currentUser = SiteUtils.GetCurrentSiteUser();

if (currentUser == null) return false;

foreach (Module m in CurrentPage.Modules)

{

if (m.ModuleId == moduleId)

{

if (m.EditUserId == currentUser.UserId) return true;

if (WebUser.IsInRoles(m.AuthorizedEditRoles)) return true;

if (WebUser.IsInRoles(m.DraftEditRoles)) return true;

}

}

return false;

}

//Thêm Method: kiểm tra xem những User có quyền được vào Thêm và Sửa bài có phải là User có Roles Draft hay không, nếu đúng tra về true.

public bool USerCanpublish(int moduleId)

{

if (WebUser.IsAdminOrContentAdmin) return true;

if (SiteUtils.UserIsSiteEditor()) { return true; }

if (WebUser.IsInRoles(CurrentPage.EditRoles)) return true;

//

if (WebUser.IsInRoles(CurrentPage.DraftEditOnlyRoles)) return false;

SiteUser currentUser = SiteUtils.GetCurrentSiteUser();

foreach (Module m in CurrentPage.Modules)

{

if (m.ModuleId == moduleId)

{

if (m.EditUserId == currentUser.UserId) return true;

if (WebUser.IsInRoles(m.AuthorizedEditRoles)) return true;

if (WebUser.IsInRoles(m.DraftEditRoles)) return false;

}

}

return false;

}

Sửa File : mojoPortal.Features.UI\Blog\EditPost.aspx.cs

<phần màu đỏ là được thêm vào>

//sửa trong Page_Load. Sử dụng USerDraft ở trang MojoBasePage.cs

private void Page_Load(object sender, EventArgs e)

{

if (!Request.IsAuthenticated)

{

SiteUtils.RedirectToLoginPage(this);

return;

}

//nếu những User có Roles Draft thì sẽ ẩn đi các control

if (!USerCanpublish(moduleId))

{

chkIsPublished.Visible = false;

chkIsPublished.Checked = false;

btnAddCategory.Visible = false;

txtCategory.Visible = false;

lnkEditCategories.Visible = false;

}

SecurityHelper.DisableBrowserCache();

LoadParams();

if (!UserCanEditModule(moduleId))

{

SiteUtils.RedirectToEditAccessDeniedPage();

return;

}

if (ScriptController != null)

{

ScriptController.RegisterAsyncPostBackControl(btnAddCategory);

}

else

{

log.Error(“ScriptController was null”);

}

LoadSettings();

PopulateLabels();

SetupScripts();

if ((!Page.IsPostBack) && (!Page.IsCallback))

{

if ((Request.UrlReferrer != null) && (hdnReturnUrl.Value.Length == 0))

{

hdnReturnUrl.Value = Request.UrlReferrer.ToString();

lnkCancel.NavigateUrl = Request.UrlReferrer.ToString();

lnkCancel2.NavigateUrl = lnkCancel.NavigateUrl;

lnkCancel3.NavigateUrl = lnkCancel.NavigateUrl;

}

PopulateControls();

PopulateCategories();

BindMeta();

BindMetaLinks();

}

}

//sửa Method LoadParams: những User chỉ có quyền viết Draft thì //sẽ chỉ sửa được các bài viết Draft của mình khi chưa được //publish. Còn nếu như cố gắng vào thì sẽ vào phần thêm mới chứ //không phải sửa.

private void LoadParams()

{

timeOffset = SiteUtils.GetUserTimeOffset();

pageId = WebUtils.ParseInt32FromQueryString(“pageid”, -1);

moduleId = WebUtils.ParseInt32FromQueryString(“mid”, -1);

itemId = WebUtils.ParseInt32FromQueryString(“ItemID”, -1);

restoreGuid = WebUtils.ParseGuidFromQueryString(“r”, restoreGuid);

cacheDependencyKey = “Module-” + moduleId.ToString(CultureInfo.InvariantCulture);

virtualRoot = WebUtils.GetApplicationRoot();

//txtCategory.Text = itemId.ToString();

if (itemId > -1)

{

blog = new Blog(itemId);

bool ispublish = blog.IsPublished;

Guid userGuidBlog;

Guid userGuidCurrent;

SiteUser siteUserCurrent = SiteUtils.GetCurrentSiteUser();

userGuidBlog = blog.UserGuid;

userGuidCurrent = siteUserCurrent.UserGuid;

if (!USerCanpublish(moduleId))

{

if (!userGuidCurrent.Equals(userGuidBlog) || ispublish)

{

itemId = -1;

blog = null;

}

}

}

if (moduleId > -1)

{

moduleSettings = ModuleSettings.GetModuleSettings(moduleId);

if (moduleSettings.Contains(“OdiogoFeedIDSetting”))

OdiogoFeedIDSetting = moduleSettings[“OdiogoFeedIDSetting”].ToString();

}

}

3. Cho phép những User có Roles Draft thì sẽ hiển thị Link EditDraft ở Module Blog khi có bài Draft của người đó, chỉ nhìn được các bài Draft của mình.

Phần này tôi sửa toàn bộ file Drafts.aspx trong: mojoPortal.Features.UI\Blog.

Bạn chạy file ProcedureDraftBlog.sql trong MSSQL

Import 2 file dll: hungtn.Business.dll và hungtn.Data.dll

Sửa lại code theo 3 file Drafts.aspx

Sửa file mojoPortal.Features.UI\Blog\ BlogModule.ascx.cs

Phần này cho phép hiện thị link EditDraft trong Module Blog.

Nếu những User có quyền Draft sẽ thấy link EditDraft nếu số bài trong Draft của người đó >0.

namespace mojoPortal.Web.BlogUI

{

public partial class BlogModule : SiteModuleControl

{

#region Properties

private static readonly ILog log = LogManager.GetLogger(typeof(BlogModule));

private int countOfDrafts = 0;

//đếm số bài Draft của User đăng nhập

private int countOfDraftsCreateByUser = 0;

private int pageNumber = 1;

private int totalPages = 1;

private int pageSize = 10;

private bool showPager = true;

private string instanceCssClass = string.Empty;

protected string addThisAccountId = string.Empty;

protected bool useAddThisMouseOverWidget = true;

protected string addThisCustomBrand = string.Empty;

protected string addThisButtonImageUrl = “~/Data/SiteImages/addthissharebutton.gif”;

protected string addThisCustomOptions = string.Empty;

protected string addThisCustomLogoUrl = string.Empty;

protected string addThisCustomLogoBackColor = string.Empty;

protected string addThisCustomLogoForeColor = string.Empty;

protected string feedburnerFeedUrl = string.Empty;

protected string EditContentImage = WebConfigSettings.EditContentImage;

protected string EditBlogAltText = “Edit”;

protected string BlogDateTimeFormat;

protected string FeedBackLabel;

protected bool ShowCalendar = false;

protected DateTime CalendarDate;

protected bool ShowCategories = false;

protected bool ShowArchives = false;

protected bool AllowComments = true;

protected bool NavigationOnRight = false;

protected bool ShowStatistics = true;

protected bool ShowFeedLinks = true;

protected bool ShowAddFeedLinks = true;

protected bool BlogUseLinkForHeading = true;

protected Double TimeOffset = 0;

protected string GmapApiKey = string.Empty;

protected int GoogleMapHeightSetting = 300;

protected int GoogleMapWidthSetting = 500;

protected bool GoogleMapEnableMapTypeSetting = false;

protected bool GoogleMapEnableZoomSetting = false;

protected bool GoogleMapShowInfoWindowSetting = false;

protected bool GoogleMapEnableLocalSearchSetting = false;

protected bool GoogleMapEnableDirectionsSetting = false;

protected int GoogleMapInitialZoomSetting = 13;

protected MapType mapType = MapType.G_SATELLITE_MAP;

protected string OdiogoFeedIDSetting = string.Empty;

protected bool UseExcerpt = false;

protected bool TitleOnly = false;

protected bool HideAddThisButton = false;

protected int ExcerptLength = 250;

protected string ExcerptSuffix = “…”;

protected string MoreLinkText = “read more”;

protected bool EnableContentRatingSetting = false;

protected bool EnableRatingCommentsSetting = false;

protected bool ShowPostAuthorSetting = false;

protected bool GoogleMapIncludeWithExcerptSetting = false;

protected bool ShowGoogleMap = true;

protected bool BlogUseTagCloudForCategoriesSetting = false;

protected string blogAuthor = string.Empty;

private string CommentSystem = “internal”;

private string DisqusSiteShortName = string.Empty;

protected string disqusFlag = string.Empty;

protected string IntenseDebateAccountId = string.Empty;

protected bool ShowCommentCounts = true;

protected string EditLinkText = BlogResources.BlogEditEntryLink;

protected string EditLinkTooltip = BlogResources.BlogEditEntryLink;

protected string EditLinkImageUrl = string.Empty;

#endregion

protected override void OnInit(EventArgs e)

{

base.OnInit(e);

this.Load += new EventHandler(Page_Load);

this.calBlogNav.SelectionChanged += new EventHandler(calBlogNav_SelectionChanged);

this.calBlogNav.VisibleMonthChanged += new MonthChangedEventHandler(CalBlogNavVisibleMonthChanged);

pgr.Command += new CommandEventHandler(pgr_Command);

this.EnableViewState = false;

}

protected virtual void Page_Load(object sender, EventArgs e)

{

LoadSettings();

SetupCss();

if (!RenderInWebPartMode)

{

SetupRssLink();

}

PopulateLabels();

if (!Page.IsPostBack)

{

PopulateControls();

}

}

private void PopulateControls()

{

BindBlogs();

PopulateNavigation();

}

private void BindBlogs()

{

using (IDataReader reader = Blog.GetPage(ModuleId, CalendarDate.Date.AddDays(1), pageNumber, pageSize, out totalPages))

{

rptBlogs.DataSource = reader;

rptBlogs.DataBind();

pgr.ShowFirstLast = true;

pgr.PageSize = pageSize;

pgr.PageCount = totalPages;

pgr.Visible = (totalPages > 1) && showPager;

}

}

void pgr_Command(object sender, CommandEventArgs e)

{

pageNumber = Convert.ToInt32(e.CommandArgument);

pgr.CurrentIndex = pageNumber;

PopulateControls();

updBlog.Update();

}

protected virtual void PopulateNavigation()

{

Feeds.ModuleSettings = Settings;

Feeds.PageId = PageId;

Feeds.ModuleId = ModuleId;

Feeds.Visible = ShowFeedLinks;

if(this.ShowCategories)

{

tags.CanEdit = IsEditable;

tags.PageId = PageId;

tags.ModuleId = ModuleId;

tags.SiteRoot = SiteRoot;

tags.RenderAsTagCloud = BlogUseTagCloudForCategoriesSetting;

}

else

{

tags.Visible = false;

this.pnlCategories.Visible = false;

}

if(this.ShowArchives)

{

archive.PageId = PageId;

archive.ModuleId = ModuleId;

archive.SiteRoot = SiteRoot;

}

else

{

archive.Visible = false;

this.pnlArchives.Visible = false;

}

stats.PageId = PageId;

stats.ModuleId = ModuleId;

stats.CountOfDrafts = countOfDrafts;

stats.Visible = ShowStatistics;

}

private void calBlogNav_SelectionChanged(object sender, EventArgs e)

{

System.Web.UI.WebControls.Calendar cal = (System.Web.UI.WebControls.Calendar)sender;

CalendarDate = cal.SelectedDate;

calBlogNav.VisibleDate = CalendarDate;

calBlogNav.SelectedDate = CalendarDate;

PopulateControls();

}

private void CalBlogNavVisibleMonthChanged(object sender, MonthChangedEventArgs e)

{

CalendarDate = e.NewDate;

calBlogNav.VisibleDate = CalendarDate;

calBlogNav.SelectedDate = CalendarDate;

PopulateControls();

}

protected virtual void PopulateLabels()

{

Title1.EditUrl = SiteRoot + “/Blog/EditPost.aspx”;

Title1.EditText = BlogResources.BlogAddPostLabel;

SiteUser siteUser = SiteUtils.GetCurrentSiteUser();

//Title1.EditText = countOfDraftsCreateByUser.ToString();

if ((IsEditable) && (countOfDrafts > 0))

{

//BlogEditCategoriesLabel

Title1.LiteralExtraMarkup =

“&nbsp;<a href='”

+ SiteRoot

+ “/Blog/EditCategory.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogEditCategoriesLabel + “‘>” + BlogResources.BlogEditCategoriesLabel + “</a>”

+ “&nbsp;<a href='”

+ SiteRoot

+ “/Blog/Drafts.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogDraftsLink + “‘>” + BlogResources.BlogDraftsLink + “</a>”;

}

else if (IsEditable)

{

Title1.LiteralExtraMarkup =

“&nbsp;<a href='”

+ SiteRoot

+ “/Blog/EditCategory.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogEditCategoriesLabel + “‘>” + BlogResources.BlogEditCategoriesLabel + “</a>”;

}

//kiểm tra nếu những User có quyền Draft và số bài Draft >0 sẽ hiện Link //EditDraft.

if (IsAddNew && (countOfDraftsCreateByUser>0))

{

Title1.LiteralExtraMarkup =

“&nbsp;<a href='”

+ SiteRoot

+ “/Blog/Drafts.aspx?pageid=” + PageId.ToInvariantString()

+ “&amp;mid=” + ModuleId.ToInvariantString()

+ “‘ class=’ModuleEditLink’ title='” + BlogResources.BlogDraftsLink + “‘>” + BlogResources.BlogDraftsLink + “</a>”;

}

calBlogNav.UseAccessibleHeader = true;

EditBlogAltText = BlogResources.EditImageAltText;

FeedBackLabel = BlogResources.BlogFeedbackLabel;

mojoBasePage basePage = Page as mojoBasePage;

if (basePage != null)

{

if (!basePage.UseTextLinksForFeatureSettings)

{

EditLinkImageUrl = ImageSiteRoot + “/Data/SiteImages/” + EditContentImage;

}

}

}

protected string FormatPostAuthor(string authorName)

{

if (ShowPostAuthorSetting)

{

if (blogAuthor.Length > 0)

{

return string.Format(CultureInfo.InvariantCulture,

BlogResources.PostAuthorFormat, blogAuthor);

}

return string.Format(CultureInfo.InvariantCulture,

BlogResources.PostAuthorFormat, authorName);

}

return string.Empty;

}

protected string FormatBlogEntry(string blogHtml, string excerpt, string url, int itemId)

{

if (UseExcerpt)

{

if ((excerpt.Length > 0)&&(excerpt != “<p> </p>”))

{

return excerpt + ExcerptSuffix + ” <a href='” + FormatBlogUrl(url, itemId) + “‘>” + MoreLinkText + “</a><div>&nbsp;</div>”;

}

string result = string.Empty;

if ((blogHtml.Length > ExcerptLength)&&(MoreLinkText.Length > 0))

{

result = UIHelper.CreateExcerpt(blogHtml, ExcerptLength, ExcerptSuffix);

result += ” <a href='” + FormatBlogTitleUrl(url, itemId) + “‘>” + MoreLinkText + “</a><div>&nbsp;</div>”;

return result;

}

}

return blogHtml;

}

protected string FormatBlogUrl(string itemUrl, int itemId)

{

if (itemUrl.Length > 0)

return SiteRoot + itemUrl.Replace(“~”, string.Empty) + disqusFlag;

return SiteRoot + “/Blog/ViewPost.aspx?pageid=” + PageId.ToInvariantString()

+ “&ItemID=” + itemId.ToInvariantString()

+ “&mid=” + ModuleId.ToInvariantString()

+ disqusFlag;

}

protected string FormatBlogTitleUrl(string itemUrl, int itemId)

{

if (itemUrl.Length > 0)

return SiteRoot + itemUrl.Replace(“~”, string.Empty);

return SiteRoot + “/Blog/ViewPost.aspx?pageid=” + PageId.ToInvariantString()

+ “&ItemID=” + itemId.ToInvariantString()

+ “&mid=” + ModuleId.ToInvariantString();

}

private string GetRssUrl()

{

if (feedburnerFeedUrl.Length > 0) return feedburnerFeedUrl;

return SiteRoot + “/blog” + ModuleId.ToInvariantString() + “rss.aspx”;

}

protected virtual void SetupRssLink()

{

if (this.ModuleConfiguration != null)

{

if (Page.Master != null)

{

Control head = Page.Master.FindControl(“Head1”);

if (head != null)

{

Literal rssLink = new Literal();

rssLink.Text = “<link rel=\”alternate\” type=\”application/rss+xml\” title=\””

+ this.ModuleConfiguration.ModuleTitle + “\” href=\””

+ GetRssUrl() + “\” />”;

head.Controls.Add(rssLink);

}

}

}

}

protected virtual void SetupCss()

{

// older skins have this

StyleSheet stylesheet = (StyleSheet)Page.Master.FindControl(“StyleSheet”);

if (stylesheet != null)

{

if (stylesheet.FindControl(“blogcss”) == null)

{

Literal cssLink = new Literal();

cssLink.ID = “blogcss”;

cssLink.Text = “\n<link href='”

+ SiteUtils.GetSkinBaseUrl()

+ “blogmodule.css’ type=’text/css’ rel=’stylesheet’ media=’screen’ />”;

stylesheet.Controls.Add(cssLink);

}

if (stylesheet.FindControl(“aspcalendar”) == null)

{

Literal cssLink = new Literal();

cssLink.ID = “aspcalendar”;

cssLink.Text = “\n<link href='”

+ SiteUtils.GetSkinBaseUrl()

+ “aspcalendar.css’ type=’text/css’ rel=’stylesheet’ media=’screen’ />”;

stylesheet.Controls.Add(cssLink);

}

}

}

protected virtual void LoadSettings()

{

TimeOffset = SiteUtils.GetUserTimeOffset();

GmapApiKey = SiteUtils.GetGmapApiKey();

addThisAccountId = siteSettings.AddThisDotComUsername;

try

{

// this keeps the action from changing during ajax postback in folder based sites

SiteUtils.SetFormAction(Page, Request.RawUrl);

}

catch (MissingMethodException)

{

//this method was introduced in .NET 3.5 SP1

}

pnlContainer.ModuleId = this.ModuleId;

if (this.ModuleConfiguration != null)

{

this.Title = this.ModuleConfiguration.ModuleTitle;

this.Description = this.ModuleConfiguration.FeatureName;

}

if (Page.Request.Params.Get(“blogdate”) != null)

{

//calendarDate = DateTime.Parse(Page.Request.Params.Get(“blogdate”));

DateTimeFormatInfo dtfi = CultureInfo.InvariantCulture.DateTimeFormat;

if (!DateTime.TryParse(Page.Request.Params.Get(“blogdate”), dtfi, DateTimeStyles.AdjustToUniversal, out CalendarDate))

{

CalendarDate = DateTime.UtcNow.Date;

}

}

else

{

CalendarDate = DateTime.UtcNow.Date;

}

if (CalendarDate > DateTime.UtcNow.Date)

{

CalendarDate = DateTime.UtcNow.Date;

}

UseExcerpt = WebUtils.ParseBoolFromHashtable(

Settings, “BlogUseExcerptSetting”, UseExcerpt);

TitleOnly = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowTitleOnlySetting”, TitleOnly);

showPager = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowPagerInListSetting”, showPager);

GoogleMapIncludeWithExcerptSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapIncludeWithExcerptSetting”, GoogleMapIncludeWithExcerptSetting);

if ((UseExcerpt) && (!GoogleMapIncludeWithExcerptSetting)) { ShowGoogleMap = false; }

EnableContentRatingSetting = WebUtils.ParseBoolFromHashtable(

Settings, “EnableContentRatingSetting”, EnableContentRatingSetting);

EnableRatingCommentsSetting = WebUtils.ParseBoolFromHashtable(

Settings, “EnableRatingCommentsSetting”, EnableRatingCommentsSetting);

if (UseExcerpt) { EnableContentRatingSetting = false; }

HideAddThisButton = WebUtils.ParseBoolFromHashtable(

Settings, “BlogHideAddThisButtonSetting”, HideAddThisButton);

ExcerptLength = WebUtils.ParseInt32FromHashtable(

Settings, “BlogExcerptLengthSetting”, ExcerptLength);

if (Settings.Contains(“BlogExcerptSuffixSetting”))

{

ExcerptSuffix = Settings[“BlogExcerptSuffixSetting”].ToString();

}

if (Settings.Contains(“BlogMoreLinkText”))

{

MoreLinkText = Settings[“BlogMoreLinkText”].ToString();

}

if (Settings.Contains(“BlogAuthorSetting”))

{

blogAuthor = Settings[“BlogAuthorSetting”].ToString();

}

if (Settings.Contains(“CustomCssClassSetting”))

{

instanceCssClass = Settings[“CustomCssClassSetting”].ToString();

}

if (instanceCssClass.Length > 0) { pnlWrapper.CssClass += ” ” + instanceCssClass; }

BlogDateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern;

if (Settings.Contains(“BlogDateTimeFormat”))

{

BlogDateTimeFormat = Settings[“BlogDateTimeFormat”].ToString().Trim();

if (BlogDateTimeFormat.Length > 0)

{

try

{

string d = DateTime.Now.ToString(BlogDateTimeFormat, CultureInfo.CurrentCulture);

}

catch (FormatException)

{

BlogDateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern;

}

}

else

{

BlogDateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat.FullDateTimePattern;

}

}

ShowCalendar = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowCalendarSetting”, false);

ShowCategories = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowCategoriesSetting”, false);

BlogUseTagCloudForCategoriesSetting = WebUtils.ParseBoolFromHashtable(

Settings, “BlogUseTagCloudForCategoriesSetting”, false);

ShowArchives = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowArchiveSetting”, false);

NavigationOnRight = WebUtils.ParseBoolFromHashtable(

Settings, “BlogNavigationOnRightSetting”, false);

ShowStatistics = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowStatisticsSetting”, true);

ShowFeedLinks = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowFeedLinksSetting”, true);

ShowAddFeedLinks = WebUtils.ParseBoolFromHashtable(

Settings, “BlogShowAddFeedLinksSetting”, true);

AllowComments = WebUtils.ParseBoolFromHashtable(

Settings, “BlogAllowComments”, true);

BlogUseLinkForHeading = WebUtils.ParseBoolFromHashtable(

Settings, “BlogUseLinkForHeading”, true);

ShowPostAuthorSetting = WebUtils.ParseBoolFromHashtable(

Settings, “ShowPostAuthorSetting”, ShowPostAuthorSetting);

if (Settings.Contains(“GoogleMapInitialMapTypeSetting”))

{

string gmType = Settings[“GoogleMapInitialMapTypeSetting”].ToString();

try

{

mapType = (MapType)Enum.Parse(typeof(MapType), gmType);

}

catch (ArgumentException) { }

}

GoogleMapHeightSetting = WebUtils.ParseInt32FromHashtable(

Settings, “GoogleMapHeightSetting”, GoogleMapHeightSetting);

GoogleMapWidthSetting = WebUtils.ParseInt32FromHashtable(

Settings, “GoogleMapWidthSetting”, GoogleMapWidthSetting);

GoogleMapEnableMapTypeSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableMapTypeSetting”, false);

GoogleMapEnableZoomSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableZoomSetting”, false);

GoogleMapShowInfoWindowSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapShowInfoWindowSetting”, false);

GoogleMapEnableLocalSearchSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableLocalSearchSetting”, false);

GoogleMapEnableDirectionsSetting = WebUtils.ParseBoolFromHashtable(

Settings, “GoogleMapEnableDirectionsSetting”, false);

GoogleMapInitialZoomSetting = WebUtils.ParseInt32FromHashtable(

Settings, “GoogleMapInitialZoomSetting”, GoogleMapInitialZoomSetting);

pageSize = WebUtils.ParseInt32FromHashtable(

Settings, “BlogEntriesToShowSetting”, pageSize);

if (Settings.Contains(“OdiogoFeedIDSetting”))

OdiogoFeedIDSetting = Settings[“OdiogoFeedIDSetting”].ToString();

string altAddThisAccount = string.Empty;

if (Settings.Contains(“BlogAddThisDotComUsernameSetting”))

altAddThisAccount = Settings[“BlogAddThisDotComUsernameSetting”].ToString().Trim();

if (altAddThisAccount.Length > 0)

addThisAccountId = altAddThisAccount;

useAddThisMouseOverWidget = WebUtils.ParseBoolFromHashtable(

Settings, “BlogAddThisDotComUseMouseOverWidgetSetting”, useAddThisMouseOverWidget);

if (Settings.Contains(“BlogAddThisButtonImageUrlSetting”))

addThisButtonImageUrl = Settings[“BlogAddThisButtonImageUrlSetting”].ToString().Trim();

if (addThisButtonImageUrl.Length == 0)

addThisButtonImageUrl = “~/Data/SiteImages/addthissharebutton.gif”;

if (Settings.Contains(“BlogAddThisCustomBrandSetting”))

addThisCustomBrand = Settings[“BlogAddThisCustomBrandSetting”].ToString().Trim();

if (addThisCustomBrand.Length == 0)

addThisCustomBrand = siteSettings.SiteName;

if (Settings.Contains(“BlogAddThisCustomOptionsSetting”))

addThisCustomOptions = Settings[“BlogAddThisCustomOptionsSetting”].ToString().Trim();

if (Settings.Contains(“BlogAddThisCustomLogoUrlSetting”))

addThisCustomLogoUrl = Settings[“BlogAddThisCustomLogoUrlSetting”].ToString().Trim();

if (Settings.Contains(“BlogAddThisCustomLogoBackColorSetting”))

addThisCustomLogoBackColor = Settings[“BlogAddThisCustomLogoBackColorSetting”].ToString().Trim();

if (Settings.Contains(“BlogAddThisCustomLogoForeColorSetting”))

addThisCustomLogoForeColor = Settings[“BlogAddThisCustomLogoForeColorSetting”].ToString().Trim();

if (Settings.Contains(“BlogFeedburnerFeedUrl”))

feedburnerFeedUrl = Settings[“BlogFeedburnerFeedUrl”].ToString().Trim();

if (Settings.Contains(“DisqusSiteShortName”))

{

DisqusSiteShortName = Settings[“DisqusSiteShortName”].ToString();

}

if (Settings.Contains(“CommentSystemSetting”))

{

CommentSystem = Settings[“CommentSystemSetting”].ToString();

}

if (Settings.Contains(“IntenseDebateAccountId”))

{

IntenseDebateAccountId = Settings[“IntenseDebateAccountId”].ToString();

}

if (AllowComments)

{

if ((DisqusSiteShortName.Length > 0) && (CommentSystem == “disqus”))

{

disqusFlag = “#disqus_thread”;

disqus.SiteShortName = DisqusSiteShortName;

disqus.RenderCommentCountScript = true;

stats.ShowCommentCount = false;

}

if ((IntenseDebateAccountId.Length > 0) && (CommentSystem == “intensedebate”))

{

ShowCommentCounts = false;

stats.ShowCommentCount = false;

}

}

if (!this.NavigationOnRight)

{

this.divNav.CssClass = “blognavleft”;

this.divblog.CssClass = “blogcenter-leftnav”;

}

if (ShowCalendar)

{

this.calBlogNav.Visible = true;

try

{

calBlogNav.FirstDayOfWeek = (FirstDayOfWeek)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;

}

catch (ArgumentNullException) { }

catch (ArgumentOutOfRangeException) { }

catch (InvalidOperationException) { }

catch (InvalidCastException) { }

if (!Page.IsPostBack)

{

this.calBlogNav.SelectedDate = CalendarDate;

this.calBlogNav.VisibleDate = CalendarDate;

}

}

else

{

this.calBlogNav.Visible = false;

}

if (Settings.Contains(“BlogCopyrightSetting”))

{

lblCopyright.Text = Settings[“BlogCopyrightSetting”].ToString();

}

pnlStatistics.Visible = ShowStatistics;

divNav.Visible = false;

if (ShowCalendar

|| ShowArchives

|| ShowAddFeedLinks

|| ShowCategories

|| ShowFeedLinks

|| ShowStatistics)

{

divNav.Visible = true;

}

if (!divNav.Visible)

{

divblog.CssClass = “blogcenter-nonav”;

}

if (IsEditable)

{

countOfDrafts = Blog.CountOfDrafts(ModuleId);

}

//

if (IsAddNew)

{

Guid userGuid;

hnt_Blog htn_blog = new hnt_Blog();

SiteUser siteUser = SiteUtils.GetCurrentSiteUser();

userGuid = siteUser.UserGuid;

countOfDraftsCreateByUser = htn_blog.CountOfDraftsCreateByUser(ModuleId, userGuid);

}

}

}

}

Sửa file mojoPortal.Business.WebHelpers\ WebUser.cs:

Thêm 1 Method:

//kiem tra quyen được sửa bài nháp

public static bool HasEditDraftPermissions(int siteId, int moduleId, int pageId)

{

if (HttpContext.Current == null || HttpContext.Current.User == null) return false;

if (!HttpContext.Current.Request.IsAuthenticated) return false;

if (IsAdmin || IsContentAdmin) return true;

Module module = new Module(moduleId, pageId);

PageSettings pageSettings = new PageSettings(siteId, module.PageId);

if (pageSettings == null) return false;

if (pageSettings.PageId < 0) return false;

if (IsInRoles(pageSettings.EditRoles) || IsInRoles(module.AuthorizedEditRoles))

{

return true;

}

if (IsInRoles(pageSettings.DraftEditOnlyRoles) || IsInRoles(module.DraftEditRoles))

{

return true;

}

if (module.EditUserId > 0)

{

SiteSettings siteSettings = (SiteSettings)HttpContext.Current.Items[“SiteSettings”];

SiteUser siteUser = new SiteUser(siteSettings, HttpContext.Current.User.Identity.Name);

if (module.EditUserId == siteUser.UserId)

{

return true;

}

}

return false;

}

CÔNG TY TNHH NOVA SỐ – NOVA DIGITAL CO., LTD


LỊCH SỬ HÌNH THÀNH.

Cty TNHH NOVA DIGITAL được thành lập dưới sự tham gia cố vấn và đầu tư từ những chuyên gia công nghệ cao Microsoft, VMware, IBM, EMC với định hướng phát triển trở thành một trong những đơn vị hàng đầu về Sản xuất phần mềm Giải pháp, Tư vấn giải pháp, Dịch vụ Triển khai các Giải pháp phần mềm CNTT trong Quản lý Doanh nghiệp và Điều hành các hệ thống giải pháp Điện toán đám mây.

Đội ngũ nhân sự có năng lực, kinh nghiệm trên 10 năm về triển khai và đào tạo công nghệ, sở hữu nhiều chứng chỉ Quốc tế quan trọng đảm bảo khả năng cạnh tranh trong việc phát triển dịch vụ Đào tạo và triển khai giải pháp CNTT tại Việt Nam và các nước ĐNÁ.

LĨNH VỰC HOẠT ĐỘNG

Công ty TNHH NOVA DIGITAL hoạt động trong lĩnh vực Sản xuất phẩm mềm Quản lý bằng CNTT, Dịch vụ triển khai và Đào tạo CNTT với thế mạnh nhiều năm kinh nghiệm:

  • Phát triển dịch vụ đào tạo chuyên ngành Công nghệ thông tin – Kinh tế và Viễn thông.
  • Đối tác Hợp tác cung cấp các giải pháp CNTT cho 3 Hiệp hội chuyên ngành:
    • Hiệp hội Chế biến và Xuất khẩu Thuỷ sản Việt Nam – VASEP (hơn 500 Doanh nghiệp thành viên trong các lĩnh vực XNK, Chế biến, Sản xuất, Ngân hàng, Thương mại Thuỷ sản).  website: http://www.vasep.com.vn/ 
    • Hiệp hội Gỗ và Lâm sản Việt Nam (hơn 300 Doanh nghiệp thành viên trong các lĩnh vực XNK, chế biến, sản xuất, Ngân hàng, Thương mại Gỗ – nội thất). website:  http://vietfores.org/
    • Hiệp hội Chế biến và xuất khẩu Chè Việt Nam – VITAS ( hơn 80 Doanh nghiệp thành viên trong các lĩnh vực XNK, chế biến, sản xuất, Ngân hàng, Thương mại Chè – ẩm thực Việt Nam).  Website: http://www.vitas.org.vn
  • Các giải pháp phần mềm tin học vào ứng dụng cho doanh nghiệp vừa và nhỏ như:
    • Office 365 Cloud.
    • Cung cấp các phần mềm bản quyền của Microsoft, VMware, Lạc Việt cho Doanh nghiệp Việt Nam.
    • Chứng thư số của Viettel ISP cho khai báo thuế Việt Nam.
    • Hệ thống SMS của Viettel Telecom cho Quản lý sản xuất – Kinh tế.
  • Cung cấp giải phải pháp phần mềm tin học ứng dụng trong trường học Phổ thông và Đại học.
    • Hệ thống SMS của Viettel Telecom cho Quản lý Trường Đại học.
    • Hệ thống SMS Học bạ cho Quản lý Trường Phổ thông.
  • Đối tác triển khai giải pháp duy nhất của Microsoft Live@edu tại Việt Nam.
    • Triển khai hệ thống Exchange Online, SharePoint Online, Forefront Protection for Exchange Online, Skydrive.
    • Tích hợp hệ thống ADSync với Windows Live ID và SSO.
    • Triển khai các giải pháp SSO giữa Moodle hoặc SharePoint On-premise với Outlook Live.
    • Dịch vụ Đào tạo Live@edu for Administrators và Giáo viên các Trường Phổ thông – Đại học.
  • Đối tác duy nhất triển khai nâng cấp Office365 Education của Microsoft tại Việt Nam.
    • Nâng cấp từ Microsoft Live@edu sang Office 365 cho 300 trường PTCS, 128 trường PTTH, 40 Trường CĐ- Trung học chuyên nghiệp, 37 Trường Đại học,  20 Viện và Sau Đại học tại 39 tỉnh thành Việt Nam.
    • Cung cấp phần mềm và triển khai các giải pháp tích hợp, khai thác Office 365 cho toàn bộ các Trường tại Việt Nam.
    • Dịch vụ đào tạo Office 365 gồm 3 môn chuẩn của Microsoft:
      • Course 70-321 Deploying Office 365.
      • Course 70-323 Administering Office 365 for SMB.
      • Course 74-324 End User Office365 training.
  • Đại lý chính thức AER và LAR của Microsoft cung cấp phần mềm giáo dục tại Việt Nam.
  • Đối tác đạo tạo University và Triển khai giải pháp Ảo hoá Chuyên nghiệp của VMware tại Việt Nam.
    • Đại lý sản phẩm phần mềm ảo hoá VMware.
    • Đối tác đào tạo uỷ quyền của VMware tại Việt Nam.
    • Đối tác triển khai Service Solution IT Professional of VMware.
  • Trung tâm thi chứng chỉ Công nghệ Thông tin Quốc tế Prometric, Pearson Vue.
  • Xây dựng trang web điện tử, xây dựng cổng thông tin Doanh nghiệp.

 

CƠ CẤU TỔ CHỨC & NHÂN SỰ

Để thực hiện các chức năng nhiệm vụ phát triển dịch vụ Đào tạo, định hướng kinh doanh, cung cấp các giải pháp ứng dụng CNTT, đảm bảo dịch vụ hỗ trợ khách hàng và duy trì hoạt động của Trung tâm một cách hiệu quả, NOVA Digital đã xây dựng một cơ cấu tổ chức một cách chặt chẽ, hợp lý bao gồm các phòng ban có mối quan hệ hỗ trợ và phối hợp đồng bộ tạo nên một sức mạnh tập thể. Đáp ứng và cung cấp các dịch vụ phục vụ khách hàng Doanh nghiệp một cách toàn diện, chu đáo.

image

CEO: Giám đốc điều hành

CIO: Giám đốc kỹ thuật.

CMO: Giám đốc quản lý đối tác.

CFO: Trưởng quản lý tài chính kế toán.

AM: Quản lý khách hàng.

CCO: Trưởng quản lý chăm sóc khách hàng.

CTO: Trưởng quản lý kỹ thuật và triển khai hỗ trợ kỹ thuật Khách hàng.

 

NỀN TẢNG CÔNG NGHỆ – CHỨNG CHỈ NĂNG LỰC

Chứng chỉ công nghệ Microsoft MCP:

          Chứng chỉ chuyên ngành cao cấp về hệ thống mạng (MCITP)

          Chứng chỉ chuyên gia CNTT về SharePoint 2010 (MCM).

          Chứng chỉ chuyên gia CNTT về Dynamic CRM.

          Chứng chỉ chuyên gia về Đào tạo CNTT của Microsoft (MCT)

Partner Microsoft Live@edu

image

Đối tác duy nhất triển khai Microsoft Live@edu tại Việt Nam.

Microsoft Licensing Sales Specialist LAR & AER

Chứng chỉ cấp phép bán hàng chuyên khối Doanh nghiệp, chính phủ và Giáo dục.

 

Microsoft Office Specialist

Chứng chỉ chuyên ngành về hoạt động nghiệp vụ văn phòng

Microsoft Learning Solution

Ủy quyền của Microsoft về cung cấp các giải pháp cho Giáo dục và Đào tạo

Microsoft SharePoint Platform

          Cung cấp giải pháp Cổng thông tin điện tử và Microsoft Learning Gateway theo nền tảng SharePoint.

          Gia công phần mềm, triển khai dịch vụ hỗ trợ kỹ thuật cho các Trường Quốc tế và Đại học như: Hanoi University of Pharmacy – http://www.hup.edu.vn , UNISHANOI: http://portal.unishanoi.org

Microsoft Dynamic CRM

Giải pháp triển khai hệ thống Chăm sóc khách hàng

Microsoft Business Intelligence

          Giải pháp Doanh nghiệp thông minh chuyên cung cấp giải pháp BI 2008, BI 2012 trên nền Windows Server 2008 R2, Windows Server 2012 cho Hải Quan Việt Nam và Hiệp hội CBXN TS VASEP, Hiệp hội Chè VITAS.

Đối tác của SourceCode

image

Chuyên triển khai giải pháp “Business Process Management Solution” cho Doanh nghiệp Viễn thông Viettel Telecom tại 64 tỉnh thành.

Khảo thí thi chứng chỉ Quốc tế

image

          Chuyên tổ chức thi chứng chỉ CNTT của Microsoft, IBM, WMware.


SẢN PHẨM, GIẢI PHÁP & DỊCH VỤ

1.      Chương trình Microsoft Partner Program

          Đối tác của Microsoft phát triển mạng lưới và đánh giá, xác thực năng lực đối tác tại Việt Nam.

          Phát triển các gói sản phẩm, giải pháp cho các doanh nghiệp, đối tác.

          Đại lý chính thức cung cấp các phần mềm có bản quyền tại Việt Nam.

2.      Chương trình Microsoft LAR & AER (Microsoft Authorized Education Resller)

Tư vấn, cung cấp và đào tạo khai thác các phần mềm có bản quyền của Microsoft cho các đơn vị là Trường Đại học, Cao đẳng, THPT…

3.      Chương trình Live@edu và Office365 Cloud

Đối tác độc quyền triển khai cung cấp gói dịch vụ Microsoft Cloud miễn phí cho khối Giáo dục tại Việt Nam, Lào, Campuchia bao gồm:

          Hệ thống Email trực tuyến.

          Hệ thống cổng thông tin giáo dục trực tuyến.

          Hệ thống hội thảo trực tuyến.

          Hệ thống Microsoft Office trực tuyến.

          Hệ thống Dynamic CRM trực tuyến.

          Dịch vụ hỗ trợ, tư vấn và triển khai kỹ thuật Microsoft Cloud.

4.      Giải pháp phần mềm dựa trên nền tảng hạ tầng SharePoint và .Net Framework

          Cung cấp giải pháp cổng thông tin quản lý nội dung giáo trình, giáo án, trắc nghiệm cho khối giáo dục.

          Cung cấp giải pháp cổng thông tin quản lý nội dung giáo trình, giáo án, trắc nghiệm cho khối doanh nghiệp quản trị nhân sự.

5.      Giải pháp dịch vụ gia tăng trên di động (SMS Mobile)

Cung cấp giải pháp quản lý học sinh, sinh viên và phản hồi thông tin qua tổng đài nhắn tin thuê bao điện thoại di động.

6.      Phòng thi chứng chỉ Quốc tế được khảo thí ủy quyền của Prometric và Pearson Vue

Phòng thi đạt tiêu chuẩn Quốc tế được Prometric ủy quyền cho phép học viên thi và nhận các chứng chỉ chuyên ngành CNTT đạt chuẩn Quốc tế tại Việt Nam.

7.      Giải pháp ảo hóa hệ thống VMware

Đối tác độc quyền của VMware tại Việt Nam

          Tư vấn giải pháp.

          Triển khai hạ tầng.

          Đào tạo và chuyển giao công nghệ.

8.      Giải pháp phát triển dịch vụ trực tuyến trên nền Microsoft Cloud computing

Đối tác duy nhất tại Việt nam tư vấn, triển khai, đào tạo và chuyển giao công nghệ về các giải pháp trên nền Microsoft Cloud Apps.

KHÁCH HÀNG TIÊU BIỂU

Các thành viên xây dựng NOVA DIGITAL đều là những người có từ 10 – 16 năm kinh nghiệm triển khai trong các lĩnh vực:

1.      Dầu khí: PVOL

2.      Ngân hàng: Vietin Bank, VP Bank

3.      Bảo hiểm: Prudential, Manulife

4.      Vinamilk

5.      Đào tạo: RMIT University, de Heus, HUP, HUBT, HCMUT, NEU, HLU, Nhất Nghệ, DNU, HUESTAR.

6.      Hải Quan: Hải Quan Việt nam, FAO – FIIU – WCOO.

7.      Viễn Thông: Viettel Telecom.

8.      Truyền hình: VTC, Viettel Media, Mobiphone Media, PGM Senvang, HTC

 

CÁC DỰ ÁN TIÊU BIỂU ĐÃ THỰC HIỆN

Khách hàng Doanh nghiệp

Thời gian

Sản phẩm và dịch vụ cung cấp

Viettel Telecom

(64 tỉnh thành, 6000 người dùng).

2007

Giải pháp Quản lý Quy trình về Hợp đồng Mua Bán

của  K2Workflow SourceCode trên nền SharePoint Office 2007 Server

Microsoft

2008

Mô hình giải pháp SMS Mobile ứng dụng cho Nông thôn

VASEP

2011

Cổng thông tin chuyên ngành Thủy sản

http://www.vasep.com.vn

VITAS

2010

Công thông tin nội bộ Hiệp hội Chè

http://portal.vitas.org.vn

Microsoft for Education

Từ 2008 đến nay

Chương trình Live@edu triển khai tại Việt Nam cho:

– 300 trường PTCS

– 128 trường PTTH

– 40 Trường CĐ- Trung học chuyên nghiệp

– 37 Trường Đại học

– 20 Viện và Sau Đại học tại 39 tỉnh thành Việt Nam.

– 15 Trường Quốc tế.

VISC

2012

Trang học bạ trực tuyến Hocba.vn

http://hocba.vn

Viettel CA

2010

Cung cấp chữ ký số cho các ngành Thuế, Hải quan điện tử và các Doanh nghiệp thuê Hosting máy chủ.

NAT&L

2009

Tư vấn và triển khai giải pháp Mobile SMS Gateway của Microsoft UPG tại nhà máy mía đường Nghệ An.

Bộ Nông nghiệp (MART)

2009

Triển khai giải pháp thống kê giá nông nghiệp qua Mobile (Microsoft Project MIDAS)

Khách hàng GIÁO DỤC

Thời gian

Sản phẩm và dịch vụ cung cấp

Đại học Dược HN (Hanoi University of Pharmacy)

11.000 người dùng

2010

Triển khai giải pháp hạ tầng Web hosting, Sharepoint portal, Learning Geatway, hội thảo trực tuyến bằng Microsoft Lync Online.

Website: http://www.hup.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Văn Lang

25.000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, Moodle tích hợp Windows Live ID.

Website: http://www.vanlanguni.edu.vn/

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Bách Khoa TP.HCM

35.000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, PSA tích hợp Windows Live ID.

Website: http://www.hcmut.edu.vn/en

Kiểu dự án: Cloud and On-Premise

Đại học Tôn Đức Thắng

45.000 người dùng

2010

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Website: http://english.tdt.edu.vn/ 

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Đà nẵng

32.000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Moodle Learning với Windows Live ID.

Website: http://www.dnu.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Đại Học Dân lập Thăng Long

9000 người dùng

2008

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Joomla với Windows Live ID.

Website: http://thanglong.edu.vn/

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Đông Đô

5000 người dùng

2009

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin ASP.Net với Windows Live ID.

Website: http://www.dongdo.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Đại học Quản trị Kinh Doanh Công nghệ HUBT

25.000 người dùng

2010

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Moodle Learning với Windows Live ID.

Website: http://www.hubt.edu.vn

Kiểu dự án: Lai ghép điện toán đám mây

Khách hàng GIÁO DỤC QUỐC TẾ

Thời gian

Sản phẩm và dịch vụ cung cấp

Australian International School – Vietnam

 

1000 người dùng

2012 đến nay

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin SharePoint 2010 với Windows Live ID và SSO.

Website: http://www.aisvietnam.com

Kiểu dự án: Lai ghép điện toán đám mây

Kinder World Group

2000 người dùng

2010

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Joomla với Windows Live ID và SSO.

Website: http://kinderworld.net/

Kiểu dự án: Lai ghép điện toán đám mây

the International School Ho Chi Minh City (ISHCMC)

3000 người dùng

2011

Triển khai dịch vụ hạ tầng Outlook Live, PowerShell đồng bộ dữ liệu người dùng.

Triển khai Cổng thông tin Joomla với Windows Live ID và SSO.

http://www.ishcmc.com/

UnisHanoi

1000 người dùng

2012 đến nay

Tư vấn giải pháp SharePoint, Exchange và triển khai Hạ dịch vụ quản lý hệ thống trọn gói

http://portal.unishanoi.org

 

ĐỐI TÁC CHIẾN LƯỢC CỦA NOVA DIGITAL

Doanh nghiệp mạnh về cung cấp giải pháp, thiết bị, dịch vụ  và phần mềm CNTT

image

Microsoft Small Business Specialist

Đối tác triển khai dịch vụ Office 365 cho Trường CĐ, ĐH và Doanh nghiệp

Đối tác chuyên triển khai và đào tạo các giải pháp Cổng thông tin SharePoint, BizTalk, SQL, Lync và Office Online.

image

Solution Service IT Professional

Đối tác chuyên triển khai giải pháp Ảo hoá vCenter & vCloud mạng Doanh nghiệp cho các Trường CĐ, ĐH và Doanh nghiệp.

image

Solution Service NAS Professional

Đối tác chuyên triển khai giải pháp Lưu trữ mạng nội bộ và Điện toán đám mây NAS to LAN & vCloud cho các Trường CĐ, ĐH và Doanh nghiệp.

image

 Service Provider SERVER & SAN Professional

Đối tác chuyên triển khai giải pháp Máy chủ Server & SAN cho các Trường CĐ, ĐH và Doanh nghiệp.

 

image

          Đối tác tư vấn và triển khai hệ thống phần mềm giải pháp dịch vụ khai báo Hải quan “E-Manifest Vietnam Customs”.

          Đối tác tư vấn và triển khai hệ thống Quản lý Nội dung số Truyền hình Viễn thông Viettel Media.

image

          Đối tác tư vấn và triển khai sản phẩm phần mềm Quản lý tài chính Khách hàng Doanh nghiệp ERP.

image

          Đối tác tư vấn và triển khai hệ thống Quản lý Nội dung số Truyền hình Tin tức VTC Media.

          Đối tác tư vấn và triển khai hạ tầng ảo hoá trong Đào tạo CNTT VTC Labs Management.

image

          Đối tác tư vấn và triển khai hệ thống Quản lý dịch vụ Ảo hoá Điện toán đám mây vCloud CMC IDC HCMC.

 

Doanh nghiệp tiên phong trong lĩnh vực Đào tạo CNTT

image

image

1.      Viện Đào tạo Công nghệ và Quản trị Robusta

2.      IPMAC.

3.      IT Academic Thang Long.

4.      NetPro IT Academic.

5.      Trung tâm CNTT Đại học Kinh doanh và Công nghệ Hà nội.

6.      Viện đào tạo CNTT & Viễn thông – Đại Học Mở Hà Nội.

7.      Viện Đào tạo Công nghệ sau đại học – Đại Học Bách Khoa Hà nội.

8.      Học viện CNTT – Kinh tế Quốc Dân.

9.      Trường Cao đẳng Công nghiệp Huế.

10.  Nhất Nghệ.

 

Đối tác Hiệp hội Doanh nghiệp Thông tấn

image

          14 năm Đối tác tư vấn và triển khai hỗ trợ nâng cao năng lực CNTT tại Hiệp hội Doanh nghiệp thủy sản Việt Nam (VASEP)

image

          4 năm Đối tác tư vấn và triển khai xây dựng, đào tạo năng lực quản lý nghiệp vụ văn phòng tại Hiệp hội Chè Việt Nam (VITAS)

 

image

          14 năm làm Đối tác tư vấn và hỗ trợ kỹ thuật  CNTT tại Doanh nghiệp sản xuất và chế biến đồ Gỗ nội thất trực thuộc Hội Gỗ Việt Nam

ĐỊNH HƯỚNG PHÁT TRIỂN TRONG TƯƠNG LAI

Chúng tôi cam kết

          Chất lượng dịch vụ là kim chỉ nam cho mọi hoạt động của chúng tôi do đó chúng tôi luôn tập trung để thỏa mãn yêu cầu của khách hàng với tinh thần phục vụ tận tụy và sự hiểu biết sâu sắc về nhu cầu đề ra.

          Cùng với đó chúng tôi không ngừng nâng cao năng lực công nghệ và cải tiến quy trình chất lượng nhằm cung cấp những sản phẩm và dịch vụ có chất lượng tốt nhất.

          Chân thành, chủ động trong việc xây dựng quan hệ đối tác để cùng phát triển.

          Đoàn kết nội bộ, nỗ lực phấn đấu vì một sự nghiệp Giáo dục tiến bộ.

          Tái đầu tư xã hội thông qua các hoạt động Giáo dục cộng đồng.

Chiến lược phát triển

          Chúng tôi không ngừng đầu tư để đảm bảo luôn đi trước và đón đầu công nghệ tiên tiến dựa trên những đối tác chiến lược lâu năm.

          Không ngừng mở rộng quan hệ đối tác tạo cơ hội phát triển lớn mạnh.

          Xây dựng mạng lưới khách hàng sâu rộng và bền vững.

          Đẩy mạnh công tác đào tạo, chuyển giao công nghệ với các hãng đối tác.

          Xây dựng chiến lược nhân sự ổn định dựa trên triết lý nhân bản sâu sắc.

          Hướng tới mục tiêu trở một trong những đơn vị tiên phong về cung cấp dịch vụ đào tạo và giải pháp công nghệ tại khu vực Châu Á Thái Bình Dương.

 

HỆ THỐNG QUẢN LÝ QUY TRÌNH DOANH NGHIỆP K2.NET


Nhà cung cấp dịch vụ viễn thông Viettel Telecom vừa quyết định triển khai hệ thống quản lý hợp đồng mua bán tích hợp nền tảng .NET Framework của hãng Microsoft và giải pháp Hệ thống quản lý quy trình doanh nghiệp (Business Process Management System – BPMS) của hãng K2.net thông qua Nova Digital.

Trường An – Thời báo Vi tính Sài gòn

Nova Digital là công ty chuyên cung cấp các dịch vụ và giải pháp công nghệ thông tin, hiện là đối tác cung cấp và phát triển giải pháp hệ thống BPMS của Microsoft trên thế giới và là đối tác duy nhất của K2.NET tại Việt Nam.

Viettel tìm đến BPMS
Viettel Telecoms đã đi đến quyết định áp dụng giải pháp BPMS khi nhận ra rằng việc thực hiện và quản lý các quy trình trong công ty lưu trên văn bản giấy ngày càng phức tạp, mất thời gian và kém hiệu quả. Chẳng hạn như một bản đề xuất mua thiết bị đi kèm với hợp đồng cung cấp dịch vụ cho khách hàng thường được chuyển một cách thủ công từ một chi nhánh của Viettel lên trụ sở trung tâm cũng như từ phòng này sang phòng khác cho những người có trách nhiệm xét duyệt. Công ty hiện có hơn 1.500 nhân viên và các chi nhánh tại 64 tỉnh thành trong cả nước, với lượng khách hàng ngày càng nhiều. Vì vậy, việc quản lý các hợp đồng giữa nhà cung cấp và người sử dụng dịch vụ mua theo hệ thống hiện tại thường gặp những hạn chế nhất định và từ đó dễ phát sinh những sự trì hoãn không cần thiết. Với tiêu chí luôn ưu tiên cho vấn đề bảo đảm chất lượng, Viettel Telecoms đã xác định rằng phải tự động hóa các quy trình kinh doanh nhưng vẫn bảo đảm được tính chính xác, hiệu quả, linh hoạt và dễ quản lý.

Quản lý quy trình theo mô hình K2.net
Không chỉ riêng với quy trình quản lý hợp đồng mua bán, giải pháp BPMS của K2.net còn quản lý được nhiều quy trình kinh doanh khác, chẳng hạn như quy trình bảo đảm vệ sinh an toàn thực phẩm HACCP, quy trình kiểm toán Sarbane-Oxley, hoặc những quy trình hoạt động đặc thù như nhập bán hàng siêu thị, làm hồ sơ đấu thầu… Việc phát triển ứng dụng BPMS dựa trên nền tảng K2.NET được thể hiện qua sơ đồ trên đây (xem hình).

Một đặc điểm khác của K2.net là nó tích hợp với các cơ sở hạ tầng công nghệ của Microsoft như Microsoft Server, Microsoft Office SharePoint Server 2007 và phát triển hoàn toàn trên Microsoft Visual Studio.net. Trong đó, SharePoint Server là hệ thống cổng thông tin doanh nghiệp, có chức năng quản lý hồ sơ, tài liệu và thông tin của phòng ban của công ty.

 

Kiến trúc giải pháp BPMS dựa trên K2.net

SQL Server : máy chủ cơ sở dữ liệu.
K2.net Server
: máy chủ vận hành quy trình.
SharePoint Portal Server : máy chủ Intranet cổng thông tin doanh nghiệp.
K2.net Workspace : giao diện làm việc của nhân viên tham gia quy trình.
Web Forms : màn hình vào, ra dữ liệu
K2.net Studio và K2.net Service Manager : chức năng cho phép lập trình viên và kỹ sư hệ thống phát triển mở rộng ứng dụng quản lý quy trình, xây dựng tính năng mới, bảo trì giám sát vận hành của hệ thống.