Automatyzacja wystawiania faktur z Allegro w biznesie kaletniczym

Trochę z innej beczki, choć nie do końca. Obowiązki związane ze sprawozdawczością sprzedażowo – podatkową są raczej niemiłe, nudne, frustrujące itp. Nawet pomijając już fakt, jak są uciążliwe dla małych firm i jak to, co oddamy, jest bezsensownie przepalane przez… no już nie będę brzydko pisał… to sam fakt ich istnienia jest przykrym doświadczeniem, więc warto zminimalizować czas i stres z nimi związane.

Chciałbym się podzielić sposobem, jak zautomatyzować wystawianie faktur z serwisu Allegro. Co najciekawsze, nie wymaga on płacenia za moduły e-commerce w popularnych narzędziach do rozliczeń księgowych. Jest oparty na darmowych narzędziach, udostępnionym za darmo kodzie wzorcowym, który zmodyfikowałem na swoją potrzebę. Taki ze mnie sprytny informatyk kopiuj – wklej.

Umówmy się, że ten post jest jeszcze w wersji rozwojowej i niezbyt przetestowanej. Opisałem, to co zadziałało u mnie. Myślę, że to fajna inspiracja dla kogoś przynajmniej średnio zaawansowanego w komputerach i szukającego rozwiązania na podobne problemy jak ja. Na przykład: czy kupować moduł ecommerce w aplikacji księgowej, który jest droższy niż podstawa. Dla kilkudziesięciu faktur w miesiącu taki arkusz wystarcza.

Z tego wpisu i jego treści korzystaj jak chcesz, jesli dzięki niemu zaoszczędzisz lub nawet zarobisz to super dla Ciebie 🙂

Utworzenie arkusza i ustawienie go jako aplikacji internetowej

  • Jeśli nie masz, to załóż sobie konto na google.
  • Kliknij link do arkusza: https://docs.google.com/spreadsheets/d/1WIta0WDZm-vo0RuZIW_EPoyGaNKzTagLkGYyOUGCqjU/edit?usp=sharing
  • Wejdź w link, później kliknij na Plik > Utwórz kopię w celu zapisania na swoim Dysku google.
  • Już na swoim własnym pliku kliknij Narzędza > Edytor skryptów
  • Po lewej wybierz plik oauth20.gs
  • W prawym górnym rogu kliknij Wdróż >Nowe wdrożenie > Aplikacja internetowa i ustaw poniższe:
    • Wykonaj jako JA
    • Każdy ma dostęp
  • Kliknij niebieski przycisk Wdróż, udziel aplikacji niezbędnych dostępów, przygotuj się na powiadomienie, że to co robisz jest niebezpieczne (ogólnie jest, bo gdyby tam był złośliwy kod, to mógłby np. skasować wszystkie Twoje maile albo fotki z Dysku google… ale zakładamy, że sobie ufamy)
  • Po przeładowaniu pojawi się okienko zawierające link do aplikacji internetowej.
  • Naciśnij Kopiuj, zamknij okienko i wklej ten adres do arkusza oauth > komórka B6 opisana Web App URL, ten adres będzie jeszcze potrzebny

Rejestracja aplikacji w Allegro API

  • Wejdź w https://apps.developer.allegro.pl/
  • Postępuj zgodnie z poleceniami, aby zarejestrować aplikację
    • Ustaw autoryzację 2 etapową
    • Kliknij Zarejestruj nową aplikację
    • Uzupełnij dane Nazwa aplikacji – cokolwiek, Opis – może zostać puste, wybierz opcję Aplikacja będzie posiadać dostęp do przeglądarki (…)
    • Adres URI do przekierowania, to ten który został skopiowany do arkusza po wdrożeniu aplikacji internetowej, to jest ważne, jeśli tu będzie literówka, to nic nie zadziała
    • Zapisz 🙂
  • Po uzupełnieniu całość powinna wyglądać jak na obrazku poniżej, z tym że będziesz mieć tylko jeden adres do przekierowań, u mnie jest kilka
  • Strzałki pokazują gdzie wpisać Client ID oraz Client Secret

„Logowanie” w API

Tak właściwie to uzyskanie hasła, w które trzeba zaopatrzyć każde zapytanie do bazy danych Allegro, żeby zadziałało.

  • W arkuszu oauth, po uzupełnieniu danych z poprzedniej sekcji, pojawi się kompletny link (komórka B3).
  • Kliknij w link, jeśli po kilku / kilkunastu sekundach w pojawi się okienko stwierdzające, że wszystko się udało, to skrypt automatycznie wypełni pola Access token i Bearer token z obrazka powyżej. Access token to hasło, żeby uzyskać bearer token, który jest hasłem do API.

Pobieranie danych

  • Wejdź do arkusza dane_faktura2
  • Kliknij obrazek z czerwonym przyciskiem
  • Poczekaj aż przemieli
  • Jeśli wszystko zostało dobrze zrobione, to w tym arkuszu pojawią się dane o 50 ostatnich zakpach na aktualnie zalogowanym koncie allegro

