= 1.37.39 =
* En kreditnota er ikke en faktura, der venter paa penge. Fakturalisten talte
  kreditnotaerne med blandt de sendte: tre af dem fik "Sendt" til at staa paa
  fem, mens to fakturaer faktisk var ude. En krediteret faktura havde laenge
  haft sin egen rubrik, men selve kreditnotaen faldt igennem til sin
  almindelige status - og en kreditnota er "sendt" som ethvert andet dokument.
  Den har nu sin egen taelling, saa fliserne stadig svarer til raekkerne i
  listen. Beloebene var rigtige i forvejen; de modregnede parret.

= 1.37.37 =
* Ny status **Ikke relevant**. Manden der troede vi var kommunen, henvendelsen
  fra den anden ende af landet, leverandoeren der ringede paa salgsnummeret -
  de skal modtages og besvares som alt andet, men at arkivere dem som "Tabt"
  siger, at vi bod paa arbejdet og tabte. Det traekker vindprocenten ned for
  arbejde, ingen nogensinde har haft. Den nye status lukker henvendelsen -
  ingen opfoelgning, ikke "aaben" - og holdes ude af salgstallene.
* Henvendelser taget af en maskine taeller foerst med, naar et menneske har
  set paa dem. En AI-telefonbesked er et gaet paa hvad opkaldet handlede om,
  og et gaet hoerer ikke hjemme i en konverteringsrate. Den staar ude af
  salgstallene saa laenge status er "Ny", og taeller fra det oejeblik nogen
  giver den en rigtig status - i den uge opkaldet kom, for det var da
  telefonen ringede.
* Og den mekanisme virkede slet ikke foer. Lead to Cash har haft filteret
  nimble_ltc_non_sales_mediums siden tidligere, og telefonsvareren meldte sig
  korrekt til det - men mediet gemmes gennem sanitize_key(), saa
  "AI-telefonsvarer · ikke-salg" bliver til ai-telefonsvarerikke-salg.
  Filteret sammenlignede den uberoerte tekst med den gemte, de moedte aldrig
  hinanden, og alt det der skulle holdes ude blev talt med. Medierne
  sammenlignes nu efter samme normalisering.

= 1.37.36 =
* Mærkater som "E-mail" bryder ikke laengere midt over. Bindestregen var et
  lovligt sted at bryde, saa en smal kolonne delte pillen i "E-" og "mail".
* Hjaelpeteksten under Betalingsoplysninger stod paa engelsk i en dansk
  graenseflade. Den er nu i oversaettelseskataloget som alle de andre.

= 1.37.35 =
* Etiketten for skatte-id laeses fra den oekonomiske profil, ikke fra
  sprogvalget. Vaerdien ligger under config.economic; laest fra toppen, som
  foerste forsoeg gjorde, faldt den tavst tilbage paa sproget - hvilket saa
  rigtigt ud i begge de oplagte tilfaelde og ville have vaeret forkert i
  ethvert blandet.
* Annullér i bekraeftelsesdialogen er daempet. Alle knapper i appen baerer
  samme blaa gradient, saa den sikre udvej laeste som hovedhandlingen.
* Badgen ved Fakturaer taeller nu det samme som ordet ved siden af. Den sagde
  "over forfald", men talte ogsaa fakturaer, der var annulleret i fuld af en
  kreditnota - de bliver staaende som sendt, naar der aldrig blev betalt noget
  paa dem - og fakturaer, der forfalder i dag. Kunden faar dagen ud, og en
  krediteret faktura er et doedt krav. Hovedsiden, betalingspaamindelserne og
  rykkerplanen gjorde det rigtigt i forvejen; badgen var den sidste.
* Faerdiggoer faktura spoerger nu inde i appen i stedet for i browserens egen
  systemboks. Den kunne ikke styles, baerer vaertsnavnet og ligner paa en
  telefon en advarsel fra et helt andet sted.
* Indstillinger kunne ikke gemmes, naar et paakraevet felt paa en anden fane
  var tomt. Browseren naegtede at indsende, proevede at saette markoeren i et
  skjult felt, kunne ikke, og sagde det kun i konsollen. Paa en ny
  installation gjorde det firmaoplysninger umulige at gemme - og bagefter
  klagede faerdiggoerelsen over, at de manglede. "Paakraevet" foelger nu den
  fane, man kan se.
* Manglende firmaoplysninger siges nu paa kladden, foer fakturaen skrives, og
  med en knap til hvert felt der mangler. Felterne ligger paa to forskellige
  faner, og beskeden pegede ingen steder hen.
* Feltet CVR hedder nu Tax ID, naar sproget ikke er dansk. Navnet kom fra den
  oekonomiske profil i forvejen - fakturaens PDF brugte det - kun
  indstillingsfeltet havde sit eget, haardkodede ord.
* Betalingsoplysninger har faaet en forklaring. Felterne omkring det havde en.
* Et klik paa en notifikation aabner nu den post, den handler om. Den sendte
  til listen, og listen beholder det statusfilter, der sidst blev brugt - saa
  en besked om en sendt faktura kunne lande paa en liste filtreret til betalt,
  hvor fakturaen slet ikke stod. Posten har altid baaret sit eget id med;
  ingen brugte det. Notifikationer om kalender og kvitteringer hoerer til Pro,
  og uden Pro skete der ingenting ved et klik - nu siges det.

= 1.37.31 =
* En besked paa pluginnets egne skaermbilleder fortaeller at Pro findes, og linker
  til produktsiden. Den vises kun dér - ikke paa Kontrolpanelet, Indlaeg eller
  Plugins - den tier helt naar Pro-tillaegget koerer, og den kan lukkes med X'et.
  Lukningen gemmes pr. bruger og gaelder derefter.

= 1.37.30 =
* Appen svarede "No route was found matching the URL and request method." paa
  naesten alle sider, hvis sitet ikke bruger paene permalinks. REST-roden er saa
  index.php?rest_route=..., hvor ruten ligger inde i en parameter, og appen
  haengte sine egne parametre paa med ? i stedet for &. Hele halen blev en del af
  rutenavnet. Kald uden parametre gik igennem, saa appen virkede halvt.

Nimble Lead to Cash - full changelog
====================================

readme.txt carries only the most recent entries, because the plugin
directory truncates that section at 5000 characters. Everything is here.

= 1.37.11 =
* A credit note can be issued again. It has no due date - it is immediate, and the VAT rules ask a credit note for the same ten things they ask an invoice for, a due date among none of them - so the one the plugin creates correctly leaves that field empty. Finalising it then refused the note as its own work: "The due date is invalid." Three more places would have refused it next, and the dialog's date field was marked required, so the browser stopped the save before any of it. All four now make the exception for a credit note, and only for a credit note: an invoice without a due date is still refused.
* The contact person can be set on an invoice. It is the "Att." line the document prints, and until now it was whatever stood on the customer when the invoice was made, with no way to change it. The invoice keeps its own copy of the customer, so a different att. here changes this one document and leaves the customer record, and every other invoice, alone - which is what is wanted when the work was agreed with one person and the invoice goes to another. Shown for business customers, because a contact person is not stored on a private one.

= 1.37.10 =
* Luft mellem vilkaarene og underskriften i tilbudsbrevet. Afstanden var mindre end mellem to linjer i afsnittet selv, saa "Med venlig hilsen" lagde sig op ad den sidste betingelse og lignede en linje mere i vilkaarene.

= 1.37.9 =
* The payment QR code reaches the invoice the customer receives. A payment add-on fills the QR slot, and to build a code for one particular invoice it has to know which invoice it is - but the filter was called without it, leaving the add-on to work it out from the web address. That only matched the preview and download links, so the code appeared where the business looks and was missing from the PDF sent by email and from the archived copy. The invoice is now handed to the filter, and the same code appears wherever the invoice is rendered.

= 1.37.8 =
* Signing in lasts. The session had a flat eight-hour life from the moment of signing in and was never extended - so a working day that began at eight ended with being signed out at four, mid-task, with a two-factor code to find. It now slides: an authenticated request pushes the expiry forward, throttled to the same five-minute write that already recorded activity, and a session in regular use stays valid. Fourteen days without use ends it, and a ceiling of ninety days from the sign-in applies however much it is used, so a session cannot live indefinitely.
* A device can be remembered, so the two-factor code is not demanded on every sign-in. The choice appears beside the code field, and only when Nimble Security is installed and the site has turned remembered devices on. The password is still required on a remembered device - only the code is skipped - and the device can be removed again from Nimble Security at any time.

