This commit is contained in:
esam 2025-11-26 12:44:14 -05:00
commit a8f6b93cbd
34 changed files with 588 additions and 259 deletions

View File

@ -1,4 +1,3 @@
# Author: Ahmad Samir <a.atta@exp-sa.com>
name: Block Reserved Branches name: Block Reserved Branches
on: on:
@ -9,20 +8,63 @@ on:
jobs: jobs:
block-reserved-branches: block-reserved-branches:
runs-on: app-sever-project-runner runs-on: app-sever-project-runner
steps: steps:
- name: Check for reserved or pattern-matching branch names - name: Validate branch creator + reserved names
env: env:
GH_TOKEN: ${{ secrets.GH_TOKEN }} GH_TOKEN: ${{ secrets.GH_TOKEN }}
REPO: ${{ github.repository }} REPO: ${{ github.repository }}
BRANCH_NAME: ${{ github.ref_name }} BRANCH_NAME: ${{ github.ref_name }}
CREATOR: ${{ github.actor }}
run: | run: |
echo "Branch: $BRANCH_NAME"
echo "Creator: $CREATOR"
#######################################################
# 🟦 1) Allowed Users List
#######################################################
ALLOWED_USERS=(
"expsa"
"moutazmuhammad"
"ronozoro"
"Abubaker-Altaib"
"altexp"
"the5abir"
"ahmadaking"
"kchyounes19"
"abdurrahman-saber"
"maltayyar2"
"esam-sermah"
"mohammed-alkhazrji"
)
IS_ALLOWED="false"
for user in "${ALLOWED_USERS[@]}"; do
if [[ "$CREATOR" == "$user" ]]; then
IS_ALLOWED="true"
break
fi
done
if [[ "$IS_ALLOWED" == "false" ]]; then
echo "❌ User '$CREATOR' is NOT allowed to create branches. Deleting..."
curl -s -X DELETE \
-H "Authorization: token $GH_TOKEN" \
https://api.github.com/repos/$REPO/git/refs/heads/$BRANCH_NAME
exit 1
fi
echo "✔ User '$CREATOR' is allowed."
#######################################################
# 🟦 2) Reserved Branch Names (Your Existing List)
#######################################################
RESERVED_NAMES=( RESERVED_NAMES=(
master master
dev_odex25_accounting dev_odex25_accounting
dev_odex25_base dev_odex25_base
dev_odex25_dms dev_odex25_dms
dev_odex25_donation dev_odex25_donation
dev_odex25_ensan
dev_odex25_fleet dev_odex25_fleet
dev_odex25_helpdesk dev_odex25_helpdesk
dev_odex25_hr dev_odex25_hr
@ -39,11 +81,13 @@ jobs:
dev_odex25_website dev_odex25_website
dev_odex-event dev_odex-event
dev_openeducat_erp-14.0.1.0 dev_openeducat_erp-14.0.1.0
dev_odex25_benefit
dev_odex25_takaful
dev_odex25_ensan
master_odex25_accounting master_odex25_accounting
master_odex25_base master_odex25_base
master_odex25_dms master_odex25_dms
master_odex25_donation master_odex25_donation
master_odex25_ensan
master_odex25_fleet master_odex25_fleet
master_odex25_helpdesk master_odex25_helpdesk
master_odex25_hr master_odex25_hr
@ -60,11 +104,13 @@ jobs:
master_odex25_website master_odex25_website
master_odex-event master_odex-event
master_openeducat_erp-14.0.1.0 master_openeducat_erp-14.0.1.0
master_odex25_benefit
master_odex25_takaful
master_odex25_ensan
preprod_odex25_accounting preprod_odex25_accounting
preprod_odex25_base preprod_odex25_base
preprod_odex25_dms preprod_odex25_dms
preprod_odex25_donation preprod_odex25_donation
preprod_odex25_ensan
preprod_odex25_fleet preprod_odex25_fleet
preprod_odex25_helpdesk preprod_odex25_helpdesk
preprod_odex25_hr preprod_odex25_hr
@ -81,19 +127,31 @@ jobs:
preprod_odex25_website preprod_odex25_website
preprod_odex-event preprod_odex-event
preprod_openeducat_erp-14.0.1.0 preprod_openeducat_erp-14.0.1.0
preprod_odex25_benefit
preprod_odex25_takaful
preprod_odex25_ensan
) )
# Check if branch is an exact reserved name
# Exact match
for reserved in "${RESERVED_NAMES[@]}"; do for reserved in "${RESERVED_NAMES[@]}"; do
if [[ "$BRANCH_NAME" == "$reserved" ]]; then if [[ "$BRANCH_NAME" == "$reserved" ]]; then
echo "❌ Branch name '$BRANCH_NAME' is reserved. Deleting..." echo "❌ Branch name '$BRANCH_NAME' is reserved. Deleting..."
curl -s -X DELETE -H "Authorization: token $GH_TOKEN" https://api.github.com/repos/$REPO/git/refs/heads/$BRANCH_NAME curl -s -X DELETE \
-H "Authorization: token $GH_TOKEN" \
https://api.github.com/repos/$REPO/git/refs/heads/$BRANCH_NAME
exit 1 exit 1
fi fi
done done
# Check if branch name matches restricted patterns
#######################################################
# 🟦 3) Pattern-based Restriction
#######################################################
if [[ "$BRANCH_NAME" == master_* || "$BRANCH_NAME" == preprod_* || "$BRANCH_NAME" == dev_* ]]; then if [[ "$BRANCH_NAME" == master_* || "$BRANCH_NAME" == preprod_* || "$BRANCH_NAME" == dev_* ]]; then
echo "❌ Branch name '$BRANCH_NAME' matches restricted pattern. Deleting..." echo "❌ Branch name '$BRANCH_NAME' matches restricted pattern. Deleting..."
curl -s -X DELETE -H "Authorization: token $GH_TOKEN" https://api.github.com/repos/$REPO/git/refs/heads/$BRANCH_NAME curl -s -X DELETE \
-H "Authorization: token $GH_TOKEN" \
https://api.github.com/repos/$REPO/git/refs/heads/$BRANCH_NAME
exit 1 exit 1
fi fi
echo "✅ Branch '$BRANCH_NAME' is allowed."
echo "✅ Branch '$BRANCH_NAME' is allowed."

View File

@ -22,8 +22,10 @@ on:
- dev_odex25_transactions - dev_odex25_transactions
- dev_odex25_website - dev_odex25_website
- dev_openeducat_erp-14.0.1.0 - dev_openeducat_erp-14.0.1.0
- dev_odex25_ensan
- dev_odex25_donation - dev_odex25_donation
- dev_odex25_benefit
- dev_odex25_takaful
- dev_odex25_ensan
- preprod_odex-event - preprod_odex-event
- preprod_odex25_accounting - preprod_odex25_accounting
- preprod_odex25_base - preprod_odex25_base
@ -43,9 +45,11 @@ on:
- preprod_odex25_transactions - preprod_odex25_transactions
- preprod_odex25_website - preprod_odex25_website
- preprod_openeducat_erp-14.0.1.0 - preprod_openeducat_erp-14.0.1.0
- preprod_odex25_ensan
- preprod_odex25_donation - preprod_odex25_donation
- preprod_odex25_benefit
- preprod_odex25_takaful
- preprod_odex25_ensan
workflow_dispatch: workflow_dispatch:
inputs: inputs:
environment: environment:
@ -82,7 +86,8 @@ jobs:
github.ref == 'refs/heads/preprod_odex25_transactions' || github.ref == 'refs/heads/preprod_odex25_transactions' ||
github.ref == 'refs/heads/preprod_odex25_website' || github.ref == 'refs/heads/preprod_odex25_website' ||
github.ref == 'refs/heads/preprod_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/preprod_openeducat_erp-14.0.1.0' ||
github.ref == 'refs/heads/preprod_odex25_ensan' || github.ref == 'refs/heads/preprod_odex25_benefit' ||
github.ref == 'refs/heads/preprod_odex25_takaful' ||
github.ref == 'refs/heads/preprod_odex25_donation') github.ref == 'refs/heads/preprod_odex25_donation')
|| (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'preprod') || (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'preprod')
steps: steps:
@ -120,7 +125,8 @@ jobs:
github.ref == 'refs/heads/dev_odex25_transactions' || github.ref == 'refs/heads/dev_odex25_transactions' ||
github.ref == 'refs/heads/dev_odex25_website' || github.ref == 'refs/heads/dev_odex25_website' ||
github.ref == 'refs/heads/dev_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/dev_openeducat_erp-14.0.1.0' ||
github.ref == 'refs/heads/dev_odex25_ensan' || github.ref == 'refs/heads/dev_odex25_benefit' ||
github.ref == 'refs/heads/dev_odex25_takaful' ||
github.ref == 'refs/heads/dev_odex25_donation') github.ref == 'refs/heads/dev_odex25_donation')
|| (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'dev') || (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'dev')
steps: steps:
@ -158,7 +164,8 @@ jobs:
github.ref == 'refs/heads/preprod_odex25_transactions' || github.ref == 'refs/heads/preprod_odex25_transactions' ||
github.ref == 'refs/heads/preprod_odex25_website' || github.ref == 'refs/heads/preprod_odex25_website' ||
github.ref == 'refs/heads/preprod_openeducat_erp-14.0.1.0' || github.ref == 'refs/heads/preprod_openeducat_erp-14.0.1.0' ||
github.ref == 'refs/heads/preprod_odex25_ensan' || github.ref == 'refs/heads/preprod_odex25_benefit' ||
github.ref == 'refs/heads/preprod_odex25_takaful' ||
github.ref == 'refs/heads/preprod_odex25_donation') github.ref == 'refs/heads/preprod_odex25_donation')
|| (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'preprod') || (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'preprod')
steps: steps:

View File

