مستندات امیر

مستندات پروژه امیر، نرم‌افزار آزاد حسابداری لاراول.

راهنمای محاسبه لاگ حضور و غیاب

English version
راهنمای ورود لاگ حضور و غیاب
بازگشت به راهنمای کاربران

این راهنما روش محاسبه لاگ روزانه، ساخت جمع‌های ماهانه و محاسبه مجدد نتایج ذخیره‌شده در امیر را توضیح می‌دهد.

مقادیر لاگ روزانه

لاگ روزانه هم داده‌های منبع و هم نتیجه محاسبه را نگه می‌دارد. کارمند، تاریخ، زمان ورود، زمان خروج و درخواست‌های پرسنلی تاییدشده داده‌های منبع هستند. کارکرد، تأخیر، تعجیل، اضافه‌کاری، اضافه کاری خودکار، ماموریت، استحقاقی، بدون حقوق، دورکاری و وضعیت جمعه یا تعطیل نتیجه محاسبه‌اند.

اگر کارمند شیفت کاری نداشته باشد، بخش‌هایی از محاسبه که به مقدار پیش‌فرض نیاز دارند از ساعت 08:00 برای شروع، ساعت 17:00 برای پایان و 480 دقیقه کار روزانه استفاده می‌کنند.

قواعد روز و شیفت

  • جمعه و تعطیل رسمی، روز تعطیل محسوب می‌شوند.
  • پنجشنبه‌ای که در شیفت کارمند تعطیل تعریف شده باشد نیز روز تعطیل است.
  • پنجشنبه نیم‌روز از ساعت خروج پنجشنبه شیفت استفاده می‌کند.
  • پنجشنبه کامل از ساعت پایان عادی شیفت استفاده می‌کند.
  • مدت شیفت از اختلاف ساعت شروع و پایان به دست می‌آید. محاسبه فعلی، مقدار زمان استراحت تنظیم‌شده را از این مدت کم نمی‌کند.

در روز تعطیل، زمان حضور فیزیکی یا دورکاری به‌عنوان کارکرد ثبت می‌شود. تأخیر، تعجیل، اضافه‌کاری و اضافه کاری خودکار صفر هستند. محاسبه ماهانه بعدا مجموع کارکرد و ماموریت را در کار جمعه یا کار روز تعطیل قرار می‌دهد.

کارکرد، تأخیر و تعجیل

وقتی هر دو ساعت وجود دارند، کارکرد خام به این شکل است:

کارکرد = زمان خروج - زمان ورود

لاگی که فقط یکی از دو ساعت را دارد، بازه حضور کامل ندارد. اگر پوشش تاییدشده دیگری وجود نداشته باشد، کارکرد آن صفر است.

شناوری ورود، مرز موثر شیفت را تغییر می‌دهد:

  • ورود در بازه شناوری تأخیر ندارد و پایان مورد انتظار شیفت به اندازه ورود دیرتر جابه‌جا می‌شود.
  • ورود پس از بازه شناوری، فقط برای زمان بعد از این بازه تأخیر می‌سازد. پایان مورد انتظار به اندازه کل شناوری جابه‌جا می‌شود.
  • ورود پیش از شروع شیفت می‌تواند اضافه کاری خودکار ایجاد کند.
  • خروج پیش از پایان مورد انتظار تعدیل‌شده، تعجیل ایجاد می‌کند.
  • زمان خارج از مرزهای تعدیل‌شده شیفت، اضافه‌کاری احتمالی است.

منظور از «تعدیل‌شده» چیست؟

«تعدیل‌شده» یعنی کارمند یکی از ساعت‌های برنامه‌ریزی‌شده شیفت (زمان شروع یا پایان) را برای همان لاگ جابه‌جا کرده است. برای مثال تاخیر داشته است. این کار اطلاعات شیفت کاری را ویرایش نمی‌کند و فقط هنگام محاسبه همان کارمند و همان تاریخ کاربرد دارد.