= 1.37.7 =
* The enquiry, customer and job screens are usable on a phone again. Their two columns never stacked: the activity sidebar held its 280px floor while the form column gave up everything, leaving it 114px wide on a 412px screen, with every field clipped to a few letters. The stacking rule existed, but a media query carries no specificity, so the general rule lost to the narrower one these dialogs brought with them. It is now stated at that scope. Measured at 412, 390 and 360px; the desktop layout is unchanged to the pixel.
* Settings, documents had the same fault one screen over - the side panel's second column came out ten pixels wide on a phone. Fixed in the same place.
* The frontend now reads its translations from WordPress. Its JavaScript asked for a text domain the plugin does not declare, and script translations were never registered, so every translation of the 486 frontend strings was decorative. The domain is aligned and the script registered, which means an approved translation on translate.wordpress.org now arrives without a release.
* 137 strings that the bundled dictionary did not cover appeared in English inside a translated interface. They are filled in, and the build now refuses to package a frontend where that is true again.

= 1.37.6 =
* A status you choose now survives an update. A one-off repair that aligned every enquiry with its newest action sat in the schema installer, which runs on every activation and every schema change - so each update quietly rolled back any status a person had set since, with nothing written to the timeline to say it had happened. It now runs once: an installation that already has a schema version is marked as done rather than repaired again, and only a fresh install, which has no enquiries to touch, reaches the query at all.
* The same repair left only Won and Lost alone, while the two live rules also protect Quote sent. A sent quote could therefore be rolled back to "Meeting" by an update. The three are now treated the same in all three places.
* An invoice notification arrives on the due date, not three days early. The query asked for everything due within three days; it now asks for what is due. Quotes keep their three days' notice - a quote expires by itself and there is something to do before it does, while an invoice needs nothing until it is actually due.

= 1.37.5 =
* The readme now documents every external service the plugin can reach, with
  what is sent, when, and links to each service's terms and privacy policy.
* Corrected the readme and a code comment that said the code for off-site
  backup destinations ships with the Pro add-on. The Dropbox client class
  ships here; Pro builds on it. Without Pro it is never reached.
* The Danish translation files are no longer bundled. Translations now come
  from translate.wordpress.org, which keeps them current without a release.

= 1.37.4 =
* The report CSV export was written in Danish throughout, even when the app was
  set to English, so an English user got a Danish file from an English screen.
  Every row label is now translated; the Danish wording is unchanged.
* Two dashboard tiles counted invoices with the Danish word "fakturaer" in the
  English interface. They now say "invoice" or "invoices".

= 1.37.3 =
* Two labels were written in Danish directly in the template, so they stayed
  Danish whatever language the app was set to: the "Create credit note" button
  on an invoice, and the default quote introduction field in settings. Both are
  English now, with the Danish kept in the translation dictionary, so a Danish
  user sees no change.

= 1.37.2 =
* The Easy Setup screen drew its mark as the letter N in a coloured box rather
  than using the plugin's own icon. It now shows the icon itself.

= 1.37.1 =
* The app icon was the family's blue, which belongs to Nimble Security. Lead to
  Cash is indigo. The icon in the browser tab, on the sign-in screen, in the
  sidebar and on the installed app now matches the plugin's own colour, and so
  does the mark on the Easy Setup screen, which had the old blue written into
  the stylesheet rather than taking it from the icon.

= 1.37.0 =
* The enquiry, customer and job dialogs share one layout: the record on the left,
  its activity in a column on the right, the save bar pinned to the bottom. The
  customer's activity history and the job's notes moved out of the bottom of the
  form and into that column. Nothing changes position when an enquiry becomes a
  customer, which was the point.
* Those three screens are denser than the rest of the app on purpose, scoped to
  .record-dialog: shorter fields and gaps, a three-column address grid, and a
  billing address that collapses to one line when it mirrors the work address.
  Measured at the same content: enquiry 2367 -> 1560 px, customer 2944 -> 1645,
  job 2000 -> 1205.
* Sections are cards with an uppercase heading and a rule, so the divisions are
  visible without counting fields.
* Documents on an enquiry sat inside the actions panel. It is a sibling now.
* The job's activity list used its own markup and now uses the same timeline
  items as the other two.
* The enquiry's save bar moved out of the form so it spans both columns like the
  customer's. Its buttons carry form="detail-form"; validation and the
  save-and-close flag work exactly as before.

= 1.36.3 =
* Renamed TermsAttachment::prepare() to attachment(). Plugin Check treats every
  call named prepare() as $wpdb->prepare() and reads its first parameter, which
  a method without parameters does not have; the check crashed on the file
  rather than reporting anything about it. Behaviour is unchanged.

= 1.36.2 =
* Five repository files were missing the note that explains their access-scope
  clauses, so the report still listed them. No code changed.

= 1.36.1 =
* The rest of what Plugin Check reports, where the report is wrong rather than
  the code. The duplicate-customer exception carries four data values and a
  fixed message of its own; escaping them would send HTML entities through the
  REST API to the person deciding whether the match is real. The access-scope
  clauses and the table names from $wpdb->prefix are integers and constants, and
  the placeholder counts are miscounted because the WHERE clause is assembled
  before prepare() sees it. Each of these now says so where it happens.

= 1.36.0 =
* Everything Plugin Check reported that was a real defect. Exception arguments
  that carry data rather than a message are now passed through a named
  constructor, so they are no longer mistaken for output. Error messages that do
  interpolate a value are escaped. unlink() is wp_delete_file(). The role field
  on the users screen is unslashed and sanitised. The invoice archive download
  states, where it happens, that it writes binary and must not be escaped.
* The price list importer reads through WP_Filesystem instead of a file handle,
  and parses from an in-memory stream, so quoting and line breaks inside a field
  are handled as before.
* The changelog moved to changelog.txt. The directory truncates that section at
  5000 characters, and it had grown to twelve times that.
* The access-scope clauses are documented where the invariant is held:
  AccessScope::sqlIn() and FiguresScope::clause() build SQL out of integers
  only, every value through intval() and a greater-than-zero filter, with column
  names that are literals in the code. The files that use them say so, because a
  static analyser cannot see it and reported sixty queries as unprotected.

= 1.35.0 =
* Danish translation for the help setting and the export card. The strings added
  in 1.33.0 and 1.34.0 were missing from the catalogue and showed in English on
  an otherwise Danish screen.
* Removes every trace of licence handling from this plugin. There was no licence
  client left, but the read-only state an add-on could switch on was still here:
  a body class, a banner in the template, the JavaScript that toggled it and
  eighteen CSS rules. Nothing in this plugin could ever switch it on, and it is
  gone regardless - a free plugin should not carry the mechanism at all.
* The sign-in response now reports only whether an add-on is present, under
  "addon", instead of a "license" object with a read-only flag.
* Admin styling no longer reserves screen names an add-on owns, including a
  licence tab, and no longer carries CSS for screens this plugin does not have.
  Add-ons register their screens through the new nimble_ltc_admin_screens filter
  and get the same shell.
* Wording that referred to a paid add-on is gone from the export card and the
  setup screen.

= 1.34.0 =
* Rapportens CSV blandede kroner og øre. Betalingsmetoder og de to gebyrrækker
  stod i øre, mens alt andet stod i kroner. Omregningen sker nu ét sted, og en
  kørsel under tools/check fejler, hvis en ny række glemmer den.
* "Gns. pr. vundet henvendelse" delte med de fakturerede vundne, ikke med alle
  vundne. Etiketten siger nu hvad den deler med, og det samme gør gennemsnittet
  pr. faktura.
* De vundne henvendelser deles nu i tre grupper, der udelukker hinanden og
  summer til antal vundne. Før talte "vundet, endnu ikke faktureret" også de
  fakturerede sager, der kun var faktureret delvist, så grupperne summede til
  mere end der var vundet. Restbeløbet står nu som et beløb, ikke som en gruppe.
