Dodawanie faktury przez webapi [.net core]

0

Mam prosty model jaki chcialbym przekazywac w requescie do api

public class Faktura
{ 
  public Kontrahent Kontrahent { get; set; }
  public Adres AdresKontrahenta{get;set;}
  public IEnumerable<PozycjaFaktury> PozycjeFaktury{get;set;}
}

public class PozycjeFaktury
{
  public int PozycjaLp { get; set; }
  public string Nazwa { get; set; }
  public int NumerTowaru { get; set; }
  public decimal Ilosc { get; set; }
}

w kontrolerze api mialbym

[Route("[controller]")]
[ApiController]public class FakturyController
{
  // ....
  [HttpPost]
  public Faktura DodajFakture([FromBody]Faktura faktura)
  {
     //...
  }
}

i teraz pytania:

  1. czy tak powinno wyglądać dodawanie faktury z pozycjami przez api?
  2. w jaki sposob powinien wygladac model faktury ktory uzytkownik bedzie przekazywał do api?
  3. w jaki sposob autonumerować pozycje faktury (właściwość PozycjaLp)?
  4. w bazie pozycja faktury ma kolumne z Id faktury. W jaki sposob przypisać to Id skoro nada sie ono dopiero po wstawieniu faktury do bazy?
  5. czy obiekt Faktury przed dodaniem powinien zostac utworzony na serwerze, nastepnie odeslany do usera z pustymi danymi i dopiero user uzupełnia dane i odsyła do api?
1

Pchasz się na głęboką wodę z tym ;-) Autonumerowanie pozycji powinieneś mieć zrobione po stronie klienta. W momencie kiedy użytkownik dodaje nową pozycję zwiększa się LP o jeden. Nie wiem co masz po stronie klienta. Jeśli chcesz mieć "brzydko" to:

for(int i = 0; i > faktura.PozycjeFaktury.Count(); i++)
{
   int pozycjaLp = i + 1;
}

PS.
Rozumiem, że ten projekt jest dla zabawy/nauki? Masz pewne braki z "realistycznego" podejścia do sprawy;

  1. Na fakturze/dokumencie nie może być tylko jeden kontrahent - jest jeszcze odbiorca i płatnik, którzy mogą być różni
  2. Nie masz formy płatności
  3. Nie masz numeru dokumentu np: FV/123/05/2020 - Typ/Numer/Miesiac/Rok

A to jest tylko szczyt góry lodowej ;-)

0
AdamWox napisał(a):

Pchasz się na głęboką wodę z tym ;-) Autonumerowanie pozycji powinieneś mieć zrobione po stronie klienta. W momencie kiedy użytkownik dodaje nową pozycję zwiększa się LP o jeden.

No ale jak po stronie klienta? Numerowanie to backend jak dla bo inaczej jest ryzyko powstawiania głupot. Pomijając już, że można mieć wiele klientów i co każdy inaczej będzie to robił?

1

@szydlak: Ale to nie jest unikatowy numer, tylko numer pozycji na dokumencie. Jeśli ktoś doda towar A, a później towar B, a te dane do bazy wpadną odwrotnie to to będzie dobrze, czy źle? To nie jest ID, to jest tylko numer prawda? LP - liczba porządkowa...

0

To ja wiem, że nie autonumerowanie. W jakiej kolejności dostanie Api tak numerujesz na backendzie. Gdzie tu jest problem?

1

To jest numerowanie pozycji, czyli numery mają być unikalne w kontekście dokumentu tylko. Spokojnie można to zrobić na kliencie w momencie dodawania pozycji

0

Dobrze temat lp mamy wyjaśniony :) Jest ktoś w stanie pomóc mi z pozostałymi pytaniami?

0

Ad 1.
Zależy. Możesz stworzyć kompletny obiekt po stronie klienta: Faktura, pozycje i płatności itp itd i wysłać taki obiekt JSONem do serwera. Pewnie musisz mieć też możliwość dodawania pozycji do istniejącej faktury, zmiany w nagłówku faktury itp.
Ad. 2 Zupełnie nie wiem o co pytasz. Na pewno po stronie serwera powinni ens zrobić walidację, wygenerować numer faktury na podstawie wzorca itp itd.
Ad 5. Nie, nie powinien.

0
Tomek Pycia napisał(a):

Ad. 2 Zupełnie nie wiem o co pytasz. Na pewno po stronie serwera powinni ens zrobić walidację, wygenerować numer faktury na podstawie wzorca itp itd.

Chodzi mi o model ktory jest przekazywany do metody kontrolera w parametrze [FromBody]

public Faktura DodajFakture([FromBody]Faktura faktura)

czy np klasa faktura powinna miec jakies metody walidujace czy to ma być zwykłe DTO?
czy walidowanie obiektu Faktura który przyszedł do metody kontrolera moze być zrobione w tej metodzie kontrolera?

1
kalimata napisał(a):

czy np klasa faktura powinna miec jakies metody walidujace czy to ma być zwykłe DTO?
czy walidowanie obiektu Faktura który przyszedł do metody kontrolera moze być zrobione w tej metodzie kontrolera?

Walidacja to odrębna odpowiedzialność. Przygotuj odrębną klasę z walidatorem, a najlepiej skorzystaj z FluentValidation i przestań się tym przejmować, tylko podepnij walidację jako middleware.

0
kalimata napisał(a):
Tomek Pycia napisał(a):

Ad. 2 Zupełnie nie wiem o co pytasz. Na pewno po stronie serwera powinni ens zrobić walidację, wygenerować numer faktury na podstawie wzorca itp itd.

Chodzi mi o model ktory jest przekazywany do metody kontrolera w parametrze [FromBody]

public Faktura DodajFakture([FromBody]Faktura faktura)

czy np klasa faktura powinna miec jakies metody walidujace czy to ma być zwykłe DTO?
czy walidowanie obiektu Faktura który przyszedł do metody kontrolera moze być zrobione w tej metodzie kontrolera?

Ja tam bym przyjrzał się jak to jest zrobione w dotnet new sln-ca (Clean Architecture) i szedł w tą stronę

Pozdrawiam,

mr-owl

1 użytkowników online, w tym zalogowanych: 0, gości: 1