From: kilian Date: Wed, 1 Apr 2020 16:12:59 +0000 (+0200) Subject: invoices X-Git-Tag: 0.7beta~18 X-Git-Url: http://cloud.dks.lu/git/?a=commitdiff_plain;h=d9d31cd05e6d27aa1c044a9c76ab5bfca2b51d2c;p=invoicejournal.git invoices --- diff --git a/dev/importfm.pl b/dev/importfm.pl index 52fbba4..c78fccd 100644 --- a/dev/importfm.pl +++ b/dev/importfm.pl @@ -29,7 +29,7 @@ foreach my $pd (sort {$a <=> $b} keys(%{$defschema})){ } my $dbobj= &getcoldef($defschema->{$pd}->{sql}); print "Table:".$defschema->{$pd}->{tbl_name}."\n"; - #print Dumper($dbobj); + print Dumper($dbobj); print "-------------------\n"; my $jsondata = ""; open(JSN,$jsonexportpath.'/'.$importfiles->{$defschema->{$pd}->{tbl_name}}); @@ -57,8 +57,8 @@ foreach my $pd (sort {$a <=> $b} keys(%{$defschema})){ $r->{$c} =~ s/^,/0./g; $r->{$c} =~ s/,/./g; } elsif ($dbobj->{$c} eq 'DATE'){ - my ($d,$m,$y) =~ $dbobj->{$c} =~ /^(\d\d)\.(\d\d).(\d\d\d\d)/; - $dbobj->{$c} = $y.'-'.$m.'-'.$d; + my ($d,$m,$y) = $r->{$c} =~ m/^(\d\d).(\d\d).(\d\d\d\d)$/; + $r->{$c} = "date('".$y.'-'.$m.'-'.$d."')"; } $rdata->{$kn} = $r->{$c}; } @@ -80,73 +80,21 @@ foreach my $pd (sort {$a <=> $b} keys(%{$defschema})){ $db->dbexec($sql[0]); } close(XDL); - # foreach my $pc (keys(%{$tcurcfg})){ - # if (($tcurcfg->{$pc}->{tbl_name} eq $defdbschemacfg->{$pd}->{tbl_name}) && ($tcurcfg->{$pc}->{type} eq $defdbschemacfg->{$pd}->{type})){ - # print $defdbschemacfg->{$pd}->{type}.": ".$defdbschemacfg->{$pd}->{tbl_name}. "\n"; - # if ($tcurcfg->{$pc}->{sql} ne $defdbschemacfg->{$pd}->{sql}){ - # $bupdate = 1; - - # } - # $bexists = 1; - # last; - # } - # } - # if (($bexists==1) && ($bupdate== 1)){ - # my $sql_installnew = $defdbschemacfg->{$pd}->{sql}; - # my $newobj = getcoldef($defdbschemacfg->{$pd}->{sql}); - # my @copycols = (); - # for my $x (keys(%{$newobj})){ - # if (exists($oldobj->{$x})) { - # push @copycols,$x; - # } - # } +} + +$db->dbexec("UPDATE invoices set direction ='in' WHERE direction='Eingang';"); +$db->dbexec("UPDATE invoices set direction ='out' WHERE direction='Ausgang';"); +$db->dbexec("update invoices set status='payed' WHERE status='bezahlt';"); +$db->dbexec("update invoices set status='planned' WHERE status='geplant';"); +$db->dbexec("update invoices set status='sended' WHERE status='verschickt';"); +$db->dbexec("update invoices set status='preparation' WHERE status='Vorbereitung';"); +$db->dbexec("update invoices set invoicetype='invoice' where invoicetype='Rechnung';"); +$db->dbexec("update invoices set invoicetype='creditnote' where invoicetype='Gutschrift';"); +$db->dbexec("update invoices set invoicetype='salary' where invoicetype='Gehalt';"); +$db->dbexec("update invoices set invoicetype='taxes' where invoicetype='Steuern';"); +$db->dbexec("update invoices set invoicetype='payroll' where invoicetype='Sozialabgaben';"); - # my @ainssql = (); - # push(@ainssql,"DROP TABLE IF EXISTS new_".$defdbschemacfg->{$pd}->{tbl_name}. ";"); - # my $sql_tmptbl = $sql_installnew; - # $sql_tmptbl =~ s/CREATE\ TABLE\ /CREATE TABLE new_/; - # $sql_tmptbl =~ s/"//g; - # push(@ainssql,$sql_tmptbl); - # if ($defdbschemacfg->{$pd}->{tbl_name} ne "accounting"){ - # push(@ainssql,"INSERT INTO new_".$defdbschemacfg->{$pd}->{tbl_name}." (".join(',',@copycols).") SELECT ".join(',',@copycols)." FROM ".$defdbschemacfg->{$pd}->{tbl_name}.";"); - # }elsif ((index($sql_tmptbl,"PRIMARY KEY (uuid)") > 0) && ($defdbschemacfg->{$pd}->{tbl_name} eq "accounting")) { - # # adding primary keys - # my $data = $db->dbquerysorted("select * from ".$defdbschemacfg->{$pd}->{tbl_name}.";"); - # push (@copycols,'uuid'); - # foreach my $da ( keys(%{$data})){ - # my @ndata = (); - # foreach my $x (@copycols){ - # if ($x eq "uuid"){ - # push(@ndata,create_uuid_as_string()); - # } else { - # push(@ndata,$data->{$da}->{$x}); - # } - # } - # push(@ainssql,"INSERT INTO new_".$defdbschemacfg->{$pd}->{tbl_name}." (".join(',',@copycols).") VALUES ('".join("','",@ndata)."');"); - # } - # } - # else { - # push(@ainssql,"INSERT INTO new_".$defdbschemacfg->{$pd}->{tbl_name}." (".join(',',@copycols).") SELECT ".join(',',@copycols)." FROM ".$defdbschemacfg->{$pd}->{tbl_name}.";"); - # } - # push(@ainssql,"DROP TABLE ".$defdbschemacfg->{$pd}->{tbl_name}.";"); - # push(@ainssql,"ALTER TABLE new_".$defdbschemacfg->{$pd}->{tbl_name}. " RENAME TO ".$defdbschemacfg->{$pd}->{tbl_name}.";"); - # $bvaccum = 1; - # print Dumper(@ainssql); - # my $stexec = 0; - # for(my $s=0;$sdbexec($ainssql[$s]); - # } - # } - # #print "tbl done\n"; - # } - # elsif ($bexists == 0){ - # my $sql_installnew = $defdbschemacfg->{$pd}->{sql}; - # $db->dbexec($sql_installnew); - # } -} sub getcoldef($){ diff --git a/dev/sqlite.pm b/dev/sqlite.pm index 0257add..ed9ce25 100644 --- a/dev/sqlite.pm +++ b/dev/sqlite.pm @@ -174,11 +174,15 @@ sub create_ddl_insert(){ my @sqlval = (); foreach my $c (keys(%{$fields->{$tb}})){ my $v = $fields->{$tb}->{$c}; - $v =~ s/'/''/g; push (@sqlcol,$c); if ($v eq ''){ $v = 'null'; - } else { + } + elsif ($v =~ /^date\(/ ){ + $v = $v; + } + else { + $v =~ s/'/''/g; $v = "'".$v."'"; } push (@sqlval,$v); diff --git a/server/CGI/tmpl/app/license.tt b/server/CGI/tmpl/app/license.tt deleted file mode 100644 index e69de29..0000000 diff --git a/server/CGI/tmpl/lang/de.tt b/server/CGI/tmpl/lang/de.tt index 39b9ce8..b6cc858 100644 --- a/server/CGI/tmpl/lang/de.tt +++ b/server/CGI/tmpl/lang/de.tt @@ -17,10 +17,17 @@ settings => "Einstellungen", reports => "Vorlagen", reload => "neu Laden", + product => "Produkt", displayname => "Name / Firma", title => "Titel", prename => "Vorname", surname => "Nachname", + import => "importieren", + open => "öffnen", + preview => "Vorschau", + print => "drucken", + send => "senden", + create => "erstellen", address => "Adresse", zip => "PLZ", city => "Ort", diff --git a/server/CGI/tmpl/lists/invoicedirection.tt b/server/CGI/tmpl/lists/invoicedirection.tt new file mode 100644 index 0000000..53e84a2 --- /dev/null +++ b/server/CGI/tmpl/lists/invoicedirection.tt @@ -0,0 +1,4 @@ +[% invoicedirection = { + "out" => {value => "out", text => "Eingang",class => ""}, + "in" => {value => "in", text => "Ausgang",class=>""} +} %] \ No newline at end of file diff --git a/server/CGI/tmpl/lists/invoicetypes.tt b/server/CGI/tmpl/lists/invoicetypes.tt new file mode 100644 index 0000000..ed5e413 --- /dev/null +++ b/server/CGI/tmpl/lists/invoicetypes.tt @@ -0,0 +1,7 @@ +[% invoicetypes = { + "invoice" => {value => "invoice", text => "Rechnung",class => ""}, + "creditnote" => {value => "creditnote", text => "Gutschrift",class => ""}, + "salary" = {value => "salary", text => "Gehalt",class => ""}, + "taxes" => {value => "taxes", text => "Steuern",class => ""}, + "payroll" => {value => "payroll", text => "Lohnkosten",class => ""} +} %] \ No newline at end of file diff --git a/server/CGI/tmpl/lists/status.tt b/server/CGI/tmpl/lists/status.tt new file mode 100644 index 0000000..f7a0789 --- /dev/null +++ b/server/CGI/tmpl/lists/status.tt @@ -0,0 +1,9 @@ +[% status = { + "preparation" => {value => "preparation", "text"=> "Vorbereitung", class=> "w3-text-black"}, + "planned" => {value => "planned","text" => "geplant", class=> "w3-text-blue"}, + "received" => {value => "received","text" => "erhalten", class=> "w3-text-purple"}, + "sended" => {value => "sended","text" => "verschickt", class=> "w3-text-orange"}, + "overdue" => {value => "overdue","text" => "überfällig", class=> "w3-text-red"}, + "payed" => {value => "payed","text" => 'bezahlt', class=> "w3-text-green"}, + "canceled" => {value => "canceled","text" => "storniert", class=> "w3-text-grey"} + } %] \ No newline at end of file diff --git a/server/CGI/tmpl/module/addresses.tt b/server/CGI/tmpl/module/addresses.tt index 889fc0b..2f729a8 100644 --- a/server/CGI/tmpl/module/addresses.tt +++ b/server/CGI/tmpl/module/addresses.tt @@ -4,9 +4,9 @@ [% cols = { clientnumber => 100 , displayname=> 350, address => 200, email => 200, phone => 200, action=> 120 }%]
- +
[% lbl.addresses %]
- + diff --git a/server/CGI/tmpl/module/addresses/address.tt b/server/CGI/tmpl/module/addresses/address.tt index 71fc1a7..bec47c6 100644 --- a/server/CGI/tmpl/module/addresses/address.tt +++ b/server/CGI/tmpl/module/addresses/address.tt @@ -6,10 +6,8 @@ [% adr = qadr.get_all() %]
- +
[% lbl.address %]
- -
diff --git a/server/CGI/tmpl/module/invoices.tt b/server/CGI/tmpl/module/invoices.tt index a3c22f3..50d9936 100644 --- a/server/CGI/tmpl/module/invoices.tt +++ b/server/CGI/tmpl/module/invoices.tt @@ -1,42 +1,53 @@ -[% PROCESS macro/fields.tt %] +[% USE dksdb = DBI(dsn,dbuser,dbpassword) %] +[% #PROCESS macro/fields.tt %] +[% PROCESS lists/status.tt %] [% PROCESS "lang/${lang}.tt" %]
- -
[% lbl.invoices %]
- - - - + + + +
[% cols = { date => 100 , inout=> 80, receipient => 350, reference => 350, status => 110, amount => 110 , action=> 120 }%] + - - + + - + - - [% WHILE i < 100 %] - - - - - - - - + + [% qinv = dksdb.prepare("select strftime('%d.%m.%Y',inv.invoicedate) as invoicedate,inv.id, inv.direction,case when inv.direction= 'out' then inv.receipientname else inv.sendername end as receipient,inv.reference,inv.status +,replace(printf('%.2f',sum(round(bk.quantity * bk.unitamount,2))),'.',',') as netamount +,replace(printf('%.2f',sum(round(bk.quantity * bk.unitamount * bk.taxpercent,2))),'.',',') as vatamount +,replace(printf('%.2f',sum(round(bk.quantity * bk.unitamount,2)) + sum(round(bk.quantity * bk.unitamount * bk.taxpercent,2))),'.',',') as grossamount +from invoices inv left join bookings bk on (inv.id=bk.id_invoice) +group by inv.id order by inv.invoicedate desc")%] + [% FOREACH inv = qinv.execute() %] + + + + + + + + - [% i = i + 1 %] + [% END %] diff --git a/server/CGI/tmpl/module/invoices/invoice.tt b/server/CGI/tmpl/module/invoices/invoice.tt index c3b8b00..1c6755f 100644 --- a/server/CGI/tmpl/module/invoices/invoice.tt +++ b/server/CGI/tmpl/module/invoices/invoice.tt @@ -1,44 +1,35 @@ [% PROCESS macro/fields.tt %] -
+[% USE dksdb = DBI(dsn,dbuser,dbpassword) %] +[% PROCESS "lang/${lang}.tt" %] +[% PROCESS lists/status.tt %] +[% PROCESS lists/invoicetypes.tt %] +[% PROCESS lists/invoicedirection.tt %] +[% qinv =dksdb.query("select * from invoices where id='${params.id}';") %] +[% inv = qadr.get_all() %] +
- -
- [% lbl.invoice %] -
-
- [% invtypes = [ - {value => "preparation","text"=> "in Vorbereitung", class=> "w3-text-black"}, - {value => "planned","text" => "geplant", class=> "w3-text-blue"}, - {value => "received","text" => "erhalten", class=> "w3-text-purple"}, - {value => "sended","text" => "verschickt", class=> "w3-text-orange"}, - {value => "overdue","text" => "überfällig", class=> "w3-text-red"}, - {value => "payed","text" => 'bezahlt', class=> "w3-text-green"}, - {value => "canceled","text" => "storniert", class=> "w3-text-grey"} - ] %] - Status:[% selectbox('status','invoices','','','','','','','','',invtypes) %] + +
[% lbl.invoice %]
+
[% selectbox('status','invoices','','','','','','','','','Status') %]
+ + + + + + +
- -
-
+
-
- [% invdirection = [ - {value => "out", text => "Eingang",class => ""}, - {value => "in", text => "Ausgang",class=""} - ] %] - [% selectbox('invoicetype','invoices','','Typ','','','','','','',invdirection) %] +
+ [% selectbox('direction','invoices','','Richtung','','','','','','','') %]
- [% invtypes = [ - {value => "invoice", text => "Rechnung",class => ""}, - {value => "creditnote", text => "Gutschrift",class => ""}, - ] %] - [% selectbox('invoicetype','invoices','','Typ','','','','','','',invtypes) %] + + [% selectbox('invoicetype','invoices','','Typ','','','','','','','') %]
[% reports = [ @@ -69,16 +60,6 @@
-->
-
-
- [% selectbox('id_receipient','invoices','','Empfänger','','','','','','','status') %] -
-
-
-
- [% selectbox('id_sender','invoices','','Sender','','','','','','','status') %] -
-
[% inputbox('reminderdates','invoices','','Mahnungsdaten','text','','','','','') %] @@ -87,37 +68,64 @@ [% inputbox('byear','invoices','','G.Jahr','text','','')%]
+ +
+
+
+
+ [% inputbox('receipientname','invoices','','Empfänger','','','','','','','') %] +
+
- [% inputbox('netamount','invoices','','Netto','currency','w3-large','','readonly','00000.00','') %] + [% inputbox('receipientaddress','invoices','','Adresse','','','','','','','') %]
+
+
- [% inputbox('vatamount','invoices','','MwSt','currency','','','readonly','0000.00','') %] + [% inputbox('receipientcountry','invoices','','Land','','','','','','','') %]
- [% inputbox('grossamount','invoices','','Brutto','currency','','','readonly','000000.00','') %] + [% inputbox('receipientzip','invoices','','PLZ','','','','','','','') %]
- [% inputbox('payedamount','invoices','','Bezahlt','currency','','','','000000.00','') %] + [% inputbox('receipientcity','invoices','','Ort','','','','','','','') %]
-
- [% cols = { sku => 80 , quantity =>90,description => 390, vat => 80, netamount => 100 , action=> 50 }%] -
[% selectbox('preferences','preferences',pagename,'','','','','','test','Zeitraum','') %]
IN/OUT
DatumIN/OUT
Sender/Empfänger
Referenz
Status
Betrag
 
DD.MM.YYYYOUTSender Empfängerreferenzin Vorbereitung00000,00 €
[% inv.invoicedate %] + [% IF inv.direction == 'out' %][% ELSE %][% END %] + [% inv.receipient %][% inv.reference %][% status.item(inv.status).item('text') %] [% inv.grossamount %] €
+ [% inputbox('netamount','invoices','','Netto','currency','w3-large','','readonly','00000.00','') %] + [% inputbox('vatamount','invoices','','MwSt','currency','','','readonly','0000.00','') %] + [% inputbox('grossamount','invoices','','Brutto','currency','','','readonly','000000.00','') %] + [% inputbox('payedamount','invoices','','Bezahlt','currency','','','','000000.00','') %] + + + +
+
[% lbl.bookings %]
+ + + + + +
+
+ [% cols = { sku => 80 , quantity =>40,unit=>100,description => 500, vat => 80, netamount => 100 }%] +
- - - - - - + + + + + + - + [% WHILE i < 10 %] @@ -125,7 +133,7 @@ - + [% i = i + 1 %] [% END %] @@ -134,7 +142,4 @@
SKU
Qu / Unit
Product/Dienstleistung
MwSt.
Netto
 SKUQuProduct/DienstleistungMwSt.Netto
SKU-001
Product/Dienstleistung
000,00€
00000,00€
-
-
-
diff --git a/server/CGI/tmpl/skeleton/index.tt b/server/CGI/tmpl/skeleton/index.tt index 4f54a18..f3e3235 100644 --- a/server/CGI/tmpl/skeleton/index.tt +++ b/server/CGI/tmpl/skeleton/index.tt @@ -19,9 +19,6 @@
Invoice Journal
- - @@ -39,7 +36,6 @@ - \ No newline at end of file diff --git a/server/htdocs/css/dkstheme.css b/server/htdocs/css/dkstheme.css index 427029f..af910b1 100644 --- a/server/htdocs/css/dkstheme.css +++ b/server/htdocs/css/dkstheme.css @@ -1866,3 +1866,39 @@ span.currency::after { content: "€"; padding: 3px 4px 3px 3px; } + +select +{ + background-image: none; + background-color: rgba(100%,100%,100%,1); + border-top-color: rgba(80%,80%,80%,1); + border-right-color: rgba(80%,80%,80%,1); + border-bottom-color: rgba(80%,80%,80%,1); + border-left-color: rgba(80%,80%,80%,1); + border-top-style: solid; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + border-top-width: 1pt; + border-right-width: 1pt; + border-bottom-width: 1pt; + border-left-width: 1pt; + border-image-source: none; + font-family: -fm-font-family(Arial,ArialMT); + font-weight: normal; + font-size: 12pt; + color: rgba(0%,0%,0%,1); + line-height: 1line; + text-align: left; +} +select:focus +{ + border-top-color: rgba(0%,43.9216%,81.1765%,1); + border-right-color: rgba(0%,43.9216%,81.1765%,1); + border-bottom-color: rgba(0%,43.9216%,81.1765%,1); + border-left-color: rgba(0%,43.9216%,81.1765%,1); +} +::-webkit-select-placeholder +{ + color: rgba(60.3922%,60.3922%,60.3922%,1); +} \ No newline at end of file diff --git a/server/htdocs/css/w3pro.css b/server/htdocs/css/w3pro.css index 98d2442..46eff30 100644 --- a/server/htdocs/css/w3pro.css +++ b/server/htdocs/css/w3pro.css @@ -263,12 +263,8 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0} .w3-select { display: block; - font-size: 9pt; - font-family: sans-serif; - font-weight: normal; color: #000; - line-height: 1.3; - padding: .6em 1.4em .5em .8em; + padding: 4px; width: 100%; max-width: 100%; box-sizing: border-box; @@ -289,12 +285,8 @@ hr{border:0;border-top:1px solid #eee;margin:20px 0} .w3-currency { display: block; - font-size: 9pt; - font-family: sans-serif; - font-weight: normal; color: #000; - line-height: 1.3; - padding: .6em 1.4em .5em .8em; + padding: 4px; width: 100%; max-width: 100%; box-sizing: border-box; @@ -407,6 +399,11 @@ input[type=number]::-webkit-outer-spin-button { margin: 0; } +input[type=date]::-webkit-inner-spin-button, +input[type=dater]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} /* .mceContentBody { diff --git a/server/htdocs/img/icons/E-mail.svg b/server/htdocs/img/icons/Email.svg similarity index 98% rename from server/htdocs/img/icons/E-mail.svg rename to server/htdocs/img/icons/Email.svg index 0aa4133..d7cbfaf 100644 --- a/server/htdocs/img/icons/E-mail.svg +++ b/server/htdocs/img/icons/Email.svg @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + diff --git a/server/htdocs/img/icons/Email_white.svg b/server/htdocs/img/icons/Email_white.svg new file mode 100644 index 0000000..e25faca --- /dev/null +++ b/server/htdocs/img/icons/Email_white.svg @@ -0,0 +1,9 @@ + + + + + + + diff --git a/server/htdocs/img/icons/Folder.svg b/server/htdocs/img/icons/Folder.svg new file mode 100644 index 0000000..66c9c4a --- /dev/null +++ b/server/htdocs/img/icons/Folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/server/htdocs/img/icons/Folder_white.svg b/server/htdocs/img/icons/Folder_white.svg new file mode 100644 index 0000000..bf24904 --- /dev/null +++ b/server/htdocs/img/icons/Folder_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/server/htdocs/img/icons/In_red.svg b/server/htdocs/img/icons/In_red.svg new file mode 100644 index 0000000..2719d6e --- /dev/null +++ b/server/htdocs/img/icons/In_red.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/server/htdocs/img/icons/Out_green.svg b/server/htdocs/img/icons/Out_green.svg new file mode 100644 index 0000000..e03e87a --- /dev/null +++ b/server/htdocs/img/icons/Out_green.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/server/htdocs/img/icons/PDF_white.svg b/server/htdocs/img/icons/PDF_white.svg new file mode 100644 index 0000000..816c7c2 --- /dev/null +++ b/server/htdocs/img/icons/PDF_white.svg @@ -0,0 +1,15 @@ + + + + + + + diff --git a/server/htdocs/img/icons/Preview.svg b/server/htdocs/img/icons/Preview.svg new file mode 100644 index 0000000..3aca80b --- /dev/null +++ b/server/htdocs/img/icons/Preview.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/server/htdocs/img/icons/Preview_white.svg b/server/htdocs/img/icons/Preview_white.svg new file mode 100644 index 0000000..082713a --- /dev/null +++ b/server/htdocs/img/icons/Preview_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/server/htdocs/img/icons/Print_white.svg b/server/htdocs/img/icons/Print_white.svg new file mode 100644 index 0000000..44366b8 --- /dev/null +++ b/server/htdocs/img/icons/Print_white.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/server/htdocs/img/icons/ViewPDF.svg b/server/htdocs/img/icons/ViewPDF.svg new file mode 100644 index 0000000..49169f9 --- /dev/null +++ b/server/htdocs/img/icons/ViewPDF.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/server/htdocs/img/icons/ViewPDF_white.svg b/server/htdocs/img/icons/ViewPDF_white.svg new file mode 100644 index 0000000..b3e047a --- /dev/null +++ b/server/htdocs/img/icons/ViewPDF_white.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/server/htdocs/img/icons/download_white.svg b/server/htdocs/img/icons/download_white.svg new file mode 100644 index 0000000..a7f9734 --- /dev/null +++ b/server/htdocs/img/icons/download_white.svg @@ -0,0 +1,6 @@ + + + + +