Přeskočit obsah

Majetek — Articles

Správa hmotného majetku (artikly). Obsahuje CRUD operace, vyhledávání podle různých kritérií a správu lokací majetku.

Base path: /api/articles


Endpointy

POST /api/articles — Vytvoření majetku

POST /api/articles
Content-Type: application/json
Authorization: Bearer <token>

Request body — objekt Article:

{
  "code": "NTB-001",
  "name": "Notebook Dell XPS 15",
  "categoryId": 1,
  "typeId": 2,
  "stateId": 1,
  "price": 35000.00,
  "serialNumber": "SN123456",
  "rfId": null,
  "userId": 5,
  "responsibleUserId": 3,
  "isDisposal": false
}

Response 201 Created — vytvořený Article s přiděleným OID.


PUT /api/articles/{id} — Aktualizace majetku

PUT /api/articles/42
Content-Type: application/json

Request body — stejná struktura jako POST, OID musí odpovídat {id}.

Response: 200 OK | 400 Bad Request (neshodná ID) | 404 Not Found


GET /api/articles — Seznam všech majetků

GET /api/articles
Authorization: Bearer <token>

Response 200 OK — pole objektů Article.

Výkon

Endpoint vrací kompletní seznam. Pro velké databáze zvažte filtrované endpointy níže.


GET /api/articles/{id} — Detail majetku

GET /api/articles/42

Response 200 OK:

{
  "oid": 42,
  "code": "NTB-001",
  "name": "Notebook Dell XPS 15",
  "category": { "oid": 1, "name": "Výpočetní technika" },
  "type": { "oid": 2, "name": "Notebook" },
  "state": { "oid": 1, "name": "V provozu" },
  "price": 35000.00,
  "serialNumber": "SN123456",
  "rfId": null,
  "userId": 5,
  "responsibleUserId": 3,
  "isDisposal": false,
  "disposalDT": null
}

Response 404 pokud majetek neexistuje.


GET /api/articles/getbycode — Vyhledání dle kódu

GET /api/articles/getbycode?code=NTB-001

Vrátí majetek s přesně odpovídajícím kódem.


GET /api/articles/{id}/locations — Lokace majetku

GET /api/articles/42/locations

Response 200 OK — seznam ArticleLocation objektů:

[
  {
    "oid": 10,
    "articleId": 42,
    "locationId": 5,
    "location": { "oid": 5, "name": "Kancelář 201", "code": "K201" },
    "quantity": 1
  }
]

PWA endpointy

Endpointy volané z Eva.Mobile.Pwa (a sdíleně z Eva.Mobile MAUI), vracející data pro přihlášeného uživatele.

GET /api/articles/my-assets/{userId}

Majetek, kde je uživatel evidován jako Přiřazená nebo Odpovědná osoba.

GET /api/articles/my-stats/{userId}

Souhrnné statistiky pro domovskou stránku PWA — počet a hodnota přiřazeného majetku, počet otevřených převodek a čekajících vyřazení, v jednom DB dotazu.

{
  "assignedCount": 12,
  "assignedTotal": 285000.00,
  "openTransfers": 2,
  "pendingDisposals": 1
}

GET /api/articles/my-transfers/{userId}

Otevřené převodky, které uživatel vytvořil a které ještě nejsou potvrzené ani zamítnuté (!IsConfirmed && !IsRejected && !Deleted). Vrací název, datum vytvoření a cílové umístění.

GET /api/articles/my-disposals/{userId}

Návrhy na vyřazení majetku vytvořené uživatelem, čekající na schválení (!IsDisposal). Vrací název a kód artiklu, důvod vyřazení a datum návrhu.

POST /api/articles/pwa-request — Návrh nového majetku

Uloží nový Article bez inventárního kódu (Code), se stavem „Navrženo" (globální stav, TenantID == null) — nově navržený majetek tak automaticky vstupuje do schvalovacího workflow.

Request body:

{
  "name": "Monitor Dell 27\"",
  "note": "Zakoupeno z osobního rozpočtu oddělení",
  "serialNo": "SN998877",
  "articleCategoryID": 3,
  "articleTypeID": 8,
  "price": 6500.00,
  "currencyTypeID": 1,
  "invoiceNo": "F2026-00123",
  "dtBuy": "2026-08-01",
  "userID": 12
}

serialNo (od v1.0.43) — volitelné sériové číslo majetku, ukládá se do Article.SerialNo.

Endpoint respektuje licenční limit MaxAssets — po dosažení limitu vrací 403 Forbidden.

Response: 201 Created — { "oid": 123 }


Filtrované vyhledávání

Všechny find* endpointy přijímají parametr filterOp (viz Filtrační operátory).

GET /api/articles/findById

GET /api/articles/findById?id=42&filterOp=Equals

GET /api/articles/findByCode

GET /api/articles/findByCode?code=NTB&filterOp=StartsWith

GET /api/articles/findBySerialNo

GET /api/articles/findBySerialNo?SerialNo=SN123&filterOp=Contains

GET /api/articles/findByRFID

GET /api/articles/findByRFID?RfId=E200123456789&filterOp=Equals

GET /api/articles/findByName

GET /api/articles/findByName?name=notebook&filterOp=Contains

Datový model Article

Pole Typ Popis
OID long Primární klíč
Code string Inventární číslo / kód
Name string Název majetku
CategoryId long FK → ArticleCategory
TypeId long FK → ArticleType
StateId long FK → ArticleState
Price decimal Pořizovací cena
SerialNumber string? Výrobní číslo
RfId string? RFID tag
UserId long? FK → User (přiřazený uživatel)
ResponsibleUserId long? FK → User (odpovědná osoba)
IsDisposal bool Příznak navržení k vyřazení
DisposalDT DateTime? Datum vyřazení
DisposalMethodId long? FK → ArticleDisposalMethod
DisposalReasonId long? FK → ArticleDisposalReason
Deleted bool Soft delete
CreatedDT / ModifiedDT DateTime Audit timestamps
CreatedBy / ModifiedBy string Audit uživatel