Merge branch 'dev_odex25_hr' of https://github.com/expsa/odex25-standard-modules into bakry_hr

This commit is contained in:
Bakry 2025-07-07 14:27:15 +03:00
commit f31bdc45ab
10 changed files with 169 additions and 52 deletions

View File

@ -24,6 +24,7 @@ on:
- dev_openeducat_erp-14.0.1.0
- dev_odex25_ensan
- dev_odex25_helpdesk
- dev_odex25_donation
- preprod_odex-event
- preprod_odex25_accounting
@ -45,6 +46,7 @@ on:
- preprod_openeducat_erp-14.0.1.0
- preprod_odex25_ensan
- preprod_odex25_helpdesk
- preprod_odex25_donation
- master_odex-event
- master_odex25_accounting
@ -66,13 +68,13 @@ on:
- master_openeducat_erp-14.0.1.0
- master_odex25_ensan
- master_odex25_helpdesk
- master_odex25_donation
jobs:
validate-merge-source:
runs-on: ubuntu-latest
runs-on: app-sever-project-runner
steps:
- name: Check source branch for merge
run: |
@ -181,6 +183,11 @@ jobs:
exit 1
fi
if [[ "${{ github.base_ref }}" == "preprod_odex25_donation" && "${{ github.head_ref }}" != "dev_odex25_donation" ]]; then
echo "::error ::You can only merge to 'preprod_odex25_donation' from 'dev_odex25_donation' branch!"
exit 1
fi
# ✅ Master Branches
if [[ "${{ github.base_ref }}" == "master_odex-event" && "${{ github.head_ref }}" != "preprod_odex-event" ]]; then
echo "::error ::You can only merge to 'master_odex-event' from 'preprod_odex-event' branch!"
@ -282,6 +289,11 @@ jobs:
exit 1
fi
if [[ "${{ github.base_ref }}" == "master_odex25_donation" && "${{ github.head_ref }}" != "preprod_odex25_donation" ]]; then
echo "::error ::You can only merge to 'master_odex25_donation' from 'preprod_odex25_donation' branch!"
exit 1
fi
# ❌ Block ALL merges to 'master'
if [[ "${{ github.base_ref }}" == "master" ]]; then

View File

