Skocz do zawartości

Eksport do EN (BETA)

Polecane posty

Witaj,

od tego mamy forum i jak chciałby każdy zarobić na czyjeś pomocy, to wiele by z tego forum nie pozostało.

 

Masa Ci się nie pobiera ponieważ u mnie masę wypełnia osobny skrypt.

 

W Twoim przypadku wystarczy, że do każdego rodzaju przesyłki dodasz:

 

<xsl:if test="s:Weight">
   <xsl:element name="Atrybut">
      <xsl:attribute name="Typ"/>
       <xsl:attribute name="Nazwa">Masa</xsl:attribute>
       <xsl:value-of select="round(number(s:Weight)*1000)"/>
   </xsl:element>
</xsl:if>

Link to postu

Witam,

 

Chcialem sie dowiedziec ktora czesc transformaty 852 odpowiedzialna jest za odznaczenie opcji "Ubezpieczenie"

 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://www.sello.pl/export">

  <!--Przesyłka biznesowa-->

  <!--Oznaczenie umowy na podstawie, której nadawane są przesyłki pocztowe (idUmowyMRUMC).-->

  <xsl:variable name="NrUmowy"></xsl:variable>

  <!--Oznaczenie Karty na podstawie, której nadawane są przesyłki pocztowe (idKartyMRUMR).-->

  <xsl:variable name="KartaUmowy"></xsl:variable>

  <!--Dotyczy gabarytu przesyłki biznesowej:

  XS – gabaryt XS

  S – gabaryt S

  M – gabaryt M

  L – gabaryt L

  XXL – gabaryt XXL-->

  <xsl:variable name="Gabaryt">M</xsl:variable>

  <!--Tytuł przelewu dla danej paczki-->

  <xsl:template name="TytulPrzelewu">

    <xsl:variable name="trans" select="s:ParentTransaction/s:Name"/>

    <xsl:variable name="trans2" select="substring-before(substring-after(substring($trans,string-length($trans)-16),'('),')')"/>

    <xsl:variable name="nick" select="s:Customer/s:Nick"/>

    <xsl:choose>

      <xsl:when test="$trans2!=''">

        <xsl:value-of select="substring(concat($nick,' ',$trans2),1,30)"/>

      </xsl:when>

      <xsl:otherwise>

        <xsl:value-of select="substring(concat($nick,' ',$trans),1,30)"/>

      </xsl:otherwise>

    </xsl:choose>

  </xsl:template>

  <!--Opis dla danej paczki. Pole z dowolną zawartością nie przekraczającą długości 40 znaków-->

  <xsl:template name="Opis">Paczka nr <xsl:value-of select="s:Symbol"/></xsl:template>

 

  <xsl:param name="Year"/>

  <xsl:param name="Month"/>

  <xsl:param name="Day"/>

  <xsl:param name="Hour"/>

  <xsl:param name="Minute"/>

  <xsl:param name="Second"/>

  <xsl:template match="s:ExportData">

    <xsl:element name="Nadawca">

      <xsl:attribute name="Struktura">1.6</xsl:attribute>

      <xsl:attribute name="Nazwa">

        <xsl:value-of select="s:Company/s:Address/s:Company"/>

      </xsl:attribute>

      <xsl:attribute name="NazwaSkrocona">

        <xsl:variable name="companyName" select="s:Company/s:Address/s:Company"/>

        <xsl:value-of select="substring($companyName,0,10)"/>

      </xsl:attribute>

      <xsl:attribute name="Ulica">

        <xsl:value-of select="s:Company/s:Address/s:Street"/>

      </xsl:attribute>

      <xsl:attribute name="Dom">

        <xsl:value-of select="s:Company/s:Address/s:HouseNumber"/>

      </xsl:attribute>

      <xsl:attribute name="Lokal">

        <xsl:value-of select="s:Company/s:Address/s:FlatNumber"/>

      </xsl:attribute>

      <xsl:attribute name="Miejscowosc">

        <xsl:value-of select="s:Company/s:Address/s:City"/>

      </xsl:attribute>

      <xsl:attribute name="Kod">

        <xsl:value-of select="translate(s:Company/s:Address/s:ZipCode,'- ','')"/>

      </xsl:attribute>

      <xsl:attribute name="NIP">

        <xsl:value-of select="translate(s:Company/s:Address/s:NIP,'- ','')"/>

      </xsl:attribute>

      <xsl:attribute name="Zrodlo">NADAWCA</xsl:attribute>

      <xsl:attribute name="Guid">

        <xsl:value-of select="s:Company/s:GUID"/>

      </xsl:attribute>

      <xsl:element name="Zbior">

        <xsl:attribute name="Nazwa">

          <xsl:value-of select="concat(format-number($Day,'00'),'-',format-number($Month,'00'),'-',$Year,'\1')"/>

        </xsl:attribute>

        <xsl:attribute name="DataUtworzenia">

          <xsl:value-of select="concat($Year,'-',format-number($Month,'00'),'-',format-number($Day,'00'),'T',format-number($Hour,'00'),':',format-number($Minute,'00'),':',format-number($Second,'00'))"/>

        </xsl:attribute>

        <xsl:attribute name="Opis">Jakis dowolny opis</xsl:attribute>

        <xsl:attribute name="IloscPrzesylek">

          <xsl:value-of select="count(s:Package)"/>

        </xsl:attribute>

        <xsl:attribute name="Guid">

          <xsl:value-of select="s:GUID"/>

        </xsl:attribute>

        <xsl:apply-templates select="s:Package"/>

      </xsl:element>

    </xsl:element>

  </xsl:template>

  <xsl:template match="s:Package">

    <xsl:element name="Przesylka">

      <xsl:attribute name="Guid">

        <xsl:value-of select="s:GUID"/>

      </xsl:attribute>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ">Adresat</xsl:attribute>

        <xsl:attribute name="Nazwa">Nazwa</xsl:attribute>

        <xsl:choose>

          <xsl:when test="s:DeliveryAddress/s:Company!=''">

            <xsl:value-of select="s:DeliveryAddress/s:Company"/>

          </xsl:when>

          <xsl:otherwise>

            <xsl:value-of select="s:DeliveryAddress/s:Name"/>

          </xsl:otherwise>

        </xsl:choose>

      </xsl:element>

      <xsl:if test="s:DeliveryAddress/s:Company!='' and s:DeliveryAddress/s:Name!=''">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ">Adresat</xsl:attribute>

          <xsl:attribute name="Nazwa">NazwaII</xsl:attribute>

          <xsl:value-of select="s:DeliveryAddress/s:Name"/>

        </xsl:element>

      </xsl:if>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ">Adresat</xsl:attribute>

        <xsl:attribute name="Nazwa">Ulica</xsl:attribute>

        <xsl:value-of select="s:DeliveryAddress/s:Street"/>

      </xsl:element>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ">Adresat</xsl:attribute>

        <xsl:attribute name="Nazwa">Dom</xsl:attribute>

        <xsl:value-of select="s:DeliveryAddress/s:HouseNumber"/>

      </xsl:element>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ">Adresat</xsl:attribute>

        <xsl:attribute name="Nazwa">Lokal</xsl:attribute>

        <xsl:value-of select="s:DeliveryAddress/s:FlatNumber"/>

      </xsl:element>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ">Adresat</xsl:attribute>

        <xsl:attribute name="Nazwa">Miejscowosc</xsl:attribute>

        <xsl:value-of select="s:DeliveryAddress/s:City"/>

      </xsl:element>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ">Adresat</xsl:attribute>

        <xsl:attribute name="Nazwa">Kod</xsl:attribute>

        <xsl:value-of select="translate(s:DeliveryAddress/s:ZipCode,'- ','')"/>

      </xsl:element>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ">Adresat</xsl:attribute>

        <xsl:attribute name="Nazwa">Kraj</xsl:attribute>

        <xsl:choose>

          <xsl:when test="s:DeliveryAddress/s:Country=''">Polska</xsl:when>

          <xsl:otherwise>

            <xsl:value-of select="s:DeliveryAddress/s:Country"/>

          </xsl:otherwise>

        </xsl:choose>

      </xsl:element>

      <!--Atrybuty specyficzne dla przesyłki 852-->

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ"/>

        <xsl:attribute name="Nazwa">Symbol</xsl:attribute>852</xsl:element>

      <xsl:if test="$NrUmowy!=''">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">Umowa</xsl:attribute>

          <xsl:value-of select="$NrUmowy"/>

        </xsl:element>

      </xsl:if>

      <xsl:if test="$KartaUmowy!=''">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">KartaUmowy</xsl:attribute>

          <xsl:value-of select="$KartaUmowy"/>

        </xsl:element>

      </xsl:if>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ"/>

        <xsl:attribute name="Nazwa">SposobPobrania</xsl:attribute>

        <xsl:choose>

          <xsl:when test="s:DeliveryMethod/s:IsPayOnDelivery=1">S</xsl:when>

          <xsl:otherwise>T</xsl:otherwise>

        </xsl:choose>

      </xsl:element>

      <xsl:if test="s:Charge">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">KwotaPobrania</xsl:attribute>

          <xsl:value-of select="round(number(s:Charge)*100)"/>

        </xsl:element>

      </xsl:if>

      <xsl:if test="s:Weight">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">Masa</xsl:attribute>

      <xsl:value-of select="round(number(s:Weight)*1000)"/>

        </xsl:element>

      </xsl:if>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ"/>

        <xsl:attribute name="Nazwa">Strefa</xsl:attribute>

        <xsl:value-of select="$Gabaryt"/>

      </xsl:element>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ"/>

        <xsl:attribute name="Nazwa">Ilosc</xsl:attribute>1</xsl:element>

      <xsl:if test="s:SendingNumber!=''">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">NrNadania</xsl:attribute>

          <xsl:value-of select="translate(s:SendingNumber,'- ','')"/>

        </xsl:element>

      </xsl:if>

      <xsl:variable name="phone" select="translate(s:DeliveryAddress/s:PhoneNumber,'- ()/','')"/>

      <xsl:variable name="phone2" select="format-number(substring($phone,string-length($phone)-8,9),'000000000')"/>

      <xsl:if test="starts-with($phone2,'5') or starts-with($phone2,'6') or starts-with($phone2,'7') or starts-with($phone2,'8')">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">KontaktAdresata</xsl:attribute>

          <xsl:value-of select="$phone2"/>

        </xsl:element>

      </xsl:if>

      <xsl:variable name="title">

        <xsl:call-template name="TytulPrzelewu"/>

      </xsl:variable>

      <xsl:if test="$title!='' and s:DeliveryMethod/s:IsPayOnDelivery=1">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">PrzelewTytul</xsl:attribute>

          <xsl:value-of select="$title"/>

        </xsl:element>

      </xsl:if>

      <xsl:element name="Atrybut">

        <xsl:attribute name="Typ"/>

        <xsl:attribute name="Nazwa">Wersja</xsl:attribute>1</xsl:element>

      <xsl:variable name="description">

        <xsl:call-template name="Opis"/>

      </xsl:variable>

      <xsl:if test="$description!=''">

        <xsl:element name="Atrybut">

          <xsl:attribute name="Typ"/>

          <xsl:attribute name="Nazwa">Opis</xsl:attribute>

          <xsl:value-of select="$description"/>

        </xsl:element>

      </xsl:if>

    </xsl:element>

  </xsl:template>