* "Anslået gns. inkl. ikke-faktureret" hed ikke det, den var. Den er
  gennemsnittet blandt vundne med kendt værdi, og antal med og uden kendt værdi
  står nu hver for sig. Der gættes ikke en værdi for sager uden hverken faktura,
  tilbud eller budget.
* Gennemsnit pr. måned og uge siger nu hvilken periode de er delt med, og begge
  grundlag er med: den aktive periode og hele den valgte rapportperiode.
* Ugeoversigten fulgte slet ikke rapportperioden - den løb fra den første
  henvendelse til i dag, uanset hvad der var valgt. Den følger nu perioden.
* Ny ReportMath med rapportens regnestykker uden database under, så de kan
  afprøves. tools/check/report-math.php kører dem.

= 1.33.0 =
* Hjælpeknappen i appen kan slås fra under Lead to Cash i wp-admin. Slås den
  fra, hentes hverken knappen, stilarket eller koden bag den - en skjult knap
  er stadig et hentet script, der kører.

= 1.32.0 =
* DropboxClient kan nu hente den PDF, Dropbox selv laver af et dokument.
  Word-dokumenter sendes ikke til kunder, og at konvertere et kræver enten en
  kontorpakke, som en WordPress-server ikke har, eller en betalt tjeneste.
  Dropbox har begge dele i forvejen. PDF'en er Dropbox' gengivelse af filen som
  den står, så brevhoved, logo, sidefod og sideskift er dokumentets egne.

= 1.31.0 =
* En kunde kan nu sættes uden for tallene. Afkrydsningsfeltet står på
  kundekortet, og alt, hvad der hører til kunden, holdes ude af omsætning,
  konvertering, antal betalinger og forsidens nøgletal - uden at noget bliver
  slettet. En testfaktura er en rigtig faktura for regnskabet: den er udstedt,
  betalt og bogført, og den skal blive stående dér. I omsætningen siger den
  kun, at nogen prøvede systemet af.
* Bevidst uden for filtret: regnskabssynkronisering og afstemningen mod
  regnskabssystemet, fordi bilagene findes dér og en skjult halvdel af
  sammenligningen giver en difference, ingen kan lukke. Og arbejdstællerne -
  åbne henvendelser, forfaldne opfølgninger, ubetalte fakturaer - fordi
  arbejdet er udført, og at skjule det ville være en dyrere slags løgn.
* Kunden ser stadig sit eget udestående på sit eget kort. Det er husets tal,
  der er renset, ikke kundens.

= 1.30.3 =
* Et gebyr på en registreret betaling kan nu rettes. Tallet kommer fra
  betalingsudbyderen eller fra et felt i dialogen, og begge kan tage fejl -
  indtil nu fandtes der ingen vej tilbage, mens rapporten holdt det op mod
  regnskabet og meldte en difference, ingen kunne lukke. Bruttobeløbet røres
  ikke; det er, hvad kunden betalte.

= 1.30.2 =
* En udløbet session sagde "Du har ikke adgang til at ændre data". Hver
  skrivevej spurgte om session og rettigheder på én linje og svarede det samme
  uanset hvad der manglede, så den, der havde haft en formular åben i otte
  timer, fik at vide, at han manglede rettigheder, han hele tiden havde haft -
  og hverken hvorfor eller hvad han skulle gøre. Nu siger den "Din session er
  udløbet. Log ind igen for at gemme", og svarer 401 frem for 403, fordi det er
  præcis forskellen: ingen ved hvem du er, ikke du må det ikke. Rettet 15
  steder.

= 1.30.1 =
* Fakturalisten viser nu, hvor meget der er betalt og hvor meget der mangler,
  under statusfeltet. Badgen kunne kun sige "Delvist betalt", og tallene stod
  kun inde i fakturaen - men det er dem, rækken bliver læst for.

= 1.30.0 =
* En ansvarlig, der blev taget af en henvendelse eller en opgave, blev hængende
  på kunden. Ansvaret på en kunde er summen af dens henvendelser og opgaver, men
  blev kun lagt til, aldrig trukket fra, og der findes ingen skærm at fjerne en
  kollega fra. Nu regnes det ud forfra, hver gang en henvendelse eller en opgave
  skifter ansvarlig eller bliver slettet. Rækker, der allerede står forkert,
  rettes én gang ved opdateringen.
* Kundekortet siger nu, hvor ansvaret sættes, frem for at vise det som noget man
  selv kunne rette dér.
* Et dansk CVR-nummer slås op i CVR, når EU's momsregister ikke kender det. Et
  selskab uden momspligt - udlejning af bolig, for eksempel - har et CVR-nummer
  og intet momsnummer, og svaret "momsnummeret findes ikke" var sandt om momsen
  og misvisende om selskabet. Navn og adresse hentes nu alligevel, og det
  fremgår, at selskabet ikke er momsregistreret.

= 1.29.1 =
* Dropbox-klienten kan nu flytte, kopiere og hente en fil. Flyt og kopiér
  omdøber som standard frem for at lande oven på noget: en flytning der
  stiltiende erstatter en fil på målet, er en sletning med et andet navn.
  Hentning går gennem et midlertidigt link, så svaret er et helt almindeligt
  HTTP-svar frem for argumenter gemt i en header.

= 1.29.0 =
* Backups are taken and kept on this server, as before. Sending a copy off it - Dropbox, Google Drive, OneDrive, SFTP or a webhook - has moved to the Pro add-on, together with every line of code that speaks to those services. The plugin is a third of the size it was, and it now contacts nothing at all unless you look up a VAT number or point at an image by web address.
* A destination an add-on offers appears in the backup screen; with none on offer, the screen says so instead of listing places a backup cannot go.

= 1.28.0 =
* An add-on can put something in the notification bell. Everything the bell shows is gathered from Lead to Cash's own tables, so work that lives beside the app had nowhere to appear but a page somebody has to remember to open - and not having to remember is what a bell is for. An added notification behaves like any other: it can be read and dismissed, and it sorts among the rest by its date.

= 1.27.10 =
* The Dropbox connection can walk a folder without collecting it. Listing gathers what it finds, which is right for showing somebody a folder and wrong for counting a whole archive - thousands of entries held in memory only to be thrown away. Streaming them means a question about ten thousand files can be answered with one number.

= 1.27.9 =
* Uploading to Dropbox can be told not to replace a file of the same name. Backup still overwrites, which is what a backup should do; the setting is there for the cases where replacing a file would be a loss rather than an update.

= 1.27.8 =
* The Dropbox connection can create a folder, and says plainly when one is already there rather than treating that as an error. Backup does not use it; it is there so an add-on does not have to reimplement token handling to make a folder.

= 1.27.7 =
* Reading a Dropbox folder now returns the whole folder. Dropbox answers a page at a time and treats the requested size as a suggestion, so a large folder - or any listing that reached into subfolders - came back partial with nothing to say it had. Backup is unaffected; this is the reading side only.

= 1.27.6 =
* The Dropbox connection is no longer tied to the backup settings. Backup keeps its own, and anything else that needs Dropbox - an assistant reading the archive, say - brings its own credentials instead of borrowing the ones that can write. Nothing changes for an existing backup.

= 1.27.5 =
* The Dropbox connection can now also read: list a folder, search it, and open a file. Backup already wrote there; reading is what lets an assistant look something up in the archive. A Dropbox app that was connected before this will need its permissions extended and the connection renewed - the page says so when it happens.

= 1.27.4 =
* Every time shown is now the user's own. Timestamps are stored in UTC, and a handful of places printed them straight out: an enquiry created at 07.41 read "05.41" in its header, while the action booked on the same call read 08.11 correctly two lines away. The same raw print sat on the enquiry timeline, the invoice header and the notification due dates.

= 1.27.3 =
* The same telephone number written two ways is now the same customer. A blind index matches the exact characters it was built from, so "30266782" and "+4530266782" were two different hashes and two different people: a customer entered one way was invisible to a lookup made the other, and the register grew a second card for somebody already in it. Lookups now ask for every spelling that means the same telephone - with and without the country code, with a leading 00, with and without a plus.
* Nothing stored changes and nothing has to be rebuilt; only the lookup widens. The company's own country decides what a national number looks like, and without a country - or with one the list does not know - matching behaves exactly as before. A widening that cannot guess is one that does nothing, which is the safe way round. Extend the list with the nimble_ltc_country_calling_code filter.

