diff --git a/.codex-tmp/attendance-hire-report/build_report.mjs b/.codex-tmp/attendance-hire-report/build_report.mjs new file mode 100644 index 00000000..1804c54b --- /dev/null +++ b/.codex-tmp/attendance-hire-report/build_report.mjs @@ -0,0 +1,151 @@ +import fs from "node:fs/promises"; +import { FileBlob, SpreadsheetFile } from "@oai/artifact-tool"; + +const sourcePath = "/home/lizerk/Загрузки/График(2).xlsx"; +const outputDir = "/home/lizerk/Dev/EUSRR/outputs/attendance_hire_report_20260825"; +const mode = process.argv[2] ?? "inspect"; + +const input = await FileBlob.load(sourcePath); +const workbook = await SpreadsheetFile.importXlsx(input); + +if (mode === "inspect") { + const summary = await workbook.inspect({ + kind: "workbook,sheet,table,region", + maxChars: 20000, + tableMaxRows: 12, + tableMaxCols: 18, + tableMaxCellChars: 120, + }); + console.log(summary.ndjson); + + const sheets = await workbook.inspect({ kind: "sheet", include: "id,name", maxChars: 5000 }); + console.log(sheets.ndjson); + + await fs.mkdir(outputDir, { recursive: true }); + for (const sheet of workbook.worksheets.items) { + const safeName = sheet.name.replaceAll(/[^\p{L}\p{N}_-]+/gu, "_"); + const preview = await workbook.render({ + sheetName: sheet.name, + autoCrop: "all", + scale: 1, + format: "png", + }); + await fs.writeFile(`${outputDir}/source_${safeName}.png`, new Uint8Array(await preview.arrayBuffer())); + } +} + +if (mode === "analyze") { + const monthMap = new Map([ + ["январь", 1], ["февраль", 2], ["март", 3], ["апрель", 4], + ["май", 5], ["июнь", 6], ["июль", 7], ["август", 8], + ["сентябрь", 9], ["октябрь", 10], ["ноябрь", 11], ["декабрь", 12], + ]); + const clean = (value) => String(value ?? "").replace(/[\u00a0\s]+/g, " ").trim(); + const columnLetter = (columnNumber) => { + let n = columnNumber; + let result = ""; + while (n > 0) { + n--; + result = String.fromCharCode(65 + (n % 26)) + result; + n = Math.floor(n / 26); + } + return result; + }; + const report = []; + + for (const sheet of workbook.worksheets.items) { + const match = sheet.name.match(/(20\d{2})/); + if (!match) continue; + const sheetYear = Number(match[1]); + const used = sheet.getUsedRange(); + const values = used.values; + for (let r = 0; r < values.length; r++) { + const monthName = clean(values[r][0]).toLocaleLowerCase("ru-RU"); + const month = monthMap.get(monthName); + if (!month) continue; + const headerYear = Number(clean(values[r - 1]?.[0])); + const year = Number.isInteger(headerYear) && headerYear >= 2000 && headerYear <= 2100 + ? headerYear + : sheetYear; + const days = (values[r - 1] ?? []).slice(1).map((v) => Number(clean(v)) || null); + const employees = []; + for (let rr = r + 1; rr < values.length; rr++) { + const rawName = clean(values[rr][0]); + if (!rawName) break; + const lowered = rawName.toLocaleLowerCase("ru-RU"); + if (monthMap.has(lowered)) break; + const marks = values[rr].slice(1, 1 + days.length).map(clean); + const firstMarkIndex = marks.findIndex((v, i) => v && days[i]); + employees.push({ + row: rr + 1, + name: rawName, + firstDay: firstMarkIndex >= 0 ? days[firstMarkIndex] : null, + firstMark: firstMarkIndex >= 0 ? marks[firstMarkIndex] : null, + nonblankMarks: marks.filter(Boolean).length, + }); + } + report.push({ sheet: sheet.name, year, month, monthName, headerRow: r + 1, employees }); + } + } + console.log(JSON.stringify(report, null, 2)); + await fs.writeFile(`${outputDir}/analysis.json`, JSON.stringify(report, null, 2)); + + const people = new Map(); + for (const block of report) { + for (const employee of block.employees) { + const key = employee.name.toLocaleLowerCase("ru-RU"); + const firstListDate = new Date(Date.UTC(block.year, block.month - 1, 1)); + const firstMarkDate = employee.firstDay + ? new Date(Date.UTC(block.year, block.month - 1, employee.firstDay)) + : null; + const current = people.get(key) ?? { + name: employee.name, + variants: new Set(), + firstListDate: null, + firstListSheet: null, + firstListRow: null, + firstMarkDate: null, + firstMark: null, + firstMarkSheet: null, + firstMarkCell: null, + }; + current.variants.add(employee.name); + if (!current.firstListDate || firstListDate < current.firstListDate) { + current.firstListDate = firstListDate; + current.firstListSheet = block.sheet; + current.firstListRow = employee.row; + } + if (firstMarkDate && (!current.firstMarkDate || firstMarkDate < current.firstMarkDate)) { + current.firstMarkDate = firstMarkDate; + current.firstMark = employee.firstMark; + current.firstMarkSheet = block.sheet; + const markIndex = employee.firstDay + ? report.find((item) => item === block).employees.find((item) => item.row === employee.row) + : null; + const sourceColumn = markIndex + ? ((block.month && employee.firstDay) ? null : null) + : null; + const days = []; + // Source day columns are determined from the day header row; find the first matching date column. + const sourceSheet = workbook.worksheets.getItem(block.sheet); + const sourceValues = sourceSheet.getUsedRange().values; + for (let c = 1; c < sourceValues[block.headerRow - 2].length; c++) { + if (Number(clean(sourceValues[block.headerRow - 2][c])) === employee.firstDay && clean(sourceValues[employee.row - 1][c])) { + days.push(c + 1); + } + } + current.firstMarkCell = `${columnLetter(days[0] ?? 2)}${employee.row}`; + } + people.set(key, current); + } + } + const peopleSummary = [...people.values()] + .map((person) => ({ + ...person, + variants: [...person.variants], + firstListDate: person.firstListDate?.toISOString().slice(0, 10) ?? null, + firstMarkDate: person.firstMarkDate?.toISOString().slice(0, 10) ?? null, + })) + .sort((a, b) => (a.firstMarkDate ?? a.firstListDate).localeCompare(b.firstMarkDate ?? b.firstListDate) || a.name.localeCompare(b.name, "ru")); + await fs.writeFile(`${outputDir}/people_summary.json`, JSON.stringify(peopleSummary, null, 2)); +} diff --git a/backend/api/v1/requests_app/request_serializers/__init__.py b/backend/api/v1/requests_app/request_serializers/__init__.py index 138df0fc..f5291b1c 100644 --- a/backend/api/v1/requests_app/request_serializers/__init__.py +++ b/backend/api/v1/requests_app/request_serializers/__init__.py @@ -1,5 +1,10 @@ from .fields import RecipientIDsField -from .read import RequestReadSerializer +from .read import RequestProfileSummarySerializer, RequestReadSerializer from .write import RequestWriteSerializer -__all__ = ["RecipientIDsField", "RequestReadSerializer", "RequestWriteSerializer"] +__all__ = [ + "RecipientIDsField", + "RequestProfileSummarySerializer", + "RequestReadSerializer", + "RequestWriteSerializer", +] diff --git a/backend/api/v1/requests_app/request_serializers/read.py b/backend/api/v1/requests_app/request_serializers/read.py index 48860385..32bf52c7 100644 --- a/backend/api/v1/requests_app/request_serializers/read.py +++ b/backend/api/v1/requests_app/request_serializers/read.py @@ -167,3 +167,27 @@ class RequestReadSerializer(serializers.ModelSerializer): kind=TaskLinkedObjectKind.REQUEST, user=user, ) + + +class RequestProfileSummarySerializer(serializers.ModelSerializer): + """Компактное представление заявления для профиля сотрудника.""" + + display_title = serializers.CharField(read_only=True) + duration_minutes = serializers.IntegerField(read_only=True) + + class Meta: + model = Request + fields = ( + "id", + "type", + "title", + "display_title", + "status", + "date_from", + "date_to", + "time_from", + "time_to", + "duration_minutes", + "created_at", + "updated_at", + ) diff --git a/backend/api/v1/requests_app/viewsets/core.py b/backend/api/v1/requests_app/viewsets/core.py index 12f5876e..c632f2f2 100644 --- a/backend/api/v1/requests_app/viewsets/core.py +++ b/backend/api/v1/requests_app/viewsets/core.py @@ -37,6 +37,7 @@ class RequestCoreMixin: "reject": IsRecipientOfRequest, "cancel": IsRequestAuthor, "statistics": IsAuthenticated, + "employee_profile": IsAuthenticated, "recipient_options": IsAuthenticated, "retrieve": CanViewRequest, "employee_statistics": CanViewRequest, diff --git a/backend/api/v1/requests_app/viewsets/statistics.py b/backend/api/v1/requests_app/viewsets/statistics.py index 245b269f..514353e4 100644 --- a/backend/api/v1/requests_app/viewsets/statistics.py +++ b/backend/api/v1/requests_app/viewsets/statistics.py @@ -1,3 +1,5 @@ +import math + from django.contrib.auth import get_user_model from django.shortcuts import get_object_or_404 from rest_framework.decorators import action @@ -9,6 +11,10 @@ from requests_app.application import ( can_view_request_statistics, resolve_stats_window_from_query, ) +from requests_app.enums import RequestStatus +from requests_app.models import Request as EmployeeRequest + +from ..serializers import RequestProfileSummarySerializer def _validated_period(request): @@ -21,6 +27,67 @@ def _validated_period(request): class RequestStatisticsMixin: + @action(detail=False, methods=["get"], url_path="employee-profile") + def employee_profile(self, request): + """Последние заявления и статистика для профиля сотрудника.""" + employee_id = (request.query_params.get("employee_id") or "").strip() + if not employee_id.isdigit(): + raise ValidationError("Параметр employee_id обязателен.") + + employee = get_object_or_404(get_user_model(), pk=int(employee_id)) + is_own_profile = request.user.id == employee.id + if not is_own_profile and not can_view_request_statistics(request.user): + raise PermissionDenied("У вас нет доступа к заявлениям сотрудника.") + + limit_raw = (request.query_params.get("limit") or "5").strip() + if not limit_raw.isdigit(): + raise ValidationError("Параметр limit должен быть целым числом.") + limit = int(limit_raw) + if not 1 <= limit <= 20: + raise ValidationError("Параметр limit должен быть от 1 до 20.") + + page_raw = (request.query_params.get("page") or "1").strip() + if not page_raw.isdigit() or int(page_raw) < 1: + raise ValidationError("Параметр page должен быть положительным целым числом.") + page = int(page_raw) + + period = _validated_period(request) + start_date, end_date = resolve_stats_window_from_query( + period, + request.query_params, + ) + + requests = EmployeeRequest.objects.filter(employee_id=employee.id) + if not is_own_profile: + requests = requests.exclude(status=RequestStatus.DRAFT) + requests = requests.order_by("-created_at", "-id") + total_count = requests.count() + total_pages = max(1, math.ceil(total_count / limit)) + if page > total_pages: + page = total_pages + offset = (page - 1) * limit + + return Response( + { + "count": total_count, + "page": page, + "total_pages": total_pages, + "has_previous": page > 1, + "has_next": page < total_pages, + "results": RequestProfileSummarySerializer( + requests[offset : offset + limit], + many=True, + ).data, + "statistics": build_employee_statistics( + employee_id=employee.id, + employee_name=str(employee), + period=period, + start_date=start_date, + end_date=end_date, + ), + } + ) + @action(detail=True, methods=["get"], url_path="employee-statistics") def employee_statistics(self, request, pk=None): """Возвращает сводную статистику по заявлениям сотрудника. diff --git a/backend/tests/api/v1/requests_app/test_requests_api.py b/backend/tests/api/v1/requests_app/test_requests_api.py index fcc4dc26..84a5a6d3 100644 --- a/backend/tests/api/v1/requests_app/test_requests_api.py +++ b/backend/tests/api/v1/requests_app/test_requests_api.py @@ -113,6 +113,123 @@ def test_statistics_requires_privileged_access( assert resp.status_code == 403 +def test_employee_profile_returns_own_requests_and_statistics( + auth_client, + regular_user: models.Model, + make_request, +) -> None: + """Сотрудник видит в профиле собственные заявления и сводку по ним.""" + submitted = make_request( + employee=regular_user, + type_=RequestType.SICK_LEAVE, + status=RequestStatus.APPROVED, + ) + draft = make_request( + employee=regular_user, + type_=RequestType.OTHER, + status=RequestStatus.DRAFT, + ) + + resp = auth_client(regular_user).get( + f"{API_BASE}employee-profile/?employee_id={regular_user.id}&limit=5" + ) + + assert resp.status_code == 200 + payload = resp.json() + assert payload["count"] == 2 + assert {item["id"] for item in payload["results"]} == { + submitted.id, + draft.id, + } + assert payload["statistics"]["total_submitted_requests"] == 1 + assert payload["statistics"]["sick_leave_requests_count"] == 1 + + +def test_employee_profile_rejects_unprivileged_foreign_employee( + auth_client, + regular_user: models.Model, + make_user, +) -> None: + employee = make_user(email="profile-requests-hidden@example.com") + + resp = auth_client(regular_user).get( + f"{API_BASE}employee-profile/?employee_id={employee.id}" + ) + + assert resp.status_code == 403 + + +def test_employee_profile_admin_sees_submitted_but_not_foreign_drafts( + auth_client, + admin_user: models.Model, + make_user, + make_request, +) -> None: + employee = make_user(email="profile-requests-admin@example.com") + submitted = make_request( + employee=employee, + type_=RequestType.DAY_OFF, + status=RequestStatus.PENDING, + ) + make_request( + employee=employee, + type_=RequestType.OTHER, + status=RequestStatus.DRAFT, + ) + + resp = auth_client(admin_user).get( + f"{API_BASE}employee-profile/?employee_id={employee.id}" + ) + + assert resp.status_code == 200 + payload = resp.json() + assert payload["count"] == 1 + assert [item["id"] for item in payload["results"]] == [submitted.id] + assert payload["statistics"]["total_submitted_requests"] == 1 + + +def test_employee_profile_paginates_requests( + auth_client, + regular_user: models.Model, + make_request, +) -> None: + created = [ + make_request( + employee=regular_user, + type_=RequestType.OTHER, + status=RequestStatus.PENDING, + ) + for _ in range(6) + ] + + first_page = auth_client(regular_user).get( + f"{API_BASE}employee-profile/?employee_id={regular_user.id}&limit=5&page=1" + ) + second_page = auth_client(regular_user).get( + f"{API_BASE}employee-profile/?employee_id={regular_user.id}&limit=5&page=2" + ) + + assert first_page.status_code == 200 + assert second_page.status_code == 200 + first_payload = first_page.json() + second_payload = second_page.json() + assert first_payload["count"] == 6 + assert first_payload["page"] == 1 + assert first_payload["total_pages"] == 2 + assert first_payload["has_previous"] is False + assert first_payload["has_next"] is True + assert len(first_payload["results"]) == 5 + assert second_payload["page"] == 2 + assert second_payload["has_previous"] is True + assert second_payload["has_next"] is False + assert len(second_payload["results"]) == 1 + result_ids = { + item["id"] + for item in first_payload["results"] + second_payload["results"] + } + assert result_ids == {request.id for request in created} + + def test_statistics_counts_all_employee_requests_for_admin( auth_client, admin_user: models.Model, diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index 2b514bb6..014a29d4 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -508,6 +508,12 @@ html[data-bs-theme="dark"] .app-input::-webkit-calendar-picker-indicator { white-space: normal; } +.app-badge-interactive { + flex-wrap: nowrap; + overflow: hidden; + white-space: nowrap; +} + .app-badge-accent { border-color: color-mix(in srgb, var(--accent-primary) 20%, var(--border-subtle)); background: color-mix(in srgb, var(--accent-primary) 12%, var(--surface-primary)); diff --git a/frontend/src/app/profile/page.tsx b/frontend/src/app/profile/page.tsx index 6872693f..0c60efb5 100644 --- a/frontend/src/app/profile/page.tsx +++ b/frontend/src/app/profile/page.tsx @@ -6,13 +6,13 @@ import { Mail, MessageCircle, Phone, RefreshCw } from "lucide-react"; import { AppShell } from "@/components/AppShell"; import EmployeeAttendanceCard from "@/components/attendance/EmployeeAttendanceCard"; import EmployeeActionsTimeline from "@/components/users/EmployeeActionsTimeline"; +import EmployeeRequestsProfileSections from "@/components/users/EmployeeRequestsProfileSections"; import { ProfileContactsPanel, ProfileAttendanceStatusPill, ProfileDepartmentBadge, - ProfileDepartmentsCard, ProfileHeroCard, - ProfileInfoCard, + ProfileInfoBadge, ProfileSkillsCard, ProfileWorkScheduleCard, type ProfileContactRow, @@ -155,10 +155,11 @@ export default function ProfilePage() { departmentSummary ? ( ) : undefined } + infoBadge={} bottomPanel={} /> @@ -177,12 +178,6 @@ export default function ProfilePage() { emptyText="Навыки пока не указаны" /> - - - {user.departments?.length ? ( - - ) : null} - + + ) : undefined } + infoBadge={} actionRow={ currentUser && currentUser.id !== person.id ? ( <> @@ -564,12 +565,6 @@ export default function UserDetailPage() { emptyText="Навыки не указаны" /> - - - {person.departments?.length ? ( - - ) : null} - + + {canViewAttendance ? ( <> = { options: readonly ProjectSelectOption[]; onChange: (value: T) => void; ariaLabel: string; - variant?: "field" | "compact" | "responsive"; + variant?: "field" | "compact" | "responsive" | "badge"; triggerIcon?: ReactNode; disabled?: boolean; className?: string; @@ -93,7 +93,13 @@ export function ProjectSelectMenu({ const gap = 8; const triggerRect = trigger.getBoundingClientRect(); const menuRect = menu.getBoundingClientRect(); - const preferredWidth = menuWidth ?? (variant === "compact" ? 240 : Math.max(224, triggerRect.width)); + const preferredWidth = menuWidth ?? ( + variant === "compact" + ? 240 + : variant === "badge" + ? 200 + : Math.max(224, triggerRect.width) + ); const width = Math.min(preferredWidth, window.innerWidth - margin * 2); const left = Math.min( Math.max(triggerRect.right - width, margin), @@ -128,6 +134,8 @@ export function ProjectSelectMenu({ ? "relative shrink-0" : variant === "responsive" ? "relative shrink-0 sm:min-w-52 sm:max-w-72" + : variant === "badge" + ? "relative min-w-0 shrink-0" : "relative min-w-0" } ${className}`} > @@ -146,17 +154,23 @@ export function ProjectSelectMenu({ title={variant !== "field" ? activeOption.label : undefined} className={`${ open - ? "app-selected app-accent-text" + ? variant === "badge" + ? "app-badge app-badge-interactive app-selected app-accent-text" + : "app-selected app-accent-text" : variant === "compact" ? "app-surface-muted app-text-muted hover:bg-[var(--surface-tertiary)]" : variant === "responsive" ? "app-surface-muted app-text-muted hover:bg-[var(--surface-tertiary)]" + : variant === "badge" + ? "app-badge app-badge-interactive app-text-muted hover:bg-[var(--surface-tertiary)] hover:text-[var(--foreground)]" : "app-input app-text-primary hover:bg-[var(--surface-tertiary)]" } ${ variant === "compact" ? "flex h-[42px] w-[42px] items-center justify-center rounded-lg" : variant === "responsive" ? "flex h-[42px] w-[42px] items-center justify-center rounded-lg sm:w-full sm:min-w-52 sm:justify-start sm:gap-2 sm:px-3 sm:text-sm" + : variant === "badge" + ? "flex h-8 max-w-full flex-nowrap items-center gap-1.5 whitespace-nowrap rounded-full px-2.5 text-xs" : "flex h-[42px] w-full min-w-0 items-center gap-2 rounded-lg px-3 text-sm" } transition disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--accent-primary)]`} > diff --git a/frontend/src/components/users/EmployeeActionsTimeline.tsx b/frontend/src/components/users/EmployeeActionsTimeline.tsx index 73f607df..17f9a276 100644 --- a/frontend/src/components/users/EmployeeActionsTimeline.tsx +++ b/frontend/src/components/users/EmployeeActionsTimeline.tsx @@ -1,7 +1,29 @@ "use client"; import { useMemo, useState } from "react"; -import { Pencil, Plus, Trash2 } from "lucide-react"; +import { + ArrowRightLeft, + Baby, + BriefcaseBusiness, + CalendarMinus, + ChevronDown, + ChevronLeft, + ChevronRight, + History, + Laptop, + LoaderCircle, + Pencil, + Plus, + RotateCcw, + Stethoscope, + Sun, + Trash2, + Undo2, + UserMinus, + UserPlus, + type LucideIcon, +} from "lucide-react"; + import { getEmployeeActionTone, truncateText, @@ -19,11 +41,27 @@ type EmployeeActionsTimelineProps = { personnelState?: EmployeePersonnelState | null; sortedActions: EmployeeAction[]; initialVisibleCount?: number; - showCountLabel?: boolean; truncateCommentLength?: number; expandedCommentLength?: number; }; +const actionIcons: Record = { + working: BriefcaseBusiness, + remote: Laptop, + hired: UserPlus, + dismissed: UserMinus, + on_leave: Sun, + returned_from_leave: Undo2, + on_sick_leave: Stethoscope, + returned_from_sick_leave: Undo2, + on_day_off: CalendarMinus, + returned_from_day_off: Undo2, + on_maternity: Baby, + returned_from_maternity: Undo2, + transferred: ArrowRightLeft, + rehired: RotateCcw, +}; + function formatActionDate(value: string) { const date = new Date(value); if (Number.isNaN(date.getTime())) return value; @@ -35,8 +73,12 @@ function formatActionDate(value: string) { } function formatStateDate(value?: string | null) { - if (!value) return ""; - return formatActionDate(value); + return value ? formatActionDate(value) : ""; +} + +function formatDateRange(dateFrom: string, dateTo?: string | null) { + const start = formatActionDate(dateFrom); + return dateTo ? `${start} — ${formatActionDate(dateTo)}` : start; } export default function EmployeeActionsTimeline({ @@ -49,182 +91,213 @@ export default function EmployeeActionsTimeline({ onEditAction, personnelState, sortedActions, - initialVisibleCount, - showCountLabel = true, + initialVisibleCount = 5, truncateCommentLength, expandedCommentLength = truncateCommentLength, }: EmployeeActionsTimelineProps) { - const [showAll, setShowAll] = useState(false); - const currentActionId = personnelState ? personnelState.action_id : latestActionId; + const [open, setOpen] = useState(false); + const [page, setPage] = useState(1); + const pageSize = Math.max(1, initialVisibleCount); + const totalPages = Math.max(1, Math.ceil(sortedActions.length / pageSize)); + const effectivePage = Math.min(page, totalPages); + const currentActionId = personnelState?.action_id ?? latestActionId; const showCurrentStateCard = Boolean( personnelState && personnelState.status - && personnelState.status !== "normal" - ); - const canCollapse = Boolean( - initialVisibleCount && sortedActions.length > initialVisibleCount, - ); - const visibleActions = useMemo( - () => - canCollapse && !showAll - ? sortedActions.slice(0, initialVisibleCount) - : sortedActions, - [canCollapse, initialVisibleCount, showAll, sortedActions], + && personnelState.status !== "normal", ); + const visibleActions = useMemo(() => { + const start = (effectivePage - 1) * pageSize; + return sortedActions.slice(start, start + pageSize); + }, [effectivePage, pageSize, sortedActions]); if (!canViewActions || (sortedActions.length === 0 && !showCurrentStateCard)) { return null; } return ( -
-
-

Кадровые события

-
- {showCountLabel ? ( - - {sortedActions.length}{" "} - {sortedActions.length === 1 - ? "событие" - : sortedActions.length < 5 - ? "события" - : "событий"} - - ) : null} - {canCollapse ? ( - - ) : null} - {canManageActions && onAddAction ? ( - - ) : null} -
+
+
+ + + + {sortedActions.length} + + + {canManageActions && onAddAction ? ( + + ) : null} + +
- {!showAll && canCollapse ? ( -

- Последние {visibleActions.length} из {sortedActions.length} -

- ) : null} - - {showCurrentStateCard && personnelState ? ( -
- {(() => { + {open ? ( +
+ {showCurrentStateCard && personnelState ? (() => { const tone = getEmployeeActionTone(personnelState.status); + const StateIcon = actionIcons[personnelState.status] || BriefcaseBusiness; const dateFrom = formatStateDate(personnelState.date_from); const dateTo = formatStateDate(personnelState.date_to); return ( -
-
-

Текущее состояние

-
- - {personnelState.label || personnelState.status} - - - активно сейчас - -
-
- {dateFrom ? ( - - ) : null} +
+ + + + + {personnelState.label || personnelState.status} + + + Активно сейчас + {dateFrom ? ` · ${dateFrom}${dateTo ? ` — ${dateTo}` : ""}` : ""} + + +
); - })()} -
- ) : null} + })() : null} -
- {visibleActions.map((action) => { - const isCurrent = currentActionId === action.id; - const deleteKey = `delete-${action.id}`; - const tone = getEmployeeActionTone(action.action); - const commentText = truncateCommentLength - ? truncateText(action.comment, showAll ? expandedCommentLength : truncateCommentLength) - : action.comment; +
+ {visibleActions.map((action) => { + const isCurrent = currentActionId === action.id; + const deleteKey = `delete-${action.id}`; + const tone = getEmployeeActionTone(action.action); + const ActionIcon = actionIcons[action.action] || History; + const commentText = truncateCommentLength + ? truncateText( + action.comment, + expandedCommentLength || truncateCommentLength, + ) + : action.comment; + const actionLabel = action.action_display || action.action; - return ( -
- - {isCurrent ? ( - - ) : null} -
-
-
-
- - {action.action_display || action.action} + return ( +
+ + + + + + {actionLabel} {isCurrent ? ( - - текущий + + Текущее ) : null} + + + {[commentText, formatDateRange(action.date, action.date_to)] + .filter(Boolean) + .join(" · ")} + + + + {canManageActions && onEditAction && onDeleteAction ? ( +
+ +
- {commentText ? ( -

- {commentText} -

- ) : null} -
-
- - {canManageActions && onEditAction && onDeleteAction ? ( -
- - -
- ) : null} -
+ ) : null}
-
-
- ); - })} -
+ ); + })} +
+ + {totalPages > 1 ? ( + + ) : null} +
+ ) : null}
); } diff --git a/frontend/src/components/users/EmployeeRequestsProfileSections.tsx b/frontend/src/components/users/EmployeeRequestsProfileSections.tsx new file mode 100644 index 00000000..19dcde97 --- /dev/null +++ b/frontend/src/components/users/EmployeeRequestsProfileSections.tsx @@ -0,0 +1,410 @@ +"use client"; + +import Link from "next/link"; +import { useEffect, useState, type ReactNode } from "react"; +import { + ArrowRightLeft, + Baby, + BarChart3, + CalendarMinus, + CalendarDays, + CalendarRange, + ChevronDown, + ChevronLeft, + ChevronRight, + ClipboardList, + Clock3, + FileText, + LoaderCircle, + Stethoscope, + Sun, + UserRoundX, + type LucideIcon, +} from "lucide-react"; + +import { ProjectSelectMenu } from "@/components/ui/ProjectSelectMenu"; +import { apiClient } from "@/lib/api"; +import { ApiError } from "@/lib/api/client"; +import type { + EmployeeRequestProfileSummary, + Request, + RequestEmployeeStatistics, +} from "@/types/api"; + +const requestTypeLabels: Record = { + short_day_off: "Короткий отгул", + vacation: "Отпуск", + sick_leave: "Больничный", + day_off: "Отгул", + maternity: "Декрет", + transfer: "Перевод", + dismissal: "Увольнение", + other: "Другое", +}; + +const requestStatusMeta: Record = { + draft: { label: "Черновик", className: "app-badge" }, + pending: { label: "На рассмотрении", className: "app-feedback-warning" }, + approved: { label: "Одобрено", className: "app-feedback-success" }, + rejected: { label: "Отклонено", className: "app-feedback-danger" }, + cancelled: { label: "Отменено", className: "app-badge" }, + in_progress: { label: "В работе", className: "app-selected" }, + completed: { label: "Завершено", className: "app-badge-accent" }, +}; + +const requestTypeIcons: Record = { + short_day_off: Clock3, + vacation: Sun, + sick_leave: Stethoscope, + day_off: CalendarMinus, + maternity: Baby, + transfer: ArrowRightLeft, + dismissal: UserRoundX, + other: FileText, +}; + +type StatisticsPeriod = "all" | "year" | "month"; + +const statisticsPeriodOptions = [ + { value: "all", label: "Всё время", icon: }, + { value: "year", label: "Текущий год", icon: }, + { value: "month", label: "Текущий месяц", icon: }, +] satisfies ReadonlyArray<{ value: StatisticsPeriod; label: string; icon: ReactNode }>; + +function formatDate(value?: string | null) { + if (!value) return ""; + return new Intl.DateTimeFormat("ru-RU").format(new Date(`${value}T00:00:00`)); +} + +function formatRequestPeriod(request: Request) { + const dateFrom = formatDate(request.date_from); + const dateTo = formatDate(request.date_to); + if (request.type === "short_day_off") { + const timeFrom = request.time_from?.slice(0, 5); + const timeTo = request.time_to?.slice(0, 5); + return [dateFrom, timeFrom && timeTo ? `${timeFrom}–${timeTo}` : ""] + .filter(Boolean) + .join(", "); + } + if (dateFrom && dateTo && request.date_from !== request.date_to) { + return `${dateFrom} — ${dateTo}`; + } + return dateFrom || "Дата не указана"; +} + +function formatMinutes(value: number) { + if (!value) return "0 мин."; + const hours = Math.floor(value / 60); + const minutes = value % 60; + return [hours ? `${hours} ч.` : "", minutes ? `${minutes} мин.` : ""] + .filter(Boolean) + .join(" "); +} + +function CollapsibleProfileSection({ + action, + children, + icon, + open, + onToggle, + title, +}: { + action?: ReactNode; + children: ReactNode; + icon: ReactNode; + open: boolean; + onToggle: () => void; + title: string; +}) { + return ( +
+
+ + {action} + +
+ {open ? ( +
+ {children} +
+ ) : null} +
+ ); +} + +function RequestList({ + loading, + onPageChange, + page, + requests, + totalPages, +}: { + loading: boolean; + onPageChange: (page: number) => void; + page: number; + requests: Request[]; + totalPages: number; +}) { + if (loading) { + return ( +
+ + Загрузка заявлений... +
+ ); + } + + if (!requests.length) { + return ( +
+

Заявлений пока нет

+
+ ); + } + + return ( +
+
+ {requests.map((request) => { + const status = requestStatusMeta[request.status] || { + label: request.status, + className: "app-badge", + }; + const typeLabel = requestTypeLabels[request.type || ""] || "Заявление"; + const TypeIcon = requestTypeIcons[request.type || ""] || FileText; + return ( + + + + + + {request.display_title || request.title || typeLabel} + + + {typeLabel} · {formatRequestPeriod(request)} + + + + + + ); + })} +
+ {totalPages > 1 ? ( + + ) : null} +
+ ); +} + +function StatisticsGrid({ statistics }: { statistics: RequestEmployeeStatistics }) { + const items = [ + { label: "Всего подано", value: statistics.total_submitted_requests }, + { + label: "Больничные", + value: `${statistics.sick_leave_requests_count} · ${statistics.sick_leave_days} дн.`, + }, + { + label: "Отгулы", + value: `${statistics.day_off_requests_count} · ${statistics.day_off_days} дн.`, + }, + { + label: "Короткие отгулы", + value: `${statistics.short_day_off_requests_count} · ${formatMinutes(statistics.short_day_off_minutes)}`, + }, + { label: "Оплачиваемый отпуск", value: `${statistics.paid_vacation_days} дн.` }, + { label: "Неоплачиваемый отпуск", value: `${statistics.unpaid_vacation_days} дн.` }, + { + label: "Декрет", + value: `${statistics.maternity_requests_count} · ${statistics.maternity_days} дн.`, + }, + ]; + + return ( +
+ {items.map((item) => ( +
+

{item.label}

+

{item.value}

+
+ ))} +
+ ); +} + +export default function EmployeeRequestsProfileSections({ employeeId }: { employeeId: number }) { + const [requestsOpen, setRequestsOpen] = useState(false); + const [statisticsOpen, setStatisticsOpen] = useState(false); + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + const [requestsLoading, setRequestsLoading] = useState(false); + const [requestPage, setRequestPage] = useState(1); + const [statisticsLoading, setStatisticsLoading] = useState(false); + const [statisticsPeriod, setStatisticsPeriod] = useState("all"); + const [error, setError] = useState(null); + const [denied, setDenied] = useState(false); + + useEffect(() => { + let cancelled = false; + + apiClient.getEmployeeRequestProfile(employeeId, statisticsPeriod, 5, requestPage) + .then((result) => { + if (!cancelled) { + setData(result); + if (result.page !== requestPage) setRequestPage(result.page); + } + }) + .catch((caught: unknown) => { + if (cancelled) return; + if (caught instanceof ApiError && caught.status === 403) { + setDenied(true); + return; + } + setError(caught instanceof Error ? caught.message : "Не удалось загрузить заявления."); + }) + .finally(() => { + if (!cancelled) { + setLoading(false); + setRequestsLoading(false); + setStatisticsLoading(false); + } + }); + + return () => { + cancelled = true; + }; + }, [employeeId, requestPage, statisticsPeriod]); + + if (denied) return null; + + const badge = loading ? ( + + ) : data ? ( + {data.count} + ) : null; + + const content = error ? ( +
{error}
+ ) : loading || !data ? ( +
+ + Загрузка... +
+ ) : null; + + return ( + <> + } + action={badge} + open={requestsOpen} + onToggle={() => setRequestsOpen((value) => !value)} + > + {content || { + setError(null); + setRequestsLoading(true); + setRequestPage(nextPage); + }} + />} + + + } + action={ + loading ? ( + + ) : data ? ( + { + setError(null); + setStatisticsLoading(true); + setStatisticsPeriod(nextPeriod); + }} + ariaLabel="Период статистики по заявлениям" + variant="badge" + /> + ) : null + } + open={statisticsOpen} + onToggle={() => setStatisticsOpen((value) => !value)} + > + {content || (statisticsLoading ? ( +
+ + Обновляем статистику... +
+ ) : data ? : null)} +
+ + ); +} diff --git a/frontend/src/components/users/ProfileSections.tsx b/frontend/src/components/users/ProfileSections.tsx index 82d693fb..b3c9e609 100644 --- a/frontend/src/components/users/ProfileSections.tsx +++ b/frontend/src/components/users/ProfileSections.tsx @@ -1,12 +1,21 @@ "use client"; import Link from "next/link"; -import { useEffect, useState, type ReactNode } from "react"; +import { createPortal } from "react-dom"; +import { + useEffect, + useLayoutEffect, + useRef, + useState, + type ReactNode, +} from "react"; import { CalendarClock, Check, + ChevronDown, Clock3, Crown, + Info, Link2, Loader2, Pencil, @@ -136,6 +145,7 @@ export function ProfileHeroCard({ secondaryLine, roleText, departmentBadge, + infoBadge, headerActions, actionRow, bottomPanel, @@ -147,6 +157,7 @@ export function ProfileHeroCard({ secondaryLine?: string | null; roleText: string; departmentBadge?: ReactNode; + infoBadge?: ReactNode; headerActions?: ReactNode; actionRow?: ReactNode; bottomPanel?: ReactNode; @@ -165,9 +176,12 @@ export function ProfileHeroCard({
-

- {fullName} -

+
+

+ {fullName} +

+ {infoBadge} +
{secondaryLine ? (

{secondaryLine}

) : null} @@ -271,37 +285,131 @@ export function ProfileContactsPanel({ ); } -export function ProfileInfoCard({ - title = "Информация", +export function ProfileInfoBadge({ items, }: { - title?: string; items: ProfileInfoItem[]; }) { + const [open, setOpen] = useState(false); + const [menuPosition, setMenuPosition] = useState<{ + left: number; + top: number; + width: number; + } | null>(null); + const triggerRef = useRef(null); + const menuRef = useRef(null); + + useEffect(() => { + if (!open) return; + + const handlePointerDown = (event: PointerEvent) => { + const target = event.target as Node; + if (!triggerRef.current?.contains(target) && !menuRef.current?.contains(target)) { + setOpen(false); + setMenuPosition(null); + } + }; + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setOpen(false); + setMenuPosition(null); + triggerRef.current?.focus(); + } + }; + + document.addEventListener("pointerdown", handlePointerDown); + document.addEventListener("keydown", handleKeyDown); + return () => { + document.removeEventListener("pointerdown", handlePointerDown); + document.removeEventListener("keydown", handleKeyDown); + }; + }, [open]); + + useLayoutEffect(() => { + if (!open) return; + + const updatePosition = () => { + const trigger = triggerRef.current; + const menu = menuRef.current; + if (!trigger || !menu) return; + + const margin = 12; + const gap = 8; + const triggerRect = trigger.getBoundingClientRect(); + const menuRect = menu.getBoundingClientRect(); + const width = Math.min(288, window.innerWidth - margin * 2); + const left = Math.min( + Math.max(triggerRect.left, margin), + window.innerWidth - width - margin, + ); + const fitsBelow = triggerRect.bottom + gap + menuRect.height <= window.innerHeight - margin; + const top = fitsBelow + ? triggerRect.bottom + gap + : Math.max(margin, triggerRect.top - gap - menuRect.height); + + setMenuPosition({ left, top, width }); + }; + + updatePosition(); + window.addEventListener("resize", updatePosition); + window.addEventListener("scroll", updatePosition, true); + return () => { + window.removeEventListener("resize", updatePosition); + window.removeEventListener("scroll", updatePosition, true); + }; + }, [open]); + + if (!items.length) return null; + return ( -
- -
-
- {items.map((item, index) => ( + <> + + + {open && typeof document !== "undefined" + ? createPortal(
0 ? "border-t border-[var(--border-subtle)]" : "", - index % 2 === 1 ? "md:border-l" : "", - index === 1 ? "md:border-t-0" : "", - ].join(" ").trim()} + ref={menuRef} + role="dialog" + aria-label="Информация о сотруднике" + data-app-popover-root="profile-information" + className="app-card fixed z-[110] max-h-[calc(100dvh-1.5rem)] overflow-y-auto rounded-xl p-1.5 shadow-xl" + style={{ + left: menuPosition?.left ?? 0, + top: menuPosition?.top ?? 0, + width: menuPosition?.width ?? 288, + visibility: menuPosition ? "visible" : "hidden", + }} > -

- {item.label} -

-

{item.value}

-
- ))} -
-
-
+ {items.map((item, index) => ( +
0 ? "border-t border-[var(--border-subtle)]" : ""} px-3 py-2.5`} + > +

+ {item.label} +

+

{item.value}

+
+ ))} +
, + document.body, + ) + : null} + ); } @@ -712,79 +820,182 @@ export function ProfileSkillsCard({ export function ProfileDepartmentBadge({ label, - href, + departments, }: { label: string; - href?: string; + departments: EmployeeDepartment[]; }) { - if (href) { + const [open, setOpen] = useState(false); + const [menuPosition, setMenuPosition] = useState<{ + left: number; + top: number; + width: number; + } | null>(null); + const triggerRef = useRef(null); + const menuRef = useRef(null); + + useEffect(() => { + if (!open) return; + + const handlePointerDown = (event: PointerEvent) => { + const target = event.target as Node; + if (!triggerRef.current?.contains(target) && !menuRef.current?.contains(target)) { + setOpen(false); + setMenuPosition(null); + } + }; + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape") { + setOpen(false); + setMenuPosition(null); + triggerRef.current?.focus(); + } + }; + + document.addEventListener("pointerdown", handlePointerDown); + document.addEventListener("keydown", handleKeyDown); + return () => { + document.removeEventListener("pointerdown", handlePointerDown); + document.removeEventListener("keydown", handleKeyDown); + }; + }, [open]); + + useLayoutEffect(() => { + if (!open) return; + + const updatePosition = () => { + const trigger = triggerRef.current; + const menu = menuRef.current; + if (!trigger || !menu) return; + + const margin = 12; + const gap = 8; + const triggerRect = trigger.getBoundingClientRect(); + const menuRect = menu.getBoundingClientRect(); + const width = Math.min(320, window.innerWidth - margin * 2); + const left = Math.min( + Math.max(triggerRect.left, margin), + window.innerWidth - width - margin, + ); + const fitsBelow = triggerRect.bottom + gap + menuRect.height <= window.innerHeight - margin; + const top = fitsBelow + ? triggerRect.bottom + gap + : Math.max(margin, triggerRect.top - gap - menuRect.height); + + setMenuPosition({ left, top, width }); + }; + + updatePosition(); + window.addEventListener("resize", updatePosition); + window.addEventListener("scroll", updatePosition, true); + return () => { + window.removeEventListener("resize", updatePosition); + window.removeEventListener("scroll", updatePosition, true); + }; + }, [open]); + + if (!departments.length) return null; + + if (departments.length === 1) { + const department = departments[0]; return ( - {label} + {label} ); } return ( - - {label} - - ); -} + <> + -export function ProfileDepartmentsCard({ - title = "Отделы", - departments, -}: { - title?: string; - departments: EmployeeDepartment[]; -}) { - if (!departments.length) { - return null; - } - - return ( -
- -
-
- {departments.map((department) => ( - - - {department.name} - - {department.role_name ? ( - - {department.role_name} - - ) : null} - {department.is_head ? ( - ( + { + setOpen(false); + setMenuPosition(null); + }} + className="flex min-w-0 items-center gap-2.5 rounded-lg px-3 py-2.5 text-left transition hover:bg-[var(--surface-tertiary)]" > - - - ) : null} - {department.via_assignment ? ( - - - - ) : null} - - ))} -
-
-
+ + + {department.name} + + {department.role_name ? ( + + {department.role_name} + + ) : null} + + {department.is_head ? ( + + + + ) : null} + {department.via_assignment ? ( + + + + ) : null} +
, + document.body, + ) + : null} + ); } diff --git a/frontend/src/lib/api/requests.ts b/frontend/src/lib/api/requests.ts index 7705e822..5d9e416c 100644 --- a/frontend/src/lib/api/requests.ts +++ b/frontend/src/lib/api/requests.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import type { RequestEmployeeStatistics, User } from '@/types/api'; +import type { EmployeeRequestProfileSummary, RequestEmployeeStatistics, User } from '@/types/api'; import type { RequestFn } from './utils'; export function createRequestsApi(request: RequestFn) { @@ -32,6 +32,8 @@ export function createRequestsApi(request: RequestFn) { request(`/api/v1/requests/${requestId}/employee-statistics/?period=${period}`), getEmployeeRequestStatistics: (employeeId: number, period: 'all' | 'year' | 'month' = 'all'): Promise => request(`/api/v1/requests/statistics/?employee_id=${employeeId}&period=${period}`), + getEmployeeRequestProfile: (employeeId: number, period: 'all' | 'year' | 'month' = 'all', limit = 5, page = 1): Promise => + request(`/api/v1/requests/employee-profile/?employee_id=${employeeId}&period=${period}&limit=${limit}&page=${page}`), getRequestRecipientOptions: (): Promise<{ restricted: boolean; results: User[] }> => request('/api/v1/requests/recipient-options/'), createRequest: (data: Record, saveAs?: 'draft' | 'submit') => formDataRequest('/api/v1/requests/', 'POST', data, saveAs), diff --git a/frontend/src/types/api.ts b/frontend/src/types/api.ts index 10a81725..ce76b4a2 100644 --- a/frontend/src/types/api.ts +++ b/frontend/src/types/api.ts @@ -1200,6 +1200,16 @@ export interface RequestEmployeeStatistics { unpaid_vacation_days: number; } +export interface EmployeeRequestProfileSummary { + count: number; + page: number; + total_pages: number; + has_previous: boolean; + has_next: boolean; + results: Request[]; + statistics: RequestEmployeeStatistics; +} + // Equipment types export interface EquipmentCategory { id: number; diff --git a/outputs/attendance_hire_report_20260825/analysis.json b/outputs/attendance_hire_report_20260825/analysis.json new file mode 100644 index 00000000..849cbfe4 --- /dev/null +++ b/outputs/attendance_hire_report_20260825/analysis.json @@ -0,0 +1,7309 @@ +[ + { + "sheet": "2026год", + "year": 2026, + "month": 1, + "monthName": "январь", + "headerRow": 2, + "employees": [ + { + "row": 3, + "name": "Александр Авдеев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 4, + "name": "Андрей Дроботов", + "firstDay": 5, + "firstMark": "6", + "nonblankMarks": 21 + }, + { + "row": 5, + "name": "Андрей Русаков", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 6, + "name": "Анна Егазарян", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 7, + "name": "Анатолий Титов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 15 + }, + { + "row": 8, + "name": "Антон Смалев", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 9, + "name": "Анатолий Меджидов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 10, + "name": "Антон Алюшин", + "firstDay": 5, + "firstMark": "от", + "nonblankMarks": 24 + }, + { + "row": 11, + "name": "Борис Канзафаров", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 12, + "name": "Вика", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 13, + "name": "Владислав Синяков", + "firstDay": 12, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 14, + "name": "Вика Линько", + "firstDay": 5, + "firstMark": "0", + "nonblankMarks": 21 + }, + { + "row": 15, + "name": "Виталий Питниченко", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 7 + }, + { + "row": 16, + "name": "Виталик", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 17, + "name": "Вова Леонтьев", + "firstDay": 5, + "firstMark": "4", + "nonblankMarks": 21 + }, + { + "row": 18, + "name": "Вова Милютин", + "firstDay": 5, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 19, + "name": "Вова Соковинов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 20, + "name": "Генрих", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 21, + "name": "Данил Зебольд", + "firstDay": 5, + "firstMark": "2.5", + "nonblankMarks": 16 + }, + { + "row": 22, + "name": "Данил Токарев", + "firstDay": 5, + "firstMark": "6", + "nonblankMarks": 21 + }, + { + "row": 23, + "name": "Данила Батченко", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 24, + "name": "Евгений Павлов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 25, + "name": "Екатерина Ячменёва", + "firstDay": 5, + "firstMark": "3.5", + "nonblankMarks": 21 + }, + { + "row": 26, + "name": "Егор", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 27, + "name": "Елисеев Александр", + "firstDay": 5, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 28, + "name": "Идрис", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 29, + "name": "Игорь Надеин", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 30, + "name": "Костя Макаев", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 31, + "name": "Максим Селедцов", + "firstDay": 5, + "firstMark": "бол", + "nonblankMarks": 21 + }, + { + "row": 32, + "name": "Мезенцев Николай", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 33, + "name": "Меланя", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 34, + "name": "Михаил Омельянов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 35, + "name": "Олег Алоян", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 36, + "name": "Олег Ананьев", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 37, + "name": "Олег Краснощеков", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 38, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "ОТ", + "nonblankMarks": 21 + }, + { + "row": 39, + "name": "Олеся", + "firstDay": 5, + "firstMark": "4", + "nonblankMarks": 20 + }, + { + "row": 40, + "name": "Паша", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 41, + "name": "Понамарев Алексей", + "firstDay": 5, + "firstMark": "Б", + "nonblankMarks": 21 + }, + { + "row": 42, + "name": "Русик", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 43, + "name": "Сергей Бондарь", + "firstDay": 5, + "firstMark": "ОТ", + "nonblankMarks": 21 + }, + { + "row": 44, + "name": "Сергей Карнаухов", + "firstDay": 5, + "firstMark": "увол", + "nonblankMarks": 2 + }, + { + "row": 45, + "name": "Сергей Немакин", + "firstDay": 5, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 46, + "name": "Тимур Попов", + "firstDay": 5, + "firstMark": "0", + "nonblankMarks": 21 + }, + { + "row": 47, + "name": "Ястребов Святослав", + "firstDay": 5, + "firstMark": "ОТ", + "nonblankMarks": 22 + }, + { + "row": 48, + "name": "Ярош Данил", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 49, + "name": "Белогрудова Лилия", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 50, + "name": "Шихалев Вячеслав", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 51, + "name": "Костя Труфанов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 52, + "name": "Вова Лычманов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 21 + } + ] + }, + { + "sheet": "2026год", + "year": 2026, + "month": 2, + "monthName": "февраль", + "headerRow": 55, + "employees": [ + { + "row": 56, + "name": "Александр Авдеев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 57, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 58, + "name": "Андрей Русаков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 59, + "name": "Анна Егазарян", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 60, + "name": "Антон Смалев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 61, + "name": "Анатолий Меджидов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 62, + "name": "Антон Алюшин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 63, + "name": "Борис Канзафаров", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 64, + "name": "Вика", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 65, + "name": "Владислав Синяков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 66, + "name": "Вика Линько", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 2 + }, + { + "row": 67, + "name": "Виталик", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 68, + "name": "Вова Леонтьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 69, + "name": "Вова Милютин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 70, + "name": "Вова Соковинов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 71, + "name": "Генрих", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 72, + "name": "Данил Зебольд", + "firstDay": 9, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 73, + "name": "Данил Токарев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 74, + "name": "Данила Батченко", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 75, + "name": "Евгений Павлов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 76, + "name": "Екатерина Ячменёва", + "firstDay": 2, + "firstMark": "4.5", + "nonblankMarks": 21 + }, + { + "row": 77, + "name": "Егор", + "firstDay": 2, + "firstMark": "3", + "nonblankMarks": 21 + }, + { + "row": 78, + "name": "Елисеев Александр", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 79, + "name": "Идрис", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 80, + "name": "Игорь Надеин", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 23 + }, + { + "row": 81, + "name": "Костя Макаев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 82, + "name": "Максим Селедцов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 83, + "name": "Мезенцев Николай", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 84, + "name": "Меланя", + "firstDay": 2, + "firstMark": "2.5", + "nonblankMarks": 21 + }, + { + "row": 85, + "name": "Михаил Омельянов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 86, + "name": "Олег Алоян", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 87, + "name": "Олег Ананьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 88, + "name": "Олег Краснощеков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 89, + "name": "Олеся", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 90, + "name": "Паша", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 91, + "name": "Понамарев Алексей", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 12 + }, + { + "row": 92, + "name": "Русик", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 93, + "name": "Сергей Бондарь", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 94, + "name": "Сергей Немакин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 95, + "name": "Тимур Попов", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 96, + "name": "Ястребов Святослав", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 97, + "name": "Ярош Данил", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 98, + "name": "Белогрудова Лилия", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 99, + "name": "Шихалев Вячеслав", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 100, + "name": "Костя Труфанов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 101, + "name": "Вова Лычманов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + } + ] + }, + { + "sheet": "2026год", + "year": 2026, + "month": 3, + "monthName": "март", + "headerRow": 104, + "employees": [ + { + "row": 105, + "name": "Александр Авдеев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 106, + "name": "Андрей Дроботов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 107, + "name": "Андрей Русаков", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 108, + "name": "Анна Егазарян", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 109, + "name": "Антон Смалев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 110, + "name": "Анатолий Меджидов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 111, + "name": "Антон Алюшин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 112, + "name": "Борис Канзафаров", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 113, + "name": "Вика", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 114, + "name": "Владислав Синяков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 115, + "name": "Виталик", + "firstDay": 2, + "firstMark": "5.5", + "nonblankMarks": 22 + }, + { + "row": 116, + "name": "Вова Леонтьев", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 117, + "name": "Вова Милютин", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 118, + "name": "Вова Соковинов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 119, + "name": "Генрих", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 120, + "name": "Данил Зебольд", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 121, + "name": "Данил Токарев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 122, + "name": "Данила Батченко", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 123, + "name": "Евгений Павлов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 5 + }, + { + "row": 124, + "name": "Екатерина Ячменёва", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 125, + "name": "Егор", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 126, + "name": "Елисеев Александр", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 127, + "name": "Идрис", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 128, + "name": "Игорь Надеин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 129, + "name": "Костя Макаев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 130, + "name": "Максим Селедцов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 131, + "name": "Мезенцев Николай", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 132, + "name": "Меланя", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 133, + "name": "Михаил Омельянов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 134, + "name": "Олег Алоян", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 135, + "name": "Олег Ананьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 136, + "name": "Олег Краснощеков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 137, + "name": "Олеся", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 138, + "name": "Паша", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 139, + "name": "Русик", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 140, + "name": "Сергей Бондарь", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 141, + "name": "Сергей Немакин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 142, + "name": "Тимур Попов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 143, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "2", + "nonblankMarks": 25 + }, + { + "row": 144, + "name": "Ярош Данил", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 145, + "name": "Белогрудова Лилия", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 146, + "name": "Шихалев Вячеслав", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 147, + "name": "Костя Труфанов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 148, + "name": "Вова Лычманов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 16 + } + ] + }, + { + "sheet": "2026год", + "year": 2026, + "month": 4, + "monthName": "апрель", + "headerRow": 151, + "employees": [ + { + "row": 152, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 153, + "name": "Андрей Русаков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 154, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 155, + "name": "Антон Смалев", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 23 + }, + { + "row": 156, + "name": "Анатолий Меджидов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 157, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 158, + "name": "Борис Канзафаров", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 159, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 160, + "name": "Владислав Синяков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 161, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 162, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 163, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 164, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 23 + }, + { + "row": 165, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 166, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 167, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "отп", + "nonblankMarks": 23 + }, + { + "row": 168, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 169, + "name": "Евгений Павлов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 170, + "name": "Екатерина Ячменёва", + "firstDay": 1, + "firstMark": "4.5", + "nonblankMarks": 23 + }, + { + "row": 171, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 172, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 173, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 174, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 175, + "name": "Максим Селедцов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 176, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 177, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 178, + "name": "Михаил Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 179, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 180, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 181, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 182, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 183, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 184, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 185, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 186, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 22 + }, + { + "row": 187, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 188, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 27 + }, + { + "row": 189, + "name": "Ярош Данил", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 190, + "name": "Белогрудова Лилия", + "firstDay": 1, + "firstMark": "3.5", + "nonblankMarks": 21 + }, + { + "row": 191, + "name": "Шихалев Вячеслав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 192, + "name": "Костя Труфанов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + } + ] + }, + { + "sheet": "2026год", + "year": 2026, + "month": 5, + "monthName": "май", + "headerRow": 196, + "employees": [ + { + "row": 197, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 198, + "name": "Андрей Русаков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 199, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 200, + "name": "Антон Смалев", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 17 + }, + { + "row": 201, + "name": "Анатолий Меджидов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 202, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 203, + "name": "Борис Канзафаров", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 204, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 205, + "name": "Владислав Синяков", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 26 + }, + { + "row": 206, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 207, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 208, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 209, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 210, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 211, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 212, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "2.5", + "nonblankMarks": 22 + }, + { + "row": 213, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 214, + "name": "Екатерина Ячменёва", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 22 + }, + { + "row": 215, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 216, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 217, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 218, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 219, + "name": "Максим Селедцов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 220, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5.4", + "nonblankMarks": 22 + }, + { + "row": 221, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 222, + "name": "Михаил Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 13 + }, + { + "row": 223, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 224, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 225, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 226, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 227, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 228, + "name": "Русик", + "firstDay": 1, + "firstMark": "5.5", + "nonblankMarks": 22 + }, + { + "row": 229, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 230, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 231, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 22 + }, + { + "row": 232, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 233, + "name": "Ярош Данил", + "firstDay": 1, + "firstMark": "Б", + "nonblankMarks": 22 + }, + { + "row": 234, + "name": "Белогрудова Лилия", + "firstDay": 1, + "firstMark": "4.5", + "nonblankMarks": 3 + }, + { + "row": 235, + "name": "Шихалев Вячеслав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 236, + "name": "Костя Труфанов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 237, + "name": "Станислав Кухлеев", + "firstDay": 25, + "firstMark": "5", + "nonblankMarks": 6 + } + ] + }, + { + "sheet": "2026год", + "year": 2026, + "month": 6, + "monthName": "июнь", + "headerRow": 241, + "employees": [ + { + "row": 242, + "name": "Алиса Гжимайло", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 243, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 244, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 245, + "name": "Анатолий Меджидов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 246, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 247, + "name": "Борис Канзафаров", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 248, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 249, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 11 + }, + { + "row": 250, + "name": "Вадим Геращенко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 251, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 252, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 253, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 254, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 255, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 256, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 257, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 258, + "name": "Екатерина Ячменёва", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 259, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 260, + "name": "Елизавета Исакова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 261, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 262, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 263, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 264, + "name": "Липов Евгений", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 265, + "name": "Максим Селедцов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 266, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 267, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 268, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 269, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 270, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 271, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 272, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 273, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 274, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 275, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "отп", + "nonblankMarks": 24 + }, + { + "row": 276, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 277, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 278, + "name": "Ярош Данил", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 279, + "name": "Шихалев Вячеслав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 280, + "name": "Костя Труфанов", + "firstDay": 1, + "firstMark": "5.5", + "nonblankMarks": 23 + }, + { + "row": 281, + "name": "Станислав Кухлеев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 12 + } + ] + }, + { + "sheet": "2026год", + "year": 2026, + "month": 7, + "monthName": "июль", + "headerRow": 285, + "employees": [ + { + "row": 286, + "name": "Алиса Гжимайло", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 287, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 288, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 289, + "name": "Анатолий Меджидов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 290, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 291, + "name": "Борис Канзафаров", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 292, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 293, + "name": "Вадим Геращенко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 294, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 295, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 296, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 297, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 298, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 299, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 300, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "6,5", + "nonblankMarks": 24 + }, + { + "row": 301, + "name": "Екатерина Ячменёва", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 302, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 303, + "name": "Елизавета Исакова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 304, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 305, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 306, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 307, + "name": "Липов Евгений", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 308, + "name": "Максим Селедцов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 309, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5,5", + "nonblankMarks": 24 + }, + { + "row": 310, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 311, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 312, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 313, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 314, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 315, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 316, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 317, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "2.5", + "nonblankMarks": 24 + }, + { + "row": 318, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 319, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 320, + "name": "Ястребов Святослав", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 321, + "name": "Ярош Данил", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 322, + "name": "Слава", + "firstDay": 1, + "firstMark": "6.5", + "nonblankMarks": 24 + } + ] + }, + { + "sheet": "2026год", + "year": 2026, + "month": 8, + "monthName": "август", + "headerRow": 326, + "employees": [ + { + "row": 327, + "name": "Алиса Гжимайло", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 7 + }, + { + "row": 328, + "name": "Андрей Дроботов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 329, + "name": "Анна Егазарян", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 330, + "name": "Анатолий Меджидов", + "firstDay": 3, + "firstMark": "отп", + "nonblankMarks": 18 + }, + { + "row": 331, + "name": "Антон Алюшин", + "firstDay": 3, + "firstMark": "отп", + "nonblankMarks": 18 + }, + { + "row": 332, + "name": "Борис Канзафаров", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 8 + }, + { + "row": 333, + "name": "Вика", + "firstDay": 3, + "firstMark": "4.5", + "nonblankMarks": 18 + }, + { + "row": 334, + "name": "Вадим Геращенко", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 13 + }, + { + "row": 335, + "name": "Вова Леонтьев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 336, + "name": "Вова Милютин", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 337, + "name": "Вова Соковинов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 19 + }, + { + "row": 338, + "name": "Генрих", + "firstDay": 3, + "firstMark": "4.5", + "nonblankMarks": 18 + }, + { + "row": 339, + "name": "Данил Зебольд", + "firstDay": 3, + "firstMark": "0", + "nonblankMarks": 7 + }, + { + "row": 340, + "name": "Данил Токарев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 341, + "name": "Данила Батченко", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 13 + }, + { + "row": 342, + "name": "Екатерина Ячменёва", + "firstDay": 3, + "firstMark": "отп", + "nonblankMarks": 18 + }, + { + "row": 343, + "name": "Егор", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 344, + "name": "Елизавета Исакова", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 345, + "name": "Елисеев Александр", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 346, + "name": "Игорь Надеин", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 347, + "name": "Костя Макаев", + "firstDay": 3, + "firstMark": "бол", + "nonblankMarks": 15 + }, + { + "row": 348, + "name": "Липов Евгений", + "firstDay": 3, + "firstMark": "5.5", + "nonblankMarks": 18 + }, + { + "row": 349, + "name": "Максим Селедцов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 350, + "name": "Мезенцев Николай", + "firstDay": 3, + "firstMark": "5.5", + "nonblankMarks": 7 + }, + { + "row": 351, + "name": "Меланя", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 352, + "name": "Олег Алоян", + "firstDay": 17, + "firstMark": "5", + "nonblankMarks": 2 + }, + { + "row": 353, + "name": "Олег Ананьев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 354, + "name": "Олег Краснощеков", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 355, + "name": "Олеся", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 9 + }, + { + "row": 356, + "name": "Паша", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 14 + }, + { + "row": 357, + "name": "Русик", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 14 + }, + { + "row": 358, + "name": "Сергей Бондарь", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 359, + "name": "Сергей Немакин", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 360, + "name": "Тимур Попов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 361, + "name": "Ястребов Святослав", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 9 + }, + { + "row": 362, + "name": "Ярош Данил", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 363, + "name": "Слава", + "firstDay": 3, + "firstMark": "отп", + "nonblankMarks": 17 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 1, + "monthName": "январь", + "headerRow": 2, + "employees": [ + { + "row": 3, + "name": "Русик", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 4, + "name": "Олег Ананьев", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 5, + "name": "Паша", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 6, + "name": "Миша Омельянов", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 7, + "name": "Генрих", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 8, + "name": "Вика", + "firstDay": 6, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 9, + "name": "Олег Краснощеков", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 10, + "name": "Антон Алюшин", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 11, + "name": "Лера", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 12, + "name": "Вова Леонтьев", + "firstDay": 6, + "firstMark": "6", + "nonblankMarks": 21 + }, + { + "row": 13, + "name": "Вова Милютин", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 14, + "name": "Вова Соковинов", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 15, + "name": "Максим", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 16, + "name": "Виталик", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 17, + "name": "Тимур Попов", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 18, + "name": "Данил Токарев", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 19, + "name": "Данил Зебольд", + "firstDay": 6, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 20, + "name": "Сергей Карнаухов", + "firstDay": 6, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 21, + "name": "Костя Макаев", + "firstDay": 3, + "firstMark": "7", + "nonblankMarks": 24 + }, + { + "row": 22, + "name": "Леша Лизин", + "firstDay": 2, + "firstMark": "7", + "nonblankMarks": 27 + }, + { + "row": 23, + "name": "Настя Козлова", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 24, + "name": "повар", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 25, + "name": "Лера Коптева", + "firstDay": 6, + "firstMark": "от", + "nonblankMarks": 2 + }, + { + "row": 26, + "name": "Люда", + "firstDay": 6, + "firstMark": "от", + "nonblankMarks": 2 + }, + { + "row": 27, + "name": "Лена уборщица", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 28, + "name": "Артем", + "firstDay": 2, + "firstMark": "3", + "nonblankMarks": 21 + }, + { + "row": 29, + "name": "Егор", + "firstDay": 17, + "firstMark": "5", + "nonblankMarks": 12 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 2, + "monthName": "февраль", + "headerRow": 33, + "employees": [ + { + "row": 34, + "name": "Русик", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 35, + "name": "Олег Ананьев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 36, + "name": "Паша", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 22 + }, + { + "row": 37, + "name": "Миша Омельянов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 38, + "name": "Генрих", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 39, + "name": "Вика", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 40, + "name": "Олег Краснощеков", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 41, + "name": "Антон Алюшин", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 22 + }, + { + "row": 42, + "name": "Лера", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 43, + "name": "Вова Леонтьев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 44, + "name": "Вова Милютин", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 45, + "name": "Вова Соковинов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 46, + "name": "Максим", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 47, + "name": "Виталик", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 48, + "name": "Тимур Попов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 49, + "name": "Данил Токарев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 22 + }, + { + "row": 50, + "name": "Данил Зебольд", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 51, + "name": "Сергей Карнаухов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 52, + "name": "Костя Макаев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 53, + "name": "Настя Козлова", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 54, + "name": "Меланя", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 55, + "name": "Артем", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + }, + { + "row": 56, + "name": "Егор", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 21 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 3, + "monthName": "март", + "headerRow": 59, + "employees": [ + { + "row": 60, + "name": "Русик", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 61, + "name": "Олег Ананьев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 62, + "name": "Паша", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 63, + "name": "Миша Омельянов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 11 + }, + { + "row": 64, + "name": "Генрих", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 65, + "name": "Вика", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 66, + "name": "Олег Краснощеков", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 67, + "name": "Антон Алюшин", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 68, + "name": "Лера", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 69, + "name": "Вова Леонтьев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 70, + "name": "Вова Милютин", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 71, + "name": "Вова Соковинов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 72, + "name": "Максим", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 73, + "name": "Виталик", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 74, + "name": "Тимур Попов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 75, + "name": "Данил Токарев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 76, + "name": "Данил Зебольд", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 77, + "name": "Сергей Карнаухов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 78, + "name": "Костя Макаев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 79, + "name": "Настя Козлова", + "firstDay": 3, + "firstMark": "0", + "nonblankMarks": 22 + }, + { + "row": 80, + "name": "Меланя", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 81, + "name": "Артем", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 82, + "name": "Егор", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 83, + "name": "Даниил Шеламов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 84, + "name": "Вика Линько", + "firstDay": 17, + "firstMark": "5", + "nonblankMarks": 12 + }, + { + "row": 85, + "name": "Саша Гавришов", + "firstDay": 13, + "firstMark": "5", + "nonblankMarks": 8 + }, + { + "row": 86, + "name": "Саша Елисеев", + "firstDay": 12, + "firstMark": "5", + "nonblankMarks": 15 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 4, + "monthName": "апрель", + "headerRow": 90, + "employees": [ + { + "row": 91, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 92, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 93, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 94, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 95, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 96, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 97, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 98, + "name": "Лера", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 99, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 100, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 101, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 102, + "name": "Максим", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 103, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 104, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 105, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 106, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 107, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 108, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 109, + "name": "Настя Козлова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 110, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 111, + "name": "Артем", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 112, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 113, + "name": "Вика Линько", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 114, + "name": "Саша Елисеев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 115, + "name": "Влад Рудь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 116, + "name": "Понамарев Алексей", + "firstDay": 7, + "firstMark": "5", + "nonblankMarks": 19 + }, + { + "row": 117, + "name": "Мезенцев Николай", + "firstDay": 8, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 118, + "name": "Денис Гудков", + "firstDay": 17, + "firstMark": "5", + "nonblankMarks": 7 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 5, + "monthName": "май", + "headerRow": 121, + "employees": [ + { + "row": 122, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 123, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 124, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 125, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 126, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 127, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 128, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 24 + }, + { + "row": 129, + "name": "Лера", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 130, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 23 + }, + { + "row": 131, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 132, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 133, + "name": "Максим", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 134, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 135, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 23 + }, + { + "row": 136, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 137, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 138, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 23 + }, + { + "row": 139, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 140, + "name": "Настя Козлова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 141, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 142, + "name": "Артем", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 143, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 144, + "name": "Вика Линько", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 23 + }, + { + "row": 145, + "name": "Саша Елисеев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 146, + "name": "Влад Рудь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 147, + "name": "Понамарев Алексей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 148, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 6, + "monthName": "июнь", + "headerRow": 152, + "employees": [ + { + "row": 153, + "name": "Антон Алюшин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 154, + "name": "Вика Зацарина", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 155, + "name": "Вика Линько", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 156, + "name": "Виталик", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 157, + "name": "Влад Рудь", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 158, + "name": "Вова Леонтьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 159, + "name": "Вова Милютин", + "firstDay": 2, + "firstMark": "0", + "nonblankMarks": 22 + }, + { + "row": 160, + "name": "Вова Соковинов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 161, + "name": "Генрих", + "firstDay": 2, + "firstMark": "2.5", + "nonblankMarks": 22 + }, + { + "row": 162, + "name": "Данил Зебольд", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 163, + "name": "Данил Токарев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 164, + "name": "Егор", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 165, + "name": "Костя Макаев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 166, + "name": "Лера", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 167, + "name": "Максим", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 168, + "name": "Мезенцев Николай", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 169, + "name": "Меланя", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 170, + "name": "Настя Козлова", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 6 + }, + { + "row": 171, + "name": "Олег Ананьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 172, + "name": "Олег Краснощеков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 173, + "name": "Паша", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 174, + "name": "Понамарев Алексей", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 175, + "name": "Русик", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 176, + "name": "Саша Елисеев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 177, + "name": "Сергей Карнаухов", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 178, + "name": "Сергей Немакин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 179, + "name": "Тимур Попов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 180, + "name": "Храмов Антон", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 181, + "name": "Садыков Ибрагим", + "firstDay": 9, + "firstMark": "0", + "nonblankMarks": 11 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 7, + "monthName": "июль", + "headerRow": 184, + "employees": [ + { + "row": 185, + "name": "Андрей Русаков", + "firstDay": 21, + "firstMark": "5", + "nonblankMarks": 10 + }, + { + "row": 186, + "name": "Андрей Дроботов", + "firstDay": 10, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 187, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 188, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 189, + "name": "Вика Линько", + "firstDay": 1, + "firstMark": "ОТ", + "nonblankMarks": 24 + }, + { + "row": 190, + "name": "Виталик", + "firstDay": 1, + "firstMark": "ОТ", + "nonblankMarks": 23 + }, + { + "row": 191, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 192, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 193, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 194, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 195, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 196, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 197, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 198, + "name": "Егор", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 24 + }, + { + "row": 199, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 200, + "name": "Лера", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 201, + "name": "Максим", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 202, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 203, + "name": "Меланя", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 24 + }, + { + "row": 204, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 205, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 206, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 207, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 208, + "name": "Понамарев Алексей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 209, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 210, + "name": "Салим Кумыков", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 211, + "name": "Саша Елисеев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 212, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 213, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 214, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 215, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 216, + "name": "Храмов Антон", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 217, + "name": "Чечун Андрей", + "firstDay": 24, + "firstMark": "5", + "nonblankMarks": 7 + }, + { + "row": 218, + "name": "Ястребов Святослав", + "firstDay": 21, + "firstMark": "5", + "nonblankMarks": 10 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 8, + "monthName": "август", + "headerRow": 221, + "employees": [ + { + "row": 222, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 223, + "name": "Андрей Русаков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 224, + "name": "Анна Егазарян", + "firstDay": 11, + "firstMark": "с", + "nonblankMarks": 12 + }, + { + "row": 225, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 226, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 227, + "name": "Вика Линько", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 228, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 229, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 230, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 231, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 232, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 233, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 234, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 235, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 236, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 237, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 238, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 239, + "name": "Лера", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 240, + "name": "Максим", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 241, + "name": "Миша Иванов", + "firstDay": 4, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 242, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 243, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 244, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 245, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 246, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 247, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 248, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 19 + }, + { + "row": 249, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 27 + }, + { + "row": 250, + "name": "Понамарев Алексей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 251, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 252, + "name": "Салим Кумыков", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 253, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 254, + "name": "Святослав", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 255, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 256, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 22 + }, + { + "row": 257, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 20 + }, + { + "row": 258, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 259, + "name": "Чечун Андрей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 17 + }, + { + "row": 260, + "name": "Валерия Родченко", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 261, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 9, + "monthName": "сентябрь", + "headerRow": 264, + "employees": [ + { + "row": 265, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 266, + "name": "Андрей Русаков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 267, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 268, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 269, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 270, + "name": "Владислав Синяков", + "firstDay": 8, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 271, + "name": "Вика Линько", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 272, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 273, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 274, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 275, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 23 + }, + { + "row": 276, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 277, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 278, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 279, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 280, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 281, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 282, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 283, + "name": "Лера", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 284, + "name": "Максим Волков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 285, + "name": "Максим Селедцов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 286, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 287, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 288, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 289, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 290, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 291, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 292, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 293, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 294, + "name": "Понамарев Алексей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 295, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 296, + "name": "Салим Кумыков", + "firstDay": 4, + "firstMark": "5", + "nonblankMarks": 2 + }, + { + "row": 297, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 298, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 299, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 300, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 301, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 302, + "name": "Валерия Родченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 10, + "monthName": "октябрь", + "headerRow": 309, + "employees": [ + { + "row": 310, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 311, + "name": "Андрей Русаков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 312, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 313, + "name": "Антон Смалев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 314, + "name": "Анатолий Меджитов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 315, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 316, + "name": "Борис Канзафаров", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 317, + "name": "Вика", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 24 + }, + { + "row": 318, + "name": "Владислав Синяков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 319, + "name": "Вика Линько", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 320, + "name": "Виталик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 321, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 322, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 323, + "name": "Валерия Родченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 8 + }, + { + "row": 324, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "3.5", + "nonblankMarks": 25 + }, + { + "row": 325, + "name": "Генрих", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 24 + }, + { + "row": 326, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 24 + }, + { + "row": 327, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 328, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 329, + "name": "Екатерина Ячменёва", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 330, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 331, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 332, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 333, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 334, + "name": "Казак Антон", + "firstDay": 1, + "firstMark": "3", + "nonblankMarks": 24 + }, + { + "row": 335, + "name": "Лера", + "firstDay": 1, + "firstMark": "2", + "nonblankMarks": 24 + }, + { + "row": 336, + "name": "Максим Волков", + "firstDay": 1, + "firstMark": "5.5", + "nonblankMarks": 25 + }, + { + "row": 337, + "name": "Максим Селедцов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 338, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 339, + "name": "Меланя", + "firstDay": 1, + "firstMark": "4.5", + "nonblankMarks": 24 + }, + { + "row": 340, + "name": "Михаил Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 341, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "2", + "nonblankMarks": 24 + }, + { + "row": 342, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 343, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 344, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 345, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 15 + }, + { + "row": 346, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 347, + "name": "Понамарев Алексей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 348, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 349, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 24 + }, + { + "row": 350, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 351, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 352, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 353, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 354, + "name": "Ярош Данил", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 11, + "monthName": "ноябрь", + "headerRow": 357, + "employees": [ + { + "row": 358, + "name": "Андрей Дроботов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 359, + "name": "Андрей Русаков", + "firstDay": 1, + "firstMark": "4.5", + "nonblankMarks": 22 + }, + { + "row": 360, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "4.5", + "nonblankMarks": 23 + }, + { + "row": 361, + "name": "Антон Смалев", + "firstDay": 3, + "firstMark": "0", + "nonblankMarks": 21 + }, + { + "row": 362, + "name": "Анатолий Меджитов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 363, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 364, + "name": "Борис Канзафаров", + "firstDay": 2, + "firstMark": "7", + "nonblankMarks": 22 + }, + { + "row": 365, + "name": "Вика", + "firstDay": 3, + "firstMark": "5.5", + "nonblankMarks": 22 + }, + { + "row": 366, + "name": "Владислав Синяков", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 367, + "name": "Вика Линько", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 368, + "name": "Виталик", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 369, + "name": "Вова Леонтьев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 370, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 22 + }, + { + "row": 371, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "3", + "nonblankMarks": 22 + }, + { + "row": 372, + "name": "Генрих", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 373, + "name": "Данил Зебольд", + "firstDay": 2, + "firstMark": "7", + "nonblankMarks": 22 + }, + { + "row": 374, + "name": "Данил Токарев", + "firstDay": 3, + "firstMark": "5.5", + "nonblankMarks": 21 + }, + { + "row": 375, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "4", + "nonblankMarks": 22 + }, + { + "row": 376, + "name": "Екатерина Ячменёва", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 377, + "name": "Егор", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 378, + "name": "Елисеев Александр", + "firstDay": 3, + "firstMark": "5.5", + "nonblankMarks": 21 + }, + { + "row": 379, + "name": "Игорь Надеин", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 380, + "name": "Костя Макаев", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 26 + }, + { + "row": 381, + "name": "Лера", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 18 + }, + { + "row": 382, + "name": "Максим Волков", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 383, + "name": "Максим Селедцов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 384, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 385, + "name": "Меланя", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 386, + "name": "Михаил Омельянов", + "firstDay": 1, + "firstMark": "5.5", + "nonblankMarks": 23 + }, + { + "row": 387, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "2", + "nonblankMarks": 23 + }, + { + "row": 388, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 389, + "name": "Олег Краснощеков", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 390, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "4.5", + "nonblankMarks": 22 + }, + { + "row": 391, + "name": "Олеся", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 392, + "name": "Паша", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 393, + "name": "Понамарев Алексей", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 394, + "name": "Русик", + "firstDay": 3, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 395, + "name": "Сергей Бондарь", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 396, + "name": "Сергей Карнаухов", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 397, + "name": "Сергей Немакин", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 398, + "name": "Тимур Попов", + "firstDay": 2, + "firstMark": "7", + "nonblankMarks": 22 + }, + { + "row": 399, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 400, + "name": "Ярош Данил", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 12, + "monthName": "декабрь", + "headerRow": 403, + "employees": [ + { + "row": 404, + "name": "Александр Авдеев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 0 + }, + { + "row": 405, + "name": "Андрей Дроботов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 406, + "name": "Андрей Русаков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 407, + "name": "Анна Егазарян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 408, + "name": "Анатолий Титов", + "firstDay": 4, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 409, + "name": "Антон Смалев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 410, + "name": "Анатолий Меджитов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 411, + "name": "Антон Алюшин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 28 + }, + { + "row": 412, + "name": "Борис Канзафаров", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 413, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 414, + "name": "Владислав Синяков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 415, + "name": "Вика Линько", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 416, + "name": "Виталий Питниченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 417, + "name": "Виталик", + "firstDay": 1, + "firstMark": "4.5", + "nonblankMarks": 23 + }, + { + "row": 418, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 23 + }, + { + "row": 419, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 420, + "name": "Вова Соковинов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 421, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 422, + "name": "Данил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 423, + "name": "Данил Токарев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 424, + "name": "Данила Батченко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 425, + "name": "Евгений Павлов", + "firstDay": 8, + "firstMark": "5", + "nonblankMarks": 18 + }, + { + "row": 426, + "name": "Екатерина Ячменёва", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 427, + "name": "Егор", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 428, + "name": "Елисеев Александр", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 429, + "name": "Идрис", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 430, + "name": "Игорь Надеин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 431, + "name": "Костя Макаев", + "firstDay": 1, + "firstMark": "7", + "nonblankMarks": 23 + }, + { + "row": 432, + "name": "Лера", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 433, + "name": "Максим Волков", + "firstDay": 1, + "firstMark": "5.5", + "nonblankMarks": 23 + }, + { + "row": 434, + "name": "Максим Селедцов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 435, + "name": "Мезенцев Николай", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 436, + "name": "Меланя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 437, + "name": "Михаил Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 438, + "name": "Олег Алоян", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 439, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 440, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 441, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 442, + "name": "Олеся", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 443, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 444, + "name": "Понамарев Алексей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 445, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 446, + "name": "Сергей Бондарь", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 447, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "отгул", + "nonblankMarks": 23 + }, + { + "row": 448, + "name": "Сергей Немакин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 449, + "name": "Тимур Попов", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 23 + }, + { + "row": 450, + "name": "Ястребов Святослав", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 23 + }, + { + "row": 451, + "name": "Ярош Данил", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 452, + "name": "Белогрудова Лилия", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 453, + "name": "Шихалев Вячеслав", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 454, + "name": "Костя Труфанов", + "firstDay": 15, + "firstMark": "5", + "nonblankMarks": 13 + }, + { + "row": 455, + "name": "Вова Лычманов", + "firstDay": 11, + "firstMark": "5", + "nonblankMarks": 15 + } + ] + }, + { + "sheet": "2025год", + "year": 2025, + "month": 1, + "monthName": "январь", + "headerRow": 458, + "employees": [ + { + "row": 459, + "name": "Александр Авдеев", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 460, + "name": "Андрей Дроботов", + "firstDay": 5, + "firstMark": "6", + "nonblankMarks": 5 + }, + { + "row": 461, + "name": "Андрей Русаков", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 462, + "name": "Анна Егазарян", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 5 + }, + { + "row": 463, + "name": "Анатолий Титов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 464, + "name": "Антон Смалев", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 5 + }, + { + "row": 465, + "name": "Анатолий Меджидов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 466, + "name": "Антон Алюшин", + "firstDay": 5, + "firstMark": "от", + "nonblankMarks": 6 + }, + { + "row": 467, + "name": "Борис Канзафаров", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 468, + "name": "Вика", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 3 + }, + { + "row": 469, + "name": "Владислав Синяков", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 470, + "name": "Вика Линько", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 471, + "name": "Виталий Питниченко", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 5 + }, + { + "row": 472, + "name": "Виталик", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 2 + }, + { + "row": 473, + "name": "Вова Леонтьев", + "firstDay": 5, + "firstMark": "4", + "nonblankMarks": 6 + }, + { + "row": 474, + "name": "Вова Милютин", + "firstDay": 5, + "firstMark": "от", + "nonblankMarks": 6 + }, + { + "row": 475, + "name": "Вова Соковинов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 476, + "name": "Генрих", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 3 + }, + { + "row": 477, + "name": "Данил Зебольд", + "firstDay": 5, + "firstMark": "2.5", + "nonblankMarks": 5 + }, + { + "row": 478, + "name": "Данил Токарев", + "firstDay": 5, + "firstMark": "6", + "nonblankMarks": 5 + }, + { + "row": 479, + "name": "Данила Батченко", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 480, + "name": "Евгений Павлов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 481, + "name": "Екатерина Ячменёва", + "firstDay": 5, + "firstMark": "3.5", + "nonblankMarks": 5 + }, + { + "row": 482, + "name": "Егор", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 483, + "name": "Елисеев Александр", + "firstDay": 5, + "firstMark": "6", + "nonblankMarks": 6 + }, + { + "row": 484, + "name": "Идрис", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 4 + }, + { + "row": 485, + "name": "Игорь Надеин", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 5 + }, + { + "row": 486, + "name": "Костя Макаев", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 487, + "name": "Максим Селедцов", + "firstDay": 5, + "firstMark": "бол", + "nonblankMarks": 6 + }, + { + "row": 488, + "name": "Мезенцев Николай", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 489, + "name": "Меланя", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 490, + "name": "Михаил Омельянов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 491, + "name": "Олег Алоян", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 492, + "name": "Олег Ананьев", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 5 + }, + { + "row": 493, + "name": "Олег Краснощеков", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 494, + "name": "Олег Шавлюгин", + "firstDay": 1, + "firstMark": "ОТ", + "nonblankMarks": 15 + }, + { + "row": 495, + "name": "Олеся", + "firstDay": 5, + "firstMark": "4", + "nonblankMarks": 5 + }, + { + "row": 496, + "name": "Паша", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 497, + "name": "Понамарев Алексей", + "firstDay": 5, + "firstMark": "Б", + "nonblankMarks": 6 + }, + { + "row": 498, + "name": "Русик", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 2 + }, + { + "row": 499, + "name": "Сергей Бондарь", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 500, + "name": "Сергей Карнаухов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 501, + "name": "Сергей Немакин", + "firstDay": 5, + "firstMark": "от", + "nonblankMarks": 6 + }, + { + "row": 502, + "name": "Тимур Попов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 503, + "name": "Ястребов Святослав", + "firstDay": 5, + "firstMark": "ОТ", + "nonblankMarks": 5 + }, + { + "row": 504, + "name": "Ярош Данил", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 5 + }, + { + "row": 505, + "name": "Белогрудова Лилия", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 3 + }, + { + "row": 506, + "name": "Шихалев Вячеслав", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 3 + }, + { + "row": 507, + "name": "Костя Труфанов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 508, + "name": "Вова Лычманов", + "firstDay": 5, + "firstMark": "5", + "nonblankMarks": 5 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 3, + "monthName": "март", + "headerRow": 2, + "employees": [ + { + "row": 3, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 4, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 5, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 6, + "name": "Миша Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 21 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 4, + "monthName": "апрель", + "headerRow": 21, + "employees": [ + { + "row": 22, + "name": "Русик", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 23, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 24, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 25, + "name": "Миша Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 26, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 27, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 28, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 29, + "name": "Саша Бурлак", + "firstDay": 8, + "firstMark": "6", + "nonblankMarks": 13 + }, + { + "row": 30, + "name": "Антон фрезер", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 31, + "name": "Саша Больбат", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 32, + "name": "Денис", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 33, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 34, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 35, + "name": "Сергей", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 36, + "name": "Миша Красовский", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 24 + }, + { + "row": 37, + "name": "Андрей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 38, + "name": "Антон Сергеенко", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 23 + }, + { + "row": 39, + "name": "Вова", + "firstDay": 8, + "firstMark": "5", + "nonblankMarks": 17 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 5, + "monthName": "май", + "headerRow": 42, + "employees": [ + { + "row": 43, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 44, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 45, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 46, + "name": "Миша Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 47, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 48, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 49, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 50, + "name": "Саша Бурлак", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 51, + "name": "Антон фрезер", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 23 + }, + { + "row": 52, + "name": "Саша Больбат", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 53, + "name": "Денис", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 54, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 55, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 56, + "name": "Сергей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 57, + "name": "Миша Красовский", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 58, + "name": "Андрей", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 23 + }, + { + "row": 59, + "name": "Антон Сергеенко", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 23 + }, + { + "row": 60, + "name": "Вова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 61, + "name": "Леонид", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 6, + "monthName": "июнь", + "headerRow": 64, + "employees": [ + { + "row": 65, + "name": "Русик", + "firstDay": 3, + "firstMark": "от", + "nonblankMarks": 20 + }, + { + "row": 66, + "name": "Олег Ананьев", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 67, + "name": "Паша", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 22 + }, + { + "row": 68, + "name": "Миша Омельянов", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 20 + }, + { + "row": 69, + "name": "Генрих", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 20 + }, + { + "row": 70, + "name": "Вика", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 71, + "name": "Олег Краснощеков", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 72, + "name": "Саша Бурлак", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 20 + }, + { + "row": 73, + "name": "Антон фрезер", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 20 + }, + { + "row": 74, + "name": "Денис", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 75, + "name": "Вова Леонтьев", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 20 + }, + { + "row": 76, + "name": "Вова Милютин", + "firstDay": 3, + "firstMark": "от", + "nonblankMarks": 20 + }, + { + "row": 77, + "name": "Сергей", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 20 + }, + { + "row": 78, + "name": "Миша Красовский", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 79, + "name": "Андрей", + "firstDay": 3, + "firstMark": "6", + "nonblankMarks": 21 + }, + { + "row": 80, + "name": "Антон Сергеенко", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 28 + }, + { + "row": 81, + "name": "Вова", + "firstDay": 3, + "firstMark": "5", + "nonblankMarks": 20 + }, + { + "row": 82, + "name": "Максим", + "firstDay": 24, + "firstMark": "5", + "nonblankMarks": 5 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 7, + "monthName": "июль", + "headerRow": 87, + "employees": [ + { + "row": 88, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 89, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 90, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 91, + "name": "Миша Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 92, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 93, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 94, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 95, + "name": "Саша Бурлак", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 23 + }, + { + "row": 96, + "name": "Антон фрезер", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 23 + }, + { + "row": 97, + "name": "Денис", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 98, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 99, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 100, + "name": "Сергей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 101, + "name": "Миша Красовский", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 102, + "name": "Андрей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 103, + "name": "Антон Сергеенко", + "firstDay": 1, + "firstMark": "Б", + "nonblankMarks": 31 + }, + { + "row": 104, + "name": "Вова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 105, + "name": "Максим", + "firstDay": 1, + "firstMark": "2", + "nonblankMarks": 23 + }, + { + "row": 106, + "name": "Виталий", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 107, + "name": "Женя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 108, + "name": "Вова пом.", + "firstDay": 24, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 109, + "name": "Никита", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 20 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 8, + "monthName": "август", + "headerRow": 112, + "employees": [ + { + "row": 113, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 114, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 115, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 116, + "name": "Миша Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 117, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 118, + "name": "Вика", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 119, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 120, + "name": "Саша Бурлак", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 121, + "name": "Антон фрезер", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 122, + "name": "Денис", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 8 + }, + { + "row": 123, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 26 + }, + { + "row": 124, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 125, + "name": "Сергей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 16 + }, + { + "row": 126, + "name": "Миша Красовский", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 127, + "name": "Андрей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 128, + "name": "Антон Сергеенко", + "firstDay": 1, + "firstMark": "2", + "nonblankMarks": 22 + }, + { + "row": 129, + "name": "Вова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 130, + "name": "Максим", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 131, + "name": "Виталий", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 132, + "name": "Женя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 133, + "name": "Никита", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 134, + "name": "Тимур", + "firstDay": 23, + "firstMark": "5", + "nonblankMarks": 6 + }, + { + "row": 135, + "name": "Александр", + "firstDay": 26, + "firstMark": "5", + "nonblankMarks": 5 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 9, + "monthName": "сентябрь", + "headerRow": 138, + "employees": [ + { + "row": 139, + "name": "Русик", + "firstDay": 2, + "firstMark": "6", + "nonblankMarks": 21 + }, + { + "row": 140, + "name": "Олег Ананьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 141, + "name": "Паша", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 142, + "name": "Миша Омельянов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 143, + "name": "Генрих", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 144, + "name": "Вика", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 145, + "name": "Олег Краснощеков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 146, + "name": "Саша Бурлак", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 147, + "name": "Антон фрезер", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 148, + "name": "Вова Леонтьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 149, + "name": "Вова Милютин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 150, + "name": "Миша Красовский", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 151, + "name": "Андрей", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 152, + "name": "Антон Сергеенко", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 153, + "name": "Вова", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 154, + "name": "Максим", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 155, + "name": "Виталий", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 156, + "name": "Женя", + "firstDay": 2, + "firstMark": "Б", + "nonblankMarks": 21 + }, + { + "row": 157, + "name": "Никита", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 158, + "name": "Тимур", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 159, + "name": "Саша Подгайный", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 21 + }, + { + "row": 160, + "name": "Юра Попов", + "firstDay": 18, + "firstMark": "5", + "nonblankMarks": 9 + }, + { + "row": 161, + "name": "Даниил Зебольд", + "firstDay": 18, + "firstMark": "5", + "nonblankMarks": 9 + }, + { + "row": 162, + "name": "Руслан Сухойванов", + "firstDay": 11, + "firstMark": "5", + "nonblankMarks": 14 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 10, + "monthName": "октябрь", + "headerRow": 167, + "employees": [ + { + "row": 168, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 169, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 170, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 171, + "name": "Миша Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 172, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 173, + "name": "Вика", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 174, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 175, + "name": "Саша Бурлак", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 176, + "name": "Антон фрезер", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 177, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 178, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 179, + "name": "Миша Красовский", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 25 + }, + { + "row": 180, + "name": "Андрей", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 9 + }, + { + "row": 181, + "name": "Антон Сергеенко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 182, + "name": "Вова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 183, + "name": "Максим", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 184, + "name": "Виталий", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 23 + }, + { + "row": 185, + "name": "Женя", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 7 + }, + { + "row": 186, + "name": "Никита", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 187, + "name": "Тимур", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 188, + "name": "Саша Подгайный", + "firstDay": 1, + "firstMark": "От", + "nonblankMarks": 9 + }, + { + "row": 189, + "name": "Юра Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 190, + "name": "Даниил Зебольд", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 191, + "name": "Руслан Сухойванов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 4 + }, + { + "row": 192, + "name": "Константин Макаев", + "firstDay": 15, + "firstMark": "5", + "nonblankMarks": 13 + }, + { + "row": 193, + "name": "Лера", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 23 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 11, + "monthName": "ноябрь", + "headerRow": 197, + "employees": [ + { + "row": 198, + "name": "Русик", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 199, + "name": "Олег Ананьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 200, + "name": "Паша", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 201, + "name": "Миша Омельянов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 202, + "name": "Генрих", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 203, + "name": "Вика", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 204, + "name": "Олег Краснощеков", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 205, + "name": "Саша Бурлак", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 206, + "name": "Антон фрезер", + "firstDay": 1, + "firstMark": "6", + "nonblankMarks": 23 + }, + { + "row": 207, + "name": "Вова Леонтьев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 208, + "name": "Вова Милютин", + "firstDay": 1, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 209, + "name": "Миша Красовский", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 13 + }, + { + "row": 210, + "name": "Антон Сергеенко", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 211, + "name": "Вова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 212, + "name": "Максим", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 213, + "name": "Виталий", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 214, + "name": "Женя", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 215, + "name": "Никита", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 216, + "name": "Тимур", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 217, + "name": "Саша Подгайный", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 1 + }, + { + "row": 218, + "name": "Юра Попов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 4 + }, + { + "row": 219, + "name": "Даниил Зебольд", + "firstDay": 1, + "firstMark": "0", + "nonblankMarks": 22 + }, + { + "row": 220, + "name": "Константин Макаев", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 221, + "name": "Лера", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 222, + "name": "Леша Лизин", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 24 + }, + { + "row": 223, + "name": "Сергей Карнаухов", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 224, + "name": "Настя Козлова", + "firstDay": 1, + "firstMark": "5", + "nonblankMarks": 3 + } + ] + }, + { + "sheet": "2024год", + "year": 2024, + "month": 12, + "monthName": "декабрь", + "headerRow": 227, + "employees": [ + { + "row": 228, + "name": "Русик", + "firstDay": 2, + "firstMark": "2", + "nonblankMarks": 21 + }, + { + "row": 229, + "name": "Олег Ананьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 230, + "name": "Паша", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 231, + "name": "Миша Омельянов", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 232, + "name": "Генрих", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 233, + "name": "Вика", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 234, + "name": "Олег Краснощеков", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 235, + "name": "Саша Бурлак", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 8 + }, + { + "row": 236, + "name": "Антон фрезер", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 237, + "name": "Вова Леонтьев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 238, + "name": "Вова Милютин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 239, + "name": "Вова", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 240, + "name": "Максим", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 21 + }, + { + "row": 241, + "name": "Виталий", + "firstDay": 2, + "firstMark": "от", + "nonblankMarks": 22 + }, + { + "row": 242, + "name": "Никита", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 243, + "name": "Тимур", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 244, + "name": "Даниил Зебольд", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 245, + "name": "Руслан Сухойванов", + "firstDay": null, + "firstMark": null, + "nonblankMarks": 0 + }, + { + "row": 246, + "name": "Лера", + "firstDay": 2, + "firstMark": "6", + "nonblankMarks": 22 + }, + { + "row": 247, + "name": "Константин Макаев", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 23 + }, + { + "row": 248, + "name": "Сергей К", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 249, + "name": "Леша Лизин", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 250, + "name": "Настя Козлова", + "firstDay": 2, + "firstMark": "5", + "nonblankMarks": 22 + }, + { + "row": 251, + "name": "Артёмка", + "firstDay": 27, + "firstMark": "5", + "nonblankMarks": 3 + } + ] + } +] \ No newline at end of file diff --git a/outputs/attendance_hire_report_20260825/source_2024год.png b/outputs/attendance_hire_report_20260825/source_2024год.png new file mode 100644 index 00000000..150ba96d Binary files /dev/null and b/outputs/attendance_hire_report_20260825/source_2024год.png differ diff --git a/outputs/attendance_hire_report_20260825/source_2025год.png b/outputs/attendance_hire_report_20260825/source_2025год.png new file mode 100644 index 00000000..e6112922 Binary files /dev/null and b/outputs/attendance_hire_report_20260825/source_2025год.png differ diff --git a/outputs/attendance_hire_report_20260825/source_2026год.png b/outputs/attendance_hire_report_20260825/source_2026год.png new file mode 100644 index 00000000..e625dadd Binary files /dev/null and b/outputs/attendance_hire_report_20260825/source_2026год.png differ diff --git a/outputs/attendance_hire_report_20260825/source_Лист1.png b/outputs/attendance_hire_report_20260825/source_Лист1.png new file mode 100644 index 00000000..85e9b3db Binary files /dev/null and b/outputs/attendance_hire_report_20260825/source_Лист1.png differ diff --git a/outputs/attendance_hire_report_20260825/source_Лист2.png b/outputs/attendance_hire_report_20260825/source_Лист2.png new file mode 100644 index 00000000..bad48460 Binary files /dev/null and b/outputs/attendance_hire_report_20260825/source_Лист2.png differ