X-Git-Url: https://git.infodrom.org/?p=infodrom.org%2Fservice.infodrom.org;a=blobdiff_plain;f=src%2FInfoCon%2Fbuch%2Finfocon;h=c10413b7a5fb262a77af79b92d00570aa6e322be;hp=81743d0f67e8b99281f8f90cc83a7ed437fce800;hb=65cb3d52b45296e9a5f6a5d06fdb5d7f4d99d749;hpb=66e60f19a6c5fd412bff961bb4f41747c899c728;ds=sidebyside diff --git a/src/InfoCon/buch/infocon b/src/InfoCon/buch/infocon index 81743d0..c10413b 100755 --- a/src/InfoCon/buch/infocon +++ b/src/InfoCon/buch/infocon @@ -1,7 +1,7 @@ #! /usr/bin/perl # infocon - Administration tool for InfoCon -# Copyright (c) 1998-2003,2005-8,10,11,12,14,15 Martin Schulze +# Copyright (c) 1998-2003,2005-8,10,11,12,14,15,16 Martin Schulze # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,8 +17,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. -# $Id$ - use strict; use warnings; @@ -41,6 +39,7 @@ my $term = undef; my $opt_all = 0; my $opt_verbose = 0; my $opt_year = 0; +my $opt_date = undef; my $opt_direction = undef; sub sdate @@ -88,15 +87,48 @@ sub date_to_string return sprintf("%4d%02d%02d", $year,$mon,$day); } +sub valid_isodate +{ + my $date = shift; + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + + return sprintf('%04d-%02d-%02d', $year+1900, $mon+1, $mday) unless defined $date; + + if ($date =~ /^(\d+)\.(\d+)\.?$/) { + if ($mon == 0 && $2 > 9) { + $date = sprintf('%04d-%02d-%02d', $year+1900-1, $2, $1); + } else { + $date = sprintf('%04d-%02d-%02d', $year+1900, $2, $1); + } + } elsif ($date =~ /^(\d+)\.(\d+)\.(\d+)?$/) { + if (length $3 == 2) { + $date = sprintf('20%02d-%02d-%02d', $3, $2, $1); + } else { + $date = sprintf('%04d-%02d-%02d', $3, $2, $1); + } + } elsif ($date !~ /^(\d+)-(\d+)-(\d+)$/) { + return undef; + } + return $date; +} + sub pay_invoice { my $nr = shift; my $pay = shift; - my $value = $pay==1?1:0; my $query; my $sth; - $query = "UPDATE sales SET paid=$value WHERE nr = $nr"; + if ($pay) { + my $date = valid_isodate $opt_date; + + die "Invalid date\n" unless defined $date; + + $query = sprintf("UPDATE sales SET paid=1,billing_date=%s WHERE nr = %d", + defined $date ? $dbh->quote($date) : 'now()', $nr); + } else { + $query = sprintf("UPDATE sales SET paid=0,billing_date=NULL WHERE nr = %d", $nr); + } $sth = $dbh->do($query); } @@ -136,6 +168,11 @@ sub sales_list $where .= sprintf("year = %d", $opt_year); } + if (defined $data{category} && length $data{category}) { + $where .= " AND " if $where; + $where .= sprintf("category = %s", $dbh->quote($data{category})); + } + if ($opt_direction) { if ($opt_direction eq "in") { $d = "price >= 0" @@ -433,6 +470,10 @@ sub buchung_input 'title' => 'bezahlt', 'type' => 'boolean', 'default' => 0}, + 'billing_date' => { + 'title' => 'wann', + 'type' => 'date', + 'validate' => \&validate_date}, 'weiter' => { 'title' => 'Weiter', 'type' => 'boolean', @@ -445,7 +486,8 @@ sub buchung_input $term = new Term::ReadLine '' unless $term; - my $sth = $dbh->prepare ("INSERT INTO $table (nr,date,pdf,year,category,description,tax_percent,tax_assigned,price,paid) VALUES (?,?,?,?,?,?,?,?,?,?)"); + my $sth = $dbh->prepare ("INSERT INTO $table (nr,date,pdf,year,category,description,tax_percent,tax_assigned,price,billing_date,paid) " . + "VALUES (?,?,?,?,?,?,?,?,?,?,?)"); print "Buchungseingabe\n\n"; while ($weiter =~ /[JjYy1]/) { @@ -456,6 +498,16 @@ sub buchung_input } $ans = read_input($f, $fields->{$f}); $answers->{$f} = $ans; + + if ($f eq 'paid') { + if ($answers->{paid}) { + $fields->{'billing_date'}{'default'} = $answers->{'date'}; + $ans = read_input('billing_date', $fields->{'billing_date'}); + $answers->{billing_date} = $ans; + } else { + $answers->{billing_date} = undef; + } + } } $sth->execute(get_next_nr(), @@ -467,6 +519,7 @@ sub buchung_input $answers->{tax_percent}, $answers->{tax_assigned}, $answers->{price}, + defined $answers->{billing_date} ? date_to_string($answers->{billing_date}) : undef, $answers->{paid}); $weiter = $answers->{weiter}; @@ -499,6 +552,7 @@ sub usage print " --buchung-input|-bi\n"; print " --buchung-unpaid\n"; print " --buchung-hidden\n"; + print " --date [yyyy-mm-dd|dd.mm.] (for --pay)\n"; print " --pay | --unpay \n"; print " --hide | --unhide \n"; print " --list-categories|-lc\n"; @@ -531,15 +585,16 @@ my %options = ( 'hide=s' => \$data{hide}, 'unhide=s' => \$data{unhide}, 'year=i' => \$opt_year, + 'date=s' => \$opt_date, 'direction|d=s' => \$opt_direction, 'mailto:s' => \$data{mailto}, 'all' => \$opt_all, 'verbose' => \$opt_verbose, 'help' => \&usage, 'dm' => sub {$table = "sales_dm"}, - 'buchung-input|bi' => \$data{'buchung-input'}, - 'buchung-unpaid|bu' => \$data{'buchung-unpaid'}, - 'buchung-hidden|bh' => \$data{'buchung-hidden'}, + 'buchung-input|bi' => \&buchung_input, + 'buchung-unpaid|bu' => \&buchung_unpaid, + 'buchung-hidden|bh' => \&buchung_hidden, 'list-categories|lc' => \$data{'list-categories'}, ); @@ -568,18 +623,8 @@ if (defined $data{mailto}) { } if (defined $data{category}) { - if (length($data{category})) { - sales_list("category = '".$data{category}."'"); - } else { - sales_list; - } + sales_list; exit; -} elsif (defined $data{'buchung-input'}) { - buchung_input; -} elsif (defined $data{'buchung-unpaid'}) { - buchung_unpaid; -} elsif (defined $data{'buchung-hidden'}) { - buchung_hidden; } elsif (defined $data{'list-categories'}) { list_categories; } elsif (defined $data{pay}) {