= 1.27.2 =
* Sales figures can leave out what was never a sale. An add-on that receives enquiries - a phone message, a support mailbox - can name its own intake media through the new nimble_ltc_non_sales_mediums filter, and those enquiries are left out of the reports: by source, by month, the weekly trend, the won figures and the conversion rate. Lead to Cash is handed values, never SQL, and never learns which add-on set them or what the words mean.
* Deliberately unchanged: everything that counts work. Open enquiries, overdue follow-ups and the counters above the list still include them, because the work is real and a counter that disagrees with the list below it is worse than no filtering at all.

= 1.27.1 =
* An enquiry created by an automatic intake stays New. Scheduling the call-back is part of receiving the enquiry, not of handling it, and an enquiry nobody has touched should still read as new on the list. A person who creates one and books a meeting on it still gets the status that says so.
* A status you choose is now the status you get. Actions still own the status when you leave it alone, so saving an enquiry does not undo what its newest action says - but an enquiry with an open call booked on it could never be put back to New, however many times you chose it, and the form snapped back with no explanation.
* The enquiry header shows what it came in through, when the intake recorded it: "Telefon · AI-telefonsvarer · oprettet ...". Lead to Cash never learns what those words mean; it passes on what the intake wrote.

= 1.27.0 =
* Add-ons can now add their own markup and scripts to the app through the new nimble_ltc_app_footer action. Nimble Assistant uses it for the microphone in the app.

= 1.26.0 =
* The email address check can be extended by add-ons (filter nimble_ltc_email_check_result); Lead to Cash Pro uses it to warn about addresses that mail has come back from.
* Customer, invoice and quote forms show an address's problems as soon as the record is opened, not only when the email field is left.
* Fixed: clicking send twice while an address was being checked could send twice.

= 1.25.0 =
* Email addresses are checked when an email field is left and again before a form with one is saved or sent: a misspelt common domain ("gmial.com", "hotmail.con", "gmail.dk") gets a "Did you mean ...?" with a one-click fix, and a domain that does not exist or cannot receive mail is flagged. You are asked before continuing with an address that looks wrong; nothing is blocked. Only DNS is read, and nothing is stored about the address.

= 1.24.1 =
* A credit note for part of an invoice comes off what the customer owes. The invoice shows what has been credited, the payment dialog asks only for the rest, and paying the rest marks the invoice paid. A credit note issued on an invoice whose remainder was already paid marks it paid, with no extra payment recorded.
* Outstanding amounts on the front page, the customer list, the customer card and the invoice list are what is still owed - part payments and credit notes taken off each invoice. A credit note on an invoice that was already paid no longer lowers the outstanding total, and credit notes no longer appear among the invoices due.

= 1.24.0 =
* Part payments: in the Record payment dialog, enter less than the amount owed and the payment is recorded as a part payment. The invoice stays open as Partly paid, shows what has been paid and what is still owed, and the next payment is pre-filled with the rest. A payment larger than what is owed is refused.
* The open total on the invoice list counts only what is still owed on part-paid invoices.

= 1.23.1 =
* The Record payment dialog has more room around its content, and its buttons sit side by side on a phone.

= 1.23.0 =
* When an enquiry's next action has passed its date, the responsible users are asked what happened the next time they open the app: done, or postponed by 1-14 days (to that many days from today, at the same time of day). The question cannot be dismissed without an answer. Postponements are recorded in the enquiry's history.
* Fixed: completing or reopening an action moved its date back by the UTC offset (two hours in Danish summer time).

= 1.22.1 =
* Creating a job asks for confirmation when its enquiry or quote is already linked to another job, and creating a quote asks when its enquiry already has another quote. Cancelled jobs do not count, and re-saving a record that was already linked does not ask again.

= 1.22.0 =
* Backup & restore is part of Lead to Cash itself: scheduled backups kept on the server or sent to Dropbox, Google Drive (OAuth or a service account on a shared drive), OneDrive / SharePoint, an SFTP server or an https webhook. Each destination has a real connection test that writes and removes a small file. SFTP works without the PHP ssh2 extension and pins the server's host key on first use.
* Backup files get an unguessable name and deny rules in their folder, and a restore reads the chosen file before the safety backup can prune it.
* The Dropbox document archive for invoices and receipts moves to Lead to Cash Pro. Its Dropbox connection is now the one under Backup & restore, so existing credentials keep working.
* The readme lists every external service the plugin can contact, when and with what.
* Removed code for installations older than the NimblePlugins name: the inhab-ltc REST and document addresses, the legacy session cookie and class aliases, the old INHAB_LTC_ constants, the table migration and the pre-1.4.46 key-file migration.
* The app's styles and scripts are registered with WordPress and printed through it.

= 1.21.5 =
* On phones the app no longer scrolls sideways. A hidden label in the Jobs table and the payment table in Reports pushed the whole page wider than the screen; wide tables now scroll inside their own card.

= 1.21.4 =
* Space between the last weekly row and the button that opens the rest. The button is an action, not another row in the list.

= 1.21.3 =
* The weekly rows say "Uge 37" and nothing else. The rows are in order, newest first, so the dates only made each line wrap onto two. The week in progress is still marked as such, since a short bar otherwise reads as a quiet week. Week one is week 1, not week 01 - the padding belongs to the ISO code, not to the label.

= 1.21.2 =
* Week by week shows the last four weeks and opens to the full history on a click anywhere in the block. Four weeks is what "how is it going" needs; the rest is history, and history that pushed the card off the screen every time the report was opened.
* Removed the prose under the heading. The rows say what they are - a week number and the days it covers - and the line above them said it twice.

= 1.21.1 =
* The weekly rows read "Uge 37 · 07.09-13.09" - the week number and the Monday-to-Sunday span, nothing else. The year is added only for a week that is not from this one, because a list running back far enough shows week 38 twice and then the dates alone stop telling them apart.

= 1.21.0 =
* The weekly enquiry figures moved into the enquiries card instead of standing in a card of their own, and they now count every week since the first enquiry rather than being anchored to today or tied to the report's period. The months answer how the period went; the weeks answer how the weeks have been going, and that is not a question about a date range picked from a dropdown.
* Fixed: the weekly figures rendered as an empty box. The card borrowed a number formatter that is a local variable inside another function, so it threw a ReferenceError and left a heading with nothing under it - which is harder to notice than an error would have been.
* Fixed in Pro: the accounting screen called updateAccountingActionLabel() from a scope where that name does not exist. Optional call syntax guards a value that is null, not a name the engine cannot resolve, so it threw every time an accounting action finished.
* Both frontends now pass eslint's no-undef rule, which is what finds this class of mistake.

= 1.20.0 =
* Reports: a new card counts enquiries week by week. This week and last week are counted from today and deliberately ignore the report's period - "how many came in this week" is not a question about whatever range the report happens to be showing. Below them are the weeks in the period, newest first, with empty weeks counted and the week in progress marked as such. Weeks run Monday to Sunday.
* The change between this week and last is only shown once the week has seven days behind it. On a Monday afternoon "down 80 %" is arithmetic, not news.
* The report cards are reordered: enquiries per month, then per week, then value per won enquiry. The two enquiry cards belong next to each other.

= 1.19.0 =
* Easy Setup now has two faces instead of one. On Lead to Cash it names, once, what Pro would add - website forms, sending quotes and invoices by e-mail, a calendar, accounting export - and makes clear none of it is needed to start. With Pro active it stops advertising and starts setting up: the last step links straight to form integrations and to adding a sending account, because those are the two things a Pro licence needs configured before it pays for itself. The old screen told somebody who had just bought Pro that a feature was "available with Pro".
* Two new filters let the package that owns a screen say where it is: nimble_ltc_onboarding_sending_url and nimble_ltc_onboarding_accounting_url. Lead to Cash must not know Pro's admin slugs.

