-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
support for downloading invoices from KSeF
- Loading branch information
Showing
18 changed files
with
643 additions
and
151 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
package commands | ||
|
||
import ( | ||
"flag" | ||
"fmt" | ||
registryPkg "ksef/internal/registry" | ||
"ksef/internal/sei/api/client" | ||
"ksef/internal/sei/api/sync" | ||
"path" | ||
"time" | ||
) | ||
|
||
type syncInvoicesCommand struct { | ||
Command | ||
} | ||
|
||
type syncInvoicesArgsType struct { | ||
params sync.SyncInvoicesConfig | ||
startDate string | ||
testGateway bool | ||
refresh string | ||
} | ||
|
||
var SyncInvoicesCommand *syncInvoicesCommand | ||
var syncInvoicesArgs = &syncInvoicesArgsType{} | ||
|
||
func init() { | ||
SyncInvoicesCommand = &syncInvoicesCommand{ | ||
Command: Command{ | ||
Name: "download", | ||
FlagSet: flag.NewFlagSet("download", flag.ExitOnError), | ||
Description: "Synchronizuje listę faktur z KSeF do katalogu lokalnego", | ||
Run: syncInvoicesRun, | ||
Args: syncInvoicesArgs, | ||
}, | ||
} | ||
|
||
SyncInvoicesCommand.FlagSet.BoolVar(&syncInvoicesArgs.testGateway, "t", false, "użyj bramki testowej") | ||
SyncInvoicesCommand.FlagSet.StringVar(&syncInvoicesArgs.params.DestPath, "d", "", "Katalog docelowy") | ||
SyncInvoicesCommand.FlagSet.BoolVar(&syncInvoicesArgs.params.Income, "income", false, "Synchronizuj faktury przychodowe (Podmiot1)") | ||
SyncInvoicesCommand.FlagSet.BoolVar(&syncInvoicesArgs.params.Cost, "cost", false, "Synchronizuj faktury kosztowe (Podmiot2)") | ||
SyncInvoicesCommand.FlagSet.BoolVar(&syncInvoicesArgs.params.Subject3, "subject3", false, "Synchronizuj faktury podmiotu innego (Podmiot3)") | ||
SyncInvoicesCommand.FlagSet.BoolVar(&syncInvoicesArgs.params.SubjectAuthorized, "subjectAuthorized", false, "Synchronizuj faktury podmiotu upoważnionego (???)") | ||
SyncInvoicesCommand.FlagSet.StringVar(&syncInvoicesArgs.params.SubjectTIN, "nip", "", "Numer NIP podmiotu") | ||
SyncInvoicesCommand.FlagSet.StringVar(&syncInvoicesArgs.startDate, "start-date", "", "Data początkowa") | ||
SyncInvoicesCommand.FlagSet.StringVar(&syncInvoicesArgs.params.IssuerToken, "token", "", "Token sesji interaktywnej lub nazwa zmiennej środowiskowej która go zawiera") | ||
// SyncInvoicesCommand.FlagSet.StringVar(&syncInvoicesArgs.params.Token, "token", "", "Token sesji") | ||
SyncInvoicesCommand.FlagSet.StringVar(&syncInvoicesArgs.refresh, "refresh", "", "odświeża istniejący rejestr faktur według istniejącego pliku") | ||
|
||
registerCommand(&SyncInvoicesCommand.Command) | ||
} | ||
|
||
func syncInvoicesRun(c *Command) error { | ||
var err error | ||
|
||
// is it a refresh operation? | ||
if syncInvoicesArgs.refresh != "" { | ||
registry, err := registryPkg.LoadRegistry(syncInvoicesArgs.refresh) | ||
if err != nil { | ||
return fmt.Errorf("nie udało się załadować pliku rejestru: %v", err) | ||
} | ||
syncInvoicesArgs.params.DestPath = path.Dir(syncInvoicesArgs.refresh) | ||
|
||
apiClient, err := client.APIClient_Init(registry.Environment) | ||
if err != nil { | ||
return fmt.Errorf("nieznane środowisko: %v", registry.Environment) | ||
} | ||
|
||
return sync.SyncInvoices(apiClient, &syncInvoicesArgs.params, registry) | ||
} | ||
|
||
// is it a new request? | ||
if syncInvoicesArgs.params.DestPath == "" || syncInvoicesArgs.startDate == "" || | ||
(!syncInvoicesArgs.params.Income && | ||
!syncInvoicesArgs.params.Cost && | ||
!syncInvoicesArgs.params.Subject3 && | ||
!syncInvoicesArgs.params.SubjectAuthorized) { | ||
c.FlagSet.Usage() | ||
return nil | ||
} | ||
|
||
if syncInvoicesArgs.params.StartDate, err = time.ParseInLocation("2006-01-02", syncInvoicesArgs.startDate, time.Now().Location()); err != nil { | ||
return fmt.Errorf("invalid date supplied: %s", syncInvoicesArgs.startDate) | ||
} | ||
|
||
environment := client.ProductionEnvironment | ||
if syncInvoicesArgs.testGateway { | ||
environment = client.TestEnvironment | ||
} | ||
|
||
gateway, err := client.APIClient_Init(environment) | ||
if err != nil { | ||
return fmt.Errorf("nieznane środowisko: %v", environment) | ||
} | ||
|
||
return sync.SyncInvoices(gateway, &syncInvoicesArgs.params, nil) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
# Pobieranie faktur | ||
|
||
```text | ||
./ksef download | ||
Usage of download: | ||
-cost | ||
Synchronizuj faktury kosztowe (Podmiot2) | ||
-d string | ||
Katalog docelowy | ||
-income | ||
Synchronizuj faktury przychodowe (Podmiot1) | ||
-nip string | ||
Numer NIP podmiotu | ||
-refresh string | ||
odświeża istniejący rejestr faktur według istniejącego pliku | ||
-start-date string | ||
Data początkowa | ||
-subject3 | ||
Synchronizuj faktury podmiotu innego (Podmiot3) | ||
-subjectAuthorized | ||
Synchronizuj faktury podmiotu upoważnionego (???) | ||
-t użyj bramki testowej | ||
``` | ||
|
||
Istnieje kilka przewidzianych trybów dla tej komendy. | ||
|
||
## Pobieranie listy faktur | ||
|
||
Najpierw wybierz rodzaj faktur który Cię interesuje: | ||
|
||
| przełącznik | znaczenie | | ||
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | ||
| `-income` | Faktury przychodowe, tj. wystawione przez Ciebie | | ||
| `-cost` | Faktury kosztowe | | ||
| `-subject3` | Faktury gdzie występujesz jako strona 3. Z tego co się orientuję jest to sytuacja taka kiedy jesteś zamawiającym ale nie płatnikiem | | ||
| `-subjectAuthorized` | Nie mam zielonego pojęcia do czego to służy. Czyżby jakaś opcja dla księgowych żeby mogli pobierać faktury swoich klientów? | | ||
|
||
parametr `-start-date` określa datę początkową filtrowania faktur. Jest to o tyle istotne, że ta wartość zostanie zapisana do pliku rejestru (więcej o tym w sekcji poniżej). Data końcowa to zawsze czas bieżący | ||
|
||
Przykładowe wywołanie: | ||
|
||
```shell | ||
./ksef download -t -nip 1111111111 -cost -d kosztowe/2023-12 -start-date 2023-12-01 | ||
``` | ||
|
||
## Synchronizowanie już pobranej listy faktur | ||
|
||
Ta opcja przewidziana jest dla sytuacji w której chcesz kilka razy w miesiącu synchronizować faktury. Czyli przykładowo jeśli w kroku poprzednim stworzyłeś katalog `kosztowe/2023-12` to możesz teraz go odświeżyć / zsynchronizować: | ||
|
||
```shell | ||
./ksef download -refresh kosztowe/2023-12/registry.yaml | ||
``` | ||
|
||
Jak widzisz, ilość parametrów jest znacznie mniejsza ponieważ wszystkie potrzebne dane znajdują się w pliku `registry.yaml`. Jeśli program zauważy, że jakaś faktura już znajduje się w rejestrze to ją pominie | ||
|
||
::: info | ||
KSeF udostępnia całkiem sporo danych w nagłówkach faktur więc serializuję je do pliku rejestru. Są tam takie informacje jak data wystawienia, rodzaj faktury, dane firmy itd itd. | ||
::: | ||
|
||
::: warning | ||
Ta opcja **nie** pobiera źródłowych faktur w formie XML i/lub PDF - od tego jest komenda `download-pdf`. Przyczyna jest prozaiczna - faktur może być sporo i wolałem rozdzielić te komendy na dwie osobne | ||
::: |
Oops, something went wrong.