Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The result is mapped into the Bright-facing BrightInvoice model.


SonWin is a BALANCE-FORWARD ledger: payments are not matched per-invoice.
The "remaining amount" and the payment status are both derived from the running account balance (løbende saldo) as of each invoice line, computed in SQL.


DEV info 

When running on local machine bypassing the Swagger UI:

Visibility/filtering is configuration-driven. Each filter toggle is resolved as "local appsettings config wins, otherwise defer to the company's BCHEC flag" (Sonlinc.BCHED, cached in memory).

The SQL is assembled from pure-SQL fragments so only the active clauses appear in the executed statement.

...

The endpoint returns a JSON array of invoice objects. Each object contains a nested `Info` array of supplementary key/value (or title/value) entries.

Code Block
[
    {
      "Id":          <value>,    // Composite: $"{InstNr}-{ForbnNr}-{UdebNr}-{Id}" = AKOND.INSTNR-FORBNR-UDEBNR-REGNINGNR
      "ServiceId":   <value>,    // HARDCODED NULL. DataPrevious: AUDEBFORS.FORSYNINGSART (+AFREGNTYPE) via ForsyningsartMapper.
  El-only join => in practice "consumption_trade" or null (a supply type, not an identifier — omitted; see limitations).

      "InvoiceDate": <value>,    // Data: AKOND.BILAGSDATO  (DateTimeOffset, UTC offset 0) | null
      "DueDate":     <value>,    // Data: AKOND.FORFDATO    (DateTimeOffset, UTC offset 0) | null
      "Period":      <value>,    // Derived from StartDate/EndDate month-span: "1month"/"2month"/"3month"/"6month"/"12month"
  (defaults to "1month" when dates missing or other span)
      "StartDate":   <value>,    // Data: AKOND.DATOFRA     (DateTimeOffset, UTC offset 0) | null
      "EndDate":     <value>,    // Data: AKOND.DATOTIL     (DateTimeOffset, UTC offset 0) | null
      "RemainingAmount": <value>,// Data: running account saldo (SUM of AKOND.KR up to this line) - NOT a per-invoice remaining
  figure.
      "TotalAmount": <value>,    // Data: AKOND.KR (decimal) | null
      "InvoiceStatus": <value>,  // Derived (see status logic below): one of cancelled / credited / paid / overdue / unpaid
      "InvoiceType": <value>,    // Derived: "pdf" when a rendered PDF (non-empty BDOC.PAYLOAD.PAYLOAD with matching MIMETYPE) exists,
  else "missing"

     
     // Flat supplementary list; mostly DUPLICATES the structured fields above, as strings/dates.
      "Info": [           // Every entry carries BOTH Key AND Title (EGCommon emits null for whichever is unset).
      "Info": [
        { "Key": "invoiceNumber",   "Title": "Invoice number",   "Value": <Id> },         // Data: AKOND.REGNINGNR (string)
        { "Key": "invoiceDate",     "Title": "Invoice date",     "Value": <InvoiceDate> },// Data: AKOND.BILAGSDATO
  (DateTimeOffset|null)
        { "Key": "dueDate",         "Title": "Due date",         "Value": <DueDate> },    // Data: AKOND.FORFDATO
  (DateTimeOffset|null)
        { "KeyKey": "totalAmount",     "Title": "totalAmountTotal amount",     "Value": <TotalAmount> },// Data: AKOND.KR .ToString() | null
        { "Key": "period",          "ValueTitle": <Period> }"Period",     // Derived period string
      { "Key": "remainingAmount", "Value": <Saldo><Period> },      // Derived Data:period runningstring
 saldo .ToString() | null
    {  {"Key": "remainingAmount", "KeyTitle": "statusRemaining amount", "Value": <Saldo> },      // "Value"Data: running <InvoiceStatus> },// Derived status string
saldo .ToString() |
  null
        { "Key": "description",     "Value": <Tekst> },      // Data: AKOND.TEKST
status",         { "Title": "TekstStatus",           "Value": <Tekst><InvoiceStatus> },// Derived status string
      // Data: AKOND.TEKST (DUPLICATE of description,
  { "Key": "description",     "Title": "Description",      "Value": <Tekst> },      // Data: AKOND.TEKST
        { "Key": "tekst",           "Title": "Tekst",            "Value": <Tekst>  }       // Data: AKOND.TEKST sent(duplicate viaof
 Title (untranslateddescription)
 not Key)
      // NOTE: "ocr" key is NOT emitted (source field not yet identified - TODO)
      ]
    }
  ]

Field origin detail (top-level BrightInvoice): 

...