Import dokumentów z plików XML część II
Transkrypt
Import dokumentów z plików XML część II
_________________________________________________________________________________________ Import dokumentów z plików XML część II (wersja 1.0) Soneta Sp z o.o. ul. Wadowicka 8a, wejście B 31-415 Kraków tel./fax +48 (12) 261 36 41 http://www.enova.pl e-mail: [email protected] 1 Spis treści 1 Wstęp....................................................................................................................................................................3 2 Import cech ...........................................................................................................................................................3 3 2.1 Cechy z nazwami wieloczłonowymi..............................................................................................................4 2.2 Import cech referencyjnych..........................................................................................................................4 Import zapłat ........................................................................................................................................................5 3.1 Import wpłaty gotówkowej ..........................................................................................................................5 3.1.1 3.2 Identyfikacja raportu i podmiotu..........................................................................................................5 Import rozliczenia .........................................................................................................................................6 3.2.1 Rozliczenie części kwoty .......................................................................................................................7 4 Uruchamianie importu z kodu ..............................................................................................................................7 5 Podsumowanie .....................................................................................................................................................8 2 1 Wstęp W poprzednim artykule dotyczącym importów z plików XML omówione zostały podstawowe zasady budowy plików XML wykorzystywanych do importu danych do systemu enova. Zapoznaliśmy się w nim z ogólną strukturą plików importowych, znaczeniem atrybutu business, sposobem tworzenia najprostszych dokumentów, podstawianiem danych relacyjnych, dodawaniem podlist (np. listy pozycji czy listy płatności dokumentu) oraz dodawaniem kolejnych pól do pliku. W bieżącym artykule zajmiemy się zagadnieniami: Importu cech Importu wpłat i rozliczeo Uruchamiania importu z poziomu zewnętrznych dodatków 2 Import cech Przeanalizujmy możliwośd importu kartoteki towarowej z przypisanymi cechami. Ponieważ dla kartoteki towarowej wymagane są kod i nazwa, najprostszy plik XML do zaimportowania kartoteki towarowej, będzie wyglądał jak poniżej (atrybut key jest użyty w celu zabezpieczenie przed duplikacją – o tym była mowa w poprzednim artykule): <?xml version="1.0" encoding="Unicode" ?> <session xmlns="http://www.soneta.pl/schema/business" business="true"> <Towar key="Kod=ROW_TD_SCOUT_24"> <Kod>ROW_TD_SCOUT_24</Kod> <Nazwa>Rower turystyczny damski Scout 24"</Nazwa> </Towar> </session> Chcemy teraz dodad do pliku cechy Kolor oraz Typ, które w organizatorze listy są widoczne jako Features.Kolor i Features.Typ. Zgodnie więc z logiką rozszerzania pliku XML do importu, po uzupełnieniu o cechy będzie on wyglądał tak (uwaga – tu występuje pewne odstępstwo od ogólnej reguły – tag features ma nazwę pisaną z małej litery): <?xml version="1.0" encoding="Unicode" ?> <session xmlns="http://www.soneta.pl/schema/business" business="true"> <Towar key="Kod=ROW_TD_SCOUT_24"> <Kod>ROW_TD_SCOUT_24</Kod> <Nazwa>Rower turystyczny damski Scout 24"</Nazwa> <features> <Kolor>niebieski</Kolor> <Typ>turystyczny</Typ> </features> </Towar> </session> 3 2.1 Cechy z nazwami wieloczłonowymi Problem pojawia się, gdy cecha posiada nazwę wieloczłonową. Np. zamiast cechy Typ będzie zdefiniowana cecha Typ modelu. Tag importujący cechy nie może wyglądad w ten sposób: <features> <Kolor>niebieski</Kolor> <Typ modelu>turystyczny</Typ modelu> </features> bo nie będzie to wówczas poprawny plik XML. W takim wypadku stosuje się inną notację – gdzie nazwa cechy jest atrybutem: <features> <feature name="Kolor">czerwony</feature> <feature name="Typ modelu">turystyczny</feature> </features> W ten sposób jest możliwośd importowania cech do dowolnych obiektów w enova. 2.2 Import cech referencyjnych Szczególnym rodzajem cech są cechy referencyjne. Dodajmy do towaru kolejną cechę Drugi dostawca, typu referencyjnego, tabela danych referencyjnych Kontrahenci. W tym wypadku możliwe jest przekazanie wartości takiej cechy wyłącznie przez GUID lub przez ID. W przypadku identyfikacji przez GUID taki zapis będzie wyglądał następująco: <features> <feature name="Drugi dostawca">Kontrahent:ba66f548-1660-11d7-9ab0000795c951c8</feature> </features> Lub w uproszczeniu: <features> <feature name="Drugi dostawca">ba66f548-1660-11d7-9ab0-000795c951c8</feature> </features> W przypadku identyfikacji przez ID, musi ono byd poprzedzone znakiem #: <features> <feature name="Drugi dostawca">Kontrahent:#3</feature> </features> Lub w uproszczeniu: <features> <feature name="Drugi dostawca">#3</feature> </features> 4 3 Import zapłat Może zdarzyd się, że wraz z dokumentem handlowym chcemy zaimportowad również wpłatę do tego dokumentu. Przykładowo – chcemy aby import paragonu z pliku XML wprowadził również zapłatę za paragon i powiązał tą wpłatę z należnością. 3.1 Import wpłaty gotówkowej W pierwszej kolejności musimy zaimportowad wpłatę. Dokumenty wpłat mogą byd wprowadzane w enova na różne sposoby (przez Dokumenty, Raporty lub Ewidencję). W przykładzie zajmiemy się wprowadzaniem przez Dokumenty, czyli tak, jak w standardowej kasie gotówkowej. Podstawowy plik dla takiego importu wygląda tak: <?xml version="1.0" encoding="Unicode" ?> <session xmlns="http://www.soneta.pl/schema/business" business="true"> <DokKasowyBase class="Soneta.Kasa.DokumentWplata,Soneta.Kasa" raport="4334ca3e25e8-4505-9e70-607d93e87d8e"> <Kasa>00000000-0003-0002-0001-000000000000</Kasa> <Definicja>00000000-0003-0003-0001-000000000000</Definicja> <Data>2011-07-18</Data> <Zaplata class="Soneta.Kasa.Wplata,Soneta.Kasa"> <Podmiot>Kontrahent:00000000-0009-0002-0001-000000000000</Podmiot> <Kwota>123.00 PLN</Kwota> <Opis>Zapłata za paragon</Opis> </Zaplata> <Bufor>False</Bufor> </DokKasowyBase> </session> Niestety taki plik ma zasadniczą wadę, polegającą na posługiwaniu się GUID-ami. O ile w przypadku tagów Kasa i Definicja możemy się łatwo pozbyd GUID-ów, wykorzystując atrybut where, o tyle w przypadku Raport i Podmiot nie będzie to takie łatwe. Wynika to stąd, że: Raport występuje w konstruktorze klasy DokumentWplata, musi byd więc wprowadzony jako atrybut (a nie jako tag). A nie możemy zastosowad atrybutu dla atrybutu. Podmiot w przypadku zapłaty może byd kontrahentem, pracownikiem, bankiem itp. Musi byd więc określony jego typ. Przy takiej konstrukcji możemy się posłużyd jedynie GUID-em lub ID. 3.1.1 Identyfikacja raportu i podmiotu Rozwiązaniem powyższego problemu jest wprowadzenie do pliku XML raportu oraz podmiotu (kontrahenta) jako zupełnie odrębnych tagów. Zostaną one zidentyfikowane za pomocą atrybutu key (po polu unikalnym – dla kontrahenta będzie to kod, a dla raportu numer), a na zapłacie zostaną podstawione za pomocą wewnętrznych identyfikatorów (o użyciu atrybutu key, oraz o wewnętrznych identyfikatorach była mowa w poprzednim artykule). <?xml version="1.0" encoding="Unicode" ?> <session business="true" xmlns="http://www.soneta.pl/schema/business"> <RaportESP id="Raport_1" key="Numer.Pelny=RK/KASA/2011/07/0012"></RaportESP> <Kontrahent id="Podmiot_1" key="Kod=Zefir"></Kontrahent> <DokKasowyBase class="Soneta.Kasa.DokumentWplata,Soneta.Kasa" Raport="Raport_1"> <Kasa where="Symbol=Kasa" /> <Definicja where="Symbol=KP" /> 5 <Kierunek>Przychod</Kierunek> <Data>2011-07-18</Data> <Bufor>True</Bufor> <Zaplata class="Soneta.Kasa.Wplata,Soneta.Kasa"> <Podmiot>Podmiot_1</Podmiot> <Kwota>123.00 PLN</Kwota> <Opis>Zapłata za paragon</Opis> </Zaplata> </DokKasowyBase> </session> Proszę zwrócid uwagę, że np. kontrahent ma tag, który dzięki atrybutowi key spowoduje wyszukanie kontrahenta w bazie danych, a za pomocą wewnętrznego identyfikatora (id="Podmiot_1") zostanie potem podstawiony na dokumencie wpłaty. Oczywiście, taka zawartośd pliku XML zakłada, że zarówno kontrahent jak i raport kasowy istnieją w bazie danych. 3.2 Import rozliczenia Teraz pozostaje połączenie pliku zawierającego paragon z plikiem zawierającym wpłatę oraz dodanie rozliczenia pomiędzy płatnością paragonu i wpłatą. W tym celu tagi płatnośd i i wpłata otrzymają wewnętrzne identyfikatory (odpowiednio Platnosc_1 i Zaplata_1), którymi posłużymy się w tagu importującym rozliczenie. Dodanie wewnętrznego identyfikatora do płatności: <Platnosc class="Soneta.Kasa.Naleznosc,Soneta.Kasa" id="Platnosc_1"> [...] </Platnosc> Dodanie wewnętrznego identyfikatora do wpłaty: <Zaplata class="Soneta.Kasa.Wplata,Soneta.Kasa" id="Zaplata_1"> [...] </Zaplata> I import rozliczenia: <RozliczenieSP id="RozliczenieSP_1" dokument="Platnosc_1" zapłata="Zaplata_1"> </RozliczenieSP> Cały plik będzie wyglądał następująco: <?xml version="1.0" encoding="Unicode" ?> <session business="true" xmlns="http://www.soneta.pl/schema/business"> <RaportESP id="Raport_1" key="Numer.Pelny=RK/KASA/2011/07/0012"></RaportESP> <Kontrahent id="Podmiot_1" key="Kod=Zefir"></Kontrahent> <DokumentHandlowy id="Dokument_1"> <Definicja where="Symbol=PAR" /> <Magazyn where="Symbol=F" /> <Data>2010-04-27</Data> <Kontrahent>Podniot_1</Kontrahent> <Platnosci> <Platnosc class="Soneta.Kasa.Naleznosc,Soneta.Kasa" id="Platnosc_1"> <SposobZaplaty where="Nazwa=Gotówka"/> <Kwota>123.00 PLN</Kwota> 6 <TerminDni>0</TerminDni> </Platnosc> </Platnosci> <Pozycje> <Pozycja> <Towar where="Kod=MONTAZ" /> <Ilosc>1 szt</Ilosc> <Cena>123.00 PLN</Cena> </Pozycja> </Pozycje> <Stan>Zatwierdzony</Stan> </DokumentHandlowy> <DokKasowyBase class="Soneta.Kasa.DokumentWplata,Soneta.Kasa" Raport="Raport_1"> <Kasa where="Symbol=Kasa" /> <Definicja where="Symbol=KP" /> <Kierunek>Przychod</Kierunek> <Data>2011-07-18</Data> <Bufor>True</Bufor> <Zaplata class="Soneta.Kasa.Wplata,Soneta.Kasa" id="Zaplata_1"> <Podmiot>Podmiot_1</Podmiot> <Kwota>123.00 PLN</Kwota> <Opis>Zapłata za paragon</Opis> </Zaplata> </DokKasowyBase> <RozliczenieSP id="RozliczenieSP_1" dokument="Platnosc_1" zapłata="Zaplata_1"> </RozliczenieSP> </session> 3.2.1 Rozliczenie części kwoty Gdyby rozliczenia miała podlegad nie cała kwota, ale tylko jej częśd, wówczas tag RozliczenieSP powinien zawierad dodatkowo informację o tej kwocie: <RozliczenieSP id="RozliczenieSP_1" dokument="Platnosc_1" zapłata="Zaplata_1"> <KwotaDokumentu>100.00 PLN</KwotaDokumentu> </RozliczenieSP> 4 Uruchamianie importu z kodu Czasami w rozwiązaniach dodatkowych dla enova pojawia się potrzeba automatycznego uruchomienia importu danych z pliku XML (z poziomu kodu własnego programu czy serwisu). Za wczytywanie danych z plików XML odpowiada klasa SessionReader. Zakładając, że do zmiennej filename podstawiona zostanie nazwa pliku XML, a w zmiennej login będzie obiekt loginu do enova, samo zaimportowanie danych z pliku zawiera 3 linie kodu: // Soneta.Business.App.Login login; // string filename = "C:\\Folder\\NazwaPliku.XML"; System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(filename); reader.WhitespaceHandling = System.Xml.WhitespaceHandling.Significant; new SessionReader(login).Read(reader); 7 5 Podsumowanie W dwóch artykułach dotyczących importu danych z plików XML przedstawione zostały podstawowe zasady konstrukcji plików importu. Zawarte w artykułach informacje mogą posłużyd do budowy zewnętrznych mechanizmów wymiany danych pomiędzy oprogramowaniem firm trzecich a systemem enova (przykładowo – import zamówieo ze sklepu internetowego za pomocą plików XML). Wszystkie przykłady bazowały na imporcie dokumentów handlowych i powiązanych z nimi danych. Wynika to stąd, że najczęściej pojawia się potrzeba integracji właśnie w tym obszarze. Oczywiście informacje zawarte w artykułach, dotyczące zasad konstrukcji plików, identyfikacji danych, dodawania nowych pól do plików importowych itp. mają charakter ogólny i mogą byd pomocne w budowaniu plików wymiany w innych obszarach. 8