</xsl:stylesheet>

Link to postu

No właśnie dziwiło mnie to bo po sprawdzeniu transformaty nie widziałem żeby coś było odnośnie ubezpieczenia a za każdym razem jak wgrywałem plik do EN zaznaczone było ubezpieczenie, a ja nie chce żeby się zaznaczało, ale jeśli zaznacza się automatycznie to ok. Najwyżej zadzwonię do PH i się dowiem czy to jest dodatkowo płatne czy też nie. Jak nie to nie będę tego odznaczał dzięki za szybką odpowiedz.

Link to postu

No właśnie dziwiło mnie to bo po sprawdzeniu transformaty nie widziałem żeby coś było odnośnie ubezpieczenia a za każdym razem jak wgrywałem plik do EN zaznaczone było ubezpieczenie, a ja nie chce żeby się zaznaczało, ale jeśli zaznacza się automatycznie to ok. Najwyżej zadzwonię do PH i się dowiem czy to jest dodatkowo płatne czy też nie. Jak nie to nie będę tego odznaczał dzięki za szybką odpowiedz.

 

Jest bezpłatne w standardzie dla klienta biznesowego, do 1000 zł:

http://media.poczta-polska.pl/pr/263293/poczta-polska-gwarantuje-termin-dostawy-paczek-i-daje-do-nich-bezplatne-ubezpieczenie

