This document tracks which DK Plus Swagger operations are implemented by the DevOp.DK.Plus client and which are exposed by the devop-dk CLI.
Coverage was checked against the published v1 and v2 Swagger documents and the sanitized snapshots under openapi/. At the time of this review, the live documents and repository snapshots contain the same paths: 306 v1 operations and 38 v2 operations.
| Status | Meaning |
|---|---|
| Full | Every Swagger operation in that API area is represented by the client. |
| Partial | Some operations are implemented; the remaining operations are listed at a capability level. |
| Not implemented | No typed client method currently calls an operation in that API area. |
| CLI | Reads and selected mutations are exposed. Ordinary create/update commands run directly; destructive and safety-sensitive operations require explicit --yes confirmation. Library support can still be broader than CLI support. |
The operation counts describe HTTP operations, not C# method overloads. Public consumers use DevOp-owned models. Swagger-generated transport types remain internal. IExternalErpClient returns portable models; IDkPlusClient returns the sealed DkPlus<Entity> subtype from every read member (see Models and writes). Generic table rows are dynamic by definition and are returned as read-only dictionaries; fixed table metadata uses TableChangeSummary and TableDeletedRecord.
| Version | Endpoint family | Operations | Client surface | CLI surface | What it does |
|---|---|---|---|---|---|
| v1 | /api/v1/company... |
6 | Company; Customer.PublishToBankAsync convenience operation |
company show/status/licence/connection/sync/action |
Reads company settings, status, licence, and connection state; starts explicitly confirmed synchronization; performs explicitly confirmed dkERP actions. |
| v1 | /api/v1/customer... |
9 | Customer.Query/GetAsync/SearchAsync/GetInvoicesAsync/DeleteAsync/UploadAttachmentAsync (returning DkPlusCustomer, DkPlusSalesInvoice); Customer.CreateAsync(CustomerCreateRequest); Customer.UpdateAsync(number, CustomerUpdateRequest); Customer.Transactions |
customer list/get/create/update/delete; customer transaction list/page/list-for |
Reads the complete DkPlusCustomer response graph, including contacts, receivers, memos, properties, changes, attachments, credit, invoice-delivery and electronic-invoice settings; creates from a full CustomerCreateRequest and updates with a sparse, null-omitting CustomerUpdateRequest (neither carries contacts, receivers, or memos, which DK Plus ignores in the customer document); reads customer invoices, uploads attachments, and queries customers and transactions with optional field projections; Customer.Query() returns ICustomerQuery with the typed server-side filters name, salesperson, country, zipcode, paymentterm, paymentmode, email, blocked, novat, and deleted of GET /api/v1/Customer/page/{page}/{count} (the text filters and the group are sent lowercase, the country uppercase, and a name without * as *name*). |
| v1 | /api/v1/Customer/{customer}/Contact[/{contactId}] |
5 | Customer.Contact.GetAllAsync/GetAsync/DeleteAsync (returning CustomerContact); Customer.Contact.CreateAsync(customer, CustomerContactCreateRequest); Customer.Contact.UpdateAsync(customer, contactId, CustomerContactUpdateRequest) |
customer contact list/get/create/update/delete |
Lists, reads, creates, sparsely updates, and deletes the contacts of one customer. Create and update return the contact DK Plus answers with; a missing contact reads as null. Delete requires --yes in the CLI. |
| v1 | /api/v1/Customer/{customer}/Reciver[/{reciverId}] (reads), /api/v1/Customer/{customer}/reciver[/{reciverId}] (writes), GET /api/v1/Reciver/{number}[/customer] |
7 | Customer.Receiver.GetAllAsync/GetAsync/GetByNumberAsync/DeleteAsync (returning CustomerReceiver); Customer.Receiver.GetCustomersAsync (returning DkPlusCustomer); Customer.Receiver.CreateAsync(customer, CustomerReceiverCreateRequest); Customer.Receiver.UpdateAsync(customer, receiverId, CustomerReceiverUpdateRequest) |
customer receiver list/get/create/update/delete |
Lists, reads, creates, sparsely updates, and deletes the item receivers of one customer; looks up the receivers with a receiver number across customers, and the customers that use it (library only). Create returns the receiver DK Plus answers with; update reads no response body (Swagger declares none); a missing receiver reads as null. Delete requires --yes in the CLI. |
| v1 | GET /api/v1/customergroup |
1 | Customer.Group.Query |
customer group list |
Reads customer-group reference data with optional modification and field-projection filters. |
| v1 | GET /api/v1/search/customer |
1 | Customer.SearchAsync |
customer search |
Searches customers using text, maximum-result, and optional field filters. |
| v1 | GET /api/v1/general/currency |
1 | Currency.Query |
currency list |
Reads currency reference data. |
| v1 | GET /api/v1/general/dimension[2|3]/{page}/{size} |
3 | Dimension.Query/GetAsync |
dimension list |
Reads the three DK dimension levels with incremental filters. |
| v1 | /api/v1/general/employee... |
5 | Employee.Query/GetAsync/GetActiveAsync; Project.WorkEntry |
employee list, employee get |
Reads employees with optional field projection and creates, updates, or deletes employee work-journal entries. |
| v1 | /api/v1/mypages... |
5 | MyPages |
— | Reads and manages customer portal invitations and user access. |
| v1 | GET /api/v1/nation/entry/{id} |
1 | Nation.GetAsync |
nation get |
Looks up an Icelandic national-registry entry and maps its nested address to the shared Address model. |
| v1 | GET /api/v1/permission |
1 | Permission.GetCurrentAsync |
permission show |
Reads the current token's module state and operation-level access; human output lists each configured capability and access level. |
| v1 | /api/v1/product... |
6 | Product.Query/GetAsync/DeleteAsync/GetPricesAsync (returning DkPlusProduct); Product.CreateAsync(ProductCreateRequest); Product.UpdateAsync(itemCode, ProductUpdateRequest) |
product list/get/price/create/update/delete |
Pages and reads the complete typed product graph with optional field projection and, through IProductQuery, the typed server-side filters aliasItemCode, inactive, onweb, and deleted of GET /api/v1/Product/page/{page}/{count} (the group is sent lowercase), performs product CRUD with a full create request and sparse null-omitting updates keyed by the item code, and calculates prices and discounts. Product queries warn and skip source rows without an item code while preserving paging. Delete retains explicit confirmation. |
| v1 | GET /api/v1/productgroup, GET /api/v1/Product/properties/category, GET /api/v1/product/units/{page}/{count} |
3 | Product.Group/Category/Unit.Query |
product group/category/unit list |
Reads product groups and categories with modification filters and pages product units. Product-group queries support field projection. |
| v1 | /api/v1/product/register... |
3 | Inventory |
inventory journal/transfer/count |
Creates explicitly confirmed inventory journals, warehouse transfers, and physical counts from validated models. |
| v1 | /api/v1/project..., /api/v1/projects..., /api/v1/projectrequest... |
26 | Project (CreateAsync(ProjectCreateRequest), UpdateAsync(number, ProjectUpdateRequest)); nested Phase, Task, WorkRequest, Transaction, Journal, and WorkEntry |
project plus nested phase, phase link, task, work-request, transaction, transaction memo, and work-entry commands |
Full project endpoint coverage and complete typed DkPlusProject responses, with organized schedule, requirements, billing settings, and linked phase/task references. The /api/v1/projectrequest routes are exposed as Project.WorkRequest (WorkRequest, WorkRequestCreateRequest, WorkRequestUpdateRequest). Project, phase, and task updates are sparse and null-omitting. Destructive deletes retain confirmation. |
| v1 | DELETE /api/v1/general/table/pjjob?key=Number or RecordId&value=... (generic table, used for project delete) |
0 (the table DELETE is counted under the generic-table row) | Project.DeleteAsync(number), Project.DeleteByRecordIdAsync(recordId) |
project delete [number] [--record-id <int>] --yes; Remove-Project |
DK Plus has no project DELETE endpoint, so project delete sends the generic table delete on the dkERP project table pjjob with key Number or RecordId (the record id in invariant digits). The table name and both key names were confirmed by the maintainer. It bypasses DK Plus project validation, is never retried, and what dkERP does with a project that has transactions, phases, or work requests is not verified live. The CLI requires --yes and exactly one of the number or --record-id; Remove-Project is ConfirmImpact High and binds -Number from the pipeline (Get-Project -Number P-1 | Remove-Project) or takes -RecordId (alias -Id). |
| v1 | /api/v1/generalledger..., POST /api/v1/generalLedger/journal |
8 | GeneralLedger.Account/Transaction/Journal/TaxGroup; Account.CreateAsync(GeneralLedgerAccountCreateRequest); TaxGroup.CreateAsync(GeneralLedgerTaxGroupCreateRequest) |
general-ledger account/transaction/journal/tax-group |
Reads accounts and tax groups and creates them from dedicated create requests that never send the read-only Modified (DK Plus has no update endpoint for either), queries account/global transactions, and creates journals. |
| v1 | /api/v1/general/payment/mode..., /api/v1/general/payment/term..., GET /api/v1/sales/payment/type... |
6 | Payment.Mode/Term/Type.Query/GetAsync |
payment mode/term/type list/get |
Reads payment modes, terms, and types with optional modification and field-projection filters and direct lookups. |
| v1 | /api/v1/sales/invoice... |
8 | Sales.Invoice.Query/GetAsync/GetPdfAsync/GetHtmlAsync/SendEmailAsync/DeleteAsync (returning DkPlusSalesInvoice); CreateAsync and CalculatePricesAsync take a SalesInvoiceCreateRequest |
sales invoice list/get/create/pdf/html/email |
Reads invoices with optional field projection and generated documents, sends explicitly confirmed invoice email, creates or deletes invoices, and calculates invoice prices. SalesPerson is optional: when it is null the member is not sent and DK Plus uses the API user's employee sales person. sales invoice create sends POST /api/v1/sales/invoice with ?post=true only for --post --yes. |
| v1 | /api/v1/sales/order/{number}/... |
3 | Sales.Order.GetPdfAsync/GetHtmlAsync/SendEmailAsync |
sales order pdf/html/email |
Downloads generated sales-order documents and sends explicitly confirmed sales-order email. |
| v1 | /api/v1/sales/quote/{number}/... |
3 | Sales.Quote.GetPdfAsync/GetHtmlAsync/SendEmailAsync |
sales quote pdf/html/email |
Downloads generated quote documents and sends explicitly confirmed quote email. |
| v1 | /api/v1/sales/person... |
6 | Sales.Person.Query/GetAsync/GetPageAsync (returning DkPlusSalesPerson); CreateAsync(SalesPersonCreateRequest); UpdateAsync(number, SalesPersonUpdateRequest); DeleteAsync |
sales person list/get/page/create/update/delete |
Covers both paging routes and salesperson CRUD; the former GetDetailsAsync was folded into GetAsync, which returns the complete DkPlusSalesPerson. Delete retains explicit confirmation. |
| v1 | /api/v1/general/table/{name}... |
8 | Table |
table records/record/fields/changes/deleted/create/update/delete |
Supports all generic-table reads and mutations; the CLI and the PowerShell module expose all 8 (create and update need no --yes, delete does; mutations are never retried; the update key semantics are unverified live). |
| v1 | /api/v1/Token..., /api/v1/token/report... |
10 | Token |
token list/get/create/update/delete/companies/employee; token report logs/pdf/email |
Covers token CRUD, company and employee lookup, request logs, PDF usage reports, and confirmed email delivery. Token creation uses request-scoped Basic authentication. |
| v1 | /api/v1/admin/webhook... |
6 | Webhook |
webhook list/get/template/create/update/delete/test |
Covers webhook reads and explicitly confirmed creation, replacement, deletion, and test delivery; CLI output redacts authorization values. |
| v1 | /api/v1/Vendor..., /api/v1/vendor/transaction... |
8 | Purchase.Vendor (also portable IExternalErpClient.Purchase.Vendor, ErpCapability.Vendors) |
purchase vendor list/get/page/search/create/update/transactions/transactions-for |
Covers complete typed DkPlusVendor reads with optional field projection, VendorCreateRequest creation, sparse null-omitting VendorUpdateRequest updates, and global and per-vendor transaction paging. |
| v1 | /api/v1/vendor/invoice... |
10 | Purchase.Invoice |
purchase invoice processed/get/attachment/create/my-approved/my-unapproved/approval/unprocessed/unprocessed-get/unprocessed-attachment |
Covers processed and unprocessed invoices, attachments (FileAttachment), creation from VendorInvoiceCreateRequest, and current-user approval workflows; CLI writes require confirmation. |
| v1 | /api/v1/productwarehouse... |
2 | Warehouse |
warehouse list/update-product |
Lists product warehouses and updates per-warehouse product settings from a ProductWarehouseSettingsRequest (no stock quantities); the CLI command runs without --yes. |
| v2 | GET /api/v2/project/journal/{page}/{size} |
1 | Project.Journal.GetAllAsync |
project journals |
Pages project work journals with employee and modification filters. |
| v2 | /api/v2/sales/order... |
10 | Sales.Order (SalesOrderCreateRequest/SalesOrderUpdateRequest, SalesDocumentLineRequest for lines; returns DkPlusSalesOrder) |
sales order list/get/create/update/delete, sales order lines create/update/delete |
Full sales-order head, line, attachment, invoice-conversion, field-projected query, and delete support. CreateAsync posts the head without Lines, then each line to {uid}/Line, then re-reads the document; a failed or canceled line deletes the new head unless the request supplied its number. Because DK Plus creates quote heads without a dkERP id (known DK issue), a quote create with lines stops after the head with InvalidOperationException naming the UId. A lines-only update skips the head PUT. UpdateAsync sends the head without Lines, then each request line as PUT {uid}/Line/{sequence} or POST {uid}/Line, with no deletes and no rollback. The CLI create sends the head only (a file with Lines is rejected) with AutoCreateCustomer=true unless --no-auto-create-customer is set. See Sales documents. |
| v2 | /api/v2/sales/quote... |
8 | Sales.Quote (SalesQuoteCreateRequest/SalesQuoteUpdateRequest; returns DkPlusSalesQuote) |
sales quote list/get/create/update/delete, sales quote lines create/update/delete |
Quote head and line CRUD plus field-projected paged and single reads. Customer-specific reads and attachment upload remain missing. CreateAsync posts the head without Lines, then each line to {uid}/Line, then re-reads the document; a failed or canceled line deletes the new head. UpdateAsync sends the head without Lines, then each request line as PUT {uid}/Line/{sequence} or POST {uid}/Line, with no deletes and no rollback. DeleteAsync uses the Swagger route DELETE /api/v2/sales/quote/api/v2/sales/quote/{uid} (the plain {uid} route answers HTTP 405 live; the doubled route is UNVERIFIED live). The CLI create sends the head only (a file with Lines is rejected) with AutoCreateCustomer=true unless --no-auto-create-customer is set. See Sales documents. |
| v2 | /api/v2/sales/recurring... |
8 | Sales.Recurring (RecurringSaleCreateRequest/RecurringSaleUpdateRequest; returns DkPlusRecurringSale) |
sales recurring list/get/create/update/delete, sales recurring lines create/update/delete |
Recurring-sale head and line CRUD plus field-projected paged and single reads. Customer-specific reads remain missing. CreateAsync posts the head without Lines, then each line to {uid}/Line, then re-reads the document; a failed or canceled line deletes the new head. UpdateAsync sends the head without Lines, then each request line as PUT {uid}/Line/{sequence} or POST {uid}/Line, with no deletes and no rollback. The CLI create sends the head only (a file with Lines is rejected) with AutoCreateCustomer=true unless --no-auto-create-customer is set. See Sales documents. |
| API area | Purpose | Library coverage | CLI | What remains |
|---|---|---|---|---|
| Company | Company information, status, licence, connection, sync, and direct actions | Full (6/6) | show, status, licence, connection, sync, action | Nothing. Sync and actions require explicit CLI confirmation. |
| Company Settings | Custom company settings CRUD | Not implemented (0/4) | — | Entire area. |
| Contact | Customer contact CRUD | Full (5/5) | contact list, get, create, update, delete (under customer) |
Nothing. |
| Currency | Currency lookup | Full (1/1) | list | Nothing. |
| Customer | Customers, receivers, cards, transactions, related documents, attachments, and groups | Partial (17/29) | list, get, create, update, delete; transaction list, page, list-for; group list; receiver list, get, create, update, delete | Cards, orders, quotes, projects, counts, phone lookup, and attachment reads; CLI commands for the receiver-number lookups. Embedded properties are sent with customer create and update; contacts, receivers, and memos are not, because DK Plus ignores them there (use the Contact area and Customer.Receiver; customer memos have no write endpoint). |
| Dimension | Dimension levels 1–3 | Full (3/3) | list | Nothing. |
| Election | Ballot reads and vote submission | Not implemented (0/2) | — | Entire area. |
| Employee | Employees, assignments, time clock, work, and work costs | Partial (5/12) | list, get | Employee writes, worker/supervisor projects, time-clock history, and work-cost operations. |
| General Ledger | Accounts, transactions, journals, and tax groups | Full (8/8) | account list/get/create/transaction list; transaction list; journal create; tax-group list/create | Nothing. |
| Lottery | Tickets, claims, cancellation, and transactions | Not implemented (0/5) | — | Entire area. |
| Member | Members, fees, funds, education, career, cards, and product availability | Not implemented (0/19) | — | Entire area. |
| MemberApplication | Member applications and attachments | Not implemented (0/8) | — | Entire area. |
| MyPages | Portal users and invitations | Partial (5/6) | — | Updating an existing user-access assignment. |
| Nation | National-registry lookup | Full (1/1) | get | Nothing. |
| Payment | Payment modes, terms, and types | Partial (6/7) | mode, term, and type list/get | Creating a sales payment type. |
| Payroll | Payslip reads | Not implemented (0/1) | — | Payslip paging. |
| Permission | Current-token permissions | Full (1/1) | show | Nothing. |
| Point of Sales | POS orders, documents, and email | Not implemented (0/9) | — | Entire area. |
| Product | Products, barcodes, attachments, prices, inventory metadata, units, and variations | Partial (9/34) | list, get, price, create, update, delete; group, category, and unit lists | Barcodes, attachments, transactions, refresh, vendor links, variations, and alternate searches. |
| Product Inventory | Inventory journals, transfers, and inventorying | Full (3/3) | journal, transfer, count | Nothing. All CLI operations require explicit confirmation. |
| Production | Recipes and recipe lines | Not implemented (0/7) | — | Entire area. |
| Project | Projects, phases, tasks, work requests, transactions, links, and memos | Full (26/26) | project reads/writes plus nested phase, link, task, work-request, transaction, memo, and work-entry commands; project delete through the generic table pjjob |
Nothing. Destructive deletes require explicit CLI confirmation. DK Plus has no project DELETE endpoint; project delete uses the table endpoint (the key names Number and RecordId are confirmed by the maintainer; the effect on projects with dependents is unverified live). |
| Purchase | v1 purchase orders and lines | Not implemented (0/9) | — | Entire area. |
| Quote | v1 sales quote operations | Partial (3/5) | sales quote pdf/html/email |
v1 single read and create. Head/line CRUD and paging are also available through v2. |
| Sales Invoice | Invoice reads, documents, email, reversal, refresh, payments, and writes | Partial (8/18) | sales invoice list/get/pdf/html/email |
Reference/date/POS reads, reversal, refresh, payment plans, discount definitions, and bulk create. Email requires explicit CLI confirmation. |
| SalesOrder | v1 sales orders and generated documents | Partial (3/9) | sales order pdf/html/email |
v1 create, reads, update, and delete; head/line CRUD and paging are already available through v2. |
| SalesPerson | Sales-person CRUD and paging | Full (6/6) | sales person list/get/page/create/update/delete |
Nothing. Delete requires explicit CLI confirmation. |
| Search | Extended, product, and customer search | Partial (1/3) | customer search | Extended and product search. |
| SimpleInvoice | Simplified invoice read/create | Not implemented (0/2) | — | Entire area. |
| Subscription | v1 recurring invoices | Not implemented (0/2) | — | Intentionally superseded by partial v2 recurring-sales support. |
| Table | Dynamic table records, fields, changes, deleted records, and CRUD | Full (8/8) | table records/record/fields/changes/deleted/create/update/delete |
Nothing. Delete requires --yes; the update key semantics are unverified live. |
| TimeClock | Clock configuration, employee/project lookup, registration, and stamping | Not implemented (0/11) | — | Entire area. |
| Token | Token CRUD, companies, identity, logs, and usage reports | Full (10/10) | list, get, create, update, delete, companies, employee; report logs, pdf, email | Nothing. Creation prompts for the Basic-authentication password without echoing it; delete and report email require confirmation. |
| Vendor | Vendors and vendor transactions | Full (8/8) | purchase vendor list/get/page/search/create/update/transactions/transactions-for |
Nothing. |
| Vendor Invoice | Processed/unprocessed vendor invoices, attachments, and approval | Full (10/10) | purchase invoice processed/get/attachment/create/my-approved/my-unapproved/approval/unprocessed/unprocessed-get/unprocessed-attachment |
Nothing. Creation and approval updates require explicit confirmation. |
| Warehouse | Warehouses and product-warehouse updates | Full (2/2) | list, update-product | Nothing. Product-setting updates run without --yes. |
| WebHooks | Webhook CRUD and testing | Full (6/6) | list, get, template, create, update, delete, test | Nothing. Mutations and test delivery require explicit CLI confirmation. |
The Swagger groups barcode endpoints under Product, receiver endpoints under Customer, project phases/tasks under Project, and vendor transactions under Vendor; their operation counts are included in those rows.
Operation coverage does not imply that every response field is strongly typed. See Models and writes for the audited v1 entity-field matrix.
| API area | Purpose | Library coverage | CLI | What remains |
|---|---|---|---|---|
| Project Journal | Project work-journal paging | Full (1/1) | project journals |
Nothing. |
| Purchase Journal | Purchase-journal paging | Not implemented (0/1) | — | Entire area. |
| Purchase Order | Purchase-order head and line CRUD | Not implemented (0/7) | — | Entire area. |
| Sales Orders | Sales-order reads, head/line mutations, attachment, and invoice conversion | Full (10/10) | sales order list/get/create/update/delete, sales order lines create/update/delete, plus v1 pdf/html/email |
Attachment upload and send-to-invoice remain library-only. The CLI create sends the head only. |
| Sales Quotes | Quote reads and head/line mutations | Partial (8/10) | sales quote list/get/create/update/delete, sales quote lines create/update/delete, plus v1 pdf/html/email |
Read by customer and attachment upload. |
| Sales Recurring | Recurring-sale reads and head/line mutations | Partial (8/9) | sales recurring list/get/create/update/delete, sales recurring lines create/update/delete |
Read by customer. |
When Swagger changes:
tools/update-openapi.sh.tools/validate-package.sh from the stable tagged revision when preparing a package release.This matrix documents implemented calls, not live production proof. Operations requiring credentials or mutations must be verified separately with explicitly approved test data and environments.