@ -25,6 +25,8 @@ on:
- dev_odex25_ensan - dev_odex25_ensan
- dev_odex25_helpdesk - dev_odex25_helpdesk
- dev_odex25_donation - dev_odex25_donation
- dev_odex25_benefit
- dev_odex25_takaful
- preprod_odex-event - preprod_odex-event
- preprod_odex25_accounting - preprod_odex25_accounting
@ -47,6 +49,8 @@ on:
- preprod_odex25_ensan - preprod_odex25_ensan
- preprod_odex25_helpdesk - preprod_odex25_helpdesk
- preprod_odex25_donation - preprod_odex25_donation
- preprod_odex25_benefit
- preprod_odex25_takaful
- master_odex-event - master_odex-event
- master_odex25_accounting - master_odex25_accounting
@ -69,7 +73,8 @@ on:
- master_odex25_ensan - master_odex25_ensan
- master_odex25_helpdesk - master_odex25_helpdesk
- master_odex25_donation - master_odex25_donation
- master_odex25_benefit
- master_odex25_takaful
jobs: jobs:
@ -188,6 +193,17 @@ jobs:
exit 1 exit 1
fi fi
if [[ "${{ github.base_ref }}" == "preprod_odex25_benefit" && "${{ github.head_ref }}" != "dev_odex25_benefit" ]]; then
echo "::error ::You can only merge to 'preprod_odex25_donation' from 'dev_odex25_donation' branch!"
exit 1
fi
if [[ "${{ github.base_ref }}" == "preprod_odex25_takaful" && "${{ github.head_ref }}" != "dev_odex25_takaful" ]]; then
echo "::error ::You can only merge to 'preprod_odex25_donation' from 'dev_odex25_donation' branch!"
exit 1
fi
# ✅ Master Branches # ✅ Master Branches
if [[ "${{ github.base_ref }}" == "master_odex-event" && "${{ github.head_ref }}" != "preprod_odex-event" ]]; then 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!" echo "::error ::You can only merge to 'master_odex-event' from 'preprod_odex-event' branch!"
@ -294,6 +310,19 @@ jobs:
exit 1 exit 1
fi fi
if [[ "${{ github.base_ref }}" == "master_odex25_benefit" && "${{ github.head_ref }}" != "preprod_odex25_benefit" ]]; then
echo "::error ::You can only merge to 'master_odex25_donation' from 'preprod_odex25_donation' branch!"
exit 1
fi
if [[ "${{ github.base_ref }}" == "master_odex25_takaful" && "${{ github.head_ref }}" != "preprod_odex25_takaful" ]]; then
echo "::error ::You can only merge to 'master_odex25_donation' from 'preprod_odex25_donation' branch!"
exit 1
fi
# ❌ Block ALL merges to 'master' # ❌ Block ALL merges to 'master'
if [[ "${{ github.base_ref }}" == "master" ]]; then if [[ "${{ github.base_ref }}" == "master" ]]; then
@ -301,4 +330,4 @@ jobs:
exit 1 exit 1
fi fi
echo "Merge validation passed." echo "Merge validation passed."

View File