Link to postu
  • 3 tygodnie później...

Sprawdzilem kilka -- zawsze jakas przesylka jest bledna:

Potrzebuje listy nie rejestrowane, listy polecone ekonomiczne i priorytetowe,ekspres 24 i kurier 48 .

 

Dodatkowo czy po wyslaniu listy na serwer E-nadawcy -zapisuja sie w sello numery nadania ?

 

 

Napisz coś więcej o błędach na jakie napotykasz, może uda się coś poradzić.

 

Generalnie transformaty Poziego działają wszystkie. Problemy mogą być tylko z transformatami "zbiorczymi".

Tutaj jednak niezbędna jest wiedza z zakresu tworzenia transformat, bo każdy musi je sobie przerobić pod siebie, więc na początek lepiej zaczynać od transformat Poziego.

 

Numery nadawcze trzeba przepisać samemu, chyba, że masz przyznaną pulę numerów na poszczególne przesyłki z poczty, to wówczas nic nie trzeba przepisywać, bo to Sello nadaje numery a nie EN.

Link to postu

Obawiam się, że nie damy rady w tej wersji. Na początku mieliśmy w planach umieścić to zapytanie w bazie, a nawet w słowniku eksportu, jednak stwierdziliśmy, że będzie to już zbyt skomplikowane w obsłudze - stąd te uproszczenia.

 

