- PVSM.RU - https://www.pvsm.ru -
Полгода назад мы рассказывали о том, как реализовали сервис бронирования переговорных комнат [1] у крупного заказчика с территориально разнесенными офисами и штатом несколько тысяч человек. Мы продолжаем работать с SharePoint-порталом этой компании, в рамках его развития специалисты EastBanc Technologies создали еще один модуль — сервис управления заявками на отпуска в интеграции с автоматизированной системой управления персоналом БОСС-Кадровик [2].
Назначение этого сервиса, как нам кажется, не нуждается в пространном разъяснении: попросту говоря, сервис автоматизирует учет отпусков в компании. Гораздо интересней, какие практические задачи стояли перед нами в данной конкретной компании, об этом — дальше.
В соответствии с ТК РФ, ежегодный основной оплачиваемый отпуск предоставляется работнику по истечении 6 месяцев с первого дня работы в компании, и затем каждый год на основании приказа о предоставлении отпуска, оформленного в соответствии с графиком отпусков. Каждый месяц работы «на счету» сотрудника копится 2,33 дня оплачиваемого отпуска. Оплачиваемый отпуск бывает [3]: основным ежегодным, дополнительным, основным оплачиваемым отпуском авансом, дополнительным отпуском авансом. И отдельным типом идет административный отпуск [4].
Заявки на эти типы отпусков нам предстояло автоматизировать. В наши задачи входило:
С технической точки зрения нужно было учесть следующее:
Здесь все было просто: действовать в том же духе, что и с переговорками (картинки кликабельные).
[6]
«Мой кабинет»: видим доступное нам количество дней отпуска на заданный период, собственные заявки и их статусы, а в разделе «Архив» — заявки подчиненных, также со статусами. Особняком стоит кнопка «Добавить заявку».
[7]
«Мой кабинет» сотрудника отдела кадров: здесь все то же самое, только добавляется раздел «Заявки на согласование», которые прилетают кадровику со всей компании.
[8]
Заявка на отпуск — с точки зрения сотрудника. Эту форму он заполняет и отправляет на согласование начальнику своего подразделения, после чего она летит кадровикам.
[9]
Заявка на отпуск от сотрудника — в таком виде она приходит непосредственному руководителю сотрудника (начальнику подразделения).
[10]
Заявка на отпуск от сотрудника — в таком виде она приходит кадровику после согласования у непосредственного руководителя сотрудника.
[11]
Годовой график отпусков по конкретно взятому отделу — как его видит кадровик.
[12]
График отпусков по отделу на месяц — как его видит кадровик.
Для хранения информации о фактических и запланированных отпусках мы создали список в SharePoint:
Информация в SharePoint поступает из системы БОСС-Кадровик по средством обмена файлами с помощью SharePoint Job. Так же информацию о согласованных заявках мы отправляем обратно в БОСС-Кадровик.
Для связывания табельного номера сотрудника с учетной записью в ActiveDirectory было добавлено поле employeeID и «прокинуто» в SharePoint при помощи User Profile Service:
Отдельной проблемой стал график отпусков, т.к. в списке фактических и запланированных отпусков порядка 100 тысяч строк, и определять сотрудника через User Profile Service было трудозатратно. Поэтому мы настроили Search Service Application, и при помощи измененного в SharePoint 2013 механизма KeywordQuery достаем всю необходимую информацию о пользователях:
ResultTableCollection rtc = null;
var kwq = new KeywordQuery(site) {
QueryText = String.Format(querySchema, employeeIdField, nameField, departmentField, department, officeField, office),
ResultTypes = ResultType.RelevantResults,
KeywordInclusion = KeywordInclusion.AllKeywords,
HiddenConstraints = "scope:" + ""People""
};
SearchExecutor se = new SearchExecutor();
rtc = se.ExecuteQuery(kwq);
Для соблюдения ТК РФ мы сделали проверку на заявку пользователя: длительность основного оплачиваемого отпуска кратна 7 дням, и один из отпусков должен длиться не менее двух недель. Помимо данной проверки добавлена дополнительная проверка на «свободные дни»: из БОСС-Кадровик приходит информация о планируемых командировках или отгулах — на эти дни подавать заявку на отпуск запрещено.
Также отпуска можно «складывать»: например, к основному оплачиваемому отпуску из 14 дней «прицепить» административный отпуск из 7 дней.
Форматы данных, которые использовались для обмена:
1. Фактический и запланированный отпуска (из БОСС-Кадровик и в БОСС-Кадровик — формат идентичный)
imployeeId;fromDate;toDate;type
59;2010-08-09 00:00:00;2010-08-22 00:00:00;0
59;2007-06-01 00:00:00;2007-06-15 00:00:00;0
59;2007-08-15 00:00:00;2007-09-04 00:00:00;0
59;2012-06-25 00:00:00;2012-07-15 00:00:00;0
59;2012-09-01 00:00:00;2012-09-07 00:00:00;0
59;2013-04-29 00:00:00;2013-05-06 00:00:00;0
59;2013-07-01 00:00:00;2013-07-21 00:00:00;0
2. Доступно дней для отпуска (из БОСС-Кадровик)
imployeeId;fromDate;toDate;mainVacationDays;additionalVacationDays
59;2013-06-20 00:00:00;2014-06-19 00:00:00;14,0000;3,0000
59;2012-06-20 00:00:00;2013-06-19 00:00:00;,0000;3,0000
59;2011-06-20 00:00:00;2012-06-19 00:00:00;,0000;3,0000
59;2008-06-20 00:00:00;2009-06-19 00:00:00;1,0000;,0000
59;2007-06-20 00:00:00;2008-06-19 00:00:00;3,0000;,0000
3. Информация о прогулах, отгулах, командировках (из БОСС-Кадровик)
imployeeId;fromDate;toDate;type
5236;2007-03-12 00:00:00;2007-03-16 00:00:00; Командировка
5249;2007-03-09 00:00:00;2007-03-18 00:00:00; Командировка
209;2007-03-19 00:00:00;2007-03-19 00:00:00; Выходной день родителей детей инвалидов
Для реализации форм создания/редактирования/просмотра заявок мы переопределили стандартные диалоги редактирования элементов SharePoint в schema.xml соответствующего списка при помощи атрибута UseLegacyForm:
<Forms>
<Form Type="DisplayForm" Url="DisplayForm.aspx" WebPartZoneID="Main" UseLegacyForm="TRUE" />
<Form Type="EditForm" Url="EditForm.aspx" WebPartZoneID="Main" UseLegacyForm="TRUE" />
<Form Type="NewForm" Url="NewForm.aspx" WebPartZoneID="Main" UseLegacyForm="TRUE" />
</Forms>
Как видно из определения, это по сути обычные aspx-страницы, но с уникальными content placeholder’ами.
Например для тэга title:
<asp:Content ID="Content1" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
Заявление на отпуск
</asp:Content>
Более подробно описано здесь office.microsoft.com/en-us/sharepoint-designer-help/working-with-content-placeholder-controls-HA102265026.aspx [13]
Для UI мы использовали jQuery UI.
Также во всплывающем окне просмотра заявки нам нужно было отображать историю согласования данной заявки. Для этого мы создали список «история согласования заявки» с lookup-полем на список заявок. И определили представление с использованием CAML-запроса:
<Query>
<Where>
<Eq>
<FieldRef Name="Request" LookupId="TRUE" />
<Value Type="Lookup">
<GetVar Scope="Request" Name="Id"/>
</Value>
</Eq>
</Where>
<OrderBy>
<FieldRef Name="ID"></FieldRef>
</OrderBy>
</Query>
Параметр Id (это Id из списка заявок) приходит из параметров запроса, что в общем-то понятно, т.к. ссылка, формируемая SharePoint на открытие формы просмотра элемента, выглядит следующим образом:
{$HttpVDir}/_layouts/15/listform.aspx?PageType=6&ListId={$List}&ID={$ID}
Далее для нашего списка истории согласования, его представления для конкретной заявки и aspx-страницы отображения заявки было объявлено xls-представление:
<File Path="RequestList/DisplayForm.aspx" Url="Lists/RequestList/DisplayForm.aspx">
<View WebPartOrder="1" WebPartZoneID="Main" BaseViewID="2" List="$Resources:core,lists_Folder;/RequestHistoryList" >
<![CDATA[
<webParts>
<webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
<data>
<properties>
....
<property name="XslLink" type="string">/_layouts/15/ETR.VacationRequest/xsl/history.xsl</property>
....
</properties>
</data>
</webPart>
</webParts>
]]>
</View>
</File>
Из кода очевидно, что представление будет расположено на странице Lists/RequestList/DisplayForm.aspx в вебпарт зоне WebPartZoneID=«Main». Осталось лишь убедиться, что такая зона у нас присутствует на странице:
<WebPartPages:WebPartZone runat="server" FrameType="None" ID="Main" Title="loc:Main" />
С графиком отпусков мы пошли дальше, т.к. стандартное представление списка в виде календаря не устраивало ни нас, ни заказчика. Поэтому мы дали задание нашим дизайнерам, и они нарисовали этот красивый календарь:
Получив одобрение заказчика, мы принялись за работу: первым делом, по примеру нашего сервиса бронирования переговорок, мы написали WCF-сервис, который возвращает json и при этом работает в контексте SharePoint’a.
Определили DataContract:
[DataContract(Name = "Vacation")]
public class Vacation
{
[DataMember(Name = "fromDate")]
public DateTime FromDate { get; set; }
[DataMember(Name = "toDate")]
public DateTime ToDate { get; set; }
[DataMember(Name = "type")]
public int Type { get; set; }
}
[DataContract(Name = "employeeData")]
public class EmployeeData
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "vacations")]
public List<Vacation> Vacations { get; set; }
}
[DataContract(Name = "departmentData")]
public class DepartmentData
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "office")]
public string Office { get; set; }
[DataMember(Name = "employees")]
public List<EmployeeData> Employees { get; set; }
}
Собрали данные о пользователе при помощи KeywordQuery, а данные об отпусках при помощи несложного CAML-запроса. Сделали кастомную верстку и связке jQuery с KnockOut реализовали требуемый интерфейс.
В итоге нам удалось полностью удовлетворить потребности заказчика в автоматизации бизнес-процесса учета отпусков. Теперь для сотрудников компании-заказчика сборы в отпуск начинаются с легкого, приятного процесса заполнения заявки, а не беготней с бумажками. Также у них всегда в свободном доступе имеется информация о количестве отпускных дней и информация о статусе поданных заявок.
Руководители сотрудников имеют полную, оформленную информацию о графике отпусков своих подчиненных, могут эффективней планировать деятельность подразделения и, что немаловажно, собственные отпуска.
Но больше всех выиграл, конечно, отдел кадров: во-первых, сервис подачи заявок на отпуск — это защита от случайных ошибок в цифрах, во-вторых, он существенно сокращает бумажный документооборот, который обычно неизбежно разрастается вокруг каждого отпускника, в-третьих, интеграция с БОСС-Кадровик позволяет кадровому отделу эффективно вести аналитический учет затрат на персонал и оплату труда.
Автор: eastbanctech
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/55367
Ссылки в тексте:
[1] как реализовали сервис бронирования переговорных комнат: http://habrahabr.ru/company/eastbanctech/blog/195110/
[2] БОСС-Кадровик: http://www.bosshr.ru/tes/functional.php
[3] бывает: http://kzotrf.ru/head_19.html
[4] административный отпуск: http://123-job.ru/articles.php?id=524
[5] провели специалисты EastBanc Technologies: http://habrahabr.ru/company/eastbanctech/blog/212841/
[6] Image: http://http:http://habrastorage.org/getpro/habr/post_images/b58/22c/806/b5822c806e608302d70ff3f4de8955e0.png
[7] Image: http://http:http://habrastorage.org/getpro/habr/post_images/7c2/d53/8c1/7c2d538c10d5d76d673036de44ba98b1.png
[8] Image: http://http:http://habrastorage.org/getpro/habr/post_images/ae2/045/5e7/ae20455e7b18b4d2a90bba273f54e824.png
[9] Image: http://http:http://habrastorage.org/getpro/habr/post_images/bc4/166/3f9/bc41663f9260070e1056b059ac759e53.png
[10] Image: http://http:http://habrastorage.org/getpro/habr/post_images/fa8/a88/318/fa8a88318866b3d70317dbe1062a7f32.png
[11] Image: http://http:http://habrastorage.org/getpro/habr/post_images/16f/96f/0a5/16f96f0a5b47cc95455092a161911d04.png
[12] Image: http://http:http://habrastorage.org/getpro/habr/post_images/4f9/9d5/773/4f99d5773d551ec0988a436cf70dbd57.png
[13] office.microsoft.com/en-us/sharepoint-designer-help/working-with-content-placeholder-controls-HA102265026.aspx: http://office.microsoft.com/en-us/sharepoint-designer-help/working-with-content-placeholder-controls-HA102265026.aspx
[14] Image: http://habrastorage.org/files/6c6/1e6/551/6c61e6551f4d4dacb91791fd86360347.png
[15] Источник: http://habrahabr.ru/post/213125/
Нажмите здесь для печати.