پایان مورد انتظار تعدیل‌شده ساعتی است که پس از اعمال قاعده شناوری ورود، انتظار می‌رود کارمند کار را پایان دهد:

  • در شیفت 08:00 تا 16:00 با 60 دقیقه شناوری، ورود در 08:20 پایان مورد انتظار را به 16:20 می‌برد و تأخیر صفر است.
  • در همان شیفت، ورود در 09:15 یعنی 15 دقیقه پس از پایان شناوری. امیر 15 دقیقه تأخیر ثبت می‌کند و پایان مورد انتظار را به اندازه کل شناوری، یعنی تا 17:00، جابه‌جا می‌کند.
  • اگر مرخصی ساعتی تاییدشده از 08:00 شروع شود و تا زمان ورود کارمند ادامه داشته باشد، فاصله ورود را می‌پوشاند. پایان مورد انتظار به‌جای جابه‌جایی، همان 16:00 باقی می‌ماند.
  • اگر مرخصی پیش از ورود پایان یابد، فقط فاصله بدون پوشش تا ورود می‌تواند پایان مورد انتظار را جابه‌جا کند و این جابه‌جایی از مقدار شناوری بیشتر نمی‌شود. برای نمونه، پایان مرخصی در 10:00 و ورود در 10:20، پایان مورد انتظار 16:00 را به 16:20 می‌برد.

عبارت مرزهای تعدیل‌شده شیفت به ساعت شروع و پایانی اشاره دارد که پس از اعمال این قواعد برای محاسبه استفاده می‌شوند. امیر زمان ورود و خروج را با این مرزهای محاسبه‌شده مقایسه می‌کند تا تأخیر، تعجیل و اضافه‌کاری احتمالی را به دست آورد.

درخواست‌های پرسنلی تاییدشده

محاسبه مجدد، درخواست‌های تاییدشده پوشش‌دهنده تاریخ لاگ را دوباره می‌خواند. مقادیر وابسته به درخواست برای مرخصی با حقوق، مرخصی بدون حقوق، ماموریت، دستور اضافه‌کاری و دورکاری از نو ساخته می‌شوند. اگر از یک نوع، درخواست تاییدشده‌ای وجود نداشته باشد، مقدار دستی ذخیره‌شده همان نوع حفظ می‌شود.

مرخصی روزانه با حقوق، مرخصی روزانه بدون حقوق، استعلاجی و ماموریت روزانه از مدت شیفت همان تاریخ استفاده می‌کنند. درخواست‌های ساعتی از فاصله دقیق شروع تا پایان استفاده می‌کنند.

جایگاه مرخصی و ماموریت ساعتی نسبت به ساعت حضور مهم است:

  • پوشش پیش از ورود، تأخیر را کم می‌کند.
  • پوشش پس از خروج، تعجیل را کم می‌کند.
  • پوشش داخل بازه حضور از کارکرد کم می‌شود تا یک زمان هم کارکرد و هم مرخصی یا ماموریت حساب نشود.
  • پوششی که تأخیر و تعجیل را کم می‌کند، حداکثر به اندازه مدت شیفت است.

برای نمونه، در شیفت 08:00 تا 16:00، با حضور 08:00 تا 16:00 و مرخصی ساعتی تاییدشده 11:00 تا 13:00، نتیجه 360 دقیقه کارکرد و 120 دقیقه مرخصی با حقوق است.

درخواست دورکاری تاییدشده کار واقعی است و پوشش مرخصی محسوب نمی‌شود. محاسبه، بازه دورکاری را با بازه حضور در محل ادغام می‌کند و هم‌پوشانی را دوبار نمی‌شمارد. برای نمونه، حضور در محل از 09:00 تا 12:00 و دورکاری از 10:00 تا 15:00 برابر 360 دقیقه کارکرد است، نه 480 دقیقه. زودترین شروع و دیرترین پایان ترکیب‌شده برای محاسبه تأخیر، تعجیل و اضافه‌کاری احتمالی به کار می‌روند.

