Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions .github/workflows/code-quality-oca-pre-commit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ on:
branches:
- "18.0"
- "19.0"
types:
- opened
- synchronize
- reopened
- labeled
- unlabeled

jobs:
pre-commit:
Expand All @@ -21,3 +27,106 @@ jobs:
python-version: '3.11'
- uses: pre-commit/action@v3.0.1

- name: Resolve Odoo version and target branch
env:
GH_TOKEN: ${{ secrets.GLOBAL_GITHUB_TOKEN }}
run: |
VERSION="18.0"
DOCKER_ODOO_REF="main"
VERSION_REF="${{ github.base_ref || github.ref_name }}"
ROUTING_REF="${{ github.head_ref || github.ref_name }}"
if [[ "$VERSION_REF" == *"19.0"* ]]; then
VERSION="19.0"
fi
if [[ "$ROUTING_REF" == *"test-pos-assets-setup"* ]]; then
DOCKER_ODOO_REF="scaffold-pos-tests"
fi

if [[ "${{ github.event_name }}" == "pull_request" ]]; then
mapfile -t DOCKER_ODOO_REFS < <(
jq -r '
[.pull_request.labels[].name
| select(startswith("docker-odoo-ref:"))
| sub("^docker-odoo-ref:"; "")]
| unique[]
' "$GITHUB_EVENT_PATH"
)