= 1.18.14 =
* nimble_ltc_get_invoice() is the supported way for an add-on to read one invoice. Add-ons have been building InvoiceRepository themselves, which means knowing its three collaborators in the right order and breaking quietly the day that changes. A public id goes in, the decrypted invoice comes out, an empty array means there is no such invoice. It performs no capability check of its own - the caller is code in the same process, not a request - so it must not be wired straight to anything a visitor can reach.

= 1.18.13 =
* Two filters on the invoice PDF, so an add-on can issue its own kind of document without carrying a second copy of the renderer: nimble_ltc_pdf_document_title names the heading, and nimble_ltc_pdf_recipient_label names the recipient block. Everything else - the logo, the colours, the payment box, the footer - comes out exactly as it does on an invoice, which is the point: a reminder that looks like it came from somewhere else is a reminder the customer hesitates to pay.

= 1.18.12 =
* The app signs you in itself. Lead to Cash has had its own sign-in all along - name, password, two-factor, an eight-hour session - but the door to the page asked WordPress instead: without a WordPress cookie you were sent to wp-login.php first, and even a perfectly valid Lead to Cash session did not open it. So a phone had to sign in twice, and the first of the two was the one nobody needed. A Lead to Cash session is now enough on its own.
* Opened without a session, the page is still served - but stripped to the branding and the sign-in screen. No company settings, no VAT rates, no payment details: the sign-in screen is public, the way any web application's is, and everything behind it stays shut. Signing in reloads the page, which is then served in full.
* A WordPress account without Lead to Cash access now meets that sign-in screen rather than a bare "Access denied." page, so the person can sign in as the account that does have access instead of having to log out of WordPress first.

= 1.18.11 =
* The estimated won value now also states the average per enquiry, taken over the enquiries that carry a figure rather than over every won enquiry. An enquiry nobody has priced yet is not an enquiry worth nothing, and dividing by it would state a number the data does not support.

= 1.18.10 =
* Opening an enquiry from a customer who has written in before now says so. The duplicate check when a customer is created catches the same person arriving twice; it says nothing once they are one customer with two enquiries — and that is the case that quietly makes the report guess, because an invoice or a job with no enquiry of its own then has to be split between them by date.

= 1.18.9 =
* Fixes the estimated won value, which was far too low. Jobs were only counted when they carried the enquiry's own id, and most do not: a job started from a customer rather than from the enquiry has nothing linking it back, so the great majority of the work was invisible and its enquiries were counted as having no figure at all.
* Jobs are now attributed exactly the way invoices already were — the job's own enquiry when it has one, otherwise the customer's enquiry that was won most recently before the job was created.

= 1.18.8 =
* The report has a new figure: the estimated total value of won enquiries. Each won enquiry is counted once, from the most reliable source it has — the invoice, then the accepted quote, then the job's projected economy, then the estimate written on the enquiry itself.
* One source per enquiry, never a sum across them: they are four answers to the same question, not four pieces of the same amount. It is a priority and not a maximum, so an enquiry quoted at 100.000 and invoiced 20.000 so far counts as 20.000. What is agreed but not yet billed is a separate fact and stays in the backlog figure.
* The card says how the total was arrived at — how many enquiries came from an invoice, a quote, a projection, an estimate, or carry no figure at all. The same amount means one thing when it rests on invoices and quite another when it rests on guesses.
* Enquiries that were previously counted as unpriced now contribute their own estimate, so the total is higher than the same period would have shown before.

= 1.18.7 =
* A recorded payment now announces itself on the nimble_ltc_payment_recorded action, so an accounting add-on can register it with the bookkeeping system. Lead to Cash still knows nothing about any such system; it says what was paid and leaves the meaning to whoever is listening.

= 1.18.6 =
* Marking an invoice paid by hand now asks how it was paid, and what it cost. Until now every such payment was filed as "method not specified" with no fee, so the report piled hand-entered turnover into one anonymous heap and left real money — around one per cent on a MobilePay payment — out of the net figure entirely.
* A MobilePay fee is suggested from the rate on your agreement (Settings -> Payment) and can be corrected before it is saved. Payments the MobilePay add-on captured itself are untouched: those carry the actual fee read from Vipps and never pass through the dialog.
* The transition endpoint now accepts only the payment method and the fee from the browser. The amount, currency, date, provider and idempotency key are the invoice's own facts, and a request that could set them could put a payment in the books for an amount nobody paid. Gateways that legitimately supply all of that do not go through the endpoint.

= 1.18.5 =
* The invoice list now says what has happened to an overdue invoice, not just that it is overdue. A payment reminder that has gone out is printed under the red badge with the date it was sent.
* The same place is now an open shelf for the plugins around Lead to Cash: anything may add one short line per invoice through the nimble_ltc_invoice_status_notes filter, and Lead to Cash prints it without knowing what it means. A debt-collection handover and an outbound phone call can therefore be read straight from the list without this plugin learning that either exists.

= 1.18.4 =
* Review requests can be sent automatically a set number of days after an invoice is paid. The setting lives in Settings -> Review request; the sending itself is Pro's.

= 1.18.3 =
* The Dropbox secret fields say what is actually stored — a length and four leading characters — so a value that lost characters on the way in, or that the browser autofilled over, can be seen rather than argued about. The renewal request also encodes its own body instead of leaving that to WordPress, which decides differently depending on whether it picked the content type.

= 1.18.2 =
* A refused Dropbox connection now says which of the three credentials Dropbox would not accept, instead of naming all three. Dropbox distinguishes the app key and secret from the refresh token, and passing that on turns a guessing game into an answer.

= 1.18.1 =
* The Dropbox archive stays connected. A Dropbox app access token expires after four hours, and the archive held one and sent it forever — so everything looked configured, the token was still sitting in the settings, and every upload was refused. Add the app key, app secret and refresh token under Integrations and the connection renews itself; a pasted token still works for installations that have one. Failures also say which of the two things went wrong: an expired connection and a folder Dropbox will not write to used to produce the same sentence, which sent the reader to look at a token that was fine.

= 1.18.0 =
* Value per won enquiry now also shows what has been won but not yet billed, and an estimated average that includes it. The plain average is built only on the enquiries that have been invoiced, and those are the ones that finished first — small, quick jobs — so on its own it understates what a win is worth while the larger work is still running. Won work with no invoice is valued at its accepted quote, or at the job's budget where there is no quote, and enquiries that have neither are counted separately rather than quietly averaged away.

= 1.17.2 =
* The Payments and Payment terms cards no longer have their figures pressed against the text above them. The heading's description carries no bottom margin and the tile grid carries only a bottom one, so the two sat flush; every card with that pairing is spaced now.

= 1.17.1 =
* Enquiries per month now starts at the first enquiry ever recorded. The months before an installation existed are not quiet months, and counting them both filled the chart with empty bars and divided the rate by a stretch of time that never had a chance to produce anything — nine such months turned eleven enquiries a month into three, and made the median month zero. Both new cards also space their blocks properly, and the notes below them are written out instead of reading "1 faktura(er)".

= 1.17.0 =
* Two new figures on the report. "Value per won enquiry" answers what a win is actually worth: invoices excluding VAT, counted per enquiry rather than per invoice, so a job billed on account and then finally is not read as two half-sized wins. Enquiries won but not yet invoiced are left out of the average rather than counted as nothing. "Enquiries per month" is calculated across the period's whole length, so quiet months count in the denominator instead of quietly disappearing from it, and a period shorter than a month says so rather than multiplying a few days up into a confident-looking number. Both show the median and the spread beside the average, because one large job moves a mean further than people expect.

= 1.16.5 =
* Users and access shows one card per user instead of one long list, so a consultant's assignments sit inside that person's own card rather than running together with the next user's.

= 1.16.4 =
* Administrators can invite a new user straight from Users and access, without leaving the app. The invitation is WordPress' own password email, so the new user chooses their own password and an administrator never handles one. The invitation and the WordPress users screen now run through the same code, so the two ways of handing out access cannot drift apart: removing access also removes the assignments that came with it, and granting access to an existing user can no longer sidestep the rule that an installation must keep one administrator.

= 1.16.3 =
* The Users and access tab appears for administrators. The settings screen kept its own list of which panels exist, so the new one was hidden again every time a tab was opened.