اضافه‌کاری

زمان پیش از شروع موثر شیفت یا پس از پایان موثر آن، اضافه‌کاری احتمالی است.

  • اضافه‌کاری هم به دقیقه دستور اضافه‌کاری تاییدشده ذخیره‌شده روی لاگ و هم به اضافه‌کاری احتمالی ساعت‌ها محدود است.
  • باقی‌مانده اضافه‌کاری احتمالی تا سقف تنظیم‌شده شیفت، اضافه کاری خودکار می‌شود.
  • دورکاری بیشتر از مدت شیفت نیز می‌تواند با رعایت همان سقف به اضافه کاری خودکار تبدیل شود.

روش محاسبه حضور و غیاب ماهانه

حضور و غیاب ماهانه برای یک کارمند، برچسب سال و ماه شمسی، تاریخ شروع میلادی و یک بازه 28 تا 31 روزه ساخته می‌شود. این محاسبه، مقادیر روزانه ذخیره‌شده را می‌خواند و ابتدا تک‌تک لاگ‌ها را محاسبه مجدد نمی‌کند.

برای هر روز تقویمی بازه:

  • روزهای کاری یک واحد زیاد می‌شود، حتی برای جمعه و تعطیل.
  • روز عادی بدون لاگ، روزهای غیبت را زیاد می‌کند.
  • روز تعطیل بدون لاگ، غیبت محسوب نمی‌شود.
  • روز دارای لاگ، روزهای حضور را زیاد می‌کند، مگر روز عادی که کل شیفت آن مرخصی بدون حقوق باشد.
  • مرخصی بدون حقوق به اندازه یک شیفت کامل، روزهای مرخصی بدون حقوق را زیاد می‌کند و روزهای حضور را زیاد نمی‌کند.
  • در روز عادی، اضافه‌کاری، اضافه کاری خودکار، مرخصی با حقوق، مرخصی بدون حقوق و کسر کار از لاگ روزانه جمع می‌شوند. کسر کار برابر تأخیر به‌اضافه تعجیل است.
  • دقیقه‌های ماموریت و دورکاری از همه روزهای دارای لاگ جمع می‌شوند.
  • در روز تعطیل، مجموع کارکرد و ماموریت در روز جمعه به کار جمعه و در تعطیلات دیگر به کار روز تعطیل افزوده می‌شود.

محاسبه، رکورد ماهانه کارمند را برای همان سال و ماه شمسی می‌سازد یا به‌روزرسانی می‌کند. سپس تمام لاگ‌های بازه انتخابی را به آن متصل می‌کند.

محاسبه مجدد

امیر سه عملیات مرتبط دارد که کار یکسانی انجام نمی‌دهند.

عملیات چه چیزی محاسبه می‌شود چه چیزی محاسبه نمی‌شود
محاسبه مجدد در لاگ روزانه شیفت، تعطیلات و درخواست‌های تاییدشده فعلی دوباره خوانده می‌شوند، ستون‌های محاسباتی روزانه از نو محاسبه و مقادیر ذخیره‌شده بازنویسی می‌شوند جمع ماهانه و حقوق
محاسبه مجدد همه در صفحه حضور و غیاب ماهانه محاسبه مجدد روزانه برای تمام لاگ‌هایی اجرا می‌شود که اکنون به آن رکورد ماهانه متصل‌اند روزهای بدون لاگ، جمع ماهانه، مانده مرخصی و حقوق
بازمحاسبه از لاگ‌ها در رکورد ماهانه خلاصه ماهانه حذف و از روی مقادیر ذخیره‌شده لاگ‌ها با تاریخ شروع و مدت ارسال‌شده دوباره ساخته می‌شود محاسبات داخل لاگ‌های روزانه و حقوق