Generowanie faktury

  • Wejdź do arkusza faktura
  • Po prawej są 2 żólte pola
  • Pierwsze ustala, którą linię z arkusza dane_faktura2 program ma zaczytać do faktury, drugie to kolejny numer faktury
  • Dane swojej firmy wpisz w odpowiednich zielonych polach w arkuszu oauth
  • Ja faktury generuję tak:
    • Zaznaczam cały obszar faktury (pewnie to też można oskryptować)
    • Klikam Plik > Drukuj > Zaznaczone komórki
    • Drukuję do PDF

Przemyślenia końcowe

Wklejam jeszcze skrypty, od których to wszystko się zaczęło (niech będą na wierzchu, może wyszukiwarka lepiej je zindeksuje i ktoś je łatwiej znajdzie). Pierwotna wersja pochodzi z https://www.pbainbridge.co.uk/ i została zrobiona z myślą o integracji z Zoom. Tutaj jest to samo co w arkuszu, dostosowane pod Allegro. Moim zdaniem, autor oryginalnego skryptu mógłby w jakiś mniej jawny sposób przechowywać dane dostępowe Client Secret i Bearer Token, ale sam nie potrafię tego ulepszyć.

W przypadku pytań, zapraszam do komentarzy. Jeśli będę ogarniał dane zagadnienie/spotkałem się z podobnym kłopotem, to pomogę. Nie jestem informatykiem, raczej samoukiem, który uczy się tego, co jest mu potrzebne w pracy.

function doGet(e) {

// get authorisation code from returned Url
var authCode = JSON.stringify(e.parameter.code);
// remove quotes around the code
var authCodeClean = authCode.replace(/['"]+/g, '');
// run Function to add to Spreadsheet
saveIntoSheet(authCodeClean, 1);


// run Function to get Token from AuthCode
var accessToken = getToken(authCodeClean);


// check status of Access Token and display relevant message on webpage
if (accessToken) {

  // return message to webpage to inform user
  return HtmlService.createHtmlOutput('Udało się, możesz zamknąć tą zakładkę.');
  
}
else {
  // there was a problem getting Authentication Code

  // return message to webpage to inform user
  return HtmlService.createHtmlOutput('Nie udało się, możesz zamknąć tą zakładkę.');
};

};


// use Authorisation Code to get a Token
function getToken(authCodeClean) { 

var spreadsheet = SpreadsheetApp.getActive().getSheetByName("oauth");

// set authentication and get OAuthKeys
var clientID = spreadsheet.getRange("B4").getValue();
var clientSecret = spreadsheet.getRange("B5").getValue();
var encodedKeys = Utilities.base64Encode(clientID + ":" + clientSecret);

//Set the HTTP headers
var options = {
  'method': "post", 
  'headers': {"Authorization": "Basic " + encodedKeys},
};

// Web App URL linked to allegro OAuth App
var returnUrl = spreadsheet.getRange("B6").getValue();



// make allegro OAuth call
var response = UrlFetchApp.fetch("https://allegro.pl/auth/oauth/token?grant_type=authorization_code&code=" + authCodeClean + "&redirect_uri=" + returnUrl, options);


// run Function to add Access Token to Spreadsheet
var resultText = response.getContentText();
var resultObj = JSON.parse(resultText);
var accessToken = resultObj['access_token'];
var refreshToken = resultObj['refresh_token'];
saveIntoSheet(accessToken, 2);
saveIntoSheet(refreshToken, 15);

// return the Access Token value to the Parent Function
return accessToken; 

}

// Function to copy values into the Google Sheet.


function saveIntoSheet(value, row) {

var ss = SpreadsheetApp.getActive().getSheetByName("oauth");
var cell = ss.getRange(row, 2);
cell.setValue(value);


var d = new Date();
var currentTime = d.toLocaleTimeString(); // "12:35 PM", for instance
var cell = ss.getRange(row, 3);
cell.setValue(currentTime);
return;

};

Ten był trochę wzorowany na wpisie ze Stackoverflow, ale w większości to moja inwencja.

function pobierzdane_checkoutForms() {
//wpisz swój bearer token lub skorzystaj z podanej komórki w arkuszu
  var bearerToken = SpreadsheetApp.getActive().getSheetByName("oauth").getRange("B2").getValue();
//Obowiązkowe nagłówki zapytania, bez tego nie działa
  var options = {
    'method' : 'get',
    'headers' : {
      "Authorization" : 'Bearer ' + bearerToken,
      "Accept" : 'application/vnd.allegro.public.v1+json'
    }
  };
  var limit = 50; //limit - ile ostatnich sprzedaży pobrać
  var offset = 0; //offset - od której zacząć, 0 to znaczy że od najnowszej
  var query = "limit=" + limit + "&offset=" + offset;
  var response = UrlFetchApp.fetch('https://api.allegro.pl/order/checkout-forms?' + query, options);
  return response;
};
Shopping Cart
Verified by MonsterInsights