حساب إجمالي ساعات العمل بعد خصم الاستراحات
تجمع حاسبة إجمالي ساعات الدوام قائمة سجلات الدخول والخروج، وتطرح الاستراحة غير المدفوعة المسجلة لكل نوبة، ثم تعرض صافيًا واضحًا للوقت.
شغّل الأداة مجانًا
يجب أن يتضمن كل تاريخ ووقت بصيغة ISO الرمز Z أو إزاحة صريحة، وبذلك يمكن مقارنة سجلات الفروع المختلفة وفترات التوقيت الصيفي والنوبات الليلية على خط زمني واحد وفق UTC. تعرض النتيجة أيضًا الساعات الإجمالية قبل الخصم، ومجموع دقائق الاستراحة، وعدد النوبات المحتسبة، مما يسهّل مراجعة الحساب أو تشغيله آليًا.
أدخلوا سجلات نوبات كاملة وغير ملتبسة
قدّموا صفًا واحدًا لكل فترة عمل متصلة. يحتاج كل صف إلى تاريخ ووقت clock_in وتاريخ ووقت clock_out مكتوبين بصيغة ISO 8601، مع الثواني والرمز Z أو إزاحة UTC رقمية مثل -04:00. الإزاحة ضرورية لأن الوقت المحلي وحده قد لا يحدد لحظة واحدة أثناء تغييرات التوقيت. أضيفوا break_minutes عندما تتضمن النوبة استراحة غير مدفوعة، واتركوا الحقل إذا لم يكن هناك خصم. يمكن إدخال دقائق الاستراحة بقيمة عشرية، وهذا مفيد إذا كان النظام المصدر يسجل أجزاء الدقيقة. يجوز أن يكون الخروج في اليوم التقويمي التالي، ولذلك لا تحتاج النوبات الليلية إلى وضع خاص. ترفض الحاسبة التواريخ المستحيلة، والإزاحات الناقصة، والخروج الذي لا يلي الدخول، والاستراحات السالبة، والاستراحة الأطول من مدة النوبة. كما ترفض النوبات المتداخلة بعد توحيدها وفق UTC، لأن احتسابها معًا سيزيد المجموع من دون تنبيه. إن إدخال كل صف بوضوح يجعل البيانات قابلة للتدقيق، ويمنع افتراض سياسات استراحة الطعام أو قواعد التقريب أو اعتبار الفجوات بين النوبات استراحات تلقائيًا.
افهموا طريقة إجراء الحساب وفق UTC
يُفسَّر كل طابع زمني بوصفه قيمة في التقويم الميلادي، ثم يُحوَّل إلى موضع بالمللي ثانية وفق UTC باستخدام الإزاحة المكتوبة. لا يستشير الحساب المنطقة الزمنية للجهاز، ولا قاعدة بيانات للمناطق الزمنية، ولا التاريخ الحالي، ولا أي خدمة خارجية. في كل صف صالح، تساوي المدة الإجمالية لحظة الخروج وفق UTC مطروحًا منها لحظة الدخول وفق UTC. تُحوَّل مدة الاستراحة المدخلة من دقائق إلى مللي ثوانٍ، ثم تُطرح من المدة الإجمالية لذلك الصف. بعد ذلك تُجمع المدد الإجمالية والاستراحات كلٌّ على حدة قبل إنتاج الصافي النهائي. يضمن هذا الترتيب نتائج ثابتة للفرق التي تستخدم سجلات بإزاحات مختلفة، وكذلك للنوبات التي تتجاوز منتصف الليل. تتضمن النتيجة total_hours لصافي وقت العمل، وtotal_minutes للأنظمة التي تفضّل الدقائق، وgross_hours قبل الخصومات، وbreak_minutes لإجمالي الخصم، وshift_count للمطابقة. لا تُقرّب قيم الساعات والدقائق إلى ست منازل عشرية إلا عند إخراج النتيجة، بينما يبقى الجمع الداخلي بالمللي ثانية الصحيحة. لذلك تعطي المدخلات نفسها ملف JSON نفسه مهما اختلفت لغة المتصفح أو موقع الخادم.
استخدموا النتيجة في الرواتب والتقارير
تفصل الحقول المعادة بين نشاط التسجيل الأصلي والمدة النهائية المستحقة للدفع، مما يتيح للمراجع إعادة إجراء الحساب. قارنوا shift_count بعدد الصفوف المستوردة، وgross_hours بالفترة الإجمالية الخام، وbreak_minutes بالخصومات غير المدفوعة المتوقعة قبل اعتماد total_hours. لا تطبق هذه القدرة شرائح العمل الإضافي، أو قواعد الاستراحات المدفوعة، أو معدلات الأجور، أو سماحات الجداول، أو التقريب الخاص بجهة العمل. تختلف تلك السياسات باختلاف الاتفاق والقانون، لذا ينبغي تطبيقها في خطوة لاحقة موثقة بوضوح. كذلك لا تستنتج الحاسبة الاستراحات من الفجوات بين صفوف منفصلة؛ فالخصم يقتصر على قيم break_minutes التي تقدمونها. وبذلك تصلح الدالة مكوّنًا حتميًا لإعداد الرواتب، وفواتير المتعاقدين، وتقارير وقت المشروعات، ومطابقة الحضور من دون تضمين سياسة خفية. يمكنكم تشغيلها مجانًا في المتصفح لإجراء فحص فردي، بينما تبلغ كلفة الأتمتة عبر API مقدار $0.002 لكل طلب. ولعمليات الاستيراد القابلة للتكرار، احتفظوا بسلاسل ISO الأصلية وإزاحاتها مع الملخص المعاد، حتى يمكن تتبع أي مجموع محل نزاع وصولًا إلى اللحظات والخصومات الدقيقة المستخدمة.
حالات الاستخدام
إعداد مجموع لسجل الرواتب
اجمعوا النوبات المعتمدة والاستراحات غير المدفوعة في مدة صافية قبل تطبيق معدلات الأجر أو قواعد العمل الإضافي.
مراجعة فاتورة متعاقد
أعيدوا حساب الوقت المفوتر استنادًا إلى الطوابع الزمنية من دون الاعتماد على المنطقة الزمنية المحلية للمراجع.
مطابقة سجلات الحضور المصدرة
قارنوا الوقت الإجمالي والخصومات وعدد النوبات بالسجلات المصدرة من نظام تسجيل الدوام.
الأسئلة الشائعة
ما كلفة الطلب الواحد؟
تبلغ كلفة الأتمتة عبر API مقدار $0.002 لكل طلب، ويمكن أيضًا إجراء الحساب مجانًا في المتصفح.
ما صيغة التاريخ والوقت المطلوبة؟
استخدموا ISO 8601 مع التاريخ والوقت حتى الثواني، ومع Z أو إزاحة صريحة، مثل 2026-07-20T09:00:00-04:00.
كيف تُدخل الاستراحات؟
اضبطوا break_minutes في كل نوبة على مدة الاستراحة غير المدفوعة بالدقائق. إذا تُرك الحقل، يكون خصم تلك النوبة صفرًا.
هل تحسب الأداة العمل الإضافي أو الأجور؟
لا. تعيد الأداة مددًا زمنية فقط؛ أما حدود العمل الإضافي والتقريب ومعدلات الأجر وقواعد العمل فتُطبق في خطوة أخرى.
لماذا تُرفض النوبات المتداخلة؟
ستحتسب الفترات المتداخلة الوقت نفسه مرتين. يكشف الرفض تعارض كشف الدوام بدلًا من إعادة مجموع مبالغ فيه.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/date/timesheet-total \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"shifts":[{"clock_in":"2026-07-20T09:00:00-04:00","clock_out":"2026-07-20T17:30:00-04:00","break_minutes":30},{"clock_in":"2026-07-21T09:15:00-04:00","clock_out":"2026-07-21T17:00:00-04:00","break_minutes":45}]}'const res = await fetch("https://api.kit.forhosting.com/date/timesheet-total", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"shifts": [
{
"clock_in": "2026-07-20T09:00:00-04:00",
"clock_out": "2026-07-20T17:30:00-04:00",
"break_minutes": 30
},
{
"clock_in": "2026-07-21T09:15:00-04:00",
"clock_out": "2026-07-21T17:00:00-04:00",
"break_minutes": 45
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/timesheet-total",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"shifts": [
{
"clock_in": "2026-07-20T09:00:00-04:00",
"clock_out": "2026-07-20T17:30:00-04:00",
"break_minutes": 30
},
{
"clock_in": "2026-07-21T09:15:00-04:00",
"clock_out": "2026-07-21T17:00:00-04:00",
"break_minutes": 45
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/timesheet-total", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"shifts":[{"clock_in":"2026-07-20T09:00:00-04:00","clock_out":"2026-07-20T17:30:00-04:00","break_minutes":30},{"clock_in":"2026-07-21T09:15:00-04:00","clock_out":"2026-07-21T17:00:00-04:00","break_minutes":45}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"shifts":[{"clock_in":"2026-07-20T09:00:00-04:00","clock_out":"2026-07-20T17:30:00-04:00","break_minutes":30},{"clock_in":"2026-07-21T09:15:00-04:00","clock_out":"2026-07-21T17:00:00-04:00","break_minutes":45}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/timesheet-total", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"shifts": [
{
"clock_in": "2026-07-20T09:00:00-04:00",
"clock_out": "2026-07-20T17:30:00-04:00",
"break_minutes": 30
},
{
"clock_in": "2026-07-21T09:15:00-04:00",
"clock_out": "2026-07-21T17:00:00-04:00",
"break_minutes": 45
}
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.timesheet_total",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_items | 10000 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |