DE Kashier Integration
by Digital Economics LLC. https://de.com.eg , Eng. Ahmed Nasreldin https://de.com.eg$ 199.00
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Payroll (hr_payroll)
• eCommerce (website_sale) • Invoicing (account) • Discuss (mail) • Employees (hr) • Employee Contracts (hr_contract) • Website (website) |
| Lines of code | 3754 |
| Technical Name |
de_kashier_integration |
| License | OPL-1 |
| Website | https://de.com.eg |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Payroll (hr_payroll)
• eCommerce (website_sale) • Invoicing (account) • Discuss (mail) • Employees (hr) • Employee Contracts (hr_contract) • Website (website) |
| Lines of code | 3754 |
| Technical Name |
de_kashier_integration |
| License | OPL-1 |
| Website | https://de.com.eg |
DE Kashier Integration
تكامل كاشير من DE
End-to-end Kashier integration for Odoo 18 — customer checkout, one-click invoice payment links, AND outbound ACH payouts for vendor bills and employee payslips.
HPP Checkout
Invoice Payment Links
Vendor Payouts
Salary Payouts
The Problem We Solve
Without This Solution
- Customers can't pay Egyptian invoices directly from Odoo — you fall back to bank transfer or manual reconciliation.
- Sending a payment link means logging into a separate Kashier dashboard and copy-pasting the URL.
- Paying suppliers means exporting an Excel sheet and re-keying it into Banque Misr's portal.
- Salary disbursement is a manual export-and-upload every month.
With Digital Economics Solution
- Kashier appears as a native Odoo payment provider in eCommerce, portal, and POS-style flows.
- One-click "Send Kashier Link" on any customer invoice — email and SMS in the same dialog.
- "Pay via Kashier (ACH)" on the vendor payment posts a signed Banque Misr transaction.
- "Pay Salary via Kashier" on the payslip routes the net wage to the employee's bank account.
Key Features
HPP Checkout (HMAC-SHA256 signed)
Hosted Payment Page redirect with cryptographically signed order_hash, exactly per Kashier's published NodeJS reference. Both sandbox and production switch via the mode param.
Two-key signature verification
Browser callback signed with Payment API Key, server webhook signed with iFrame Secret. Same canonical 10-field concat. Constant-time HMAC compare to prevent timing attacks.
Customer invoice payment links
Generate a Kashier paymentRequest directly from any posted customer invoice; share by email and/or SMS through Kashier's sendInvoiceBy endpoint; cancel from the same record.
Vendor & salary ACH payouts
Build, RSA-PKCS1-SHA256 sign, and POST a Banque Misr Corpay transaction directly from account.payment or hr.payslip. Idempotent on MessageId; rejected payouts capture the bank's response for reconciliation.
Segregation of duties (SOD)
Two-step workflow: payroll / AP user Requests → accountant Approves & Releases. Approver must differ from requester (admin included). Amount + SHA-256 payload hash frozen at request; any drift between request and approval blocks the release.
Partner-balance verification
Sums the partner's posted, unreconciled payable balance (multi-currency aware — converts per-line at today's rate) and blocks release when the payout exceeds what we actually owe. Payslip release additionally requires the payroll journal entry to be posted.
Fee schedule + bank journal
Configurable per-transaction fee MIN(MAX(amount×pct%, min), max)×(1+VAT%). On release, posts one consolidated statement line for net + fees to the configured journal; the underlying move splits suspense (net, for reconciliation) and the fee expense account automatically.
Accountant inbox + multi-company
Accounting → Vendors → Kashier Payouts — Payslip and Vendor payout lists pre-filtered to Pending Approval, with inline Approve / Reject, group-by company / state / requester, and totals for net, fees and bank debit. Provider, journal and accounts are pinned per-company.
Refund & void
Standard Odoo refund flow wired to Kashier's FEP orders endpoint. Both sandbox and production hosts honoured.
Bilingual UI
Full English + Arabic (ar_001) translations included. RTL layout works out of the box.
Frequently Asked Questions
cryptography for the RSA signing. Already in the standard Odoo runtime image; pip install cryptography if running a stripped-down container.Why Digital Economics?
Your All-in-One Smart ERP Partner
Gold Partner
Certified Odoo Gold Partner in Egypt
60+ Projects
Successful international implementations
93% Retention
Clients stay for 5+ years
11 Countries
Global operations
Release Information
| Version | 18.0.7.10.0 |
| Release Date | May 2026 |
| Price | $199.00 USD |
| License | OPL-1 |
| Author | Digital Economics LLC. |
| Odoo Version | 18.0 (Community & Enterprise) |
| Dependencies | payment, account_payment, sale, website_sale, hr_payroll |
Changelog v18.0.7.10.0
- Accounting managers (
account.group_account_manager) can now reset payouts from sent / confirmed states — line accountants still blocked - New "Force Reset (Manager)" button surfaces the path with an extra-loud confirm prompt; the standard "Set to Draft" / "Reset to Draft" also routes there when the user is a manager
- Original merchantTransferId + transferId are logged to the chatter BEFORE the clear, so the audit trail survives the reset
- Chatter line for force-reset is tagged with a warning icon and reminds the operator to verify Kashier-side status before re-requesting (double-charge risk if the original transfer is still active)
Changelog v18.0.7.9.0
- New "Sync Status from Kashier" button on payslip / vendor-payment forms — visible while state is sent or confirmed; pulls the latest status from
GET /v2/transfers/{id}(or paginated list when only the merchantTransferId is known) and updates local state + transferId - Duplicated-merchantTransferId recovery (from v18.0.7.8.0) now auto-syncs the status right after the recovery write — the record lands in the actual Kashier-reported state (sent / confirmed / rejected), not just the default sent
- Status mapping reuses the existing
const.PAYOUT_STATUS_MAPPING: INITIATED/PROCESSING/PENDING → sent; COMPLETED/SUCCESS/SETTLED → confirmed; FAILED/EXPIRED/CANCELLED → rejected - All API calls non-blocking — network / decode failures leave state untouched and never break the workflow
Changelog v18.0.7.8.0
- Recovery path for "Merchant transfer id is duplicated" 400 from Kashier — when the gateway reports a duplicate, recover the record to sent instead of rejecting; the transfer is already on the gateway from a prior attempt whose Odoo transaction rolled back
- Statement-line creation is skipped on the recovery path so the bank journal doesn't double-book
- Chatter post on successful release wrapped in
try/except— a future bug there can no longer roll back the state write or the statement line (which was the root cause of the duplicated-id situation in the first place)
Changelog v18.0.7.7.0
- Fix KeyError on release chatter: the v18.0.3.0.0 channel migration renamed the body keys from
MessageId/TransactionIdtomerchantTransferId/transferId, but the chattermessage_poststill referenced the old keys — raised on every successful release after a Kashier 200 - Chatter now reads
body.get('merchantTransferId')+ the Kashier-returnedtransfer_id, with the persisted fields as fallbacks
Changelog v18.0.7.6.0
kashier_bank_codehelp text expanded with the curated list of Egyptian bank codes extracted from a live 400 response (ADIB, AUB, ABK, ABRK, AAIB, ARAB, ABC, ARIB, AIB, AUDI, BOA, BDC, MISR, BLOM, CITI, CIB, CAE, POST, EALB, EGB, ENBD, EDBE, FAIB, …) and per-method guidance (bank / wallet / instant wallet / card)- Same field doubles as the wallet-operator code when the payout method is
walletorinstant wallet— merchants create oneres.bankrecord per operator (Vodafone Cash, Orange Money, etc.) and set its code from the Kashier dashboard - UserError on missing code rewritten to read "bank / wallet operator", with method-specific examples
Changelog v18.0.7.5.0
- New
kashier_bank_codefield onres.bank— merchants set the Kashier-specific code (CIB, MISR, ADIB, BOA, CITI…) once per institution, every employee / vendor banked there gets the rightrecipientBankin the payout body - Build_body now reads
bank_id.kashier_bank_codeinstead of BIC / bank name — fixes 400 from/v3/transfers/single - Clear
UserErrorwhen the code is missing, pointing the user at Contacts → Banks to set it - Field surfaced on the standard
res.bankform right after the BIC
Changelog v18.0.7.4.0
- Custom "Reset to Draft" Kashier button removed — the standard Odoo Set to Draft (payslip) / Reset to Draft (payment) button now also clears the Kashier payout
action_payslip_draftandaccount.payment.action_draftare overridden to callaction_kashier_reset_payoutfirst when the payout state requires it- One UI affordance, full coverage: from pending_approval or rejected the override withdraws / resets; from sent / confirmed it blocks the draft transition with a clear error ("payout already with the gateway")
- SOD + manager bypass continue to apply through the wrapped server call
Changelog v18.0.7.3.0
- SOD bypass for accounting managers (
account.group_account_manager) — they can approve / reject / reset their own requests without going through a second pair of eyes - Regular accountants and payroll users still enforce requester ≠ approver as before
- New
_kashier_payout_can_bypass_sod()helper centralizes the rule; applied in approve, reject, withdraw and reset paths - Unified chatter wording for reset-to-draft (drops the separate "withdrawn" vs "reset" variants — the action's effect is identical either way)
Changelog v18.0.7.2.0
- Payslip payout amount now sourced from the partner's outstanding payable balance — not the NET line — so prior advances / partial reconciliations are reflected automatically
- New editable field
kashier_payout_amount_to_release— defaults to the partner balance, specialist can override before clicking Request to settle a partial amount - Field is locked once the workflow leaves draft so the snapshot the accountant approved can't drift
- Withdraw + Reset to Draft unified into a single "Reset to Draft" button — auto-withdraws any pending request and clears all in-flight ids (so the next Request mints a fresh transfer)
- Balance compute and the warning split into separate methods to break the circular dependency the new editable field introduced
- New
_kashier_payable_balancehelper shared between the compute and the amount default — multi-currency aware via the existing per-line FX logic
Changelog v18.0.7.1.0
- Specialists can now Withdraw Request on a payout in Pending Approval — gated to the original requester (or admin) via the new computed
kashier_payout_can_withdrawflag - Reset / withdraw clears all in-flight identifiers:
kashier_payout_message_id,kashier_payout_transaction_id,kashier_payout_currency_id,kashier_gateway_fee_amount,kashier_gateway_fee_total,kashier_gateway_fee_response(previously left in place). The next "Request Payout" click mints a freshmerchantTransferIdso Kashier sees a brand-new transfer, not a retry - Sent / confirmed payouts still refuse reset — they're already with the gateway and must be handled through Kashier
- Distinct chatter wording for the two paths ("request withdrawn" vs "reset to draft")
Changelog v18.0.7.0.0
- Consolidation release: promotes the v18.0.6.x portal-payment work to a minor-version checkpoint for publication
- No functional change vs v18.0.6.1.0
Changelog v18.0.6.1.0
- Portal customers can now click "Pay via Kashier" directly on their
/my/invoices/<id>page — generates the Kashier paymentRequest if absent (idempotent) and redirects straight to Kashier's hosted checkout - Once generated, the portal page also exposes an "Open Kashier checkout" button + a copyable share URL so the customer can forward the link to whoever's actually paying
- Access gated by Odoo's standard
access_tokenportal pattern with constant-time compare; an authenticated user with read rights on the invoice also passes - No new model fields — reuses the existing
kashier_invoice_id/kashier_payment_linkstored onaccount.move
Changelog v18.0.6.0.0
- Consolidation release: the installments feature suite (calculator, inline checkout picker, portal-invoice embed) is now stable as a unit
- Includes everything from v18.0.5.0.0 → v18.0.5.2.0; no functional change vs v18.0.5.2.0 — promoted to a minor-version checkpoint for publication
Changelog v18.0.5.2.0
- Installments calculator embedded directly on portal invoice pages — customers see plans for the invoice's residual balance without leaving the portal
- Iframe is gated on (a) an active Kashier provider with installments enabled, AND (b) a non-zero
amount_residual— portals without the feature see no change - "Open full calculator in a new tab" link beneath the iframe for environments where iframes are restricted
Changelog v18.0.5.1.0
- Inline installments picker injected into the checkout flow — customer picks a bank + tenor, or clicks "Pay in full", before being forwarded to Kashier's HPP
- When
kashier_allow_installmentsis on, the HPP redirect form'sactiontargets/payment/kashier/installments/checkoutfirst; the picker re-emits every HPP param verbatim (hashnever re-signed) plus optionalinstallmentFiId+installmentTenor - Reuses the JSON proxy endpoints from v18.0.5.0.0 so the picker shows the same per-bank plans as the standalone calculator page
Changelog v18.0.5.0.0
- New consumer-facing installments calculator at
/payment/kashier/installments— pick amount + currency, browse banks, view per-bank monthly plans - Public JSON proxy endpoints (
/payment/kashier/installments/banksand/payment/kashier/installments/plans) hide the merchant ID server-side and dodge the CORS issue customers' browsers would hit talking to Kashier directly - Provider toggle
kashier_allow_installments— off by default; turning it on appendsinstallmentsto the HPPallowedMethodsso Kashier shows its own picker too - Defensive JS parses several possible Kashier response shapes (
data,body,banks,plans, root-level array) so a future field rename doesn't break the page - Friendly fallback page (
installments_unavailable) when the feature isn't configured for the active provider
Changelog v18.0.4.1.0
- New "Push Webhook URL to Kashier" button on the provider record — sets the gateway's
webhookUrlto this Odoo instance's/payment/kashier/webhookendpoint without leaving the form - Hits
PUT /merchant?action=webhook&operation=updatemerchantuser&merchantId=<mid>with{MID, webhookUrl}per the test postman's "Merchant Webhook" entry - Confirmation prompt before overwriting whatever's currently set in the Kashier dashboard
- Useful when staging rebuilds change the public hostname, or when on-boarding a new environment without copy-pasting through the Kashier UI
Changelog v18.0.4.0.0
- New "Mark Kashier Link Paid" button + wizard on customer invoices — pushes
paymentStatus: paidto the gateway after an offline collection (cash, bank transfer, cheque) - Wizard captures payment date / channel / reference for the audit chatter (Kashier only receives the status flip)
- Gated by
account.group_account_invoice; hidden when the link is already paid, cancelled, or the invoice isn't posted - Hits
PUT /paymentRequest/{mid}/{id}?operation=editwith{operation:changestatus, paymentType:professional, paymentStatus:paid}per the updated test postman
Changelog v18.0.3.2.0
- Refund body fixes per updated test postman: nest
amountintransaction, sendreasonandtargetTransactionId - Refund auth now uses
kashier_payout_secret_key(FEP host uses the payout secret) with the Payment API Key as fallback - New field
kashier_transaction_idonpayment.transactioncaptures theTX-XXXcapture id from Kashier's callback — required for refund/void targeting
Changelog v18.0.3.1.0
- Auto-call Kashier's
POST /v2/transfers/fee-inquiryat request time and store the gateway's authoritative fee on the record - New fields:
kashier_gateway_fee_amount,kashier_gateway_fee_total,kashier_gateway_fee_response - Computed warning (
kashier_fee_mismatch_warning) when the local schedule and Kashier's quote differ by more than five rounding units - Bank-statement posting now uses the gateway figure when available (matches what Kashier will actually deduct), falling back to the local schedule when the inquiry fails
- "Refresh Gateway Fee" button on the form for manual re-quote between request and approve
- Tree views surface both local and gateway fees side-by-side; gateway is the default "show" column
- Fee inquiry is non-blocking: network / decode failures only suppress the gateway column, never block the workflow
Changelog v18.0.3.0.0
- Switched the payout channel from direct Banque Misr Corpay to Kashier's managed Payout API per developers.kashier.io/payout/payout
- New endpoint
POST {fep-host}/v3/transfers/singlewith bearer auth (Authorization: secretKey) — no RSA signing, no ISO 20022 body - Six-field flat body:
amount,method,recipientName,merchantTransferId,recipientBank,recipientNumber - Supports all four Kashier rails:
card,wallet,bank,instant wallet(default per-provider, override per-record) - New provider fields:
Payout Secret Key,Default Payout Method - Status mapping: Kashier's
INITIATED→ Sent;COMPLETED→ Confirmed;FAILED/EXPIRED/CANCELLED→ Rejected - Legacy Banque Misr Corpay fields retained on the provider record (read-only "deprecated" section) so existing data isn't lost on upgrade
- SOD workflow, multi-currency partner-balance check, fee schedule, dedicated bank-statement posting and accountant inbox — all unchanged and compatible with the new channel
Changelog v18.0.2.1.0
- Fix cancel-invoice REST call (use
operation=editwithchangestatusbody per Kashier's live postman) - Fix payment-link share payload (
subDomainUrl/urlIdentifier/customerName/storeName/customerEmail|customerPhoneNumber/languagewith bodyoperationselecting the channel) - Fix refund payload to nest
amountundertransactionas the FEP endpoint expects - Centralize
fep.kashier.io/test-fep.kashier.iohosts inconst.py
Changelog v18.0.2.0.0
- Two-step payroll → accountant approval workflow with server-side SOD enforcement
- Frozen amount snapshot + SHA-256 payload hash — the accountant approves the exact transaction prepared
- Multi-currency partner-balance verification (per-line FX at today's rate) before release
- Payslip release blocked while the payroll journal entry isn't posted
- Per-transaction fee schedule on the provider (
MIN/MAX/VATclamps configurable) - Consolidated bank-statement posting of
net + feeswith auto-split into suspense and fee-expense accounts - Dedicated Accounting → Vendors → Kashier Payouts inbox with inline Approve / Reject
- Multi-company hardening: provider / journal / balance pinned to the record's company; cross-company users blocked from approving
Changelog v18.0.1.0.0
- Initial release for Odoo 18.0
- Kashier HPP redirect flow with HMAC-SHA256 order_hash
- Two-key callback verification (browser & webhook)
- Customer invoice payment-link generator + email/SMS sharer
- Banque Misr ACH payouts for vendor bills + payslips
- Full English + Arabic translations
Digital Economics LLC.
Unlock Your Business Growth Potential
Contact Information
| Website | de.com.eg |
| support@de.com.eg | |
| wa.me/201509061111 | wa.me/201509071111 | |
| Support Portal | de.com.eg/helpdesk/customer-care-1/knowledgebase |
Digital Economics
Unlock Your Business Growth Potential
Copyright 2025 Digital Economics LLC. All rights reserved.
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module