if (( ${#DOCKER_ODOO_REFS[@]} > 1 )); then
echo "Only one docker-odoo-ref:<branch> label is allowed per PR."
exit 1
fi

if (( ${#DOCKER_ODOO_REFS[@]} == 1 )); then
REQUESTED_REF="${DOCKER_ODOO_REFS[0]}"
if [[ ! "$REQUESTED_REF" =~ ^[A-Za-z0-9][A-Za-z0-9._/-]*$ ]] || [[ "$REQUESTED_REF" == *..* ]]; then
echo "Invalid docker-odoo branch in label: $REQUESTED_REF"
exit 1
fi
if ! git ls-remote --exit-code --heads \
"https://x-access-token:${GH_TOKEN}@github.com/MultiSafepay/docker-odoo.git" \
"refs/heads/$REQUESTED_REF" >/dev/null; then
echo "docker-odoo branch does not exist: $REQUESTED_REF"
exit 1
fi
DOCKER_ODOO_REF="$REQUESTED_REF"
fi
fi

echo "ODOO_VERSION=$VERSION" >> $GITHUB_ENV
echo "DOCKER_ODOO_REF=$DOCKER_ODOO_REF" >> $GITHUB_ENV

- name: Trigger docker-odoo integration tests and wait
if: github.repository == 'MultiSafepay/odoo-internal'
env:
GH_TOKEN: ${{ secrets.GLOBAL_GITHUB_TOKEN }}
run: |
# Trigger workflow_dispatch
gh workflow run multisafepay-ci.yml \
--repo MultiSafepay/docker-odoo \
--ref "${{ env.DOCKER_ODOO_REF }}" \
-f commit_sha="${{ github.sha }}" \
-f odoo_version="${{ env.ODOO_VERSION }}"

# Wait 10 seconds for GitHub API to register the new run
echo "Giving GitHub API 10 seconds to spin up the run..."
sleep 10

# Get the database ID of the run we just started
RUN_ID=$(gh run list \
--repo MultiSafepay/docker-odoo \
--workflow multisafepay-ci.yml \
--branch "${{ env.DOCKER_ODOO_REF }}" \
--limit 1 \
--json databaseId \
--jq '.[0].databaseId')

if [ -z "$RUN_ID" ]; then
echo "Error: Could not find triggered workflow run in docker-odoo"
exit 1
fi

echo "Triggered workflow run database ID: $RUN_ID"
echo "Waiting for run to finish..."

# Poll status of the run every 15 seconds
while true; do
STATUS_JSON=$(gh run view "$RUN_ID" --repo MultiSafepay/docker-odoo --json status,conclusion)
STATUS=$(echo "$STATUS_JSON" | jq -r '.status')
CONCLUSION=$(echo "$STATUS_JSON" | jq -r '.conclusion')

echo "Current status: $STATUS, conclusion: $CONCLUSION"

if [ "$STATUS" = "completed" ]; then
if [ "$CONCLUSION" = "success" ]; then
echo "Integration tests passed successfully!"
exit 0
else
echo "Integration tests failed with conclusion: $CONCLUSION"
exit 1
fi
fi

sleep 15
done

14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,20 @@ with [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [18.0.2.5.0] - 2026-08-05

### Added
- ODOO-177: Add MultiSafepay Cloud POS module

### Changed
- ODOO-279: Remove obsolete Cloud POS payment view cleanup
- ODOO-281: Document Cloud POS transaction tracking and review details
- ODOO-288: Integrate the blocking docker-odoo CI dispatcher
- ODOO-297: Run integration tests only on odoo-internal repository

### Fixed
- ODOO-275: Remove obsolete Site API Key references from Cloud POS documentation and code comments

## [18.0.2.4.0] - 2026-07-24

### Added
Expand Down
2 changes: 1 addition & 1 deletion payment_multisafepay/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"website": "https://www.multisafepay.com/",
"license": "AGPL-3",
"category": "Accounting/Payment Providers",
"version": "18.0.2.4.0",
"version": "18.0.2.5.0",
"application": True,
"post_init_hook": "post_init_hook",
"uninstall_hook": "uninstall_hook",
Expand Down
2 changes: 1 addition & 1 deletion payment_multisafepay/controllers/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -972,7 +972,7 @@ def _get_order(self, url, payment_transaction) -> Order:
# Create a Plugin object with the necessary details
plugin = (
Plugin(**{})
.add_plugin_version("2.4.0")
.add_plugin_version("2.5.0")
.add_shop("Odoo")
.add_shop_version("18.0")
.add_shop_root_url(url)
Expand Down
2 changes: 1 addition & 1 deletion payment_multisafepay_enhanced/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"website": "https://www.multisafepay.com/",
"license": "AGPL-3",
"category": "Sales",
"version": "18.0.2.4.0",
"version": "18.0.2.5.0",
"application": True,
"depends": [
"payment_multisafepay",
Expand Down
16 changes: 11 additions & 5 deletions pos_multisafepay_cloud/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ It lets Odoo create Cloud POS orders, track terminal status, process
webhook or event-stream confirmations, and handle POS-side reversals and
refunds through the backend MultiSafepay API.

Each Cloud POS request creates a local tracking record with the remote
transaction identifier, the latest MultiSafepay status, and the related
refund or reversal details. This makes terminal activity auditable from
the POS order and lets later status checks reconcile Odoo with the
MultiSafepay order state.

The addon is intentionally independent from ``pos_multisafepay`` and
keeps that addon as a reference only.

Expand Down Expand Up @@ -59,7 +65,6 @@ Configuration
- **MSP Cloud Terminal ID**
- **MSP Cloud Terminal Group ID**
- **MSP Cloud Terminal Group API Key**
- **MSP Cloud Site API Key**
- **MSP Cloud Environment**

Usage
Expand All @@ -72,10 +77,11 @@ Usage
POS.
4. Complete, cancel, reverse, or refund the payment from the POS flow.

Real status polling and completed payment refunds require the Site API
Key. Without that key, the module can still create terminal orders with
the terminal group credentials, but account-level status and refund
calls are not available.
Transaction status is synchronized from MultiSafepay through polling and
notifications. The local Cloud POS tracker stores the remote transaction
ID and the latest response payload, so operators can review completed,
cancelled, refunded, and partially refunded terminal payments from the
related POS order.

Known issues / Roadmap
======================
Expand Down
3 changes: 1 addition & 2 deletions pos_multisafepay_cloud/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"website": "https://www.multisafepay.com/",
"license": "AGPL-3",
"category": "Point of Sale",
"version": "18.0.2.4.0",
"version": "18.0.2.5.0",
"application": True,
"depends": [
"point_of_sale",
Expand All @@ -14,7 +14,6 @@
"data": [
"security/ir.model.access.csv",
"views/pos_payment_method_views.xml",
"views/pos_multisafepay_cloud_payment_views.xml",
],
"assets": {
"point_of_sale._assets_pos": [
Expand Down
Loading
Loading