Files changed (1) hide show
  1. templates/index.html +348 -209
templates/index.html CHANGED
@@ -1,209 +1,348 @@
1
- <!DOCTYPE html>
2
- <html lang="pl">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Generator faktur</title>
7
- <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
8
- </head>
9
- <body>
10
- <main class="container">
11
- <h1>Generator faktur</h1>
12
-
13
- <section id="setup-section" class="panel hidden">
14
- <h2>Konfiguracja danych firmy</h2>
15
- <form id="setup-form" class="form">
16
- <div class="field-grid">
17
- <label>
18
- Nazwa firmy
19
- <input type="text" name="company_name" required>
20
- </label>
21
- <label>
22
- Imie i nazwisko wlasciciela
23
- <input type="text" name="owner_name" required>
24
- </label>
25
- <label>
26
- Ulica i numer
27
- <input type="text" name="address_line" required>
28
- </label>
29
- <label>
30
- Kod pocztowy
31
- <input type="text" name="postal_code" required>
32
- </label>
33
- <label>
34
- Miejscowosc
35
- <input type="text" name="city" required>
36
- </label>
37
- <label>
38
- NIP
39
- <input type="text" name="tax_id" required>
40
- </label>
41
- <label>
42
- Numer konta bankowego
43
- <input type="text" name="bank_account" required>
44
- </label>
45
- <label>
46
- Haslo
47
- <input type="password" name="password" required>
48
- </label>
49
- <label>
50
- Powtorz haslo
51
- <input type="password" name="confirm_password" required>
52
- </label>
53
- </div>
54
- <button type="submit">Zapisz dane</button>
55
- <p class="hint">Dane przechowywane sa na serwerze lokalnym.</p>
56
- </form>
57
- <p id="setup-feedback" class="feedback"></p>
58
- </section>
59
-
60
- <section id="login-section" class="panel hidden">
61
- <h2>Logowanie</h2>
62
- <form id="login-form" class="form">
63
- <label>
64
- Haslo
65
- <input type="password" name="password" required>
66
- </label>
67
- <button type="submit">Zaloguj</button>
68
- </form>
69
- <p id="login-feedback" class="feedback"></p>
70
- </section>
71
-
72
- <section id="app-section" class="panel hidden">
73
- <header class="invoice-header">
74
- <h2>Panel faktur</h2>
75
- <button id="logout-button" type="button" class="link-button">Wyloguj</button>
76
- </header>
77
-
78
- <section class="business-section">
79
- <div class="business-section-header">
80
- <h3>Dane sprzedawcy</h3>
81
- <button id="toggle-business-form" type="button" class="link-button">Edytuj dane</button>
82
- </div>
83
- <div id="business-display" class="business-display"></div>
84
- <form id="business-form" class="form hidden">
85
- <div class="field-grid">
86
- <label>
87
- Nazwa firmy
88
- <input type="text" name="company_name" required>
89
- </label>
90
- <label>
91
- Imie i nazwisko wlasciciela
92
- <input type="text" name="owner_name" required>
93
- </label>
94
- <label>
95
- Ulica i numer
96
- <input type="text" name="address_line" required>
97
- </label>
98
- <label>
99
- Kod pocztowy
100
- <input type="text" name="postal_code" required>
101
- </label>
102
- <label>
103
- Miejscowosc
104
- <input type="text" name="city" required>
105
- </label>
106
- <label>
107
- NIP
108
- <input type="text" name="tax_id" required>
109
- </label>
110
- <label>
111
- Numer konta bankowego
112
- <input type="text" name="bank_account" required>
113
- </label>
114
- </div>
115
- <div class="form-actions">
116
- <button type="submit">Zapisz</button>
117
- <button id="cancel-business-update" type="button" class="link-button">Anuluj</button>
118
- </div>
119
- <p id="business-feedback" class="feedback"></p>
120
- </form>
121
- </section>
122
-
123
- <form id="invoice-form" class="form">
124
- <fieldset>
125
- <legend>Informacje o fakturze</legend>
126
- <label>
127
- Data sprzedazy / wykonania uslugi
128
- <input type="date" name="saleDate">
129
- </label>
130
- </fieldset>
131
-
132
- <fieldset>
133
- <legend>Dane nabywcy</legend>
134
- <div class="field-grid">
135
- <label>
136
- Nazwa / Imie i nazwisko
137
- <input type="text" name="clientName">
138
- </label>
139
- <label>
140
- NIP
141
- <input type="text" name="clientTaxId">
142
- </label>
143
- <label>
144
- Ulica i numer
145
- <input type="text" name="clientAddress">
146
- </label>
147
- <label>
148
- Kod pocztowy
149
- <input type="text" name="clientPostalCode">
150
- </label>
151
- <label>
152
- Miejscowosc
153
- <input type="text" name="clientCity">
154
- </label>
155
- </div>
156
- </fieldset>
157
-
158
- <section class="items-section">
159
- <header class="items-header">
160
- <h3>Pozycje faktury</h3>
161
- <button type="button" id="add-item-button">Dodaj pozycje</button>
162
- </header>
163
- <div class="items-table-wrapper">
164
- <table class="items-table">
165
- <thead>
166
- <tr>
167
- <th>Nazwa towaru/uslugi</th>
168
- <th>Ilosc</th>
169
- <th>Cena jedn. brutto (PLN)</th>
170
- <th>Stawka VAT</th>
171
- <th>Wartosc brutto (PLN)</th>
172
- <th></th>
173
- </tr>
174
- </thead>
175
- <tbody id="items-body"></tbody>
176
- </table>
177
- </div>
178
- </section>
179
-
180
- <div id="totals-container" class="totals">
181
- <span id="total-net">Suma netto: 0.00 PLN</span>
182
- <span id="total-vat">Kwota VAT: 0.00 PLN</span>
183
- <span id="total-gross">Suma brutto: 0.00 PLN</span>
184
- </div>
185
-
186
- <section id="rate-summary" class="rate-summary"></section>
187
-
188
- <div id="exemption-note-wrapper" class="hidden">
189
- <label>
190
- Podstawa prawna zwolnienia (stosowana dla pozycji ZW)
191
- <textarea id="exemption-note" rows="3" placeholder="np. Art. 43 ust. 1 pkt 19 ustawy o VAT"></textarea>
192
- </label>
193
- </div>
194
-
195
- <button type="submit">Generuj fakture</button>
196
- </form>
197
-
198
- <section id="invoice-result" class="panel hidden">
199
- <h3>Podglad faktury</h3>
200
- <div id="invoice-output" class="invoice-preview"></div>
201
- <button id="download-button" type="button">Pobierz jako plik PDF</button>
202
- </section>
203
- </section>
204
- </main>
205
-
206
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js" defer></script>
207
- <script src="{{ url_for('static', filename='js/main.js') }}" defer></script>
208
- </body>
209
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="pl">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Generator faktur</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;600;700&display=swap" rel="stylesheet">
10
+ <link rel="stylesheet" href="styles.css">
11
+ </head>
12
+ <body>
13
+ <main class="container">
14
+ <div class="header-section">
15
+ <div class="logo-container">
16
+ <img src="small_logotyp do strony.jpg" alt="Logotyp FakturON!" class="logo">
17
+ <h1 class="app-title">Generator faktur</h1>
18
+ </div>
19
+ <p class="app-description">
20
+ Strona internetowa, gdzie możesz zupełnie bezpłatnie wystawić fakturę, edytować ją,
21
+ przeglądać swoje faktury oraz śledzić przychody.
22
+ </p>
23
+ </div>
24
+
25
+ <section id="auth-section" class="panel">
26
+
27
+ <div class="auth-login">
28
+ <div class="auth-card login-card">
29
+ <h3>Zaloguj się</h3>
30
+ <form id="login-form" class="form">
31
+ <label>
32
+ Email
33
+ <input type="email" name="email" autocomplete="email" required>
34
+ </label>
35
+ <label>
36
+ Hasło
37
+ <input type="password" name="password" autocomplete="current-password" required>
38
+ </label>
39
+ <button type="submit">Zaloguj</button>
40
+ <hr class="form-divider">
41
+ </form>
42
+ <p id="login-feedback" class="feedback" aria-live="polite"></p>
43
+ <div class="auth-actions">
44
+ <span>Nie masz konta?</span>
45
+ <button id="show-register-button" type="button" class="ghost-button">Stwórz konto</button>
46
+ </div>
47
+ <p id="legacy-login-hint" class="hint hidden"></p>
48
+ </div>
49
+ </div>
50
+ </section>
51
+
52
+ <section id="register-section" class="panel hidden">
53
+ <div class="auth-card register-card">
54
+ <div class="register-header">
55
+ <h3>Załóż konto</h3>
56
+ <button id="back-to-login" type="button" class="link-button">Wróć do logowania</button>
57
+ </div>
58
+ <form id="register-form" class="form">
59
+ <div class="register-fields">
60
+ <div class="field-grid register-credentials">
61
+ <label>
62
+ Email
63
+ <input type="email" name="email" autocomplete="email" required>
64
+ </label>
65
+ <label>
66
+ Hasło
67
+ <input type="password" name="password" autocomplete="new-password" required>
68
+ </label>
69
+ <label>
70
+ Powtórz hasło
71
+ <input type="password" name="confirm_password" autocomplete="new-password" required>
72
+ </label>
73
+ </div>
74
+
75
+ <div class="field-grid register-company">
76
+ <label>
77
+ Nazwa firmy
78
+ <input type="text" name="company_name" required>
79
+ </label>
80
+ <label>
81
+ Imię i nazwisko właściciela
82
+ <input type="text" name="owner_name" required>
83
+ </label>
84
+ <label>
85
+ Ulica i numer
86
+ <input type="text" name="address_line" required>
87
+ </label>
88
+ <label>
89
+ Kod pocztowy
90
+ <input type="text" name="postal_code" required>
91
+ </label>
92
+ <label>
93
+ Miejscowość
94
+ <input type="text" name="city" required>
95
+ </label>
96
+ <label>
97
+ NIP
98
+ <input type="text" name="tax_id" required>
99
+ </label>
100
+ <label>
101
+ Numer konta bankowego
102
+ <input type="text" name="bank_account" required>
103
+ </label>
104
+ </div>
105
+ </div>
106
+ <div class="form-actions">
107
+ <button type="submit">Utwórz konto</button>
108
+ <button id="cancel-register" type="button" class="link-button">Anuluj</button>
109
+ </div>
110
+ </form>
111
+ <p id="register-feedback" class="feedback"></p>
112
+ <p class="hint">Dane konta przechowywane są lokalnie na serwerze.</p>
113
+ </div>
114
+ </section>
115
+
116
+ <section id="app-section" class="panel hidden">
117
+ <header class="app-header">
118
+ <div>
119
+ <h2>Panel faktur</h2>
120
+ <p id="current-login-label" class="app-subtitle"></p>
121
+ </div>
122
+ <nav class="app-nav">
123
+ <button type="button" class="app-nav-button active" data-view="invoice-builder">Nowa faktura</button>
124
+ <button type="button" class="app-nav-button" data-view="dashboard">Dashboard</button>
125
+ </nav>
126
+ <button id="logout-button" type="button" class="link-button">Wyloguj</button>
127
+ </header>
128
+
129
+ <section id="invoice-builder-section" class="app-view">
130
+ <section class="business-section">
131
+ <div class="business-section-header">
132
+ <h3>Dane sprzedawcy</h3>
133
+ <div class="business-actions">
134
+ <button id="toggle-business-form" type="button" class="link-button">Edycja danych</button>
135
+ <label for="logo-input" class="button secondary">
136
+ <input id="logo-input" type="file" accept="image/png,image/jpeg" hidden>
137
+ Wgraj logo
138
+ </label>
139
+ <button id="remove-logo-button" type="button" class="link-button hidden">Usuń logo</button>
140
+ </div>
141
+ </div>
142
+ <div id="business-display" class="business-display"></div>
143
+ <div id="logo-preview" class="logo-preview hidden">
144
+ <span class="logo-preview-label">Logo sprzedawcy</span>
145
+ <img id="logo-preview-image" alt="Logo firmy">
146
+ </div>
147
+ <p id="logo-feedback" class="feedback"></p>
148
+ <form id="business-form" class="form hidden">
149
+ <div class="field-grid">
150
+ <label>
151
+ Nazwa firmy
152
+ <input type="text" name="company_name" required>
153
+ </label>
154
+ <label>
155
+ Imię i nazwisko właściciela
156
+ <input type="text" name="owner_name" required>
157
+ </label>
158
+ <label>
159
+ Ulica i numer
160
+ <input type="text" name="address_line" required>
161
+ </label>
162
+ <label>
163
+ Kod pocztowy
164
+ <input type="text" name="postal_code" required>
165
+ </label>
166
+ <label>
167
+ Miejscowość
168
+ <input type="text" name="city" required>
169
+ </label>
170
+ <label>
171
+ NIP
172
+ <input type="text" name="tax_id" required>
173
+ </label>
174
+ <label>
175
+ Numer konta bankowego
176
+ <input type="text" name="bank_account" required>
177
+ </label>
178
+ </div>
179
+ <div class="form-actions">
180
+ <button type="submit">Zapisz</button>
181
+ <button id="cancel-business-update" type="button" class="link-button">Anuluj</button>
182
+ </div>
183
+ <p id="business-feedback" class="feedback"></p>
184
+ </form>
185
+ </section>
186
+
187
+ <form id="invoice-form" class="form">
188
+ <fieldset>
189
+ <legend>Informacje o fakturze</legend>
190
+ <div class="field-grid">
191
+ <label>
192
+ Data sprzedaży / wykonania usługi
193
+ <input type="date" name="saleDate">
194
+ </label>
195
+ <label>
196
+ Termin płatności (dni)
197
+ <input type="number" name="paymentTerm" min="1" step="1" value="14">
198
+ </label>
199
+ </div>
200
+ </fieldset>
201
+
202
+ <fieldset>
203
+ <legend>Dane nabywcy</legend>
204
+ <div class="field-grid">
205
+ <label>
206
+ Nazwa / Imię i nazwisko
207
+ <input type="text" name="clientName">
208
+ </label>
209
+ <label>
210
+ NIP
211
+ <input type="text" name="clientTaxId">
212
+ </label>
213
+ <label>
214
+ Ulica i numer
215
+ <input type="text" name="clientAddress">
216
+ </label>
217
+ <label>
218
+ Kod pocztowy
219
+ <input type="text" name="clientPostalCode">
220
+ </label>
221
+ <label>
222
+ Miejscowość
223
+ <input type="text" name="clientCity">
224
+ </label>
225
+ <label>
226
+ Numer telefonu
227
+ <input type="tel" name="clientPhone">
228
+ </label>
229
+ </div>
230
+ </fieldset>
231
+
232
+ <section class="items-section">
233
+ <header class="items-header">
234
+ <h3>Pozycje faktury</h3>
235
+ <button type="button" id="add-item-button">Dodaj pozycję</button>
236
+ </header>
237
+ <div class="items-table-wrapper">
238
+ <table class="items-table">
239
+ <thead>
240
+ <tr>
241
+ <th>Nazwa towaru/usługi</th>
242
+ <th>Ilość</th>
243
+ <th>Jednostka</th>
244
+ <th>Cena jedn. brutto (PLN)</th>
245
+ <th>Stawka VAT</th>
246
+ <th>Wartość brutto (PLN)</th>
247
+ <th></th>
248
+ </tr>
249
+ </thead>
250
+ <tbody id="items-body"></tbody>
251
+ </table>
252
+ </div>
253
+ </section>
254
+
255
+ <div id="totals-container" class="totals">
256
+ <span id="total-net">Suma netto: 0.00 PLN</span>
257
+ <span id="total-vat">Kwota VAT: 0.00 PLN</span>
258
+ <span id="total-gross">Suma brutto: 0.00 PLN</span>
259
+ </div>
260
+
261
+ <section id="rate-summary" class="rate-summary"></section>
262
+
263
+ <div id="exemption-note-wrapper" class="hidden">
264
+ <label for="exemption-reason">Powód zastosowania stawki ZW/0%</label>
265
+ <select id="exemption-reason" class="form-select">
266
+ <option value="">Wybierz podstawę zwolnienia...</option>
267
+ </select>
268
+ <label for="exemption-note" id="exemption-note-label">Podstawa prawna zwolnienia</label>
269
+ <textarea id="exemption-note" rows="3" placeholder="np. Art. 43 ust. 1 pkt 19 ustawy o VAT"></textarea>
270
+ </div>
271
+
272
+ <div class="form-actions">
273
+ <button type="submit" id="save-invoice-button">Generuj fakturę</button>
274
+ <button id="cancel-edit-invoice" type="button" class="link-button hidden">Anuluj edycję</button>
275
+ </div>
276
+ </form>
277
+
278
+ <section id="invoice-result" class="panel hidden">
279
+ <h3>Podgląd faktury</h3>
280
+ <div id="invoice-output" class="invoice-preview"></div>
281
+ <button id="download-button" type="button">Pobierz jako plik PDF</button>
282
+ </section>
283
+ </section>
284
+
285
+ <section id="dashboard-section" class="app-view hidden">
286
+ <header class="dashboard-header">
287
+ <div class="filters">
288
+ <label>
289
+ Od
290
+ <input type="date" id="filter-start-date">
291
+ </label>
292
+ <label>
293
+ Do
294
+ <input type="date" id="filter-end-date">
295
+ </label>
296
+ <button type="button" id="clear-filters" class="button secondary">Wyczyść</button>
297
+ </div>
298
+ <p id="dashboard-feedback" class="feedback"></p>
299
+ </header>
300
+
301
+ <section class="dashboard-summary">
302
+ <div class="summary-card">
303
+ <span class="summary-label">Ostatnie 30 dni</span>
304
+ <span id="summary-month-count" class="summary-count">0 faktur</span>
305
+ <span id="summary-month-amount" class="summary-amount">0.00 PLN</span>
306
+ </div>
307
+ <div class="summary-card">
308
+ <span class="summary-label">Bieżący kwartał</span>
309
+ <span id="summary-quarter-count" class="summary-count">0 faktur</span>
310
+ <span id="summary-quarter-amount" class="summary-amount">0.00 PLN</span>
311
+ </div>
312
+ <div class="summary-card">
313
+ <span class="summary-label">Bieżący rok</span>
314
+ <span id="summary-year-count" class="summary-count">0 faktur</span>
315
+ <span id="summary-year-amount" class="summary-amount">0.00 PLN</span>
316
+ </div>
317
+ </section>
318
+
319
+ <section class="dashboard-chart">
320
+ <canvas id="invoices-chart" aria-label="Podsumowanie faktur"></canvas>
321
+ </section>
322
+
323
+ <section class="dashboard-table">
324
+ <div class="items-table-wrapper">
325
+ <table class="items-table">
326
+ <thead>
327
+ <tr>
328
+ <th>Numer</th>
329
+ <th>Data wystawienia</th>
330
+ <th>Nabywca</th>
331
+ <th>Suma brutto</th>
332
+ <th>Akcje</th>
333
+ </tr>
334
+ </thead>
335
+ <tbody id="invoices-table-body"></tbody>
336
+ </table>
337
+ <p id="invoices-empty" class="hint hidden">Brak faktur do wyświetlenia.</p>
338
+ </div>
339
+ </section>
340
+ </section>
341
+ </section>
342
+ </main>
343
+
344
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js" defer></script>
345
+ <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.6/dist/chart.umd.min.js" defer></script>
346
+ <script src="main.js" defer></script>
347
+ </body>
348
+ </html>