= 1.16.2 =
* The consultant role reads "Konsulent" in Danish. The role name was new, so the bundled Danish catalogue had nothing for it and it stood in English next to two translated ones.

= 1.16.1 =
* The consultant role can now be assigned from the WordPress users screen as well. The role list there was built from the same source, but the form that saves it still accepted only the two older roles and rejected the choice. The same screen also refused to let the last administrator move to any other role, rather than only to User.

= 1.16.0 =
* A consultant role. A consultant sees only what an administrator assigns them: a whole customer, a single enquiry, or one job. With nothing assigned they see nothing at all. Assignments are managed under Settings, where completed jobs are flagged so an administrator can see which access has outlived its purpose; nothing is withdrawn automatically.
* Invoicing is never available to a consultant. Every invoice route refuses them, and the amounts are removed from the job and customer lists rather than merely hidden in the interface.
* Settings answer a consultant with the company name, language, currency, date format and branding, and nothing else. Their own profile is the only settings screen they can open.

= 1.15.0 =
* The plugin directory and text domain are now nimble-lead-to-cash, matching the rest of the Nimble range and the commercial add-on. The menu entry still reads Lead to Cash, and nothing inside the plugin changed: the same database tables, the same options and the same settings. WordPress treats a renamed folder as a different plugin, so the previous version has to be deactivated and this one installed and activated in its place; data is untouched by that.

= 1.14.19 =
* A Danish or other translation installed by WordPress itself is now used when one exists. The plugin resolved its own language files unconditionally, which meant a catalog from translate.wordpress.org was ignored. The bundled Danish catalog is still the fallback, so nothing changes on a site without an installed translation.
* readme corrections for the plugin directory: the screenshot section was missing entirely, and the contributor account was misspelled.

= 1.14.18 =
* Company settings are administrator-only on the server, not only in the interface.

= 1.14.17 =
* Google and Trustpilot review links are company settings, validated as real http(s) addresses.

= 1.14.16 =
* The invoice branding colour pickers show the selected colour.

= 1.14.15 =
* "Kreditnotaer" lists credit notes only; cancelled invoices get their own filter.

= 1.14.14 =
* A fully credited invoice reads as "Krediteret" and is excluded from paid counts, totals and reminders.

= 1.14.13 =
* Invoice page gains "Samlet udestående" and "Samlet betalt" key figures.

= 1.14.12 =
* Mail templates default to the company's own language, not English.

= 1.14.11 =
* The redundant small label above each page title has been removed.

= 1.14.10 =
* Report tables and monthly bars are excl. VAT; invoice and customer lists show both.

= 1.14.9 =
* The dashboard counts credited invoices the same way the reports do.

= 1.14.8 =
* A credited invoice and its credit note are excluded from reports; a full credit is a correction, not turnover.
* Only issued credit notes count towards a credit; drafts no longer change the figures.

= 1.14.6 =
* Invoice filters now include dedicated Credit notes and Reminders views.
* Payment reminders keep encrypted delivery history with timestamp, recipient, sender, subject and exact message text.
* The payment integration contract accepts gateway, transaction id and actual gross/fee/net metadata from payment providers such as Vipps MobilePay.

= 1.14.5 =
* Credit notes carry no due date and are excluded from overdue status and payment reminders.
* Added payment-reminder metadata and reminder candidates for Pro automation.

= 1.11.5 =
* Added an explicit Lead to Cash User/Admin role independent of WordPress roles.
* Roles can be assigned when granting access or creating a user and changed later under Lead to Cash → Users.
* Protects the final Lead to Cash Admin from accidental downgrade or access removal.
* Migrates existing users from the previous WordPress-administrator behaviour.

= 1.11.4 =
* A test invoice emailed to your own private address can now be removed: the plugin names the address and asks, instead of refusing outright.

= 1.11.3 =
* When a test invoice cannot be removed because it was emailed, the message now names the address it went to.

= 1.11.2 =
* Sending a test invoice to your own address no longer counts as sending it to a customer, so it can still be removed.

= 1.11.1 =
* An administrator can remove a test invoice from before go-live, as long as it was never transferred to accounting and never emailed. A permanent record is kept and its number is never reused.

= 1.11.0 =
* Terms of trade: write them in settings or upload a PDF, and they travel as a separate attachment with every quote and invoice you email.

= 1.10.11 =
* The browser no longer offers to save your customer's address to your own browser profile when you save a customer, an enquiry, a quote, an invoice, a job or the company settings.

= 1.10.2 =
* The "save language" button lines up with the language selector again.

= 1.10.1 =
* Choose the number invoices start from, so you can carry on from the system you are moving away from.

= 1.10.0 =
* A long description can be opened in a full-height window instead of a six-row box.
* Upload your own documents - a quote you wrote yourself, or anything else - on an enquiry or a customer. Files are stored privately and reachable only when signed in.
* "Create quote" straight from the enquiry, with the customer and enquiry already filled in. Creating a quote sets the enquiry to "quote drafting", and sending it to "quote sent".
* The estimated value now follows the enquiry onto the customer record.
* Tick "same as work address" instead of typing the billing address twice.
* Choose a default country in settings; new addresses start there.
* The browser no longer offers to save your customers' addresses to your own browser profile.
* Several screens that were still partly in English are now translated.

= 1.9.2 =
* The browser no longer offers to save your customers' addresses to your own browser profile when you close a customer record.
* Two people sending a quote at the same moment no longer collide over the quote number.

= 1.9.1 =
* You can now create a customer directly from the customer list, without inventing an enquiry first.
* An enquiry can be started from a customer record, with the customer already filled in.

= 1.9.0 =
* Customers can now be registered as a business: company name, VAT/CVR number and a contact person, alongside private customers. The company name is what shows on the customer list, on enquiries and on invoices, and the contact person is printed as an "Att." line on documents.
* Addresses are entered as street, postcode, city and country instead of one free-text box - on enquiries, customers, quotes and invoices.
* Existing customers are converted as they are opened. Nothing needs to be re-typed, and an address is left exactly as it was written unless you change one of its parts.
* A VAT number can be looked up in the EU VAT register (VIES), which fills in the company name and address for you. It covers every EU country including Denmark and needs no account. A few countries do not disclose company details; the app says so instead of reporting an error.
* Fixed: desktop notifications stopped the notification list from refreshing.

= 1.8.0 =
* Notifications now follow responsibility. You see the enquiries, quotes, jobs and invoices you are responsible for - through the enquiry, the customer or the job - instead of everything in the company. Calendar reminders follow the event owner, receipts are shown to everyone but the uploader, and administrators still see everything so nothing is missed while someone is away.
* New notification types: being made responsible for an enquiry, customer or job; an invoice was sent; an invoice was paid; and - for administrators - failed emails, failed form captures, failed accounting transfers or receipt uploads, a failed payment-status check, and a Lead to Cash update waiting to be installed.
* Notification texts are now written in the reader's own language instead of always in English.

= 1.7.9 =
* Help & FAQ rewritten for everything added recently: archiving versus deleting an enquiry, the invoice preview, payment terms, the logo on PDFs, the price list and quote template, per-user language, KPI order, clearing notifications, two-factor sign-in, calendar sharing, receipts to accounting, payment status coming back and the accounting providers that actually work.
* New FAQ section "Nimble series" explaining what the other products do, why running them on the same site helps, and exactly how they talk to each other - Mileage picking up jobs and enquiries as driving context, Operations reading health without ever reading customer data, Security supplying two-factor sign-in, Backup covering the whole site.
* Settings: a field with a helper text underneath no longer pushes its neighbouring field out of line - all cells are top-aligned.

= 1.7.8 =
* New: payment terms. Settings > Invoice details has a default (Net cash, Net 3, 8, 14, 21 or 30 days) used for new invoices, and every invoice has its own field in the invoice dialog, so a single customer can be given different terms. Choosing a term sets the due date; typing a due date by hand switches the invoice to "Custom due date" and leaves it alone. The terms are printed on the invoice PDF and shown in the preview.
* Invoices created before this version keep the due date they already had and are not relabelled - they simply have no terms until one is chosen. New drafts previously always got 14 days; they now follow the setting (Net 8 days out of the box).