@ -36,7 +36,14 @@ jobs:
ensan_master_server:
name: Deploy to Ensan Master
runs-on: ensan-client-project-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Ensan-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan')
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Ensan-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' ||
github.actor == 'ahmadaking' ||
github.actor == 'ronozoro' ||
github.actor == 'SamirLADOUI-sa' ||
github.actor == 'Abubaker-Altaib' ||
github.actor == 'abdurrahman-saber')
steps:
- name: Checkout And Restart Project
run: |
@ -50,7 +57,14 @@ jobs:
helpdesk_maser_server:
name: Deploy to Helpdesk Master
runs-on: helpdesk_server
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Helpdesk-Khabir-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan')
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Helpdesk-Khabir-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' ||
github.actor == 'ahmadaking' ||
github.actor == 'ronozoro' ||
github.actor == 'SamirLADOUI-sa' ||
github.actor == 'Abubaker-Altaib' ||
github.actor == 'abdurrahman-saber')
steps:
- name: Checkout And Restart Project
run: |
@ -64,7 +78,14 @@ jobs:
kaz_master_server:
name: Deploy to KAZ Master
runs-on: kaz-library-project-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'King-AbdelAziz-Library-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan')
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'King-AbdelAziz-Library-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' ||
github.actor == 'ahmadaking' ||
github.actor == 'ronozoro' ||
github.actor == 'SamirLADOUI-sa' ||
github.actor == 'Abubaker-Altaib' ||
github.actor == 'abdurrahman-saber')
steps:
- name: Checkout And Restart Project
run: |
@ -79,7 +100,14 @@ jobs:
twahod_master_server:
name: Deploy to Twahod Master
runs-on: twahod-client-project-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Twahod-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan')
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Twahod-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' ||
github.actor == 'ahmadaking' ||
github.actor == 'ronozoro' ||
github.actor == 'SamirLADOUI-sa' ||
github.actor == 'Abubaker-Altaib' ||
github.actor == 'abdurrahman-saber')
steps:
- name: Checkout And Restart Project
run: |
@ -93,7 +121,14 @@ jobs:
ekram_master_server:
name: Deploy to Ekram Master
runs-on: ekram-client-project-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Ekram-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan')
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Ekram-Project' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_fleet' || github.ref == 'refs/heads/master_odex25_ENSAN' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_maintenance' || github.ref == 'refs/heads/master_odex25_mobile' || github.ref == 'refs/heads/master_odex25_pos' || github.ref == 'refs/heads/master_odex25_project' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_realstate' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_survey' || github.ref == 'refs/heads/master_odex25_transactions' || github.ref == 'refs/heads/master_odex25_website' || github.ref == 'refs/heads/master_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' ||
github.actor == 'ahmadaking' ||
github.actor == 'ronozoro' ||
github.actor == 'SamirLADOUI-sa' ||
github.actor == 'Abubaker-Altaib' ||
github.actor == 'abdurrahman-saber')
steps:
- name: Checkout And Restart Project
run: |
@ -107,7 +142,14 @@ jobs:
sahli_prod_master_server:
name: Deploy to Sahli Prod Master
runs-on: sahli-client-project-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Sahli-Project' && (github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_project')
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Sahli-Project' && (github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_project') &&
(github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' ||
github.actor == 'ahmadaking' ||
github.actor == 'ronozoro' ||
github.actor == 'SamirLADOUI-sa' ||
github.actor == 'Abubaker-Altaib' ||
github.actor == 'abdurrahman-saber')
steps:
- name: Checkout And Restart Project
run: |
@ -120,7 +162,14 @@ jobs:
sahli_stage_master_server:
name: Deploy to Sahli Stage Master
runs-on: sahli-client-project-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Sahli-Stage-Project' && (github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_project')
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Sahli-Stage-Project' && (github.ref == 'refs/heads/master_odex25_accounting' || github.ref == 'refs/heads/master_odex25_base' || github.ref == 'refs/heads/master_odex25_dms' || github.ref == 'refs/heads/master_odex25_hr' || github.ref == 'refs/heads/master_odex25_inventory' || github.ref == 'refs/heads/master_odex25_purchase' || github.ref == 'refs/heads/master_odex25_sales' || github.ref == 'refs/heads/master_odex25_project') &&
(github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' ||
github.actor == 'ahmadaking' ||
github.actor == 'ronozoro' ||
github.actor == 'SamirLADOUI-sa' ||
github.actor == 'Abubaker-Altaib' ||
github.actor == 'abdurrahman-saber')
steps:
- name: Checkout And Restart Project
run: |

View File

@ -16,9 +16,9 @@
<!-- <field name="dpi">90</field>-->
<field name="margin_top">30</field>
<field name="margin_right">5</field>
<field name="margin_right">1</field>
<field name="margin_bottom">10</field>
<field name="margin_left">5</field>
<field name="margin_left">1</field>
<field name="header_line" eval="False"/>
<field name="header_spacing">35</field>
<field name="dpi">90</field>
@ -157,7 +157,7 @@
</t>
</div>
</template>
<template id="late_attendance_report_template">
<template id="late_attendance_report_template">
<t t-foreach="mykey" t-as="key">
<div class="page" style="font-size:12pt" dir="rtl">
<center>
@ -385,16 +385,18 @@
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:10%;text-align:center;">رقم الهوية</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:10%;text-align:center;">اﻹدارة</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:10%;text-align:center;">المسمي الوظيفي</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">ايام الحضور</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">الاجازات</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">الاجازات الرسمية</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">الغياب</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">ساعات العمل الفعلية</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">ساعات العمل الاضافية</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">الاستئذان</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">مهام عمل/انتداب/تدريب</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:4%;text-align:center;">ايام<br/>الحضور</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:4%;text-align:center;">الاجازات</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:4%;text-align:center;">الاجازات<br/>الرسمية</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:4%;text-align:center;">الغياب</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:4%;text-align:center;">نسيان<br/>البصمة</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">ساعات<br/>العمل<br/>الفعلية</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">ساعات<br/>العمل<br/>الاضافية</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:4%;text-align:center;">الاستئذان</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">مهام<br/>عمل<br/>انتداب<br/>تدريب</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">التأخيرات</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">الخروج المبكر</th>
<th style="border: 1px solid gray; padding: 1px; font-size:0.8em;background-color: #b9d7d4;color: black;width:6%;text-align:center;">الخروج<br/>المبكر</th>
</tr>
</thead>
<tbody>
@ -408,13 +410,15 @@
<td style="border: 1px solid gray;padding: 1px; width:10%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['department']"/>
<td style="border: 1px solid gray;padding: 1px; width:10%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['job']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['days_present']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['leave_days']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['holiday_days']"/>
<td style="border: 1px solid gray;padding: 1px; width:4%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['days_present']"/>
<td style="border: 1px solid gray;padding: 1px; width:4%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['leave_days']"/>
<td style="border: 1px solid gray;padding: 1px; width:4%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['holiday_days']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['absent_days']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['missing_punch_days']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['office_hours']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['extra_hours']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['permission_hours']"/>
<td style="border: 1px solid gray;padding: 1px; width:4%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['permission_hours']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['mission_hours']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['lateness_approved']"/>
<td style="border: 1px solid gray;padding: 1px; width:6%;font-size:0.8em;background-color: white;color: black; text-align:center" t-esc="row['early_exit_approved']"/>
@ -430,6 +434,7 @@
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: #f9f9f9;color: black;" t-esc="totals['leave_days']"/>
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: #f9f9f9;color: black;" t-esc="totals['holiday_days']"/>
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: #f9f9f9;color: black;" t-esc="totals['absent_days']"/>
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: #f9f9f9;color: black;" t-esc="totals['missing_punch_days']"/>
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: #f9f9f9;color: black;" t-esc="totals['office_hours']"/>
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: #f9f9f9;color: black;" t-esc="totals['extra_hours']"/>
<td style="border: 1px solid gray;padding: 1px;font-size:0.8em;background-color: #f9f9f9;color: black;" t-esc="totals['permission_hours']"/>