Szkoda że zmieniliście zdanie :( To pozwoliłoby kontrolować w pełni eksport nawet jeżeli w Sello pojawią się jakieś dodatkowe dane nie uwzględnione wcześniej w schematach. A przy ilości możliwych kombinacji taka uniwersalność jest wskazana wg. mnie :) Będę cierpliwie czekała i ręcznie klepała numer paragonu do uwag w EN :(

Chociaż z drugiej strony patrząc może prościej i szybciej będzie jeżeli napiszę sobie integrator z api poczty?

Link to postu

Będę cierpliwie czekała i ręcznie klepała numer paragonu do uwag w EN :(

Chociaż z drugiej strony patrząc może prościej i szybciej będzie jeżeli napiszę sobie integrator z api poczty?

 

Wiem, że to nie szablonowe rozwiązanie ale jak masz wiedzę to bez problemu możesz wykorzystać inne eksportowane pole do przenoszenia numeru dokumentu plikiem eksportu. Jest to szybsze:

-niż robienie własnego integratora,

-ręczne klepanie numeru do uwaga w EN online.

 

Ja tak zrobiłem z numerem PniUp - eksportuję go w polu Nip w adresie do wysyłki - opisane w tym samym wątku: https://forum.sello.pl/index.php?topic=6309.msg41813#msg41813

 

Oczywiście nadal numer paragonu trzeba wpisać w to pole Nip w adresie do wysyłki ale  robi się to wszystko z poziomu Sello i potem eksportuje już tylko jeden, kompletny plik. Jest więc zdecydowanie szybciej niż wklepywanie numeru dokumentu ręcznie w EN online.

 

Zapewne są też inne eksportowane a nie wykorzystywane przez Ciebie pola.

Link to postu
Oczywiście nadal numer paragonu trzeba wpisać w to pole Nip w adresie do wysyłki ale  robi się to wszystko z poziomu Sello i potem eksportuje już tylko jeden, kompletny plik.

Ewentualnie jeśli już hakujemy, to można w bazie umieścić triggera, który przepisze numer dokumentu w inne pole przy zapisywaniu paczki. Nie mogę dać jednak żadnej gwarancji, że aktualizacja takiej bazy przejdzie bez problemów. Najbardziej prawdopodobny scenariusz będzie taki, że po aktualizacji trigger zniknie i trzeba będzie go przywrócić.

Link to postu

Oczywiście nadal numer paragonu trzeba wpisać w to pole Nip w adresie do wysyłki ale  robi się to wszystko z poziomu Sello i potem eksportuje już tylko jeden, kompletny plik. Jest więc zdecydowanie szybciej niż wklepywanie numeru dokumentu ręcznie w EN online.

 

Wolę uniknąć przeklejania, bo to takie pół rozwiązanie. ALe w sumie wskazane pole mogę wykorzystać do triggera i będzie pełny automat :)

 

Oczywiście nadal numer paragonu trzeba wpisać w to pole Nip w adresie do wysyłki ale  robi się to wszystko z poziomu Sello i potem eksportuje już tylko jeden, kompletny plik.

Ewentualnie jeśli już hakujemy, to można w bazie umieścić triggera, który przepisze numer dokumentu w inne pole przy zapisywaniu paczki. Nie mogę dać jednak żadnej gwarancji, że aktualizacja takiej bazy przejdzie bez problemów. Najbardziej prawdopodobny scenariusz będzie taki, że po aktualizacji trigger zniknie i trzeba będzie go przywrócić.

Plan triggera był na samym początku, ale zaczęłam przeglądać pola i nie bardzo mogłam wybrać jakieś, które by gdzieś potem nie kłuło - a tutaj PanBanBan mi podpowiedział więc może jednak zrobię to triggerem :)

Link to postu

Problem z rozpoznawaniem komórek

 

Stosuję rozwiązanie PanBanBana do sprawdzania, czy klient podał numer komórkowy.

 

Ale miałem oto taki przypadek:

Klient podał numer 52602XXXXXX

 

I transformata rozpoznała to jako komórkę !

 

Kto wie gdzie jest błąd - czy faktycznie była to komórka z numerem kierunkowym (52) pozostałym np. po starym numerze stacjonarnym, a może po prostu klient na końcu dopisał o jedną cyfrę za dużo i faktycznie jest to numer stacjonarny.

 