@ -22,7 +22,7 @@ jobs:
ensan_master_server: ensan_master_server:
name: Deploy to Ensan Master name: Deploy to Ensan Master
runs-on: new-ensan-vpn-client-server-runner runs-on: new-ensan-vpn-client-server-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Ensan Project - Production' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_helpdesk' || 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.ref == 'refs/heads/master_odex25_donation') && if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Ensan Project - Production' && (github.ref == 'refs/heads/master_odex-event' || github.ref == 'refs/heads/master_odex25_helpdesk' || 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_takaful' || github.ref == 'refs/heads/master_odex25_benefit' || github.ref == 'refs/heads/master_odex25_donation' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' || (github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' || github.actor == 'expsa' ||
github.actor == 'ahmadaking' || github.actor == 'ahmadaking' ||
@ -50,7 +50,7 @@ jobs:
helpdesk_maser_server: helpdesk_maser_server:
name: Deploy to Helpdesk Master name: Deploy to Helpdesk Master
runs-on: helpdesk_server 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' || github.ref == 'refs/heads/master_odex25_helpdesk') && 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_takaful' || github.ref == 'refs/heads/master_odex25_benefit' || github.ref == 'refs/heads/master_odex25_helpdesk' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' || (github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' || github.actor == 'expsa' ||
github.actor == 'ahmadaking' || github.actor == 'ahmadaking' ||
@ -78,7 +78,7 @@ jobs:
kaz_master_server: kaz_master_server:
name: Deploy to KAZ Master name: Deploy to KAZ Master
runs-on: kaz-library-project-runner 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_helpdesk' || 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_helpdesk' || 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_takaful' || github.ref == 'refs/heads/master_odex25_benefit' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' || (github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' || github.actor == 'expsa' ||
github.actor == 'ahmadaking' || github.actor == 'ahmadaking' ||
@ -107,7 +107,7 @@ jobs:
twahod_master_server: twahod_master_server:
name: Deploy to Twahod Master name: Deploy to Twahod Master
runs-on: twahod-client-project-runner 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_helpdesk' || 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_helpdesk' || 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_takaful' || github.ref == 'refs/heads/master_odex25_benefit' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' || (github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' || github.actor == 'expsa' ||
github.actor == 'ahmadaking' || github.actor == 'ahmadaking' ||
@ -135,7 +135,7 @@ jobs:
ekram_master_server: ekram_master_server:
name: Deploy to Ekram Master name: Deploy to Ekram Master
runs-on: ekram-client-project-runner 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_helpdesk' || 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_helpdesk' || 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_takaful' || github.ref == 'refs/heads/master_odex25_benefit' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' || (github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' || github.actor == 'expsa' ||
github.actor == 'ahmadaking' || github.actor == 'ahmadaking' ||
@ -218,7 +218,7 @@ jobs:
jazala_master_server: jazala_master_server:
name: Deploy to Jazala Master name: Deploy to Jazala Master
runs-on: jazala-client-project-runner runs-on: jazala-client-project-runner
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'Jazala 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_helpdesk' || 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 == 'Jazala 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_helpdesk' || 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_takaful' || github.ref == 'refs/heads/master_odex25_benefit' || github.ref == 'refs/heads/master_odex25_ensan') &&
(github.actor == 'moutazmuhammad' || (github.actor == 'moutazmuhammad' ||
github.actor == 'expsa' || github.actor == 'expsa' ||
github.actor == 'ahmadaking' || github.actor == 'ahmadaking' ||

View File

@ -0,0 +1,102 @@
name: Restrict PR Authors & Committers
permissions:
contents: read
pull-requests: write
on:
pull_request:
types: [opened, reopened, synchronize]
branches:
- dev_odex-event
- dev_odex25_accounting
- dev_odex25_base
- dev_odex25_dms
- dev_odex25_fleet
- dev_odex25_hr
- dev_odex25_inventory
- dev_odex25_maintenance
- dev_odex25_mobile
- dev_odex25_pos
- dev_odex25_project
- dev_odex25_purchase
- dev_odex25_realstate
- dev_odex25_sales
- dev_odex25_survey
- dev_odex25_transactions
- dev_odex25_website
- dev_openeducat_erp-14.0.1.0
- dev_odex25_benefit
- dev_odex25_takaful
- dev_odex25_helpdesk
- dev_odex25_donation
- dev_odex25_ensan
jobs:
check_pr_author:
runs-on: linting_odex25-standard-modules_runner
steps:
- name: Validate PR Author & Commit Authors
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
const allowed = [
"expsa",
"moutazmuhammad",
"ronozoro",
"Abubaker-Altaib",
"altexp",
"the5abir",
"ahmadaking",
"kchyounes19",
"abdurrahman-saber",
"maltayyar2",
"esam-sermah",
"mohammed-alkhazrji"
];
const pr = context.payload.pull_request;
const prAuthor = pr.user.login;
const owner = context.repo.owner;
const repo = context.repo.repo;
core.info(`PR author: ${prAuthor}`);
// Check PR author
if (!allowed.includes(prAuthor)) {
core.error(`Unauthorized PR author: ${prAuthor}. Closing PR...`);
await github.rest.pulls.update({
owner,
repo,
pull_number: pr.number,
state: "closed"
});
return;
}
// Check commit authors
const commitList = await github.rest.pulls.listCommits({
owner,
repo,
pull_number: pr.number
});
for (const commit of commitList.data) {
const commitAuthor = commit.author ? commit.author.login : null;
if (commitAuthor && !allowed.includes(commitAuthor)) {
core.error(`Unauthorized commit author: ${commitAuthor}. Closing PR...`);
await github.rest.pulls.update({
owner,
repo,
pull_number: pr.number,
state: "closed"
});
return;
}
}
core.info("All PR authors and committers are allowed.");

View File

@ -1,61 +0,0 @@
name: SonarQube Analysis
on:
push:
branches:
- master_odex-event
- master_odex25_accounting
- master_odex25_base
- master_odex25_dms
- master_odex25_fleet
- master_odex25_helpdesk
- master_odex25_hr
- master_odex25_inventory
- master_odex25_maintenance
- master_odex25_mobile
- master_odex25_pos
- master_odex25_project
- master_odex25_purchase
- master_odex25_realstate
- master_odex25_sales
- master_odex25_survey
- master_odex25_transactions
- master_odex25_website
- master_openeducat_erp-14.0.1.0
- master_odex25_ensan
- master_odex25_donation
jobs:
sonar:
runs-on: sonarqube
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run SonarScanner
run: |
export BRANCH_NAME="${GITHUB_REF#refs/heads/}"
export SAFE_BRANCH_NAME="${BRANCH_NAME//\//_}"
export PROJECT_KEY="odex25_standard_modules_${SAFE_BRANCH_NAME}"
export PROJECT_NAME="Standard Modules ${SAFE_BRANCH_NAME^}"
export SOURCE_FOLDER_NAME="${BRANCH_NAME#master_}"
export PROJECT_VERSION="1.0"
export SONAR_HOST_URL=${{ secrets.SONAR_HOST_URL }}
export SONAR_TOKEN=${{ secrets.SONAR_TOKEN }}
sonar-scanner \
-Dsonar.projectKey="$PROJECT_KEY" \
-Dsonar.projectName="$PROJECT_NAME" \
-Dsonar.projectVersion="$PROJECT_VERSION" \
-Dsonar.sources="$SOURCE_FOLDER_NAME" \
-Dsonar.inclusions="**/*.py, **/*.xml, **/*.js, **/*.html, **/*.css" \
-Dsonar.exclusions="**/__manifest__.py, **/migrations/**, **/__pycache__/**" \
-Dsonar.sourceEncoding="UTF-8" \
-Dsonar.host.url="$SONAR_HOST_URL" \
-Dsonar.login="$SONAR_TOKEN"
- name: Cleanup workspace
if: always()
run: |
rm -rf $GITHUB_WORKSPACE/*

View File

@ -19,12 +19,12 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form> <form>
<header> <header>
<button name="action_send" string="Send" type="object" states="draft" groups="purchase.group_purchase_user"/> <button name="action_send" string="Send" type="object" states="draft" groups="purchase.group_purchase_user" class="btn-primary" icon="fa-send"/>
<button name="action_ssd_approve" string="SSD Approve" type="object" states="ssd" groups="hr_base.group_services_manager"/> <button name="action_ssd_approve" string="SSD Approve" type="object" states="ssd" groups="hr_base.group_services_manager" class="btn-primary" icon="fa-check-circle"/>
<button name="action_ssd_reject" string="SSD Reject" type="object" states="ssd" groups="hr_base.group_services_manager"/> <button name="action_ssd_reject" string="SSD Reject" type="object" states="ssd" groups="hr_base.group_services_manager" class="btn-danger" icon="fa-times-circle"/>
<button name="action_gm_approve" string="GM Approve (Add to Agreement)" type="object" states="gm" groups="hr_base.group_general_manager"/> <button name="action_gm_approve" string="GM Approve (Add to Agreement)" type="object" states="gm" groups="hr_base.group_general_manager" class="btn-primary" icon="fa-check-circle"/>
<button name="action_gm_reject" string="GM Reject" type="object" states="gm" groups="hr_base.group_general_manager"/> <button name="action_gm_reject" string="GM Reject" type="object" states="gm" groups="hr_base.group_general_manager" class="btn-danger" icon="fa-times-circle"/>
<button name="action_cancel" string="Cancel" type="object" states="draft,ssd,gm"/> <button name="action_cancel" string="Cancel" type="object" states="draft,ssd,gm" class="btn-secondary" icon="fa-ban"/>
<field name="state" widget="statusbar" statusbar_visible="draft,ssd,gm,approved,rejected,cancel"/> <field name="state" widget="statusbar" statusbar_visible="draft,ssd,gm,approved,rejected,cancel"/>
</header> </header>

View File

@ -23,18 +23,20 @@
<form string="Annual Purchase Request"> <form string="Annual Purchase Request">
<header> <header>
<field name="can_create_agreement" invisible="1"/> <field name="can_create_agreement" invisible="1"/>
<button name="action_send" string="Send" type="object" states="draft" class="oe_highlight" groups="purchase.group_purchase_user"/>
<button name="action_manager_approve" string="Approve" type="object" class="oe_highlight" states="to_manager" groups="purchase.group_purchase_manager"/> <button name="action_send" string="Send" type="object" states="draft" class="btn-primary" groups="purchase.group_purchase_user" icon="fa-send"/>
<button name="action_manager_reject" string="Reject" type="object" states="to_manager" groups="purchase.group_purchase_manager"/> <button name="action_manager_approve" string="Approve" type="object" class="btn-primary" states="to_manager" groups="purchase.group_purchase_manager" icon="fa-check-circle"/>
<button name="action_send_to_committee" string="Send to Committee" type="object" class="oe_highlight" groups="purchase.group_purchase_user" attrs="{'invisible': ['|', ('committee_enabled','=',False), ('state','not in',['procurement','rejected_by_committee'])]}"/> <button name="action_manager_reject" string="Reject" type="object" states="to_manager" groups="purchase.group_purchase_manager" class="btn-danger" icon="fa-times-circle"/>
<button name="action_create_rfq" string="Create RFQ" type="object" class="oe_highlight" states="procurement,rejected_by_committee" groups="purchase.group_purchase_user"/> <button name="action_send_to_committee" string="Send to Committee" type="object" class="btn-info" groups="purchase.group_purchase_user" attrs="{'invisible': ['|', ('committee_enabled','=',False), ('state','not in',['procurement','rejected_by_committee'])]}" icon="fa-users"/>
<button name="action_cancel" string="Cancel" type="object" states="procurement,rejected_by_committee,committee" groups="purchase.group_purchase_user"/> <button name="action_create_rfq" string="Create RFQ" type="object" class="btn-primary" states="procurement,rejected_by_committee" groups="purchase.group_purchase_user" icon="fa-file-text-o"/>
<button name="action_ssd_approve" string="Approve" class="oe_highlight" type="object" states="ssd" groups="hr_base.group_services_manager"/> <button name="action_cancel" string="Cancel" type="object" states="procurement,rejected_by_committee,committee" groups="purchase.group_purchase_user" class="btn-secondary" icon="fa-ban"/>
<button name="action_ssd_reject" string="Reject" type="object" states="ssd" groups="hr_base.group_services_manager"/> <button name="action_ssd_approve" string="Approve" class="btn-primary" type="object" states="ssd" groups="hr_base.group_services_manager" icon="fa-check-circle"/>
<button name="action_ceo_approve" string="Approve" class="oe_highlight" type="object" states="ceo" groups="hr_base.group_general_manager"/> <button name="action_ssd_reject" string="Reject" type="object" states="ssd" groups="hr_base.group_services_manager" class="btn-danger" icon="fa-times-circle"/>
<button name="action_ceo_reject" string="Reject" type="object" states="ceo" groups="hr_base.group_general_manager"/> <button name="action_ceo_approve" string="Approve" class="btn-primary" type="object" states="ceo" groups="hr_base.group_general_manager" icon="fa-check-circle"/>
<button name="action_create_agreement" string="Create Agreement" type="object" states="purchase" class="oe_highlight" groups="purchase.group_purchase_manager,purchase.group_purchase_user"/> <button name="action_ceo_reject" string="Reject" type="object" states="ceo" groups="hr_base.group_general_manager" class="btn-danger" icon="fa-times-circle"/>
<button name="action_to_draft" string="Back To Draft" type="object" states="rejected" class="oe_highlight" groups="odex25_annual_purchase.group_annual_to_draft" /> <button name="action_create_agreement" string="Create Agreement" type="object" states="purchase" class="btn-primary" groups="purchase.group_purchase_manager" icon="fa-file-contract"/>
<button name="action_to_draft" string="Back To Draft" type="object" states="rejected" class="btn-secondary" groups="odex25_annual_purchase.group_annual_to_draft" icon="fa-undo" />
<field name="state" widget="statusbar" statusbar_visible="draft,to_manager,procurement,committee,ssd,ceo,approved,rejected,cancel"/> <field name="state" widget="statusbar" statusbar_visible="draft,to_manager,procurement,committee,ssd,ceo,approved,rejected,cancel"/>
</header> </header>
<sheet attrs="{'readonly': [('state', '!=', 'draft')]}"> <sheet attrs="{'readonly': [('state', '!=', 'draft')]}">

View File

@ -23,10 +23,10 @@
</group> </group>
<footer> <footer>
<button name="action_create_search_html" string="View" target="_blank" type="object" <button name="action_create_search_html" string="View" target="_blank" type="object"
class="btn-primary"/> class="btn-primary" icon="fa-eye"/>
<button name="action_create_search_pdf" string="Pdf" type="object" <button name="action_create_search_pdf" string="Pdf" type="object"
class="btn-primary"/> class="btn-primary" icon="fa-file-pdf-o"/>
<button string="Cancel" class="btn-secondary" special="cancel"/> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times"/>
</footer> </footer>
</form> </form>
</field> </field>

View File

@ -21,10 +21,10 @@
</group> </group>
<footer> <footer>
<button name="action_create_search_html" string="View" target="_blank" type="object" <button name="action_create_search_html" string="View" target="_blank" type="object"
class="btn-primary"/> class="btn-primary" icon="fa-eye"/>
<button name="action_create_search_pdf" string="Pdf" type="object" <button name="action_create_search_pdf" string="Pdf" type="object"
class="btn-primary"/> class="btn-primary" icon="fa-file-pdf-o"/>
<button string="Cancel" class="btn-secondary" special="cancel"/> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times"/>
</footer> </footer>
</form> </form>
</field> </field>

View File

@ -41,28 +41,28 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="" create="false" delete="false"> <form string="" create="false" delete="false">
<header> <header>
<button name="action_confirm" type="object" class="oe_highlight" states="draft" string="Confirm" <button name="action_confirm" type="object" class="btn-primary" states="draft" string="Confirm"
groups="odex25_purchase_coc.group_coc_user,odex25_purchase_coc.group_coc_manager"/> groups="odex25_purchase_coc.group_coc_user,odex25_purchase_coc.group_coc_manager" icon="fa-check-circle"/>
<button name="action_cancel" type="object" class="oe_highlight" states="draft" string="Reject" <button name="action_cancel" type="object" class="btn-danger" states="draft" string="Reject"
groups="odex25_purchase_coc.group_coc_manager"/> groups="odex25_purchase_coc.group_coc_manager" icon="fa-times-circle"/>
<button name="action_approve" <button name="action_approve"
type="object" type="object"
string="Manager Approve" string="Manager Approve"
states="manager" states="manager"
class="oe_highlight" class="btn-primary" icon="fa-check-circle"
groups="odex25_purchase_coc.group_purchase_coc_direct_manager" groups="odex25_purchase_coc.group_purchase_coc_direct_manager"
/> />
<button name="action_manager_reject" <button name="action_manager_reject"
type="object" type="object"
string="Manager Reject" string="Manager Reject"
states="manager" states="manager"
class="oe_highlight" class="btn-danger" icon="fa-times-circle"
groups="odex25_purchase_coc.group_purchase_coc_direct_manager" groups="odex25_purchase_coc.group_purchase_coc_direct_manager"
/> />
<button name="action_draft" type="object" class="oe_highlight" states="cancel" string="Set to Draft"/> <button name="action_draft" type="object" class="btn-secondary" states="cancel" string="Set to Draft" icon="fa-undo"/>
<field name="state" widget="statusbar"/> <field name="state" widget="statusbar"/>
</header> </header>

View File

@ -10,8 +10,8 @@ You have processed less product than the initial order.
</p> </p>
<footer> <footer>
<button name="action_confirm" string="Create Backorder" type="object" class="btn-primary"/> <button name="action_confirm" string="Create Backorder" type="object" class="btn-primary" icon="fa-plus-circle"/>
<button name="action_cancel" string="No Backorder" type="object" class="btn-secondary"/> <button name="action_cancel" string="No Backorder" type="object" class="btn-secondary" icon="fa-ban"/>
</footer> </footer>
</form> </form>
</field> </field>

View File

@ -21,8 +21,8 @@
<field name="state" widget="statusbar" statusbar_visible="draft,dm,str_pro_department,direct_manager,send_budget,wait_budget,budget_approve,general_supervisor,waiting"/> <field name="state" widget="statusbar" statusbar_visible="draft,dm,str_pro_department,direct_manager,send_budget,wait_budget,budget_approve,general_supervisor,waiting"/>
</xpath> </xpath>
<xpath expr="//button[@name='action_pc_confirm']" position="replace"> <xpath expr="//button[@name='action_pc_confirm']" position="replace">
<button name="action_pc_confirm" groups="governmental_purchase.executive_director_of_purchase_and_contract" type="object" string="Approve" states="budget_approve" class="oe_highlight"/> <button name="action_pc_confirm" groups="governmental_purchase.executive_director_of_purchase_and_contract" type="object" string="Approve" states="budget_approve" class="btn-primary" icon="fa-check-circle"/>
<button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse" states="budget_approve" type="action" groups="governmental_purchase.executive_director_of_purchase_and_contract"/> <button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse" states="budget_approve" type="action" groups="governmental_purchase.executive_director_of_purchase_and_contract" class="btn-danger" icon="fa-times-circle"/>
</xpath> </xpath>
<xpath expr="//field[@name='partner_id']" position="after"> <xpath expr="//field[@name='partner_id']" position="after">
@ -30,9 +30,9 @@
<field name="check_chief_executive" invisible="1"/> <field name="check_chief_executive" invisible="1"/>
</xpath> </xpath>
<xpath expr="//button[@name='action_confirm']" position="replace"> <xpath expr="//button[@name='action_confirm']" position="replace">
<button name="action_confirm_button" groups="purchase_requisition_custom.group_direct_manger" type="object" string="Submit" class="oe_highlight" attrs="{'invisible': ['|',('check_chief_executive','=',False),('state','!=', 'dm')]}"/> <button name="action_confirm_button" groups="purchase_requisition_custom.group_direct_manger" type="object" string="Submit" class="btn-primary" attrs="{'invisible': ['|',('check_chief_executive','=',False),('state','!=', 'dm')]}" icon="fa-send"/>
<button name="technical_department" type="object" groups="odex25_taqeem_purchase.strategy_project_group" string="Technical Department" states="str_pro_department" class="oe_highlight"/> <button name="technical_department" type="object" groups="odex25_taqeem_purchase.strategy_project_group" string="Technical Department" states="str_pro_department" class="btn-info" icon="fa-cogs"/>
<button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse" type="action" groups="odex25_taqeem_purchase.strategy_project_group" states="str_pro_department"/> <button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse" type="action" groups="odex25_taqeem_purchase.strategy_project_group" states="str_pro_department" class="btn-danger" icon="fa-times-circle"/>
</xpath> </xpath>
<!-- <xpath expr="//field[@name='line_ids']//field[@name='sum_total']" position="attributes"> <!-- <xpath expr="//field[@name='line_ids']//field[@name='sum_total']" position="attributes">
<attribute name="readonly">1</attribute> <attribute name="readonly">1</attribute>

View File

@ -32,10 +32,10 @@
<xpath expr="//button[@name='action_pc_confirm']" position="replace"> <xpath expr="//button[@name='action_pc_confirm']" position="replace">
<button name="action_pc_confirm" <button name="action_pc_confirm"
groups="governmental_purchase.executive_director_of_purchase_and_contract" type="object" groups="governmental_purchase.executive_director_of_purchase_and_contract" type="object"
string="Approve" states="budget_approve" class="oe_highlight"/> string="Approve" states="budget_approve" class="btn-primary" icon="fa-check-circle"/>
<button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse" <button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse"
states="budget_approve" type="action" states="budget_approve" type="action"
groups="governmental_purchase.executive_director_of_purchase_and_contract"/> groups="governmental_purchase.executive_director_of_purchase_and_contract" class="btn-danger" icon="fa-times-circle"/>
</xpath> </xpath>
@ -45,7 +45,7 @@
</xpath> </xpath>
<xpath expr="//button[@name='action_confirm']" position="replace"> <xpath expr="//button[@name='action_confirm']" position="replace">
<button name="action_confirm" groups="purchase_requisition_custom.group_direct_manger" type="object" <button name="action_confirm" groups="purchase_requisition_custom.group_direct_manger" type="object"
string="Submit" class="oe_highlight" string="Submit" class="btn-primary" icon="fa-send"
attrs="{'invisible': ['|',('check_chief_executive','=',False),('state','!=', 'dm')]}"/> attrs="{'invisible': ['|',('check_chief_executive','=',False),('state','!=', 'dm')]}"/>
</xpath> </xpath>
<xpath expr="//page[@name='base_info_dep_use']" position="replace"/> <xpath expr="//page[@name='base_info_dep_use']" position="replace"/>

View File

@ -29,19 +29,19 @@
</xpath> </xpath>
<xpath expr="//button[@name='action_confirm']" position="replace"> <xpath expr="//button[@name='action_confirm']" position="replace">
<button name="action_confirm" groups="purchase_requisition_custom.group_direct_manger" type="object" <button name="action_confirm" groups="purchase_requisition_custom.group_direct_manger" type="object"
string="Submit" class="oe_highlight" string="Submit" class="btn-primary" icon="fa-send"
attrs="{'invisible': ['|',('check_chief_executive','=',False),('state','!=', 'dm')]}"/> attrs="{'invisible': ['|',('check_chief_executive','=',False),('state','!=', 'dm')]}"/>
</xpath> </xpath>
<xpath expr="//button[@name='action_pc_confirm']" position="replace"> <xpath expr="//button[@name='action_pc_confirm']" position="replace">
<button name="action_pc_confirm" <button name="action_pc_confirm"
groups="governmental_purchase.executive_director_of_purchase_and_contract" type="object" groups="governmental_purchase.executive_director_of_purchase_and_contract" type="object"
string="Approve" states="budget_approve" class="oe_highlight"/> string="Approve" states="budget_approve" class="btn-primary" icon="fa-check-circle"/>
<button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse" <button name="%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d" string="Refuse"
states="budget_approve" type="action" states="budget_approve" type="action"
groups="governmental_purchase.executive_director_of_purchase_and_contract"/> groups="governmental_purchase.executive_director_of_purchase_and_contract" class="btn-danger" icon="fa-times-circle"/>
</xpath> </xpath>
<!-- <xpath expr="//button[@name='%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d']"--> <!-- <xpath expr="//button[@name='%(purchase_requisition_custom.purchase_request_cancel_wizard_action)d']"-->
<!-- position="replace">--> <!-- position="replace">-->

View File

@ -7,8 +7,8 @@
<field name="inherit_id" ref="purchase_requisition.view_purchase_requisition_form"/> <field name="inherit_id" ref="purchase_requisition.view_purchase_requisition_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//button[@name='action_in_progress']" position="after"> <xpath expr="//button[@name='action_in_progress']" position="after">
<button name="action_show_portal" attrs="{'invisible':['|','|',('state' , '!=' , 'in_progress' ),('published_in_portal' , '=' , True),('publish_in_portal' , '!=' , True)]}" string="Show in Portal" type="object" class="btn-primary"/> <button name="action_show_portal" attrs="{'invisible':['|','|',('state' , '!=' , 'in_progress' ),('published_in_portal' , '=' , True),('publish_in_portal' , '!=' , True)]}" string="Show in Portal" type="object" class="btn-primary" icon="fa-globe"/>
<button name="extend_availability" attrs="{'invisible':['|',('state' , '!=' , 'open' ),('published_in_portal' , '!=' , True)]}" type="object" string="Extend Availability" /> <button name="extend_availability" attrs="{'invisible':['|',('state' , '!=' , 'open' ),('published_in_portal' , '!=' , True)]}" type="object" string="Extend Availability" class="btn-info" icon="fa-clock-o" />
</xpath> </xpath>
<xpath expr="//div[@class='oe_button_box']" position="inside"> <xpath expr="//div[@class='oe_button_box']" position="inside">
<button name="application" type="object" class="oe_stat_button" icon="fa-globe" <button name="application" type="object" class="oe_stat_button" icon="fa-globe"
@ -61,7 +61,7 @@
</group> </group>
<footer> <footer>
<div> <div>
<button name="action_extend" string="Extend" type="object" default_focus="1" class="oe_highlight"/> <button name="action_extend" string="Extend" type="object" default_focus="1" class="btn-primary" icon="fa-clock-o"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="oe_link" special="cancel" />
</div> </div>

View File

@ -7,8 +7,8 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Online Tender Configuration" create="false" delete="false"> <form string="Online Tender Configuration" create="false" delete="false">
<header> <header>
<button name="action_tender" confirm="Are you sure you want to shortlisting this Request?" states="draft" string="Tender" type="object"/> <button name="action_tender" confirm="Are you sure you want to shortlisting this Request?" states="draft" string="Tender" type="object" class="btn-primary" icon="fa-gavel"/>
<button name="action_reject" states="draft" string="Reject" type="object"/> <button name="action_reject" states="draft" string="Reject" type="object" class="btn-danger" icon="fa-times-circle"/>
<field name="state" widget="statusbar" statusbar_visible="draft,tender,contract"/> <field name="state" widget="statusbar" statusbar_visible="draft,tender,contract"/>
</header> </header>
<sheet> <sheet>
@ -61,7 +61,7 @@
<field name="reject_reason" required="1"/> <field name="reject_reason" required="1"/>
<footer> <footer>
<div> <div>
<button name="action_reject" string="Reject" type="object" default_focus="1" class="oe_highlight"/> <button name="action_reject" string="Reject" type="object" default_focus="1" class="btn-danger" icon="fa-times-circle"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="oe_link" special="cancel" />
</div> </div>

View File

@ -23,7 +23,7 @@
</group> </group>
</sheet> </sheet>
<footer> <footer>
<button name="print_report" string="Print" type="object" class="btn-primary"/> <button name="print_report" string="Print" type="object" class="btn-primary" icon="fa-print"/>
<button string="Cancel" class="btn-default" special="cancel"/> <button string="Cancel" class="btn-default" special="cancel"/>
</footer> </footer>
</form> </form>
@ -66,7 +66,7 @@
</group> </group>
</sheet> </sheet>
<footer> <footer>
<button name="print_report" string="Print" type="object" class="btn-primary"/> <button name="print_report" string="Print" type="object" class="btn-primary" icon="fa-print"/>
<button string="Cancel" class="btn-default" special="cancel"/> <button string="Cancel" class="btn-default" special="cancel"/>
</footer> </footer>
</form> </form>
@ -111,7 +111,7 @@
</group> </group>
</sheet> </sheet>
<footer> <footer>
<button name="print_report" string="Print" type="object" class="btn-primary"/> <button name="print_report" string="Print" type="object" class="btn-primary" icon="fa-print"/>
<button string="Cancel" class="btn-default" special="cancel"/> <button string="Cancel" class="btn-default" special="cancel"/>
</footer> </footer>
</form> </form>

View File

@ -17,9 +17,9 @@
</group> </group>
<footer> <footer>
<div> <div>
<button name="action_print" string="Print" type="object" default_focus="1" class="oe_highlight"/> <button name="action_print" string="Print" type="object" default_focus="1" class="btn-primary" icon="fa-print"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times" />
</div> </div>
</footer> </footer>
</form> </form>

View File

@ -18,9 +18,9 @@
</group> </group>
<footer> <footer>
<div> <div>
<button name="action_print" string="Print" type="object" default_focus="1" class="oe_highlight"/> <button name="action_print" string="Print" type="object" default_focus="1" class="btn-primary" icon="fa-print"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times" />
</div> </div>
</footer> </footer>
</form> </form>

View File

@ -17,9 +17,9 @@
</group> </group>
<footer> <footer>
<div> <div>
<button name="action_print" string="Print" type="object" default_focus="1" class="oe_highlight"/> <button name="action_print" string="Print" type="object" default_focus="1" class="btn-primary" icon="fa-print"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times" />
</div> </div>
</footer> </footer>
</form> </form>

View File

@ -18,9 +18,9 @@
</group> </group>
<footer> <footer>
<div> <div>
<button name="action_print" string="Print" type="object" default_focus="1" class="oe_highlight"/> <button name="action_print" string="Print" type="object" default_focus="1" class="btn-primary" icon="fa-print"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times" />
</div> </div>
</footer> </footer>
</form> </form>

View File

@ -18,9 +18,9 @@
</group> </group>
<footer> <footer>
<div> <div>
<button name="action_print" string="Print" type="object" default_focus="1" class="oe_highlight"/> <button name="action_print" string="Print" type="object" default_focus="1" class="btn-primary" icon="fa-print"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times" />
</div> </div>
</footer> </footer>
</form> </form>

View File

@ -18,7 +18,7 @@ msgstr ""
#. module: purchase_custom_stock #. module: purchase_custom_stock
#: model:ir.model.fields,field_description:purchase_custom_stock.field_purchase_request__show_approve_warehouse #: model:ir.model.fields,field_description:purchase_custom_stock.field_purchase_request__show_approve_warehouse
msgid "Approve Warehouse" msgid "Approve Warehouse"
msgstr "" msgstr "موافقة المستودع"
#. module: purchase_custom_stock #. module: purchase_custom_stock
#: model:ir.model.fields,field_description:purchase_custom_stock.field_asset_operation_return_line__asset_id #: model:ir.model.fields,field_description:purchase_custom_stock.field_asset_operation_return_line__asset_id

View File

@ -47,15 +47,15 @@
</button> </button>
</xpath> </xpath>
<xpath expr="/form/header/button[@name='action_done']" position="replace"> <xpath expr="/form/header/button[@name='action_done']" position="replace">
<button name="action_done" type="object" string="Delivery Done" class="oe_highlight" <button name="action_done" type="object" string="Delivery Done" class="btn-success"
groups="purchase_requisition_custom.create_purchase_request" groups="purchase_requisition_custom.create_purchase_request"
attrs="{'invisible':[('show_emp_button' , '=' , False)]}"/> attrs="{'invisible':[('show_emp_button' , '=' , False)]}" icon="fa-check-circle"/>
</xpath> </xpath>
<xpath expr="//field[@name='use_analytic']" position="attributes"> <xpath expr="//field[@name='use_analytic']" position="attributes">
<attribute name="attrs">{'readonly':[('state','!=','draft')]}</attribute> <attribute name="attrs">{'readonly':[('state','!=','draft')]}</attribute>
</xpath> </xpath>
<xpath expr="//group[1]" position="after"> <xpath expr="//group[@name='other_details_group']" position="after">
<group col="2" colspan="2"> <group string="Warehouse Management" name="warehouse_management_group">
<field name="view_location_id" invisible="1"/> <field name="view_location_id" invisible="1"/>
<field name="edit_locations" invisible="1"/> <field name="edit_locations" invisible="1"/>
<field name="show_emp_button" invisible="1"/> <field name="show_emp_button" invisible="1"/>
@ -64,20 +64,12 @@
<field name="show_asset_release_button" invisible="1"/> <field name="show_asset_release_button" invisible="1"/>
<field name="all_assets_released" invisible="1"/> <field name="all_assets_released" invisible="1"/>
<field name="asset_custody_complete" invisible="1"/> <field name="asset_custody_complete" invisible="1"/>
<div> <field name="warehouse_id"
<label for="warehouse_id"/> attrs="{'readonly':['|',('edit_locations' , '=' , False),('state' , '!=' , 'warehouse')]}"
<field name="warehouse_id" groups="stock.group_stock_user,stock.group_stock_manager"/>
attrs="{'readonly':['|',('edit_locations' , '=' , False),('state' , '!=' , 'warehouse')]}" <field name="location_id"
groups="stock.group_stock_user,stock.group_stock_manager"/> attrs="{'readonly':['|',('edit_locations' , '=' , False),('state' , '!=' , 'warehouse')]}"
groups="stock.group_stock_user,stock.group_stock_manager"/>
</div>
<div>
<label for="location_id"/>
<field name="location_id"
attrs="{'readonly':['|',('edit_locations' , '=' , False),('state' , '!=' , 'warehouse')]}"
groups="stock.group_stock_user,stock.group_stock_manager"/>
</div>
</group> </group>
</xpath> </xpath>
<xpath expr="//button[@name='open_requisition']" position="after"> <xpath expr="//button[@name='open_requisition']" position="after">
@ -104,7 +96,7 @@
groups="stock.group_stock_user,stock.group_stock_manager"/> groups="stock.group_stock_user,stock.group_stock_manager"/>
<button name="action_refuse" type="object" string="Refuse" id="prs_request_refuse" <button name="action_refuse" type="object" string="Refuse" id="prs_request_refuse"
groups="stock.group_stock_manager" groups="stock.group_stock_manager"
attrs="{'invisible' : [('state' , '!=' , 'warehouse')]}"/> attrs="{'invisible' : [('state' , '!=' , 'warehouse')]}" class="btn-danger" icon="fa-times-circle"/>
</xpath> </xpath>
<xpath expr="//button[@name='action_draft']" position="before"> <xpath expr="//button[@name='action_draft']" position="before">
<button name="create_asset_custody_lines" <button name="create_asset_custody_lines"

View File

@ -27,7 +27,7 @@ msgstr "طلب عرض سعر"
#: code:addons/purchase_requisition_custom/models/purchase_requisition_custom.py:0 #: code:addons/purchase_requisition_custom/models/purchase_requisition_custom.py:0
#, python-format #, python-format
msgid " No budget for this service " msgid " No budget for this service "
msgstr "" msgstr "لا توجد ميزانية لهذه الخدمة"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.actions.report,print_report_name:purchase_requisition_custom.action_report_committee_meeting_minutes #: model:ir.actions.report,print_report_name:purchase_requisition_custom.action_report_committee_meeting_minutes
@ -102,13 +102,13 @@ msgstr "الموعد النهائي لاستقبال عروض الاسعار"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_requisition__name #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_requisition__name
msgid "Agreement Reference" msgid "Agreement Reference"
msgstr "" msgstr "مرجع الاتفاقية"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_order__requisition_type_exclusive #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_order__requisition_type_exclusive
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_requisition__type_exclusive #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_requisition__type_exclusive
msgid "Agreement Selection Type" msgid "Agreement Selection Type"
msgstr "" msgstr "نوع اختيار الاتفاقية"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_request__type_id #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_request__type_id
@ -124,7 +124,7 @@ msgstr "تاريخ توقيع الاتفاقية"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_order__already_voted #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_order__already_voted
msgid "Already Voted" msgid "Already Voted"
msgstr "" msgstr "تم التصويت بالفعل"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_request_line__account_id #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_request_line__account_id
@ -2397,7 +2397,7 @@ msgstr "عدد الرسائل غير المقروءة"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_request__use_analytic #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_request__use_analytic
msgid "Use Analytic" msgid "Use Analytic"
msgstr "استخدام حساب تحليلى (بند موازنة) اخر" msgstr "حساب تحليلي آخر؟"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_requisition__is_analytic #: model:ir.model.fields,field_description:purchase_requisition_custom.field_purchase_requisition__is_analytic
@ -2946,6 +2946,186 @@ msgstr "نوع الطلب"
msgid "Month" msgid "Month"
msgstr "الشهر" msgstr "الشهر"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Request Information"
msgstr "معلومات الطلب"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Request Details"
msgstr "تفاصيل الطلب"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Vendor"
msgstr "المورد"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Accounting"
msgstr "المحاسبة"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Enter purchase request justifications..."
msgstr "أدخل مبررات طلب الشراء..."
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Enter additional notes..."
msgstr "أدخل ملاحظات إضافية..."
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Vendor and Accounting"
msgstr "المورد والمحاسبة"
#. module: purchase_custom_stock
#: model_terms:ir.ui.view,arch_db:purchase_custom_stock.purchase_request_form_inherit
msgid "Warehouse Management"
msgstr "إدارة المستودعات"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Suggested vendor for this purchase request"
msgstr "المورد المقترح لهذا الطلب"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Analytic account for budget tracking"
msgstr "الحساب التحليلي لتتبع الموازنة"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Other Details"
msgstr "تفاصيل أخرى"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Warehouse Management"
msgstr "إدارة المستودعات"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_requisition_custom_form_view
msgid "Select"
msgstr "اختيار"
#. module: purchase_custom_stock
#: model_terms:ir.ui.view,arch_db:purchase_custom_stock.purchase_request_form_inherit
msgid "Delivery Done"
msgstr "تم التسليم"
#. module: purchase_custom_stock
#: model_terms:ir.ui.view,arch_db:purchase_custom_stock.purchase_request_form_inherit
msgid "Create Asset Custody"
msgstr "إنشاء عهدة أصول"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "Purchase State"
msgstr "حالة الشراء"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "State"
msgstr "الحالة"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "Categories"
msgstr "الفئات"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "Branch"
msgstr "الفرع"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "Department"
msgstr "القسم"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "Employee"
msgstr "الموظف"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "Date"
msgstr "التاريخ"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_tree
msgid "Request Number"
msgstr "رقم الطلب"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_requisition_custom_form_view
msgid "Approve Order"
msgstr "موافقة الطلب"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_requisition_custom_form_view
msgid "PO To Contract"
msgstr "تحويل إلى عقد"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_requisition_custom_form_view
msgid "Sign"
msgstr "توقيع"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_requisition_custom_form_view
msgid "Choose All"
msgstr "اختيار الكل"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_requisition_custom_form_view
msgid "Send To Committee"
msgstr "إرسال للجنة"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_requisition_custom_form_view
msgid "Confirm Purchase"
msgstr "تأكيد الشراء"
#. module: odex25_purchase_coc
#: model_terms:ir.ui.view,arch_db:odex25_purchase_coc.purchase_coc_form_view
msgid "Manager Approve"
msgstr "موافقة المدير"
#. module: odex25_purchase_coc
#: model_terms:ir.ui.view,arch_db:odex25_purchase_coc.purchase_coc_form_view
msgid "Manager Reject"
msgstr "رفض المدير"
#. module: vendor_evaluation
#: model_terms:ir.ui.view,arch_db:vendor_evaluation.vendor_evaluation_wizard_view
msgid "Evaluate"
msgstr "تقييم"
#. module: odex25_taqeem_purchase
#: model_terms:ir.ui.view,arch_db:odex25_taqeem_purchase.competitive_purchase_view
msgid "Technical Department"
msgstr "القسم الفني"
#. module: odex25_purchase_coc
#: model_terms:ir.ui.view,arch_db:odex25_purchase_coc.purchase_coc_form_view
msgid "Create Backorder"
msgstr "إنشاء طلب متأخر"
#. module: odex25_purchase_coc
#: model_terms:ir.ui.view,arch_db:odex25_purchase_coc.purchase_coc_form_view
msgid "No Backorder"
msgstr "بدون طلب متأخر"
#. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_form
msgid "Request Lines"
msgstr "بنود الطلب"
#. module: purchase_requisition_custom #. module: purchase_requisition_custom
#: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_search #: model_terms:ir.ui.view,arch_db:purchase_requisition_custom.purchase_request_search
msgid "Year" msgid "Year"

View File

@ -12,32 +12,38 @@
<button name="action_submit" groups="purchase_requisition_custom.create_purchase_request" <button name="action_submit" groups="purchase_requisition_custom.create_purchase_request"
type="object" type="object"
string="Submit" string="Submit"
class="oe_highlight" class="btn-primary"
icon="fa-paper-plane"
attrs="{'invisible': ['|',('is_creator', '=', False),('state','!=','draft')]}"/> attrs="{'invisible': ['|',('is_creator', '=', False),('state','!=','draft')]}"/>
<button name="action_confirm" groups="purchase_requisition_custom.group_direct_manger" <button name="action_confirm" groups="purchase_requisition_custom.group_direct_manger"
type="object" string="Approve" states="direct_manager" class="oe_highlight"/> type="object" string="Approve" states="direct_manager"
class="btn-primary" icon="fa-check-circle"/>
<button name="create_requisition" <button name="create_requisition"
groups="purchase.group_purchase_user,purchase.group_purchase_manager" type="object" groups="purchase.group_purchase_user,purchase.group_purchase_manager" type="object"
string="Create Requisition" string="Create Requisition"
class="oe_highlight" class="btn-primary"
icon="fa-file-text-o"
attrs="{'invisible' : ['|',('state' , '!=' , 'waiting'),('purchase_create' , '=' , True)]}"/> attrs="{'invisible' : ['|',('state' , '!=' , 'waiting'),('purchase_create' , '=' , True)]}"/>
<button name="create_purchase_order2" type="object" string="Create Purchase Order" <button name="create_purchase_order2" type="object" string="Create Purchase Order"
class="oe_highlight" groups="purchase.group_purchase_user" class="btn-primary" groups="purchase.group_purchase_user"
icon="fa-shopping-cart"
attrs="{'invisible' : ['|',('state' , '!=' , 'waiting'),('purchase_create' , '=' , True)]}"/> attrs="{'invisible' : ['|',('state' , '!=' , 'waiting'),('purchase_create' , '=' , True)]}"/>
<button name="action_refuse" type="object" string="Refuse" id="prc_request_refuse" <button name="action_refuse" type="object" string="Refuse" id="prc_request_refuse"
groups="purchase_requisition_custom.group_refuse_purchase" groups="purchase_requisition_custom.group_refuse_purchase"
class="btn-danger"
icon="fa-times-circle"
attrs="{'invisible' : [('state' , 'not in' , ('direct_manager','waiting'))]}"/> attrs="{'invisible' : [('state' , 'not in' , ('direct_manager','waiting'))]}"/>
<button name="action_done" type="object" string="Done" class="oe_stat_button" <button name="action_done" type="object" string="Done" class="oe_stat_button"
groups="purchase.group_purchase_manager" states="waiting"/> groups="purchase.group_purchase_manager" states="waiting"
icon="fa-check-circle"/>
<button name="action_draft" type="object" string="Reset To Draft" class="oe_highlight" <button name="action_draft" type="object" string="Reset To Draft" class="btn-secondary"
states="refuse" groups="purchase_requisition_custom.group_purchase_set_to_draft"/> states="refuse" groups="purchase_requisition_custom.group_purchase_set_to_draft"
icon="fa-undo"/>
<field name="state" widget="statusbar"/> <field name="state" widget="statusbar"/>
@ -47,11 +53,11 @@
<field name="is_requisition" invisible="1"/> <field name="is_requisition" invisible="1"/>
<field name="is_creator" invisible="1"/> <field name="is_creator" invisible="1"/>
<button class="oe_stat_button" name="open_requisition" type="object" <button class="oe_stat_button" name="open_requisition" type="object"
string="Purchase Agreement" icon="fa-list-ol" string="Purchase Agreement" icon="fa-file-text-o"
attrs="{'invisible' : [('is_requisition' , '=' , False)]}" attrs="{'invisible' : [('is_requisition' , '=' , False)]}"
groups="purchase.group_purchase_user,purchase.group_purchase_manager"/> groups="purchase.group_purchase_user,purchase.group_purchase_manager"/>
<button class="oe_stat_button" name="open_purchase" type="object" <button class="oe_stat_button" name="open_purchase" type="object"
string="Purchase Orders" icon="fa-list-ol" string="Purchase Orders" icon="fa-shopping-cart"
attrs="{'invisible' : [('purchase_create' , '=' , False)]}" attrs="{'invisible' : [('purchase_create' , '=' , False)]}"
groups="purchase.group_purchase_user,purchase.group_purchase_manager"/> groups="purchase.group_purchase_user,purchase.group_purchase_manager"/>
</div> </div>
@ -61,45 +67,49 @@
<field name="name" required="1" readonly="1" class="oe_inline"/> <field name="name" required="1" readonly="1" class="oe_inline"/>
</h1> </h1>
</div> </div>
<group col="4" colspan="3"> <group>
<field name="by_purchase" groups="purchase.group_purchase_user"/> <group string="Request Information">
<field name="date" readonly="1" widget="date"/>
<field name="by_purchase" groups="purchase.group_purchase_user"/>
<field name="employee_id" attrs="{'readonly':[('by_purchase' , '=' , False)]}" required="1"
options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}"/>
<field name="department_id" force_save="1"
attrs="{'readonly' : ['|',('state' , '!=' , 'draft'),('by_purchase' , '!=' , True)] , 'required' : [('by_purchase' , '=' , True)]}"
readonly="1" context="{'show_department_short': True}"/>
<field name="branch_id" readonly="1" context="{'show_branch_short': True}"/>
</group>
<group string="Request Details">
<field name="product_category_ids" widget="many2many_tags"/>
<field name="purchase_purpose" required="1"
attrs="{'readonly':[('state' , '!=' , 'draft')]}"
placeholder="Enter purchase request justifications..."/>
<field name="partner_id"
domain="[('supplier_rank','>', 0)]"
options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}"
attrs="{'readonly':['|',('edit_partner_id' , '=' , False),('state' , '!=' , 'waiting')]}"
help="Suggested vendor for this purchase request"/>
</group>
<group string="Other Details" name="other_details_group">
<field name="use_analytic"/>
<field name="account_analytic_id"
options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}"
attrs="{'invisible':[('use_analytic' , '=' , False)],'required':[('use_analytic' , '=' , True)],'readonly':[('state' , '!=' , 'draft')]}"
help="Analytic account for budget tracking"/>
</group>
<field name="picking_type_id" invisible="1"/> <field name="picking_type_id" invisible="1"/>
<field name="department_id" force_save="1"
attrs="{'readonly' : ['|',('state' , '!=' , 'draft'),('by_purchase' , '!=' , True)] , 'required' : [('by_purchase' , '=' , True)]}"
readonly="1" context="{'show_department_short': True}"/>
<field name="branch_id" readonly="1" context="{'show_branch_short': True}"/>
<field name="employee_id" attrs="{'readonly':[('by_purchase' , '=' , False)]}" required="1"
options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}"/>
<field name="product_category_ids" widget="many2many_tags"/>
<field name="purchase_purpose" required="1"
attrs="{'readonly':[('state' , '!=' , 'draft')]}"/>
<field name="date" readonly="1"/>
<field name="purchase_create" invisible="1"/> <field name="purchase_create" invisible="1"/>
<field name="partner_id"
domain="[('supplier_rank','>', 0)]"
options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}"
attrs="{'readonly':['|',('edit_partner_id' , '=' , False),('state' , '!=' , 'waiting')]}"/>
<!-- <div>-->
<!-- <label for="use_analytic"/>-->
<field name="use_analytic"/>
<field name="account_analytic_id"
options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}"
attrs="{'invisible':[('use_analytic' , '=' , False)],'required':[('use_analytic' , '=' , True)],'readonly':[('state' , '!=' , 'draft')]}"/>
<!-- </div>-->
<field name="company_id" invisible="1"/> <field name="company_id" invisible="1"/>
<field name="edit_partner_id" invisible="1"/> <field name="edit_partner_id" invisible="1"/>
</group> </group>
<notebook> <notebook>
<page string="Items" name="purchase_request_info"> <page string="Items" name="purchase_request_info" icon="fa-list">
<field name="line_ids" attrs="{'readonly':[('state' , '!=' , 'draft')]}"> <field name="line_ids" attrs="{'readonly':[('state' , '!=' , 'draft')]}">
<tree editable="bottom"> <tree editable="bottom" string="Request Lines">
<field name="product_id" <field name="product_id"
domain="[('purchase_ok', '=', True)]" domain="[('purchase_ok', '=', True)]"
options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}" options="{'no_create' : True , 'no_edit' : True ,'no_open' : True}"
optional="show" optional="show"
required="1"/> required="1"/>
<field name="uom_id"/> <field name="uom_id"/>
<field name="description"/> <field name="description"/>
@ -113,8 +123,8 @@
</tree> </tree>
</field> </field>
</page> </page>
<page string="Note"> <page string="Note" icon="fa-sticky-note-o">
<field name="note"/> <field name="note" placeholder="Enter additional notes..."/>
</page> </page>
</notebook> </notebook>
</sheet> </sheet>
@ -131,15 +141,21 @@
<field name="name">Purchase Request</field> <field name="name">Purchase Request</field>
<field name="model">purchase.request</field> <field name="model">purchase.request</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree> <tree string="Purchase Requests">
<field name="name"/> <field name="name" string="Request Number"/>
<field name="date"/> <field name="date" widget="date" string="Date"/>
<field name="employee_id"/> <field name="employee_id" string="Employee"/>
<field name="department_id" context="{'show_department_short': True}"/> <field name="department_id" string="Department" context="{'show_department_short': True}"/>
<field name="branch_id" context="{'show_branch_short': True}"/> <field name="branch_id" string="Branch" context="{'show_branch_short': True}"/>
<field name="product_category_ids" widget="many2many_tags"/> <field name="product_category_ids" widget="many2many_tags" string="Categories"/>
<field name="state"/> <field name="state" string="State" widget="badge"
<field name="purchase_state_summary" optional="show"/> decoration-muted="state == 'draft'"
decoration-warning="state in ['direct_manager', 'wait_for_send']"
decoration-info="state in ['waiting', 'warehouse', 'initial']"
decoration-primary="state == 'employee'"
decoration-success="state == 'done'"
decoration-danger="state in ['cancel', 'refuse']"/>
<field name="purchase_state_summary" optional="show" widget="badge" string="Purchase State"/>
</tree> </tree>
</field> </field>
</record> </record>

View File

@ -171,23 +171,23 @@
<field name="requisition_state" invisible="1"/> <field name="requisition_state" invisible="1"/>
<field name="requisition_type_exclusive" invisible="1"/> <field name="requisition_type_exclusive" invisible="1"/>
<!-- <button type="object" name="action_to_approve" class="oe_highlight" states="to approve" string="Approve"/>--> <!-- <button type="object" name="action_to_approve" class="oe_highlight" states="to approve" string="Approve"/>-->
<button type="object" name="action_sign" class="oe_highlight" <button type="object" name="action_sign" class="btn-primary"
groups="purchase_requisition_custom.group_sign_purchase_order" groups="purchase_requisition_custom.group_sign_purchase_order"
attrs="{'invisible':['|',('requisition_id','=',False), attrs="{'invisible':['|',('requisition_id','=',False),
'|', ('state','in',['sign','purchase','to approve','done', '|', ('state','in',['sign','purchase','to approve','done',
'cancel','budget_rejected','wait_for_send','waiting']), ('is_signed', '=', True)]}" 'cancel','budget_rejected','wait_for_send','waiting']), ('is_signed', '=', True)]}"
string="Sign"/> string="Sign" icon="fa-signature"/>
<!-- <button type="object" name="action_approve_po" string="Confirm Purchase" class="oe_highlight"--> <!-- <button type="object" name="action_approve_po" string="Confirm Purchase" class="oe_highlight"-->
<!-- attrs="{'invisible':['|',('requisition_id','=',False),'|','&amp;',('requisition_type_exclusive', '!=','exclusive'),('is_purchase_budget','=',False),('state','not in',('to approve'))]}"/>--> <!-- attrs="{'invisible':['|',('requisition_id','=',False),'|','&amp;',('requisition_type_exclusive', '!=','exclusive'),('is_purchase_budget','=',False),('state','not in',('to approve'))]}"/>-->
<button type="object" name="action_approve_po" string="Confirm Purchase" class="oe_highlight" invisible="1"/> <button type="object" name="action_approve_po" string="Confirm Purchase" class="btn-primary" invisible="1" icon="fa-check-circle"/>
<button type="object" name="action_select" groups="purchase_requisition_custom.committe_member" <button type="object" name="action_select" groups="purchase_requisition_custom.committe_member"
attrs="{'invisible':['|', ('state','in',['done','purchase','waiting','cancel']),('can_committee_vote', '=', False)]}" attrs="{'invisible':['|', ('state','in',['done','purchase','waiting','cancel']),('can_committee_vote', '=', False)]}"
string="Select"/> string="Select" class="btn-primary" icon="fa-check-circle"/>
<button type="object" name="action_refuse" groups="purchase_requisition_custom.committe_member" <button type="object" name="action_refuse" groups="purchase_requisition_custom.committe_member"
attrs="{'invisible':['|',('state','in',['done','purchase','waiting','cancel']),('can_committee_vote', '=', False)]}" attrs="{'invisible':['|',('state','in',['done','purchase','waiting','cancel']),('can_committee_vote', '=', False)]}"
string="Refuse"/> string="Refuse" class="btn-danger" icon="fa-times-circle"/>
<button type="object" name="action_recommend" <button type="object" name="action_recommend"
groups="purchase_requisition_custom.group_select_recommended_offer" groups="purchase_requisition_custom.group_select_recommended_offer"
confirm="Are you sure you want to process ?" confirm="Are you sure you want to process ?"
@ -197,28 +197,30 @@
<button type="object" name="action_unsign" <button type="object" name="action_unsign"
groups="purchase_requisition_custom.group_unsign_purchase_order" string="UnSign" groups="purchase_requisition_custom.group_unsign_purchase_order" string="UnSign"
states="sign"/> states="sign"/>
<button type="object" name="budget_resend" string="Resend To Budget Check" class="oe_highlight" <button type="object" name="budget_resend" string="Resend To Budget Check" class="btn-info"
states="budget_rejected"/> states="budget_rejected" icon="fa-refresh"/>
<button type="object" name="action_budget" string="Send To Budget Check" class="oe_highlight" <button type="object" name="action_budget" string="Send To Budget Check" class="btn-primary"
attrs="{'invisible':[('hide_action_budget_button', '=', True)]}"/> attrs="{'invisible':[('hide_action_budget_button', '=', True)]}" icon="fa-send"/>
<button name="action_skip_budget" type="object" string="Skip Budget" <button name="action_skip_budget" type="object" string="Skip Budget"
attrs="{'invisible':[('hide_action_budget_button', '=', True)]}" attrs="{'invisible':[('hide_action_budget_button', '=', True)]}"
groups="purchase_requisition_custom.group_skip_purchase_budget"/> groups="purchase_requisition_custom.group_skip_purchase_budget"
class="btn-warning" icon="fa-forward"/>
<!-- <button name="button_draft" states="cancel" string="Set to Draft" type="object"/>--> <!-- <button name="button_draft" states="cancel" string="Set to Draft" type="object"/>-->
</xpath> </xpath>
<xpath expr="//button[@name='button_approve']" position="replace"> <xpath expr="//button[@name='button_approve']" position="replace">
<button name="button_approve" type="object" <button name="button_approve" type="object"
attrs="{'invisible':['|',('requisition_id','!=',False),('state','not in',('to approve'))]}" attrs="{'invisible':['|',('requisition_id','!=',False),('state','not in',('to approve'))]}"
string="Approve Order" class="oe_highlight" groups="purchase.group_purchase_manager"/> string="Approve Order" class="btn-primary" groups="purchase.group_purchase_manager" icon="fa-check-circle"/>
</xpath> </xpath>
<xpath expr="//button[@name='button_draft']" position="after"> <xpath expr="//button[@name='button_draft']" position="after">
<button string='PO To Contract' name="open_convert_po_contract" type="object" <button string='PO To Contract' name="open_convert_po_contract" type="object"
class="oe_highlight" groups="purchase.group_purchase_manager" class="btn-info" groups="purchase.group_purchase_manager" icon="fa-file-contract"
attrs="{'invisible':[('state','in',('draft','wait','wait_for_send','sent','to approve','sign','waiting','purchase','cancel'))]}"/> attrs="{'invisible':[('state','in',('draft','wait','wait_for_send','sent','to approve','sign','waiting','purchase','cancel'))]}"/>
</xpath> </xpath>
<xpath expr="//button[@name='button_draft']" position="attributes"> <xpath expr="//button[@name='button_draft']" position="attributes">
<attribute name="class">oe_highlight</attribute> <attribute name="class">btn-warning</attribute>
<attribute name="icon">fa-undo</attribute>
</xpath> </xpath>
<xpath expr="//field[@name='date_order']" position="after"> <xpath expr="//field[@name='date_order']" position="after">
<field name="type"/> <field name="type"/>
@ -233,7 +235,8 @@
<xpath expr="/form/header/button[@id='draft_confirm']" position="attributes"> <xpath expr="/form/header/button[@id='draft_confirm']" position="attributes">
<attribute name="groups">purchase.group_purchase_manager</attribute> <attribute name="groups">purchase.group_purchase_manager</attribute>
<attribute name="states">draft</attribute> <attribute name="states">draft</attribute>
<attribute name="class">oe_highlight</attribute> <attribute name="class">btn-primary</attribute>
<attribute name="icon">fa-check-circle</attribute>
</xpath> </xpath>
<!-- ('is_purchase_budget', '=', False)--> <!-- ('is_purchase_budget', '=', False)-->
<xpath expr="/form/header/button[@id='bid_confirm']" position="attributes"> <xpath expr="/form/header/button[@id='bid_confirm']" position="attributes">
@ -310,9 +313,9 @@
<field name="purpose" attrs="{'readonly': [('state','in',['done','cancel'])]}"/> <field name="purpose" attrs="{'readonly': [('state','in',['done','cancel'])]}"/>
</xpath> </xpath>
<xpath expr="//field[@name='order_line']" position="before"> <xpath expr="//field[@name='order_line']" position="before">
<button name="action_select_all" class="oe_highlight" type="object" <button name="action_select_all" class="btn-info" type="object"
attrs="{'invisible':[('state','in',('done','cancel','waiting', 'sign','purchase'))]}" attrs="{'invisible':[('state','in',('done','cancel','waiting', 'sign','purchase'))]}"
string="Choose All"/> string="Choose All" icon="fa-check-square"/>
</xpath> </xpath>
<xpath expr="//field[@name='order_line']/tree//field[@name='name']" position="after"> <xpath expr="//field[@name='order_line']/tree//field[@name='name']" position="after">
@ -381,18 +384,19 @@
<button type="object" groups="purchase_requisition_custom.group_accept_purchase_requisition" <button type="object" groups="purchase_requisition_custom.group_accept_purchase_requisition"
name="action_accept" string="Accept" name="action_accept" string="Accept"
attrs="{'invisible':['|',('state','!=','in_progress'),('type','!=','project')]}" attrs="{'invisible':['|',('state','!=','in_progress'),('type','!=','project')]}"
class="oe_highlight"/> class="btn-primary" icon="fa-check-circle"/>
<button type="object" groups="purchase_requisition_custom.group_quotation_purchase_requisition" <button type="object" groups="purchase_requisition_custom.group_quotation_purchase_requisition"
name="action_quotation" string="Quotation" name="action_quotation" string="Quotation"
attrs="{'invisible':['&amp;','|',('state','!=','accept'),('type','!=','project'),'|',('state','not in',('in_progress', 'ongoing','rejected_by_committee')),('type','!=','operational')]}" attrs="{'invisible':['&amp;','|',('state','!=','accept'),('type','!=','project'),'|',('state','not in',('in_progress', 'ongoing','rejected_by_committee')),('type','!=','operational')]}"
class="btn-primary"/> class="btn-primary"/>
<button type="object" groups="purchase.group_purchase_user" name="action_budget" <button type="object" groups="purchase.group_purchase_user" name="action_budget"
string="Send To Budget" attrs="{'invisible':['|', ('state','!=', 'purchase_manager'),('is_purchase_budget','=',False)]}" string="Send To Budget" attrs="{'invisible':['|', ('state','!=', 'purchase_manager'),('is_purchase_budget','=',False)]}"
class="btn-primary"/> class="btn-primary" icon="fa-send"/>
<button name="action_skip_purchase_budget" type="object" string="Skip Budget" <button name="action_skip_purchase_budget" type="object" string="Skip Budget"
attrs="{'invisible':['|', ('state','!=', 'purchase_manager'),('is_purchase_budget','=',False)]}" attrs="{'invisible':['|', ('state','!=', 'purchase_manager'),('is_purchase_budget','=',False)]}"
groups="purchase_requisition_custom.group_skip_purchase_budget"/> groups="purchase_requisition_custom.group_skip_purchase_budget"
class="btn-warning" icon="fa-forward"/>
<button type="object" groups="purchase_requisition_custom.group_approve_purchase_requisition" <button type="object" groups="purchase_requisition_custom.group_approve_purchase_requisition"
name="action_approve" string="Approve" states="checked" class="btn-primary"/> name="action_approve" string="Approve" states="checked" class="btn-primary"/>
@ -402,9 +406,9 @@
<button type="object" groups="purchase_requisition_custom.purchase_requisition_third_approve" <button type="object" groups="purchase_requisition_custom.purchase_requisition_third_approve"
name="third_approve" string="Approve" states="third_approve" class="btn-primary"/> name="third_approve" string="Approve" states="third_approve" class="btn-primary"/>
<button name="to_committee" class="oe_highlight" <button name="to_committee" class="btn-info"
attrs="{'invisible' : ['|','|',('order_count','=', 0),('purchase_commitee','=',False),'&amp;',('purchase_commitee','=',True),('sent_to_commitee','=', True)]}" attrs="{'invisible' : ['|','|',('order_count','=', 0),('purchase_commitee','=',False),'&amp;',('purchase_commitee','=',True),('sent_to_commitee','=', True)]}"
type="object" string="Send To Committee" type="object" string="Send To Committee" icon="fa-users"
groups="purchase_requisition_custom.purchase_rfq_send_to_committee"/> groups="purchase_requisition_custom.purchase_rfq_send_to_committee"/>
<field name="sent_to_commitee" invisible="1"/> <field name="sent_to_commitee" invisible="1"/>
@ -619,8 +623,8 @@
<field name="origin" invisible="1"/> <field name="origin" invisible="1"/>
<field name="reject_reason" required="1"/> <field name="reject_reason" required="1"/>
<footer> <footer>
<button name="action_reject" string="Confirm" type="object" class="oe_highlight"/> <button name="action_reject" string="Confirm" type="object" class="btn-danger" icon="fa-times-circle"/>
<button string="Cancel" class="btn btn-default" special="cancel"/> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times"/>
</footer> </footer>
</form> </form>
</field> </field>
@ -634,8 +638,8 @@
<field name="order_id" invisible="1"/> <field name="order_id" invisible="1"/>
<field name="select_reason" required="1"/> <field name="select_reason" required="1"/>
<footer> <footer>
<button name="action_select" string="Confirm" type="object" class="oe_highlight"/> <button name="action_select" string="Confirm" type="object" class="btn-primary" icon="fa-check-circle"/>
<button string="Cancel" class="btn btn-default" special="cancel"/> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times"/>
</footer> </footer>
</form> </form>
</field> </field>
@ -651,8 +655,8 @@
<field name="order_id" invisible="1"/> <field name="order_id" invisible="1"/>
<field name="refuse_reason" required="1"/> <field name="refuse_reason" required="1"/>
<footer> <footer>
<button name="action_refuse" string="Confirm" type="object" class="oe_highlight"/> <button name="action_refuse" string="Confirm" type="object" class="btn-danger" icon="fa-times-circle"/>
<button string="Cancel" class="btn btn-default" special="cancel"/> <button string="Cancel" class="btn-secondary" special="cancel" icon="fa-times"/>
</footer> </footer>
</form> </form>
</field> </field>

View File

@ -10,7 +10,7 @@
<field name="user_id" invisible="1"/> <field name="user_id" invisible="1"/>
<field name="reason"/> <field name="reason"/>
<footer> <footer>
<button string='Save' name="request_cancel_reason" type="object" class="oe_highlight"/> <button string='Save' name="request_cancel_reason" type="object" class="btn-primary" icon="fa-save"/>
<button string="Cancel" class="oe_link" special="cancel"/> <button string="Cancel" class="oe_link" special="cancel"/>
</footer> </footer>
</form> </form>

View File

@ -21,7 +21,7 @@
</group> </group>
<footer> <footer>
<button string='Save' name="action_create_contract" type="object" class="oe_highlight"/> <button string='Save' name="action_create_contract" type="object" class="btn-primary" icon="fa-save"/>
<button string="Cancel" class="oe_link" special="cancel"/> <button string="Cancel" class="oe_link" special="cancel"/>
</footer> </footer>
</form> </form>

View File

@ -7,7 +7,7 @@
<field name="inherit_id" ref="account.view_move_form"/> <field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//button[last()]" position="before"> <xpath expr="//button[last()]" position="before">
<button name="action_vendor_eval" type="object" string="Evaluate"/> <button name="action_vendor_eval" type="object" string="Evaluate" class="btn-info" icon="fa-star"/>
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@ -7,7 +7,7 @@
<field name="inherit_id" ref="purchase.purchase_order_form"/> <field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//button[@name='button_confirm']" position="before"> <xpath expr="//button[@name='button_confirm']" position="before">
<button name="action_vendor_eval" type="object" string="Evaluate" attrs="{'invisible':[('requisition_id','=',False)]}" /> <button name="action_vendor_eval" type="object" string="Evaluate" attrs="{'invisible':[('requisition_id','=',False)]}" class="btn-info" icon="fa-star" />
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@ -7,7 +7,7 @@
<field name="inherit_id" ref="stock.view_picking_form"/> <field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//button[@name='button_validate']" position="before"> <xpath expr="//button[@name='button_validate']" position="before">
<button name="action_vendor_eval" type="object" string="Evaluate"/> <button name="action_vendor_eval" type="object" string="Evaluate" class="btn-info" icon="fa-star"/>
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@ -165,7 +165,7 @@
</group> </group>
<footer> <footer>
<div> <div>
<button name="action_print" string="Print" type="object" default_focus="1" class="oe_highlight"/> <button name="action_print" string="Print" type="object" default_focus="1" class="btn-primary" icon="fa-print"/>
or or
<button string="Cancel" class="oe_link" special="cancel" /> <button string="Cancel" class="oe_link" special="cancel" />
</div> </div>