View File

@ -95,6 +95,7 @@ class ReportAttendancePublic(models.AbstractModel):
key_list = []
total_dic = {}
mykey = []
resource = self.env['resource.calendar'].browse(resource_calender_id)
if resource and not employee_ids:
if resource.employee_ids:
@ -134,6 +135,11 @@ class ReportAttendancePublic(models.AbstractModel):
note = resource.leave_id.holiday_status_id.name
elif resource.approve_personal_permission:
note = resource.personal_permission_id.permission_type_id.name
elif not resource.public_holiday and not resource.normal_leave:
if resource.sign_in and not resource.sign_out:
note = 'نسيان بصمة'
elif not resource.sign_in and resource.sign_out:
note = 'نسيان بصمة'
data.append({
'date': resource.date,
@ -151,7 +157,6 @@ class ReportAttendancePublic(models.AbstractModel):
'employee_id': resource.employee_id,
'employee_name': resource.employee_id.name,
})
data = sorted(data, key=lambda d: d['date'])
for emp in employees:
list_cat = attendance_transaction_ids.filtered(lambda r: r.employee_id.name == emp)
@ -160,6 +165,14 @@ class ReportAttendancePublic(models.AbstractModel):
total_late_early = str(datetime.timedelta(minutes=total_early_exit + total_lateness))
total_extra_hours = sum(list_cat.mapped('additional_hours'))
total_extra_hours = str(datetime.timedelta(minutes=total_extra_hours))
list_missing_punch = attendance_transaction_ids.filtered(
lambda r: r.employee_id.name == emp and
not r.public_holiday and
not r.normal_leave and
((r.sign_in and not r.sign_out) or (not r.sign_in and r.sign_out))
)
total_missing_punch = len(list_missing_punch)
list_absent = attendance_transaction_ids.filtered(
lambda r: r.employee_id.name == emp and r.is_absent == True)
total_absent = len(list_absent)
@ -176,7 +189,8 @@ class ReportAttendancePublic(models.AbstractModel):
"total_extra_hours": total_extra_hours, "total_late_early": total_late_early,
"total_leave": total_leave, 'total_absent': total_absent,
'total_not_sig_in': total_not_sig_in,
'total_not_sig_out': total_not_sig_out}
'total_not_sig_out': total_not_sig_out,
'total_missing_punch':total_missing_punch}
grouped = collections.defaultdict(list)
for item in data:
grouped[item['employee_name']].append(item)
@ -236,7 +250,6 @@ class ReportAttendancePublic(models.AbstractModel):
domain.append(('employee_id', 'in', rc.employee_ids.ids))
att = self.env['hr.attendance.transaction'].search(domain)
print("1111111111111")
for emp in att.mapped('employee_id'):
# lines = att.filtered(lambda l, e=emp: l.employee_id == e)
@ -294,10 +307,6 @@ class ReportAttendancePublic(models.AbstractModel):
'early_exit_approved': hhmm(sum(row['early_exit_approved_int'] for row in summary_rows)),
})
print("222222222")
print(summary_totals)
print(data['model'])
@ -377,6 +386,11 @@ class ReportAttendancegeneral(models.AbstractModel):
note = resource.leave_id.holiday_status_id.name
elif resource.approve_personal_permission:
note = resource.personal_permission_id.permission_type_id.name
elif not resource.public_holiday and not resource.normal_leave:
if resource.sign_in and not resource.sign_out:
note = 'نسيان بصمة'
elif not resource.sign_in and resource.sign_out:
note = 'نسيان بصمة'
data.append({
'date': resource.date,
@ -403,6 +417,15 @@ class ReportAttendancegeneral(models.AbstractModel):
total_late_early = str(datetime.timedelta(minutes=total_early_exit + total_lateness))
total_extra_hours = sum(list_cat.mapped('additional_hours'))
total_extra_hours = str(datetime.timedelta(minutes=total_extra_hours))
list_missing_punch = attendance_transaction_ids.filtered(
lambda r: r.employee_id.name == emp and
not r.public_holiday and
not r.normal_leave and
((r.sign_in and not r.sign_out) or (not r.sign_in and r.sign_out))
)
total_missing_punch = len(list_missing_punch)
list_absent = attendance_transaction_ids.filtered(
lambda r: r.employee_id.name == emp and r.is_absent == True)
total_absent = len(list_absent)
@ -419,7 +442,8 @@ class ReportAttendancegeneral(models.AbstractModel):
"total_extra_hours": total_extra_hours, "total_late_early": total_late_early,
"total_leave": total_leave, 'total_absent': total_absent,
'total_not_sig_in': total_not_sig_in,
'total_not_sig_out': total_not_sig_out}
'total_not_sig_out': total_not_sig_out,
'total_missing_punch':total_missing_punch}
grouped = collections.defaultdict(list)
for item in data:
grouped[item['employee_name']].append(item)
@ -479,7 +503,6 @@ class ReportAttendancegeneral(models.AbstractModel):
domain.append(('employee_id', 'in', rc.employee_ids.ids))
att = self.env['hr.attendance.transaction'].search(domain)
print("1111111111111")
for emp in att.mapped('employee_id'):
# lines = att.filtered(lambda l, e=emp: l.employee_id == e)
@ -491,6 +514,10 @@ class ReportAttendancegeneral(models.AbstractModel):
absent = {l.date for l in lines if l.is_absent}
vacation = {l.date for l in lines if l.normal_leave}
holidays = {l.date for l in lines if l.public_holiday}
missing_punch = {l.date for l in lines if
not l.public_holiday and
not l.normal_leave and
((l.sign_in and not l.sign_out) or (not l.sign_in and l.sign_out))}
iq = getattr(emp, 'iqama_number', False) or getattr(emp, 'saudi_number', '')
calendar_name = lines[0].calendar_id.name if lines and lines[0].calendar_id else ''
@ -505,7 +532,7 @@ class ReportAttendancegeneral(models.AbstractModel):
'leave_days': len(vacation),
'holiday_days': len(holidays),
'absent_days': len(absent),
'missing_punch_days': len(missing_punch),
'office_hours': hhmm(sum(lines.mapped('office_hours'))),
'extra_hours': hhmm(sum(lines.mapped('additional_hours'))),
'permission_hours': hhmm(sum(lines.mapped('total_permission_hours'))),
@ -527,7 +554,7 @@ class ReportAttendancegeneral(models.AbstractModel):
'leave_days': sum(row['leave_days'] for row in summary_rows),
'holiday_days': sum(row['holiday_days'] for row in summary_rows),
'absent_days': sum(row['absent_days'] for row in summary_rows),
'missing_punch_days': sum(row['missing_punch_days'] for row in summary_rows),
'office_hours': hhmm(sum(row['office_hours_int'] for row in summary_rows)),
'extra_hours': hhmm(sum(row['extra_hours_int'] for row in summary_rows)),
'permission_hours': hhmm(sum(row['permission_hours_int'] for row in summary_rows)),
@ -536,13 +563,6 @@ class ReportAttendancegeneral(models.AbstractModel):
'early_exit_approved': hhmm(sum(row['early_exit_approved_int'] for row in summary_rows)),
})
print("222222222")
print(summary_totals)
print(data['model'])
return {
'doc_ids': data['ids'],
@ -660,6 +680,7 @@ class AttendancesReportXls(models.AbstractModel):
# return
if totals_only:
sheet.merge_range('F2:P2', _('تقرير الحضور والانصراف للموظفين'), fmt)
sheet.write('G3', _('من تاريخ'), fmt)
sheet.write('J3', _('إلى تاريخ'), fmt)
@ -667,10 +688,12 @@ class AttendancesReportXls(models.AbstractModel):
sheet.write(2, 10, str(end_date), fmt)
headers = [
'الرقم الوظيفي', 'اسم الموظف','الدوام', 'رقم الهوية', 'اﻹدارة', 'المسمي الوظيفي',
'ايام الحضور', 'الاجازات', 'الاجازات الرسمية', 'الغياب', 'ساعات العمل الفعلية',
'ساعات العمل الاضافية', 'الاستئذان', 'مهام عمل/انتداب/تدريب', 'التأخيرات', 'الخروج المبكر',
'الرقم الوظيفي', 'اسم الموظف', 'الدوام', 'رقم الهوية', 'اﻹدارة', 'المسمي الوظيفي',
'ايام الحضور', 'الاجازات', 'الاجازات الرسمية', 'الغياب', 'نسيان البصمة',
'ساعات العمل الفعلية', 'ساعات العمل الاضافية', 'الاستئذان', 'مهام عمل/انتداب/تدريب',
'التأخيرات', 'الخروج المبكر',
]
for col, h in enumerate(headers, start=1):
sheet.write(5, col, h, fmt)
@ -689,7 +712,7 @@ class AttendancesReportXls(models.AbstractModel):
total_leave = 0
total_holidays = 0
total_absent = 0
total_missing_punch = 0
for emp in att.mapped('employee_id'):
emp_att_lines = att.filtered(lambda l: l.employee_id == emp)
for seq in sorted(set(emp_att_lines.mapped('sequence'))): # For each shift (1, 2)
@ -699,12 +722,16 @@ class AttendancesReportXls(models.AbstractModel):
absent = {l.date for l in lines if l.is_absent}
vacation = {l.date for l in lines if l.normal_leave}
holidays = {l.date for l in lines if l.public_holiday}
missing_punch = {l.date for l in lines if
not l.public_holiday and
not l.normal_leave and
((l.sign_in and not l.sign_out) or (not l.sign_in and l.sign_out))}
total_days += len(all_days - absent - vacation - holidays)
total_leave += len(vacation)
total_holidays += len(holidays)
total_absent += len(absent)
total_missing_punch += len(missing_punch)
iq = getattr(emp, 'iqama_number', False) or getattr(emp, 'saudi_number', '')
calendar_name = lines[0].calendar_id.name if lines and lines[0].calendar_id else ''
@ -720,6 +747,7 @@ class AttendancesReportXls(models.AbstractModel):
len(vacation),
len(holidays),
len(absent),
len(missing_punch),
hhmm(sum(lines.mapped('office_hours'))),
hhmm(sum(lines.mapped('additional_hours'))),
hhmm(sum(lines.mapped('total_permission_hours'))),
@ -736,6 +764,7 @@ class AttendancesReportXls(models.AbstractModel):
total_leave,
total_holidays,
total_absent,
total_missing_punch,
hhmm(sum(att.mapped('office_hours'))),
hhmm(sum(att.mapped('additional_hours'))),
hhmm(sum(att.mapped('total_permission_hours'))),

View File

@ -49,7 +49,6 @@
<field name="model_id" ref="model_hr_payslip"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4, ref('exp_payroll_custom.group_hr_payroll_contributor')),
(4, ref('hr_base.group_general_manager')),
(4, ref('exp_hr_payroll.group_hr_payroll_user')),
(4, ref('hr_base.group_executive_manager')),