= 1.7.7 =
* Enquiries can be deleted again. Archiving stays the first, safe option, but "Delete enquiry" sits next to it and removes the enquiry permanently when you deliberately choose it. The confirmation says what disappears (notes, actions, activity history), and a won enquiry asks a second time, naming the customer whose history it is. Linked quotes, jobs, invoices and mileage records are kept and only lose their reference to the enquiry.
* Fix: the invoice preview added in 1.7.6 stayed empty in the invoice dialog - it was drawn while the form was still hidden. It now renders when the invoice opens, shows the customer, dates and note on finalised invoices too (those fields are disabled and were skipped), loads the company branding even if the Settings page has not been opened in this session, and follows the document language rather than the interface language, like the PDF does.
* Dark mode: the invoice history block, the lifecycle markers, disabled invoice fields, the audit log's changed-field tags and result pills, the drag handle, receipt preview and price-list inputs all kept light backgrounds - several of them white text on white. Fixed.
* Settings: Price list and Quote letter template now come before KPI order, and the personal language card no longer sits flush against the section below it and the preview beside it.

= 1.7.6 =
* New: a real invoice preview. Settings > Invoice branding now shows a sample invoice with your own logo, colours, sender details and payment information instead of grey placeholder bars, and the invoice dialog has a "Preview" section that shows the invoice exactly as the PDF will print it, updating as you type - no need to save and open the PDF to check a change.
* Fix: Danish invoice PDFs were half English. The header said "INVOICE", the columns "Description/Quantity/Unit price/Amount" and the details block "INVOICEDETALJER" with "Invoicenr.". They now read FAKTURA, Beskrivelse/Antal/Enhedspris/Beløb, FAKTURADETALJER and Fakturanr., along with FAKTURERES TIL, FRA, Kladde, Fakturadato, Forfaldsdato, Ekskl. moms, Moms and I alt. Quote PDFs were already Danish.

= 1.7.5 =
* New: enquiries are now archived instead of deleted. "Delete enquiry" is replaced by
  "Archive enquiry" / "Unarchive enquiry" - archiving hides an enquiry from the main list,
  dashboard, notifications and sidebar counters without deleting anything; it can always be
  brought back. Enquiries can no longer be permanently deleted at all.
* New: an "Archived" filter option shows every archived enquiry. Archived enquiries are tagged
  "Archived" wherever they appear.

= 1.7.4 =
* Fix: an enquiry that had already become a customer ("won") could still be deleted from the
  Enquiries list. Deleting it silently wiped that customer's linked enquiry, its actions and its
  activity timeline, even though the customer record itself stayed - the customer would then show
  0 enquiries and an almost empty history. Won enquiries can no longer be deleted (the Delete
  enquiry button is hidden for them), and the API rejects the deletion too if attempted directly.
* Fix: a customer won via an accepted quote (rather than by changing the enquiry's own status)
  never had a "status changed to won" event recorded, leaving a gap in that customer's activity
  timeline. Both paths now log the same event.
* New: the Customers list now shows an "Enquiries" column, so any customer already left with 0
  linked enquiries by the bug above is visible at a glance. This does not recover already-deleted
  history - it only helps identify which customers were affected.

= 1.7.3 =
* New: the "New customer enquiry" dialog now has a Billing address field, next to Work address.
  It was already used everywhere else (customers, quotes, invoices) but missing here.

= 1.7.2 =
* Fix: in the quote dialog, "Customer" and "Linked enquiry" now stay in sync automatically.
  Picking a customer selects that customer's own enquiry automatically (their won enquiry if they
  have one, otherwise their most recent), and picking an enquiry still selects its customer as
  before.

= 1.7.1 =
* Fix: a draft quote letter with no quote number yet showed "TILBUDSKLADDE"/"DRAFT QUOTE" and
  then "Kladde"/"Draft" right underneath, saying the same thing twice. The second line is now
  only shown once there is an actual quote number.
