dbojdo / wFirma

wFirma SDK
MIT License
14 stars 15 forks source link

Custom fields #20

Open mgralikowski opened 2 years ago

mgralikowski commented 2 years ago

Pomyślałem, że warto by zapisać jakiś identyfikator z systemu po stronie wFirmy. Domyślnie encja kontrahenta nie posiada żadnego przydatnego pola, co najwyżej można bawić się w notatki więc pomyślałem o customowych polach, które od pewnego czasu są dostępne.

obraz

Niestety nie są one przetwarzane. W ostatecznym obiekcie ich nie ma. Są natomiast w response:

obraz

Jest to dla mnie dość oczywiste, ponieważ ten field ma dynamiczną nazwę. Nie znam narzędzia JMS, na którym deseralizacja się opiera, ale osobiście widziałbym 2 podejścia.

1) Na zasadzie pattern - wyszukujemy na końcu field_value* i deserializujemy je jako kolejne atrybuty o takich specyficznych nazwach bądź wrzucamy je do kolekcji jak np. customFields[123 => 'example'].

2) Podejście dynamiczne. Po prostu w jakiś sposób rozszerzamy dynamicznie klasę Contractor i każdy programista dodaje te pola we własnym zakresie ustalając ich nazwę i mapowanie.

    /**
     * @var string
     * @JMS\Type("string")
     * @JMS\SerializedName("field_value48848")
     * @JMS\XmlElement(cdata=false)
     * @JMS\Groups({"request", "response"})
     */
    private $myCustomField;
dbojdo commented 2 years ago

Nie znalazłem w dokumentacji API nic na ten temat. Przyglądnę się temu. Wolałbym raczej rozwiązanie "dynamiczne" - z definicji nie jest dobrze w swoim kodzie rozszerzać kod od third party. Czy dodatkowe pola mogą być tworzone dla każdego typu obiektu, czy tylko dla kontrahenta?

mgralikowski commented 2 years ago

Tzn third party to ciężko nazwać. Wiadomo, że jest to pole całkowicie dynamiczne i user-specific, i każdy klient będzie miał inne wartości, ale zasada działania tych pól jest kwestią wewnętrzną API wfirmy. Jest to wyraźnie pattern field_value[ID] i wydaje się on być stały.

Nie widziałem przycisku "Dodaj pole" w innych miejscach. CRM to chyba jedyne sensowne miejsce choć w przypadku faktur też kiedyś szukałem pola, aby zaszyć jakiś ukryty identyfikator. Co ciekawe nie widzę różnicy, gdy pole jest tekstowe lub oznaczę je jako URL.

dbojdo commented 2 years ago

Udało mi się nakłonić serializera do współpracy. Wszystko ok przy odczytywaniu pól - działa fajnie. Ale wygląda na to, że nie da się z poziomu API tych pól modyfikować. Udało mi się utworzyć dokładnie takiego samego XML'a jak przysyłają, ale API zwraca błąd "INPUT ERROR". W sumie to jest nieudokumentowany feature, więc jak zależy Ci na tym, to możesz ich pocisnąć czy w ogóle to obsługują. Jakby co, to zmiany można podglądnąć w PR https://github.com/dbojdo/wFirma/pull/32

mgralikowski commented 2 years ago

Po stronie API obecnie nie ma możliwości utworzenia oraz przekazania danych przez API do dodatkowego pola kontrahenta w systemie. Nie jest możliwa zmiana jego wartości, ponieważ pole jest używane wyłącznie do odczytu. Dziękujemy jednak za sugestię udostępnienia danych pól również do zapisu. Pana pomysł zostanie przekazany do odpowiedniego działu w celu analizy i ewentualnego wdrożenia takiej możliwości w przyszłości.

Jeżeli sam odczyt wartości, bez zapisu nie sprzecza się z ideą biblioteki to bym zostawił. Może się to komuś przydać np. może sobie jakieś flagi ustawić przez panel manualnie i wykorzystać je przy synchronizacji.