View File

@ -98,9 +98,11 @@
<menuitem id="employee_advantage_menu" name="Employee Allowances and Deductions"
parent="exp_hr_payroll.menu_hr_payroll_root" action="employee_advantage_list_action" sequence="10"
groups="hr.group_hr_user,hr.group_hr_manager,hr_base.group_executive_manager,hr_base.group_general_manager,exp_hr_payroll.group_hr_payroll_user"
groups="hr_base.group_executive_manager,hr_base.group_general_manager,exp_hr_payroll.group_hr_payroll_user"/>
/>
<!-- groups="hr.group_hr_user,hr.group_hr_manager,hr_base.group_executive_manager,hr_base.group_general_manager,exp_hr_payroll.group_hr_payroll_user"-->
<!-- -->
</data>
</odoo>

View File

@ -128,7 +128,9 @@
<menuitem id="employee_reward_menu" name="Employee Reward and Allowances"
parent="exp_hr_payroll.menu_hr_payroll_root"
action="employee_reward_list_action" sequence="10"
groups="hr_base.group_executive_manager,hr.group_hr_user,hr_base.group_department_manager,hr_base.group_division_manager,hr_base.group_general_manager,exp_hr_payroll.group_hr_payroll_user"/>
groups="hr_base.group_executive_manager,hr_base.group_general_manager,exp_hr_payroll.group_hr_payroll_user"/>
<!-- groups="hr_base.group_executive_manager,hr.group_hr_user,hr_base.group_department_manager,hr_base.group_division_manager,hr_base.group_general_manager,exp_hr_payroll.group_hr_payroll_user"/>-->
</data>
</odoo>