* Fix: when a logo is set, invoice and quote PDFs no longer also print the company name and
  address text next to it in the header - the logo now stands on its own there (the full company
  name/address is still shown further down, e.g. the invoice's "FROM" block).

= 1.7.0 =
* New: the "Logo URL" set under Invoice branding is now actually printed on new invoice and quote
  PDFs, in the top-left corner next to the company name. Previously the field was only used in
  the in-app preview and PDFs always showed a text-only header. Leave the field empty to keep the
  text-only header. Supports PNG, JPEG, GIF and WebP source images.

= 1.6.1 =
* New: sending a quote now asks for confirmation in a small dialog ("Confirm sending") before
  marking it as sent, instead of sending immediately on the first click.
* Fix: on the quote letter PDF, the divider line above the total price no longer cuts through the
  VAT line above it.
* Change: newly installed sites no longer come with a pre-filled price list. The price list starts
  empty and is built up manually or by importing a file, as intended for the general-purpose
  product (existing sites that already have prices keep them unchanged).

= 1.6.0 =
* New: the price list can now be imported from a file - CSV, TXT, JSON, XML or Excel (.xlsx).
  Importing replaces the entire price list with the file's contents. CSV/TXT/Excel use a fixed
  column order (Category, Name, Unit, Price, Flags); JSON/XML use named fields instead.
* New: "Delete price list" empties the whole price list in one step, so it can be rebuilt from
  scratch (manually or by importing a file).
* Change: the "Price list" and "Quote letter template" cards in Settings now open in their own
  dialog from an "Open price list"/"Open template" button, instead of being large cards
  permanently taking up space on the Settings page.
* Fix: "Delete" buttons (Delete quote, Delete customer, and the new Delete price list) were
  being painted the theme's primary blue instead of their intended red, in both light and dark
  mode.

= 1.5.2 =
* Change: the quote letter template (Historik, phases, "included in this offer" checklist) now
  opens in its own dialog from a "Edit letter details" button, instead of expanding inline in
  the middle of the quote form.
* Fix: the "Preview quote" button now works for a brand-new, not-yet-saved quote too - it saves
  the draft first (like the invoice preview already did), then shows the PDF preview.
* More button spacing fixes in the quote dialog.

= 1.5.1 =
* Fix: quote dialog buttons that should be transparent/outlined (price-list picker, "Add from
  price list" style toggles, remove-line buttons) were being painted solid blue by the theme's
  primary-button styling, making their text hard to read and the "Vis brevdetaljer" button look
  cramped. They now keep their intended styling.
* Fix: quote lines are now visually separated as individual bordered cards instead of running
  together, and the "Add from price list"/"Add line" buttons have proper spacing from each other
  and from the section heading above them.
* Fix: creating a quote from a customer's card now automatically links the customer's own enquiry
  instead of leaving "Linked enquiry" on "None".
* New: "Preview quote" button in the quote dialog opens the quote PDF in an in-page preview modal
  instead of a new browser tab.
* Fix: the footer buttons in the quote dialog (Preview quote / Save / Save and close) now have a
  real gap between them instead of sitting flush against each other.

= 1.5.0 =
* New: quote letter template - the quote PDF can follow a real offer-letter layout (Historik,
  Tilbud, phase table, "included in this offer" checklist, terms and signature block). Set
  company-wide defaults in Settings > "Quote letter template"; each quote can still be edited
  individually.
* New: price catalog in Settings > "Price list" - add, edit and delete fixed prices, then use
  "Add from price list" in the quote dialog to add priced lines without retyping.
* Customers: "Enquiries" column replaced by an inline-editable "Status" column (Active/Completed).
* Customers: table can be sorted by Name, Address, Status, Outstanding and Latest activity.

= 1.4.54 =
* Global search: even padding around the search field instead of it sitting almost flush with the
  dialog's left/right edges.

= 1.4.53 =
* Fix: the global search dialog could get stuck on screen after clicking × (it never went through
  the browser's normal open/close display handling).
* Global search results have a refreshed look and read better in the dark theme.
* New: "Create quote" button on the customer card.
* Fix: rows in the Completed and Customers lists could stay stuck with a pale, near-white
  background after opening and closing a card in the dark theme.

= 1.4.52 =
* Enquiry card: new "Estimated value" panel for enquiries whose contact is not yet a customer; it is
  replaced by the customer invoices panel once the contact becomes a customer.
* Manually creating an enquiry on a contact that already exists as a customer now asks for
  confirmation instead of silently creating a second record; automatic form/API intake is never
  blocked but is flagged instead.
* Fix: an enquiry action could no longer be edited or completed once its enquiry became a customer.
* Responsible user is now required before an enquiry card can be saved, both for manual creation and
  for the first save of an automatically received enquiry.
* New: a global search above Home in the sidebar searches enquiries, quotes, customers, jobs,
  invoices and completed jobs at once and opens whichever result you pick.

= 1.4.51 =
* Notifications can be cleared: "Clear all" in the panel header and an × on each item. Cleared notifications are hidden for that user only; the underlying tasks, invoices and deadlines are untouched.
* Marking a notification as read no longer un-hides one that was cleared.
* Database schema 0.5.2 (dismissed_at column on notification reads).

= 1.4.50 =
* The enquiry source can now be changed on the enquiry card (Manual, Phone, Website, Meta, Google, Referral, Contact form, Other form).
* Danish: source labels show "Manuel", "Telefon", "Henvisning" again — lowercase placeholder entries were overriding the real translations. A handful of other duplicate dictionary entries removed.

= 1.4.49 =
* Fix: sign-in crashed with "Cannot read properties of null" after a successful login (event.currentTarget used after await).

= 1.4.48 =
* Danish translations for the encryption-key section on the Overview page and the privacy-policy text, which were added in 1.4.46 without being translated.

= 1.4.47 =
* Sign-in now supports accounts protected by Nimble Security two-factor authentication: the app asks for the authenticator/recovery code and passes it to Nimble Security via its `nimble_security_two_factor_code` filter. A missing code no longer counts as a failed attempt.

= 1.4.46 =
- The encryption key is no longer written to wp-content as a generated PHP file. It is read from a wp-config.php constant when one is defined, and otherwise stored in the database. An existing key is migrated automatically and the old file is removed, so encrypted data keeps decrypting exactly as before.
- Adds a setup step under Overview that shows the exact wp-config.php line for the key and, once it is in place, removes the database copy. Keeping the key out of the database means a database copy on its own cannot decrypt customer data.
- The private document folder's index guard now uses the standard WordPress silence file instead of generated PHP.
- Removes a one-time rebrand migration that renamed a legacy folder inside wp-content.

= 1.4.45 =
- Removes the licence client, the License admin screen and all licence storage from the free plugin. Licensing now lives entirely in the commercial Pro add-on; nothing here is gated, checked or limited.
- Form-integration health is reported by the Pro add-on through a filter instead of being computed inside the free plugin.
- The plugin no longer contacts any external service at all.
- The admin script and the users-screen stylesheet are loaded through wp_enqueue_script() and the plugin stylesheet instead of being printed inline.
- Uninstall still clears the licence options left behind by an earlier version.
- Requires Lead to Cash Pro 1.4.0 or newer if the Pro add-on is installed.

= 1.4.44 =

* Notify responsible users when a new enquiry is received.
* New-enquiry notifications are scoped to the enquiry's responsible-user group.
* Existing enquiries are not retroactively surfaced as unread notifications after upgrade.

= 1.4.43 =
- icon.svg was the only asset in the app template without a ?ver= cache buster, so browsers
  kept serving the previous mark after an update. Now versioned like styles.css and app.js.
- Replaces the placeholder mark with the real Nimble logo across the plugin, in the
  product's own colour so the WordPress admin menu stays readable when several
  Nimble plugins are installed side by side.
- No behaviour change.


= 1.4.40 =

* Add a four-step Easy Setup for first-time users with Skip Setup on every step.
* Auto-launch Easy Setup only on genuinely fresh installations; existing upgrades are never interrupted.
* Add a Run Easy Setup control in Settings for manual re-entry.
* Guide business basics, default responsibility, enquiry intake and the Lead-to-Cash workflow without exposing advanced configuration.

= 1.4.39 =

* Restore the Log navigation item for Lead to Cash managers.
* Close the open sidebar and notification popover when clicking outside.
* Reduce the saturated blue top glow in the application chrome.

= 1.4.38 =

* Add mandatory many-to-many responsible users across enquiries and jobs.
* Form/API enquiries without a logged-in user receive the configured default responsible user with a safe LTC-user fallback.
* Jobs inherit responsibility from their linked enquiry/customer unless explicitly changed.
* Customer cards aggregate responsible users from their enquiries and jobs.
* Mileage job access now accepts every responsible user instead of only the legacy primary owner.
* Add a forward-compatible Mileage work-context provider for responsible pre-sale enquiries.

= 1.4.37 =

* Enforce newest-created enquiry action as the operational Status.
* Repair existing enquiries whose saved Status did not match their newest action.
* Keep Won and Lost as terminal states that actions cannot overwrite.
* Recompute the denormalized Next action projection during the 0.4.2 migration.

= 1.4.36 =

* Convert every legacy Next action datetime into a real editable enquiry action.
* Existing customers aggregate enquiry history across exact historical email/phone-linked contact rows.
* Customer cards inherit enquiry actions and activity retroactively.
* Prevent future direct writes to the denormalized Next action datetime.

= 1.4.35 =

* Add durable multiple actions to each enquiry, with newest-created action shown first and compact expandable rows.
* Derive the enquiry's operational status from its newest action while keeping Won/Lost terminal.
* Derive Next action from the nearest scheduled open action.
* Add complete, reopen, edit and delete workflows with immutable activity-log events.
* Carry all enquiry actions and activity history onto the customer card after conversion, preserving the originating enquiry reference.
* Migrate previous event-only enquiry actions into the new action store without deleting the original audit events.
* Include enquiry actions in WordPress personal-data export/erasure handling.
* No Mileage changes in this release.

= 1.4.34 =

* Reduce repeated session validation work to one authoritative lookup per request and throttle last-seen writes.
* Run schema/capability/key upgrade work only when a plugin or database upgrade actually requires it.
* Cache the local encryption key in memory for the duration of the PHP request.
* Consolidate dashboard and navigation counters into substantially fewer SQL queries.
* Reduce notification polling and pause it while the app tab is hidden.
* Add database indexes for dashboard, expiry, payment and receipt notification paths.
* Memoize license state per request and reduce remote license timeout while retaining grace handling.

= 1.4.33 =
* Compatibility release for Mileage 0.6.23 / Pro 0.2.10 / Android 0.6.4, preserving assignment-aware jobs.

= 1.4.22 =

* Interface language now follows the plugin's own hierarchy: the admin screens use your WordPress language by default, with an optional backend override (Settings → Backend language). Business/document language (currency, VAT, invoice text) stays a separate company setting. Per-user frontend language follows next.

= 1.4.21 =

* Make license validation resilient: a transient "service unavailable" no longer disables Pro or overwrites a previously active license; the offline grace period now applies in all environments.

= 1.4.20 =

* Integrate the signed NimblePlugins license client with the unified license endpoint.
* Comply with WordPress.org plugin-name guidelines (the plugin name is now "Lead to Cash").
* Prefix an uninstall-scope global variable.

= 1.4.18 =

* Refine dashboard View all navigation into a consistent text-link component in dark and light mode.
* Remove the oversized/filled button appearance while preserving keyboard focus and navigation behaviour.

= 1.4.17 =

* Unify every Lead to Cash WordPress backend page in the same full-width NimblePlugins app shell.
* Make Overview, Users, License and Pro admin sections use the same content width from top to bottom.
* Remove the duplicate unbranded Overview header and use a standard WordPress Dashicon in the admin menu.
* No workflow, authentication, license, permissions or integration logic changed.

= 1.4.16 =

* Apply the NimblePlugins admin design system across every Lead to Cash WordPress backend screen.
* Brand the Lead to Cash WordPress admin menu icon and active menu state.
* No workflow, user, license or integration logic changed.

= 1.4.15 =

* WordPress.org submission preparation.
* Shorten the public readme and move historical release notes to `changelog.txt`.
* Document optional Pro-license validation and its data transfer.
* Use a product-specific Plugin URI.
* Extend explicit opt-in uninstall cleanup.

Older release notes are available in `changelog.txt`.