W zasadzie to nie jest ważne.

Ważne, że to nie jest poprawny numer i powinien być rozpoznany jako niepoprawny (czyli stacjonarny).

 

Ktoś wie jak poprawić to rozwiązanie, aby działało w takich przypadkach ?

 

Teraz wygląda to tak:

 


<xsl:variable name="phone" select="translate(s:DeliveryAddress/s:PhoneNumber,'- ()/','')"/>
<xsl:variable name="phone2" select="format-number(substring($phone,string-length($phone)-8,9),'000000000')"/>
<xsl:choose>
<xsl:when test="starts-with($phone2,'50') or starts-with($phone2,'51') or starts-with($phone2,'53') or starts-with($phone2,'57') or starts-with($phone2,'60') or starts-with($phone2,'66') or starts-with($phone2,'69') or starts-with($phone2,'72') or starts-with($phone2,'73') or starts-with($phone2,'78') or starts-with($phone2,'79') or starts-with($phone2,'88')">

....

 

Podejrzewam, że ten kod po prostu obcina 9 ostatnich cyferek i je porównuje i dlatego ten błędny numer uznał za poprawny.

 

Myślę, że trzeba brać numer od początku, a nie od końca, z pominięciem 48 i ewentualnego + i ewentualnych 00 i sprawdzać czy ma 9 cyfr bez tego wszystkiego i dopiero sprawdzać czy to pasuje do komórek.

 

???

Link to postu

A jeśli w podanym przez Ciebie przykładzie klient najzwyczajniej pomylił się i nacisną przez pomyłkę 2x którąś ze środkowych cyferek?

 

Niestety nie widzę możliwości żeby dało się uwzględnić każdy przypadek.

 

Branie numeru od końca wynikało z innych przesłanek - tzn generalnie na początku klienci wpisują co chcą: 0, +, 48, 00, i inne cuda, a koniec numeru to koniec numeru - nie da się tam nic dopisać.

 

Są standardy ilości cyfr w numerze telefonu i albo coś jest z prefiksem mobilnym albo nie jest. Metoda brania numeru od tyłu ;) uwzględnia wszystkie przypadki za wyjątkiem (no właśnie) kompletnych głupot i pomyłek, których niestety nie da się przewidzieć. Oby takie były sporadyczne :)

 

Nasz model sprawdzania jest okej (chyba że ktoś jeszcze znajdzie metodę na jego usprawnienie). To raczej pytanie dlaczego Allegro przepuściło taki numer podczas wypełniania przez klienta fod'a...

 

Link to postu

Allegro nie weryfikuje numerów. Przepuszcza nawiasy plusy i "wew.".

Tam jest chyba zwykłe pole tekstowe.

Dobrze, że klienci nie wpisują tam wiadomości.

 

Tak czy siak może ktoś wpadnie na pomysł jak naprawić wspomniany przypadek za pomocą transformat.

Najlepiej jak by było coś jak "trim" z możliwością zdefiniowania usuwanych znaków z przodu.

Niestety w XSLT 1 tego chyba nie ma....

 

 

Update:

W XSLT można też programować w C#

http://msdn.microsoft.com/en-us/magazine/cc302079.aspx

 

To by otwierało duże możliwości, jak tylko ktoś by umiał to okiełznać.  :D

 

Link to postu

Witam, mam taki problem. Listy polecone ekonomiczne wysyłam jako przesyłka firmowa rejestrowana i wszystko jest ok. Natomiast od niedawna wprowadziłem zwykłe listy ekonomiczne oraz priorytetowe, jednak gdy za pomocą tej samej formatki eksportuje je do przesyłki firmowej to EN pobiera je jako przesyłka firmowa nierejestrowana. Czy może mi ktoś pomóc abym mógł eksportować zwykłe ekonomiczne i priorytety jako przesyłki firmowe rejestrowane ?

Link to postu

Czy korzystasz z tych transformat od Poziego - po jednej dla każdego typu przesyłki ?

https://forum.sello.pl/index.php?action=dlattach;topic=6309.0;attach=1583

 

Jeśli tak, to powinny dobrze eksportować.

 

Może przez przypadek wziąłeś nie ten numer transformaty i dlatego nie eksportuje jako polecone?

 

Powiedz jeszcze czy tak było od początku, czy zmieniło się jakoś niedawno ?

 

No i jeszcze jedno - nie ma firmowych poleconych priorytetowych.

Musisz priorytetowe eksportować transformatą do poleconych niefirmowych.

 

Link to postu

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Użytkownik forum
Odpowiedz...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...