Skip to content

Laravel in Abu Dhabi

Laravel development for Abu Dhabi entities and energy groups

A Laravel development company for Abu Dhabi entities, energy groups and their integrators. The Arabic name as the legal one, submissions that need receipts, and certificates that expire.

An Abu Dhabi engagement is usually not a conversation with the end client. It is a contract with the integrator who holds that conversation, building a system an entity will keep for a decade.

The people paying are entities, utilities, energy groups and sovereign-backed companies. What they need from a backend is less about scale than about provability - the data has to be correct in Arabic, the integrations have to be able to show what they sent, and the system has to be maintainable by whoever is holding the contract in five years.

This is the schema decision that separates a system built for Abu Dhabi from one adapted to it.

The usual pattern, arriving from elsewhere, is a name column holding a Latin transliteration, with an Arabic field added afterwards as an optional extra. That has the relationship backwards. If the Arabic name is the legal one, it is the authoritative column - not nullable, not secondary - and the transliteration is the convenience field that may be absent.

Getting this the wrong way round produces two lasting problems. Reports and exports default to the transliteration, which is not the name on any document. And because the Arabic column was added later, it is frequently given the wrong collation, so sorting a list of names produces an order that looks arbitrary to anybody who reads Arabic. Both are migrations across every related table once there is data.

An Abu Dhabi submission is not done until the receipt is stored

Government platform integrations have a property that ordinary API work does not: somebody may later ask you to prove what you sent and when.

That rules out treating the HTTP response as the record. The pattern that holds is a submission row written before the call, a reference generated on our side so the platform can reject duplicates, and the platform's receipt stored as data the moment it arrives. Anything without a receipt is incomplete and retried; anything with one is never sent again.

The failure this prevents is the expensive one. A request that timed out after the platform accepted it, retried in good faith, becomes two filings and a phone call. Laravel's queue will retry by default, which makes being safe to run twice a requirement here rather than a nicety.

Certificates expire, and Laravel will not warn you

Integrations here are commonly authenticated with a client certificate rather than a token.

The code difference is small. The operational difference is that a date exists, somewhere, after which a working integration stops working, and that date is not in anybody's sprint. The systems that survive record the expiry as monitored data and support rotating the certificate without a deployment.

It belongs with the rest of the unglamorous operational surface - deploying and running Laravel yourself covers the shape of it, and in this market self-hosting inside approved infrastructure is usually the requirement rather than the choice.

An Abu Dhabi asset register has a hierarchy and a history

A plant is not a list of equipment. It is a hierarchy - a site, an area, a unit, a system, an item - and the tag number that identifies a piece of equipment describes its position in that hierarchy rather than the object itself.

Which produces the distinction that most registers get wrong. A tag is a functional location; the physical item installed there is a separate thing with its own serial number and its own history. A pump is removed for overhaul and a spare is installed in the same position. The functional location is unchanged, two physical assets have moved, and the maintenance history belongs partly to the position and partly to the item. A register with one record per pump cannot express that, and the consequence is a history that follows the wrong object.

Finance has its own view and it will not match. Their asset list is organised around capitalisation and depreciation, with items grouped and valued in ways that have nothing to do with where they are bolted down. Trying to make one table serve both produces something neither side trusts. Two registers with an explicit, maintained mapping between them is honest and workable.

Changes to the hierarchy are events worth keeping. Areas are reorganised, units are renumbered after a modification, and a report run against last year's structure has to still make sense. Effective-dated hierarchy, rather than a tree somebody edits, is what keeps a comparison across years meaningful.

Laravel work orders on an Abu Dhabi plant

Maintenance work is scheduled on two different clocks and a system that knows only one of them is wrong about half the plant.

Calendar-based is the easy clock - inspect this every six months. Usage-based is the one that needs data flowing in - service this after a number of running hours, cycles or tonnes. The second depends on readings that arrive from somewhere else, and the schedule is therefore derived rather than fixed, which means a due date that moves as usage accrues and a forecast that is an estimate until it is not.

Permits gate the work rather than describe it. A job cannot start until the permit to work is issued, the isolation is confirmed and the relevant people have signed, and that chain has to be modelled as a precondition the system enforces. A work order marked in progress against a permit that was never issued is the kind of record that matters during an investigation.

Shutdown windows are the planning constraint that shapes everything else. A large proportion of the work can only happen while a unit is down, the window is fixed months in advance, and the question the planner asks is which jobs fit in it. That is a scheduling problem over a bounded resource, and it needs the work orders to carry honest duration estimates and their dependencies on one another. Where it is left as a spreadsheet, the window closes with work undone - and the next window is a year away.

Commercially

Scope fixed in writing before work starts, priced per project. The country-level ground - the entity question, e-invoicing, free zone against mainland - is on the UAE market page, and the Arabic collation groundwork is set out on the Dubai page.

Invoiced by Codefacture Yazılım A.Ş. in Türkiye, in US dollars, by bank transfer, with no Turkish VAT under the export-of-services exemption.

The regulatory and commercial ground for this city is on the United Arab Emirates market page.

Frequently asked questions

Which name is authoritative, the Arabic or the English one?
In Abu Dhabi, usually the Arabic one, and the schema should say so. The common mistake is a `name` column holding a Latin transliteration with `name_ar` added later as an optional extra - which means the legal name is the nullable field and every report defaults to the transliteration. Inverting that is cheap at the start and a data migration across every related table afterwards. Collation matters too, because sorting Arabic names with the wrong collation produces an order that looks random to a reader.
We have to submit filings to a government platform. What usually goes wrong?
Treating the HTTP response as the record. A submission is complete when you hold a receipt identifying it, so the receipt is stored as a row before anything else is marked done, and a submission without one is retried rather than assumed. The second recurring problem is retrying a submission that actually succeeded, which creates a duplicate filing somebody has to withdraw - so the submission carries a reference you generate, and the platform's duplicate rejection becomes a safety net rather than a surprise.
The integration uses client certificates rather than an API key. Does that change the application?
It changes operations more than code. A certificate expires on a date, and the date is not in your release calendar, so an integration that worked for two years stops on a Thursday with an error nobody has seen before. What that needs is the expiry recorded somewhere that alerts before it matters, and a path to rotate the certificate without a deployment. Both are unremarkable and both get skipped.
We are the integrator. Can you build underneath us?
It is the usual arrangement here and it works, provided two things are settled in writing first - which side owns the end-client conversation, and what exactly gets handed over at the end. In this shape your team presents and maintains the result, so the architecture reasoning has to exist as documentation rather than as something we remember. We write it while the decisions are being taken, which is the only time it is accurate.
Call us+1 848 272 7583WhatsApp+90 850 308 5436Emailinfo@codefacture.comContact page