بعد از ورود یا اصلاح لاگ‌های ماهی که قبلا محاسبه شده است، این ترتیب را انجام دهید:

  1. بازمحاسبه از لاگ‌ها را اجرا کنید تا خلاصه ماهانه مقادیر روزانه واردشده یا اصلاح‌شده را بخواند و لاگ‌های تازه واردشده در بازه را متصل کند.
  2. اگر تنظیمات شیفت، تعطیلات یا درخواست‌های پرسنلی تاییدشده نیز تغییر کرده‌اند، محاسبه مجدد همه را اجرا کنید و سپس یک بار دیگر بازمحاسبه از لاگ‌ها را انجام دهید. خود ورود اطلاعات، لاگ‌های ساخته‌شده یا تغییریافته را محاسبه کرده است.
  3. جمع‌های ماهانه و مانده مرخصی را بررسی کنید.
  4. اگر حقوق قبلا ساخته شده است، آن را جداگانه بررسی یا دوباره ایجاد کنید. محاسبه مجدد حضور و غیاب، حقوق را به‌روزرسانی نمی‌کند.

دو محدودیت مهم وجود دارد. محاسبه مجدد همه فقط لاگ‌هایی را تغییر می‌دهد که از قبل به رکورد ماهانه متصل‌اند، پس ممکن است لاگ تازه واردشده در این مجموعه نباشد. بازمحاسبه از لاگ‌ها همه لاگ‌های بازه ارسال‌شده را می‌خواند و دوباره متصل می‌کند، بنابراین لاگ‌های جدید در این مرحله وارد خلاصه ماهانه می‌شوند. همچنین اگر فیلدهای محاسباتی را دستی ویرایش کرده باشید، محاسبه مجدد همان لاگ آن مقادیر را بازنویسی می‌کند.

نمونه‌های محاسبه از تست‌های Feature

نمونه‌های زیر از حالت‌های محاسباتی فایل tests/Feature/AttendanceLogTest.php گرفته شده‌اند. همه عددها دقیقه هستند، مگر جایی که ساعت نوشته شده باشد. مقدار 30 دقیقه استراحت در جدول آمده چون جزو تنظیمات شیفت تست است، اما محاسبه فعلی آن را از کارکرد کم نمی‌کند.

محاسبه یک بازه کامل پس از ورود فایل

تست: test_import_recalculates_each_created_attendance_log

شروع پایان استراحت شناوری زمان ورود زمان خروج کارکرد تأخیر تعجیل
08:00 17:00 60 0 08:00 17:00 540 0 0

ورود اطلاعات، دو ساعت را ذخیره می‌کند و لاگ را محاسبه می‌کند. کارکرد 540 دقیقه است، چون محاسبه فعلی تمام بازه 08:00 تا 17:00 را بدون کم کردن استراحت در نظر می‌گیرد.

ورود دیرهنگام با مرخصی پس از پایان شیفت

تست: test_import_calculates_times_correctly_with_late_entry_overtime_and_hourly_leave_after_shift

در همه سطرهای زیر، شیفت 07:30 تا 15:30، استراحت 30 دقیقه، شناوری 60 دقیقه و حداکثر اضافه کاری خودکار 60 دقیقه است.

زمان ورود زمان خروج مرخصی ساعتی تاییدشده استحقاقی تأخیر اضافه‌کاری + اضافه کاری خودکار
08:45 16:45 16:45 تا 17:00 15 15 30
08:52 16:30 16:30 تا 17:00 30 22 30
08:58 16:38 16:32 تا 17:00 28 28 30

ورود پس از 60 دقیقه شناوری، تأخیر ایجاد می‌کند. مرخصی تاییدشده پس از خروج فیزیکی، فاصله انتهای روز را پوشش می‌دهد و زمان پس از پایان تعدیل‌شده شیفت در اضافه‌کاری وارد می‌شود.

