EFRIS Stock — register goods, declare every stock movement
Register every product with the URA under its commodity code (T130 goods upload), then declare each validated receipt to EFRIS as a stock-in (T131) and every loss as an adjustment. Your Odoo inventory and your URA server stock stay in step — so goods are registered and stocked before you ever invoice them. Built on the free EFRIS Base.
One-time purchase · unlimited documents · free updates on every URA EFRIS spec change. Requires the free EFRIS Base.
Your inventory, mirrored on the URA server
EFRIS wants goods registered before they can be invoiced, and product dealers holding stock on the URA server before they sell. Register each product once (T130), then validate receipts and record losses as usual — the app declares each receipt as a stock-in (T131) with its supplier, types every decrease with a URA reason code, and keeps your URA server stock matched to your books. Every call rides the free EFRIS Base queue and retries on its own.
Register before you sell
EFRIS will not accept an invoice for an unregistered good. One click uploads a product to the URA (T130) with its commodity category, unit of measure and excise flag — created the first time, updated after that.
Every receipt, a stock-in
Validate an incoming transfer and it is declared to EFRIS as a stock increase (T131) — Import or Local Purchase, with the supplier and TIN — so your URA server stock rises together with your books.
Losses, declared honestly
Expired, damaged, personal use or other — every stock decrease is declared as a T131 adjustment with the exact URA reason code, so shrinkage is accounted for instead of quietly vanishing.
Registration, stock-in, adjustments — every step covered
Every product carries its URA goods identity
Each product gains an EFRIS tab holding the three things URA insists on: the EFRIS Commodity Code (the 8-digit UNSPSC category), the EFRIS Goods Code and a Has Excise Duty flag. Leave the goods code blank and it falls back to the product’s internal reference, so most catalogues need no extra data entry at all. These are the exact values sent in the T130 goods upload — nothing is improvised at declaration time.
Register a good with URA in one click
Register with EFRIS uploads the product over the T130 goods interface — name, goods code, unit of measure, unit price, commodity category and excise flag. The app knows whether this is a first registration or an update and sends the correct operation type, so re-registering an amended product never creates a duplicate at URA. The action sits both on the EFRIS tab and as a shield stat button at the top of the product form.
You always know which goods URA has accepted
A goods status of To Register, Queued, Registered or Failed sits on the tab beside a Registered with EFRIS tick, so you never invoice a product URA does not yet know — EFRIS rejects invoices for unregistered goods. If URA refuses a registration, the rejection is written straight back onto the product in plain words. Registration is also blocked before it can fail: the app refuses if EFRIS is not configured, naming the missing fields, or if the commodity code is empty.
URA unit codes, mapped once and reused everywhere
Each Odoo Unit of Measure carries an EFRIS Unit Code — the URA measureUnit dictionary value such as UN, KG or LTR. Set it once on the unit and every goods registration, stock-in and adjustment picks it up automatically. Where a unit has no code mapped, the app falls back to UN rather than sending an empty value URA would reject.
Validate a receipt and URA sees the stock-in
On every incoming transfer you pick the EFRIS Stock-in Type — Local Purchase or Import — and the moment you validate, the receipt is declared to URA as a T131 stock increase. Each received line goes across with its quantity, unit code and cost, together with the supplier’s name and TIN taken straight from the contact. The date done becomes the stock-in date and the source document travels as the reference, so your URA server stock rises in step with your books.
Only receipts — and never a blocked validation
Only incoming operations are declared: internal transfers, deliveries and returns are left alone, and the EFRIS fields appear on receipts only. Lines that were not actually received are skipped, and a receipt with nothing to send is marked Not Declared rather than posted to URA empty. If EFRIS is unconfigured or unreachable the validation still completes — the declaration is simply parked with a clear status — so your warehouse never stops because URA is busy. A Declare stock-in to EFRIS button re-sends any receipt still outstanding.
Declare a loss with the exact URA reason code
Every decrease outside a sale is recorded on an EFRIS Stock Adjustment, auto-numbered EFRIS-ADJ/00001, with the product, the quantity and the URA reason: Expired Goods, Damaged Goods, Personal Use or Others. Choose Others and the app forces a remark before it will send, exactly as URA requires, so no write-off is left unexplained. Declare to EFRIS sends it as a T131 decrease and the status bar walks the record Draft → Queued → Declared, with every change tracked in the chatter.
A standing audit trail of every write-off
The EFRIS Stock Adjustments list shows the reference, product, quantity, reason and date of every decrease, with the state colour-coded — green once URA has accepted it, red when it needs attention. Any URA rejection is stored on the record and shown on the form, ready to correct and resend. It lives under the EFRIS menu and is the document you open the day an inspector asks how a stock difference was explained.
Nothing sent by hand, nothing lost
Goods registrations (T130) and stock movements (T131) never block the person doing the work — they are registered on the shared EFRIS queue and sent in the background. The queue shows the interface code, the source document, the FDN returned by URA, the attempt count, the next attempt time, the state badge and the failure reason, with a Send now action on every row. Re-declaring a document reuses its pending entry instead of stacking duplicates, and entries go out in sequence so URA receives them in the order it expects.
URA’s crypto envelope, handled for you
Every T130 and T131 call is wrapped in URA’s exact cloud envelope: the JSON payload is AES-encrypted, base64-encoded and RSA-signed with your device key before it is posted to the EFRIS gateway. When URA answers code 402 — session key expired — the app quietly fetches a fresh session key and resends the same declaration, and the key is refreshed on its own once it is a day old. You never see any of this; you only see the attempt succeed in the queue.
Rising back-off, and a queue that repairs itself
A failed declaration is never dropped. It is retried on a rising back-off — a minute, then two, five, ten, twenty, thirty, up to an hour — while a scheduled sweep collects everything that has come due. An entry left stuck mid-send for fifteen minutes is recovered automatically and put back into the retry cycle. And when transmission is paused, stock declarations simply hold in the queue and go out in order the moment you resume — handy while you are still testing on the URA sandbox.
Who may declare, and who may delete
The app plugs straight into the three EFRIS roles supplied by the free Base — User, Manager and Administrator. An EFRIS User can raise and declare stock adjustments but cannot delete them; only an EFRIS Manager can, so a declared write-off cannot quietly vanish from the audit trail. The Stock Adjustments menu is visible only to users holding an EFRIS role.
We connect you to URA EFRIS
Buying the app includes the setup: we help you register your device on the URA EFRIS portal, initialize the secure keys with URA over the cloud API, validate the full flow on the EFRIS sandbox, then switch you to production.
Device on the URA EFRIS portal
TIN, TaxpayerID, device, tax categories
Full flow on the EFRIS sandbox
Switch to production, declare for real
One suite, sold your way
Buy only what you need on the free Base, or take the all-in-one Suite.
Frequently asked
Does it need the EFRIS Base?
Yes — the free EFRIS Base holds your URA credentials and device keys and runs the encrypted submission queue this app declares through. Install the Base first, then add EFRIS Stock.
Must goods be registered before I stock or sell them?
Yes — the URA requires it. Register each product with EFRIS (T130) first; stock-in movements and invoices reference that registered goods code, and EFRIS rejects movements for goods it does not yet know.
Any limits or subscription?
None. A one-time purchase, unlimited products and movements, and free updates on every URA EFRIS specification change.
Ready for URA EFRIS compliance?
Install now, or write to us — we set up your EFRIS connection with you.
reach@aminitechsolutions.comURA EFRIS stock connector for Odoo · Uganda · T130 goods upload · T131 stock maintain
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Inventory (stock)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 1049 |
| Technical Name |
aminitech_efris_stock |
| License | OPL-1 |
| Website | https://www.aminitechsolutions.com |
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