Rozszerzalność zarządzania interfejsem

Omówiona do tej pory rozszerzalność interfejsu dotyczy tylko wewnętrznych kontrolek POS. W przypadku zaistnienia potrzeby dodania nowej kontrolki, którą będziemy chcieli zarządzać możemy skorzystać z mechanizmu rozszerzalności zarządzania interfejsem. Mechanizm ten pozwala na rejestrowanie nowych typów kontrolek i określanie jakie jej właściwości będą zarządzalne. Oprócz tego możliwe jest również dodawanie zarządzania do właściwości już istniejących kontrolek oraz ukrywania zarządzania wskazanych właściwości.

Ukrywanie właściwości do edycji

Ukrycie właściwości skutkuje usunięciem jej pozycji z zarządzania interfejsem. Użytkownik mający dostęp do zarządzania interfejsem nie będzie mógł zmienić jej wartości. Kontrolka, której właściwość zostanie ukryta będzie miała ustawioną wartość na domyślną zdefiniowana w stylach. Jednakże, jeżeli domyślna wartość została zdefiniowana w pliku ModernUI.xaml, zostanie ona zignorowana (różnice pomiędzy definiowaniem wartości domyślnych opisane zostały w artykule Zarządzanie widokiem i jego elementami

Ukrywać możemy określone właściwości na konkretnej kontrolce unikalnie zidentyfikowanej za pomocą Layout Id. Metoda ukrywająca właściwości to DisablePropertiesForLayoutElement znajdująca się w klasie PropertiesManager. Parametry tej metody:

  • layoutId (string) – parametr będący identyfikatorem kontrolki, której właściwość chcemy ukryć.
  • properties (params DependencyProperty[]) – jeden lub więcej właściwości, które mają zostać ukryte dla danej kontrolki.

 

Przykład ukrycia właściwości Ikona (ImageKey) z kafla Nowy dokument (layout id NewSalesDocument):

PropertiesManager.Instance.DisablePropertiesForLayoutElement("NewSalesDocument", TileButton.ImageKeyProperty);

 

Uwaga. W powyższym przypadku zniknie ikona na kaflu Nowy document ponieważ domyślna wartość dla właściwości ImageKey została zdefiniowana w pliku ModernUI.xaml.

Przykład ukrycia właściwości Wysokość (Height) z przycisku Zatwierdź (AcceptButton) konfiguracji globalnej:

PropertiesManager.Instance.DisablePropertiesForLayoutElement("AcceptButton", FrameworkElement.HeightProperty);

 

Dodawanie nowych właściwości do edycji

W przypadku, gdy istniejąca kontrolka albo zupełnie nowa ma zdefiniowane własne właściwości, które będziemy chcieli, żeby były modyfikowalne w zarządzaniu interfejsem, należy je zarejestrować. Można to zrobić na dwa sposoby, w zależności od tego czy właściwość ma być widoczna tylko dla kontrolki w konkretnym miejscu lub też globalnie dla wszystkich wystąpień tej kontrolki.

W pierwszym przypadku (rejestracja widoczna tylko dla kontrolki we wskazanym miejscu) należy skorzystać z metody AddPropertiesForLayoutElement z klasy PropertiesManager. Parametry metody:

  • layoutId (string) – unikalny identyfikator kontrolki (Layout Id),
  • properties (params DependencyProperty[]) – właściwości kontrolki, które mają być zarządzalne

W drugim przypadku (rejestracja widoczna globalnie we wszystkich miejscach użycia kontrolki) należy skorzystać z metody RegisterControlProperties z klasy PropertiesManager. Parametry metody:

  • controlType (Type) – typ kontrolki,
  • properties (params DependencyProperty[]) – właściwości, które mają być widoczne dla kontrolki wskazanego typu
  • baseTypeProperties (Type) – typ kontrolki bazowej, z której zostaną pobrane zarejestrowane już wcześniej właściwości i użyte do rejestracji właściwości tej kontrolki

 

Obsługa atrybutów

Aplikacji POS obsługuje atrybuty jednowartościowe synchronizowane z systemu ERP. Typy wspieranych atrybutów to: tekst, liczba, słownik, wartość logiczna, lista, data. Aby dana klasa atrybutu została przesynchronizowana do stanowiska POS, w systemie ERP (Altum) należy oznaczyć tę klasę do podglądu i/lub edycji w sekcji Comarch POS (dostać się tam można poprzez zaznaczenie zakładki „Konfiguracja”, następnie „Atrybuty” i na końcu poprzez wybranie odpowiedniego atrybutu). Atrybuty mogę być prezentowane w postaci kolumn na liście (kontrolka datagrid) lub też w postaci kontrolek (generowanych w zależności od typu klasy atrybutu, np. dla klasy typu tekst będzie to TextBox, podczas gdy dla typu słownik będzie to ComboBox).

Dodanie nowej klasy atrybutu do istniejącego widoku w POS

Każdy widok w aplikacji POS, który wspiera atrybuty jest powiązany bezpośrednio z pewnym obiektem systemu ERP. Przykładowo, widok Lista kontrahentów prezentuje atrybuty na liście w postaci kolumn. Może pokazać atrybuty wraz z ich wartościami przypisanymi tylko do obiektu Kontrahent w systemie ERP. W przypadku widoku paragonu, lista (datagrid) prezentuje klasy atrybutów powiązane tylko z obiektem Element paragonu (PAR), natomiast atrybuty prezentowane w prawym dolnym rogu ekranu w postaci kontrolek powiązane są z obiektem Paragon (PAR).

Lista widoków wspierających atrybutu wraz z powiązanymi obiektami systemu ERP

Widok POS Element widoku Obiekt biznesowy systemu ERP
Dokument paragonu

(DocumentView)

Lista pozycji Element paragonu (PAR)
Dokument Paragon (PAR)
Podgląd dokumentu paragonu

(DocumentPreviewView)

Lista pozycji Element paragonu (PAR)
Dokument Paragon (PAR)
Atrybuty dokumentu paragonu (tryb szybkiej  sprzedaży)

(DocumentAttributesView)

Dokument Paragon (PAR)
Szczegóły pozycji dokumentu paragonu (tryb szybkiej  sprzedaży)

(DocumentItemPropertiesView)

Dokument Element paragonu (PAR)
Dokument faktury

(DocumentView)

Lista pozycji Element faktury sprzedaży (FS)
Dokument Faktura sprzedaży (FS)
Podgląd dokumentu faktury

(DocumentPreviewView)

Lista pozycji Element faktury sprzedaży (FS)
Dokument Faktura sprzedaży (FS)
Atrybuty dokumentu faktury (tryb szybkiej  sprzedaży)

(DocumentAttributesView)

Dokument Faktura sprzedaży (FS)
Szczegóły pozycji dokumentu faktury (tryb szybkiej  sprzedaży)

(DocumentItemPropertiesView)

Dokument Element faktury sprzedaży (FS)
Korekta ręczna paragonu

Korekta ręczna paragonu – tryb wymiany

(ManualExchangeView)

Lista pozycji Element ręcznej korekty ilościowej paragonu (KIPAR)
Dokument Ręczna korekta ilościowa paragonu (KIPAR)
Podgląd korekty ręcznej paragonu

(ManualCorrectionPreviewView)

Lista pozycji Element ręcznej korekty ilościowej paragonu (KIPAR)
Dokument Ręczna korekta ilościowa paragonu (KIPAR)
Korekta ręczna faktury

Korekta ręczna faktury – tryb wymiany

(ManualExchangeView)

Lista pozycji Element ręcznej korekty ilościowej faktury sprzedaży  (KIFS)
Dokument Ręczna korekta ilościowa faktury sprzedaży (KIFS)
Podgląd korekty ręcznej faktury

(ManualCorrectionPreviewView)

Lista pozycji Element ręcznej korekty ilościowej faktury sprzedaży (KIFS)
Dokument Ręczna korekta ilościowa faktury sprzedaży  (KIFS)
Korekta paragonu

(ExchangeView)

Lista pozycji Element korekty ilościowej paragonu
Dokument Korekta ilościowa paragonu
Podgląd korekty paragonu

(CorrectionPreviewView)

Lista pozycji Element korekty ilościowej paragonu
Dokument Korekta ilościowa paragonu
Korekta faktury

(ExchangeView)

Lista pozycji Element korekty ilościowej faktury sprzedaży (KIFS)
Dokument Korekta ilościowa faktury sprzedaży (KIFS)
Podgląd korekty faktury

(CorrectionPreviewView)

Lista pozycji Element korekty ilościowej faktury sprzedaży (KIFS)
Dokument Korekta ilościowa faktury sprzedaży (KIFS)
Dokument faktury zaliczkowej

(AdvanceInvoiceView)

Dokument Faktura zaliczkowa
Podgląd faktury zaliczkowej

(AdvanceInvoicePreviewView)

Dokument Faktura zaliczkowa
Korekta faktury zaliczkowej

(AdvanceInvoiceCorrectionView)

Dokument Korekta faktury zaliczkowej
Podgląd korekty faktury zaliczkowej

(AdvanceInvoiceCorrectionPreviewView)

Dokument Korekta faktury zaliczkowej
Dokument TAX FREE

(TaxFreeView)

Lista pozycji Element TAX FREE (TF)
Dokument TAX FREE (TF)
Podgląd TAX FREE

(TaxFreePreviewView)

Lista pozycji Element TAX FREE (TF)
Dokument TAX FREE (TF)
Dokumenty handlowe

(DocumentsListView)

Lista pozycji Paragon (PAR), Faktura sprzedaży (FS), Faktura zaliczkowa, Korekta ilościowa paragonu (KIPAR), Korekta ilościowa faktury sprzedaży (KIFS), Ręczna korekta ilościowa paragonu (KIPAR), Ręczna korekta ilościowa faktury sprzedaży (KIFS), Korekta faktury zaliczkowej, TAX FREE (TF)
Kontrahenci

(CustomesListView)

Lista pozycji Kontrahent
Dodaj/Edytuj kontrahenta

(CustomerView)

Dokument Kontrahent

 

Dodaj/Edytuj kontrahenta biznesowego

(BusinessCustomerView)

Dokument Kontrahent

 

Szczegóły kontrahenta

(CustomerDetailsView)

Dokument Kontrahent

 

Szczegóły kontrahenta biznesowego

(BusinessCustomerDetailsView)

Dokument Kontrahent

 

Nowe zamówienie

(SalesOrderView)

Lista pozycji Element zamówienia sprzedaży (ZS)
Dokument Zamówienie sprzedaży (ZS)
Podgląd zamówienia sprzedaży

(SalesOrderPreviewView)

Lista pozycji Element zamówienia sprzedaży (ZS)
Dokument Zamówienie sprzedaży (ZS)
Kompletacja

(SalesOrderPreparationView)

Lista pozycji Element zamówienia sprzedaży (ZS)
Nowa oferta

(SalesQuoteView)

Lista pozycji Element oferty sprzedaży (OS)
Dokument Oferta sprzedaży (OS)
Podgląd oferty sprzedaży

(SalesQuotePreviewView)

Lista pozycji Element oferty sprzedaży (OS)
Dokument Oferta sprzedaży (OS)
Zamówienia i oferty sprzedaży

(SalesOrdersListView)

Lista pozycji Zamówienie sprzedaży (ZS), Oferta sprzedaży (OS)
Reklamacja

(ComplaintView)

Lista pozycji Element reklamacji sprzedaży (RLS)
Dokument Reklamacja sprzedaży (RLS)
Reklamacje

(ComplaintsListView)

Lista pozycji Reklamacja sprzedaży (RLS)
Dokument kasowy (KP/KW)

(CashDocumentView)

Dokument Operacje kasowo/bankowe
Wpłata/wypłata z sejfu

(VaultInflowOutflowView)

Dokument Operacje kasowo/bankowe
Dokumenty kasowe

(CashDocumentsListView)

Lista pozycji Operacje kasowo/bankowe
Podgląd dokumentu wydania MM-

(WarehouseDocumentPreviewView)

Lista pozycji Element przesunięcia międzymagazynowego (MM-)
Dokument Przesunięcie międzymagazynowe (MM-)
Nowy dokument wydania

(NewWarehouseDocumentView)

Lista pozycji Element przesunięcia międzymagazynowego (MM-)
Dokument Przesunięcie międzymagazynowe (MM-)
Dokument wydania

(WarehouseDocumentView)

Lista pozycji Element przesunięcia międzymagazynowego (MM-)
Dokument Przesunięcie międzymagazynowe (MM-)
Dokument przyjęcia PRP

(ReceivingAndDeliveryReportView)

Dokument Protokół przyjęcia (PRP)
Dokumenty magazynowe

(WarehouseDocumentsListView)

Lista pozycji Przesunięcie międzymagazynowe (MM-), Protokół przyjęcia (PRP), Zamówienie zakupu (ZZ), Przyjęcie zewnętrzne (PZ)
Przyjęcie listu przewozowego

(DeliveryNoteView)

Dokument Przyjęcie listu przewozowego
Podgląd listu przewozowego

(DeliveryNotePreviewView)

Dokument Przyjęcie listu przewozowego
Przyjęcie dostawy MM-

(WarehouseDocumentsToReceiptListView)

Lista pozycji Przesunięcie międzymagazynowe – (MM-), Protokół przyjęcia (PRP), Zamówienie zakupu (ZZ), Przyjęcie zewnętrzne (PZ)
Przyjęcie zewnętrzne

(PurchaseOrderReceptionView)

Lista pozycji Element przyjęcia zewnętrznego (PZ)
Dokument Przyjęcie zewnętrzne (PZ)
Zamówienie zakupu

(PurchaseOrderView)

Lista pozycji Element zamówienia zakupu (ZZ)
Dokument Zamówienie zakupu (ZZ)
Korekty zasobów

(StockCorrectionsListView)

Lista pozycji Przychód wewnętrzny (PW), Rozchód wewnętrzny (RW)
Przychód/Rozchód wewnętrzny

(NewInternalReceiptOrReleaseView)

Lista pozycji Element przychodu wewnętrznego (PW), Element rozchodu wewnętrznego (RW)
Dokument Przychód wewnętrzny (PW), Rozchód wewnętrzny (RW)
Podgląd Przychodu/Rozchodu wewnętrznego

(InternalReceiptOrReleasePreviewView)

Lista pozycji Element przychodu wewnętrznego (PW), Element rozchodu wewnętrznego (RW)
Dokument Przychód wewnętrzny (PW), Rozchód wewnętrzny (RW)
Zamówienie wewnętrzne

(InternalOrdersListView)

Lista pozycji Zamówienie wewnętrzne (ZWE)
Nowa paczka

(GeneratedWarehouseDocumentView)

Lista pozycji Element przesunięcia międzymagazynowego (MM-)
Dokument Przesunięcie międzymagazynowe (MM-)
Przesunięcia ręczne

(ManualMovementsListView)

Lista pozycji Przesunięcie międzymagazynowe (MM-)
Przesunięcie ręczne

(NewManualMovementWarehouseDocumentView)

Lista pozycji Element przesunięcia międzymagazynowego (MM-)
Dokument Przesunięcie międzymagazynowe (MM-)
Przesunięcia wewnętrzne

(InternalMovementsListView)

Lista pozycji Element przesunięcia międzymagazynowego (MM-)
Przesunięcie wewnętrzne

(NewInternalWarehouseDocumentView)

Lista pozycji Przesunięcie międzymagazynowe (MM-)
Inwentaryzacja

(InventoryCountView)

Dokument Inwentaryzacja
Arkusz inwentaryzacji

(InventoryCountListView)

Dokument Arkusz inwentaryzacji
Utworzone zamówienie wewnętrzne

(CreatedInternalOrdersListView)

Lista pozycji Zamówienie wewnętrzne (ZWE)
Nowe zamówienie wewnętrzne

(NewInternalOrderView)

Dokument Zamówienie wewnętrzne (ZWE)
Podgląd zamówienia wewnętrznego

(CreatedInternalOrderPreviewView)

Dokument Zamówienie wewnętrzne (ZWE)
Lista artykułów

(ProductsListView)

Lista pozycji Artykuł

 

Aby wskazaną klasę atrybutu dodać do POS, należy ją oznaczyć jako Retail POS (pogląd lub/i edycja). Opcja pogląd umożliwi działanie atrybutu w trybie tylko do odczytu w aplikacji POS. Natomiast wybranie opcji edycja będzie skutkowało możliwością zmiany wartości atrybutu, a po zapisie zmian przeniesienie tej informacji do systemu ERP. Następnie klasę atrybutu wiążemy z odpowiednim typem obiektu, który po stronie POS jest obsługiwany (parz tabelka powyżej). Po dodaniu i przesynchronizowaniu ustawień nowe atrybuty pojawią się na odpowiednim widoku w aplikacji POS i będą mogły być zarządzalne z poziomu konfiguracji interfejsu przez użytkownika POS.

Przykładowo dodajemy nową klasę atrybutu o nazwie X typu tekst, oznaczamy do edycji w sekcji Retail POS. Następnie wiążemy ją z obiektem Kontrahenta w systemie ERP. Po przesynchronizowaniu danych uruchamiamy aplikację POS i wchodzimy do konfiguracji widoku Dodaj kontrahenta. Tam zaznaczmy odpowiedni kontener (CustomerItemsContainer) pozwalający na prezentację atrybutów, a następnie z listy dostępnej po prawej stronie przeciągamy nasz nowy atrybut X na widok i upuszczamy go w odpowiednim miejscu.

Dodanie nowej klasy atrybutu do nowego widoku nieposiadających jej obsługi

Wsparcie dla atrybutów możemy również dodawać we własnych widokach tworzonych w ramach rozszerzenia. Atrybuty mogę być prezentowane w postaci dynamicznie generowanych kolumn na liście (kontrolka DataGrid) lub też w postaci niezależnych kontrolek (rodzaj kontrolki będzie zależny od typu klasy atrybutu).

Atrybuty w postaci kolumn na liście DataGrid

W celu implementacji atrybutów na listach w postaci dynamicznie generowanych kolumn, należy w pierwszej kolejności dla encji danych zaimplementować interfejs IAttributable. Dostarcza on trzy właściwości, niezbędne do poprawnej obsługi atrybutów na listach. Dwie pierwsze właściwości Id oraz ObjectType należy ustawić zgodnie z encją. Id to identyfikator encji, natomiast ObjectType to typ encji. Trzecia właściwość Attributes to słownik, który będzie trzeba wypełnić podczas asynchronicznego pobierania danych dla listy. Do wypełniania tego słownika należy skorzystać z metody FillAttributesForList znajdującej się w serwisie IAttributesService. Zanim dane ze słownika będą mogły zostać wyświetlone najpierw lista musi wygenerować dodatkowe kolumny. Aby mogła to zrobić, podczas pierwszego pobrania danych (IsInitialization=true) należy ustawić właściwość AttributeClasses znajdującą się w klasie AsyncDataGridCollection. Do ustawiana tej właściwości należy skorzystać z metody GetAttributesClasses z serwisu IAttributesService. Metoda przyjmuje dwa parametry, pierwszy pozwala na ustalenie jakie klasy atrybutów powinny być prezentowane na danej liście, drugi natomiast filtruje, które z klas dla danych grup mają być widoczne. W przypadku, gdy drugi parametr będzie null, pobierane będą wszystkie klasy, z wybranych w pierwszym parametrze grup. Implementacja powinna być zrealizowana tak, aby filtrowanie klas atrybutów było zarządzalne w trybie design mode widoku. Dlatego w DesignViewModelu danego widoku należy wywołać metodę z drugim parametrem ustawionym na null. Pozwoli to na pobranie wszystkich klas i wygenerowanie wszystkich możliwych kolumn (domyślnie ukrytych). Natomiast w ViewModelu widoku  należy do drugiego parametru przekazać właściwość VisibileAttributesClassesList, który będzie zawierała listę klas atrybutów ustawioną w trybie design przez użytkownika. Metoda FillAttributesForList wypełnienia słownik Attributes. Wymaga przekazania dwóch parametrów. Pierwszy to lista encji (encja musi implementować IAttributable), drugi to lista identyfikatorów klas atrybutów, dla który należy uzupełnić każdą z encji wartościami tych klas atrybutów. W celu optymalizacji, nie pobierania zbyt wielu informacji drugi parametr ustawiamy przekazując właściwość VisibleAttributesClassesList.

Sortowanie dla kolumn, które zostały wygenerowane dla atrybutów, jest wyłączone.

Domyślnie wygenerowane kolumny dla atrybutów są ukryte. Aby je wyświetlić należy dla trybu design mode zaimplementować pobieranie wszystkich możliwych atrybutów dla danej listy, tak aby użytkownik miał możliwość wyboru kolumny i zdefiniowania widoczność a także innych właściwości.

Atrybutu prezentowane są w postaci tekstu w przypadku, gdy lista jest w trybie tylko do odczytu. Natomiast dla trybu edycji, generowane są w postaci odpowiednich kontrolek w zależności o typu danych. Dla typu logicznego będzie to CheckBox, dla listy oraz słownika ComboBox, a dla pozostałych typów TextBox.

Kompletny przykład implementacji Widok dokumentu handlowego z obsługują atrybutów

Atrybuty jako niezależne kontrolki

Alternatywnym sposobem prezentacji atrybutów w tworzonych widokach jest implementacja ich w postaci dynamicznie generowanych kontrolek zależnych typu klasy atrybutu. Kontrolki pozwolą nam również na wprowadzanie zmian w wartościach atrybutów. Implementację możemy podzielić na trzy etapy. Pierwszy to implementacja pobierania atrybutów i prezentowania ich w postaci kontrolek widocznych w zdefiniowanym kontenerze. Drugi etap to implementacja walidacji wartości w atrybutach. Natomiast trzeci etap to zapis wprowadzonych zmian w wartościach atrybutów. Przykład implementacji Widok dokumentu handlowego z obsługują atrybutów

Czy ten artykuł był pomocny?