مرخصی از ابتدای شیفت

تست‌ها: test_recalculation_applies_hourly_leave_until_entry_and_calculates_overtime و test_hourly_leave_at_shift_start_with_overtime_calculation

شیفت شناوری حداکثر اضافه کاری خودکار مرخصی ساعتی تاییدشده زمان ورود زمان خروج استحقاقی تأخیر تعجیل اضافه‌کاری + اضافه کاری خودکار
08:00 تا 16:00 60 60 08:00 تا 10:02 10:02 16:28 122 0 0 28
07:30 تا 15:30 60 120 07:30 تا 10:35 10:35 16:38 185 0 0 68

مرخصی‌ای که از شروع شیفت آغاز شود و تا ورود ادامه داشته باشد، فاصله ورود را می‌پوشاند. در این حالت پایان برنامه‌ریزی‌شده شیفت جابه‌جا نمی‌شود، پس کار پس از آن می‌تواند اضافه کاری خودکار ایجاد کند.

پایان مرخصی پیش از ورود و استفاده فاصله باقی‌مانده از شناوری

تست: test_hourly_leave_before_entry_uses_remaining_float_without_early_leave

شیفت شناوری مرخصی ساعتی تاییدشده زمان ورود زمان خروج استحقاقی تأخیر تعجیل اضافه‌کاری + اضافه کاری خودکار
07:30 تا 15:30 60 07:30 تا 11:19 11:52 16:03 229 0 0 27

مرخصی 229 دقیقه را پوشش می‌دهد. فاصله 33 دقیقه‌ای باقی‌مانده تا ورود در 60 دقیقه شناوری جا می‌شود، پس تأخیر نمی‌سازد. پایان مورد انتظار نیز 33 دقیقه جابه‌جا و برابر 16:03 می‌شود. بخشی از بازه حضور با مرز مرخصی هم‌پوشانی دارد و 27 دقیقه اضافه‌کاری می‌سازد.

مرخصی ساعتی داخل بازه حضور

تست: test_hourly_leave_within_shift_with_float_calculates_paid_leave_and_no_delay

شیفت شناوری مرخصی ساعتی تاییدشده زمان ورود زمان خروج استحقاقی تأخیر تعجیل اضافه‌کاری + اضافه کاری خودکار
07:30 تا 15:30 60 08:15 تا 08:47 و 10:20 تا 11:00 08:47 16:15 72 0 0 0

مجموع دو درخواست 72 دقیقه است. درخواست اول فاصله ورود را می‌پوشاند. درخواست دوم با بازه حضور هم‌پوشانی دارد و از کارکرد کم می‌شود تا همان دقیقه‌ها هم کار و هم مرخصی با حقوق حساب نشوند.

مرخصی داخل بازه شناوری

تست: test_hourly_leave_with_float_covers_delay_without_overtime

شیفت شناوری مرخصی ساعتی تاییدشده زمان ورود زمان خروج استحقاقی تأخیر تعجیل اضافه‌کاری + اضافه کاری خودکار
07:30 تا 15:30 60 08:13 تا 09:00 09:00 16:13 47 0 0 0

43 دقیقه نخست پس از شروع شیفت از شناوری استفاده می‌کند و 47 دقیقه بعد تا زمان ورود با مرخصی تاییدشده پوشش داده می‌شود. پایان مورد انتظار 16:13 می‌شود. خروج در همین ساعت نه تعجیل دارد و نه اضافه‌کاری.

چهار تست متناظر با نام test_recalculate_* چهار حالت آخر را از مسیر محاسبه مجدد لاگ روزانه تکرار می‌کنند. این تست‌ها بررسی می‌کنند که محاسبه مجدد با استفاده از ساعت‌های ذخیره‌شده و درخواست‌های تاییدشده، همان مقادیر استحقاقی، تأخیر، تعجیل و اضافه‌کاری را دوباره بسازد.