From 1c200350f57469e890a124d07f741d836d9a0833 Mon Sep 17 00:00:00 2001 From: "wlodek.sp" Date: Wed, 11 Aug 2021 14:21:14 +0200 Subject: [PATCH] init --- README.md | 1 + app/__init__.py | 0 app/admin.py | 26 + app/ajax.py | 34 + app/apps.py | 9 + app/context_processors.py | 22 + app/ctrl/__init__.py | 144 + app/ctrl/fa.py | 267 + app/ctrl/kr.py | 209 + app/ctrl/mag.py | 35 + app/ctrl/sf.py | 501 + app/ctrl/vat/__init__.py | 33 + app/ctrl/vat/bra.py | 241 + app/ctrl/vat/gig.py | 426 + app/ctrl/vat/ichp.py | 281 + app/ctrl/vat/vat.py | 382 + app/ctrl/wb.py | 72 + app/deklaracja.py | 215 + app/forms.py | 202 + app/management/__init__.py | 0 app/management/commands/__init__.py | 0 app/management/commands/del_jpk.py | 36 + app/mf.py | 120 + app/middleware.py | 46 + app/migrations/0001_initial.py | 39 + app/migrations/0002_auto_20160424_2137.py | 41 + app/migrations/0003_auto_20160426_1328.py | 41 + app/migrations/0004_syn.py | 29 + app/migrations/0005_ctrl.py | 27 + app/migrations/0006_auto_20160427_1754.py | 19 + app/migrations/0007_auto_20160427_1758.py | 19 + app/migrations/0008_auto_20160427_1912.py | 25 + app/migrations/0009_ksi.py | 36 + app/migrations/0010_uzy.py | 22 + app/migrations/0011_ksiopi.py | 23 + app/migrations/0012_auto_20160428_1833.py | 28 + app/migrations/0013_auto_20160428_2035.py | 28 + app/migrations/0014_dow.py | 36 + ...015_fapopi_kon_magdok_magwiersz_zak_zlc.py | 277 + app/migrations/0016_zakzrv.py | 34 + app/migrations/0017_auto_20160516_1717.py | 67 + app/migrations/0018_srtmkv_srtvat.py | 45 + app/migrations/0019_zlctxt.py | 26 + app/migrations/0020_plik_odkad.py | 21 + app/migrations/0021_auto_20160601_1837.py | 20 + app/migrations/0022_syspar.py | 31 + app/migrations/0023_spo.py | 28 + app/migrations/0024_auto_20160615_2144.py | 36 + app/migrations/0025_plik_rachunek.py | 20 + app/migrations/0026_auto_20160617_1242.py | 36 + app/migrations/0027_auto_20160617_1721.py | 19 + app/migrations/0028_magdzial.py | 31 + app/migrations/0029_plik_magazyn.py | 20 + app/migrations/0030_auto_20160708_2200.py | 46 + app/migrations/0031_auto_20160708_2216.py | 21 + app/migrations/0032_auto_20160708_2359.py | 23 + app/migrations/0033_auto_20160709_1200.py | 23 + app/migrations/0034_auto_20160711_1543.py | 20 + app/migrations/0035_auto_20160713_1509.py | 67 + app/migrations/0036_auto_20160713_1818.py | 26 + app/migrations/0037_auto_20160713_1822.py | 20 + app/migrations/0038_auto_20160714_2255.py | 26 + app/migrations/0039_auto_20160716_2308.py | 26 + app/migrations/0040_auto_20160717_1835.py | 58 + app/migrations/0041_fakres.py | 27 + app/migrations/0042_blad.py | 29 + app/migrations/0043_plik_xls.py | 21 + app/migrations/0044_ctrl_xls.py | 21 + app/migrations/0045_plik_nazwa.py | 20 + app/migrations/0046_auto_20160824_2214.py | 20 + app/migrations/0047_storage_bramka.py | 20 + app/migrations/0048_auto_20160902_1637.py | 25 + app/migrations/0049_auto_20161006_1843.py | 86 + app/migrations/0050_auto_20161018_1809.py | 21 + app/migrations/0051_auto_20161116_1820.py | 21 + app/migrations/0052_firma.py | 42 + app/migrations/0053_auto_20161213_1856.py | 77 + app/migrations/0054_auto_20161215_1726.py | 22 + app/migrations/0055_plik_firma.py | 21 + app/migrations/0056_auto_20161215_1758.py | 20 + app/migrations/0057_auto_20161215_2103.py | 31 + app/migrations/0058_plik_cel_zlozenia.py | 20 + app/migrations/0059_plik_wariant.py | 20 + app/migrations/0060_userprofile.py | 26 + app/migrations/0061_auto_20170217_2216.py | 20 + app/migrations/0062_auto_20170218_2355.py | 20 + app/migrations/0063_auto_20170309_2100.py | 20 + app/migrations/0064_auto_20170311_1251.py | 20 + app/migrations/0065_auto_20180208_1919.py | 25 + app/migrations/0066_auto_20180219_1707.py | 70 + app/migrations/0067_firma_ostatni_plik.py | 21 + app/migrations/0068_auto_20180804_1345.py | 21 + app/migrations/0069_blad_level.py | 20 + app/migrations/0070_firma_krs.py | 20 + app/migrations/0071_auto_20191229_1548.py | 20 + app/migrations/0072_firma_api_url.py | 20 + app/migrations/0073_auto_20200221_1800.py | 20 + app/migrations/0074_auto_20200226_2152.py | 35 + app/migrations/0075_auto_20200227_1502.py | 20 + app/migrations/0076_auto_20200228_1312.py | 53 + app/migrations/0077_deklaracja_element.py | 20 + app/migrations/0078_auto_20200228_1520.py | 34 + app/migrations/0079_deklaracjapoz.py | 27 + app/migrations/0080_auto_20200228_2158.py | 25 + .../0081_deklaracjapoz_sumowanie.py | 20 + app/migrations/0082_auto_20200229_2113.py | 25 + app/migrations/0083_auto_20200304_1321.py | 25 + app/migrations/0084_auto_20200312_2145.py | 25 + app/migrations/0085_firma_api_auth.py | 20 + app/migrations/0086_plik_korekta.py | 20 + app/migrations/__init__.py | 0 app/model_fields.py | 162 + app/model_utils.py | 62 + app/models.py | 1171 + .../css/dataTables.bootstrap.css | 185 + .../css/dataTables.bootstrap.min.css | 1 + .../css/dataTables.foundation.css | 116 + .../css/dataTables.foundation.min.css | 1 + .../css/dataTables.jqueryui.css | 481 + .../css/dataTables.jqueryui.min.css | 1 + .../css/jquery.dataTables.css | 452 + .../css/jquery.dataTables.min.css | 1 + .../css/jquery.dataTables_themeroller.css | 416 + .../DataTables-1.10.12/images_/sort_asc.png | Bin 0 -> 160 bytes .../images_/sort_asc_disabled.png | Bin 0 -> 148 bytes .../DataTables-1.10.12/images_/sort_both.png | Bin 0 -> 201 bytes .../DataTables-1.10.12/images_/sort_desc.png | Bin 0 -> 158 bytes .../images_/sort_desc_disabled.png | Bin 0 -> 146 bytes .../js/dataTables.bootstrap.js | 182 + .../js/dataTables.bootstrap.min.js | 8 + .../js/dataTables.foundation.js | 174 + .../js/dataTables.foundation.min.js | 8 + .../js/dataTables.jqueryui.js | 164 + .../js/dataTables.jqueryui.min.js | 9 + .../js/jquery.dataTables.js | 15278 +++++++++ .../js/jquery.dataTables.min.js | 166 + app/static/DataTables/Polish.json | 22 + app/static/DataTables/datatables.css | 466 + app/static/DataTables/datatables.js | 26309 ++++++++++++++++ app/static/DataTables/datatables.min.css | 15 + app/static/DataTables/datatables.min.js | 187 + .../css/ie10-viewport-bug-workaround.css | 15 + .../assets/js/ie-emulation-modes-warning.js | 51 + .../assets/js/ie10-viewport-bug-workaround.js | 23 + .../assets/js/ie8-responsive-file-warning.js | 13 + app/static/bootstrap/css/bootstrap-theme.css | 587 + .../bootstrap/css/bootstrap-theme.css.map | 1 + .../bootstrap/css/bootstrap-theme.min.css | 6 + .../bootstrap/css/bootstrap-theme.min.css.map | 1 + app/static/bootstrap/css/bootstrap.css | 6760 ++++ app/static/bootstrap/css/bootstrap.css.map | 1 + app/static/bootstrap/css/bootstrap.min.css | 6 + .../bootstrap/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes app/static/bootstrap/js/bootstrap.js | 2363 ++ app/static/bootstrap/js/bootstrap.min.js | 7 + app/static/bootstrap/js/npm.js | 13 + app/static/bundle/jpk/jpk.js | 1 + app/static/bundle/sf/2.chunk.js | 2 + app/static/bundle/sf/3.chunk.js | 2 + app/static/bundle/sf/runtime~sf.js | 2 + app/static/bundle/sf/sf.chunk.js | 2 + app/static/bundle/sf/sf.js | 2 + ...ednostkaInnaStrukturyDanychSprFin_v1-0.xsd | 11804 +++++++ ...ednostkaInnaStrukturyDanychSprFin_v1-2.xsd | 11746 +++++++ .../css/JednostkaInnaWZlotych(1)_v1-0.xsd | 199 + app/static/css/KodyKrajow_v5-0E.xsd | 1258 + app/static/css/KodyKrajow_v6-0E.xsd | 1278 + ...KodyNaczelnikowUrzedowSkarbowych_v4-0E.xsd | 2010 ++ app/static/css/KodyPKD_v2-0E.xsd | 6367 ++++ .../css/KodyUrzedowSkarbowych_v3-0E.xsd | 2010 ++ .../css/KodyUrzedowSkarbowych_v5-0E.xsd | 2010 ++ .../css/KodyUrzedowSkarbowych_v6-0E.xsd | 2010 ++ app/static/css/NazwyPozycji_SF.xsd | 501 + app/static/css/Posredni_wspolne_v7-0E.xsl | 8 + app/static/css/Posredni_wspolne_v8-0E.xsl | 8 + app/static/css/StrukturyDanychSprFin_v1-1.xsd | 857 + app/static/css/StrukturyDanychSprFin_v1-2.xsd | 1014 + .../css/WspolneSzablonyWizualizacji_v2-0E.xsl | 1149 + .../css/WspolneSzablonyWizualizacji_v7-0E.xsl | 1153 + .../css/WspolneSzablonyWizualizacji_v8-0E.xsl | 1153 + app/static/css/deklaracja.css | 415 + app/static/css/dziennik.xsl | 65 + app/static/css/jpk.xsl | 72 + app/static/css/konto_zapis.xsl | 57 + app/static/css/sf.css | 268 + app/static/css/upo.css | 99 + app/static/css/upo.xsl | 134 + app/static/css/xsl.css | 31 + app/static/css/zois-csv.xsl | 14 + app/static/css/zois.xsl | 75 + app/static/data/objects.txt | 460 + app/static/files/vat-7-21.pdf | Bin 0 -> 162698 bytes app/static/font/Arial.ttf | Bin 0 -> 275572 bytes app/static/img/loading.gif | Bin 0 -> 4663 bytes app/static/img/xlsx.png | Bin 0 -> 6409 bytes app/static/img/xlsx32.png | Bin 0 -> 2479 bytes app/static/js/jpk.js | 1 + app/static/js/jquery.js | 11008 +++++++ app/static/js/jquery.min.js | 5 + app/static/js/main.js | 2 + app/static/js/react.js | 2 + app/static/js/runtime.js | 2 + app/static/xsd/DefinicjeTypy.html | 23 + .../xsd/ElementarneTypyDanych_v4-0E.xsd | 1 + app/static/xsd/JPK_FA.xsd | 605 + app/static/xsd/JPK_FA2.xsd | 632 + app/static/xsd/JPK_FA3.xsd | 762 + app/static/xsd/JPK_KR.xsd | 401 + app/static/xsd/JPK_MAG.xsd | 595 + app/static/xsd/JPK_SF.xsd | 205 + app/static/xsd/JPK_SF2.xsd | 211 + app/static/xsd/JPK_V7K.xsd | 1258 + app/static/xsd/JPK_V7M.xsd | 1269 + app/static/xsd/JPK_VAT.xsd | 459 + app/static/xsd/JPK_VAT2.xsd | 517 + app/static/xsd/JPK_VAT3.xsd | 517 + app/static/xsd/JPK_VAT4-2020-05.xsd | 1266 + app/static/xsd/JPK_VAT4K.xsd | 1248 + app/static/xsd/JPK_VAT4M.xsd | 1247 + app/static/xsd/JPK_WB.xsd | 220 + ...ednostkaInnaStrukturyDanychSprFin_v1-0.xsd | 11794 +++++++ ...ednostkaInnaStrukturyDanychSprFin_v1-2.xsd | 11746 +++++++ app/static/xsd/KodyCECHKRAJOW.html | 18 + app/static/xsd/KodyCechKrajow_v3-0E.xsd | 1082 + app/static/xsd/KodyKrajow_v4-1E.xsd | 1258 + ...KodyNaczelnikowUrzedowSkarbowych_v3-0E.xsd | 410 + .../xsd/KodyUrzedowSkarbowych_v4-0E.xsd | 2010 ++ app/static/xsd/StrukturyDanychSprFin_v1-0.xsd | 857 + app/static/xsd/StrukturyDanychSprFin_v1-1.xsd | 857 + app/static/xsd/StrukturyDanychSprFin_v1-2.xsd | 1014 + app/static/xsd/StrukturyDanych_v4-0E.xsd | 1 + app/static/xsd/StrukturyDanych_v5-0E.xsd | 1 + app/tasks.py | 280 + app/templates/404.html | 7 + app/templates/500.html | 11 + app/templates/app/ajax/firma.json | 9 + app/templates/app/ajax/lista_firm.json | 6 + app/templates/app/alert.html | 7 + app/templates/app/app.html | 97 + app/templates/app/bledy.html | 21 + app/templates/app/body.html | 10 + app/templates/app/deklaracja.html | 48 + app/templates/app/deklaracja_bak.html | 447 + app/templates/app/deklaracja_form.html | 402 + app/templates/app/firma.html | 209 + app/templates/app/firmy.html | 18 + app/templates/app/head.html | 1 + app/templates/app/initupload.xml | 30 + app/templates/app/modal/initupload.html | 26 + app/templates/app/modal/menu.html | 84 + app/templates/app/modal/nazwa.html | 29 + app/templates/app/modal/sfupload.html | 25 + app/templates/app/modal/tworzenie.html | 126 + app/templates/app/modal/upload.html | 28 + app/templates/app/modal/usun.html | 27 + app/templates/app/page.html | 129 + app/templates/app/page_nav.html | 44 + app/templates/app/page_sf.html | 84 + app/templates/app/plik.html | 35 + app/templates/app/react.html | 5 + app/templates/app/row/JPK_FA.html | 22 + app/templates/app/row/JPK_KR.html | 32 + app/templates/app/row/JPK_MAG.html | 42 + app/templates/app/row/JPK_SF.html | 59 + app/templates/app/row/JPK_VAT.html | 48 + app/templates/app/row/JPK_WB.html | 29 + app/templates/app/sf/dodatkowe.html | 17 + app/templates/app/sf/podatek.html | 17 + app/templates/app/sf/raport.html | 17 + app/templates/app/sf/sf.xsl | 1659 + app/templates/app/sf/sf2.xsl | 1654 + app/templates/app/sf/wprowadz.html | 17 + app/templates/app/status.html | 12 + app/templates/app/tabela.html | 20 + app/templates/app/td_status.html | 6 + app/templates/app/upload.html | 71 + app/templates/app/upload/finish.html | 9 + app/templates/app/upload/init.html | 14 + app/templates/app/upload/put.html | 12 + app/templates/app/upload/status.html | 20 + app/templates/app/upload/upo.html | 5 + app/templates/app/validate.html | 24 + app/templates/app/wyciag.html | 21 + app/templates/app/xml/fa/faktura.xml | 83 + app/templates/app/xml/fa/faktura3.xml | 88 + app/templates/app/xml/fa/naglowek3.xml | 9 + app/templates/app/xml/fa/podmiot3.xml | 21 + app/templates/app/xml/fa/wiersz.xml | 24 + app/templates/app/xml/fa/wiersz3.xml | 24 + app/templates/app/xml/jpk_fa.xml | 14 + app/templates/app/xml/jpk_fa2.xml | 14 + app/templates/app/xml/jpk_fa3.xml | 14 + app/templates/app/xml/jpk_kr.xml | 16 + app/templates/app/xml/jpk_mag.xml | 17 + app/templates/app/xml/jpk_sf.xml | 26 + app/templates/app/xml/jpk_sf2.xml | 27 + app/templates/app/xml/jpk_vat.xml | 14 + app/templates/app/xml/jpk_vat2.xml | 14 + app/templates/app/xml/jpk_vat3.xml | 14 + app/templates/app/xml/jpk_vat4.xml | 26 + app/templates/app/xml/jpk_wb.xml | 14 + app/templates/app/xml/kr/dziennik.xml | 24 + app/templates/app/xml/kr/konto_zapis.xml | 25 + app/templates/app/xml/kr/zois.xml | 27 + app/templates/app/xml/mag/mm.xml | 36 + app/templates/app/xml/mag/pz.xml | 37 + app/templates/app/xml/mag/rw.xml | 36 + app/templates/app/xml/mag/wz.xml | 37 + app/templates/app/xml/naglowek.xml | 10 + app/templates/app/xml/naglowek2.xml | 10 + app/templates/app/xml/naglowek3.xml | 9 + app/templates/app/xml/podmiot.xml | 22 + app/templates/app/xml/podmiot2.xml | 22 + app/templates/app/xml/podmiot3.xml | 5 + app/templates/app/xml/sf/bilans.xml | 6 + app/templates/app/xml/sf/dodatkowe.xml | 6 + app/templates/app/xml/sf/dodatkowe2.xml | 6 + app/templates/app/xml/sf/kapital.xml | 7 + app/templates/app/xml/sf/naglowek.xml | 9 + app/templates/app/xml/sf/naglowek2.xml | 9 + app/templates/app/xml/sf/podatek.xml | 77 + app/templates/app/xml/sf/pozycja.xml | 25 + app/templates/app/xml/sf/pozycja2.xml | 25 + app/templates/app/xml/sf/przeplywy.xml | 7 + app/templates/app/xml/sf/przeplywy2.xml | 7 + app/templates/app/xml/sf/rzis.xml | 5 + app/templates/app/xml/sf/wprowadzenie.xml | 69 + app/templates/app/xml/sf/wprowadzenie2.xml | 70 + app/templates/app/xml/sf/zalaczniki.xml | 11 + app/templates/app/xml/vat/deklaracja4.xml | 24 + app/templates/app/xml/vat/naglowek4.xml | 10 + app/templates/app/xml/vat/podmiot4.xml | 8 + app/templates/app/xml/vat/sprzedaz.xml | 48 + app/templates/app/xml/vat/sprzedaz2.xml | 51 + app/templates/app/xml/vat/sprzedaz3.xml | 53 + app/templates/app/xml/vat/sprzedaz4.xml | 58 + app/templates/app/xml/vat/zakup.xml | 24 + app/templates/app/xml/vat/zakup2.xml | 28 + app/templates/app/xml/vat/zakup3.xml | 30 + app/templates/app/xml/vat/zakup4.xml | 44 + app/templates/app/xml/wb/salda.xml | 7 + app/templates/app/xml/wb/wiersz.xml | 17 + .../app/xsd/ElementarneTypyDanych_v4-0E.xsd | 1 + .../app/xsd/KodyCechKrajow_v3-0E.xsd | 1082 + .../app/xsd/StrukturyDanych_v4-0E.xsd | 1 + app/templates/app/xsl/styl-2020-03.orig.xsl | 1879 ++ app/templates/app/xsl/styl-2020-03.xsl | 1908 ++ app/templates/app/xsl/styl-2020-05.orig.xsl | 1935 ++ app/templates/app/xsl/styl-2020-05.xsl | 1951 ++ app/templates/registration/login.html | 42 + .../registration/password_change_form.html | 40 + app/templates/registration/profil.html | 16 + app/templates/utils/alert.html | 5 + app/templates/utils/body_text.html | 36 + app/templates/utils/change_log.html | 6 + app/templates/utils/checkbox.html | 34 + app/templates/utils/closePopup.html | 3 + app/templates/utils/dynamic_add.html | 3 + app/templates/utils/filtr.html | 68 + app/templates/utils/form.html | 129 + app/templates/utils/form_dla_par.html | 18 + app/templates/utils/link_button.html | 1 + app/templates/utils/log.html | 26 + app/templatetags/__init__.py | 0 app/templatetags/utils.py | 146 + app/tests/__init__.py | 71 + app/tests/models/__init__.py | 0 app/tests/models/test_plik.py | 210 + app/tests/tasks/__init__.py | 0 app/tests/tasks/test_fa.py | 914 + app/tests/tasks/test_kr.py | 243 + app/tests/tasks/test_mag.py | 335 + app/tests/tasks/test_tasks.py | 47 + app/tests/tasks/test_vat.py | 740 + app/tests/tasks/test_wb.py | 85 + app/tests/views/JPK_VAT-100.xml | 60 + app/tests/views/__init__.py | 0 app/tests/views/test_views.py | 422 + app/tests/views/upo-p.xml | 58 + app/tests/views/upo-t.xml | 1 + app/tests/wyciagi/__init__.py | 0 app/tests/wyciagi/ing.sta | 27 + app/tests/wyciagi/mbank.sta | 20 + app/tests/wyciagi/mbank_end.sta | 11 + app/tests/wyciagi/test_ing.py | 38 + app/tests/wyciagi/test_mbank.py | 48 + app/tests/wyslij/JPK_VAT-100.xml | 60 + app/tests/wyslij/__init__.py | 0 app/tests/wyslij/status-p.json | 1 + app/tests/wyslij/status-t.json | 1 + app/tests/wyslij/test_mf.py | 168 + app/tests/wyslij/test_wyslij.py | 600 + app/urls.py | 66 + app/utils.py | 107 + app/views.py | 1007 + app/wyciagi.py | 226 + app/wyslij.py | 455 + app/xls/__init__.py | 98 + app/xls/fa.py | 311 + app/xls/fa3.py | 312 + app/xls/kr.py | 348 + app/xls/mag.py | 315 + app/xls/utils.py | 33 + app/xls/vat.py | 223 + app/xls/vat2.py | 266 + app/xls/vat4.py | 400 + app/xls/wb.py | 100 + bra/__init__.py | 0 bra/admin.py | 3 + bra/api/__init__.py | 0 bra/api/dokumenty.py | 251 + bra/api/sprzedaz/__init__.py | 0 bra/api/sprzedaz/forms.py | 21 + bra/api/sprzedaz/sprzedaz.py | 452 + bra/api/sprzedaz/urls.py | 18 + bra/api/sprzedaz/views.py | 107 + bra/api/sprzedaz/xls.py | 221 + bra/api/zakupy/__init__.py | 0 bra/api/zakupy/forms.py | 21 + bra/api/zakupy/urls.py | 19 + bra/api/zakupy/views.py | 106 + bra/api/zakupy/xls.py | 221 + bra/api/zakupy/zakupy.py | 460 + bra/apps.py | 5 + bra/forms.py | 34 + bra/migrations/0001_initial.py | 46 + bra/migrations/0002_faktura_nip_nabywcy.py | 20 + bra/migrations/0003_auto_20170128_2142.py | 40 + bra/migrations/0004_wiersz.py | 33 + bra/migrations/0005_auto_20170311_1251.py | 42 + bra/migrations/0006_auto_20170311_1410.py | 35 + bra/migrations/0007_auto_20170311_1435.py | 25 + bra/migrations/0008_auto_20170311_1851.py | 29 + bra/migrations/0009_auto_20170311_2257.py | 31 + bra/migrations/0010_auto_20170312_1700.py | 51 + bra/migrations/0011_auto_20170312_1902.py | 20 + bra/migrations/0012_auto_20170312_1937.py | 60 + bra/migrations/0013_auto_20170313_1312.py | 25 + bra/migrations/0014_auto_20170313_1314.py | 25 + bra/migrations/0015_auto_20170314_1825.py | 25 + bra/migrations/0016_auto_20170315_2247.py | 19 + bra/migrations/0017_kontrahent.py | 23 + bra/migrations/0018_importzakupow.py | 33 + bra/migrations/0019_auto_20200220_1911.py | 55 + bra/migrations/0020_importzakupow_xls.py | 21 + bra/migrations/0021_apisprzedaz.py | 39 + bra/migrations/__init__.py | 0 bra/models.py | 446 + bra/sprzedaz.py | 578 + bra/templates/api/sprzedaz/import.html | 41 + bra/templates/api/sprzedaz/importy.html | 94 + bra/templates/api/sprzedaz/rozwin.html | 15 + bra/templates/api/zakupy/import.html | 41 + bra/templates/api/zakupy/importy.html | 94 + bra/templates/api/zakupy/rozwin.html | 15 + bra/templates/bra/faktury.html | 26 + bra/templates/bra/sprzedaz/akceptacja.html | 29 + bra/templates/bra/sprzedaz/do_rejestru.html | 65 + bra/templates/bra/sprzedaz/import.html | 63 + bra/templates/bra/sprzedaz/importy.html | 86 + bra/templates/bra/sprzedaz/koniec.html | 48 + bra/templates/bra/sprzedaz/pliki.html | 45 + bra/templates/bra/sprzedaz/podsumowanie.html | 37 + bra/templates/bra/sprzedaz/postep.html | 57 + bra/templates/bra/sprzedaz/rozwin.html | 16 + bra/templates/bra/sprzedaz/stawki.html | 43 + bra/tests.py | 3 + bra/urls.py | 29 + bra/views.py | 255 + bra/xls.py | 219 + celery | 14 + dez/__init__.py | 0 dez/admin.py | 3 + dez/apps.py | 5 + dez/delegacje.py | 224 + dez/migrations/__init__.py | 0 dez/models.py | 3 + dez/templates/dez/email.txt | 10 + dez/tests.py | 3 + dez/urls.py | 14 + dez/views.py | 19 + doc/initupload.json | 143 + doc/upo.xml | 78 + env | 11 + fk/__init__.py | 0 fk/admin.py | 3 + fk/apps.py | 7 + fk/migrations/0001_initial.py | 567 + fk/migrations/0002_kasdow_kaspoz.py | 50 + fk/migrations/0003_zakpoz.py | 35 + fk/migrations/0004_magnumer.py | 31 + fk/migrations/0005_sysdan.py | 38 + fk/migrations/0006_syskli.py | 29 + fk/migrations/0007_auto_20170313_1312.py | 19 + fk/migrations/0008_defnum_fakzaf.py | 45 + fk/migrations/0009_zakkos.py | 30 + fk/migrations/__init__.py | 0 fk/models.py | 1753 + fk/tests/__init__.py | 0 fk/tests/models/__init__.py | 0 fk/tests/models/test_zak.py | 77 + fk/views.py | 3 + jpk/__init__.py | 7 + jpk/dbrouter.py | 10 + jpk/jpk_celery.py | 19 + jpk/urls.py | 35 + jpk/uwsgi.ini | 22 + jpk/uwsgi_params | 15 + jpk/wsgi.py | 16 + klucz_mf.pem | 9 + klucz_mf_p.pem | 9 + manage.py | 10 + node/jpk/package-lock.json | 5770 ++++ node/jpk/package.json | 26 + node/jpk/src/body.html | 10 + node/jpk/src/head.html | 3 + node/jpk/src/index.js | 193 + node/jpk/src/jpk.css | 224 + node/jpk/src/rows.js | 56 + node/jpk/src/tables.js | 149 + node/jpk/src/timer.js | 127 + node/jpk/src/validation.js | 39 + node/jpk/webpack.config.js | 68 + node/sprawozdania/.gitignore | 23 + node/sprawozdania/README.md | 68 + node/sprawozdania/b | 13 + node/sprawozdania/config/env.js | 93 + node/sprawozdania/config/jest/cssTransform.js | 14 + .../sprawozdania/config/jest/fileTransform.js | 31 + node/sprawozdania/config/paths.js | 89 + node/sprawozdania/config/webpack.config.js | 606 + .../config/webpackDevServer.config.js | 104 + node/sprawozdania/package-lock.json | 16686 ++++++++++ node/sprawozdania/package.json | 121 + node/sprawozdania/public/favicon.ico | Bin 0 -> 3870 bytes node/sprawozdania/public/index.html | 41 + node/sprawozdania/public/manifest.json | 15 + node/sprawozdania/public/prod.html | 5 + node/sprawozdania/public/sf.css | 272 + node/sprawozdania/scripts/build.js | 192 + node/sprawozdania/scripts/start.js | 132 + node/sprawozdania/scripts/test.js | 60 + node/sprawozdania/src/Utils.js | 33 + node/sprawozdania/src/XmlJson.js | 25 + .../src/components/dodatkowe/Dodatkowe.js | 21 + .../src/components/dodatkowe/Lista.js | 37 + .../src/components/dodatkowe/Skrot.js | 36 + .../src/components/dodatkowe/Zalacznik.js | 113 + node/sprawozdania/src/components/forms.js | 70 + .../src/components/podatek/Podatek.js | 454 + .../src/components/podatek/PodatekWiersz.js | 195 + .../src/components/raport/Raport.js | 267 + .../src/components/raport/Wiersz.js | 186 + .../wprowadzenie/Uszczegolowienie.js | 44 + .../wprowadzenie/UszczegolowienieSkrot.js | 50 + .../src/components/wprowadzenie/WprSekcja.js | 72 + .../src/components/wprowadzenie/Wprowadz.js | 432 + .../src/components/wprowadzenie/Wprowadz1.js | 61 + .../src/components/wprowadzenie/Wprowadz2.js | 24 + .../src/components/wprowadzenie/Wprowadz3.js | 27 + .../src/components/wprowadzenie/Wprowadz4.js | 19 + .../src/components/wprowadzenie/Wprowadz5.js | 19 + .../src/components/wprowadzenie/Wprowadz6.js | 18 + .../src/components/wprowadzenie/Wprowadz7.js | 59 + .../src/components/wprowadzenie/Wprowadz8.js | 29 + node/sprawozdania/src/index.css | 14 + node/sprawozdania/src/index.js | 25 + node/sprawozdania/src/logo.svg | 7 + node/sprawozdania/src/serviceWorker.js | 135 + node/sprawozdania/src/utils/api.js | 54 + node/sprawozdania/src/utils/utils.js | 36 + node/sprawozdania/src/utils/wyroznienia.js | 45 + polon/__init__.py | 0 polon/admin.py | 35 + polon/apps.py | 5 + polon/forms.py | 36 + polon/migrations/0001_initial.py | 65 + polon/migrations/0002_auto_20170218_2355.py | 44 + polon/migrations/0003_auto_20170219_0130.py | 26 + polon/migrations/0004_auto_20170219_1443.py | 50 + polon/migrations/0005_remove_faktura_opis.py | 19 + polon/migrations/0006_faktura_opis.py | 20 + polon/migrations/0007_auto_20170219_1551.py | 24 + polon/migrations/0008_auto_20170219_1553.py | 25 + polon/migrations/0009_auto_20170219_2308.py | 24 + polon/migrations/0010_auto_20170220_0010.py | 19 + polon/migrations/__init__.py | 0 polon/models.py | 73 + polon/templates/polon/czekaj.html | 43 + polon/templates/polon/faktury.html | 81 + polon/templates/polon/link.html | 20 + polon/templates/polon/page.html | 75 + polon/templates/polon/polon.html | 5 + polon/templates/polon/status.json | 1 + polon/tests.py | 3 + polon/urls.py | 22 + polon/views.py | 387 + polon/xls.py | 139 + requirements.txt | 16 + restart | 25 + sf/__init__.py | 0 sf/admin.py | 3 + sf/api/__init__.py | 31 + sf/api/dodatkowe.py | 142 + sf/api/podatek.py | 110 + sf/api/raport.py | 118 + sf/api/views.py | 196 + sf/api/wprowadz.py | 166 + sf/apps.py | 5 + sf/migrations/0001_initial.py | 60 + sf/migrations/0002_auto_20181205_1313.py | 20 + sf/migrations/0003_pozycja_oblicz.py | 20 + sf/migrations/0004_pozycja_zalezne.py | 20 + sf/migrations/0005_auto_20181207_1740.py | 20 + sf/migrations/0006_pozycja_kontener.py | 20 + sf/migrations/0007_pozycja_wymagana.py | 20 + sf/migrations/0008_auto_20181208_2204.py | 144 + sf/migrations/0009_auto_20181208_2208.py | 80 + sf/migrations/0010_raport_tabela.py | 20 + sf/migrations/0011_auto_20181213_1903.py | 192 + sf/migrations/0012_auto_20181213_1905.py | 70 + sf/migrations/0013_pozycja_el.py | 21 + sf/migrations/0014_auto_20191229_1548.py | 30 + sf/migrations/__init__.py | 0 sf/models.py | 475 + sf/tests.py | 3 + sf/urls.py | 72 + .../css/dataTables.bootstrap.css | 185 + .../css/dataTables.bootstrap.min.css | 1 + .../css/dataTables.foundation.css | 116 + .../css/dataTables.foundation.min.css | 1 + .../css/dataTables.jqueryui.css | 481 + .../css/dataTables.jqueryui.min.css | 1 + .../css/jquery.dataTables.css | 452 + .../css/jquery.dataTables.min.css | 1 + .../css/jquery.dataTables_themeroller.css | 416 + .../DataTables-1.10.12/images_/sort_asc.png | Bin 0 -> 160 bytes .../images_/sort_asc_disabled.png | Bin 0 -> 148 bytes .../DataTables-1.10.12/images_/sort_both.png | Bin 0 -> 201 bytes .../DataTables-1.10.12/images_/sort_desc.png | Bin 0 -> 158 bytes .../images_/sort_desc_disabled.png | Bin 0 -> 146 bytes .../js/dataTables.bootstrap.js | 182 + .../js/dataTables.bootstrap.min.js | 8 + .../js/dataTables.foundation.js | 174 + .../js/dataTables.foundation.min.js | 8 + .../js/dataTables.jqueryui.js | 164 + .../js/dataTables.jqueryui.min.js | 9 + .../js/jquery.dataTables.js | 15278 +++++++++ .../js/jquery.dataTables.min.js | 166 + static/DataTables/Polish.json | 22 + static/DataTables/datatables.css | 466 + static/DataTables/datatables.js | 26309 ++++++++++++++++ static/DataTables/datatables.min.css | 15 + static/DataTables/datatables.min.js | 187 + static/admin/css/base.css | 967 + static/admin/css/changelists.css | 341 + static/admin/css/dashboard.css | 30 + static/admin/css/fonts.css | 20 + static/admin/css/forms.css | 499 + static/admin/css/login.css | 78 + static/admin/css/rtl.css | 256 + static/admin/css/widgets.css | 565 + static/admin/fonts/LICENSE.txt | 202 + static/admin/fonts/README.txt | 2 + static/admin/fonts/Roboto-Bold-webfont.woff | Bin 0 -> 82564 bytes static/admin/fonts/Roboto-Light-webfont.woff | Bin 0 -> 81348 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 0 -> 80304 bytes static/admin/img/LICENSE | 20 + static/admin/img/README.txt | 7 + static/admin/img/calendar-icons.svg | 14 + static/admin/img/gis/move_vertex_off.svg | 1 + static/admin/img/gis/move_vertex_on.svg | 1 + static/admin/img/icon-addlink.svg | 3 + static/admin/img/icon-alert.svg | 3 + static/admin/img/icon-calendar.svg | 9 + static/admin/img/icon-changelink.svg | 3 + static/admin/img/icon-clock.svg | 9 + static/admin/img/icon-deletelink.svg | 3 + static/admin/img/icon-no.svg | 3 + static/admin/img/icon-unknown-alt.svg | 3 + static/admin/img/icon-unknown.svg | 3 + static/admin/img/icon-yes.svg | 3 + static/admin/img/inline-delete.svg | 3 + static/admin/img/search.svg | 3 + static/admin/img/selector-icons.svg | 34 + static/admin/img/sorting-icons.svg | 19 + static/admin/img/tooltag-add.svg | 3 + static/admin/img/tooltag-arrowright.svg | 3 + static/admin/js/SelectBox.js | 135 + static/admin/js/SelectFilter2.js | 198 + static/admin/js/actions.js | 146 + static/admin/js/actions.min.js | 6 + static/admin/js/admin/DateTimeShortcuts.js | 364 + static/admin/js/admin/RelatedObjectLookups.js | 189 + static/admin/js/calendar.js | 178 + static/admin/js/collapse.js | 26 + static/admin/js/collapse.min.js | 2 + static/admin/js/core.js | 266 + static/admin/js/inlines.js | 275 + static/admin/js/inlines.min.js | 9 + static/admin/js/jquery.init.js | 8 + static/admin/js/prepopulate.js | 42 + static/admin/js/prepopulate.min.js | 1 + static/admin/js/timeparse.js | 106 + static/admin/js/urlify.js | 171 + .../admin/js/vendor/jquery/LICENSE-JQUERY.txt | 26 + static/admin/js/vendor/jquery/jquery.js | 9210 ++++++ static/admin/js/vendor/jquery/jquery.min.js | 4 + .../js/vendor/xregexp/LICENSE-XREGEXP.txt | 21 + static/admin/js/vendor/xregexp/xregexp.js | 2308 ++ static/admin/js/vendor/xregexp/xregexp.min.js | 18 + .../css/ie10-viewport-bug-workaround.css | 15 + .../assets/js/ie-emulation-modes-warning.js | 51 + .../assets/js/ie10-viewport-bug-workaround.js | 23 + .../assets/js/ie8-responsive-file-warning.js | 13 + static/bootstrap/css/bootstrap-theme.css | 587 + static/bootstrap/css/bootstrap-theme.css.map | 1 + static/bootstrap/css/bootstrap-theme.min.css | 6 + .../bootstrap/css/bootstrap-theme.min.css.map | 1 + static/bootstrap/css/bootstrap.css | 6760 ++++ static/bootstrap/css/bootstrap.css.map | 1 + static/bootstrap/css/bootstrap.min.css | 6 + static/bootstrap/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes static/bootstrap/js/bootstrap.js | 2363 ++ static/bootstrap/js/bootstrap.min.js | 7 + static/bootstrap/js/npm.js | 13 + static/bundle/jpk/jpk.js | 1 + static/bundle/sf/2.chunk.js | 2 + static/bundle/sf/3.chunk.js | 2 + static/bundle/sf/asset-manifest.json | 9 + static/bundle/sf/dev.html | 5 + static/bundle/sf/favicon.ico | Bin 0 -> 3870 bytes static/bundle/sf/index.html | 42 + static/bundle/sf/manifest.json | 15 + static/bundle/sf/runtime~sf.js | 2 + static/bundle/sf/service-worker.js | 34 + static/bundle/sf/sf.chunk.js | 2 + static/bundle/sf/sf.css | 268 + static/bundle/sf/sf.js | 2 + static/bundle/sf/sf.js.map | 1 + static/bundle/sf/static/css/sf.css | 2 + static/bundle/sf/static/css/sf.css.map | 1 + ...ednostkaInnaStrukturyDanychSprFin_v1-0.xsd | 11804 +++++++ ...ednostkaInnaStrukturyDanychSprFin_v1-2.xsd | 11746 +++++++ static/css/JednostkaInnaWZlotych(1)_v1-0.xsd | 199 + static/css/KodyKrajow_v5-0E.xsd | 1258 + static/css/KodyKrajow_v6-0E.xsd | 1278 + ...KodyNaczelnikowUrzedowSkarbowych_v4-0E.xsd | 2010 ++ static/css/KodyPKD_v2-0E.xsd | 6367 ++++ static/css/KodyUrzedowSkarbowych.xsd | 2010 ++ static/css/KodyUrzedowSkarbowych_v3-0E.xsd | 2010 ++ static/css/KodyUrzedowSkarbowych_v5-0E.xsd | 2010 ++ static/css/KodyUrzedowSkarbowych_v6-0E.xsd | 2010 ++ static/css/NazwyPozycji_SF.xsd | 501 + static/css/Posredni_wspolne_v7-0E.xsl | 8 + static/css/Posredni_wspolne_v8-0E.xsl | 8 + static/css/StrukturyDanychSprFin_v1-1.xsd | 857 + static/css/StrukturyDanychSprFin_v1-2.xsd | 1014 + .../css/WspolneSzablonyWizualizacji_v2-0E.xsl | 1149 + .../css/WspolneSzablonyWizualizacji_v7-0E.xsl | 1153 + .../css/WspolneSzablonyWizualizacji_v8-0E.xsl | 1153 + static/css/app.css | 216 + static/css/cbois.xsl | 84 + static/css/deklaracja.css | 415 + static/css/dziennik.xsl | 65 + static/css/jpk.xsl | 72 + static/css/konto_zapis.xsl | 57 + static/css/sf.css | 268 + static/css/upo.css | 99 + static/css/upo.xsl | 134 + static/css/xsl.css | 31 + static/css/zois-csv.xsl | 14 + static/css/zois.xsl | 75 + static/data/objects.txt | 460 + static/files/vat-7-21.pdf | Bin 0 -> 162698 bytes static/font/Arial.ttf | Bin 0 -> 275572 bytes static/img/loading.gif | Bin 0 -> 4663 bytes static/img/xlsx.png | Bin 0 -> 6409 bytes static/img/xlsx32.png | Bin 0 -> 2479 bytes static/js/jpk.js | 1 + static/js/jquery.js | 11008 +++++++ static/js/jquery.min.js | 5 + static/js/main.js | 2 + static/js/page.js | 214 + static/js/page2.js | 337 + static/js/react.js | 2 + static/js/runtime.js | 2 + static/xsd/DefinicjeTypy.html | 23 + static/xsd/ElementarneTypyDanych_v4-0E.xsd | 1 + static/xsd/JPK_FA.xsd | 605 + static/xsd/JPK_FA2.xsd | 632 + static/xsd/JPK_FA3.xsd | 762 + static/xsd/JPK_KR.xsd | 401 + static/xsd/JPK_MAG.xsd | 595 + static/xsd/JPK_SF.xsd | 205 + static/xsd/JPK_SF2.xsd | 211 + static/xsd/JPK_V7K.xsd | 1258 + static/xsd/JPK_V7M.xsd | 1269 + static/xsd/JPK_VAT.xsd | 459 + static/xsd/JPK_VAT2.xsd | 517 + static/xsd/JPK_VAT3.xsd | 517 + static/xsd/JPK_VAT4-2020-05.xsd | 1266 + static/xsd/JPK_VAT4.xsd | 1256 + static/xsd/JPK_VAT4K.xsd | 1248 + static/xsd/JPK_VAT4M.xsd | 1247 + static/xsd/JPK_WB.xsd | 220 + ...ednostkaInnaStrukturyDanychSprFin_v1-0.xsd | 11794 +++++++ ...ednostkaInnaStrukturyDanychSprFin_v1-2.xsd | 11746 +++++++ static/xsd/KodyCECHKRAJOW.html | 18 + static/xsd/KodyCechKrajow_v3-0E.xsd | 1082 + static/xsd/KodyKrajow_v4-1E.xsd | 1258 + ...KodyNaczelnikowUrzedowSkarbowych_v3-0E.xsd | 410 + static/xsd/KodyUrzedowSkarbowych_v4-0E.xsd | 2010 ++ static/xsd/StrukturyDanychSprFin_v1-0.xsd | 857 + static/xsd/StrukturyDanychSprFin_v1-1.xsd | 857 + static/xsd/StrukturyDanychSprFin_v1-2.xsd | 1014 + static/xsd/StrukturyDanych_v4-0E.xsd | 1 + static/xsd/StrukturyDanych_v5-0E.xsd | 1 + vat/__init__.py | 0 vat/admin.py | 3 + vat/apps.py | 5 + vat/migrations/0001_initial.py | 30 + vat/migrations/0002_konkrs.py | 34 + vat/migrations/__init__.py | 0 vat/models.py | 43 + vat/tests.py | 3 + vat/urls.py | 14 + vat/views.py | 180 + 838 files changed, 406947 insertions(+) create mode 100644 README.md create mode 100644 app/__init__.py create mode 100644 app/admin.py create mode 100644 app/ajax.py create mode 100644 app/apps.py create mode 100644 app/context_processors.py create mode 100644 app/ctrl/__init__.py create mode 100644 app/ctrl/fa.py create mode 100644 app/ctrl/kr.py create mode 100644 app/ctrl/mag.py create mode 100644 app/ctrl/sf.py create mode 100644 app/ctrl/vat/__init__.py create mode 100644 app/ctrl/vat/bra.py create mode 100644 app/ctrl/vat/gig.py create mode 100644 app/ctrl/vat/ichp.py create mode 100644 app/ctrl/vat/vat.py create mode 100644 app/ctrl/wb.py create mode 100644 app/deklaracja.py create mode 100644 app/forms.py create mode 100644 app/management/__init__.py create mode 100644 app/management/commands/__init__.py create mode 100644 app/management/commands/del_jpk.py create mode 100644 app/mf.py create mode 100644 app/middleware.py create mode 100644 app/migrations/0001_initial.py create mode 100644 app/migrations/0002_auto_20160424_2137.py create mode 100644 app/migrations/0003_auto_20160426_1328.py create mode 100644 app/migrations/0004_syn.py create mode 100644 app/migrations/0005_ctrl.py create mode 100644 app/migrations/0006_auto_20160427_1754.py create mode 100644 app/migrations/0007_auto_20160427_1758.py create mode 100644 app/migrations/0008_auto_20160427_1912.py create mode 100644 app/migrations/0009_ksi.py create mode 100644 app/migrations/0010_uzy.py create mode 100644 app/migrations/0011_ksiopi.py create mode 100644 app/migrations/0012_auto_20160428_1833.py create mode 100644 app/migrations/0013_auto_20160428_2035.py create mode 100644 app/migrations/0014_dow.py create mode 100644 app/migrations/0015_fapopi_kon_magdok_magwiersz_zak_zlc.py create mode 100644 app/migrations/0016_zakzrv.py create mode 100644 app/migrations/0017_auto_20160516_1717.py create mode 100644 app/migrations/0018_srtmkv_srtvat.py create mode 100644 app/migrations/0019_zlctxt.py create mode 100644 app/migrations/0020_plik_odkad.py create mode 100644 app/migrations/0021_auto_20160601_1837.py create mode 100644 app/migrations/0022_syspar.py create mode 100644 app/migrations/0023_spo.py create mode 100644 app/migrations/0024_auto_20160615_2144.py create mode 100644 app/migrations/0025_plik_rachunek.py create mode 100644 app/migrations/0026_auto_20160617_1242.py create mode 100644 app/migrations/0027_auto_20160617_1721.py create mode 100644 app/migrations/0028_magdzial.py create mode 100644 app/migrations/0029_plik_magazyn.py create mode 100644 app/migrations/0030_auto_20160708_2200.py create mode 100644 app/migrations/0031_auto_20160708_2216.py create mode 100644 app/migrations/0032_auto_20160708_2359.py create mode 100644 app/migrations/0033_auto_20160709_1200.py create mode 100644 app/migrations/0034_auto_20160711_1543.py create mode 100644 app/migrations/0035_auto_20160713_1509.py create mode 100644 app/migrations/0036_auto_20160713_1818.py create mode 100644 app/migrations/0037_auto_20160713_1822.py create mode 100644 app/migrations/0038_auto_20160714_2255.py create mode 100644 app/migrations/0039_auto_20160716_2308.py create mode 100644 app/migrations/0040_auto_20160717_1835.py create mode 100644 app/migrations/0041_fakres.py create mode 100644 app/migrations/0042_blad.py create mode 100644 app/migrations/0043_plik_xls.py create mode 100644 app/migrations/0044_ctrl_xls.py create mode 100644 app/migrations/0045_plik_nazwa.py create mode 100644 app/migrations/0046_auto_20160824_2214.py create mode 100644 app/migrations/0047_storage_bramka.py create mode 100644 app/migrations/0048_auto_20160902_1637.py create mode 100644 app/migrations/0049_auto_20161006_1843.py create mode 100644 app/migrations/0050_auto_20161018_1809.py create mode 100644 app/migrations/0051_auto_20161116_1820.py create mode 100644 app/migrations/0052_firma.py create mode 100644 app/migrations/0053_auto_20161213_1856.py create mode 100644 app/migrations/0054_auto_20161215_1726.py create mode 100644 app/migrations/0055_plik_firma.py create mode 100644 app/migrations/0056_auto_20161215_1758.py create mode 100644 app/migrations/0057_auto_20161215_2103.py create mode 100644 app/migrations/0058_plik_cel_zlozenia.py create mode 100644 app/migrations/0059_plik_wariant.py create mode 100644 app/migrations/0060_userprofile.py create mode 100644 app/migrations/0061_auto_20170217_2216.py create mode 100644 app/migrations/0062_auto_20170218_2355.py create mode 100644 app/migrations/0063_auto_20170309_2100.py create mode 100644 app/migrations/0064_auto_20170311_1251.py create mode 100644 app/migrations/0065_auto_20180208_1919.py create mode 100644 app/migrations/0066_auto_20180219_1707.py create mode 100644 app/migrations/0067_firma_ostatni_plik.py create mode 100644 app/migrations/0068_auto_20180804_1345.py create mode 100644 app/migrations/0069_blad_level.py create mode 100644 app/migrations/0070_firma_krs.py create mode 100644 app/migrations/0071_auto_20191229_1548.py create mode 100644 app/migrations/0072_firma_api_url.py create mode 100644 app/migrations/0073_auto_20200221_1800.py create mode 100644 app/migrations/0074_auto_20200226_2152.py create mode 100644 app/migrations/0075_auto_20200227_1502.py create mode 100644 app/migrations/0076_auto_20200228_1312.py create mode 100644 app/migrations/0077_deklaracja_element.py create mode 100644 app/migrations/0078_auto_20200228_1520.py create mode 100644 app/migrations/0079_deklaracjapoz.py create mode 100644 app/migrations/0080_auto_20200228_2158.py create mode 100644 app/migrations/0081_deklaracjapoz_sumowanie.py create mode 100644 app/migrations/0082_auto_20200229_2113.py create mode 100644 app/migrations/0083_auto_20200304_1321.py create mode 100644 app/migrations/0084_auto_20200312_2145.py create mode 100644 app/migrations/0085_firma_api_auth.py create mode 100644 app/migrations/0086_plik_korekta.py create mode 100644 app/migrations/__init__.py create mode 100644 app/model_fields.py create mode 100644 app/model_utils.py create mode 100644 app/models.py create mode 100644 app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.min.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.min.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.min.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.min.css create mode 100644 app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables_themeroller.css create mode 100644 app/static/DataTables/DataTables-1.10.12/images_/sort_asc.png create mode 100644 app/static/DataTables/DataTables-1.10.12/images_/sort_asc_disabled.png create mode 100644 app/static/DataTables/DataTables-1.10.12/images_/sort_both.png create mode 100644 app/static/DataTables/DataTables-1.10.12/images_/sort_desc.png create mode 100644 app/static/DataTables/DataTables-1.10.12/images_/sort_desc_disabled.png create mode 100644 app/static/DataTables/DataTables-1.10.12/js/dataTables.bootstrap.js create mode 100644 app/static/DataTables/DataTables-1.10.12/js/dataTables.bootstrap.min.js create mode 100644 app/static/DataTables/DataTables-1.10.12/js/dataTables.foundation.js create mode 100644 app/static/DataTables/DataTables-1.10.12/js/dataTables.foundation.min.js create mode 100644 app/static/DataTables/DataTables-1.10.12/js/dataTables.jqueryui.js create mode 100644 app/static/DataTables/DataTables-1.10.12/js/dataTables.jqueryui.min.js create mode 100644 app/static/DataTables/DataTables-1.10.12/js/jquery.dataTables.js create mode 100644 app/static/DataTables/DataTables-1.10.12/js/jquery.dataTables.min.js create mode 100644 app/static/DataTables/Polish.json create mode 100644 app/static/DataTables/datatables.css create mode 100644 app/static/DataTables/datatables.js create mode 100644 app/static/DataTables/datatables.min.css create mode 100644 app/static/DataTables/datatables.min.js create mode 100644 app/static/bootstrap/assets/css/ie10-viewport-bug-workaround.css create mode 100644 app/static/bootstrap/assets/js/ie-emulation-modes-warning.js create mode 100644 app/static/bootstrap/assets/js/ie10-viewport-bug-workaround.js create mode 100644 app/static/bootstrap/assets/js/ie8-responsive-file-warning.js create mode 100644 app/static/bootstrap/css/bootstrap-theme.css create mode 100644 app/static/bootstrap/css/bootstrap-theme.css.map create mode 100644 app/static/bootstrap/css/bootstrap-theme.min.css create mode 100644 app/static/bootstrap/css/bootstrap-theme.min.css.map create mode 100644 app/static/bootstrap/css/bootstrap.css create mode 100644 app/static/bootstrap/css/bootstrap.css.map create mode 100644 app/static/bootstrap/css/bootstrap.min.css create mode 100644 app/static/bootstrap/css/bootstrap.min.css.map create mode 100644 app/static/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 app/static/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 app/static/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 app/static/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 app/static/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 app/static/bootstrap/js/bootstrap.js create mode 100644 app/static/bootstrap/js/bootstrap.min.js create mode 100644 app/static/bootstrap/js/npm.js create mode 100644 app/static/bundle/jpk/jpk.js create mode 100644 app/static/bundle/sf/2.chunk.js create mode 100644 app/static/bundle/sf/3.chunk.js create mode 100644 app/static/bundle/sf/runtime~sf.js create mode 100644 app/static/bundle/sf/sf.chunk.js create mode 100644 app/static/bundle/sf/sf.js create mode 100644 app/static/css/JednostkaInnaStrukturyDanychSprFin_v1-0.xsd create mode 100644 app/static/css/JednostkaInnaStrukturyDanychSprFin_v1-2.xsd create mode 100644 app/static/css/JednostkaInnaWZlotych(1)_v1-0.xsd create mode 100644 app/static/css/KodyKrajow_v5-0E.xsd create mode 100644 app/static/css/KodyKrajow_v6-0E.xsd create mode 100644 app/static/css/KodyNaczelnikowUrzedowSkarbowych_v4-0E.xsd create mode 100644 app/static/css/KodyPKD_v2-0E.xsd create mode 100644 app/static/css/KodyUrzedowSkarbowych_v3-0E.xsd create mode 100644 app/static/css/KodyUrzedowSkarbowych_v5-0E.xsd create mode 100644 app/static/css/KodyUrzedowSkarbowych_v6-0E.xsd create mode 100644 app/static/css/NazwyPozycji_SF.xsd create mode 100644 app/static/css/Posredni_wspolne_v7-0E.xsl create mode 100644 app/static/css/Posredni_wspolne_v8-0E.xsl create mode 100644 app/static/css/StrukturyDanychSprFin_v1-1.xsd create mode 100644 app/static/css/StrukturyDanychSprFin_v1-2.xsd create mode 100644 app/static/css/WspolneSzablonyWizualizacji_v2-0E.xsl create mode 100644 app/static/css/WspolneSzablonyWizualizacji_v7-0E.xsl create mode 100644 app/static/css/WspolneSzablonyWizualizacji_v8-0E.xsl create mode 100644 app/static/css/deklaracja.css create mode 100644 app/static/css/dziennik.xsl create mode 100644 app/static/css/jpk.xsl create mode 100644 app/static/css/konto_zapis.xsl create mode 100644 app/static/css/sf.css create mode 100644 app/static/css/upo.css create mode 100644 app/static/css/upo.xsl create mode 100644 app/static/css/xsl.css create mode 100644 app/static/css/zois-csv.xsl create mode 100644 app/static/css/zois.xsl create mode 100644 app/static/data/objects.txt create mode 100644 app/static/files/vat-7-21.pdf create mode 100644 app/static/font/Arial.ttf create mode 100644 app/static/img/loading.gif create mode 100644 app/static/img/xlsx.png create mode 100644 app/static/img/xlsx32.png create mode 100644 app/static/js/jpk.js create mode 100644 app/static/js/jquery.js create mode 100644 app/static/js/jquery.min.js create mode 100644 app/static/js/main.js create mode 100644 app/static/js/react.js create mode 100644 app/static/js/runtime.js create mode 100644 app/static/xsd/DefinicjeTypy.html create mode 100644 app/static/xsd/ElementarneTypyDanych_v4-0E.xsd create mode 100644 app/static/xsd/JPK_FA.xsd create mode 100644 app/static/xsd/JPK_FA2.xsd create mode 100644 app/static/xsd/JPK_FA3.xsd create mode 100644 app/static/xsd/JPK_KR.xsd create mode 100644 app/static/xsd/JPK_MAG.xsd create mode 100644 app/static/xsd/JPK_SF.xsd create mode 100644 app/static/xsd/JPK_SF2.xsd create mode 100644 app/static/xsd/JPK_V7K.xsd create mode 100644 app/static/xsd/JPK_V7M.xsd create mode 100644 app/static/xsd/JPK_VAT.xsd create mode 100644 app/static/xsd/JPK_VAT2.xsd create mode 100644 app/static/xsd/JPK_VAT3.xsd create mode 100644 app/static/xsd/JPK_VAT4-2020-05.xsd create mode 100644 app/static/xsd/JPK_VAT4K.xsd create mode 100644 app/static/xsd/JPK_VAT4M.xsd create mode 100644 app/static/xsd/JPK_WB.xsd create mode 100644 app/static/xsd/JednostkaInnaStrukturyDanychSprFin_v1-0.xsd create mode 100644 app/static/xsd/JednostkaInnaStrukturyDanychSprFin_v1-2.xsd create mode 100644 app/static/xsd/KodyCECHKRAJOW.html create mode 100644 app/static/xsd/KodyCechKrajow_v3-0E.xsd create mode 100644 app/static/xsd/KodyKrajow_v4-1E.xsd create mode 100644 app/static/xsd/KodyNaczelnikowUrzedowSkarbowych_v3-0E.xsd create mode 100644 app/static/xsd/KodyUrzedowSkarbowych_v4-0E.xsd create mode 100644 app/static/xsd/StrukturyDanychSprFin_v1-0.xsd create mode 100644 app/static/xsd/StrukturyDanychSprFin_v1-1.xsd create mode 100644 app/static/xsd/StrukturyDanychSprFin_v1-2.xsd create mode 100644 app/static/xsd/StrukturyDanych_v4-0E.xsd create mode 100644 app/static/xsd/StrukturyDanych_v5-0E.xsd create mode 100644 app/tasks.py create mode 100644 app/templates/404.html create mode 100644 app/templates/500.html create mode 100644 app/templates/app/ajax/firma.json create mode 100644 app/templates/app/ajax/lista_firm.json create mode 100644 app/templates/app/alert.html create mode 100644 app/templates/app/app.html create mode 100644 app/templates/app/bledy.html create mode 100644 app/templates/app/body.html create mode 100644 app/templates/app/deklaracja.html create mode 100644 app/templates/app/deklaracja_bak.html create mode 100644 app/templates/app/deklaracja_form.html create mode 100644 app/templates/app/firma.html create mode 100644 app/templates/app/firmy.html create mode 100644 app/templates/app/head.html create mode 100644 app/templates/app/initupload.xml create mode 100644 app/templates/app/modal/initupload.html create mode 100644 app/templates/app/modal/menu.html create mode 100644 app/templates/app/modal/nazwa.html create mode 100644 app/templates/app/modal/sfupload.html create mode 100644 app/templates/app/modal/tworzenie.html create mode 100644 app/templates/app/modal/upload.html create mode 100644 app/templates/app/modal/usun.html create mode 100644 app/templates/app/page.html create mode 100644 app/templates/app/page_nav.html create mode 100644 app/templates/app/page_sf.html create mode 100644 app/templates/app/plik.html create mode 100644 app/templates/app/react.html create mode 100644 app/templates/app/row/JPK_FA.html create mode 100644 app/templates/app/row/JPK_KR.html create mode 100644 app/templates/app/row/JPK_MAG.html create mode 100644 app/templates/app/row/JPK_SF.html create mode 100644 app/templates/app/row/JPK_VAT.html create mode 100644 app/templates/app/row/JPK_WB.html create mode 100644 app/templates/app/sf/dodatkowe.html create mode 100644 app/templates/app/sf/podatek.html create mode 100644 app/templates/app/sf/raport.html create mode 100644 app/templates/app/sf/sf.xsl create mode 100644 app/templates/app/sf/sf2.xsl create mode 100644 app/templates/app/sf/wprowadz.html create mode 100644 app/templates/app/status.html create mode 100644 app/templates/app/tabela.html create mode 100644 app/templates/app/td_status.html create mode 100644 app/templates/app/upload.html create mode 100644 app/templates/app/upload/finish.html create mode 100644 app/templates/app/upload/init.html create mode 100644 app/templates/app/upload/put.html create mode 100644 app/templates/app/upload/status.html create mode 100644 app/templates/app/upload/upo.html create mode 100644 app/templates/app/validate.html create mode 100644 app/templates/app/wyciag.html create mode 100644 app/templates/app/xml/fa/faktura.xml create mode 100644 app/templates/app/xml/fa/faktura3.xml create mode 100644 app/templates/app/xml/fa/naglowek3.xml create mode 100644 app/templates/app/xml/fa/podmiot3.xml create mode 100644 app/templates/app/xml/fa/wiersz.xml create mode 100644 app/templates/app/xml/fa/wiersz3.xml create mode 100644 app/templates/app/xml/jpk_fa.xml create mode 100644 app/templates/app/xml/jpk_fa2.xml create mode 100644 app/templates/app/xml/jpk_fa3.xml create mode 100644 app/templates/app/xml/jpk_kr.xml create mode 100644 app/templates/app/xml/jpk_mag.xml create mode 100644 app/templates/app/xml/jpk_sf.xml create mode 100644 app/templates/app/xml/jpk_sf2.xml create mode 100644 app/templates/app/xml/jpk_vat.xml create mode 100644 app/templates/app/xml/jpk_vat2.xml create mode 100644 app/templates/app/xml/jpk_vat3.xml create mode 100644 app/templates/app/xml/jpk_vat4.xml create mode 100644 app/templates/app/xml/jpk_wb.xml create mode 100644 app/templates/app/xml/kr/dziennik.xml create mode 100644 app/templates/app/xml/kr/konto_zapis.xml create mode 100644 app/templates/app/xml/kr/zois.xml create mode 100644 app/templates/app/xml/mag/mm.xml create mode 100644 app/templates/app/xml/mag/pz.xml create mode 100644 app/templates/app/xml/mag/rw.xml create mode 100644 app/templates/app/xml/mag/wz.xml create mode 100644 app/templates/app/xml/naglowek.xml create mode 100644 app/templates/app/xml/naglowek2.xml create mode 100644 app/templates/app/xml/naglowek3.xml create mode 100644 app/templates/app/xml/podmiot.xml create mode 100644 app/templates/app/xml/podmiot2.xml create mode 100644 app/templates/app/xml/podmiot3.xml create mode 100644 app/templates/app/xml/sf/bilans.xml create mode 100644 app/templates/app/xml/sf/dodatkowe.xml create mode 100644 app/templates/app/xml/sf/dodatkowe2.xml create mode 100644 app/templates/app/xml/sf/kapital.xml create mode 100644 app/templates/app/xml/sf/naglowek.xml create mode 100644 app/templates/app/xml/sf/naglowek2.xml create mode 100644 app/templates/app/xml/sf/podatek.xml create mode 100644 app/templates/app/xml/sf/pozycja.xml create mode 100644 app/templates/app/xml/sf/pozycja2.xml create mode 100644 app/templates/app/xml/sf/przeplywy.xml create mode 100644 app/templates/app/xml/sf/przeplywy2.xml create mode 100644 app/templates/app/xml/sf/rzis.xml create mode 100644 app/templates/app/xml/sf/wprowadzenie.xml create mode 100644 app/templates/app/xml/sf/wprowadzenie2.xml create mode 100644 app/templates/app/xml/sf/zalaczniki.xml create mode 100644 app/templates/app/xml/vat/deklaracja4.xml create mode 100644 app/templates/app/xml/vat/naglowek4.xml create mode 100644 app/templates/app/xml/vat/podmiot4.xml create mode 100644 app/templates/app/xml/vat/sprzedaz.xml create mode 100644 app/templates/app/xml/vat/sprzedaz2.xml create mode 100644 app/templates/app/xml/vat/sprzedaz3.xml create mode 100644 app/templates/app/xml/vat/sprzedaz4.xml create mode 100644 app/templates/app/xml/vat/zakup.xml create mode 100644 app/templates/app/xml/vat/zakup2.xml create mode 100644 app/templates/app/xml/vat/zakup3.xml create mode 100644 app/templates/app/xml/vat/zakup4.xml create mode 100644 app/templates/app/xml/wb/salda.xml create mode 100644 app/templates/app/xml/wb/wiersz.xml create mode 100644 app/templates/app/xsd/ElementarneTypyDanych_v4-0E.xsd create mode 100644 app/templates/app/xsd/KodyCechKrajow_v3-0E.xsd create mode 100644 app/templates/app/xsd/StrukturyDanych_v4-0E.xsd create mode 100644 app/templates/app/xsl/styl-2020-03.orig.xsl create mode 100644 app/templates/app/xsl/styl-2020-03.xsl create mode 100644 app/templates/app/xsl/styl-2020-05.orig.xsl create mode 100644 app/templates/app/xsl/styl-2020-05.xsl create mode 100644 app/templates/registration/login.html create mode 100644 app/templates/registration/password_change_form.html create mode 100644 app/templates/registration/profil.html create mode 100644 app/templates/utils/alert.html create mode 100644 app/templates/utils/body_text.html create mode 100644 app/templates/utils/change_log.html create mode 100644 app/templates/utils/checkbox.html create mode 100644 app/templates/utils/closePopup.html create mode 100644 app/templates/utils/dynamic_add.html create mode 100644 app/templates/utils/filtr.html create mode 100644 app/templates/utils/form.html create mode 100644 app/templates/utils/form_dla_par.html create mode 100644 app/templates/utils/link_button.html create mode 100644 app/templates/utils/log.html create mode 100644 app/templatetags/__init__.py create mode 100644 app/templatetags/utils.py create mode 100644 app/tests/__init__.py create mode 100644 app/tests/models/__init__.py create mode 100644 app/tests/models/test_plik.py create mode 100644 app/tests/tasks/__init__.py create mode 100644 app/tests/tasks/test_fa.py create mode 100644 app/tests/tasks/test_kr.py create mode 100644 app/tests/tasks/test_mag.py create mode 100644 app/tests/tasks/test_tasks.py create mode 100644 app/tests/tasks/test_vat.py create mode 100644 app/tests/tasks/test_wb.py create mode 100644 app/tests/views/JPK_VAT-100.xml create mode 100644 app/tests/views/__init__.py create mode 100644 app/tests/views/test_views.py create mode 100644 app/tests/views/upo-p.xml create mode 100644 app/tests/views/upo-t.xml create mode 100644 app/tests/wyciagi/__init__.py create mode 100644 app/tests/wyciagi/ing.sta create mode 100644 app/tests/wyciagi/mbank.sta create mode 100644 app/tests/wyciagi/mbank_end.sta create mode 100644 app/tests/wyciagi/test_ing.py create mode 100644 app/tests/wyciagi/test_mbank.py create mode 100644 app/tests/wyslij/JPK_VAT-100.xml create mode 100644 app/tests/wyslij/__init__.py create mode 100644 app/tests/wyslij/status-p.json create mode 100644 app/tests/wyslij/status-t.json create mode 100644 app/tests/wyslij/test_mf.py create mode 100644 app/tests/wyslij/test_wyslij.py create mode 100644 app/urls.py create mode 100644 app/utils.py create mode 100644 app/views.py create mode 100644 app/wyciagi.py create mode 100644 app/wyslij.py create mode 100644 app/xls/__init__.py create mode 100644 app/xls/fa.py create mode 100644 app/xls/fa3.py create mode 100644 app/xls/kr.py create mode 100644 app/xls/mag.py create mode 100644 app/xls/utils.py create mode 100644 app/xls/vat.py create mode 100644 app/xls/vat2.py create mode 100644 app/xls/vat4.py create mode 100644 app/xls/wb.py create mode 100644 bra/__init__.py create mode 100644 bra/admin.py create mode 100644 bra/api/__init__.py create mode 100644 bra/api/dokumenty.py create mode 100644 bra/api/sprzedaz/__init__.py create mode 100644 bra/api/sprzedaz/forms.py create mode 100644 bra/api/sprzedaz/sprzedaz.py create mode 100644 bra/api/sprzedaz/urls.py create mode 100644 bra/api/sprzedaz/views.py create mode 100644 bra/api/sprzedaz/xls.py create mode 100644 bra/api/zakupy/__init__.py create mode 100644 bra/api/zakupy/forms.py create mode 100644 bra/api/zakupy/urls.py create mode 100644 bra/api/zakupy/views.py create mode 100644 bra/api/zakupy/xls.py create mode 100644 bra/api/zakupy/zakupy.py create mode 100644 bra/apps.py create mode 100644 bra/forms.py create mode 100644 bra/migrations/0001_initial.py create mode 100644 bra/migrations/0002_faktura_nip_nabywcy.py create mode 100644 bra/migrations/0003_auto_20170128_2142.py create mode 100644 bra/migrations/0004_wiersz.py create mode 100644 bra/migrations/0005_auto_20170311_1251.py create mode 100644 bra/migrations/0006_auto_20170311_1410.py create mode 100644 bra/migrations/0007_auto_20170311_1435.py create mode 100644 bra/migrations/0008_auto_20170311_1851.py create mode 100644 bra/migrations/0009_auto_20170311_2257.py create mode 100644 bra/migrations/0010_auto_20170312_1700.py create mode 100644 bra/migrations/0011_auto_20170312_1902.py create mode 100644 bra/migrations/0012_auto_20170312_1937.py create mode 100644 bra/migrations/0013_auto_20170313_1312.py create mode 100644 bra/migrations/0014_auto_20170313_1314.py create mode 100644 bra/migrations/0015_auto_20170314_1825.py create mode 100644 bra/migrations/0016_auto_20170315_2247.py create mode 100644 bra/migrations/0017_kontrahent.py create mode 100644 bra/migrations/0018_importzakupow.py create mode 100644 bra/migrations/0019_auto_20200220_1911.py create mode 100644 bra/migrations/0020_importzakupow_xls.py create mode 100644 bra/migrations/0021_apisprzedaz.py create mode 100644 bra/migrations/__init__.py create mode 100644 bra/models.py create mode 100644 bra/sprzedaz.py create mode 100644 bra/templates/api/sprzedaz/import.html create mode 100644 bra/templates/api/sprzedaz/importy.html create mode 100644 bra/templates/api/sprzedaz/rozwin.html create mode 100644 bra/templates/api/zakupy/import.html create mode 100644 bra/templates/api/zakupy/importy.html create mode 100644 bra/templates/api/zakupy/rozwin.html create mode 100644 bra/templates/bra/faktury.html create mode 100644 bra/templates/bra/sprzedaz/akceptacja.html create mode 100644 bra/templates/bra/sprzedaz/do_rejestru.html create mode 100644 bra/templates/bra/sprzedaz/import.html create mode 100644 bra/templates/bra/sprzedaz/importy.html create mode 100644 bra/templates/bra/sprzedaz/koniec.html create mode 100644 bra/templates/bra/sprzedaz/pliki.html create mode 100644 bra/templates/bra/sprzedaz/podsumowanie.html create mode 100644 bra/templates/bra/sprzedaz/postep.html create mode 100644 bra/templates/bra/sprzedaz/rozwin.html create mode 100644 bra/templates/bra/sprzedaz/stawki.html create mode 100644 bra/tests.py create mode 100644 bra/urls.py create mode 100644 bra/views.py create mode 100644 bra/xls.py create mode 100755 celery create mode 100644 dez/__init__.py create mode 100644 dez/admin.py create mode 100644 dez/apps.py create mode 100644 dez/delegacje.py create mode 100644 dez/migrations/__init__.py create mode 100644 dez/models.py create mode 100644 dez/templates/dez/email.txt create mode 100644 dez/tests.py create mode 100644 dez/urls.py create mode 100644 dez/views.py create mode 100644 doc/initupload.json create mode 100644 doc/upo.xml create mode 100644 env create mode 100644 fk/__init__.py create mode 100644 fk/admin.py create mode 100644 fk/apps.py create mode 100644 fk/migrations/0001_initial.py create mode 100644 fk/migrations/0002_kasdow_kaspoz.py create mode 100644 fk/migrations/0003_zakpoz.py create mode 100644 fk/migrations/0004_magnumer.py create mode 100644 fk/migrations/0005_sysdan.py create mode 100644 fk/migrations/0006_syskli.py create mode 100644 fk/migrations/0007_auto_20170313_1312.py create mode 100644 fk/migrations/0008_defnum_fakzaf.py create mode 100644 fk/migrations/0009_zakkos.py create mode 100644 fk/migrations/__init__.py create mode 100644 fk/models.py create mode 100644 fk/tests/__init__.py create mode 100644 fk/tests/models/__init__.py create mode 100644 fk/tests/models/test_zak.py create mode 100644 fk/views.py create mode 100644 jpk/__init__.py create mode 100644 jpk/dbrouter.py create mode 100644 jpk/jpk_celery.py create mode 100644 jpk/urls.py create mode 100644 jpk/uwsgi.ini create mode 100644 jpk/uwsgi_params create mode 100644 jpk/wsgi.py create mode 100644 klucz_mf.pem create mode 100644 klucz_mf_p.pem create mode 100755 manage.py create mode 100644 node/jpk/package-lock.json create mode 100644 node/jpk/package.json create mode 100644 node/jpk/src/body.html create mode 100644 node/jpk/src/head.html create mode 100644 node/jpk/src/index.js create mode 100644 node/jpk/src/jpk.css create mode 100644 node/jpk/src/rows.js create mode 100644 node/jpk/src/tables.js create mode 100644 node/jpk/src/timer.js create mode 100644 node/jpk/src/validation.js create mode 100644 node/jpk/webpack.config.js create mode 100644 node/sprawozdania/.gitignore create mode 100644 node/sprawozdania/README.md create mode 100755 node/sprawozdania/b create mode 100644 node/sprawozdania/config/env.js create mode 100644 node/sprawozdania/config/jest/cssTransform.js create mode 100644 node/sprawozdania/config/jest/fileTransform.js create mode 100644 node/sprawozdania/config/paths.js create mode 100644 node/sprawozdania/config/webpack.config.js create mode 100644 node/sprawozdania/config/webpackDevServer.config.js create mode 100644 node/sprawozdania/package-lock.json create mode 100644 node/sprawozdania/package.json create mode 100644 node/sprawozdania/public/favicon.ico create mode 100644 node/sprawozdania/public/index.html create mode 100644 node/sprawozdania/public/manifest.json create mode 100644 node/sprawozdania/public/prod.html create mode 100644 node/sprawozdania/public/sf.css create mode 100644 node/sprawozdania/scripts/build.js create mode 100644 node/sprawozdania/scripts/start.js create mode 100644 node/sprawozdania/scripts/test.js create mode 100644 node/sprawozdania/src/Utils.js create mode 100644 node/sprawozdania/src/XmlJson.js create mode 100644 node/sprawozdania/src/components/dodatkowe/Dodatkowe.js create mode 100644 node/sprawozdania/src/components/dodatkowe/Lista.js create mode 100644 node/sprawozdania/src/components/dodatkowe/Skrot.js create mode 100644 node/sprawozdania/src/components/dodatkowe/Zalacznik.js create mode 100644 node/sprawozdania/src/components/forms.js create mode 100644 node/sprawozdania/src/components/podatek/Podatek.js create mode 100644 node/sprawozdania/src/components/podatek/PodatekWiersz.js create mode 100644 node/sprawozdania/src/components/raport/Raport.js create mode 100644 node/sprawozdania/src/components/raport/Wiersz.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Uszczegolowienie.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/UszczegolowienieSkrot.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/WprSekcja.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz1.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz2.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz3.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz4.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz5.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz6.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz7.js create mode 100644 node/sprawozdania/src/components/wprowadzenie/Wprowadz8.js create mode 100644 node/sprawozdania/src/index.css create mode 100644 node/sprawozdania/src/index.js create mode 100644 node/sprawozdania/src/logo.svg create mode 100644 node/sprawozdania/src/serviceWorker.js create mode 100644 node/sprawozdania/src/utils/api.js create mode 100644 node/sprawozdania/src/utils/utils.js create mode 100644 node/sprawozdania/src/utils/wyroznienia.js create mode 100644 polon/__init__.py create mode 100644 polon/admin.py create mode 100644 polon/apps.py create mode 100644 polon/forms.py create mode 100644 polon/migrations/0001_initial.py create mode 100644 polon/migrations/0002_auto_20170218_2355.py create mode 100644 polon/migrations/0003_auto_20170219_0130.py create mode 100644 polon/migrations/0004_auto_20170219_1443.py create mode 100644 polon/migrations/0005_remove_faktura_opis.py create mode 100644 polon/migrations/0006_faktura_opis.py create mode 100644 polon/migrations/0007_auto_20170219_1551.py create mode 100644 polon/migrations/0008_auto_20170219_1553.py create mode 100644 polon/migrations/0009_auto_20170219_2308.py create mode 100644 polon/migrations/0010_auto_20170220_0010.py create mode 100644 polon/migrations/__init__.py create mode 100644 polon/models.py create mode 100644 polon/templates/polon/czekaj.html create mode 100644 polon/templates/polon/faktury.html create mode 100644 polon/templates/polon/link.html create mode 100644 polon/templates/polon/page.html create mode 100644 polon/templates/polon/polon.html create mode 100644 polon/templates/polon/status.json create mode 100644 polon/tests.py create mode 100644 polon/urls.py create mode 100644 polon/views.py create mode 100644 polon/xls.py create mode 100644 requirements.txt create mode 100755 restart create mode 100644 sf/__init__.py create mode 100644 sf/admin.py create mode 100644 sf/api/__init__.py create mode 100644 sf/api/dodatkowe.py create mode 100644 sf/api/podatek.py create mode 100644 sf/api/raport.py create mode 100644 sf/api/views.py create mode 100644 sf/api/wprowadz.py create mode 100644 sf/apps.py create mode 100644 sf/migrations/0001_initial.py create mode 100644 sf/migrations/0002_auto_20181205_1313.py create mode 100644 sf/migrations/0003_pozycja_oblicz.py create mode 100644 sf/migrations/0004_pozycja_zalezne.py create mode 100644 sf/migrations/0005_auto_20181207_1740.py create mode 100644 sf/migrations/0006_pozycja_kontener.py create mode 100644 sf/migrations/0007_pozycja_wymagana.py create mode 100644 sf/migrations/0008_auto_20181208_2204.py create mode 100644 sf/migrations/0009_auto_20181208_2208.py create mode 100644 sf/migrations/0010_raport_tabela.py create mode 100644 sf/migrations/0011_auto_20181213_1903.py create mode 100644 sf/migrations/0012_auto_20181213_1905.py create mode 100644 sf/migrations/0013_pozycja_el.py create mode 100644 sf/migrations/0014_auto_20191229_1548.py create mode 100644 sf/migrations/__init__.py create mode 100644 sf/models.py create mode 100644 sf/tests.py create mode 100644 sf/urls.py create mode 100644 static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.css create mode 100644 static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.min.css create mode 100644 static/DataTables/DataTables-1.10.12/css/dataTables.foundation.css create mode 100644 static/DataTables/DataTables-1.10.12/css/dataTables.foundation.min.css create mode 100644 static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.css create mode 100644 static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.min.css create mode 100644 static/DataTables/DataTables-1.10.12/css/jquery.dataTables.css create mode 100644 static/DataTables/DataTables-1.10.12/css/jquery.dataTables.min.css create mode 100644 static/DataTables/DataTables-1.10.12/css/jquery.dataTables_themeroller.css create mode 100644 static/DataTables/DataTables-1.10.12/images_/sort_asc.png create mode 100644 static/DataTables/DataTables-1.10.12/images_/sort_asc_disabled.png create mode 100644 static/DataTables/DataTables-1.10.12/images_/sort_both.png create mode 100644 static/DataTables/DataTables-1.10.12/images_/sort_desc.png create mode 100644 static/DataTables/DataTables-1.10.12/images_/sort_desc_disabled.png create mode 100644 static/DataTables/DataTables-1.10.12/js/dataTables.bootstrap.js create mode 100644 static/DataTables/DataTables-1.10.12/js/dataTables.bootstrap.min.js create mode 100644 static/DataTables/DataTables-1.10.12/js/dataTables.foundation.js create mode 100644 static/DataTables/DataTables-1.10.12/js/dataTables.foundation.min.js create mode 100644 static/DataTables/DataTables-1.10.12/js/dataTables.jqueryui.js create mode 100644 static/DataTables/DataTables-1.10.12/js/dataTables.jqueryui.min.js create mode 100644 static/DataTables/DataTables-1.10.12/js/jquery.dataTables.js create mode 100644 static/DataTables/DataTables-1.10.12/js/jquery.dataTables.min.js create mode 100644 static/DataTables/Polish.json create mode 100644 static/DataTables/datatables.css create mode 100644 static/DataTables/datatables.js create mode 100644 static/DataTables/datatables.min.css create mode 100644 static/DataTables/datatables.min.js create mode 100644 static/admin/css/base.css create mode 100644 static/admin/css/changelists.css create mode 100644 static/admin/css/dashboard.css create mode 100644 static/admin/css/fonts.css create mode 100644 static/admin/css/forms.css create mode 100644 static/admin/css/login.css create mode 100644 static/admin/css/rtl.css create mode 100644 static/admin/css/widgets.css create mode 100644 static/admin/fonts/LICENSE.txt create mode 100644 static/admin/fonts/README.txt create mode 100644 static/admin/fonts/Roboto-Bold-webfont.woff create mode 100644 static/admin/fonts/Roboto-Light-webfont.woff create mode 100644 static/admin/fonts/Roboto-Regular-webfont.woff create mode 100644 static/admin/img/LICENSE create mode 100644 static/admin/img/README.txt create mode 100644 static/admin/img/calendar-icons.svg create mode 100644 static/admin/img/gis/move_vertex_off.svg create mode 100644 static/admin/img/gis/move_vertex_on.svg create mode 100644 static/admin/img/icon-addlink.svg create mode 100644 static/admin/img/icon-alert.svg create mode 100644 static/admin/img/icon-calendar.svg create mode 100644 static/admin/img/icon-changelink.svg create mode 100644 static/admin/img/icon-clock.svg create mode 100644 static/admin/img/icon-deletelink.svg create mode 100644 static/admin/img/icon-no.svg create mode 100644 static/admin/img/icon-unknown-alt.svg create mode 100644 static/admin/img/icon-unknown.svg create mode 100644 static/admin/img/icon-yes.svg create mode 100644 static/admin/img/inline-delete.svg create mode 100644 static/admin/img/search.svg create mode 100644 static/admin/img/selector-icons.svg create mode 100644 static/admin/img/sorting-icons.svg create mode 100644 static/admin/img/tooltag-add.svg create mode 100644 static/admin/img/tooltag-arrowright.svg create mode 100644 static/admin/js/SelectBox.js create mode 100644 static/admin/js/SelectFilter2.js create mode 100644 static/admin/js/actions.js create mode 100644 static/admin/js/actions.min.js create mode 100644 static/admin/js/admin/DateTimeShortcuts.js create mode 100644 static/admin/js/admin/RelatedObjectLookups.js create mode 100644 static/admin/js/calendar.js create mode 100644 static/admin/js/collapse.js create mode 100644 static/admin/js/collapse.min.js create mode 100644 static/admin/js/core.js create mode 100644 static/admin/js/inlines.js create mode 100644 static/admin/js/inlines.min.js create mode 100644 static/admin/js/jquery.init.js create mode 100644 static/admin/js/prepopulate.js create mode 100644 static/admin/js/prepopulate.min.js create mode 100644 static/admin/js/timeparse.js create mode 100644 static/admin/js/urlify.js create mode 100644 static/admin/js/vendor/jquery/LICENSE-JQUERY.txt create mode 100644 static/admin/js/vendor/jquery/jquery.js create mode 100644 static/admin/js/vendor/jquery/jquery.min.js create mode 100644 static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt create mode 100644 static/admin/js/vendor/xregexp/xregexp.js create mode 100644 static/admin/js/vendor/xregexp/xregexp.min.js create mode 100644 static/bootstrap/assets/css/ie10-viewport-bug-workaround.css create mode 100644 static/bootstrap/assets/js/ie-emulation-modes-warning.js create mode 100644 static/bootstrap/assets/js/ie10-viewport-bug-workaround.js create mode 100644 static/bootstrap/assets/js/ie8-responsive-file-warning.js create mode 100644 static/bootstrap/css/bootstrap-theme.css create mode 100644 static/bootstrap/css/bootstrap-theme.css.map create mode 100644 static/bootstrap/css/bootstrap-theme.min.css create mode 100644 static/bootstrap/css/bootstrap-theme.min.css.map create mode 100644 static/bootstrap/css/bootstrap.css create mode 100644 static/bootstrap/css/bootstrap.css.map create mode 100644 static/bootstrap/css/bootstrap.min.css create mode 100644 static/bootstrap/css/bootstrap.min.css.map create mode 100644 static/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 static/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 static/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 static/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 static/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 static/bootstrap/js/bootstrap.js create mode 100644 static/bootstrap/js/bootstrap.min.js create mode 100644 static/bootstrap/js/npm.js create mode 100644 static/bundle/jpk/jpk.js create mode 100644 static/bundle/sf/2.chunk.js create mode 100644 static/bundle/sf/3.chunk.js create mode 100644 static/bundle/sf/asset-manifest.json create mode 100644 static/bundle/sf/dev.html create mode 100644 static/bundle/sf/favicon.ico create mode 100644 static/bundle/sf/index.html create mode 100644 static/bundle/sf/manifest.json create mode 100644 static/bundle/sf/runtime~sf.js create mode 100644 static/bundle/sf/service-worker.js create mode 100644 static/bundle/sf/sf.chunk.js create mode 100644 static/bundle/sf/sf.css create mode 100644 static/bundle/sf/sf.js create mode 100644 static/bundle/sf/sf.js.map create mode 100644 static/bundle/sf/static/css/sf.css create mode 100644 static/bundle/sf/static/css/sf.css.map create mode 100644 static/css/JednostkaInnaStrukturyDanychSprFin_v1-0.xsd create mode 100644 static/css/JednostkaInnaStrukturyDanychSprFin_v1-2.xsd create mode 100644 static/css/JednostkaInnaWZlotych(1)_v1-0.xsd create mode 100644 static/css/KodyKrajow_v5-0E.xsd create mode 100644 static/css/KodyKrajow_v6-0E.xsd create mode 100644 static/css/KodyNaczelnikowUrzedowSkarbowych_v4-0E.xsd create mode 100644 static/css/KodyPKD_v2-0E.xsd create mode 100644 static/css/KodyUrzedowSkarbowych.xsd create mode 100644 static/css/KodyUrzedowSkarbowych_v3-0E.xsd create mode 100644 static/css/KodyUrzedowSkarbowych_v5-0E.xsd create mode 100644 static/css/KodyUrzedowSkarbowych_v6-0E.xsd create mode 100644 static/css/NazwyPozycji_SF.xsd create mode 100644 static/css/Posredni_wspolne_v7-0E.xsl create mode 100644 static/css/Posredni_wspolne_v8-0E.xsl create mode 100644 static/css/StrukturyDanychSprFin_v1-1.xsd create mode 100644 static/css/StrukturyDanychSprFin_v1-2.xsd create mode 100644 static/css/WspolneSzablonyWizualizacji_v2-0E.xsl create mode 100644 static/css/WspolneSzablonyWizualizacji_v7-0E.xsl create mode 100644 static/css/WspolneSzablonyWizualizacji_v8-0E.xsl create mode 100644 static/css/app.css create mode 100644 static/css/cbois.xsl create mode 100644 static/css/deklaracja.css create mode 100644 static/css/dziennik.xsl create mode 100644 static/css/jpk.xsl create mode 100644 static/css/konto_zapis.xsl create mode 100644 static/css/sf.css create mode 100644 static/css/upo.css create mode 100644 static/css/upo.xsl create mode 100644 static/css/xsl.css create mode 100644 static/css/zois-csv.xsl create mode 100644 static/css/zois.xsl create mode 100644 static/data/objects.txt create mode 100644 static/files/vat-7-21.pdf create mode 100644 static/font/Arial.ttf create mode 100644 static/img/loading.gif create mode 100644 static/img/xlsx.png create mode 100644 static/img/xlsx32.png create mode 100644 static/js/jpk.js create mode 100644 static/js/jquery.js create mode 100644 static/js/jquery.min.js create mode 100644 static/js/main.js create mode 100644 static/js/page.js create mode 100644 static/js/page2.js create mode 100644 static/js/react.js create mode 100644 static/js/runtime.js create mode 100644 static/xsd/DefinicjeTypy.html create mode 100644 static/xsd/ElementarneTypyDanych_v4-0E.xsd create mode 100644 static/xsd/JPK_FA.xsd create mode 100644 static/xsd/JPK_FA2.xsd create mode 100644 static/xsd/JPK_FA3.xsd create mode 100644 static/xsd/JPK_KR.xsd create mode 100644 static/xsd/JPK_MAG.xsd create mode 100644 static/xsd/JPK_SF.xsd create mode 100644 static/xsd/JPK_SF2.xsd create mode 100644 static/xsd/JPK_V7K.xsd create mode 100644 static/xsd/JPK_V7M.xsd create mode 100644 static/xsd/JPK_VAT.xsd create mode 100644 static/xsd/JPK_VAT2.xsd create mode 100644 static/xsd/JPK_VAT3.xsd create mode 100644 static/xsd/JPK_VAT4-2020-05.xsd create mode 100644 static/xsd/JPK_VAT4.xsd create mode 100644 static/xsd/JPK_VAT4K.xsd create mode 100644 static/xsd/JPK_VAT4M.xsd create mode 100644 static/xsd/JPK_WB.xsd create mode 100644 static/xsd/JednostkaInnaStrukturyDanychSprFin_v1-0.xsd create mode 100644 static/xsd/JednostkaInnaStrukturyDanychSprFin_v1-2.xsd create mode 100644 static/xsd/KodyCECHKRAJOW.html create mode 100644 static/xsd/KodyCechKrajow_v3-0E.xsd create mode 100644 static/xsd/KodyKrajow_v4-1E.xsd create mode 100644 static/xsd/KodyNaczelnikowUrzedowSkarbowych_v3-0E.xsd create mode 100644 static/xsd/KodyUrzedowSkarbowych_v4-0E.xsd create mode 100644 static/xsd/StrukturyDanychSprFin_v1-0.xsd create mode 100644 static/xsd/StrukturyDanychSprFin_v1-1.xsd create mode 100644 static/xsd/StrukturyDanychSprFin_v1-2.xsd create mode 100644 static/xsd/StrukturyDanych_v4-0E.xsd create mode 100644 static/xsd/StrukturyDanych_v5-0E.xsd create mode 100644 vat/__init__.py create mode 100644 vat/admin.py create mode 100644 vat/apps.py create mode 100644 vat/migrations/0001_initial.py create mode 100644 vat/migrations/0002_konkrs.py create mode 100644 vat/migrations/__init__.py create mode 100644 vat/models.py create mode 100644 vat/tests.py create mode 100644 vat/urls.py create mode 100644 vat/views.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..a23bf71 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# jpk diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/admin.py b/app/admin.py new file mode 100644 index 0000000..b8c6d94 --- /dev/null +++ b/app/admin.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from django.contrib import admin +from django.contrib.auth.models import User +from django.contrib.auth.admin import UserAdmin +from django.db import models +from django import forms +from django.utils.translation import ugettext_lazy as _ + +class MyUserAdmin(UserAdmin): + filter_horizontal= () + list_display= ('username', 'first_name', 'last_name', 'email', 'is_superuser') + fieldsets= ( + (None, {'fields': ('username', 'password')}), + (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), + (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups')}), + (_('Important dates'), {'fields': ('last_login', 'date_joined')}), + ) + formfield_overrides = { + models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, + } + +admin.site.unregister(User) +admin.site.register(User, MyUserAdmin) diff --git a/app/ajax.py b/app/ajax.py new file mode 100644 index 0000000..a6ffc7e --- /dev/null +++ b/app/ajax.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import json + +from django.contrib.auth.decorators import login_required +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.http import HttpResponse + +from app.models import Plik, Firma + + +@login_required +def jpk_lista(request, firma): + + # Pomijamy pola tekstowe ponieważ ich pobieranie/dekompresja stanowi duży narzut + pliki= Plik.objects.filter(firma__oznaczenie=firma).order_by('-id').only('id', 'utworzony', 'kod', 'dataod', 'datado', 'nazwa', 'rachunek', 'magazyn', 'wariant', 'cel_zlozenia', 'stan', 'odkad', 'czesc', 'utworzony_user', 'task') + data= [jpk.to_json() for jpk in pliki] + + return HttpResponse(json.dumps({'data': data}), + content_type='application/json') + + +@login_required +def lista_firm(request): + + return render_to_response('app/ajax/lista_firm.json', + { + 'firmy': Firma.firmy() + }, + context_instance= RequestContext(request), + content_type='application/json') diff --git a/app/apps.py b/app/apps.py new file mode 100644 index 0000000..f33af40 --- /dev/null +++ b/app/apps.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class AppConfig(AppConfig): + name = 'app' diff --git a/app/context_processors.py b/app/context_processors.py new file mode 100644 index 0000000..304a03f --- /dev/null +++ b/app/context_processors.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +def alert(request): + """ + Dodanie do konteksu alertu do wyświetlenia po załadowaniu strony. + """ + + alert= request.session.get('alert') + if alert: + del request.session['alert'] + return {'alert': alert} + else: + return {} + + +def home(request): + if(not request.user.is_authenticated()): + return {'HOME_LABEL': 'KREZUS-FK'} + else: + return {} \ No newline at end of file diff --git a/app/ctrl/__init__.py b/app/ctrl/__init__.py new file mode 100644 index 0000000..98311f0 --- /dev/null +++ b/app/ctrl/__init__.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from app.models import Ctrl, Deklaracja, DeklaracjaPoz +from fk.models import SysPar, MagDok +import decimal + + +class CtrlTabeli(object): + """ + Kontrola tego co ma być uwzględnione oraz ustalanie podsumowania tabeli. + """ + + def __init__(self, jpk): + self.MAX_LP= None + self.jpk= jpk + self.lp= 0 + self.suma1= decimal.Decimal('0.00') + self.suma2= decimal.Decimal('0.00') + + # Sprawdzenie czy istnieje baza danych pliku JPK + jpk.fkdbs('DBS') + + def generator(self): + for pozycje in self.elementy: + for element in pozycje: + element.jpk= self.jpk + if self.MAX_LP and self.lp >= self.MAX_LP: return + + if self.uwzglednij(pozycje, element): + self.lp += 1 + element.lp= self.lp + self.sumuj(pozycje, element) + yield element + +# self.uwzglednij(pozycje, None) # ewentualne wywołanie do podsumowania + + def uwzglednij(self, pozycje, element): + return True + + def sumuj(self, pozycje, element): + pass + + def save_ctrl(self): + ctrl, _ = Ctrl.objects.get_or_create(plik= self.jpk, tabela= self.tabela) + + ctrl.wiersze= self.lp + ctrl.suma1= self.suma1 + ctrl.suma2= self.suma2 + ctrl.save() + + self.ctrl= ctrl + + def do_deklaracji(self, dok, od_num, do_num, shift= 0): + """ + Uwzględnienie danego dokumentu w deklaracji. + Wszystkie niezerowe kwoty K_* są dodawane do odpowiednich pozycji deklaracji (P_*) + Kwoty z danego dokumentu są dosumowywane do pozycji deklaracji danego JPK pamiętanych + w modelu Deklaracja. + Dopiero po utworzeniu tych pozycji, mogą one być podsumowane i wwpisane do XML. + Niestety w XML deklaracja jest przed ewidencją. + """ + if dok.nr_faktury == 'KOREKTA ROCZNA': + return + + for k in range(od_num, do_num+1): + kwota= getattr(dok, 'k_{}'.format(k)) + + if kwota != decimal.Decimal(0.00): + # Debile zmienili numerację pozycji, np. numery pozycji 43-48 ze starszych wersji + # teraz mają numery 40-45 + numer= k + shift + # szukamy w Deklaracja pozycji, w której możemy zapisać daną kwotę + dek= Deklaracja.objects.filter(jpk= self.jpk, numer= numer) + if not dek: + dek= DeklaracjaPoz.pozycja_deklaracji(self.jpk, numer) + else: + dek= dek[0] + dek.kwota += kwota + dek.save() + + + +class CtrlTabeliMag(CtrlTabeli): + """ + Kontrola sprzedaży VAT. + """ + + def __init__(self, jpk, symbole, zmien_znak): + super(CtrlTabeliMag, self).__init__(jpk) + + self.elementy= [ + MagDok.objects.using(jpk.fkdbs('Mag')).filter( + data__gte= jpk.dataod, + data__lte= jpk.datado, + dzial= jpk.magazyn[:3], + stat= 'D' + ) + .filter(**symbole) + .order_by('data', 'id'), + ] + + self.zmien_znak= zmien_znak + self.tabela= self.__class__.__name__.lower() + + self.dokumenty= [] + + # cachowanie dokumentów bo i tak będą dwa przebiegi + for d in self.generator(): + pass + + def sumuj(self, pozycje, element): + self.suma1 += element.mag_wartosc + + def uwzglednij(self, pozycje, dok): + """ + Dokument magazynowy + """ + super(CtrlTabeliMag, self).uwzglednij(pozycje, dok) + + self.dokumenty.append(dok) + + dok.wiersze_all= [] + dok.mag_wartosc= decimal.Decimal(0) + for w in dok.wiersze.all(): + if self.zmien_znak: + w.zmien_znak() + dok.mag_wartosc += w.wartosc + dok.wiersze_all.append(w) + + return True + + + +class Pozycje(object): + + def __init__(self, pozycje): + self.pozycje= pozycje + + def __iter__(self): + return self.pozycje.__iter__() + + diff --git a/app/ctrl/fa.py b/app/ctrl/fa.py new file mode 100644 index 0000000..e54870d --- /dev/null +++ b/app/ctrl/fa.py @@ -0,0 +1,267 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from fk.models import MagDok, MagWiersz, Spo +from app.utils import grosze, stawka +from app import ctrl +from app.templatetags import utils + +import decimal +import re + + +class Faktura(ctrl.CtrlTabeli): + """ + Kontrola sprzedaży VAT. + """ + + def __init__(self, jpk): + super(Faktura, self).__init__(jpk) + + self.elementy= [ + MagDok.objects.select_related('id_kli').using(jpk.fkdbs('Faktura.MagDok')).filter(data__gte= jpk.dataod, data__lte= jpk.datado, symbol__in=('FV','RU','FW'), stat='D', dr_fisk__isnull= True).order_by('id'), + ] + self.tabela= 'faktura' + + def sumuj(self, i, element): + self.suma1 += element.brutto + + + def uwzglednij(self, i, fak): + """ + Faktury sprzedaży + """ + + fak.czy_wewnetrzna= (fak.symbol == 'FW') + fak.czy_odwrotne= 'false' + fak.rodzaj_faktury= 'VAT' + + if fak.korekta == 'K': + fak.rodzaj_faktury= 'KOREKTA' + fak.przyczyna_korekty= fak.podstawa_korekty() + + try: + fak.nr_korygowanej= fak.korygowana.nr_fak() + fak.okres_korygowanej= fak.korygowana.data + except MagDok.DoesNotExist: + fak.jpk.blad('Faktura', fak.nr_fak(), 'Nie znaleziono faktury korygowanej') + fak.nr_korygowanej= '' + fak.okres_korygowanej= '' + + # Czytamy wszystkie pozycje i liczymy podsumowanie faktury wg stawek VAT + # tak samo jak na wydruku faktury + + fak.zal_zaplata= decimal.Decimal(0) + fak.zal_podatek= decimal.Decimal(0) + + # Zaliczka z wartości brutto wszystkich pozycji faktury + # Dla przypadku gdy faktura jest zaznaczona jako zaliczkowa ale nie + # podano wartości zaliczki w pozycjach faktury, + # wtedy cała faktura traktowana jest jako zaliczkowa + zal_zaplata= decimal.Decimal(0) + zal_podatek= decimal.Decimal(0) + zal_wiersze= False + + podsum= {} + for w in fak.wiersze.all(): + w.wartosc_wiersza(fak) + + w_vat= w.vat # do grupowania w podsumowaniu stawkami + + if w.vat == '22%': w_vat= '23%' + if w.vat == ' 7%': w_vat= ' 8%' + if w.vat == ' 3%': w_vat= ' 5%' + + if fak.oo(w): w_vat= 'OO.' + if fak.np(w): w_vat= 'NP.' + + # Pozostałe stawki na 0% + if not w_vat in ('23%', ' 8%', ' 5%', ' 0%', 'ZW.', 'OO.', 'NP.'): + w_vat= ' 0%' + + st= podsum.get(w_vat) + if not st: + podsum[w_vat]= [w.p_netto, w.p_vat, w.p_brutto] + else: + st[0] += w.p_netto + st[1] += w.p_vat + st[2] += w.p_brutto + + if fak.ciagla == 'T': # faktura zaliczkowa + zal_zaplata += w.p_brutto + zal_podatek += grosze(w.p_brutto * stawka(w.vat) / (decimal.Decimal(100)+stawka(w.vat))) + + if w.zaliczka and w.zaliczka != 0.0: + zal_wiersze= True + fak.zal_zaplata += w.zaliczka + fak.zal_podatek += grosze(w.zaliczka * stawka(w.vat) / (decimal.Decimal(100)+stawka(w.vat))) + + + if fak.ciagla == 'T': # faktura zaliczkowa + fak.rodzaj_faktury= 'ZAL' + if not zal_wiersze: + # Cała faktura jako zaliczkowa + fak.zal_zaplata= zal_zaplata + fak.zal_podatek= zal_podatek + + zera= [decimal.Decimal(0.0) for i in range(3)] + + fak.netto23= podsum.get('23%', zera)[0] + fak.vat23= podsum.get('23%', zera)[1] + + fak.netto8= podsum.get(' 8%', zera)[0] + fak.vat8= podsum.get(' 8%', zera)[1] + + fak.netto5= podsum.get(' 5%', zera)[0] + fak.vat5= podsum.get(' 5%', zera)[1] + + fak.netto_oo= podsum.get('OO.', zera)[0] + fak.vat_oo= podsum.get('OO.', zera)[1] + + fak.netto_np= podsum.get('NP.', zera)[0] + fak.vat_np= podsum.get('NP.', zera)[1] + + fak.netto0= podsum.get(' 0%', zera)[0] + fak.nettoZW= podsum.get('ZW.', zera)[0] + + if fak.waluta: + + # Zapisanie wartości w złotych do wykazanie w polach *_W + + fak.vat23_zl= fak.vat23 + fak.vat8_zl= fak.vat8 + fak.vat5_zl= fak.vat5 + fak.vat_oo_zl= fak.vat_oo + + # Przeliczenie kwot w zł na kwoty w walucie + + fak.netto23= fak.na_walute(fak.netto23) + fak.vat23= fak.na_walute(fak.vat23) + + fak.netto8= fak.na_walute(fak.netto8) + fak.vat8= fak.na_walute(fak.vat8) + + fak.netto5= fak.na_walute(fak.netto5) + fak.vat5= fak.na_walute(fak.vat5) + + fak.netto_oo= fak.na_walute(fak.netto_oo) + fak.vat_oo= fak.na_walute(fak.vat_oo) + + fak.netto_np= fak.na_walute(fak.netto_np) + fak.vat_np= fak.na_walute(fak.vat_np) + + fak.netto0= fak.na_walute(fak.netto0) + fak.nettoZW= fak.na_walute(fak.nettoZW) + + if fak.kurs and fak.w_walucie: + fak.wart_bru= fak.w_walucie + + # Do sumy kontrolnej w ctrl (sumowanie kwot w różnych walutach) + fak.brutto= fak.wart_bru + + fak.p16= fak.p17= fak.p18= fak.p19= fak.p20= fak.p21= fak.p22= fak.p23= 'false' + fak.p18a= 'false' + + for rodzaj in re.findall('[A-Z]\d*', fak.rodzaj or ''): + lit= rodzaj[0] + par= rodzaj[1:] + if lit == 'K': + fak.p16= 'true' + if lit == 'S': + fak.p17= 'true' + if lit == 'O': + fak.p18= 'true' + if lit == 'Z': + fak.p19= 'true' + fak.p19a= Spo.nazwa_pozycji('SPPOD', par, self.jpk) + if lit == 'E': + fak.p20= 'true' + if lit == 'I': + fak.p21= 'true' + if lit == 'T': + fak.p23= 'true' + + fak.adres_kon= fak.id_kli.adres_kon(jpk= fak.jpk) + + if not fak.data: + fak.jpk.blad('Faktura', fak.nr_fak(), 'Brak daty wystawienia faktury') + if not fak.nr_fak(): + fak.jpk.blad('Faktura', fak.id, 'Brak numeru faktury') + if not fak.id_kli.nazwa_kon() or len(fak.id_kli.nazwa_kon())==0: + fak.jpk.blad('Faktura', fak.nr_fak(), 'Brak nazwy nabywcy') + if not fak.adres_kon or len(fak.adres_kon)==0: + fak.jpk.blad('Faktura', fak.nr_fak(), 'Brak adresu nabywcy') + if fak.korekta == 'K': + if not fak.przyczyna_korekty or len(fak.przyczyna_korekty.strip())==0: + fak.jpk.blad('Faktura', fak.nr_fak(), 'Nieznana przyczyna korekty faktury') + if not fak.nr_korygowanej or len(fak.nr_korygowanej.strip())==0: + fak.jpk.blad('Faktura', fak.nr_fak(), 'Nieznany numer faktury korygowanej') + if not fak.okres_korygowanej: + fak.jpk.blad('Faktura', fak.nr_fak(), 'Nieznany okres faktury korygowanej') + + return True + + +class Wiersz(ctrl.CtrlTabeli): + """ + Kontrola sprzedaży VAT. + """ + + def __init__(self, jpk): + super(Wiersz, self).__init__(jpk) + + self.elementy= [ + MagWiersz.objects.select_related('id_dok__id_kli').using(jpk.fkdbs('Wiersz.MagWiersz')).filter(id_dok__data__gte= jpk.dataod, id_dok__data__lte= jpk.datado, id_dok__symbol__in=('FV','RU','FW'), id_dok__stat='D', id_dok__dr_fisk__isnull= True).order_by('id_dok__id', 'id'), + ] + self.tabela= 'faktura_wiersz' + + def sumuj(self, i, element): + self.suma1 += element.netto + + def uwzglednij(self, i, w): + """ + Faktury sprzedaży + """ + w.wartosc_wiersza(w.id_dok) + w.daj_opi() + + w.nazwa= ' '.join(x.strip() for x in w.opia) + w.nazwa= re.sub('\s+', ' ', w.nazwa) + + if w.wsk_wyc == 'B': + w.cena_bru= w.c_bru + w.brutto= w.p_brutto + else: + w.cena_net= w.c_net + + w.netto= w.p_netto + + fak= w.id_dok + if fak.waluta: + if w.wsk_wyc == 'B': + w.cena_bru= fak.na_walute(w.cena_bru) + w.brutto= fak.na_walute(w.brutto) + else: + w.cena_net= fak.na_walute(w.cena_net) + w.p_netto= fak.na_walute(w.p_netto) + w.netto= fak.na_walute(w.netto) + + nr_fak= w.id_dok.nr_fak() + + if not nr_fak or len(nr_fak)==0: + w.jpk.blad('Wiersz', w.id_dok, 'Brak numer faktury') + if not w.nazwa or len(w.nazwa)==0: + w.jpk.blad('Wiersz', nr_fak, 'Brak nazwy (rodzaju) towaru lub usługi') + if not w.jm or len(w.jm)==0: + w.jm= 'jdn' + if w.il_real is None: + w.jpk.blad('Wiersz', nr_fak, 'Brak ilości (liczby) dostarczonych towarów lub zakresu wykonanych usług') + if not w.jm or len(w.jm)==0: + w.jpk.blad('Wiersz', nr_fak, 'Brak jednostki miary') + + st_vat= utils.stawka(w.vat) + if st_vat and not st_vat in ('23', '22', '8', '7', '5', '4', '3', '0', 'zw', 'oo', 'np'): + w.jpk.blad('Wiersz', nr_fak, 'Niepoprawna stawka VAT ({}/{})'.format(w.vat, st_vat)) + + return True diff --git a/app/ctrl/kr.py b/app/ctrl/kr.py new file mode 100644 index 0000000..c9a0542 --- /dev/null +++ b/app/ctrl/kr.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import decimal + +from app import ctrl, utils +from app.model_utils import poczatek_miesiaca, koniec_miesiaca +from fk.models import Syn, Ana, Ksi, Dow, Uzy, SysPar +from app.utils import data_na_miesiac + +class ZOiS(ctrl.CtrlTabeli): + """ + Kontrola zestawienie obrotów i sald. + """ + + def __init__(self, jpk): + super(ZOiS, self).__init__(jpk) + + self.elementy= [Ana.objects.using(jpk.fkdbs('ZOiS.Ana')).all().order_by('numer_a')] + self.tabela= 'zois' + + def sumuj(self, i, element): + self.suma1 += element.obroty_wn + self.suma2 += element.obroty_ma + + def uwzglednij(self, i, ana): + + # Uwzględniamy tylko konta bilansowe + if not ana.bilansowe() and not utils.par_firmy('wszystkie_konta'): + return False + + ana.kod_konta= ana.numer_a + if len(ana.numer_a.strip())>3: + ana.kod_konta= '{}-{}'.format(ana.numer_a[:3], ana.numer_a[3:]) + + ana.obroty_wn= ana.obroty('wn') + ana.obroty_ma= ana.obroty('ma') + ana.narasta_wn= ana.narasta('wn') + ana.narasta_ma= ana.narasta('ma') + ana.saldo_wn= ana.saldo('wn') + ana.saldo_ma= ana.saldo('ma') + + rc= False + if ana.wn_0 != 0 or ana.ma_0 != 0: rc= True + if ana.obroty_wn != 0 or ana.obroty_ma != 0: rc= True + if ana.narasta_wn != 0 or ana.narasta_ma != 0: rc= True + if ana.saldo_wn != 0 or ana.saldo_ma != 0: rc= True + if ana.byl_ruch(): rc= True + + if not rc: + return False + + if not ana.nazwa_a or len(ana.nazwa_a.strip())==0: + ana.jpk.blad('ZOiS', ana.konto_ladnie(), 'Brak nazwy konta') + if not ana.typ_konta() or len(ana.typ_konta().strip())==0: # pragma: no cover + ana.jpk.blad('ZOiS', ana.konto_ladnie(), 'Nieokreślony typ konta') + if not ana.opis_zespolu() or len(ana.opis_zespolu().strip())==0: # pragma: no cover + ana.jpk.blad('ZOiS', ana.konto_ladnie(), 'Nieokreślony opis zespołu kont') + if not ana.opis_kategorii() or len(ana.opis_kategorii().strip())==0: + ana.jpk.blad('ZOiS', ana.konto_ladnie(), 'Nieokreślony opis kategorii kont (syntetyki)') + + return True + + + +class Dziennik(ctrl.CtrlTabeli): + """ + Kontrola dziennika księgowań. + """ + + def __init__(self, jpk): + super(Dziennik, self).__init__(jpk) + + self.elementy= [Dow.objects.using(jpk.fkdbs('Dziennik.Dow')).filter(miesiac__gte= jpk.od_msc(), miesiac__lte= jpk.do_msc()).order_by('miesiac', 'lp_dzi')] + self.tabela= 'dziennik' + self.dbs= jpk.fkdbs('Dziennik.init') + + par_dzi= SysPar.get_wartosc('DZI', jpk.fkdbs('DZI'), current= True) + if par_dzi < jpk.do_msc(): + jpk.blad('Dziennik', par_dzi, 'Dziennik jest ponumerowany tylko do {}'.format(par_dzi)) + + def sumuj(self, i, element): + self.suma1 += element.suma + + def uwzglednij(self, i, dow): + if dow.lp_dzi is None: + return False + + if not dow.rodzaj_dowodu_nazwa() or len(dow.rodzaj_dowodu_nazwa())==0: + dow.jpk.blad('Dziennik', dow.nr_dowodu, 'Nieokreślony rodzaj dowodu księgowego') + + dow.kod_operatora= Uzy.kod_operatora(dow.kto, self.dbs) + + if dow.d_operacji is None or dow.d_dowodu is None: + dow.ustal_zrodlowe() + + # W ICHP np. data w nagłówku dowodu czasami nie jest podawana!!! + if not dow.d_wyst: + dow.d_wyst= koniec_miesiaca(dow.miesiac) + + # Ustalenie daty operacji + # W przypadku sprzedaży i zakupów ustalane z odpowiedniego rejestru + if dow.d_operacji is None: + dow.d_operacji= dow.d_wyst + dow.msc_operacji= data_na_miesiac(dow.d_operacji) + + # Ustalanie daty dowodu (faktury) + # W przypadku sprzedaży i zakupów ustalana z odpowiedniego rejestru + if dow.d_dowodu is None: + dow.d_dowodu= dow.d_wyst + dow.msc_dowodu= data_na_miesiac(dow.d_dowodu) + + # Ustalenie daty księgowania + dow.d_ksiegowania= dow.d_wyst + dow.msc_ksiegowania= data_na_miesiac(dow.d_wyst) + if dow.msc_ksiegowania < dow.miesiac: + dow.d_ksiegowania= poczatek_miesiaca(dow.miesiac) + if dow.msc_ksiegowania > dow.miesiac: + dow.d_ksiegowania= koniec_miesiaca(dow.miesiac) + dow.msc_ksiegowania= data_na_miesiac(dow.d_ksiegowania) + + if not dow.d_operacji: + dow.jpk.blad('Dziennik', dow.nr_dowodu, 'Brak daty operacji gospodarczej') + if not dow.d_dowodu: + dow.jpk.blad('Dziennik', dow.nr_dowodu, 'Brak daty dowodu księgowego') + if not dow.d_ksiegowania: + dow.jpk.blad('Dziennik', dow.nr_dowodu, 'Brak daty księgowania') + if not dow.kod_operatora or len(dow.kod_operatora)==0: + dow.jpk.blad('Dziennik', dow.nr_dowodu, 'Brak kodu operatora') + if not dow.opis() or len(dow.opis())==0: + dow.jpk.blad('Dziennik', dow.nr_dowodu, 'Brak opisu operacji gospodarczej') + if dow.suma is None: + dow.jpk.blad('Dziennik', dow.nr_dowodu, 'Brak kwoty operacji') + + return True + + +class KontoZapis(ctrl.CtrlTabeli): + """ + Kontrola zapisów na kontach. + """ + + def __init__(self, jpk): + super(KontoZapis, self).__init__(jpk) + + do_dziennika= Ksi.objects.using(jpk.fkdbs('KontoZapis.Ksi')).filter(miesiac__gte= jpk.od_msc(), miesiac__lte= jpk.do_msc(), glowna__isnull= True).order_by('miesiac', 'lp_dzi', 'ksi_id') + if not utils.par_firmy('wszystkie_konta'): + do_dziennika= do_dziennika.filter(lp_dzi__isnull= False) + + self.elementy= [do_dziennika] + + self.tabela= 'konto_zapis' + + def sumuj(self, i, element): + self.suma1 += element.wn_kwota + self.suma2 += element.ma_kwota + + def uwzglednij(self, i, ksi): + + ksi_opi= ksi.ksi_opi() + if ksi.opis: + ksi_opi= ksi.opis.strip()+ (', '+ksi_opi if ksi_opi else '') + + if ksi.strona == 'W': + ksi.wn_konto= ksi.konto + elif ksi.d2 == 'T': + ksi.wn_konto= ksi.przeciwne + else: + ksi.wn_konto= None + + if ksi.wn_konto and (Syn.bilansowe(ksi.wn_konto, self.jpk) or utils.par_firmy('wszystkie_konta')): + if len(ksi.wn_konto.strip())>3: + ksi.wn_konto= '{}-{}'.format(ksi.wn_konto[:3], ksi.wn_konto[3:]) + ksi.wn_kwota= ksi.kwota + ksi.wn_kwota_wal= ksi.k2 + ksi.wn_kod_wal= ksi.waluta + ksi.wn_opis= ksi_opi + else: + ksi.wn_konto= 'null' + ksi.wn_kwota= decimal.Decimal(0) + ksi.wn_kwota_wal= ksi.wn_kod_wal= ksi.wn_opis= None + + if ksi.strona == 'M': + ksi.ma_konto= ksi.konto + elif ksi.d2 == 'T': + ksi.ma_konto= ksi.przeciwne + else: + ksi.ma_konto= None + + if ksi.ma_konto and (Syn.bilansowe(ksi.ma_konto, self.jpk) or utils.par_firmy('wszystkie_konta')): + if len(ksi.ma_konto.strip())>3: + ksi.ma_konto= '{}-{}'.format(ksi.ma_konto[:3], ksi.ma_konto[3:]) + ksi.ma_kwota= ksi.kwota + ksi.ma_kwota_wal= ksi.k2 + ksi.ma_kod_wal= ksi.waluta + ksi.ma_opis= ksi_opi + else: + ksi.ma_konto= 'null' + ksi.ma_kwota= decimal.Decimal(0) + ksi.ma_kwota_wal= ksi.ma_kod_wal= ksi.ma_opis= None + + if ksi.wn_konto == 'null' and ksi.ma_konto == 'null': + return False + + if not ksi.lp_dzi: + ksi.jpk.blad('KontoZapis', '{}[{}]'.format(ksi.nr_dowodu, ksi.ksi_id), 'Brak numeru dziennika') + + return True diff --git a/app/ctrl/mag.py b/app/ctrl/mag.py new file mode 100644 index 0000000..a237fc3 --- /dev/null +++ b/app/ctrl/mag.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from app import ctrl + + +class PZ(ctrl.CtrlTabeliMag): + + def __init__(self, jpk): + super(PZ, self).__init__(jpk, {'symbol': 'PZ'}, False) + + def uwzglednij(self, i, dok): + rc= super(PZ, self).uwzglednij(i, dok) + dok.ustal_zak_pz() + return rc + + +class WZ(ctrl.CtrlTabeliMag): + + def __init__(self, jpk): + super(WZ, self).__init__(jpk, {'symbol2': 'WZ'}, True) + + +class RW(ctrl.CtrlTabeliMag): + + def __init__(self, jpk): + super(RW, self).__init__(jpk, {'symbol__in': ('RW', 'IR', 'WR')}, True) + + +class MM(ctrl.CtrlTabeliMag): + + def __init__(self, jpk): + super(MM, self).__init__(jpk, {'symbol': 'MM'}, True) + \ No newline at end of file diff --git a/app/ctrl/sf.py b/app/ctrl/sf.py new file mode 100644 index 0000000..ef8a56e --- /dev/null +++ b/app/ctrl/sf.py @@ -0,0 +1,501 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import datetime +import decimal +import re + +from django.db import connections + +from app import ctrl +from collections import OrderedDict + +from app.models import Plik +from sf.models import Sprawozdanie, Raport, Pozycja, Podatek + +""" +Sprawozdanie tworzone jest na podstawie innego sprawozdania (poprzedniego okresu). +Tworzenie polega na skopiowaniu pozycji raportów z przeniesieniem kwot bieżących +do poprzednich i wyzerowaniu kwot bieżących. +""" + +class Wprowadzenie(ctrl.CtrlTabeli): + """ + Kontrola zestawienie obrotów i sald. + """ + + def __init__(self, jpk, config): + super(Wprowadzenie, self).__init__(jpk) + + self.elementy= [] + self.tabela= 'wprowadz' + self.config= config + + # Tak aby przy tworzeniu pozostałych Ctrl Sprawozdanie już istniało + # bo kolejność nie jest znana + + spr= None + try: + pop_spr_id= config.get('poprzednie') + if pop_spr_id: + spr= Sprawozdanie.objects.get(id=pop_spr_id) + except Sprawozdanie.DoesNotExist: + pass + + if not spr: + spr= Sprawozdanie.pierwsze(jpk) + + uszczegolowienia= list(spr.uszczegolowienia.all().order_by('id')) + + spr.pk= None + spr.jpk= jpk + spr.p0_data_sporzadzenia= datetime.date.today() + spr.p3_data_od= jpk.dataod + spr.p3_data_do= jpk.datado + + spr.save() + + # Skopiowanie uszczegółowień + for wpr in uszczegolowienia: + wpr.pk= None + wpr.sprawozdanie= spr + wpr.save() + + def utworz(self): + pass + + def sumuj(self, i, element): + pass + + def uwzglednij(self, i, ana): + return True + + +class RaportSprawozdania(ctrl.CtrlTabeli): + """ + Jeżeli danego raportu nie ma być w sprawozdaniu to konstruktor nie będzie wywołany. + """ + + def __init__(self, jpk, tabela, config): + super(RaportSprawozdania, self).__init__(jpk) + + self.elementy= [] + self.tabela= tabela + self.config= config + + self.ten_cursor= connections[self.jpk.fkdbs('Obroty')].cursor() + self.pop_cursor= connections[self.jpk.fkdbs_1('Obroty')].cursor() + + def raport_element(self): + ELEMENTY= {'aktywa': 'Aktywa', + 'pasywa': 'Pasywa', + 'rzis': 'RZiS', + 'kapital': 'ZestZmianWKapitale', + 'przeplywy': 'Przeplywy' + } + element= ELEMENTY.get(self.tabela) + if self.tabela == 'rzis': + element= self.config['wynik'] + if self.tabela == 'przeplywy': + element= self.config['przeplywy_metoda'] + return element + + def utworz(self): + # To sprawozdanie + sprawozdanie= Sprawozdanie.objects.get(jpk= self.jpk) + + # Raport tworzony jest na podstawie wybranego sprawozdanie odniesienia + self.pop_spraw_id= int(self.config.get('poprzednie', 1)) + element= self.raport_element() + + try: + self.raport= Raport.objects.get(sprawozdanie_id= self.pop_spraw_id, tabela= self.tabela, element=element) + except Raport.DoesNotExist: + # Jeżeli nie znaleziono odpowiedniego raportu z poprzedniego okresu/sprawozdania + # to bierzemy domyślny szablon + self.pop_spraw_id= 1 + self.raport= Raport.objects.get(sprawozdanie_id= self.pop_spraw_id, tabela= self.tabela, element=element) + + + if self.pop_spraw_id > 1: + try: + pop_jpk= Plik.objects.get(sprawozdanie__id= self.pop_spraw_id) + pop_ctrl= pop_jpk.get_ctrl(self.tabela) + if self.config['kopia']: + self.suma1= pop_ctrl.suma1 + self.suma2= pop_ctrl.suma2 + else: + self.suma2= pop_ctrl.suma1 + except: + pass + + + # Pozycje raportu poprzedniego okresu + self.elementy= [Pozycja.objects.filter(raport=self.raport)] + + self.raport.id= None + self.raport.sprawozdanie= sprawozdanie + self.raport.save() + + self.sprawozdanie= sprawozdanie + + list(self.generator()) + + self.obliczenia() + + def sumuj(self, i, element): + pass + + def uwzglednij(self, i, poz): + """ + Skopiowanie pozycji z raportu odniesienia do bieżącego raportu, + ewentualne ustalenie wartości pozycji na podstawie obrotów. + """ + poz.id= None + poz.raport= self.raport + + if not self.config['kopia']: + if self.pop_spraw_id == 1: + # Jeżeli nie ma poprzedniego raportu ustalamy obroty + poz.kwota_b= self.obroty(poz, False) + else: + poz.kwota_b= poz.kwota_a + + poz.kwota_a= self.obroty(poz, True) + poz.kwota_b1= 0 + + poz.save() + + return True + + def obroty(self, poz, biezacy): + """ + Ustalenie wartości pozycji raportu na podstawie obrotów podanych kont. + """ + if not poz.oblicz or not '(' in poz.oblicz: + return 0 + +# print('obroty {} {}: {}'.format(self.raport.tabela, poz.klu1, poz.oblicz)) + + m= re.split("([\+\-])", poz.oblicz) + op = '+' + wynik= decimal.Decimal(0) + + for x in m: + x= x.strip() + if not x or len(x)==0: + continue + + if x in ('+', '-'): + op= x + else: + if not '(' in x: + try: + if op == '+': + wynik += decimal.Decimal(x) + if op == '-': + wynik -= decimal.Decimal(x) + except: + pass + + continue + + w= re.split('[\(\)]', x) + + proc= w[0] + konta= w[1] + + rc, wynik= self.referencja(proc, konta, wynik, biezacy) + if rc: + continue + + if proc == 'sw': + strona= 'W' + elif proc == 'sm': + strona= 'M' + else: + strona= 'S' + + cursor= self.ten_cursor if biezacy else self.pop_cursor + cursor.callproc('saldo', [konta, strona, 0, 12]) + results= cursor.fetchall() + +# print(konta, strona, op, results[0][0]) + + if op == '+': + wynik += results[0][0] or 0 + if op == '-': + wynik -= results[0][0] or 0 + + return wynik + + def referencja(self, proc, konta, wynik, biezacy): + """ + Pobranie określonej wartości z innego raportu. + Np. wyniku netto rzis(O;L) do bilansu/pasywów. + Referencję określa się w postaci raport(klucz), + gdzie raport jest oznaczeniem (aktualnie pole tabela) daportu + a klucz to pole klu1. + """ + if proc in ('aktywa', 'pasywa', 'rzis', 'kapital', 'przeplywy'): + print('referencja', proc, konta, wynik, biezacy) + try: + # Ustalenie raportu, z którego należy pobrać wartość + rzis= Raport.objects.get(sprawozdanie=self.sprawozdanie, tabela=proc) + + # Pobranie wartości pozycji + + # W przypadku gdy dane mają być pobrane z raportu, który ma różne wersje + # należy wpisać klucze oddzielone średnikiem, tak aby pierwsza + # wartość istniejąca była brana pod uwagę + # np. rzis(O;L) + + for konta in konta.split(';'): + print('konta', konta) + p= Pozycja.objects.filter(raport=rzis, klu1=konta) + if p: + p= p[0] + print('p', p.kwota_a, p.kwota_b) + wynik += (p.kwota_a or 0) if biezacy else (p.kwota_b or 0) + break + except: + pass + + return True, wynik + return False, wynik + + def obliczenia(self): + """ + Wykonanie obliczeń dla wszystkich pozycji w celu posumowania + pozycji obliczanych. + """ + +# print('raport.obliczenia {}'.format(self.raport.tabela)) + pozycje= Pozycja.objects.filter(raport=self.raport) + Pozycja.obliczenia_zalezne(pozycje) + + self.pozycje= list(pozycje) + + for poz in pozycje: + + if poz.zalezne or poz.zalezne == 0: + self.wyrazenie(poz.zalezne, True) + + if poz.zalezne or poz.zalezne == 0: + self.wyrazenie(poz.zalezne, False) + + PODSUM= {'Aktywa': 'Aktywa', + 'Pasywa': 'Pasywa', + 'RZiSKalk': 'O', + 'RZiSPor': 'L', + 'ZestZmianWKapitale': 'III', + 'PrzeplywyPosr': 'G', + 'PrzeplywyBezp': 'G' + } + + sum_el= PODSUM.get(self.raport.element) + for pozycja in pozycje: + pozycja.save(update_fields=['kwota_a', 'kwota_b']) + + if sum_el == pozycja.el: + self.suma1= pozycja.kwota_a + self.suma2= pozycja.kwota_b + + def wyrazenie(self, zalezne, ten_okres): + """ + Obliczenie wartości wiersza "zalezne" w kolumnie "ten_okres". + """ + if not zalezne and zalezne != 0: + return + + zalezne= str(zalezne) + for zal in zalezne.split(','): + zal= int(zal) + p= self.pozycje[zal] + + if ten_okres: + p.kwota_a= self.obliczenie(p.oblicz, ten_okres) + else: + p.kwota_b= self.obliczenie(p.oblicz, ten_okres) + + self.wyrazenie(p.zalezne, ten_okres); + + def obliczenie(self, oblicz, ten_okres): + """ + Obliczenie wyrażenia podanego w "oblicz" w kolumnie "ten_okres". + """ + if not oblicz or '(' in oblicz: + return 0 + + wynik= decimal.Decimal(0) + + op= '+' + m= re.split("(\s*[\+\-\>\<]\s*)", oblicz) + + for x in m: + try: + x= x.strip() + if x in ['+', '-', '>', '<']: + op= x + else: + if not '.' in x: + poz= self.pozycje[int(x)] + x= decimal.Decimal(poz.kwota_a if ten_okres else poz.kwota_b) + + x= decimal.Decimal(x) + + if op == '+': wynik += x + elif op == '-': wynik -= x + elif op == '>': wynik= wynik if wynik > x else 0 + elif op == '<': wynik= wynik if wynik < x else 0 + except: + pass + + return wynik + + def ustal_obroty(self, raport): + lspr= Sprawozdanie.objects.filter(jpk__firma= self.jpk.firma).count() + self.raport= raport + + for poz in Pozycja.objects.filter(raport=self.raport): + if poz.oblicz and '(' in poz.oblicz: + poz.kwota_a= self.obroty(poz, True) + if lspr == 1: + poz.kwota_b= self.obroty(poz, False) + poz.save(update_fields=['kwota_a', 'kwota_b']) + + self.obliczenia() + + def przelicz(self, tabela): + self.sprawozdanie= Sprawozdanie.objects.get(jpk= self.jpk) + try: + self.raport= Raport.objects.get(sprawozdanie=self.sprawozdanie, tabela=tabela) + except: + return False + + self.ustal_obroty(self.raport) + + self.obliczenia() + return True + + +class Aktywa(RaportSprawozdania): + def __init__(self, jpk, config): + super(Aktywa, self).__init__(jpk, 'aktywa', config) + +class Pasywa(RaportSprawozdania): + def __init__(self, jpk, config): + super(Pasywa, self).__init__(jpk, 'pasywa', config) + +class RZiS(RaportSprawozdania): + def __init__(self, jpk, config): + super(RZiS, self).__init__(jpk, 'rzis', config) + +class Kapital(RaportSprawozdania): + def __init__(self, jpk, config): + super(Kapital, self).__init__(jpk, 'kapital', config) + +class Przeplywy(RaportSprawozdania): + def __init__(self, jpk, config): + super(Przeplywy, self).__init__(jpk, 'przeplywy', config) + + +class PodatekCtrl(ctrl.CtrlTabeli): + """ + Kontrola zestawienie obrotów i sald. + """ + + def __init__(self, jpk, config): + super(PodatekCtrl, self).__init__(jpk) + + self.elementy= [] + self.tabela= 'podatek' + self.config= config + + def utworz(self): + self.sprawozdanie= Sprawozdanie.objects.get(jpk= self.jpk) + + # Ustalenie sprawozdania + pop_spraw_id= int(self.config.get('poprzednie', 1)) + + if pop_spraw_id > 1: + try: + pop_jpk= Plik.objects.get(sprawozdanie__id= pop_spraw_id) + pop_ctrl= pop_jpk.get_ctrl(self.tabela) + if self.config['kopia']: + self.suma1= pop_ctrl.suma1 + self.suma2= pop_ctrl.suma2 + else: + self.suma2= pop_ctrl.suma1 + except: + pass + + + # Pozycje raportu poprzedniego okresu + self.elementy= [Podatek.objects.filter(sprawozdanie=pop_spraw_id).order_by('klucz')] + list(self.generator()) + + def sumuj(self, i, element): + pass + + def uwzglednij(self, i, poz): + poz.id= None + poz.sprawozdanie= self.sprawozdanie + + if not self.config['kopia']: + poz.rp_lacznie= poz.rb_lacznie + poz.rp_kapitalowe= poz.rb_kapitalowe + poz.rp_inne= poz.rb_inne + + poz.rb_lacznie= 0 + poz.rb_kapitalowe= 0 + poz.rb_inne= 0 + + poz.save() + + return True + + +class Dodatkowe(ctrl.CtrlTabeli): + """ + Kontrola zestawienie obrotów i sald. + """ + + def __init__(self, jpk, config): + super(Dodatkowe, self).__init__(jpk) + + self.elementy= [] + self.tabela= 'dodatkowe' + self.config= config + + def utworz(self): + pass + + def sumuj(self, i, element): + pass + + def uwzglednij(self, i, ana): + return True + + +def obliczenia(jpk, raport, ctrl): + """ + Ustalenie obrotów podanego raportu i + przeliczenie wartości wszystkich raportów (ze względu na możliwe powiązania) + """ + + RAPORTY= OrderedDict([ + ('rzis', RZiS), + ('aktywa', Aktywa), + ('pasywa', Pasywa), + ('kapital', Kapital), + ('przeplywy', Przeplywy) + ] + ) + + for tabela, ctrl in RAPORTY.items(): + rap= ctrl(jpk, {}) + if rap.przelicz(tabela): + rap.save_ctrl() + diff --git a/app/ctrl/vat/__init__.py b/app/ctrl/vat/__init__.py new file mode 100644 index 0000000..0a077dd --- /dev/null +++ b/app/ctrl/vat/__init__.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from . import gig, ichp, bra +from . import vat +from fk.models import SysPar + + +def sprzedaz(jpk): + + if SysPar._gig(): + return gig.SprzedazGIG(jpk) + if SysPar._ichp(): + return ichp.SprzedazICHP(jpk) + if SysPar._bra(): + return bra.SprzedazBRA(jpk) + + + +def zakup(jpk): + + if SysPar._gig(): + return gig.ZakupGIG(jpk) + if SysPar._ichp(): + return ichp.ZakupICHP(jpk) + if SysPar._bra(): + return bra.ZakupBRA(jpk) + + + +def deklaracja(jpk): + return vat.DeklaracjaVAT(jpk) diff --git a/app/ctrl/vat/bra.py b/app/ctrl/vat/bra.py new file mode 100644 index 0000000..5150585 --- /dev/null +++ b/app/ctrl/vat/bra.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from fk.models import MagDok, Zak +from app import utils +from .vat import SprzedazVAT, SprzedazVATPozycjeFak, ZakupVAT, ZakupVATPozycjeZak + +import datetime +import decimal +import itertools + +import logging +logger= logging.getLogger(__name__) + + + +class SprzedazBRA(SprzedazVAT): + """ + Część dotyczyąca podatku należnego do deklaracji w BRA tworzona jest + na podstawie zapisów z rejestru sprzedaży i zakupów. + """ + + def __init__(self, jpk): + super(SprzedazBRA, self).__init__(jpk) + + self.elementy= [] + if jpk.firma.oznaczenie == 'gdf': + self.elementy.append(SprzedazGDFPozycjeFak(jpk)) + else: + self.elementy.append(SprzedazBRAPozycjeFak(jpk)) + + +class SprzedazBRAPozycjeFak(SprzedazVATPozycjeFak): + + def __init__(self, jpk): + super(SprzedazBRAPozycjeFak, self).__init__( + MagDok.objects.select_related('id_kli').using(jpk.fkdbs('Sprzedaz.MagDok')).filter( + data_pod__gte= jpk.dataod, + data_pod__lte= jpk.datado, + symbol__in=('FV',), + stat='D', + dr_fisk__isnull= True).order_by('id') + ) + + + def uwzglednij(self, fak): + """ + Podatek należny z rejestru sprzedaży BRA. + fak.podsum zawiera podsumowanie pozycji stawkami VAT. + """ + + super(SprzedazBRAPozycjeFak, self).przygotuj(fak) + + fak.pod_rejestr= fak.symbol + + # Podrejestr sprzedaży będący podstawą (obook stawki VAT) + # kwalifikowania sprzedaży do pozycji deklaracji VAT/JPK + rejestr= fak.rodz_te.strip() + + for stawka in fak.podsum.keys(): + + netto= fak.podsum[stawka][0] + vat= fak.podsum[stawka][1] + + if netto is None or vat is None: # pragma: no cover + # Nie za bardzo wiadomo w jakich okolicznościach taki przypadek mógłby się pojawić + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Nieokreślona wartość netto lub podatku należnego') + + fak.podatek_nalezny += vat + + stawka= stawka[0:2] + + if stawka == 'ZW': + fak.k_10 += netto + + elif rejestr == 'PR' and stawka == 'NP': + fak.k_11 += netto + if fak.id_kli.nipue(): + fak.k_12 += netto + + elif rejestr in ('PR', 'PU', 'PT') and stawka == ' 0': + fak.k_13 += netto + + elif rejestr in ('PR', 'PU', 'PT') and stawka in (' 5', ' 3'): + fak.k_15 += netto + fak.k_16 += vat + + elif rejestr in ('PR', 'PU', 'PT') and stawka in (' 8', ' 7'): + fak.k_17 += netto + fak.k_18 += vat + + elif rejestr in ('PR', 'PU', 'PT') and stawka in ('23', '22'): + fak.k_19 += netto + fak.k_20 += vat + + elif rejestr == 'DT': + fak.k_21 += netto + + elif rejestr == 'NT': + fak.k_23 += netto + fak.k_24 += vat + + elif rejestr == 'OZ': + fak.k_25 += netto + fak.k_26 += vat + + elif rejestr == 'IP': + fak.k_27 += netto + fak.k_28 += vat + + elif rejestr == 'IE': + fak.k_29 += netto + fak.k_30 += vat + + elif rejestr == 'OS': + fak.k_31 += netto + + elif rejestr == 'ON': + fak.k_34 += netto + fak.k_35 += vat + + else: + fak.k_32 += netto + fak.k_33 += vat + + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Rodzaj sprzedaży {} i/lub stawka VAT {} niezakwalifikowane do żadnego pola deklaracji (tymczasowo wpisane do 34/35)'.format(rejestr, stawka)) + + self.sprawdzenie_nip_sprzedazy(fak) + + return True + + + +class SprzedazGDFPozycjeFak(SprzedazVATPozycjeFak): + + def __init__(self, jpk): + super(SprzedazGDFPozycjeFak, self).__init__( + MagDok.objects.select_related('id_kli').using(jpk.fkdbs('Sprzedaz.MagDok')).filter( + data_pod__gte= jpk.dataod, + data_pod__lte= jpk.datado, + symbol__in= ('FV','RU','EX','EK','FW','FP'), + stat='D', + dr_fisk__isnull= True).order_by('id') + ) + + def uwzglednij(self, fak): + """ + Źródłem najpierw jest rejestr sprzedaży. + """ + + super(SprzedazGDFPozycjeFak, self).przygotuj(fak) + + fak.pod_rejestr= fak.rodz_te.strip() + + for stawka in fak.podsum.keys(): + netto= fak.podsum[stawka][0] + vat= fak.podsum[stawka][1] + + if netto is None or vat is None: # pragma: no cover + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Nieokreślona wartość netto lub podatku należnego') + + fak.podatek_nalezny += vat + + if stawka == 'ZW.': + fak.k_10 += netto + elif stawka == ' 0%': + fak.k_13 += netto + elif stawka in (' 5%', '05%', ' 3%', '03%'): + fak.k_15 += netto + fak.k_16 += vat + elif stawka in (' 8%', '08%', ' 7%', '07%'): + fak.k_17 += netto + fak.k_18 += vat + elif stawka in ('23%', '22%'): + fak.k_19 += netto + fak.k_20 += vat + else: + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Pozycja: rodzaj sprzedaży({})/stawka VAT({}) niezakwalifikowana do żadnego pola deklaracji'.format(fak.rodz_te, stawka)) + + return True + + +class ZakupBRA(ZakupVAT): + """ + Kontrola zakupu VAT. + """ + + def __init__(self, jpk): + super(ZakupBRA, self).__init__(jpk) + + self.elementy= [ + # Faktury zakupu z okresu pliku JPK z bieżącej bazy + ZakupBRAPozycjeZak(self, + # Pozycje z bieżącego miesiąca + Zak.objects.select_related('dostawca').prefetch_related('pozycje').using(jpk.fkdbs('Zakup.Zak')). + filter(msc_roz__gte= utils.data_na_miesiac(jpk.dataod), + msc_roz__lte= utils.data_na_miesiac(jpk.datado)). + order_by('zak_id') + ), + ] + + + +class ZakupBRAPozycjeZak(ZakupVATPozycjeZak): + + def __init__(self, ctrl, *args, **kwargs): + super(ZakupBRAPozycjeZak, self).__init__(*args, **kwargs) + self.ctrl= ctrl + + def uwzglednij(self, zak): + + # Sprawdzenie poprawności i ustalenie podstawowych danych + super(ZakupBRAPozycjeZak, self).przygotuj(zak) + + for p in zak.pozycje.all(): + + p_roz= p.p_roz.strip() + + if p_roz == 'OI': + zak.k_43 += p.p_netto + zak.k_44 += p.p_vat + + if p_roz == 'OP': + zak.k_45 += p.p_netto + zak.k_46 += p.p_vat + + zak.podatek_naliczony= zak.k_44 + zak.k_46 + + zerowy= True + for k in range(43, 51): + if getattr(zak, 'k_{}'.format(k)) != decimal.Decimal(0.00): + zerowy= False + break + +# self.ctrl.vat_rozliczony(zak) + + self.sprawdzenie_nip_zakupow(zak) + + return not zerowy + diff --git a/app/ctrl/vat/gig.py b/app/ctrl/vat/gig.py new file mode 100644 index 0000000..669099f --- /dev/null +++ b/app/ctrl/vat/gig.py @@ -0,0 +1,426 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from fk.models import MagDok, Zak, SrtVat, SysPar +from app.utils import procent +from app import ctrl + +from .vat import SprzedazVAT, SprzedazVATPozycjeFak, ZakupVAT, ZakupVATPozycjeZak +from .. import Pozycje + +import datetime +import decimal +import itertools +import re +from django.conf import settings + +import logging +logger= logging.getLogger(__name__) + + + +class SprzedazGIG(SprzedazVAT): + """ + Część dotyczyąca podatku należnego do deklaracji w GIG tworzona jest + na podstawie zapisów z rejestru sprzedaży i zakupów. + """ + + def __init__(self, jpk): + super(SprzedazGIG, self).__init__(jpk) + + self.elementy= [ + SprzedazGIGPozycjeFak(jpk), + SprzedazGIGPozycjeZak(jpk) + ] + + +class SprzedazGIGPozycjeFak(SprzedazVATPozycjeFak): + + def __init__(self, jpk): + super(SprzedazGIGPozycjeFak, self).__init__( + MagDok.objects.select_related('id_kli').using(jpk.fkdbs('Sprzedaz.MagDok')).filter( + data_pod__gte= jpk.dataod, + data_pod__lte= jpk.datado, + symbol__in=('FV','RU','FW','ZD'), + stat='D', + dr_fisk__isnull= True).order_by('id') + ) + + + def uwzglednij(self, fak): + """ + Podatek należny z rejestru sprzedaży GIG. + fak.podsum zawiera podsumowanie pozycji stawkami VAT. + """ + + super(SprzedazGIGPozycjeFak, self).przygotuj(fak) + + fak.pod_rejestr= fak.symbol + + for stawka in fak.podsum.keys(): + netto= fak.podsum[stawka][0] + vat= fak.podsum[stawka][1] + + if netto is None or vat is None: # pragma: no cover + # Nie za bardzo wiadomo w jakich okolicznościach taki przypadek mógłby się pojawić + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Nieokreślona wartość netto lub podatku należnego') + + fak.podatek_nalezny += vat + + if stawka == 'ZW.': + fak.k_10= netto + elif stawka == 'NO.': + fak.k_11= netto + if fak.id_kli.nipue(): fak.k_12= netto + elif stawka == ' 0%' or stawka == 'K0%': + fak.k_13= netto + elif stawka in (' 5%', ' 3%'): + fak.k_15 += netto + fak.k_16 += vat + elif stawka in (' 8%', ' 7%'): + fak.k_17 += netto + fak.k_18 += vat + elif stawka in ('23%', '22%'): + fak.k_19 += netto + fak.k_20 += vat + elif stawka == 'W0%': + fak.k_21= netto + elif stawka == 'E0%': + fak.k_22= netto + elif stawka == 'OO.': + fak.k_31= netto + else: + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Stawka VAT {} niezakwalifikowana do żadnego pola deklaracji'.format(stawka)) + + self.sprawdzenie_nip_sprzedazy(fak) + + return True + + + +class SprzedazGIGPozycjeZak(Pozycje): + + def __init__(self, jpk): + super(SprzedazGIGPozycjeZak, self).__init__( + Zak.objects.select_related('dostawca').using(jpk.fkdbs('Sprzedaz.Zak')).filter( + d_ksieg__gte= jpk.dataod, + d_ksieg__lte= jpk.datado, + rodzaj__in= ('WNT', 'IU', 'PN', 'OO')) + ) + + + def uwzglednij(self, zak): + """ + Podatek należny ewidencjonowany w rejestrze zakupów + (importy, odwrotne obciążenie, podatnikiem jest nabywca). + """ + + zak.data_sprzedazy= zak.d_zak + zak.nip_kon= zak.nr_id() + + zak.nr_dokumentu= zak.faktura + if not zak.nr_dokumentu: + zak.jpk.blad('SPR/ZAK', zak.zak_id, 'Nieokreślony numer dokumentu/faktury zakupu') + + zak.data_wystawienia= zak.d_wyst + if not zak.data_wystawienia: + zak.jpk.blad('SPR/ZAK', zak.nr_dokumentu, 'Nieokreślona data wystawienia faktury zakupu') + + zak.pod_rejestr= zak.rodzaj + + zak.podatek_nalezny += zak.vat + if zak.netto is None or zak.vat is None: # pragma: no cover + zak.jpk.blad('SPR/ZAK', zak.nr_dokumentu, 'Nieokreślona wartość netto lub podatku VAT faktury zakupu') + + if zak.dostawca.not_nipue(): + zak.jpk.blad('SPR/ZAK', zak.nr_dokumentu, 'NIP kontrahenta ({}) wygląda na NIPUE ale nie jest tak oznaczony'.format(zak.dostawca.nr_kon.strip())) + + zak.rodzaj= zak.rodzaj.strip() + if zak.rodzaj == 'WNT': + zak.k_23, zak.k_24= zak.netto, zak.vat + elif zak.rodzaj == 'IU' and not zak.dostawca.nipue(): + zak.k_27, zak.k_28= zak.netto, zak.vat + elif zak.rodzaj == 'IU' and zak.dostawca.nipue(): + zak.k_29, zak.k_30= zak.netto, zak.vat + elif zak.rodzaj == 'PN': + if zak.jpk.wariant >= '4': + zak.k_31, zak.k_32= zak.netto, zak.vat + else: + zak.k_32, zak.k_33= zak.netto, zak.vat + elif zak.rodzaj == 'OO': + if zak.jpk.wariant >= '4': + pass + else: + zak.k_34, zak.k_35= zak.netto, zak.vat + else: # pragma: no cover + # Filtr uniemożliwia istnienie takich przypadków + zak.jpk.blad('SPR/ZAK', zak.nr_dokumentu, 'Nieznany rodzaj zakupów') + + return True + + + +class ZakupGIG(ZakupVAT): + """ + Kontrola zakupu VAT. + """ + + def __init__(self, jpk): + super(ZakupGIG, self).__init__(jpk) + + self.elementy= [ + # Faktury zakupu z okresu pliku JPK z bieżącej bazy + ZakupGIGPozycjeZak(self, + Zak.objects.select_related('dostawca').prefetch_related('wiersze').using(jpk.fkdbs('Zakup.Zak')). + filter(d_ksieg__gte= jpk.dataod, + d_ksieg__lte= jpk.datado). + order_by('zak_id')), + + # Faktury zakupu z okresu pliku JPK z poprzedniej bazy (starego roku) ale wykazywane w bieżącym roku + ZakupGIGPozycjeZak(self, + Zak.objects.select_related('dostawca').prefetch_related('wiersze').using(jpk.fkdbs_1('Zakup.Zak_1')). + filter(d_ksieg__gte= jpk.dataod, + d_ksieg__lte= jpk.datado, + msc_roz__lt= jpk.rok_01()). + order_by('zak_id')) + ] + + # Korekty VAT majątku trwałego i pozostałych zakupów liczonych prewspółczynnikiem + # dołączane są tylko dla pierwszej deklaracji czyli JPK od 1 stycznia + + if jpk.dataod.month == 1 and jpk.dataod.day == 1: + + self.elementy.append((ZakupGIGPozycjeMkvLacznie if settings.KOREKTA_VAT_LACZNIE else ZakupGIGPozycjeMkv)(jpk)) + + if self.pre_wsp[0] != self.pop_wsp[0] or self.pre_wsp[1] != self.pop_wsp[1]: + # Jeżeli zmienił się któryś z prewspółczynników + + dataod= datetime.date(jpk.dataod.year-1, 1, 1) + datado= datetime.date(jpk.dataod.year-1, 12, 31) + + logger.info('PRE daty: {} - {}'.format(dataod, datado)) + + self.elementy.append((ZakupGIGPozycjePreLacznie if settings.KOREKTA_VAT_LACZNIE else ZakupGIGPozycjePre)(self, itertools.chain( # union + # Faktury zakupu z okresu pliku JPK z bieżącej bazy + Zak.objects.select_related('dostawca').prefetch_related('wiersze').using(jpk.fkdbs('pre/Zakup.Zak', dataod= dataod)) + .filter(d_ksieg__gte= dataod, + d_ksieg__lte= datado) + .order_by('zak_id'), + + # Faktury zakupu z okresu pliku JPK z poprzedniej bazy (starego roku) + # ale wykazywane w bieżącym roku + Zak.objects.select_related('dostawca').prefetch_related('wiersze').using(jpk.fkdbs_1('pre/Zakup.Zak_1', dataod= dataod)) + .filter(d_ksieg__gte= dataod, + d_ksieg__lte= datado, + msc_roz__lt= jpk.rok_01(dataod= dataod)) + .order_by('zak_id') + ))) + + + +class ZakupGIGPozycjeZak(ZakupVATPozycjeZak): + + def __init__(self, ctrl, *args, **kwargs): + super(ZakupGIGPozycjeZak, self).__init__(*args, **kwargs) + self.ctrl= ctrl + + def uwzglednij(self, zak): + + wsp= self.ctrl.pre_wsp + + # Sprawdzenie poprawności i ustalenie podstawowych danych + super(ZakupGIGPozycjeZak, self).przygotuj(zak) + + pozycje= False + for w in zak.wiersze.all(): + pozycje= True + if w.zrv == 'BEZ': continue + + if w.ip == 'I': + zak.k_43 += procent(w.netto, w.odlicz) + zak.k_44 += procent(w.vat, w.odlicz) + else: + print(zak.zak_id, zak.faktura, w.netto, w.odlicz) + zak.k_45 += procent(w.netto, w.odlicz) + zak.k_46 += procent(w.vat, w.odlicz) + + if not pozycje: + zak.k_43= zak.sop_i_net + procent(zak.soz_i_net, wsp[0]) + procent(zak.kos_i_net, wsp[1]) + zak.k_44= zak.sop_i_vat + procent(zak.soz_i_vat, wsp[0]) + procent(zak.kos_i_vat, wsp[1]) + + zak.k_45= zak.sop_p_net + procent(zak.soz_p_net, wsp[0]) + procent(zak.kos_w_net, wsp[1]) + zak.k_46= zak.sop_p_vat + procent(zak.soz_p_vat, wsp[0]) + procent(zak.kos_w_vat, wsp[1]) + + zak.podatek_naliczony= zak.k_44 + zak.k_46 + + zerowy= True + for k in range(43, 51): + if getattr(zak, 'k_{}'.format(k)) != decimal.Decimal(0.00): + zerowy= False + break + + self.ctrl.vat_rozliczony(zak) + + self.sprawdzenie_nip_zakupow(zak) + + return not zerowy + + + +class ZakupGIGPozycjeMkv(Pozycje): + """ + Korekta podatku naliczonego od nabycia środków trwałych. + """ + + def __init__(self, jpk): + super(ZakupGIGPozycjeMkv, self).__init__( + SrtVat.objects.using(jpk.fkdbs('Zakup.SrtVat')).filter(rok= jpk.dataod.year) + ) + + def uwzglednij(self, vat): + + if vat.korekta_vat == decimal.Decimal(0.0): + return False + + vat.nazwa_kon= vat.mkv.nazwa or '?' + vat.adres_kon= vat.mkv.uwagi or '?' + vat.nr_id= vat.mkv.nr_inw or '?' + vat.nr_faktury= vat.mkv.nr_faktury or '?' + vat.data_wplywu= vat.mkv.data_ot + vat.data_zakupu= vat.data_wplywu + vat.pod_rejestr= "KVM" + + vat.k_47= vat.korekta_vat + + vat.podatek_naliczony= vat.k_47 + + return True + + + +class ZakupGIGPozycjeMkvLacznie(ZakupGIGPozycjeMkv): + """ + Korekta podatku naliczonego od nabycia środków trwałych + łącznie jedną pozycją. + """ + + def __init__(self, jpk): + super(ZakupGIGPozycjeMkvLacznie, self).__init__(jpk) + self.jpk= jpk + + def __iter__(self): + """ + Zsumowanie wszystkich pozycji i zwrócenie pojedynczego rekordu. + """ + vat= SrtVat() + vat.korekta_vat= decimal.Decimal(0.0) + + for poz in super(ZakupGIGPozycjeMkvLacznie, self).__iter__(): + vat.korekta_vat += poz.korekta_vat + + f= self.jpk.par_firmy() + + vat.nazwa_kon= f['nazwa'] + vat.adres_kon= '{} {}, {} {}'.format(f['miejscowosc'], f['kod_pocztowy'], f['ulica'], f['nr_domu']) + vat.nr_id= f['nip'] + vat.nr_faktury= 'KOREKTA ROCZNA' + vat.data_wplywu= self.jpk.dataod + vat.data_zakupu= vat.data_wplywu + vat.pod_rejestr= "KOR-T" + + return [vat].__iter__() + + def uwzglednij(self, vat): + # Pola podatek_naliczony i k_47 zostaną wyzerowane przed wywolaniem uwzglednij + # dlatego odtwarzana jest ich wartość + vat.podatek_naliczony= vat.k_47= vat.korekta_vat + + return vat.k_47 != decimal.Decimal(0.0) + + + +class ZakupGIGPozycjePre(ZakupVATPozycjeZak): + + def __init__(self, ctrl, *args, **kwargs): + super(ZakupGIGPozycjePre, self).__init__(*args, **kwargs) + self.ctrl= ctrl + + def uwzglednij(self, zak): + """ + Ustalanie korekty podatku naliczonego od pozostałych nabyć (K_48). + Chodzi o korektę podatku naliczonego prewspółczynnikiem. + Nie interesuje nas tutaj VAT od zakupów inwestycyjnych (K_47) ponieważ + jest on ustalany na podstawie rejestru korekt VAT od majątku, gdzie + korekta rozkładana jest na wiele lat. + """ + + super(ZakupGIGPozycjePre, self).przygotuj(zak) + + wsp= self.ctrl.pre_wsp + pop= self.ctrl.pop_wsp + + pozycje= False + for w in zak.wiersze.all(): + pozycje= True + if not w.zrv[:2] == 'OZ': continue + # minusujemy poprzednio naliczoną wartość + if w.ip == 'P': + zak.k_48 -= procent(w.vat, w.odlicz) + + # współczynnik ostateczny + odlicz= wsp[1] if w.zrv == 'OZN' else wsp[0] + # zamiast tego wstawiamy ostateczną wartość + if w.ip == 'P': + zak.k_48 += procent(w.vat, odlicz) + + if not pozycje: + zak.k_48 += procent(zak.soz_p_vat, wsp[0]) - procent(zak.soz_p_vat, pop[0]) + \ + procent(zak.kos_w_vat, wsp[1]) - procent(zak.kos_w_vat, pop[1]) + + zak.podatek_naliczony= zak.k_48 + + # Sprawdzenie czy VAT jest w fakturze poprawnie rozliczony + self.ctrl.vat_rozliczony(zak) + + # Jeżeli nie ma korekty to faktura nie jest uwzględniana w JPK + return zak.k_48 != decimal.Decimal(0.00) + + + +class ZakupGIGPozycjePreLacznie(ZakupGIGPozycjePre): + + def __iter__(self): + """ + Zsumowanie wszystkich pozycji i zwrócenie pojedynczego rekordu. + """ + + lacznie= Zak() + + lacznie.korekta_vat= decimal.Decimal(0.0) + lacznie.jpk= self.ctrl.jpk + + for zak in super(ZakupGIGPozycjePreLacznie, self).__iter__(): + zak.jpk= self.ctrl.jpk + self.ctrl.uwzglednij(super(ZakupGIGPozycjePreLacznie, self), zak) + lacznie.korekta_vat += zak.k_48 + + f= self.ctrl.jpk.par_firmy() + + lacznie.nazwa_kon= f['nazwa'] + lacznie.adres_kon= '{} {}, {} {}'.format(f['miejscowosc'], f['kod_pocztowy'], f['ulica'], f['nr_domu']) + lacznie.nr_id= f['nip'] + lacznie.nr_faktury= 'KOREKTA ROCZNA' + lacznie.data_wplywu= self.ctrl.jpk.dataod + lacznie.data_zakupu= lacznie.data_wplywu + lacznie.pod_rejestr= "KOR-P" + + return [lacznie].__iter__() + + def uwzglednij(self, zak): + # Pola podatek_naliczony i k_48 zostaną wyzerowane przed wywolaniem uwzglednij + # dlatego odtwarzana jest ich wartość + zak.podatek_naliczony= zak.k_48= zak.korekta_vat + + return zak.k_48 != decimal.Decimal(0.0) + diff --git a/app/ctrl/vat/ichp.py b/app/ctrl/vat/ichp.py new file mode 100644 index 0000000..000bdfe --- /dev/null +++ b/app/ctrl/vat/ichp.py @@ -0,0 +1,281 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from fk.models import MagDok, Zak +from app.utils import procent + +from .vat import SprzedazVAT, SprzedazVATPozycjeFak, ZakupVAT, ZakupVATPozycjeZak + +import datetime +import decimal +from django.conf import settings + +import logging +logger= logging.getLogger(__name__) + + +class SprzedazICHP(SprzedazVAT): + """ + Kontrola sprzedaży VAT. + """ + + def __init__(self, jpk): + super(SprzedazICHP, self).__init__(jpk) + + baza= jpk.fkdbs('Sprzedaz.MagDok') + self.elementy= [SprzedazIchpPozycjeFak(jpk, baza)] + + if baza != jpk.par_firmy('db_ostatnia'): + self.elementy.append(SprzedazIchpPozycjeFak(jpk, jpk.par_firmy('db_ostatnia'))) + + +class SprzedazIchpPozycjeFak(SprzedazVATPozycjeFak): + + def __init__(self, jpk, baza): + super(SprzedazIchpPozycjeFak, self).__init__( + MagDok.objects.select_related('id_kli').using(baza).filter( + data_pod__gte= jpk.dataod, + data_pod__lte= jpk.datado, + symbol__in= ('FV','RU','EX','EK','FW','FP'), + pid__isnull= True, + stat='D', + dr_fisk__isnull= True).order_by('id') + ) + + def uwzglednij(self, fak): + """ + Źródłem najpierw jest rejestr sprzedaży a później zakupów. + """ + + super(SprzedazIchpPozycjeFak, self).przygotuj(fak) + + fak.pod_rejestr= fak.rodz_te.strip() + + for stawka in fak.podsum.keys(): + netto= fak.podsum[stawka][0] + vat= fak.podsum[stawka][1] + + if netto is None or vat is None: # pragma: no cover + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Nieokreślona wartość netto lub podatku należnego') + + fak.podatek_nalezny += vat + + if fak.nr_dokumentu in ('EU0086/270/16', 'EU0087/270/16', 'EU0091/270/16'): + fak.k_19 += netto + fak.k_20 += vat + elif fak.rodz_tem('ET'): + fak.k_21 += netto + elif fak.rodz_tem('40'): + fak.k_22 += netto + elif fak.rodz_tem('UT'): + fak.k_23 += netto + fak.k_24 += vat + elif fak.rodz_tem('UI'): + fak.k_27 += netto + fak.k_28 += vat + elif fak.rodz_tem('UU'): + fak.k_29 += netto + fak.k_30 += vat + elif (fak.rodz_tem('29') or fak.rodz_tem('30')) and fak.rodzaj and 'O' in fak.rodzaj: + fak.k_31 += netto + elif stawka == 'ZW.': + fak.k_10 += netto + elif stawka == 'NP.' or fak.rodz_tem('EU') or fak.nr_dokumentu == '800019/320/17': + fak.k_11 += netto + if fak.rodz_tem('EU') or fak.nr_dokumentu == '800019/320/17': + fak.k_12 += netto + elif stawka == ' 0%': + fak.k_13 += netto + elif stawka in (' 5%', ' 3%'): + fak.k_15 += netto + fak.k_16 += vat + elif stawka in (' 8%', ' 7%'): + fak.k_17 += netto + fak.k_18 += vat + elif stawka in ('23%', '22%'): + fak.k_19 += netto + fak.k_20 += vat + elif stawka == 'OO.': + fak.k_10 += netto + else: + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Pozycja: rodzaj sprzedaży({})/stawka VAT({}) niezakwalifikowana do żadnego pola deklaracji'.format(fak.rodz_te, stawka)) + + self.sprawdzenie_nip_sprzedazy(fak) + + return True + + + +class ZakupICHP(ZakupVAT): + """ + Kontrola zakupu VAT. + """ + + def __init__(self, jpk): + super(ZakupICHP, self).__init__(jpk) + + self.elementy= [ZakupIchpPozycjeZak(self, + Zak.objects.select_related('dostawca').using(jpk.fkdbs('Zakup.Zak')).filter( + d_ksieg__gte= jpk.dataod, + d_ksieg__lte= jpk.datado) + .order_by('zak_id')), + ] + + # Korekty VAT majątku trwałego i prewspółczynnika dołączane są tylko dla pierwszej deklaracji + # czyli JPK od 1 stycznia + + if jpk.dataod.month == 1 and jpk.dataod.day == 1: + if self.pre_wsp[0] != self.pop_wsp[0] or self.pre_wsp[1] != self.pop_wsp[1]: + # Jeżeli zmienił się któryś z prewspółczynników + + dataod= datetime.date(jpk.dataod.year-1, 1, 1) + datado= datetime.date(jpk.dataod.year-1, 12, 31) + + logger.info('PRE daty: {} - {}'.format(dataod, datado)) + + # Faktury zakupu z okresu pliku JPK z bieżącej bazy + + self.elementy.append((ZakupIchpPozycjePreLacznie if settings.KOREKTA_VAT_LACZNIE else ZakupIchpPozycjePre)(self, + Zak.objects.select_related('dostawca').using(jpk.fkdbs('Zakup.Zak', dataod= dataod)).filter( + d_ksieg__gte= dataod, + d_ksieg__lte= datado) + .order_by('zak_id') + )) + + +class ZakupIchpPozycjeZak(ZakupVATPozycjeZak): + + def __init__(self, ctrl, *args, **kwargs): + super(ZakupIchpPozycjeZak, self).__init__(*args, **kwargs) + self.ctrl= ctrl + + def uwzglednij(self, zak): + + wsp= self.ctrl.pre_wsp + + # Sprawdzenie poprawności i ustalenie podstawowych danych + super(ZakupIchpPozycjeZak, self).przygotuj(zak) + + pozycje= False + for w in zak.wiersze.all(): + pozycje= True + if w.zrv == 'BEZ': continue + + if w.ip == 'I': + zak.k_43 += w.netto + zak.k_44 += procent(w.vat, w.odlicz) + else: + zak.k_45 += w.netto + zak.k_46 += procent(w.vat, w.odlicz) + + if not pozycje: + zak.k_43= zak.sop_i_net + zak.soz_i_net + zak.k_44= zak.sop_i_vat + procent(zak.soz_i_vat, wsp[0]) + + zak.k_45= zak.sop_p_net + zak.soz_p_net + zak.k_46= zak.sop_p_vat + procent(zak.soz_p_vat, wsp[0]) + + zak.podatek_naliczony= zak.k_44 + zak.k_46 + + zerowy= True + for k in range(43, 51): + if getattr(zak, 'k_{}'.format(k)) != decimal.Decimal(0.00): + zerowy= False + break + + self.ctrl.vat_rozliczony(zak) + + self.sprawdzenie_nip_zakupow(zak) + + return not zerowy + + + +class ZakupIchpPozycjePre(ZakupVATPozycjeZak): + + def __init__(self, ctrl, *args, **kwargs): + super(ZakupIchpPozycjePre, self).__init__(*args, **kwargs) + self.ctrl= ctrl + + def uwzglednij(self, zak): + """ + Ustalanie korekty podatku naliczonego od pozostałych nabyć (K_48). + Chodzi o korektę podatku naliczonego prewspółczynnikiem. + Nie interesuje nas tutaj VAT od zakupów inwestycyjnych (K_47) ponieważ + jest on ustalany na podstawie rejestru korekt VAT od majątku, gdzie + korekta rozkładana jest na wiele lat. + """ + + super(ZakupIchpPozycjePre, self).przygotuj(zak) + + wsp= self.ctrl.pre_wsp + pop= self.ctrl.pop_wsp + + pozycje= False + for w in zak.wiersze.all(): + pozycje= True + if not w.zrv[:2] == 'OZ': continue + + if w.ip == 'P': + zak.k_48 -= procent(w.vat, w.odlicz) + + odlicz= wsp[1] if w.zrv == 'OZN' else wsp[0] + + if w.ip == 'P': + zak.k_48 += procent(w.vat, odlicz) + + if not pozycje: + zak.k_47 += procent(zak.soz_i_vat, decimal.Decimal(100.0)) - procent(zak.soz_i_vat, pop[0]) + zak.k_48 += procent(zak.soz_p_vat, decimal.Decimal(100.0)) - procent(zak.soz_p_vat, pop[0]) + + zak.podatek_naliczony= zak.k_47 + zak.k_48 + + # Sprawdzenie czy VAT jest w fakturze poprawnie rozliczony + self.ctrl.vat_rozliczony(zak) + + # Jeżeli nie ma korekty to faktura nie jest uwzględniana w JPK + return zak.k_47 != decimal.Decimal(0.00) or zak.k_48 != decimal.Decimal(0.00) + + +class ZakupIchpPozycjePreLacznie(ZakupIchpPozycjePre): + + def __iter__(self): + """ + Zsumowanie wszystkich pozycji i zwrócenie pojedynczego rekordu. + """ + + lacznie= Zak() + + lacznie.korekta_47= decimal.Decimal(0.0) + lacznie.korekta_48= decimal.Decimal(0.0) + lacznie.jpk= self.ctrl.jpk + + for zak in super(ZakupIchpPozycjePreLacznie, self).__iter__(): + zak.jpk= self.ctrl.jpk + self.ctrl.uwzglednij(super(ZakupIchpPozycjePreLacznie, self), zak) + lacznie.korekta_47 += zak.k_47 + lacznie.korekta_48 += zak.k_48 + + f= self.ctrl.jpk.par_firmy() + + lacznie.nazwa_kon= f['nazwa'] + lacznie.adres_kon= '{} {}, {} {}'.format(f['miejscowosc'], f['kod_pocztowy'], f['ulica'], f['nr_domu']) + lacznie.nr_id= f['nip'] + lacznie.nr_faktury= 'KOREKTA ROCZNA' + lacznie.data_wplywu= self.ctrl.jpk.dataod + lacznie.data_zakupu= lacznie.data_wplywu + lacznie.pod_rejestr= "KOR-P" + + return [lacznie].__iter__() + + def uwzglednij(self, zak): + # Pola podatek_naliczony i k_48 zostaną wyzerowane przed wywolaniem uwzglednij + # dlatego odtwarzana jest ich wartość + zak.k_47= zak.korekta_47 + zak.k_48= zak.korekta_48 + + zak.podatek_naliczony= zak.k_47 + zak.k_48 + + return zak.k_47 != decimal.Decimal(0.0) or zak.k_48 != decimal.Decimal(0.0) + \ No newline at end of file diff --git a/app/ctrl/vat/vat.py b/app/ctrl/vat/vat.py new file mode 100644 index 0000000..a79dbba --- /dev/null +++ b/app/ctrl/vat/vat.py @@ -0,0 +1,382 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import datetime +import decimal +import re + +from app import ctrl, utils + +from app.models import Deklaracja, DeklaracjaPoz +from fk.models import DefZrv, SysPar +from vat.models import KonVat + +from vat.views import kon_nip_status, msg_statusu_nip + +from .. import Pozycje + + +class SprzedazVAT(ctrl.CtrlTabeli): + """ + Ewidencja sprzedaży VAT. + """ + + def __init__(self, *args, **kwargs): + super(SprzedazVAT, self).__init__(*args, **kwargs) + self.tabela= 'sprzedaz' + + def sumuj(self, pozycje, element): + super(SprzedazVAT, self).sumuj(pozycje, element) + self.suma1 += element.podatek_nalezny + + def uwzglednij(self, pozycje, fak): + """ + Źródłem najpierw jest rejestr sprzedaży a później zakupów. + """ + super(SprzedazVAT, self).uwzglednij(pozycje, fak) + + fak.podatek_nalezny= decimal.Decimal(0.00) + + for k in range(10, 40): + setattr(fak, 'k_{}'.format(k), decimal.Decimal(0.0)) + + uwz= pozycje.uwzglednij(fak) + if uwz and self.jpk.wariant_dek: + self.do_deklaracji(fak, 10, 39) + + return uwz + + +class SprzedazVATPozycjeFak(Pozycje): + + def przygotuj(self, fak): + """ + Przygotowanie informacji pochodnych, kontrola poprawności oraz + utworzenie podsumowania faktury stawkami VAT. + + Sposób postępowania wspólny dla wszystkich firm. + """ + + # Ustalenie i kontrola numeru dokumentu / faktury sprzedaży + + fak.nr_dokumentu= fak.nr_fak() + if not fak.nr_dokumentu: # pragma: no cover + fak.jpk.blad('SPR', fak.id, 'Nieokreślony numer dokumentu/faktury') + + # Ustalenie i kontrola daty wystawienia dokumentu / faktury sprzedaży + + fak.data_wystawienia= fak.data + if not fak.data_wystawienia: # pragma: no cover + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Nieokreślona data wystawienia faktury sprzedaży') + + fak.data_sprzedazy= fak.data_sp if fak.data_sp and fak.data_sp != fak.data else None + + # Utworzenie podsumowania faktury wg stawek VAT + # tak samo jak na wydruku faktury + + fak.podsum= {} + for w in fak.wiersze.all(): + w.wartosc_wiersza(fak) + + if w.p_netto is None or w.p_vat is None or w.p_brutto is None: # pragma: no cover + fak.jpk.blad('SPR', fak.nr_dokumentu, 'Nieokreślona wartość w pozycji faktury netto/vat/brutto {}/{}/{}'.format(w.p_netto, w.p_vat, w.p_brutto)) + + st= fak.podsum.get(w.vat) + if not st: + fak.podsum[w.vat]= [w.p_netto, w.p_vat, w.p_brutto] + else: + st[0] += w.p_netto or decimal.Decimal(0) + st[1] += w.p_vat or decimal.Decimal(0) + st[2] += w.p_brutto or decimal.Decimal(0) + + + def sprawdzenie_nip_sprzedazy(self, fak): + """ + Sprawdzenie czy odbiorca/nabywca sprzedaży ma poprawny NIP. + """ + + # Kontrahent zagraniczny - nie sprawdzamy + if fak.id_kli and fak.id_kli.idtyp == 'IDENT': + return + + nip= fak.nip_kon() + nip= nip.replace('-', '') + + # Brak nip nie ma co sprawdzać + if not nip or len(nip) == 0: + return + + # NIP europejski - nie sprawdzamy + if not nip or re.match('[A-Z][A-Z].*', nip): + return + + # Ustalenie aktualnego statusu NIP z bazy lub webserwisu + status= '?' + kon_vat= KonVat.objects.filter(nip= nip, aktualny='T') + if kon_vat: + kon_vat= kon_vat[0] + old = int(SysPar.get_wartosc('KON-NIP-SPRAWDZ-WIELE', fak.jpk)) + if kon_vat.ostatnio.date() >= datetime.date.today() - datetime.timedelta(days= old): + status= kon_vat.vat + + if status == '?': + try: + status= kon_nip_status(nip) + except Exception as e: + print('Błąd w sprawdzanie_platnika_vat {}'.format(e)) + status= '?' + + msg, level= None, 'warn' + + if status in ('N', 'I'): + msg, level= msg_statusu_nip(status) + + if msg: + msg= msg.format(nip) + fak.jpk.blad('FAK', fak.nr_dokumentu, msg, level= level) + + return + + +class ZakupVAT(ctrl.CtrlTabeli): + """ + Kontrola zakupu VAT. + """ + + def __init__(self, jpk): + super(ZakupVAT, self).__init__(jpk) + self.tabela= 'zakup' + + if SysPar._bra(): return + + self.pre_wsp= DefZrv.pre_wsp(jpk.fkdbs('Zakup.pre_wsp {}'.format(jpk.dataod.year)), jpk.dataod.year) + if self.pre_wsp[0] is None: + jpk.blad('ZAK', 'WSP', 'Nie znaleziono prewspółczynnika dla {} w bazie {}'.format(jpk.dataod.year, jpk.fkdbs("pre_wsp"))) + self.pre_wsp= [100.00, 100.00] + + if jpk.dataod.month == 1 and jpk.dataod.day == 1: + self.pop_wsp= DefZrv.pre_wsp(jpk.fkdbs('Zakup.pre_wsp {}'.format(jpk.dataod.year-1)), jpk.dataod.year-1) + if self.pop_wsp[0] is None: + jpk.blad('ZAK', 'PRE', 'Nie znaleziono prewspółczynnika dla {} w bazie {}'.format(jpk.dataod.year-1, jpk.fkdbs('pop_wsp'))) + self.pop_wsp= [100.00, 100.00] + + + def sumuj(self, pozycje, element): + self.suma1 += element.podatek_naliczony + + + def uwzglednij(self, pozycje, element): + + element.podatek_naliczony= decimal.Decimal(0.00) + + for k in range(43, 51): + setattr(element, 'k_{}'.format(k), decimal.Decimal(0.00)) + + uwz= pozycje.uwzglednij(element) + if uwz and self.jpk.wariant_dek: + self.do_deklaracji(element, 43, 48, -3) + + return uwz + + + def vat_rozliczony(self, zak): + + zero= decimal.Decimal(0) + if (zak.sop_i_net != zero or zak.sop_i_vat != zero or + zak.sop_p_net != zero or zak.sop_p_vat != zero or + zak.kos_i_net != zero or zak.kos_i_vat != zero or + zak.kos_w_net != zero or zak.kos_w_vat != zero or + zak.soz_i_net != zero or zak.soz_i_vat != zero or + zak.soz_p_net != zero or zak.soz_p_vat != zero or + zak.bez_i_net != zero or zak.bez_i_vat != zero or + zak.bez_p_net != zero or zak.bez_p_vat != zero): + pass # pragma: no cover + else: + if zak.netto != zero or zak.vat != zero: + zak.jpk.blad('ZAK', zak.faktura, 'W tej fakturze VAT nie jest rozliczony') + return + + netto= (zak.sop_i_net + zak.sop_p_net + + zak.soz_i_net + zak.soz_p_net + + zak.kos_i_net + zak.kos_w_net + + zak.bez_i_net + zak.bez_p_net) + + if SysPar.get_wartosc('ZAK-BEZ-BRUTTO', zak.jpk.fkdbs('ZAK-BEZ-BRUTTO')) == 'tak': # pragma: no cover + # Na razie nie ma takiego przypadku + netto= netto - zak.bez_i_vat - zak.bez_p_vat + + vat= (zak.sop_i_vat + zak.sop_p_vat + + zak.soz_i_vat + zak.soz_p_vat + + zak.kos_i_vat + zak.kos_w_vat + + zak.bez_i_vat + zak.bez_p_vat) + + if netto != zak.netto: + zak.jpk.blad('ZAK', zak.faktura, 'Netto z ekranu rozliczenia jest różne od netto faktury') + + if vat != zak.vat: + zak.jpk.blad('ZAK', zak.faktura, 'VAT z ekranu rozliczenia jest różny od VAT faktury') + + if netto + vat != zak.brutto: + zak.jpk.blad('ZAK', zak.faktura, 'Brutto z ekranu rozliczenia jest różny od wartości faktury') + + + if zak.k_44 != zero or zak.k_46 != zero: + pass + + + +class ZakupVATPozycjeZak(Pozycje): + + def przygotuj(self, zak): + + if (SysPar._bra() and zak.msc_roz >= utils.data_na_miesiac(zak.jpk.dataod)) or \ + zak.d_ksieg >= zak.jpk.dataod: + + if zak.nazwa_kon() is None or len(zak.nazwa_kon().strip()) == 0: + zak.jpk.blad('ZAK', zak.faktura, 'Nieokreślona nazwa dostawcy') + if zak.adres_kon() is None or len(zak.adres_kon().strip()) == 0: + zak.jpk.blad('ZAK', zak.faktura, 'Brak adresu dostawcy') + if (zak.nr_id() is None or len(zak.nr_id().strip()) == 0) and not zak.dostawca.idtyp == 'IDENT': + zak.jpk.blad('ZAK', zak.faktura, 'Brak NIP dostawcy') + if zak.nr_id() and re.match(r'[A-Z][A-Z]', zak.nr_id()) and zak.dostawca.idtyp and not zak.dostawca.idtyp.strip() in ('NIPUE', 'IDENT'): + zak.jpk.blad('ZAK', zak.faktura, 'NIP kontrahenta wygląda na NIPUE ale nie jest tak oznaczony') + if not zak.faktura: + zak.jpk.blad('ZAK', '{}/{}'.format(zak.rodzaj, zak.lp), 'Brak numeru faktury') + + zak.nr_id= zak.nr_id() + zak.nr_faktury= zak.faktura + zak.data_wplywu= zak.d_otrzym + zak.data_zakupu= zak.d_wyst + zak.pod_rejestr= zak.rodzaj + zak.typ_dokumentu= None + + + def sprawdzenie_nip_zakupow(self, zak): + """ + Sprawdzenie czy dostawca (kontrahent w fakturze zakupu) jest + czynnym płatnikiem VAT. + """ + + # Nie ma podanego NIP? + if not zak.nip: + return + + # Kontrahent zagraniczny - nie sprawdzamy + if zak.dostawca and zak.dostawca.idtyp == 'IDENT': + return + + nip= zak.nip.strip() + nip= nip.replace('-', '') + + # Brak nip nie ma co sprawdzać + if not nip or len(nip) == 0: + return + + # NIP europejski - nie sprawdzamy + if not nip or re.match('[A-Z][A-Z].*', nip): + return + + # Ustalenie aktualnego statusu NIP z bazy lub webserwisu + status= '?' + kon_vat= KonVat.objects.filter(nip= nip, aktualny='T') + if kon_vat: + kon_vat= kon_vat[0] + old = int(SysPar.get_wartosc('KON-NIP-SPRAWDZ-WIELE', zak.jpk)) + if kon_vat.ostatnio.date() >= datetime.date.today() - datetime.timedelta(days= old): + status= kon_vat.vat + + if status == '?': + try: + status= kon_nip_status(nip) + except Exception as e: + print('Błąd w sprawdzanie_platnika_vat {}'.format(e)) + status= '?' + + msg, level= None, 'warn' + + ZERO= decimal.Decimal(0) + if zak.k_44 == ZERO and zak.k_46 == ZERO: + # Jeżeli nie ma odliczenia to sprawdzamy czy NIP jest poprawny + if status in ('N', 'I'): + msg, level= msg_statusu_nip(status) + else: + # Jeżeli jest odliczenie to musi być czynny + if status not in ('C',): + msg, level= msg_statusu_nip(status) + + if msg: + msg= msg.format(nip) + zak.jpk.blad('ZAK', zak.faktura, msg, level= level) + + return + + + +class DeklaracjaVAT(ctrl.CtrlTabeli): + """ + Deklaracja VAT. + """ + + def __init__(self, jpk): + super(DeklaracjaVAT, self).__init__(jpk) + self.tabela= 'deklaracja' + + self.elementy= [ + DeklaracjaVATPozycje(jpk), + ] + + def sumuj(self, pozycje, dek): + """ + Sumy kontrolne zawierają sumy podatku należnego i naliczonego. + """ + super(DeklaracjaVAT, self).sumuj(pozycje, dek) + + # Pierwsza suma zawiera podatek należny + if dek.grupa == 'C' and dek.rodzaj == '2': + self.suma1 += dek.kwota + # Druga suma zawiera podatek naliczony + if dek.grupa == 'D' and dek.rodzaj == '2': + self.suma2 += dek.kwota + + def uwzglednij(self, pozycje, dek): + """ + Wszystkie pozycje deklaracji są opcjonalne. + """ + super(DeklaracjaVAT, self).uwzglednij(pozycje, dek) + + return pozycje.uwzglednij(dek) + + + +class DeklaracjaVATPozycje(Pozycje): + """ + Ten pozycje są wykorzystywane podczas generowania pliku XML. + Dokładniej części deklaracyjnej. + W tym momencie one są już wypełnione (zapisane do bazy). + Procedura jest taka: + + 1. Generujemy plik JPK_VAT (na podstawie rej. sprzedaży i zakupów) + 2. Tworzone są wtedy pozycje deklaracji, które są sumami z ewidencji + 3. Mamy teraz bazową/podstawową postać deklaracji. + 4. Edytujemy pozostałe pola deklaracji, pola edytowalne + 5. Po zapisaniu części edytowalnej musimy zmodyfikować XML + (usunąć starą deklarację i wpisać na jej miejsce nową), + tworząc nowy XML. + """ + def __init__(self, jpk): + super(DeklaracjaVATPozycje, self).__init__( + Deklaracja.objects.filter(jpk= jpk).order_by('numer') + ) + + + def uwzglednij(self, dek): + """ + Uwzględnienie pozycji deklaracji. + """ + + if not dek.element: + dek.element= "P_{}".format(dek.numer) + + return True + diff --git a/app/ctrl/wb.py b/app/ctrl/wb.py new file mode 100644 index 0000000..9cc306c --- /dev/null +++ b/app/ctrl/wb.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from app.models import Wyciag +from app import ctrl + + +class Salda(ctrl.CtrlTabeli): + """ + Salda wyciągu bankowego. + """ + + def __init__(self, jpk): + super(Salda, self).__init__(jpk) + self.elementy= [ + Wyciag.objects.filter(data__gte= jpk.dataod, + data__lte= jpk.datado, + nr_rachunku= jpk.rachunek + ).order_by('nr_wyciagu', 'data', 'id'), + ] + self.tabela= 'salda' + + def sumuj(self, i, element): + if element.lp == 1: + self.suma1= element.saldo - element.kwota # Saldo początkowe + self.suma2= self.suma1 # Saldo końcowe + + self.suma2 += element.kwota # Saldo końcowe + + def uwzglednij(self, i, wyc): + """ + Faktury sprzedaży + """ + return True + + +class WyciagWiersz(ctrl.CtrlTabeli): + """ + Kontrola sprzedaży VAT. + """ + + def __init__(self, jpk): + super(WyciagWiersz, self).__init__(jpk) + self.elementy= [ + Wyciag.objects.filter(data__gte= jpk.dataod, + data__lte= jpk.datado, + nr_rachunku= jpk.rachunek + ).order_by('nr_wyciagu', 'data', 'id'), + ] + self.tabela= 'wyciag' + + def sumuj(self, i, element): + if element.kwota < 0: + self.suma1 -= element.kwota # Suma obciążeń + else: + self.suma2 += element.kwota # Suma uznań + + def uwzglednij(self, i, wyc): + """ + Faktury sprzedaży + """ + if not wyc.data: + wyc.jpk.blad('Wyciag', wyc.lp, 'Brak daty pozycji wyciągu') + if not wyc.podmiot or len(wyc.podmiot.strip())==0: + wyc.jpk.blad('Wyciag', wyc.lp, 'Brak nazwy podmiotu') + if not wyc.opis or len(wyc.opis.strip())==0: + wyc.jpk.blad('Wyciag', wyc.lp, 'Brak opisu pozycji wyciągu') + if not wyc.kwota: + wyc.jpk.blad('Wyciag', wyc.lp, 'Brak kwoty operacji wyciągu') + + return True diff --git a/app/deklaracja.py b/app/deklaracja.py new file mode 100644 index 0000000..9575901 --- /dev/null +++ b/app/deklaracja.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import, unicode_literals + +import os +import re + +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont +from PyPDF2 import PdfFileWriter, PdfFileReader +from reportlab.pdfgen import canvas +from reportlab.lib.pagesizes import A4 +from io import StringIO, BytesIO + +import lxml.etree as ET + +from django.conf import settings + +from app.models import Deklaracja, DeklaracjaPoz + +import logging +logger= logging.getLogger(__name__) + + + +class DeklaracjaVAT(object): + """ + Obsługa deklaracji VAT. + """ + + def __init__(self, jpk): + self.jpk= jpk + + + def wizualizacja_pdf(self): + """ + Dodanie do podanego obrazu e-faktury "pieczątki" oznaczającej e-Fakturę. + Stosowane dla faktur sprzedaży wybranych kontrahentów. + """ + pdfmetrics.registerFont(TTFont('Arial', '/home/wlodek/projects/django/jpk/app/static/font/Arial.ttf')) + + # Wczytanie szablonu deklaracji + + szablon_path= os.path.normpath(os.path.join(settings.STATIC_ROOT, 'files/vat-7-{}.pdf'.format(self.jpk.wariant_dek))) + szablon= open(szablon_path, 'rb').read() + szablon= PdfFileReader(BytesIO(szablon)) + + # Utworzenie nowego pliku pdf z połączenia szablonu (tło) i zawartości deklaracji + + nowy= PdfFileWriter() + + # Ustalenie wartości pozycji deklaracji z pliku XML + # tak aby nie były czytane z bazy, + # bo to XML jest wysyłany więc on musi być wizualizowany + + self.pozycje_z_xml() + + # Dodanie do każdej strony szablonu wizualizacji zawartości deklaracji + + for i in range (0, szablon.getNumPages() ): + page= szablon.getPage(i) + tresc= self.strona_deklaracji_pdf(i+1) + page.mergePage(tresc.getPage(0)) + nowy.addPage(page) + + + # Zapisanie nowego pdf do pliku (tymczasowe) + + output= BytesIO() + nowy.write(output) + return output.getvalue() + + + def strona_deklaracji_pdf(self, strona): + + packet= BytesIO() + can= canvas.Canvas(packet, pagesize= A4) + can.setFontSize(10) + + # Utworzenie nowego PDF + + can.setFont('Arial', 10) + self.set_char_spacing(can, 1) + + # Pozycje z deklaracji + + self.pozycje_ze_strony(strona, can) + + if strona == 1: + self.naglowek_deklaracji(can) + if strona == 3: + self.dane_kontaktowe(can) + + can.showPage() + can.save() + + # move to the beginning of the StringIO buffer + packet.seek(0) + strona= PdfFileReader(packet) + + return strona + + + def naglowek_deklaracji(self, can): + + # Nagłówek deklaracji + + self.set_char_spacing(can, 10) + can.setFontSize(11) + + # NIP, miesiąc, rok + + # Te stałe stąd wywalić do bazy + + can.drawString(93, 785, self.jpk.firma.nip) + can.drawString(254, 691, self.jpk.od_msc2()) + can.drawString(330, 691, self.jpk.od_rok()) + + # Cel złożenia + + if self.jpk.cel_zlozenia == '1': + can.drawString(368, 598, 'x') # złożenie deklaracji + else: + can.drawString(479, 598, 'x') # korekta deklaracji + + # Rodzaj podmiotu + + can.drawString(135, 552, 'x') # osoba niefizyczna + + self.set_char_spacing(can, 1) + + # Nazwa firmy + + can.setFont('Arial', 11) + can.drawString(62, 510, self.jpk.firma.nazwa) + + + def dane_kontaktowe(self, can): + + # Dane kontaktowe podatnika + + can.setFontSize(11) + + can.drawString(70, 596, self.jpk.firma.telefon) + + can.drawString(390, 610, self.jpk.firma.email) + + self.set_char_spacing(can, 10) + can.drawString(255, 596, self.jpk.utworzony.strftime('%d%m%Y')) + + + def pozycje_ze_strony(self, strona, can): + """ + Wizualizacja wszystkich elementów z podanej strony. + Uwzględniane są tylko te elementy, które występują w pliku XML + i z niego powinny być pobrane a nie z bazy danych. + """ + + for poz in DeklaracjaPoz.objects.filter(wariant= self.jpk.wariant_dek, strona=strona): +# dek= Deklaracja.ustal(self.jpk, poz.numer) + + wartosc= self.wartosci[poz.numer] + + # Kwota + if poz.rodzaj in ('1', '2') and poz.x and poz.y and wartosc: + can.drawRightString(poz.x, poz.y, "{:-11,.0f}".format(float(wartosc)).replace(',','.')) + + # Wybór + if poz.rodzaj == 'W' and poz.x and poz.y and wartosc: + can.drawString(poz.x, poz.y, 'x') + + # Pole tekstowe (sztuk 2) + if poz.rodzaj == 'T' and poz.x and poz.y and wartosc: + can.drawString(poz.x, poz.y, wartosc) + + + def pozycje_z_xml(self): + """ + Ustalenie wartości pozycji deklaracji z pliku XML. + """ + + # Parsowanie w celu pobrania danych + dom= ET.parse(StringIO(re.sub(' encoding="UTF-8"', '', self.jpk.xml))) + + self.wartosci= [None]*100 + + deklaracja= None + prefix_map = {"pf": "http://crd.gov.pl/wzor/2020/03/06/9196/"} + for element in dom.iter(".//{http://crd.gov.pl/wzor/2020/03/06/9196/}PozycjeSzczegolowe"): + deklaracja= element + break + + for elem in deklaracja: + tag= elem.tag + if hasattr(tag, 'find'): + i = tag.find('}') + if i >= 0: + tag = tag[i+1:] + + print(tag, elem.text) + + if re.match(r'P_\d+', tag): + numer= int(tag[2:]) + else: + numer= 70 + + self.wartosci[numer]= elem.text + + + def set_char_spacing(self, can, spacing): + textobject = can.beginText() + textobject.setTextOrigin(0, 0) + textobject.setCharSpace(spacing) + textobject.textLine("") + can.drawText(textobject) diff --git a/app/forms.py b/app/forms.py new file mode 100644 index 0000000..08d8106 --- /dev/null +++ b/app/forms.py @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import decimal + +from django import forms +from app.models import Plik, Wyciag, Firma, Deklaracja +from sf.models import Sprawozdanie +from fk.models import MagDzial, SysKli + + +class PlikForm(forms.ModelForm): + + jpk_kr= forms.BooleanField(required= False) + jpk_wb= forms.BooleanField(required= False) + jpk_vat= forms.BooleanField(required= False) + jpk_v7m= forms.BooleanField(required= False) + jpk_fa= forms.BooleanField(required= False) + jpk_mag= forms.BooleanField(required= False) + jpk_sf= forms.BooleanField(required= False) + + rachunki= forms.MultipleChoiceField(required= False) + magazyny= forms.MultipleChoiceField(required= False) + + wynik= forms.CharField(required= False) + kapital= forms.BooleanField(required= False) + przeplywy= forms.BooleanField(required= False) + przeplywy_metoda= forms.CharField(required= False) + poprzednie= forms.IntegerField(required= False) + + kopia= forms.BooleanField(required= False) + korekta= forms.CharField(required= False) + + class Meta: + model= Plik + fields= ('dataod', 'datado') + + def __init__(self, *args, **kwargs): + super(PlikForm, self).__init__(*args, **kwargs) + + firma= args[1] + + self.fields['rachunki'].choices= [(x,x) for x in Wyciag.rachunki()] + self.fields['magazyny'].choices= [(x,x) for x in MagDzial.magazyny()] + self.fields['poprzednie'].choices= [(x.id, x.nazwa) for x in Sprawozdanie.poprzednie(firma.oznaczenie)] + + +class NazwaForm(forms.ModelForm): + + class Meta: + model= Plik + fields= ('nazwa',) + + +class FirmaForm(forms.ModelForm): + + class Meta: + model= Firma + exclude= ('db_ostatnia', 'db_rok', 'adres', 'ostatni_plik') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.fields['oznaczenie'].help_text= 'Z systemu FK' + self.fields['kod_urzedu'].help_text= 'Kod urzędu skarbowego' + self.fields['nazwa'].help_text= 'Pełna nazwa firmy' + self.fields['email'].help_text= 'Adres e-mail do kontaktów w sprawie JPK' + self.fields['telefon'].help_text= 'Numer telefonu kontaktowego (opcjonalny)' + self.fields['api_url'].help_text= 'Adres URL API importu dokumentów' + self.fields['api_auth'].help_text= 'Klucz autoryzacyjny' + self.fields['vat7'].help_text= 'Okres deklaracji VAT-7' + + def clean_oznaczenie(self): + oznaczenie= self.cleaned_data['oznaczenie'] + + if not self.instance: + try: + SysKli.objects.get(kod= oznaczenie) + except SysKli.DoesNotExist: + raise forms.ValidationError("Nie ma bazy FK o podanym kodzie") + + return oznaczenie + + +class KwotaCField(forms.DecimalField): + + def clean(self, value): + if isinstance(value, str): + value= value.replace(' ', '') + + if value == '': + value= 0 + + try: + return decimal.Decimal(value) + except: + raise forms.ValidationError('Niepoprawna wartość "{}"'.format(value)) + + + +class DeklaracjaForm(forms.ModelForm): + """ + Formularz do wprowadzania danych deklaracji, które nie pochodzę bezpośrednio z ewidencji + są wprowadzane "ręcznie" w momencie tworzenia deklaracji. + """ + + p_39= KwotaCField(label="39.", required= False) + + p_49= KwotaCField(label="49.", required= False) + p_50= KwotaCField(label="50.", required= False) + p_52= KwotaCField(label="52.", required= False) + p_54= KwotaCField(label="54.", required= False) + + p_55= forms.BooleanField(label="55.", required= False) + p_56= forms.BooleanField(label="56.", required= False) + p_57= forms.BooleanField(label="57.", required= False) + p_58= forms.BooleanField(label="58.", required= False) + + p_59= forms.BooleanField(label="59.", required= False) + p_60= KwotaCField(label="60.", required= False) + p_61= forms.CharField(label="61.", required= False) + + p_63= forms.BooleanField(label="63.", required= False) + p_64= forms.BooleanField(label="64.", required= False) + p_65= forms.BooleanField(label="65.", required= False) + p_66= forms.BooleanField(label="66.", required= False) + p_67= forms.BooleanField(label="67.", required= False) + + p_68= KwotaCField(label="68.", required= False) + p_69= KwotaCField(label="69.", required= False) + + p_70= forms.CharField(label="70.", required= False) + + class Meta: + model= Plik + fields= ( + 'p_39', + 'p_49', 'p_50', + 'p_52', 'p_54', + 'p_55', 'p_56', 'p_57', 'p_58', + 'p_59', 'p_60', 'p_61', + 'p_63', 'p_64', 'p_65', 'p_66', 'p_67', + 'p_68', 'p_69', 'p_70' + ) + + def clean(self): + cleaned_data = super().clean() + + p_38= self.dek['p_38'].kwota or 0 + p_48= self.dek['p_48'].kwota or 0 + p_53= self.dek['p_53'].kwota or 0 + + p_49= cleaned_data.get('p_49', 0) or 0 + p_50= cleaned_data.get('p_50', 0) or 0 + p_54= cleaned_data.get('p_54', 0) or 0 + p_60= cleaned_data.get('p_60', 0) or 0 + + if p_49 and p_49 > p_38 - p_48: + self.add_error('p_49', 'Kwota nie może przekraczać {}'.format(p_38-p_48)) + + if p_50 and p_50 > p_38 - p_48 - p_49: + self.add_error('p_50', 'Kwota nie może przekraczać {}'.format(p_38-p_48-p_49)) + + if p_54 > p_53: + self.add_error('p_54', 'Kwota nie może przekraczać {}'.format(p_53)) + + if p_60 > p_53 - p_54: + self.add_error('p_60', 'Kwota nie może przekraczać {}'.format(p_53-p_54)) + + return cleaned_data + + def __init__(self, *args, **kwargs): + super(DeklaracjaForm, self).__init__(*args, **kwargs) + + self.dek= args[1] + self.jpk= kwargs.get('instance') + + self.fields['p_39'].help_text= 'Wysokość nadwyżki podatku naliczonego nad należnym z poprzedniej deklaracji' + self.fields['p_49'].help_text= 'Kwota wydana na zakup kas rejestrujących, do odliczenia w danym okresie rozliczeniowym pomniejszająca wysokość podatku należnego' + self.fields['p_50'].help_text= 'Wysokość podatku objęta zaniechaniem poboru' + self.fields['p_52'].help_text= 'Kwota wydana na zakup kas rejestrujących, do odliczenia w danym okresie rozliczeniowym przysługująca do zwrotu w danym okresie rozliczeniowym lub powiększająca wysokość podatku naliczonego do przeniesienia na następny okres rozliczeniowy' + self.fields['p_54'].help_text= 'Wysokość nadwyżki podatku naliczonego nad należnym do zwrotu na rachunek wskazany przez podatnika' + + self.fields['p_55'].help_text= 'Zwrot na rachunek VAT, o którym mowa w art. 87 ust. 6a ustawy' + self.fields['p_56'].help_text= 'Zwrot w terminie, o którym mowa w art. 87 ust. 6 ustawy' + self.fields['p_57'].help_text= 'Zwrot w terminie, o którym mowa w art. 87 ust. 2 ustawy' + self.fields['p_58'].help_text= 'Zwrot w terminie, o którym mowa w art. 87 ust. 5a zdanie pierwsze ustawy' + + self.fields['p_59'].help_text= 'Zaliczenie zwrotu podatku na poczet przyszłych zobowiązań podatkowych' + self.fields['p_60'].help_text= 'Wysokość zwrotu do zaliczenia na poczet przyszłych zobowiązań podatkowych' + self.fields['p_61'].help_text= 'Rodzaj przyszłego zobowiązania podatkowego' + + self.fields['p_63'].help_text= 'Podatnik wykonywał w okresie rozliczeniowym czynności, o których mowa w
art. 119 ustawy' + self.fields['p_64'].help_text= 'art. 120 ust. 4 lub 5 ustawy' + self.fields['p_65'].help_text= 'art. 122 ustawy' + self.fields['p_66'].help_text= 'art. 136 ustawy' + + self.fields['p_67'].help_text= 'Podatnik korzysta z obniżenia zobowiązania podatkowego,
o którym mowa w art. 108d ustawy' + self.fields['p_68'].help_text= 'Wysokość korekty podstawy opodatkowania, o której mowa w art. 89a ust. 1 ustawy' + self.fields['p_69'].help_text= 'Wysokość korekty podatku należnego, o której mowa w art. 89a ust. 1 ustawy' + self.fields['p_70'].help_text= 'Uzasadnienie przyczyn złożenia korekty' diff --git a/app/management/__init__.py b/app/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/management/commands/__init__.py b/app/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/management/commands/del_jpk.py b/app/management/commands/del_jpk.py new file mode 100644 index 0000000..85ee234 --- /dev/null +++ b/app/management/commands/del_jpk.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from django.core.management.base import BaseCommand, CommandError +from app.models import Plik + +class Command(BaseCommand): + """ + Komenda manage.py do usuwania pliku JPK. + """ + args = '' + help = 'Usuwa podane pliki JPK' + output_transaction= True + + def handle(self, *args, **options): + + force= False + for jpk_id in args: + + if jpk_id == 'force': + force= True + continue + + try: + jpk= Plik.objects.get(pk=int(jpk_id)) + except Plik.DoesNotExist: + raise CommandError('Plik JPK "{}" nie istnieje'.format(jpk_id)) + + if (jpk.upo or jpk.stan == 'DOSTARCZONY') and not force: + raise CommandError('Plik JPK "{}" został dostarczony, nie może być usunięty'.format(jpk_id)) + elif jpk.stan == 'SPRAWDZANY' and not force: + raise CommandError('Plik JPK "{}" jest w trakcie przetwaraznia w MF, nie może być usunięty'.format(jpk_id)) + else: + jpk.delete() + self.stdout.write('Usunięto plik JPK "{}"'.format(jpk_id)) diff --git a/app/mf.py b/app/mf.py new file mode 100644 index 0000000..72ce892 --- /dev/null +++ b/app/mf.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import requests, json + +import logging +logger= logging.getLogger(__name__) + + +class InterfejsMF(object): + """ + Interfejs do wysyłania plików JPK do MF/US. + """ + + URL= 'e-dokumenty.mf.gov.pl/api/Storage' + + + def init_upload(self, initupload_xml): + """ + Wysłanie pliku kontrolnego initupload.xml podpisanego + podpisem kwalifikowanym (inicjalizacja sesji klienta). + + Jeżeli odpowiedź jest poprawna to ustalany jest numer referencyjny + oraz lista plików (blobów) do wysłania. + + S1. Numer referencyjny i lista plików są podawane tylko przy odpowiedzi 200. + + Przy odpowiedzi 400, 500 json ma inną zawartość. + """ + + url= self.url_interfejsu('/InitUploadSigned?enableValidateQualifiedSignature=false') + + logger.info('mf.init_upload(POST): {} {}'.format(url, len(initupload_xml))) + resp= requests.post(url, + data= initupload_xml, + headers= {'Content-Type': 'application/xml'}, + verify= False) + + resj= json.loads(resp.text) + + # Jeżeli odpowiedź != 200 to wartości będą puste + self.reference= resj.get('ReferenceNumber') + self.file_list= resj.get('RequestToUploadFileList') + + return resp + + + def upload(self, jpk_aes): + """ + Wysłaniepliku JPK.xml. + Zakładamy, że wysyłany jest plik jednoczęściowy! + """ + self.blobs= [] + for upload_req in self.file_list: + headers= {header.get('Key'): header.get('Value') for header in upload_req.get('HeaderList')} + self.blobs.append(upload_req.get('BlobName')) + url= upload_req.get('Url') + + logger.info('mf.upload(PUT): {} {}'.format(url, len(jpk_aes))) + resp= requests.put(url, + data= jpk_aes, + headers= headers, + verify= False) + + return resp + + + def finish_upload(self): + """ + Zakończenie (sesji) wysyłki pliku JPK do MF. + """ + finish_data= {'ReferenceNumber': self.reference, 'AzureBlobNameList': self.blobs} + url= self.url_interfejsu('/FinishUpload') + data= json.dumps(finish_data) + + logger.info('mf.finish_upload(POST): {} {}'.format(url, len(data))) + return requests.post(url, + data= data, + headers= {'Content-Type': 'application/json'}, + verify= False) + + + def status(self, reference): + """ + Sprawdzenie statusu. + """ + url= self.url_interfejsu('/Status/'+reference) + + logger.info('mf.status(GET): {}'.format(url)) + return requests.get(url, + verify= False) + + + def mf_api_url(self): + return self.URL + + + +class BramkaTestowa(InterfejsMF): + + PLIK_KLUCZA= 'klucz_mf.pem' + + def url_interfejsu(self, api): + url= 'https://test-' + self.mf_api_url() + api + logger.info(url) + return url + + + +class BramkaProdukcyjna(InterfejsMF): + + PLIK_KLUCZA= 'klucz_mf_p.pem' + + def url_interfejsu(self, api): + url= 'https://' + self.mf_api_url() + api + logger.info(url) + return url + + \ No newline at end of file diff --git a/app/middleware.py b/app/middleware.py new file mode 100644 index 0000000..0591f44 --- /dev/null +++ b/app/middleware.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import json +from django.http import HttpResponseBadRequest + +class HttpMethodsMiddleware(object): + + def process_request(self, request): + + if not request.method in ('GET', 'POST'): + + method= request.method + + if hasattr(request, '_post'): + del request._post + del request._files + + try: + request.method = "POST" + request._load_post_and_files() + request.method = method + except AttributeError as e: + request.META['REQUEST_METHOD'] = 'POST' + request._load_post_and_files() + request.META['REQUEST_METHOD'] = method + + setattr(request, method, request.POST) + + # Z axios'a content type jest równy application/json;charset=UTF-8 + # Trzeba by to odpowiednio przetworzyć + content_type= request.META['CONTENT_TYPE'].split(';') + encoding= 'UTF-8' + if len(content_type)>1: + encoding= content_type[1].split('=') + if len(encoding)>1: + encoding= encoding[1] + content_type= content_type[0] + + if request.method != "GET" and content_type == 'application/json': + try: + request.JSON = json.loads(request.body.decode(encoding, errors= 'ignore')) + + except ValueError as ve: + return HttpResponseBadRequest("Unable to parse JSON data. Error : {0}".format(ve)) diff --git a/app/migrations/0001_initial.py b/app/migrations/0001_initial.py new file mode 100644 index 0000000..bb14ca9 --- /dev/null +++ b/app/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-24 21:29 +from __future__ import unicode_literals + +import app.model_fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Paczka', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('data', models.DateField(verbose_name='Data paczki')), + ('cel', models.CharField(max_length=100, verbose_name='Cel kontroli')), + ], + ), + migrations.CreateModel( + name='Plik', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('kod', models.CharField(max_length=10, verbose_name='Kod pliku JPK')), + ('dataod', models.DateField(verbose_name='Data Od')), + ('datado', models.DateField(verbose_name='Data Do')), + ('czesc', models.CharField(max_length=7, verbose_name='Miesi\u0105c cz\u0119\u015bci')), + ('utworzony', models.DateTimeField(verbose_name='Utworzony')), + ('xml', app.model_fields.CompressedTextField(null=True, verbose_name='Tre\u015b\u0107 e-maila')), + ('paczka', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Paczka')), + ], + ), + ] diff --git a/app/migrations/0002_auto_20160424_2137.py b/app/migrations/0002_auto_20160424_2137.py new file mode 100644 index 0000000..1c3aa65 --- /dev/null +++ b/app/migrations/0002_auto_20160424_2137.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-24 21:37 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='paczka', + name='cel', + field=models.CharField(default='Kontrola', max_length=100, verbose_name='Cel kontroli'), + ), + migrations.AlterField( + model_name='paczka', + name='data', + field=models.DateField(default=datetime.date.today, verbose_name='Data paczki'), + ), + migrations.AlterField( + model_name='plik', + name='czesc', + field=models.CharField(blank=True, max_length=7, null=True, verbose_name='Miesiąc części'), + ), + migrations.AlterField( + model_name='plik', + name='kod', + field=models.CharField(choices=[('JPK_KR', 'Księgi rachunkowe'), ('JPK_WB', 'Wyciągi bankowe'), ('JPK_VAT', 'Rozliczenia VAT'), ('JPK_FA', 'Faktury sprzedaży')], max_length=10, verbose_name='Kod pliku JPK'), + ), + migrations.AlterField( + model_name='plik', + name='utworzony', + field=models.DateTimeField(default=datetime.datetime.now, verbose_name='Utworzony'), + ), + ] diff --git a/app/migrations/0003_auto_20160426_1328.py b/app/migrations/0003_auto_20160426_1328.py new file mode 100644 index 0000000..b137a13 --- /dev/null +++ b/app/migrations/0003_auto_20160426_1328.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-26 13:28 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0002_auto_20160424_2137'), + ] + + operations = [ + migrations.CreateModel( + name='Ana', + fields=[ + ('anal_id', models.AutoField(primary_key=True, serialize=False)), + ('numer_a', models.CharField(max_length=20)), + ('nazwa_a', models.CharField(max_length=80)), + ('wn_0', models.DecimalField(decimal_places=2, max_digits=16)), + ('wn_1', models.DecimalField(decimal_places=2, max_digits=16)), + ('ma_0', models.DecimalField(decimal_places=2, max_digits=16)), + ('ma_1', models.DecimalField(decimal_places=2, max_digits=16)), + ], + options={ + 'db_table': 'fk_ana', + 'managed': False, + }, + ), + migrations.AlterModelOptions( + name='plik', + options={'ordering': ['id']}, + ), + migrations.AlterField( + model_name='plik', + name='paczka', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pliki', to='app.Paczka'), + ), + ] diff --git a/app/migrations/0004_syn.py b/app/migrations/0004_syn.py new file mode 100644 index 0000000..9850c20 --- /dev/null +++ b/app/migrations/0004_syn.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 14:17 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0003_auto_20160426_1328'), + ] + + operations = [ + migrations.CreateModel( + name='Syn', + fields=[ + ('synt_id', models.AutoField(primary_key=True, serialize=False)), + ('numer_s', models.CharField(max_length=3)), + ('nazwa_s', models.CharField(max_length=40)), + ('bilans', models.CharField(max_length=1)), + ('spec', models.CharField(max_length=1)), + ], + options={ + 'db_table': 'fk_syn', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0005_ctrl.py b/app/migrations/0005_ctrl.py new file mode 100644 index 0000000..ad66fbf --- /dev/null +++ b/app/migrations/0005_ctrl.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 17:50 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0004_syn'), + ] + + operations = [ + migrations.CreateModel( + name='Ctrl', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tabela', models.CharField(max_length=20, verbose_name=b'Tabela')), + ('wiersze', models.IntegerField(verbose_name=b'Wiersze')), + ('suma1', models.DecimalField(decimal_places=2, max_digits=16)), + ('suma2', models.DecimalField(decimal_places=2, default=0.0, max_digits=16)), + ('plik', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='podsumowania', to='app.Plik')), + ], + ), + ] diff --git a/app/migrations/0006_auto_20160427_1754.py b/app/migrations/0006_auto_20160427_1754.py new file mode 100644 index 0000000..2baf589 --- /dev/null +++ b/app/migrations/0006_auto_20160427_1754.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 17:54 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0005_ctrl'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='ctrl', + unique_together=set([('id', 'tabela')]), + ), + ] diff --git a/app/migrations/0007_auto_20160427_1758.py b/app/migrations/0007_auto_20160427_1758.py new file mode 100644 index 0000000..56257ea --- /dev/null +++ b/app/migrations/0007_auto_20160427_1758.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 17:58 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0006_auto_20160427_1754'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='ctrl', + unique_together=set([('plik', 'tabela')]), + ), + ] diff --git a/app/migrations/0008_auto_20160427_1912.py b/app/migrations/0008_auto_20160427_1912.py new file mode 100644 index 0000000..5988ce6 --- /dev/null +++ b/app/migrations/0008_auto_20160427_1912.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 19:12 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0007_auto_20160427_1758'), + ] + + operations = [ + migrations.AlterField( + model_name='ctrl', + name='suma1', + field=models.DecimalField(decimal_places=2, default=0.0, max_digits=16), + ), + migrations.AlterField( + model_name='ctrl', + name='wiersze', + field=models.IntegerField(default=0, verbose_name=b'Wiersze'), + ), + ] diff --git a/app/migrations/0009_ksi.py b/app/migrations/0009_ksi.py new file mode 100644 index 0000000..d557aa9 --- /dev/null +++ b/app/migrations/0009_ksi.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 21:28 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0008_auto_20160427_1912'), + ] + + operations = [ + migrations.CreateModel( + name='Ksi', + fields=[ + ('ksi_id', models.AutoField(primary_key=True, serialize=False)), + ('nr_dowodu', models.CharField(max_length=10)), + ('miesiac', models.CharField(max_length=7)), + ('d_wyst', models.DateField()), + ('d_ksieg', models.DateField()), + ('d_kto', models.IntegerField()), + ('konto', models.CharField(max_length=20)), + ('strona', models.CharField(max_length=1)), + ('kwota', models.DecimalField(decimal_places=2, max_digits=16)), + ('opis', models.CharField(max_length=30, null=True)), + ('data', models.DateField(null=True)), + ('lp_dzi', models.IntegerField(null=True)), + ], + options={ + 'db_table': 'fk_ksi', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0010_uzy.py b/app/migrations/0010_uzy.py new file mode 100644 index 0000000..0ae17e3 --- /dev/null +++ b/app/migrations/0010_uzy.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 22:22 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0009_ksi'), + ] + + operations = [ + migrations.CreateModel( + name='Uzy', + fields=[ + ('uzy_id', models.AutoField(primary_key=True, serialize=False)), + ('nr_uzy', models.CharField(max_length=10)), + ], + ), + ] diff --git a/app/migrations/0011_ksiopi.py b/app/migrations/0011_ksiopi.py new file mode 100644 index 0000000..dd0556c --- /dev/null +++ b/app/migrations/0011_ksiopi.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-27 22:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0010_uzy'), + ] + + operations = [ + migrations.CreateModel( + name='KsiOpi', + fields=[ + ('ksi_id', models.AutoField(primary_key=True, serialize=False)), + ('zaksieg', models.CharField(max_length=1)), + ('uwagi', models.CharField(max_length=100)), + ], + ), + ] diff --git a/app/migrations/0012_auto_20160428_1833.py b/app/migrations/0012_auto_20160428_1833.py new file mode 100644 index 0000000..c1f6279 --- /dev/null +++ b/app/migrations/0012_auto_20160428_1833.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-28 18:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0011_ksiopi'), + ] + + operations = [ + migrations.AlterModelOptions( + name='ksiopi', + options={'managed': False}, + ), + migrations.AlterModelOptions( + name='uzy', + options={'managed': False}, + ), + migrations.AddField( + model_name='plik', + name='stan', + field=models.CharField(choices=[('CZEKA', 'Oczekuje'), ('TWORZ', 'Tworzenie'), ('GOTOW', 'Gotowy')], default='CZEKA', max_length=10), + ), + ] diff --git a/app/migrations/0013_auto_20160428_2035.py b/app/migrations/0013_auto_20160428_2035.py new file mode 100644 index 0000000..6e6f251 --- /dev/null +++ b/app/migrations/0013_auto_20160428_2035.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-04-28 20:35 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0012_auto_20160428_1833'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='task', + field=models.CharField(max_length=40, null=True), + ), + migrations.AlterModelTable( + name='ksiopi', + table='fk_ksiopi', + ), + migrations.AlterModelTable( + name='uzy', + table='fk_uzy', + ), + ] diff --git a/app/migrations/0014_dow.py b/app/migrations/0014_dow.py new file mode 100644 index 0000000..704ff53 --- /dev/null +++ b/app/migrations/0014_dow.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-05-09 22:49 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0013_auto_20160428_2035'), + ] + + operations = [ + migrations.CreateModel( + name='Dow', + fields=[ + ('dow_id', models.AutoField(db_column=b'dow_id', primary_key=True, serialize=False)), + ('nr_dowodu', models.CharField(max_length=10)), + ('miesiac', models.CharField(max_length=7)), + ('d_wyst', models.DateField()), + ('d_ksieg', models.DateField()), + ('suma', models.DecimalField(decimal_places=2, max_digits=16)), + ('rodzaj', models.CharField(max_length=2)), + ('numer', models.IntegerField()), + ('lpoz', models.SmallIntegerField()), + ('kto', models.IntegerField()), + ('kiedy', models.DateField()), + ('lp_dzi', models.IntegerField(null=True)), + ], + options={ + 'db_table': 'fk_dow', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0015_fapopi_kon_magdok_magwiersz_zak_zlc.py b/app/migrations/0015_fapopi_kon_magdok_magwiersz_zak_zlc.py new file mode 100644 index 0000000..05ff956 --- /dev/null +++ b/app/migrations/0015_fapopi_kon_magdok_magwiersz_zak_zlc.py @@ -0,0 +1,277 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-05-11 14:46 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0014_dow'), + ] + + operations = [ + migrations.CreateModel( + name='FapOpi', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('opis', models.CharField(blank=True, max_length=70)), + ], + options={ + 'ordering': ['id'], + 'db_table': 'fk_fap_opi', + 'managed': False, + }, + ), + migrations.CreateModel( + name='Kon', + fields=[ + ('kon_id', models.AutoField(primary_key=True, serialize=False)), + ('nr_kon', models.CharField(blank=True, max_length=8)), + ('skrot', models.CharField(blank=True, max_length=40, verbose_name='Skr\xf3t')), + ('id', models.CharField(blank=True, max_length=20, verbose_name=b'Nip')), + ('idtyp', models.CharField(blank=True, max_length=5)), + ('nazwa', models.CharField(blank=True, max_length=160)), + ('kod', models.CharField(blank=True, max_length=10)), + ('miejsc', models.CharField(blank=True, max_length=30, verbose_name='Miejscowo\u015b\u0107')), + ('ulica', models.CharField(blank=True, max_length=40)), + ('tel', models.CharField(blank=True, max_length=15)), + ('fax', models.CharField(blank=True, max_length=15)), + ('tlx', models.CharField(blank=True, max_length=20)), + ('konto', models.CharField(blank=True, max_length=40)), + ('bank', models.CharField(blank=True, max_length=40)), + ('rodzaj', models.CharField(blank=True, max_length=1)), + ('kto', models.IntegerField(blank=True, null=True)), + ('kiedy', models.DateField(blank=True, null=True)), + ('kat_kli', models.CharField(blank=True, default=b'P', max_length=1, verbose_name='Status prawny')), + ('ma_wypis', models.CharField(blank=True, max_length=1)), + ('data_us', models.DateField(blank=True, null=True)), + ('podpis', models.CharField(blank=True, max_length=60)), + ('klas_iso', models.CharField(blank=True, default=b'29', max_length=2, verbose_name='Grupa')), + ('kraj', models.CharField(blank=True, default=b'PL', max_length=3)), + ('region', models.CharField(blank=True, max_length=3)), + ('swift', models.CharField(blank=True, max_length=20)), + ('b_adres', models.CharField(blank=True, max_length=40)), + ('e_mail', models.CharField(blank=True, max_length=40)), + ('www', models.CharField(blank=True, max_length=40)), + ('term_zap', models.IntegerField(blank=True, null=True)), + ('id_obcy', models.IntegerField(blank=True, null=True)), + ('przedplata', models.CharField(blank=True, max_length=40)), + ], + options={ + 'db_table': 'fk_kon', + 'managed': False, + }, + ), + migrations.CreateModel( + name='MagDok', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('id_na_podst', models.IntegerField(blank=True, null=True)), + ('stat', models.CharField(blank=True, max_length=1)), + ('korekta', models.CharField(blank=True, max_length=1)), + ('dzial', models.CharField(blank=True, max_length=3)), + ('skad', models.CharField(blank=True, max_length=3)), + ('dokad', models.CharField(blank=True, max_length=3)), + ('symbol', models.CharField(blank=True, max_length=2)), + ('symbol2', models.CharField(blank=True, max_length=2)), + ('numer', models.IntegerField(blank=True, null=True)), + ('numer2', models.IntegerField(blank=True, null=True)), + ('numer_abs', models.IntegerField(blank=True, null=True)), + ('rodz_te', models.CharField(blank=True, max_length=3)), + ('kod_wydz', models.CharField(blank=True, max_length=3)), + ('nr_dok', models.CharField(blank=True, max_length=15)), + ('data', models.DateField(blank=True, null=True)), + ('data2', models.DateField(blank=True, null=True)), + ('data_sp', models.DateField(blank=True, null=True)), + ('nr_dysp', models.IntegerField(blank=True, null=True)), + ('data_dysp', models.DateField(blank=True, null=True)), + ('dzial_dysp', models.CharField(blank=True, max_length=3)), + ('wystawil', models.IntegerField(blank=True, null=True)), + ('zrealizowal', models.IntegerField(blank=True, null=True)), + ('nip', models.CharField(blank=True, max_length=20)), + ('kat_sprz', models.CharField(blank=True, max_length=1)), + ('upust_sp', models.DecimalField(blank=True, decimal_places=0, max_digits=2, null=True)), + ('upust_gt', models.DecimalField(blank=True, decimal_places=0, max_digits=1, null=True)), + ('sp_zapl', models.CharField(blank=True, max_length=1)), + ('term_zapl', models.DateField(blank=True, null=True)), + ('zamow', models.CharField(blank=True, max_length=20)), + ('data_zam', models.DateField(blank=True, null=True)), + ('uwagi', models.CharField(blank=True, max_length=120)), + ('tty', models.CharField(blank=True, max_length=3)), + ('wsk_druk', models.CharField(blank=True, max_length=1)), + ('wart_det', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)), + ('wart_bru', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)), + ('zaplata', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)), + ('nr_kp', models.IntegerField(blank=True, null=True)), + ('data_pod', models.DateField(blank=True, null=True)), + ('nr_dow', models.CharField(blank=True, max_length=15)), + ('nr_dow2', models.CharField(blank=True, max_length=15)), + ('wsk_wyc', models.CharField(blank=True, max_length=1)), + ('podpis', models.CharField(blank=True, max_length=60)), + ('ldzien', models.CharField(blank=True, max_length=10)), + ('rodzaj', models.CharField(blank=True, max_length=10)), + ('nr_fisk', models.IntegerField(blank=True, null=True)), + ('dr_fisk', models.CharField(blank=True, max_length=1)), + ('data_fisk', models.DateTimeField(blank=True, null=True)), + ('wyroznik', models.CharField(blank=True, max_length=2)), + ('data_rej', models.DateTimeField(blank=True, null=True)), + ('zatwierdzil', models.IntegerField(blank=True, null=True)), + ('wycenil', models.IntegerField(blank=True, null=True)), + ('id_kor', models.IntegerField(blank=True, null=True)), + ('id_odb', models.IntegerField(blank=True, null=True)), + ('pid', models.IntegerField(blank=True, null=True)), + ('dni_na_zapl', models.IntegerField(blank=True, null=True)), + ('zaplacone', models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True)), + ('data_zapl', models.DateField(blank=True, null=True)), + ('miesiac', models.CharField(blank=True, max_length=7)), + ('lp_ksi', models.IntegerField(blank=True, null=True)), + ('w_walucie', models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True)), + ('waluta', models.CharField(blank=True, max_length=3)), + ('kurs', models.DecimalField(blank=True, decimal_places=6, max_digits=16, null=True)), + ('zak_id', models.IntegerField(blank=True, null=True)), + ('ciagla', models.CharField(blank=True, max_length=1)), + ], + options={ + 'db_table': 'fk_mag_dok', + 'managed': False, + }, + ), + migrations.CreateModel( + name='MagWiersz', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('id_kart', models.IntegerField(blank=True, null=True)), + ('il_dysp', models.DecimalField(blank=True, decimal_places=3, max_digits=12, null=True)), + ('il_real', models.DecimalField(blank=True, decimal_places=3, max_digits=12, null=True)), + ('cena_real', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)), + ('cena_ewid', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)), + ('upust', models.DecimalField(blank=True, decimal_places=0, max_digits=2, null=True)), + ('vat', models.CharField(blank=True, max_length=3)), + ('zaliczka', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)), + ('znak', models.CharField(blank=True, max_length=1)), + ('wsk_wyc', models.CharField(blank=True, max_length=1)), + ('jm', models.CharField(blank=True, max_length=3)), + ('sww', models.CharField(blank=True, max_length=14)), + ('waga', models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True)), + ('wartosc', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True)), + ('konto', models.CharField(blank=True, max_length=20)), + ('rodzaj', models.CharField(blank=True, max_length=3)), + ], + options={ + 'ordering': ['id'], + 'db_table': 'fk_mag_wiersz', + 'managed': False, + }, + ), + migrations.CreateModel( + name='Zak', + fields=[ + ('zak_id', models.AutoField(primary_key=True, serialize=False)), + ('lp', models.IntegerField(blank=True, null=True)), + ('rodzaj', models.CharField(blank=True, max_length=3, null=True)), + ('faktura', models.CharField(blank=True, max_length=30, null=True)), + ('dostawca', models.CharField(blank=True, max_length=8, null=True)), + ('nip', models.CharField(blank=True, max_length=20, null=True)), + ('d_nazwa', models.CharField(blank=True, max_length=240, null=True)), + ('d_zak', models.DateField(blank=True, null=True)), + ('d_wyst', models.DateField(blank=True, null=True)), + ('d_otrzym', models.DateField(blank=True, null=True)), + ('d_przek', models.DateField(blank=True, null=True)), + ('d_zwrotu', models.DateField(blank=True, null=True)), + ('wydzial', models.CharField(blank=True, max_length=10, null=True)), + ('komu', models.CharField(blank=True, max_length=30, null=True)), + ('termin', models.DateField(blank=True, null=True)), + ('l_dni', models.IntegerField(blank=True, null=True)), + ('d_zapl', models.DateField(blank=True, null=True)), + ('uwagi', models.CharField(blank=True, max_length=80, null=True)), + ('dow_fak', models.CharField(blank=True, max_length=10, null=True)), + ('msc_fak', models.CharField(blank=True, max_length=7, null=True)), + ('lp_fak', models.IntegerField(blank=True, null=True)), + ('dow_roz', models.CharField(blank=True, max_length=10, null=True)), + ('msc_roz', models.CharField(blank=True, max_length=7, null=True)), + ('lp_roz', models.IntegerField(blank=True, null=True)), + ('d_ksieg', models.DateField(blank=True, null=True)), + ('brutto', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('netto', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('zakup', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('clo', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('pimport', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('akcyza', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('manip', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('sop_i_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('sop_i_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('sop_p_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('sop_p_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('kos_w_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('kos_w_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('soz_i_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('soz_i_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('soz_p_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('soz_p_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('bez_i_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('bez_i_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('bez_p_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('bez_p_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('kto_rej', models.IntegerField(blank=True, null=True)), + ('d_rej', models.DateField(blank=True, default=datetime.date.today, null=True)), + ('kto', models.IntegerField(blank=True, null=True)), + ('kiedy', models.DateField(blank=True, default=datetime.date.today, null=True)), + ('pz', models.CharField(blank=True, max_length=20, null=True)), + ('nr_zwe', models.CharField(blank=True, max_length=20, null=True)), + ('mag', models.CharField(blank=True, max_length=5, null=True)), + ('kas_id', models.IntegerField(blank=True, null=True)), + ('w_walucie', models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True)), + ('waluta', models.CharField(blank=True, max_length=3, null=True)), + ('kurs', models.DecimalField(blank=True, decimal_places=6, max_digits=16, null=True)), + ('symbol', models.CharField(blank=True, max_length=3, null=True)), + ('korekta', models.CharField(blank=True, max_length=1, null=True)), + ('d_zbil', models.DateField(blank=True, null=True)), + ('kos_i_net', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ('kos_i_vat', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=16, null=True)), + ], + options={ + 'db_table': 'fk_zak', + 'managed': False, + }, + ), + migrations.CreateModel( + name='Zlc', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('temat', models.CharField(max_length=10, unique=True)), + ('nazwa', models.CharField(blank=True, max_length=40)), + ('nr_ref', models.CharField(blank=True, max_length=6)), + ('nr_wp', models.CharField(blank=True, max_length=6)), + ('nr_ot', models.CharField(blank=True, max_length=8)), + ('d_rozp', models.DateField(blank=True, null=True)), + ('d_zakon', models.DateField(blank=True, null=True)), + ('dalej', models.CharField(blank=True, max_length=1)), + ('tu', models.CharField(blank=True, max_length=1)), + ('sww', models.CharField(blank=True, max_length=14)), + ('cenaj', models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True)), + ('jm', models.CharField(blank=True, max_length=3)), + ('ksprz', models.CharField(blank=True, max_length=20)), + ('kvat', models.CharField(blank=True, max_length=20)), + ('stawka', models.DecimalField(blank=True, decimal_places=2, max_digits=4, null=True)), + ('skrot', models.CharField(blank=True, max_length=30)), + ('upowaz', models.CharField(blank=True, max_length=1)), + ('d_sprzed', models.DateField(blank=True, null=True)), + ('waga', models.DecimalField(blank=True, decimal_places=2, max_digits=16, null=True)), + ('r1', models.CharField(blank=True, max_length=10)), + ('r2', models.CharField(blank=True, max_length=10)), + ('r3', models.CharField(blank=True, max_length=10)), + ('nr_umowy', models.CharField(blank=True, max_length=30)), + ('tytul', models.CharField(blank=True, max_length=240)), + ('uwagi', models.CharField(blank=True, max_length=80)), + ('lider', models.CharField(blank=True, max_length=4)), + ], + options={ + 'db_table': 'fk_zlc', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0016_zakzrv.py b/app/migrations/0016_zakzrv.py new file mode 100644 index 0000000..83c2730 --- /dev/null +++ b/app/migrations/0016_zakzrv.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-05-16 13:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0015_fapopi_kon_magdok_magwiersz_zak_zlc'), + ] + + operations = [ + migrations.CreateModel( + name='ZakZrv', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('konto4', models.CharField(max_length=20)), + ('zaklad', models.CharField(max_length=3)), + ('temat', models.CharField(max_length=10)), + ('netto', models.DecimalField(decimal_places=2, default=0, max_digits=16, null=True)), + ('stawka', models.CharField(max_length=2)), + ('vat', models.DecimalField(decimal_places=2, default=0, max_digits=16, null=True)), + ('ip', models.CharField(max_length=1)), + ('zrv', models.CharField(max_length=3)), + ('odlicz', models.DecimalField(decimal_places=2, default=0, max_digits=6, null=True)), + ], + options={ + 'db_table': 'fk_zak_zrv', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0017_auto_20160516_1717.py b/app/migrations/0017_auto_20160516_1717.py new file mode 100644 index 0000000..c75dae6 --- /dev/null +++ b/app/migrations/0017_auto_20160516_1717.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-05-16 17:17 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0016_zakzrv'), + ] + + operations = [ + migrations.AlterModelTable( + name='ana', + table='ana', + ), + migrations.AlterModelTable( + name='dow', + table='dow', + ), + migrations.AlterModelTable( + name='fapopi', + table='fap_opi', + ), + migrations.AlterModelTable( + name='kon', + table='kon', + ), + migrations.AlterModelTable( + name='ksi', + table='ksi', + ), + migrations.AlterModelTable( + name='ksiopi', + table='ksi_opi', + ), + migrations.AlterModelTable( + name='magdok', + table='mag_dok', + ), + migrations.AlterModelTable( + name='magwiersz', + table='mag_wiersz', + ), + migrations.AlterModelTable( + name='syn', + table='syn', + ), + migrations.AlterModelTable( + name='uzy', + table='sys_uzy', + ), + migrations.AlterModelTable( + name='zak', + table='zak', + ), + migrations.AlterModelTable( + name='zakzrv', + table='zak_zrv', + ), + migrations.AlterModelTable( + name='zlc', + table='zlc', + ), + ] diff --git a/app/migrations/0018_srtmkv_srtvat.py b/app/migrations/0018_srtmkv_srtvat.py new file mode 100644 index 0000000..5616249 --- /dev/null +++ b/app/migrations/0018_srtmkv_srtvat.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-05-17 18:50 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0017_auto_20160516_1717'), + ] + + operations = [ + migrations.CreateModel( + name='SrtMkv', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nr_inw', models.CharField(max_length=20)), + ('nazwa', models.CharField(max_length=160)), + ('nr_faktury', models.CharField(max_length=40)), + ('data_ot', models.DateField()), + ], + options={ + 'db_table': 'srt_mkv', + 'managed': False, + }, + ), + migrations.CreateModel( + name='SrtVat', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rok', models.SmallIntegerField()), + ('proporcja', models.DecimalField(decimal_places=2, max_digits=5)), + ('zmiana_p', models.DecimalField(decimal_places=2, max_digits=5)), + ('vat_do_odlicz', models.DecimalField(decimal_places=2, max_digits=16)), + ('roznica_vat', models.DecimalField(decimal_places=2, max_digits=16)), + ('korekta_vat', models.DecimalField(decimal_places=2, max_digits=16)), + ], + options={ + 'db_table': 'srt_vat', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0019_zlctxt.py b/app/migrations/0019_zlctxt.py new file mode 100644 index 0000000..059bdc3 --- /dev/null +++ b/app/migrations/0019_zlctxt.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-05-17 23:11 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0018_srtmkv_srtvat'), + ] + + operations = [ + migrations.CreateModel( + name='ZlcTxt', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('linia', models.CharField(max_length=80)), + ], + options={ + 'db_table': 'zlc_txt', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0020_plik_odkad.py b/app/migrations/0020_plik_odkad.py new file mode 100644 index 0000000..0ab1da9 --- /dev/null +++ b/app/migrations/0020_plik_odkad.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-05-20 21:52 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0019_zlctxt'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='odkad', + field=models.DateTimeField(default=datetime.datetime.now, verbose_name=b'Odkad'), + ), + ] diff --git a/app/migrations/0021_auto_20160601_1837.py b/app/migrations/0021_auto_20160601_1837.py new file mode 100644 index 0000000..dfda61d --- /dev/null +++ b/app/migrations/0021_auto_20160601_1837.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-06-01 18:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0020_plik_odkad'), + ] + + operations = [ + migrations.AlterField( + model_name='plik', + name='stan', + field=models.CharField(choices=[('W KOLEJCE', 'Oczekuje'), ('TWORZENIE', 'Tworzenie'), ('GOTOWY', 'Gotowy')], default='W KOLEJCE', max_length=10), + ), + ] diff --git a/app/migrations/0022_syspar.py b/app/migrations/0022_syspar.py new file mode 100644 index 0000000..ae76c1b --- /dev/null +++ b/app/migrations/0022_syspar.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-06-04 11:29 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0021_auto_20160601_1837'), + ] + + operations = [ + migrations.CreateModel( + name='SysPar', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('kod', models.CharField(max_length=30)), + ('nazwa', models.CharField(blank=True, max_length=40)), + ('wartosc', models.CharField(blank=True, max_length=120)), + ('uwagi', models.CharField(blank=True, max_length=300)), + ('poprawne', models.CharField(blank=True, max_length=60)), + ('sysid', models.CharField(blank=True, max_length=1)), + ], + options={ + 'db_table': 'sys_par', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0023_spo.py b/app/migrations/0023_spo.py new file mode 100644 index 0000000..6763a58 --- /dev/null +++ b/app/migrations/0023_spo.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-06-05 20:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0022_syspar'), + ] + + operations = [ + migrations.CreateModel( + name='Spo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nr_slo', models.CharField(max_length=5)), + ('spokod', models.CharField(max_length=20)), + ('pnazwa', models.CharField(max_length=40)), + ], + options={ + 'db_table': 'spo', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0024_auto_20160615_2144.py b/app/migrations/0024_auto_20160615_2144.py new file mode 100644 index 0000000..cb0fa93 --- /dev/null +++ b/app/migrations/0024_auto_20160615_2144.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-06-15 21:44 +from __future__ import unicode_literals + +import app.model_fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0023_spo'), + ] + + operations = [ + migrations.CreateModel( + name='Wyciag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nr_rachunku', models.CharField(max_length=28, verbose_name=b'Nr rachunku')), + ('nr_wyciagu', models.IntegerField(verbose_name=b'Nr wyciagu')), + ('waluta', models.CharField(max_length=3, verbose_name=b'Waluta')), + ('kod', models.CharField(max_length=4, verbose_name=b'Kod operacji')), + ('data', models.DateField(verbose_name=b'Data operacji')), + ('kwota', models.DecimalField(decimal_places=2, default=0.0, max_digits=16)), + ('opis', models.CharField(max_length=255, verbose_name=b'Opis operacji')), + ('podmiot', models.CharField(max_length=255, verbose_name=b'Nazwa podmiotu')), + ('saldo', models.DecimalField(decimal_places=2, default=0.0, max_digits=16)), + ], + ), + migrations.AlterField( + model_name='plik', + name='xml', + field=app.model_fields.CompressedTextField(null=True, verbose_name='Zawarto\u015b\u0107 pliku JPK'), + ), + ] diff --git a/app/migrations/0025_plik_rachunek.py b/app/migrations/0025_plik_rachunek.py new file mode 100644 index 0000000..edbc6fb --- /dev/null +++ b/app/migrations/0025_plik_rachunek.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-06-16 19:34 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0024_auto_20160615_2144'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='rachunek', + field=models.CharField(max_length=30, null=True), + ), + ] diff --git a/app/migrations/0026_auto_20160617_1242.py b/app/migrations/0026_auto_20160617_1242.py new file mode 100644 index 0000000..da01475 --- /dev/null +++ b/app/migrations/0026_auto_20160617_1242.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-06-17 12:42 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0025_plik_rachunek'), + ] + + operations = [ + migrations.CreateModel( + name='DefZrv', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('kod', models.CharField(max_length=10)), + ('zrv', models.CharField(max_length=3)), + ('odlicz', models.DecimalField(decimal_places=2, default=0, max_digits=6)), + ('uwagi', models.CharField(max_length=100)), + ('rok', models.SmallIntegerField()), + ], + options={ + 'ordering': ['id'], + 'db_table': 'def_zrv', + 'managed': False, + }, + ), + migrations.AlterField( + model_name='plik', + name='rachunek', + field=models.CharField(blank=True, max_length=30, null=True), + ), + ] diff --git a/app/migrations/0027_auto_20160617_1721.py b/app/migrations/0027_auto_20160617_1721.py new file mode 100644 index 0000000..d8b8941 --- /dev/null +++ b/app/migrations/0027_auto_20160617_1721.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6.dev20160421010813 on 2016-06-17 17:21 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0026_auto_20160617_1242'), + ] + + operations = [ + migrations.AlterModelOptions( + name='defzrv', + options={'managed': False, 'ordering': ['zrv_id']}, + ), + ] diff --git a/app/migrations/0028_magdzial.py b/app/migrations/0028_magdzial.py new file mode 100644 index 0000000..c324e7f --- /dev/null +++ b/app/migrations/0028_magdzial.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-08 14:21 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0027_auto_20160617_1721'), + ] + + operations = [ + migrations.CreateModel( + name='MagDzial', + fields=[ + ('rowid', models.IntegerField(primary_key=True, serialize=False)), + ('dzial', models.CharField(max_length=3)), + ('fk_kod', models.CharField(max_length=3, null=True)), + ('nazwa', models.CharField(max_length=40, null=True)), + ('typ_mag', models.CharField(max_length=1, null=True)), + ('sprzedaz', models.CharField(max_length=1, null=True)), + ], + options={ + 'ordering': ['dzial'], + 'db_table': 'mag_dzial', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0029_plik_magazyn.py b/app/migrations/0029_plik_magazyn.py new file mode 100644 index 0000000..9d5b885 --- /dev/null +++ b/app/migrations/0029_plik_magazyn.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-08 14:42 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0028_magdzial'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='magazyn', + field=models.CharField(blank=True, max_length=50, null=True), + ), + ] diff --git a/app/migrations/0030_auto_20160708_2200.py b/app/migrations/0030_auto_20160708_2200.py new file mode 100644 index 0000000..0b620d7 --- /dev/null +++ b/app/migrations/0030_auto_20160708_2200.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-08 22:00 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0029_plik_magazyn'), + ] + + operations = [ + migrations.CreateModel( + name='MagKart', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dzial', models.CharField(max_length=3)), + ('data_kart', models.DateField()), + ('indeks', models.CharField(max_length=20)), + ('partia', models.CharField(max_length=10)), + ('data_prod', models.DateField()), + ('data_wazn', models.DateField()), + ('saldo_il', models.DecimalField(decimal_places=3, max_digits=12)), + ('saldo_dysp', models.DecimalField(decimal_places=3, max_digits=12)), + ('cena_ewid', models.DecimalField(decimal_places=2, max_digits=12)), + ('lokaliza', models.CharField(max_length=20)), + ], + ), + migrations.CreateModel( + name='MagTowar', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dzial', models.CharField(max_length=3)), + ('indeks', models.CharField(max_length=20)), + ('nazwa', models.CharField(max_length=50)), + ], + ), + migrations.AddField( + model_name='magkart', + name='id_towar', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.MagTowar'), + ), + ] diff --git a/app/migrations/0031_auto_20160708_2216.py b/app/migrations/0031_auto_20160708_2216.py new file mode 100644 index 0000000..631091c --- /dev/null +++ b/app/migrations/0031_auto_20160708_2216.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-08 22:16 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0030_auto_20160708_2200'), + ] + + operations = [ + migrations.AlterField( + model_name='magkart', + name='id_towar', + field=models.ForeignKey(db_column='id_towar', on_delete=django.db.models.deletion.CASCADE, to='app.MagTowar'), + ), + ] diff --git a/app/migrations/0032_auto_20160708_2359.py b/app/migrations/0032_auto_20160708_2359.py new file mode 100644 index 0000000..4d44c08 --- /dev/null +++ b/app/migrations/0032_auto_20160708_2359.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-08 23:59 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0031_auto_20160708_2216'), + ] + + operations = [ + migrations.AlterModelOptions( + name='magkart', + options={'managed': False, 'ordering': ['id']}, + ), + migrations.AlterModelOptions( + name='magtowar', + options={'managed': False, 'ordering': ['id']}, + ), + ] diff --git a/app/migrations/0033_auto_20160709_1200.py b/app/migrations/0033_auto_20160709_1200.py new file mode 100644 index 0000000..9447e68 --- /dev/null +++ b/app/migrations/0033_auto_20160709_1200.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-09 12:00 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0032_auto_20160708_2359'), + ] + + operations = [ + migrations.AlterModelTable( + name='magkart', + table='mag_kart', + ), + migrations.AlterModelTable( + name='magtowar', + table='mag_towar', + ), + ] diff --git a/app/migrations/0034_auto_20160711_1543.py b/app/migrations/0034_auto_20160711_1543.py new file mode 100644 index 0000000..3286b3b --- /dev/null +++ b/app/migrations/0034_auto_20160711_1543.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-11 15:43 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0033_auto_20160709_1200'), + ] + + operations = [ + migrations.AlterField( + model_name='plik', + name='kod', + field=models.CharField(choices=[(b'JPK_KR', 'Ksi\u0119gi rachunkowe'), (b'JPK_VAT', 'Rozliczenia VAT'), (b'JPK_FA', 'Faktury sprzeda\u017cy'), (b'JPK_WB', 'Wyci\u0105gi bankowe'), (b'JPK_MAG', 'Obr\xf3t magazynowy')], max_length=10, verbose_name=b'Kod pliku JPK'), + ), + ] diff --git a/app/migrations/0035_auto_20160713_1509.py b/app/migrations/0035_auto_20160713_1509.py new file mode 100644 index 0000000..572be5c --- /dev/null +++ b/app/migrations/0035_auto_20160713_1509.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-13 15:09 +from __future__ import unicode_literals + +import app.model_fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0034_auto_20160711_1543'), + ] + + operations = [ + migrations.CreateModel( + name='Status', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time', models.DateTimeField()), + ('code', models.IntegerField()), + ('text', app.model_fields.CompressedTextField(null=True, verbose_name='Odpowied\u017a na Status')), + ], + options={ + 'ordering': ['-id'], + }, + ), + migrations.CreateModel( + name='Storage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sign_time', models.DateTimeField()), + ('sign_xml', app.model_fields.CompressedTextField(verbose_name='Plik do podpisania')), + ('aes_key', models.CharField(max_length=44)), + ('aes_iv', models.CharField(max_length=24)), + ('aes', app.model_fields.CompressedTextField(verbose_name='Plik do wys\u0142ania')), + ('xml_name', models.CharField(max_length=20)), + ('xml_len', models.IntegerField()), + ('xml_hash', models.CharField(max_length=44)), + ('zip_name', models.CharField(max_length=20)), + ('zip_len', models.IntegerField()), + ('zip_hash', models.CharField(max_length=24)), + ('xades_time', models.DateTimeField(null=True)), + ('xades', app.model_fields.CompressedTextField(null=True, verbose_name='Plik podpisany')), + ('init_time', models.DateTimeField(null=True)), + ('init_code', models.IntegerField(null=True)), + ('init_text', app.model_fields.CompressedTextField(null=True, verbose_name='Odpowied\u017a na InitUploadSigned')), + ('put_time', models.DateTimeField(null=True)), + ('put_code', models.IntegerField(null=True)), + ('put_text', app.model_fields.CompressedTextField(null=True, verbose_name='Odpowied\u017a na Upload')), + ('finish_time', models.DateTimeField(null=True)), + ('finish_code', models.IntegerField(null=True)), + ('finish_text', app.model_fields.CompressedTextField(null=True, verbose_name='Odpowied\u017a na FinishUpload')), + ('reference', models.CharField(max_length=32, null=True)), + ('jpk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Plik')), + ], + options={ + 'ordering': ['-id'], + }, + ), + migrations.AddField( + model_name='status', + name='storage', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='statusy', to='app.Storage'), + ), + ] diff --git a/app/migrations/0036_auto_20160713_1818.py b/app/migrations/0036_auto_20160713_1818.py new file mode 100644 index 0000000..4215304 --- /dev/null +++ b/app/migrations/0036_auto_20160713_1818.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-13 18:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0035_auto_20160713_1509'), + ] + + operations = [ + migrations.RenameField( + model_name='storage', + old_name='aes', + new_name='jpk_aes', + ), + migrations.AddField( + model_name='storage', + name='enc_key', + field=models.CharField(default='', max_length=255), + preserve_default=False, + ), + ] diff --git a/app/migrations/0037_auto_20160713_1822.py b/app/migrations/0037_auto_20160713_1822.py new file mode 100644 index 0000000..44b4824 --- /dev/null +++ b/app/migrations/0037_auto_20160713_1822.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-13 18:22 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0036_auto_20160713_1818'), + ] + + operations = [ + migrations.AlterField( + model_name='storage', + name='enc_key', + field=models.TextField(), + ), + ] diff --git a/app/migrations/0038_auto_20160714_2255.py b/app/migrations/0038_auto_20160714_2255.py new file mode 100644 index 0000000..0d01dd9 --- /dev/null +++ b/app/migrations/0038_auto_20160714_2255.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-14 22:55 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0037_auto_20160713_1822'), + ] + + operations = [ + migrations.AlterField( + model_name='plik', + name='paczka', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pliki', to='app.Paczka'), + ), + migrations.AlterField( + model_name='status', + name='storage', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Storage'), + ), + ] diff --git a/app/migrations/0039_auto_20160716_2308.py b/app/migrations/0039_auto_20160716_2308.py new file mode 100644 index 0000000..8bf7c8a --- /dev/null +++ b/app/migrations/0039_auto_20160716_2308.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-16 23:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0038_auto_20160714_2255'), + ] + + operations = [ + migrations.AlterField( + model_name='plik', + name='paczka', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pliki', to='app.Paczka'), + ), + migrations.AlterField( + model_name='plik', + name='stan', + field=models.CharField(choices=[(b'W KOLEJCE', b'Oczekuje'), (b'TWORZENIE', b'Tworzenie'), (b'GOTOWY', b'Gotowy')], default=b'W KOLEJCE', max_length=15), + ), + ] diff --git a/app/migrations/0040_auto_20160717_1835.py b/app/migrations/0040_auto_20160717_1835.py new file mode 100644 index 0000000..455914a --- /dev/null +++ b/app/migrations/0040_auto_20160717_1835.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-07-17 18:35 +from __future__ import unicode_literals + +import app.model_fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0039_auto_20160716_2308'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='upo', + field=app.model_fields.CompressedTextField(null=True, verbose_name='UPO'), + ), + migrations.AddField( + model_name='plik', + name='utworzony_user', + field=models.CharField(max_length=10, null=True), + ), + migrations.AddField( + model_name='status', + name='user', + field=models.CharField(default='wlodek', max_length=10), + preserve_default=False, + ), + migrations.AddField( + model_name='storage', + name='finish_user', + field=models.CharField(max_length=10, null=True), + ), + migrations.AddField( + model_name='storage', + name='init_user', + field=models.CharField(max_length=10, null=True), + ), + migrations.AddField( + model_name='storage', + name='put_user', + field=models.CharField(max_length=10, null=True), + ), + migrations.AddField( + model_name='storage', + name='sign_user', + field=models.CharField(default='wlodek', max_length=10), + preserve_default=False, + ), + migrations.AddField( + model_name='storage', + name='xades_user', + field=models.CharField(max_length=10, null=True), + ), + ] diff --git a/app/migrations/0041_fakres.py b/app/migrations/0041_fakres.py new file mode 100644 index 0000000..c16ef57 --- /dev/null +++ b/app/migrations/0041_fakres.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-08-03 21:12 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0040_auto_20160717_1835'), + ] + + operations = [ + migrations.CreateModel( + name='FakRes', + fields=[ + ('id_dok', models.IntegerField(primary_key=True, serialize=False)), + ('k_rach', models.CharField(max_length=20)), + ('przyczyna', models.CharField(max_length=120)), + ], + options={ + 'db_table': 'fak_res', + 'managed': False, + }, + ), + ] diff --git a/app/migrations/0042_blad.py b/app/migrations/0042_blad.py new file mode 100644 index 0000000..df80c19 --- /dev/null +++ b/app/migrations/0042_blad.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-08-06 13:21 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0041_fakres'), + ] + + operations = [ + migrations.CreateModel( + name='Blad', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('zrodlo', models.CharField(max_length=10)), + ('dokument', models.CharField(max_length=20)), + ('blad', models.TextField()), + ('jpk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Plik')), + ], + options={ + 'ordering': ['id'], + }, + ), + ] diff --git a/app/migrations/0043_plik_xls.py b/app/migrations/0043_plik_xls.py new file mode 100644 index 0000000..effe9a0 --- /dev/null +++ b/app/migrations/0043_plik_xls.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-08-10 12:54 +from __future__ import unicode_literals + +import app.model_fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0042_blad'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='xls', + field=app.model_fields.CompressedTextField(null=True, verbose_name='Plik kontrolny XLS'), + ), + ] diff --git a/app/migrations/0044_ctrl_xls.py b/app/migrations/0044_ctrl_xls.py new file mode 100644 index 0000000..f2f8396 --- /dev/null +++ b/app/migrations/0044_ctrl_xls.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-08-10 13:50 +from __future__ import unicode_literals + +import app.model_fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0043_plik_xls'), + ] + + operations = [ + migrations.AddField( + model_name='ctrl', + name='xls', + field=app.model_fields.CompressedTextField(null=True, verbose_name='Arkusz kontrolny XLS'), + ), + ] diff --git a/app/migrations/0045_plik_nazwa.py b/app/migrations/0045_plik_nazwa.py new file mode 100644 index 0000000..0840083 --- /dev/null +++ b/app/migrations/0045_plik_nazwa.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-08-24 20:34 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0044_ctrl_xls'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='nazwa', + field=models.CharField(max_length=40, null=True, verbose_name=b'Nazwa'), + ), + ] diff --git a/app/migrations/0046_auto_20160824_2214.py b/app/migrations/0046_auto_20160824_2214.py new file mode 100644 index 0000000..cc64948 --- /dev/null +++ b/app/migrations/0046_auto_20160824_2214.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-08-24 22:14 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0045_plik_nazwa'), + ] + + operations = [ + migrations.AlterField( + model_name='plik', + name='nazwa', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name=b'Nazwa'), + ), + ] diff --git a/app/migrations/0047_storage_bramka.py b/app/migrations/0047_storage_bramka.py new file mode 100644 index 0000000..5113d17 --- /dev/null +++ b/app/migrations/0047_storage_bramka.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-08-30 21:15 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0046_auto_20160824_2214'), + ] + + operations = [ + migrations.AddField( + model_name='storage', + name='bramka', + field=models.CharField(default='P', max_length=1), + ), + ] diff --git a/app/migrations/0048_auto_20160902_1637.py b/app/migrations/0048_auto_20160902_1637.py new file mode 100644 index 0000000..dea3aae --- /dev/null +++ b/app/migrations/0048_auto_20160902_1637.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.8.dev20160628165209 on 2016-09-02 16:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0047_storage_bramka'), + ] + + operations = [ + migrations.AlterField( + model_name='plik', + name='kod', + field=models.CharField(max_length=10, verbose_name=b'Kod pliku JPK'), + ), + migrations.AlterField( + model_name='plik', + name='stan', + field=models.CharField(default=b'W KOLEJCE', max_length=15), + ), + ] diff --git a/app/migrations/0049_auto_20161006_1843.py b/app/migrations/0049_auto_20161006_1843.py new file mode 100644 index 0000000..816acf4 --- /dev/null +++ b/app/migrations/0049_auto_20161006_1843.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20160928105123 on 2016-10-06 18:43 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0048_auto_20160902_1637'), + ] + + operations = [ + migrations.RenameField( + model_name='storage', + old_name='xades', + new_name='xades_xml', + ), + migrations.AlterField( + model_name='ctrl', + name='tabela', + field=models.CharField(max_length=20, verbose_name='Tabela'), + ), + migrations.AlterField( + model_name='ctrl', + name='wiersze', + field=models.IntegerField(default=0, verbose_name='Wiersze'), + ), + migrations.AlterField( + model_name='plik', + name='kod', + field=models.CharField(max_length=10, verbose_name='Kod pliku JPK'), + ), + migrations.AlterField( + model_name='plik', + name='nazwa', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Nazwa'), + ), + migrations.AlterField( + model_name='plik', + name='odkad', + field=models.DateTimeField(default=datetime.datetime.now, verbose_name='Odkad'), + ), + migrations.AlterField( + model_name='plik', + name='stan', + field=models.CharField(default='W KOLEJCE', max_length=15), + ), + migrations.AlterField( + model_name='wyciag', + name='data', + field=models.DateField(verbose_name='Data operacji'), + ), + migrations.AlterField( + model_name='wyciag', + name='kod', + field=models.CharField(max_length=4, verbose_name='Kod operacji'), + ), + migrations.AlterField( + model_name='wyciag', + name='nr_rachunku', + field=models.CharField(max_length=28, verbose_name='Nr rachunku'), + ), + migrations.AlterField( + model_name='wyciag', + name='nr_wyciagu', + field=models.IntegerField(verbose_name='Nr wyciagu'), + ), + migrations.AlterField( + model_name='wyciag', + name='opis', + field=models.CharField(max_length=255, verbose_name='Opis operacji'), + ), + migrations.AlterField( + model_name='wyciag', + name='podmiot', + field=models.CharField(max_length=255, verbose_name='Nazwa podmiotu'), + ), + migrations.AlterField( + model_name='wyciag', + name='waluta', + field=models.CharField(max_length=3, verbose_name='Waluta'), + ), + ] diff --git a/app/migrations/0050_auto_20161018_1809.py b/app/migrations/0050_auto_20161018_1809.py new file mode 100644 index 0000000..94881db --- /dev/null +++ b/app/migrations/0050_auto_20161018_1809.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161003200552 on 2016-10-18 18:09 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0049_auto_20161006_1843'), + ] + + operations = [ + migrations.AlterField( + model_name='storage', + name='sign_time', + field=models.DateTimeField(default=datetime.datetime.now), + ), + ] diff --git a/app/migrations/0051_auto_20161116_1820.py b/app/migrations/0051_auto_20161116_1820.py new file mode 100644 index 0000000..d7ae7f6 --- /dev/null +++ b/app/migrations/0051_auto_20161116_1820.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2016-11-16 18:20 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0050_auto_20161018_1809'), + ] + + operations = [ + migrations.AlterField( + model_name='status', + name='time', + field=models.DateTimeField(default=datetime.datetime.now), + ), + ] diff --git a/app/migrations/0052_firma.py b/app/migrations/0052_firma.py new file mode 100644 index 0000000..2e491a2 --- /dev/null +++ b/app/migrations/0052_firma.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2016-12-13 18:56 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0051_auto_20161116_1820'), + ] + + operations = [ + migrations.CreateModel( + name='Firma', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('oznaczenie', models.CharField(max_length=10)), + ('db_ostatnia', models.CharField(max_length=20)), + ('db_rok', models.IntegerField()), + ('nip', models.CharField(max_length=10, verbose_name='NIP')), + ('nazwa', models.CharField(max_length=50, verbose_name='Nazwa')), + ('adres', models.CharField(max_length=50, verbose_name='Adres')), + ('regon', models.CharField(max_length=15, verbose_name='Regon')), + ('wojewodztwo', models.CharField(max_length=20, verbose_name='Województwo')), + ('powiat', models.CharField(max_length=50, verbose_name='Powiat')), + ('gmina', models.CharField(max_length=50, verbose_name='Gmina')), + ('ulica', models.CharField(max_length=30, verbose_name='Ulica')), + ('nr_domu', models.CharField(max_length=10, verbose_name='Nr domu')), + ('nr_lokalu', models.CharField(max_length=5, verbose_name='Nr lokalu', null= True)), + ('miejscowosc', models.CharField(max_length=50, verbose_name='Miejscowość')), + ('kod_pocztowy', models.CharField(max_length=6, verbose_name='Kod pocztowy')), + ('poczta', models.CharField(max_length=50, verbose_name='Poczta')), + ('kod_urzedu', models.CharField(max_length=4, verbose_name='Kod US')), + ('rdok', models.CharField(max_length=5, verbose_name='Słownik dokumentów')), + ('wszystkie_konta', models.BooleanField()), + ('save_jpk_xls', models.BooleanField()), + ('save_ctrl_xls', models.BooleanField()), + ], + ), + ] diff --git a/app/migrations/0053_auto_20161213_1856.py b/app/migrations/0053_auto_20161213_1856.py new file mode 100644 index 0000000..109281f --- /dev/null +++ b/app/migrations/0053_auto_20161213_1856.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2016-12-13 18:56 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations + +def inicjalizacja_firmy(apps, schema_editor): + + Firma= apps.get_model("app", "Firma") + + if settings.FIRMA == 'gig': + + Firma.objects.create( + + oznaczenie= 'gig', + db_ostatnia= 'fk16', + db_rok= 2016, + + nip= '6340126016', + nazwa= 'Główny Instytut Górnictwa', + adres= 'Katowice 40-166, ul. Gwarków 1', + regon= '000023461', + wojewodztwo= 'śląskie', + powiat= 'm. Katowice', + gmina= 'm. Katowice', + ulica= 'Plac Gwarków', + nr_domu= '1', + miejscowosc= 'Katowice', + kod_pocztowy= '40-166', + poczta= 'Katowice', + kod_urzedu= '2471', + + rdok= 'RDOKU', + wszystkie_konta= False, + save_jpk_xls= True, + save_ctrl_xls= True, + ) + + if settings.FIRMA == 'ichp': + + Firma.objects.create( + + oznaczenie= 'ichp', + db_ostatnia= 'fk16', + db_rok= 2016, + + nip= '5250007939', + nazwa= 'Instytut Chemii Przemysłowej, im. prof. I. Mościckiego', + adres= 'Warszawa 01-793, ul. Rydygiera 8', + regon= '000045161', + wojewodztwo= 'mazowieckie', + powiat= 'warszawski', + gmina= 'Warszawa-Centrum', + ulica= 'Rydygiera', + nr_domu= '8', + miejscowosc= 'Warszawa', + kod_pocztowy= '01-793', + poczta= 'Warszawa', + kod_urzedu= '1471', + + rdok= 'RDOK', + wszystkie_konta= True, + save_jpk_xls= False, + save_ctrl_xls= False, + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0052_firma'), + ] + + operations = [ + migrations.RunPython(inicjalizacja_firmy), + ] diff --git a/app/migrations/0054_auto_20161215_1726.py b/app/migrations/0054_auto_20161215_1726.py new file mode 100644 index 0000000..5dcc7fa --- /dev/null +++ b/app/migrations/0054_auto_20161215_1726.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2016-12-15 17:26 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0053_auto_20161213_1856'), + ] + + operations = [ + migrations.RemoveField( + model_name='plik', + name='paczka', + ), + migrations.DeleteModel( + name='Paczka', + ), + ] diff --git a/app/migrations/0055_plik_firma.py b/app/migrations/0055_plik_firma.py new file mode 100644 index 0000000..df71b43 --- /dev/null +++ b/app/migrations/0055_plik_firma.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2016-12-15 17:29 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0054_auto_20161215_1726'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='firma', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='app.Firma'), + ), + ] diff --git a/app/migrations/0056_auto_20161215_1758.py b/app/migrations/0056_auto_20161215_1758.py new file mode 100644 index 0000000..e9b7c8a --- /dev/null +++ b/app/migrations/0056_auto_20161215_1758.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2016-12-15 17:58 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0055_plik_firma'), + ] + + operations = [ + migrations.AlterField( + model_name='firma', + name='nazwa', + field=models.CharField(max_length=100, verbose_name='Nazwa'), + ), + ] diff --git a/app/migrations/0057_auto_20161215_2103.py b/app/migrations/0057_auto_20161215_2103.py new file mode 100644 index 0000000..f9f7e29 --- /dev/null +++ b/app/migrations/0057_auto_20161215_2103.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2016-12-15 21:03 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0056_auto_20161215_1758'), + ] + + operations = [ + migrations.RemoveField( + model_name='firma', + name='rdok', + ), + migrations.RemoveField( + model_name='firma', + name='save_ctrl_xls', + ), + migrations.RemoveField( + model_name='firma', + name='save_jpk_xls', + ), + migrations.RemoveField( + model_name='firma', + name='wszystkie_konta', + ), + ] diff --git a/app/migrations/0058_plik_cel_zlozenia.py b/app/migrations/0058_plik_cel_zlozenia.py new file mode 100644 index 0000000..5fc4f32 --- /dev/null +++ b/app/migrations/0058_plik_cel_zlozenia.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2017-02-01 18:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0057_auto_20161215_2103'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='cel_zlozenia', + field=models.CharField(default='1', max_length=1), + ), + ] diff --git a/app/migrations/0059_plik_wariant.py b/app/migrations/0059_plik_wariant.py new file mode 100644 index 0000000..af61768 --- /dev/null +++ b/app/migrations/0059_plik_wariant.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.11.dev20161013150334 on 2017-02-01 22:47 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0058_plik_cel_zlozenia'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='wariant', + field=models.CharField(default='1', max_length=1), + ), + ] diff --git a/app/migrations/0060_userprofile.py b/app/migrations/0060_userprofile.py new file mode 100644 index 0000000..4be807d --- /dev/null +++ b/app/migrations/0060_userprofile.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2017-02-17 22:10 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('app', '0059_plik_wariant'), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_job', models.IntegerField(null=True)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/app/migrations/0061_auto_20170217_2216.py b/app/migrations/0061_auto_20170217_2216.py new file mode 100644 index 0000000..a0ee9f4 --- /dev/null +++ b/app/migrations/0061_auto_20170217_2216.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2017-02-17 22:16 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0060_userprofile'), + ] + + operations = [ + migrations.RenameField( + model_name='userprofile', + old_name='last_job', + new_name='dan_id', + ), + ] diff --git a/app/migrations/0062_auto_20170218_2355.py b/app/migrations/0062_auto_20170218_2355.py new file mode 100644 index 0000000..0fa0ef9 --- /dev/null +++ b/app/migrations/0062_auto_20170218_2355.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2017-02-18 23:55 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0061_auto_20170217_2216'), + ] + + operations = [ + migrations.RenameField( + model_name='userprofile', + old_name='dan_id', + new_name='job_id', + ), + ] diff --git a/app/migrations/0063_auto_20170309_2100.py b/app/migrations/0063_auto_20170309_2100.py new file mode 100644 index 0000000..2e2e5ac --- /dev/null +++ b/app/migrations/0063_auto_20170309_2100.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2017-03-09 21:00 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0062_auto_20170218_2355'), + ] + + operations = [ + migrations.AlterField( + model_name='firma', + name='oznaczenie', + field=models.CharField(max_length=10, unique=True), + ), + ] diff --git a/app/migrations/0064_auto_20170311_1251.py b/app/migrations/0064_auto_20170311_1251.py new file mode 100644 index 0000000..9c41760 --- /dev/null +++ b/app/migrations/0064_auto_20170311_1251.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2017-03-11 12:51 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0063_auto_20170309_2100'), + ] + + operations = [ + migrations.AlterField( + model_name='firma', + name='nr_lokalu', + field=models.CharField(blank=True, max_length=5, null=True, verbose_name='Nr lokalu'), + ), + ] diff --git a/app/migrations/0065_auto_20180208_1919.py b/app/migrations/0065_auto_20180208_1919.py new file mode 100644 index 0000000..bf6c6ee --- /dev/null +++ b/app/migrations/0065_auto_20180208_1919.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2018-02-08 19:19 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0064_auto_20170311_1251'), + ] + + operations = [ + migrations.AddField( + model_name='firma', + name='email', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Email'), + ), + migrations.AlterField( + model_name='plik', + name='cel_zlozenia', + field=models.CharField(default='0', max_length=1), + ), + ] diff --git a/app/migrations/0066_auto_20180219_1707.py b/app/migrations/0066_auto_20180219_1707.py new file mode 100644 index 0000000..dc0fa87 --- /dev/null +++ b/app/migrations/0066_auto_20180219_1707.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2018-02-19 17:07 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0065_auto_20180208_1919'), + ] + + operations = [ + migrations.AlterField( + model_name='firma', + name='adres', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Adres'), + ), + migrations.AlterField( + model_name='firma', + name='gmina', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Gmina'), + ), + migrations.AlterField( + model_name='firma', + name='kod_pocztowy', + field=models.CharField(blank=True, max_length=6, null=True, verbose_name='Kod pocztowy'), + ), + migrations.AlterField( + model_name='firma', + name='kod_urzedu', + field=models.CharField(blank=True, max_length=4, null=True, verbose_name='Kod US'), + ), + migrations.AlterField( + model_name='firma', + name='miejscowosc', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Miejscowość'), + ), + migrations.AlterField( + model_name='firma', + name='nr_domu', + field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Nr domu'), + ), + migrations.AlterField( + model_name='firma', + name='poczta', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Poczta'), + ), + migrations.AlterField( + model_name='firma', + name='powiat', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Powiat'), + ), + migrations.AlterField( + model_name='firma', + name='regon', + field=models.CharField(blank=True, max_length=15, null=True, verbose_name='Regon'), + ), + migrations.AlterField( + model_name='firma', + name='ulica', + field=models.CharField(blank=True, max_length=30, null=True, verbose_name='Ulica'), + ), + migrations.AlterField( + model_name='firma', + name='wojewodztwo', + field=models.CharField(blank=True, max_length=20, null=True, verbose_name='Województwo'), + ), + ] diff --git a/app/migrations/0067_firma_ostatni_plik.py b/app/migrations/0067_firma_ostatni_plik.py new file mode 100644 index 0000000..e0e9301 --- /dev/null +++ b/app/migrations/0067_firma_ostatni_plik.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2018-02-23 14:34 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0066_auto_20180219_1707'), + ] + + operations = [ + migrations.AddField( + model_name='firma', + name='ostatni_plik', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='firma_ostatni', to='app.Plik'), + ), + ] diff --git a/app/migrations/0068_auto_20180804_1345.py b/app/migrations/0068_auto_20180804_1345.py new file mode 100644 index 0000000..8aeb6d7 --- /dev/null +++ b/app/migrations/0068_auto_20180804_1345.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2018-08-04 13:45 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0067_firma_ostatni_plik'), + ] + + operations = [ + migrations.AlterField( + model_name='firma', + name='ostatni_plik', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='firma_ostatni', to='app.Plik'), + ), + ] diff --git a/app/migrations/0069_blad_level.py b/app/migrations/0069_blad_level.py new file mode 100644 index 0000000..c5bf445 --- /dev/null +++ b/app/migrations/0069_blad_level.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2018-10-20 16:52 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0068_auto_20180804_1345'), + ] + + operations = [ + migrations.AddField( + model_name='blad', + name='level', + field=models.CharField(default='error', max_length=10), + ), + ] diff --git a/app/migrations/0070_firma_krs.py b/app/migrations/0070_firma_krs.py new file mode 100644 index 0000000..b25e067 --- /dev/null +++ b/app/migrations/0070_firma_krs.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13.dev20170130170755 on 2018-12-08 22:04 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0069_blad_level'), + ] + + operations = [ + migrations.AddField( + model_name='firma', + name='krs', + field=models.CharField(blank=True, max_length=11, null=True, verbose_name='NrKRS'), + ), + ] diff --git a/app/migrations/0071_auto_20191229_1548.py b/app/migrations/0071_auto_20191229_1548.py new file mode 100644 index 0000000..6aa4cd4 --- /dev/null +++ b/app/migrations/0071_auto_20191229_1548.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2019-12-29 15:48 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0070_firma_krs'), + ] + + operations = [ + migrations.AlterField( + model_name='firma', + name='krs', + field=models.CharField(blank=True, max_length=11, null=True, verbose_name='Nr KRS'), + ), + ] diff --git a/app/migrations/0072_firma_api_url.py b/app/migrations/0072_firma_api_url.py new file mode 100644 index 0000000..6add9f4 --- /dev/null +++ b/app/migrations/0072_firma_api_url.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-21 13:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0071_auto_20191229_1548'), + ] + + operations = [ + migrations.AddField( + model_name='firma', + name='api_url', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Api url'), + ), + ] diff --git a/app/migrations/0073_auto_20200221_1800.py b/app/migrations/0073_auto_20200221_1800.py new file mode 100644 index 0000000..ad4ee4f --- /dev/null +++ b/app/migrations/0073_auto_20200221_1800.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-21 18:00 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0072_firma_api_url'), + ] + + operations = [ + migrations.AlterField( + model_name='firma', + name='api_url', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Api URL'), + ), + ] diff --git a/app/migrations/0074_auto_20200226_2152.py b/app/migrations/0074_auto_20200226_2152.py new file mode 100644 index 0000000..508b230 --- /dev/null +++ b/app/migrations/0074_auto_20200226_2152.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-26 21:52 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0073_auto_20200221_1800'), + ] + + operations = [ + migrations.AddField( + model_name='firma', + name='vat7', + field=models.CharField(blank=True, choices=[('M', 'Miesięczna'), ('K', 'Kwartalna')], max_length=1, null=True, verbose_name='Deklaracja VAT'), + ), + migrations.AddField( + model_name='plik', + name='kod_systemowy', + field=models.CharField(blank=True, max_length=15, null=True), + ), + migrations.AddField( + model_name='plik', + name='wariant_formularza', + field=models.CharField(blank=True, max_length=1, null=True), + ), + migrations.AddField( + model_name='plik', + name='wersja_schemy', + field=models.CharField(blank=True, max_length=5, null=True), + ), + ] diff --git a/app/migrations/0075_auto_20200227_1502.py b/app/migrations/0075_auto_20200227_1502.py new file mode 100644 index 0000000..17ad8c3 --- /dev/null +++ b/app/migrations/0075_auto_20200227_1502.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-27 15:02 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0074_auto_20200226_2152'), + ] + + operations = [ + migrations.AddField( + model_name='firma', + name='telefon', + field=models.CharField(blank=True, max_length=16, null=True, verbose_name='Telefon'), + ) + ] diff --git a/app/migrations/0076_auto_20200228_1312.py b/app/migrations/0076_auto_20200228_1312.py new file mode 100644 index 0000000..8e29320 --- /dev/null +++ b/app/migrations/0076_auto_20200228_1312.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-28 13:12 +from __future__ import unicode_literals + +import app.model_fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0075_auto_20200227_1502'), + ] + + operations = [ + migrations.CreateModel( + name='Deklaracja', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('grupa', models.CharField(max_length=1, verbose_name='Grupa')), + ('lp1', models.SmallIntegerField()), + ('nazwa', models.CharField(max_length=255, verbose_name='Nazwa')), + ('rodzaj', models.CharField(max_length=2, verbose_name='Rodzaj')), + ('kwota1', models.DecimalField(decimal_places=2, default=0.0, max_digits=16, verbose_name='Kwota1')), + ('kwota2', models.DecimalField(decimal_places=2, default=0.0, max_digits=16, verbose_name='Kwota2')), + ('wybor', models.BooleanField(default=False, verbose_name='Wybor')), + ('tekst', app.model_fields.CompressedTextField(null=True, verbose_name='Opis zasad')), + ], + ), + migrations.RemoveField( + model_name='plik', + name='kod_systemowy', + ), + migrations.RemoveField( + model_name='plik', + name='wariant_formularza', + ), + migrations.RemoveField( + model_name='plik', + name='wersja_schemy', + ), + migrations.AddField( + model_name='plik', + name='wariant_dek', + field=models.SmallIntegerField(default=21), + ), + migrations.AddField( + model_name='deklaracja', + name='jpk', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Plik'), + ), + ] diff --git a/app/migrations/0077_deklaracja_element.py b/app/migrations/0077_deklaracja_element.py new file mode 100644 index 0000000..77aa041 --- /dev/null +++ b/app/migrations/0077_deklaracja_element.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-28 13:21 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0076_auto_20200228_1312'), + ] + + operations = [ + migrations.AddField( + model_name='deklaracja', + name='element', + field=models.CharField(blank=True, max_length=30, null=True, verbose_name='Element'), + ), + ] diff --git a/app/migrations/0078_auto_20200228_1520.py b/app/migrations/0078_auto_20200228_1520.py new file mode 100644 index 0000000..25165be --- /dev/null +++ b/app/migrations/0078_auto_20200228_1520.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-28 15:20 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0077_deklaracja_element'), + ] + + operations = [ + migrations.RenameField( + model_name='deklaracja', + old_name='kwota1', + new_name='kwota', + ), + migrations.RenameField( + model_name='deklaracja', + old_name='lp1', + new_name='lp', + ), + migrations.RemoveField( + model_name='deklaracja', + name='kwota2', + ), + migrations.AlterField( + model_name='deklaracja', + name='rodzaj', + field=models.CharField(max_length=1, verbose_name='Rodzaj'), + ), + ] diff --git a/app/migrations/0079_deklaracjapoz.py b/app/migrations/0079_deklaracjapoz.py new file mode 100644 index 0000000..083201f --- /dev/null +++ b/app/migrations/0079_deklaracjapoz.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-28 18:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0078_auto_20200228_1520'), + ] + + operations = [ + migrations.CreateModel( + name='DeklaracjaPoz', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('wariant', models.SmallIntegerField(default=21)), + ('grupa', models.CharField(max_length=1, verbose_name='Grupa')), + ('lp', models.SmallIntegerField()), + ('rodzaj', models.CharField(max_length=1, verbose_name='Rodzaj')), + ('nazwa', models.CharField(max_length=255, verbose_name='Nazwa')), + ('element', models.CharField(blank=True, max_length=30, null=True, verbose_name='Element')), + ], + ), + ] diff --git a/app/migrations/0080_auto_20200228_2158.py b/app/migrations/0080_auto_20200228_2158.py new file mode 100644 index 0000000..a4738c2 --- /dev/null +++ b/app/migrations/0080_auto_20200228_2158.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-28 21:58 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0079_deklaracjapoz'), + ] + + operations = [ + migrations.RenameField( + model_name='deklaracja', + old_name='lp', + new_name='numer', + ), + migrations.RenameField( + model_name='deklaracjapoz', + old_name='lp', + new_name='numer', + ), + ] diff --git a/app/migrations/0081_deklaracjapoz_sumowanie.py b/app/migrations/0081_deklaracjapoz_sumowanie.py new file mode 100644 index 0000000..9921a92 --- /dev/null +++ b/app/migrations/0081_deklaracjapoz_sumowanie.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-29 13:48 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0080_auto_20200228_2158'), + ] + + operations = [ + migrations.AddField( + model_name='deklaracjapoz', + name='sumowanie', + field=models.CharField(blank=True, max_length=1, null=True, verbose_name='Sumowanie'), + ), + ] diff --git a/app/migrations/0082_auto_20200229_2113.py b/app/migrations/0082_auto_20200229_2113.py new file mode 100644 index 0000000..a8e3990 --- /dev/null +++ b/app/migrations/0082_auto_20200229_2113.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-02-29 21:13 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0081_deklaracjapoz_sumowanie'), + ] + + operations = [ + migrations.AddField( + model_name='deklaracjapoz', + name='x', + field=models.SmallIntegerField(null=True), + ), + migrations.AddField( + model_name='deklaracjapoz', + name='y', + field=models.SmallIntegerField(null=True), + ), + ] diff --git a/app/migrations/0083_auto_20200304_1321.py b/app/migrations/0083_auto_20200304_1321.py new file mode 100644 index 0000000..dd29ca1 --- /dev/null +++ b/app/migrations/0083_auto_20200304_1321.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-03-04 13:21 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0082_auto_20200229_2113'), + ] + + operations = [ + migrations.AddField( + model_name='deklaracjapoz', + name='strona', + field=models.SmallIntegerField(blank=True, null=True, verbose_name='Strona deklaracji'), + ), + migrations.AddField( + model_name='deklaracjapoz', + name='typ', + field=models.CharField(default='D', max_length=1, verbose_name='Typ'), + ), + ] diff --git a/app/migrations/0084_auto_20200312_2145.py b/app/migrations/0084_auto_20200312_2145.py new file mode 100644 index 0000000..78c8618 --- /dev/null +++ b/app/migrations/0084_auto_20200312_2145.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-03-12 21:45 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0083_auto_20200304_1321'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='kod_systemowy', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='plik', + name='wersja_schemy', + field=models.CharField(max_length=5, null=True), + ), + ] diff --git a/app/migrations/0085_firma_api_auth.py b/app/migrations/0085_firma_api_auth.py new file mode 100644 index 0000000..750a85e --- /dev/null +++ b/app/migrations/0085_firma_api_auth.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-05-06 12:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0084_auto_20200312_2145'), + ] + + operations = [ + migrations.AddField( + model_name='firma', + name='api_auth', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Klucz API'), + ), + ] diff --git a/app/migrations/0086_plik_korekta.py b/app/migrations/0086_plik_korekta.py new file mode 100644 index 0000000..100c6a1 --- /dev/null +++ b/app/migrations/0086_plik_korekta.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.14.dev20170906233242 on 2020-11-19 07:04 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0085_firma_api_auth'), + ] + + operations = [ + migrations.AddField( + model_name='plik', + name='korekta', + field=models.CharField(max_length=1, null=True), + ), + ] diff --git a/app/migrations/__init__.py b/app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/model_fields.py b/app/model_fields.py new file mode 100644 index 0000000..a5c0cdf --- /dev/null +++ b/app/model_fields.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from base64 import b64decode, b64encode + +from django.core import validators +from django.db import models +from django.db.models import signals +from django.utils import six +from django.utils.encoding import force_bytes +from django.utils.text import compress_string + +from io import BytesIO +import gzip + + +class BlobField(models.Field): + description= "Blob" + def db_type(self, connection): + return 'BLOB' + + +def uncompress_string(s): + """ + Helper function to reverse django.utils.text.compress_string. + + Podana wartość może być skompresowana lub nie oba przypadki są poprawne. + Jeżeli więc dekompresja się nie udaje to cicho zwracana jest oryginalan wartość. + """ + ret= s + try: + zbuf = BytesIO(s) + zfile = gzip.GzipFile(fileobj=zbuf) + ret = zfile.read() + zfile.close() + ret= ret.decode('utf-8') + except Exception as e: + pass + + return ret + + +class CompressedTextField(models.TextField): + """ + Uwaga: Tutaj trochę jest do dupy ponieważ przypisanie wartości do pola, + nie powoduje jego kompresji (nie jest wywoływana get_db_prep_save). + Więc później przy czytaniu nie powinno być dekompresji. + + Natomiast jeżeli obiekt został odczytany z bazy danych to wartość pola + jest skompresowana i powinna być dekompresowana. + + Dlatego uncompress działa tak, że próbuje rozpakować wartość a jeżeli się + nie uda to zwraca wartość pola i ona wtedy też jest poprawna. + Nie powinno być natomiast sygnalizowania tutaj błędów. + + Nie wiadomo jeszcze co jest z encode/decode utf-8. + Czasami (rzadko) konieczne jest zakodowanie bo inaczej jest problem. + """ + + def from_db_value(self, value, expression, connection, context): + if value is None: + return value + if not value: + value= '' + return value + + def get_db_prep_save(self, value, connection): + if not value: + value= '' + + if value: + try: + # Encodowanie powinno być robione tylko dla stringów (unicode w py2) + # XLS nie powinny być przechowywane w tym polu! + # To powinno być pole Byte compressowane + value = value.encode('utf-8') + # Po co tutaj encodujemy? Aby zamienić na bajty? + # Bo tak potrzebuje compress? + # Ale przecież to jest compress_string? + except: + pass + + value = compress_string(value) + + # Tutaj mamy str w py2 i bytes w py3 + # Nie robimy przetwarzania z TextField bo ono w py3 robi encodowanie + # i wtedy dupa + return value +# return models.TextField.get_db_prep_save(self, value, connection) + + def _get_val_from_obj(self, obj): + val= self.default() + if obj: + val= getattr(obj, self.attname) + if val: + val= uncompress_string(val) + else: + val= '' + return val + + def post_init(self, instance, force=False, *args, **kwargs): + value = self._get_val_from_obj(instance) + if value: + setattr(instance, self.attname, value) + + def contribute_to_class(self, cls, name): + super(CompressedTextField, self).contribute_to_class(cls, name) +# dispatcher.connect(self.post_init, signal=signals.post_init, sender=cls) + signals.post_init.connect(self.post_init, sender=cls) + + + def get_internal_type(self): + return "TextField" + + def db_type(self, connection): + return 'BLOB' + + +# add_introspection_rules([], ["^efaktury\.ef\.model_fields\.CompressedTextField"]) + + + +class BinaryField(models.Field): + description = "Raw binary data" + empty_values = [None, b''] + + def __init__(self, *args, **kwargs): + kwargs['editable'] = False + super(BinaryField, self).__init__(*args, **kwargs) + if self.max_length is not None: + self.validators.append(validators.MaxLengthValidator(self.max_length)) + + def get_internal_type(self): + return "BinaryField" + + def db_type(self, connection): + return 'BLOB' + + def get_default(self): + if self.has_default() and not callable(self.default): + return self.default + default = super(BinaryField, self).get_default() + if default == '': + return b'' + return default + + def get_db_prep_value(self, value, connection, prepared=False): + value = super(BinaryField, self + ).get_db_prep_value(value, connection, prepared) + if value is not None: + return buffer(value) + return value + + def value_to_string(self, obj): + """Binary data is serialized as base64""" + return b64encode(force_bytes(self._get_val_from_obj(obj))).decode('ascii') + + def to_python(self, value): + if isinstance(value, six.text_type): + value= buffer(b64decode(force_bytes(value))) + return value diff --git a/app/model_utils.py b/app/model_utils.py new file mode 100644 index 0000000..1d17391 --- /dev/null +++ b/app/model_utils.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from django.db import models +import decimal +import datetime +import re + + +class Record(object): + def __init__(self, **kwargs): + for k in kwargs.keys(): + self.__setattr__(k, kwargs[k]) + + def __repr__(self): + return str(self.netto) + + +def strip_tail_spaces(self, *args, **kwargs): + atr= args[0] + ss= True + if len(atr)<=2: ss= False + if atr[0] == '_': ss= False + if atr[-1] == '_': ss= False + + if ss: + val= models.Model.__getattribute__(self, atr) + return val.strip() if val else '' + else: + val= models.Model.__getattribute__(self, *args, **kwargs) + return val + + +def poczatek_miesiaca(miesiac): + rok= int(miesiac[:4]) + msc= int(miesiac[5:]) + return datetime.date(year= rok, day= 1, month= msc) + + +def koniec_miesiaca(miesiac): + rok= int(miesiac[:4]) + msc= int(miesiac[5:]) + if msc == 12: + return datetime.date(year= rok, day= 31, month= 12) + else: + return datetime.date(year= rok, day= 1, month= msc+1) - datetime.timedelta(days=1) + + +def grosze(val): + """ + Zaokrąglenie do groszy. + """ + return decimal.Decimal(str(val)).quantize(decimal.Decimal('.01'), rounding= decimal.ROUND_HALF_UP) + + + +def kwota_format(val): + val= '{:.2f}'.format(val) + val= val.replace('.',',') + return '.'.join(re.findall('((?:\d+\,)?(?:\d{1,3}\-?))', val[::-1]))[::-1] + diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..0de8499 --- /dev/null +++ b/app/models.py @@ -0,0 +1,1171 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +import decimal +from io import StringIO, BytesIO + +from django.db import models +from django.conf import settings +from django.core.urlresolvers import reverse + +from django.db.models import Q, Max +from django.contrib.auth.models import User +from django.dispatch import receiver +from django.template.loader import render_to_string + +from app import model_fields +import lxml.etree as ET + +import datetime +import re +import json + +from . import utils +from fk.models import Spo, SysPar + +import logging +from app.templatetags.utils import kwota_pl +logger= logging.getLogger(__name__) + + +DEKLARACJA_VAT= [ + ('M', 'Miesięczna'), + ('K', 'Kwartalna') +] + + +class Firma(models.Model): + """ + Dane firmy. + """ + + oznaczenie= models.CharField(max_length= 10, unique= True) + db_ostatnia= models.CharField(max_length= 20) + db_rok= models.IntegerField() + + nip= models.CharField('NIP', max_length=10) + nazwa= models.CharField('Nazwa', max_length= 100) + adres= models.CharField('Adres', max_length= 50, null= True, blank= True) + regon= models.CharField('Regon', max_length= 15, null= True, blank= True) + krs= models.CharField('Nr KRS', max_length= 11, null= True, blank= True) + wojewodztwo= models.CharField('Województwo', max_length= 20, null= True, blank= True) + powiat= models.CharField('Powiat', max_length= 50, null= True, blank= True) + gmina= models.CharField('Gmina', max_length= 50, null= True, blank= True) + ulica= models.CharField('Ulica', max_length= 30, null= True, blank= True) + nr_domu= models.CharField('Nr domu', max_length= 10, null= True, blank= True) + nr_lokalu= models.CharField('Nr lokalu', max_length= 5, null= True, blank= True) + miejscowosc= models.CharField('Miejscowość', max_length= 50, null= True, blank= True) + kod_pocztowy= models.CharField('Kod pocztowy', max_length= 6, null= True, blank= True) + poczta= models.CharField('Poczta', max_length= 50, null= True, blank= True) + kod_urzedu= models.CharField('Kod US', max_length= 4, null= True, blank= True) + email= models.CharField('Email', max_length= 50, null= True, blank= True) + telefon= models.CharField('Telefon', max_length= 16, null= True, blank= True) + ostatni_plik= models.ForeignKey('Plik', null= True, related_name= 'firma_ostatni', on_delete= models.SET_NULL) + api_url= models.CharField('Api URL', max_length= 100, null= True, blank= True) + api_auth= models.CharField('Klucz API', max_length= 100, null= True, blank= True) + + vat7= models.CharField('Deklaracja VAT', max_length= 1, choices= DEKLARACJA_VAT, null= True, blank= True) + + @staticmethod + def firmy(): + return Firma.objects.all().order_by('oznaczenie') + + def par_firmy(self, pole): + w= getattr(self, pole) + if isinstance(w, str) and w: + w=w.strip() + return w + + def ustaw_ostatni_plik(self): + plik_max_id= Plik.objects.filter(firma=self).aggregate(Max('id'))['id__max'] + self.ostatni_plik_id= plik_max_id if plik_max_id >0 else None + self.save() + + +class Plik(models.Model): + + firma= models.ForeignKey(Firma, null= True, on_delete= models.CASCADE) + kod= models.CharField('Kod pliku JPK', max_length=10) + dataod= models.DateField('Data Od') + datado= models.DateField('Data Do') + rachunek= models.CharField(max_length= 30, null= True, blank= True) + magazyn= models.CharField(max_length= 50, null= True, blank= True) + czesc= models.CharField('Miesiąc części', max_length= 7, null=True, blank= True) + utworzony= models.DateTimeField('Utworzony', default= datetime.datetime.now) + utworzony_user= models.CharField(max_length= 10, null= True) + xml= model_fields.CompressedTextField('Zawartość pliku JPK', null= True) + stan= models.CharField(max_length= 15, default= 'W KOLEJCE') + odkad= models.DateTimeField('Odkad', default= datetime.datetime.now) + task= models.CharField(max_length= 40, null= True) + upo= model_fields.CompressedTextField('UPO', null= True) + xls= model_fields.CompressedTextField('Plik kontrolny XLS', null= True) + nazwa= models.CharField('Nazwa', max_length= 100, null= True, blank= True) + cel_zlozenia= models.CharField(max_length= 1, default= "0") + wariant= models.CharField(max_length=1, default= "1") + wariant_dek= models.SmallIntegerField(default= 21) + kod_systemowy= models.CharField(max_length= 20, null= True) + wersja_schemy= models.CharField(max_length= 5, null= True) + korekta= models.CharField(max_length= 1, null= True) + + class Meta: + ordering= ['id'] + + def to_json(self): + """ + Konwersja nagłówka importu do postaci nadającej się do wyświetlenia + na liście faktur (z grupowaniem pól). + """ + return { + 'numer': self.id, + 'utworzony': self.utworzony.strftime('%Y-%m-%d %H:%M'), + 'kod': self.kod_systemowy[:7] if self.kod == 'JPK_VAT' and self.kod_systemowy else self.kod, + 'dataod': self.dataod.strftime('%Y-%m-%d'), + 'datado': self.datado.strftime('%Y-%m-%d'), + 'opis': self.opis(), + 'stan': self.stan, + 'czas': self.czas()[:7], + 'bledy': self.bledy_rodzaj() + } + + def czas(self): + if not self.jest_utworzony(): + return str(datetime.datetime.now() - self.odkad) + else: + return '00:00:00' + + def get_ctrl(self, tabela): + return self.podsumowania.get(tabela= tabela.lower()) + + def aktywa_ctrl(self): + return self.podsumowania.get(tabela= 'aktywa') + def pasywa_ctrl(self): + return self.podsumowania.get(tabela= 'pasywa') + def rzis_ctrl(self): + return self.podsumowania.get(tabela= 'rzis') + def kapital_ctrl(self): + return self.podsumowania.get(tabela= 'kapital') + def przeplywy_ctrl(self): + return self.podsumowania.get(tabela= 'przeplywy') + def podatek_ctrl(self): + return self.podsumowania.get(tabela= 'podatek') + + def zois_ctrl(self): + return self.podsumowania.get(tabela= 'zois') + def dziennik_ctrl(self): + return self.podsumowania.get(tabela= 'dziennik') + def konto_zapis_ctrl(self): + return self.podsumowania.get(tabela= 'konto_zapis') + + def sprzedaz_ctrl(self): + return self.podsumowania.get(tabela= 'sprzedaz') + def zakup_ctrl(self): + return self.podsumowania.get(tabela= 'zakup') + def deklaracja_ctrl(self): + return self.podsumowania.get(tabela= 'deklaracja') + + def faktura_ctrl(self): + return self.podsumowania.get(tabela= 'faktura') + def faktura_wiersz_ctrl(self): + return self.podsumowania.get(tabela= 'faktura_wiersz') + + def salda_ctrl(self): + return self.podsumowania.get(tabela= 'salda') + def wyciag_ctrl(self): + return self.podsumowania.get(tabela= 'wyciag') + + def pz_ctrl(self): + return self.podsumowania.get(tabela= 'pz') + def wz_ctrl(self): + return self.podsumowania.get(tabela= 'wz') + def rw_ctrl(self): + return self.podsumowania.get(tabela= 'rw') + def mm_ctrl(self): + return self.podsumowania.get(tabela= 'mm') + + def od_msc(self): + return self.dataod.strftime('%Y/%m') + def do_msc(self): + return self.datado.strftime('%Y/%m') + def okres(self): + pocz= self.od_msc() + konc= self.do_msc() + return pocz if pocz == konc else '{}/{}-{}'.format(pocz[:4], pocz[5:], konc[5:]) + + def od_msc2(self): + return self.dataod.strftime('%m') + def od_rok(self): + return self.dataod.strftime('%Y') + + def rok_01(self, dataod= None): + """ + Pierwszy miesiąc roku, którego dotyczy plik. + """ + if not dataod: + dataod= self.dataod + + return dataod.strftime('%Y/01') + + def set_stan(self, nowy_stan, save= False): + if nowy_stan == 'PENDING': nowy_stan= 'W KOLEJCE' + if nowy_stan == 'STARTED': nowy_stan= 'TWORZENIE' + + if nowy_stan != self.stan: + self.odkad= datetime.datetime.now() + self.stan= nowy_stan + + if save: + self.save(update_fields=['stan', 'odkad']) + + def nazwa_pliku(self, sufiks= None): + if SysPar._bra(): + nazwa= '{}-{}-{:02d}'.format(self.firma.oznaczenie, self.kod, self.dataod.month) + else: + nazwa= '{}-{:02d}'.format(self.kod, self.dataod.month) + if sufiks: + nazwa += '-'+sufiks.lower() + return nazwa + + def rach(self): + return self.rachunek[2:4]+' '+self.rachunek[4:8]+' ... '+self.rachunek[-4:] + + def par_firmy(self, pole= None): + if not pole: + return {k:v.strip() if isinstance(v,str) else v for k,v in self.firma.__dict__.items()} + + w= getattr(self.firma, pole) + if isinstance(w, str) and w: + w= w.strip() + return w + + def _firma(self): + return self.firma.oznaczenie + + def firma_(self): + return self.firma.oznaczenie + + def db_name(self, year): + prefiks= re.sub('\d\d$', '', self.par_firmy('db_ostatnia')) + return '{}{:02d}'.format(prefiks, year%100) + + def fkdbs(self, gdzie= None, dataod= None): + """ + Ustalenie bazy danych dla danego pliku (w zależności od daty początkowej pliku). + """ + if not dataod: + dataod= self.dataod + + if dataod.year >= self.par_firmy('db_rok'): + _fkdbs= self.par_firmy('db_ostatnia') + else: + _fkdbs= self.db_name(dataod.year) + + self.fkdbs_msg(gdzie, _fkdbs) + + if not settings.DATABASES.get(_fkdbs): + settings.DODAJ_BAZE(_fkdbs) +# raise Exception('Niepoprawna baza danych {}'.format(_fkdbs)) + + return _fkdbs + + def fkdbs_1(self, gdzie= None, dataod= None): + """ + Ustalenie bazy danych poprzedniego roku + """ + if not dataod: + dataod= self.dataod + + if settings.DEVDBS.get(dataod.year) or settings.DATABASES.get(self.db_name(dataod.year)) or SysPar._bra(): + # Jeżeli jest bieżąca developerska lub produkcyjna to poprzednia + dbs= self.db_name(dataod.year-1) + else: + # W przeciwnym razie cofamy się o dwa lata + dbs= self.db_name(dataod.year-2) + + if not settings.DATABASES.get(dbs): + settings.DODAJ_BAZE(dbs) + + self.fkdbs_msg(gdzie, dbs) + + return dbs + + def fkdbs_msg(self, gdzie, _fkdbs): + if not hasattr(self, '_fkdbs_msg'): + self._fkdbs_msg= [] + + msg= gdzie+' '+_fkdbs + + if not msg in self._fkdbs_msg: + self._fkdbs_msg.append(msg) + logger.info(msg) + + def podmiot(self): + return self.par_firmy() + + def init_slo(self, nr_slo): + if not hasattr(self, '_spo') or not self._spo: + self._spo= {} + + if not self._spo.get(nr_slo): + self._spo[nr_slo]= {spo[0].strip(): (spo[1].strip() if spo[1] else '') for spo in Spo.objects.using(self.fkdbs('Plik.init_slo '+nr_slo)).filter(nr_slo= nr_slo).values_list('spokod', 'pnazwa').order_by('spokod')} + + def slownik(self, nr_slo): + self.init_slo(nr_slo) + return self._spo[nr_slo] + + def oczekiwanie(self): + return self.stan in ('W KOLEJCE', 'TWORZENIE') + + def mag(self): + m= '{} {}'.format(self.magazyn[:3], self.magazyn[12:]) + return m[:15] if len(m)>15 else m + + def mag3(self): + return self.magazyn[:3] + + def opis(self): + if self.nazwa: return self.nazwa + + if self.rachunek: opi= self.rach() + elif self.magazyn: opi= self.mag() + else: opi= {'JPK_KR': 'Księgi rachunkowe', + 'JPK_VAT': 'Rozliczenie VAT', + 'JPK_FA': 'Faktury sprzedaży', + 'JPK_SF': 'Sprawozdanie finansowe' + }.get(self.kod) + + if self.kod == 'JPK_SF': + opi += ' {}'.format(self.datado.year) + + if self.kod == 'JPK_VAT' and self.wariant >= '4' and self.z_deklaracja(): + opi= 'Rozliczenie VAT z deklaracją' + + if (self.kod == 'JPK_VAT' and self.wariant == '3' and self.cel_zlozenia > '0') or \ + (self.kod == 'JPK_VAT' and self.wariant >= '4' and self.cel_zlozenia > '1') or \ + self.cel_zlozenia > '1': + opi += ' - KOREKTA' + return opi + + def jest_kontrolka(self): + return self.storage_set.all().exists() + + def jest_wyslany(self): + storage= self.storage_set.all() + if not storage: return False + storage= storage[0] + return storage.init_time is not None + + def jest_utworzony(self): + return not self.stan in ('W KOLEJCE', 'TWORZENIE', 'PROBLEMY') + + def jpk_sprawozdania(self): + return self.kod == 'JPK_SF' + + def jpk_v7(self): + return self.kod == 'JPK_VAT' and self.wariant >= '4' + + def status(self): + return self.status + + def document_type(self): + """ + Typ pliku do initupload.xml. + Na razie ustawione na stałe, że VAT jest wysyłany cyklicznie a + pozostałe adhoc. + """ + return 'JPK' if self.kod == 'JPK_VAT' else 'JPKAH' + + def blad(self, zrodlo, dokument, opis, level= 'error'): + Blad.objects.create(jpk= self, zrodlo= zrodlo, dokument= dokument, blad= opis, level= level) + + def bledy(self): + return self.blad_set.filter().exists() + + def bledy_warn(self): + return self.blad_set.filter(level='warn').exists() + + def bledy_error(self): + return self.blad_set.filter(level='error').exists() + + def bledy_rodzaj(self): + if self.bledy_error(): return 'error' + if self.bledy_warn(): return 'warn' + return None + + def nietykalny(self): + """ + Sprawdzenie czy plik jest nietykalny, tzn. nie może być usunięty, regenerowany + czy w jakikolwiek sposób inaczej zmodyfikowany, bo został dostarczony do MF + lub jest w trakcie przetwrzania. + """ + if self.upo: return True + if self.stan == 'SPRAWDZANY': return True + + storage= self.storage_set.all() + if not storage: return False + storage= storage[0] + if not storage: return False + + status= storage.status() + if not status: return False + + rc= status.json().get('Code') in (120, 301, 302, 303) + return rc + + def sf_mozna_usunac(self): + """ + Sprawdzenie czy plik sprawozdania można usunąć. + Sprawozdanie można usunąć jeżeli nie jest ostatnim sprawozdaniem w + danej firmie. + """ + if not self.jpk_sprawozdania(): + return True + + # Plik jest sprawozdaniem + + # Można go usunąć jeżeli nie jest ostatniem sprawozdaniem + # Przynajmniej jedno sprawozdanie musi zostać ponieważ firma + # może mieć specjalne formuły wyznaczania obrotów + return Plik.objects.filter(firma= self.firma, kod='JPK_SF').count() > 1 + + def podpisany(self): + return self.stan == 'PODPISANY' + + + def ustal_cel_zlozenia(self): + """ + Ustalenie czy plik jest "normalny" czy może jest korektą. + Zakładamy, że jeżeli istnieje już dostarczony plik o takim samym kodzie + i okresie to ten plik jest korektą. + """ + max_cel= Plik.objects.filter(Q(dataod= self.dataod) | Q(datado= self.datado), + firma= self.firma, + kod= self.kod, + stan= 'DOSTARCZONY').aggregate(Max('cel_zlozenia')) + + # W JPK_VAT wersji 4 1-złożenie, 2-korekta + if self.kod == 'JPK_VAT' and self.wariant >= '4': + return '2' if (max_cel and max_cel['cel_zlozenia__max']) else '1' + + if max_cel and max_cel['cel_zlozenia__max']: + max_cel= max_cel['cel_zlozenia__max'] + return str(int(max_cel)+1) + else: + return '0' if self.kod == 'JPK_VAT' else '1' + + + def sprawdz_podpis(self, xades_xml, storage): + """ + Sprawdzenie czy wgrany podpisany plik kontrolny jest podpisem do ostatnio + wygenerowanego pliku kontrolnego. + """ + from io import StringIO + + root= ET.parse(StringIO(re.sub(' encoding="UTF-8"', '', xades_xml))) + expression= ET.XPath('/InitUpload/EncryptionKey') + results= expression.evaluate(root) + + print(results) + print(results[0].text) + + + def get_storage(self): + """ + Ustalenie storage danego pliku JPK. + """ + storage= self.storage_set.all() + return storage[0] if storage else None + + + def get_status(self): + """ + Przygotowanie/ustalenie informacji o aktualny statusie pliku do + prezentacji/wyświetlenia w rozwinięciu wiersza pliku. + Prezentowany jest tylko ostatni status pliku. + """ + + self.status= {} + + # Ustalenie informacji o wysyłce + storage= self.storage_set.all() + + # Jeżeli plik nie był wysyłany to informacja o utworzeniu lub błędach podczas tworzenia + if not storage or self.stan in ('W KOLEJCE', 'TWORZENIE', 'PROBLEMY', 'GOTOWY', 'PODPISANY'): + if self.xml: + self.status['title']= 'Plik został utworzony' + self.status['time']= self.utworzony + self.status['user']= self.utworzony_user + else: + self.status['title']= 'Błąd podczas tworzenia pliku. Spróbuj ponownie.' if self.kod!='JPK_SF'else 'Tryb edycji/przygotowywania danych' + self.status['time']= self.utworzony + self.status['user']= self.utworzony_user + return self.status + + # Ostatnia wysyłka + storage= storage[0] + + # Tylko wygenerowano plik kontrolny + if not storage.init_code: + self.status['title']= 'Wygenerowano plik kontrolny/uwierzytelniający' + self.status['time']= storage.sign_time + self.status['user']= storage.sign_user + return self.status + + # Błąd podczas initupload + if storage.init_code != 200: + self.status['title']= '{} - Błąd przy wysyłaniu pliku kontrolnego'.format(storage.init_code) + txt= json.loads(storage.init_text) + try: + self.status['msg']= '{} - {}'.format(txt.get('Code'), txt.get('Message')) + except: + self.status['msg']= 'Błąd ustalania kodu/tekstu błędu' + self.status['time']= storage.init_time + self.status['user']= storage.init_user + return self.status + + # Błąd podczas wysyłki pliku jpk.XML + if storage.put_code != 201: + self.status['title']= '{} - Błąd przy wysyłaniu zaszyfrowanego pliku JPK'.format(storage.put_code) + try: + self.status['msg']= '{} - {}'.format(storage.put().get('Error').get('Code')[0].get('text'), + storage.put().get('Error').get('Message')[0].get('text')) + except: + self.status['msg']= 'Błąd ustalania kodu/tekstu błędu' + self.status['time']= storage.put_time + self.status['user']= storage.put_user + return self.status + + # Błąd podczas kończenia sesji (mało prawdopodobny) + if storage.finish_code != 200: + errors= storage.finish().get('Errors','') + if errors: + errors= ', '.join(errors) + self.status['title']= '{} - Błąd przy kończeniu sesji wysyłania pliku JPK'.format(storage.finish_code) + try: + self.status['msg']= '{} - {}. {}'.format(storage.finish_code, + storage.finish().get('Message'), + errors) + except: + self.status['msg']= 'Błąd ustalania kodu/tekstu błędu' + self.status['time']= storage.finish_time + self.status['user']= storage.finish_user + return self.status + + # Sesja wysyłki zakończona pomyślnie + + # Sprawdzenie statusu (ostatniego) + status= storage.status() + + # Błędy podczas przetwarzania + if status.code != 200: + errors= status.json().get('Errors','') + if errors: + errors= ', '.join(errors) + self.status['title']= '{} - Błąd przy sprawdzaniu statusu wysyłania pliku JPK'.format(status.code) + try: + self.status['msg']= '{}. {}'.format( + status.json().get('Message'), + errors) + except: + self.status['msg']= 'Błąd ustalania kodu/tekstu błędu' + self.status['time']= status.time + self.status['user']= status.user + return self.status + + # Plik w trakcie przetwarzania + if status.json().get('Code') in (120, 301, 302, 303): + try: + self.status['title']= '{} - Plik JPK został przesłany, trwa weryfikacja'.format(status.json().get('Code')) + self.status['msg']= '{} - {}. {}'.format(status.json().get('Code'), + status.json().get('Description'), + status.json().get('Details','')) + except: + self.status['msg']= 'Błąd ustalania kodu/tekstu błędu' + self.status['time']= status.time + self.status['user']= status.user + return self.status + + # Przetwarzanie zakończone błędem + if status.json().get('Code') != 200: + try: + self.status['title']= '{} - Plik JPK nieprzyjęty z powodu błędów'.format(status.json().get('Code')) + self.status['msg']= '{} - {}. {}'.format(status.json().get('Code'), + status.json().get('Description'), + status.json().get('Details','')) + except: + self.status['msg']= 'Błąd ustalania kodu/tekstu błędu' + self.status['time']= status.time + self.status['user']= status.user + return self.status + + # Plik dostarczony pomyślnie (musi być UPO) + self.status['title']= 'Plik JPK został poprawnie dostarczony.' + try: + self.status['msg']= '{} - {}. {} (wydruk)'.format( + status.json().get('Code'), + status.json().get('Description'), + reverse('jpk-upo', args=[self.id]), + status.json().get('Details',''), + reverse('jpk-upo-wydruk', args=[self.id]) + ) + except: + self.status['msg']= 'Błąd ustalania kodu/tekstu błędu' + self.status['time']= status.time + self.status['user']= status.user + + return self.status + + def deklaracja_xml(self): + """ + Wygenerowanie XML deklaracji na podstawie pozycji deklaracji zapisanych w modelu Deklaracja. + Wygenerowany XML wpisywany jest we właściwe miejsce głównego XML pliku JPK_VAT. + """ + + if not self.z_deklaracja(): + return + + # Wykonanie obliczeń + Deklaracja.przygotowanie(self) + + deklaracja= Deklaracja.objects.filter(jpk= self).order_by('numer') + + context= {'jpk': self, 'deklaracja': deklaracja} + xml_wariant= 'deklaracja' + self.wariant + + dek_xml= render_to_string('app/xml/vat/{}.xml'.format(xml_wariant), context) + + """ + dom= ET.parse(StringIO(re.sub(' encoding="UTF-8"', '', self.xml))) + prefix_map = {"pf": "http://crd.gov.pl/wzor/2020/03/06/9196/"} + ps_el = dom.find(".//{http://crd.gov.pl/wzor/2020/03/06/9196/}PozycjeSzczegolowe", prefix_map) + ps_xml = ET.XML(dek_xml) + ps_el.getparent().replace(ps_el, ps_xml) + self.xml= '' + ET.tostring(dom).decode() + """ + + self.xml= re.sub('.*', dek_xml, self.xml) + + # Jeżeli to jest tylko korekta deklaracji to usuwamy ewidencję + # Oryginalnie ewidencja musi być wygenerowana bo na jej podstawie tworzona jest deklaracja + if self.kod_systemowy and self.kod_systemowy[:6] == 'JPK_V7' and self.cel_zlozenia == '2': + if self.korekta == 'E': + self.xml= re.sub('.*', '', self.xml, flags=re.S|re.DOTALL) + if self.korekta == 'D': + self.xml= re.sub('.*', '', self.xml, flags=re.S|re.DOTALL) + + self.save() + + # Aktualizacja podsumowania deklaracji + + sprzedaz= self.sprzedaz_ctrl() + zakup= self.zakup_ctrl() + ctrl= self.deklaracja_ctrl() + + p_51= Deklaracja.ustal(self, 51) + + if p_51.kwota > 0: + ctrl.suma1= p_51.kwota + else: + p_53= Deklaracja.ustal(self, 53) + if p_53.kwota > 0: + ctrl.suma1= p_53.kwota + + ctrl.wiersze= sprzedaz.wiersze + zakup.wiersze + ctrl.save() + + def z_deklaracja(self): + # Dla JPK_V7K deklaracja tylko w ostatnim miesiacu kwartału + if self.kod_systemowy.startswith('JPK_V7K') and not self.od_msc2() in (3, 6, 9, 12): + return False + # Tylko korekta ewidencji (bez deklaracji) + if self.korekta == 'E': + return False + return True + + def z_ewidencja(self): + # Tylko korekta deklaracji (bez ewidencji) + if self.korekta == 'D': + return False + return True + + def v7_okres(self): + if self.kod == 'JPK_VAT' and self.wariant >= '4' and self.kod_systemowy: + return self.kod_systemowy[6:7] + return '' + + def v7_kwartalny(self): + return self.kod_systemowy and self.kod_systemowy[:7] == 'JPK_V7K' + + def v7_miesieczny(self): + return not self.v7_kwartalny() + + def pf(self): + return '9394' if self.v7_kwartalny() else '9393' + + + +class Ctrl(models.Model): + """ + Podsumowanie dla grupy elementów powtarzalnych (tabeli). + """ + plik= models.ForeignKey('Plik', on_delete= models.CASCADE, related_name= 'podsumowania') + tabela= models.CharField('Tabela', max_length= 20) + wiersze= models.IntegerField('Wiersze', default= 0) + suma1= models.DecimalField(max_digits= 16, decimal_places= 2, default= 0.0) + suma2= models.DecimalField(max_digits= 16, decimal_places= 2, default= 0.0) + xls= model_fields.CompressedTextField('Arkusz kontrolny XLS', null= True) + + class Meta: + unique_together= ['plik', 'tabela'] + + def save_xls(self, xls): + self.xls= xls + self.save() + + + +class Wyciag(models.Model): + + nr_rachunku= models.CharField('Nr rachunku', max_length= 28) + nr_wyciagu= models.IntegerField('Nr wyciagu') + waluta= models.CharField('Waluta', max_length= 3) + kod= models.CharField('Kod operacji', max_length= 4) + + data= models.DateField('Data operacji') + kwota= models.DecimalField(max_digits= 16, decimal_places= 2, default= 0.0) + opis= models.CharField('Opis operacji', max_length= 255) + podmiot= models.CharField('Nazwa podmiotu', max_length= 255) + + saldo= models.DecimalField(max_digits= 16, decimal_places= 2, default= 0.0) + + def __str__(self): + return '[nr_rachunku: {}, nr_wyciagu: {}, waluta: {}, kod: {}, data: {}, kwota: {}, opis: {}, podmiot: {}, saldo: {}'.format( + self.nr_rachunku, + self.nr_wyciagu, + self.waluta, + self.kod, + self.data, + self.kwota, + self.opis, + self.podmiot, + self.saldo) + + @staticmethod + def rachunek_pp(rachunek): + return ' '.join(re.findall('.{4}', rachunek)) + + @staticmethod + def rachunki(): + rachunki= Wyciag.objects.values_list('nr_rachunku', flat=True).order_by('nr_rachunku').distinct() + return [Wyciag.rachunek_pp(x) for x in rachunki] + + @staticmethod + def testowe(*args, **kwargs): + pola= {} + pola.update(dict(zip(('nr_rachunku', 'nr_wyciagu', 'data', 'kwota', 'saldo', 'podmiot', 'opis'), args))) + pola.update(kwargs) + + return Wyciag.objects.create(**pola) + + + +class Storage(models.Model): + """ + Przechowywanie informacji o procesie wysyłania pliku JPK. + """ + jpk= models.ForeignKey('Plik', on_delete= models.CASCADE) + + sign_time= models.DateTimeField(default= datetime.datetime.now) + sign_xml= model_fields.CompressedTextField('Plik do podpisania') + sign_user= models.CharField(max_length= 10) + + aes_key= models.CharField(max_length= 44) + enc_key= models.TextField() + aes_iv= models.CharField(max_length= 24) + jpk_aes= model_fields.CompressedTextField('Plik do wysłania') + + xml_name= models.CharField(max_length= 20) + xml_len= models.IntegerField() + xml_hash= models.CharField(max_length= 44) + + zip_name= models.CharField(max_length= 20) + zip_len= models.IntegerField() + zip_hash= models.CharField(max_length= 24) + + bramka= models.CharField(max_length= 1, default= 'P') + + xades_time= models.DateTimeField(null= True) + xades_xml= model_fields.CompressedTextField('Plik podpisany', null= True) + xades_user= models.CharField(max_length= 10, null= True) + + init_time= models.DateTimeField(null= True) + init_code= models.IntegerField(null= True) + init_text= model_fields.CompressedTextField('Odpowiedź na InitUploadSigned', null= True) + init_user= models.CharField(max_length= 10, null= True) + + put_time= models.DateTimeField(null= True) + put_code= models.IntegerField(null= True) + put_text= model_fields.CompressedTextField('Odpowiedź na Upload', null= True) + put_user= models.CharField(max_length= 10, null= True) + + finish_time= models.DateTimeField(null= True) + finish_code= models.IntegerField(null= True) + finish_text= model_fields.CompressedTextField('Odpowiedź na FinishUpload', null= True) + finish_user= models.CharField(max_length= 10, null= True) + + reference= models.CharField(max_length= 32, null= True) + + class Meta: + ordering= ['-id'] + + + def status(self): + statusy= self.status_set.all() + return statusy[0] if statusy else {} + + def init(self): + return json.loads(self.init_text) + + def put(self): + return utils.dictify(ET.fromstring(self.put_text.encode('utf-8'))) if self.put_text else {} + + def finish(self): + return json.loads(self.finish_text) + + def check_upload_status(self): + """ + Ustalenie czy powinno być wykonane następne sprawdzenie statusu. + """ + + # Jak wyłożył się wcześnij to nie ma co sprawdzać + if self.init_code and self.init_code != 200: return False + if self.put_code and self.put_code != 201: return False + if self.finish_code and self.finish_code != 200: return False + + # Jak wysyłka OK to sprawdzamy status + status= self.status() + if not status: + return True + + code= status.json().get('Code') + if not code: + return False + + rc= code in (100, 101, 102, 120, 301, 302, 303) + return rc + + def reset_upload(self, save= False): + """ + Czyszczenie poprzednich danych o przesyłaniu + Nie są potrzebne skoro robimy nowe przesłanie + Może jednak te dane by się przydały? + Można w tym miejscu (jeżeli było już wysyłanie), utworzyć nowy storage + """ + + self.status_set.all().delete() + + self.init_code= None + self.init_time= None + self.init_text= None + + self.put_code= None + self.put_time= None + self.put_text= None + + self.finish_code= None + self.finish_time= None + self.finish_text= None + + if save: + self.save() + + if self.jpk.upo: + self.jpk.upo= None + self.jpk.save() + + def interfejs_produkcyjny(self): + return self.bramka == 'P' + + def interfejs_testowy(self): + return self.bramka == 'T' + + + +class Status(models.Model): + """ + Informacja o sprawdzeniu statusu. + """ + storage= models.ForeignKey(Storage, on_delete= models.CASCADE) + + time= models.DateTimeField(default= datetime.datetime.now) + code= models.IntegerField() + text= model_fields.CompressedTextField('Odpowiedź na Status', null= True) + user= models.CharField(max_length= 10) + + class Meta: + ordering= ['-id'] + + def json(self): + return json.loads(self.text) + + def upo_xml(self): + stat= json.loads(self.text) + if not stat: return '' + return stat['Upo'] + + + +class Blad(models.Model): + jpk= models.ForeignKey('Plik', on_delete= models.CASCADE) + + zrodlo= models.CharField(max_length= 10) + dokument= models.CharField(max_length= 20) + blad= models.TextField() + level= models.CharField(max_length= 10, default= 'error') + + class Meta: + ordering= ['id'] + + def klasa_css(self): + return 'danger' if self.level == 'error' else '' + + + +class UserProfile(models.Model): + """ + Dodatkowe dane użytkowników. + """ + + user= models.OneToOneField(User, related_name='profile') + """Użytkownik, którego dane zawiera pozycja""" + job_id= models.IntegerField(null= True) + + @staticmethod + def nowy(user): + profile= UserProfile(user= user) + profile.save() + + @staticmethod + def get(request): + user= request.user + try: + profil= user.profile + except UserProfile.DoesNotExist: + profil= UserProfile.nowy(user) + return profil + + +# from users import email_new_user, email_group_changed + +@receiver(models.signals.post_save, sender= User, dispatch_uid="post_save_user") +def post_save_user(sender, instance, created, **kwargs): + + user= instance + if created: + profile= UserProfile.nowy(user) + else: + try: + profile= user.profile + except UserProfile.DoesNotExist: + profile= UserProfile.nowy(user) + + + +class Deklaracja(models.Model): + """ + Pozycje deklaracji VAT-7. + Informacja o wersji deklaracji zapisana jest w pliku jpk. + """ + jpk= models.ForeignKey('Plik', on_delete= models.CASCADE) + + # C - podatek należny, D - podatek naliczony, E - zobowiązanie/zwrot, F - informacje dodatkowe + grupa= models.CharField('Grupa', max_length= 1) + # Lp pozycji lub pierwszej kwoty (jeżeli są dwie to mają lp, lp+1) + numer= models.SmallIntegerField() + # Nazwa/opis pozycji deklaracji + nazwa= models.CharField('Nazwa', max_length= 255) + # kk, k0, 0k, w, t + rodzaj= models.CharField('Rodzaj', max_length= 1) + # W przypadku gdy element nie jest postaci P_lp + element= models.CharField('Element', max_length= 30, null= True, blank= True) + + # Podstawa lub podatek + kwota= models.DecimalField('Kwota1', max_digits= 16, decimal_places= 2, default= 0.0) + # Flaga/wybór + wybor= models.BooleanField('Wybor', default= False) + # Pole tekstowe + tekst= model_fields.CompressedTextField('Opis zasad', null= True) + + def podstawa_nie_zero(self): + """ + Sprawdzenie czy podstawa danego elementu jest niezerowa. + """ + if self.rodzaj == '2': + poprzednia= Deklaracja.objects.filter(jpk=self.jpk, numer= self.numer-1, rodzaj= '1') + if not poprzednia: + return False + + return poprzednia[0].kwota + + return False + + def p_element(self): + return self.element or "P_{}".format(self.numer) + + @staticmethod + def przygotowanie(jpk): + """ + Przygotowanie deklaracji po utworzeniu pliku jpk. + W tym momencie w deklaracji są tylko pozycje pochodzące z ewidencji. + Trzeba je zaokrąglić do pełnych zł. + I utworzyć podsumowania. + """ + + # Utworzenie wszystkich brakujących pozycji deklaracji + + for poz in DeklaracjaPoz.objects.filter(wariant= jpk.wariant_dek): + dek= Deklaracja.objects.filter(jpk=jpk, numer= poz.numer) + if not dek: + dek= DeklaracjaPoz.pozycja_deklaracji(jpk, poz.numer) + dek.save() + + # Wyznaczenie podsumowania sekcji C i D + + c_podstawa= decimal.Decimal(0.00) + c_podatek= decimal.Decimal(0.00) + + d_podatek= decimal.Decimal(0.00) + + for dek in Deklaracja.objects.filter(jpk= jpk, rodzaj__in= ('1', '2'), grupa__in=('C', 'D')): + + if dek.numer in (37, 38, 48): # to są podsumowania + continue + + poz= DeklaracjaPoz.objects.get(wariant= jpk.wariant_dek, numer= dek.numer) + + dek.kwota= utils.zlote(dek.kwota) + + if poz.grupa == 'C' and poz.rodzaj == '1' and poz.sumowanie: + c_podstawa += dek.kwota if poz.sumowanie == '+' else -dek.kwota + if poz.grupa == 'C' and poz.rodzaj == '2' and poz.sumowanie: + c_podatek += dek.kwota if poz.sumowanie == '+' else -dek.kwota + if poz.grupa == 'D' and poz.rodzaj == '2' and poz.sumowanie: + d_podatek += dek.kwota if poz.sumowanie == '+' else -dek.kwota + + dek.save() + + # Zapisanie podsumowania sekcji C i D + + for dek in Deklaracja.objects.filter(jpk= jpk, numer__in=(37, 38, 48)): + if dek.numer == 37: + dek.kwota= c_podstawa + if dek.numer == 38: + dek.kwota= c_podatek + if dek.numer == 48: + dek.kwota= d_podatek + dek.save() + + Deklaracja.przelicz_deklaracje(jpk) + + + @staticmethod + def przelicz_deklaracje(jpk): + + # Obliczenie wysokości zobowiązania + + p38= Deklaracja.ustal(jpk, 38).kwota + p48= Deklaracja.ustal(jpk, 48).kwota + + p49= Deklaracja.ustal(jpk, 49).kwota + p50= Deklaracja.ustal(jpk, 50).kwota + + p52= Deklaracja.ustal(jpk, 52).kwota + p54= Deklaracja.ustal(jpk, 54).kwota + p60= Deklaracja.ustal(jpk, 60).kwota + + if p38 > p48: + p51= p38 - p48 - p49 -p50 + else: + p51= 0 + + if p48 > p38: + p53= p48 - p38 + p52 + else: + p53= 0 + + p62= p53 - p54 - p60 + + Deklaracja.zapisz(jpk, 51, p51) + Deklaracja.zapisz(jpk, 53, p53) + Deklaracja.zapisz(jpk, 62, p62) + + + @staticmethod + def ustal(jpk, numer): + """ + Wczytanie podanej pozycji deklaracji. + Jeżeli pozycja nie istnieje to jest tworzona. + """ + dek= Deklaracja.objects.filter(jpk=jpk, numer= numer) + if not dek: + dek= DeklaracjaPoz.pozycja_deklaracji(jpk, numer) + dek.save() + else: + dek= dek[0] + + return dek + + @staticmethod + def zapisz(jpk, numer, wartosc): + """ + Zapisanie podanej kwoty w podanej pozycji deklaracji. + """ + dek= Deklaracja.ustal(jpk, numer) + + if dek.rodzaj == 'W': + dek.wybor= wartosc + elif dek.rodzaj == 'T': + dek.tekst= wartosc + else: + dek.kwota= wartosc or 0 + + dek.save() + + + +class DeklaracjaPoz(models.Model): + wariant= models.SmallIntegerField(default= 21) + + # C - podatek należny, D - podatek naliczony, E - zobowiązanie/zwrot, F - informacje dodatkowe + grupa= models.CharField('Grupa', max_length= 1) + # Lp pozycji lub pierwszej kwoty (jeżeli są dwie to mają lp, lp+1) + numer= models.SmallIntegerField() + # kk, k0, 0k, w, t + rodzaj= models.CharField('Rodzaj', max_length= 1) + # Nazwa/opis pozycji deklaracji + nazwa= models.CharField('Nazwa', max_length= 255) + # W przypadku gdy element nie jest postaci P_lp + element= models.CharField('Element', max_length= 30, null= True, blank= True) + # Sposób sumowania dla elementów grup C, D + sumowanie= models.CharField('Sumowanie', max_length= 1, null= True, blank= True) + + strona= models.SmallIntegerField('Strona deklaracji', null= True, blank= True) + + x= models.SmallIntegerField(null= True) + y= models.SmallIntegerField(null= True) + + typ= models.CharField('Typ', max_length= 1, default= 'D') + + @staticmethod + def pozycja_deklaracji(jpk, numer): + """ + Inicjalizacja opisu pozycji deklaracji odpowiedniego wariantu, + na podstawie numeru lp. + """ + poz= DeklaracjaPoz.objects.get(wariant=jpk.wariant_dek, numer=numer) + + dek= Deklaracja(jpk= jpk, grupa= poz.grupa, numer= poz.numer, rodzaj= poz.rodzaj, nazwa= poz.nazwa, element= poz.element) + dek.kwota= 0 + dek.wybor= False + + return dek diff --git a/app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.css b/app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.css new file mode 100644 index 0000000..60bef77 --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.css @@ -0,0 +1,185 @@ +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_length select { + width: 75px; + display: inline-block; +} +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 8px; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1em 0; +} + +table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting, +table.dataTable thead > tr > td.sorting_asc, +table.dataTable thead > tr > td.sorting_desc, +table.dataTable thead > tr > td.sorting { + padding-right: 30px; +} +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} +table.dataTable thead .sorting:after, +table.dataTable thead .sorting_asc:after, +table.dataTable thead .sorting_desc:after, +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after { + position: absolute; + bottom: 8px; + right: 8px; + display: block; + font-family: 'Glyphicons Halflings'; + opacity: 0.5; +} +table.dataTable thead .sorting:after { + opacity: 0.2; + content: "\e150"; + /* sort */ +} +table.dataTable thead .sorting_asc:after { + content: "\e155"; + /* sort-by-attributes */ +} +table.dataTable thead .sorting_desc:after { + content: "\e156"; + /* sort-by-attributes-alt */ +} +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after { + color: #eee; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody table thead .sorting:after, +div.dataTables_scrollBody table thead .sorting_asc:after, +div.dataTables_scrollBody table thead .sorting_desc:after { + display: none; +} +div.dataTables_scrollBody table tbody tr:first-child th, +div.dataTables_scrollBody table tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, + div.dataTables_wrapper div.dataTables_filter, + div.dataTables_wrapper div.dataTables_info, + div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } +} +table.dataTable.table-condensed > thead > tr > th { + padding-right: 20px; +} +table.dataTable.table-condensed .sorting:after, +table.dataTable.table-condensed .sorting_asc:after, +table.dataTable.table-condensed .sorting_desc:after { + top: 6px; + right: 6px; +} + +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} +table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 0; +} +table.table-bordered.dataTable tbody th, +table.table-bordered.dataTable tbody td { + border-bottom-width: 0; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child { + padding-left: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child { + padding-right: 0; +} diff --git a/app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.min.css b/app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.min.css new file mode 100644 index 0000000..16ed637 --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/dataTables.bootstrap.min.css @@ -0,0 +1 @@ +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} diff --git a/app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.css b/app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.css new file mode 100644 index 0000000..24f8d04 --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.css @@ -0,0 +1,116 @@ +table.dataTable { + clear: both; + margin: 0.5em 0 !important; + max-width: none !important; + width: 100%; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper { + position: relative; +} +div.dataTables_wrapper div.dataTables_length label { + float: left; + text-align: left; + margin-bottom: 0; +} +div.dataTables_wrapper div.dataTables_length select { + width: 75px; + margin-bottom: 0; +} +div.dataTables_wrapper div.dataTables_filter label { + float: right; + margin-bottom: 0; +} +div.dataTables_wrapper div.dataTables_filter input { + display: inline-block !important; + width: auto !important; + margin-bottom: 0; + margin-left: 0.5em; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 2px; +} +div.dataTables_wrapper div.dataTables_paginate { + float: right; + margin: 0; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1rem 0; +} + +table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting, +table.dataTable thead > tr > td.sorting_asc, +table.dataTable thead > tr > td.sorting_desc, +table.dataTable thead > tr > td.sorting { + padding-right: 1.5rem; +} +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc { + cursor: pointer; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background-repeat: no-repeat; + background-position: center right; +} +table.dataTable thead .sorting { + background-image: url("../images/sort_both.png"); +} +table.dataTable thead .sorting_asc { + background-image: url("../images/sort_asc.png"); +} +table.dataTable thead .sorting_desc { + background-image: url("../images/sort_desc.png"); +} +table.dataTable thead .sorting_asc_disabled { + background-image: url("../images/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc_disabled { + background-image: url("../images/sort_desc_disabled.png"); +} + +div.dataTables_scrollHead table { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody table tbody tr:first-child th, +div.dataTables_scrollBody table tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot table { + margin-top: 0 !important; + border-top: none; +} diff --git a/app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.min.css b/app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.min.css new file mode 100644 index 0000000..9aef3da --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/dataTables.foundation.min.css @@ -0,0 +1 @@ +table.dataTable{clear:both;margin:0.5em 0 !important;max-width:none !important;width:100%}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper{position:relative}div.dataTables_wrapper div.dataTables_length label{float:left;text-align:left;margin-bottom:0}div.dataTables_wrapper div.dataTables_length select{width:75px;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter label{float:right;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter input{display:inline-block !important;width:auto !important;margin-bottom:0;margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:2px}div.dataTables_wrapper div.dataTables_paginate{float:right;margin:0}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1rem 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:1.5rem}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}div.dataTables_scrollHead table{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none} diff --git a/app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.css b/app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.css new file mode 100644 index 0000000..3397b7c --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.css @@ -0,0 +1,481 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; +} +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #acbad4; +} +table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { + background-color: #f6f6f6; +} +table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { + background-color: #aab7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #fafafa; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b4cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a8b5cf; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b7d1; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #fafafa; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fcfcfc; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fefefe; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #aebcd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { + background-color: #ececec; +} +table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { + background-color: #efefef; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { + background-color: #a2aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { + background-color: #a3b0c9; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { + background-color: #a5b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 4px 17px 4px 4px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 4px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; + border-radius: 2px; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333 !important; + border: 1px solid #979797; + background-color: white; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); + /* IE10+ */ + background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666 !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +.dataTables_wrapper .dataTables_paginate .ellipsis { + padding: 0 1em; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td { + vertical-align: middle; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #111; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table, +.dataTables_wrapper.no-footer div.dataTables_scrollBody table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} +table.dataTable thead th div.DataTables_sort_wrapper { + position: relative; +} +table.dataTable thead th div.DataTables_sort_wrapper span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -18px; +} +table.dataTable thead th.ui-state-default, +table.dataTable tfoot th.ui-state-default { + border-left-width: 0; +} +table.dataTable thead th.ui-state-default:first-child, +table.dataTable tfoot th.ui-state-default:first-child { + border-left-width: 1px; +} + +/* + * Control feature layout + */ +.dataTables_wrapper .dataTables_paginate .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .fg-button:active { + outline: none; +} +.dataTables_wrapper .dataTables_paginate .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.dataTables_wrapper .ui-widget-header { + font-weight: normal; +} +.dataTables_wrapper .ui-toolbar { + padding: 8px; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: none; +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: inherit; +} diff --git a/app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.min.css b/app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.min.css new file mode 100644 index 0000000..a1ec199 --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/dataTables.jqueryui.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}table.dataTable thead th div.DataTables_sort_wrapper{position:relative}table.dataTable thead th div.DataTables_sort_wrapper span{position:absolute;top:50%;margin-top:-8px;right:-18px}table.dataTable thead th.ui-state-default,table.dataTable tfoot th.ui-state-default{border-left-width:0}table.dataTable thead th.ui-state-default:first-child,table.dataTable tfoot th.ui-state-default:first-child{border-left-width:1px}.dataTables_wrapper .dataTables_paginate .fg-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .fg-button:active{outline:none}.dataTables_wrapper .dataTables_paginate .fg-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.dataTables_wrapper .dataTables_paginate .fg-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dataTables_wrapper .ui-widget-header{font-weight:normal}.dataTables_wrapper .ui-toolbar{padding:8px}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:none}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit} diff --git a/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.css b/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.css new file mode 100644 index 0000000..151b858 --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.css @@ -0,0 +1,452 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; + border-bottom: 1px solid #111; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; + border-top: 1px solid #111; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background-repeat: no-repeat; + background-position: center right; +} +table.dataTable thead .sorting { + background-image: url("../images/sort_both.png"); +} +table.dataTable thead .sorting_asc { + background-image: url("../images/sort_asc.png"); +} +table.dataTable thead .sorting_desc { + background-image: url("../images/sort_desc.png"); +} +table.dataTable thead .sorting_asc_disabled { + background-image: url("../images/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc_disabled { + background-image: url("../images/sort_desc_disabled.png"); +} +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #acbad4; +} +table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { + background-color: #f6f6f6; +} +table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { + background-color: #aab7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #fafafa; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b4cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a8b5cf; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b7d1; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #fafafa; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fcfcfc; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fefefe; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #aebcd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { + background-color: #ececec; +} +table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { + background-color: #efefef; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { + background-color: #a2aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { + background-color: #a3b0c9; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { + background-color: #a5b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 4px 17px 4px 4px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 4px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; + border-radius: 2px; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333 !important; + border: 1px solid #979797; + background-color: white; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); + /* IE10+ */ + background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666 !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +.dataTables_wrapper .dataTables_paginate .ellipsis { + padding: 0 1em; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td { + vertical-align: middle; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #111; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table, +.dataTables_wrapper.no-footer div.dataTables_scrollBody table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} diff --git a/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.min.css b/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.min.css new file mode 100644 index 0000000..781de6b --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} diff --git a/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables_themeroller.css b/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables_themeroller.css new file mode 100644 index 0000000..1426a44 --- /dev/null +++ b/app/static/DataTables/DataTables-1.10.12/css/jquery.dataTables_themeroller.css @@ -0,0 +1,416 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable thead td, +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 4px 10px; +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead th div.DataTables_sort_wrapper { + position: relative; + padding-right: 10px; +} +table.dataTable thead th div.DataTables_sort_wrapper span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -5px; +} +table.dataTable thead th.ui-state-default { + border-right-width: 0; +} +table.dataTable thead th.ui-state-default:last-child { + border-right-width: 1px; +} +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable th.center, +table.dataTable td.center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.right, +table.dataTable td.right { + text-align: right; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, +table.dataTable.display tbody tr.odd:hover, +table.dataTable.display tbody tr.even:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, +table.dataTable.display tbody tr.odd:hover.selected, +table.dataTable.display tbody tr.even:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, +table.dataTable.display tbody tr.odd:hover > .sorting_1, +table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, +table.dataTable.display tbody tr.odd:hover > .sorting_2, +table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, +table.dataTable.display tbody tr.odd:hover > .sorting_3, +table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 5px 9px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 5px 9px 3px 9px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px 5px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.55em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_paginate .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .fg-button:active { + outline: none; +} +.dataTables_wrapper .dataTables_paginate .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .ui-widget-header { + font-weight: normal; +} +.dataTables_wrapper .ui-toolbar { + padding: 8px; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} diff --git a/app/static/DataTables/DataTables-1.10.12/images_/sort_asc.png b/app/static/DataTables/DataTables-1.10.12/images_/sort_asc.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ba61a8055fcb18273f2468d335572204667b1f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*bWaz@5R22v2@;zYta_*?F5u6Q zWR@in#&u+WgT?Hi<}D3B3}GOXuX|8Oj3tosHiJ3*4TN zC7>_x-r1O=t(?KoTC+`+>7&2GzdqLHBg&F)2Q?&EGZ+}|Rpsc~9`m>jw35No)z4*} HQ$iB}HK{Sd literal 0 HcmV?d00001 diff --git a/app/static/DataTables/DataTables-1.10.12/images_/sort_asc_disabled.png b/app/static/DataTables/DataTables-1.10.12/images_/sort_asc_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..fb11dfe24a6c564cb7ddf8bc96703ebb121df1e7 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S0wixl{&NRX(Vi}jAsXkC6BcOhI9!^3NY?Do zDX;f`c1`y6n0RgO@$!H7chZT&|Jn0dmaqO^XNm-CGtk!Ur<_=Jws3;%W$<+Mb6Mw<&;$T1GdZXL literal 0 HcmV?d00001 diff --git a/app/static/DataTables/DataTables-1.10.12/images_/sort_both.png b/app/static/DataTables/DataTables-1.10.12/images_/sort_both.png new file mode 100644 index 0000000000000000000000000000000000000000..af5bc7c5a10b9d6d57cb641aeec752428a07f0ca GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S0wixl{&NRX6FglULp08Bycxyy87-Q;~nRxO8@-UU*I^KVWyN+&SiMHu5xDOu|HNvwzODfTdXjhVyNu1 z#7^XbGKZ7LW3XeONb$RKLeE*WhqbYpIXPIqK@r4)v+qN8um%99%MPpS9d#7Ed7SL@Bp00i_>zopr0H-Zb Aj{pDw literal 0 HcmV?d00001 diff --git a/app/static/DataTables/DataTables-1.10.12/images_/sort_desc.png b/app/static/DataTables/DataTables-1.10.12/images_/sort_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..0e156deb5f61d18f9e2ec5da4f6a8c94a5b4fb41 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*R8JSj5R22v2@yo z(czD9$NuDl3Ljm9c#_#4$vXUz=f1~&WY3aa=h!;z7fOEN>ySP9QA=6C-^Dmb&tuM= z4Z&=WZU;2WF>e%GI&mWJk^K!jrbro{W;-I>FeCfLGJl3}+Z^2)3Kw?+EoAU?^>bP0 Hl+XkKC^j|Q{b@g3TV7E(Grjn^aLC2o)_ptHrtUEoT$S@q)~)7U@V;W{6)!%@ u>N?4t-1qslpJw9!O?PJ&w0Cby<'col-sm-6'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-5'i><'col-sm-7'p>>", + renderer: 'bootstrap' +} ); + + +/* Default class modification */ +$.extend( DataTable.ext.classes, { + sWrapper: "dataTables_wrapper form-inline dt-bootstrap", + sFilterInput: "form-control input-sm", + sLengthSelect: "form-control input-sm", + sProcessing: "dataTables_processing panel panel-default" +} ); + + +/* Bootstrap paging button renderer */ +DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) { + var api = new DataTable.Api( settings ); + var classes = settings.oClasses; + var lang = settings.oLanguage.oPaginate; + var aria = settings.oLanguage.oAria.paginate || {}; + var btnDisplay, btnClass, counter=0; + + var attach = function( container, buttons ) { + var i, ien, node, button; + var clickHandler = function ( e ) { + e.preventDefault(); + if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) { + api.page( e.data.action ).draw( 'page' ); + } + }; + + for ( i=0, ien=buttons.length ; i 0 ? + '' : ' disabled'); + break; + + case 'previous': + btnDisplay = lang.sPrevious; + btnClass = button + (page > 0 ? + '' : ' disabled'); + break; + + case 'next': + btnDisplay = lang.sNext; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + case 'last': + btnDisplay = lang.sLast; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + default: + btnDisplay = button + 1; + btnClass = page === button ? + 'active' : ''; + break; + } + + if ( btnDisplay ) { + node = $('
  • ', { + 'class': classes.sPageButton+' '+btnClass, + 'id': idx === 0 && typeof button === 'string' ? + settings.sTableId +'_'+ button : + null + } ) + .append( $('', { + 'href': '#', + 'aria-controls': settings.sTableId, + 'aria-label': aria[ button ], + 'data-dt-idx': counter, + 'tabindex': settings.iTabIndex + } ) + .html( btnDisplay ) + ) + .appendTo( container ); + + settings.oApi._fnBindAction( + node, {action: button}, clickHandler + ); + + counter++; + } + } + } + }; + + // IE9 throws an 'unknown error' if document.activeElement is used + // inside an iframe or frame. + var activeEl; + + try { + // Because this approach is destroying and recreating the paging + // elements, focus is lost on the select button which is bad for + // accessibility. So we want to restore focus once the draw has + // completed + activeEl = $(host).find(document.activeElement).data('dt-idx'); + } + catch (e) {} + + attach( + $(host).empty().html('