Skip to content

Laravel in Glasgow

Laravel development for Glasgow councils and housing associations

A Laravel development company for Glasgow local authorities and housing associations. Thirty years of records where the same person exists four times, and a case that stays open for years.

Glasgow's public service systems have a problem that commercial software rarely faces at the same severity: the data is older than every system that has ever held it.

A housing association's records go back decades, through two or three platform migrations, a merger, a reorganisation and a period when things were kept on paper. The same person appears several times under variations of their name, at addresses that have since been renumbered, with a tenancy that was transferred and a repair history attached to the wrong record. None of that is anybody's fault and all of it is now the application's problem.

Deciding that two Glasgow records are one person

This is the central task, and the instinct - find the duplicates and delete the extras - destroys exactly the history the organisation needs.

The arrangement that works introduces a person record that the existing records point at. Every tenancy, payment and repair stays attached to the record it was created against, so nothing in the past changes, while reports and screens resolve through to the person. A merge is then a statement rather than a deletion, and crucially it is reversible, because some merges are wrong and the discovery usually comes months later.

Matching itself should produce a score, not a verdict. An exact match on a strong identifier can be automatic. A near match on name, date of birth and address gets proposed to somebody who knows the tenants. Automatic merging at a confidence threshold sounds efficient and produces the single worst outcome in a housing system - two tenancies on one record, a rent account that cannot be reconciled, and a letter sent to the wrong person about an eviction.

A Glasgow case is measured in months

The second structural difference is lifespan. A repair, an application or a tenancy dispute can remain open for a year, and that changes what the data is for.

When a case lives a long time, its current status is the least informative thing about it. Every question that gets asked later is about elapsed time and sequence. How long before anybody attended. How many times was it reassigned. When was the tenant last contacted, and by whom. Was the delay ours or the contractor's.

A single status column answers none of those. A transitions table - from, to, when, who, why - answers all of them, with the current status derived from the most recent row rather than maintained separately where the two can disagree. It is slightly more work to write and it is the difference between a system that can account for itself and one that can only describe the present.

Laravel batch runs that affect real people

Rent charges, arrears calculations, notice generation - these run in bulk and their output goes to people in letters.

Two properties matter more here than in commercial batch work. It has to be possible to run the calculation without committing it, so somebody can look at the result before four thousand letters exist. And it has to be possible to say, for any one of those letters, which inputs produced it - which means the figures are stored with the run rather than recalculated when somebody queries it.

That is the same reasoning as everywhere else on this page: the system's job is not only to be right but to be able to show why. Being safe to run twice is part of it, because a charge applied twice is a complaint and a refund.

A Glasgow housing repair is an appointment and an obligation

A repair has two clocks running on it and they are not the same clock.

One is the appointment - a contractor arrives on Thursday afternoon. The other is the statutory obligation, which says a repair of this category is completed within a set number of working days or it is reportable. Systems that model only the appointment report cheerfully on attendance while quietly failing the obligation, because attendance is not completion.

The obligation clock also pauses, and the pause rules are where the modelling work is. No access on arrival pauses it. A part on order pauses it, if the policy says so. A tenant who cancels pauses it; a contractor who cancels does not. Each of those is a recorded event with a reason code, and the elapsed time is derived from the event sequence rather than stored as a number that somebody has to remember to update.

Getting that right has a consequence worth naming. Once elapsed time is derived, the question "how many repairs are currently out of target" has one answer that the system can compute, rather than four answers from four spreadsheets. That question is asked by a regulator, and the organisation either has one answer or it has a problem.

What a Glasgow committee needs out of the Laravel data

Reporting to a committee is not the same job as reporting to a manager, and the difference is that a committee report has to agree with the last one.

A live query does not do that. Run it again next quarter and the figure for last quarter has moved, because cases were reclassified, duplicates were merged, and a record was backdated. All of those changes are correct. The report is still wrong, because it now contradicts a document that was formally received.

So the figure is stored. A reporting period closes, the numbers for that period are computed once and written to their own table with the date and the code version that produced them, and the report is rendered from that table afterwards. A restatement is a new row that says what changed and why, not an overwrite.

This is unglamorous and it removes an entire category of argument. When somebody asks why the figure differs from the one in the minutes, the answer is a row with a reason on it rather than a developer re-running a query and hoping.

Commercially

Scope fixed in writing before work starts, priced per project. The country-level ground - UK data protection, procurement, invoicing in pounds - is on the United Kingdom market page.

Invoiced by Codefacture Yazılım A.Ş. in Türkiye, in pounds 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 Kingdom market page.

Frequently asked questions

The same tenant exists four times in our Glasgow system. How is that fixed?
Not by deleting three of them, which is the instinct and loses history. The approach that holds is a person record that the four source records point at, so each tenancy, repair and payment stays attached to the record it was created against while reports resolve through to the person. Merging is then a reversible statement that two records are the same, rather than a destructive edit - which matters, because some merges are wrong and somebody has to be able to undo one without reconstructing a decade of data.
What should matching be based on?
A score rather than a rule, with a human deciding the middle. Exact matches on a strong identifier are automatic; near matches on name, date of birth and address are proposed and confirmed. The thing to resist is a clever algorithm that merges automatically at a threshold, because the cost of a wrong merge in a housing system is two tenancies on one record and a rent account nobody can explain, and that is far worse than a queue of suggestions.
Our repairs cases stay open for months. Does that change the model?
It changes what the table is for. If a case lives for a year, its current status is the least interesting thing about it - what matters is the history, because every question asked later is about elapsed time. How long was this open before anybody attended, how many times was it reassigned, when was the tenant last contacted. That is a transitions table with a reason on each row, and a current status derived from it rather than stored alongside it.
Can you work with our existing housing management system?
Usually that is the only sensible option, and the integration shape matters more than the protocol. The housing system keeps ownership of tenancies and rent; the application owns the service it provides and references them. The decision to make explicitly is which system owns each field, because two systems both believing they own a tenancy end date produces a dispute that surfaces as a wrong letter to a tenant.
Call us+1 848 272 7583WhatsApp+90 850 308 5436Emailinfo@codefacture.comContact page