View File

@ -2647,7 +2647,7 @@ msgid "Saudi Issue Date"
msgstr "تاريخ اصدار الهوية الوطنية"
module: hr_base
#. module: hr_base
#: model:ir.model.fields,field_description:hr_base.field_hr_employee__iqama_creat_date
msgid "Iqama Issue Date"
msgstr "تاريخ اصدار الاقامة"

View File

@ -2123,3 +2123,10 @@ msgid "Sorry, The Refuse For The Department Manager '%s' Only !"
msgstr "للأسف، لرفض مدير الإدارة '%s' فقط او مدير الموارد البشرية !"
#. module: hr_termination
#: code:addons/hr_termination/models/hr_termination.py:0
#, python-format
msgid ""
"You cannot terminate the employee \"%s\" because there are \"%s\" custody "
"requests that exceeded the allowed amount and are not yet closed."
msgstr "لا يمكن إنهاء خدمة الموظف \"%s\" حيث توجد \"%s\" عهد تجاوزت المبلغ المسموح ولم تُغلق بعد."

View File

@ -220,6 +220,7 @@ class HrTermination(models.Model):
def _compute_holiday_amount(self):
for item in self:
if item.salary:
days = item.employee_id.resource_calendar_id.work_days
day_amount = item.salary / days
holiday_amount = item.leave_balance * day_amount
@ -786,6 +787,7 @@ class HrTermination(models.Model):
emp_modules = Module.search([('state', '=', 'installed'), ('name', '=', 'exp_employee_custody')])
petty_cash_modules = Module.search([('state', '=', 'installed'), ('name', '=', 'hr_expense_petty_cash')])
asset_modules = Module.search([('state', '=', 'installed'), ('name', '=', 'odex25_account_asset')])
custody_request_module = Module.search([('state', '=', 'installed'), ('name', '=', 'employee_custody_request')])
# modules = Module.search([('state', '=', 'installed'), ('name', '=', 'exp_custody_petty_cash')])
''''if asset_modules:
@ -817,6 +819,16 @@ class HrTermination(models.Model):
_(
'You can not create termination when there is "%s" employee petty cash payment in state not in state Return Done for "%s" please reconcile it') % (
len(employee_petty_cash_payment), self.employee_id.name))
if custody_request_module:
exceeded_custody = self.env['hr.request.pledge'].search([
('employee_id', '=', self.employee_id.id),
('custody_status', '=', 'exceeded')
])
if exceeded_custody:
raise exceptions.Warning(_(
'You cannot terminate the employee "%s" because there are "%s" custody requests that exceeded the allowed amount and are not yet closed.'
) % (self.employee_id.name, len(exceeded_custody)))
for item in self:
# Check if Net less than 0.0
if item.net < 0: