W aplikacji Comarch Mobile jest możliwość obsługi programów lojalnościowych. Umożliwiono pobieranie z systemu ERP punktów lojalnościowych zgromadzonych na kontach określonych kontrahentów za zakup poszczególnych towarów. Zebrane punkty mogą zostać wykorzystane w aplikacji mobilnej do nadania rabatów. Aby umożliwić rozliczanie punktów lojalnościowych z poziomu aplikacji Comarch Mobile, należy:
stworzyć definicję programu lojalnościowego zgodnego ze swoimi założeniami oraz wymaganiami opisanymi w dalszej części dokumentu,
obsłużyć synchronizację punktów lojalnościowych kontrahentów,
włączyć obsługę programu lojalnościowego w pliku configuration.*.statement, poprzez zmianę wartości klucza [IsLoyaltyEnabled] na 1.
Struktura definicji programu lojalnościowego
Przygotowane definicje programów lojalnościowych należy umieścić w pliku z rozszerzeniem XML w katalogu [LoyaltyProgramsDefinitions] katalogu głównego serwera synchronizacji Mobile. Nazwa pliku musi składać się z
<IdProgramuLojalnosciowego>#<NazwaProgramuLojalnosciowego>.xml
Synchronizacja definicji do urządzeń mobilnych odbywa się po każdej modyfikacji w plikach definicji. Aby usunąć już zsynchronizowaną definicję z urządzeń mobilnych należy zmienić id programu na wartość ujemną. Taka definicja zostanie usunięta przy następnej synchronizacji.
<?xml version=”1.0″ encoding=”UTF-8″?>
<LoyaltyProgram>
<Name>…</Name>
<SettleDocumentsValue>…</SettleDocumentsValue>
<CheckContractorStatusQuery>
…
</CheckContractorStatusQuery>
<CheckArticleStatusQuery>
…
</CheckArticleStatusQuery>
<InitialMessageQuery>
…
</InitialMessageQuery>
<AfterRemovePositionLoyaltyProgramQuery>
…
</AfterRemovePositionLoyaltyProgramQuery>
<AfterAddPositionLoyaltyProgramQuery>
…
</AfterAddPositionLoyaltyProgramQuery>
<AfterRemoveDocumentLoyaltyProgramQuery>
…
</AfterRemoveDocumentLoyaltyProgramQuery>
<AfterAddDocumentLoyaltyProgramQuery>
…
</AfterAddDocumentLoyaltyProgramQuery>
</LoyaltyProgram>
Elementy w definicji program lojalnościowego
Name – Nazwa program lojalnościowego
SettleDocumentsValue – flaga bitowa określająca, na jakich dokumentach bierze udział program lojalnościowy. Poszczególne typy dokumentów będą miały przyporządkowane wartości:
1 – OS
2 – ZS
4 – FS
8 – PA
16 – WZ
32 – WM
CheckContractorStatusQuery – Zapytanie sprawdzające czy dany kontrahent bierze udział w programie lojalnościowym oraz zwraca liczbę punktów dostępnych dla kontrahenta. Zwrócenie wiersza oznacza, że kontrahent bierze udział w programie lojalnościowym.
Parametry wejściowe:
@DocumentType – typ dokumentu. Wartość zgodna z wartościami z punktu drugiego.
@ContractorId – identyfikator kontrahenta
@LoyaltyProgramId – identyfikator programu lojalnościowego
@EditedDocumentId – identyfikator dokumentu, który jest teraz aktualnie reedytowany (został tylko zapisany wcześniej, został cofnięty do bufora)
Kolumny wyjściowe:
Liczba punktów dostępnych do zużycia przez kontrahenta
CheckArticleStatusQuery – Zapytanie sprawdzające czy dany towar jest dostępny w danym programie lojalnościowym oraz zwraca liczbę punktów do rozliczenia na pozycji.
Parametry wejściowe
@ArticleId – identyfikator towaru na który wystawiana jest pozycja
@StartGrossPrice – początkowa cena brutto
@StartNetPrice – początkowa cena netto
@Quantity – ilość w jednostce bazowej
@AvailablePoints – liczba dostępnych punktów kontrahenta
@EditedDocumentId – identyfikator edytowanego dokumentu
@VatRate – stawka VAT (np. dla 23% – parametr ten będzie miał wartość 23)
@VatDirection – kierunek VAT (0 – Netto, 1 – Brutto)
Kolumny wyjściowe
MaxPointsToSettleValue – maksymalna liczba punktów możliwa do rozliczenia na pozycji
EndGrossPrice – końcowa cena brutto na pozycji po rozliczeniu punktów MaxPointsToSettleValue
InitialMessageQuery – Zapytanie tworzące komunikat powitalny.
Parametry wejściowe
@DocumentType – typ dokumentu. Wartość zgodna z wartościami z punktu drugiego.
@ContractorId – identyfikator kontrahenta
@LoyaltyProgramId – identyfikator programu lojalnościowego
@EditedDocumentId – identyfikator dokumentu, który jest teraz aktualnie reedytowany (został tylko zapisany wcześniej, został cofnięty do bufora)
Kolumny wyjściowe
InitialMessageText – komunikat powitalny. Może zawierać proste tagi html’owe w celu sformatowania tekstu. (np. Dodanie nowej linii <br />, Zmiana koloru fragmentu tekstu <font color=”#FF0000″></font>, itd.)
AfterRemovePositionLoyaltyProgramQuery – Zapytanie wykonywane po usunięciu rozliczenia programu lojalnościowego na pozycji. Służy do wycofania zmian wykonanych w AfterAddPositionLoyaltyProgramQuery.
Parametry wejściowe
@LoyaltyProgramId – identyfikator programu lojalnościowego
@ProgramName – nazwa programu lojalnościowego
@AttributeObjectType – typ atrybutów dla pozycji
@ObjectId – identyfikator dokumentu
@ObjectIsLocal – identyfikator dokumentu
@ObjectSubId – identyfikator pozycji
@ObjectSubIsLocal – identyfikator pozycji
Obsługiwane jest wiele zapytań w ramach tej samej definicji. Separator skryptów „;GO;”
AfterAddPositionLoyaltyProgramQuery – Zapytanie wykonywane po zapisie dokumentu – dla każdej pozycji, która zostaje rozliczona za pomocą programu lojalnościowego.
Parametry wejściowe
@LoyaltyProgramId
@ProgramName
@SettledPoints
@AttributeObjectType
@ObjectId
@ObjectIsLocal
@ObjectSubId
@ObjectSubIsLocal
@StartGrossPrice – cena początkowa brutto
@StartNetPrice – cena początkowa netto
@StartGrossValue – wartość brutto
@StartNetValue – wartość netto
Obsługiwane jest wiele zapytań w ramach tej samej definicji. Separator skryptów „;GO;”
AfterRemoveDocumentLoyaltyProgramQuery – Zapytanie wykonywane po usunięciu rozliczenia programu lojalnościowego z dokumentu. Służy do wycofywania zmian wykonanych w
Parametry wejściowe
@LoyaltyProgramId
@ProgramName
@SettledPoints
@AttributeObjectType
@ObjectId
@ObjectIsLocal
@ObjectSubId
@ObjectSubIsLocal
Obsługiwane jest wiele zapytań w ramach tej samej definicji. Separator skryptów „;GO;”
AfterAddDocumentLoyaltyProgramQuery – Zapytanie wykonywane po zapisie dokumentu z rozliczeniem programu lojalnościowego.
Parametry wejściowe
LoyaltyProgramId
ProgramName
SettledPoints
AttributeObjectType
ObjectId
ObjectIsLocal
ObjectSubId
ObjectSubIsLocal
Obsługiwane jest wiele zapytań w ramach tej samej definicji. Separator skryptów „;GO;”
Synchronizacja punktów lojalnościowych kontrahentów
Aby umożliwić synchronizację punktów lojalnościowych kontrahentów należy zaimplementować metody synchronizacji obiektu [contractorsloyaltypoints]:
*.statement – zapytanie pobierające aktualne stany punktów kontrahentów. Zwracane kolumny:
OperationType – typ operacji (dodawanie, usuwanie, edycja),
OperationTS – timestamp synchronizacji,
LoyaltyProgramId – identyfikator programu lojalnościowego,
ContractorId – identyfikator kontrahenta,
Points – liczba dostępnych punktów do rozliczenia przez kontrahenta,
LockedPoints – liczba punktów dostępnych lecz zablokowanych do rozliczenia. Obecnie parametr ten nie jest jeszcze obsługiwany, dlatego zawsze kolumna ta powinna zwracać wartość 0.
contractorsloyaltypoints*.xml – definicja metody synchronizacji, triggery aktualizujące timestampy wierszy
Rozliczanie punktów w systemie Comarch ERP Optima
Rozliczanie punktów należy obsłużyć po stronie systemu ERP za pomocą triggera wdrożeniowego aktywowanego np. potwierdzeniem dokumentu. Dokładny sposób rozliczenia jest zależny od mechanizmów zaimplementowanych w programie lojalnościowym po stronie systemu ERP.
Program lojalnościowy może zostać oparty poprzez atrybuty zdefiniowane w systemie ERP. W takiej obsłudze będą brani pod uwagę Kontrahenci, którzy posiadają zdefiniowany atrybut ze wskazaniem programu lojalnościowego (np. PROFIT PROGRAM), a Przedstawiciel będzie mógł nadać rabat tylko na pozycjach towarów oznaczonych też odpowiednim atrybutem.
![](https://pomoc.comarch.pl/mobile/pl/optima/wp-content/uploads/2019/01/o1.png)
Obecne implementacje do przesyłania informacji o liczbie rozliczonych punktów, korzystają z atrybutów (klasa atrybutu tylko do odczytu) ustawianych na pozycjach dokumentów (za pomocą AfterAddPositionLoyaltyProgramQuery) z wartością rozliczonych na pozycji punktów. Podczas synchronizacji do systemu ERP dokumentów, w momencie ich potwierdzenia, w triggerze sprawdzone powinno zostać istnienie atrybutu rozliczającego punkty na pozycjach. Wartość rozliczonych punktów powinna zostać odjęta z puli punktowej kontrahenta. Dodatkowo rozliczenie takie powinno spowodować podbicie odpowiednich timestampów w [contractorsloyaltypoints] w celu wymuszenia synchronizacji aktualnego stanu punktów kontrahenta.