EekBoek-2.02.04/0000755000076500007650000000000012165465617011033 5ustar jvjvEekBoek-2.02.04/lib/0000755000076500007650000000000012165465617011601 5ustar jvjvEekBoek-2.02.04/lib/EekBoek.pm0000444000076500007650000000334112165465617013443 0ustar jvjv#! perl package EekBoek; # NOTE: This is a documentation-only module. use strict; use utf8; # Minimal version to prevent many Unicode bugs. use 5.008003; require EB::Version; our $PACKAGE = 'EekBoek'; our $VERSION = $EB::Version::VERSION; =head1 NAME EekBoek - Bookkeeping software for small and medium-size businesses =head1 SYNOPSIS EekBoek is a bookkeeping package for small and medium-size businesses. Unlike other accounting software, EekBoek has both a command-line interface (CLI) and a graphical user-interface (GUI). Furthermore, it has a complete Perl API to create your own custom applications. EekBoek is designed for the Dutch/European market and currently available in Dutch only. An English translation is in the works (help appreciated). =head1 DESCRIPTION For a description how to use the program, see L. =head1 BUGS AND PROBLEMS Please use the eekboek-users mailing list at SourceForge. =head1 AUTHOR AND CREDITS Johan Vromans (jvromans@squirrel.nl) wrote this module. Web site: L. =head1 COPYRIGHT AND DISCLAIMER This program is Copyright 2005-2011 by Squirrel Consultancy. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of either: a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" which comes with Perl. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the Artistic License for more details. =cut 1; EekBoek-2.02.04/lib/EB.pm0000444000076500007650000001327312165465617012431 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # EB.pm -- EekBoek Base module. # Author : Johan Vromans # Created On : Fri Sep 16 18:38:45 2005 # Last Modified By: Johan Vromans # Last Modified On: Wed Mar 23 11:17:11 2011 # Update Count : 320 # Status : Unknown, Use with caution! package main; our $app; our $cfg; package EB; use strict; use base qw(Exporter); use EekBoek; our @EXPORT; our @EXPORT_OK; # Establish location of our run-time resources. my $lib; sub libfile { my ($f) = @_; unless ( $lib ) { # Cava. if ( $Cava::Packager::PACKAGED ) { return Cava::Packager::GetResourcePath()."/$f"; } else { $lib = $INC{"EB.pm"}; $lib =~ s/EB\.pm$//; } } $lib."EB/res/$f"; } sub findlib { my ($file, $section) = @_; # The two-argument form supports locale-dependent paths. if ( $section && $cfg ) { my $lang = $cfg->val( qw( locale lang ), "" ); if ( $lang =~ /\./ ) { my $found = findlib( "$section/$lang/$file" ); return $found if $found; $lang =~ s/\..*//; # strip .utf8 } if ( $lang =~ /_/ ) { my $found = findlib( "$section/$lang/$file" ); return $found if $found; $lang =~ s/_.*//; # strip _US } if ( $lang ) { my $found = findlib( "$section/$lang/$file" ); return $found if $found; } return undef; } elsif ( $section ) { $file = "$section/$file"; } # Cava. if ( $Cava::Packager::PACKAGED ) { my $found = Cava::Packager::GetUserFile($file); return $found if -e $found; $found = Cava::Packager::GetResource($file); return $found if -e $found; } foreach ( @INC ) { return "$_/EB/user/$file" if -e "$_/EB/user/$file"; return "$_/EB/res/$file" if -e "$_/EB/res/$file"; return "$_/EB/$file" if -e "$_/EB/$file"; } undef; } use lib ( grep { defined } findlib("CPAN") ); # Some standard modules (locale-free). use EB::Globals; use Carp; use Data::Dumper; use Carp::Assert; use EB::Utils; # Export our and the imported globals. @EXPORT = ( @EB::Globals::EXPORT, @EB::Utils::EXPORT, "_T", # @EB::Locale::EXPORT, qw(carp croak), # Carp qw(Dumper), # Data::Dumper qw(findlib libfile), # qw(assert affirm), # Carp::Assert ); our $ident; our $imsg; my $imsg_saved; our $url = "http://www.eekboek.nl"; sub __init__ { $imsg_saved = $imsg || ""; # The CLI and GUI use different EB::Locale modules. if ( $app || $Cava::Packager::PACKAGED && !Cava::Packager::IsLinux() ) { # We do not have a good gettext for Windows, so use Wx. # It's packaged anyway. require EB::Wx::Locale; # provides EB::Locale, really } else { require EB::Locale; } EB::Locale::->import; EB::Locale->set_language($ENV{LANG}); my $year = 2005; my $thisyear = (localtime(time))[5] + 1900; $year .= "-$thisyear" unless $year == $thisyear; $ident = __x("{name} {version}", name => $EekBoek::PACKAGE, version => $EekBoek::VERSION); my @locextra; push(@locextra, _T("Nederlands")) if $EB::Locale::LOCALISER; $imsg = __x("{ident}{extra}{locale} -- Copyright {year} Squirrel Consultancy", ident => $ident, extra => ($app ? " Wx" : ""), locale => (@locextra ? " (".join(", ", @locextra).")" : ""), year => $year); if ( $imsg ne $imsg_saved && !( @ARGV && $ARGV[0] =~ /-(P|-?printconfig)$/ ) ) { warn($imsg, "\n"); } eval { require Win32; my @a = Win32::GetOSVersion(); my ($id, $major) = @a[4,1]; die unless defined $id; warn(_T("EekBoek is VRIJE software, ontwikkeld om vrij over uw eigen gegevens te kunnen beschikken.")."\n"); warn(_T("Met uw keuze voor het Microsoft Windows besturingssysteem geeft u echter alle vrijheden weer uit handen. Dat is erg triest.")."\n"); } unless $imsg_saved eq $imsg || $ENV{AUTOMATED_TESTING}; } sub app_init { shift; # 'EB' # Load a config file. require EB::Config; undef $::cfg; EB::Config->init_config( @_ ); # Main initialisation. __init__(); # Initialise locale-dependent formats. require EB::Format; EB::Format->init_formats(); return $::cfg; # until we've got something better } sub EB::Config::Handler::connect_db { # Connect to the data base. require EB::DB; EB::DB::->connect; } 1; __END__ =head1 NAME EB - EekBoek * Bookkeeping software for small and medium-size businesses =head1 SYNOPSIS EekBoek is a bookkeeping package for small and medium-size businesses. Unlike other accounting software, EekBoek has both a command-line interface (CLI) and a graphical user-interface (GUI). Furthermore, it has a complete Perl API to create your own custom applications. EekBoek is designed for the Dutch/European market and currently available in Dutch only. An English translation is in the works (help appreciated). =head1 DESCRIPTION For a description how to use the program, see L. =head1 BUGS AND PROBLEMS Please use the eekboek-users mailing list at SourceForge. =head1 AUTHOR AND CREDITS Johan Vromans (jvromans@squirrel.nl) wrote this module. Web site: L. =head1 COPYRIGHT AND DISCLAIMER This program is Copyright 2005-2011 by Squirrel Consultancy. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of either: a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" which comes with Perl. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the Artistic License for more details. EekBoek-2.02.04/lib/EB/0000755000076500007650000000000012165465617012067 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/0000755000076500007650000000000012165465617013342 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Grootboek/0000755000076500007650000000000012165465617015275 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Grootboek/Wxhtml.pm0000444000076500007650000000205512165465617017116 0ustar jvjv#! perl # Author : Johan Vromans # Created On : Thu Mar 6 14:36:36 2008 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:36:54 2010 # Update Count : 12 # Status : Unknown, Use with caution! package EB::Report::Grootboek::Wxhtml; use strict; use warnings; use base qw(EB::Report::Reporter::WxHtml); sub style { my ($self, $row, $cell) = @_; my $stylesheet = { d => { bsk => { link => "jnl://" }, desc => { indent => 2 }, }, h1 => { _style => { colour => 'red', size => '+2', } }, h2 => { _style => { colour => 'red' }, desc => { indent => 1,}, }, t1 => { _style => { colour => 'blue', size => '+1', } }, t2 => { _style => { colour => 'blue' }, desc => { indent => 1 }, }, tm => { _style => { colour => 'red', size => '+2', } }, tg => { _style => { colour => 'blue' } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } 1; EekBoek-2.02.04/lib/EB/Report/BTWAangifte/0000755000076500007650000000000012165465617015435 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/BTWAangifte/Wxhtml.pm0000444000076500007650000000200612165465617017252 0ustar jvjv#! perl # Wxhtml.pm -- WxHtml backend for BTW Aangifte # Author : Johan Vromans # Created On : Thu Mar 6 14:20:53 2008 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:33:22 2010 # Update Count : 12 # Status : Unknown, Use with caution! package EB::Report::BTWAangifte::Wxhtml; use strict; use warnings; use base qw(EB::Report::Reporter::WxHtml); sub style { my ($self, $row, $cell) = @_; my $stylesheet = { h1 => { _style => { weight => 'bold', size => '+2',}, num => { colspan => 2 }, }, h2 => { _style => { weight => 'bold' }, num => { colspan => 2 }, }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } sub finish { my $self = shift; if ( @_ ) { $self->_print("\n"); $self->_print("

\n"); $self->_print(join("
\n", map { $self->html($_) } @_) ); $self->_print("

\n"); $self->_print("\n"); } $self->SUPER::finish; } 1; EekBoek-2.02.04/lib/EB/Report/Open/0000755000076500007650000000000012165465617014243 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Open/Wxhtml.pm0000444000076500007650000000166712165465617016074 0ustar jvjv#! perl # Author : Johan Vromans # Created On : Thu Mar 6 14:36:36 2008 # Last Modified By: Johan Vromans # Last Modified On: Tue Oct 26 14:14:32 2010 # Update Count : 12 # Status : Unknown, Use with caution! package EB::Report::Open::Wxhtml; use strict; use warnings; use base qw(EB::Report::Reporter::WxHtml); sub style { my ($self, $row, $cell) = @_; my $stylesheet = { tdebcrd => { _style => { colour => 'red' }, }, trelatie => { _style => { colour => 'blue' }, }, data => { bsk => { link => "jnl://" }, }, cdata => { bsk => { link => "jnl://" }, rel => { link => "crd://" }, }, ddata => { bsk => { link => "jnl://" }, rel => { link => "deb://" }, }, prevdata => { bsk => { colour => 'red' }, }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } 1; EekBoek-2.02.04/lib/EB/Report/Balres.pm0000444000076500007650000002132512165465617015111 0ustar jvjv#! perl package main; our $cfg; our $dbh; package EB::Report::Balres; # Author : Johan Vromans # Created On : Sat Jun 11 13:44:43 2005 # Last Modified By: Johan Vromans # Last Modified On: Wed Jun 9 22:19:50 2010 # Update Count : 423 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; ################ The Process ################ use EB; use EB::Report; use EB::Format; ################ Subroutines ################ sub new { my ($class, $opts) = @_; $class = ref($class) || $class; $opts = {} unless $opts; bless { %$opts }, $class; } sub balans { my ($self, $opts) = @_; $opts->{balans} = 1; $self->perform($opts); } sub openingsbalans { my ($self, $opts) = @_; $opts->{balans} = -1; $self->perform($opts); } sub result { my ($self, $opts) = @_; $opts->{balans} = 0; $self->perform($opts); } sub perform { my ($self, $opts) = @_; my $balans = $opts->{balans}; my $opening = $opts->{opening}; my $detail = $opts->{detail}; $detail = $opts->{verdicht} ? 2 : -1 unless defined $detail; $opts->{detail} = $detail; my $dtot = 0; my $ctot = 0; $opts->{STYLE} = $opts->{balans} ? "balans" : "result"; $opts->{LAYOUT} = [ { name => "acct", title => _T("RekNr"), width => 6 }, { name => "desc", title => $detail >= 0 ? _T("Verdichting/Grootboekrekening") : _T("Grootboekrekening"), width => 40 }, { name => "deb", title => _T("Debet"), width => $amount_width, align => ">" }, { name => "crd", title => _T("Credit"), width => $amount_width, align => ">" }, ]; my $rep = EB::Report::GenBase->backend($self, $opts); my ($begin, $end) = @{$rep->{periode}}; my $now = $opts->{per} || $end; #### CHECK: $end is already always $opt->{per} if ( my $t = $cfg->val(qw(internal now), 0) ) { $now = $t if $t lt $now; } $now = iso8601date() if $now gt iso8601date(); $rep->{periodex} = 1 if $rep->{periodex} == 3 && $opts->{balans}; my $sth; my $rr; my $table = "Accounts"; my $need_rollback = 0; if ( $balans < 0 ) { my $date = $dbh->adm("begin"); $rep->start(_T("Openingsbalans"), __x("Datum: {date}", date => datefmt_full($now))); } elsif ( $opening ) { my $date = $begin; $rep->start(_T("Openingsbalans"), __x("Datum: {date}", date => datefmt_full($date))); $dbh->begin_work; $need_rollback++; $table = EB::Report->GetTAccountsBal($date, 1); } else { $dbh->begin_work; $need_rollback++; if ( $balans ) { $table = EB::Report->GetTAccountsBal($end); } elsif ( !$balans ) { $table = EB::Report->GetTAccountsRes($begin, $end); } $rep->start($balans ? _T("Balans") : _T("Verlies/Winst")); } my $sql = "SELECT acc_id, acc_desc, acc_balance, acc_ibalance, acc_debcrd, acc_dcfixed". " FROM ${table}"; if ( $balans ) { $sql .= " WHERE acc_balres". " AND acc_balance <> 0"; $sql .= " AND acc_struct = ?" if $detail >= 0; } else { $sql .= ",Journal". " WHERE acc_id = jnl_acc_id". " AND jnl_date >= '$begin' AND jnl_date <= '$end'". " AND NOT acc_balres". " AND acc_balance <> acc_ibalance"; $sql .= " AND acc_struct = ?" if $detail >= 0; $sql =~ /SELECT\s+(.*)\s+FROM/; $sql .= " GROUP BY $1"; } $sql .= " ORDER BY acc_id"; if ( $detail >= 0 ) { # Verdicht my @vd; my @hvd; $sth = $dbh->sql_exec("SELECT vdi_id, vdi_desc". " FROM Verdichtingen". " WHERE".($balans ? "" : " NOT")." vdi_balres". " AND vdi_struct IS NULL". " ORDER BY vdi_id"); while ( $rr = $sth->fetchrow_arrayref ) { $hvd[$rr->[0]] = [ @$rr, []]; } $sth->finish; @vd = @hvd; $sth = $dbh->sql_exec("SELECT vdi_id, vdi_desc, vdi_struct". " FROM Verdichtingen". " WHERE".($balans ? "" : " NOT")." vdi_balres". " AND vdi_struct IS NOT NULL". " ORDER BY vdi_id"); while ( $rr = $sth->fetchrow_arrayref ) { push(@{$hvd[$rr->[2]]->[2]}, [@$rr]); @vd[$rr->[0]] = [@$rr]; } $sth->finish; foreach my $hvd ( @hvd ) { next unless defined $hvd; my $did_hvd = 0; my $dstot = 0; my $cstot = 0; foreach my $vd ( @{$hvd->[2]} ) { my $did_vd = 0; $sth = $dbh->sql_exec($sql, $vd->[0]); my $dsstot = 0; my $csstot = 0; while ( $rr = $sth->fetchrow_arrayref ) { $rep->add({ _style => 'h1', acct => $hvd->[0], desc => $hvd->[1], }) unless $detail < 1 || $did_hvd++; $rep->add({ _style => 'h2', acct => $vd->[0], desc => $vd->[1] }) unless $detail < 2 || $did_vd++; my ($acc_id, $acc_desc, $acc_balance, $acc_ibalance, $acc_debcrd, $acc_dcfixed) = @$rr; $acc_balance = -$acc_balance if $acc_dcfixed && !$acc_debcrd; if ( $acc_dcfixed ? $acc_debcrd : ($acc_balance >= 0) ) { $dsstot += $acc_balance; $rep->add({ _style => 'd2', acct => $acc_id, desc => $acc_desc, deb => numfmt($acc_balance), }) if $detail >= 2; } else { $acc_balance = -$acc_balance unless $acc_dcfixed; $csstot += $acc_balance; $rep->add({ _style => 'd2', acct => $acc_id, desc => $acc_desc, crd => numfmt($acc_balance), }) if $detail >= 2; } } $sth->finish; if ( $detail >= 1 && ($csstot || $dsstot) ) { $rep->add({ _style => 't2', acct => $vd->[0], desc => ($detail > 1 ? __x("Totaal {vrd}", vrd => $vd->[1]) : $vd->[1]), $dsstot >= $csstot ? ( deb => numfmt($dsstot-$csstot)) : ( crd => numfmt($csstot-$dsstot) ), }); } $cstot += $csstot-$dsstot if $csstot>$dsstot; $dstot += $dsstot-$csstot if $dsstot>$csstot; } if ( $detail >= 0 && ($cstot || $dstot) ) { $rep->add({ _style => 't1', acct => $hvd->[0], desc => ($detail > 0 ? __x("Totaal {vrd}", vrd => $hvd->[1]) : $hvd->[1]), $dstot >= $cstot ? ( deb => numfmt($dstot-$cstot) ) : ( crd => numfmt($cstot-$dstot) ), }); } $ctot += $cstot-$dstot if $cstot>$dstot; $dtot += $dstot-$cstot if $dstot>$cstot; } } else { # Op Grootboek $sth = $dbh->sql_exec($sql); while ( $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_desc, $acc_balance, $acc_ibalance, $acc_debcrd, $acc_dcfixed) = @$rr; #warn("|", join("|", @$rr), "|\n"); $acc_balance -= $acc_ibalance unless $opts->{balans}; $acc_balance = -$acc_balance if $acc_dcfixed && !$acc_debcrd; if ( $acc_dcfixed ? $acc_debcrd : ($acc_balance >= 0) ) { $dtot += $acc_balance; $rep->add({ _style => 'd', acct => $acc_id, desc => $acc_desc, deb => numfmt($acc_balance), }); } else { $acc_balance = -$acc_balance unless $acc_dcfixed; $ctot += $acc_balance; $rep->add({ _style => 'd', acct => $acc_id, desc => $acc_desc, crd => numfmt($acc_balance), }); } } $sth->finish; } my ($w, $v) = (_T("Winst"), _T("Verlies")); ($w, $v) = ($v, $w) unless $balans; if ( $dtot != $ctot ) { if ( $dtot >= $ctot ) { $rep->add({ _style => 'v', desc => "<< $w >>", crd => numfmt($dtot - $ctot), }); $ctot = $dtot; } else { $rep->add({ _style => 'v', desc => "<< $v >>", deb => numfmt($ctot - $dtot), }); $dtot = $ctot; } } $rep->add({ _style => 'grand', desc => __x("TOTAAL {rep}", rep => $balans ? _T("Balans") : _T("Resultaten")), deb => numfmt($dtot), crd => numfmt($ctot), }); $rep->finish; # Rollback temp table. $dbh->rollback if $need_rollback; } package EB::Report::Balres::Text; use EB; use base qw(EB::Report::Reporter::Text); sub new { my ($class, $opts) = @_; my $self = $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); $self->{detail} = $opts->{detail}; return $self; } # Style mods. sub style { my ($self, $row, $cell) = @_; my $stylesheet = { d2 => { desc => { indent => 2 }, }, h2 => { desc => { indent => 1 }, }, t1 => { _style => { skip_after => (1 <= $self->{detail}) }, }, t2 => { _style => { skip_after => (2 <= $self->{detail}) }, desc => { indent => 1 }, }, grand => { _style => { line_before => 1 } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } package EB::Report::Balres::Html; use EB; use base qw(EB::Report::Reporter::Html); sub new { my ($class, $opts) = @_; my $self = $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); return $self; } package EB::Report::Balres::Csv; use EB; use base qw(EB::Report::Reporter::Csv); sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } 1; EekBoek-2.02.04/lib/EB/Report/Balres/0000755000076500007650000000000012165465617014552 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Balres/Wxhtml.pm0000444000076500007650000000223212165465617016370 0ustar jvjv#! perl # Wxhtml.pm -- WxHtml backend for Balans/Result reports # Author : Johan Vromans # Created On : Thu Feb 7 14:20:53 2008 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:34:10 2010 # Update Count : 7 # Status : Unknown, Use with caution! package EB::Report::Balres::Wxhtml; use strict; use warnings; use base qw(EB::Report::Reporter::WxHtml); sub style { my ($self, $row, $cell) = @_; my $stylesheet = { d => { acct => { link => "gbk://" }, }, d2 => { acct => { link => "gbk://" }, desc => { indent => 2 }, }, h1 => { _style => { colour => 'red', size => '+2', } }, h2 => { _style => { colour => 'red' }, desc => { indent => 1,}, }, t1 => { _style => { colour => 'blue', size => '+1', } }, t2 => { _style => { colour => 'blue' }, desc => { indent => 1 }, }, v => { _style => { colour => 'red', size => '+2', } }, grand => { _style => { colour => 'blue' } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } 1; EekBoek-2.02.04/lib/EB/Report/Journal/0000755000076500007650000000000012165465617014754 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Journal/Wxhtml.pm0000444000076500007650000000242412165465617016575 0ustar jvjv#! perl # Wxhtml.pm -- WxHtml backend for Journal reports. # Author : Johan Vromans # Created On : Thu Feb 7 14:21:31 2008 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:37:27 2010 # Update Count : 9 # Status : Unknown, Use with caution! package EB::Report::Journal::Wxhtml; use strict; use warnings; use base qw(EB::Report::Reporter::WxHtml); sub style { my ($self, $row, $cell) = @_; my $stylesheet = { head => { _style => { colour => 'red' }, }, chead => { _style => { colour => 'red' }, rel => { link => "crd://" }, }, dhead => { _style => { colour => 'red' }, rel => { link => "deb://" }, }, total => { _style => { colour => 'blue', } }, data => { desc => { indent => '+2' }, acct => { link => "gbk://" }, bsk => { indent => '+2' }, }, cdata => { desc => { indent => '+2' }, acct => { link => "gbk://" }, bsk => { indent => '+2' }, rel => { link => "crd://" }, }, ddata => { desc => { indent => '+2' }, acct => { link => "gbk://" }, bsk => { indent => '+2' }, rel => { link => "deb://" }, }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } 1; EekBoek-2.02.04/lib/EB/Report/Proof.pm0000444000076500007650000002161512165465617014770 0ustar jvjv#! perl package main; our $cfg; our $dbh; package EB::Report::Proof; # Author : Johan Vromans # Created On : Sat Jun 11 13:44:43 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:39:09 2010 # Update Count : 306 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; ################ The Process ################ use EB; use EB::Format; use EB::Report; ################ Subroutines ################ sub new { my ($class, $opts) = @_; $class = ref($class) || $class; $opts = {} unless $opts; bless { %$opts }, $class; } sub proefensaldibalans { my ($self, $opts) = @_; $self->perform($opts); } sub perform { my ($self, $opts) = @_; my $detail = $opts->{detail}; $detail = $opts->{verdicht} ? 2 : -1 unless defined $detail; $opts->{proef} = 1; $opts->{detail} = $detail; my @grand = (0) x 4; # grand total $opts->{STYLE} = "proef"; $opts->{LAYOUT} = [ { name => "acct", title => _T("RekNr"), width => 6, }, { name => "desc", title => $detail >= 0 ? _T("Verdichting/Grootboekrekening") : _T("Grootboekrekening"), width => 40, }, { name => "deb", title => _T("Debet"), width => $amount_width, align => ">", }, { name => "crd", title => _T("Credit"), width => $amount_width, align => ">", }, { name => "sdeb", title => _T("Saldo Db"), width => $amount_width, align => ">" }, { name => "scrd", title => _T("Saldo Cr"), width => $amount_width, align => ">" }, ]; my $rep = EB::Report::GenBase->backend($self, $opts); my $rr; $rep->{periodex} = 1; my ($begin, $end) = @{$rep->{periode}}; $dbh->begin_work; my $table = EB::Report->GetTAccountsAll($begin, $end); $rep->start(_T("Proef- en Saldibalans")); my $sth; my $hvd_hdr; my $vd_hdr; my $journaal = sub { my ($acc_id, $acc_desc, $acc_ibalance) = @_; my @tot = (0) x 4; my $did = 0; if ( $acc_ibalance ) { $did++; if ( $acc_ibalance < 0 ) { $tot[1] = -$acc_ibalance; } else { $tot[0] = $acc_ibalance; } # $rep->addline('D2', '', _T("Beginsaldo"), @tot); } my $sth = $dbh->sql_exec ("SELECT jnl_amount,jnl_desc". " FROM Journal". " WHERE jnl_acc_id = ?". " AND jnl_date >= ? AND jnl_date <= ?". " ORDER BY jnl_bsr_date", $acc_id, $begin, $end, ); while ( my $rr = $sth->fetchrow_arrayref ) { my ($amount, $desc) = @$rr; $did++; my @t = (0) x 4; $t[$amount<0] += abs($amount); # $rep->addline('D2', '', $desc, @t); $tot[$_] += $t[$_] foreach 0..$#tot; } if ( $tot[0] >= $tot[1] ) { $tot[2] = $tot[0] - $tot[1]; $tot[3] = 0; } else { $tot[3] = $tot[1] - $tot[0]; $tot[2] = 0; } $tot[0] ||= "00" if $did; $tot[1] ||= "00" if $did; @tot; }; my $grootboeken = sub { my ($vd, $hvd) = shift; my @tot = (0) x 4; my $sth = $dbh->sql_exec ("SELECT acc_id, acc_desc, acc_balance, acc_ibalance". " FROM ${table}". " WHERE acc_struct = ?". " AND ( acc_ibalance <> 0". " OR acc_id IN ( SELECT DISTINCT jnl_acc_id FROM Journal". " WHERE jnl_date >= ? AND jnl_date <= ? ))". " ORDER BY acc_id", $vd->[0], $begin, $end); while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_desc, $acc_balance, $acc_ibalance) = @$rr; my @t = $journaal->($acc_id, $acc_desc, $acc_ibalance); next if "@t" eq "0 0 0 0"; $tot[$_] += $t[$_] foreach 0..$#tot; next unless $detail > 1; if ( $hvd_hdr ) { $rep->add({ acct => $hvd_hdr->[0], desc => $hvd_hdr->[1], _style => 'h1', }); undef $hvd_hdr; } if ( $vd_hdr ) { $rep->add({ acct => $vd_hdr->[0], desc => $vd_hdr->[1], _style => 'h2', }); undef $vd_hdr; } $rep->add({ _style => 'd2', acct => $acc_id, desc => $acc_desc, deb => numfmt($t[0]), crd => numfmt($t[1]), $t[2] ? ( sdeb => numfmt($t[2]) ) : (), $t[3] ? ( scrd => numfmt($t[3]) ) : (), }); } if ( $tot[0] >= $tot[1] ) { $tot[2] = $tot[0] - $tot[1]; $tot[3] = 0; } else { $tot[3] = $tot[1] - $tot[0]; $tot[2] = 0; } @tot; }; my $verdichtingen = sub { my ($hvd) = shift; my @tot = (0) x 4; my $did = 0; foreach my $vd ( @{$hvd->[2]} ) { next unless defined $vd; $vd_hdr = [ $vd->[0], $vd->[1] ]; my @t = $grootboeken->($vd, $hvd); next if "@t" eq "0 0 0 0"; $tot[$_] += $t[$_] foreach 0..$#tot; next unless $detail > 0; if ( $hvd_hdr ) { $rep->add({ acct => $hvd_hdr->[0], desc => $hvd_hdr->[1], _style => 'h1', }); undef $hvd_hdr; } $rep->add({ _style => 't2', acct => $vd->[0], desc => __x("Totaal {vrd}", vrd => $vd->[1]), $t[0] ? ( deb => numfmt($t[0]) ) : (), $t[1] ? ( crd => numfmt($t[1]) ) : (), $t[2] ? ( sdeb => numfmt($t[2]) ) : (), $t[3] ? ( scrd => numfmt($t[3]) ) : (), }); } if ( $tot[0] >= $tot[1] ) { $tot[2] = $tot[0] - $tot[1]; $tot[3] = 0; } else { $tot[3] = $tot[1] - $tot[0]; $tot[2] = 0; } @tot; }; my $hoofdverdichtingen = sub { my (@hvd) = @_; my @tot = (0) x 4; foreach my $hvd ( @hvd ) { next unless defined $hvd; $hvd_hdr = [ $hvd->[0], $hvd->[1] ]; my @t = $verdichtingen->($hvd); next if "@t" eq "0 0 0 0"; if ( $detail && $hvd_hdr ) { $rep->add({ acct => $hvd_hdr->[0], desc => $hvd_hdr->[1], _style => 'h1', }); undef $hvd_hdr; } $rep->add({ _style => 't1', acct => $hvd->[0], desc => __x("Totaal {vrd}", vrd => $hvd->[1]), $t[0] ? ( deb => numfmt($t[0]) ) : (), $t[1] ? ( crd => numfmt($t[1]) ) : (), $t[2] ? ( sdeb => numfmt($t[2]) ) : (), $t[3] ? ( scrd => numfmt($t[3]) ) : (), }); $tot[$_] += $t[$_] foreach 0..$#tot; } @tot; }; if ( $detail >= 0 ) { # Verdicht my @vd; my @hvd; $sth = $dbh->sql_exec("SELECT vdi_id, vdi_desc". " FROM Verdichtingen". " WHERE vdi_struct IS NULL". " ORDER BY vdi_id"); while ( $rr = $sth->fetchrow_arrayref ) { $hvd[$rr->[0]] = [ @$rr, []]; } @vd = @hvd; $sth = $dbh->sql_exec("SELECT vdi_id, vdi_desc, vdi_struct". " FROM Verdichtingen". " WHERE vdi_struct IS NOT NULL". " ORDER BY vdi_id"); while ( $rr = $sth->fetchrow_arrayref ) { push(@{$hvd[$rr->[2]]->[2]}, [@$rr]); @vd[$rr->[0]] = [@$rr]; } my @tot = $hoofdverdichtingen->(@hvd); $rep->add({ _style => 't', desc => _T("TOTAAL"), $tot[0] ? ( deb => numfmt($tot[0]) ) : (), $tot[1] ? ( crd => numfmt($tot[1]) ) : (), $tot[2] ? ( sdeb => numfmt($tot[2]) ) : (), $tot[3] ? ( scrd => numfmt($tot[3]) ) : (), }); } else { # Op Grootboek my @tot = (0) x 4; my $sth = $dbh->sql_exec ("SELECT acc_id, acc_desc, acc_balance, acc_ibalance". " FROM ${table}". " WHERE ( acc_ibalance <> 0". " OR acc_id IN ( SELECT DISTINCT jnl_acc_id FROM Journal". " WHERE jnl_date >= ? AND jnl_date <= ? ))". " ORDER BY acc_id", $begin, $end); while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_desc, $acc_balance, $acc_ibalance) = @$rr; my @t = $journaal->($acc_id, $acc_desc, $acc_ibalance); next if "@t" eq "0 0 0 0"; $tot[$_] += $t[$_] foreach 0..$#tot; $rep->add({ _style => 'd', acct => $acc_id, desc => $acc_desc, deb => numfmt($t[0]), crd => numfmt($t[1]), $t[2] ? ( sdeb => numfmt($t[2]) ) : (), $t[3] ? ( scrd => numfmt($t[3]) ) : (), }); } $rep->add({ _style => 't', desc => _T("TOTAAL"), deb => numfmt($tot[0]), crd => numfmt($tot[1]), $tot[2] ? ( sdeb => numfmt($tot[2]) ) : (), $tot[3] ? ( scrd => numfmt($tot[3]) ) : (), }); } $rep->finish; $dbh->rollback; } package EB::Report::Proof::Text; use EB; use base qw(EB::Report::Reporter::Text); sub new { my ($class, $opts) = @_; my $self = $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); $self->{detail} = $opts->{detail}; $self; } # Style mods. sub style { my ($self, $row, $cell) = @_; my $stylesheet = { d2 => { desc => { indent => 2 }, }, t2 => { _style => { skip_after => $self->{detail} > 1, }, desc => { indent => 1 }, }, h2 => { desc => { indent => 1 }, }, t1 => { _style => { skip_after => $self->{detail} > 0, skip_before => $self->{detail} > 1, }, }, t => { _style => { line_before => 1 } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } package EB::Report::Proof::Csv; use EB; use base qw(EB::Report::Reporter::Csv); sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } package EB::Report::Proof::Html; use EB; use base qw(EB::Report::Reporter::Html); use strict; sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } 1; EekBoek-2.02.04/lib/EB/Report/GenBase.pm0000444000076500007650000001643412165465617015212 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Sat Oct 8 16:40:43 2005 # Last Modified By: Johan Vromans # Last Modified On: Mon Jan 16 15:56:26 2012 # Update Count : 176 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Report::GenBase; use strict; use EB; use IO::File; use EB::Format; use File::Glob qw(:glob); # glob that allows space (for Windows); sub new { my ($class, $opts) = @_; $class = ref($class) || $class; my $self = { %$opts }; bless $self => $class; } # API. sub _oops { warn("?Package ".ref($_[0])." did not implement '$_[1]' method\n") } sub start { shift->_oops('start') } sub outline { shift->_oops('outline') } sub finish { shift->_oops('finish') } # Class methods sub backend { my (undef, $self, $opts) = @_; my %extmap = ( txt => "text", htm => "html" ); my $gen; # Short options, like --html. for ( qw(html csv text) ) { $gen = $_ if $opts->{$_}; } # Override by explicit --gen-XXX option(s). foreach ( keys(%$opts) ) { next unless /^gen-(.*)$/; $gen = $1; } # Override by explicit --generate option(s). $gen = $opts->{generate} if $opts->{generate}; # Infer from filename extension. my $t; if ( !defined($gen) && ($t = $opts->{output}) && $t =~ /\.([^.]+)$/ ) { my $ext = lc($1); $ext = $extmap{$ext} || $ext; $gen = $ext; } # Fallback to text. $gen ||= "text"; # Build class and package name. Last chance to override... my $class = $opts->{backend} || (ref($self)||$self) . "::" . ucfirst($gen); my $pkg = $class; $pkg =~ s;::;/;g;; $pkg .= ".pm"; # Try to load backend. Gives user the opportunity to override. eval { local $SIG{__WARN__}; local $SIG{__DIE__}; require $pkg; } unless $ENV{AUTOMATED_TESTING}; if ( ! _loaded($class) ) { my $err = $@; if ( $err =~ /^can't locate /i ) { $err = _T("De uitvoer-backend kon niet worden gevonden"); } die("?".__x("Uitvoer in de vorm {gen} is niet mogelijk: {reason}", gen => $gen, reason => $err)."\n"); } my $be = $class->new($opts); # Handle output redirection. if ( $opts->{output} && $opts->{output} ne '-' ) { $be->{fh} = IO::File->new($opts->{output}, "w") or die("?".__x("Fout tijdens aanmaken {file}: {err}", file => $opts->{output}, err => $!)."\n"); } elsif ( fileno(STDOUT) > 0 ) { # Normal file. $be->{fh} = IO::File->new_from_fd(fileno(STDOUT), "w"); } else { # In-memory. $be->{fh} = bless \*STDOUT , 'IO::Handle'; } binmode($be->{fh}, ":encoding(utf8)"); # Handle pagesize. $be->{fh}->format_lines_per_page($be->{page} = defined($opts->{page}) ? $opts->{page} : 999999); # Get real (or fake) current date, and adjust periode end if needed. $be->{now} = iso8601date(); if ( my $t = $cfg->val(qw(internal now), 0) ) { $be->{now} = $t if $be->{now} gt $t; } # Date/Per. if ( $opts->{per} ) { die(_T("--per sluit --periode uit")."\n") if $opts->{periode}; die(_T("--per sluit --boekjaar uit")."\n") if defined $opts->{boekjaar}; $be->{periode} = [ $be->{per_begin} = $dbh->adm("begin"), $be->{per_end} = $opts->{per} ]; $be->{periodex} = 1; } elsif ( $opts->{periode} ) { die(_T("--periode sluit --boekjaar uit")."\n") if defined $opts->{boekjaar}; $be->{periode} = $opts->{periode}; $be->{per_begin} = $opts->{periode}->[0]; $be->{per_end} = $opts->{periode}->[1]; $be->{periodex} = 2; } elsif ( defined($opts->{boekjaar}) || defined($opts->{d_boekjaar}) ) { my $bky = $opts->{boekjaar}; $bky = $opts->{d_boekjaar} unless defined $bky; my $rr = $dbh->do("SELECT bky_begin, bky_end". " FROM Boekjaren". " WHERE bky_code = ?", $bky); die("?",__x("Onbekend boekjaar: {bky}", bky => $bky)."\n"), return unless $rr; my ($begin, $end) = @$rr; $be->{periode} = [ $be->{per_begin} = $begin, $be->{per_end} = $end ]; $be->{periodex} = 3; $be->{boekjaar} = $bky; } else { $be->{periode} = [ $be->{per_begin} = $dbh->adm("begin"), $be->{per_end} = $dbh->adm("end") ]; $be->{periodex} = 0; } if ( $be->{per_end} gt $be->{now} ) { warn("!".__x("Datum {per} valt na de huidige datum {now}", per => datefmt_full($be->{per_end}), now => datefmt_full($be->{now}))."\n") if 0; $be->{periode}->[1] = $be->{per_end} = $be->{now} if 0; } # Sanity. my $opendate = $dbh->do("SELECT min(bky_begin) FROM Boekjaren WHERE NOT bky_code = ?", BKY_PREVIOUS)->[0]; if ( $be->{per_begin} gt $be->{now} ) { die("?".__x("Periode begint {from}, dit is na de huidige datum {now}", from => datefmt_full($be->{per_begin}), now => datefmt_full($be->{now}))."\n"); } if ( $be->{per_begin} lt $opendate ) { die("?".__x("Datum {per} valt vóór het begin van de administratie {begin}", per => datefmt_full($be->{per_begin}), begin => datefmt_full($opendate))."\n"); } if ( $be->{per_end} lt $opendate ) { die("?".__x("Datum {per} valt vóór het begin van de administratie {begin}", per => datefmt_full($be->{per_end}), begin => datefmt_full($opendate))."\n"); } $be->{_cssdir} = $cfg->val(qw(html cssdir), undef); $be->{_cssdir} =~ s;/*$;/; if defined $be->{_cssdir}; $be->{_style} = $opts->{style} if $opts->{style}; $be->{_title0} = $opts->{title} if $opts->{title}; # Return instance. $be; } my %bec; sub backend_options { my (undef, $self, $opts) = @_; my $package = ref($self) || $self; my $pkg = $package; $pkg =~ s;::;/;g;; return @{$bec{$pkg}} if $bec{$pkg}; # Some standard backends may be included in the coding ... my %be; foreach my $std ( qw(text html csv) ) { $be{$std} = 1 if _loaded($package . "::" . ucfirst($std)); } #### FIXME: options dest is uncontrollable!!!! #### DO NOT TRANSLATE UNTIL FIXED !!!! my @opts = ( __xt("cmo:report:output")."=s", __xt("cmo:report:page")."=i" ); if ( $Cava::Packager::PACKAGED ) { $be{wxhtml}++; unless ( $be{wxhtml} ) { # Ignored, but forces the packager to include these modules. require EB::Report::BTWAangifte::Wxhtml; require EB::Report::Balres::Wxhtml; require EB::Report::Debcrd::Wxhtml; require EB::Report::Grootboek::Wxhtml; require EB::Report::Journal::Wxhtml; require EB::Report::Open::Wxhtml; require EB::Report::Proof::Wxhtml; } } else { # Find files. foreach my $lib ( @INC ) { my @files = glob("$lib/$pkg/*.pm"); next unless @files; # warn("=> be_opt: found ", scalar(@files), " files in $lib/$pkg\n"); foreach ( @files ) { next unless m;/([^/]+)\.pm$;; # Actually, we should check whether the class implements the # GenBase API, but we can't do that without preloading all # backends. $be{lc($1)}++; } } } # Short --XXX for known backends. foreach ( qw(html csv text) ) { push(@opts, $_) if $be{$_}; } push(@opts, __xt("cmo:report:style")."=s", __xt("cmo:report:title|titel")."=s") if $be{html}; # Explicit --gen-XXX for all backends. push(@opts, map { +"gen-$_"} keys %be); # Cache. $bec{$pkg} = [@opts]; @opts; # better be list context } # Helper. sub _loaded { my $class = shift; no strict "refs"; %{$class . "::"} ? 1 : 0; } 1; EekBoek-2.02.04/lib/EB/Report/BTWAangifte.pm0000444000076500007650000005444612165465617016006 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Tue Jul 19 19:01:33 2005 # Last Modified By: Johan Vromans # Last Modified On: Thu Mar 8 15:32:24 2012 # Update Count : 648 # Status : Unknown, Use with caution! ################ Common stuff ################ package main; our $cfg; our $dbh; package EB::Report::BTWAangifte; use strict; use warnings; use EB; use EB::Format; use EB::Booking; # for norm_btw() use POSIX qw(floor ceil); my $trace = $cfg->val(__PACKAGE__, "trace", undef); my $noround; my @periodetabel; sub new { my $class = shift; $class = ref($class) || $class; my $self = {}; bless $self, $class; $self->{"adm_$_"} = $dbh->adm($_) for qw(begin btwperiod); $self->{adm_btwperiod} ||= 1; unless ( $self->{adm_begin} ) { die("?"._T("De administratie is nog niet geopend")."\n"); } $self; } sub periodetabel { my ($self) = (@_); unless ( @periodetabel ) { @periodetabel = ( [] ) x 13; my @m; for ( 1 .. 12 ) { push(@m, [ sprintf("%02d-01", $_), sprintf("%02d-%02d", $_, ($_ & 1 xor $_ & 8) ? 31 : 30) ]); } $m[1][1] = substr($self->{adm_begin}, 0, 4) % 4 ? "02-28" : "02-29"; $periodetabel[12] = [ _T("per maand"), @m ]; $periodetabel[1] = [ _T("per jaar"), [$m[0][0], $m[11][1] ]]; $periodetabel[4] = [ _T("per kwartaal"), [$m[0][0], $m[2][1]], [$m[3][0], $m[5][1] ], [$m[6][0], $m[8][1]], [$m[9][0], $m[11][1]]]; } \@periodetabel; } use EB::Report::GenBase; sub perform { my ($self, $opts) = @_; $noround = $opts->{noround} || 0; # Determine the period to be used. # BTW report is slightly awkward. It takes the boekjaar into # account, also an explicitly specified period. But it can also # process a form of symbolic period, like "k1" or "m4". # Order of precedence: # 1. --period, # 2. symbolic period, depending on boekjaar, # 3. (default) next (or first) period in boekjaar. # Note that a possible --period / symbolic period conflict has # already been trapped in the shell. my $year = substr($dbh->adm("begin"), 0, 4); # default for now my $btwperiod = $self->{adm_btwperiod}; # Check symbolic period (excludes --period). if ( $opts->{compat_periode} ) { # Adjust current year, if applicable. if ( defined($opts->{boekjaar}) || defined($opts->{d_boekjaar}) ) { my $bky = $opts->{boekjaar}; $bky = $opts->{d_boekjaar} unless defined $bky; my $rr = $dbh->do("SELECT bky_begin". " FROM Boekjaren". " WHERE bky_code = ?", $bky); die("?",__x("Onbekend boekjaar: {bky}", bky => $bky)."\n"), return unless $rr; $year = substr($rr->[0], 0, 4); } # Parse the symbolic period. $self->parse_periode($opts->{compat_periode}, $year); # Store in --period. $opts->{periode} = [ $self->{p_start}, $self->{p_end} ]; # GenBase backend will disallow --period with boekjaar... delete($opts->{boekjaar}); } # No symbolic. So we have either a --period, or nothing. # The latter includes a possible --boekjaar ;-). elsif ( !defined($opts->{periode}) ) { # We have nothing. Adjust year to --boekjaar if applicable. if ( defined($opts->{boekjaar}) || defined($opts->{d_boekjaar}) ) { my $bky = $opts->{boekjaar}; $bky = $opts->{d_boekjaar} unless defined $bky; my $rr = $dbh->do("SELECT bky_begin". " FROM Boekjaren". " WHERE bky_code = ?", $bky); die("?",__x("Onbekend boekjaar: {bky}", bky => $bky)."\n"), return unless $rr; $year = substr($rr->[0], 0, 4); } my $tbl = $self->periodetabel->[$btwperiod]; if ( $btwperiod == 1 ) { # aangifteperiode => jaar $opts->{periode} = [ $year . "-" . $tbl->[1]->[0], $year . "-" . $tbl->[1]->[1] ]; $self->{compat_periode} = $self->periode(1, $year); } elsif ( 0 ) { # determine period depending on current date. my @tm = localtime(time); $tm[5] += 1900; my $m; if ( $year < 1900+$tm[5] ) { $m = $btwperiod; } else { $m = 1 + int($tm[4] / (12/$btwperiod)); } $opts->{periode} = [ $year . "-" . $tbl->[$m]->[0], $year . "-" . $tbl->[$m]->[1] ]; $self->{compat_periode} = $self->periode($btwperiod, $year, $m); } else { # determine period depending on previous aangifte my $next = $dbh->adm("btwbegin"); my $m; if ( substr($next, 0, 4) gt $year ) { $m = $btwperiod; } elsif ( substr($next, 0, 4) lt $year ) { $m = 1; } else { for ( $m = 1; $m <= 12; $m++ ) { last if substr($next, 5) eq $tbl->[$m]->[0]; } } $opts->{periode} = [ $year . "-" . $tbl->[$m]->[0], $year . "-" . $tbl->[$m]->[1] ]; $self->{compat_periode} = $self->periode($btwperiod, $year, $m); } delete($opts->{boekjaar}); } # else: we have an explicit --period. Nothing here to do. else { $self->{compat_periode} = ""; } $opts->{STYLE} = "btwaangifte"; # my $w = $amount_width + 1; # $self->{fh}->printf("%-5s%-40s%${w}s%${w}s\n", $opts->{LAYOUT} = [ { name => "_colsep", # neat? or trick? #sep => "|", width => 1 }, { name => "num", width => 4 }, { name => "desc", width => 40 }, { name => "col1", width => $amount_width, align => ">" }, { name => "col2", width => $amount_width, align => ">" }, ]; my $rep = EB::Report::GenBase->backend($self, $opts); unless ( $rep->{per_begin} eq $dbh->adm("btwbegin") ) { my $msg = _T("BTW aangifte periode sluit niet aan bij de vorige aangifte"); $opts->{close} ? die("?$msg\n") : warn("!$msg\n"); } unless ( $opts->{noreport} ) { my $data = $self->collect($rep->{per_begin}, $rep->{per_end}); $self->report($rep, $data); } if ( $opts->{close} ) { $dbh->adm("btwbegin", scalar parse_date($rep->{per_end}, undef, 1)); # implied commit } } sub periode { my ($self, $p, $year, $v) = @_; if ( $p == 1 ) { return __x("{year}", year => $year); } elsif ( $p == 4 ) { return __x("{quarter} {year}", quarter => (_T("1e kwartaal"), _T("2e kwartaal"), _T("3e kwartaal"), _T("4e kwartaal"))[$v-1], year => $year); } elsif ( $p == 12 ) { return __x("{month} {year}", month => _T( $EB::Utils::month_names[$v-1] ), year => $year); } else { die("?".__x("Programmafout: Ongeldige BTW periode: {per}", per => $p)."\n"); } } sub parse_periode { my ($self, $v, $year) = @_; my $pp = sub { my ($per, $n) = @_; unless ( $self->{adm_btwperiod} == $per ) { warn($self->{close} ? "?" :"!". __x("Aangifte {per} komt niet overeen met de BTW instelling". " van de administratie ({admper})", per => $self->periodetabel->[$per][0], admper => $self->periodetabel->[$self->{adm_btwperiod}][0], )."\n") } $self->{adm_btwperiod} = $per; my $tbl = $self->periodetabel->[$self->{adm_btwperiod}]; $self->{p_start} = $year . "-" . $tbl->[$n]->[0]; $self->{p_end} = $year . "-" . $tbl->[$n]->[1]; $self->{compat_periode} = $self->periode($per, $year, $n); if ( $per == $n ) { $self->{p_next} = ($year+1) . "-" . $tbl->[1]->[0]; } else { $self->{p_next} = $year . "-" . $tbl->[$n+1]->[0]; } }; my $yrpat = _T("j(aar)?"); if ( $v =~ /^$yrpat$|j(aar)?$/i ) { $pp->(1, 1); return; } if ( $v =~ /^[kq](\d)$/i && $1 >= 1 && $1 <= 4) { $pp->(4, $1); return; } if ( $v =~ /^(\d+)$/i && $1 >= 1 && $1 <= 12) { $pp->(12, $1); return; } if ( $v =~ /^(\w+)$/i ) { my $i; for ( $i = 0; $i < 12; $i++ ) { last if lc($EB::Utils::month_names[$i]) eq lc($v); last if lc($EB::Utils::months[$i]) eq lc($v); } if ( $i < 12 ) { $pp->(12, $i+1); return; } } die("?".__x("Ongeldige waarde voor BTW periode: \"{per}\"", per => $v) . "\n"); } sub collect { my ($self, $begin, $end) = @_; my $v; my $tot = 0; # 1. Door mij verrichte leveringen/diensten # 1a. Belast met hoog tarief my $deb_h = 0; my $deb_btw_h = 0; # 1b. Belast met laag tarief my $deb_l = 0; my $deb_btw_l = 0; # 1c. Belast met ander, niet-nul tarief my $deb_a = 0; my $deb_btw_a = 0; # 1d. Eigen gebruik. my $deb_p = 0; my $deb_btw_p = 0; # 1e. Belast met 0%/verlegd my $deb_0 = 0; my $verlegd = 0; # 3. Door mij verrichte leveringen # 3a. Buiten de EU my $extra_deb = 0; # 3b. Binnen de EU my $intra_deb = 0; my $intra_deb_btw = 0; # 4. Aan mij verrichte leveringen # 4a. Van buiten de EU my $extra_crd = 0; # 4b. Verwervingen van goederen uit de EU. my $intra_crd = 0; my $intra_crd_btw = 0; # Totaaltellingen. my $crd_btw = 0; # BTW betaald (voorheffingen) my $xx = 0; # ongeclassificeerd (fout, dus) # Target: alle boekstukken van type 0 (inkoop/verkoop). my $sth = $dbh->sql_exec ("SELECT bsr_amount,bsr_acc_id,bsr_btw_id,bsr_btw_acc,bsr_btw_class,rel_debcrd,rel_btw_status". " FROM Boekstukregels, Relaties". " WHERE bsr_rel_code = rel_code AND bsr_dbk_id = rel_ledger". " AND bsr_date >= ? AND bsr_date <= ?". " AND bsr_type = 0". " UNION ALL ". "SELECT bsr_amount,bsr_acc_id,bsr_btw_id,bsr_btw_acc,bsr_btw_class,null as rel_debcrd,0 as rel_btw_status". " FROM Boekstukregels". " WHERE bsr_rel_code IS NULL". " AND bsr_date >= ? AND bsr_date <= ?". " AND bsr_type = 0", $begin, $end, $begin, $end); my $rr; my $tr = $trace ? sub { warn("BTW " . shift() . " " . join(" ", map { defined $_ ? $_ : "-" } @$rr). "\n"); } : sub {}; while ( $rr = $sth->fetchrow_arrayref ) { my ($amt, $acc, $btw_id, $btw_acc, $btwclass, $debcrd, $btw_status) = @$rr; next unless $btwclass & BTWKLASSE_BTW_BIT; my $btg_id = 0; my $btw = 0; $amt = -$amt; if ( $btw_id && $btw_acc ) { # Bepaal tariefgroep en splits bedrag uit. $btg_id = $dbh->lookup($btw_id, qw(BTWTabel btw_id btw_tariefgroep)); my $a = EB::Booking::->norm_btw($amt, $btw_id); $amt = $a->[0] - ($btw = $a->[1]); # ex BTW } unless ( defined $debcrd ) { $debcrd = !($btwclass & BTWKLASSE_KO_BIT); } if ( $btw_status == BTWTYPE_NORMAAL ) { if ( $debcrd ) { if ( $btg_id == BTWTARIEF_HOOG ) { $tr->("Hoog"); $deb_h += $amt; $deb_btw_h += $btw; } elsif ( $btg_id == BTWTARIEF_LAAG ) { $tr->("Laag"); $deb_l += $amt; $deb_btw_l += $btw; } elsif ( $btg_id == BTWTARIEF_NUL ) { $tr->("0%"); $deb_0 += $amt; } elsif ( $btg_id == BTWTARIEF_PRIV ) { $tr->("Privé"); $deb_p += $amt; $deb_btw_p += $btw; } else { assert($btg_id == BTWTARIEF_ANDERS); $tr->("Ander"); $deb_a += $amt; $deb_btw_a += $btw; } } else { $tr->("Voorheffing"); $crd_btw -= $btw; } } elsif ( $btw_status == BTWTYPE_VERLEGD ) { if ( $debcrd ) { $tr->("Verlegd"); $verlegd += $amt; } } elsif ( $btw_status == BTWTYPE_INTRA ) { if ( $debcrd ) { $tr->("Intra"); $intra_deb += $amt; $intra_deb_btw += $btw; } else { $intra_crd -= $amt; $intra_crd_btw -= $btw; } } elsif ( $btw_status == BTWTYPE_EXTRA ) { if ( $debcrd ) { $tr->("Extra D"); $extra_deb += $amt; } else { $tr->("Extra C"); $extra_crd -= $amt; } } else { # Foutvanger. $tr->("????"); $xx += $amt; } } my %data; my $delta = 0; my $ad = sub { my ($a, $b) = @_; $b *= AMTSCALE unless $noround; $delta += $a - $b; }; # 1. Door mij verrichte leveringen/diensten # 1a. Belast met hoog tarief $v = rounddown($deb_btw_h); $data{deb_btw_h} = $v; $ad->($deb_btw_h, $v); $data{deb_h} = rounddown($deb_h); $tot += $v; # 1b. Belast met laag tarief $v = rounddown($deb_btw_l); $data{deb_l} = rounddown($deb_l); $data{deb_btw_l} = $v; $ad->($deb_btw_l, $v); $tot += $v; # 1c. Belast met ander, niet-nul tarief $v = rounddown($deb_btw_a); $data{deb_a} = rounddown($deb_a); $data{deb_btw_a} = $v; $ad->($deb_btw_a, $v); $tot += $v; # 1d. Eigen gebruik $v = rounddown($deb_btw_p); $data{deb_p} = rounddown($deb_p); $data{deb_btw_p} = $v; $ad->($deb_btw_p, $v); $tot += $v; # 1e. Belast met 0%/verlegd $data{deb_0} = rounddown($deb_0 + $verlegd); #$data{deb_0} = roundtozero($deb_0 + $verlegd); # Buitenland # 3. Door mij verrichte leveringen # 3a. Buiten de EU $data{extra_deb} = rounddown($extra_deb); # 3b. Binnen de EU $data{intra_deb} = rounddown($intra_deb); $v = rounddown($intra_deb_btw); $data{intra_deb_btw} = $v; # TODO $ad->($intra_deb_btw, $v); # 4. Aan mij verrichte leveringen # 4a. Van buiten de EU $data{extra_crd} = rounddown($extra_crd); # 4b. Verwervingen van goederen uit de EU. $data{intra_crd} = rounddown($intra_crd); $v = roundup($intra_crd_btw); $data{intra_crd_btw} = $v; $ad->($intra_crd_btw, $v); $tot += $v; # 5 Berekening totaal # 5a. Subtotaal $data{sub0} = $tot; # 5b. Voorbelasting my ($vb) = @{$dbh->do("SELECT SUM(jnl_amount)". " FROM Journal". " WHERE ( jnl_acc_id = ? OR jnl_acc_id = ?". " OR jnl_acc_id = ? OR jnl_acc_id = ? )". " AND jnl_bsr_date >= ? AND jnl_bsr_date <= ?", $dbh->std_acc("btw_ih"), $dbh->std_acc("btw_il"), $dbh->std_acc("btw_ia",0), $dbh->std_acc("btw_ip",0), $begin, $end)}; $vb ||= 0; # prevent warnings my $btw_i_delta = $vb - $crd_btw - $intra_crd_btw; $v = roundup($vb); $data{vb} = $v; $tot -= $v; $ad->(-$vb, -$v); # 5c Subtotaal / 5g Totaal $data{sub1} = $data{tot} = $tot; $data{onbekend} = $xx if $xx; # 5d Kleine Ondernemers if ( $self->{compat_periode} =~ /^\d\d\d\d$/ ) { # aangifte per jaar if ( $data{ko} = kleine_ondernemers($self->{compat_periode}, $data{sub1}) ) { $data{tot} -= $data{ko}; } } # Check op afgedragen BTW. foreach my $acc ( @{$dbh->std_accs} ) { next unless $acc =~ /^btw_v(.)$/; my $t = $1; ($vb) = @{$dbh->do("SELECT SUM(jnl_amount)". " FROM Journal". " WHERE ( jnl_acc_id = ? )". " AND jnl_bsr_date >= ? AND jnl_bsr_date <= ?", $dbh->std_acc($acc), $begin, $end)}; next unless defined($vb); $vb = -$vb; if ( $data{"deb_btw_$t"} != ($v = rounddown($vb)) ) { $data{"btw_v${t}_delta"} = $v - $data{"deb_btw_$t"}; $data{"deb_btw_$t"} = $v; } } $data{btw_i_delta} = $btw_i_delta if $btw_i_delta; $data{delta} = $delta if $delta; return \%data; } sub report { my ($self, $rep, $data) = @_; my $outline = sub { my ($column, $desc, $sub, $amt) = @_; $rep->add({ _style => 'd', num => $column, desc => $desc, defined($sub) ? ( col1 => $noround ? numfmt($sub) : $sub) : (), defined($amt) ? (col2 => $noround ? numfmt($amt) : $amt) : (), }); }; $rep->start(_T("BTW Aangifte"), $self->{compat_periode} ? __x("Periode: {per}", per => $self->{compat_periode}) : __x("Periode: {from} t/m {to}", from => datefmt_full($rep->{per_begin}), to => datefmt_full($rep->{per_end}))); # Binnenland $rep->add({ _style => 'h1', num => "Binnenland" }); # 1. Door mij verrichte leveringen/diensten $rep->add({ _style => 'h2', num => "1. Door mij verrichte leveringen/diensten", }); # 1a. Belast met hoog tarief $outline->("1a", "Belast met hoog tarief", $data->{deb_h}, $data->{deb_btw_h}); # 1b. Belast met laag tarief $outline->("1b", "Belast met laag tarief", $data->{deb_l}, $data->{deb_btw_l}); # 1c. Belast met ander, niet-nul tarief $outline->("1c", "Belast met ander tarief", $data->{deb_a}, $data->{deb_btw_a}) if $data->{deb_a} || $data->{deb_btw_a}; # 1d. Eigen gebruik $outline->("1d", "Eigen gebruik", $data->{deb_p}, $data->{deb_btw_p}) if $data->{deb_p} || $data->{deb_btw_p}; # 1e. Belast met 0%/verlegd $outline->("1e", "Belast met 0% / verlegd", $data->{deb_0}, undef); # Buitenland $rep->add({ _style => 'h1', num => "Buitenland" }); # 3. Door mij verrichte leveringen $rep->add({ _style => 'h2', num => "3. Door mij verrichte leveringen" }); # 3a. Buiten de EU $outline->("3a", "Buiten de EU", $data->{extra_deb}, undef); # 3b. Binnen de EU $outline->("3b", "Binnen de EU", $data->{intra_deb}, undef); # 4. Aan mij verrichte leveringen $rep->add({ _style => 'h2', num => "4. Aan mij verrichte leveringen" }); # 4a. Van buiten de EU $outline->("4a", "Van buiten de EU", $data->{extra_crd}, 0); # 4b. Verwervingen van goederen uit de EU. $outline->("4b", "Verwervingen van goederen uit de EU", $data->{intra_crd}, $data->{intra_crd_btw}); # 5 Berekening totaal $rep->add({ _style => 'h1', num => "Berekening" }); $rep->add({ _style => 'h2', num => "5. Berekening totaal" }); # 5a. Subtotaal $outline->("5a", "Subtotaal", undef, $data->{sub0}); # 5b. Voorbelasting $outline->("5b", "Voorbelasting", undef, $data->{vb}); # 5c Subtotaal $outline->("5c", "Subtotaal", undef, $data->{sub1}); if ( $self->{compat_periode} =~ /^\d\d\d\d$/ ) { # aangifte per jaar if ( defined($data->{ko}) ) { # 5d Subtotaal $outline->("5d", "Vermindering kleineondernemersregeling", undef, $data->{ko}); } else { $outline->("5d", "Geen gegevens voor kleineondernemersregeling", undef, undef); } } # 5g Subtotaal if ( $data->{tot} >= 0 ) { $outline->("5g", "Totaal te betalen", undef, $data->{tot}); if ( $data->{delta} ) { $outline->("", "Totaal te betalen (onafgerond)", numfmt($data->{sub1}*AMTSCALE+$data->{delta})); $outline->("", "Afrondingsverschil", numfmt($data->{delta})); } } else { $outline->("5g", "Totaal terug te vragen", undef, 0-$data->{tot}); if ( $data->{delta} ) { $outline->('', "Totaal terug te vragen (onafgerond)", numfmt(-($data->{sub1}*AMTSCALE+$data->{delta}))); $outline->('', "Afrondingsverschil", numfmt($data->{delta})); } } $outline->("?", "Onbekend", undef, numfmt($data->{onbekend})) if $data->{onbekend}; my @msg; if ( $data->{btw_i_delta} ) { push(@msg, __x("Er is een verschil van {round}{amount}". " tussen de berekende en werkelijk ingehouden BTW.". " Voor de aangifte is de werkelijk ingehouden waarde gebruikt.", round => $noround ? "" : "(afgerond) ", amount => numfmt($noround ? $data->{btw_i_delta} : AMTSCALE*roundup($data->{btw_i_delta})))); } foreach my $type ( @{BTWTARIEVEN()} ) { my $t = lc(substr($type, 0, 1)); if ( $data->{"btw_v".$t."_delta"} ) { push(@msg, __x("Er is een verschil van {round}{amount}". " tussen de berekende en werkelijk afgedragen BTW {type}.". " Voor de aangifte is de werkelijk afgedragen waarde gebruikt.", type => $type, round => $noround ? "" : "(afgerond) ", amount => numfmt(($noround ? 1 : AMTSCALE) * $data->{"btw_v".$t."_delta"}))); } } $rep->finish(@msg); } ################ Subroutines ################ sub rounddown { my ($vb) = @_; return 0 unless $vb; return $vb if $noround; $vb /= AMTSCALE; if ( $vb >= 0 ) { $vb = floor($vb); } else { $vb = -ceil(abs($vb)); } $vb; } sub roundup { my ($vb) = @_; return 0 unless $vb; return $vb if $noround; $vb /= AMTSCALE; if ( $vb >= 0 ) { $vb = ceil($vb); } else { $vb = -floor(abs($vb)); } $vb; } sub roundtozero { my ($vb) = @_; return 0 unless $vb; return $vb if $noround; $vb /= AMTSCALE; if ( $vb >= 0 ) { $vb = floor($vb); } else { $vb = 0-floor(abs($vb)); } $vb; } sub kleine_ondernemers { my ($year, $amount) = @_; return 0 if $amount < 0; # Formule lijkt linds 1995 ongwijzigd, alleen de bedragen # veranderen. Sinds 2002 zijn de bedragen ongewijzigd. Alle # officiële documentatie spreeekt over "Als de afdracht van # omzetbelasting beneden de 1.345 per jaar blijft, ...". # Code change: beschouw de huidige bedragen als vaststaand. return if $year < 2002; # my %mmtab = ( 2002 => [ 1345, 1883 ], # 2003 => [ 1345, 1883 ], # 2004 => [ 1345, 1883 ], # 2005 => [ 1345, 1883 ], # 2006 => [ 1345, 1883 ], # 2007 => [ 1345, 1883 ], # ); # # $mmtab{$year} ||= [ 1345, 1883 ] if $year >= 2002; # # return unless exists $mmtab{$year}; # # my ($min, $max) = @{$mmtab{$year}}; my ($min, $max) = ( 1345, 1883 ); if ( $noround ) { $min *= AMTSCALE; $max *= AMTSCALE; } return $amount if $amount <= $min; return 0 if $amount > $max; my $kko = ($min / ($max - $min)) * ($max - $amount); return $noround ? $kko : roundup($kko*AMTSCALE); } sub warnings { my $self = shift; return unless @_; my (@msgs) = @_; foreach ( @msgs ) { warn("!".$_."\n"); } } package EB::Report::BTWAangifte::Text; use strict; use warnings; use base qw(EB::Report::Reporter::Text); # Style mods. sub style { my ($self, $row, $cell) = @_; my $stylesheet = { h1 => { _style => { skip_before => 1, skip_after => 1 }, num => { colspan => 2 }, }, h2 => { _style => { skip_before => 1, skip_after => 1 }, num => { colspan => 2 }, }, d => { }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } sub finish { shift->SUPER::finish; EB::Report::BTWAangifte::warnings(undef, @_); } package EB::Report::BTWAangifte::Html; use strict; use warnings; use base qw(EB::Report::Reporter::Html); # Style mods. sub style { my ($self, $row, $cell) = @_; my $stylesheet = { h1 => { num => { class => "heading", colspan => 2 }, }, h2 => { num => { class => "subheading", colspan => 2 }, }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } sub finish { my $self = shift; if ( @_ ) { print { $self->{fh} } ("
\n"); print { $self->{fh} } ("

\n"); print { $self->{fh} } (join("
\n", map { $self->html($_) } @_) ); print { $self->{fh} } ("

\n"); print { $self->{fh} } ("\n"); } $self->SUPER::finish; } package EB::Report::BTWAangifte::Csv; use strict; use warnings; use base qw(EB::Report::Reporter::Csv); sub finish { shift->SUPER::finish; EB::Report::BTWAangifte::warnings(undef, @_); } 1; EekBoek-2.02.04/lib/EB/Report/Reporter.pm0000444000076500007650000001032012165465617015474 0ustar jvjv#! perl # Reporter.pm -- # Author : Johan Vromans # Created On : Wed Dec 28 13:18:40 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:40:09 2010 # Update Count : 152 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Report::Reporter; use strict; use warnings; use EB; use EB::Format; sub new { my ($class, $style, $config) = @_; if ( @_ == 2 ) { $config = $style->{LAYOUT}; $style = $style->{STYLE}; } $class = ref($class) || $class; my $self = bless { _fields => [], _fdata => {}, _style => $style, }, $class; foreach my $col ( @$config ) { if ( $col->{name} ) { if ( $col->{name} eq "_colsep" ) { $self->{_colsep} = $col->{sep} || (" " x $col->{width}); next; } my $a = { name => $col->{name} }; $a->{title} = $col->{title} || ""; $a->{width} = $col->{width} || length($a->{title}); $a->{align} = $col->{align} || "<"; $a->{style} = $col->{style} || $col->{name}; $self->{_fdata}->{$a->{name}} = $a; push(@{$self->{_fields}}, $a); if ( my $t = $cfg->val("layout $style", $col->{name}."_width", undef) ) { $self->widths({$col->{name} => $t}); } } else { die("?"._T("Ontbrekend \"name\" of \"style\"")); } } if ( my $t = $cfg->val("layout $style", "fields", undef) ) { $self->fields(split(' ', $t)); } # Return object. $self; } sub fields { my ($self, @f) = @_; my @nf; # new order of fields foreach my $fld ( @f ) { my $a = $self->{_fdata}->{$fld}; die("?".__x("Onbekend veld: {fld}", fld => $fld)."\n") unless defined($a); push(@nf, $a); } $self->{_fields} = \@nf; # PBP: Return nothing sensible. return; } sub widths { my ($self, $w) = @_; while ( my($fld,$width) = each(%$w) ) { die("?".__x("Onbekend veld: {fld}", fld => $fld)."\n") unless defined($self->{_fdata}->{$fld}); my $ow = $self->{_fdata}->{$fld}->{width}; if ( $width =~ /^\+(\d+)$/ ) { $ow += $1; } elsif ( $width =~ /^-(\d+)$/ ) { $ow -= $1; } elsif ( $width =~ /^(\d+)\%$/ ) { $ow *= $1; $ow = int($ow/100); } elsif ( $width =~ /^\d+$/ ) { $ow = $width; } else { die("?".__x("Ongeldige breedte {w} voor veld {fld}", fld => $fld, w => $width)."\n"); } $self->{_fdata}->{$fld}->{width} = $ow; } # PBP: Return nothing sensible. return; } sub start { my $self = shift; my ($t1, $t2, $t3l, $t3r) = @_; # Top title. if ( !$t1 ) { # This one really should be filled in with something distinguishing. $t1 = _T("Rapportage"); } # Report date / period. if ( !$t2 ) { $t2 = "Periode: ****"; if ( exists($self->{periodex}) ) { if ( $self->{periodex} == 1 ) { $t2 = __x("Periode: t/m {to}", to => datefmt_full($self->{periode}->[1])); } else { $t2 = __x("Periode: {from} t/m {to}", from => datefmt_full($self->{periode}->[0]), to => datefmt_full($self->{periode}->[1])); } } } # Administration name. if ( !$t3l ) { $t3l = $::dbh->adm("name"); } # Creation date + program version if ( !$t3r ) { if ( my $t = $cfg->val(qw(internal now), 0) ) { # Fixed date. Strip program version. Makes it easier to compare reports. $t3r = (split(' ', $EB::ident))[0] . ", " . $t; } else { # Use current date. $t3r = $EB::ident . ", " . datefmt_full(iso8601date()); } } # Move to self. $self->{_title1} = $t1; $self->{_title2} = $t2; $self->{_title3l} = $t3l; $self->{_title3r} = $t3r; $self->{_needhdr} = 1; $self->{_needskip} = 0; $self->{fh} ||= *STDOUT; } sub finish { my ($self) = @_; } sub add { my ($self, $data) = @_; while ( my($k,$v) = each(%$data) ) { die("?",__x("Ongeldig veld: {fld}", fld => $k)) unless defined $self->{_fdata}->{$k}; } } sub style { return } sub _getstyle { my ($self, $row, $cell) = @_; return $self->style($row) unless $cell; my $a = $self->style("_any", $cell) || {}; my $b = $self->style($row, $cell) || {}; return { %$a, %$b }; } sub _checkhdr { my ($self) = @_; return unless $self->{_needhdr}; $self->{_needhdr} = 0; $self->header; } 1; EekBoek-2.02.04/lib/EB/Report/Open.pm0000444000076500007650000001233612165465617014604 0ustar jvjv#! perl package main; our $config; our $dbh; package EB::Report::Open; # Author : Johan Vromans # Created On : Fri Sep 30 17:48:16 2005 # Last Modified By: Johan Vromans # Last Modified On: Sun Jun 24 22:29:59 2012 # Update Count : 206 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; ################ The Process ################ use EB; use EB::Format; use EB::Report::GenBase; ################ Subroutines ################ sub new { return bless {}; } sub perform { my ($self, $opts, $args) = @_; $opts->{STYLE} = "openstaand"; $opts->{LAYOUT} = [ { name => "rel", title => _T("Relatie"), width => 10, }, { name => "date", title => _T("Datum"), width => $date_width, }, { name => "desc", title => _T("Omschrijving"), width => 30, }, { name => "amt", title => _T("Bedrag"), width => $amount_width, align => ">", }, { name => "bsk", title => _T("Boekstuk"), width => 16, }, ]; my $rep = EB::Report::GenBase->backend($self, $opts); my $per = $rep->{per} = $rep->{periode}->[1]; $rep->{periodex} = 1; # force 'per'. my $sel; if ( $opts->{deb} && !$opts->{crd} ) { $sel = " AND dbk_type = @{[DBKTYPE_VERKOOP]}"; } elsif ( !$opts->{deb} && $opts->{crd} ) { $sel = " AND dbk_type = @{[DBKTYPE_INKOOP]}"; } else { $sel = " AND dbk_type in (@{[DBKTYPE_INKOOP]},@{[DBKTYPE_VERKOOP]})"; } if ( $args && @$args == 1 ) { $sel .= " AND bsr_rel_code = ?"; } my $eb = $opts->{eb_handle}; my $gtot = 0; # grand total deb/crd my $rtot = 0; # relation total my $sth = $dbh->sql_exec("SELECT bsk_id, dbk_id, dbk_desc, bsk_nr, bsk_desc, bsk_date,". " bsk_open, dbk_type, dbk_acc_id, bsr_rel_code, bsk_bky". " FROM Boekstukken, Dagboeken, Boekstukregels". " WHERE bsk_dbk_id = dbk_id". " AND bsr_bsk_id = bsk_id AND bsr_nr = 1". " AND bsk_date <= ?". $sel. " ORDER BY dbk_acc_id, bsr_rel_code, bsk_date", $per, @$args); $rep->start(_T("Openstaande posten")); my $cur_rel; my $cur_cat; my $did; while ( my $rr = $sth->fetchrow_arrayref ) { my ($bsk_id, $dbk_id, $dbk_desc, $bsk_nr, $bsk_desc, $bsk_date, $bsk_amount, $dbk_type, $dbk_acc_id, $bsr_rel, $bsk_bky) = @$rr; # Correct for future payments. my $rop = $dbh->do("SELECT sum(bsr_amount)". " FROM Boekstukregels". " WHERE bsr_type IN (@{[DBKTYPE_INKOOP]},@{[DBKTYPE_VERKOOP]})". " AND bsr_date > ?". " AND bsr_paid = ?", $per, $bsk_id); if ( $rop && $rop->[0] ) { $bsk_amount -= $rop->[0]; } next unless $bsk_amount; if ( defined($cur_rel) && $bsr_rel ne $cur_rel ) { $rep->add({ _style => "trelatie", desc => __x("Totaal {rel}", rel => $cur_rel), amt => numfmt($rtot), }); $rtot = 0; } if ( defined($cur_cat) && $dbk_acc_id ne $cur_cat ) { $rep->add({ _style => "tdebcrd", desc => __x("Totaal {debcrd}", debcrd => $dbh->lookup($cur_cat, qw(Accounts acc_id acc_desc))), amt => numfmt($gtot), }); $gtot = 0; $rtot = 0; } $bsk_amount = 0-$bsk_amount if $dbk_type == DBKTYPE_INKOOP; if ( $eb ) { my $t = lc($dbk_desc); $t =~ s/\s+/_/g; print {$eb} ("adm_relatie ", join(":", $t, $bsk_bky, $bsk_nr), " ", $bsk_date, " \"", $bsr_rel, "\" \"", $bsk_desc, "\" ", numfmt_plain($bsk_amount), "\n"); } my $bsk; my $style = $dbk_type == DBKTYPE_INKOOP ? "cdata" : $dbk_type == DBKTYPE_VERKOOP ? "ddata" : "data"; if ( $bsk_date lt $rep->{per_begin} ) { $bsk = join(":", $dbk_desc, $bsk_bky, $bsk_nr); $style = "prevdata"; } else { $bsk = join(":", $dbk_desc, $bsk_nr); } $rep->add({ _style => $style, date => datefmt($bsk_date), bsk => $bsk, desc => $bsk_desc, rel => $bsr_rel, amt => numfmt($bsk_amount), }); $gtot += $bsk_amount; $rtot += $bsk_amount; $cur_rel = $bsr_rel; $cur_cat = $dbk_acc_id; $did++; } if ( defined($cur_rel) ) { $rep->add({ _style => "trelatie", desc => __x("Totaal {rel}", rel => $cur_rel), amt => numfmt($rtot), }); $rtot = 0; } if ( defined($cur_cat) ) { $rep->add({ _style => "tdebcrd", desc => __x("Totaal {debcrd}", debcrd => $dbh->lookup($cur_cat, qw(Accounts acc_id acc_desc))), amt => numfmt($gtot), }); } if ( $did ) { $rep->add({ _style => "last" }); $rep->finish; } else { return "!"._T("Geen openstaande posten gevonden"); } return; } package EB::Report::Open::Text; use strict; use warnings; use base qw(EB::Report::Reporter::Text); # Style mods. sub style { my ($self, $row, $cell) = @_; my $stylesheet = { trelatie => { _style => { skip_after => 1 }, }, tdebcrd => { _style => { cancel_skip => 1, skip_after => 1 }, amt => { line_before => 1 }, }, last => { _style => { line_before => 1 }, }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } package EB::Report::Open::Html; use strict; use warnings; use base qw(EB::Report::Reporter::Html); package EB::Report::Open::Csv; use strict; use warnings; use base qw(EB::Report::Reporter::Csv); 1; EekBoek-2.02.04/lib/EB/Report/Proof/0000755000076500007650000000000012165465617014427 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Proof/Wxhtml.pm0000444000076500007650000000220212165465617016242 0ustar jvjv#! perl # Wxhtml.pm -- WxHtml backend for Proof/Saldi report. # Author : Johan Vromans # Created On : *** # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:38:57 2010 # Update Count : 4 # Status : Unknown, Use with caution! package EB::Report::Proof::Wxhtml; use strict; use warnings; use base qw(EB::Report::Reporter::WxHtml); sub style { my ($self, $row, $cell) = @_; my $stylesheet = { d => { acct => { link => "gbk://" }, }, d2 => { acct => { link => "gbk://" }, desc => { indent => 2 }, }, h1 => { _style => { colour => 'red', size => '+2', } }, h2 => { _style => { colour => 'red' }, desc => { indent => 1,}, }, t1 => { _style => { colour => 'blue', size => '+1', } }, t2 => { _style => { colour => 'blue' }, desc => { indent => 1 }, }, v => { _style => { colour => 'red', size => '+2', } }, grand => { _style => { colour => 'blue' } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } 1; EekBoek-2.02.04/lib/EB/Report/Debcrd/0000755000076500007650000000000012165465617014525 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Debcrd/Wxhtml.pm0000444000076500007650000000140712165465617016346 0ustar jvjv#! perl # Wxhtml.pm -- # Author : Johan Vromans # Created On : Thu Feb 7 13:21:53 2008 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:35:31 2010 # Update Count : 23 # Status : Unknown, Use with caution! #! perl package EB::Report::Debcrd::Wxhtml; use strict; use warnings; use base qw(EB::Report::Reporter::WxHtml); sub style { my ($self, $row, $cell) = @_; my $stylesheet = { bsk => { bsknr => { link => "jnl://" }, }, paid => { bsknr => { link => "jnl://" }, }, h1 => { _style => { colour => 'red', size => '+2', } }, grand => { _style => { colour => 'blue' } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } 1; EekBoek-2.02.04/lib/EB/Report/Grootboek.pm0000444000076500007650000001463712165465617015644 0ustar jvjv#! perl package main; our $cfg; our $dbh; package EB::Report::Grootboek; # Author : Johan Vromans # Created On : Wed Jul 27 11:58:52 2005 # Last Modified By: Johan Vromans # Last Modified On: Thu Jun 7 13:59:31 2012 # Update Count : 287 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; ################ The Process ################ use EB; use EB::Booking; # for dcfromtd() use EB::Format; use EB::Report::GenBase; use EB::Report; ################ Subroutines ################ sub new { return bless {}; } sub perform { my ($self, $opts) = @_; my $detail = $opts->{detail}; my $sel = $opts->{select}; $opts->{STYLE} = "grootboek"; $opts->{LAYOUT} = [ { name => "acct", title => _T("GrBk"), width => 5, align => ">" }, { name => "desc", title => _T("Grootboek/Boekstuk"), width => 30, }, { name => "date", title => _T("Datum"), width => $date_width }, { name => "deb", title => _T("Debet"), width => $amount_width, align => ">" }, { name => "crd", title => _T("Credit"), width => $amount_width, align => ">" }, { name => "bsk", title => _T("BoekstukNr"), width => 14, }, { name => "rel", title => _T("Relatie"), width => 10, }, ]; my $rep = EB::Report::GenBase->backend($self, $opts); my $per = $rep->{periode}; my ($begin, $end) = @$per; if ( my $t = $cfg->val(qw(internal now), 0) ) { $end = $t if $t lt $end; } $rep->start(_T("Grootboek")); $dbh->begin_work; my $table = EB::Report->GetTAccountsAll($begin, $end); my $ah = $dbh->sql_exec("SELECT acc_id,acc_desc,acc_ibalance,acc_balres". " FROM ${table}". ($sel ? (" WHERE acc_id IN ($sel)") : (" WHERE acc_ibalance <> 0". " OR acc_id in". " ( SELECT DISTINCT jnl_acc_id FROM Journal )")). " ORDER BY acc_id"); my $dgrand = 0; my $cgrand = 0; my $mdgrand = 0; my $mcgrand = 0; my $n0 = numfmt(0); my $t; my $did = 0; while ( my $ar = $ah->fetchrow_arrayref ) { my ($acc_id, $acc_desc, $acc_ibalance, $acc_balres) = @$ar; my $sth = $dbh->sql_exec("SELECT jnl_amount,jnl_damount,jnl_bsk_id,bsk_desc,". "bsk_nr,dbk_desc,dbk_dcsplit,jnl_bsr_date,jnl_desc,jnl_rel". " FROM Journal, Boekstukken, Dagboeken". " WHERE jnl_dbk_id = dbk_id". " AND jnl_bsk_id = bsk_id". " AND jnl_acc_id = ?". " AND jnl_date >= ? AND jnl_date <= ?". " ORDER BY jnl_bsr_date, jnl_bsk_id, jnl_seq", $acc_id, $begin, $end); my $rr = $sth->fetchrow_arrayref; if ( !$acc_ibalance && !$rr ) { $sth->finish; next; } $rep->add({ _style => 'h1', acct => $acc_id, desc => $acc_desc, }) if $detail; my $a = { _style => 'h2', desc => _T("Beginsaldo") }; if ( $acc_ibalance ) { if ( $acc_ibalance < 0 ) { $a->{crd} = numfmt(-$acc_ibalance); $a->{deb} = $n0; } else { $a->{crd} = $n0; $a->{deb} = numfmt($acc_ibalance); } } else { $a->{deb} = $a->{crd} = $n0; } $rep->add($a) if $detail > 0; my $dtot = 0; my $ctot = 0; my $dcsplit; # any acct was DC split while ( $rr ) { my ($amount, $damount, $bsk_id, $bsk_desc, $bsk_nr, $dbk_desc, $dbk_dcsplit, $date, $desc, $rel) = @$rr; warn("?Internal error: delta amount while no DC split, acct = $acc_id ($acc_desc)\n") if defined($damount) && !$dbk_dcsplit; $dcsplit ||= $dbk_dcsplit; my ($deb, $crd) = EB::Booking::dcfromtd($amount, $damount); $ctot += $crd if $crd; $dtot += $deb if $deb; $rep->add({ _style => 'd', desc => $desc, date => datefmt($date), deb => numfmt($deb), crd => numfmt($crd), bsk => join(":", $dbk_desc, $bsk_nr), $rel ? ( rel => $rel) : (), }) if $detail > 1; $rr = $sth->fetchrow_arrayref; } $a = { _style => 't2', desc => _T("Totaal mutaties") }; if ( $dcsplit ) { $a->{crd} = numfmt($ctot); $a->{deb} = numfmt($dtot); $mdgrand += $dtot if $dtot; $mcgrand += $ctot if $ctot; } elsif ( $ctot > $dtot ) { $a->{crd} = numfmt($ctot-$dtot); $mcgrand += $ctot - $dtot; } else { $a->{deb} = numfmt($dtot-$ctot); $mdgrand += $dtot - $ctot; } $rep->add($a) if $detail && ($dtot || $ctot || $acc_ibalance); $rep->add({ _style => 't1', acct => $acc_id, desc => __x("Totaal {adesc}", adesc => $acc_desc), $ctot > $dtot + $acc_ibalance ? ( crd => numfmt($ctot-$dtot-$acc_ibalance) ) : ( deb => numfmt($dtot+$acc_ibalance-$ctot) ), }); if ( $ctot > $dtot + $acc_ibalance ) { $cgrand += $ctot - $dtot-$acc_ibalance; } else { $dgrand += $dtot+$acc_ibalance - $ctot; } $did++; } if ( $did ) { $rep->add({ _style => 'tm', desc => _T("Totaal mutaties"), deb => numfmt($mdgrand), crd => numfmt($mcgrand), }); $rep->add({ _style => 'tg', desc => _T("Totaal"), $cgrand || 1 ? ( crd => numfmt($cgrand) ) : (), $dgrand || !$cgrand ? ( deb => numfmt($dgrand) ) : (), }); } else { print("?"._T("Geen informatie gevonden")."\n"); } $rep->finish; # Rollback temp table. $dbh->rollback; } package EB::Report::Grootboek::Text; use EB; use base qw(EB::Report::Reporter::Text); sub new { my ($class, $opts) = @_; my $self = $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); $self->{detail} = $opts->{detail}; return $self; } # Style mods. sub style { my ($self, $row, $cell) = @_; my $stylesheet = { _any => { # desc => { truncate => 1 }, }, h2 => { desc => { indent => 1 }, }, d => { desc => { indent => 2 }, }, t1 => { _style => { skip_after => ($self->{detail} > 0) }, }, t2 => { desc => { indent => 1 }, }, tm => { _style => { skip_before => 1 }, }, tg => { _style => { line_before => 1 } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } package EB::Report::Grootboek::Html; use EB; use base qw(EB::Report::Reporter::Html); sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } package EB::Report::Grootboek::Csv; use EB; use base qw(EB::Report::Reporter::Csv); use strict; sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } 1; EekBoek-2.02.04/lib/EB/Report/Reporter/0000755000076500007650000000000012165465617015144 5ustar jvjvEekBoek-2.02.04/lib/EB/Report/Reporter/Text.pm0000444000076500007650000001417012165465617016427 0ustar jvjv#! perl # Text.pm -- Reporter backend for text reports. # Author : Johan Vromans # Created On : Wed Dec 28 13:21:11 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:39:44 2010 # Update Count : 119 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Report::Reporter::Text; use strict; use warnings; use EB; use base qw(EB::Report::Reporter); ################ API ################ sub start { my ($self, @args) = @_; $self->SUPER::start(@args); $self->_make_format; $self->{_lines} = 0; $self->{_page} = 0; $self->{_colsep} = " " unless defined $self->{_colsep}; } sub finish { my ($self) = @_; $self->_checkskip(1); # cancel skips. $self->SUPER::finish(); close($self->{fh}); } sub add { my ($self, $data) = @_; my $style = delete($data->{_style}); $self->SUPER::add($data); $self->_checkhdr; my $skip_after = 0; my $line_after = 0; my $cancel_skip = 0; if ( $style and my $t = $self->_getstyle($style) ) { $self->_skip if $t->{skip_before}; $skip_after = $t->{skip_after}; $self->_line if $t->{line_before}; $line_after = $t->{line_after}; $cancel_skip = $t->{cancel_skip}; } $self->_checkskip($cancel_skip); my @values; my @widths; my @indents; my $linebefore; my $lineafter; my $colspan = 0; my $lw; #push(@values, $style||"") if $cfg->val(__PACKAGE__, "layout", 0); foreach my $col ( @{$self->{_fields}} ) { if ( $colspan > 1 ) { $colspan--; $$lw += $col->{width} + length($self->{_colsep}); push(@values, ""); push(@widths, 0); push(@indents, 0); next; } my $fname = $col->{name}; push(@values, defined($data->{$fname}) ? $data->{$fname} : ""); push(@widths, $col->{width}); # Examine style mods. my $indent = 0; my $excess = 0; if ( $style ) { if ( my $t = $self->_getstyle($style, $fname) ) { $indent = $t->{indent} || 0; if ( $t->{line_before} ) { $linebefore->{$fname} = ($t->{line_before} eq "1" ? "-" : $t->{line_before}) x $col->{width}; } if ( $t->{line_after} ) { $lineafter->{$fname} = ($t->{line_after} eq "1" ? "-" : $t->{line_after}) x $col->{width}; } if ( $t->{excess} ) { #### TODO $widths[-1] += $t->{excess}; } if ( $t->{truncate} ) { $values[-1] = substr($values[-1], 0, $widths[-1] - $indent); } if ( $t->{colspan} ) { $colspan = $t->{colspan}; $lw = \$widths[-1]; } } } push(@indents, $indent); } # use Data::Dumper; # warn(Dumper \@values); # warn(Dumper \@widths); if ( $linebefore ) { $self->add($linebefore); } my @lines; while ( 1 ) { my $more = 0; my @v; foreach my $i ( 0..$#widths ) { my $ind = $indents[$i]; my $maxw = $widths[$i] - $ind; $ind = " " x $ind; if ( length($values[$i]) <= $maxw ) { push(@v, $ind.$values[$i]); $values[$i] = ""; } else { my $t = substr($values[$i], 0, $maxw); if ( substr($values[$i], $maxw, 1) eq " " ) { push(@v, $ind.$t); substr($values[$i], 0, length($t) + 1, ""); } elsif ( $t =~ /^(.*)([ ]+)/ ) { my $pre = $1; push(@v, $ind.$pre); substr($values[$i], 0, length($pre) + length($2), ""); } else { push(@v, $ind.$t); substr($values[$i], 0, $maxw, ""); } $more++; } } my $t = $self->_format_line(\@v, \@widths); $t =~ s/ +$//; push(@lines, $t) if $t =~ /\S/; last unless $more; } if ( $self->{_lines} < @lines ) { $self->{_needhdr} = 1; $self->_checkhdr; } print {$self->{fh}} @lines; $self->{_lines} -= @lines; # Post: Lines for cells. if ( $lineafter ) { $self->add($lineafter); } # Post: Line for row. if ( $line_after ) { $self->_line; } # Post: Skip after this row. elsif ( $skip_after ) { $self->_skip; } } ################ Pseudo-Internal (used by Base class) ################ sub header { my ($self) = @_; my $t = sprintf("%s\n" . "%-" . ($self->{_width}-10) . "s%10s\n" . "%-" . ($self->{_width}-31) . "s%31s\n" . "\n", $self->_center($self->{_title1}, $self->{_width}), $self->{_title2}, 1 ? "" : ("Blad: " . (++$self->{_page})), $self->{_title3l}, $self->{_title3r}); if ( grep { $_->{title} =~ /\S/ } @{$self->{_fields}} ) { $t .= $self->_format_line([map { $_->{title} } @{$self->{_fields}}], [map { $_->{width} } @{$self->{_fields}}]), } $t =~ s/ +$//gm; print {$self->{fh}} ($t); $self->_line; $self->_checkskip(1); # cancel skips. $self->{_lines} = $self->{page} - 6; } ################ Internal methods ################ sub _make_format { my ($self) = @_; my $width = 0; # new width my $cs = $self->{_colsep} || " "; my $cw = length($cs); foreach my $a ( @{$self->{_fields}} ) { $width += $a->{width} + $cw; } $self->{_width} = $width - $cw; # PBP: Return nothing sensible. return; } sub _format_line { my ($self, $values, $widths) = @_; my $t = ""; my $i = 0; for ( my $i = 0; $i <= $#{$self->{_fields}}; $i++ ) { $t .= $self->{_colsep} if $t ne '' && $widths->[$i]; my $a = $self->{_fields}->[$i]; my $v = shift(@$values); if ( $a->{align} eq '<' ) { $t .= $v; $t .= ' ' x ($widths->[$i] - length($v)); } #elsif ( $a->{align} eq '<' ) { else { $t .= ' ' x ($widths->[$i] - length($v)); $t .= $v; } $i += $a->{colspan} if $a->{colspan}; } $t . "\n"; } sub _checkskip { my ($self, $cancel) = @_; return if !$self->{_needskip} || $self->{_lines} <= 0; $self->{_lines}--, print {$self->{fh}} ("\n") unless $cancel; $self->{_needskip} = 0; } sub _line { my ($self) = @_; $self->_checkhdr; $self->_checkskip(1); # cancel skips. print {$self->{fh}} ("-" x ($self->{_width}), "\n"); $self->{_lines}--; } sub _skip { my ($self) = @_; $self->_checkhdr; $self->{_needskip} = 1; } sub _center { my ($self, $text, $width) = @_; (" " x (($width - length($text))/2)) . $text; } sub _expand { my ($self, $text) = @_; $text =~ s/(.)/$1 /g; $text =~ s/ +$//; $text; } 1; EekBoek-2.02.04/lib/EB/Report/Reporter/Csv.pm0000444000076500007650000000325712165465617016242 0ustar jvjv#! perl # Csv.pm -- Reporter backend for CSV reports. # Author : Johan Vromans # Created On : Thu Jan 5 18:47:37 2006 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:39:24 2010 # Update Count : 16 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Report::Reporter::Csv; use strict; use warnings; use EB; use base qw(EB::Report::Reporter); ################ API ################ sub start { my ($self, @args) = @_; $self->SUPER::start(@args); } sub finish { my ($self) = @_; $self->SUPER::finish(); close($self->{fh}); } my $sep; sub add { my ($self, $data) = @_; my $style = delete($data->{_style}); $self->SUPER::add($data); return unless %$data; $sep = $self->{_sep} ||= $cfg->val(qw(csv separator), ","); $self->_checkhdr; my $line; foreach my $col ( @{$self->{_fields}} ) { my $fname = $col->{name}; my $value = defined($data->{$fname}) ? _csv($data->{$fname}) : ""; $line .= $sep if defined($line); $line .= $value; } print {$self->{fh}} ($line, "\n"); } ################ Pseudo-Internal (used by Base class) ################ sub header { my ($self) = @_; if ( grep { $_->{title} =~ /\S/ } @{$self->{_fields}} ) { print {$self->{fh}} (join($sep, map { _csv($_->{title}||"") } @{$self->{_fields}}), "\n"); } } ################ Internal methods ################ sub _csv { my ($value) = @_; # Quotes must be doubled. $value =~ s/"/""/g; # Quote if anything non-simple. $value = '"' . $value . '"' if $value =~ /\s|\Q$sep\E|"/ || $value !~ /^[+-]?\d+([.,]\d+)?/; return $value; } 1; EekBoek-2.02.04/lib/EB/Report/Reporter/WxHtml.pm0000444000076500007650000001216712165465617016732 0ustar jvjv#! perl # WxHtml.pm -- Reporter backend for WxHtml # Author : Johan Vromans # Created On : Fri Mar 2 21:01:17 2007 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:39:59 2010 # Update Count : 70 # Status : Unknown, Use with caution! # WxHtmlWindow supports HTML, but to a limited extent. In particular, # no CSS. # For WxHtml we generate a simplified HTML, where the ornaments and # decorations are handled in the HTML subset supported. package main; our $cfg; our $dbh; package EB::Report::Reporter::WxHtml; use strict; use warnings; use EB; use base qw(EB::Report::Reporter); ################ API ################ sub new { my ($class, $opts) = @_; # This backend can collect the output in a scalar. my $o; $o = delete($opts->{output}) if $opts->{output} && UNIVERSAL::isa($opts->{output}, 'SCALAR'); my $self = $class->SUPER::new($opts); $self->{overall_font_size} = $cfg->val(qw(wxhtml fontsize), "0");; $self->{_OUT} = $o if $o; return $self; } my $html; sub start { my ($self, @args) = @_; eval { require HTML::Entities; }; $html = $@ ? \&__html : \&_html; $self->SUPER::start(@args); } sub finish { my ($self) = @_; $self->SUPER::finish(); $self->_print("
\n"); $self->_print("\n") if $self->{overall_font_size}; $self->_print("\n", "\n"); $self->_close; } sub add { my ($self, $data) = @_; my $style = delete($data->{_style}); $self->SUPER::add($data); return unless %$data; $self->_checkhdr; $self->_print("\n"); my %style; if ( $style && (my $t = $self->_getstyle($style)) ) { %style = %$t; } my $colspan = 0; foreach my $col ( @{$self->{_fields}} ) { if ( $colspan > 1 ) { $colspan--; next; } my $fname = $col->{name}; my $value = defined($data->{$fname}) ? $data->{$fname} : ""; my $align = $col->{align} eq "<" ? "left" : $col->{align} eq ">" ? "right" : "center"; $align = " align=\"$align\"" if $align; my $val = $value eq "" ? " " : $html->($value); # Examine style mods. my ($font, $weight, $italic, $indent); if ( $style ) { if ( my $t = $self->_getstyle($style, $fname) ) { $t = { %style, %$t }; my $colour = $t->{colour} || $t->{color} || ""; $colour = " color=\"$colour\"" if $colour; my $size = defined($t->{size}) ? " size=\"$t->{size}\"" : ""; $weight = [ "", "" ] if defined($t->{weight}) && $t->{weight} eq "bold"; $italic = [ "", "" ] if $t->{italic}; $font = [ "", "" ] if $colour || $size; $align = " align=\"$t->{align}\"" if $t->{align}; $indent = " " x (2 * $t->{indent}) if $t->{indent}; if ( $t->{colspan} && $t->{colspan} > 1 ) { $colspan = $t->{colspan}; $align .= " colspan=\"" . $colspan . "\""; } if ( $t->{link} && $value ne "" ) { my $v = "{link}.$value."?"; if ( $self->{periodex} ) { $v .= "periode=" . $self->{per_begin} . "-" . $self->{per_end} . "&"; } chop($v); $val = $v."\">$val"; } } } $self->_print("", $font ? $font->[0] : (), $weight ? $weight->[0] : (), $italic ? $italic->[0] : (), $indent ? $indent : (), $val, $italic ? $italic->[1] : (), $weight ? $weight->[1] : (), $font ? $font->[1] : (), "\n"); } $self->_print("\n"); } ################ Pseudo-Internal (used by Base class) ################ sub header { my ($self) = @_; my $ofs = $self->{overall_font_size}; $self->_print ("\n", "\n", "", $html->($self->{_title1}), "\n", "\n", "\n", $ofs ? "\n" : (), "

", $html->($self->{_title1}), "
\n", $html->($self->{_title2}), "
\n", $html->($self->{_title3l}), "
\n", " 

\n", $ofs ? "
\n" : (), $ofs ? "\n" : (), "\n"); if ( grep { $_->{title} =~ /\S/ } @{$self->{_fields}} ) { $self->_print("\n"); foreach ( @{$self->{_fields}} ) { $self->_print("\n"); } $self->_print("\n"); } } ################ Internal methods ################ sub _print { my $self = shift; if ( exists($self->{_OUT}) ) { ${$self->{_OUT}} .= $_ foreach @_; return; } $self->{fh}->print(@_); } sub _close { my $self = shift; if ( exists($self->{_OUT}) ) { return; } $self->{fh}->close; } sub html { my $self = shift; _html(@_); } sub _html { HTML::Entities::encode(shift); } sub __html { my ($t) = @_; $t =~ s/&/&/g; $t =~ s//>/g; $t =~ s/\240/ /g; $t =~ s/\x{eb}/ë/g; # for IVP. $t; } 1; EekBoek-2.02.04/lib/EB/Report/Reporter/Html.pm0000444000076500007650000001071212165465617016405 0ustar jvjv#! perl # Html.pm -- HTML backend for Reporters. # Author : Johan Vromans # Created On : Thu Dec 29 15:46:47 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:39:34 2010 # Update Count : 70 # Status : Unknown, Use with caution! package main; our $dbh; our $cfg; package EB::Report::Reporter::Html; use strict; use warnings; use EB; use EB::Format qw(datefmt_full); use base qw(EB::Report::Reporter); ################ API ################ my $html; sub start { my ($self, @args) = @_; eval { require HTML::Entities; }; $html = $@ ? \&__html : \&_html; $self->SUPER::start(@args); } sub finish { my ($self) = @_; $self->SUPER::finish(); print {$self->{fh}} ("
{align} eq "<" ? "left" : $_->{align} eq ">" ? "right" : "center", "\">", "", $html->($_->{title}), "
\n"); my $now = $cfg->val(qw(internal now), iso8601date()); # Treat empty value as no value. $now ||= iso8601date(); my $ident = $EB::ident; $ident = (split(' ', $ident))[0] if $cfg->val(qw(internal now), 0); $self->{fh}->print("

", __x("Overzicht aangemaakt op {date} door {ident}", ident => $ident, date => datefmt_full($now), url => $EB::url), "

\n"); $self->{fh}->print("\n", "\n"); close($self->{fh}); } sub add { my ($self, $data) = @_; my $style = delete($data->{_style}); $self->SUPER::add($data); return unless %$data; $self->_checkhdr; print {$self->{fh}} ("\n"); my $colspan = 0; foreach my $col ( @{$self->{_fields}} ) { if ( $colspan > 1 ) { $colspan--; next; } my $fname = $col->{name}; my $value = defined($data->{$fname}) ? $data->{$fname} : ""; my $class = "c_$fname"; # Examine style mods. if ( $style ) { if ( my $t = $self->_getstyle($style, $fname) ) { if ( $t->{class} ) { $class = $t->{class}; } if ( $t->{colspan} ) { $colspan = $t->{colspan}; } } } print {$self->{fh}} (" 1 ? " colspan=\"$colspan\"" : "", ">", $value eq "" ? " " : $html->($value), "\n"); } print {$self->{fh}} ("\n"); } ################ Pseudo-Internal (used by Base class) ################ sub header { my ($self) = @_; print {$self->{fh}} ("\n", "\n", "", $html->($self->{_title0} || $self->{_title1}), "\n"); if ( my $style = $self->{_style} ) { if ( $style =~ /\W/ ) { print {$self->{fh}} ('', "\n"); } elsif ( defined $self->{_cssdir} ) { print {$self->{fh}} ('', "\n"); } elsif ( my $css = findlib("css/".$style.".css") ) { print {$self->{fh}} ('', "\n"); } else { print {$self->{fh}} ("\n"); } } print {$self->{fh}} ("\n", "\n", "

", $html->($self->{_title1}), "

\n", "

", $html->($self->{_title2}), "
\n", $html->($self->{_title3l}), "

\n", "\n"); if ( grep { $_->{title} =~ /\S/ } @{$self->{_fields}} ) { print {$self->{fh}} ("\n"); foreach ( @{$self->{_fields}} ) { print {$self->{fh}} ("\n"); } print {$self->{fh}} ("\n"); } } ################ Internal methods ################ sub html { my $self = shift; _html(@_); } sub _html { HTML::Entities::encode(shift); } sub __html { my ($t) = @_; $t =~ s/&/&/g; $t =~ s//>/g; $t =~ s/\240/ /g; $t =~ s/\x{eb}/ë/g; # for IVP. $t; } sub copy_style { my ($out, $css) = @_; my $in; unless ( open($in, "<:encoding(utf-8)", $css) ) { print {$out} ("/**** stylesheet $css: $! ****/\n"); return; } print {$out} ("/** begin stylesheet $css */\n"); while ( <$in> ) { if ( /^\s*\@import\s*(["']?)(.*?)\1\s*;/ ) { use File::Basename; my $newcss = join("/", dirname($css), $2); copy_style($out, $newcss); } else { print {$out} $_; } } close($in); print {$out} ("/** end stylesheet $css */\n"); } 1; EekBoek-2.02.04/lib/EB/Report/Journal.pm0000444000076500007650000002076512165465617015322 0ustar jvjv#! perl # Author : Johan Vromans # Created On : Sat Jun 11 13:44:43 2005 # Last Modified By: Johan Vromans # Last Modified On: Fri Jun 8 22:38:39 2012 # Update Count : 340 # Status : Unknown, Use with caution! ################ Common stuff ################ package main; our $cfg; our $dbh; package EB::Report::Journal; use strict; use warnings; use EB; use EB::Format; use EB::Booking; # for dcfromtd() use EB::Report::GenBase; sub new { bless {}, shift; } sub journal { my ($self, $opts) = @_; my $nr = $opts->{select}; my $pfx = $opts->{postfix} || ""; my $detail = $opts->{detail}; my $extra_btw_info = $cfg->val(qw(journal btwxinfo), $dbh->does_btw ? 1 : 0); $opts->{STYLE} = "journaal"; $opts->{LAYOUT} = [ { name => "date", title => _T("Datum"), width => $date_width, }, { name => "desc", title => _T("Boekstuk/Grootboek"), width => 30, }, { name => "acct", title => _T("Rek"), width => 5, align => ">", }, { name => "deb", title => _T("Debet"), width => $amount_width, align => ">", }, { name => "crd", title => _T("Credit"), width => $amount_width, align => ">", }, $extra_btw_info ? ({ name => "btw", title => _T("BTW \%"), width => $amount_width, align => ">", }, { name => "btg", title => _T("Tarief"), width => 10, }) : (), { name => "bsk", title => _T("Boekstuk/regel"), width => 30, }, { name => "rel", title => _T("Relatie"), width => 10, }, ]; my $rep = EB::Report::GenBase->backend($self, $opts); my $per = $rep->{periode}; if ( my $t = $cfg->val(qw(internal now), 0) ) { $per->[1] = $t if $t lt $per->[1]; } # Sort order (boekstukken). my $so = join(", ", "jnl_date", # date "jnl_dbk_id", # dagboek "bsk_nr", # boekstuk "CASE WHEN jnl_seq = 0 THEN 0 ELSE 1 END",# bsr 0 eerst "sign(jnl_amount) DESC", # debet eerst "jnl_acc_id", # rekeningnummer "jnl_amount DESC", # grootste bedragen vooraan "jnl_type", "jnl_seq"); # if all else fails $rep->start(_T("Journaal")); my $sth; if ( $nr ) { if ( $nr =~ /^([[:alpha:]].*):(\d+)$/ ) { my $rr = $dbh->do("SELECT dbk_desc, dbk_id". " FROM Dagboeken". " WHERE dbk_desc ILIKE ?", $1); unless ( $rr ) { warn("?".__x("Onbekend dagboek: {dbk}", dbk => $1)."\n"); return; } $sth = $dbh->sql_exec("SELECT jnl_date, jnl_bsr_date, jnl_dbk_id, jnl_bsk_id, bsk_nr, jnl_bsr_seq, jnl_seq, ". "jnl_type, jnl_acc_id, jnl_amount, jnl_damount, jnl_desc, jnl_rel, jnl_bsk_ref". " FROM Journal, Boekstukken, Dagboeken". " WHERE bsk_nr = ?". " AND dbk_id = ?". " AND jnl_bsk_id = bsk_id". " AND jnl_dbk_id = dbk_id". ($per ? " AND jnl_date >= ? AND jnl_date <= ?" : ""). " ORDER BY ".$so, $2, $rr->[1], $per ? @$per : ()); $pfx ||= __x("Boekstuk {nr}", nr => "$rr->[0]:$2"); } elsif ( $nr =~ /^([[:alpha:]].*)$/ ) { my $rr = $dbh->do("SELECT dbk_desc, dbk_id". " FROM Dagboeken". " WHERE dbk_desc ILIKE ?", $1); unless ( $rr ) { warn("?".__x("Onbekend dagboek: {dbk}", dbk => $1)."\n"); return; } $sth = $dbh->sql_exec("SELECT jnl_date, jnl_bsr_date, jnl_dbk_id, jnl_bsk_id, bsk_nr, jnl_bsr_seq, jnl_seq, ". "jnl_type, jnl_acc_id, jnl_amount, jnl_damount, jnl_desc, jnl_rel, jnl_bsk_ref". " FROM Journal, Boekstukken, Dagboeken". " WHERE dbk_id = ?". " AND jnl_bsk_id = bsk_id". " AND jnl_dbk_id = dbk_id". ($per ? " AND jnl_date >= ? AND jnl_date <= ?" : ""). " ORDER BY ".$so, $rr->[1], $per ? @$per : ()); $pfx ||= __x("Dagboek {nr}", nr => $rr->[0]); } else { $sth = $dbh->sql_exec("SELECT jnl_date, jnl_bsr_date, jnl_dbk_id, jnl_bsk_id, bsk_nr, jnl_bsr_seq, jnl_seq, ". "jnl_type, jnl_acc_id, jnl_amount, jnl_damount, jnl_desc, jnl_rel". " FROM Journal, Boekstukken". " WHERE jnl_bsk_id = ?". " AND jnl_bsk_id = bsk_id". ($per ? " AND jnl_date >= ? AND jnl_date <= ?" : ""). " ORDER BY ".$so,, $nr, $per ? @$per : ()); $pfx ||= __x("Boekstuk {nr}", nr => $nr); } } else { $sth = $dbh->sql_exec("SELECT jnl_date, jnl_bsr_date, jnl_dbk_id, jnl_bsk_id, bsk_nr, jnl_bsr_seq, jnl_seq, ". "jnl_type, jnl_acc_id, jnl_amount, jnl_damount, jnl_desc, jnl_rel, jnl_bsk_ref". " FROM Journal, Boekstukken". " WHERE jnl_bsk_id = bsk_id". ($per ? " AND jnl_date >= ? AND jnl_date <= ?" : ""). " ORDER BY ".$so, $per ? @$per : ()); } my $rr; my $nl = 0; my $totd = my $totc = 0; while ( $rr = $sth->fetchrow_arrayref ) { my ($jnl_date, $jnl_bsr_date, $jnl_dbk_id, $jnl_bsk_id, $bsk_nr, $jnl_bsr_seq, $jnl_seq, $jnl_type, $jnl_acc_id, $jnl_amount, $jnl_damount, $jnl_desc, $jnl_rel, $jnl_bsk_ref) = @$rr; my $iv = _dbk_type($jnl_dbk_id) == DBKTYPE_INKOOP ? 'c' : _dbk_type($jnl_dbk_id) == DBKTYPE_VERKOOP ? 'd' : ''; if ( $jnl_seq == 0 ) { $nl++, next unless $detail; my $t = $jnl_rel; if ( $t && $jnl_bsk_ref ) { $t .= ":" . $jnl_bsk_ref; } if ( $iv && $cfg->val(qw(internal noxrel), 0) ) { undef $t; } $rep->add({ _style => $iv.'head', date => datefmt($jnl_bsr_date), desc => join(":", _dbk_desc($jnl_dbk_id), $bsk_nr), bsk => $jnl_desc, rel => $t, }); next; } my ($deb, $crd) = EB::Booking::dcfromtd($jnl_amount, $jnl_damount); $totd += $deb; $totc += $crd; next unless $detail; my $t = $jnl_rel; if ( $t && $jnl_bsk_ref ) { $t .= ":" . $jnl_bsk_ref; } if ( $t ) { $iv = _acc_type($jnl_acc_id) ? 'd' : 'c'; } else { $iv = ''; } my $btw_perc = ""; my $btw_tg = ""; if ( $extra_btw_info > 1 || ( $extra_btw_info && defined($jnl_type) && $jnl_type == 0 ) ) { my $res = $dbh->do( "SELECT bsr_btw_id, bsr_btw_class FROM Boekstukregels". " WHERE bsr_bsk_id = ? AND bsr_nr = ?", $jnl_bsk_id, $jnl_bsr_seq ); if ( defined($res) && defined($res->[0]) && defined($res->[1]) && $res->[1] & BTWKLASSE_BTW_BIT ) { my $btw_id = $res->[0]; $res = $dbh->do( "SELECT btw_perc, btw_tariefgroep". " FROM BTWTabel". " WHERE btw_id = ?", $btw_id ); $btw_perc = btwfmt( $res->[0] ); $btw_tg = BTWTARIEVEN->[$res->[1]]; } } $rep->add({ _style => $iv.'data', date => datefmt($jnl_bsr_date), desc => _acc_desc($jnl_acc_id), acct => $jnl_acc_id, ($deb || defined $jnl_damount) ? (deb => numfmt($deb)) : (), ($crd || defined $jnl_damount) ? (crd => numfmt($crd)) : (), bsk => $jnl_desc, $jnl_rel ? ( rel => $t ) : (), $extra_btw_info ? ( btw => $btw_perc, btg => $btw_tg ) : (), }); } $rep->add({ _style => 'total', desc => __x("Totaal {pfx}", pfx => $pfx), deb => numfmt($totd), crd => numfmt($totc), }); $rep->finish; } my %dbk_desc; sub _dbk_desc { $dbk_desc{$_[0]} ||= $dbh->lookup($_[0], qw(Dagboeken dbk_id dbk_desc =)); } my %dbk_type; sub _dbk_type { $dbk_type{$_[0]} ||= $dbh->lookup($_[0], qw(Dagboeken dbk_id dbk_type =)); } my %acc_desc; sub _acc_desc { return '' unless $_[0]; $acc_desc{$_[0]} ||= $dbh->lookup($_[0], qw(Accounts acc_id acc_desc =)); } my %acc_type; sub _acc_type { return '' unless $_[0]; $acc_type{$_[0]} ||= $dbh->lookup($_[0], qw(Accounts acc_id acc_debcrd =)); } package EB::Report::Journal::Text; use EB; use base qw(EB::Report::Reporter::Text); use strict; sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } # Style mods. sub style { my ($self, $row, $cell) = @_; my $style_data = { _style => { skip_after => 1, cancel_skip => 1, }, desc => { indent => 2 }, bsk => { indent => 2 }, }; my $stylesheet = { data => $style_data, cdata => $style_data, ddata => $style_data, total => { _style => { line_before => 1 }, # desc => { excess => 2 }, }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } package EB::Report::Journal::Html; use EB; use base qw(EB::Report::Reporter::Html); use strict; sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } package EB::Report::Journal::Csv; use EB; use base qw(EB::Report::Reporter::Csv); sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } 1; EekBoek-2.02.04/lib/EB/Report/Debcrd.pm0000444000076500007650000002116412165465617015065 0ustar jvjv#! perl package main; our $cfg; our $dbh; package EB::Report::Debcrd; # Author : Johan Vromans # Created On : Wed Dec 28 16:08:10 2005 # Last Modified By: Johan Vromans # Last Modified On: Sun Jun 24 22:23:55 2012 # Update Count : 188 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; ################ The Process ################ use EB; use EB::Format; use EB::Report::GenBase; ################ Subroutines ################ sub new { return bless {}; } sub debiteuren { my ($self, $args, $opts) = @_; $self->_perform($args, $opts, 1); } sub crediteuren { my ($self, $args, $opts) = @_; $self->_perform($args, $opts, 0); } sub _perform { my ($self, $args, $opts, $debcrd) = @_; if ( $args ) { $args = join("|", map { quotemeta($_) } @$args); } $opts->{STYLE} = "debrept"; $opts->{LAYOUT} = [ { name => "debcrd", title => $debcrd ? _T("Debiteur") : _T("Crediteur"), width => 10 }, { name => "date", title => _T("Datum"), width => $date_width }, { name => "desc", title => _T("Omschrijving"), width => 25 }, { name => "amount", title => _T("Bedrag"), width => $amount_width, align => ">" }, { name => "open", title => _T("Open"), width => $amount_width, align => ">" }, { name => "paid", title => _T("Betaald"), width => $amount_width, align => ">" }, { name => "bsknr", title => _T("Boekstuk"), width => 18 }, ]; my $rep = EB::Report::GenBase->backend($self, { %$opts, debcrd => $debcrd }); my %rels; my $sth; $sth = $dbh->sql_exec("SELECT DISTINCT bsr_rel_code". " FROM Boekstukregels, Boekstukken, Dagboeken". " WHERE bsr_date >= ? AND bsr_date <= ?". " AND bsr_bsk_id = bsk_id". " AND bsk_dbk_id = dbk_id". " AND dbk_type = ?", @{$rep->{periode}}, $debcrd ? DBKTYPE_VERKOOP : DBKTYPE_INKOOP); while ( my $rr = $sth->fetchrow_arrayref ) { next if $args && $rr->[0] !~ /^$args$/i; $rels{$rr->[0]} = undef; } $sth->finish; $sth = $dbh->sql_exec("SELECT bsr_rel_code, bsr_paid". " FROM Boekstukregels, Boekstukken". " WHERE bsr_paid = bsk_id". " AND bsr_date >= ? AND bsr_date <= ?". " AND bsk_date < ?". " AND bsr_type = ?", @{$rep->{periode}}, $rep->{per_begin}, $debcrd ? DBKTYPE_INKOOP : DBKTYPE_VERKOOP); while ( my $rr = $sth->fetchrow_arrayref ) { next if $args && $rr->[0] !~ /^$args$/i; $rels{$rr->[0]}->{$rr->[1]} = 1; } $sth->finish; return "!"._T("Geen boekingen gevonden") unless %rels; $rep->start($debcrd ? _T("Debiteurenadministratie") : _T("Crediteurenadministratie")); my $a_grand = 0; my $o_grand = 0; foreach my $rel ( sort(keys(%rels)) ) { my $a_tot = 0; my $o_tot = 0; my @rp = (); push(@rp, { debcrd => $rel, _style=> "h1" }); my $sth; # Process betalingen zonder boekstuk. if ( $rels{$rel} ) { foreach my $bsk_id ( keys %{$rels{$rel}} ) { my $sth; $sth = $dbh->sql_exec("SELECT bsk_id, bsk_desc, bsk_date,". " bsk_amount, bsk_open, dbk_desc, bsk_nr, bsk_bky". " FROM Boekstukken, Boekstukregels, Dagboeken". " WHERE bsk_id = ?". " AND bsk_dbk_id = dbk_id". " AND bsr_bsk_id = bsk_id", $bsk_id); my $rr = $sth->fetchrow_arrayref; $sth->finish; my ($bsk_id, $bsk_desc, $bsk_date, $bsr_amount, $bsr_open, $dbk_desc, $bsk_nr, $bsk_bky) = @$rr; # Correct for future payments. my $rop = $dbh->do("SELECT sum(bsr_amount)". " FROM Boekstukregels". " WHERE bsr_type = ?". " AND bsr_date > ?". " AND bsr_paid = ?", $debcrd ? 1 : 2, $rep->{per_end}, $bsk_id); if ( $rop && $rop->[0] ) { $bsr_open -= $rop->[0]; } $bsr_amount = 0-$bsr_amount unless $debcrd; $bsr_open = 0-$bsr_open unless $debcrd; $a_tot += $bsr_amount; $o_tot += $bsr_open; push(@rp, { desc => $bsk_desc, date => datefmt($bsk_date), amount => numfmt($bsr_amount), open => numfmt($bsr_open), bsknr => join(":", $dbk_desc, $bsk_bky, $bsk_nr), _style => "bskprv", }); $sth = $dbh->sql_exec("SELECT bsr_date, bsr_desc, bsr_amount,". " dbk_desc, bsk_nr". " FROM Boekstukregels, Boekstukken, Dagboeken". " WHERE bsr_type = ?". " AND bsr_date >= ? AND bsr_date <= ?". " AND bsr_paid = ?". " AND bsr_bsk_id = bsk_id AND bsk_dbk_id = dbk_id". " ORDER BY bsr_date, bsk_nr", $debcrd ? 1 : 2, @{$rep->{periode}}, $bsk_id); while ( my $rr = $sth->fetchrow_arrayref ) { my ($x_bsr_date, $x_bsr_desc, $x_bsr_amount, $x_dbk_desc, $x_bsk_nr, $x_bsk_bky) = @$rr; $x_bsr_amount = 0-$x_bsr_amount unless $debcrd; push(@rp, { desc => $x_bsr_desc, date => datefmt($x_bsr_date), paid => numfmt(0-$x_bsr_amount), bsknr => join(":", $x_dbk_desc, $x_bsk_nr), _style => "paid", }); } } } # Process boekstukken met evt. betalingen. $sth = $dbh->sql_exec("SELECT bsk_id, bsk_desc, bsk_date,". " bsk_amount, bsk_open, dbk_desc, bsk_nr". " FROM Boekstukken, Boekstukregels, Dagboeken". " WHERE bsr_date >= ? AND bsr_date <= ?". " AND bsr_bsk_id = bsk_id". " AND bsk_dbk_id = dbk_id". " AND bsr_type = 0". " AND bsr_nr = 1". " AND bsr_rel_code = ?". " AND dbk_type = ?". " ORDER BY bsk_date, bsk_nr", @{$rep->{periode}}, $rel, $debcrd ? DBKTYPE_VERKOOP : DBKTYPE_INKOOP); while ( my $rr = $sth->fetchrow_arrayref ) { my ($bsk_id, $bsk_desc, $bsk_date, $bsr_amount, $bsr_open, $dbk_desc, $bsk_nr) = @$rr; # Correct for future payments. my $rop = $dbh->do("SELECT sum(bsr_amount)". " FROM Boekstukregels". " WHERE bsr_type = ?". " AND bsr_date > ?". " AND bsr_paid = ?", $debcrd ? 1 : 2, $rep->{per_end}, $bsk_id); if ( $rop && $rop->[0] ) { $bsr_open -= $rop->[0]; } next if $opts->{openstaand} && $bsr_open == 0; $bsr_amount = 0-$bsr_amount unless $debcrd; $bsr_open = 0-$bsr_open unless $debcrd; $a_tot += $bsr_amount; $o_tot += $bsr_open; push(@rp, { desc => $bsk_desc, date => datefmt($bsk_date), amount => numfmt($bsr_amount), open => numfmt($bsr_open), bsknr => join(":", $dbk_desc, $bsk_nr), _style => "bsk", }); my $sth = $dbh->sql_exec("SELECT bsr_date, bsr_desc, bsr_amount,". " dbk_desc, bsk_nr". " FROM Boekstukregels, Boekstukken, Dagboeken". " WHERE bsr_type = ?". " AND bsr_date >= ? AND bsr_date <= ?". " AND bsr_paid = ?". " AND bsr_bsk_id = bsk_id AND bsk_dbk_id = dbk_id". " ORDER BY bsr_date, bsk_nr", $debcrd ? 1 : 2, @{$rep->{periode}}, $bsk_id); while ( my $rr = $sth->fetchrow_arrayref ) { my ($x_bsr_date, $x_bsr_desc, $x_bsr_amount, $x_dbk_desc, $x_bsk_nr) = @$rr; $x_bsr_amount = 0-$x_bsr_amount unless $debcrd; push(@rp, { desc => $x_bsr_desc, date => datefmt($x_bsr_date), paid => numfmt(0-$x_bsr_amount), bsknr => join(":", $x_dbk_desc, $x_bsk_nr), _style => "paid", }); } } push(@rp, { debcrd => $rel, desc => _T("Totaal"), amount => numfmt($a_tot), open => numfmt($o_tot), _style => "total", }); $a_grand += $a_tot; $o_grand += $o_tot; next if $opts->{openstaand} && $o_tot == 0; $rep->add($_) foreach @rp; } $rep->add({ debcrd => _T("Totaal"), amount => numfmt($a_grand), open => numfmt($o_grand), _style => "grand", }); $rep->finish; return; } package EB::Report::Debcrd::Text; use EB; use base qw(EB::Report::Reporter::Text); sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } # Style mods. sub style { my ($self, $row, $cell) = @_; my $stylesheet = { paid => { desc => { indent => 2 }, }, total => { _style => { skip_after => 1 }, amount => { line_before => 1 }, open => { line_before => 1 }, }, grand => { _style => { line_before => 1 } }, }; $cell = "_style" unless defined($cell); return $stylesheet->{$row}->{$cell}; } package EB::Report::Debcrd::Html; use EB; use base qw(EB::Report::Reporter::Html); sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } package EB::Report::Debcrd::Csv; use EB; use base qw(EB::Report::Reporter::Csv); sub new { my ($class, $opts) = @_; $class->SUPER::new($opts->{STYLE}, $opts->{LAYOUT}); } 1; EekBoek-2.02.04/lib/EB/Booking/0000755000076500007650000000000012165465617013457 5ustar jvjvEekBoek-2.02.04/lib/EB/Booking/Delete.pm0000444000076500007650000001002412165465617015212 0ustar jvjv#! perl package main; our $dbh; our $spp; our $config; package EB::Booking::Delete; # Author : Johan Vromans # Created On : Mon Sep 19 22:19:05 2005 # Last Modified By: Johan Vromans # Last Modified On: Thu Jun 7 13:58:47 2012 # Update Count : 88 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; use EB; use base qw(EB::Booking); sub new { return bless {}, shift; } sub perform { my ($self, $id, $opts) = @_; my $sth; my $rr; my $orig = $id; my $bky = $self->{bky} ||= $opts->{boekjaar} || $dbh->adm("bky"); my ($bsk, $dbsk, $err) = $dbh->bskid($id, $bky); die("?$err\n") unless defined $bsk; my $does_btw = $dbh->does_btw; my ($dd) = @{$dbh->do("SELECT bsk_date". " FROM Boekstukken". " WHERE bsk_id = ?", $bsk)}; my ($begin, $end); return unless ($begin, $end) = $self->begindate; return unless $self->in_bky($dd, $begin, $end); if ( $does_btw && $dbh->adm("btwbegin") && $dd lt $dbh->adm("btwbegin") ) { my $r = $dbh->do("SELECT COUNT(*)". " from Boekstukregels, Boekstukken". " WHERE bsr_bsk_id = bsk_id". " AND bsr_bsk_id = ?". " AND ( bsr_btw_class != 0 OR bsr_btw_id != 0 )". " LIMIT 1", $bsk); if ( $r && $r->[0] ) { warn("?"._T("Deze boeking valt in de periode waarover al BTW aangifte is gedaan en kan niet meer worden verwijderd")."\n"); return; } } # Check if this boekstuk is used by others. This can only be the # case if has been paid. my ($amt, $open, $dbk) = @{$dbh->do("SELECT bsk_amount,bsk_open,bsk_dbk_id". " FROM Boekstukken". " WHERE bsk_id = ?", $bsk)}; if ( defined($open) && $amt != $open ) { # It has been paid. Show the user the list of bookstukken. $sth = $dbh->sql_exec("SELECT dbk_desc, bsk_nr". " FROM Boekstukken,Boekstukregels,Dagboeken". " WHERE bsk_id = bsr_bsk_id". " AND bsk_dbk_id = dbk_id". " AND bsr_paid = ?", $bsk); $rr = $sth->fetchall_arrayref; if ( $rr ) { my $t = ""; foreach ( @$rr ) { $t .= join(":", @$_) . " "; } chomp($t); return "?".__x("Boekstuk {bsk} is in gebruik door {lst}", bsk => $dbsk, lst => $t)."\n"; } } # Collect list of affected boekstukken. $sth = $dbh->sql_exec("SELECT bsr_paid,bsr_amount". " FROM Boekstukregels". " WHERE bsr_paid IS NOT NULL AND bsr_bsk_id = ?", $bsk); $rr = $sth->fetchall_arrayref; my @bsk; my @amt; if ( $rr ) { foreach ( @$rr ) { push(@bsk, $_->[0]); push(@amt, $_->[1]); } } eval { $dbh->begin_work; # Adjust saldi grootboekrekeningen. # Hoewel in veel gevallen niet nodig, is het toch noodzakelijk i.v.m. # de saldi van bankrekeningen. $sth = $dbh->sql_exec("SELECT jnl_acc_id, jnl_amount". " FROM Journal". " WHERE jnl_bsk_id = ? AND jnl_seq > 0", $bsk); while ( my $rr = $sth->fetchrow_arrayref ) { $dbh->upd_account($rr->[0], -$rr->[1]); } # Delete journal entries. $dbh->sql_exec("DELETE FROM Journal". " WHERE jnl_bsk_id = ?", $bsk)->finish; # Clear 'paid' info. $dbh->sql_exec("UPDATE Boekstukken". " SET bsk_open = bsk_open - ?". " WHERE bsk_id = ?", shift(@amt), $_)->finish foreach @bsk; # Delete boekstukregels. $dbh->sql_exec("DELETE FROM Boekstukregels". " WHERE bsr_bsk_id = ?", $bsk)->finish; # Delete boekstuk. $dbh->sql_exec("DELETE FROM Boekstukken". " WHERE bsk_id = ?", $bsk)->finish; # # Adjust saldi van boekingen na deze. # $dbh->sql_exec("UPDATE Boekstukken". # " SET bsk_saldo = bsk_saldo - ?". # " WHERE bsk_saldo IS NOT NULL AND". # " bsk_dbk_id = ? AND bsk_id > ?", # $amt, $dbk, $bsk)->finish; # If we get here, all went okay. $dbh->commit; }; if ( $@ ) { # It didn't work. Shouldn't happen. warn("?".$@); $dbh->rollback; return "?".__x("Boekstuk {bsk} niet verwijderd", bsk => $dbsk)."\n"; } return __x("Boekstuk {bsk} verwijderd", bsk => $dbsk)."\n"; } 1; EekBoek-2.02.04/lib/EB/Booking/Decode.pm0000444000076500007650000002244412165465617015204 0ustar jvjv#! perl package main; our $dbh; our $config; package EB::Booking::Decode; # Author : Johan Vromans # Created On : Tue Sep 20 15:16:31 2005 # Last Modified By: Johan Vromans # Last Modified On: Tue May 29 14:38:52 2012 # Update Count : 182 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; use EB; use EB::Format; use EB::Booking; # for norm_btw() sub new { return bless {}, shift; } my @bsr_types = ([], [ "Standaard", ("") x 8, "Open post vorige periode" ], [ "Standaard", ("") x 8, "Open post vorige periode" ], [ "Standaard", "Betaling van debiteur", "Betaling aan crediteur" ], [ "Standaard", "Betaling van debiteur", "Betaling aan crediteur" ], [ "Standaard", "Betaling van debiteur", "Betaling aan crediteur" ], [], ); sub decode { my ($self, $bsk, $opts) = @_; my $trail = $opts->{trail}; my $single = $opts->{single}; my $ex_btw = $opts->{btw}; my $ex_bsknr = $opts->{bsknr}; my $ex_bky = $opts->{bky}; my $ex_debcrd = $opts->{debcrd}; my $ex_tot = $opts->{totaal} || $opts->{total}; my $no_ivbskdesc = $opts->{noivbskdesc}; my $dbver = sprintf("%03d%03d%03d", $dbh->adm("scm_majversion"), $dbh->adm("scm_minversion")||0, $dbh->adm("scm_revision")); $bsk = $dbh->bskid($bsk); my $rr = $dbh->do("SELECT bsk_id, bsk_nr, bsk_ref, bsk_desc, ". "bsk_dbk_id, bsk_date, bsk_amount, bsk_saldo, bsk_isaldo, bsk_bky ". ($dbver lt "001000002" ? ", bsk_paid" : ", bsk_open"). " FROM Boekstukken". " WHERE bsk_id = ?", $bsk); unless ( $rr ) { warn("?".__x("Onbekend boekstuk: {bsk}", bsk => $bsk)."\n"); return; } my ($bsk_id, $bsk_nr, $bsk_ref, $bsk_desc, $bsk_dbk_id, $bsk_date, $bsk_amount, $bsk_saldo, $bsk_isaldo, $bsk_bky, $bsk_open) = @$rr; my $tot = 0; my ($dbktype, $acct, $dbk_desc) = @{$dbh->do("SELECT dbk_type, dbk_acc_id, dbk_desc". " FROM Dagboeken". " WHERE dbk_id = ?", $bsk_dbk_id)}; my $cmd = ""; my $setup = sub { my ($rel_code) = @_; if ( $trail ) { $cmd = lc($dbk_desc); $cmd =~ s/[^[:alnum:]]/_/g; $cmd .= ":$bsk_bky" if $ex_bky; $cmd .= ":$bsk_nr" if $ex_bsknr; $cmd .= " --".__xt("cmo:boeking:ref")."=" . _quote($bsk_ref) if defined $bsk_ref; $cmd .= " ".datefmt_full($bsk_date)." "; if ( $dbktype == DBKTYPE_INKOOP || $dbktype == DBKTYPE_VERKOOP ) { $cmd .= $no_ivbskdesc ? _quote($rel_code) : _quote($bsk_desc, $rel_code); } if ($dbktype == DBKTYPE_BANK || $dbktype == DBKTYPE_KAS || $dbktype == DBKTYPE_MEMORIAAL) { $cmd .= _quote($bsk_desc); } else { $cmd .= " --".__xt("cmo:boeking:totaal")."=" . numfmt_plain($dbktype == DBKTYPE_INKOOP ? 0-$bsk_amount : $bsk_amount) if $ex_tot && $acct; } $cmd .= " --".__xt("cmo:boeking:beginsaldo")."=" . numfmt_plain($bsk_isaldo) if $ex_tot && defined $bsk_isaldo; $cmd .= " --".__xt("cmo:boeking:saldo")."=" . numfmt_plain($bsk_saldo) if $ex_tot && defined $bsk_saldo; } else { $cmd = "Boekstuk $bsk_id, nr $bsk_nr, dagboek " . $dbh->lookup($bsk_dbk_id, qw(Dagboeken dbk_id dbk_desc =)). "($bsk_dbk_id)". ", ".datefmt_full(datum $bsk_date). ", "; if ( $dbktype == DBKTYPE_INKOOP || $dbktype == DBKTYPE_VERKOOP ) { my ($rd, $rt) = @{$dbh->do("SELECT rel_desc,rel_debcrd". " FROM Relaties". " WHERE rel_code = ?", $rel_code)}; $cmd .= $rt ? "deb " : "crd "; $cmd .= "$rel_code ($rd), "; } $cmd .= _quote($bsk_desc); if ( $dbver lt "001000002" ) { $cmd .= $bsk_open ? ", *$bsk_open" : ", open" } elsif ( defined $bsk_open ) { $cmd .= $bsk_open ? ", @{[numfmt_plain(abs($bsk_open))]} open" : ", voldaan" } $cmd .= "\n"; } }; my $sth = $dbh->sql_exec("SELECT bsr_nr, bsr_date, ". "bsr_desc, bsr_amount, bsr_btw_id, bsr_btw_class, ". "bsr_type, bsr_acc_id, bsr_rel_code, bsr_paid, bsr_ref ". " FROM Boekstukregels". " WHERE bsr_bsk_id = ?". " ORDER BY bsr_nr", $bsk); $rr = $sth->fetchrow_arrayref; unless ( $rr ) { # Special case for boekstuk zonder boekstukregels. $setup->(undef); return $cmd; } while ( $rr ) { my ($bsr_nr, $bsr_date, $bsr_desc, $bsr_amount, $bsr_btw_id, $bsr_btw_class, $bsr_type, $bsr_acc_id, $bsr_rel_code, $bsr_paid, $bsr_ref) = @$rr; if ( $bsr_nr == 1) { $setup->($bsr_rel_code); } my ($rd, $rt, $acc_balres, $acc_kstomz) = $bsr_acc_id ? @{$dbh->do("SELECT acc_desc,acc_debcrd,acc_balres,acc_kstomz". " FROM Accounts". " WHERE acc_id = ?", $bsr_acc_id)} : ("[Open posten vorige periode]", 1); my $dc = $bsr_amount >= 0 ? "debet" : "credit"; $dc = uc($dc) unless (($bsr_amount < 0) xor $rt); $cmd .= join("", " Boekstukregel, nr $bsr_nr, datum $bsr_date, ", _quote($bsr_desc), ", type $bsr_type (", $bsr_types[$dbktype][$bsr_type], ")\n", " ", "bedrag ", numfmt_plain(abs($bsr_amount)), " ", $dc, defined($bsr_btw_id) ? (", BTW code $bsr_btw_id (", $dbh->lookup($bsr_btw_id, qw(BTWTabel btw_id btw_desc)), ")") : (), defined($bsr_acc_id) ? (", rek $bsr_acc_id (", $rt ? "D/" : "C/", $rd, ")",) : (), "\n") unless $trail; croak("INTERNAL ERROR: BTW/N id = $bsr_btw_id") if !($bsr_btw_class & BTWKLASSE_BTW_BIT) && $bsr_btw_id; my $a = EB::Booking::->norm_btw($bsr_amount, $bsr_btw_id); $tot += $a->[0]; next unless $trail; $bsr_acc_id ||= ""; my $btw = ""; # Refactor later. if ( $bsr_btw_class & BTWKLASSE_BTW_BIT ) { my $alias = $bsr_btw_id; if ( $bsr_btw_id > BTW_CODE_AUTO ) { if ( $bsr_btw_id & 1 ) { $alias = $dbh->lookup($bsr_btw_id, qw(BTWTabel btw_id btw_desc)); } else { $alias = $dbh->lookup($bsr_btw_id, qw(BTWTabel btw_id btw_alias)); $alias .= qw( - + )[$dbh->lookup($bsr_btw_id, qw(BTWTabel btw_id btw_incl))]; } } my $ko = $bsr_btw_class & BTWKLASSE_KO_BIT ? 1 : 0; if ( $ex_btw ) { $btw = $alias . qw(O K)[$ko]; } else { $btw .= $alias if btw_code($bsr_acc_id) != $bsr_btw_id || ($bsr_type == 0 && $dbktype == DBKTYPE_MEMORIAAL); $btw .= qw(O K)[$ko] if (!defined($acc_kstomz) || ($acc_kstomz xor $ko)); } } elsif ( $dbh->does_btw ) { if ( $ex_btw ) { $btw = 'N'; } else { $btw = 'N' if defined($acc_kstomz); } } $btw = '@' . $btw unless $btw eq ""; if ( $dbktype == DBKTYPE_INKOOP || $dbktype == DBKTYPE_VERKOOP ) { $bsr_amount = -$bsr_amount if $dbktype == DBKTYPE_VERKOOP; $cmd .= $single ? " " : " \\\n\t"; $cmd .= _quote($bsr_desc) . " " . numfmt_plain($bsr_amount) . $btw . " " . $bsr_acc_id; } elsif ( $dbktype == DBKTYPE_BANK || $dbktype == DBKTYPE_KAS || $dbktype == DBKTYPE_MEMORIAAL ) { $bsr_amount = -$bsr_amount; my $dd = ""; $dd = " ".datefmt_full($bsr_date) unless $bsr_date eq $bsk_date; if ( $bsr_type == 0 ) { $cmd .= $single ? " " : " \\\n\t"; $cmd .= "std$dd " . _quote($bsr_desc) . " " . numfmt_plain($bsr_amount) . $btw . " " . $bsr_acc_id; } elsif ( $bsr_ref && ( $bsr_type == 1 || $bsr_type == 2 ) ) { my $type = $bsr_type == 1 ? "deb" : "crd"; $cmd .= $single ? " " : " \\\n\t"; $cmd .= "$type$dd " . _quote($bsr_ref) . " " . numfmt_plain($bsr_amount); } elsif ( $bsr_type == 1 || $bsr_type == 2 ) { my $type = $bsr_type == 1 ? "deb" : "crd"; $cmd .= $single ? " " : " \\\n\t"; # Check for a full payment. my $sth = $dbh->sql_exec("SELECT bsk_amount, dbk_desc, bsk_nr, bsk_ref, bsr_rel_code, bsk_bky". " FROM Boekstukken, Boekstukregels, Dagboeken". " WHERE bsk_dbk_id = dbk_id". " AND bsr_bsk_id = bsk_id". " AND bsk_id = ?", $bsr_paid); my ($paid, $dbk, $nr, $ref, $rel, $bky) = @{$sth->fetchrow_arrayref}; $sth->finish; if ( $paid == $bsr_amount ) { # Matches -> Full payment $cmd .= "$type$dd " . _quote($bsr_rel_code) . " " . numfmt_plain($bsr_amount); } else { # Partial payment. Use boekstuknummer. $dbk = lc($dbk); $dbk =~ s/[^[:alnum:]]/_/g; my $t; if ( defined $ref ) { $t = $rel; $t .= ":$bky" if ($opts->{boekjaar}||$opts->{d_boekjaar}) ne $bky; $t .= ":$ref"; } else { $t = $dbk; $t .= ":$bky" if ($opts->{boekjaar}||$opts->{d_boekjaar}) ne $bky; $t .= ":$nr"; } $cmd .= join(" ", $type.$dd, _quote($t), numfmt_plain($bsr_amount)); } } } $rr = $sth->fetchrow_arrayref; } return ($cmd, $tot, $bsk_amount, $acct) if wantarray; $cmd; } ################ Subroutines ################ # Escape " quotes and \ so lines can be read in by parsewords. Note # that multiple arguments will be concatenated quoted, not quoted # concatenated. sub _quote { my @res; foreach my $t ( @_ ) { $t =~ s/(["\\])/\\$1/g; push(@res, "\"$t\""); } "@res"; } my %btw_code; sub btw_code { my($acct) = @_; return $btw_code{$acct} if defined $btw_code{$acct}; _lku($acct); $btw_code{$acct}; } sub _lku { my ($acct) = @_; Carp::confess("acct is null") unless $acct; my $rr = $dbh->do("SELECT acc_btw". " FROM Accounts". " WHERE acc_id = ?", $acct); die("?".__x("Onbekend rekeningnummer: {acct}", acct => $acct)."\n") unless $rr; $btw_code{$acct} = $rr->[0]; } 1; EekBoek-2.02.04/lib/EB/Booking/IV.pm0000444000076500007650000002720712165465617014341 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; package main; our $cfg; our $dbh; package EB::Booking::IV; # Author : Johan Vromans # Created On : Thu Jul 7 14:50:41 2005 # Last Modified By: Johan Vromans # Last Modified On: Mon Aug 27 13:23:24 2012 # Update Count : 343 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; # Dagboek type 1: Inkoop # Dagboek type 2: Verkoop use EB; use EB::Format; use EB::Report::Journal; use base qw(EB::Booking); my $trace_updates = $cfg->val(__PACKAGE__, "trace_updates", 0); # for debugging sub perform { my ($self, $args, $opts) = @_; return unless $self->adm_open; my $dagboek = $opts->{dagboek}; my $dagboek_type = $opts->{dagboek_type}; my $bsk_ref = $opts->{ref}; if ( defined $bsk_ref && $bsk_ref =~ /^\d+$/ ) { warn("?".__x("Boekingsreferentie moet tenminste één niet-numeriek teken bevatten: {ref}", ref => $bsk_ref)."\n"); return; } unless ( $dagboek_type == DBKTYPE_INKOOP || $dagboek_type == DBKTYPE_VERKOOP) { warn("?".__x("Ongeldige operatie (IV) voor dagboek type {type}", type => $dagboek_type)."\n"); return; } my $iv = $dagboek_type == DBKTYPE_INKOOP; my $totaal = $opts->{totaal}; my $does_btw = $dbh->does_btw; my $bky = $self->{bky} ||= $opts->{boekjaar} || $dbh->adm("bky"); if ( defined($totaal) ) { my $t = amount($totaal); return "?".__x("Ongeldig totaal: {total}", total => $totaal) unless defined $t; $totaal = $t; } my ($begin, $end); return unless ($begin, $end) = $self->begindate; my $date; if ( $date = parse_date($args->[0], substr($begin, 0, 4)) ) { shift(@$args); } else { return "?".__x("Onherkenbare datum: {date}", date => $args->[0])."\n" if ($args->[0]||"") =~ /^[[:digit:]]+-/; $date = iso8601date(); } return "?"._T("Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer aanwijzingen.")."\n" unless @$args >= 3; return unless $self->in_bky($date, $begin, $end); if ( $does_btw && $dbh->adm("btwbegin") && $date lt $dbh->adm("btwbegin") ) { warn("?"._T("De boekingsdatum valt in de periode waarover al BTW aangifte is gedaan")."\n"); return; } my $gdesc = ""; my $debcode; my $rr; if ( $cfg->val(qw(general ivdesc), undef) ) { $gdesc = shift(@$args); $debcode = shift(@$args); $rr = $dbh->do("SELECT rel_code, rel_acc_id, rel_btw_status FROM Relaties" . " WHERE UPPER(rel_code) = ?" . " AND " . ($iv ? "NOT " : "") . "rel_debcrd" . " AND rel_ledger = ?", uc($debcode), $dagboek); unless ( defined($rr) ) { unshift(@$args, $debcode); $debcode = $gdesc; $gdesc = ""; $rr = $dbh->do("SELECT rel_code, rel_acc_id, rel_btw_status FROM Relaties" . " WHERE UPPER(rel_code) = ?" . " AND " . ($iv ? "NOT " : "") . "rel_debcrd" . " AND rel_ledger = ?", uc($debcode), $dagboek); unless ( defined($rr) ) { warn("?".__x("Onbekende {what}: {who}", what => lc($iv ? _T("Crediteur") : _T("Debiteur")), who => $debcode)."\n"); return; } } } else { $debcode = shift(@$args); $rr = $dbh->do("SELECT rel_code, rel_acc_id, rel_btw_status FROM Relaties" . " WHERE UPPER(rel_code) = ?" . " AND " . ($iv ? "NOT " : "") . "rel_debcrd" . " AND rel_ledger = ?", uc($debcode), $dagboek); unless ( defined($rr) ) { $gdesc = $debcode; $debcode = shift(@$args); $rr = $dbh->do("SELECT rel_code, rel_acc_id, rel_btw_status FROM Relaties" . " WHERE UPPER(rel_code) = ?" . " AND " . ($iv ? "NOT " : "") . "rel_debcrd" . " AND rel_ledger = ?", uc($debcode), $dagboek); unless ( defined($rr) ) { warn("?".__x("Onbekende {what}: {who}", what => lc($iv ? _T("Crediteur") : _T("Debiteur")), who => $debcode)."\n"); return; } } } my ($rel_acc_id, $rel_btw); ($debcode, $rel_acc_id, $rel_btw) = @$rr; my $btw_adapt = $cfg->val(qw(strategy btw_adapt), 0); my $nr = 1; my $bsk_id; my $bsk_nr; my $did = 0; while ( @$args ) { return "?"._T("Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer aanwijzingen.")."\n" unless @$args >= 2; my ($desc, $amt, $acct) = splice(@$args, 0, 3); my $bsr_ref; $desc = $gdesc if $desc !~ /\S/; $gdesc = $desc if $gdesc !~ /\S/; $acct ||= $rel_acc_id; if ( $opts->{verbose} ) { my $t = $desc; $t = '"' . $desc . '"' if $t =~ /\s/; warn(" "._T("boekstuk").": $t $amt $acct\n"); } unless ( $desc =~ /\S/ ) { warn("?"._T("De omschrijving van de boekstukregel ontbreekt")."\n"); return; } if ( $acct !~ /^\d+$/ ) { if ( $acct =~ /^(\d*)([cd])/i ) { warn("?"._T("De \"D\" of \"C\" toevoeging aan het rekeningnummer is hier niet toegestaan")."\n"); return; } warn("?".__x("Ongeldig grootboekrekeningnummer: {acct}", acct => $acct )."\n"); return; } my $rr = $dbh->do("SELECT acc_desc,acc_balres,acc_kstomz,acc_debcrd,acc_btw". " FROM Accounts". " WHERE acc_id = ?", $acct); unless ( $rr ) { warn("?".__x("Onbekende grootboekrekening: {acct}", acct => $acct)."\n"); $dbh->rollback if $dbh->in_transaction; return; } my ($adesc, $balres, $kstomz, $debcrd, $btw_id) = @$rr; if ( $balres ) { warn("!".__x("Grootboekrekening {acct} ({desc}) is een balansrekening", acct => $acct, desc => $adesc)."\n") if 0; #$dbh->rollback; #return; } if ( $btw_id && !$does_btw ) { croak("INTERNAL ERROR: ". __x("Grootboekrekening {acct} heeft BTW in een BTW-vrije administratie", acct => $acct)); } if ( $nr == 1 ) { $bsk_nr = $self->bsk_nr($opts); return unless defined($bsk_nr); $bsk_id = $dbh->get_sequence("boekstukken_bsk_id_seq"); if ( $bsk_ref and $dbh->do("SELECT count(*)". " FROM Boekstukken, Boekstukregels". " WHERE bsk_id = bsr_bsk_id". " AND upper(bsk_ref) = ?". " AND upper(bsr_rel_code) = ?". " AND bsk_bky = ?", uc($bsk_ref), uc($debcode), $bky)->[0] ) { warn("?".__x("Referentie {ref} bestaat al voor relatie {rel}", rel => $debcode, ref => $bsk_ref)."\n"); return; } $dbh->begin_work; $dbh->sql_insert("Boekstukken", [qw(bsk_id bsk_nr bsk_ref bsk_desc bsk_dbk_id bsk_date bsk_bky)], $bsk_id, $bsk_nr, $bsk_ref, $gdesc, $dagboek, $date, $bky); } # Amount can override BTW id with @X postfix. my ($namt, $btw_spec, $btw_explicit) = $does_btw ? $self->amount_with_btw($amt, $btw_id) : amount($amt); unless ( defined($namt) ) { warn("?".__x("Ongeldig bedrag: {amt}", amt => $amt)."\n"); return; } $amt = $iv ? $namt : -$namt; if ( $does_btw ) { ($btw_id, $kstomz) = $self->parse_btw_spec($btw_spec, $btw_id, $kstomz); unless ( defined($btw_id) ) { warn("?".__x("Ongeldige BTW-specificatie: {spec}", spec => $btw_spec)."\n"); return; } } # Bepalen van de BTW. # Voor neutrale boekingen (@N, of op een neutrale rekening) wordt geen BTW # toegepast. Op _alle_ andere wel. De BTW kan echter nul zijn, of void. # Het eerste wordt bewerkstelligd door $btw_id op 0 te zetten, het tweede # door $btw_acc geen waarde te geven. my $btwclass = 0; my $btw_acc; if ( defined($kstomz) ) { # BTW toepassen. if ( $kstomz ? !$iv : $iv ) { #warn("?".__x("U kunt geen {ko} boeken in een {iv} dagboek", warn("!".__x("Pas op! U boekt {ko} in een {iv} dagboek", ko => $kstomz ? _T("kosten") : _T("omzet"), iv => $iv ? _T("inkoop") : _T("verkoop"), )."\n"); #return; } # Void BTW voor non-EU en verlegd. if ( $btw_id && ($rel_btw == BTWTYPE_NORMAAL || $rel_btw == BTWTYPE_INTRA) ) { my $res = $dbh->do( "SELECT btw_tariefgroep, btw_start, btw_end, btw_alias, btw_desc, btw_incl". " FROM BTWTabel". " WHERE btw_id = ?", $btw_id ); my $incl = $res->[5]; my $tg; unless ( defined($res) && defined( $tg = $res->[0] ) ) { warn("?".__x("Onbekende BTW-code: {code}", code => $btw_id)."\n"); return; } if ( defined( $res->[1] ) && $res->[1] gt $date ) { my $ok = 0; if ( $btw_adapt && !$btw_explicit ) { my $rr = $dbh->do( "SELECT btw_id, btw_desc". " FROM BTWTabel". " WHERE btw_tariefgroep = ?". " AND btw_end >= ?". " AND " . ( $incl ? "" : "NOT " ) . "btw_incl". " ORDER BY btw_id", $tg, $date ); if ( $rr && $rr->[0] ) { warn("%".__x("BTW-code: {code} aangepast naar {new} i.v.m. de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id, new => $rr->[1]||$rr->[0], )."\n"); $btw_id = $rr->[0]; $ok++; } } unless ( $ok ) { warn("!".__x("BTW-code: {code} is nog niet geldig op de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id)."\n"); } } if ( defined( $res->[2] ) && $res->[2] lt $date ) { my $ok = 0; if ( $btw_adapt && !$btw_explicit ) { my $rr = $dbh->do( "SELECT btw_id, btw_desc". " FROM BTWTabel". " WHERE btw_tariefgroep = ?". " AND btw_start <= ?". " AND " . ( $incl ? "" : "NOT " ) . "btw_incl". " ORDER BY btw_id", $tg, $date ); if ( $rr && $rr->[0] ) { warn("%".__x("BTW-code: {code} aangepast naar {new} i.v.m. de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id, new => $rr->[1]||$rr->[0], )."\n"); $btw_id = $rr->[0]; $ok++; } } unless ( $ok ) { warn("!".__x("BTW-code: {code} is niet meer geldig op de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id)."\n"); } } my $tp = BTWTARIEVEN->[$tg]; my $t = qw(v i)[$iv] . lc(substr($tp, 0, 1)); $btw_acc = $dbh->std_acc("btw_$t"); } } elsif ( $btw_id ) { warn("?"._T("BTW toepassen is niet mogelijk op een neutrale rekening")."\n"); return; } # ASSERT: $btw_id != 0 implies defined($kstomz). $dbh->sql_insert("Boekstukregels", [qw(bsr_nr bsr_date bsr_bsk_id bsr_desc bsr_amount bsr_btw_id bsr_btw_acc bsr_btw_class bsr_type bsr_acc_id bsr_rel_code bsr_dbk_id bsr_ref)], $nr++, $date, $bsk_id, $desc, $amt, $btw_id, $btw_acc, BTWKLASSE($does_btw ? defined($kstomz) : 0, $rel_btw, defined($kstomz) ? $kstomz : $iv), 0, $acct, $debcode, $dagboek, $bsr_ref); } my $ret = $self->journalise($bsk_id, $iv, $totaal); # $rr = [ @$ret ]; # shift(@$rr); # $rr = [ sort { $a->[5] <=> $b->[5] } @$rr ]; # foreach my $r ( @$rr ) { # my (undef, undef, undef, undef, $nr, $ac, $amt) = @$r; # next unless $nr; # warn("update $ac with ".numfmt($amt)."\n") if $trace_updates; # $dbh->upd_account($ac, $amt); # } my $tot = $ret->[$#{$ret}]->[8]; # ERROR PRONE $dbh->sql_exec("UPDATE Boekstukken SET bsk_amount = ?, bsk_open = ? WHERE bsk_id = ?", $tot, $tot, $bsk_id)->finish; $dbh->store_journal($ret); $tot = -$tot if $iv; my $fail = defined($totaal) && $tot != $totaal; if ( $opts->{journal} ) { warn("?"._T("Dit overzicht is ter referentie, de boeking is niet uitgevoerd!")."\n") if $fail; EB::Report::Journal->new->journal ({select => $bsk_id, d_boekjaar => $bky, detail => 1}); } if ( $fail ) { $dbh->rollback; return "?"._T("Boeking ". join(":", $dbh->lookup($dagboek, qw(Dagboeken dbk_id dbk_desc)), $bsk_nr). " is niet uitgevoerd!")." ". __x(" Boekstuk totaal is {act} in plaats van {exp}", act => numfmt($tot), exp => numfmt($totaal)) . "."; } else { $dbh->commit; } # TODO -- need this to get a current booking. $opts->{verbose} || 1 ? join(":", $dbh->lookup($dagboek, qw(Dagboeken dbk_id dbk_desc)), $bsk_nr) : ""; } 1; EekBoek-2.02.04/lib/EB/Booking/BKM.pm0000444000076500007650000005043412165465617014432 0ustar jvjv#! perl package main; our $cfg; our $dbh; package EB::Booking::BKM; # Author : Johan Vromans # Created On : Thu Jul 7 14:50:41 2005 # Last Modified By: Johan Vromans # Last Modified On: Mon Aug 27 13:24:53 2012 # Update Count : 547 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; use warnings; # Dagboek type 3: Bank # Dagboek type 4: Kas # Dagboek type 5: Memoriaal use EB; use EB::Format; use EB::Report::Journal; use base qw(EB::Booking); my $trace_updates = $cfg->val(__PACKAGE__, "trace_updates", 0); # for debugging sub perform { my ($self, $args, $opts) = @_; return unless $self->adm_open; my $dagboek = $opts->{dagboek}; my $dagboek_type = $opts->{dagboek_type}; my $totaal = $opts->{totaal}; my $saldo = $opts->{saldo}; my $beginsaldo = $opts->{beginsaldo}; my $does_btw = $dbh->does_btw; my $verbose = $opts->{verbose}; if ( defined($totaal) ) { my $t = amount($totaal); return "?".__x("Ongeldig totaal: {total}", total => $totaal) unless defined $t; $totaal = $t; } if ( defined($saldo) ) { my $t = amount($saldo); return "?".__x("Ongeldig saldo: {saldo}", saldo => $saldo) unless defined $t; $saldo = $t; } if ( defined($beginsaldo) ) { my $t = amount($beginsaldo); return "?".__x("Ongeldig beginsaldo: {saldo}", saldo => $beginsaldo) unless defined $t; $beginsaldo = $t; } my $bky = $self->{bky} ||= $opts->{boekjaar} || $dbh->adm("bky"); my ($begin, $end); return unless ($begin, $end) = $self->begindate; my $date; if ( $date = parse_date($args->[0], substr($begin, 0, 4)) ) { shift(@$args); } else { return "?".__x("Onherkenbare datum: {date}", date => $args->[0])."\n" if ($args->[0]||"") =~ /^[[:digit:]]+-/; $date = iso8601date(); } return "?"._T("Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer aanwijzingen.")."\n" unless @$args; return unless $self->in_bky($date, $begin, $end); my $gdesc = shift(@$args); my $bsk_nr = $self->bsk_nr($opts); return unless defined($bsk_nr); my $nr = 1; my $bsk_id; my $gacct = $dbh->lookup($dagboek, qw(Dagboeken dbk_id dbk_acc_id)); my $btw_adapt = $cfg->val(qw(strategy btw_adapt), 0); if ( $gacct ) { my $vsaldo = saldo_for($dagboek, $bsk_nr-1, $bky); if ( defined $beginsaldo ) { return "?".__x("Beginsaldo komt niet overeen met het eindsaldo van de voorgaande boeking", s1 => numfmt($beginsaldo), s2 => numfmt($vsaldo))."\n" if defined($vsaldo) && $vsaldo != $beginsaldo; print(__x("Beginsaldo: {bal}", bal => numfmt($beginsaldo)), "\n") if $verbose; } elsif ( defined $vsaldo ) { $beginsaldo = $vsaldo; print(__x("Saldo voorgaande boeking: {bal}", bal => numfmt($beginsaldo)), "\n") if $verbose; } else { $beginsaldo = $dbh->lookup($gacct, qw(Accounts acc_id acc_balance)); print(__x("Huidig saldo: {bal}", bal => numfmt($beginsaldo)), "\n") if $verbose; } } $bsk_id = $dbh->get_sequence("boekstukken_bsk_id_seq"); $dbh->begin_work; $dbh->sql_insert("Boekstukken", [qw(bsk_id bsk_nr bsk_desc bsk_dbk_id bsk_date bsk_bky)], $bsk_id, $bsk_nr, $gdesc, $dagboek, $date, $bky); my $tot = 0; my $did = 0; my $fail = 0; ENTRY: while ( @$args ) { my $type = shift(@$args); my $bsr_ref; if ( $type eq "std" ) { return "?"._T("Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer aanwijzingen.")."\n" unless @$args >= 3; my $dd = parse_date($args->[0], substr($begin, 0, 4)); if ( $dd ) { shift(@$args); return unless $self->in_bky($dd, $begin, $end); if ( $does_btw && $dbh->adm("btwbegin") && $dd lt $dbh->adm("btwbegin") ) { warn("?"._T("De boekingsdatum valt in de periode waarover al BTW aangifte is gedaan")."\n"); return; } } else { return "?".__x("Onherkenbare datum: {date}", date => $args->[0])."\n" if ($args->[0]||"") =~ /^[[:digit:]]+-/; $dd = $date; } return "?"._T("Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer aanwijzingen.")."\n" unless @$args >= 3; my ($desc, $amt, $acct) = splice(@$args, 0, 3); if ( $opts->{verbose} ) { my $t = $desc; $t = '"' . $desc . '"' if $t =~ /\s/; warn(" "._T("boekstuk").": std $t $amt $acct\n"); } if ( $acct !~ /^\d+$/ ) { if ( $acct =~ /^(\d+)([cd])/i ) { warn("?"._T("De \"D\" of \"C\" toevoeging aan het rekeningnummer is hier niet toegestaan")."\n"); } else { warn("?".__x("Ongeldig grootboekrekeningnummer: {acct}", acct => $acct )."\n"); } $fail++; next; } my $rr = $dbh->do("SELECT acc_desc,acc_balres,acc_kstomz,acc_btw". " FROM Accounts". " WHERE acc_id = ?", $acct); unless ( $rr ) { warn("?".__x("Onbekende grootboekrekening: {acct}", acct => $acct)."\n"); $fail++; next; } my ($adesc, $balres, $kstomz, $btw_id) = @$rr; if ( $balres && $dagboek_type != DBKTYPE_MEMORIAAL ) { warn("!".__x("Grootboekrekening {acct} ({desc}) is een balansrekening", acct => $acct, desc => $adesc)."\n") if 0; } if ( $btw_id && !$does_btw ) { croak("INTERNAL ERROR: ". __x("Grootboekrekening {acct} heeft BTW in een BTW-vrije administratie", acct => $acct)); } my $bid; my $oamt = $amt; my $btw_explicit; ($amt, $bid, $btw_explicit) = $does_btw ? $self->amount_with_btw($amt, undef) : amount($amt); unless ( defined($amt) ) { warn("?".__x("Ongeldig bedrag: {amt}", amt => $oamt)."\n"); $fail++; next; } $btw_id = 0, undef($bid) if defined($bid) && !$bid; # override: @0 # For memorials, if there's BTW associated, it must be explicitly confirmed. if ( $btw_id && !defined($bid) && $dagboek_type == DBKTYPE_MEMORIAAL ) { warn("?"._T("Boekingen met BTW zijn niet mogelijk in een memoriaal.". " De BTW is op nul gesteld.")."\n"); $btw_id = 0; } my $btw_acc; if ( defined($bid) ) { ($btw_id, $kstomz) = $self->parse_btw_spec($bid, $btw_id, $kstomz); unless ( defined($btw_id) ) { warn("?".__x("Ongeldige BTW-specificatie: {spec}", spec => $bid)."\n"); $fail++; next; } if ( !defined($kstomz) && $btw_id ) { warn("?"._T("BTW toepassen is niet mogelijk op een neutrale rekening")."\n"); $fail++; next; } } if ( $btw_id ) { my $res = $dbh->do( "SELECT btw_tariefgroep, btw_start, btw_end, btw_alias, btw_desc, btw_incl". " FROM BTWTabel". " WHERE btw_id = ?", $btw_id ); my $incl = $res->[5]; my $tg; unless ( defined($res) && defined( $tg = $res->[0] ) ) { warn("?".__x("Onbekende BTW-code: {code}", code => $btw_id)."\n"); return; } croak("INTERNAL ERROR: btw code $btw_id heeft tariefgroep $tg") unless $tg; if ( defined( $res->[1] ) && $res->[1] gt $dd ) { my $ok = 0; if ( $btw_adapt && !$btw_explicit ) { my $rr = $dbh->do( "SELECT btw_id, btw_desc". " FROM BTWTabel". " WHERE btw_tariefgroep = ?". " AND btw_end >= ?". " AND " . ( $incl ? "" : "NOT " ) . "btw_incl". " ORDER BY btw_id", $tg, $dd ); if ( $rr && $rr->[0] ) { warn("%".__x("BTW-code: {code} aangepast naar {new} i.v.m. de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id, new => $rr->[1]||$rr->[0], )."\n"); $btw_id = $rr->[0]; $ok++; } } unless ( $ok ) { warn("!".__x("BTW-code: {code} is nog niet geldig op de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id)."\n"); } } if ( defined( $res->[2] ) && $res->[2] lt $dd ) { my $ok = 0; if ( $btw_adapt && !$btw_explicit ) { my $rr = $dbh->do( "SELECT btw_id, btw_desc". " FROM BTWTabel". " WHERE btw_tariefgroep = ?". " AND btw_start <= ?". " AND " . ( $incl ? "" : "NOT " ) . "btw_incl". " ORDER BY btw_id", $tg, $dd ); if ( $rr && $rr->[0] ) { warn("%".__x("BTW-code: {code} aangepast naar {new} i.v.m. de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id, new => $rr->[1]||$rr->[0], )."\n"); $btw_id = $rr->[0]; $ok++; } } unless ( $ok ) { warn("!".__x("BTW-code: {code} is niet meer geldig op de boekingsdatum", code => $res->[3]||$res->[4]||$btw_id)."\n"); } } my $tp = BTWTARIEVEN->[$tg]; my $t = qw(v i)[$kstomz] . lc(substr($tp, 0, 1)); $btw_acc = $dbh->std_acc("btw_$t"); } my $btw = 0; my $bsr_amount = $amt; my $orig_amount = $amt; my ($btw_ink, $btw_verk); if ( $btw_id ) { ( $bsr_amount, $btw, $btw_ink, $btw_verk ) = @{$self->norm_btw($bsr_amount, $btw_id)}; $amt = $bsr_amount - $btw; } $orig_amount = -$orig_amount; $dbh->sql_insert("Boekstukregels", [qw(bsr_nr bsr_date bsr_bsk_id bsr_desc bsr_amount bsr_btw_id bsr_btw_acc bsr_btw_class bsr_type bsr_acc_id bsr_rel_code bsr_dbk_id bsr_ref)], $nr++, $dd, $bsk_id, $desc, $orig_amount, $btw_id, $btw_acc, BTWKLASSE($does_btw ? defined($kstomz) : 0, BTWTYPE_NORMAAL, $kstomz||0), 0, $acct, undef, undef, $bsr_ref); # warn("update $acct with ".numfmt(-$amt)."\n") if $trace_updates; # $dbh->upd_account($acct, -$amt); $tot += $amt; if ( $btw ) { # my $btw_acct = # $dbh->lookup($acct, qw(Accounts acc_id acc_debcrd)) ? $btw_ink : $btw_verk; # warn("update $btw_acct with ".numfmt(-$btw)."\n") if $trace_updates; # $dbh->upd_account($btw_acct, -$btw); $tot += $btw; } } elsif ( $type eq "deb" || $type eq "crd" ) { my $debcrd = $type eq "deb" ? 1 : 0; return "?"._T("Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer aanwijzingen.")."\n" unless @$args >= 2; my $dd = parse_date($args->[0], substr($begin, 0, 4)); if ( $dd ) { shift(@$args); return unless $self->in_bky($dd, $begin, $end); if ( $does_btw && $dbh->adm("btwbegin") && $dd lt $dbh->adm("btwbegin") ) { warn("?"._T("De boekingsdatum valt in de periode waarover al BTW aangifte is gedaan")."\n"); return; } } else { return "?".__x("Onherkenbare datum: {date}", date => $args->[0])."\n" if ($args->[0]||"") =~ /^[[:digit:]]+-/; $dd = $date; } return "?"._T("Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer aanwijzingen.")."\n" unless @$args >= 2; my ($rel, $amt) = splice(@$args, 0, 2); warn(" "._T("boekstuk").": $type $rel $amt\n") if $verbose; my $oamt = $amt; $amt = amount($amt); unless ( defined($amt) ) { warn("?".__x("Ongeldig bedrag: {amt}", amt => $oamt)."\n"); $fail++; next; } my ($rr, $sql, @sql_args); if ( $rel =~ /:/ ) { $bsr_ref = $rel; # store in db my ($id, $bsk, $err) = $dbh->bskid($rel, $bky); unless ( defined($id) ) { warn("?$err\n"); $fail++; next; } $sql = "SELECT bsk_nr, bsk_id, dbk_id, dbk_acc_id, bsk_desc, bsk_amount, bsr_rel_code". " FROM Boekstukken, Boekstukregels, Dagboeken" . " WHERE bsk_id = ?". " AND bsk_dbk_id = dbk_id". " AND bsr_bsk_id = bsk_id". " AND bsr_nr = 1". " AND dbk_type = ?"; @sql_args = ( $id, $debcrd ? DBKTYPE_VERKOOP : DBKTYPE_INKOOP); $rr = $dbh->do($sql, @sql_args); unless ( defined($rr) ) { # Can this happen??? warn("?".__x("Geen post gevonden voor boekstuk {bsk}", bsk => $rel)."\n"); $fail++; next; } } elsif ( 1 ) { # Lookup rel code. $rr = $dbh->do("SELECT rel_code FROM Relaties" . " WHERE upper(rel_code) = ?" . " AND " . ($debcrd ? "" : "NOT ") . "rel_debcrd", uc($rel)); unless ( defined($rr) ) { warn("?".__x("Onbekende {what}: {who}", what => lc($type eq "deb" ? _T("Debiteur") : _T("Crediteur")), who => $rel)."\n"); $fail++; next; } # Get actual code. $rel = $rr->[0]; # Zoek open posten. my $ddd; my $delta = $cfg->val(qw(strategy bkm_multi_delta), 0); $delta = undef; # disable for now. $ddd = parse_date($dd, substr($begin, 0, 4), $delta) if $delta; $sql = "SELECT bsk_open, bsk_nr, bsk_id, dbk_id, dbk_acc_id, bsk_desc, bsk_amount ". " FROM Boekstukken, Boekstukregels, Dagboeken" . " WHERE bsk_open != 0". " AND dbk_type = ?". " AND bsk_dbk_id = dbk_id". " AND bsr_bsk_id = bsk_id". " AND bsr_rel_code = ?". " AND bsr_nr = 1". ( $delta ? " AND bsr_date <= ?" : "" ). " ORDER BY bsr_date"; @sql_args = ( $debcrd ? DBKTYPE_VERKOOP : DBKTYPE_INKOOP, $rel, $delta ? $ddd : () ); # Resultset of candidates. my $res = []; my $sth = $dbh->sql_exec($sql, @sql_args); while ( $rr = $sth->fetchrow_arrayref ) { if ( $rr->[0] == $amt ) { # exact match $res = [[@$rr]]; last; } else { # Add. push(@$res, [@$rr]); } } $sth->finish; my $wmsg; if ( @$res == 0 ) { # Nothing. undef $rr; } elsif ( @$res == 1 && $res->[0]->[0] == $amt ) { # Exact match. Use it. $rr = $res->[0]; } # Knapsack slows down terribly with large search sets. Limit it. elsif ( @$res <= $cfg->val(qw(strategy bkm_multi_max), 15) ) { # Use exact knapsack matching to find possible components. my @amts = map { $_->[0] } @$res; if ( my @k = partition($amt, \@amts) ) { # We found something. Check strategy. if ( $cfg->val(qw(strategy bkm_multi), 0) ) { # We may split. my @t; # for reporting foreach ( @{$k[0]} ) { push(@t, numfmt($amts[$_])); # Push back the data in the input queue. unshift(@$args, $type, $dd, $rel, numfmt_plain($amts[$_])); } # Inform the user. my $t = shift(@t); warn("!".__x("Betaling {rel} {amt} voldoet de open posten {amtss} en {amts}", rel => $rel, amt => numfmt($amt), amtss => join(", ", @t), amts => $t)."\n"); next ENTRY; } else { undef $rr; foreach my $k ( @k ) { my @t; # for reporting foreach ( @{$k} ) { push(@t, numfmt($amts[$_])); } my $t = shift(@t); $wmsg .= "\n%" if $wmsg; # $wmsg .= __x("Wellicht de betaling van de open posten {amtss} en {amts}?", # amtss => join(", ", @t), # amts => $t); $wmsg .= _T("Wellicht de betaling van de volgende open posten:"); foreach ( @{$k} ) { my ($open, $bsknr, $bskid, $dbk_id, $bsk_desc, $bsk_amount) = @{$res->[$_]}; $wmsg .= sprintf("\n%% %s %s %s", join(":", $dbh->lookup($dbk_id, qw(Dagboeken dbk_id dbk_desc)), $bsknr), numfmt($open), $bsk_desc); } } } } # Punt it. else { undef $rr; } } else { $wmsg = __x("Geen alternatieven beschikbaar (teveel open posten)"); undef $rr; } unless ( defined($rr) ) { warn("?".__x("Geen open post van {amt} gevonden voor relatie {rel}", amt => numfmt($amt), rel => $rel)."\n"); if ( $wmsg) { warn("%".$wmsg."\n"); } elsif ( @$res ) { warn("%".__x("Open posten voor relatie {rel}:", rel => $rel)."\n"); foreach ( @$res ) { my ($open, $bsknr, $bskid, $dbk_id, $dbk_acc_id, $bsk_desc, $bsk_amount) = @$_; warn(sprintf("%% %s %s %s\n", join(":", $dbh->lookup($dbk_id, qw(Dagboeken dbk_id dbk_desc)), $bsknr), numfmt($open), $bsk_desc)); } } $fail++; next; } $rr = [@$rr, $rel]; shift(@$rr); } else { # Lookup rel code. $rr = $dbh->do("SELECT rel_code FROM Relaties" . " WHERE upper(rel_code) = ?" . " AND " . ($debcrd ? "" : "NOT ") . "rel_debcrd", uc($rel)); unless ( defined($rr) ) { warn("?".__x("Onbekende {what}: {who}", what => lc($type eq "deb" ? _T("Debiteur") : _T("Crediteur")), who => $rel)."\n"); $fail++; next; } # Get actual code. $rel = $rr->[0]; # Find associated booking. $sql = "SELECT bsk_id, dbk_id, dbk_acc_id, bsk_desc, bsk_amount ". " FROM Boekstukken, Boekstukregels, Dagboeken" . " WHERE bsk_open != 0". ($amt ? " AND bsk_open = ?" : ""). " AND dbk_type = ?". " AND bsk_dbk_id = dbk_id". " AND bsr_bsk_id = bsk_id". " AND bsr_rel_code = ?". " ORDER BY bsr_date"; @sql_args = ( $amt ? $amt : (), $debcrd ? DBKTYPE_VERKOOP : DBKTYPE_INKOOP, $rel); $rr = $dbh->do($sql, @sql_args); unless ( defined($rr) ) { warn("?".__x("Geen open post van {amt} gevonden voor relatie {rel}", amt => numfmt($amt), rel => $rel)."\n"); $fail++; next; } $rr = [@$rr, $rel]; } my ($bsknr, $bskid, $dbk_id, $dbk_acc_id, $bsk_desc, $bsk_amount, $bsr_rel) = @$rr; #my $acct = $dbh->std_acc($debcrd ? "deb" : "crd"); my $acct = $dbk_acc_id; $dbh->sql_insert("Boekstukregels", [qw(bsr_nr bsr_date bsr_bsk_id bsr_desc bsr_amount bsr_btw_id bsr_type bsr_acc_id bsr_btw_class bsr_rel_code bsr_dbk_id bsr_paid bsr_ref)], $nr++, $dd, $bsk_id, "*".$bsk_desc, -$amt, 0, $type eq "deb" ? 1 : 2, $acct, 0, $bsr_rel, $dbk_id, $bskid, $bsr_ref); $dbh->sql_exec("UPDATE Boekstukken". " SET bsk_open = bsk_open - ?". " WHERE bsk_id = ?", $amt, $bskid); # warn("update $acct with ".numfmt(-$amt)."\n") if $trace_updates; # $dbh->upd_account($acct, -$amt); $tot += $amt; } else { warn("?".__x("Onbekend transactietype: {type}", type => $type)."\n"); $fail++; next; } } if ( $gacct ) { warn("update $gacct with ".numfmt($tot)."\n") if $trace_updates; $dbh->upd_account($gacct, $tot); # my $new = $dbh->lookup($gacct, qw(Accounts acc_id acc_balance)); my $new = $beginsaldo + $tot; print(__x("Nieuw saldo: {bal}", bal => numfmt($new)), "\n") if $verbose; $dbh->sql_exec("UPDATE Boekstukken". " SET bsk_saldo = ?, bsk_isaldo = ?". " WHERE bsk_id = ?", $new, $beginsaldo, $bsk_id)->finish; if ( defined $saldo ) { unless ( $saldo == $new ) { warn("?".__x("Saldo {new} klopt niet met de vereiste waarde {act}", new => numfmt($new), act => numfmt($saldo))."\n"); $fail++; } } if ( defined($totaal) and $tot != $totaal ) { $fail++; warn("?".__x(" Boekstuk totaal is {act} in plaats van {exp}", act => numfmt($tot), exp => numfmt($totaal)) . "\n"); } my $isaldo = saldo_for($dagboek, $bsk_nr+1, $bky, "isaldo"); if ( defined($isaldo) and $isaldo != $new ) { $fail++; warn("?".__x("Saldo {new} klopt niet met beginsaldo eropvolgende boekstuk {isaldo}", new => numfmt($new), isaldo => numfmt($isaldo)) . "\n"); } } elsif ( $tot ) { warn("?".__x("Boekstuk is niet in balans (verschil is {diff})", diff => numfmt($tot))."\n"); $fail++; } $dbh->sql_exec("UPDATE Boekstukken SET bsk_amount = ? WHERE bsk_id = ?", $tot, $bsk_id)->finish; $dbh->store_journal($self->journalise($bsk_id)); if ( $opts->{journal} ) { warn("?"._T("Dit overzicht is ter referentie, de boeking is niet uitgevoerd!")."\n") if $fail; EB::Report::Journal->new->journal ({select => $bsk_id, d_boekjaar => $bky, detail => 1}); } if ( $fail ) { warn("?"._T("Boeking ". join(":", ($dbh->lookup($dagboek, qw(Dagboeken dbk_id dbk_desc)), $bsk_nr)). " is niet uitgevoerd!")."\n"); $dbh->rollback; return undef; } $dbh->commit; # TODO -- need this to get a current booking. $verbose || 1 ? join(":", $dbh->lookup($dagboek, qw(Dagboeken dbk_id dbk_desc)), $bsk_nr) : ""; } sub saldo_for { my ($dbk, $nr, $bky, $ww) = (@_, "saldo"); my $sth = $dbh->sql_exec("SELECT bsk_$ww FROM Boekstukken". " WHERE bsk_dbk_id = ? AND bsk_nr = ?". " AND bsk_bky = ?", $dbk, $nr, $bky); my $rr = $sth->fetchrow_arrayref; $sth->finish; if ( $rr && defined($rr->[0]) ) { return $rr->[0]; } return; } # Adapted from 'Higher Order Perl' (Mark Jason Dominus), # sec 5.1.1 "Finding All Possible Partitions". sub partition { my ($target, $values, $ix) = @_; return [] if $target == 0; $ix = [ 0 .. $#{$values} ] unless defined $ix; return () if @$ix == 0; my ($first, @rest) = @$ix; my @solutions = partition($target - $values->[$first], $values, \@rest); return ( (map { [ $first, @$_ ] } @solutions), partition($target, $values, \@rest)); } 1; EekBoek-2.02.04/lib/EB/Shell.pm0000444000076500007650000011777412165465617013513 0ustar jvjv#! perl # Author : Johan Vromans # Created On : Thu Jul 14 12:54:08 2005 # Last Modified By: Johan Vromans # Last Modified On: Fri May 18 20:55:27 2012 # Update Count : 228 # Status : Unknown, Use with caution! use utf8; package main; our $cfg; our $dbh; our $app; package EB::Shell; use strict; use warnings; use EB; my $bky; # current boekjaar (if set) use base qw(EB::Shell::DeLuxe); sub new { my $class = shift; $class = ref($class) || $class; my $opts = UNIVERSAL::isa($_[0], 'HASH') ? shift : { @_ }; if ( $opts->{command} && $ARGV[0] eq "import" ) { $dbh->connectdb(1); } else { _plug_cmds(); } # User defined stuff. my $pkg = $cfg->val(qw(shell userdefs), undef); if ( $pkg ) { $pkg =~ s/::/\//g; $pkg .= ".pm"; eval { require $pkg }; die($@) if $@; } else { eval { local $SIG{__WARN__}; local $SIG{__DIE__}; require EB::Shell::Userdefs; }; die($@) if $@ && $@ !~ /can't locate eb.shell.userdefs\.pm in \@inc/i; } my $self = $class->SUPER::new($opts); if ( $self->{interactive} ) { $self->term->Attribs->{completion_function} = sub { $self->eb_complete(@_) }; } if ( defined $self->{boekjaar} ) { $self->do_boekjaar($self->{boekjaar}); } $self; } sub prompt { my $t = $cfg->val(qw(database name)); $t =~ s/^eekboek_//; $t = shift->{prompt} . " [$t"; $t .= ":$bky" if defined $bky; $t . "] "; } sub default { undef; } sub intro { my $self = $_[0]; if ( $self->{interactive} ) { do_database(); bky_msg(); } undef; } sub outro { undef } sub postcmd { shift; if ( $dbh->in_transaction ) { warn("%"._T("Openstaande transactie is teruggedraaid")."\n"); $dbh->rollback; } shift } sub bky_msg { my $sth = $dbh->sql_exec("SELECT bky_code". " FROM Boekjaren". " WHERE bky_end < ?". " AND NOT bky_opened IS NULL". " AND bky_closed IS NULL". " ORDER BY bky_begin", defined $bky ? $dbh->lookup($bky, qw(Boekjaren bky_code bky_begin)) : $dbh->adm("begin")); while ( my $rr = $sth->fetchrow_arrayref ) { warn("!".__x("Pas op! Boekjaar {bky} is nog niet afgesloten.", bky => $rr->[0])."\n"); } } my $dbk_pat; my $dbk_i_pat; my $dbk_v_pat; my $dbk_bkm_pat; sub eb_complete { my ($self, $word, $line, $pos) = @_; my $i = index($line, ' '); #warn "\nCompleting '$word' in '$line' (pos $pos, space $i)\n"; my $pre = substr($line, 0, $pos); #warn "\n[$pre][", substr($line, $pos), "]\n"; select(STDERR); $| = 1; select(STDOUT); # Some ReadLiners put the terminal in raw mode... my $nl = "\r\n"; if ( $i < 0 || $i > $pos-1 || $pre =~ /^help\s+$/ ) { my @words = $self->completions; if ( $pre =~ /^help\s+$/ ) { push( @words, $self->{cm}->{rapporten}, $self->{cm}->{periodes}); } my @a = grep { /^$word/ } @words; if ( @a ) { return $a[0] if @a == 1; print STDERR ( $nl, join(" ", @a), $nl, # Re-prompt. We'll lose the ornaments, # but it's better than nothing (I hope). $self->prompt, "$line" ); } return; } if ( $word =~ /^\d+$/ ) { my $sth = $dbh->sql_exec("SELECT acc_id,acc_desc from Accounts". " WHERE CAST(acc_id AS text) LIKE ?". " ORDER BY acc_id", "$word%"); my $rr = $sth->fetchrow_arrayref; return () unless $rr; my ($w, $d) = @$rr; $rr = $sth->fetchrow_arrayref; return ($w) unless $rr; printf STDERR ($nl."%9d %s".$nl, $w, $d); while ( $rr ) { printf STDERR ("%9d %s".$nl, @$rr); $rr = $sth->fetchrow_arrayref; } print STDERR ("$line"); return (); } my $t; if ( ($word =~ /^[[:alpha:]]/ || $word eq "?") && (($pre =~ /^\s*(?:$dbk_bkm_pat).*\s(crd|deb)\s+$/ and $t = $1) || ($pre =~ /^\s*(?:$dbk_i_pat)(?::\S+)?(?:\s+[0-9---]+)?\s*$/ and $t = "deb") || ($pre =~ /^\s*(?:$dbk_v_pat)(?::\S+)?(?:\s+[0-9---]+)?\s*$/ and $t = "crd"))) { $word = "" if $word eq "?"; my $sth = $dbh->sql_exec("SELECT rel_code,rel_desc from Relaties". " WHERE rel_code LIKE ?". " AND " . ($t eq "deb" ? "" : "NOT ") . "rel_debcrd". " ORDER BY rel_code", "$word%"); my $rr = $sth->fetchrow_arrayref; return () unless $rr; my ($w, $d) = @$rr; $rr = $sth->fetchrow_arrayref; if ( !$rr && $word ne "" ) { return ($w); } printf STDERR ($nl." %s %s".$nl, $w, $d); while ( $rr ) { printf STDERR (" %s %s".$nl, @$rr); $rr = $sth->fetchrow_arrayref; } print STDERR ("$line"); return (); } #warn "\n[$pre][", substr($line, $pos), "]\n"; return (); } sub parseline { my ($self, $line) = @_; $line =~ s/\\\s*$//; $line =~ s/;\s*$//; my ($cmd, @args) = $self->SUPER::parseline($line); if ( $cmd =~ /^(.+):(\S+)$/ ) { $cmd = $1; unshift(@args, "--nr=$2"); } ($cmd, @args); } ################ Subroutines ################ use EB; # Plug in some commands dynamically. sub _plug_cmds { foreach my $dbk_type ( 1 .. scalar(@{DBKTYPES()})-1 ) { my $dbk = lc(_T(DBKTYPES->[$dbk_type])); no strict 'refs'; undef &{"help_$dbk"}; *{"help_$dbk"} = sub { my $self = shift; $self->_help($dbk_type); }; } my $sth = $dbh->sql_exec("SELECT dbk_id,dbk_desc,dbk_type FROM Dagboeken"); my $rr; while ( $rr = $sth->fetchrow_arrayref ) { my ($dbk_id, $dbk_desc, $dbk_type) = @$rr; no strict 'refs'; my $dbk = lc(_T($dbk_desc)); #### TODO: _T ??? $dbk =~ s/\s+/_/g; undef &{"do_$dbk"} if defined &{"do_$dbk"}; *{"do_$dbk"} = sub { my $self = shift; $self->_add($dbk_id, @_); }; undef &{"help_$dbk"}; *{"help_$dbk"} = sub { my $self = shift; $self->_help($dbk_type); }; if ( $dbk_type == DBKTYPE_INKOOP ) { $dbk_v_pat .= lc($dbk_desc)."|"; $dbk_pat .= lc($dbk_desc)."|"; } elsif ( $dbk_type == DBKTYPE_VERKOOP ) { $dbk_i_pat .= lc($dbk_desc)."|"; $dbk_pat .= lc($dbk_desc)."|"; } else { $dbk_bkm_pat .= lc($dbk_desc)."|"; $dbk_pat .= lc($dbk_desc)."|"; } } # Opening (adm_...) commands. require EB::Tools::Opening; foreach my $adm ( @{EB::Tools::Opening->commands} ) { my $cmd = $adm; $cmd =~ s/^set_//; no strict 'refs'; undef &{"do_adm_$cmd"} if defined &{"do_adm_$cmd"}; *{"do_adm_$cmd"} = sub { (shift->{o} ||= EB::Tools::Opening->new)->$adm(@_); }; my $help = "help_$cmd"; undef &{"help_adm_$cmd"}; *{"help_adm_$cmd"} = sub { my $self = shift; ($self->{o} ||= EB::Tools::Opening->new)->can($help) ? $self->{o}->$help() : $self->{o}->shellhelp($cmd); }; } foreach ($dbk_pat, $dbk_i_pat, $dbk_v_pat, $dbk_bkm_pat) { chop if $_; } } sub _forget_cmds { # Delete daybook-associated shell functions. my $t = "|".join( "|", @{ $dbh->tablesdb } )."|"; if ( $t =~ /\|dagboeken\|/i ) { my $sth = $dbh->sql_exec("SELECT dbk_desc FROM Dagboeken"); my $rr; while ( $rr = $sth->fetchrow_arrayref ) { my ($dbk_desc) = @$rr; no strict 'refs'; my $dbk = lc(_T($dbk_desc)); #### TODO: _T ??? $dbk =~ s/\s+/_/g; undef &{"do_$dbk"} if defined &{"do_$dbk"}; } } } sub _help { my ($self, $dbk_type) = @_; my $text = __x("Toevoegen boekstuk in een dagboek van type {type}", type => DBKTYPES->[$dbk_type]) . ".\n\n"; if ( $dbk_type == DBKTYPE_INKOOP ) { $text .= _T( <[:nr] [ ] gevolgd door een of meer: Controle van het totale boekstukbedrag kan met de optie --totaal=. De laatste mag worden weggelaten. EOS } elsif ( $dbk_type == DBKTYPE_VERKOOP ) { $text .= _T( <[:nr] [ ] gevolgd door een of meer Controle van het totale boekstukbedrag kan met de optie --totaal=. De laatste mag worden weggelaten. EOS } elsif ( $dbk_type == DBKTYPE_BANK || $dbk_type == DBKTYPE_KAS || $dbk_type == DBKTYPE_MEMORIAAL ) { $text .= _T( <[:nr] [ ] gevolgd door een of meer: crd [ ] (betaling van crediteur) deb [ ] (betaling van debiteur) std [ ] (vrije boeking) Controle van het eindsaldo kan met de optie --saldo=. Controle van het totale boekstukbedrag kan met de optie --totaal=. Voor deelbetalingen of betalingen met afwijkend bedrag kan in plaats van de het boekstuknummer worden opgegeven. EOS } $text; } sub clionly { my ( $self, $cmd ) = @_; warn("?".__x("Opdracht \"{cmd}\" is niet beschikbaar.", cmd => $cmd)."\n"); undef; } ################ Service ################ sub argcnt($$;$) { my ($cnt, $min, $max) = @_; $max = $min unless defined $max; return 1 if $cnt >= $min && $cnt <= $max; warn("?"._T("Te weinig argumenten voor deze opdracht")."\n") if $cnt < $min; warn("?"._T("Te veel argumenten voor deze opdracht")."\n") if $cnt > $max; undef; } ################ Global toggles ################ sub _state { my ($cur, $state) = @_; return !$cur unless defined($state); my $on = _T("aan"); my $off = _T("uit"); return 1 if $state =~ /^$on|1$/i; return 0 if $state =~ /^$off|0$/i; return !$cur; } sub do_trace { my ($self, @args) = @_; my $opts = { quiet => 0 }; return unless parse_args(\@args, [ 'quiet!' ], $opts); return unless argcnt(@args, 0, 1); my $state = shift(@args); $self->{trace} = _state($self->{trace}, $state); if ( $dbh ) { $dbh->trace($self->{trace}); } return "" if $opts->{quiet}; __x("SQL Trace: {state}", state => uc($self->{trace} ? _T("aan") : _T("uit"))); } sub do_journal { my ($self, @args) = @_; my $opts = { quiet => 0 }; return unless parse_args(\@args, [ 'quiet!' ], $opts); return unless argcnt(@args, 0, 1); my $state = shift(@args); $self->{journal} = _state($self->{journal}, $state); return "" if $opts->{quiet}; __x("Journal: {state}", state => uc($self->{journal} ? _T("aan") : _T("uit"))); } sub do_confirm { my ($self, @args) = @_; my $opts = { quiet => 0 }; return unless parse_args(\@args, [ 'quiet!' ], $opts); return unless argcnt(@args, 0, 1); my $state = shift(@args); $self->{confirm} = _state($self->{confirm}, $state); return "" if $opts->{quiet}; __x("Bevestiging: {state}", state => uc($self->{confirm} ? _T("aan") : _T("uit"))); } sub do_database { my ($self, @args) = @_; return unless argcnt(scalar(@args), 0); __x("Database: {db}", db => $cfg->val(qw(database name))); } sub help_database { _T(<lookup($dagboek, qw(Dagboeken dbk_id dbk_type =)); my $action; if ( $dagboek_type == DBKTYPE_INKOOP || $dagboek_type == DBKTYPE_VERKOOP ) { require EB::Booking::IV; $action = EB::Booking::IV->new; } elsif ( $dagboek_type == DBKTYPE_BANK || $dagboek_type == DBKTYPE_KAS || $dagboek_type == DBKTYPE_MEMORIAAL) { require EB::Booking::BKM; $action = EB::Booking::BKM->new; } else { die("?".__x("Onbekend of verkeerd dagboek: {dbk} [{type}]", dbk => $dagboek, type => $dagboek_type)."\n"); } my $opts = { dagboek => $dagboek, dagboek_type => $dagboek_type, d_boekjaar => $bky || $dbh->adm("bky"), journal => $self->{journal}, totaal => undef, ref => undef, verbose => $self->{verbose}, confirm => $self->{confirm}, }; my $args = \@args; return unless parse_args($args, [ __xt('cmo:boeking:boekstuk|nr').'=s' => \$opts->{boekstuk}, __xt('cmo:boeking:boekjaar').'=s' => \$opts->{boekjaar}, __xt('cmo:boeking:journal|journaal').'!' => \$opts->{journal}, __xt('cmo:boeking:totaal').'=s' => \$opts->{totaal}, __xt('cmo:boeking:ref').'=s' => \$opts->{ref}, __xt('cmo:boeking:confirm').'!' => \$opts->{confirm}, ( $dagboek_type == DBKTYPE_BANK || $dagboek_type == DBKTYPE_KAS ) ? ( __xt('cmo:boeking:saldo').'=s' => \$opts->{saldo}, __xt('cmo:boeking:beginsaldo').'=s' => \$opts->{beginsaldo} ) : (), ], $opts); $opts->{boekjaar} = $opts->{d_boekjaar} unless defined $opts->{boekjaar}; $bsk = $action->perform($args, $opts); $bsk ? $bsk =~ /^\w+:\d+/ ? __x("Geboekt: {bsk}", bsk => $bsk) : $bsk : ""; } ################ Reports ################ sub do_journaal { my ($self, @args) = @_; my $b = $bsk; my $opts = { _cmd => "journaal", detail => 1, d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Journal; require EB::Report::GenBase; return unless parse_args(\@args, [ __xt('cmo:journaal:detail|details').'!' => \$opts->{journal}, __xt('cmo:journaal:totaal') => sub { $opts->{detail} = 0 }, __xt('cmo:journaal:boekjaar').'=s' => \$opts->{boekjaar}, __xt('cmo:journaal:periode').'=s' => sub { periode_arg($opts, "periode", $_[1]) }, EB::Report::GenBase->backend_options(EB::Report::Journal::, $opts), ], $opts); # print STDERR Dumper($opts), "\n"; $b = shift(@args) if @args; undef $b if $b && lc($b) eq "all"; $opts->{select} = $b; EB::Report::Journal->new->journal($opts); undef; } sub help_journaal { _T( < Alleen boekstuknummer met dit id journaal Alle journaalposten van dit dagboek journaal : Boekstuk van dit dagboek journaal Journaalposten van de laatste boeking Opties --[no]detail Mate van detail, standaard is met details --totaal Alleen het totaal (detail = 0) --periode=XXX Alleen over deze periode Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_balans { my ($self, @args) = @_; my $opts = { d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Balres; require EB::Report::GenBase; return unless parse_args(\@args, [ 'detail=i', 'verdicht', 'opening', 'boekjaar=s', 'per=s' => sub { date_arg($opts, @_) }, EB::Report::GenBase->backend_options(EB::Report::Balres::, $opts), ], $opts); return unless argcnt(@args, 0); if ( $opts->{opening} && $opts->{per} ) { warn("?"._T("Openingsbalans kent geen einddatum")."\n"); return; } EB::Report::Balres->new->balans($opts); undef; } sub help_balans { _T( < Balans op grootboekrekening --verdicht Verdicht, gedetailleerd --detail= Verdicht, mate van detail = 0, 1 of 2 --per= Selecteer einddatum --boekjaar= Selecteer boekjaar --opening Toon openingsbalans Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_result { my ($self, @args) = @_; my $opts = { d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Balres; require EB::Report::GenBase; return unless parse_args(\@args, [ 'detail=i', 'verdicht', 'boekjaar=s', 'periode=s' => sub { periode_arg($opts, @_) }, EB::Report::GenBase->backend_options(EB::Report::Balres::, $opts), ], $opts); return unless argcnt(@args, 0); EB::Report::Balres->new->result($opts); undef; } sub help_result { _T( < Overzicht op grootboekrekening --verdicht Verdicht, gedetailleerd --detail= Verdicht, mate van detail = 0,1,2 --periode= Selecteer periode --boekjaar= Selecteer boekjaar Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_proefensaldibalans { my ($self, @args) = @_; my $opts = { d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Proof; require EB::Report::GenBase; return unless parse_args(\@args, [ 'detail=i', 'verdicht', 'boekjaar=s', 'per=s' => sub { date_arg($opts, @_) }, EB::Report::GenBase->backend_options(EB::Report::Proof::, $opts), ], $opts); warn("?"._T("Te veel argumenten voor deze opdracht")."\n"), return if @args; EB::Report::Proof->new->proefensaldibalans($opts); undef; } sub help_proefensaldibalans { _T( < Proef- en Saldibalans op grootboekrekening --verdicht Verdicht, gedetailleerd (hetzelfde als --detail=2) --detail= Verdicht, mate van detail = 0,1,2 --per= Selecteer einddatum --boekjaar= Selecteer boekjaar Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_grootboek { my ($self, @args) = @_; my $opts = { detail => 2, d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Grootboek; require EB::Report::GenBase; return unless parse_args(\@args, [ 'detail=i', 'periode=s' => sub { periode_arg($opts, @_) }, 'boekjaar=s', EB::Report::GenBase->backend_options(EB::Report::Grootboek::, $opts), ], $opts); my $fail; my ($max_hvd, $max_vrd); my @accts; while ( @args ) { $_ = shift(@args); if ( /^\d+$/ ) { # Check for (Hoofd)Verdichtingen. $max_hvd ||= $dbh->do ( "SELECT MAX(vdi_id) FROM Verdichtingen ". "WHERE vdi_struct IS NULL")->[0]; $max_vrd ||= $dbh->do ( "SELECT MAX(vdi_id) FROM Verdichtingen ". "WHERE NOT vdi_struct IS NULL")->[0]; if ( $_ < $max_hvd ) { my $sth = $dbh->sql_exec ( "SELECT acc_id FROM Accounts ". "WHERE acc_struct IN ". " ( SELECT vdi_id FROM Verdichtingen ". " WHERE vdi_struct = ? ) ". "ORDER BY acc_id DESC", $_ ); while ( my $rr = $sth->fetch ) { unshift( @accts, $rr->[0] ); } } elsif ( $_ < $max_vrd ) { my $sth = $dbh->sql_exec ( "SELECT acc_id from Accounts ". "WHERE acc_struct = ? ". "ORDER BY acc_id DESC", $_ ); while ( my $rr = $sth->fetch ) { unshift( @accts, $rr->[0] ); } } # Assume ordinary account number. elsif ( $dbh->lookup( $_, qw(Accounts acc_id acc_id) ) ) { push( @accts, $_ ); } else { warn("?".__x("Onbekend rekeningnummer: {acct}", acct => $_)."\n"); $fail++; } next; } warn("?".__x("Ongeldig rekeningnummer: {acct}", acct => $_)."\n"); $fail++; } return if $fail; $opts->{select} = join( ",", @accts ) if @accts; EB::Report::Grootboek->new->perform($opts); undef; } sub help_grootboek { _T( < ... ] Opties: --detail= Mate van detail, =0,1,2 (standaard is 2) --periode= Alleen over deze periode Naast rekeningnummers kunnen ook nummers van verdichtingen en hoofdverdichtingen worden opgegeven. Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_dagboeken { my ($self, @args) = @_; my $rr; my $sth = $dbh->sql_exec("SELECT dbk_id, dbk_desc, dbk_type, dbk_acc_id". " FROM Dagboeken". " ORDER BY dbk_id"); my $fmt = "%2s %-16s %-12s %5s\n"; my $text = sprintf($fmt, _T("Nr"), _T("Naam"), _T("Type"), _T("Rekening")); while ( $rr = $sth->fetchrow_arrayref ) { my ($dbk_id, $dbk_desc, $dbk_type, $dbk_acct) = @$rr; $dbk_acct ||= _T("n.v.t."); $text .= sprintf($fmt, $dbk_id, $dbk_desc, DBKTYPES->[$dbk_type], $dbk_acct); } $text; } sub help_dagboeken { _T( < $bky || $dbh->adm("bky"), close => 0, }; require EB::Report::BTWAangifte; require EB::Report::GenBase; return unless parse_args(\@args, [ "boekjaar=s", 'periode=s' => sub { periode_arg($opts, @_) }, "definitief" => sub { $opts->{close} = 1 }, EB::Report::GenBase->backend_options(EB::Report::BTWAangifte::, $opts), "noreport", "noround", ], $opts) or goto &help_btwaangifte; if ( @args && lc($args[-1]) eq "definitief" ) { $opts->{close} = 1; pop(@args); } warn("?"._T("Te veel argumenten voor deze opdracht")."\n"), return if @args > ($opts->{periode} ? 0 : 1); $opts->{compat_periode} = $args[0] if @args; warn("?"._T("Deze administratie voert geen BTW")."\n"), return unless $dbh->does_btw; EB::Report::BTWAangifte->new($opts)->perform($opts); undef; } sub help_btwaangifte { _T( < ] [ ] Aangifteperiode kan zijn: j jaar Het gehele jaar k1 k2 k3 k4 1e/2e/3e/4e kwartaal (ook: q1, ...) 1 2 3 ... Maand (op nummer) jan feb ... Maand (korte naam) januari ... Maand (lange naam) Standaard is de eerstvolgende periode waarover nog geen aangifte is gedaan. Opties: --definitief De BTW periode wordt afgesloten. Er zijn geen boekingen in deze periode meer mogelijk. --periode= Selecteer aangifteperiode. Dit kan niet samen met --boekjaar, en evenmin met de bovenvermelde methode van periode-specificatie. --boekjaar= Selecteer boekjaar --noreport Geen rapportage. Dit is enkel zinvol samen met --definitief om de afgesloten BTW periode aan te passen. --noround Alle bedragen zonder af te ronden. Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_debiteuren { my ($self, @args) = @_; my $opts = { d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Debcrd; require EB::Report::GenBase; return unless parse_args(\@args, [ "boekjaar=s", EB::Report::GenBase->backend_options(EB::Report::Debcrd::, $opts), 'periode=s' => sub { periode_arg($opts, @_) }, 'openstaand', ], $opts); EB::Report::Debcrd->new->debiteuren(\@args, $opts); } sub help_debiteuren { _T( < ] [ ... ] Opties: --periode Periode --boekjaar= Selecteer boekjaar --openstaand Alleen met openstaande posten Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_crediteuren { my ($self, @args) = @_; my $opts = { d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Debcrd; require EB::Report::GenBase; return unless parse_args(\@args, [ "boekjaar=s", EB::Report::GenBase->backend_options(EB::Report::Debcrd::, $opts), 'periode=s' => sub { periode_arg($opts, @_) }, 'openstaand', ], $opts); EB::Report::Debcrd->new->crediteuren(\@args, $opts); } sub help_crediteuren { _T( < ] [ ... ] Opties: --periode= Periode --boekjaar= Selecteer boekjaar --openstaand Alleen met openstaande posten Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub do_openstaand { my ($self, @args) = @_; my $opts = { d_boekjaar => $bky || $dbh->adm("bky"), }; require EB::Report::Open; require EB::Report::GenBase; return unless parse_args(\@args, [ "boekjaar=s", EB::Report::GenBase->backend_options(EB::Report::Open::, $opts), 'per=s' => sub { date_arg($opts, @_) }, 'deb|debiteuren', 'crd|crediteuren', ], $opts); return unless argcnt(@args, 0, 1); EB::Report::Open->new->perform($opts, \@args); } sub help_openstaand { _T( < ] [ ] Opties: --per= Einddatum --boekjaar= Selecteer boekjaar --deb --debiteuren Alleen debiteuren --crd --crediteuren Alleen crediteuren Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. EOS } sub help_rapporten { _T( < De einddatum voor de rapportage. (Niet voor elke opdracht relevant.) Zie "help periodes" voor details. --periode= De periode waarover de rapportage moet plaatsvinden. (Niet voor elke opdracht relevant.) Zie "help periodes" voor details. --output= Produceer het rapport in dit bestand Uitvoertype is afhankelijk van bestandsextensie, bv. xx.html levert HTML, xx.txt een tekstbestand, xx.csv een CSV, etc. --gen- Forceer uitvoertype (html, csv, text, ...) Afhankelijk van de beschikbare uitvoertypes zijn ook de kortere opties --html, --csv en --text mogelijk. (Let op: --gen-XXX, niet --gen=XXX) --page= Paginagrootte voor tekstrapporten. EOS } sub help_periodes { _T( <= 2; my $cmd = shift(@args); require EB::Tools::Schema; if ( $cmd eq 'gbk' ) { goto &help_schema unless @args % 4 == 0 || @args % 4 == 1; # weird, but okay my $fail; for ( my $i = 0; $i < @args; $i += 4 ) { unless ( $args[$i] =~ /^[[:digit:]]+$/i ) { warn("?".__x("Ongeldig of ontbrekend rekeningnummer: {x}", x => $args[$i])."\n"); $fail++; } next if $i+1 >= @args; unless ( $args[$i+1] =~ /^[dc]!?|[kon]$/i ) { warn("?".__x("Ongeldige of ontbrekende type specificatie: {x}", x => $args[$i+1])."\n"); $fail++; } unless ( $args[$i+3] =~ /^[[:digit:]]+$/i ) { warn("?".__x("Ongeldige of ontbrekende verdichting: {x}", x => $args[$i])."\n"); $fail++; } } goto &help_schema if $fail; EB::Tools::Schema->new->add_gbk( @args, $opts ); } else { goto &help_schema; } } sub help_schema { _T( < [ ] Aanmaken grootboekrekening schema gbk [ ] de gewenste grootboekrekening D/C voor Debet / Credit K/O/N voor Kosten / Omzet / Neutraal Eventueel gevolgd door ! als deze balansrekening vast staat aan één kant De omschrijving van deze grootboekrekening De verdichting waaronder deze rekening valt Wanneer enkel een nummer wordt opgegeven dan worden de gegevens van de betreffende grootboekrekening getoond. EOS } ################ Relations ################ sub do_relatie { my ($self, @args) = @_; my $opts = { }; return unless parse_args(\@args, [ __xt("cmo:relatie:dagboek").'=s' => \$opts->{dagboek}, $dbh->does_btw ? ( __xt("cmo:relatie:btw").'=s' => \$opts->{btw} ) : (), ], $opts) or goto &help_relatie; warn("?"._T("Ongeldig aantal argumenten voor deze opdracht")."\n"), return if @args % 3; require EB::Relation; while ( @args ) { my @a = splice(@args, 0, 3); my $res = EB::Relation->new->add(@a, $opts); warn("$res\n") if $res; } } sub help_relatie { my $ret = _T( < ] { } ... Opties: --dagboek= Selecteer dagboek voor deze relatie EOS $ret .= _T( <does_btw; --btw= BTW type: normaal, verlegd, intra, extra *** BTW type 'verlegd' wordt nog niet ondersteund *** *** BTW type 'intra' wordt nog niet geheel ondersteund *** EOS $ret; } ################ Im/export ################ sub do_export { my ($self, @args) = @_; my $opts = { single => 0, explicit => 0, totals => 1, }; return unless parse_args(\@args, [ 'dir=s', 'file|output=s', 'boekjaar=s', 'titel=s', 'xaf=s', 'single', 'explicit', 'totals!', ], $opts) or goto &help_export; my $t = 0; $t++ if defined($opts->{dir}); $t++ if defined($opts->{file}); $t++ if defined($opts->{xaf}); if ( $t > 1 ) { warn("?"._T("Opties --dir, --file en --xaf sluiten elkaar uit")."\n"); return; } if ( $t != 1 ) { warn("?"._T("Specificeer --dir, --file of --xaf")."\n"); return; } return unless argcnt(@args, 0); check_open(1); if ( $opts->{xaf} ) { require EB::Export::XAF; # XAF bevat altijd maar één boekjaar. $opts->{boekjaar} ||= $bky; EB::Export::XAF->export($opts); } else { if ( $opts->{boekjaar} ) { warn("?"._T("Optie --boekjaar wordt niet ondersteund door deze export")."\n"); return; } $opts->{desc} = delete $opts->{titel}; require EB::Export; EB::Export->export($opts); } return; } sub help_export { _T( < ] Opties: --file= Selecteer uitvoerbestand --dir= Selecteer uitvoerdirectory --xaf= Export XML Auditfile Financieel --boekjaar= Selecteer boekjaar (alleen met --xaf) Er moet een --file, --dir of een --xaf optie worden opgegeven. De XAF export exporteert altijd één enkel boekjaar. Voor de andere exports wordt altijd de gehele administratie geëxporteerd. Eventueel bestaande files worden overschreven. EOS } sub do_import { my ($self, @args) = @_; return $self->clionly("import") if $app; my $opts = { clean => 1, }; return unless parse_args(\@args, [ 'dir=s', 'file=s', 'clean!', ], $opts); if ( defined($opts->{dir}) && defined($opts->{file}) ) { warn("?"._T("Opties --dir en --file sluiten elkaar uit")."\n"); return; } if ( !defined($opts->{dir}) && !defined($opts->{file}) ) { warn("?"._T("Specificeer --dir of --file")."\n"); return; } return unless argcnt(scalar(@args), 0); if ( $opts->{clean} && !$dbh->feature("import") ) { warn("?".__x("Database type {drv} ondersteunt niet het import commando. Gebruik de --import command line optie.", drv => $dbh->driverdb)."\n"); return; } require EB::Import; EB::Import->do_import($self, $opts); return; } sub help_import { _T( < ] Opties: --file= Selecteer exportbestand --dir= Selecteer exportdirectory Er moet of een --file of een --dir optie worden opgegeven. LET OP: IMPORT VERVANGT DE COMPLETE ADMINISTRATIE! Deze opdracht wordt niet door alle database systemen ondersteund. Deze opdracht is alleen in de command line versie beschikbaar. EOS } sub do_include { my ($self, @args) = @_; my $opts = { optional => 0, }; return unless parse_args(\@args, [ 'optional|optioneel', ], $opts); return unless argcnt(scalar(@args), 1); my $file = shift(@args); # Note: no :encoding, this is handled by the input loop. if ( open(my $fd, '<', $file) ) { $self->attach_file($fd); } elsif ( !$opts->{optional} ) { die("$file: $!\n"); } "" } sub help_include { _T( < ] Opties: --optioneel Het bestand mag ontbreken. De opdracht wordt dan verder genegeerd. EOS } ################ Miscellaneous ################ sub do_boekjaar { my ($self, @args) = @_; return unless argcnt(@args, 1); my $b = $dbh->lookup($args[0], qw(Boekjaren bky_code bky_name)); warn("?".__x("Onbekend boekjaar: {code}", code => $args[0])."\n"), return unless defined $b; $bky = $args[0]; bky_msg(); __x("Boekjaar voor deze sessie: {bky} ({desc})", bky => $bky, desc => $b); } sub help_boekjaar { _T( < EOS } sub do_dump_schema { my ($self, @args) = @_; _T( < $bky || $dbh->adm("bky"), }; return unless parse_args(\@args, [ 'boekjaar=s', ], $opts); $opts->{boekjaar} = $opts->{d_boekjaar} unless defined $opts->{boekjaar}; require EB::Booking::Delete; require EB::Booking::Decode; @args = ($bsk) if $bsk && !@args; return _T("Gaarne een boekstuk") unless @args == 1; my $cmd; my $id = shift(@args); if ( $self->{interactive} ) { (my $xid, my $id, my $err) = $dbh->bskid($id, $opts->{boekjaar}); unless ( defined($id) ) { warn("?".$err."\n"); return; } $cmd = EB::Booking::Decode->decode($id, { boekjaar => $opts->{boekjaar}, trail => 1, bsknr => 1, single => 1 }); } my $res = EB::Booking::Delete->new->perform($id, $opts); if ( $res && $self->{interactive} && $res !~ /^[?!]/ ) { # no error $self->term->addhistory($cmd); } $res; } sub help_verwijder { _T( < ] Opties: --boekjaar= Selekteer boekjaar Het verwijderde boekstuk wordt in de commando-historie geplaatst. Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele wijziging opnieuw ingevoerd. EOS } sub do_toon { my ($self, @args) = @_; my $b = $bsk; my $opts = { verbose => 0, bsknr => 1, d_boekjaar => $bky || $dbh->adm("bky"), }; return unless parse_args(\@args, [ 'btw!', 'bsknr!', 'bky!', 'totaal!', 'boekjaar=s', 'verbose!', 'trace!', ], $opts); $opts->{trail} = !$opts->{verbose}; $opts->{boekjaar} = $opts->{d_boekjaar} unless defined $opts->{boekjaar}; require EB::Booking::Decode; @args = ($bsk) if $bsk && !@args; return _T("Gaarne een boekstuk") unless @args == 1; my ($id, $dbs, $err) = $dbh->bskid(shift(@args), $opts->{boekjaar}); unless ( defined($id) ) { warn("?".$err."\n"); return; } my $res = EB::Booking::Decode->decode($id, $opts); if ( $self->{interactive} && $res !~ /^[?!]/ && $opts->{trail} ) { # no error my $t = $res; $t =~ s/\s+\\\s+/ /g; $self->term->addhistory($t); } $res; } sub help_toon { _T( < ] Opties: --boekjaar= Selekteer boekjaar --verbose Toon in uitgebreide (tekst) vorm --btw Vermeld altijd BTW codes --bsknr Vermeld altijd het boekstuknummer (default) Het getoonde boekstuk wordt in de commando-historie geplaatst. Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele wijziging opnieuw ingevoerd. EOS } sub do_jaareinde { my ($self, @args) = @_; my $opts = { d_boekjaar => $bky, }; return unless parse_args(\@args, [ 'boekjaar=s', 'definitief', 'verwijder', 'eb=s', ], $opts); return _T("Opties \"definitief\" en \"verwijder\" sluiten elkaar uit") if $opts->{definitief} && $opts->{verwijder}; return unless argcnt(@args, 0); require EB::Tools::Einde; EB::Tools::Einde->new->perform(\@args, $opts); } sub help_jaareinde { _T( < ] Opties: --boekjaar= Sluit het opgegeven boekjaar af. --definitief Sluit het boekjaar definitief af. Er zijn dan geen boekingen meer mogelijk. --verwijder Verwijder een niet-definitieve jaarafsluiting. --eb= Schrijf openingsopdrachten in dit bestand. EOS } sub do_sql { my ($self, @args) = @_; return $self->clionly("sql") if $app; $dbh->isql(@args); undef; } sub help_sql { _T( < ] Deze opdracht is alleen in de command line versie beschikbaar. EOS } ################ Argument parsing ################ use Getopt::Long; sub parse_args { my ($args, $ctl, $opts) = @_; local(*ARGV) = $args; Getopt::Long::Configure("prefix_pattern=--"); my $ret = GetOptions($opts, @$ctl); $ret; } =begin maybelater sub parse_args2 { my ( $argv, $c, $opts ) = @_; my @resarg; my $ok = -1; my $pfx = "cmo:" . $opts->{_cmd} . ":"; my @ctl = @$c; my %ctl; while ( my $ctl = shift(@ctl) ) { my $dest; my $needvalue = 0; my $negate = 0; if ( $ctl =~ /^(.*)=[is]$/ ) { $ctl = $1; $needvalue = 1; } elsif ( $ctl =~ /^(.*)!$/ ) { $ctl = $1; $negate = 1; } foreach ( split( /\|/, $ctl ) ) { $dest ||= @ctl && ref($ctl[0]) ? shift(@ctl) : \($opts->{$_}); die("?".__x("Ongeldige optiespecificatie \"{opt}\"", opt => $ctl), "\n"), return -1 unless /^[-\w]+$/; $ctl{__xt($pfx.$_)} = [ $dest, $needvalue ]; $ctl{__xt($pfx."no".$_)} = [ $dest, -1 ] if $negate; } } # print STDERR Dumper(\%ctl), "\n"; my $i = 0; while ( $i < @$argv ) { my $opt = $argv->[$i++]; unless ( $opt =~ /^--(.+)/ ) { push( @resarg, $opt ); next; } $opt = $1; my $has_value; if ( $opt =~ /^(.*?)=(.*)/ ) { $opt = $1; $has_value = $2; } my $ctl; unless ( $ctl = $ctl{$opt} ) { die("?".__x("Onbekende optie: \"{opt}\"", opt => $opt)."\n"); $ok = 0; next; } my $value = 1; if ( $ctl->[1] < 0 ) { # negate $value = 0; } elsif ( $ctl->[1] > 0 ) { # need value if ( defined $has_value ) { $value = $has_value; } elsif ( $i < @$argv && $argv->[$i] !~ /^--/ ) { $value = $argv->[$i++]; } else { die("?".__x("Optie \"{opt}\" moet een waarde krijgen.", opt => $opt), "\n"); $ok = 0; next; } } elsif ( defined $has_value ) { die("?".__x("Optie \"{opt}\" neemt geen waarde.", opt => $opt), "\n"); $ok = 0; next; } my $dest = $ctl->[0]; if ( ref($dest) eq 'SCALAR' ) { $$dest = $value; } elsif ( ref($dest) eq 'CODE' ) { $dest->( $opt, $value ); } else { die("?".__x("Optie \"{opt}\" oeps {ref}.", opt => $opt, ref => $dest), "\n"); $ok = 0; } } # Copy remaining arguments. @$argv = @resarg; # Weed out undefined entries in $opts. while ( my($k,$v) = each(%$opts) ) { delete $opts->{$k} unless defined $v; } return $ok; } =cut sub periode_arg { my ($opts, $name, $value) = @_; if ( my $p = parse_date_range($value, substr($dbh->adm("begin"),0,4)) ) { $opts->{$name} = $p; } else { die("?".__x("Ongeldige periode-aanduiding: {per}", per => $value)."\n"); } } sub date_arg { my ($opts, $name, $value) = @_; if ( my $p = parse_date($value, substr($dbh->adm("begin"),0,4)) ) { $opts->{$name} = $p; } else { die("?".__x("Ongeldige datum: {per}", per => $value)."\n"); } } sub check_open { my ($self, $open) = @_; $open = 1 unless defined($open); if ( $open && !$dbh->adm_open ) { die("?"._T("De administratie is nog niet geopend")."\n"); } elsif ( !$open && $dbh->adm_open ) { die("?"._T("De administratie is reeds geopend")."\n"); } 1; } sub check_busy { my ($self, $busy) = @_; $busy = 1 unless defined($busy); if ( $busy && !$dbh->adm_busy ) { die("?"._T("De administratie is nog niet in gebruik")."\n"); } elsif ( !$busy && $dbh->adm_busy ) { die("?"._T("De administratie is reeds in gebruik")."\n"); } 1; } 1; EekBoek-2.02.04/lib/EB/examples/0000755000076500007650000000000012165465617013705 5ustar jvjvEekBoek-2.02.04/lib/EB/examples/en/0000755000076500007650000000000012165465617014307 5ustar jvjvEekBoek-2.02.04/lib/EB/examples/en/opening.eb0000444000076500007650000000124512165465617016256 0ustar jvjv# Opening data for administration EekBoek Sample Administration # Created by EekBoek 2.01.03 on 2012-01-16 # Content-Type: text/plain; charset = UTF-8 adm_name "EekBoek Sample Administration" adm_startdate 2011 adm_finyear "2011" adm_vatperiod quarter # Opening balance # Debet adm_balance 1100 1344.37 # Supplies adm_balance 1110 13378.48 # Computers adm_balance 2320 1131.92 # Bank # Credit adm_balance 1101 1304.81 # Depreciation supplies adm_balance 1111 12106.78 # Depreciation computers adm_balance 3100 2443.18 # Capital # Total adm_balancetotal 15854.77 # Entering administration adm_open # End of Opening data EekBoek-2.02.04/lib/EB/examples/en/schema.dat0000444000076500007650000002405612165465617016246 0ustar jvjv# EekBoek Accounting scheme for EekBoek Sample Administration # Created by EekBoek 2.01.03 on 16-01-2012 16:37:53 # Content-Type: text/plain; charset = UTF-8 # This file defines all the static data from an administration or # group of administrations: the chart of accounts (balance sheet # accounts and income statements), the daybooks and VAT rates. # # General syntax rules: # # * Empty lines and lines starting with a hash # are not interpreted. # * A non-indented text introduces a new element. # * All indented lines are data for that section. # ACCOUNTING SCHEMA # # The accounting scheme is a hierarchical chart of accounts and follows # the Bakker methodology. The main aggregations run from 1 to 9, the # underlying aggregations to 99. The ledger accounts are divided into # balance sheet accounts and income accounts. # # The description of the general ledger accounts is preceded by a flag, # which is a letter that indicates either Debit / Credit (for # balance accounts) or Cost / Revenue / Neutral (for income statements). # The description is followed - if applicable - by additional # information. For general ledger accounts the VAT tariffs can be # specified that is applicable for the account: # # :vat=zero # :vat=high # :vat=low # :vat=private # :vat=other # # It is also possible to specify that an account has a specific meaning # or a mapping through the use of :mapping=xxx. The following mappings # are allowed: # # crd the standard contra account (Accounts payable) for purchases # deb the standard contra account (Accounts receivable) for sales # vat_ph the account for VAT Bookings for purchases, high tariff # vat_pl same, low tarif # vat_pp same, private tariff # vat_pa same, other tariff # vat_sh the account for VAT Bookings for sales, high tariff # vat_sl same, low tariff # vat_sp same, private tariff # vat_sa same, other tariff # vat_ok account for the VAT which has been paid # profit account to which the profit is booked # # The mapping to "profit" is mandatory and must be present in an # administration for the year end close. # The mappings for VAT must be specified in case VAT is applicable # for the administration. # The mappings for Accounts payable and Accounts receivable must # be specified in case purchase and sales daybooks are used, which # use the standard values (in other words, do not have a contra # account). # Normally the master groups run from 1 to 9 and the groupings from 10 # to 99. In case an accounting scheme must be used that does not conform # to this setup, the command Grouping can be used to specify the maximum # allowable master group number and maximum allowable grouping number. Grouping 9 99 # The numbers of the general ledger accounts are normally larger than # the maximum number of the grouping account. In case an accounting # scheme must be used that does not conform to this setup, then zeroes # can be prepended to increase the length of the number, thereby # making it longer than the length of the maximum number of the master # group account. # If for instance 99 is the maximum grouping, then 001 would be the # general ledger account with number 1. Balance Accounts 1 Non-current Assets 11 Material non-current assets 1100 D Supplies :vat=high,expenses 1101 C Depreciation supplies 1110 D Computers :vat=high,expenses 1111 C Depreciation computers 1120 D Fleet :vat=high,expenses 1121 C Depreciation fleet 2 Current Assets 21 Inventory 2100 C Inventory 22 Receivables 2200 D Debtors :mapping=deb 23 Liquid assets 2300 D Cash 2320 D Bank 3 Assets 31 Capital 3100 C Capital :mapping=profit 3110 C Private deposits 3120 D Private deductions 4 Liabilities 41 Suppliers credits 4100 C Creditors :mapping=crd 4150 C Payables 42 Taxes and expenses 4200 C VAT Revenue high :mapping=vat_sh 4210 C VAT Revenue low :mapping=vat_sl 4212 C VAT Revenue private :mapping=vat_sp 4220 D VAT Procurement high :mapping=vat_ph 4230 D VAT Procurement low :mapping=vat_pl 4232 D VAT Procurement private :mapping=vat_pp 4240 C VAT Vehicle cost reimbursement 4290 C Sales tax paid :mapping=vat_ok Result Accounts 6 Costs 61 Sales Costs 6100 K Travel costs :vat=high 6110 K Sponsoring 62 Office Costs 6200 K Insurance 63 Operating expenses 6310 K Chamber of commerce 6320 K Union costs 6330 K Branche organisation costs 66 Vehicle costs 6600 K Lease costs vehicle :vat=high 6610 K Fuel vehicle :vat=high 6620 K Maintenance vehicle :vat=high 6630 K Insurance vehicle 6640 K Travel reimbursement 6650 K Rental vehicle :vat=high 6660 K Road tax 6670 K Fines 6671 K Fines 0% deductible 6680 K VAT private use vehicle 6690 K Other vehicle costs :vat=high 67 Contributions & subscriptions 6700 K Contributions & subscriptions :vat=high 6710 K Contributions & subscriptions VAT 0% 68 Depreciation 6800 K Depreciation costs inventory 6810 K Depreciation costs computers 6820 K Depreciation costs fleet 69 General costs 6900 K Phone costs and fax costs :vat=high 6905 K Internet costs :vat=high 6920 K Stationery :vat=high 6921 K Computer accessories :vat=high 6930 K Literature :vat=low 6940 K Administration costs :vat=high 6950 K Printing and paper :vat=high 6970 K Stamps 6971 K Shipping costs 6980 K Bank costs 6981 K Cash differences 6982 K Rounding errors 6990 K Other general costs :vat=high 8 Revenues 81 Revenue Consultancy 8100 O Revenue consultancy :vat=high 8110 O Revenue consultancy VAT exempt 82 Revenue royalties 8200 O Revenue royalties VAT exempt 83 Revenue Editing 8300 O Revenue editing :vat=high 84 Revenue Courses 8400 O Revenue courses :vat=high 8410 O Revenue licenses courses :vat=high 85 Revenue Projects 8500 O Revenue projects :vat=high 89 Revenue Other 8900 O Revenue other VAT high :vat=high 8910 O Revenue other VAT low :vat=low 8920 O Revenue other VAT exempt 9 Financial income and expenses 91 Interest income 9120 O Interest received Postbank 9130 O Interest received Postbank Inbedrijf 9190 O Interest received overige 92 Interest expenses and other expenses 9220 K Interest paid Postbank 9230 K Interest paid Postbank Inbedrijf 9290 K Interest paid other 93 Other income 9380 O Taxation on private use vehicle :vat=private,excl 9390 O Small office home office tax exemption # DAYBOOKS # # EekBoek supports five types of daybooks: Cash, Bank, Purchases, # Sales and Memorial. The number of daybooks that can be created # is unlimited. # The first column shows the short name (code) for the daybook # specified. Furthermore, for each daybook the type must be specified. # Daybooks of type Cash or Bank must also be specified with a contra # account, for the other daybooks a contra account is optional. # # The option :dc can be used to indicate that the journals # for this daybook have the totals of the debits and credits # displayed separately. Daybooks P Purchase :type=purchases C Cash :type=cash :account=2300 M Memorial :type=memorial B Postbank :type=bank :account=2320 S Sales :type=sales # VAT TARIFFS # # There are five tariff classes: "high ", "low", "zero", "private" # and "other". The tariff group determines the account to which the # corresponding booking should take place. # Within each class there can be several possible charges, although this # in practice not likely to occur. # The first column is the (numeric) code for this rate. # It can be used to explicitly specify a VAT rate for a booking. # For each tariff used (except class "zero") the percentage must be # specified. # The description :exclusive can be used for bookings on accounts that # by default have no VAT. # # IMPORTANT: Mutations that are executed using the shell command line or # API are using the associated VAT tariff of the general ledger # accounts. Changes made to this file will therefore impact already # existing bookings. VAT Tariffs 0 VAT 0% :class=zero 1 VAT 19% incl. :class=high :perc=19.00 2 VAT 19% excl. :class=high :perc=19.00 :exclusive 3 VAT 6.0% incl. :class=low :perc=6.00 4 VAT 6.0% excl. :class=low :perc=6.00 :exclusive 5 VAT Private 12% ex. :class=private :perc=12.00 :exclusive # End of EekBoek schema EekBoek-2.02.04/lib/EB/examples/en/relaties.eb0000444000076500007650000000113612165465617016426 0ustar jvjv# Relations for administration EekBoek Sample Administration # Created by EekBoek 2.01.03 on 2012-01-16 # Content-Type: text/plain; charset = UTF-8 relation --daybook=purchase \ "KPN" "KPN" 6900 \ "XS4ALL" "XS4All Internet B.V." 6905 relation --daybook=sales \ "ACME" "Acme Corp." 8100 \ "FOO" "Foo" 8100 relation --daybook=sales --vat=extra \ "ORA" "O'Reilly & Associates" 8200 # End of Relations EekBoek-2.02.04/lib/EB/examples/en/mutaties.eb0000444000076500007650000002041012165465617016445 0ustar jvjv# Bookings for administration EekBoek Sample Administration # Created by EekBoek 2.01.03 on 2012-01-16 # Content-Type: text/plain; charset = UTF-8 # Date notation is dd-mm-yyyy # When no year is specified, the current year is assumed. # Purchases (Daybook: Inkoop) # General syntax for the purchase commands: # # daybook [ date ] arguments # # Arguments purchase: "Description" creditorcode bookingline # Booking line: "Description" amount [ ledger account ] # # By default the ledger account associated with this creditor is used # (see relaties.eb). # # By default the VAT tariff associated with the ledger account is used. # This can be changed by adding one of the following to the amount: # @0 do not apply VAT # @H apply the upper VAT tariff # @L apply the lower VAT tariff # @n apply VAT code n (this is not recommended) # # A credit booking can be specified when the amount is negative. # Singular booking all on one line. purchase 05-01 "Internet" XS4ALL "ADSL" 22,80 # Multiple bookings; the ledger account is mandatory in this case. # The total is optional, but strongly recommended to prevent mistakes. purchase 15-01 "ADSL + Telephone" KPN --total=104,65 \ "ADSL" 24,20 6905 \ "Telephone" 80,45 6900 purchase 09-02 "Internet" XS4ALL "ADSL" 22,80 purchase 08-03 "Internet" XS4ALL "ADSL" 22,80 purchase 18-03 "Telephone" KPN "ADSL + Telephone" 101,52 purchase 05-04 "Internet" XS4ALL "ADSL" 22,80 purchase 10-05 "Internet" XS4ALL "ADSL" 22,80 purchase 20-05 "Telephone" KPN "ADSL + Telephone" 102,22 purchase 07-06 "Internet" XS4ALL "ADSL" 22,80 purchase 05-07 "Internet" XS4ALL "ADSL" 22,80 purchase 15-07 "Telephone" KPN "ADSL + Telephone" 104,66 purchase 09-08 "Internet" XS4ALL "ADSL" 22,80 purchase 06-09 "Internet" XS4ALL "ADSL" 22,80 purchase 16-09 "Telephone" KPN "ADSL + Telephone" 108,72 purchase 11-10 "Internet" XS4ALL "ADSL" 22,80 purchase 07-11 "Internet" XS4ALL "ADSL" 2*11+0,80 purchase 17-11 "Telephone" KPN "ADSL + Telephone" 109,67 purchase 06-12 "Internet" XS4ALL "ÁDSL" 22,80 # Explicit booking number: purchase:20 07-12 "Internet" XS4ALL "ADSL" 22,80 # Adding VAT tariffs: purchase:22 31-08 KPN --total=131,68 \ "Telephone VAT high" 110,73-0,48@H- 6900 \ "Telephone VAT exempt" 0,48@0 6900 # Removal of booking: purchase:23 07-12 "Internet" XS4ALL "ADSL" 22,80 remove purchase:23 # Sales (Daybook: Verkoop) # # Arguments verkoop: "Description" debitorcode bookingline # Boekstukregel: "Description" amount [ generalledgeraccount ] # # By default the ledger account associated with this debtor is used # (see relaties.eb). # # See the description at Purchases for the sample bookings when # specifying the applicable VAT tariff. # # Multiple booking lines are possible too: the general ledger account # is mandatory in that case. See with Purchases for an example. # # A debit-booking can be specified when the amount is negative. sales 18-02 "Perl Course" ACME "Perl Course first installment" 3570.00 8400 sales 18-03 "Perl Course" ACME "Perl Course second installment" 3570.00 8400 sales 18-04 "Perl Course" ACME "Perl Course remainder" 600.00 8400 sales 12-04 "Perl Course" ACME "Perl Course remainder" -5.00 8400 sales 14-05 "Support" ACME "Consultancy" 714.00 8100 sales 16-07 "Support" ACME "Consultancy" 714.00 8100 sales 19-08 "Pocket Reference" ORA "Preparation book" 1000.00 8300 # Bank (Dagboek: Postbank) # # Arguments bankbooking: "Description" bookingline # Bookingline: # std "Description" amount generalledgeraccount # crd "Description" creditorcode amount (negative!) # deb "Description" debtorcode amount # # By default the first applicable open booking, which is either purchase # or sales, associated with the creditor or debtor is used to deduct # the specified amount. # Standaard wordt het eerste met deze crediteur/debiteur geassocieerde # open inkoop/verkoop-boekstuk afgeboekt. # # For these bookings a negative amount deducts from the banking balance # and a positive amounts adds to the banking balance. # # 'std' bookings with VAT are uncommon. # Therefore, in applicable cases, the VAT tariff must be explicitly # specified with the "@" addition: # @0 do not apply VAT # @H apply the upper VAT tariff # @L apply the lower VAT tariff # @n apply VAT code n (this is not recommended) # # VAT is booked on the VAT sales account for positive amounts, # and on the VAT purchase account for negative amounts. # ####CHECK#### This can be changed by adding a code "I" (Purchase) or "V" (Sales). # # By supplying the ending balance this can be verified. postbank 31-01 "Notice 1" --init-balance=1131.92 --balance=1001.77 \ std 06-01 "Girotel" -2.70 6980 \ crd 19-01 XS4ALL -22.80 \ crd 31-01 KPN -104.65 postbank 28-02 "Notice 2" --balance=976.27 \ std 10-02 "Girotel" -2.70 6980 \ crd 23-02 XS4ALL -22.80 postbank 31-03 "Notice 3" --balance=4419.25 \ std 09-03 "Girotel" -2.70 6980 \ deb 18-03 ACME 3570.00 \ crd XS4ALL -22.80 \ crd 31-03 KPN -101.52 postbank 30-04 "Notice 4" --balance=7963.75 \ std 06-04 "Girotel" -2.70 6980 \ crd 06-04 XS4ALL -22.80 \ deb 12-04 ACME 3570.00 postbank 31-05 "Notice 5" --balance=8436.03 \ std 11-05 "Girotel" -2.70 6980 \ crd 31-05 XS4ALL -22.80 \ deb 31-05 ACME 600.00 \ crd 31-05 KPN -102.22 postbank 30-06 "Notice 6" --balance=9119.53 \ std 08-06 "Girotel" -2.70 6980 \ deb 08-06 ACME 714.00 \ deb 12-06 ACME -5.00 \ crd 21-06 XS4ALL -22.80 postbank 31-07 "Notice 7" --balance=8989.37 \ std 06-07 "Girotel" -2.70 6980 \ crd 30-07 XS4ALL -22.80 \ crd 31-07 KPN -104.66 postbank 31-08 "Notice 8" --balance=10677.87 \ std 10-08 "Girotel" -2.70 6980 \ deb 10-08 ACME 714.00 \ crd 10-08 XS4ALL -22.80 \ deb 19-08 ORA 1000.00 postbank 30-09 "Notice 9" --balance=10543.65 \ std 17-09 "Girotel" -2.70 6980 \ crd 30-09 XS4ALL -22.80 \ crd 30-09 KPN -108.72 postbank 31-10 "Notice 10" --balance=10518.15 \ std 12-10 "Girotel" -2.70 6980 \ crd 13-10 XS4ALL -22.80 postbank 30-11 "Notice 11" --balance=10382.98 \ std 08-11 "Girotel" -2.70 6980 \ crd XS4ALL -22.80 \ crd 30-11 KPN -109.67 # With explicit booking number. postbank:12 07-12 "Notice 12" --balance=10357.48 \ std 06-12 "Girotel" -2.70 6980 \ crd 07-12 XS4ALL -22.80 # Partial payments by supplying the booking number instead of the # debtor/creditor: postbank 09-12 "First installment ADSL" --balance=10,347.48 \ crd 09-12 Purchase:20 -10.00 # The remainder of the payment can be done by supplying the booking # number, but also the easy way by supplying the relation code. postbank 10-12 "Second installment ADSL" --balance=10334,68 \ crd 10-12 XS4ALL -12.80 # Depreciation # # Memorial is like a bank booking, but without an implicit general # ledger account from which the total is booked. The booking must # therefore be exactly balanced. # Also here, a positive amount credits the associated account (adds to) # and a negative amount debits the account (deducts). # Also equally applicable are the 'std' bookings with VAT, equivalent # to the section on Bank bookings. memorial 31-12 "Depreciation inventory" \ std "Depreciation" -411,26 6800 \ std "Depreciation" 411,26 1101 memorial 31-12 "Depreciation computers" \ std "Depreciation" -396,82 6810 \ std "Depreciation" 396,82 1111 # End of Bookings EekBoek-2.02.04/lib/EB/examples/Userdefs.pm0000444000076500007650000000344512165465617016027 0ustar jvjv#! perl # Userdefs.pm -- User definable stuff # Author : Johan Vromans # Created On : Thu Feb 7 14:28:50 2008 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:49:01 2010 # Update Count : 5 # Status : Unknown, Use with caution! package EB::Shell::Userdefs; use strict; use warnings; use EB; # Dit is een voorbeeld van een command-wrapper. # Wanneer de opdracht "kasverkoop" wordt ingegeven, wordt de method # pp_kasverkoop aangeroepen met de commandonaam en alle meegegeven # argumenten. Deze method is dan verantwoordelijk voor het afleveren # van een (mogelijke andere) opdrachtnaam en argumenten. sub EB::Shell::pp_kasverkoop { my ($self, $cmd, @args) = @_; # Controleer argumenten. "--nr=.." is een intern doorgegeven # argument wanneer de vorm "kasverkoop:boekstuknummer" wordt # gebruikt. die("Foute opdracht: tenminste twee argumenten nodig: datum en bedrag\n") if ( @args < 2 || (@args < 3 && $args[0] =~ /^--?nr=(.+)/)); # Nieuwe opdracht. $cmd = "kas"; # Opbouwen nieuwe lijst argumenten. my @a; if ( $args[0] =~ /^--?nr=(.+)/ ) { push(@a, shift(@args)); # boekstuknummer } if ( $args[0] =~/^\d+-\d+(-\d+)?$/ ) { push(@a, shift(@args)); # datum } my $amt = shift(@args); my $desc = @args ? "@args" : "Diversen"; push(@a, "Verkoop", "std", $desc, $amt.'@1', "8600"); # Toon... warn("+ $cmd @a\n"); # En afleveren. ($cmd, @a); } # En uiteraard, de hulpboodschap. sub EB::Shell::help_kasverkoop { return < [ ... ] Bijvoorbeeld: kasverkoop 28-01 25,00 Dit wordt omgezet in de opdracht: kas 28-01 Verkopen std Diversen 20,00\@1 8600 EOD } # Package ends here. 1; EekBoek-2.02.04/lib/EB/examples/nl_BE/0000755000076500007650000000000012165465617014664 5ustar jvjvEekBoek-2.02.04/lib/EB/examples/nl_BE/schema.dat0000444000076500007650000010144712165465617016623 0ustar jvjv# $Id$ -*- coding: utf-8 -*- # EekBoek Rekeningschema voor Belgische boekhoudingen # Content-Type: text/plain; charset = UTF-8 # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ok rekening voor de betaalde BTW # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Balansrekeningen 1 Eigen vermogen, voorzieningen voor risico's en kosten en schulden op meer dan één jaar 10 Kapitaal 100 C Geplaatst kapitaal 101 C Niet opgevraagd kapitaal (-) 11 Uitgiftepremies 12 Herwaarderingsmeerwaarden 120 C Herwaarderingsmeerwaarden op immateriële vaste activa 121 C Herwaarderingsmeerwaarden op materiële vaste activa 122 C Herwaarderingsmeerwaarden op financiële vaste activa 123 C Herwaarderingsmeerwaarden op voorraden 124 C Terugneming van waardeverminderingen op geldbeleggingen 13 Reservees 130 C Wettelijke reserve 131 C Onbeschikbare reserve 1310 C Reserver voor eigen aandelen 1311 C Andere onbeschikbare reserve 132 C Belastingvrije reserves 133 C Beschikbare reserves 14 Overgedragen winst/verlies 141 C Overgedragen winst :koppeling=winst 15 Kapitaalsubsidies 16 Voorzieningen en uitgestelde belastingen 160 C Voorzieningen voor pensioenen en soortgelijke verplichtingen 161 C Voorzieningen voor belastingen 162 C Voorzieningen voor grote herstellingswerken en grote onderhoudswerken 163 C Voorzieningen voor overige risico's en kosten 164 C Voorzieningen voor overige risico's en kosten 165 C Voorzieningen voor overige risico's en kosten 168 C Uitgestelde belastingen 1680 C Uitgestelde belastingen op kapitaalsubsidies 1681 C Uitgestelde belastingen op gerealiseerde meerwaarden op immateriële vaste activa 1682 C Uitgestelde belastingen op gerealiseerde meerwaarden op materiële vaste activa 1688 C Buitenlandse uitgestelde belastingen 17 Schulden op meer dan één jaar 170 C Achtergestelde leningen 1700 C Converteerbaar 1701 C Niet converteerbaar 171 C Niet-achtergestelde obligatieleningen 1710 C Converteerbaar 1711 C Niet converteerbaar 172 C Leasingschulden en soortgelijke 173 C Kredietinstellingen 1730 C Schulden op rekeningen 1731 C Promessen 1732 C Acceptkredieten 174 C Overige leningen 175 C Handelsschulden 1750 C Leveranciers 1751 C Te betalen wissels 176 C Ontvangen vooruitbetalingen op bestellingen 178 C Borgtochten ontvangen in contanten 179 C Overige schulden 2 Vlottende activa 20 Oprichtingskosten 200 D Kosten van oprichting en kapitaalverhoging 201 D Kosten bij uitgifte van leningen 202 D Overige oprichtingskosten 204 D Herstructureringskosten 21 Immateriële vaste activa 210 D Kosten van onderzoek en ontwikkeling 211 D Concessies, octrooien, licenties, know-how, merken en soortgelijke rechten 212 D Goodwill 22 Terreinen en gebouwen 220 D Terreinen 221 D Gebouwen 222 D Bebouwde terreinen 223 D Overige zakelijke rechten op onroerende goederen 23 Installaties, machines en uitrusting 24 Meubilair en rollend materieel 25 Vaste activa in leasing of op grond van soortgelijke rechten 250 D Terreinen en gebouwen 251 D Installaties, machines en uitrusting 252 D Meubilair en rollend materieel 26 Andere materiële vaste activa 27 Vaste activa in aanbouw en vooruitbetalingen 28 Financiële vaste activa 280 D Deelnemingen in verbonden ondernemingen 2880 D Aanschaffingswaarde 2801 D Nog te storten bedragen (-) 2808 D Geboekte meerwaarden 2809 D Geboekte waardeverminderingen (-) 281 D Vorderingen op verbonden ondernemingen 2810 D Vorderingen op rekening 2811 D Te innen wissels 2812 D Vastrentende effecten 2817 D Dubieuze debiteuren 2819 D Geboekte waardeverminderingen (-) 282 D Deelnemingen in ondernemingen waarmee een deelnemingsverhouding bestaat 2820 D Aanschaffingswaarde 2821 D Nog te storten bedragen (-) 2828 D Geboekte meerwaarden 2829 D Geboekte waardeverminderingen (-) 283 D Vorderingen op ondernemingen waarmee een deelnemingsverhouding bestaat 2830 D Vorderingen op rekening 2831 D Te innen wissels 2832 D Vastrentende effecten 2837 D Dubieuze debiteuren 2839 D Geboekte waardeverminderingen (-) 284 D Andere aandelen 2840 D Aanschaffingswaarde 2841 D Nog te storten bedragen (-) 2848 D Geboekte meerwaarden 2849 D Geboekte waardeverminderingen (-) 285 D Overige vorderingen 2850 D Vorderingen op rekening 2851 D Te innen wissels 2852 D Vastrentende effecten 2857 D Dubieuze debiteuren 2859 D Geboekte waardeverminderingen (-) 288 D Borgtochten betaald in contanten 29 Vorderingen op meer dan één jaar 290 D Handelsvorderingen 2900 D Handelsdebiteuren 2901 D Te innen wissels 2906 D Vooruitbetalingen 2907 D Dubieuze debiteuren 2909 D Geboekte waardeverminderingen (-) 291 D Overige vorderingen 2910 D Vorderingen op rekening 2911 D Te innen wissels 2917 D Dubieuze debiteuren 2919 D Geboekte waardeverminderingen (-) 3 Voorraden en bestellingen in uitvoering 30 Grondstoffen 300 D Aanschaffingswaarde 309 D Geboekte waardeverminderingen (-) 31 Hulpstoffen 310 D Aanschaffingswaarde 319 D Geboekte waardeverminderingen (-) 32 Goederen in bewerking 320 D Aanschaffingswaarde 329 D Geboekte waardeverminderingen (-) 33 Gereed product 330 D Aanschaffingswaarde 339 D Geboekte waardeverminderingen (-) 34 Handelsgoederen 340 D Aanschaffingswaarde 349 D Geboekte waardeverminderingen (-) 35 Onroerende goederen bestemd voor verkoop 350 D Aanschaffingswaarde 359 D Geboekte waardeverminderingen (-) 36 Vooruitbetalingen op voorraadinkopen 360 D Aanschaffingswaarde 369 D Geboekte waardeverminderingen (-) 37 Bestellingen in uitvoering 370 D Aanschaffingswaarde 379 D Geboekte waardeverminderingen (-) 4 Vorderingen en schulden op ten hoogste één jaar 40 Handelsvorderingen 400 D Handelsdebiteuren :koppeling=deb 401 D Te innen wissels 404 D Te innen opbrengsten # 406 D Vooruitbetalingen :koppeling=crd 406 D Vooruitbetalingen 407 D Dubieuze debiteuren 409 D Geboekte waardeverminderingen (-) 41 Overige vorderingen 410 D Opgevraagd, niet-gestort kapitaal 411 D Terug te vorderen BTW :koppeling=btw_ih 4111 D Terug te vorderen BTW :koppeling=btw_il 412 D Terug te vorderen belastingen en voorheffingen 4120 D Belgische winstbelastingen 4121 D Belgische winstbelastingen 4122 D Belgische winstbelastingen 4123 D Belgische winstbelastingen 4124 D Belgische winstbelastingen 4125 D Andere Belgische belastingen 4126 D Andere Belgische belastingen 4127 D Andere Belgische belastingen 4128 D Buitenlandse belastingen 414 D Te innen opbrengsten 416 D Diverse vorderingen 417 D Dubieuze debiteuren 418 D Borgtochten betaald in contanten 419 D Geboekte waardeverminderingen (-) 42 Schulden op meer dan één jaar die binnen het jaar vervallen 420 C Achtergestelde leningen 4200 C Converteerbaar 4201 C Niet converteerbaar 421 C Niet-achtergestelde obligatieleningen 4210 C Converteerbaar 4211 C Niet converteerbaar 422 C Leasingschulden en soortgelijke 423 C Kredietinstellingen 4230 C Schulden op rekeningen 4231 C Promessen 4232 C Acceptkredieten 424 C Overige leningen 425 C Handelsschulden 4250 C Leveranciers 4251 C Te betalen wissels 426 C Ontvangen vooruitbetalingen op bestellingen 428 C Borgtochten ontvangen in contanten 429 C Overige schulden 43 Financiële schulden 430 C Kredietinstellingen - Leningen op rekeningen met vaste termijn 431 C Kredietinstellingen - Promessen 432 C Kredietinstellingen - Acceptkredieten 433 C Kredietinstellingen - Schulden in rekening courant 439 C Overige leningen 44 Handelsschulden 440 C Leveranciers :koppeling=crd 441 C Te betalen wissels 444 C Te ontvangen facturen 45 Schulden met betrekking tot belastingen, bezoldigingen en sociale lasten 450 C Geraamd bedrag der belastingschulden 4500 C Belgische winstbelastingen 4501 C Belgische winstbelastingen 4502 C Belgische winstbelastingen 4503 C Belgische winstbelastingen 4504 C Belgische winstbelastingen 4505 C Andere Belgische belastingen en taksen 4506 C Andere Belgische belastingen en taksen 4507 C Andere Belgische belastingen en taksen 4508 C Buitenlandse belastingen en taksen 451 C Te betalen BTW :koppeling=btw_vh 4511 C Te betalen BTW :koppeling=btw_vl 452 C Te betalen belastingen en taksen 4520 C Belgische winstbelastingen 4521 C Belgische winstbelastingen 4522 C Belgische winstbelastingen 4523 C Belgische winstbelastingen 4524 C Belgische winstbelastingen 4525 C Andere Belgische belastingen en taksen 4526 C Andere Belgische belastingen en taksen 4527 C Andere Belgische belastingen en taksen 4528 C Buitenlandse belastingen en taksen 453 C Ingehouden voorheffingen 455 C Bezoldigingen 456 C Vakantiegeld 459 C Andere sociale schulden 46 Ontvangen vooruitbetalingen op bestellingen # 460 C Ontvangen vooruitbetalingen op bestellingen :koppeling=deb 460 C Ontvangen vooruitbetalingen op bestellingen 47 Schulden uit de bestemming van het resultaat 470 C Dividenden en tantièmes over vorige boekjaren 471 C Dividenden over het boekjaar 472 C Tantièmes over het boekjaar 473 C Andere rechthebbenden 48 Diverse schulden 480 C Vervallen obligaties en coupons 488 C Borgtochten ontvangen in contanten 489 C Andere diverse schulden 49 Overlopende rekeningen en wachtrekeningen 490 D Over te dragen kosten 491 D Verkregen opbrengsten 492 C Toe te rekenen kosten 493 C Over te dragen opbrengsten 494 C BTW R/C :koppeling=btw_ok 499 D Wachtrekeningen 5 Geldbeleggingen en liquide middelen 50 Eigen aandelen 51 Aandelen 510 D Aanschaffingswaarde 511 D Niet-opgevraagde bedragen (-) 519 D Geboekte waardeverminderingen (-) 52 Vastrentende effecten 520 D Aanschaffingswaarde 529 D Geboekte waardeverminderingen (-) 53 Termijndeposito's 530 D Op meer dan één jaar 531 D Op meer dan één maand en op ten hoogste één jaar 532 D Op ten hoogste één maand 539 D Geboekte waardeverminderingen (-) 54 Te incasseren vervallen waarden 55 Kredietinstellingen 550 D Bank A 551 D Bank B 552 D Bank C 553 D Bank D 554 D Bank E 555 D Bank F 556 D Bank G 557 D Bank H 558 D Bank I 559 D Bank J 56 Postcheque en girodienst 560 D Postchequerekening 57 Kassen 570 D Kas A 571 D Kas B 572 D Kas C 573 D Kas D 574 D Kas E 575 D Kas F 576 D Kas G 577 D Kas H 58 Interne overboekingen Resultaatrekeningen 6 Kosten 60 Handelsgoederen, grond- en hulpstoffen 600 K Aankopen van grondstoffen 601 K Aankopen van hulpstoffen 602 K Aankopen van diensten, werk en studies 603 K Algemene onderaannemingen 604 K Aankopen van handelsgoederen 605 K Aankopen van onroerende goederen bestemd voor verkoop 608 K Ontvangen kortingen, ristorno's en rabatten (-) 609 K Voorraadwijzigingen 6090 K Voorraadwijzigingen van grondstoffen 6091 K Voorraadwijzigingen van hulpstoffen 6094 K Voorraadwijzigingen van handelsgoederen 6095 K Voorraadwijzigingen van gekochte onroerende goederen bestemd voor verkoop 61 Diensten en diverse goederen # 611 611100 K Huur en huurlasten terreinen 611110 K Huur en huurlasten gebouwen 611120 K Huur machines en materieel 611130 K Huurlasten op kantoormeubelen en materieel 611140 K Huurlasten vervoermaterieel 611200 K Leasing en soortgelijke rechten - Terreinen 611210 K Leasing en soortgelijke rechten - Gebouwen 611230 K Leasing en soortgelijke rechten - Materieel (installaties, machines, gereedschappen) 611240 K Leasing en soortgelijke rechten - Kantoormeubilair en materieel 611300 K Onderhoud en herstellingen terreinen 611310 K Onderhoud en herstellingen gebouwen 611320 K Onderhoud en herstellingen - Materieel (installaties, machines, gereedschappen) 611330 K Onderhoud en herstellingen - Kantoormeubilair en materieel 611340 K Onderhoud en herstelling personenwagens 611341 K Onderhoud en herstelling bedrijfswagens # 612 612100 K Water 612110 K Gas 612120 K Elektriciteit 612130 K Gasoil-Materieel 612140 K Diesel Personenwagens 612141 K Diesel bedrijfswagens 612150 K Gasoil-verwarming 612160 K L.P.G. 612170 K Benzine 612180 K Propaan 612200 K Onderhoudsproducten 612300 K Boeken, tijdschriften en documentatie 612400 K Drukwerken 612410 K Aanbestedingsdocumenten 612420 K Diverse bureelbenodigdheden 612500 K Telefoon 612504 K GSM 612505 K Internet 612510 K Telegrammen 612520 K Telefax 612530 K Postzegels 612610 K Acide 612620 K Leeggoed 612630 K Papierwaren 612640 K Toegiften 612650 K Verpakking 612660 K Klein Materieel 613100 K Commissielonen aan derden 613200 K Erelonen advocaten 613210 K Erelonen architecten 613220 K Erelonen studiebureaus 613230 K Erelonen geneesheren 613240 K Erelonen bedrijfsrevisoren 613250 K Erelonen boekhouders 613260 K Notarissen 613290 K Erelonen, andere experten 613300 K Sociale secretariaten 613310 K Computerservicebureaus 613311 K Incassobureau 613320 K Erelonen accountants 613330 K Controle hijswerktuigen (kranen, liften, draaibanken, enz...) 613331 K Technische controle PW 613332 K Technische controle BW 613333 K Ijkkosten 613334 K Keur en controlekosten 613340 K Interimbureaus 613350 K Syndicus 613351 K Managementsvergoeding 613352 K Domicilievergoeding 613360 K Afvalverwerking 613361 K Brandbeveiliging 613362 K Bewakingskosten 613363 K Wasserijkosten 613370 K Auteursrechten, sabam 613371 K Verbruikcentrale 613372 K Billijke vergoeding 613380 K Telemarketing 613400 K Rechten en royalties op brevetten 613410 K Rechten en royalties op licenties 613420 K Andere rechten en royalties 613500 K Verzekering brand en algemene kosten 613510 K Verzekering tegen diefstal 613520 K Verzekering materieel en bouwplaatsinstallaties 613530 K Verzekering personenwagens 613531 K Verzekering bedrijfswagens 613540 K Verzekering Burgerlijke Aansprakelijkheid 613550 K Kredietverzekering 613560 K Controleverzekering 613570 K Bedrijfsschadeverzekering (All-risks) 613580 K Eigen verzekeraar en franchises 614100 K Vervoer van verkochte goederen en aanverwante kosten 614200 K Andere vervoerkosten 614300 K Vervoer van personeel 615100 K Reizen en verplaatsingen Binnenland 615101 K Reizen en verplaatsingen buitenland 615110 K Representatie binnenland 615111 K Representatie buitenland 615120 K Deelname aan cursussen, studiedagen, enz... 615130 K Relatiegeschenken 615131 K Commerciele kosten 615200 K Advertenties en inlassingen 615210 K Catalogi en drukwerken 615220 K Deelname aan beurzen, tentoonstellingen, zendingen 615230 K Promotiekosten 615240 K Decoratie- en etalagemateriaal 615250 K Trofeeen 615260 K Giften 615300 K Neerlegging jaarrekening 615310 K Inlassingen in Staatsblad en media 615400 K Bijdragen O.C.W. 615410 K Bijdragen W.T.C.B. 615420 K Bijdragen en Lidgelden 615430 K Abonnementen en lidgelden 615440 K Soc.kas vennootschappen 615500 K Fiscaal vrijgesteld 615510 K Fiscaal niet vrijgesteld 615600 K Kosten voor betwistingen 617 K Uitzendkrachten en personen ter beschikking gesteld van de onderneming 618 K Bezoldigingen, premies voor buitenwettelijke verzekeringen, ouderdoms- en overlevingspensioenen van bestuurders, zaakvoerders en werkende vennoten, die niet worden toegekend uit hoofde van een arbeidsovereenkomst 62 Bezoldigingen, sociale lasten en pensioenen 620 K Bezoldigingen en rechtstreekse sociale voordelen 6200 K Bezoldigingen bestuurders of zaakvoerders 6201 K Directiepersoneel 6202 K Bedienden 6203 K Arbeiders 6204 K Andere personeelsleden 621 K Werkgeversbijdragen voor sociale verzekeringen 622 K Werkgeverspremies voor bovenwettelijke verzekeringen 623 K Andere personeelskosten 624 K Ouderdoms- en overlevingspensioenen 6240 K Bestuurders of zaakvoerders onder dienstcontract 6241 K Personeel 63 Afschrijvingen, waardeverminderingen en voorzieningen voor risico's en kosten 630 K Afschrijvingen en waardeverminderingen op vaste activa - Toevoeging 6300 K Afschrijvingen op oprichtingskosten 6301 K Afschrijvingen op immateriële vaste activa 6302 K Afschrijvingen op materiële vaste activa 6308 K Waardeverminderingen op immateriële vaste activa 6309 K Waardeverminderingen op materiële vaste activa 631 K Waardeverminderingen op voorraden 6310 K Toevoeging 6311 K Terugneming (-) 632 K Waardeverminderingen op bestellingen in uitvoering 6320 K Toevoeging 6321 K Terugneming (-) 633 K Waardeverminderingen op handelsvoerderingen op meer dan één jaar 6330 K Toevoeging 6331 K Terugneming (-) 634 K Waardeverminderingen op handelsvorderingen op ten hoogste één jaar 6340 K Toevoeging 6341 K Terugneming (-) 635 K Voorzieningen voor pensioenen en soortgelijke verplichtingen 6350 K Toevoeging 6351 K Besteding en terugneming (-) 636 K Voorzieningen voor grote herstellingswerken en grote onderhoudswerken 6360 K Toevoeging 6361 K Besteding en terugneming (-) 637 K Voorzieningen voor andere risico's en kosten 6370 K Toevoeging 6371 K Besteding en terugneming (-) 64 Andere bedrijfskosten 640 K Bedrijfsbelastingen 641 K Minderwaarden op de courante realisatie van vaste activa 642 K Minderwaarden op de realisatie van handelsvorderingen 643 K Diverse bedrijfskosten 644 K Diverse bedrijfskosten 645 K Diverse bedrijfskosten 646 K Diverse bedrijfskosten 647 K Diverse bedrijfskosten 648 K Diverse bedrijfskosten 649 K Als herstructureringskosten geactiveerde bedrijfskosten (-) 65 Financiële kosten 650 K Kosten van schulden 6500 K Rente, commissies en kosten verbonden aan schulden 6501 K Afschrijving van kosten bij uitgifte van leningen en van disagio 6502 K Andere kosten van schulden 6503 K Geactiveerde intercalaire interesten (-) 651 K Waardeverminderingen op vlottende activa 6510 K Toevoeging 6511 K Terugneming (-) 652 K Minderwaarden op de realisatie van vlottende activa 653 K Discontokosten op vorderingen 654 K Wisselresultaten 655 K Resultaten uit de omrekening van vreemde valuta 656 K Voorzieningen met financieel karakter 6560 K Toevoegingen 6561 K Bestedingen en terugnemingen (-) 657 K Diverse financiele kosten 658 K Diverse financiele kosten 659 K Diverse financiele kosten 66 Uitzonderlijke kosten 660 K Uitzonderlijke afschrijvingen en waardeverminderingen (toevoeging) 6600 K Uitzonderlijke afschrijvingen en waardeverminderingen op oprichtingskosten (toevoeging) 6601 K Uitzonderlijke afschrijvingen en waardeverminderingen op immatriële vaste activa (toevoeging) 6602 K Uitzonderlijke afschrijvingen en waardeverminderingen op matriële vaste activa (toevoeging) 661 K Waardeverminderingen op financiële vaste activa (toevoeging) 662 K Voorzieningen voor uitzonderlijke risico's en kosten 6620 K Toevoegingen 6621 K Bestedingen (-) 663 K Minderwaarden op de realisatie van vaste activa 664 K Andere uitzonderlijke kosten 665 K Andere uitzonderlijke kosten 666 K Andere uitzonderlijke kosten 667 K Andere uitzonderlijke kosten 668 K Andere uitzonderlijke kosten 669 K Uitzonderlijke kosten als herstructureringskosten opgenomen onder de activa (-) 67 Belastingen op het resultaat 670 K Belgische belastingen op het resultaat van het boekjaar 6700 K Verschuldigde of gestorte belastingen en voorheffingen 6701 K Geactiveerde overschotten van betaalde belastingen en voorheffingen (-) 6702 K Geraamde belastingen 671 K Belgische belastingen op het resultaat van vorige boekjaren 6710 K Verschuldigde of gestorte belastingsupplementen 6711 K Geraamde belastingsupplementen 6712 K Gevormde fiscale voorzieningen 672 K Buitenlandse belastingen op het resultaat van het boekjaar 673 K Buitenlandse belastingen op het resultaat van vorige boekjaren 68 Overboeking naar de uitgestelde belastingen en naar de belastingvrije reserves 680 K Overboeking naar de uitgestelde belastingen 689 K Overboeking naar de belastingvrije reserves 69 Resultaatverwerking 690 K Overgedragen verlies van het vorige boekjaar 691 K Toevoeging aan het kapitaal en aan de uitgiftepremie 692 K Toevoeging aan de reserves 6920 K Toevoeging aan de wettelijke reserve 6921 K Toevoeging aan de overige reserves 693 K Over te dragen winst 694 K Vergoeding van het kapitaal 695 K Bestuurders of zaakvoerders 696 K Andere rechthebbenden 7 Opbrengsten 70 Omzet 700 O Verkopen en dienstprestaties 701 O Verkopen en dienstprestaties 702 O Verkopen en dienstprestaties 703 O Verkopen en dienstprestaties 704 O Verkopen en dienstprestaties 705 O Verkopen en dienstprestaties 706 O Verkopen en dienstprestaties 707 O Verkopen en dienstprestaties 708 O Toegekende kortingen, ristorno's en rabatten (-) 71 Wijzigingen in de voorraden en in de bestellingen in uitvoering 712 O In de voorraad goederen in bewerking 713 O In de voorraad gereed product 715 O In de voorraad onroerende goederen bestemd voor verkoop 717 O In de bestellingen in uitvoering 7170 O Aanschaffingswaarde 7171 O Toegerekende winst 72 Geproduceerde vaste activa 74 Andere bedrijfsopbrengsten 740 O Bedrijfssubsidies en compenserende bedragen 741 O Meerwaarden op de courante realisatie van materiële vaste activa 742 O Meerwaarden op de realisatie van handelsvorderingen 743 O Diverse bedrijfsopbrengsten 744 O Diverse bedrijfsopbrengsten 745 O Diverse bedrijfsopbrengsten 746 O Diverse bedrijfsopbrengsten 747 O Diverse bedrijfsopbrengsten 748 O Diverse bedrijfsopbrengsten 749 O Diverse bedrijfsopbrengsten 75 Financiële opbrengsten 750 O Opbrengsten uit financiële vaste activa 751 O Opbrengsten uit vlottende activa 752 O Meerwaarden op de realisatie van vlottende activa 753 O Kapitaal- en interestsubsidies 754 O Wisselresultaten 755 O Resultaten uit de omrekening van vreemde valuta 756 O Diverse financiële opbrengsten 757 O Diverse financiële opbrengsten 758 O Diverse financiële opbrengsten 759 O Diverse financiële opbrengsten 76 Uitzonderlijke opbrengsten 760 O Terugneming van afschrijvingen en waardeverminderingen 7600 O op immateriële vaste activa 7601 O op materiële vaste activa 761 O Terugneming van waardeverminderingen op financiële vaste activa 762 O Terugneming van voorzieningen voor uitzonderlijke risico's en kosten 763 O Meerwaarden op de realisatie van vaste activa 764 O Andere uitzonderlijke opbrengsten 765 O Andere uitzonderlijke opbrengsten 766 O Andere uitzonderlijke opbrengsten 767 O Andere uitzonderlijke opbrengsten 768 O Andere uitzonderlijke opbrengsten 769 O Andere uitzonderlijke opbrengsten 77 Regularisering van belastingen en terugneming van fiscale voorzieningen 771 O Belgische belastingen op het resultaat 7710 O Regularisering van verschuldigde of betaalde belastingen 7711 O Regularisering van geraamde belastingen 7712 O Terugneming van fiscale voorzieningen 773 O Buitenlandse belastingen op het resultaat 78 Onttrekking aan de belastingvrije reserves en de uitgestelde belastingen 780 O Onttrekkingen aan de uitgestelde belastingen 789 O Onttrekkingen aan de belastingvrije reserves 79 Resultaatverwerking 790 O Overgedragen winst van het vorige boekjaar 791 O Onttrekking aan het kapitaal en aan de uitgiftepremies 792 O Onttrekking aan de reserves 793 O Over te dragen verlies 794 O Tussenkomst van vennoten (of van de eigenaar) in het verlies # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. Dagboeken I Inkoop :type=inkoop K Kas :type=kas :rekening=570 D Diversen :type=memoriaal P Postbank :type=bank :rekening=550 V Verkoop :type=verkoop # BTW TARIEVEN # # Er zijn drie tariefgroepen: "hoog", "laag" en "nul". De tariefgroep # bepaalt het rekeningnummer waarop de betreffende boeking plaatsvindt. # Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit # in de praktijk niet snel zal voorkomen. # In de eerste kolom wordt de (numerieke) code voor dit tarief # opgegeven. Deze kan o.m. worden gebruikt om expliciet een BTW tarief # op te geven bij het boeken. Voor elk tarief (behalve die van groep # "nul") moet het percentage worden opgegeven. Met de aanduiding # :exclusief kan worden opgegeven dat boekingen op rekeningen met deze # tariefgroep standaard het bedrag exclusief BTW aangeven. # # BELANGRIJK: Mutaties die middels de command line shell of de API # worden uitgevoerd maken gebruik van het geassocieerde BTW tarief van # de grootboekrekeningen. Wijzigingen hierin kunnen dus consequenties # hebben voor de reeds in scripts vastgelegde boekingen. BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 21% incl. :tariefgroep=hoog :perc=21,00 2 BTW 21% excl. :tariefgroep=hoog :perc=21,00 :exclusief # 3 BTW 12,0% incl. :tariefgroep=midden :perc=12,00 # 4 BTW 12,0% excl. :tariefgroep=midden :perc=12,00 :exclusief 5 BTW 6,0% incl. :tariefgroep=laag :perc=6,00 6 BTW 6,0% excl. :tariefgroep=laag :perc=6,00 :exclusief # Einde EekBoek schema EekBoek-2.02.04/lib/EB/examples/nl/0000755000076500007650000000000012165465617014316 5ustar jvjvEekBoek-2.02.04/lib/EB/examples/nl/eenmanszaak.dat0000444000076500007650000004222512165465617017310 0ustar jvjv# eenmanszaak.dat -- EekBoek voorbeeld rekeningschema voor Eenmanszaak # Author : Johan Vromans # Created On : Wed Dec 14 16:22:15 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Dec 4 20:42:46 2010 # Update Count : 13 # # Content-Type: text/plain; charset = UTF-8 # # DIT SCHEMA IS INDICATIEF EN DIENT VOOR EIGEN GEBRUIK TE WORDEN # AANGEPAST # # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # :btw=privé # :btw=anders # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ph idem, privé, hoog tarief # btw_pl idem, laag tarief # btw_ah idem, anders, hoog tarief # btw_al idem, laag tarief # btw_ok rekening voor de betaalde BTW # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. Verdichting 9 99 # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Balansrekeningen 1 Vaste Activa 11 Immateriële vaste activa 100 D Goodwill 101 C Afschrijving goodwill 110 D Aanloopkosten 111 C Afschrijving aanloopkosten 12 Materiële vaste activa 200 D Gebouwen en terreinen 201 C Afschrijving gebouwen 210 D Verbouwing 211 C Afschrijving verbouwingen 220 D Machines en installaties 221 C Afschrijving mach. & installaties 230 D Inventaris en inrichting :btw=hoog,kosten 231 C Afschrijving inventaris & inrichting 240 D Computers :btw=hoog,kosten 241 C Afschrijving computers 250 D Auto's 251 C Afschrijving Auto's 13 Financiële vaste activa 300 D Deelneming B.V. A 310 C Lening B.V. A 320 D Lening u/g de heer A 2 Vlottende activa 21 Handelsvoorraden 3000 D Voorraad 3900 C Voorziening incourante voorraad 22 Vorderingen 1200 D Debiteuren :koppeling=deb 1210 C Factoring debiteuren 1220 D Debiteuren vorig boekjaar 1250 D Dubieuze debiteuren 1290 D Voorziening debiteuren 1300 D Waarborgsommen 1350 D Te factureren omzet 1360 D Te ontvangen rente 1370 D Te ontvangen ziekengeld 1380 D Te ontvangen provisie 1400 D Vooruitbet. huisvestingskosten 1410 D Vooruitbet. reclamekosten 1420 D Vooruitbet. verzekering 1430 D Vooruitbet. autokosten 1440 C Vooruitbet. kantoorartikelen 23 Effecten 900 D Aandelen 910 D Obligaties 24 Liquide middelen 1000 D Kas 1100 D ABN-AMRO Bank 1101 D ABN AMRO Bank G-rekening 1110 D ING Bank 1120 D Postbank 1150 D Deposito 1190 D Kruisposten 1191 D Kruisposten Kas 1192 D Kruisposten overboekingen 25 Tussenrekeningen 2000 C Vraagposten 2200 D Kostenspreiding vorderingen 2210 C Kostenspreiding schulden 2400 C Onbekende betalingen 2900 D Correctierekening 3 Eigen vermogen 31 Kapitaal 500 C Kapitaal :koppeling=winst 510 C Privé stortingen 520 D Privé opnamen 530 C Privé rente 540 C Privé ziektekosten 550 C Privé belastingen 560 C Privé schenkingen 570 C Privé verzekeringen 580 C Privé buitengewone lasten 590 C Privé uitgaven overige 4 Vreemd vermogen 41 Kredietinstellingen lang 800 C Hypotheek bedrijfspand 810 C Lening Bank 811 C Middellang krediet Bank 820 C Financiallease auto 821 C Financiallease computer 44 Overige schulden lang 880 C Lening opgenomen 890 C Overige leningen 45 Banken kort 1130 C Rabobank 1140 C VSB Bank 46 Leveranciers kredieten 1600 C Crediteuren :koppeling=crd 1620 C Crediteuren vorig boekjaar 1650 C Nog te ontvangen fakturen 48 Belastingen & soc. lasten 1500 C BTW Verkoop Hoog :koppeling=btw_vh 1510 C BTW Verkoop Laag :koppeling=btw_vl 1520 D BTW Inkoop Hoog :koppeling=btw_ih 1530 D BTW Inkoop Laag :koppeling=btw_il 1540 C BTW autokostenvergoeding 1550 C BTW Import 1560 C Omzetbelasting betaald :koppeling=btw_ok 1570 D BTW kleine ondernemersregeling 1710 C Loonheffing betaald 1711 C Ingehouden loonheffing 1720 C Bedrijfsvereniging bet. 1721 C Berekende premie BVG 1730 C Pensioenpremie betaald 1731 C Berekende pesioenpremie 1740 C VUT premie betaald 1741 C Berekende VUT premie 1750 C Sociaal fonds betaald 1751 C Berekende premie S. Fonds 49 Overige schulden kort 1900 C Aflossingsverplichtingen 1910 C Reservering vakantiegeld 1911 C Reservering vakantiedagen 1920 C Te betalen accountantskosten 1921 C Te betalen advieskosten 1922 C Te betalen autokosten 1923 C Te betalen algemene kosten 1924 C Te betalen personeelskosten 1925 C Te betalen rente 1926 C Te betalen huisvestingskosten 1929 C Te betalen overige kosten 1950 C Netto lonen en salarissen 1960 C Pensioen verzekeringsmij. 1990 C Diverse schulden kort Resultaatrekeningen 5 Bedrijfsopbrengsten 51 Netto omzet 8600 O Omzet diversen BTW hoog :btw=hoog 8610 O Omzet diversen BTW laag :btw=laag 8620 O Omzet diversen BTW vrij 8900 K Betalingskorting verkoop 8910 K Korting verkoop 8920 K Prijsverschillen verkoop 52 Kostprijs van de omzet 7000 K Inkoop materiaal :btw=hoog 7800 K Mutatie eindvoorraad 7900 K Betalingskorting inkoop 7920 K Prijsverschillen inkoop 53 Overige bedrijfsopbrengst 8680 O Omzet naar kosten BTW hoog :btw=hoog 8690 K Doorbelaste omzet naar kosten 8700 K Kleine ondernemersregeling 8800 K Huuropbrengst 6 Personeelslasten 60 Lonen en salarissen 4000 K Bruto lonen 4001 K Tantième 4002 K Gratificaties 4010 K Overhevelingstoeslag 4020 K Premiespaarregeling 4021 K Loonheffing spaarregeling 4070 K Mutatie vakantiegeld 4071 K Mutatie vakantiedagen 4080 K Ontvangen ziekengeld 4090 K Doorberekende salarissen 61 Sociale lasten 4100 K Bedrijfsvereniging premies 4101 K Ingehouden pr. bedr. vereniging 4110 K VUT premie 4111 K Ingehouden VUT premie 4120 K Sociaal fonds 4121 K Ingehouden sociaal fonds 4130 K Pensioenpremie 4131 K Ingehouden pensioenpremies 4140 K Ziekteverzuimverzekering 4150 K Ziektekostenverzekering 4151 K Bijdrage ziektekostenverzekering 4170 K Soc. lasten vakantiegeld 4171 K Soc. lasten vakantiedagen 4180 K Soc. lasten ontv. ziekengeld 4190 K Doorberekende soc. lasten 62 Overige personeelskosten 4200 K Reiskostenvergoedingen 4205 K Consultancy ingekocht 4210 K Vaste reiskostenverg. 4220 K Vrijgestelde vergoedingen 4230 K Studiekosten 4240 K Kostenvergoeding 4250 K Representatie vergoeding 4260 K Uitzendburo :btw=hoog 4270 K Kantine en consumptie 4280 K Bedrijfskleding personeel :btw=hoog 4290 K Overige personeelskosten 63 Afschrijving materiële vaste activa 4300 K Afschr. kosten gebouwen 4310 K Afschr. kosten verbouwing 4320 K Afschr. kosten mach & inst. 4330 K Afschr. kosten inv. & inr. 4340 K Afschr. kosten computers 4350 K Afschr. kosten auto's 4360 K Res. verkoop mat. vaste activa 65 Huisvestingskosten 4500 K Huur bedrijfspand :btw=hoog 4510 K Servicekosten :btw=hoog 4520 K Gas water & electra 4530 K Vaste lasten 4540 K Onderhoud bedrijfspand :btw=hoog 4550 K Schoonmaakkosten :btw=hoog 4560 K Verzekering bedrijfspand 4590 K Overige huisvestingskosten :btw=hoog 66 Autokosten 4600 K Leasekosten auto :btw=hoog 4610 K Brandstof auto :btw=hoog 4620 K Onderhoud auto :btw=hoog 4630 K Verzekering auto 4640 K Kilometervergoedingen 4650 K Huur auto :btw=hoog 4670 K Boetes 4671 K Boetes 0% aftrekbaar 4680 K BTW privégebruik auto 4690 K Overige autokosten :btw=hoog 67 Verkoopkosten 4700 K Reclamekosten :btw=hoog 4710 K Advertentiekosten :btw=hoog 4711 K Sponsoring 4720 K Beurskosten :btw=hoog 4730 K Relatiegeschenken 4740 K Reis- en verblijfkosten :btw=hoog 4741 K Reis- en verblijfk. 90% :btw=hoog 4742 K Voedsel en drank 90% 4750 K Representatiekosten :btw=hoog 4751 K Representatiekosten 90% 4760 K Credit-cardkosten 4770 K Factoringkosten 4790 K Overige verkoopkosten :btw=hoog 68 Distributiekosten 4810 K Vervoerskosten :btw=hoog 4890 K Overige distributiekosten :btw=hoog 69 Algemene kosten 4780 K Kasverschillen 4800 K Verzending portikosten 4900 K Telefoon- en faxkosten :btw=hoog 4905 K Internetkosten :btw=hoog 4910 K Contributies & abonnementen :btw=hoog 4911 K Contr. & abonn. BTW 0% 4920 K Verzekering algemeen 4930 K Kantoorartikelen :btw=hoog 4931 K Kleine aanschaf kantoor :btw=hoog 4932 K Vakliteratuur 4940 K Accountantskosten :btw=hoog 4941 K Administratiekosten :btw=hoog 4942 K Loonadministratiekosten :btw=hoog 4943 K Notaris & advocaatkosten :btw=hoog 4950 K Drukwerk & papier :btw=hoog 4960 K Branche-organisatiekosten 4970 K Postzegels 4980 K Bankkosten 4990 K Overige algemene kosten :btw=hoog 4991 K Bijzondere baten & lasten 4992 K Reiskosten 7 Afschrijvingen 64 Afschrijving immateriële vaste activa 4380 K Afschr. kosten goodwill 4390 K Afschr. kosten aanloopkosten 9 Financiële baten & lasten 71 Rente baten 9000 K Rente bate deposito 9040 K Rente bate lening u/g 9052 K Rente bate Postbank 9080 K Rente bate belastingen 9090 K Rente bate overige 72 Rente- en overige financiële lasten 9100 K Rente last hypotheek pand 9110 K Rente last lening bank 9111 K Rente last m.lang krediet 9120 K Rente last fin. lease auto 9140 K Rente last lening o/g 9152 K Rente last Postbank 9180 K Rente last belastingen 9190 K Rente last overige 73 Opbrengst overige activa 9200 K Opbrengst effecten 9210 K Mutatie effecten # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. # De optie :dc kan worden gebruikt om aan te geven dat het journaal # voor dit dagboek de boekstuktotalen in gescheiden debet en credit # moet tonen. Dagboeken I Inkoop :type=inkoop K Kas :type=kas :rekening=1000 M Memoriaal :type=memoriaal P Postbank :type=bank :rekening=1120 V Verkoop :type=verkoop # BTW TARIEVEN # # Er zijn vijf tariefgroepen: "hoog", "laag", "nul", "privé" en # "anders". De tariefgroep bepaalt het rekeningnummer waarop de # betreffende boeking plaatsvindt. # Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit # in de praktijk niet snel zal voorkomen. # In de eerste kolom wordt de (numerieke) code voor dit tarief # opgegeven. Deze kan o.m. worden gebruikt om expliciet een BTW tarief # op te geven bij het boeken. Voor elk gebruikt tarief (behalve die # van groep "nul") moet het percentage worden opgegeven. Met de # aanduiding :exclusief kan worden opgegeven dat boekingen op # rekeningen met deze tariefgroep standaard het bedrag exclusief BTW # aangeven. # # BELANGRIJK: Mutaties die middels de command line shell of de API # worden uitgevoerd maken gebruik van het geassocieerde BTW tarief van # de grootboekrekeningen. Wijzigingen hierin kunnen dus consequenties # hebben voor de reeds in scripts vastgelegde boekingen. BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 19% incl. :tariefgroep=hoog :perc=19,00 2 BTW 19% excl. :tariefgroep=hoog :perc=19,00 :exclusief 3 BTW 6,0% incl. :tariefgroep=laag :perc=6,00 4 BTW 6,0% excl. :tariefgroep=laag :perc=6,00 :exclusief EekBoek-2.02.04/lib/EB/examples/nl/opening.eb0000444000076500007650000000224712165465617016270 0ustar jvjv# $Id: opening.eb,v 1.6 2008/02/20 23:24:53 jv Exp $ # Administratiegegevens. # Naam van de administratie. adm_naam "EekBoek Demo Administratie" # Periode waarover BTW aangifte moet worden gedaan. adm_btwperiode jaar # Begindatum van deze administratie. adm_begindatum 2007 # Standaard wordt voor als boekjaarcode het jaartal gebruikt. U kunt # ook iets anders opgeven. adm_boekjaarcode "2007" # Data voor openingsbalans: # Het balanstotaal is het totaal van alle debet posten, dat uiteraard # overeenkomt met het totaal van alle credit posten. adm_balanstotaal 15854,77 # De openingsposten. adm_balans 1100 1344,37 # Inventaris en inrichting adm_balans 1101 1304,81 # Afschr. Inv. en inr. adm_balans 1110 13378,48 # Computers adm_balans 1111 12106,78 # Afscr. computers adm_balans 2320 1131,92 # Saldo Postbank adm_balans 3100 2443,18 # Kapitaal # Openstaande posten uit voorgaande boekjaren als volgt: # Eerst, indien nodig, de betreffende relatie toevoegen: #relatie KESTER "Repro van Kesteren" 6950 # Dan het openstaande boekstuk: #adm_relatie inkoop:2006:67 2006-12-11 "KESTER" "Printwerk" 48,79 # Open de administratie. adm_open EekBoek-2.02.04/lib/EB/examples/nl/schema.dat0000444000076500007650000002545512165465617016261 0ustar jvjv# $Id: schema.dat,v 1.15 2010/01/09 21:36:28 jv Exp $ -*- coding: utf-8 -*- # EekBoek Rekeningschema voor eekboek_sample # Content-Type: text/plain; charset = UTF-8 # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # :btw=privé # :btw=anders # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ph idem, privé, hoog tarief # btw_pl idem, laag tarief # btw_ah idem, anders, hoog tarief # btw_al idem, laag tarief # btw_ok rekening voor de betaalde BTW # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. Verdichting 9 99 # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Balansrekeningen 1 Vaste Activa 11 Materiële vaste activa 1100 D Inventaris en inrichting :btw=hoog,kosten 1101 C Afschrijving inv. & inr. 1110 D Computers :btw=hoog,kosten 1111 C Afschrijving computers 1120 D Wagenpark :btw=hoog,kosten 1121 C Afschrijving Wagenpark 2 Vlottende activa 21 Handelsvoorraden 2100 C Voorraad 22 Vorderingen 2200 D Debiteuren :koppeling=deb 23 Liquide middelen 2300 D Kas 2320 D Postbank 2330 D Postbank Inbedrijf 2390 D Kruisposten 3 Eigen vermogen 31 Kapitaal 3100 C Kapitaal de heer/mevrouw :koppeling=winst 3110 C Privé stortingen 3120 D Privé opnamen 4 Vreemd vermogen 41 Leveranciers kredieten 4100 C Crediteuren :koppeling=crd 4150 C Nog te ontvangen fakturen 42 Belastingen & soc. lasten 4200 C BTW Verkoop Hoog :koppeling=btw_vh 4210 C BTW Verkoop Laag :koppeling=btw_vl 4212 C BTW Verkoop Privé :koppeling=btw_vp 4220 D BTW Inkoop Hoog :koppeling=btw_ih 4230 D BTW Inkoop Laag :koppeling=btw_il 4232 D BTW Inkoop Privé :koppeling=btw_ip 4240 C BTW Autokostenvergoeding 4290 C Omzetbelasting betaald :koppeling=btw_ok Resultaatrekeningen 6 Kosten 61 Verkoopkosten 6100 K Reis- en verblijfkosten :btw=hoog 6110 K Sponsoring 62 Huisvestingskosten 6200 K Verzekeringen 63 Bedrijfsvoering 6310 K Kamer van Koophandel 6320 K Vakbond 6330 K Branche-organisatiekosten 66 Autokosten 6600 K Leasekosten auto :btw=hoog 6610 K Brandstof auto :btw=hoog 6620 K Onderhoud auto :btw=hoog 6630 K Verzekering auto 6640 K Kilometervergoedingen 6650 K Huur auto :btw=hoog 6660 K Motorrijtuigenbelasting 6670 K Boetes 6671 K Boetes 0% aftrekbaar 6680 K BTW privégebruik auto 6690 K Overige autokosten :btw=hoog 67 Contributies & abonnementen 6700 K Contributies & abonnementen :btw=hoog 6710 K Contr. & abonn. BTW 0% 68 Afschrijvingen 6800 K Afschr. kosten inv. & inr. 6810 K Afschr. kosten computers 6820 K Afschr. kosten wagenpark 69 Algemene kosten 6900 K Telefoon- en faxkosten :btw=hoog 6905 K Internetkosten :btw=hoog 6920 K Kantoorartikelen :btw=hoog 6921 K Computerbenodigdheden :btw=hoog 6930 K Vakliteratuur :btw=laag 6940 K Administratiekosten :btw=hoog 6950 K Drukwerk & papier :btw=hoog 6970 K Postzegels 6971 K Verzending portikosten 6980 K Bankkosten 6981 K Kasverschillen 6982 K Afrondingen 6990 K Overige algemene kosten :btw=hoog 8 Bedrijfsopbrengsten 81 Omzet Consultancy 8100 O Omzet advisering :btw=hoog 8110 O Omzet advisering BTW vrij 82 Omzet Royalties 8200 O Omzet royalties BTW vrij 83 Omzet Editing 8300 O Omzet editing :btw=hoog 84 Omzet Cursussen 8400 O Omzet cursussen :btw=hoog 8410 O Omzet cursuslicenties :btw=hoog 85 Omzet Projekten 8500 O Omzet projekten :btw=hoog 89 Omzet Diversen 8900 O Omzet diversen BTW hoog :btw=hoog 8910 O Omzet diversen BTW laag :btw=laag 8920 O Omzet diversen BTW vrij 9 Financiële baten & lasten 91 Rente baten 9120 O Rente bate Postbank 9130 O Rente bate Postbank Inbedrijf 9190 O Rente bate overige 92 Rente- en overige financiële lasten 9220 K Rente last Postbank 9230 K Rente last Postbank Inbedrijf 9290 K Rente last overige 93 Overige baten 9380 O Bijtelling privégebruik auto :btw=privé 9390 O Kleine ondernemersregeling # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. # De optie :dc kan worden gebruikt om aan te geven dat het journaal # voor dit dagboek de boekstuktotalen in gescheiden debet en credit # moet tonen. Dagboeken I Inkoop :type=inkoop K Kas :type=kas :rekening=2300 M Memoriaal :type=memoriaal P Postbank :type=bank :rekening=2320 R Inbedrijf :type=bank :rekening=2330 V Verkoop :type=verkoop # BTW TARIEVEN # # Er zijn vijf tariefgroepen: "hoog", "laag", "nul", "privé" en # "anders". De tariefgroep bepaalt het rekeningnummer waarop de # betreffende boeking plaatsvindt. # Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit # in de praktijk niet snel zal voorkomen. # In de eerste kolom wordt de (numerieke) code voor dit tarief # opgegeven. Deze kan o.m. worden gebruikt om expliciet een BTW tarief # op te geven bij het boeken. Voor elk gebruikt tarief (behalve die # van groep "nul") moet het percentage worden opgegeven. Met de # aanduiding :exclusief kan worden opgegeven dat boekingen op # rekeningen met deze tariefgroep standaard het bedrag exclusief BTW # aangeven. # # Indien een BTW-tarief niet geldig is op de boekingsdatum wordt # gekeken naar de configuratiesetting [strategy] btw_adapt. Indien # deze is gezet op een niet-nul waarde dan wordt gezocht naar een # alternatief BTW-tarief en deze gebruikt. In alle gevallen wordt een # adequate medlding gegeven. # Dit kan per boeking(sregel) worden onderdrukt door de tariefcode # expliciet mee te geven. # # BELANGRIJK: Mutaties die middels de command line shell of de API # worden uitgevoerd maken gebruik van het geassocieerde BTW tarief van # de grootboekrekeningen. Wijzigingen hierin kunnen dus consequenties # hebben voor de reeds in scripts vastgelegde boekingen. BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 19% incl. :tariefgroep=hoog :perc=19,00 :tot=2012-10-01 2 BTW 19% excl. :tariefgroep=hoog :perc=19,00 :exclusief :tot=2012-10-01 3 BTW 6,0% incl. :tariefgroep=laag :perc=6,00 4 BTW 6,0% excl. :tariefgroep=laag :perc=6,00 :exclusief 5 BTW Privé 12% ex. :tariefgroep=privé :perc=12,00 :exclusief 6 BTW 21% incl. :tariefgroep=hoog :perc=21,00 :vanaf=2012-10-01 7 BTW 21% excl. :tariefgroep=hoog :perc=21,00 :exclusief :vanaf=2012-10-01 # Einde EekBoek schema EekBoek-2.02.04/lib/EB/examples/nl/relaties.eb0000444000076500007650000000226412165465617016440 0ustar jvjv# $Id: relaties.eb,v 1.6 2008/02/20 23:24:53 jv Exp $ # Aanmaken relaties. # # Syntax: # # Relatie "" standaardrekening # # Als dagboek wordt het laagstgenummerde inkoop/verkoop dagboek # genomen. Het is altijd beter het dagboek expliciet op te geven. # # Opties: # # --dagboek=XXXX selecteer dagboek # --btw=XXX btw type, zie verderop # # Een relatie is crediteur indien het dagboek een inkoopdagboek is. relatie --dagboek=inkoop \ XS4ALL "XS4All Internet B.V." 6905 #relatie --dagboek=inkoop \ # KPN "KPN" 6900 # Met impiciete dagboekdetectie: relatie KPN "KPN" 6900 # Meerdere relaties kunnen ook in een keer: # # relatie --dagboek=inkoop \ # XS4ALL "XS4All Internet B.V." 6905 \ # KPN "KPN" 6900 # Een relatie is debiteur indien het dagboek een verkoopdagboek is. # Relatie "" standaardrekening relatie --dagboek=verkoop \ ACME "Acme Corp." 8100 # Relatie van buiten Europa. BTW code is 'extra'. # Andere mogelijkheden voor BTW zijn 'normaal', # 'verlegd' en 'intra' (intra-communautair, binnen Europa). relatie --dagboek=verkoop --btw=extra \ ORA "O'Reilly & Associates" 8200 EekBoek-2.02.04/lib/EB/examples/nl/bvnv.dat0000444000076500007650000004733312165465617015773 0ustar jvjv# bvnv.dat -- EekBoek voorbeeld rekeningschema voor een BV/NV # Author : Johan Vromans # Created On : Wed Dec 14 16:22:15 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Dec 4 20:42:13 2010 # Update Count : 13 # # Content-Type: text/plain; charset = UTF-8 # # DIT SCHEMA IS INDICATIEF EN DIENT VOOR EIGEN GEBRUIK TE WORDEN # AANGEPAST # # Aangemaakt door EB::Tools::Schema op 12-12-2005 17:22:47 # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # :btw=privé # :btw=anders # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ph idem, privé, hoog tarief # btw_pl idem, laag tarief # btw_ah idem, anders, hoog tarief # btw_al idem, laag tarief # btw_ok rekening voor de betaalde BTW # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. Verdichting 12 99 # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Balansrekeningen 1 Vaste Activa 15 Immateriële vaste activa 100 D Goodwill 101 C Afschrijving goodwill 110 D Aanloopkosten 111 C Afschrijving aanloopkosten 16 Materiële vaste activa 200 D Gebouwen en terreinen 201 C Afschrijving gebouwen 210 D Verbouwingen 211 C Afschrijving verbouwingen 220 D Machines en installaties 221 C Afschrijving mach. & inst. 230 D Inventaris en inrichting 231 C Afschrijving inv. & inr. 240 D Computers 241 C Afschrijving computers 250 D Auto's 251 C Afschrijving Auto's 17 Financiële vaste activa 300 D Deelneming B.V. A 301 D Deelneming B.V. B 302 D Deelneming B.V. C 303 D Deelneming B.V. D 320 D Lening u/g de heer A # u/g = uitgezet (uitgeleend) geld 321 D Lening u/g de heer B 330 D Lening B.V. A 331 D Lening B.V. B 370 D Overige leningen u/g 390 D Overige effecten 2 Vlottende activa 21 Handelsvoorraden 3000 D Voorraad 3900 C Voorziening incourante voorraad 22 Vorderingen 1200 D Debiteuren :koppeling=deb 1210 C Factoring debiteuren 1220 D Debiteuren vorig boekjaar 1250 D Dubieuze debiteuren 1290 D Voorziening debiteuren 1300 D Waarborgsommen 1320 D Rekening-courant B.V. A 1321 D Rekening-courant B.V. B 1350 D Te factureren omzet 1360 D Te ontvangen rente 1370 D Te ontvangen ziekengeld 1380 D Te ontvangen provisie 1400 D Vooruitbet. huisvestingsk 1410 D Vooruitbet. reclamekosten 1420 D Vooruitbet. verzekering 1430 D Vooruitbet. autokosten 1440 C Vooruitbet. kantoorartikelen 23 Effecten 900 D Aandelen 910 D Obligaties 24 Liquide middelen 1000 D Kas 1100 D ABN AMRO Bank 1101 D ABN AMRO Bank G-rekening 1110 D ING Bank 1120 D Postbank 1130 C Rabobank 1140 C VSB Bank 1150 D Deposito 1190 D Kruisposten 1191 D Kruisposten Kas 1192 D Kruisposten overboekingen 25 Tussenrekeningen 2000 C Vraagposten 2200 D Kostenspreiding vordering 2210 C Kostenspreiding schulden 2400 C Onbekende betalingen 2900 D Correctierekening 3 Eigen vermogen 31 Aandelenkapitaal 500 C Geplaatst kapitaal :koppeling=winst 32 Reserves 510 C Wettelijke reserve 520 C Algemene reserve 530 C Winst lopend boekjaar 540 C Ingehouden Winst 550 C Onverdeelde Winst 34 Voorzieningen 700 C Pensioenvoorziening 710 C Stamrechtverplichting 720 C Voorz. latente belasting 740 C Voorziening onderhoud 4 Vreemd vermogen 41 Kredietinstellingen lang 800 C Hypotheek bedrijfspand 810 C Lening Bank 811 C Middellang krediet Bank 820 C Financiallease auto 42 Groepsmaatschappijen lang 830 C Lening B.V. C 831 C Lening B.V. D 43 Aandeelhouders lang 860 C Lening o/g de heer A # o/g = geleend geld 861 C Lening o/g de heer B 44 Overige schulden lang 870 C Overige leningen o/g 890 C Overige schulden lang 46 Leveranciers kredieten 1600 C Crediteuren :koppeling=crd 1620 C Crediteuren vorig boekjaar 1650 C Nog te ontvangen fakturen 47 Groepsmaatschappijen kort 1940 C Rekening-courant B.V. C 1941 C Rekening-courant B.V. D 48 Belastingen & soc. lasten 1500 C BTW Verkoop Hoog :koppeling=btw_vh 1510 C BTW Verkoop Laag :koppeling=btw_vl 1520 D BTW Inkoop Hoog :koppeling=btw_ih 1530 D BTW Inkoop Laag :koppeling=btw_il 1540 C BTW autokostenverg. 1541 C BTW privégebr. auto 1560 C Omzetbelasting betaald :koppeling=btw_ok 1570 D BTW kleine ondernemersregeling 1700 C Vennootschapsbelasting 1710 C Loonheffing betaald 1711 C Ingehouden loonheffing 1720 C Bedrijfsvereniging betaald 1721 C Berekende premie BVG 1730 C Pensioenpremie betaald 1731 C Berekende pensioenpremie 1740 C VUT premie betaald 1741 C Berekende VUT premie 1750 C Sociaal fonds betaald 1751 C Berekende premie S. Fonds 49 Overige schulden kort 1900 C Aflossingsverplichtingen 1910 C Reservering vakantiegeld 1911 C Reservering vakantiedagen 1920 C Te betalen accountantskosten 1921 C Te betalen advieskosten 1922 C Te betalen autokosten 1923 C Te betalen algem. kosten 1924 C Te betalen personeelskostenn 1925 C Te betalen rente 1926 C Te betalen huisvestingskosten 1927 C Te betalen dividend 1929 C Te betalen overige kosten 1950 C Netto lonen en salarissen 1960 C Pensioen verzekeringsmij. 1990 C Diverse schulden kort 11 Belastingen 91 Belastingen 1550 C BTW Import 9800 D Vennootschapsbelastingen 9810 D Belasting voorgaande jaren Resultaatrekeningen 5 Bedrijfsopbrengsten 51 Netto omzet 8000 O Omzet BTW Hoog :btw=hoog 8100 O Omzet BTW Laag :btw=laag 8200 O Omzet BTW Geen 8600 O Omzet diversen BTW Hoog :btw=hoog 8610 O Omzet diversen BTW Laag :btw=laag 8620 O Omzet diversen BTW Geen 8900 K Betalingskorting verkoop 8910 K Korting verkoop 8920 K Prijsverschillen verkoop 52 Kostprijs van de omzet 7000 K Inkopen BTW Hoog :btw=hoog 7100 K Inkopen BTW Laag :btw=laag 7200 K Inkopen BTW Geen 7600 K Inkopen diversen :btw=hoog 7700 K Mutatie eindvoorraad 7900 K Betalingskorting inkoop 7920 K Prijsverschillen inkoop 53 Overige bedrijfsopbrengst 8680 O Omzet naar kosten BTW Hoog :btw=hoog 8690 K Doorbelaste omzet naar kosten 8700 K Kleine ondernemersregeling 8800 K Huuropbrengst 6 Personeelskosten 60 Lonen en salarissen 4000 K Bruto lonen 4001 K Tantieme 4002 K Gratificaties 4010 K Overhevelingstoeslag 4020 K Premiespaarregeling 4021 K Loonheffing spaarregeling 4070 K Mutatie vakantiegeld 4071 K Mutatie vakantiedagen 4080 K Ontvangen ziekengeld 4090 K Doorberekende salarissen 61 Sociale lasten 4100 K Bedrijfsvereniging 4101 K Ingehouden bedrijfsvereneniging 4110 K VUT premie 4111 K Ingehouden VUT premie 4120 K Sociaal fonds 4121 K Ingehouden sociaal fonds 4130 K Pensioenpremie 4131 K Ingehouden pensioenpremie 4140 K Ziekteverzuimverzekering 4150 K Ziektekostenverzekering 4151 K Bijdrage ziektekostenverzekering 4170 K Soc. lasten vakantiegeld 4171 K Soc. lasten vakantiedagen 4180 K Soc. lasten ontv. ziekengeld 4190 K Doorberekende soc. lasten 62 Overige personeelskosten 4200 K Reiskostenvergoedingen 4210 K Vaste reiskostenvergoedingen 4220 K Vrijgestelde vergoedingen 4230 K Studiekosten 4240 K Kostenvergoeding 4250 K Representatie vergoeding 4260 K Uitzendburo :btw=hoog 4270 K Kantine en consumptie 4290 K Diverse personeelskosten 7 Afschrijvingen 64 Afschrijving immateriele vaste activa 4380 K Afschr. kosten goodwill 4390 K Afschr. kosten aanloopkosten 8 Overige bedrijfslasten 63 Afschrijving materiële vaste activa 4300 K Afschr. kosten gebouwen 4310 K Afschr. kosten verbouwing 4320 K Afschr. kosten mach. & install. 4330 K Afschr. kosten inv. & inr. 4340 K Afschr. kosten computers 4350 K Afschr. kosten auto's 4360 K Res. verkoop mat. vaste activa 65 Huisvestingskosten 4500 K Huur bedrijfspand :btw=hoog 4510 K Servicekosten :btw=hoog 4520 K Gas, water & electra 4530 K Vaste lasten 4540 K Onderhoud bedrijfspand :btw=hoog 4550 K Schoonmaakkosten :btw=hoog 4560 K Verzekering bedrijfspand 4590 K Overige huisvestingskosten :btw=hoog 66 Autokosten 4600 K Leasekosten auto :btw=hoog 4610 K Brandstof auto :btw=hoog 4620 K Onderhoud auto :btw=hoog 4630 K Verzekering auto 4640 K Kilometervergoedingen 4650 K Huur auto :btw=hoog 4660 K BTW privégebruik auto 4670 K Boetes 4671 K Boetes 0% aftrekbaar 4690 K Overige autokosten :btw=hoog 67 Verkoopkosten 4700 K Reclamekosten :btw=hoog 4710 K Advertentiekosten :btw=hoog 4711 K Sponsoring 4720 K Beurskosten :btw=hoog 4730 K Relatiegeschenken 4740 K Reis- en verblijfkosten :btw=hoog 4741 K Reis- en verblijfk. 90% 4742 K Voedsel en drank 90% 4750 K Representatiekosten :btw=hoog 4751 K Representatiekosten 90% 4760 K Credit-cardkosten 4770 K Factoringkosten :btw=hoog 4780 K Kasverschillen 4790 K Overige verkoopkosten :btw=hoog 68 Distributiekosten 4800 K Verzending portikosten 4810 K Vervoerskosten :btw=hoog 4890 K Overige distributiekosten :btw=hoog 69 Algemene kosten 4900 K Telefoon- en faxkosten :btw-hoog 4905 K Internetkosten :btw=hoog 4910 K Contributies & abonnement :btw=hoog 4920 K Verzekering algemeen 4930 K Kantoorartikelen :btw=hoog 4931 K Kleine aanschaf kantoor :btw=hoog 4932 K Vakliteratuur 4940 K Accountantskosten :btw=hoog 4941 K Administratiekosten :btw=hoog 4942 K Loonadministratiekosten :btw=hoog 4943 K Notaris & advocaatkosten :btw=hoog 4950 K Drukwerk & papier :btw=hoog 4960 K Branche-organisatiekosten 4970 K Postzegels 4980 K Bankkosten 4990 K Overige algemene kosten :btw=hoog 4991 K Bijzondere baten & lasten 9 Financiële baten & lasten 71 Rente baten 9000 K Rente bate deposito 9030 K Rente bate lening B.V. 9040 K Rente bate lening u/g 9050 K Rente bate ABN AMRO Bank 9051 K Rente bate ING Bank 9052 K Rente bate Postbank 9053 K Rente bate Rabobank 9054 K Rente bate VSB Bank 9070 K Rente bate aandeelhouder 9080 K Rente bate belastingen 9090 K Rente bate overige 72 Rente- en overige financiële lasten 9100 K Rente last hypotheek pand 9110 K Rente last lening bank 9111 K Rente last m.l. krediet 9120 K Rente last fin. lease auto 9130 K Rente last lening B.V. 9140 K Rente last lening o/g 9150 K Rente last ABN AMRO bank 9151 K Rente last ING Bank 9152 K Rente last Postbank 9153 K Rente last Rabobank 9154 K Rente last VSB Bank 9160 K Rente last factormaatschappij 9170 K Rente last aandeelhouder 9180 K Rente last belastingen 9190 K Rente last overige 73 Opbrengst overige activa 9200 K Opbrengst effecten 9210 K Mutatie effecten 10 Resultaat deelnemingen 81 Consolidatie deelnemingen 9500 K Resultaat boekjaar B.V. A 9501 K Resultaat boekjaar B.V. B 82 Overige deelnemingen 9510 K Resultaat boekjaar B.V. C 9511 K Resultaat boekjaar B.V. D 12 Buitengewone baten & lasten 95 Buitengewone baten 9900 K Buitengewone baten 9901 K Belasting buiteng. baten 97 Buitengewone lasten 9910 K Buitengewone lasten 9911 K Belasting buiteng. lasten # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. # De optie :dc kan worden gebruikt om aan te geven dat het journaal # voor dit dagboek de boekstuktotalen in gescheiden debet en credit # moet tonen. Dagboeken A Voorraad :type=memoriaal B ING-Bank :type=bank :rekening=1110 I Inkopen :type=inkoop K Kas :type=kas :rekening=1000 M Memoriaal :type=memoriaal P Postbank :type=bank :rekening=1120 R Rabobank :type=bank :rekening=1130 S Spreiding :type=memoriaal V Verkopen :type=verkoop # BTW TARIEVEN # # Er zijn vijf tariefgroepen: "hoog", "laag", "nul", "privé" en # "anders". De tariefgroep bepaalt het rekeningnummer waarop de # betreffende boeking plaatsvindt. # Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit # in de praktijk niet snel zal voorkomen. # In de eerste kolom wordt de (numerieke) code voor dit tarief # opgegeven. Deze kan o.m. worden gebruikt om expliciet een BTW tarief # op te geven bij het boeken. Voor elk gebruikt tarief (behalve die # van groep "nul") moet het percentage worden opgegeven. Met de # aanduiding :exclusief kan worden opgegeven dat boekingen op # rekeningen met deze tariefgroep standaard het bedrag exclusief BTW # aangeven. # # BELANGRIJK: Mutaties die middels de command line shell of de API # worden uitgevoerd maken gebruik van het geassocieerde BTW tarief van # de grootboekrekeningen. Wijzigingen hierin kunnen dus consequenties # hebben voor de reeds in scripts vastgelegde boekingen. BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 19% incl. :tariefgroep=hoog :perc=19,00 2 BTW 19% excl. :tariefgroep=hoog :perc=19,00 :exclusief 3 BTW 6% incl. :tariefgroep=laag :perc=6,00 4 BTW 6% excl. :tariefgroep=laag :perc=6,00 :exclusief 5 BTW 12% autokostenvergoeding :tariefgroep=hoog :perc=12,00 :exclusief 6 BTW privégebruik auto 12% :tariefgroep=nul 7 BTW kleine ondernemersregeling :tariefgroep=nul EekBoek-2.02.04/lib/EB/examples/nl/mutaties.eb0000444000076500007650000002035412165465617016463 0ustar jvjv# Content-Type: text/plain; charset = UTF-8 # Inkopen (Dagboek: Inkoop) # Algemene vorm van de opdrachten: # # dagboek [ datum ] argumenten # # Argumenten inkoop: "Omschrijving" crediteurcode boekstukregel # Boekstukregel: "Omschrijving" bedrag [ grootboekrekening ] # # Standaard wordt de met deze crediteur geassocieerde # grootboekrekening gebruikt (zie relaties.eb). # # Standaard wordt het met de grootboekrekening geassocieerde BTW # tarief gebruikt. Dit kan worden gewijzigd door een toevoeging aan # het bedrag: # @0 geen BTW # @H pas het hoge tarief toe # @L pas het lage tarief toe # @n pas BTW code n toe (afgeraden) # # Een credit-boeking kan worden gespecificeerd door een negatief # bedrag. # Enkelvoudig, met één enkele boekstukregel. inkoop 05-01 "Internet" XS4ALL "ADSL" 22,80 # Meerdere boekstukregels; de grootboekrekening is dan verplicht. # De totaaltelling is optioneel, maar sterk aangeraden om fouten # te voorkomen. inkoop 15-01 "ADSL + Telefoon" KPN --totaal=104,65 \ "ADSL" 24,20 6905 \ "Telefoonkosten" 80,45 6900 inkoop 09-02 "Internet" XS4ALL "ADSL" 22,80 inkoop 08-03 "Internet" XS4ALL "ADSL" 22,80 inkoop 18-03 "Telefoonkosten" KPN "ADSL + Telefoon" 101,52 inkoop 05-04 "Internet" XS4ALL "ADSL" 22,80 inkoop 10-05 "Internet" XS4ALL "ADSL" 22,80 inkoop 20-05 "Telefoonkosten" KPN "ADSL + Telefoon" 102,22 inkoop 07-06 "Internet" XS4ALL "ADSL" 22,80 inkoop 05-07 "Internet" XS4ALL "ADSL" 22,80 inkoop 15-07 "Telefoonkosten" KPN "ADSL + Telefoon" 104,66 inkoop 09-08 "Internet" XS4ALL "ADSL" 22,80 inkoop 06-09 "Internet" XS4ALL "ADSL" 22,80 inkoop 16-09 "Telefoonkosten" KPN "ADSL + Telefoon" 108,72 inkoop 11-10 "Internet" XS4ALL "ADSL" 22,80 inkoop 07-11 "Internet" XS4ALL "ADSL" 2*11+0,80 inkoop 17-11 "Telefoonkosten" KPN "ADSL + Telefoon" 109,67 inkoop 06-12 "Internet" XS4ALL "ÁDSL" 22,80 # Expliciet boekstuknummer: inkoop:20 07-12 "Internet" XS4ALL "ADSL" 22,80 # Verwijderen: inkoop:23 07-12 "Internet" XS4ALL "ÄDSL" 22,80 verwijder inkoop:23 # Verkopen (Dagboek: Verkoop) # # Argumenten verkoop: "Omschrijving" debiteurcode boekstukregel # Boekstukregel: "Omschrijving" bedrag [ grootboekrekening ] # # Standaard wordt de met deze debiteur geassocieerde # grootboekrekening gebruikt (zie file relaties.eb). # # Zie de beschrijving bij Inkopen voor de mogelijkheden het # toegepaste BTW tarief te specificeren. # # Meerdere boekstukregels zijn mogelijk; de grootboekrekening is dan # verplicht. Zie bij Inkopen voor een voorbeeld. # # Een debet-boeking kan worden gespecificeerd door een negatief # bedrag. verkoop 18-02 "Perl Cursus" ACME "Perl Cursus 1e bet." 3.570 8400 verkoop 18-03 "Perl Cursus" ACME "Perl Cursus 2e bet." 3,570 8400 verkoop 18-04 "Perl Cursus" ACME "Perl Cursus rest" 600 8400 verkoop 12-05 "Perl Cursus" ACME "Perl Cursus rest" -5 8400 verkoop 14-05 "Ondersteuning" ACME "Consultancy" 714 verkoop 16-07 "Ondersteuning" ACME "Consultancy" 714 verkoop 19-08 "Pocket Reference" ORA "Produktie boek" 1.000 8300 # Bank (Dagboek: Postbank) # # Argumenten bankboeking: "Omschrijving" boekstukregel # Boekstukregel: # std "Omschrijving" bedrag grootboekrekening # crd "Omschrijving" crediteurcode bedrag (negatief!) # deb "Omschrijving" debiteurcode bedrag # # Standaard wordt het eerste met deze crediteur/debiteur geassocieerde # open inkoop/verkoop-boekstuk afgeboekt. # # Voor deze boekingen geldt dat een negatief getal het banksaldo # vermindert, en een positief getal het saldo vermeerdert. # # 'std' boekingen met BTW zijn ongebruikelijk. # Daarom moet in dat geval de toepassing van BTW expliciet worden # opgegeven met de "@" toevoeging: # @0 geen BTW (onderdrukt de warschuwing) # @H pas het hoge tarief toe # @L pas het lage tarief toe # @n pas BTW code n toe (afgeraden) # BTW wordt geboekt op de BTW-Omzetrekening voor positieve bedragen, # en op de BTW-Kostenrekening voor negatieve bedragen. Dit kan worden # gewijzigd door aan de codering een "O" (Omzet) of "K" (Kosten) toe # te voegen. # # Door het eindsaldo op te geven wordt dit geverifieerd. postbank 31-01 "Afschrift 1" --saldo=1001,77 \ std 06-01 "Girotel" -2,70 6980 \ crd 19-01 XS4ALL -22,80 \ crd 31-01 KPN -104,65 postbank 28-02 "Afschrift 2" --saldo=976,27 \ std 10-02 "Girotel" -2,70 6980 \ crd 23-02 XS4ALL -22,80 postbank 31-03 "Afschrift 3" --saldo=4419,25 \ std 09-03 "Girotel" -2,70 6980 \ deb 18-03 ACME 3570,00 \ crd 31-03 XS4ALL -22,80 \ crd 31-03 KPN -101,52 postbank 30-04 "Afschrift 4" --saldo=7963,75 \ std 06-04 "Girotel" -2,70 6980 \ crd 06-04 XS4ALL -22,80 \ deb 12-04 ACME 3570,00 postbank 31-05 "Afschrift 5" --saldo=8436,03 \ std 11-05 "Girotel" -2,70 6980 \ crd 31-05 XS4ALL -22,80 \ deb 31-05 ACME 600,00 \ crd 31-05 KPN -102,22 postbank 30-06 "Afschrift 6" --saldo=9119,53 \ std 08-06 "Girotel" -2,70 6980 \ deb 08-06 ACME 714,00 \ deb 12-06 ACME -5,00 \ crd 21-06 XS4ALL -22,80 postbank 31-07 "Afschrift 7" --saldo=8989,37 \ std 06-07 "Girotel" -2,70 6980 \ crd 30-07 XS4ALL -22,80 \ crd 31-07 KPN -104,66 postbank 31-08 "Afschrift 8" --saldo=10.677,87 \ std 10-08 "Girotel" -2,70 6980 \ deb 10-08 ACME 714,00 \ crd 10-08 XS4ALL -22,80 \ deb 19-08 ORA 1000,00 postbank 30-09 "Afschrift 9" --saldo=10.543,65 \ std 17-09 "Girotel" -2,70 6980 \ crd 30-09 XS4ALL -22,80 \ crd 30-09 KPN -108,72 postbank 31-10 "Afschrift 10" --saldo=10518,15 \ std 12-10 "Girotel" -2,70 6980 \ crd 13-10 XS4ALL -22,80 postbank 30-11 "Afschrift 11" --saldo=10.382,98 \ std 08-11 "Girotel" -2,70 6980 \ crd 30-11 XS4ALL -22,80 \ crd 30-11 KPN -109,67 # Er kan een expliciet volgnummer worden opgegeven. postbank:12 07-12 "Afschrift 12" --saldo 10357.48 \ std 06-12 "Girotel" -2,70 6980 \ crd 07-12 XS4ALL -22,80 # Partiele betalingen door het boekstuk op te geven i.p.v. de # debiteur/crediteur. postbank 09-12 "Eerste deel ADSL" --saldo=10,347.48 \ crd 09-12 Inkoop:20 -10,00 # De rest van de betaling kan met opgave van boekstuk, maar natuurlijk # ook op de 'handige' manier waarbij EekBoek het zelf uitzoekt. postbank 10-12 "Tweede deel ADSL" --saldo=10334,68 \ crd 10-12 XS4ALL -12,80 # Afschrijvingen # # Memoriaal is als een bankboeking, maar er is geen impliciete # grootboekrekening waarop het totaal wordt geboekt. Het boekstuk moet # dus precies in balans zijn. # Ook hier geldt dat een positief bedrag de betreffende rekening # crediteert (vermeerdert) en een negatief bedrag vermindert. # Eveneens van toepassing is de opmerking bij Bankboekingen over 'std' # boekingen met BTW. memoriaal 31-12 "Afschrijving inventaris" \ std "Afschrijving" -411,26 6800 \ std "Afschrijving" 411,26 1101 memoriaal 31-12 "Afschrijving computers" \ std "Afschrijving" -396,82 6810 \ std "Afschrijving" 396,82 1111 # Rapportages voor de accountant. # balans --output=out/balans.html # balans --detail=2 --output=out/balans2.html # result --output=out/result.html # result --detail=2 --output=out/result2.html # journaal --output=out/journaal.html # grootboek --output=out/grootboek.html # btwaangifte --output=out/btwaangifte.html # openstaand --output=out/openstaand.html EekBoek-2.02.04/lib/EB/examples/nl/vereniging.dat0000444000076500007650000002673512165465617017160 0ustar jvjv# Voorbeeld EekBoek Rekeningschema -*- coding: utf-8 -*- # Content-Type: text/plain; charset = UTF-8 # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # :btw=privé # :btw=anders # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ph idem, privé, hoog tarief # btw_pl idem, laag tarief # btw_ah idem, anders, hoog tarief # btw_al idem, laag tarief # btw_ok rekening voor de betaalde BTW # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. Verdichting 9 99 # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Balansrekeningen 1 Vaste Activa 12 Materiele vaste activa 1210 D Schouw 1211 C Afschrijving Schouw 1220 D Buitenboordmotor 10pk 1221 C Afschrijving Buitenboordmotor 10pk 2 Vlottende activa 21 Vooraden 2110 D Voorraad Educatief Materiaal 22 Vorderingen 2200 D Debiteuren :koppeling=deb 2210 D Debiteuren Scholenwerkgroep 2220 D Vooruitbetaalde bedragen 24 Liquide middelen 2400 D Kas 2410 D Postbank Bestuur 2420 D Postbank Scholenwerkgroep 2450 D Postbank Plus rekening 2460 D Postbank Loyaal rekening 2490 D Kruisposten 3 Eigen vermogen 31 Kapitaal 3100 C Eigen Vermogen :koppeling=winst 32 Reserveringen 3210 C Reservering Gidsencurus 3220 C Reservering Huisvesting 3230 C Reservering Inventaris en Inrichting 3240 C Reservering Materieel 3250 C Reservering Vaartuigen 3260 C Reservering Baggerfonds 3270 C Reservering Jubileum 4 Vreemd vermogen 46 Leveranciers kredieten 4600 C Crediteuren :koppeling=crd Resultaatrekeningen 5 Opbrengsten 50 Tussenrekeningen opbrengsten 5010 O Bijdragen van leden 5011 O Contributie Leden 5012 O Contributie Huisgenootleden 5013 O Contributie donateurs 5014 O Giften bij contributies 5015 O Overige giften 5030 O Bijdragen Rijk/Provincie 5050 O Subsidie Gouda 5060 O Subsidie Reeuwijk 5080 O Rente baten 5090 O Overige baten 51 Baten Bestuur en algemeen 5110 O Bijdragen van leden Bestuur 5120 O Inkomsten uit verkopen Bestuur 5130 O Bijdragen Rijk/Provincie Bestuur 5150 O Subsidie Gouda Bestuur 5160 O Subsidie Reeuwijk Bestuur 5190 O Overige baten Bestuur 52 Baten VLB 5210 O Bijdragen van leden VLB 5220 O Inkomsten uit verkopen VLB 5230 O Bijdragen Rijk/Provincie VLB 5250 O Subsidie Gouda VLB 5260 O Subsidie Reeuwijk VLB 5270 O SOL Subsidies en Bijdragen 5280 O Subsidies Veen 5290 O Overige baten VLB 53 Baten Cursussen 5310 O Bijdragen van leden Cursussen 5320 O Inkomsten uit verkopen Cursussen 5330 O Bijdragen Rijk/Provincie Cursussen 5350 O Subsidie Gouda Cursussen 5360 O Subsidie Reeuwijk Cursussen 5390 O Overige baten Cursussen 54 Baten Excursies 5410 O Bijdragen van leden Excursies 5420 O Inkomsten uit verkopen Excursies 5430 O Bijdragen Rijk/Provincie Excursies 5450 O Subsidie Gouda Excursies 5460 O Subsidie Reeuwijk Excursies 5490 O Overige baten Excursies 55 O Baten Scholen 5510 O Bijdragen van leden Scholen 5520 O Inkomsten uit verkopen Scholen 5530 O Bijdragen Rijk/Provincie Scholen 5550 O Subsidie Gouda Scholen 5560 O Subsidie Reeuwijk Scholen 5590 O Overige baten Scholen 56 Baten Inktzwam 5610 O Bijdragen van leden Inktzwam 5620 O Inkomsten uit verkopen Inktzwam 5630 O Bijdragen Rijk/Provincie Inktzwam 5650 O Subsidie Gouda Inktzwam 5660 O Subsidie Reeuwijk Inktzwam 5690 O Overige baten Inktzwam 57 Baten Evenementen 5710 O Bijdragen van leden Evenementen 5720 O Inkomsten uit verkopen Evenementen 5730 O Bijdragen Rijk/Provincie Evenementen 5750 O Subsidie Gouda Evenementen 5760 O Subsidie Reeuwijk Evenementen 5770 O Subsidie NatuurNetwerk 5780 O Subsidie Zuidhollandse Milieufederatie 5790 O Overige baten Evenementen 58 Baten Educatief Materiaal 5810 O Bijdragen van leden Educatief Materiaal 5820 O Inkomsten uit verkopen Educatief Materiaal 5830 O Bijdragen Rijk/Provincie Educatief Materiaal 5850 O Subsidie Gouda Educatief Materiaal 5860 O Subsidie Reeuwijk Educatief Materiaal 5890 O Overige baten Educatief Materiaal 59 Baten Overig (incidenteel) 5900 O Incidentele baten 6 Kosten werkgroepen 60 Tussenrekeningen kosten # Deze kosten zijn nog te verdelen over de werkgroepen 6010 K Personeelskosten 6020 K Huisvestingskosten 6030 K Organisatiekosten 6040 K Uitvoeringskosten 6090 K Overige kosten 61 Kosten Bestuur en algemeen 6110 K Personeelskosten Bestuur 6120 K Huisvestingskosten Bestuur 6130 K Organisatiekosten Bestuur 6140 K Uitvoeringskosten Bestuur 6150 K Kosten Ledenvergadering 6160 K Afdracht district ZH 6170 K Afdracht landelijk IVN 6180 K Bankkosten 6190 K Overige kosten Bestuur 62 Kosten Werkgroep VLB 6210 K Personeelskosten VLB 6220 K Huisvestingskosten VLB 6230 K Organisatiekosten VLB 6240 K Uitvoeringskosten VLB 6250 K Afschrijvingskosten VLB 6290 K Overige kosten VLB 63 Kosten Werkgroep Cursussen 6310 K Personeelskosten Cursussen 6320 K Huisvestingskosten Cursussen 6330 K Organisatiekosten Cursussen 6340 K Uitvoeringskosten Cursussen 6390 K Overige kosten Cursussen 64 Kosten Werkgroep Excursies en Lezingen 6410 K Personeelskosten Excursies en Lezingen 6420 K Huisvestingskosten Excursies en Lezingen 6430 K Organisatiekosten Excursies en Lezingen 6440 K Uitvoeringskosten Excursies 6450 K Uitvoeringskosten Lezingen 6490 K Overige kosten Excursies 65 Kosten Werkgroep Scholen 6510 K Personeelskosten Scholen 6520 K Huisvestingskosten Scholen 6530 K Organisatiekosten Scholen 6540 K Uitvoeringskosten Scholen 6590 K Overige kosten Scholen 66 Kosten Werkgroep Inktzwam en PR 6610 K Personeelskosten Inktzwam 6620 K Huisvestingskosten Inktzwam 6630 K Organisatiekosten Inktzwam 6640 K Uitvoeringskosten Inktzwam 6650 K Kosten Website 6660 K Kosten PR 6670 K Drukkosten Inktzwam 6680 K Portokosten Inktzwam 6690 K Overige kosten Inktzwam 67 Kosten Werkgroep Evenementen 6710 K Personeelskosten Evenementen 6720 K Huisvestingskosten Evenementen 6730 K Organisatiekosten Evenementen 6740 K Uitvoeringskosten Evenementen 6750 K Uitvoeringskosten Seizoensopening 6760 K Uitvoeringskosten Symposium 6790 K Overige kosten Evenementen 68 Kosten Werkgroep Educatied Materiaal 6810 K Personeelskosten Educatief Materiaal 6820 K Huisvestingskosten Educatief Materiaal 6830 K Organisatiekosten Educatief Materiaal 6840 K Uitvoeringskosten Educatief Materiaal 6890 K Overige kosten Educatief Materiaal 69 Overige kosten (incidenteel) 6900 K Incidentele kosten # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. # De optie :dc kan worden gebruikt om aan te geven dat het journaal # voor dit dagboek de boekstuktotalen in gescheiden debet en credit # moet tonen. Dagboeken Ink Inkoop :type=inkoop Kas Kas :type=kas :rekening=2400 :dc Mem Memoriaal :type=memoriaal P_B Postbank_bestuur :type=bank :rekening=2410 :dc P_S Postbank_scholen :type=bank :rekening=2420 :dc P_P Postbank_plus :type=bank :rekening=2450 :dc P_L Postbank_Loyaal :type=bank :rekening=2460 :dc Ver Verkoop :type=verkoop # Einde EekBoek schema EekBoek-2.02.04/lib/EB/examples/nl/ondernemer.dat0000444000076500007650000005153712165465617017157 0ustar jvjv# EekBoek Rekeningschema, gebaseerd op een voorbeeld van Johan Vromans. -*- coding: utf-8 -*- # Aangemaakt op 2008-12-18 # First published: 2009-05-03 (version: 1.0). # Versie 1.1, laatst gewijzigd op 2009-05-06 # Dit schema sluit aan bij de Aangifte inkomstenbelasting 2008 voor ondernemers. # Laatste versie: http://yellowmatter.dyndns.org/accounting/eekboek/schema/ondernemers/ # Author: Jaap van Wingerde, # e-mail: <1234567890@vanwingerde.net>. # EekBoek is een electronisch boekhoudprogramma door Johan Vromans # bedoeld voor het midden- en # kleinbedrijf , # . # # Content-Type: text/plain; charset = UTF-8 # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # :btw=privé # :btw=anders # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ph idem, privé, hoog tarief # btw_pl idem, laag tarief # btw_ah idem, anders, hoog tarief # btw_al idem, laag tarief # btw_ok rekening voor de betaalde BTW # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Verdichting 99 9999 Balansrekeningen ### Overzicht activa 01 Immateriële vaste activa 0101 Goodwill 010199 D Goodwill 0102 Vergunningen, concessies en intellectule eigendommen 010299 D Vergunningen, concessies en intellectule eigendommen 0103 Kosten van onderzoek en ontwikkeling 010399 D Kosten van onderzoek en ontwikkeling 0104 Vooruitbetaald op immateriële vaste activa 010499 D Vooruitbetaald op immateriële vaste activa 0105 Overige immateriële vaste activa 010599 D Overige immateriële vaste activa 02 Materiële vaste activa 0201 (Bedrijfs)gebouwen inclusief ondergrond 020199 D (Bedrijfs)gebouwen inclusief ondergrond 0202 (Bedrijfs)terreinen 020299 D (Bedrijfs)terreinen 0203 Machines en installaties 020399 D Machines en installaties 0204 Inventaris 020400 D Inrichting :kosten 020401 C Afschrijving inrichting # zie 280501 020402 D Gereedschappen 020403 C Afschrijving gereedschappen # zie 280503 020498 D Overige inventaris 020499 C Afschrijving overige inventaris # zie 280599 0205 Auto's en overige transportmiddelen 020598 D Auto's en overige transportmiddelen 020599 C Afschrijving auto's en overige transportmiddelen 0206 Vaste bedrijfsmiddelen in uitvoering en vooruitbetaald op materiële vaste activa 020698 D Vaste bedrijfsmiddelen in uitvoering en vooruitbetaald op materiële vaste activa 020699 C Afschrijving vaste bedrijfsmiddelen in uitvoering en vooruitbetaald op materiële vaste activa 0207 Overige materiële vaste activa 020798 D Overige materiële vaste activa :kosten 020799 C Afschrijving overige materiële vaste activa 03 Voorraden 0301 Grond- en hulpstoffen 030199 D Grond en hulpstoffen 0302 Onderhanden werk 030299 D Onderhanden werk 0303 Gereed product en handelsgoederen 030301 D Voorraad <1> 030302 D Voorraad <2> 030303 D Voorraad <3> 030304 D Voorraad <4> 030399 D Voorraad <5> 0304 Vooruitbetaald op voorraden 030499 D Vooruitbetaald op voorraden :kosten 04 Vorderingen op overlopende activa 0401 Vordering omzetbelasting 040108 D 2008 040109 D 2009 040110 D 2010 040199 D Overige vordering omzetbelasting 0402 Kortlopende vorderingen op gelieerde maatschappijen 040299 D Kortlopende vorderingen op gelieerde maatschappijen 0403 Kortlopende vorderingen op participanten 040399 D Kortlopende vorderingen op participanten 0404 Vorderingen op handelsdebiteuren 040401 D Vordering 040499 D Vorderingen op handelsdebiteuren :koppeling=deb 0405 Overlopende activa 040599 D Overlopende activa 0406 Overige overlopende vorderingen 040699 D Overige overlopende vorderingen 05 Effecten 0501 Effecten 050199 D Effecten 06 Liquide middelen 0601 Banktegoeden 060100 D 060199 D Overige banktegoeden 0602 Overige liquide middelen 060200 D Kas 060201 D Borg 060290 D Kruisposten 060299 D Overige liquide middelen ### Overzicht passiva 07 Ondernemingsvermogen en privé stortingen en ontrekkingen 0701 Eigen vermogen 070100 C Eigen vermogen :koppeling=winst 0702 Egalisatiereserve 070299 C Egalisatiereserve 0703 Reserve assurantie eigen risico 070399 C Reserve assurantie eigen risico 0704 Exportreserve 070499 C Exportreserve 0705 Herinvesteringsreserve 070599 C Herinvesteringsreserve 0706 Oudedagsreserve 070699 C Oudedagsreserve 08 Privé onttrekkingen en stortingen 0801 Privé onttrekkingen 080100 D in contanten 080101 D in natura en goederen 080102 D privé gebruik woning 080103 D privé gebruik auto van onderneming 080199 D overige privé onttrekkingen 0802 Privé stortingen 080200 C betalingen uit privé 080201 C gebruik privé auto 080299 C overige privé stortingen 0803 Kosten privé auto inclusief 19% OB 080301 D onderhoud en reparatie 080302 D onderdelen 080303 D brandstof 080399 D overige gebruikskosten 09 Terugkeerreserve 0901 Terugkeerreserve 090100 C Vorming positieve terugkeerreserve 090101 D Vorming negatieve terugkeerreserve 10 Voorzieningen 1001 Garantievoorziening 100199 C Garantievoorziening 1002 Lijfrentevoorziening 100299 C Lijfrentevoorziening 1003 Pensioenvoorziening 100399 C Pensioenvoorziening 1004 VUT-voorziening 100499 C VUT-voorziening 1005 Milieuvoorziening 100599 C Milieuvoorziening 1009 Overige voorzieningen 100999 C Overige voorzieningen 11 Schulden en overlopende passiva 1101 Onderhandse leningen 110100 C Lening <1> 110101 C Lening <2> 110102 C Lening <3> 110103 C Lening <4> 110104 C Lening <5> 110105 C Lening <6> 110106 C Lening <7> 110199 C Overige onderhandse leningen 1102 Obligaties 110299 C Obligaties 1103 Schulden aan kredietinstellingen 110399 C Schulden aan kredietinstellingen 1104 Schulden aan leveranciers en handelskredieten 110401 C Openstaande creditfactuur 110402 C Openstaande factuur 110499 C Schulden aan leveranciers en handelskredieten :koppeling=crd 1105 Schulden aan gelieerde maatschappijen 110599 C Schulden aan gelieerde maatschappijen 1106 Schulden aan participanten 110699 C Schulden aan participanten 1107 Loonbelasting en premie volksverzekeringen 110799 C Loonbelasting en premie volksverzekeringen 1108 Premies werknemersverzekeringen 110899 C Premies werknemersverzekeringen 1109 Omzetbelasting lopend jaar 110900 C OB Verkoop Hoog :koppeling=btw_vh 110901 C OB Verkoop Laag :koppeling=btw_vl 110902 C OB Verkoop overige tarieven, behalve 0% 110903 C OB verlegd 110910 C OB Leveringen uit landen buiten de EU (invoer) 110911 C OB Verwervingen van goederen uit landen binnen EU 110920 D OB Inkoop Hoog :koppeling=btw_ih 110921 D OB Inkoop Laag :koppeling=btw_il 110980 C Kleine ondernemersregeling omzetbelasting 110990 C Afrondingsverschillen Omzetbelasting 110999 C Betaalde omzetbelasting 1110 Omzetbelasting andere jaren 111006 C Omzetbelasting 2006 111007 C Omzetbelasting 2007 111008 C Omzetbelasting 2008 111009 C Omzetbelasting 2009 :koppeling=btw_ok 111010 C Omzetbelasting 2010 111011 C Omzetbelasting 2011 111012 C Omzetbelasting 2012 111013 C Omzetbelasting 2013 111014 C Omzetbelasting 2014 1111 Overlopende passiva 111199 C Overlopende passiva 1112 Overige schulden 111299 C Overige schulden Resultaatrekeningen ## Opbrengsten 12 Netto-omzet 1200 Netto omzet 120000 O Omzet <1> 120001 O Omzet <2> 120002 O Omzet <3> 120003 O Omzet <4> 120004 O Omzet <5> 120005 O Omzet <6> 120006 O Omzet <7> 120007 O Omzet <8> 120091 O Kleine ondernemersregeling omzetbelasting 120092 O Afrondingsverschillen omzetbelasting 120099 O Omzet overig 13 Wijzigingen in voorraden gereed product en onderhanden werk 1300 Wijzigingen in onderhanden werk 130000 O 130099 O Overige Wijziging in onderhanden werk 1301 Wijziging in voorraden gereed product 130199 O Overige Wijziging in voorraden gereed product 1400 Geactiveerde productie voor het eigen bedrijf 140099 O Geactiveerde productie voor het eigen bedrijf 15 Opbrengsten van vorderingen op gelieerde maatschappijen 1500 Opbrengsten van vorderingen op gelieerde maatschappijen 150099 O Opbrengsten van vorderingen op gelieerde maatschappijen 16 Boekwinst op activa 1600 Boekwinst op activa 160099 O Boekwinst op activa 17 Opbrengst van vorderingen op participanten 1700 Opbrengst van vorderingen op participanten 18 Opbrengst van banktegoeden 1800 Opbrengst van banktegoeden 180099 O rente 19 Opbrengsten van overige vorderingen 1900 Opbrengsten van overige vorderingen 190099 O Opbrengsten van overige vorderingen 20 Ontvangen divident 2000 Ontvangen divident 200099 O Ontvangen divident 21 Waarderingsvermeerdering van vorderingen 2100 Waarderingsvermeerdering van vorderingen 210099 O Waarderingsvermeerdering van vorderingen 22 Waarderingsvermeerdering van immateriële en materiële vaste activa 2200 Waarderingsvermeerdering van immateriële en materiële vaste activa 220099 O Waarderingsvermeerdering van immateriële en materiële vaste activa 23 Bijzondere waarderingsvermeerdering van vlottende activa 2300 Bijzondere waarderingsvermeerdering van vlottende activa 230099 O Bijzondere waarderingsvermeerdering van vlottende activa 24 Waarderingsvermeerdering van effecten 2400 Waarderingsvermeerdering van effecten 240099 O Waarderingsvermeerdering van effecten 25 Overige opbrengsten 2500 Overige opbrengsten 250000 O Subsidies 250050 O Afrondingsverschillen 250099 O Overige opbrengsten ## Kosten 26 Inkoopkosten, uitbesteed werk en dergelijke 2600 Kosten van grond- en hulpstoffen en inkoopprijs van de verkopen 260001 K Inkoop <1> 260002 K Inkoop <2> 260099 K Inkoop overige materialen 2601 Kosten van uitbesteed werk en andere externe kosten 260101 K <1> 260102 K <2> 260103 K <3> 260104 K <4> 260105 K <5> 260106 K <6> 260199 K Overige kosten van uitbesteed werk en andere externe kosten 27 Personeelskosten 2700 Personeelskosten 270001 K Lonen en salarissen 270002 K Arbeidsbeloning aan fiscale partner 270003 K Sociale lasten 270004 K Pensioenlasten 270005 K Overige personeelskosten 270006 O Ontvangen uitkeringen en subsidies 28 Afschrijvingen 2801 Goodwill, vergunningen, concessies en intellectuele eigendommen 280199 K Goodwill, vergunningen, concessies en intellectuele eigendommen 2802 (Bedrijfs)gebouwen 280299 K (Bedrijfs)gebouwen 2803 (Bedrijfs)terreinen 280399 K (Bedrijfs)terreinen 2804 Machines en installaties 280499 K Machines en installaties 2805 Inventaris 280501 K Inrichting 280503 K Gereedschappen 280599 K Overige inventaris 2806 Auto's en overige transportmiddelen 280699 K Auto's en overige transportmiddelen 2899 Overige afschrijvingen 289999 K Overige afschrijvingen 29 Overige bedrijfskosten 2901 Auto- en transportkosten 290100 K Gebruik privé auto 290101 K Huren auto 290102 K Overige kosten huurauto 290109 K Overige autokosten 290111 K Trein 290112 K Bus 290113 K Taxi 290114 K Vliegtuig 290119 K Overig openbaar vervoer 290121 K Bode 290199 K Overige auto- en transportkosten 39 Huisvestingskosten 3901 Huisvestingskosten 390100 K Huur 390101 K Parkeervergunning 390199 K Overige huisvestingskosten 40 Onderhoudskosten van overige materiële vaste activa 4001 Onderhoudskosten van overige materiële vaste activa 400100 K Onderhoudskosten van overige materiële vaste activa 41 Verkoopkosten 4101 Verkoopkosten 410100 K Bemiddelingskosten 410101 K Reclame 410102 K 410103 K Fotografie 410104 K Drukken en printen 410105 K 410106 K Internet 410107 K Porto 410108 K Gemengde kosten 410109 K Hotels 410110 K Google Adwords 410199 K Overige verkoopkosten 42 Kosten van schulden aan gelieerde maatschappijen 4201 Kosten van schulden aan gelieerde maatschappijen 420100 K Kosten van schulden aan gelieerde maatschappijen 43 Kosten van schulden aan particpanten 4301 Kosten van schulden aan particpanten 430100 K Kosten van schulden aan particpanten 44 Kosten van schulden, andere rentelasten en soortgelijke kosten 4401 Kosten van schulden, andere rentelasten en soortgelijke kosten 440100 K Rente bank 440199 K Overige kosten van schulden, andere rentelasten en soortgelijke kosten 45 Waarderingsvermindering van vorderingen 4501 Waarderingsvermindering van vorderingen 450100 K Waarderingsvermindering van vorderingen 46 Waarderingsvermindering van immateriële en materiële vaste activa 4601 Waarderingsvermindering van immateriële en materiële vaste activa 460100 K Waarderingsvermindering van immateriële en materiële vaste activa 47 Bijzondere waarderingsvermindering van vlottende activa 4701 Bijzondere waarderingsvermindering van vlottende activa 470100 K Bijzondere waarderingsvermindering van vlottende activa 48 Waarderingsvermindering van effecten 4801 Waarderingsvermindering van effecten 480100 K Waarderingsvermindering van effecten 49 Andere kosten 4901 Andere kosten 490100 K Telefoon 490101 K Internet 490102 K Contributies 490103 K Verzekeringen 490104 K Vakliteratuur 490105 K Toegangsbewijzen 490106 K Vakbond 490107 K Bank 490108 K Opleidingen 490199 K Overige andere kosten 50 Buitengewone lasten 5001 Afboeking herinvesteringsreserve op gekochte activa 500199 K Afboeking herinvesteringsreserve op gekochte activa 5002 Opheffing negatieve terugkeerreserve 50029 K Opheffing negatieve terugkeerreserve 5003 Overige buitengewone lasten 500000 K 500399 K Overige buitengewone lasten 51 Buitengewone baten 5101 Overige buitengewone baten 510199 O Overige buitengewone baten # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. # De optie :dc kan worden gebruikt om aan te geven dat het journaal # voor dit dagboek de boekstuktotalen in gescheiden debet en credit # moet tonen. Dagboeken I Inkoop :type=inkoop K Kas :type=kas :rekening=060200 M Memoriaal :type=memoriaal B :type=bank :rekening=060100 V Verkoop :type=verkoop # BTW TARIEVEN # # Er zijn vijf tariefgroepen: "hoog", "laag", "nul", "privé" en # "anders". De tariefgroep bepaalt het rekeningnummer waarop de # betreffende boeking plaatsvindt. # Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit # in de praktijk niet snel zal voorkomen. # In de eerste kolom wordt de (numerieke) code voor dit tarief # opgegeven. Deze kan o.m. worden gebruikt om expliciet een BTW tarief # op te geven bij het boeken. Voor elk gebruikt tarief (behalve die # van groep "nul") moet het percentage worden opgegeven. Met de # aanduiding :exclusief kan worden opgegeven dat boekingen op # rekeningen met deze tariefgroep standaard het bedrag exclusief BTW # aangeven. # # BELANGRIJK: Mutaties die middels de command line shell of de API # worden uitgevoerd maken gebruik van het geassocieerde BTW tarief van # de grootboekrekeningen. Wijzigingen hierin kunnen dus consequenties # hebben voor de reeds in scripts vastgelegde boekingen. BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 19% incl. :tariefgroep=hoog :perc=19,00 2 BTW 19% excl. :tariefgroep=hoog :perc=19,00 :exclusief 3 BTW 6,0% incl. :tariefgroep=laag :perc=6,00 4 BTW 6,0% excl. :tariefgroep=laag :perc=6,00 :exclusief # Einde EekBoek schema EekBoek-2.02.04/lib/EB/examples/README0000444000076500007650000000046512165465617014570 0ustar jvjvDeze directory bevat voorbeelden van EekBoek schema's en andere data bestanden. Alle bestanden zijn bedoeld als voorbeeld, en niet om een werkende administratie uit aan te maken. Gebruik daarvoor het bestand sampledb.ebz in de schema directory, of draai ebshell met de command line optie --createsampledb . EekBoek-2.02.04/lib/EB/examples/Kasverkoop.pm0000444000076500007650000000464112165465617016372 0ustar jvjv#! perl # Author : Johan Vromans # Created On : Tue Dec 30 11:56:22 2008 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:48:45 2010 # Update Count : 24 # Status : Unknown, Use with caution! # Om deze module te gebruiken dient deze te worden geplaatst in de # werk-directory. Vervolgens moet aan .eekboek.conf de volgende sectie # worden toegevoegd: # # [shell] # userdefs = Kasverkoop # # De naam achter userdefs moet uiteraard dezelfde zijn als die # waaronder de module is opgeslagen, zonder de ".pm" extensie. package EB::Shell::Kasverkoop; use strict; use warnings; use EB; # Implementatie opdracht "kasverkoop". # # kasverkoop datum debiteur omschrijving bedrag # # Dit wordt omgezet in twee opdrachten: # # verkoop datum Kasboeking debiteur omschrijving bedrag # kas datum omschrijving deb debiteur bedrag sub EB::Shell::do_kasverkoop { my ($self, @args) = @_; # Controleer argumenten. "--nr=.." is een intern doorgegeven # argument wanneer de vorm "kasverkoop:boekstuknummer" wordt # gebruikt. my $bsknr; if ( @args && $args[0] =~ /^--?nr=(.+)/ ) { $bsknr = $1; shift(@args); } my $datum; if ( @args && $args[0] =~/^\d+-\d+(-\d+)?$/ ) { $datum = shift(@args); } else { $datum = iso8601date(); } # Nu moeten nog drie argumenten overblijven. die("Onvoldoende argumenten. Nodig: [ datum ] debiteur omschrijving bedrag\n") unless @args == 3; # Opmaken verkoopboeking. my @cmd1 = qw(verkoop); push(@cmd1, $datum, $args[1], $args[0], $args[1], $args[2]); # Opmaken kasboeking. my @cmd2 = qw(kas); push(@cmd2, "--nr=$bsknr") if $bsknr; push(@cmd2, $datum, $args[1], "deb", $args[0], $args[2]); for my $command ( \@cmd1, \@cmd2 ) { warn("+ @$command\n") if $self->{echo}; my $cmd = shift(@$command); my $m = $self->can("do_$cmd"); die("Onbekende opdracht: $cmd (eigen schuld)") unless $m; my $output = $self->$m(@$command); $self->print("$output\n") if $output; } return; } # En uiteraard, de hulpboodschap. sub EB::Shell::help_kasverkoop { return < Bijvoorbeeld: kasverkoop 28-01 PIETJE "Dansles" 25,00 Dit wordt omgezet in de opdrachten: verkoop 28-01 "Kasverkoop" PIETJE "Dansles" 25,00 kas 28-01 "Kasverkoop" deb PIETJE 25,00 EOD } # Package ends here. 1; EekBoek-2.02.04/lib/EB/examples/eekboek.conf0000444000076500007650000000431212165465617016157 0ustar jvjv; Example EekBoek config file. ; ; This file will be placed in your current directory when you execute ; the command: ; ; $ ebshell --createsampleconfig ; ; Change as needed. See http://www.eekboek.nl/docs/config.html ; for details. ; ; NOTE THAT FOR MOST PURPOSES, ONLY THE DATABASE NAME AND DRIVER NEED ; TO BE SPECIFIED. ALL OTHER SETTINGS MAY REMAIN AS THEY ARE. ; THESE ARE EXAMPLES. See http://www.eekboek.nl/docs/config.html ; for details. [general] ; Location where administrations are placed. ;admdir = $HOME/.eekboek/admdir ; Force wizard even if there's a config file in place. ;wizard = 0 [locale] ; Language selection (for international version only). ; Default value depends on the locale. ;lang = nl_NL [preferences] ; Show journal after each booking. ;journal = 1 [database] ; Name of the database to use. This is the name EekBoek uses to ; identify the database. Note that the actual name as used by the ; database system may be different. ;name = sample ; The database driver (postgres or sqlite). ;driver = sqlite ; Name of the system that runs the database, if not local. ;host = dbhost.example.com ; Access port for the database, if not local. ;port = 5432 ; User to access the database, if not current. ;user = eekboek ; Password for database access, if needed. ;password = secret [strategy] ; Method for rounding numbers (ieee, posix, bankers). ;round = ieee ; Combine bookings to match a payment. ;bkm_multi = 1 ; Do not try an alternative calculation if BTW does not match. ;iv_vc = 0 [shell] ; Private module with EekBoek extensions. ;userdefs = Userdefs ; Abort run when errors are encountered. ;errexit = 0 [format] ; Date format (YYYY-MM-DD, DD-MM-YYY, DD-MM). ;date = DD-MM-YYYY ; Formatted numbers. Only used to specify the decimal point and ; thousands separator. If longer than 9 characters, numwidth (see ; below) is adjusted as well. ;amount = 1234,56 ;amount = 1.234,56 ;amount = 1234.56 ;amount = 1,234.56 [text] ; Column width for amounts in textual reports. ;numwidth = 9 [html] ; Where to find stylesheets. If omitted, default styles will be included. ; See the docs. ;cssdir = css [csv] ; Field separator for generated CSV files. ;separator = , [security] ; None, currently. EekBoek-2.02.04/lib/EB/Config.pm0000444000076500007650000001511612165465617013634 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Config.pm -- Configuration files. # Author : Johan Vromans # Created On : Fri Jan 20 17:57:13 2006 # Last Modified By: Johan Vromans # Last Modified On: Fri Mar 18 20:31:19 2011 # Update Count : 251 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Config; use strict; use warnings; use Carp; use File::Spec; sub init_config { my ($pkg, $opts) = @_; my $app; Carp::croak("Internal error -- missing package arg for __PACKAGE__\n") unless $app = delete $opts->{app}; $app = lc($app); return if $::cfg && $app && $::cfg->{app} eq lc($app); # Pre-parse @ARGV for "-f configfile". my $extraconf = $opts->{config}; my $skipconfig = $opts->{nostdconf}; # Resolve extraconf to a file name. It must exist. if ( $extraconf ) { if ( -d $extraconf ) { my $f = File::Spec->catfile( $extraconf, EB::Config::Handler::std_config($app) ); if ( -e $f ) { $extraconf = $f; } else { $extraconf = File::Spec->catfile($extraconf, EB::Config::Handler::std_config_alt($app)); } } die("$extraconf: $!\n") unless -f $extraconf; } # Build the list of config files. my @cfgs; if ( !$skipconfig ) { @cfgs = ( File::Spec->catfile( "etc", $app, EB::Config::Handler::std_config($app) ), EB::Config::Handler::user_dir ( $app, EB::Config::Handler::std_config($app) ), ); unless ( $extraconf ) { push(@cfgs, EB::Config::Handler::std_config($app)); $cfgs[-1] = EB::Config::Handler::std_config_alt($app) unless -e $cfgs[-1]; } } push(@cfgs, $extraconf) if $extraconf; # Load configs. my $cfg = EB::Config::Handler->new($app); for my $file ( @cfgs ) { next unless -s $file; $cfg->load($file); } if ( $opts->{define} ) { while ( my ($k, $v) = each( %{ $opts->{define} } ) ) { if ( $k =~ /^(\w+(?:::\w+)*)::?(\w+)/ ) { $cfg->newval($1, $2, $v); } else { warn("define error: \"$k\" = \"$v\"\n"); } } } $ENV{EB_LANG} = $cfg->val('locale','lang', $ENV{EB_LANG}||$ENV{LANG}|| ($^O =~ /^(ms)?win/i ? "nl_NL.utf8" : "nl_NL")); $cfg->_plug(qw(locale lang EB_LANG)); $ENV{LANG} = $cfg->val(qw(locale lang)); $cfg->_plug(qw(database name EB_DB_NAME)); if ( my $db = $cfg->val(qw(database name), undef) ) { $db =~ s/^eekboek_//; # legacy $cfg->newval(qw(database name), $db); $ENV{EB_DB_NAME} = $db; } $cfg->_plug(qw(database host EB_DB_HOST)); $cfg->_plug(qw(database port EB_DB_PORT)); $cfg->_plug(qw(database user EB_DB_USER)); $cfg->_plug(qw(database password EB_DB_PASSWORD)); $cfg->_plug(qw(csv separator EB_CSV_SEPARATOR)); $cfg->_plug(qw(internal now EB_SQL_NOW)); $cfg->_plug("internal sql", qw(trace EB_SQL_TRACE)); $cfg->_plug("internal sql", qw(prepstats EB_SQL_PREP_STATS)); $cfg->_plug("internal sql", qw(replayout EB_SQL_REP_LAYOUT)); if ( $cfg->val(__PACKAGE__, "showfiles", 0) ) { warn("Config files:\n ", join( "\n ", $cfg->files ), "\n"); } if ( $cfg->val(__PACKAGE__, "dumpcfg", 0) ) { use Data::Dumper; warn(Dumper($cfg)); } $::cfg = $cfg; } sub import { my ($self, $app) = @_; return unless defined $app; die("PROGRAM ERROR: EB::Config cannot import anything"); } package EB::Config::Handler; # Very simple inifile handler (read-only). sub _key { my ($section, $parameter) = @_; $section.'::'.$parameter; } sub val { my ($self, $section, $parameter, $default) = @_; my $res; $res = $self->{data}->{ _key($section, $parameter) }; $res = $default unless defined $res; Carp::cluck("=> missing config: \"" . _key($section, $parameter) . "\"\n") unless defined $res || @_ > 3; $res; } sub newval { my ($self, $section, $parameter, $value) = @_; $self->{data}->{ _key($section, $parameter) } = $value; } sub setval { my ($self, $section, $parameter, $value) = @_; my $key = _key( $section, $parameter ); Carp::cluck("=> missing config: \"$key\"\n") unless exists $self->{data}->{ $key }; $self->{data}->{ $key } = $value; } sub _plug { my ($self, $section, $parameter, $env) = @_; $self->newval($section, $parameter, $ENV{$env}) if $ENV{$env} && !$self->val($section, $parameter, undef); } sub files { my ($self) = @_; return $self->{files}->[-1] unless wantarray; return @{ $self->{files} }; } sub file { goto &files; # for convenience } sub set_file { my ( $self, $file ) = @_; if ( $self->{files}->[0] eq '' ) { $self->{files} = []; } push( @{ $self->{files} }, $file ); } sub app { my ($self) = @_; $self->{app}; } sub new { my ($package, $app, $file) = @_; my $self = bless {}, $package; $self->{files} = [ '' ]; $self->{data} = {}; $self->{app} = $app; $self->load($file) if defined $file; return $self; } sub load { my ($self, $file) = @_; open( my $fd, "<:encoding(utf-8)", $file ) or Carp::croak("Error opening config $file: $!\n"); $self->set_file($file); my $section = "global"; my $fail; while ( <$fd> ) { chomp; next unless /\S/; next if /^[#;]/; if ( /^\s*\[\s*(.*?)\s*\]\s*$/ ) { $section = lc $1; next; } if ( /^\s*(.*?)\s*=\s*(.*?)\s*$/ ) { $self->{data}->{ _key($section, lc($1)) } = $2; next; } Carp::cluck("Error in config $file, line $.:\n$_\n"); $fail++; } Carp::croak("Error processing config $file, aborted\n") if $fail; $self; } sub printconf { my ( $self, $list ) = @_; return unless @$list > 0; foreach my $conf ( @$list ) { unless ( $conf =~ /^(.+?):([^:]+)/ ) { print STDOUT ("\n"); next; } my ($sec, $conf) = ($1, $2); $sec =~ s/:+$//; my $val = $self->val($sec, $conf, undef); print STDOUT ($val) if defined $val; print STDOUT ("\n"); } } sub user_dir { my ( $app, $item ) = @_; { local $SIG{__WARN__}; local $SIG{__DIE__}; eval { $app = $app->app }; } if ( $^O =~ /^mswin/i ) { my $f = File::Spec->catpath( $ENV{HOMEDRIVE}, $ENV{HOMEPATH}, File::Spec->catfile( $app, $item )); return $f; } File::Spec->catfile( glob("~"), "." . lc( $app), defined($item) ? $item : (), ); } sub std_config { my ( $app ) = @_; { local $SIG{__WARN__}; local $SIG{__DIE__}; eval { $app = $app->app }; } lc($app) . ".conf"; } sub std_config_alt { "." . &std_config; } 1; EekBoek-2.02.04/lib/EB/Export/0000755000076500007650000000000012165465617013350 5ustar jvjvEekBoek-2.02.04/lib/EB/Export/XAF.pm0000444000076500007650000002314212165465617014324 0ustar jvjv# perl # Export::XAF -- Export XML Audit File # Author : Johan Vromans # Created On : Sun Apr 13 17:25:07 2008 # Last Modified By: Johan Vromans # Last Modified On: Thu Jun 7 13:59:14 2012 # Update Count : 241 # Status : Unknown, Use with caution! ################ Common stuff ################ package main; our $dbh; our $cfg; package EB::Export::XAF; use strict; use warnings; use EB; use EB::Format; ################ The Process ################ sub export { my ($self, $opts) = @_; $self = bless {}, $self unless ref $self; my $xaf; open($xaf, '>:encoding(utf-8)', $opts->{xaf}) or die("?". __x("Fout tijdens het aanmaken van exportbestand {name}: {err}", name => $opts->{xaf}, msg => $!)."\n"); $self->{fh} = $xaf; # Default to current boekjaar. $self->{bky} = $opts->{boekjaar} || $dbh->adm("bky"); $self->{indent} = 0; $self->{openingdata} = []; $self->{elts} = []; # Generate XML Audit File. $self->generate_XAF(); } ################ XML Routines ################ { sub indent { " " x $_[0]->{indent} } sub indent_incr { $_[0]->{indent}++ } sub indent_decr { $_[0]->{indent}-- } sub indent_init { $_[0]->{indent} = 0 } } sub generate_XAF { my ($self) = @_; $self->auditfile_begin(); $self->generalLedger(); $self->customersSuppliers(); $self->transactions(); $self->auditfile_end(); } sub auditfile_begin { my ($self) = @_; my $r = $dbh->do("SELECT bky_begin, bky_end". " FROM Boekjaren". " WHERE bky_code = ?", $self->{bky}); $r or die(__x("Onbekend boekjaar: {bky}", bky => $self->{bky})."\n"); @{$self}{qw(begin end)} = @$r; $self->print ('', "\n"); $self->xml_elt_open("auditfile"); $self->xml_elt_open("header"); $self->xml_elt("auditfileVersion", "CLAIR2.00.00"); $self->xml_elt("companyID", $cfg->val(qw(company id), "x")); $self->xml_elt("taxRegistrationNr", $cfg->val(qw(company taxreg), "1")); $self->xml_elt("companyName", $cfg->val(qw(company name), "Squirrel")); $self->xml_elt("companyAddress", $cfg->val(qw(company address), "Here")); $self->xml_elt("companyCity", $cfg->val(qw(company city), "There")); $self->xml_elt("companyPostalCode", $cfg->val(qw(company postalcode), "1234AA")); $self->xml_elt("fiscalYear", $self->{bky}); $self->xml_elt("startDate", $self->{begin}); $self->xml_elt("endDate", $self->{end}); $self->xml_elt("currencyCode", "EUR"); $self->xml_elt("dateCreated", $cfg->val(qw(internal now), iso8601date())); $self->xml_elt("productID", "EekBoek"); $self->xml_elt("productVersion", $EekBoek::VERSION); $self->xml_elt_close("header"); } sub auditfile_end { my ($self) = @_; $self->xml_elt_close("auditfile"); indent_decr; } sub generalLedger { my ($self) = @_; # Parse SQL and execute. my $sth = $dbh->sql_exec ("SELECT acc_id, acc_desc, acc_debcrd, acc_balres, acc_ibalance". " FROM Accounts". " ORDER BY acc_id"); # Bind result columns. $sth->bind_columns(\my($acc_id, $acc_desc, $acc_dc, $acc_br, $acc_ibal)); $self->xml_elt_open("generalLedger"); $self->xml_elt("taxonomy", "geen"); # Fetch entries, one by one. while ( $sth->fetch ) { $self->xml_elt_open("ledgerAccount"); $self->xml_elt("accountID", $acc_id); $self->xml_elt("accountDesc", $acc_desc); # B = Balance, P = Profit/Loss. $self->xml_elt("accountType", $acc_br ? "B" : "P"); $self->xml_elt("leadCode", $acc_id); $self->xml_elt_close("ledgerAccount"); # Save opening transactions. push(@{$self->{openingdata}}, [ $acc_id, $acc_ibal ]) if $acc_ibal; } $self->xml_elt_close("generalLedger"); } sub customersSuppliers { my ($self) = @_; # Parse SQL and execute. my $sth = $dbh->sql_exec ("SELECT DISTINCT rel_code, rel_desc". " FROM Relaties". " ORDER BY rel_code"); # Bind result columns. $sth->bind_columns(\my($rel_code, $rel_desc)); $self->xml_elt_open("customersSuppliers"); # Fetch entries, one by one. while ( $sth->fetch ) { $self->xml_elt_open("customerSupplier"); $self->xml_elt("custSupID", $rel_code); $self->xml_elt("companyName", $rel_desc); $self->xml_elt_open("streetAddress"); $self->xml_elt("address", "onbekend"); $self->xml_elt("city", "ONBEKEND"); $self->xml_elt("postalCode", "0000 XX"); $self->xml_elt("country", "Nederland"); $self->xml_elt_close("streetAddress"); $self->xml_elt_close("customerSupplier"); } $self->xml_elt_close("customersSuppliers"); } sub transactions { my ($self) = @_; $self->xml_elt_open("transactions"); # Retrieve credit and debit totals separately. my ($dcnt, $damt) = @{$dbh->do("SELECT count (*), sum(jnl_amount)". " FROM Journal". " WHERE jnl_amount > 0". " AND jnl_date >= ?". " AND jnl_date <= ?". " AND jnl_seq != 0", $self->{begin}, $self->{end})}; my ($ccnt, $camt) = @{$dbh->do("SELECT count (*), sum(jnl_amount)". " FROM Journal". " WHERE jnl_amount < 0". " AND jnl_date >= ?". " AND jnl_date <= ?". " AND jnl_seq != 0", $self->{begin}, $self->{end})}; my $entries = $dcnt + $ccnt; if ( @{$self->{openingdata}} ) { $entries += @{$self->{openingdata}}; foreach ( @{$self->{openingdata}} ) { if ( $_->[1] < 0 ) { $camt += $_->[1]; } else { $damt += $_->[1]; } } } $self->xml_elt("numberEntries", $entries); $self->xml_elt("totalDebit", _numfmt($damt)); $self->xml_elt("totalCredit", _numfmt(-$camt)); # Get the list of daybooks (dagboeken). my $sth = $dbh->sql_exec ("SELECT dbk_id, dbk_desc, dbk_type". " FROM Dagboeken". " ORDER BY dbk_id"); my @dbk; while ( my $rr = $sth->fetch ) { push(@dbk, [@$rr]); } # Process the daybooks (dagboeken). foreach my $dbk ( @dbk ) { $self->xml_elt_open("journal"); $self->xml_elt("journalID", $dbk->[0]); $self->xml_elt("description", $dbk->[1]); $self->xml_elt("type", $dbk->[2]); # Insert openings transactions in (first) memorial. if ( $dbk->[2] == DBKTYPE_MEMORIAAL && @{$self->{openingdata}} ) { $self->xml_elt_open("transaction"); $self->xml_elt("transactionID", 0); $self->xml_elt("period", 0); $self->xml_elt("transactionDate", $self->{begin}); my $nr = 0; foreach my $op ( @{$self->{openingdata}} ) { $self->xml_elt_open("line"); $self->xml_elt("recordID", ++$nr); $self->xml_elt("accountID", $op->[0]); $self->xml_elt("documentID", 0); $self->xml_elt("description", "opening"); $self->xml_amt($op->[1]); $self->xml_elt_close("line"); } $self->{openingdata} = []; # clear $self->xml_elt_close("transaction"); } # Fetch transactions from journal. $sth = $dbh->sql_exec ("SELECT jnl_date, bsk_nr, jnl_seq,". " jnl_acc_id, jnl_rel, jnl_desc, ". " jnl_amount, jnl_damount". " FROM Journal, Boekstukken". " WHERE jnl_dbk_id = ?". " AND jnl_bsk_id = bsk_id". " AND jnl_date >= ?". " AND jnl_date <= ?". " ORDER BY bsk_nr, jnl_date, jnl_bsk_id, jnl_seq", $dbk->[0], $self->{begin}, $self->{end}); $sth->bind_columns (\my ($jnl_date, $bsk_nr, $jnl_seq, $jnl_acc_id, $jnl_rel, $jnl_desc, $jnl_amount, $jnl_damount)); FETCH: while ( $sth->fetch ) { $self->xml_elt_open("transaction"); $self->xml_elt("transactionID", $bsk_nr); $self->xml_elt("period", substr($jnl_date, 5, 2)); $self->xml_elt("transactionDate", $jnl_date); my $rel = $jnl_rel; # save relation while ( $sth->fetch ) { if ( $jnl_seq == 0 ) { # Close current transaction, proceed with next. $self->xml_elt_close("transaction"); redo FETCH; } # Combine deb/crd amounts. $jnl_amount -= $jnl_damount if $jnl_damount; $self->xml_elt_open("line"); $self->xml_elt("recordID", $jnl_seq); $self->xml_elt("accountID", $jnl_acc_id); $self->xml_elt("custSupID", $rel); $self->xml_elt("documentID", $bsk_nr); $self->xml_elt("description", $jnl_desc); $self->xml_amt($jnl_amount); $self->xml_elt_close("line"); } $self->xml_elt_close("transaction"); last; } $self->xml_elt_close("journal"); } $self->xml_elt_close("transactions"); } sub print { my ($self, @args) = @_; print { $self->{fh} } @args; } sub printi { my ($self, @args) = @_; print { $self->{fh} } $self->indent, @args; } sub _numfmt { my ($v) = @_; my $t = numfmt_plain($v); $t =~ s/,/./; $t; } ################ XML Support Routines ################ { # Open/close element. sub xml_elt_open { my ($self, $tag) = @_; $self->printi("<$tag>\n"); $self->indent_incr; unshift(@{$self->{elts}}, $tag); } sub xml_elt_close { my ($self, $tag) = @_; if ( $tag eq $self->{elts}->[0] ) { shift(@{$self->{elts}}); } else { warn("XML ERROR: closing element $tag while in ", $self->{elts}->[0], "\n"); } $self->indent_decr; $self->printi("\n"); } } # Output an XML element. sub xml_elt { my ($self, $tag, $val) = @_; $self->printi("<$tag>@{[xml_text($val)]}\n"); } # Output an XML amount. sub xml_amt { my ($self, $amount) = @_; if ( $amount >= 0 ) { $self->xml_elt("debitAmount", _numfmt($amount)); } else { $self->xml_elt("creditAmount", _numfmt(-$amount)); } } # XMLise text. sub xml_text { return "" unless defined $_[0]; for ( $_[0] ) { s/&/&/g; s/'/'/g; s//>/g; return $_; } } 1; EekBoek-2.02.04/lib/EB/Main.pm0000444000076500007650000001457312165465617013321 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Thu Jul 7 15:53:48 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Aug 11 21:13:47 2012 # Update Count : 1009 # Status : Unknown, Use with caution! ################ Common stuff ################ package main; our $cfg; our $dbh; package EB::Main; use strict; use warnings; use EekBoek; use EB; use EB::DB; use Getopt::Long 2.13; ################ The Process ################ sub run { my ( $pkg, $opts ) = @_; $opts = {} unless defined $opts; binmode(STDOUT, ":encoding(utf8)"); binmode(STDERR, ":encoding(utf8)"); # Preliminary initialize config. EB->app_init( { app => $EekBoek::PACKAGE } ); # Command line options. $opts = { interactive => -t, # runs interactively #command, # command to process #echo, # echo input confirm => 0, # NYI #journal, # show journal #inexport, # in/export #file, # file voor in/export #dir, # directory voor in/export #title, # title for export #errexit # disallow errors in batch verbose => 0, # verbose processing #boekjaar, # boekjaar # Development options (not shown with -help). debug => 0, # debugging trace => 0, # trace (show process) test => 0, # test mode. # Let supplied options override. %$opts, }; # Process command line options. app_options($opts); # Post-processing. $opts->{trace} |= ($opts->{debug} || $opts->{test}); # Initialize config. EB->app_init( { app => $EekBoek::PACKAGE, %$opts } ); if ( $opts->{printconfig} ) { $cfg->printconf( \@ARGV ); exit; } my $userdir = $cfg->user_dir; mkdir($userdir) unless -d $userdir; unless ( defined($opts->{wizard}) && !$opts->{wizard} ) { if ( $opts->{wizard} or !$opts->{config} && ( ( -e $cfg->std_config || -e $cfg->std_config_alt ) ? $cfg->val( qw(general wizard), 0 ) : 1 ) ) { require EB::IniWiz; EB::IniWiz->run($opts); # sets $opts->{runeb} die("?"._T("Geen administratie geselecteerd")."\n") unless $opts->{runeb}; EB->app_init( { app => $EekBoek::PACKAGE, %$opts } ); } } $opts->{echo} = "eb> " if $opts->{echo}; my $dataset = $cfg->val(qw(database name), undef); unless ( $dataset ) { die("?"._T("Geen EekBoek database opgegeven.". " Specificeer een database in de configuratiefile,". " of selecteer een andere configuratiefile". " op de command line met \"--config=...\"."). "\n"); } $cfg->newval(qw(database name), $dataset); $cfg->newval(qw(preferences journal), $opts->{journal}) if defined $opts->{journal}; $dbh = EB::DB->new(trace => $opts->{trace}); my $createdb; if ( defined $opts->{inexport} ) { if ( $opts->{inexport} ) { $opts->{command} = 1; $createdb = 1; @ARGV = qw(import --noclean); push(@ARGV, "--file", $opts->{file}) if defined $opts->{file}; push(@ARGV, "--dir", $opts->{dir}) if defined $opts->{dir}; } else { $opts->{command} = 1; @ARGV = qw(export); push(@ARGV, "--file", $opts->{file}) if defined $opts->{file}; push(@ARGV, "--dir", $opts->{dir}) if defined $opts->{dir}; push(@ARGV, "--titel", $opts->{title}) if defined $opts->{title}; } } if ( $createdb ) { $dbh->createdb($dataset); warn("%".__x("Lege database {db} is aangemaakt", db => $dataset)."\n"); } return 0 if $opts->{command} && !@ARGV; require EB::Shell; my $shell = EB::Shell->new ({ HISTFILE => $userdir."/history", command => $opts->{command}, interactive => $opts->{interactive}, errexit => defined($opts->{errexit})?$opts->{errexit}:$cfg->val(qw(shell errexit),0), verbose => $opts->{verbose}, trace => $opts->{trace}, journal => $cfg->val(qw(preferences journal), 0), echo => $opts->{echo}, prompt => lc($cfg->app), boekjaar => $opts->{boekjaar}, }); $| = 1; $shell->run; } ################ Subroutines ################ ################ Subroutines ################ sub app_options { my ( $opts ) = @_; # Process options, if any. # Make sure defaults are set before returning! return unless @ARGV > 0; Getopt::Long::Configure(qw(no_ignore_case)); if ( !GetOptions( $opts, 'command|c' => sub { $opts->{command} = 1; die("!FINISH\n"); }, 'import' => sub { $opts->{inexport} = 1; }, 'export' => sub { $opts->{inexport} = 0; }, 'init' => sub { $opts->{inexport} = 1; $opts->{dir} = "."; }, 'define|D=s%', 'printconfig|P', 'nostdconf|X', 'config|f=s', 'title|titel=s', 'echo|e!', 'ident', 'journaal', 'boekjaar=s', 'verbose', 'dir=s', 'file=s', 'interactive!', 'wizard!', 'errexit!', 'trace', 'help|?', 'debug', ) or $opts->{help} ) { app_usage(2); } app_usage(2) if @ARGV && !($opts->{command} || $opts->{printconfig}); app_ident() if $opts->{ident}; } sub app_ident { return; print STDERR (__x("Dit is {pkg} [{name} {version}]", pkg => $EekBoek::PACKAGE, name => "Shell", version => $EekBoek::VERSION) . "\n"); } sub app_usage { my ($exit) = @_; app_ident(); print STDERR __x(< $0); Gebruik: {prog} [options] [file ...] --command -c voer de rest van de opdrachtregel uit als command --echo -e toon ingelezen opdrachten --boekjaar=XXX specificeer boekjaar --import importeer een nieuwe administratie --export exporteer een administratie --dir=XXX directory voor im/export --file=XXX bestand voor im/export --titel=XXX omschrijving voor export --init (re)creëer administratie --help deze hulpboodschap --ident toon identificatie --verbose geef meer uitgebreide information Voor experts: --config=XXX -f specificeer configuratiebestand --nostdconf -X gebruik uitsluitend dit configuratiebestand --define=XXX -D definieer configuratiesetting --printconfig -P print config waarden --[no]interactive forceer [non]interactieve modus --[no]errexit stop direct na een fout in de invoer EndOfUsage CORE::exit $exit if defined $exit && $exit != 0; } 1; EekBoek-2.02.04/lib/EB/Version.pm0000444000076500007650000000012612165465617014047 0ustar jvjv# This file is generated. Do not edit! package EB::Version; our $VERSION = "2.02.04"; EekBoek-2.02.04/lib/EB/Report.pm0000444000076500007650000001231012165465617013673 0ustar jvjv#! perl package main; our $dbh; # Report.pm -- Report tools # Author : Johan Vromans # Created On : Mon Nov 14 21:46:04 2005 # Last Modified By: Johan Vromans # Last Modified On: Tue Nov 1 10:53:12 2011 # Update Count : 45 # Status : Unknown, Use with caution! package EB::Report; use strict; use warnings; use EB; use EB::Format qw(numfmt); use EB::Report::GenBase; my $trace = 0; sub GetTAccountsBal { shift; my ($end, $inc) = @_; # balans(r, t) = balans(r, t0) + sum(journaal, r, t0..t) + sum(boekjaarbalans, r, t' < t) # balans(r, t0) $dbh->sql_exec("DELETE FROM TAccounts"); $dbh->sql_exec("INSERT INTO TAccounts". " (acc_id,acc_desc,acc_balres,acc_debcrd,acc_dcfixed,". "acc_ibalance,acc_balance,acc_struct)". " SELECT acc_id,acc_desc,acc_balres,acc_debcrd,acc_dcfixed,". "acc_ibalance,acc_ibalance AS acc_balance,acc_struct". " FROM Accounts")->finish; return "TAccounts" unless defined $end; # sum(journaal, r, t0..t) my $sth = $dbh->sql_exec("SELECT jnl_acc_id,acc_balance,SUM(jnl_amount)". " FROM Journal,TAccounts". " WHERE acc_id = jnl_acc_id". " AND jnl_date ".($inc ? "<" : "<=")." ?". " GROUP BY jnl_acc_id,acc_balance,acc_ibalance", $end); while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_balance, $sum) = @$rr; next unless $sum; $sum += $acc_balance; warn("!".__x("Balansrekening {acct}, saldo aangepast naar {exp}", acct => $acc_id, exp => numfmt($sum)) . "\n") if $trace; $dbh->sql_exec("UPDATE TAccounts". " SET acc_balance = ?". " WHERE acc_id = ?", $sum, $acc_id)->finish; } # sum(boekjaarbalans, r, t' < t) $sth = $dbh->sql_exec("SELECT bkb_acc_id, bkb_balance". " FROM Boekjaarbalans". " WHERE bkb_end ".($inc ? "<=" : "<")." ?", $end); while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_balance) = @$rr; warn("!".__x("Balansrekening {acct}, saldo aangepast met {exp}", acct => $acc_id, exp => numfmt(-$acc_balance)) . "\n") if $trace; $dbh->sql_exec("UPDATE TAccounts". " SET acc_balance = acc_balance - ?". " WHERE acc_id = ?", $acc_balance, $acc_id)->finish; } # Return temp table. "TAccounts"; } sub GetTAccountsAll { push(@_, 1); goto &GetTAccountsRes; } sub GetTAccountsRes { shift; my ($begin, $end, $all) = @_; # beginsaldo(r, t1, t2) = sum(journaal, r, t0..t1) + sum(boekjaarbalans, r, t' < t1) # eindsaldo(r, t1, t2) = beginsaldo(r, t1, t2) + sum(journaal, r, t1..t2) # init $dbh->sql_exec("DELETE FROM TAccounts"); if ( $all ) { $dbh->sql_exec("INSERT INTO TAccounts SELECT * FROM Accounts")->finish; } else { $dbh->sql_exec("INSERT INTO TAccounts". " (acc_id,acc_desc,acc_balres,acc_debcrd,". "acc_ibalance,acc_balance,acc_struct)". " SELECT acc_id,acc_desc,acc_balres,acc_debcrd,0,0,acc_struct". " FROM Accounts". " WHERE NOT acc_balres")->finish; } # beginsaldo(r, t1, t2) = sum(journaal, r, t0..t1) ... my $sth = $dbh->sql_exec("SELECT jnl_acc_id,SUM(jnl_amount)". " FROM Journal,TAccounts". " WHERE acc_id = jnl_acc_id". " AND jnl_date < ?". " GROUP BY jnl_acc_id", $begin); while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $sum) = @$rr; next unless $sum; warn("!".__x("Resultaatrekening {acct}, beginsaldo is {exp}", acct => $acc_id, exp => numfmt($sum)) . "\n") if $trace; $dbh->sql_exec("UPDATE TAccounts". " SET acc_ibalance = acc_ibalance + ?". " WHERE acc_id = ?", $sum, $acc_id)->finish; } # ... + sum(boekjaarbalans, r, t' < t1) $sth = $dbh->sql_exec("SELECT bkb_acc_id, bkb_balance". " FROM Boekjaarbalans". " WHERE bkb_end < ?", $begin); while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_balance) = @$rr; warn("!".__x("Resultaatrekening {acct}, saldo aangepast met {exp}", acct => $acc_id, exp => numfmt(-$acc_balance)) . "\n") if $trace; $dbh->sql_exec("UPDATE TAccounts". " SET acc_ibalance = acc_ibalance - ?". " WHERE acc_id = ?", $acc_balance, $acc_id)->finish; } # zet eindsaldo op beginsaldo $dbh->sql_exec("UPDATE TAccounts". " SET acc_balance = acc_ibalance")->finish; # eindsaldo(r, t2) = beginsaldo(r, t1) + sum(journaal, r, t1..t2) $sth = $dbh->sql_exec("SELECT jnl_acc_id,SUM(jnl_amount)". " FROM Journal,TAccounts". " WHERE acc_id = jnl_acc_id". " AND jnl_date >= ?". " AND jnl_date <= ?". " GROUP BY jnl_acc_id", $begin, $end); while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $sum) = @$rr; next unless $sum; warn("!".__x("Resultaatrekening {acct}, mutaties is {exp}", acct => $acc_id, exp => numfmt($sum)) . "\n") if $trace; $dbh->sql_exec("UPDATE TAccounts". " SET acc_balance = acc_ibalance + ?". " WHERE acc_id = ?", $sum, $acc_id)->finish; } "TAccounts"; } sub GetTAccountsCopy { shift; $dbh->sql_exec("DELETE FROM TAccounts"); $dbh->sql_exec("INSERT INTO TAccounts SELECT * FROM Accounts")->finish; "TAccounts"; } 1; EekBoek-2.02.04/lib/EB/Utils.pm0000444000076500007650000002000112165465617013514 0ustar jvjv#! perl # Utils.pm -- # Author : Johan Vromans # Created On : Wed Sep 21 13:09:01 2005 # Last Modified By: Johan Vromans # Last Modified On: Tue May 14 20:21:30 2013 # Update Count : 127 # Status : Unknown, Use with caution! package EB::Utils; use strict; use base qw(Exporter); our @EXPORT; our @EXPORT_OK; use Time::Local; # We're imported by EB that exports _T. Kinda catch-22. *_T = *EB::_T; # These are only used by the BTW Aangifte modules. # Note these are translated using _T where appropriate. our @months = split(" ", "Jan Feb Mrt Apr Mei Jun Jul Aug Sep Okt Nov Dec"); our @month_names = split(" ", "Januari Februari Maart April Mei Juni Juli Augustus September Oktober November December"); our @days = split(" ", "Zon Maa Din Woe Don Vri Zat"); our @day_names = split(" ", "Zondag Maandag Dinsdag Woensdag Donderdag Vrijdag Zaterdag"); my $_i; my %rev_months; $_i = 1; foreach ( @months ) { $rev_months{ lc $_ } = $_i; $rev_months{ "m$_i" } = $_i; $rev_months{ sprintf("m%02d", $_i) } = $_i; $_i++; } my %rev_month_names; $_i = 1; foreach ( @month_names ) { $rev_month_names{ lc $_ } = $_i++; } sub parse_date { my ($date, $default_year, $delta_d, $delta_m, $delta_y) = @_; # Parse a date and return it in ISO format (scalar) or # (YYYY,MM,DD) list context. my ($d, $m, $y); if ( $date =~ /^(\d\d\d\d)-(\d\d)-(\d\d)$/ ) { ($y, $m, $d) = ($1, $2, $3); } elsif ( $date =~ /^(\d\d?)-(\d\d?)-(\d\d\d\d)$/ ) { ($d, $m, $y) = ($1, $2, $3); } elsif ( $date =~ /^(\d\d?)-(\d\d?)$/ ) { return unless $default_year; ($d, $m, $y) = ($1, $2, $default_year); } elsif ( $date =~ /^(\d\d?) (\w+)$/ ) { return unless $default_year; return unless $m = $rev_month_names{$2} || $rev_months{$2}; ($d, $y) = ($1, $default_year); } else { return; # invalid format } # The date, as delivered, must be valid. my $time = eval { timelocal(0, 0, 12, $d, $m-1, $y) }; return unless $time; # invalid date # Handle deltas. $y += $delta_y if $delta_y; $m += $delta_m if $delta_m; while ( $m > 12 ) { $m -= 12, $y++ } while ( $m < 1 ) { $m += 12; $y-- } $delta_d += $d - 1; # New date, as of 1st of the month. $time = eval { timelocal(0, 0, 12, 1, $m-1, $y) }; return unless $time; # invalid date # Apply delta. $time += $delta_d * 24*60*60 if $delta_d; # Convert and return. my @tm = localtime($time); @tm = (1900 + $tm[5], 1 + $tm[4], $tm[3]); wantarray ? @tm : sprintf("%04d-%02d-%02d", @tm); } push( @EXPORT, qw(parse_date) ); sub parse_date_range { my ($range, $default_year) = @_; # Parse a date and return it as an array ref of two ISO formatted # dates. my ($d1, $m1, $y1, $d2, $m2, $y2); my $datefix; $range = lc($range); # 2004-03-04 - 2004-05-06 -> [ "2004-03-04", "2004-05-06" ] if ( $range =~ /^(\d\d\d\d)-(\d\d)-(\d\d)\s*[-\/]\s*(\d\d\d\d)-(\d\d)-(\d\d)$/ ) { ($y1, $m1, $d1, $y2, $m2, $d2) = ($1, $2, $3, $4, $5, $6); } # 2004-03-04/05-06 -> [ "2004-03-04", "2004-05-06" ] elsif ( $range =~ /^(\d\d\d\d)-(\d\d)-(\d\d)\s*\/\s*(\d\d)-(\d\d)$/ ) { ($y1, $m1, $d1, $y2, $m2, $d2) = ($1, $2, $3, $1, $4, $5); } # 2004-03-04/06 -> [ "2004-03-04", "2004-03-06" ] elsif ( $range =~ /^(\d\d\d\d)-(\d\d)-(\d\d)\s*\/\s*(\d\d)$/ ) { ($y1, $m1, $d1, $y2, $m2, $d2) = ($1, $2, $3, $1, $2, $4); } # 03-04-2004 - 05-06-2004 -> [ "2004-04-03", "2004-06-05" ] elsif ( $range =~ /^(\d\d)-(\d\d)-(\d\d\d\d)\s*-\s*(\d\d)-(\d\d)-(\d\d\d\d)$/ ) { ($d1, $m1, $y1, $d2, $m2, $y2) = ($1, $2, $3, $4, $5, $6); } # 03-04 - 05-06 -> [ "2004-04-03", "2004-06-25" ] elsif ( $range =~ /^(\d\d)-(\d\d)\s*-\s*(\d\d)-(\d\d)$/ ) { return unless $default_year; ($d1, $m1, $y1, $d2, $m2, $y2) = ($1, $2, $default_year, $3, $4, $default_year); } # 3 april - 5 juni -> [ "2004-04-03", "2004-06-25" ] # 3 april - 5 juni 2004 -> [ "2004-04-03", "2004-06-25" ] elsif ( $range =~ /^(\d+)\s+(\w+)\s*-\s*(\d+)\s+(\w+)(?:\s+(\d{4}))?$/ ) { return unless $default_year; return unless $m1 = $rev_month_names{$2} || $rev_months{$2}; return unless $m2 = $rev_month_names{$4} || $rev_months{$4}; $d1 = $1; $d2 = $3; $y1 = $y2 = $5 || $default_year; } # 3 april 2004 - 5 juni 2004 -> [ "2004-04-03", "2004-06-25" ] elsif ( $range =~ /^(\d+)\s+(\w+)\s+(\d{4})\s*-\s*(\d+)\s+(\w+)\s+(\d{4})$/ ) { return unless $m1 = $rev_month_names{$2} || $rev_months{$2}; return unless $m2 = $rev_month_names{$5} || $rev_months{$5}; $d1 = $1; $d2 = $4; $y1 = $3; $y2 = $6; } # april - juni -> [ "2004-04-01", "2004-06-30" ] # april - juni 2004 -> [ "2004-04-01", "2004-06-30" ] elsif ( $range =~ /^(\w+)\s*-\s*(\w+)(?:\s+(\d{4}))?$/ ) { return unless $default_year; return unless $m1 = $rev_month_names{$1} || $rev_months{$1}; return unless $m2 = $rev_month_names{$2} || $rev_months{$2}; $d1 = 1; $d2 = -1; $y1 = $y2 = $3 || $default_year; } # 2004 -> [ "2004-01-01", "2004-12-31" ] elsif ( $range =~ /^(\d{4})$/ ) { $d1 = 1; $d2 = -1; $m1 = 1; $m2 = 12; $y1 = $y2 = $1; } # k2 -> [ "2004-04-01", "2004-06-30" ] # k2 2004 -> [ "2004-04-01", "2004-06-30" ] elsif ( $range =~ /^[kq](\d+)(?:\s+(\d{4}))?$/ ) { return unless $2||$default_year; return unless $1 >= 1 && $1 <= 4; $m1 = 3 * $1 - 2; $m2 = $m1 + 2; $d1 = 1; $d2 = -1; $y1 = $y2 = $2 || $default_year; } # jaar -> [ "2004-01-01", "2004-12-31" ] elsif ( $range eq lc(EB::_T("jaar")) || $range eq "jaar" ) { return unless $default_year; $d1 = 1; $d2 = -1; $m1 = 1; $m2 = 12; $y1 = $y2 = $default_year; } # apr | april -> [ "2004-04-01", "2004-04-30" ] # apr 2004 -> [ "2004-04-01", "2004-04-30" ] elsif ( $range =~ /^(\w+)(?:\s+(\d{4}))?$/ ) { return unless $2||$default_year; return unless $m1 = $m2 = $rev_month_names{$1} || $rev_months{$1}; $d1 = 1; $d2 = -1; $y1 = $y2 = $2 || $default_year; } else { return; # unrecognizable format } if ( $d2 < 0 ) { $datefix = 24 * 60 * 60; $d2 = 1; $m2 = 1, $y2++ if ++$m2 > 12; } my $time1 = eval { timelocal(0, 0, 12, $d1, $m1-1, $y1) }; return unless $time1; # invalid date my $time2 = eval { timelocal(0, 0, 12, $d2, $m2-1, $y2) }; return unless $time2; # invalid date $time2 -= $datefix if $datefix; my @tm = localtime($time1); my @tm1 = (1900 + $tm[5], 1 + $tm[4], $tm[3]); @tm = localtime($time2); my @tm2 = (1900 + $tm[5], 1 + $tm[4], $tm[3]); [ sprintf("%04d-%02d-%02d", @tm1), sprintf("%04d-%02d-%02d", @tm2) ] } push( @EXPORT, qw(parse_date_range) ); sub iso8601date { my ($time) = shift || time; my @tm = localtime($time); sprintf("%04d-%02d-%02d", 1900+$tm[5], 1+$tm[4], $tm[3]); } push( @EXPORT, qw(iso8601date) ); sub min { $_[0] < $_[1] ? $_[0] : $_[1] } sub max { $_[0] > $_[1] ? $_[0] : $_[1] } push( @EXPORT, qw(min max) ); # Locale / Gettext. # Variable expansion. See GNU gettext for details. sub __expand($%) { my ($t, %args) = @_; my $re = join('|', map { quotemeta($_) } keys(%args)); $t =~ s/\{($re)\}/defined($args{$1}) ? $args{$1} : "{$1}"/ge; $t; } # Translation w/ variables. sub __x($@) { my ($t, %vars) = @_; __expand(_T($t), %vars); } # Translation w/ singular/plural handling. sub __n($$$) { my ($sing, $plur, $n) = @_; _T($n == 1 ? $sing : $plur); } # Translation w/ singular/plural handling and variables. sub __nx($$$@) { my ($sing, $plur, $n, %vars) = @_; __expand(__n($sing, $plur, $n), %vars); } # Make __xn a synonym for __nx. *__xn = \&__nx; # And the dummy... sub N__($) { $_[0] }; # This is for context sensitive translations, where e.g., cmd:btw # translates to cmd:vat and we deliver need the part after the colon. sub __xt { my $t = _T($_[0]); $t =~ s/^.*://; $t; } # Same, without translating. # Basically, __xt is __XN(_T($_[0])). sub __XN { my $t = $_[0]; $t =~ s/^.*://; $t; } push( @EXPORT, qw( __x __n __nx __xn N__ __xt __XN ) ); # ... more to come ... @EXPORT_OK = @EXPORT; 1; EekBoek-2.02.04/lib/EB/Format.pm0000444000076500007650000002201012165465617013646 0ustar jvjv#! perl # Format.pm -- # Author : Johan Vromans # Created On : Thu Jul 14 12:54:08 2005 # Last Modified By: Johan Vromans # Last Modified On: Tue Mar 8 20:26:23 2011 # Update Count : 102 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Format; use strict; use EB; use base qw(Exporter); my $stdfmt0; my $stdfmtw; my $btwfmt0; my $btwfmtw; my $numpat; my $btwpat; my $decimalpt; my $thousandsep; our @EXPORT; our $amount_width; our $date_width; sub numround_ieee { # This somethimes does odd things. # E.g. 892,5 -> 892 and 891,5 -> 892. 0 + sprintf("%.0f", $_[0]); } use POSIX qw(floor ceil); sub numround_posix { my ($val) = @_; if ( $val < 0 ) { ceil($val - 0.5); } else { floor($val + 0.5); } } use POSIX qw(floor); my $_half; sub numround_bankers { # Based on Math::Round::round_even. my $x = shift; return 0 unless $x; my $sign = ($x >= 0) ? 1 : -1; $x = abs($x); my $in = int($x); # Round to next even if exactly 0.5. if ( ($x - $in) == 0.5 ) { return $sign * (($in % 2 == 0) ? $in : $in + 1); } unless ( defined($_half) ) { # Determine what value to use for "one-half". Because of the # perversities of floating-point hardware, we must use a value # slightly larger than 1/2. We accomplish this by determining # the bit value of 0.5 and increasing it by a small amount in # a lower-order byte. Since the lowest-order bits are still # zero, the number is mathematically exact. my $halfhex = unpack('H*', pack('d', 0.5)); if ( substr($halfhex,0,2) ne '00' && substr($halfhex, -2) eq '00' ) { # Big-endian. substr($halfhex, -4) = '1000'; } else { # Little-endian. substr($halfhex, 0, 4) = '0010'; } $_half = unpack('d', pack('H*', $halfhex)); } $sign * POSIX::floor($x + $_half); } sub init_formats { assert( NUMGROUPS != AMTPRECISION, "NUMGROUPS != AMTPRECISION" ); ################ BTW display format ################ $btwfmt0 = '%.' . (BTWPRECISION-2) . 'f'; $btwfmtw = '%' . BTWWIDTH . "." . (BTWPRECISION-2) . 'f'; $btwpat = qr/^([-+])?(\d+)?(?:[.,])?(\d{1,@{[BTWPRECISION-2]}})?$/; ################ Amount display format ################ $amount_width = $cfg->val(qw(text numwidth), AMTWIDTH); if ( $amount_width =~ /^\+(\d+)$/ ) { $amount_width = AMTWIDTH + $1; } elsif ( $amount_width =~ /^\-(\d+)$/ ) { $amount_width = AMTWIDTH - $1; } elsif ( $amount_width =~ /^(\d+)%$/ ) { $amount_width = int((AMTWIDTH * $1) / 100); } elsif ( $amount_width !~ /^\d+$/ ) { warn("?"._T("Configuratiefout: [format]numwidth moet een getal zijn")."\n"); $amount_width = AMTWIDTH; } $decimalpt = $cfg->val(qw(locale decimalpt), undef); $thousandsep = $cfg->val(qw(locale thousandsep), undef); my $fmt = $cfg->val(qw(format amount), undef); if ( $fmt || !defined($decimalpt) ) { $fmt = _T("1.234,56") unless defined $fmt; Carp::croak(__x("Configuratiefout: ongeldige waarde voor {item}", item => "format".':'."amount")."\n") unless $fmt =~ /^\d+([.,])\d\d$/ || $fmt =~ /^\d+(\.\d\d\d)*(\,)\d\d$/ || $fmt =~ /^\d+(\,\d\d\d)*(\.)\d\d$/; if ( defined $2 ) { $decimalpt = $2; $thousandsep = substr($1, 0, 1); } else { $decimalpt = $1; $thousandsep = ""; } $amount_width = length($fmt) if length($fmt) > $amount_width; } else { $amount_width += int(($amount_width - AMTPRECISION - 2) / 3) if $thousandsep; } $stdfmt0 = '%.' . AMTPRECISION . 'f'; $stdfmtw = '%' . $amount_width . "." . AMTPRECISION . 'f'; my $sub = ""; $sub .= <= 0 ) { \$v = ("0" x (@{[AMTPRECISION + 1]} - length(\$v))) . \$v if length(\$v) <= @{[AMTPRECISION]}; substr(\$v, length(\$v) - @{[AMTPRECISION]}, 0) = q\000$decimalpt\000; } else { \$v = sprintf("$stdfmt0", \$v/@{[AMTSCALE]}); EOD $sub .= <val(qw(strategy round), "ieee")); unless ( defined &{"numround_$numround"} ) { die("?".__x("Onbekende afrondingsmethode: {meth}", meth => $numround)."\n"); } *numround = \&{"numround_$numround"}; ################ Date display format ################ $fmt = $cfg->val(qw(format date), "YYYY-MM-DD"); $sub = "sub datefmt { \$_[0] }"; my $sub_full = "sub datefmt_full { \$_[0] }"; my $sub_plain = "sub datefmt_plain { \$_[0] }"; if ( lc($fmt) eq "dd-mm-yyyy" ) { $sub = q; $sub_full = q; } elsif ( lc($fmt) eq "dd-mm" ) { $sub = q; $sub_full = q; } elsif ( lc($fmt) ne "yyyy-mm-dd" ) { die("?".__x("Ongeldige datumformaatspecificatie: {fmt}", fmt => $fmt)."\n"); } for ( $sub, $sub_full, $sub_plain ) { eval($_); die($_."\n".$@) if $@; } $date_width = length(datefmt("2006-01-01")); } sub numxform_strict { $_ = shift; my $err = __x("Ongeldig bedrag: {num}", num => $_); my $sign = ""; $sign = $1 if s/^([-+])// && $1 eq '-'; # NNNN -> NNNN.00 if ( /^\d+$/ ) { s/^0+(\d)$/$1/; return $sign . $_ . "." . ("0" x AMTPRECISION); } # N,NNN -> NNNN.00 if ( /^(\d{1,@{[NUMGROUPS]}})(\,\d{@{[NUMGROUPS]}})*$/ && $1 ) { s/\,//g; s/^0+(\d)$/$1/; return $sign . $_ . "." . ("0" x AMTPRECISION); } # N.NNN -> NNNN.00 if ( /^(\d{1,@{[NUMGROUPS]}})(\.\d{@{[NUMGROUPS]}})*$/ && $1 ) { s/\.//g; s/^0+(\d)$/$1/; return $sign . $_ . "." . ("0" x AMTPRECISION); } # N.NNN,NN or N,NNN.NN return $err unless /^([\d.]+)(\,)(\d{@{[AMTPRECISION]}})$/ || /^([\d,]+)(\.)(\d{@{[AMTPRECISION]}})$/; my ($mant, $sep, $frac) = ( $1, $2, $3 ); # N.NNN , NN -> NNNN NN if ( $sep eq "," ) { $mant =~ s/\.//g if $mant =~ /^\d{1,@{[NUMGROUPS]}}(\.\d{@{[NUMGROUPS]}})*$/; } # N,NNN . NN -> NNNN NN else { $mant =~ s/\,//g if $mant =~ /^\d{1,@{[NUMGROUPS]}}(\,\d{@{[NUMGROUPS]}})*$/; } # NNNN NN -> NNNN.NN $mant =~ s/^0+(\d)$/$1/; return $sign . $mant . "." . $frac if $mant =~ /^\d+$/; die("?$err\n"); # not well-formed } sub numxform_loose { $_ = shift; my $err = __x("Ongeldig getal: {num}", num => $_); # If there's a single comma, make decimal point. s/,/./ if /^.*,.*$/; return $_ if /^[-+]*\d+(\.\d+)?$/; die("?$err\n"); # not well-formed } sub numxform { my ($n) = @_; my $res = numxform_strict($n); return $res if defined $res; # return $n if $n =~ /^[-a+]?\d+[.,]\d+$/; # a ? return $n if $n =~ /^[-+]?\d+[.,]\d+$/; return undef; } sub amount($) { my $val = shift; my $debug = $cfg->val(__PACKAGE__, "debugexpr", 0); if ( $val =~ /.[-+*\/\(\)]/ ) { print STDERR ("val \"$val\" -> ") if $debug; $val =~ s/([.,\d]+)/numxform_loose($1)/ge; print STDERR ("\"$val\" -> ") if $debug; my $res = eval($val); warn("$val: $@"), return undef if $debug && $@; return undef if $@; $val = sprintf($stdfmt0, $res); print STDERR ("$val\n") if $debug; } else { return undef unless $val = numxform_strict($val); # fortunately, 0.00 is true } return undef unless $val =~ $numpat; my ($s, $w, $f) = ($1 || "", $2 || 0, $3 || 0); $f .= "0" x (AMTPRECISION - length($f)); return 0 + ($s.$w.$f); } sub numfmtw { my $v = shift; if ( $v == int($v) && $v >= 0 ) { $v = ("0" x (AMTPRECISION - length($v) + 1)) . $v if length($v) <= AMTPRECISION; $v = (" " x (AMTWIDTH - length($v))) . $v if length($v) < AMTWIDTH; substr($v, length($v) - AMTPRECISION, 0) = $decimalpt; } else { $v = sprintf($stdfmtw, $v/AMTSCALE); $v =~ s/\./$decimalpt/; } $v; } #### UNUSED sub numfmtv { my $v = shift; if ( $v == int($v) && $v >= 0 ) { $v = ("0" x (AMTPRECISION - length($v) + 1)) . $v if length($v) <= AMTPRECISION; $v = (" " x ($_[0] - length($v))) . $v if length($v) < $_[0]; substr($v, length($v) - AMTPRECISION, 0) = $decimalpt; } else { $v = sprintf('%'.$_[0].'.'.AMTPRECISION.'f', $v/AMTSCALE); $v =~ s/\./$decimalpt/; } $v; } sub btwfmt { my $v = sprintf($btwfmt0, 100*$_[0]/BTWSCALE); $v =~ s/\./$decimalpt/; $v; } sub btwpat { $btwpat } ################ Code ################ push( @EXPORT, qw(amount numround btwfmt), qw($amount_width numfmt numfmt_plain), qw($date_width datefmt datefmt_full datefmt_plain), ); 1; EekBoek-2.02.04/lib/EB/Relation.pm0000444000076500007650000001057212165465617014205 0ustar jvjv#! perl # Relation.pm -- # Author : Johan Vromans # Created On : Thu Jul 14 12:54:08 2005 # Last Modified By: Johan Vromans # Last Modified On: Thu Jan 26 11:04:05 2012 # Update Count : 118 # Status : Unknown, Use with caution! package main; our $dbh; package EB::Relation; use strict; use warnings; use EB; sub new { my $class = shift; $class = ref($class) || $class; my $self = {}; bless $self => $class; $self->add(@_) if @_; $self; } sub add { my ($self, $code, $desc, $acct, $opts) = @_; my $bstate = $opts->{btw}; my $dbk = $opts->{dagboek}; if ( defined($bstate) ) { $bstate = lc($bstate); if ( $bstate =~ /^\d+$/ && $bstate >= 0 && $bstate < @{&BTWTYPES} ) { # Ok. } elsif ( $bstate eq lc(BTWTYPES->[BTWTYPE_NORMAAL]) ) { $bstate = BTWTYPE_NORMAAL } elsif ( $bstate eq lc(BTWTYPES->[BTWTYPE_VERLEGD]) ) { $bstate = BTWTYPE_VERLEGD } elsif ( $bstate eq lc(BTWTYPES->[BTWTYPE_INTRA] ) ) { $bstate = BTWTYPE_INTRA } elsif ( $bstate eq lc(BTWTYPES->[BTWTYPE_EXTRA] ) ) { $bstate = BTWTYPE_EXTRA } else { warn("?".__x("Ongeldige waarde voor BTW status: {btw}", btw => $bstate)."\n"); return; } if ( $bstate == BTWTYPE_VERLEGD ) { #### TODO warn("?"._T("Relaties met verlegde BTW worden nog niet ondersteund")."\n"); return; } if ( $bstate == BTWTYPE_INTRA ) { #### TODO warn("!"._T("Relaties met intra-communautaire BTW worden nog niet volledig ondersteund")."\n"); } } my $debiteur; my $ddesc; if ( $dbk ) { my $rr = $dbh->do("SELECT dbk_id, dbk_type, dbk_desc". " FROM Dagboeken". " WHERE dbk_desc ILIKE ?", $dbk); unless ( $rr ) { warn("?".__x("Onbekend dagboek: {dbk}", dbk => $dbk)."\n"); return; } my ($id, $type, $desc) = @$rr; if ( $type == DBKTYPE_INKOOP ) { $debiteur = 0; } elsif ( $type == DBKTYPE_VERKOOP ) { $debiteur = 1; } else { warn("?".__x("Ongeldig dagboek voor relatie: {dbk}", dbk => $dbk)."\n"); return; } $dbk = $id; $ddesc = $desc; } # Invoeren nieuwe relatie. # Koppeling debiteur/crediteur op basis van debcrd van de # bijbehorende grootboekrekening. # Koppeling met dagboek op basis van het laagstgenummerde # inkoop/verkoop dagboek (tenzij meegegeven). my $dbcd = "acc_debcrd"; if ( $acct =~ /^(\d+)([DC]$)/i) { warn("!"._T("Waarschuwing: De toevoeging 'D' of 'C' aan het grootboeknummer wordt afgeraden! Gebruik de --dagboek optie indien nodig.")."\n"); $acct = $1; $dbcd = uc($2) eq 'D' ? 0 : 1; # Note: D -> Crediteur if ( defined($debiteur) && $dbcd == $debiteur ) { warn("?".__x("Dagboek {dbk} implicieert {typ1} maar {acct} impliceert {typ2}", dbk => $ddesc, typ1 => lc($debiteur ? _T("Debiteur") : _T("Crediteur")), acct => $acct.$2, typ2 => lc($dbcd ? _T("Crediteur") : _T("Debiteur")))."\n"); return; } } my $rr = $dbh->do("SELECT acc_desc,acc_balres,$dbcd". " FROM Accounts". " WHERE acc_id = ?", $acct); unless ( $rr ) { warn("?".__x("Onbekende grootboekrekening: {acct}", acct => $acct). "\n"); return; } my ($adesc, $balres, $debcrd) = @$rr; if ( $balres ) { warn("!".__x("Grootboekrekening {acct} ({desc}) is een balansrekening", acct => $acct, desc => $adesc)."\n"); return; } $debcrd = defined($debiteur) ? $debiteur : 0+!!$debcrd; unless ( $dbk ) { my $sth = $dbh->sql_exec("SELECT dbk_id, dbk_desc". " FROM Dagboeken". " WHERE dbk_type = ?". " ORDER BY dbk_id", $debcrd ? DBKTYPE_VERKOOP : DBKTYPE_INKOOP); $rr = $sth->fetchrow_arrayref; $sth->finish; ($dbk, $ddesc) = @$rr; } $rr = $dbh->do("SELECT COUNT(*)". " FROM Relaties". " WHERE upper(rel_code) = ? AND rel_ledger = ?", uc($code), $dbk); if ( $rr->[0]) { warn("?".__x("Relatiecode {code} is niet uniek in dagboek {dbk}", code => uc($code), dbk => $ddesc)."\n"); return; } $dbh->begin_work; $dbh->sql_insert("Relaties", [qw(rel_code rel_desc rel_debcrd rel_btw_status rel_ledger rel_acc_id)], $code, $desc, $debcrd, $bstate || 0, $dbk, $acct); $dbh->commit; $debcrd ? __x("Debiteur {code} -> {acct} ({desc}), dagboek {dbk}", code => $code, acct => $acct, desc => $adesc, dbk => $ddesc) : __x("Crediteur {code} -> {acct} ({desc}), dagboek {dbk}", code => $code, acct => $acct, desc => $adesc, dbk => $ddesc); } 1; EekBoek-2.02.04/lib/EB/Wx/0000755000076500007650000000000012165465617012465 5ustar jvjvEekBoek-2.02.04/lib/EB/Wx/FakeApp.pm0000444000076500007650000000021612165465617014327 0ustar jvjv#! perl package main; our $app; # Note: a non-null $app is a signal for EB to load the GUI version of # the Locale module. $app = {}; 1; EekBoek-2.02.04/lib/EB/Wx/IniWiz/0000755000076500007650000000000012165465617013676 5ustar jvjvEekBoek-2.02.04/lib/EB/Wx/IniWiz/OpenDialog.pm0000444000076500007650000001243312165465617016256 0ustar jvjv#! perl package main; use strict; use utf8; package EB::Wx::IniWiz::OpenDialog; use base qw(Wx::Dialog); use strict; use EB qw(_T); use Wx qw[wxID_OK wxID_CANCEL wxID_NEW wxID_REMOVE wxID_ANY wxBITMAP_TYPE_ANY wxDefaultPosition wxDefaultSize wxDEFAULT_DIALOG_STYLE wxHORIZONTAL wxVERTICAL wxALIGN_CENTER_VERTICAL wxLEFT wxRIGHT wxALL wxTOP wxBOTTOM wxEXPAND wxLB_SINGLE ]; # Dummy as of Wx 2.8, but still generated by wxGlade. { no warnings 'redefine'; sub wxADJUST_MINSIZE() { 0 } } sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; # begin wxGlade: EB::Wx::IniWiz::OpenDialog::new $style = wxDEFAULT_DIALOG_STYLE unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $self->{sizer_6_staticbox} = Wx::StaticBox->new($self, wxID_ANY, _T("Beschikbare administraties") ); $self->{bm_logo} = Wx::StaticBitmap->new($self, wxID_ANY, Wx::Bitmap->new("ebwiz.jpg", wxBITMAP_TYPE_ANY), wxDefaultPosition, wxDefaultSize, ); $self->{lb_adm} = Wx::ListBox->new($self, wxID_ANY, wxDefaultPosition, wxDefaultSize, [], wxLB_SINGLE); $self->{static_line_1} = Wx::StaticLine->new($self, wxID_ANY, wxDefaultPosition, wxDefaultSize, ); $self->{b_new} = Wx::Button->new($self, wxID_NEW, ""); $self->{b_remove} = Wx::Button->new($self, wxID_REMOVE, ""); $self->{b_cancel} = Wx::Button->new($self, wxID_CANCEL, ""); $self->{b_accept} = Wx::Button->new($self, wxID_OK, ""); $self->__set_properties(); $self->__do_layout(); Wx::Event::EVT_LISTBOX_DCLICK($self, $self->{lb_adm}->GetId, \&OnSelectAndGo); Wx::Event::EVT_BUTTON($self, $self->{b_new}->GetId, \&OnNew); Wx::Event::EVT_BUTTON($self, $self->{b_remove}->GetId, \&OnRemove); Wx::Event::EVT_BUTTON($self, $self->{b_cancel}->GetId, \&OnCancel); Wx::Event::EVT_BUTTON($self, $self->{b_accept}->GetId, \&OnOpen); # end wxGlade $self->SetSize(0, 0, $self->GetSizeWH); $self->Center; return $self; } sub init { my ( $self, $dirs ) = @_; $self->{lb_adm}->Append($dirs); $self->{lb_adm}->SetSelection(0); $self->{lb_adm}->SetFocus; $self->{b_accept}->SetFocus if @$dirs == 1; $self->{b_new}->SetFocus if @$dirs == 0; } sub GetSelection { my ( $self ) = @_; $self->{lb_adm}->GetSelection; } sub __set_properties { my $self = shift; # begin wxGlade: EB::Wx::IniWiz::OpenDialog::__set_properties $self->SetTitle(_T("Administratiekeuze")); $self->SetSize(Wx::Size->new(776, 376)); $self->{lb_adm}->SetSelection(0); # end wxGlade } sub __do_layout { my $self = shift; # begin wxGlade: EB::Wx::IniWiz::OpenDialog::__do_layout $self->{sizer_1} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_1a} = Wx::BoxSizer->new(wxVERTICAL); $self->{sizer_2} = Wx::BoxSizer->new(wxVERTICAL); $self->{sizer_3} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_5} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_6}= Wx::StaticBoxSizer->new($self->{sizer_6_staticbox}, wxVERTICAL); $self->{sizer_7} = Wx::BoxSizer->new(wxVERTICAL); $self->{sizer_7}->Add($self->{bm_logo}, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{sizer_5}->Add($self->{sizer_7}, 0, wxRIGHT|wxEXPAND, 15); $self->{sizer_6}->Add($self->{lb_adm}, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 2); $self->{sizer_5}->Add($self->{sizer_6}, 1, wxEXPAND, 0); $self->{sizer_2}->Add($self->{sizer_5}, 1, wxEXPAND, 0); $self->{sizer_2}->Add($self->{static_line_1}, 0, wxTOP|wxBOTTOM|wxEXPAND, 10); $self->{sizer_3}->Add(5, 5, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{sizer_3}->Add($self->{b_new}, 0, wxADJUST_MINSIZE, 0); $self->{sizer_3}->Add($self->{b_remove}, 0, wxLEFT|wxADJUST_MINSIZE, 5); $self->{sizer_3}->Add($self->{b_cancel}, 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5); $self->{sizer_3}->Add($self->{b_accept}, 0, wxADJUST_MINSIZE, 0); $self->{sizer_2}->Add($self->{sizer_3}, 0, wxEXPAND, 0); $self->{sizer_1a}->Add($self->{sizer_2}, 1, wxEXPAND, 5); $self->{sizer_1}->Add($self->{sizer_1a}, 1, wxALL|wxEXPAND, 10); $self->SetSizer($self->{sizer_1}); $self->Layout(); # end wxGlade } sub OnNew { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OpenDialog::OnNew $self->EndModal( wxID_NEW ); # end wxGlade } sub OnRemove { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OpenDialog::OnRemove $self->EndModal( wxID_REMOVE ); # end wxGlade } sub OnCancel { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OpenDialog::OnCancel $self->EndModal( wxID_CANCEL ); # end wxGlade } sub OnOpen { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OpenDialog::OnOpen $self->EndModal( wxID_OK ); # end wxGlade } sub OnSelectAndGo { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OpenDialog::OnSelectAndGo $self->EndModal( wxID_OK ); # end wxGlade } # end of class EB::Wx::IniWiz::OpenDialog 1; EekBoek-2.02.04/lib/EB/Wx/Locale.pm0000444000076500007650000000334712165465617014227 0ustar jvjv#! perl # Locale.pm -- EB Locale setup (GUI version) # Author : Johan Vromans # Created On : Fri Sep 16 20:27:25 2005 # Last Modified By: Johan Vromans # Last Modified On: Tue Mar 8 14:07:23 2011 # Update Count : 161 # Status : Unknown, Use with caution! package EB::Locale; # IMPORTANT: # # This module is used (require-d) by module EB only. # No other modules should try to play localisation tricks. # # Note: Only _T must be defined. The rest is defined in EB::Utils. use strict; use constant GUIPACKAGE => "ebwxshell"; use constant COREPACKAGE => "ebcore"; use base qw(Exporter); our @EXPORT_OK = qw(_T); our @EXPORT = @EXPORT_OK; use Wx qw(wxLANGUAGE_DEFAULT wxLOCALE_LOAD_DEFAULT); use Wx::Locale gettext => '_T'; my $gui_localiser; our $LOCALISER = "Wx::Locale"; unless ( $gui_localiser ) { $gui_localiser = Wx::Locale->new( wxLOCALE_LOAD_DEFAULT, wxLOCALE_LOAD_DEFAULT ); __PACKAGE__->_set_language( wxLANGUAGE_DEFAULT ); } sub get_language { $gui_localiser->GetCanonicalName; } sub _set_language { # Set/change language. my ($self, $lang) = @_; $gui_localiser->Init( $lang, wxLOCALE_LOAD_DEFAULT ); # Since EB is use-ing Locale, we cannot use the EB exported libfile yet. $gui_localiser->AddCatalogLookupPathPrefix(EB::libfile("locale")); $gui_localiser->AddCatalog(GUIPACKAGE); $gui_localiser->AddCatalog(COREPACKAGE); } sub set_language { # Set/change language. my ($self, $lang) = @_; $lang =~ s/\..*//; # strip .utf8 my $info = Wx::Locale::FindLanguageInfo($lang); unless ( $info ) { # Universal error message. warn("%Ne povos sxangi la lingvon -- Neniu dateno por $lang\n"); return; } $self->_set_language( $info->GetLanguage ); } 1; EekBoek-2.02.04/lib/EB/Wx/IniWiz.pm0000444000076500007650000011600612165465617014236 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; package main; use strict; use warnings; use EekBoek; use EB; use EB::Tools::MiniAdm; use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); our $app; our $cfg; our $bin; our @ebz; # ( [ "filename.ebz", "flags" ], [...], ... ) my @configs = ( qw( schema.dat mutaties.eb relaties.eb opening.eb ) ); package EB::Wx::IniWiz; use base qw(Wx::Frame); use EB; use File::Spec; use File::Basename; use File::Glob qw(:glob); # glob that allows space (for Windows); my @db_drivers; my @adm_dirs; my @adm_names; my $runeb; my $default = _T("--standaard--"); use Wx qw[ wxADJUST_MINSIZE wxALIGN_CENTER_VERTICAL wxALL wxBITMAP_TYPE_ANY wxBOTTOM wxCANCEL wxCONFIG_USE_LOCAL_FILE wxDEFAULT_FRAME_STYLE wxDefaultPosition wxDefaultSize wxEXPAND wxHORIZONTAL wxICON_ERROR wxICON_INFORMATION wxID_CANCEL wxID_NEW wxID_OK wxID_OPEN wxID_REMOVE wxLEFT wxNORMAL wxOK wxRA_SPECIFY_ROWS wxRIGHT wxSP_ARROW_KEYS wxTELETYPE wxTE_AUTO_URL wxTE_MULTILINE wxTE_PASSWORD wxTE_READONLY wxTOP wxVERTICAL ]; # Dummy as of Wx 2.8, but still generated by wxGlade. { no warnings 'redefine'; sub wxADJUST_MINSIZE() { 0 } } # The wizard panels. my $wp; for ( qw( select admname btw batch db confirm ) ) { $wp->{$_} = sprintf("wiz_p%02d", 0+keys(%$wp)); } sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; # begin wxGlade: EB::Wx::IniWiz::new $style = wxDEFAULT_FRAME_STYLE unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $self->{p_dummy} = Wx::Panel->new($self, -1, wxDefaultPosition, wxDefaultSize, ); $self->{wiz_p05} = Wx::WizardPanel->new($self->{p_dummy}, -1, wxDefaultPosition, wxDefaultSize, ); $self->{wiz_p04} = Wx::WizardPanel->new($self->{p_dummy}, -1, wxDefaultPosition, wxDefaultSize, ); $self->{wiz_p03} = Wx::WizardPanel->new($self->{p_dummy}, -1, wxDefaultPosition, wxDefaultSize, ); $self->{wiz_p02} = Wx::WizardPanel->new($self->{p_dummy}, -1, wxDefaultPosition, wxDefaultSize, ); $self->{wiz_p01} = Wx::WizardPanel->new($self->{p_dummy}, -1, wxDefaultPosition, wxDefaultSize, ); $self->{sizer_5_staticbox} = Wx::StaticBox->new($self->{wiz_p01}, -1, _T("Administratie") ); $self->{sizer_8_staticbox} = Wx::StaticBox->new($self->{wiz_p02}, -1, _T("BTW") ); $self->{sizer_6_staticbox} = Wx::StaticBox->new($self->{wiz_p03}, -1, _T("Dagboeken") ); $self->{sizer_4_staticbox} = Wx::StaticBox->new($self->{wiz_p04}, -1, _T("Database") ); $self->{sizer_2_staticbox} = Wx::StaticBox->new($self->{wiz_p05}, -1, _T("Bevestiging") ); $self->{wiz_p00} = Wx::WizardPanel->new($self->{p_dummy}, -1, wxDefaultPosition, wxDefaultSize, ); $self->{t_main} = Wx::TextCtrl->new($self->{p_dummy}, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY); $self->{ch_runeb} = Wx::CheckBox->new($self->{p_dummy}, -1, _T("EekBoek opstarten"), wxDefaultPosition, wxDefaultSize, ); $self->{b_details} = Wx::Button->new($self->{p_dummy}, -1, _T("Details...")); $self->{b_ok} = Wx::Button->new($self->{p_dummy}, wxID_OK, ""); $self->{label_2} = Wx::StaticText->new($self->{wiz_p00}, -1, _T("Welkom bij de EekBoek administratie-wizard."), wxDefaultPosition, wxDefaultSize, ); $self->{rb_select} = Wx::RadioBox->new($self->{wiz_p00}, -1, _T("Maak uw keuze"), wxDefaultPosition, wxDefaultSize, [_T("Een nieuwe administratie aanmaken"), _T("Verbinden met een bestaande administratie")], 0, wxRA_SPECIFY_ROWS); $self->{label_3} = Wx::StaticText->new($self->{wiz_p01}, -1, _T("Naam"), wxDefaultPosition, wxDefaultSize, ); $self->{t_adm_name} = Wx::TextCtrl->new($self->{wiz_p01}, -1, _T("Mijn eerste EekBoek"), wxDefaultPosition, wxDefaultSize, ); $self->{label_10} = Wx::StaticText->new($self->{wiz_p01}, -1, _T("Code"), wxDefaultPosition, wxDefaultSize, ); $self->{t_adm_code} = Wx::TextCtrl->new($self->{wiz_p01}, -1, "", wxDefaultPosition, wxDefaultSize, ); $self->{l_begin_date_1} = Wx::StaticText->new($self->{wiz_p01}, -1, _T("Begindatum"), wxDefaultPosition, wxDefaultSize, ); $self->{l_begin_date_2} = Wx::StaticText->new($self->{wiz_p01}, -1, _T("01-01-"), wxDefaultPosition, wxDefaultSize, ); $self->{sp_adm_begin} = Wx::SpinCtrl->new($self->{wiz_p01}, -1, "", wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxTE_AUTO_URL, 0, 100, ); $self->{l_template} = Wx::StaticText->new($self->{wiz_p01}, -1, _T("Sjabloon"), wxDefaultPosition, wxDefaultSize, ); $self->{ch_template} = Wx::Choice->new($self->{wiz_p01}, -1, wxDefaultPosition, wxDefaultSize, [_T("Lege administratie")], ); $self->{cb_btw} = Wx::CheckBox->new($self->{wiz_p02}, -1, _T("BTW toepassen op deze administratie"), wxDefaultPosition, wxDefaultSize, ); $self->{l_btw_period} = Wx::StaticText->new($self->{wiz_p02}, -1, _T("Aangifteperiode"), wxDefaultPosition, wxDefaultSize, ); $self->{ch_btw_period} = Wx::Choice->new($self->{wiz_p02}, -1, wxDefaultPosition, wxDefaultSize, [_T("Maand"), _T("Kwartaal"), _T("Jaar")], ); $self->{cb_debiteuren} = Wx::CheckBox->new($self->{wiz_p03}, -1, _T("Verkoop"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_crediteuren} = Wx::CheckBox->new($self->{wiz_p03}, -1, _T("Inkoop"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_kas} = Wx::CheckBox->new($self->{wiz_p03}, -1, _T("Kas"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_bank} = Wx::CheckBox->new($self->{wiz_p03}, -1, _T("Bank"), wxDefaultPosition, wxDefaultSize, ); $self->{label_1} = Wx::StaticText->new($self->{wiz_p04}, -1, _T("Database naam"), wxDefaultPosition, wxDefaultSize, ); $self->{t_db_name} = Wx::TextCtrl->new($self->{wiz_p04}, -1, "", wxDefaultPosition, wxDefaultSize, ); $self->{label_db_type} = Wx::StaticText->new($self->{wiz_p04}, -1, _T("Database type"), wxDefaultPosition, wxDefaultSize, ); $self->{ch_db_driver} = Wx::Choice->new($self->{wiz_p04}, -1, wxDefaultPosition, wxDefaultSize, [_T("PostgreSQL"), _T("SQLite")], ); $self->{label_db_host} = Wx::StaticText->new($self->{wiz_p04}, -1, _T("Server host"), wxDefaultPosition, wxDefaultSize, ); $self->{t_db_host} = Wx::TextCtrl->new($self->{wiz_p04}, -1, "", wxDefaultPosition, wxDefaultSize, ); $self->{label_db_port} = Wx::StaticText->new($self->{wiz_p04}, -1, _T("Server port"), wxDefaultPosition, wxDefaultSize, ); $self->{t_db_port} = Wx::TextCtrl->new($self->{wiz_p04}, -1, "", wxDefaultPosition, wxDefaultSize, ); $self->{label_db_user} = Wx::StaticText->new($self->{wiz_p04}, -1, _T("Database user"), wxDefaultPosition, wxDefaultSize, ); $self->{t_db_user} = Wx::TextCtrl->new($self->{wiz_p04}, -1, "", wxDefaultPosition, wxDefaultSize, ); $self->{label_db_password} = Wx::StaticText->new($self->{wiz_p04}, -1, _T("Password"), wxDefaultPosition, wxDefaultSize, ); $self->{t_db_password} = Wx::TextCtrl->new($self->{wiz_p04}, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD); $self->{b_db_test} = Wx::Button->new($self->{wiz_p04}, -1, _T("Test database")); $self->{label_5} = Wx::StaticText->new($self->{wiz_p05}, -1, _T("Druk op 'Voltooien' om de volgende bestanden aan te maken:"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_cr_config} = Wx::CheckBox->new($self->{wiz_p05}, -1, _T("Configuratiebestand"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_cr_schema} = Wx::CheckBox->new($self->{wiz_p05}, -1, _T("Rekeningschema"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_cr_relaties} = Wx::CheckBox->new($self->{wiz_p05}, -1, _T("Relaties (debiteuren en crediteuren)"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_cr_opening} = Wx::CheckBox->new($self->{wiz_p05}, -1, _T("Openingsgegevens"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_cr_mutaties} = Wx::CheckBox->new($self->{wiz_p05}, -1, _T("Mutaties (boekingen)"), wxDefaultPosition, wxDefaultSize, ); $self->{cb_cr_database} = Wx::CheckBox->new($self->{wiz_p05}, -1, _T("Database"), wxDefaultPosition, wxDefaultSize, ); $self->{label_8} = Wx::StaticText->new($self->{wiz_p05}, -1, _T("Let op! Eventuele bestaande bestanden worden overschreven!"), wxDefaultPosition, wxDefaultSize, ); $self->__set_properties(); $self->__do_layout(); Wx::Event::EVT_BUTTON($self, $self->{b_details}->GetId, \&OnDetails); Wx::Event::EVT_BUTTON($self, $self->{b_ok}->GetId, \&OnOk); # end wxGlade # Set defaults for code and db name. OnSelectAdmName( $self->{wiz} ); my $prev; for ( my $i = 0; ; $i++ ) { my $page = sprintf("wiz_p%02d", $i); last unless exists $self->{$page}; $self->{sz_main}->Detach($self->{$page}); Wx::WizardPageSimple::Chain( $self->{$prev}, $self->{$page} ) if $prev; $prev = $page; } my $dir = dirname( findlib( "templates.txt", "templates" ) ); @ebz = map { [ $_, "" ] } glob( "$dir/*.ebz" ); my $i = 0; my $dp = quotemeta( _T("Omschrijving").": " ); foreach my $ebz ( @ebz ) { require Archive::Zip; my $zip = Archive::Zip->new(); next unless $zip->read($ebz->[0]) == ::AZ_OK; my $desc = $zip->zipfileComment; if ( $desc =~ /flags:\s*(.*)/i ) { $ebz->[1] = $1; } if ( $desc =~ /^$dp\s*(.*)$/m ) { $desc = $1; } elsif ( $desc =~ /export van (.*) aangemaakt door eekboek/i ) { $desc = $1; } else { $desc = $1 if $ebz->[0] =~ m/([^\\\/]+)\.ebz$/i; } $desc =~ s/[\n\r]+$//; # can't happen? think again... $self->{ch_template}->Append($desc); $i++; if ( $ebz->[0] =~ /\/sample(db)?\.ebz$/ ) { $self->{ch_template}->SetSelection($i); OnSelectTemplate( $self->{wiz} ); } } unshift (@ebz, undef ); # skeleton # Enumerate DB drivers. my $drivers = find_db_drivers(); $self->{ch_db_driver}->Delete(0) while $self->{ch_db_driver}->GetCount; foreach ( sort keys %$drivers ) { push( @db_drivers, $_ ); $self->{ch_db_driver}->Append( $drivers->{$_} ); $self->{ch_db_driver}->SetSelection(@db_drivers-1) if $_ eq "sqlite"; } #### WARNING: Hard-wired reference to wiz_p04. # $self->{dc_dbpath} = Wx::DirPickerCtrl->new($self->{wiz_p04}, -1, "", _T("Kies een folder"), wxDefaultPosition, wxDefaultSize, 2 ); # $self->{grid_db}->Replace( $self->{l_placeholder_dbpath}, $self->{dc_dbpath}, 1 ); # $self->{l_placeholder_dbpath}->Destroy; # $self->{dc_dbpath}->SetToolTipString(_T("Folder waar databases worden opgeslagen (niet voor alle database typen)")); # $self->{dc_dbpath}->SetPath(_T("-- Huidige directory --")); Wx::Event::EVT_WIZARD_PAGE_CHANGING($self, $self->{wiz}->GetId, \&OnPageChanging); Wx::Event::EVT_WIZARD_FINISHED($self, $self->{wiz}->GetId, \&OnWizardFinished ); Wx::Event::EVT_WIZARD_CANCEL($self, $self->{wiz}->GetId, \&OnWizardCancel ); Wx::Event::EVT_RADIOBOX($self->{wiz}, $self->{rb_select}->GetId, \&OnSelectFunction ); Wx::Event::EVT_CHECKBOX($self->{wiz}, $self->{cb_btw}->GetId, \&OnToggleBTW ); Wx::Event::EVT_CHECKBOX($self->{wiz}, $self->{cb_cr_schema}->GetId, \&OnToggleCreate ); Wx::Event::EVT_CHECKBOX($self->{wiz}, $self->{cb_cr_opening}->GetId, \&OnToggleCreate ); Wx::Event::EVT_CHECKBOX($self->{wiz}, $self->{cb_cr_relaties}->GetId, \&OnToggleCreate ); Wx::Event::EVT_CHECKBOX($self->{wiz}, $self->{cb_cr_mutaties}->GetId, \&OnToggleCreate ); Wx::Event::EVT_CHOICE($self->{wiz}, $self->{ch_template}->GetId, \&OnSelectTemplate ); Wx::Event::EVT_TEXT($self->{wiz}, $self->{t_adm_name}->GetId, \&OnSelectAdmName ); Wx::Event::EVT_TEXT($self->{wiz}, $self->{t_adm_code}->GetId, \&OnSelectAdmCode ); Wx::Event::EVT_SPINCTRL($self->{wiz}, $self->{sp_adm_begin}->GetId, \&OnSelectAdmName ); Wx::Event::EVT_CHOICE($self->{wiz}, $self->{ch_db_driver}->GetId, \&OnSelectDbDriver ); Wx::Event::EVT_BUTTON($self->{wiz}, $self->{b_db_test}->GetId, \&OnDbTest); $self->{wiz}->SetPageSize([600,-1]); my $icon = Wx::Icon->new(); $icon->CopyFromBitmap(Wx::Bitmap->new("eb.jpg", wxBITMAP_TYPE_ANY)); $self->SetIcon($icon); $self->{wiz}->SetIcon($icon); $self->SetSize([450,300]); $self->Center; return $self; } sub runwiz { my ( $self, $opts ) = @_; $self->{wiz}->RunWizard( $self->{$wp->{select}} ); $self->{wiz}->Destroy; } sub getadm { # STATIC my ( $pkg, $opts ) = @_; chdir($opts->{admdir}); my %h; $h{$_} = 1 foreach glob( "*/" . $cfg->std_config ); $h{$_} = 1 foreach glob( "*/" . $cfg->std_config_alt ); my @files = keys(%h); @adm_names = (); @adm_dirs = (); foreach ( sort @files ) { push( @adm_dirs, dirname($_) ); my $desc = $adm_dirs[-1]; if ( open( my $fd, '<:utf8', $adm_dirs[-1]."/opening.eb" ) ) { while ( <$fd> ) { next unless /adm_naam\s+"(.+)"/; $desc = $1; last; } close($fd); } push( @adm_names, $desc); } my $ret = wxID_NEW; if ( @adm_dirs ) { require EB::Wx::IniWiz::OpenDialog; my $d = EB::Wx::IniWiz::OpenDialog->new( undef, -1, _T("Kies"), wxDefaultPosition, wxDefaultSize, ); $d->init( \@adm_names ); $ret = $d->ShowModal; if ( $ret == wxID_OK ) { chdir( $adm_dirs[ $d->GetSelection ] ) || die("chdir"); } elsif ( $ret == wxID_REMOVE ) { my $sel = $d->GetSelection; $d->Destroy; $d = Wx::MessageDialog->new( undef, $adm_names[$sel] . "\n\n" . _T("Administratie verwijderen?"), _T("Verwijderen administratie"), wxOK|wxCANCEL, wxDefaultPosition ); my $ret = $d->ShowModal; $d->Destroy; if ( $ret == wxID_OK ) { use File::Path qw(remove_tree); remove_tree( $adm_dirs[$sel], { verbose => 1 } ); } # Try again. return getadm( $pkg, $opts ); } $d->Destroy; } return $ret; } sub __set_properties { my $self = shift; my $year = 1900 + (localtime(time))[5]; $self->{sp_adm_begin}->SetRange( $year-100, $year+100 ); $self->{sp_adm_begin}->SetValue( $year ); # begin wxGlade: EB::Wx::IniWiz::__set_properties $self->SetTitle(_T("EekBoek MiniAdm Setup")); $self->{t_main}->SetFont(Wx::Font->new(10, wxTELETYPE, wxNORMAL, wxNORMAL, 0, "")); $self->{ch_runeb}->SetValue(1); $self->{b_details}->Show(0); $self->{b_ok}->Enable(0); $self->{rb_select}->SetSelection(0); $self->{wiz_p00}->Show(0); $self->{t_adm_name}->SetToolTipString(_T("Een omschrijving van deze administratie, bijvoorbeeld \"Boekhouding 2009\".")); $self->{t_adm_code}->SetToolTipString(_T("Een korte, unieke aanduiding van deze administratie, bijvoorbeeld \"admin2009\".")); $self->{sp_adm_begin}->SetToolTipString(_T("De begindatum. Het boekjaar begint op 1 januari van dit jaar.")); $self->{ch_template}->SetSelection(0); $self->{wiz_p01}->Show(0); $self->{cb_btw}->SetToolTipString(_T("BTW toepassen")); $self->{cb_btw}->SetValue(1); $self->{ch_btw_period}->SetToolTipString(_T("De aangifteperiode voor de omzetbelasting")); $self->{ch_btw_period}->SetSelection(1); $self->{wiz_p02}->Show(0); $self->{cb_debiteuren}->SetToolTipString(_T("Verkoop- en Debiteurenadministratie")); $self->{cb_debiteuren}->SetValue(1); $self->{cb_crediteuren}->SetToolTipString(_T("Inkoop- en Crediteurenadministratie")); $self->{cb_crediteuren}->SetValue(1); $self->{cb_kas}->SetToolTipString(_T("Kas (contant geld)")); $self->{cb_kas}->SetValue(1); $self->{cb_bank}->SetToolTipString(_T("Er wordt gebruik gemaakt van een bankrekening")); $self->{cb_bank}->SetValue(1); $self->{wiz_p03}->Show(0); $self->{t_db_name}->SetToolTipString(_T("De naam van de aan te maken database, b.v. \"admin2009\".")); $self->{ch_db_driver}->SetToolTipString(_T("Het databasesysteem waar de database wordt opgeslagen")); $self->{ch_db_driver}->SetSelection(1); $self->{label_db_host}->Enable(0); $self->{t_db_host}->SetToolTipString(_T("Het systeem waarop de database server draait, indien niet lokaal.")); $self->{t_db_host}->Enable(0); $self->{label_db_port}->Enable(0); $self->{t_db_port}->SetToolTipString(_T("De netwerkpoort waarop de database server luistert, indien niet lokaal.")); $self->{t_db_port}->Enable(0); $self->{label_db_user}->Enable(0); $self->{t_db_user}->SetToolTipString(_T("De user naam voor de database server.")); $self->{t_db_user}->Enable(0); $self->{label_db_password}->Enable(0); $self->{t_db_password}->SetToolTipString(_T("Het password van deze user.")); $self->{t_db_password}->Enable(0); $self->{wiz_p04}->Show(0); $self->{cb_cr_config}->SetValue(1); $self->{cb_cr_schema}->SetToolTipString(_T("Rekeningschema, dagboeken, BTW instellingen")); $self->{cb_cr_schema}->SetValue(1); $self->{cb_cr_relaties}->SetToolTipString(_T("Debiteuren en Crediteuren")); $self->{cb_cr_relaties}->SetValue(1); $self->{cb_cr_opening}->SetToolTipString(_T("Administratieve gegevens")); $self->{cb_cr_opening}->SetValue(1); $self->{cb_cr_mutaties}->SetToolTipString(_T("Mutaties (boekingen)")); $self->{cb_cr_mutaties}->SetValue(1); $self->{cb_cr_database}->SetToolTipString(_T("De database wordt aangemaakt en gevuld")); $self->{cb_cr_database}->SetValue(1); $self->{wiz_p05}->Show(0); # end wxGlade $self->{cb_cr_schema }->SetValue( ! -f "schema.dat" ); $self->{cb_cr_opening }->SetValue( ! -f "opening.eb" ); $self->{cb_cr_mutaties}->SetValue( ! -f "mutaties.eb" ); $self->{cb_cr_relaties}->SetValue( ! -f "relaties.eb" ); $self->{cb_cr_config }->SetValue( ! ( -f $cfg->std_config || -f $cfg->std_config_alt ) ); $self->{t_db_name}->SetValue(sprintf("adm%04d", 1900+(localtime(time))[5])); $self->{t_db_host}->SetValue( $ENV{EB_DB_HOST} || $default ); $self->{t_db_port}->SetValue( $ENV{EB_DB_PORT} || $default ); $self->{t_db_user}->SetValue( $ENV{EB_DB_USER} || $default ); $self->{t_db_password}->SetValue( $ENV{EB_DB_PASSWORD} || "" ); } sub __do_layout { my $self = shift; # begin wxGlade: EB::Wx::IniWiz::__do_layout $self->{sz_dummy} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sz_main} = Wx::BoxSizer->new(wxVERTICAL); $self->{sizer_1} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_2}= Wx::StaticBoxSizer->new($self->{sizer_2_staticbox}, wxVERTICAL); $self->{grid_sizer_5} = Wx::FlexGridSizer->new(6, 1, 5, 5); $self->{sizer_16} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_4}= Wx::StaticBoxSizer->new($self->{sizer_4_staticbox}, wxVERTICAL); $self->{grid_db} = Wx::FlexGridSizer->new(7, 2, 5, 5); $self->{sizer_15} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_6}= Wx::StaticBoxSizer->new($self->{sizer_6_staticbox}, wxHORIZONTAL); $self->{grid_sizer_3} = Wx::FlexGridSizer->new(4, 1, 5, 5); $self->{sizer_14} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_8}= Wx::StaticBoxSizer->new($self->{sizer_8_staticbox}, wxHORIZONTAL); $self->{grid_sizer_4} = Wx::FlexGridSizer->new(2, 1, 5, 5); $self->{sizer_7} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_13} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_5}= Wx::StaticBoxSizer->new($self->{sizer_5_staticbox}, wxHORIZONTAL); $self->{grid_sizer_2} = Wx::FlexGridSizer->new(4, 2, 5, 5); $self->{sizer_3} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_11} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_17} = Wx::BoxSizer->new(wxVERTICAL); $self->{sizer_9} = Wx::BoxSizer->new(wxVERTICAL); $self->{sz_buttons} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sizer_9}->Add($self->{t_main}, 1, wxBOTTOM|wxEXPAND|wxADJUST_MINSIZE, 10); $self->{sizer_9}->Add($self->{ch_runeb}, 0, wxBOTTOM|wxADJUST_MINSIZE, 10); $self->{sz_buttons}->Add(1, 1, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{sz_buttons}->Add($self->{b_details}, 0, wxLEFT|wxRIGHT|wxADJUST_MINSIZE, 5); $self->{sz_buttons}->Add($self->{b_ok}, 0, wxADJUST_MINSIZE, 0); $self->{sizer_9}->Add($self->{sz_buttons}, 0, wxEXPAND, 0); $self->{sz_main}->Add($self->{sizer_9}, 1, wxALL|wxEXPAND, 10); $self->{sizer_17}->Add($self->{label_2}, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{sizer_17}->Add($self->{rb_select}, 1, wxEXPAND|wxADJUST_MINSIZE, 10); $self->{sizer_11}->Add($self->{sizer_17}, 1, wxEXPAND, 0); $self->{wiz_p00}->SetSizer($self->{sizer_11}); $self->{sz_main}->Add($self->{wiz_p00}, 0, wxEXPAND, 0); $self->{grid_sizer_2}->Add($self->{label_3}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_sizer_2}->Add($self->{t_adm_name}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_sizer_2}->Add($self->{label_10}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_sizer_2}->Add($self->{t_adm_code}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_sizer_2}->Add($self->{l_begin_date_1}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{sizer_3}->Add($self->{l_begin_date_2}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{sizer_3}->Add($self->{sp_adm_begin}, 0, wxADJUST_MINSIZE, 0); $self->{grid_sizer_2}->Add($self->{sizer_3}, 1, wxEXPAND, 0); $self->{grid_sizer_2}->Add($self->{l_template}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_sizer_2}->Add($self->{ch_template}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_sizer_2}->AddGrowableCol(1); $self->{sizer_5}->Add($self->{grid_sizer_2}, 1, wxALL|wxEXPAND, 5); $self->{sizer_13}->Add($self->{sizer_5}, 1, wxEXPAND, 0); $self->{wiz_p01}->SetSizer($self->{sizer_13}); $self->{sz_main}->Add($self->{wiz_p01}, 0, wxEXPAND, 0); $self->{grid_sizer_4}->Add($self->{cb_btw}, 0, wxADJUST_MINSIZE, 0); $self->{sizer_7}->Add($self->{l_btw_period}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{sizer_7}->Add($self->{ch_btw_period}, 0, wxLEFT|wxEXPAND|wxADJUST_MINSIZE, 5); $self->{grid_sizer_4}->Add($self->{sizer_7}, 1, wxEXPAND, 0); $self->{grid_sizer_4}->AddGrowableCol(0); $self->{sizer_8}->Add($self->{grid_sizer_4}, 1, wxALL|wxEXPAND, 5); $self->{sizer_14}->Add($self->{sizer_8}, 1, wxEXPAND, 0); $self->{wiz_p02}->SetSizer($self->{sizer_14}); $self->{sz_main}->Add($self->{wiz_p02}, 0, wxEXPAND, 0); $self->{grid_sizer_3}->Add($self->{cb_debiteuren}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_sizer_3}->Add($self->{cb_crediteuren}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_sizer_3}->Add($self->{cb_kas}, 0, wxADJUST_MINSIZE, 0); $self->{grid_sizer_3}->Add($self->{cb_bank}, 0, wxADJUST_MINSIZE, 0); $self->{sizer_6}->Add($self->{grid_sizer_3}, 1, wxALL|wxEXPAND, 5); $self->{sizer_15}->Add($self->{sizer_6}, 1, wxEXPAND, 0); $self->{wiz_p03}->SetSizer($self->{sizer_15}); $self->{sz_main}->Add($self->{wiz_p03}, 0, wxEXPAND, 0); $self->{grid_db}->Add($self->{label_1}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{t_db_name}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{label_db_type}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{ch_db_driver}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{label_db_host}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{t_db_host}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{label_db_port}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{t_db_port}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{label_db_user}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{t_db_user}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{label_db_password}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{t_db_password}, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add(0, 0, 0, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{grid_db}->Add($self->{b_db_test}, 0, wxADJUST_MINSIZE, 0); $self->{grid_db}->AddGrowableCol(1); $self->{sizer_4}->Add($self->{grid_db}, 1, wxALL|wxEXPAND, 5); $self->{sizer_16}->Add($self->{sizer_4}, 1, wxEXPAND, 0); $self->{wiz_p04}->SetSizer($self->{sizer_16}); $self->{sz_main}->Add($self->{wiz_p04}, 0, wxEXPAND, 0); $self->{sizer_2}->Add($self->{label_5}, 0, wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); $self->{grid_sizer_5}->Add($self->{cb_cr_config}, 0, wxADJUST_MINSIZE, 0); $self->{grid_sizer_5}->Add($self->{cb_cr_schema}, 0, wxADJUST_MINSIZE, 0); $self->{grid_sizer_5}->Add($self->{cb_cr_relaties}, 0, wxADJUST_MINSIZE, 0); $self->{grid_sizer_5}->Add($self->{cb_cr_opening}, 0, wxADJUST_MINSIZE, 0); $self->{grid_sizer_5}->Add($self->{cb_cr_mutaties}, 0, wxADJUST_MINSIZE, 0); $self->{grid_sizer_5}->Add($self->{cb_cr_database}, 0, wxADJUST_MINSIZE, 0); $self->{sizer_2}->Add($self->{grid_sizer_5}, 1, wxALL|wxEXPAND, 5); $self->{sizer_2}->Add($self->{label_8}, 0, wxALL|wxADJUST_MINSIZE, 5); $self->{sizer_1}->Add($self->{sizer_2}, 1, wxEXPAND, 5); $self->{wiz_p05}->SetSizer($self->{sizer_1}); $self->{sz_main}->Add($self->{wiz_p05}, 0, wxEXPAND, 0); $self->{p_dummy}->SetSizer($self->{sz_main}); $self->{sz_dummy}->Add($self->{p_dummy}, 1, wxEXPAND, 0); $self->SetSizer($self->{sz_dummy}); $self->{sz_dummy}->Fit($self); $self->Layout(); # end wxGlade } sub OnSelectFunction { my ( $self, $event ) = @_; $self = $self->GetParent; my @hideshow = qw( l_begin_date_1 l_begin_date_2 sp_adm_begin l_template ch_template ); my @hideshow0 = qw( schema relaties mutaties database ); my @hideshow1 = qw( config opening ); if ( $self->{rb_select}->GetSelection == 0 ) { Wx::WizardPageSimple::Chain( $self->{$wp->{select}}, $self->{$wp->{admname}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{admname}}, $self->{$wp->{btw}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{btw}}, $self->{$wp->{batch}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{batch}}, $self->{$wp->{db}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{db}}, $self->{$wp->{confirm}} ); foreach ( @hideshow0, @hideshow1 ) { $self->{"cb_cr_$_"}->SetValue(1); $self->{"cb_cr_$_"}->Enable(1); $self->{"cb_cr_$_"}->Show(1); } foreach ( @hideshow ) { $self->{$_}->Show(1); } $self->Layout; OnSelectTemplate( $self->{wiz} ); } else { Wx::WizardPageSimple::Chain( $self->{$wp->{select}}, $self->{$wp->{admname}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{admname}}, $self->{$wp->{db}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{db}}, $self->{$wp->{confirm}} ); for ( my $i = 0; $i < @db_drivers; $i++ ) { next unless $db_drivers[$i] eq "postgres"; $self->{ch_db_driver}->SetSelection($i); OnSelectDbDriver( $self->{wiz} ); last; } foreach ( @hideshow1 ) { $self->{"cb_cr_$_"}->SetValue(1); $self->{"cb_cr_$_"}->Enable(0); } foreach ( @hideshow0 ) { $self->{"cb_cr_$_"}->SetValue(0); $self->{"cb_cr_$_"}->Show(0); } foreach ( @hideshow ) { $self->{$_}->Show(0); } $self->Layout; } } sub OnPageChanging { my ($self, $event) = @_; return unless $event->GetDirection; my $page = $event->GetPage; if ( $page->GetId == $self->{$wp->{admname}}->GetId ) { my $nu = sub { my $m = Wx::MessageDialog->new($self->{wiz}, shift, _T("Niet uniek"), wxICON_ERROR|wxOK ); my $ret = $m->ShowModal; $m->Destroy; return $ret; }; my $c = $self->{t_adm_name}->GetValue; foreach ( @adm_names ) { next unless lc($_) eq lc($c); $nu->( _T("Er bestaat al een administratie met deze naam.") ); $event->Veto; # The code will probable also be duplicate. # Prevent double warning. return; } $c = $self->{t_adm_code}->GetValue; foreach ( @adm_dirs ) { next unless lc($_) eq lc($c); $nu->( _T("Er bestaat al een administratie met deze code.") ); $event->Veto; last; } } if ( $page->GetId == $self->{$wp->{db}}->GetId ) { return unless $self->{rb_select}->GetSelection; my $res = $self->_dbtest; if ( $res ) { my $m = Wx::MessageDialog->new($self->{wiz}, $res, _T("Database Test Resultaat"), wxICON_INFORMATION | wxOK ); $m->ShowModal; $m->Destroy; $event->Veto; } } } sub OnToggleBTW { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnToggleBTW $self = $self->GetParent; my $x = $self->{cb_btw}->IsChecked ? 1 : 0; $self->{ch_btw_period}->Enable($x); $self->{l_btw_period}->Enable($x); # end wxGlade } sub OnSelectTemplate { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnSelectTemplate $self = $self->GetParent; my $x = $self->{ch_template}->GetSelection; if ( $x ) { if ( $ebz[$x]->[1] =~ /\B-btw\b/i ) { $self->{cb_btw}->SetValue(0); $self->{cb_btw}->Enable(0); $self->{ch_btw_period}->Enable(0); $self->{l_btw_period}->Enable(0); Wx::WizardPageSimple::Chain( $self->{$wp->{admname}}, $self->{$wp->{db}} ); } else { $self->{cb_btw}->SetValue(1); $self->{cb_btw}->Enable(0); $self->{ch_btw_period}->Enable(1); $self->{l_btw_period}->Enable(1); Wx::WizardPageSimple::Chain( $self->{$wp->{admname}}, $self->{$wp->{btw}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{btw}}, $self->{$wp->{db}} ); } } else { $self->{cb_btw}->Enable(1); Wx::WizardPageSimple::Chain( $self->{$wp->{admname}}, $self->{$wp->{btw}} ); Wx::WizardPageSimple::Chain( $self->{$wp->{btw}}, $self->{$wp->{batch}} ); } # end wxGlade } sub OnSelectAdmName { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnSelectAdmName $self = $self->GetParent; my $x = lc $self->{t_adm_name}->GetValue; $x =~ s/\s+/_/g; $x =~ s/\W//g; $x .= "_" . $self->{sp_adm_begin}->GetValue; $self->{t_adm_code}->SetValue($x); $self->{t_db_name}->SetValue($x); # end wxGlade } sub OnSelectAdmCode { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnSelectAdmCode $self = $self->GetParent; my $x = lc $self->{t_adm_code}->GetValue; $x =~ s/\s+/_/g; $x =~ s/\W//g; # $x .= "_" . $self->{sp_adm_begin}->GetValue; $self->{t_db_name}->SetValue($x); # end wxGlade } sub OnToggleCreate { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnToggleBTW $self = $self->GetParent; my $x = $event->GetEventObject->IsChecked ? 1 : 0; $self->{ "cb_cr_$_" }->SetValue($x) foreach qw(schema relaties opening mutaties); # end wxGlade } sub OnWizardFinished { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnWizardFinished my %opts; $opts{lang} = $ENV{EB_LANG} || $ENV{LANG}; $opts{lang} =~ s/\..*//; # strip .utf8 $opts{adm_naam} = $self->{t_adm_name}->GetValue; $opts{adm_code} = $self->{t_adm_code}->GetValue; $opts{adm_begindatum} = $self->{sp_adm_begin}->GetValue; $opts{db_naam} = $self->{t_db_name}->GetValue; $opts{db_driver} = $db_drivers[$self->{ch_db_driver}->GetSelection]; $opts{db_host} = $self->{t_db_host}->GetValue if $self->{t_db_host}->IsEnabled && $self->{t_db_host}->GetValue && $self->{t_db_host}->GetValue ne $default; $opts{db_port} = $self->{t_db_port}->GetValue if $self->{t_db_port}->IsEnabled && $self->{t_db_port}->GetValue && $self->{t_db_port}->GetValue ne $default; $opts{db_user} = $self->{t_db_user}->GetValue if $self->{t_db_user}->IsEnabled && $self->{t_db_user}->GetValue && $self->{t_db_user}->GetValue ne $default; $opts{db_password} = $self->{t_db_password}->GetValue if $self->{t_db_password}->IsEnabled && $self->{t_db_password}->GetValue && $self->{t_db_password}->GetValue ne ""; #$opts{db_path} = $self->{dc_dbpath}->GetPath # if $self->{dc_dbpath}->IsEnabled # && $self->{dc_dbpath}->GetPath !~ /^--/; $opts{"has_$_"} = $self->{"cb_$_"}->IsChecked foreach qw(debiteuren crediteuren kas bank btw); $opts{"create_$_"} = $self->{"cb_cr_$_"}->IsChecked foreach qw(config schema relaties opening mutaties database); $opts{adm_btwperiode} = qw(maand kwartaal jaar)[$self->{ch_btw_period}->GetSelection] if $opts{has_btw}; $opts{template} = $ebz[ $self->{ch_template}->GetSelection ]->[0]; if ( $opts{adm_code} ) { mkdir($opts{adm_code}) unless -d $opts{adm_code}; chdir($opts{adm_code}) or die("chdir($opts{adm_code}): $!\n");; } $self->{b_ok}->Enable(0); my $log = $self->{t_main}; eval { EB::Tools::MiniAdm->sanitize(\%opts); foreach my $c ( qw(config schema relaties opening mutaties database) ) { my $msg = __x("Aanmaken {cfg}: ", cfg => $c); $log->AppendText($msg); if ( $opts{"create_$c"} ) { if ( $c eq "database" ) { my $t = $log->GetInsertionPoint; $log->AppendText(_T("Even geduld...")); $self->Refresh; $self->Update; my $ret; EB->app_init( { app => $EekBoek::PACKAGE, %opts } ); require EB::Main; local $::app; # defeat Shell blocking of import command local @ARGV = qw( --init ); my @msg; my $out; # Intercept warn and die. local $SIG{__WARN__} = sub { push( @msg, join("\n", @_) ); }; local $SIG{__DIE__} = sub { push( @msg, "?".join("\n", @_) ); }; # Intercept STDOUT. open( my $oldout, ">&STDOUT" ); close( STDOUT ); open( STDOUT, '>', \$out ) or die("STDOUT capture fail"); $ret = EB::Main->run; # Restore STDOUT. close(STDOUT); open ( STDOUT, ">&", $oldout ); if ( $ret ) { $log->Replace($t, $log->GetInsertionPoint, _T("Mislukt")."\n"); } else { $log->Replace($t, $log->GetInsertionPoint, _T("Gereed")."\n"); } if ( $out || @msg ) { $self->{b_details}->Show(1); $self->{sz_buttons}->Layout; $self->{_details} = ""; if ( @msg ) { $self->{_details} .= _T("==== Meldingen ====")."\n"; $self->{_details} .= $_ . "\n" for @msg; } if ( $out ) { $self->{_details} .= _T("==== Uitvoer ====")."\n"; $self->{_details} .= $out . "\n"; } } $self->Update; } else { $self->Refresh; my $m = "generate_". $c; EB::Tools::MiniAdm->$m(\%opts); $log->AppendText(_T("Gereed")."\n"); $self->Update; } } else { $log->AppendText(_T("Overgeslagen")."\n"); } } }; $log->AppendText($@) if $@; $self->{b_ok}->Enable(1); $self->{b_ok}->SetFocus; unless ( -e $cfg->std_config || -e $cfg->std_config_alt ) { $self->{ch_runeb}->SetValue(0); } elsif ( $self->{rb_select}->GetSelection != 0 ) { foreach ( qw( opening.eb ) ) { $self->{ch_runeb}->SetValue(0) unless -s $_; } } else { foreach ( @configs ) { $self->{ch_runeb}->SetValue(0) unless -s $_; } } # end wxGlade } sub OnWizardCancel { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnWizardCancel $self->Show(1); $self->{t_main}->SetValue(_T("Afgebroken!")."\n"); $self->{b_ok}->Enable(1); $self->{ch_runeb}->SetValue(0); # end wxGlade } sub OnOk { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnOk $runeb = $self->{ch_runeb}->IsChecked; $self->Destroy; # end wxGlade } sub find_db_drivers { my %drivers; if ( $Cava::Packager::PACKAGED ) { # Trust packager. unless ( $Cava::Packager::PACKAGED ) { # Ignored, but force packaging. require EB::DB::Postgres; require EB::DB::Sqlite; } return { sqlite => "SQLite", postgres => "PostgreSQL", }; } foreach my $lib ( @INC ) { next unless -d "$lib/EB/DB"; foreach my $drv ( glob("$lib/EB/DB/*.pm") ) { open( my $fd, "<", $drv ) or next; while ( <$fd> ) { if ( /sub\s+type\s*{\s*"([^"]+)"\s*;?\s*}/ ) { my $s = $1; my $t = substr($drv,length("$lib/EB/DB/")); $t =~ s/\.pm$//; $drivers{lc($t)} ||= $s; last; } } close($fd); } } \%drivers; } sub OnSelectDbDriver { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnSelectDbDriver $self = $self->GetParent; my $sel = $self->{ch_db_driver}->GetSelection; my $is_default = $db_drivers[$sel] eq 'sqlite'; for ( qw( label_db_host t_db_host label_db_port t_db_port label_db_user t_db_user label_db_password t_db_password ) ) { $self->{$_}->Enable( !$is_default ); $_[0]->Layout; $self->Layout; } # end wxGlade } sub _dbtest { my $self = shift; my $drv = $db_drivers[$self->{ch_db_driver}->GetSelection]; $drv = "EB::DB::" . ucfirst($drv); my $res; my $opts; $opts->{host} = $self->{t_db_host}->GetValue if $self->{t_db_host}->IsEnabled && $self->{t_db_host}->GetValue && $self->{t_db_host}->GetValue ne $default; $opts->{port} = $self->{t_db_port}->GetValue if $self->{t_db_port}->IsEnabled && $self->{t_db_port}->GetValue && $self->{t_db_port}->GetValue ne $default; $opts->{user} = $self->{t_db_user}->GetValue if $self->{t_db_user}->IsEnabled && $self->{t_db_user}->GetValue && $self->{t_db_user}->GetValue ne $default; $opts->{password} = $self->{t_db_password}->GetValue if $self->{t_db_password}->IsEnabled && $self->{t_db_password}->GetValue && $self->{t_db_password}->GetValue ne ""; my $db; if ( $self->{rb_select}->GetSelection == 1 ) { $db = $self->{t_db_name}->GetValue; } eval { eval "use $drv"; die($@) if $@; $res = $drv->feature("test") ? $drv->test( $db, $opts ) : ''; }; $res = $@ if $@; delete( $INC{"EB.pm"} ); # remove fake environment return $res; } sub OnDbTest { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnDbTest $self = $self->GetParent; my $res = $self->_dbtest; my $icon = ( $res ? wxICON_ERROR : wxICON_INFORMATION ); $icon |= wxOK; my $m = Wx::MessageDialog->new($self->{wiz}, $res || _T("Succes!"), _T("Database Test Resultaat"), $icon ); $m->ShowModal; $m->Destroy; # end wxGlade } sub OnDetails { my ($self, $event) = @_; # wxGlade: EB::Wx::IniWiz::OnDetails return unless $self->{_details}; $self->{t_main}->SetValue( $self->{_details} ); $self->{_details} = ""; $self->{b_details}->Enable(0); # end wxGlade } # end of class EB::Wx::IniWiz 1; package Wx::WizardPanel; use Wx qw[wxBITMAP_TYPE_ANY]; use EB; #use Wx::Locale gettext => '_T'; sub new { my ( $class, $self ) = @_; $self = $self->GetParent; $self->{wiz} ||= Wx::Wizard->new( $self, -1, _T("The Wiz"), Wx::Bitmap->new("ebwiz.jpg", wxBITMAP_TYPE_ANY )); Wx::WizardPageSimple->new( $self->{wiz} ); } package EB::Wx::IniWiz; sub run { my ( $self, $opts ) = @_; my $admdir = $opts->{admdir} || $cfg->val(qw(general admdir), $cfg->user_dir("admdir")); $runeb = 1; $admdir =~ s/\$([A-Z_]+)/$ENV{$1}/ge; if ( $admdir ) { mkdir($admdir) unless -d $admdir; die("No admdir $admdir: $!") unless -d $admdir; } $opts->{admdir} = $admdir; $runeb = 0; no warnings 'redefine'; local *Wx::App::OnInit = sub{1}; $app = Wx::App->new(); $app->SetAppName($EekBoek::PACKAGE); $app->SetVendorName("Squirrel Consultancy"); if ( $^O =~ /^mswin/i ) { Wx::ConfigBase::Get->SetPath("/ebwxiniwiz"); } else { Wx::ConfigBase::Set (Wx::FileConfig->new ( $app->GetAppName() , $app->GetVendorName() , $cfg->user_dir("ebwxiniwiz"), '', wxCONFIG_USE_LOCAL_FILE, )); } Wx::ConfigBase::Get->Write('general/appversion', $EekBoek::VERSION); my $ret = wxID_NEW; $ret = EB::Wx::IniWiz->getadm($opts) if $admdir; if ( $ret == wxID_CANCEL ) { $runeb = 0; } elsif ( $ret == wxID_NEW || $ret == wxID_OPEN || ! ( -s $cfg->std_config || -s $cfg->std_config_alt ) ) { # getadm will chdir my $top = EB::Wx::IniWiz->new(); $app->SetTopWindow($top); $top->Center; $top->Show(1); $top->runwiz; $app->MainLoop; } else { $runeb = 1; } $opts->{runeb} = $runeb; } 1; EekBoek-2.02.04/lib/EB/Wx/Help.pm0000444000076500007650000000227012165465617013712 0ustar jvjv#! perl package main; our $cfg; package EB::Wx::Help; use strict; use EB; use Wx qw(wxHF_FLATTOOLBAR wxHF_TOOLBAR wxHF_CONTENTS wxHF_SEARCH wxHF_BOOKMARKS wxHF_INDEX wxHF_PRINT wxHF_DEFAULTSTYLE); use Wx qw(wxACCEL_CTRL wxACCEL_NORMAL wxID_CLOSE); use Wx::Event; use Wx::Html; use Wx::Help; use Wx::FS; # very important for HTB to work Wx::FileSystem::AddHandler( new Wx::ZipFSHandler ); sub new { my $class = shift; my $self = Wx::HtmlHelpController->new ( wxHF_FLATTOOLBAR | wxHF_TOOLBAR # | wxHF_CONTENTS # | wxHF_INDEX | wxHF_CONTENTS # | wxHF_BOOKMARKS | wxHF_SEARCH | wxHF_PRINT ); return bless \$self, $class; } sub show_html_help { my ($self) = @_; if ( my $htb_file = findlib( "docs.htb", "help" ) ) { $$self->AddBook( $htb_file, 1 ); $$self->DisplayContents; if( my $hframe = Wx::Window::FindWindowByName('wxHtmlHelp')) { $hframe->SetAcceleratorTable (Wx::AcceleratorTable->new ( [wxACCEL_CTRL, ord 'w', wxID_CLOSE], [wxACCEL_NORMAL, 27, wxID_CLOSE], )); } } else { ::info( _T("No help available for this language"), _T("Sorry") ); } } package Wx::HtmlHelpFrame; our @ISA = qw( Wx::Frame ); 1; EekBoek-2.02.04/lib/EB/Wx/Shell/0000755000076500007650000000000012165465617013534 5ustar jvjvEekBoek-2.02.04/lib/EB/Wx/Shell/Window.pm0000444000076500007650000000352712165465617015346 0ustar jvjv#! perl package main; our $cfg; our $state; our $app; our $dbh; package EB::Wx::Shell::Window; use strict; use warnings; use Wx qw[ wxACCEL_CTRL wxACCEL_NORMAL wxID_CLOSE wxTHICK_FRAME ]; sub sizepos_save { my ($self, $posonly) = @_; my $config = Wx::ConfigBase::Get; my ( $x, $y ) = $self->GetPositionXY; $config->WriteInt( "windows/".$self->{mew}."/xpos", $x ); $config->WriteInt( "windows/".$self->{mew}."/ypos", $y ); unless ( $posonly ) { ($x, $y) = ( Wx::wxMAC ) ? $self->GetClientSizeWH : $self->GetSizeWH ; $config->WriteInt( "windows/".$self->{mew}."/xwidth", $x ); $config->WriteInt( "windows/".$self->{mew}."/ywidth", $y ); } } sub sizepos_restore { my ($self, $mew, $posonly) = @_; $self->{mew} = $mew if defined $mew; my $config = Wx::ConfigBase::Get; my $x = $config->ReadInt( "windows/".$self->{mew}."/xpos", -1 ); my $y = $config->ReadInt( "windows/".$self->{mew}."/ypos", -1 ); $self->Move( $x, $y ) if $x >= 0 && $y >= 0; unless ( $posonly ) { $x = $config->ReadInt( "windows/".$self->{mew}."/xwidth", -1 ); $y = $config->ReadInt( "windows/".$self->{mew}."/ywidth", -1 ); if ( $x >= 0 && $y >= 0 ) { $self->SetSize( $x, $y ); $self->SetClientSize([$x, $y]) if Wx::wxMAC(); } else { $self->SetSize(0, 0, $self->GetSizeWH); $self->Center; } } # For convenience: CLOSE on Ctrl-W and Esc. # (Doesn't work on GTK, yet). $self->SetAcceleratorTable (Wx::AcceleratorTable->new ( [wxACCEL_CTRL, ord 'w', wxID_CLOSE], [wxACCEL_NORMAL, 27, wxID_CLOSE], )); } #### Override sub init { shift->refresh(@_); } #### Override sub refresh { } # wxGlade insists on generating these. sub Wx::wxTHICK_FRAME() { 0 } # removed 2.x sub Wx::wxADJUST_MINSIZE() { 0 } # bogus 2.8, removed in 2.9 1; EekBoek-2.02.04/lib/EB/Wx/Shell/HtmlViewer.pm0000444000076500007650000001125612165465617016163 0ustar jvjv#! perl package main; package EB::Wx::Shell::HtmlViewer; use base qw(Wx::Dialog); use base qw(EB::Wx::Shell::Window); use strict; # begin wxGlade: ::dependencies use Wx::Locale gettext => '_T'; # end wxGlade use Wx::Html; use Wx qw[ wxADJUST_MINSIZE wxALL wxDEFAULT_DIALOG_STYLE wxDefaultPosition wxDefaultSize wxEXPAND wxHORIZONTAL wxID_CLOSE wxID_OK wxID_PRINT wxID_SAVE wxLEFT wxMAXIMIZE_BOX wxMINIMIZE_BOX wxFD_OVERWRITE_PROMPT wxRESIZE_BORDER wxFD_SAVE wxTHICK_FRAME wxVERTICAL ]; sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; # begin wxGlade: EB::Wx::Shell::HtmlViewer::new $style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxTHICK_FRAME unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $self->{b_print} = Wx::Button->new($self, wxID_PRINT, ""); $self->{b_save} = Wx::Button->new($self, wxID_SAVE, ""); $self->{p_close} = Wx::Button->new($self, wxID_CLOSE, ""); $self->{p_htmlview} = Wx::HtmlWindow->new($self, -1, wxDefaultPosition, wxDefaultSize, ); $self->__set_properties(); $self->__do_layout(); Wx::Event::EVT_BUTTON($self, $self->{b_print}->GetId, \&OnPrint); Wx::Event::EVT_BUTTON($self, $self->{b_save}->GetId, \&OnSave); Wx::Event::EVT_BUTTON($self, $self->{p_close}->GetId, \&OnClose); # end wxGlade Wx::Event::EVT_HTML_LINK_CLICKED($self->{p_htmlview}, $self->{p_htmlview}->GetId, \&OnLinkClicked); $self->{_PRINTER} = Wx::HtmlEasyPrinting->new('Print'); $self->sizepos_restore(lc($title)); return $self; } sub info_only { my ( $self ) = @_; $self->{b_print}->Hide; $self->{b_save}->Hide; } sub html { $_[0]->{p_htmlview} } sub htmltext :lvalue { $_[0]->{_HTMLTEXT} } sub printer { $_[0]->{_PRINTER} } sub __set_properties { my $self = shift; # begin wxGlade: EB::Wx::Shell::HtmlViewer::__set_properties $self->SetTitle(_T("HTML Uitvoer")); $self->SetSize(Wx::Size->new(618, 522)); $self->{p_close}->SetFocus(); $self->{p_close}->SetDefault(); # end wxGlade } sub __do_layout { my $self = shift; # begin wxGlade: EB::Wx::Shell::HtmlViewer::__do_layout $self->{sz_htmlview} = Wx::BoxSizer->new(wxVERTICAL); $self->{sz_htmlviewbuttons} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sz_htmlviewbuttons}->Add($self->{b_print}, 0, wxADJUST_MINSIZE, 0); $self->{sz_htmlviewbuttons}->Add($self->{b_save}, 0, wxLEFT|wxADJUST_MINSIZE, 5); $self->{sz_htmlviewbuttons}->Add(5, 1, 1, wxADJUST_MINSIZE, 0); $self->{sz_htmlviewbuttons}->Add($self->{p_close}, 0, wxADJUST_MINSIZE, 0); $self->{sz_htmlview}->Add($self->{sz_htmlviewbuttons}, 0, wxALL|wxEXPAND, 5); $self->{sz_htmlview}->Add($self->{p_htmlview}, 1, wxEXPAND, 0); $self->SetSizer($self->{sz_htmlview}); $self->Layout(); # end wxGlade } sub OnPrint { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::HtmlViewer::OnPrint $self->printer->SetFooter(' - @PAGENUM@ - '); $self->printer->PrintText($self->htmltext); # end wxGlade } sub OnSave { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::HtmlViewer::OnSave my $d = Wx::FileDialog->new($self, _T("Opslaan als..."), "", _T("raport.html"), _T("HTML bestanden (*.html)|*.html"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT); my $result = $d->ShowModal; if ( $result == wxID_OK ) { my $file = $d->GetPath; open(my $fd, ">", $file); print { $fd } $self->htmltext; close($fd); } # end wxGlade } sub OnClose { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::HtmlViewer::OnClose $self->sizepos_save; $self->Show(0); # end wxGlade } sub OnLinkClicked { my ($self, $event) = @_; my $link = $event->GetLinkInfo->GetHref; if ( $link =~ m;^([^:]+)://(.+)$; && (my $rep = EB::Wx::Shell::MainFrame->can("ShowR" . ucfirst(lc($1)))) ) { my @a = split(/[?&]/, $2); my $args = { select => shift(@a) }; foreach ( @a ) { if ( /^([^=]+)=(.*)/ ) { $args->{$1} = $2; } else { $args->{$_} = 1; } } $rep->($self->GetParent->GetParent, $args); } elsif ( $link =~ m;^(https?|mailto):; ) { Wx::LaunchDefaultBrowser($link); } else { Wx::LogMessage('Link: "%s"', $1); } } # end of class EB::Wx::Shell::HtmlViewer 1; EekBoek-2.02.04/lib/EB/Wx/Shell/MainFrame.pm0000444000076500007650000006345012165465617015737 0ustar jvjv#! perl package main; use strict; our $cfg; our $dbh; package EB::Wx::Shell::MainFrame; use EekBoek; use base qw(Wx::Frame); use base qw(EB::Wx::Shell::Window); use strict; use utf8; use Encode; use File::Spec; use File::Basename; # begin wxGlade: ::dependencies use Wx::Locale gettext => '_T'; # end wxGlade use EB; use EB::Wx::Shell::HtmlViewer; use EB::Wx::Shell::EditDialog; use EB::Wx::Shell::PreferencesDialog; use Wx qw[ wxADJUST_MINSIZE wxALL wxBITMAP_TYPE_ANY wxBLUE wxDEFAULT_FRAME_STYLE wxDefaultPosition wxDefaultSize wxEXPAND wxFD_FILE_MUST_EXIST wxGREEN wxHORIZONTAL wxHOURGLASS_CURSOR wxHSCROLL wxICON_ERROR wxICON_INFORMATION wxICON_WARNING wxID_ABOUT wxID_APPLY wxID_CLEAR wxID_EXIT wxID_HELP wxID_OK wxID_OPEN wxID_PREFERENCES wxLEFT wxMODERN wxNORMAL wxNullCursor wxOK wxRED wxRIGHT wxST_SIZEGRIP wxSYS_DEFAULT_GUI_FONT wxTE_MULTILINE wxTE_PROCESS_ENTER wxTE_PROCESS_TAB wxTE_READONLY wxVERTICAL ]; my $prefctl; ################ Locale ################ # Variable expansion. See GNU gettext for details. sub __expand($%) { my ($t, %args) = @_; my $re = join('|', map { quotemeta($_) } keys(%args)); #### WHOAH!!!!! # $1 seems to be stuck to the EekBoek initial message. #### WHOAH!!!!! $t =~ s/(\{)($re)\}/defined($args{$2}) ? $args{$2} : "{$2}"/ge; $t; } # Translation w/ variables. sub __x($@) { my ($t, %vars) = @_; __expand(_T($t), %vars); } # Translation w/ singular/plural handling. sub __n($$$) { my ($sing, $plur, $n) = @_; _T($n == 1 ? $sing : $plur); } # Translation w/ singular/plural handling and variables. sub __nx($$$@) { my ($sing, $plur, $n, %vars) = @_; __expand(__n($sing, $plur, $n), %vars); } # Make __xn a synonym for __nx. *__xn = \&__nx; ################ Locale ################ sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; use constant MENU_INPUTEDIT => Wx::NewId(); use constant MENU_INPUTEXEC => Wx::NewId(); use constant MENU_REP_TRIAL => Wx::NewId(); use constant MENU_REP_BAL_ACT => Wx::NewId(); use constant MENU_REP_BAL_MGP => Wx::NewId(); use constant MENU_REP_BAL_GRP => Wx::NewId(); use constant MENU_REP_BAL_GAC => Wx::NewId(); use constant MENU_REP_RES_ACT => Wx::NewId(); use constant MENU_REP_RES_MGP => Wx::NewId(); use constant MENU_REP_RES_GRP => Wx::NewId(); use constant MENU_REP_RES_GAC => Wx::NewId(); use constant MENU_REP_JNL => Wx::NewId(); use constant MENU_REP_UN => Wx::NewId(); use constant MENU_REP_AP => Wx::NewId(); use constant MENU_REP_AR => Wx::NewId(); use constant MENU_REP_VAT => Wx::NewId(); use constant MENU_HELP_SUPPORT => Wx::NewId(); # ###WARNING: Re-generating will loose # $self->__set_menubar(); # insert before $self->{s_input_staticbox} = ... # begin wxGlade: EB::Wx::Shell::MainFrame::new $style = wxDEFAULT_FRAME_STYLE unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $self->{p_dummy} = Wx::Panel->new($self, -1, wxDefaultPosition, wxDefaultSize, ); $self->__set_menubar(); $self->{s_input_staticbox} = Wx::StaticBox->new($self->{p_dummy}, -1, _T("Invoer") ); $self->{statusbar} = $self->CreateStatusBar(1, wxST_SIZEGRIP); $self->{t_output} = Wx::TextCtrl->new($self->{p_dummy}, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL); $self->{b_edit} = Wx::BitmapButton->new($self->{p_dummy}, -1, (Wx::Bitmap->new("edit.png", wxBITMAP_TYPE_ANY))); $self->{t_input} = Wx::TextCtrl->new($self->{p_dummy}, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER|wxTE_PROCESS_TAB); $self->{b_send} = Wx::BitmapButton->new($self->{p_dummy}, -1, (Wx::Bitmap->new("button_ok.png", wxBITMAP_TYPE_ANY))); $self->__set_properties(); $self->__do_layout(); Wx::Event::EVT_BUTTON($self, $self->{b_edit}->GetId, \&OnEdit); Wx::Event::EVT_TEXT_ENTER($self, $self->{t_input}->GetId, \&OnTextEnter); Wx::Event::EVT_BUTTON($self, $self->{b_send}->GetId, \&OnSend); # end wxGlade Wx::Event::EVT_MENU($self, wxID_OPEN, \&OnOpen); Wx::Event::EVT_MENU($self, wxID_PREFERENCES, \&OnPrefs); Wx::Event::EVT_MENU($self, wxID_EXIT, \&OnQuit); Wx::Event::EVT_MENU($self, wxID_CLEAR, \&OnClear); Wx::Event::EVT_MENU($self, MENU_INPUTEDIT, \&OnEdit); Wx::Event::EVT_MENU($self, MENU_INPUTEXEC, \&OnSend); Wx::Event::EVT_MENU($self, MENU_REP_TRIAL, \&OnTrial); my $i = -1; for ( MENU_REP_BAL_ACT, MENU_REP_BAL_MGP, MENU_REP_BAL_GRP, MENU_REP_BAL_GAC,) { my $sub = $i++; Wx::Event::EVT_MENU($self, $_, sub { push(@_, $sub); &OnMenuBal }); } $i = -1; for ( MENU_REP_RES_ACT, MENU_REP_RES_MGP, MENU_REP_RES_GRP, MENU_REP_RES_GAC,) { my $sub = $i++; Wx::Event::EVT_MENU($self, $_, sub { push(@_, $sub); &OnMenuRes }); } Wx::Event::EVT_MENU($self, MENU_REP_JNL, \&OnJournal); Wx::Event::EVT_MENU($self, MENU_REP_UN, \&OnMenuUns); Wx::Event::EVT_MENU($self, MENU_REP_AP, \&OnMenuAP); Wx::Event::EVT_MENU($self, MENU_REP_AR, \&OnMenuAR); Wx::Event::EVT_MENU($self, MENU_REP_VAT, \&OnMenuVAT); Wx::Event::EVT_MENU($self, wxID_HELP, \&OnHelp); Wx::Event::EVT_MENU($self, MENU_HELP_SUPPORT, \&OnSupport); Wx::Event::EVT_MENU($self, wxID_ABOUT, \&OnAbout); #### End of MenuBar Wx::Event::EVT_CLOSE($self, \&OnQuit); Wx::Event::EVT_CHAR($self->{t_input}, sub { $self->OnChar(@_) }); # Wx::Event::EVT_IDLE($self, \&OnIdle); $prefctl ||= { repwin => 0, errorpopup => 1, warnpopup => 1, infopopup => 0, histlines => 200, }; $self->SetSize(801, 551); $self->sizepos_restore("main"); return $self; } sub __set_menubar { my $self = shift; # Unfortunately, due to an error in wxGlade sub-menu # generation we need to do it ourselves. All... $self->{menubar} = Wx::MenuBar->new(); my $wxglade_tmp_menu; $wxglade_tmp_menu = Wx::Menu->new(); $wxglade_tmp_menu->Append(wxID_OPEN, _T("&Open\tCtrl-O"), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_PREFERENCES, _T("Voorkeuren..."), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_EXIT, _T("Afsluiten\tCtrl-Q"), ""); $self->{menubar}->Append($wxglade_tmp_menu, _T("&Bestand")); $wxglade_tmp_menu = Wx::Menu->new(); $wxglade_tmp_menu->Append(MENU_INPUTEDIT, _T("&Edit invoerregel\tCtrl+Enter"), ""); $wxglade_tmp_menu->Append(MENU_INPUTEXEC, _T("&Uitvoeren invoerregel\tEnter"), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_CLEAR, _T("Uitvoer schoonmaken"), ""); $self->{menubar}->Append($wxglade_tmp_menu, _T("B&ewerken")); $self->{Reports} = Wx::Menu->new(); $self->{Reports}->Append(MENU_REP_TRIAL, _T("Proef- en Saldibalans"), ""); $self->{Reports_bal} = Wx::Menu->new(); $self->{Reports_bal}->Append(MENU_REP_BAL_ACT, _T("Op grootboekrekening"), ""); $self->{Reports_bal}->AppendSeparator(); $self->{Reports_bal}->Append(MENU_REP_BAL_MGP, _T("Op hoofdverdichting"), ""); $self->{Reports_bal}->Append(MENU_REP_BAL_GRP, _T("Op verdichting"), ""); $self->{Reports_bal}->Append(MENU_REP_BAL_GAC, _T("Gedetailleerd"), ""); $self->{Reports}->Append(Wx::NewId(), _T("Balans"), $self->{Reports_bal}, ""); $self->{Reports_res} = Wx::Menu->new(); $self->{Reports_res}->Append(MENU_REP_RES_ACT, _T("Op grootboekrekening"), ""); $self->{Reports_res}->AppendSeparator(); $self->{Reports_res}->Append(MENU_REP_RES_MGP, _T("Op hoofdverdichting"), ""); $self->{Reports_res}->Append(MENU_REP_RES_GRP, _T("Op verdichting"), ""); $self->{Reports_res}->Append(MENU_REP_RES_GAC, _T("Gedetailleerd"), ""); $self->{Reports}->Append(Wx::NewId(), _T("Verlies/Winst"), $self->{Reports_res}, ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_JNL, _T("Journaal"), ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_UN, _T("Openstaande posten"), ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_AP, _T("Crediteuren"), ""); $self->{Reports}->Append(MENU_REP_AR, _T("Debiteuren"), ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_VAT, _T("BTW Aangifte"), ""); $self->{menubar}->Append($self->{Reports}, _T("&Rapporten")); $wxglade_tmp_menu = Wx::Menu->new(); $wxglade_tmp_menu->Append(wxID_HELP, _T("&Hulp..."), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(MENU_HELP_SUPPORT, _T("Ondersteuning..."), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_ABOUT, _T("Over..."), ""); $self->{menubar}->Append($wxglade_tmp_menu, _T("&Hulp")); $self->SetMenuBar($self->{menubar}); } sub __set_properties { my $self = shift; # begin wxGlade: EB::Wx::Shell::MainFrame::__set_properties $self->SetTitle(_T("EekBoek")); $self->SetSize(Wx::Size->new(800, 550)); $self->{statusbar}->SetStatusWidths(-1); my( @statusbar_fields ) = ( "" ); if( @statusbar_fields ) { $self->{statusbar}->SetStatusText($statusbar_fields[$_], $_) for 0 .. $#statusbar_fields ; } $self->{b_edit}->SetSize($self->{b_edit}->GetBestSize()); $self->{t_input}->SetFocus(); $self->{b_send}->SetSize($self->{b_send}->GetBestSize()); # end wxGlade my $f = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); $self->{t_output}->SetFont(Wx::Font->new($f->GetPointSize, wxMODERN, wxNORMAL, wxNORMAL, 0, "")); } sub __do_layout { my $self = shift; # begin wxGlade: EB::Wx::Shell::MainFrame::__do_layout $self->{sz_dummy} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{s_main} = Wx::BoxSizer->new(wxVERTICAL); $self->{s_layout} = Wx::BoxSizer->new(wxVERTICAL); $self->{s_input}= Wx::StaticBoxSizer->new($self->{s_input_staticbox}, wxHORIZONTAL); $self->{s_output} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{s_output}->Add($self->{t_output}, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{s_layout}->Add($self->{s_output}, 1, wxEXPAND, 0); $self->{s_input}->Add($self->{b_edit}, 0, wxRIGHT|wxADJUST_MINSIZE, 5); $self->{s_input}->Add($self->{t_input}, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{s_input}->Add($self->{b_send}, 0, wxLEFT|wxADJUST_MINSIZE, 5); $self->{s_layout}->Add($self->{s_input}, 0, wxEXPAND, 0); $self->{s_main}->Add($self->{s_layout}, 1, wxALL|wxEXPAND, 5); $self->{p_dummy}->SetSizer($self->{s_main}); $self->{sz_dummy}->Add($self->{p_dummy}, 1, wxEXPAND, 0); $self->SetSizer($self->{sz_dummy}); $self->Layout(); $self->SetSize(Wx::Size->new(800, 550)); # end wxGlade } sub RunCommand { my ($self, $cmd) = @_; unless ( defined $self->{_shell} ) { unless ( $self->{_ebcfg} && -s $self->{_ebcfg} ) { my $md = Wx::MessageDialog->new ($self, _T("Selecteer eerst een geldige eekboek.conf"), _T("Geen configuratie"), wxOK|wxICON_INFORMATION, wxDefaultPosition); $md->ShowModal; $md->Destroy; $self->OnOpen; return; } my $cfg = EB->app_init( { app => $EekBoek::PACKAGE, config => $self->{_ebcfg} } ); $self->{statusbar}->SetStatusText($EB::imsg, 0); $cfg->connect_db; require EB::Shell; $self->{_shell} = EB::Shell->new; } $cmd = "database" unless defined $cmd; $self->{t_output}->AppendText("eb> "); $self->ShowText($cmd, wxBLUE); $self->_cmd($cmd); } use Text::ParseWords qw(shellwords); sub _cmd { my ( $self, $cmd ) = @_; my ( @cmd ) = shellwords($cmd); # If there's a quoting mistake, parseline returns nothing. if ( $cmd =~ /\S/ && $cmd[0] !~ /\S/ ) { $self->process_stderr("?"._T("Fout in de invoerregel. Controleer de \" en ' tekens.")."\n"); return -1; } my ( $cmd, @args ) = @cmd; if (! length($cmd)) { return -1; } if ( $cmd =~ /^(balans|result|proefensaldibalans|journaal|openstaand|(?:deb|cred)iteuren|grootboek|btwaangifte)(?:\s|$)/ ) { unshift( @args, "--gen-wxhtml" ); } if ( $cmd =~ /^\s*(help|\?)/i ) { $self->OnHelp; return 1; } if ( $cmd =~ /^\s*(exit|quit|logout)/i ) { $self->OnQuit; return 1; } my $meth = "do_".lc($cmd); unless ( $self->{_shell}->can($meth) ) { $self->process_stderr("?"._T("Onbekende opdracht. \"help\" geeft een lijst van mogelijke opdrachten.")."\n"); return -1; } my ( $out, $t, @msg ); eval { # Intercept warn and die. local $SIG{__WARN__} = sub { push( @msg, join("\n", @_) ); }; local $SIG{__DIE__} = sub { push( @msg, "?".join("\n", @_) ); }; # Intercept STDOUT. open( my $oldout, ">&STDOUT" ); close( STDOUT ); open( STDOUT, '>', \$out ) or die("STDOUT capture fail"); # Call API command. $t = $self->{_shell}->$meth(@args); # Restore STDOUT. close(STDOUT); open ( STDOUT, ">&", $oldout ); }; if ($@) { my $err = $@; chomp $err; $self->process_stderr("?$err\n"); } else { # Process output. $out .= "\n" unless !$out || $out =~ /\n$/; if ( $t =~ /^[%!?]/ ) { $self->process_stderr($t); } else { $out .= $t; } $self->process_stderr($_) for @msg; $self->process_stdout($_) for split(/\n/, $out); } return 1; } sub ShowText { my ($self, $text, $colour) = @_; if ( $colour ) { my $t = Wx::TextAttr->new; $t->SetTextColour($colour); my $x0 = $self->{t_output}->GetLastPosition; $self->{t_output}->AppendText($text."\n"); $self->{t_output}->SetStyle($x0, $self->{t_output}->GetLastPosition, $t); } else { $self->{t_output}->AppendText($text."\n"); } } my $capturing; sub process_stdout { my ($self, $text) = @_; my $out = decode("utf-8", $text); # warn("app: $out\n"); if ( $capturing || $out eq "" ) { $capturing .= $out . "\n"; if ( $out eq "" ) { $self->SetCursor(wxHOURGLASS_CURSOR); } elsif ( $out eq "" ) { $self->SetCursor(wxNullCursor); my ($title) = ($capturing =~ m{(.+?)}); #warn("captured $title: ", length($capturing), " characters\n"); my $panel = $self->{prefs_repwin} ? "d_htmlpanel" : "d_htmlpanel_$title"; $self->{$panel} ||= EB::Wx::Shell::HtmlViewer->new ($self, -1, $title); $self->{$panel}->Show(0); $self->{$panel}->html->SetPage($capturing); $self->{$panel}->htmltext = $capturing; $self->{$panel}->SetTitle($title); $self->{$panel}->Show(1); $capturing = ""; } } else { $self->{t_output}->AppendText($out."\n"); } } sub process_stderr { my ($self, $text) = @_; my $out = decode("utf-8", $text); # warn("err: $out\n"); $self->ProcessMessages($out); } sub ProcessMessages { my ($self, $err) = @_; return unless $err; my @err = split(/\n+/, $err); while ( @err ) { $err = shift(@err); my @i; if ( $err =~ /^\?+(.*)/ ) { $self->ShowText($err, wxRED); next unless $self->{prefs_errorpopup}; @i = ($1, _T("Fout"), wxOK|wxICON_ERROR); } elsif ( $err =~ /^\!+(.*)/ ) { $self->ShowText($err, Wx::Colour->new("magenta")); next unless $self->{prefs_warnpopup}; @i = ($1, _T("Waarschuwing"), wxOK|wxICON_WARNING); } else { $self->ShowText($err, wxGREEN); next unless $self->{prefs_infopopup}; @i = ($err, _T("Mededeling"), wxOK|wxICON_INFORMATION); } my $md = Wx::MessageDialog->new($self, @i, wxDefaultPosition); $md->ShowModal; $md->Destroy; } } sub OnTextEnter { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnTextEnter my $cmd = $self->{t_input}->GetValue; return unless $cmd; push(@{$self->{_cmd}}, $cmd) unless $cmd eq $self->{_cmd}->[-1]; $self->{_cmdptr} = $#{$self->{_cmd}} + 1; $self->{t_input}->SetValue(""); $cmd =~ s/ *\t */ /g; $self->RunCommand($cmd); $self->{t_input}->SetFocus(); # end wxGlade } sub OnSend { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnSend &OnTextEnter; # end wxGlade } sub OnEdit { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnEdit my $d = $self->{d_editdialog} ||= EB::Wx::Shell::EditDialog->new; my $t = $self->{t_input}->GetValue; $t =~ s/\t/\n/g; $d->{t_input}->SetValue($t); $d->{t_input}->SetInsertionPoint( $self->{t_input}->GetInsertionPoint ); $d->{t_input}->SetFocus; my $ret = $d->ShowModal; $d->Show(0); return unless $ret == wxID_APPLY; $t = $d->{t_input}->GetValue; $t =~ s/\n/\t/g; $self->{t_input}->SetValue($t); &OnTextEnter; # end wxGlade } sub OnOpen { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnOpen my $fd = Wx::FileDialog->new ($self, _T("Kies"), "", "", ".eekboek.conf;eekboek.conf", 0|wxFD_FILE_MUST_EXIST, wxDefaultPosition); my $ret = $fd->ShowModal; if ( $ret == wxID_OK ) { if ( $self->{_shell} ) { EB::DB->disconnect; undef $self->{_shell}; } $self->{_ebcfg} = $fd->GetPath; chdir(dirname($fd->GetPath)); $self->RunCommand(undef); } $fd->Destroy; # end wxGlade } sub OnQuit { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnQuit $self->SaveHistory; $self->sizepos_save; $self->SavePreferences; foreach ( grep( /^d_htmlpanel/, keys(%$self) ) ) { $self->{$_}->OnClose; } foreach ( grep( /^d_.*dialog/, keys(%$self) ) ) { $self->{$_}->Destroy; } $self->Destroy; # end wxGlade } sub PutOnHistory { my ($self, $cmd) = @_; return if $cmd eq ""; $cmd =~ s/\s+--gen-wxhtml//; return if @{$self->{_cmd}} && $cmd eq $self->{_cmd}->[-1]; return if exists $self->{_cmd}->[$self->{_cmdptr}] && $cmd eq $self->{_cmd}->[$self->{_cmdptr}]; push(@{$self->{_cmd}}, $cmd); } use Wx qw(:keycode); sub OnChar { my ($self, $ctl, $event) = @_; # Get key code and char, if ordinary. my $k = $event->GetKeyCode; my $c = ($k < WXK_START) ? pack("C", $k) : ""; if ( $k == WXK_UP && $self->{_cmdptr} > 0 ) { $self->PutOnHistory($ctl->GetValue); $ctl->SetValue($self->{_cmd}->[--$self->{_cmdptr}]); $ctl->SetInsertionPointEnd; } elsif ( $k == WXK_DOWN && $self->{_cmdptr} < $#{$self->{_cmd}} ) { $self->PutOnHistory($ctl->GetValue); $ctl->SetValue($self->{_cmd}->[++$self->{_cmdptr}]); $ctl->SetInsertionPointEnd; } elsif ( $k == WXK_RETURN && $event->ControlDown ) { $self->OnEdit($event); } elsif ( $k == WXK_TAB || $k == WXK_RETURN || $k >= WXK_START || $event->HasModifiers ) { # Common controls. $event->Skip; return; } else { $event->Skip; } } sub OnHelp { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnHelp require EB::Wx::Help; my $h = EB::Wx::Help->new; $h->show_html_help; # end wxGlade } sub OnAbout { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnAbout my $year = 1900 + (localtime(time))[5]; my $md = Wx::MessageDialog->new ($self, __x("{pkg} {app} versie {ver}", pkg => $EekBoek::PACKAGE, app => "WxShell", ver => $EekBoek::VERSION)."\n". "Copyright 2007-$year Squirrel Consultancy\n\n". __x("Geschreven door {author}", author => "Johan Vromans")."\n". "\n". "http://www.squirrel.nl\n". __x("Voor ondersteuning: {url}", url => "http://www.eekboek.nl/support.html")."\n". "\n". __x("GUI ontwerp met {wxglade}", wxglade => "wxGlade, http://wxglade.sourceforge.net")."\n\n". __x("{pkg} versie {ver}", pkg => "Perl", ver => sprintf("%vd",$^V))."\n". __x("{pkg} versie {ver}", pkg => "WxPerl", ver => $Wx::VERSION)."\n". __x("{pkg} versie {ver}", pkg => "wxWidgets", ver => Wx::wxVERSION)."\n". ( $Cava::Packager::PACKAGED ? __x("{pkg} versie {ver}", pkg => "CAVA Packager", ver => $Cava::Packager::VERSION)."\n" : () ), __x("Over {pkg} {app}", pkg => $EekBoek::PACKAGE, app => "WxShell"), wxOK|wxICON_INFORMATION, wxDefaultPosition); $md->ShowModal; $md->Destroy; # end wxGlade } sub OnSupport { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnSupport my $title = _T("Ondersteuning"); my $md = EB::Wx::Shell::HtmlViewer->new($self, -1, $title); $md->info_only; $md->html->SetPage(_T(<Voor het uitwisselen van ervaringen, vragen om ondersteuning e.d. kunt u zich abonneren op de mailing list voor gebruikers op SourceForge.

De EekBoek gebruikers houden zelf een wiki bij met tips en andere wetenswaardigheden.

EekBoek kan gratis worden gedownload en gebruikt. Mocht u echter aanvullende wensen hebben op het gebied van ondersteuning dan kan dat ook. Squirrel Consultancy is gaarne bereid u betaalde ondersteuning te bieden, bijvoorbeeld bij het installeren van EekBoek, het opzetten van administraties, en het overzetten van uw bestaande administraties naar EekBoek. Ook kunnen specifieke uitbreidingen of aanpassingen naar uw wens worden gerealiseerd.

Voor meer informatie: info\@squirrel.nl.

EOD $md->SetTitle($title); $md->ShowModal; $md->Destroy; # end wxGlade } sub OnClear { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnClear $self->{t_output}->SetValue(""); # end wxGlade } sub OnPrefs { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnPrefs $self->{d_prefs} ||= EB::Wx::Shell::PreferencesDialog->new($self, -1, "Preferences"); for ( keys( %$prefctl ) ) { if ( exists $self->{d_prefs}->{"cx_$_"} ) { $self->{d_prefs}->{"cx_$_"}->SetValue( $self->{"prefs_$_"} ); } elsif ( exists $self->{d_prefs}->{"spin_$_"} ) { $self->{d_prefs}->{"spin_$_"}->SetValue( $self->{"prefs_$_"} ); } } my $ret = $self->{d_prefs}->ShowModal; if ( $ret == wxID_OK ) { for ( keys( %$prefctl ) ) { if ( exists $self->{d_prefs}->{"cx_$_"} ) { $self->{"prefs_$_"} = $self->{d_prefs}->{"cx_$_"}->GetValue; } elsif ( exists $self->{d_prefs}->{"spin_$_"} ) { $self->{"prefs_$_"} = $self->{d_prefs}->{"spin_$_"}->GetValue; } } } # end wxGlade } sub FillHistory { my ($self, $histfile) = @_; $self->{_histfile} = $histfile; $self->{_cmd} = []; $self->{_cmdptr} = 0; if ( -s $histfile ) { my $fh; return unless open($fh, "<:encoding(utf-8)", $histfile); my $prev = ''; while ( <$fh> ) { chomp; next if $_ eq $prev; $self->PutOnHistory($_); $prev = $_; } close($fh); } $self->{_cmdinit} = $self->{_cmdptr} = $#{$self->{_cmd}} + 1; } sub GetPreferences { my ( $self ) = @_; my $conf = Wx::ConfigBase::Get; for ( keys( %$prefctl ) ) { $self->{"prefs_$_"} = $conf->ReadInt( "preferences/$_", $prefctl->{$_} ); } } sub SaveHistory { my $self = shift; my $fh; my $histfile = $self->{_histfile}; $self->{_cmdinit} = $self->{_cmdptr} - $self->{prefs_histlines}; $self->{_cmdinit} = 0 if $self->{_cmdinit} < 0; return unless open($fh, ">:encoding(utf-8)", $histfile); while ( $self->{_cmdinit} < $self->{_cmdptr} ) { print { $fh } ($self->{_cmd}->[$self->{_cmdinit}], "\n"); $self->{_cmdinit}++; } close($fh); } sub SavePreferences { my ( $self ) = @_; my $conf = Wx::ConfigBase::Get; for ( keys( %$prefctl ) ) { $conf->WriteInt( "preferences/$_", $self->{"prefs_$_"} ); } } sub OnMenuBal { my ($self, $event, $sub) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuBal if ( defined $sub && $sub >= 0 ) { $self->_cmd("balans --verdicht --detail=$sub --gen-wxhtml\n"); } else { $self->_cmd("balans --gen-wxhtml\n"); } # end wxGlade } sub OnMenuRes { my ($self, $event, $sub) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuRes if ( defined $sub && $sub >= 0 ) { $self->_cmd("result --verdicht --detail=$sub --gen-wxhtml\n"); } else { $self->_cmd("result --gen-wxhtml\n"); } # end wxGlade } sub OnMenuAP { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuAP $self->_cmd("crediteuren --gen-wxhtml\n"); # end wxGlade } sub OnMenuAR { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuAR $self->_cmd("debiteuren --gen-wxhtml\n"); # end wxGlade } sub OnMenuVAT { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuAR $self->_cmd("btwaangifte --gen-wxhtml\n"); # end wxGlade } sub OnMenuUns { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuUns $self->_cmd("openstaand --gen-wxhtml\n"); # end wxGlade } sub OnTrial { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnTrial $self->_cmd("proefensaldibalans --gen-wxhtml\n"); # end wxGlade } sub OnJournal { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnJournal $self->_cmd("journaal --gen-wxhtml\n"); # end wxGlade } #### Callbacks from HTML links sub _HTMLCallBack { my ($self, $command, $args) = @_; my $cmd = $command; $cmd .= " " . delete($args->{select}); while ( my($k,$v) = each( %$args ) ) { $cmd .= " --$k=$v"; } $cmd .= " --gen-wxhtml"; $self->_cmd($cmd."\n"); } sub ShowRJnl { shift->_HTMLCallBack( "journaal", @_ ) } sub ShowRGbk { shift->_HTMLCallBack( "grootboek", @_ ) } sub ShowRCrd { shift->_HTMLCallBack( "crediteuren", @_ ) } sub ShowRDeb { shift->_HTMLCallBack( "debiteuren", @_ ) } # end of class EB::Wx::Shell::MainFrame 1; EekBoek-2.02.04/lib/EB/Wx/Shell/Main.pm0000444000076500007650000001347212165465617014763 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Sun Jul 31 23:35:10 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Aug 4 21:33:04 2012 # Update Count : 438 # Status : Unknown, Use with caution! ################ Common stuff ################ package main; our $cfg; our $app; use EB::Wx::FakeApp; package EB::Wx::Shell::Main; use strict; use warnings; use EekBoek; use EB; use Getopt::Long 2.13; ################ The Process ################ my $app_dir; use base qw(Wx::App); use Wx qw[ wxBITMAP_TYPE_ANY wxCONFIG_USE_LOCAL_FILE wxDefaultPosition wxDefaultSize wxICON_ERROR wxOK ]; sub OnInit { my( $self ) = shift; return 1; } ################ Run ################ sub run { my ( $pkg, $opts ) = @_; $opts = {} unless defined $opts; binmode(STDOUT, ":encoding(utf8)"); binmode(STDERR, ":encoding(utf8)"); # Preliminary initialize config. EB->app_init( { app => $EekBoek::PACKAGE } ); # Command line options. $opts = { #config, # config file #nostdconf, # skip standard configs #define, # config overrides verbose => 0, # verbose processing # Development options (not shown with -help). debug => 0, # debugging trace => 0, # trace (show process) test => 0, # test mode. # Let supplied options override. %$opts, }; # Process command line options. app_options($opts); # Post-processing. $opts->{trace} |= ($opts->{debug} || $opts->{test}); # Initialize config. EB->app_init( { app => $EekBoek::PACKAGE, %$opts } ); if ( $opts->{printconfig} ) { $cfg->printconf( \@ARGV ); exit; } $app_dir = $cfg->user_dir; mkdir($app_dir) unless -d $app_dir; Wx::InitAllImageHandlers(); #### WHAT THE ***** IS GOING ON HERE???? #*Fcntl::O_NOINHERIT = sub() { 0 }; #*Fcntl::O_EXLOCK = sub() { 0 }; #*Fcntl::O_TEMPORARY = sub() { 0 }; if ( ( defined($opts->{wizard}) ? $opts->{wizard} : 1 ) && !$opts->{config} ) { require EB::Wx::IniWiz; EB::Wx::IniWiz->run($opts); # sets $opts->{runeb} return unless $opts->{runeb}; EB->app_init( { app => $EekBoek::PACKAGE, %$opts } ); } my $app = EB::Wx::Shell::Main->new(); $app->SetAppName($EekBoek::PACKAGE); $app->SetVendorName("Squirrel Consultancy"); if ( $^O =~ /^mswin/i ) { Wx::ConfigBase::Get->SetPath("/ebwxshell"); } else { Wx::ConfigBase::Set (Wx::FileConfig->new ( $app->GetAppName() , $app->GetVendorName() , $cfg->user_dir("ebwxshell"), '', wxCONFIG_USE_LOCAL_FILE, )); } my $histfile = $cfg->user_dir("history"); require EB::Wx::Shell::MainFrame; my $frame = EB::Wx::Shell::MainFrame->new (undef, undef, $EekBoek::PACKAGE, wxDefaultPosition, wxDefaultSize, undef, $EekBoek::PACKAGE); my $config = $opts->{config}; unless ( $config ) { $config = $cfg->std_config; $config = $cfg->std_config_alt unless -f $config; } $frame->{_ebcfg} = $config if -e $config; $frame->FillHistory($histfile); $frame->GetPreferences; Wx::ConfigBase::Get->Write('general/appversion', $EekBoek::VERSION); my $icon = Wx::Icon->new(); $icon->CopyFromBitmap(Wx::Bitmap->new("eb.jpg", wxBITMAP_TYPE_ANY)); $frame->SetIcon($icon); $app->SetTopWindow($frame); $frame->Show(1); $frame->RunCommand(undef); $app->MainLoop(); } # Since Wx::Bitmap cannot be convinced to use a search path, we # need a stronger method... my $wxbitmapnew = \&Wx::Bitmap::new; no warnings 'redefine'; *Wx::Bitmap::new = sub { # Only handle Wx::Bitmap->new(file, type) case. goto &$wxbitmapnew if @_ != 3 || -f $_[1]; my ($self, @rest) = @_; $rest[0] = EB::findlib("Wx/icons/".File::Basename::basename($rest[0])); $wxbitmapnew->($self, @rest); }; use warnings 'redefine'; ################ Subroutines ################ sub app_options { my ( $opts ) = @_; # Filter psn arguments (Mac OSX). @ARGV = grep { ! /psn_\d_\d+/ } @ARGV; # Process options, if any. # Make sure defaults are set before returning! return unless @ARGV > 0; # Store valid & trap invalid option warnings my @optionerrors; local $SIG{__WARN__} = sub { my $warning = shift; push(@optionerrors, $warning); }; Getopt::Long::Configure(qw(no_ignore_case)); if ( !GetOptions( $opts, 'define|D=s%', 'nostdconf|X', 'config|f=s', 'admdir=s', 'open=s', 'wizard!', 'printconfig|P', 'ident', 'verbose', 'trace!', 'help|?', 'debug', ) or $opts->{help} ) { app_usage(); } app_usage() if @ARGV && !$opts->{printconfig}; app_ident() if $opts->{ident}; return unless @optionerrors; my $d = Wx::MessageDialog->new ( undef, join("\n", @optionerrors), "Opstartregelfouten", wxICON_ERROR|wxOK, wxDefaultPosition ); $d->ShowModal; $d->Destroy; CORE::exit(2); } sub app_ident { return; warn(__x("Dit is {pkg} [{name} {version}]", pkg => $EekBoek::PACKAGE, name => "WxShell", version => $EekBoek::VERSION) . "\n"); } sub app_usage { my ($exit) = @_; app_ident(); warn _T(< '_T'; # end wxGlade use Wx qw[ wxADJUST_MINSIZE wxALIGN_CENTER_VERTICAL wxALL wxDEFAULT_DIALOG_STYLE wxDefaultPosition wxDefaultSize wxEXPAND wxHORIZONTAL wxID_CANCEL wxID_OK wxLEFT wxRIGHT wxSP_ARROW_KEYS wxTOP wxVERTICAL ]; sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; # begin wxGlade: EB::Wx::Shell::PreferencesDialog::new $style = wxDEFAULT_DIALOG_STYLE unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $self->{sz_prefs_inner_staticbox} = Wx::StaticBox->new($self, -1, _T("Voorkeuren") ); $self->{cx_repwin} = Wx::CheckBox->new($self, -1, _T("Rapporten in hetzelfde venster"), wxDefaultPosition, wxDefaultSize, ); $self->{cx_errorpopup} = Wx::CheckBox->new($self, -1, _T("Popup window voor foutboodschappen"), wxDefaultPosition, wxDefaultSize, ); $self->{cx_warnpopup} = Wx::CheckBox->new($self, -1, _T("Popup window voor waarschuwingen"), wxDefaultPosition, wxDefaultSize, ); $self->{cx_infopopup} = Wx::CheckBox->new($self, -1, _T("Popup window voor mededelingen"), wxDefaultPosition, wxDefaultSize, ); $self->{l_histlines} = Wx::StaticText->new($self, -1, _T("Aantal te bewaren regels invoer historie:"), wxDefaultPosition, wxDefaultSize, ); $self->{spin_histlines} = Wx::SpinCtrl->new($self, -1, "200", wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 99999, 200); $self->{b_prefs_cancel} = Wx::Button->new($self, wxID_CANCEL, ""); $self->{b_prefs_ok} = Wx::Button->new($self, wxID_OK, ""); $self->__set_properties(); $self->__do_layout(); Wx::Event::EVT_BUTTON($self, $self->{b_prefs_cancel}->GetId, \&OnCancel); Wx::Event::EVT_BUTTON($self, $self->{b_prefs_ok}->GetId, \&OnAccept); # end wxGlade return $self; } sub __set_properties { my $self = shift; # begin wxGlade: EB::Wx::Shell::PreferencesDialog::__set_properties $self->SetTitle(_T("Voorkeursinstellingen")); $self->{cx_errorpopup}->SetValue(1); $self->{cx_warnpopup}->SetValue(1); $self->{cx_infopopup}->SetValue(1); $self->{b_prefs_ok}->SetDefault(); # end wxGlade } sub __do_layout { my $self = shift; # begin wxGlade: EB::Wx::Shell::PreferencesDialog::__do_layout $self->{sz_prefs_outer} = Wx::BoxSizer->new(wxVERTICAL); $self->{sz_prefs_buttons} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sz_prefs_inner}= Wx::StaticBoxSizer->new($self->{sz_prefs_inner_staticbox}, wxVERTICAL); $self->{sz_prefs} = Wx::BoxSizer->new(wxVERTICAL); $self->{sz_histlines} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sz_prefs}->Add($self->{cx_repwin}, 0, wxADJUST_MINSIZE, 0); $self->{sz_prefs}->Add($self->{cx_errorpopup}, 0, wxADJUST_MINSIZE, 0); $self->{sz_prefs}->Add($self->{cx_warnpopup}, 0, wxADJUST_MINSIZE, 0); $self->{sz_prefs}->Add($self->{cx_infopopup}, 0, wxADJUST_MINSIZE, 0); $self->{sz_histlines}->Add($self->{l_histlines}, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 5); $self->{sz_histlines}->Add($self->{spin_histlines}, 0, wxALIGN_CENTER_VERTICAL|wxADJUST_MINSIZE, 0); $self->{sz_histlines}->Add(0, 0, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{sz_prefs}->Add($self->{sz_histlines}, 1, wxEXPAND, 0); $self->{sz_prefs}->Add(1, 5, 0, wxADJUST_MINSIZE, 0); $self->{sz_prefs_inner}->Add($self->{sz_prefs}, 1, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 5); $self->{sz_prefs_outer}->Add($self->{sz_prefs_inner}, 1, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 5); $self->{sz_prefs_buttons}->Add(5, 1, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{sz_prefs_buttons}->Add($self->{b_prefs_cancel}, 0, wxADJUST_MINSIZE, 0); $self->{sz_prefs_buttons}->Add($self->{b_prefs_ok}, 0, wxLEFT|wxADJUST_MINSIZE, 5); $self->{sz_prefs_outer}->Add($self->{sz_prefs_buttons}, 0, wxALL|wxEXPAND, 5); $self->SetSizer($self->{sz_prefs_outer}); $self->{sz_prefs_outer}->Fit($self); $self->Layout(); # end wxGlade } sub OnCancel { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::PreferencesDialog::OnCancel $event->Skip; # end wxGlade } sub OnAccept { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::PreferencesDialog::OnAccept $event->Skip; # end wxGlade } # end of class EB::Wx::Shell::PreferencesDialog 1; EekBoek-2.02.04/lib/EB/Wx/Shell/EditDialog.pm0000444000076500007650000000542712165465617016105 0ustar jvjv#! perl package main; use strict; package EB::Wx::Shell::EditDialog; use base qw(Wx::Dialog); use base qw(EB::Wx::Shell::Window); use strict; use Wx qw[ wxADJUST_MINSIZE wxALL wxBOTTOM wxDEFAULT_DIALOG_STYLE wxDefaultPosition wxDefaultSize wxEXPAND wxHORIZONTAL wxID_APPLY wxID_CANCEL wxRESIZE_BORDER wxRIGHT wxTE_MULTILINE wxTHICK_FRAME wxVERTICAL ]; use Wx::Locale gettext => '_T'; sub new { my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_; $parent = undef unless defined $parent; $id = -1 unless defined $id; $title = "" unless defined $title; $pos = wxDefaultPosition unless defined $pos; $size = wxDefaultSize unless defined $size; $name = "" unless defined $name; # begin wxGlade: EB::Wx::Shell::EditDialog::new $style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxTHICK_FRAME unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $self->{t_input} = Wx::TextCtrl->new($self, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); $self->{b_cancel} = Wx::Button->new($self, wxID_CANCEL, ""); $self->{b_apply} = Wx::Button->new($self, wxID_APPLY, ""); $self->__set_properties(); $self->__do_layout(); Wx::Event::EVT_BUTTON($self, $self->{b_cancel}->GetId, \&OnCancel); Wx::Event::EVT_BUTTON($self, $self->{b_apply}->GetId, \&OnApply); # end wxGlade $self->sizepos_restore(lc($title)); return $self; } sub __set_properties { my $self = shift; # begin wxGlade: EB::Wx::Shell::EditDialog::__set_properties $self->SetTitle(_T("Wijzigen invoerregel")); $self->SetSize(Wx::Size->new(582, 318)); $self->{t_input}->SetFocus(); # end wxGlade } sub __do_layout { my $self = shift; # begin wxGlade: EB::Wx::Shell::EditDialog::__do_layout $self->{sz_main} = Wx::BoxSizer->new(wxVERTICAL); $self->{sz_buttons} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{sz_main}->Add($self->{t_input}, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 5); $self->{sz_buttons}->Add(5, 0, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{sz_buttons}->Add($self->{b_cancel}, 0, wxRIGHT|wxBOTTOM|wxADJUST_MINSIZE, 5); $self->{sz_buttons}->Add($self->{b_apply}, 0, wxRIGHT|wxBOTTOM|wxADJUST_MINSIZE, 5); $self->{sz_main}->Add($self->{sz_buttons}, 0, wxEXPAND, 0); $self->SetSizer($self->{sz_main}); $self->Layout(); # end wxGlade } sub OnCancel { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::EditDialog::OnCancel $self->sizepos_save; $event->Skip; # end wxGlade } sub OnApply { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::EditDialog::OnApply $self->sizepos_save; $self->EndModal( wxID_APPLY ); # end wxGlade } # end of class EB::Wx::Shell::EditDialog 1; EekBoek-2.02.04/lib/EB/Tools/0000755000076500007650000000000012165465617013167 5ustar jvjvEekBoek-2.02.04/lib/EB/Tools/MiniAdm.pm0000444000076500007650000003537512165465617015056 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # MiniAdm.pm -- # Author : Johan Vromans # Created On : Sun Oct 4 15:11:05 2009 # Last Modified By: Johan Vromans # Last Modified On: Fri May 6 13:44:19 2011 # Update Count : 111 # Status : Unknown, Use with caution! package main; use strict; use warnings; use Encode; our$cfg; package EB::Tools::MiniAdm; #use EB::Config; use EB; sub donotclobber { my ( $self, $opts ) = @_; my @files = qw( schema.dat opening.eb mutaties.eb relaties.eb ); push( @files, $cfg->std_config ); my $tally = 0; foreach ( @files ) { $tally++ if -f $_; } if ( $tally == @files ) { warn("?"._T("GESTOPT: Er is al een administratie aangemaakt")."\n"); return; } if ( $tally ) { warn("?"._T("GESTOPT: Er is al een administratie gedeeltelijk aangemaakt")."\n"); return; } return 1; } sub build { my ( $self, $opts ) = @_; return unless $self->donotclobber; return unless $self->sanitize($opts); # Generate. $self->generate_config($opts); $self->generate_schema($opts); $self->generate_relaties($opts); $self->generate_opening($opts); $self->generate_mutaties($opts); 1; } sub sanitize { my ( $self, $opts ) = @_; $opts->{adm_naam} ||= _T("Demo administratie"); $opts->{adm_btwperiode} ||= "jaar" if $opts->{has_btw}; $opts->{adm_begindatum} ||= 1900 + (localtime(time))[5]; $opts->{adm_boekjaarcode} ||= 1900 + (localtime(time))[5]; for ( qw(naam boekjaarcode) ) { $opts->{ "adm_$_" } =~ s/"/_/g; } $opts->{db_naam} ||= "demoadm"; $opts->{db_driver} ||= "sqlite"; 1; } use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); use Encode; sub generate_file { my ( $self, $file, $type, $opts, $writer ) = @_; if ( ! $opts->{_zip} && $opts->{template} ) { $opts->{_zip} = Archive::Zip->new(); die( "?".__x("Probleem met het benaderen van {file}: {err}", file => $opts->{template}, err => "$!")."\n" ) unless $opts->{_zip}->read( $opts->{template} ) == AZ_OK; } my $m; if ( $opts->{_zip} ) { $m = $opts->{_zip}->memberNamed($file); } my $fd; if ( $opts->{_zip} && $m ) { my $data = $opts->{_zip}->contents($m); die( "?".__x("Probleem met het aanmaken van {file}: Zip error", file => $file)."\n" ) unless $data; #### TODO: Make more generic. if ( $file eq "opening.eb" ) { for ( $data ) { s/^(\s*adm_naam\s+).*$ /$1"$opts->{adm_naam}" /mgx; s/^(\s*adm_btwperiode\s+).*$ /$1"$opts->{adm_btwperiode}" /mgx; s/^(\s*adm_begindatum\s+).*$ /$1"$opts->{adm_begindatum}" /mgx; s/^(\s*adm_boekjaarcode\s+).*$/$1"$opts->{adm_boekjaarcode}"/mgx; } } $data =~ s/\r//g; $data = decode_utf8($data); $data = [ split(/\n/, $data) ]; $writer = sub { print { $fd } $_, "\n" foreach @$data }; $type = undef; } open( $fd, '>:encoding(utf-8)', $file ) or die( "?".__x("Probleem met het aanmaken van {file}: {err}", file => $file, err => "$!")."\n" ); if ( $type ) { print { $fd } ("# EekBoek $type\n", "# Content-Type: text/plain; charset = UTF-8\n\n"); } if ( $writer ) { $writer->( $self, $fd ); } close( $fd ) or die( "?".__x("Probleem met het afsluiten van {file}: {err}", file => $file, err => "$!")."\n" ); } sub generate_config { my ( $self, $opts ) = @_; return if exists $opts->{create_config} && !$opts->{create_config}; my $fmt = "%-10.10s = %s\n"; $self->generate_file ( $cfg->std_config, undef, $opts, sub { my ( $self, $fd ) = @_; if ( $opts->{lang} ) { print { $fd } ("[locale]\n"); printf { $fd } ( $fmt, "lang", $opts->{lang} ); print { $fd } ("\n"); } print { $fd } ("[database]\n"); printf { $fd } ( $fmt, "name", $opts->{db_naam} ); foreach ( qw( driver host port user password path ) ) { next unless defined $opts->{"db_$_"}; printf { $fd } ( $fmt, $_, $opts->{"db_$_"} ) } } ); } sub generate_schema { my ( $self, $opts ) = @_; return if exists $opts->{create_schema} && !$opts->{create_schema}; # has_btw # has_crediteuren # has_crediteuren # has_kas # has_bank $self->generate_file ( "schema.dat", _T("Rekeningschema"), $opts, sub { my ( $self, $fd ) = @_; print { $fd } ( <<'EOD' ); # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra EOD if ( $opts->{has_btw} ) { print { $fd } ( <<'EOD' ); # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # :btw=privé # :btw=anders EOD } else { print { $fd } ( <<'EOD' ); # informatie. EOD } print { $fd } ( <<'EOD' ); # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # EOD if ( $opts->{has_crediteuren} ) { print { $fd } ( <<'EOD' ); # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen EOD } if ( $opts->{has_debiteuren} ) { print { $fd } ( <<'EOD' ); # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen EOD } if ( $opts->{has_btw} ) { print { $fd } ( <<'EOD' ); # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ph idem, privé, hoog tarief # btw_pl idem, laag tarief # btw_ah idem, anders, hoog tarief # btw_al idem, laag tarief # btw_ok rekening voor de betaalde BTW EOD } print { $fd } ( <<'EOD' ); # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. EOD if ( $opts->{has_btw} ) { print { $fd } ( <<'EOD' ); # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. EOD } print { $fd } ( <<'EOD' ); # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. Verdichting 9 99 # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Balansrekeningen 1 Vaste Activa 11 Materiële vaste activa 2 Vlottende activa 21 Handelsvoorraden 22 Vorderingen EOD if ( $opts->{has_debiteuren} ) { print { $fd } ( <<'EOD' ); 2200 D Debiteuren :koppeling=deb EOD } print { $fd } ( <<'EOD' ); 23 Liquide middelen EOD if ( $opts->{has_kas} ) { print { $fd } ( <<"EOD" ); 2300 D Kas EOD } if ( $opts->{has_bank} ) { print { $fd } ( <<"EOD" ); 2320 D Bank EOD } print { $fd } ( <<"EOD" ); 2390 D Kruisposten 3 Eigen vermogen 31 Kapitaal 3100 C Kapitaal de heer/mevrouw :koppeling=winst 3110 C Privé stortingen 3120 D Privé opnamen 4 Vreemd vermogen 41 Leveranciers kredieten EOD if ( $opts->{has_crediteuren} ) { print { $fd } ( <<'EOD' ); 4100 C Crediteuren :koppeling=crd EOD } print { $fd } ( <<'EOD' ); 42 Belastingen & soc. lasten EOD if ( $opts->{has_btw} ) { print { $fd } ( <<"EOD" ); 4200 C BTW Verkoop Hoog :koppeling=btw_vh 4210 C BTW Verkoop Laag :koppeling=btw_vl 4212 C BTW Verkoop Privé :koppeling=btw_vp 4214 C BTW Verkoop Anders :koppeling=btw_va 4220 D BTW Inkoop Hoog :koppeling=btw_ih 4230 D BTW Inkoop Laag :koppeling=btw_il 4232 D BTW Inkoop Privé :koppeling=btw_ip 4234 D BTW Inkoop Anders :koppeling=btw_ia 4290 C Omzetbelasting betaald :koppeling=btw_ok EOD } my $btw_hoog = ""; my $btw_laag = ""; if ( $opts->{has_btw} ) { $btw_hoog = ":btw=hoog"; $btw_laag = ":btw=laag"; } print { $fd } ( <<"EOD" ); Resultaatrekeningen 6 Kosten 61 Verkoopkosten 62 Huisvestingskosten 63 Bedrijfsvoering 67 Contributies & abonnementen 69 Algemene kosten EOD if ( $opts->{has_bank} ) { print { $fd } ( <<"EOD" ); 6980 K Bankkosten EOD } if ( $opts->{has_kas} ) { print { $fd } ( <<"EOD" ); 6981 K Kasverschillen EOD } print { $fd } ( <<"EOD" ); 8 Bedrijfsopbrengsten 89 Omzet Diversen EOD if ( $opts->{has_btw} ) { print { $fd } ( <<'EOD' ); 8900 O Omzet diversen BTW hoog :btw=hoog 8910 O Omzet diversen BTW laag :btw=laag 8920 O Omzet diversen BTW vrij EOD } print { $fd } ( <<"EOD" ); 9 Financiële baten & lasten 91 Rente baten EOD if ( $opts->{has_bank} ) { print { $fd } ( <<"EOD" ); 9120 O Rente bate Bank EOD } print { $fd } ( <<"EOD" ); 92 Rente- en overige financiële lasten EOD if ( $opts->{has_bank} ) { print { $fd } ( <<"EOD" ); 9220 K Rente last Bank EOD } print { $fd } ( <<"EOD" ); 93 Overige baten EOD if ( $opts->{has_btw} ) { print { $fd } ( <<"EOD" ); 9390 O Kleine ondernemersregeling EOD } print { $fd } ( <<"EOD" ); # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. # De optie :dc kan worden gebruikt om aan te geven dat het journaal # voor dit dagboek de boekstuktotalen in gescheiden debet en credit # moet tonen. Dagboeken EOD if ( $opts->{has_crediteuren} ) { print { $fd } ( <<"EOD" ); I Inkoop :type=inkoop EOD } if ( $opts->{has_debiteuren} ) { print { $fd } ( <<"EOD" ); V Verkoop :type=verkoop EOD } if ( $opts->{has_kas} ) { print { $fd } ( <<"EOD" ); K Kas :type=kas :rekening=2300 EOD } if ( $opts->{has_bank} ) { print { $fd } ( <<"EOD" ); B Bank :type=bank :rekening=2320 EOD } print { $fd } ( <<"EOD" ); M Memoriaal :type=memoriaal EOD if ( $opts->{has_btw} ) { print { $fd } ( <<"EOD" ); # BTW TARIEVEN # # Er zijn vijf tariefgroepen: "hoog", "laag", "nul", "privé" en # "anders". De tariefgroep bepaalt het rekeningnummer waarop de # betreffende boeking plaatsvindt. # Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit # in de praktijk niet snel zal voorkomen. # In de eerste kolom wordt de (numerieke) code voor dit tarief # opgegeven. Deze kan o.m. worden gebruikt om expliciet een BTW tarief # op te geven bij het boeken. Voor elk gebruikt tarief (behalve die # van groep "nul") moet het percentage worden opgegeven. Met de # aanduiding :exclusief kan worden opgegeven dat boekingen op # rekeningen met deze tariefgroep standaard het bedrag exclusief BTW # aangeven. # # BELANGRIJK: Mutaties die middels de command line shell of de API # worden uitgevoerd maken gebruik van het geassocieerde BTW tarief van # de grootboekrekeningen. Wijzigingen hierin kunnen dus consequenties # hebben voor de reeds in scripts vastgelegde boekingen. BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 19% incl. :tariefgroep=hoog :perc=19,00 2 BTW 19% excl. :tariefgroep=hoog :perc=19,00 :exclusief 3 BTW 6,0% incl. :tariefgroep=laag :perc=6,00 4 BTW 6,0% excl. :tariefgroep=laag :perc=6,00 :exclusief 5 BTW Privé 12% incl. :tariefgroep=privé :perc=12,00 6 BTW Privé 12% ex. :tariefgroep=privé :perc=12,00 :exclusief EOD } print { $fd } ( <<"EOD" ); # Einde EekBoek schema EOD } ); } sub generate_relaties { my ( $self, $opts ) = @_; return if exists $opts->{create_relaties} && !$opts->{create_relaties}; $self->generate_file( "relaties.eb", _T("Relaties"), $opts ); } sub generate_opening { my ( $self, $opts ) = @_; return if exists $opts->{create_opening} && !$opts->{create_opening}; $self->generate_file ( "opening.eb", _T("Opening"), $opts, sub { my ( $self, $fd ) = @_; print { $fd } ( "adm_naam \"", $opts->{adm_naam}, "\"\n" ); print { $fd } ( "adm_btwperiode ", $opts->{adm_btwperiode}, "\n" ) if $opts->{has_btw}; print { $fd } ( "adm_begindatum \"", $opts->{adm_begindatum}, "\"\n" ); print { $fd } ( "adm_boekjaarcode \"", $opts->{adm_boekjaarcode}, "\"\n" ); print { $fd } ( "adm_open\n"); } ); } sub generate_mutaties { my ( $self, $opts ) = @_; return if exists $opts->{create_mutaties} && !$opts->{create_mutaties}; $self->generate_file( "mutaties.eb", _T("Mutaties"), $opts ); } 1; EekBoek-2.02.04/lib/EB/Tools/Einde.pm0000444000076500007650000002126012165465617014550 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Einde.pm -- Eindejaarsverwerking # Author : Johan Vromans # Created On : Sun Oct 16 21:27:40 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:42:33 2010 # Update Count : 247 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Tools::Einde; use strict; use warnings; use EB; use EB::Format; use EB::Report; use EB::Report::GenBase; use EB::Report::Journal; use EB::Report::Open; sub new { my ($class) = @_; $class = ref($class) || $class; return bless {} => $class; } sub perform { my ($self, $args, $opts) = @_; # Akties: # Afboeken resultaatrekeningen -> Winstrekening # Afboeken BTW I/V H/L -> BTW Betaald my $tot = 0; my $date = $cfg->val(qw(internal now), iso8601date()); $date = $dbh->adm("end") unless $date lt $dbh->adm("end"); my $sth; my $rr; my $bky = $opts->{boekjaar}; my $def = $opts->{definitief}; my $eb; if ( $opts->{eb} ) { unless ( open($eb, '>:encoding(utf-8)', $opts->{eb}) ) { warn("?", __x("Fout tijdens het aanmaken van bestand {file}: {err}", file => $opts->{eb}, err => $!."")."\n"); return; } $opts->{eb_handle} = $eb; } my ($acc_id, $acc_desc, $acc_balance); warn("?",_T("Geen boekjaar opgegeven")."\n"), return unless $bky; $rr = $dbh->do("SELECT bky_begin, bky_end, bky_closed". " FROM Boekjaren". " WHERE bky_code = ?", $bky); warn("?",__x("Onbekend boekjaar: {bky}", bky => $bky)."\n"), return unless $rr; my ($begin, $end, $closed) = @$rr; if ( $closed ) { if ( $opts->{verwijder} ) { warn("?",__x("Boekjaar {bky} is definitief afgesloten", bky => $bky)."\n"); } else { warn("?",__x("Boekjaar {bky} is reeds definitief afgesloten", bky => $bky)."\n"); } return; } $dbh->begin_work; $dbh->sql_exec("DELETE FROM Boekjaarbalans where bkb_bky = ?", $bky)->finish; $dbh->commit, return if $opts->{verwijder}; $opts->{STYLE} = "journaal"; $opts->{LAYOUT} = [ { name => "date", title => _T("Datum"), width => $date_width, }, { name => "desc", title => _T("Boekstuk/Grootboek"), width => 30, }, { name => "acct", title => _T("Rek"), width => 5, align => ">", }, { name => "deb", title => _T("Debet"), width => $amount_width, align => ">", }, { name => "crd", title => _T("Credit"), width => $amount_width, align => ">", }, { name => "bsk", title => _T("Boekstuk/regel"), width => 30, }, { name => "rel", title => _T("Relatie"), width => 10, }, ]; my $rep; $rep = EB::Report::GenBase->backend(EB::Report::Journal::, $opts); my $tbl = EB::Report::->GetTAccountsBal($end); $sth = $dbh->sql_exec("SELECT acc_id, acc_desc, acc_balance". " FROM ${tbl}". " WHERE NOT acc_balres". " AND acc_balance <> 0". " ORDER BY acc_id"); my $edt = parse_date($end, undef, 1); my $dtot = 0; my $ctot = 0; my $did; my $desc; while ( $rr = $sth->fetchrow_arrayref ) { ($acc_id, $acc_desc, $acc_balance) = @$rr; $tot += $acc_balance; $dbh->sql_insert("Boekjaarbalans", [qw(bkb_bky bkb_acc_id bkb_balance bkb_end)], $bky, $acc_id, $acc_balance, $end); unless ( $did++ ) { $rep->start(_T("Journaal"), __x("Afsluiting boekjaar {bky}", bky => $bky)); } unless ( $desc ) { $rep->add({ _style => 'head', date => datefmt_full($end), desc => join(":", "<<"._T("Systeemdagboek").">>", $bky, 1), }); $desc = "Afboeken Resultaatrekeningen"; } $acc_balance = -$acc_balance; $rep->add({ _style => 'data', date => datefmt_full($end), desc => $dbh->lookup($acc_id, qw(Accounts acc_id acc_desc)), acct => $acc_id, $acc_balance >= 0 ? ( deb => numfmt($acc_balance) ) : ( crd => numfmt(-$acc_balance) ), bsk => $desc, }); $dtot += $acc_balance if $acc_balance > 0; $ctot -= $acc_balance if $acc_balance < 0; } if ( $did ) { my $d = '<< ' . ($tot <= 0 ? __x("Winst boekjaar {bky}", bky => $bky) : __x("Verlies boekjaar {bky}", bky => $bky)) . ' >>'; $dbh->sql_insert("Boekjaarbalans", [qw(bkb_bky bkb_acc_id bkb_balance bkb_end)], $bky, $dbh->std_acc("winst"), -$tot, $end); $tot = -$tot; $rep->add({ _style => 'data', date => datefmt_full($end), desc => $d, acct => $dbh->std_acc("winst"), $tot >= 0 ? ( crd => numfmt($tot) ) : ( deb => numfmt(-$tot) ), bsk => $desc, }); $ctot += $tot if $tot > 0; $dtot -= $tot if $tot < 0; } $tot = 0; $desc = ""; if ( $dbh->does_btw ) { ## Afboeken BTW foreach ( @{ $dbh->std_accs } ) { my $stdacc = $_; # copy for mod next unless $stdacc =~ /^btw_[iv].$/; next unless defined( $stdacc = $dbh->std_acc($stdacc, undef) ); ($acc_id, $acc_desc, $acc_balance) = @{$dbh->do("SELECT acc_id,acc_desc,acc_balance". " FROM ${tbl}". " WHERE acc_id = ?", $stdacc)}; next unless $acc_balance; $tot += $acc_balance; $dbh->sql_insert("Boekjaarbalans", [qw(bkb_bky bkb_acc_id bkb_balance bkb_end)], $bky, $acc_id, $acc_balance, $end); unless ( $did++ ) { $rep->start(_T("Journaal"), __x("Afsluiting boekjaar {bky}", bky => $bky)); } elsif ( !$desc ) { # $rep->outline(' '); } unless ( $desc ) { $rep->add({ _style => 'head', date => datefmt_full($end), desc => join(":", "<<"._T("Systeemdagboek").">>", $bky, 2), }); $desc = "Afboeken BTW rekeningen"; } $acc_balance = -$acc_balance; $rep->add({ _style => 'data', date => datefmt_full($end), desc => $dbh->lookup($acc_id, qw(Accounts acc_id acc_desc)), acct => $acc_id, $acc_balance >= 0 ? ( deb => numfmt($acc_balance) ) : ( crd => numfmt(-$acc_balance) ), bsk => $desc, }); $dtot += $acc_balance if $acc_balance > 0; $ctot -= $acc_balance if $acc_balance < 0; } if ( $did && $dbh->does_btw ) { ($acc_id, $acc_desc, $acc_balance) = @{$dbh->do("SELECT acc_id,acc_desc,acc_balance". " FROM ${tbl}". " WHERE acc_id = ?", $dbh->std_acc("btw_ok"))}; $dbh->sql_insert("Boekjaarbalans", [qw(bkb_bky bkb_acc_id bkb_balance bkb_end)], $bky, $acc_id, -$tot, $end); $tot = -$tot; $rep->add({ _style => 'data', date => datefmt_full($end), desc => $acc_desc, acct => $acc_id, $tot >= 0 ? ( crd => numfmt($tot) ) : ( deb => numfmt(-$tot) ), bsk => $desc, }); $ctot += $tot if $tot > 0; $dtot -= $tot if $tot < 0; } } ## End afboeken BTW if ( $did ) { $rep->add({ _style => 'total', desc => __x("Totaal {pfx}", pfx => __x("Afsluiting boekjaar {bky}", bky => $bky)), deb => numfmt($dtot), crd => numfmt($ctot), }); $rep->finish; } if ( $eb ) { print {$eb} ("\n# ", __x("Eindbalans bij afsluiting boekjaar {bky}", bky => $bky), "\n"); $sth = $dbh->sql_exec("SELECT acc_id, acc_desc, acc_balance, acc_ibalance, acc_debcrd". " FROM ${tbl}". " WHERE acc_balres". " ORDER BY acc_debcrd DESC, acc_id"); my ($dt, $ct); my $debcrd; while ( $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_desc, $acc_balance, $acc_ibalance, $acc_debcrd) = @$rr; # warn("=> acc $acc_id bal = $acc_balance ibal = $acc_ibalance\n"); if ( my $t = $dbh->do("SELECT bkb_balance". " FROM Boekjaarbalans". " WHERE bkb_bky = ?". " AND bkb_acc_id = ?", $bky, $acc_id) ) { $acc_balance -= $t->[0]; } next unless $acc_balance; if ( $acc_balance >= 0 ) { $dt += $acc_balance; } else { $ct -= $acc_balance; } $acc_balance = 0 - $acc_balance unless $acc_debcrd; if ( !defined($debcrd) || $acc_debcrd != $debcrd ) { print {$eb} ("\n# ", $acc_debcrd ? _T("Debet") : _T("Credit"), "\n"); } printf {$eb} ("adm_balans %-5s %10s # %s\n", $acc_id, numfmt_plain($acc_balance), $acc_desc); $debcrd = $acc_debcrd; } die("?".__x("Internal error -- unbalance {arg1} <> {arg2}", arg1 => numfmt($dt), arg2 => numfmt($ct))."\n") unless $dt == $ct; print {$eb} ("\n# ", _T("Totaal"), "\n", "adm_balanstotaal ", numfmt_plain($dt), "\n"); print {$eb} ("\n# ", __x("Openstaande posten bij afsluiting boekjaar {bky}", bky => $bky), "\n\n"); my $t = EB::Report::Open->new->perform($opts); if ( $t ) { $t =~ s/^./# /; print {$eb} ($t, "\n"); } } else { EB::Report::Open->new->perform($opts); } if ( $def ) { $dbh->sql_exec("UPDATE Boekjaren". " SET bky_closed = now()". " WHERE bky_code = ?", $bky)->finish; } $dbh->commit; close($eb) if $eb; undef; } 1; EekBoek-2.02.04/lib/EB/Tools/SQLEngine.pm0000444000076500007650000000740712165465617015320 0ustar jvjv#! perl # SQLEngine.pm -- Execute SQL commands # Author : Johan Vromans # Created On : Wed Sep 28 20:45:55 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Jun 19 00:47:09 2010 # Update Count : 72 # Status : Unknown, Use with caution! package EB::Tools::SQLEngine; use strict; use warnings; use EB; sub new { my ($class, @args) = @_; $class = ref($class) || $class; bless { _cb => {}, @args } => $class; } sub callback($%) { my ($self, %vec) = @_; return unless %vec; while ( my($k,$v) = each(%vec) ) { $self->{_cb}->{$k} = $v; } } # Basic SQL processor. Not very advanced, but does the job. # Note that COPY status will not work across different \i providers. # COPY status need to be terminated on the same level it was started. sub process { my ($self, $cmd, $copy) = (@_, 0); my $sql = ""; my $dbh = $self->{dbh} || $::dbh; # If we have PostgreSQL and it is of a suitable version, we can use # fast loading. my $pgcopy = $dbh->feature("pgcopy"); # Filter SQL, if needed. my $filter = $dbh->feature("filter"); # Remember type my $type = $dbh->driverdb; # Use raw handle from here. $dbh = $dbh->dbh; my $skipthis; foreach my $line ( split(/\n/, $cmd) ) { # Detect \i provider (include). if ( $line =~ /^\\i\s+(.*).sql/ ) { my $call = $self->{_cb}->{$1}; die("?".__x("SQLEngine: No callback for {cb}", cb => $1)."\n") unless $call; $self->process($call->(), $copy); next; } # Handle COPY status. if ( $copy ) { if ( $line eq "\\." ) { # End COPY. $dbh->pg_endcopy if $pgcopy; $copy = 0; } elsif ( $pgcopy ) { # Use PostgreSQL fast load. $dbh->pg_putline($line."\n"); } else { # Use portable INSERT. my @args = map { $_ eq 't' ? 1 : $_ eq 'f' ? 0 : $_ eq '\\N' ? undef : $_ } split(/\t/, $line); my $s = $copy; my @a = map { !defined($_) ? "NULL" : /^[0-9]+$/ ? $_ : $dbh->quote($_) } @args; $s =~ s/\?/shift(@a)/eg; $copy = $filter->($copy) if $filter; my $sth = $dbh->prepare($copy); $sth->execute(@args); $sth->finish; } next; } if ( $line =~ /^-- SKIP:\s*(\S+)/ ) { $skipthis = lc($1) eq lc($type); } elsif ( $line =~ /^-- ONLY:\s*(\S+)/ ) { $skipthis = lc($1) ne lc($type); } # Ordinary lines. # Strip comments. $line =~ s/--.*$//m; # Ignore empty lines. next unless $line =~ /\S/; # Trim whitespace. $line =~ s/\s+/ /g; $line =~ s/^\s+//; $line =~ s/\s+$//; # Append to command string. $sql .= $line . " "; # Execute if trailing ; if ( $line =~ /.+;$/ ) { if ( $skipthis ) { warn("++ SKIPPED:: $sql\n") if $self->{trace}; $skipthis = 0; $sql = ""; next; } # Check for COPY/ if ( $sql =~ /^copy\s(\S+)\s+(\([^\051]+\))/i ) { if ( $pgcopy ) { # Use PostgreSQL fast load. $copy = 1; } else { # Prepare SQL statement. $copy = "INSERT INTO $1 $2 VALUES (" . join(",", map { "?" } split(/,/, $2)) . ")"; $sql = ""; next; } } # Postprocessing. $sql = $filter->($sql) if $filter; next unless $sql; # Intercept transaction commands. Must be handled by DBI calls. if ( $sql =~ /^begin\b/i ) { warn("++ INTERCEPTED:: $sql\n") if $self->{trace}; $dbh->begin_work if $dbh->{AutoCommit}; } elsif ( $sql =~ /^commit\b/i ) { warn("++ INTERCEPTED: $sql\n") if $self->{trace}; $dbh->commit; } elsif ( $sql =~ /^rollback\b/i ) { warn("++ INTERCEPTED: $sql\n") if $self->{trace}; $dbh->rollback; } else { # Execute. warn("++ $sql\n") if $self->{trace}; $dbh->do($sql); } $sql = ""; } } die("?".__x("Incomplete SQL opdracht: {sql}", sql => $sql)."\n") if $sql; } 1; EekBoek-2.02.04/lib/EB/Tools/Opening.pm0000444000076500007650000005475212165465617015137 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Tue Aug 30 09:49:11 2005 # Last Modified By: Johan Vromans # Last Modified On: Fri Aug 31 18:18:52 2012 # Update Count : 308 # Status : Unknown, Use with caution! package main; our $dbh; our $config; package EB::Tools::Opening; use strict; use warnings; use EB; use EB::Format; # List of API methods (for the shell). sub commands { [qw(open set_naam set_btwperiode set_begindatum set_balanstotaal set_boekjaarcode set_balans set_relatie)]; } sub new { my $class = shift; $class = ref($class) || $class; bless {}, $class; } # Shell methods. # NOTE: A true result means ERROR! sub set_naam { return shellhelp() unless @_ == 2; my ($self, $naam) = @_; $self->check_open(0); $self->{o}->{naam} = $naam; ""; } sub set_btwperiode { return shellhelp() unless @_ == 2; my ($self, $per) = @_; my $pat = join("|", _T("jaar"), _T("maand"), _T("kwartaal")); return __x("Ongeldige BTW periode: {per}", per => $per)."\n" unless $per =~ /^$pat|jaar|maand}kwartaal$/i; #$self->check_open(0); $self->{o}->{btwperiode} = 1 if lc($per) eq _T("jaar") || lc($per) eq "jaar"; $self->{o}->{btwperiode} = 4 if lc($per) eq _T("kwartaal") || lc($per) eq "kwartaal"; $self->{o}->{btwperiode} = 12 if lc($per) eq _T("maand") || lc($per) eq "maand"; "" } sub set_begindatum { return shellhelp() unless @_ == 2; my ($self, $date) = @_; if ( $date =~ /^\d{4}$/ ) { $date .= "-01-01"; } my $d = parse_date($date); my ($jaar) = $d =~ /^(\d{4})/; return __x("Ongeldige openingsdatum: {date}", date => $date)."\n" unless $jaar =~ /^\d+$/ && $jaar >= 1990 && $jaar < 2099; # TODO $self->check_open(0); $self->{o}->{begindatum} = $d; $d =~ s/^(\d{4})/$1+1/e; $self->{o}->{einddatum} = parse_date($d, undef, -1); ""; } sub set_boekjaarcode { return shellhelp() unless @_ == 2; my ($self, $code) = @_; my $t; return __x("Ongeldige boekjaar-code: {year}", year => $code)."\n" unless $code =~ /^\w{1,4}$/; return __x("Boekjaar-code {year} bestaat al ({desc}", year => $code, desc => $t)."\n" if $t = $dbh->lookup($code, qw(Boekjaren bky_code bky_name)); #$self->check_open(0); $self->{o}->{boekjaarcode} = $code; ""; } sub set_balanstotaal { return shellhelp() unless @_ == 2; my ($self, $amt) = @_; my $anew; return __x("Ongeldig bedrag: {amount}", amount => $amt)."\n" unless defined($anew = amount($amt)); $self->check_open(0); $self->{o}->{balanstotaal} = $anew; ""; } sub set_balans { return shellhelp() unless @_ == 3; my ($self, $acct, $amt) = @_; my $rr = $dbh->do("SELECT acc_balres, acc_debcrd". " FROM Accounts". " WHERE acc_id = ?", $acct); return __x("Onbekende grootboekrekening: {acct}", acct => $acct)."\n" unless defined($rr); my $balres = $rr->[0]; return __x("Grootboekrekening {acct} is geen balansrekening", acct => $acct)."\n" unless $balres; my $debcrd; if ( $amt =~ /^(.*)([DC])/ ) { $amt = $1; $debcrd = $2 eq "D"; } else { $debcrd = $rr->[1]; } my $anew; return __x("Ongeldig bedrag: {amount}", amount => $amt)."\n" unless defined($anew = amount($amt)); $self->check_open(0); $anew = -$anew unless $debcrd; if ( exists($self->{o}->{balans}->{$acct}) ) { my $e = $self->{o}->{balans}->{$acct}; $anew = -$anew if ($e->[0] xor $debcrd); $self->{o}->{balans}->{$acct}->[1] += $anew; } else { $self->{o}->{balans}->{$acct} = [ $debcrd, $anew ]; } ""; } sub set_relatie { # adm_relatie verkoop:2000:31 2000-12-30 ACME Cursus 1000 # adm_relatie 2000-12-31 Cons deb ACME 1000 return shellhelp() unless @_ == 6; my $self = shift; my ($date, $desc, $type, $code, $amt); my ($dbk, $bky, $nr); if ( $_[0] =~ /^(\w+):(\w+):(\d+)$/ ) { # adm_relatie verkoop:2000:31 2000-12-30 ACME Cursus 1000 ($dbk, $bky, $nr) = ($1, $2, $3); shift; ($date, $code, $desc, $amt) = @_; my $t = $dbh->lookup($dbk, qw(Dagboeken dbk_desc dbk_type ILIKE)); return __x("Onbekend dagboek: {dbk}", dbk => $dbk)."\n" unless defined($t); $type = $t == DBKTYPE_VERKOOP; } else { # adm_relatie 2000-12-31 Cons deb ACME 1000 ($date, $desc, $type, $code, $amt) = @_; return _T("Relatietype moet \"deb\" of \"crd\" zijn")."\n" unless $type =~ /^crd|deb$/; $type = $type eq "deb"; } my $t = parse_date($date); return __x("Ongeldige datum: {date}", date => $date)."\n" unless $t; $date = $t; return __x("Datum {date} valt niet vóór het boekjaar", date => datefmt_full($date))."\n" if $self->{o}->{begindatum} && $self->{o}->{begindatum} le $t; $bky = substr($date, 0, 4) unless defined $bky; my $acct; my $sth; unless ( defined($dbk) ) { $sth = $dbh->sql_exec("SELECT rel_code, rel_ledger". " FROM Relaties". " WHERE UPPER(rel_code) = ?". " AND ".($type ? "" : "NOT ")." rel_debcrd", uc($code)); my $rr = $sth->fetch; return __x("Onbekende relatie: {rel}", rel => $code)."\n" unless defined $rr; ($code, $dbk) = @$rr; $sth->finish; $sth = $dbh->sql_exec("SELECT dbk_id, dbk_acc_id". " FROM Dagboeken". " WHERE dbk_id = ?", $dbk); } else { $sth = $dbh->sql_exec("SELECT dbk_id, dbk_acc_id". " FROM Dagboeken". " WHERE UPPER(dbk_desc) = ?", uc($dbk)); } ($dbk, $acct) = @{$sth->fetch}; my $rr = $dbh->do("SELECT rel_code FROM Relaties" . " WHERE UPPER(rel_code) = ?" . " AND " . ($type ? "" : "NOT ") . "rel_debcrd" . " AND rel_ledger = ?", uc($code), $dbk); return __x("Onbekende relatie: {rel}", rel => $code)."\n" unless defined $rr; my $anew; return __x("Ongeldig bedrag: {amount}", amount => $amt)."\n" unless defined($anew = amount($amt)); $self->check_open(0); push(@{$self->{o}->{relatie}}, [$bky, $nr, $date, $desc, $type, $code, $acct, $anew]); ""; } # The actual opening process. sub open { if ( $dbh->adm_open ) { goto &reopen; } return shellhelp() unless @_ == 1; my ($self) = @_; $self->check_open(0); my $o = $self->{o}; my $fail = 0; $fail++, warn(_T("De naam van de administratie is nog niet opgegeven")."\n") unless $o->{naam}; $fail++, warn(_T("De begindatum is nog niet opgegeven")."\n") unless $o->{begindatum}; my $does_btw = $dbh->does_btw; my $gbj; unless ( $gbj = defined($o->{boekjaarcode}) ) { warn(__x("Er is geen boekjaarcode opgegeven, de waarde {val} wordt gebruikt", val => $o->{boekjaarcode} = substr($o->{begindatum}, 0, 4))."\n"); $fail++, warn(__x("Boekjaarcode \"{code}\" is reeds in gebruik", code => $o->{boekjaarcode})."\n") if $dbh->lookup($o->{boekjaarcode}, qw(Boekjaren bky_code bky_name)); } elsif ( $o->{boekjaarcode} !~ /^\w{1,4}$/ ) { warn(__x("Ongeldige boekjaarcode: {code}", code => $o->{boekjaarcode})."\n"); $fail++; } $fail++, warn(_T("De BTW periode is nog niet opgegeven")."\n") if $does_btw && !$o->{btwperiode}; if ( ($o->{balans} || $o->{relatie}) && !defined($o->{balanstotaal}) ) { $fail++; warn(_T("Het totaalbedrag van de openingsbalans is nog niet opgegeven")."\n"); } # Generalise for multiple deb/crd accounts. my %adeb; my %acrd; my $sth = $dbh->sql_exec("SELECT dbk_acc_id FROM Dagboeken". " WHERE dbk_type = ?", DBKTYPE_INKOOP); while ( my $rr = $sth->fetch ) { $acrd{0+$rr->[0]} = 0; } $sth = $dbh->sql_exec("SELECT dbk_acc_id FROM Dagboeken". " WHERE dbk_type = ?", DBKTYPE_VERKOOP); while ( my $rr = $sth->fetch ) { $adeb{0+$rr->[0]} = 0; } $dbh->begin_work; if ( defined($o->{balanstotaal}) ) { my $adeb; my $acrd; my $need_rel = 0; if ( !$o->{balans} && $o->{openingsbalans} ) { $fail++; warn(_T("De openingsbalans is nog niet opgegeven")."\n"); } else { # Boekhoudkundig rekenen. my $bdebet = $o->{balanstotaal}; my $bcredit = -$bdebet; # Rekenkundig rekenen. my $rcredit = $bcredit; my $rdebet = $bdebet; while ( my ($acct, $e) = each(%{$o->{balans}}) ) { my ($dc, $amt) = @$e; # Rekenkundig rekenen. if ( $dc ) { $rdebet -= $amt; } else { $rcredit -= $amt; } # Boekhoudkundig rekenen. if ( $amt >= 0 ) { $bdebet -= $amt; } else { $bcredit -= $amt; } $need_rel++, $adeb{$acct} += $amt if defined($adeb{$acct}); $need_rel++, $acrd{$acct} += $amt if defined($acrd{$acct}); } if ( ($rdebet || $rcredit) && ($bdebet || $bcredit) ) { $fail++; warn(_T("De openingsbalans is niet correct!")."\n"); warn(__x("Opgegeven balanstotaal = {total}", total => numfmt($o->{balanstotaal}))."\n"); warn(__x("Rekenkundig residu debet = {rdeb}, credit = {rcrd}", rdeb => numfmt($rdebet), rcrd => numfmt(-$rcredit)). ($rdebet == -$rcredit ? __x(" (balanstotaal {total})", total => numfmt($o->{balanstotaal} - $rdebet)) : '')."\n"); warn(__x("Boekhoudkundig residu debet = {rdeb}, credit = {rcrd}", rdeb => numfmt($bdebet), rcrd => numfmt(-$bcredit)). ($bdebet == -$bcredit ? __x(" (balanstotaal {total})", total => numfmt($o->{balanstotaal} - $bdebet)) : '')."\n"); } # Helpful hints... $fail++, warn(_T("Er zijn geen openstaande posten opgegeven")."\n") if !$o->{relatie} && $need_rel; $fail++, warn(_T("Er zijn openstaande posten opgegeven, maar geen corresponderende balansposten")."\n") if $o->{relatie} && !$need_rel; # Process relations. foreach my $r ( @{$o->{relatie}} ) { my ($bky, $nr, $date, $desc, $debcrd, $code, $acct, $amt) = @$r; if ( $debcrd ) { $adeb = $acct; $adeb ||= $dbh->std_acc("deb", $adeb); unless ( defined $adeb ) { $adeb = (keys(%adeb))[0] if scalar(keys(%adeb)) == 1; } unless ( defined $adeb ) { warn(_T("Deze administratie kent geen koppeling voor verkoopboekingen")."\n"); $fail++; $adeb = 0; next; } next unless $adeb; $adeb{$adeb} -= $amt; } else { $acrd = $acct; $acrd ||= $dbh->std_acc("crd", $acrd); unless ( defined $acrd ) { $acrd = (keys(%acrd))[0] if scalar(keys(%acrd)) == 1; } unless ( defined $acrd ) { warn(_T("Deze administratie kent geen koppeling voor inkoopboekingen")."\n"); $fail++; $acrd = 0; # defined next; } next unless $acrd; $acrd{$acrd} += $amt; } if ( defined($bky) ) { my $sth = $dbh->sql_exec("SELECT bky_begin, bky_end". " FROM Boekjaren". " WHERE bky_code = ?", $bky); my $rr = $sth->fetchrow_arrayref; $sth->finish; if ( defined($rr) ) { my ($begin, $end) = @$rr; if ( $date lt $begin || $date gt $end ) { $fail++; warn(_T("Boekingsdatum valt niet binnen het boekjaar")."\n"); } } else { # Add a (pseudo) boekjaar. my $t = $o->{begindatum}; $t .= "-01-01" if length($t) == 4; (my $begin = $t) =~ s/^(\d{4})/substr($date,0,4)/e; my $end = parse_date($begin, undef, -1, undef, +1); $dbh->sql_insert("Boekjaren", [qw(bky_code bky_name bky_begin bky_end bky_btwperiod bky_opened bky_closed)], $bky, "$begin - $end", $begin, $end, 0, undef, undef); } } else { $bky = BKY_PREVIOUS; } } foreach my $adeb ( keys(%adeb) ) { next unless $adeb{$adeb}; $fail++; if ( $adeb{$adeb} >= 0 ) { warn(__x("Er is {amt} te weinig aan openstaande {dc} (rekening {acct}) opgegeven", amt => numfmt($adeb{$adeb}), acct => $adeb, dc => lc(_T("Debiteuren")))."\n"); } else { warn(__x("Er is {amt} te veel aan openstaande {dc} (rekening {acct}) opgegeven", amt => numfmt(-$adeb{$adeb}), acct => $adeb, dc => lc(_T("Debiteuren")))."\n"); } } foreach my $acrd ( keys(%acrd) ) { next unless $acrd{$acrd}; $fail++; if ( $acrd{$acrd} >= 0 ) { warn(__x("Er is {amt} te veel aan openstaande {dc} (rekening {acct}) opgegeven", amt => numfmt($acrd{$acrd}), acct => $acrd, dc => lc(_T("Crediteuren")))."\n"); } else { warn(__x("Er is {amt} te weinig aan openstaande {dc} (rekening {acct}) opgegeven", amt => numfmt(-$acrd{$acrd}), acct => $acrd, dc => lc(_T("Crediteuren")))."\n"); } } } } if ( $fail ) { $dbh->rollback if $dbh->in_transaction; return _T("DE OPENING IS NIET UITGEVOERD!")."\n"; } my $now = iso8601date(); $dbh->sql_insert("Boekjaren", [qw(bky_code bky_name bky_begin bky_end bky_btwperiod bky_opened)], $o->{boekjaarcode}, $o->{naam}, $o->{begindatum}, $o->{einddatum}, $o->{btwperiode}||0, $now); $dbh->sql_exec("UPDATE Metadata". " SET adm_bky = ?, adm_btwbegin = ?", $o->{boekjaarcode}, $does_btw ? $o->{begindatum} : undef); my $t = parse_date($o->{begindatum}, undef, -1); $dbh->sql_exec("UPDATE Boekjaren". " SET bky_closed = ?, bky_end = ?". " WHERE bky_code = ?", $t, $t, BKY_PREVIOUS); if ( defined $o->{balanstotaal} ) { while ( my ($acct, $e) = each(%{$o->{balans}}) ) { my ($dc, $amt) = @$e; $dbh->sql_exec("UPDATE Accounts". " SET acc_balance = acc_balance + ?,". " acc_ibalance = acc_ibalance + ?". " WHERE acc_id = ?", $amt, $amt, $acct); } my $dbk_inkoop; my $dbk_verkoop; foreach my $r ( @{$o->{relatie}} ) { my ($bky, $nr, $date, $desc, $debcrd, $code, $acct, $amt) = @$r; $nr = $dbh->get_sequence("bsk_nr_0_seq") unless defined $nr; my ($dagboek) = @{$dbh->do("SELECT dbk_id". " FROM Dagboeken". " WHERE dbk_acc_id = ?", $acct)}; if ( $debcrd ) { # unless ( $dbk_verkoop ) { # ($dbk_verkoop) = @{$dbh->do("SELECT dbk_id FROM Dagboeken". # " WHERE dbk_type = ?", # DBKTYPE_VERKOOP)}; # } # $dagboek = $dbk_verkoop; } else { # unless ( $dbk_inkoop ) { # ($dbk_inkoop) = @{$dbh->do("SELECT dbk_id FROM Dagboeken". # " WHERE dbk_type = ?", # DBKTYPE_INKOOP)}; # } # $dagboek = $dbk_inkoop; $amt = -$amt; } my $bsk_id = $dbh->get_sequence("boekstukken_bsk_id_seq"); $dbh->sql_insert("Boekstukken", [qw(bsk_id bsk_nr bsk_desc bsk_dbk_id bsk_date bsk_bky bsk_open bsk_amount)], $bsk_id, $nr, $desc, $dagboek, $date, $bky, $amt, $amt); $dbh->sql_insert("Boekstukregels", [qw(bsr_nr bsr_date bsr_bsk_id bsr_desc bsr_rel_code bsr_amount bsr_dbk_id bsr_type bsr_btw_class)], 1, $date, $bsk_id, $desc, $code, 0-$amt, $dagboek, 9, 0); } # my $highest = $dbh->get_sequence("bsk_nr_0_seq") + 1; # $dbh->set_sequence("bsk_nr_${dbk_inkoop}_seq", $highest) # if $dbk_inkoop; # $dbh->set_sequence("bsk_nr_${dbk_verkoop}_seq", $highest) # if $dbk_verkoop; } $dbh->commit; delete($self->{o}); $dbh->adm(""); # flush cache require EB::Report::Balres; my $opts = { verbose => $self->{verbose}, per => $dbh->adm("begin"), }; EB::Report::Balres->new->openingsbalans($opts); undef; } # A new bookyear. sub reopen { return shellhelp() unless @_ == 1; my ($self) = @_; $self->check_open(1); my $o = $self->{o}; my $fail = 0; # New begin date is old + one year. my $y = parse_date($dbh->adm("end"), undef, 1); # Avoid opening a new book year too soon. if ( $y gt parse_date(iso8601date(), undef, 0, 6) ) { warn(__x("Begindatum {year} komt in de toekomst te liggen", year => $y)."\n"); $fail++; } $o->{begindatum} = $y; $y =~ s/^(\d{4})/$1+1/e; $o->{einddatum} = parse_date($y, undef, -1); warn(_T("Er is geen nieuwe BTW periode opgegeven, deze blijft ongewijzigd")."\n") if $dbh->does_btw && !$o->{btwperiode}; if ( !defined($o->{boekjaarcode}) ) { warn(__x("Er is geen boekjaarcode opgegeven, de waarde {val} wordt gebruikt", val => $o->{boekjaarcode} = substr($o->{begindatum}, 0, 4))."\n"); } return _T("HET NIEUWE BOEKJAAR IS NIET GEOPEND!")."\n" if $fail; my $now = iso8601date(); $dbh->begin_work; $dbh->sql_insert("Boekjaren", [qw(bky_code bky_name bky_begin bky_end bky_btwperiod bky_opened)], $o->{boekjaarcode}, defined $o->{naam} ? $o->{naam} : $dbh->adm("name"), $o->{begindatum}, $o->{einddatum}, defined $o->{btwperiode} ? $o->{btwperiode} : $dbh->adm("btwperiod"), $now); $dbh->adm("bky", $o->{boekjaarcode}, "use_existing_transaction"); $dbh->adm(""); # flush cache # Reset boekstuknummer sequences. my $sth = $dbh->sql_exec("SELECT dbk_id FROM Dagboeken"); my $max = 1; while ( my $rr = $sth->fetchrow_arrayref ) { my $t = $dbh->get_sequence("bsk_nr_".$rr->[0]."_seq"); $dbh->set_sequence("bsk_nr_".$rr->[0]."_seq", 1); $max = $t if $t > $max; } # Sequence for bookings prev period. $dbh->set_sequence("bsk_nr_0_seq", $max); $dbh->commit; delete($self->{o}); undef; } sub shellhelp { my ($self, $cmd) = @_; _T( < Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden geïdentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden geïdentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in één administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie Invoeren van een openstaande post uit het voorgaande boekjaar. Het moet volledig zijn, dus ::. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. EOS } sub help_btwperiode { _T( < De boekjaarcode telt maximaal 4 letters en/of cijfers. Standaard wordt het jaartal van het te openen boekjaar genomen. De boekjaarcode is alleen belangrijk indien er meerdere boekjaren in één administratie worden bijgehouden. Deze opdracht kan worden gebruikt bij het openen van een boekjaar. Zie "help adm_open" voor meer informatie. EOS } sub help_naam { _T( < Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. EOS } sub help_balanstotaal { _T( < Het balanstotaal is de zowel de som van alle debet-posten als de som van alle credit-posten van de openingsbalans. Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. Zie ook "help adm_balans". Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. EOS } sub help_balans { _T( < De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of voor Debiteuren, dan moeten er ook openstaande posten voor in totaal dit bedrag worden ingevoerd met een of meer adm_relatie opdrachten. Zie ook "help adm_relatie". Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. EOS } sub help_relatie { _T( < Het moet volledig zijn, dus ::. Indien er voor de openingsbalans een bedrag is opgegeven voor de balansrekening Crediteuren of voor Debiteuren, dan moeten er ook openstaande posten voor in totaal dit bedrag worden ingevoerd. Zie ook "help adm_balans". Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. EOS } sub check_open { my ($self, $open) = @_; $open = 1 unless defined($open); if ( $open && !$dbh->adm_open ) { die("?"._T("De administratie is nog niet geopend")."\n"); } elsif ( !$open && $dbh->adm_open ) { die("?"._T("De administratie is reeds in gebruik")."\n"); } 1; } 1; EekBoek-2.02.04/lib/EB/Tools/Schema.pm0000444000076500007650000011426112165465617014730 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Sun Aug 14 18:10:49 2005 # Last Modified By: Johan Vromans # Last Modified On: Thu Sep 6 14:38:33 2012 # Update Count : 934 # Status : Unknown, Use with caution! ################ Common stuff ################ package main; our $cfg; our $dbh; package EB::Tools::Schema; use strict; use warnings; our $sql = 0; # load schema into SQL files my $trace = $cfg->val(__PACKAGE__, "trace", 0); ################ The Process ################ use EB; use EB::Format; use EB::DB; use Encode; ################ Subroutines ################ ################ Schema Loading ################ my $schema; my %km; # keyword map sub create { shift; # singleton class method my ($name) = @_; my $file; if ( $name !~ /^\w+$/) { $file = $name; } else { foreach my $dir ( ".", "schema" ) { foreach my $ext ( ".dat" ) { next unless -s "$dir/$name$ext"; $file = "$dir/$name$ext"; last; } } $file = findlib("schema/$name.dat") unless $file; } die("?".__x("Onbekend schema: {schema}", schema => $name)."\n") unless $file; open(my $fh, "<", $file) or die("?".__x("Toegangsfout schema data: {err}", err => $!)."\n"); $schema = $name; _create1(undef, sub { <$fh> }); seek( $fh, 0, 0 ); _create2(undef, sub { <$fh> }); __x("Schema {schema} geïnitialiseerd", schema => $name); } sub _create1 { # 1st pass shift; # singleton class method my ($rl) = @_; $dbh = EB::DB->new(trace => $trace) unless $sql; load_schema1($rl); } sub _create2 { # 2nd pass shift; # singleton class method my ($rl) = @_; load_schema2($rl); } my @hvdi; # hoofdverdichtingen my @vdi; # verdichtingen my $max_hvd; # hoogste waarde voor hoofdverdichting my $max_vrd; # hoogste waarde voor verdichting my %acc; # grootboekrekeningen my $chvdi; # huidige hoofdverdichting my $cvdi; # huidige verdichting my %std; # standaardrekeningen my %dbk; # dagboeken my @dbk; # dagboeken my @btw; # btw tarieven my %btw; # btw aliases my $btw_auto; # btw auto code my %btwmap; # btw type/incl -> code my $fail; # any errors sub init_vars { @hvdi = (); # hoofdverdichtingen @vdi = (); # verdichtingen undef $max_hvd; # hoogste waarde voor hoofdverdichting undef $max_vrd; # hoogste waarde voor verdichting %acc = (); # grootboekrekeningen undef $chvdi; # huidige hoofdverdichting undef $cvdi; # huidige verdichting %std = (); # standaardrekeningen %dbk = (); # dagboeken @dbk = (); # dagboeken @btw = (); # btw tarieven %btw = (); # btw aliases $btw_auto = BTW_CODE_AUTO; # btw auto code %btwmap = (); # btw type/incl -> code undef $fail; # any errors init_kmap(); } sub init_kmap { %km = (); ####FIXME: Use N__ and __XN and friends. # BTW tariefgroepen. $km{tg_hoog} = __xt("scm:tg:hoog"); $km{tg_laag} = __xt("scm:tg:laag"); $km{tg_nul} = __xt("scm:tg:nul"); $km{tg_geen} = __xt("scm:tg:geen"); $km{tg_privé} = __xt("scm:tg:privé"); $km{tg_anders} = __xt("scm:tg:anders"); # Koppelingen. $km{winst} = __xt("scm:std:winst"); $km{crd} = __xt("scm:std:crd"); $km{deb} = __xt("scm:std:deb"); $km{btw_il} = __xt("scm:std:btw_il"); $km{btw_vl} = __xt("scm:std:btw_vl"); $km{btw_ih} = __xt("scm:std:btw_ih"); $km{btw_vp} = __xt("scm:std:btw_vp"); $km{btw_ip} = __xt("scm:std:btw_ip"); $km{btw_va} = __xt("scm:std:btw_va"); $km{btw_ia} = __xt("scm:std:btw_ia"); $km{btw_ok} = __xt("scm:std:btw_ok"); $km{btw_vh} = __xt("scm:std:btw_vh"); # Section headings. $km{hdr_verdichting} = __xt("scm:hdr:Verdichting"); $km{hdr_balans} = __xt("scm:hdr:Balansrekeningen"); $km{balans} = __xt("scm:balans"); $km{hdr_resultaat} = __xt("scm:hdr:Resultaatrekeningen"); $km{result} = __xt("scm:result"); $km{hdr_dagboeken} = __xt("scm:hdr:Dagboeken"); $km{dagboeken} = __xt("scm:dagboeken"); $km{hdr_btwtarieven} = __xt("scm:hdr:BTW Tarieven"); # Daybook Types. $km{inkoop} = __xt("scm:dbk:inkoop"); $km{verkoop} = __xt("scm:dbk:verkoop"); $km{bank} = __xt("scm:dbk:bank"); $km{kas} = __xt("scm:dbk:kas"); $km{memoriaal} = __xt("scm:dbk:memoriaal"); # Misc. $km{inclusief} = __xt("scm:inclusief"); $km{exclusief} = __xt("scm:exclusief"); $km{incl} = __xt("scm:incl"); $km{excl} = __xt("scm:excl"); $km{btw} = __xt("scm:btw"); $km{vanaf} = __xt("scm:vanaf"); $km{tot} = __xt("scm:tot"); $km{kosten} = __xt("scm:kosten"); $km{kostenrekening} = __xt("scm:kostenrekening"); $km{omzet} = __xt("scm:omzet"); $km{omzetrekening} = __xt("scm:omzetrekening"); $km{koppeling} = __xt("scm:koppeling"); $km{type} = __xt("scm:type"); $km{rek} = __xt("scm:rek"); $km{rekening} = __xt("scm:rekening"); $km{percentage} = __xt("scm:percentage"); $km{perc} = __xt("scm:perc"); $km{tariefgroep} = __xt("scm:tariefgroep"); } sub _xt { # scm:btw -> scm:vat -> vat my $t = _T(shift); $t =~ s/^.*://; $t; } sub _xtr { # scm:vat -> scm:btw -> btw my $t = shift; (my $pfx, $t) = ( $1, $2 ) if $t =~ /^(.*):(.*)/; keys(%km); # reset iteration while ( my ($k, $v) = each %km ) { next unless $t eq $v; return $1 if $k =~ /^tg_(.*)/; return $k; } undef; } sub error { warn('?', @_); $fail++; } my $dbkid; sub scan_dagboeken { return 0 unless /^\s+(\w{1,4})\s+(.*)/ && $1; $dbkid++; my ($id, $desc) = ($1, $2); error(__x("Dubbel: dagboek {dbk}", dbk => $id)."\n") if defined($dbk{$id}); my $type; my $dcsplit, my $rek = 0; my $extra; while ( $desc =~ /^(.+?)\s+:([^\s:]+)\s*$/ ) { $desc = $1; $extra = $2; if ( $extra =~ m/^$km{type}=(\S+)$/i ) { my $t = DBKTYPES; for ( my $i = 0; $i < @$t; $i++ ) { next unless lc($1) eq lc(_xt("scm:dbk:".lc($t->[$i]))); $type = $i; last; } error(__x("Dagboek {id} onbekend type \"{type}\"", id => $id, type => $1)."\n") unless defined($type); } elsif ( $extra =~ m/^(?:$km{rek}|$km{rekening})?=(\d+)$/i ) { $rek = $1; } elsif ( $extra =~ m/^dc$/i ) { $dcsplit = 1; } else { error(__x("Dagboek {id}: onbekende info \"{info}\"", id => $id, info => $extra)."\n"); } } error(__x("Dagboek {id}: het :type ontbreekt", id => $id)."\n") unless defined($type); error(__x("Dagboek {id}: het :rekening nummer ontbreekt", id => $id)."\n") if ( $type == DBKTYPE_KAS || $type == DBKTYPE_BANK ) && !$type; error(__x("Dagboek {id}: :dc is alleen toegestaan voor Kas en Bankboeken", id => $id)."\n") if $dcsplit && !( $type == DBKTYPE_KAS || $type == DBKTYPE_BANK ); my $t = lc(_T($desc)); $t =~ s/\s+/_/g; error(__x("Dagboek naam \"{dbk}\" is niet toegestaan.", dbk => $desc)."\n") if $desc =~ /^adm[ _]/i || defined &{"EB::Shell::do_$t"}; $dbk{$id} = $dbkid; $dbk[$dbkid] = [ $id, $desc, $type, $dcsplit, $rek||undef ]; } sub scan_btw { return 0 unless /^\s+(\w+-?)\s+(.*)/; my ($id, $desc) = ($1, $2); my $id0 = $id; # for messages my $alias; unless ( $id =~ /^\d+$/ ) { error(__x("Ongeldige code voor BTW tarief: {id} (moet minstens twee tekens zijn)", id => $id0)."\n") if length($id) < 3; # prevent clash with HK and such. error(__x("Dubbel: BTW tarief {id}", id => $id0)."\n") if exists($btw{lc $id}); $btw_auto += 2; $btw{lc $id} = $btw_auto; $alias = lc $id; $id = $btw_auto; } else { error(__x("Ongeldige code voor BTW tarief: {id}", id => $id0)."\n") if $id > BTW_CODE_AUTO; } error(__x("Dubbel: BTW tarief {id}", id => $id0)."\n") if defined($btw[$id]); my $perc; my $groep = 0; my $incl = 1; my $sdate; my $edate; my $extra; while ( $desc =~ /^(.+?)\s+:([^\s:]+)\s*$/ ) { $desc = $1; $extra = $2; if ( $extra =~ m/^(?:$km{perc}|$km{percentage})?=(\S+)$/i ) { $perc = amount($1); if ( AMTPRECISION > BTWPRECISION-2 ) { $perc = substr($perc, 0, length($perc) - (AMTPRECISION - BTWPRECISION-2)) } elsif ( AMTPRECISION < BTWPRECISION-2 ) { $perc .= "0" x (BTWPRECISION-2 - AMTPRECISION); } } elsif ( $extra =~ m/^$km{tariefgroep}=$km{tg_hoog}$/i ) { $groep = BTWTARIEF_HOOG; } elsif ( $extra =~ m/^$km{tariefgroep}=$km{tg_laag}$/i ) { $groep = BTWTARIEF_LAAG; } elsif ( $extra =~ m/^$km{tariefgroep}=($km{tg_nul}|$km{tg_geen})$/i ) { $groep = BTWTARIEF_NUL; warn("!"._T("Gelieve BTW tariefgroep \"Geen\" te vervangen door \"Nul\"")."\n") if lc($1) eq $km{tg_geen}; } elsif ( $extra =~ m/^$km{tariefgroep}=(prive|$km{tg_privé})$/i ) { $groep = BTWTARIEF_PRIV; } elsif ( $extra =~ m/^$km{tariefgroep}=$km{tg_anders}$/i ) { $groep = BTWTARIEF_ANDERS; } elsif ( $extra =~ m/^(?:$km{incl}|$km{inclusief})$/i ) { $incl = 1; } elsif ( $extra =~ m/^(?:$km{excl}|$km{exclusief})$/i ) { $incl = 0; } elsif ( $extra =~ m/^(?:$km{vanaf})=(.+)$/i ) { $sdate = $1; error("Ongeldige datumaanduiding in {key}: {value}", key => $km{vanaf}, value => $sdate) unless $sdate =~ /^(\d{4}-\d\d-\d\d)$/; $sdate = parse_date($1) or error(__x("Ongeldige datumaanduiding in {key}: {value}", key => $km{vanaf}, value => $1)); } elsif ( $extra =~ m/^(?:$km{tot})=(.+)$/i ) { $edate = $1; error("Ongeldige datumaanduiding in {key}: {value}", key => $km{tot}, value => $sdate) unless $edate =~ /^(\d{4}-\d\d-\d\d)$/; $edate = parse_date($1, undef, -1) or error(__x("Ongeldige datumaanduiding in {key}: {value}", key => $km{tot}, value => $1)); } else { error(__x("BTW tarief {id}: onbekende info \"{info}\"", id => $id0, info => $extra)."\n"); } } error(__x("BTW tarief {id}: geen percentage en de tariefgroep is niet \"{none}\"", id => $id0, none => _T("geen"))."\n") unless defined($perc) || $groep == BTWTARIEF_NUL; # Add the definition. Automatically add one for the non-$incl variant if it is named. $btw[$id] = [ $id, $alias, $desc, $groep, $perc, $incl, $sdate, $edate ]; $btw[$id+1] = [ $id+1, undef, $alias.($incl?'-':'+'), $groep, $perc, !$incl, $sdate, $edate ] if $id > BTW_CODE_AUTO; if ( $groep == BTWTARIEF_NUL && !defined($btwmap{n}) ) { $btwmap{n} = $id; } else { my $pfx = $incl ? "" : "-"; if ( $groep == BTWTARIEF_HOOG && !defined($btwmap{"h$pfx"}) ) { $btwmap{"h$pfx"} = $id; } elsif ( $groep == BTWTARIEF_LAAG && !defined($btwmap{"l$pfx"}) ) { $btwmap{"l$pfx"} = $id; } elsif ( $groep == BTWTARIEF_PRIV && !defined($btwmap{"p$pfx"}) ) { $btwmap{"p$pfx"} = $id; } elsif ( $groep == BTWTARIEF_ANDERS && !defined($btwmap{"a$pfx"}) ) { $btwmap{"a$pfx"} = $id; } } $btwmap{$id} = $id; $btwmap{$alias} = $id if defined($alias) && $alias !~ /^\d+$/; 1; } sub scan_balres { my ($balres) = shift; if ( /^\s*(\d+)\s+(.+)/ && length($1) <= length($max_hvd) && $1 <= $max_hvd ) { error(__x("Dubbel: hoofdverdichting {vrd}", vrd => $1)."\n") if exists($hvdi[$1]); $hvdi[$chvdi = $1] = [ $2, $balres ]; } elsif ( /^\s*(\d+)\s+(.+)/ && length($1) <= length($max_vrd) && $1 <= $max_vrd ) { error(__x("Dubbel: verdichting {vrd}", vrd => $1)."\n") if exists($vdi[$1]); error(__x("Verdichting {vrd} heeft geen hoofdverdichting", vrd => $1)."\n") unless defined($chvdi); $vdi[$cvdi = $1] = [ $2, $balres, $chvdi ]; } elsif ( /^\s*(\d+)\s+(\S+)\s+(.+)/ ) { my ($id, $flags, $desc) = ($1, $2, $3); error(__x("Dubbel: rekening {acct}", acct => $1)."\n") if exists($acc{$id}); error(__x("Rekening {id} heeft geen verdichting", id => $id)."\n") unless defined($cvdi); my $debcrd; my $kstomz; my $dcfixed; if ( ($balres ? $flags =~ /^[dc]\!?$/i : $flags =~ /^[kon]$/i) || $flags =~ /^[dc][ko]$/i ) { $debcrd = $flags =~ /d/i; $kstomz = $flags =~ /k/i if $flags =~ /[ko]/i; $dcfixed = $flags =~ /\!/; } else { error(__x("Rekening {id}: onherkenbare vlaggetjes {flags}", id => $id, flags => $flags)."\n"); } my $btw_type = 'n'; my $btw_ko; my $extra; while ( $desc =~ /^(.+?)\s+:([^\s:]+)\s*$/ ) { $desc = $1; $extra = $2; if ( $extra =~ m/^$km{btw}=(.+)$/i ) { my $spec = $1; my @spec = split(/,/, lc($spec)); my $btw_inex = 1; foreach ( @spec ) { if ( $balres && /^($km{kosten}|$km{omzet})$/ ) { $btw_ko = $1 eq $km{kosten}; } # elsif ( defined $btwmap{$_} ) { # $btw_type = $btwmap{$_}; # } elsif ( /^($km{tg_hoog}|$km{tg_laag}|$km{tg_nul}|prive|$km{tg_privé}|$km{tg_anders})$/ ) { $btw_type = substr(_xtr("scm:tg:$1"), 0, 1); } elsif ( /^\d+$/ ) { $btw_type = $_; warn("!".__x("Rekening {id}: gelieve BTW tariefcode {code} te vervangen door een tariefgroep", id => $id, code => $_)."\n") } elsif ( $_ eq $km{tg_geen} ) { $btw_type = 0; $kstomz = $btw_ko = undef; } elsif ( /^($km{incl}|$km{excl}|$km{inclusief}|$km{exclusief})?$/ ) { $btw_inex = $1 eq $km{incl} || $1 eq $km{inclusief}; } else { error(__x("Foutieve BTW specificatie: {spec}", spec => $spec)."\n"); last; } } $btw_type .= "-" unless $btw_inex; } elsif ( $extra =~ m/$km{koppeling}=(\S+)/i ) { my $t = _xtr("scm:std:$1"); error(__x("Rekening {id}: onbekende koppeling \"{std}\"", id => $id, std => $1)."\n") unless exists($std{$t}); error(__x("Rekening {id}: extra koppeling voor \"{std}\"", id => $id, std => $1)."\n") if $std{$t}; $std{$t} = $id; } } if ( $btw_type ne 'n' ) { error(__x("Rekening {id}: BTW koppeling '{ko}' met een {acc} is niet toegestaan", id => $id, ko => ($km{omzet}, $km{kosten})[$btw_ko], acc => ($km{omzetrekening}, $km{kostenrekening})[$kstomz])."\n") if !$balres && defined($kstomz) && defined($btw_ko) && $btw_ko != $kstomz; error(__x("Rekening {id}: BTW koppeling met neutrale resultaatrekening is niet toegestaan", id => $id)."\n") unless defined($kstomz) || defined($btw_ko); error(__x("Rekening {id}: BTW koppeling met een balansrekening vereist kosten/omzet specificatie", id => $id)."\n") if $balres && !defined($btw_ko); } $desc =~ s/\s+$//; $kstomz = $btw_ko unless defined($kstomz); $acc{$id} = [ $desc, $cvdi, $balres, $debcrd, $kstomz, $btw_type, $dcfixed ]; 1; } else { 0; } } sub scan_balans { unshift(@_, 1); goto &scan_balres; } sub scan_result { unshift(@_, 0); goto &scan_balres; } sub scan_ignore { 1 } sub load_schema1 { my ($rl) = shift; init_vars(); my $scanner; # current scanner %std = map { $_ => 0 } qw(btw_ok btw_vh winst crd deb btw_il btw_vl btw_ih btw_vp btw_ip btw_va btw_ia); while ( $_ = $rl->() ) { if ( /^\# \s* content-type: \s* text (?: \s* \/ \s* plain)? \s* ; \s* charset \s* = \s* (\S+) \s* $/ix ) { my $charset = lc($1); if ( $charset =~ /^(?:utf-?8)$/i ) { next; } error(_T("Invoer moet Unicode (UTF-8) zijn.")."\n"); } my $s = "".$_; eval { $_ = decode('utf8', $s, 1); }; if ( $@ ) { warn("?".__x("Geen geldige UTF-8 tekens in regel {line} van de invoer", line => $.)."\n".$s."\n"); warn($@); $fail++; next; } next if /^\s*#/; next unless /\S/; # Scanner selectie. if ( /^($km{balans}|$km{hdr_balans})/i ) { $scanner = \&scan_ignore; next; } if ( /^($km{result}|$km{hdr_resultaat})/i ) { $scanner = \&scan_ignore; next; } if ( /^($km{dagboeken}|$km{hdr_dagboeken})/i ) { $scanner = \&scan_ignore; next; } if ( /^$km{hdr_btwtarieven}/i ) { $scanner = \&scan_btw; next; } # Overige settings. if ( /^$km{hdr_verdichting}\s+(\d+)\s+(\d+)/i && $1 < $2 ) { next; } # Anders: Scan. if ( $scanner ) { chomp; $scanner->() or error(__x("Ongeldige invoer in schema bestand, regel {lno}:\n{line}", line => $_, lno => $.)."\n"); next; } error(__x("Ongeldige invoer in schema bestand, regel {lno}:\n{line}", line => $_, lno => $.)."\n"); } } sub load_schema2 { my ($rl) = shift; my $scanner; # current scanner $max_hvd = 9; $max_vrd = 99; while ( $_ = $rl->() ) { if ( /^\# \s* content-type: \s* text (?: \s* \/ \s* plain)? \s* ; \s* charset \s* = \s* (\S+) \s* $/ix ) { my $charset = lc($1); if ( $charset =~ /^(?:utf-?8)$/i ) { next; } error(_T("Invoer moet Unicode (UTF-8) zijn.")."\n"); } my $s = "".$_; eval { $_ = decode('utf8', $s, 1); }; if ( $@ ) { warn("?".__x("Geen geldige UTF-8 tekens in regel {line} van de invoer", line => $.)."\n".$s."\n"); warn($@); $fail++; next; } next if /^\s*#/; next unless /\S/; # Scanner selectie. if ( /^($km{balans}|$km{hdr_balans})/i ) { $scanner = \&scan_balans; next; } if ( /^($km{result}|$km{hdr_resultaat})/i ) { $scanner = \&scan_result; next; } if ( /^($km{dagboeken}|$km{hdr_dagboeken})/i ) { $scanner = \&scan_dagboeken; next; } if ( /^$km{hdr_btwtarieven}/i ) { $scanner = \&scan_ignore; next; } # Overige settings. if ( /^$km{hdr_verdichting}\s+(\d+)\s+(\d+)/i && $1 < $2 ) { $max_hvd = $1; $max_vrd = $2; next; } # Anders: Scan. if ( $scanner ) { chomp; $scanner->() or error(__x("Ongeldige invoer in schema bestand, regel {lno}:\n{line}", line => $_, lno => $.)."\n"); next; } error(__x("Ongeldige invoer in schema bestand, regel {lno}:\n{line}", line => $_, lno => $.)."\n"); # This is here for historical reasons. # If you weren't at the THE in 1977 this will mean nothing to you... # error("?"._T("Men beginne met \"Balansrekeningen\", \"Resultaatrekeningen\",".# # " \"Dagboeken\" of \"BTW Tarieven\"")."\n"); } # Bekijk alle dagboeken om te zien of er inkoop/verkoop dagboeken # zijn die een tegenrekening nodig hebben. In dat geval moet de # betreffende koppeling in het schema gemaakt zijn. my ($need_deb, $need_crd) = (0,0); foreach ( @dbk ) { next unless defined($_); # sparse my ($id, $desc, $type, $dc, $rek) = @$_; next if defined($rek); if ( $type == DBKTYPE_INKOOP ) { $need_crd++; $_->[4] = $std{"crd"}; #### Verify that it's a C acct. } elsif ( $type == DBKTYPE_VERKOOP ) { $need_deb++; $_->[4] = $std{"deb"}; #### Verify that it's a D acct. } elsif ( $type != DBKTYPE_MEMORIAAL ) { error(__x("Dagboek {id} heeft geen tegenrekening", id => $id)."\n"); $fail++; } } # Verwijder onnodige koppelingen. delete($std{crd}) unless $need_crd; delete($std{deb}) unless $need_deb; unless (defined($btwmap{p}) || defined($btwmap{"p-"}) ) { delete($std{"btw_ip"}) unless $std{"btw_ip"}; delete($std{"btw_vp"}) unless $std{"btw_vp"}; } unless (defined($btwmap{a}) || defined($btwmap{"a-"}) ) { delete($std{"btw_ia"}) unless $std{"btw_ia"}; delete($std{"btw_va"}) unless $std{"btw_va"}; } my %mapbtw = ( n => "Nul", h => "Hoog", "l" => "Laag" ); if ( @btw ) { foreach ( keys(%mapbtw) ) { next if defined($btwmap{$_}); error(__x("Geen BTW tarief gevonden met tariefgroep {gr}, inclusief", gr => $mapbtw{$_})."\n"); } } else { for ( qw(ih il ip ia vh vl vp va ok) ) { delete($std{"btw_$_"}) unless $std{"btw_$_"}; } $btwmap{n} = undef; $btw[0] = [ 0, "BTW Nul", BTWTARIEF_NUL, 0, 0 ]; } while ( my($k,$v) = each(%std) ) { next if $v; error(__x("Geen koppeling gevonden voor \"{std}\"", std => $k)."\n"); } die("?"._T("FOUTEN GEVONDEN IN SCHEMA BESTAND, VERWERKING AFGEBROKEN")."\n") if $fail; if ( $sql ) { gen_schema(); } else { create_schema(); } } sub create_schema { use EB::Tools::SQLEngine; my $engine = EB::Tools::SQLEngine->new(trace => $trace); $engine->callback(map { $_, __PACKAGE__->can("sql_$_") } qw(constants vrd acc std btw dbk) ); $dbh->begin_work; $engine->process(sql_eekboek()); $dbh->commit; } sub _trim { my ($t) = @_; for ( $t ) { s/\s+/ /g; s/^\s+//; s/\s+$//; return $_; } } sub _tsv { join("\t", map { _trim($_) } @_) . "\n"; } sub sql_eekboek { my $f = findlib("schema/eekboek.sql"); open (my $fh, '<:encoding(utf-8)', $f) or die("?"._T("Installatiefout -- geen database schema")."\n"); local $/; my $sql = <$fh>; close($fh); $sql; } sub sql_constants { my $out = "COPY Constants (name, value) FROM stdin;\n"; foreach my $key ( sort(@EB::Globals::EXPORT) ) { no strict; next if ref($key->()); $out .= "$key\t" . $key->() . "\n"; } $out . "\\.\n"; } sub sql_vrd { my $out = <[0], _tf($v->[1]), _tfn(undef), "\\N"); } $out .= "\\.\n"; $out .= <[0], _tf($v->[1]), _tfn(undef), $v->[2]); } $out . "\\.\n"; } sub sql_acc { my $out = < $b } keys(%acc) ) { my $g = $acc{$i}; croak(__x("Geen BTW tariefgroep voor code {code}", code => $g->[5])) unless exists $btwmap{$g->[5]} || exists $btwmap{$g->[5]."-"}; $out .= _tsv($i, $g->[0], $g->[1], _tf($g->[2]), _tf($g->[3]), _tfn($g->[2] ? $g->[6] : undef), _tfn($g->[4]), defined($btwmap{$g->[5]}) ? $btwmap{$g->[5]} : "\\N", 0, 0); } $out . "\\.\n"; } sub sql_std { my $out = <[1] = "\\N" unless defined($_->[1]); $_->[6] = "\\N" unless defined($_->[6]); $_->[7] = "\\N" unless defined($_->[7]); if ( $_->[3] == BTWTARIEF_NUL ) { $_->[4] = 0; $_->[5] = "\\N"; } else { $_->[5] = _tf($_->[5]); } $out .= _tsv(@$_); } $out . "\\.\n"; } sub sql_dbk { my $out = <[4] ||= $std{deb} if $_->[2] == DBKTYPE_VERKOOP; $_->[4] ||= $std{crd} if $_->[2] == DBKTYPE_INKOOP; $out .= join("\t", map { defined($_) ? $_ : "\\N" } @$_). "\n"; } $out .= "\\.\n"; $out .= "\n-- Sequences for Boekstuknummers, one for each Dagboek\n"; foreach ( @dbk ) { next unless defined; $out .= "CREATE SEQUENCE bsk_nr_$_->[0]_seq;\n"; } $out; } use Encode; sub gen_schema { foreach ( qw(eekboek vrd acc dbk btw std) ) { warn('%'.__x("Aanmaken {sql}...", sql => "$_.sql")."\n"); # Careful. Data is utf8. open(my $f, ">:encoding(utf-8)", "$_.sql") or die("Cannot create $_.sql: $!\n"); my $cmd = "sql_$_"; no strict 'refs'; print $f decode_utf8($cmd->()); close($f); } } sub _tf { qw(f t)[shift]; } sub _tfn { defined($_[0]) ? qw(f t)[$_[0]] : "\\N"; } ################ Subroutines ################ sub dump_sql { my ($self, $schema) = @_; local($sql) = 1; create(undef, $schema); } my %kopp; my $fh; sub dump_schema { my ($self, $fh) = @_; $fh ||= *STDOUT; # Only generate comments when translated. my $preamble = <new(trace => $trace); $dbh->connectdb; # can't wait... init_kmap(); my @t = localtime(time); print {$fh} ( "# ", __x( "{pkg} Rekeningschema voor {db}", pkg => $EekBoek::PACKAGE, db => $dbh->dbh->{Name} ), "\n", "# ", __x( "Aangemaakt door {pkg} {version} op {ts}", pkg => $EekBoek::PACKAGE, version => $EekBoek::VERSION, ts => sprintf( "%02d-%02d-%04d %02d:%02d:%02d", $t[3], 1+$t[4], 1900+$t[5], @t[2,1,0] ), ), "\n", "# Content-Type: text/plain; charset = UTF-8\n" ); print {$fh} $preamble if $comment; my $sth = $dbh->sql_exec("SELECT * FROM Standaardrekeningen"); my $rr = $sth->fetchrow_hashref; $sth->finish; while ( my($k,$v) = each(%$rr) ) { next unless defined $v; $k =~ s/^std_acc_//; $kopp{$v} = $k; } print {$fh} <do("SELECT MAX(vdi_id) FROM Verdichtingen WHERE vdi_struct IS NULL")->[0]; $max_vrd = $dbh->do("SELECT MAX(vdi_id) FROM Verdichtingen WHERE NOT vdi_struct IS NULL")->[0]; print {$fh} < 9 || $max_vrd > 99 ) ? ( $max_hvd, $max_vrd ) : ( 9, 99 ) ); print {$fh} <does_btw ) { print {$fh} < $EekBoek::PACKAGE ), "\n" ); } sub dump_acc { my ($balres, $fh) = @_; print {$fh} ("\n", $balres ? $km{hdr_balans} : $km{hdr_resultaat}, "\n"); my $sth = $dbh->sql_exec("SELECT vdi_id, vdi_desc". " FROM Verdichtingen". " WHERE ".($balres?"":"NOT ")."vdi_balres". " AND vdi_struct IS NULL". " ORDER BY vdi_id"); while ( my $rr = $sth->fetchrow_arrayref ) { my ($id, $desc) = @$rr; printf {$fh} ("\n %d %s\n", $id, $desc); print {$fh} ("# ".__x("HOOFDVERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGEN", min => 1, max => $max_hvd)."\n") if $id > $max_hvd; my $sth = $dbh->sql_exec("SELECT vdi_id, vdi_desc". " FROM Verdichtingen". " WHERE vdi_struct = ?". " ORDER BY vdi_id", $id); while ( my $rr = $sth->fetchrow_arrayref ) { my ($id, $desc) = @$rr; printf {$fh} (" %-2d %s\n", $id, $desc); print {$fh} ("# ".__x("VERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGEN", min => $max_hvd+1, max => $max_vrd)."\n") if $id <= $max_hvd || $id > $max_vrd; my $sth = $dbh->sql_exec("SELECT acc_id, acc_desc, acc_balres,". " acc_debcrd, acc_dcfixed, acc_kstomz,". " acc_btw, btw_tariefgroep, btw_incl". " FROM Accounts, BTWTabel ". " WHERE acc_struct = ?". " AND (btw_id = acc_btw". " OR btw_id = 0 AND acc_btw IS NULL)". " ORDER BY acc_id", $id); while ( my $rr = $sth->fetchrow_arrayref ) { my ($id, $desc, $acc_balres, $acc_debcrd, $acc_dcfixed, $acc_kstomz, $btw_id, $btw, $btwincl) = @$rr; my $flags = ""; if ( $balres ) { $flags .= $acc_debcrd ? "D" : "C"; $flags .= '!' if $acc_dcfixed; } else { $flags .= defined($acc_kstomz) ? ($acc_kstomz ? "K" : "O") : "N"; } my $extra = ""; if ( $btw == BTWTARIEF_HOOG ) { $extra .= " :$km{btw}=$km{tg_hoog}"; $extra .= ",$km{excl}" unless $btwincl; if ( $balres ) { $extra .= ",$km{kosten}" if $acc_kstomz; $extra .= ",$km{omzet}" if !$acc_kstomz; } } elsif ( $btw == BTWTARIEF_LAAG ) { $extra .= " :$km{btw}=$km{tg_laag}"; $extra .= ",$km{excl}" unless $btwincl; if ( $balres ) { $extra .= ",$km{kosten}" if $acc_kstomz; $extra .= ",$km{omzet}" if !$acc_kstomz; } } elsif ( $btw == BTWTARIEF_PRIV ) { $extra .= " :$km{btw}=$km{tg_privé}"; $extra .= ",$km{excl}" unless $btwincl; if ( $balres ) { $extra .= ",$km{kosten}" if $acc_kstomz; $extra .= ",$km{omzet}" if !$acc_kstomz; } } elsif ( $btw == BTWTARIEF_ANDERS ) { $extra .= " :$km{btw}=$km{tg_anders}"; $extra .= ",$km{excl}" unless $btwincl; if ( $balres ) { $extra .= ",$km{kosten}" if $acc_kstomz; $extra .= ",$km{omzet}" if !$acc_kstomz; } } elsif ( $btw != BTWTARIEF_NUL ) { $extra .= " :$km{btw}=$btw_id"; } else { if ( $balres && defined($acc_kstomz) ) { $extra .= " :$km{btw}=$km{kosten}" if $acc_kstomz; $extra .= " :$km{btw}=$km{omzet}" if !$acc_kstomz; } } $extra .= " :$km{koppeling}=".$km{$kopp{$id}} if exists($kopp{$id}); $desc =~ s/^\s+//; $desc =~ s/\s+$//; my $t = sprintf(" %-4s %-2s %-40.40s %s", $id < $max_vrd ? (("0" x (length($max_vrd)-length($id)+1)) . $id) : $id, $flags, $desc, $extra); $t =~ s/\s+$//; print {$fh} ($t, "\n"); print {$fh} ("# ".__x("{id} ZOU EEN BALANSREKENING MOETEN ZIJN", id => $id)."\n") if $acc_balres && !$balres; print {$fh} ("# ".__x("{id} ZOU EEN RESULTAATREKENING MOETEN ZIJN", id => $id)."\n") if !$acc_balres && $balres; } } } } sub dump_btw { my $fh = shift; print {$fh} ("\n$km{hdr_btwtarieven}\n\n"); my $sth = $dbh->sql_exec("SELECT btw_id, btw_alias, btw_desc, btw_perc, btw_tariefgroep,". "btw_incl, btw_start, btw_end". " FROM BTWTabel". " ORDER BY btw_id"); while ( my $rr = $sth->fetchrow_arrayref ) { my ($id, $alias, $desc, $perc, $btg, $incl, $start, $end) = @$rr; my $extra = ""; $extra .= " :$km{tariefgroep}=" . $km{"tg_".lc(BTWTARIEVEN->[$btg])}; if ( $btg != BTWTARIEF_NUL ) { $extra .= " :$km{perc}=".btwfmt($perc); $extra .= " :$km{exclusief}" unless $incl; } $extra .= " :$km{vanaf}=$start" if $start; $extra .= " :$km{tot}=".parse_date($end, undef, 1) if $end; if ( $id >= BTW_CODE_AUTO ) { next unless $alias; $alias = sprintf("%-10s", $alias); } else { $alias = sprintf("%3d", $id); } my $t = sprintf(" %s %-20s %s", $alias, $desc, $extra); $t =~ s/\s+$//; print {$fh} ($t, "\n"); } } sub dump_dbk { my $fh = shift; print {$fh} ("\n$km{hdr_dagboeken}\n\n"); my $sth = $dbh->sql_exec("SELECT dbk_id, dbk_desc, dbk_type, dbk_dcsplit, dbk_acc_id". " FROM Dagboeken". " ORDER BY dbk_id"); while ( my $rr = $sth->fetchrow_arrayref ) { my ($id, $desc, $type, $dc, $acc_id) = @$rr; $acc_id = 0 if $type == DBKTYPE_INKOOP && $dbh->std_acc("crd", 0) == $acc_id; $acc_id = 0 if $type == DBKTYPE_VERKOOP && $dbh->std_acc("deb", 0) == $acc_id; my $t = sprintf(" %-4s %-20s :type=%-10s %s", $id, $desc, _xt("scm:dbk:".lc(DBKTYPES->[$type])), ($acc_id ? ":$km{rekening}=$acc_id" : ""). ($dc ? " :dc" : ""), ); $t =~ s/\s+$//; print {$fh} ($t, "\n"); } } ################ API functions ################ sub new { bless \my $x, shift; } sub add_gbk { my ($self, @args) = @_; my $opts = pop(@args); # currently unused my $in_transaction; my $anyfail; my $ret = ""; while ( @args ) { my ($gbk, $flags, $desc, $vrd) = splice( @args, 0, 4 ); if ( defined($flags) and defined($desc) and defined($vrd) ) { my ( $balres, $debcrd, $kstomz, $fixed ); ( $flags, $fixed ) = ( $1, !!$2 ) if $flags =~ /^(.)(!)$/; $flags = lc($flags); my $t = $dbh->lookup($gbk, qw(Accounts acc_id acc_desc)); if ( $t ) { warn "?". __x("Grootboekrekening {gbk} ({desc}) bestaat reeds", gbk => $gbk, desc => $t)."\n"; $anyfail++; next; } $balres = $dbh->lookup($vrd, qw(Verdichtingen vdi_id vdi_balres)); unless ( defined $balres ) { warn "?".__x("Onbekende verdichting: {vrd}", vrd => $vrd)."\n"; $anyfail++; next; } if ( $balres ) { if ( $flags =~ /^[dc]$/ ) { $debcrd = $flags eq 'd'; } else { warn "?"._T("Ongeldig type voor balansrekening (alleen D / C toegestaan)")."\n"; $anyfail++; next; } } else { if ( $flags =~ /^[kon]$/ ) { $kstomz = $flags eq 'k' ? 1 : $flags eq 'o' ? 0 : undef; } else { warn "?"._T("Ongeldig type voor resultaatrekening (alleen K / O / N toegestaan)")."\n"; $anyfail++; next; } } $dbh->begin_work unless $in_transaction++; $t = $dbh->sql_insert("Accounts", [qw(acc_id acc_desc acc_struct acc_balres acc_debcrd acc_dcfixed acc_kstomz acc_btw acc_ibalance acc_balance)], $gbk, $desc, $vrd, $balres, $debcrd, $fixed, $kstomz, undef, 0, 0); unless ( $t ) { warn "?".__x("Fout tijdens het opslaan van grootboekrekening {gbk}", gbk => $gbk)."\n"; $anyfail++; next; } } unless ( $anyfail ) { my $rr = $dbh->do("SELECT acc_desc, acc_balres, acc_debcrd,". " acc_kstomz, acc_dcfixed, vdi_id, vdi_desc, vdi_struct". " FROM Accounts, Verdichtingen". " WHERE acc_id = ?". " AND acc_struct = vdi_id", $gbk); unless ( $rr ) { warn "!".__x("Onbekende grootboekrekening: {gbk}", gbk => $gbk)."\n"; #$anyfail++; next; } my $t = $dbh->lookup($rr->[7], qw(Verdichtingen vdi_id vdi_desc)); $ret .= __x("{balres} {gbk} {debcrd}{fixed}{kstomz} ({desc});". " Verdichting {vrd} ({vdesc});". " Hoofdverdichting {hvrd} ({hdesc})", balres => ($rr->[1] ? "Balansrekening" : "Resultaatrekening"), gbk => $gbk, desc => $rr->[0], debcrd => ($rr->[1] ? ($rr->[2] ? "Debet" : "Credit") : ""), kstomz => ($rr->[1] ? "" : defined($rr->[3]) ? $rr->[3] ? " Kosten" : " Omzet" : " Neutraal"), fixed => $rr->[4] ? "!" : "", vrd => $rr->[5], vdesc => $rr->[6], hvrd => $rr->[7], hdesc => $t, )."\n"; } } if ( $in_transaction ) { $anyfail ? $dbh->rollback : $dbh->commit; } return $ret; } 1; EekBoek-2.02.04/lib/EB/Locale.pm0000444000076500007650000000510612165465617013624 0ustar jvjv#! perl # Locale.pm -- EB Locale setup (core version) # Author : Johan Vromans # Created On : Fri Sep 16 20:27:25 2005 # Last Modified By: Johan Vromans # Last Modified On: Tue Aug 14 12:28:39 2012 # Update Count : 165 # Status : Unknown, Use with caution! package EB::Locale; # IMPORTANT: # # This module is used (require-d) by module EB only. # No other modules should try to play localisation tricks. # # Note: Only _T must be defined. The rest is defined in EB::Utils. use strict; use constant COREPACKAGE => "ebcore"; use base qw(Exporter); our @EXPORT_OK = qw(_T); our @EXPORT = @EXPORT_OK; # This module supports three different gettext implementations. use POSIX qw(setlocale); my $core_localiser; our $LOCALISER; # for outside checking sub LC_MESSAGES { eval { POSIX::LC_MESSAGES() } || 5; } sub __init__ { return if $core_localiser; # Since EB is use-ing Locale, we cannot use the EB exported libfile yet. my $dir = EB::libfile("locale"); # Use outer settings. setlocale(LC_MESSAGES); # Try Locale::gettext eval { require Locale::gettext; $core_localiser = Locale::gettext->domain(COREPACKAGE); $core_localiser->dir($dir); eval 'sub _T { $core_localiser->get($_[0]) }'; $LOCALISER = "Locale::gettext"; } and return; # Try Locale::Messages (part of libintl-perl). eval { require Locale::Messages; Locale::Messages::bindtextdomain( COREPACKAGE, $dir ); Locale::Messages::textdomain(COREPACKAGE); eval 'sub _T { package Locale::Messages; turn_utf_8_on(gettext($_[0])) }'; $LOCALISER = "Locale::Messages"; } and return; return if $core_localiser; # Try Locale::gettext_xs (part of libintl-perl). eval { require Locale::gettext_xs; Locale::gettext_xs::bindtextdomain( COREPACKAGE, $dir ); Locale::gettext_xs::textdomain(COREPACKAGE); eval 'sub _T { Locale::gettext_xs::gettext($_[0]) }'; $LOCALISER = "Locale::gettext_xs"; } and return; return if $core_localiser; # Try Locale::gettext_pp (part of libintl-perl). eval { require Locale::gettext_pp; Locale::gettext_pp::bindtextdomain( COREPACKAGE, $dir ); Locale::gettext_pp::textdomain(COREPACKAGE); eval 'sub _T { Locale::gettext_pp::gettext($_[0]) }'; $LOCALISER = "Locale::gettext_pp"; } and return; return if $core_localiser; # Fallback to none. unless ( $core_localiser ) { $core_localiser = ""; eval 'sub _T { $_[0] };'; $LOCALISER = ""; } } sub get_language { $ENV{LANG}; } sub set_language { # Set/change language. setlocale( LC_MESSAGES, $ENV{LANG} = $_[1] ); } __init__(); 1; EekBoek-2.02.04/lib/EB/Booking.pm0000444000076500007650000002643412165465617014024 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Booking.pm -- Base class for Bookings. # Author : Johan Vromans # Created On : Sat Oct 15 23:36:51 2005 # Last Modified By: Johan Vromans # Last Modified On: Fri Aug 31 19:07:41 2012 # Update Count : 208 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Booking; use strict; use warnings; use EB; use EB::Format; sub new { my ($class) = @_; $class = ref($class) || $class; return bless {} => $class; } sub adm_open { my ($self) = @_; unless ( $dbh->adm_open ) { warn("?"._T("De administratie is nog niet geopend")."\n"); return; } 1; } sub check_bsk_nr { my ($self, $opts) = @_; my $bsk_nr = $opts->{boekstuk}; my $bky = $opts->{boekjaar}; $bky = $dbh->adm("bky") unless defined($bky); my $dbk = $opts->{dagboek}; my $rr = $dbh->do("SELECT count(*) FROM Boekstukken". " WHERE bsk_nr = ? AND bsk_dbk_id = ? AND bsk_bky = ?", $bsk_nr, $dbk, $bky); return 1 if defined($rr) && $rr->[0] == 0; warn("?".__x("Boekstuk {bsk} is reeds in gebruik", bsk => join(":", $dbh->lookup($dbk, qw(Dagboeken dbk_id dbk_desc)), $bsk_nr))."\n"); return; } sub bsk_nr { my ($self, $opts) = @_; my $bsk_nr; my $prev = defined($opts->{boekjaar}) && $opts->{boekjaar} ne $dbh->adm("bky"); if ( $bsk_nr = $opts->{boekstuk} ) { unless ( $bsk_nr =~ /^[0-9]+$/ ) { warn("?"._T("Het boekstuknummer moet een geheel getal (volgnummer) zijn")."\n"); return; } return unless $self->check_bsk_nr($opts); my $t = $prev ? "0" : $opts->{dagboek}; $dbh->set_sequence("bsk_nr_${t}_seq", $bsk_nr+1) # if $dbh->get_sequence("bsk_nr_${t}_seq", "noincr") < $bsk_nr; } elsif ( $prev ) { warn("?"._T("Boekstukken in voorafgaande boekjaren moeten verplicht worden voorzien van een boekstuknummer")."\n"); return; #$bsk_nr = $dbh->get_sequence("bsk_nr_0_seq"); } else { $bsk_nr = $dbh->get_sequence("bsk_nr_".$opts->{dagboek}."_seq"); $opts->{boekstuk} = $bsk_nr; return unless $self->check_bsk_nr($opts); } $bsk_nr; } sub begindate { my ($self) = @_; my $begin; my $end; if ( $self->{bky} ne $dbh->adm("bky") ) { my ($b, $e, $c) = @{$dbh->do("SELECT bky_begin, bky_end, bky_closed". " FROM Boekjaren". " WHERE bky_code = ?", $self->{bky})}; if ( $c ) { warn("?".__x("Boekjaar {code} is gesloten, er kan niet meer in worden gewijzigd", code => $self->{bky})."\n"); return; } $begin = $b; $end = $e; } elsif ( $dbh->adm("closed") ) { warn("?"._T("De administratie is gesloten en kan niet meer worden gewijzigd")."\n"); return; } $begin ||= $dbh->adm("begin"); return $begin unless wantarray; $end ||= $dbh->adm("end"); ($begin, $end); } sub in_bky { my ($self, $date, $begin, $end) = @_; if ( $date lt $begin ) { warn("?".__x("De boekingsdatum {date} valt vóór aanvang van dit boekjaar", date => datefmt_full($date))."\n"); return; } if ( $date gt $end ) { warn("?".__x("De boekingsdatum {date} valt na het einde van dit boekjaar", date => datefmt_full($date))."\n"); return; } 1; } sub amount_with_btw { my ($self, $amt, $btw_spec) = @_; my $explicit; if ( $amt =~ /^(.+)\@(.+)$/ ) { $amt = $1; $btw_spec = $2; $explicit = $btw_spec !~ /^[hlgn]?[-+]?[ko]?$/i; } return (amount($amt), $btw_spec, $explicit); } sub parse_btw_spec { my ($self, $spec, $btw_id, $kstomz) = @_; return (0, undef) unless defined($spec); $spec = lc($spec); # Quickie for G/N. if ( $spec =~ /^([gn])$/ ) { return (0, undef); } # Quickie for K/O. elsif ( $spec =~ /^([ko])$/ ) { return ($btw_id, $1 eq 'k'); } # Strip off trailing K|O. elsif ( $spec =~ /^([hl]|\d+)([-+]?)([ko])$/ || $spec =~ /^(\w+)([-+])([ko])$/ ) { $kstomz = $3 eq 'k'; $spec = $1.$2; } =begin deprecated # Deprecated since several years... elseif ( $spec =~ /^(.*)([iv])(.*)$/ ) { $kstomz = $2 eq 'i'; $spec = $1.$3; warn("!".__x("BTW specificatie {spec}: Gebruik K of O in plaats van I of V", spec => $_[0])."\n"); } =cut # Examine rest. Numeric -> BTW id. if ( $spec =~ /^(\d+)([-+])?$/ ) { $btw_id = $1; if ( defined $2 ) { my $excl = $2 eq '-'; my $res = $dbh->do("SELECT btw_perc, btw_tariefgroep FROM BTWTabel". " WHERE btw_id = ?", $btw_id); return unless $res; $res = $dbh->do("SELECT btw_id FROM BTWTabel". " WHERE btw_perc = ? AND btw_tariefgroep = ?". " AND ".($excl?"NOT ":"")."btw_incl", $res->[0], $res->[1]); return unless $res; $btw_id = $res->[0]; } } # H L H- L- H+ L+ elsif ( $spec =~ /^([hl])([-+])?$/ ) { $btw_id = $1; my $excl; $excl = $2 eq '-' if defined $2; my $res = $dbh->da("SELECT btw_id, btw_alias, btw_desc FROM BTWTabel". " WHERE btw_tariefgroep = ?". " AND ".($excl?"NOT ":"")."btw_incl". " ORDER BY btw_id ASC", $btw_id eq "h" ? BTWTARIEF_HOOG : BTWTARIEF_LAAG); warn("!".__x("BTW aanduiding \"{spec}\" kent meerdere tariefcodes: {list} (code {code} \"{desc}\" is gebruikt)", spec => $spec, list => join(" ", map { defined($_->[1]) ? $_->[1] : $_->[0] } @$res), code => $res->[0]->[0], desc => $res->[0]->[2], )."\n") if @$res != 1; $btw_id = $res->[0]->[0]; } # alias elsif ( $spec =~ /^(\w\w+)([-+])?$/ ) { # warn("SPEC: $spec\n"); $dbh->trace(1); my $res = $dbh->do("SELECT btw_id, btw_perc, btw_tariefgroep FROM BTWTabel". " WHERE btw_alias = ?", lc $1); # $dbh->trace(0); return unless $res; $btw_id = $res->[0]; if ( defined $2 ) { my $excl = $2 eq '-'; # $dbh->trace(1); $res = $dbh->do("SELECT btw_id FROM BTWTabel". " WHERE btw_perc = ? AND btw_tariefgroep = ?". " AND ".($excl?"NOT ":"")."btw_incl", $res->[1], $res->[2]); # $dbh->trace(0); return unless $res; $btw_id = $res->[0]; } # warn("SPEC: $spec => $btw_id\n"); } # + - elsif ( $spec =~ /^([-+])$/ && $btw_id ) { my $res = $dbh->da("SELECT btw_id, btw_desc FROM BTWTabel". " WHERE btw_tariefgroep =". " ( SELECT btw_tariefgroep FROM BTWTabel". " WHERE btw_id = ? )". " AND ".($1 eq '-'?"NOT ":"")."btw_incl", $btw_id); warn("!".__x("BTW aanduiding \"{spec}\" kent meerdere tariefcodes: {list} (code {code} \"{desc}\" is gebruikt)", spec => $spec, list => join(" ", map { $_->[0] } @$res), code => $res->[0]->[0], desc => $res->[0]->[1], )."\n") if @$res != 1; $btw_id = $res->[0]->[0]; } elsif ( $spec ne '' ) { return; } ($btw_id, $kstomz); } #### Class method sub norm_btw { my ($self, $bsr_amt, $bsr_btw_id) = @_; my ($btw_perc, $btw_incl); if ( $bsr_btw_id ) { my $rr = $dbh->do("SELECT btw_perc, btw_incl, btw_tariefgroep". " FROM BTWTabel". " WHERE btw_id = ?", $bsr_btw_id); assert($rr, "Unk BTW: $bsr_btw_id"); ($btw_perc, $btw_incl) = @$rr; } return [ $bsr_amt, 0 ] unless $btw_perc; my $bruto = $bsr_amt; my $netto = $bsr_amt; if ( $btw_incl ) { $netto = numround($bruto * (1 / (1 + $btw_perc/BTWSCALE))); } else { $bruto = numround($netto * (1 + $btw_perc/BTWSCALE)); } [ $bruto, $bruto - $netto, $btw_perc ]; } #### Class method sub dcfromtd { # Calculate a (debet,credit) pair from a (total,debet) pair. my ($total, $debet) = @_; return ($debet, $debet-$total) if defined($debet); return ($total, 0) if $total >= 0; (0, -$total); } #### Class method sub journalise { my ($self, $bsk_id, $iv, $total) = @_; $total = -$total if defined($total) && !$iv; # date bsk_id bsr_seq(0) dbk_id (acc_id) amount debcrd desc(bsk) (rel) # date (bsk_id) bsr_seq(>0) (dbk_id) acc_id amount debcrd desc(bsr) rel(acc=1200/1600) my ($jnl_date, $jnl_bsk_id, $jnl_dbk_id, $jnl_acc_id, $jnl_amount, $jnl_desc, $jnl_rel); my $rr = $::dbh->do("SELECT bsk_nr, bsk_desc, bsk_dbk_id, bsk_date, bsk_ref". " FROM Boekstukken". " WHERE bsk_id = ?", $bsk_id); my ($bsk_nr, $bsk_desc, $bsk_dbk_id, $bsk_date, $bsk_ref) = @$rr; my ($dbktype, $dbkdcsplit, $dbk_acc_id) = @{$::dbh->do("SELECT dbk_type, dbk_dcsplit, dbk_acc_id". " FROM Dagboeken". " WHERE dbk_id = ?", $bsk_dbk_id)}; my $sth = $::dbh->sql_exec("SELECT bsr_nr, bsr_date, ". "bsr_desc, bsr_amount, bsr_btw_class, bsr_btw_id, ". "bsr_btw_acc, bsr_type, bsr_acc_id, bsr_rel_code, bsr_dbk_id". " FROM Boekstukregels". " WHERE bsr_bsk_id = ?", $bsk_id); my $ret = []; my $tot = 0; my ($dtot, $ctot) = (0, 0); my ($vhtot, $vltot) = (0, 0); my $nr = 1; my $vat; # for automatic rounding VAT calc my $g_bsr_rel_code; while ( $rr = $sth->fetchrow_arrayref ) { my ($bsr_nr, $bsr_date, $bsr_desc, $bsr_amount, $bsr_btw_class, $bsr_btw_id, $bsr_btw_acc, $bsr_type, $bsr_acc_id, $bsr_rel_code, $bsr_rel_dbk) = @$rr; my $bsr_bsk_id = $bsk_id; my $btw = 0; my $amt = $bsr_amount; $g_bsr_rel_code = $bsr_rel_code if defined $iv && $bsr_rel_code; if ( ($bsr_btw_class & BTWKLASSE_BTW_BIT) && $bsr_btw_id && $bsr_btw_acc ) { ( $bsr_amount, $btw, my $perc ) = @{$self->norm_btw($bsr_amount, $bsr_btw_id)}; $amt = $bsr_amount - $btw; $vat->{$bsr_btw_acc}->{amt} += $amt; $vat->{$bsr_btw_acc}->{btw} += $btw; $vat->{$bsr_btw_acc}->{prc} = $perc; } $tot += $bsr_amount; $dtot += $bsr_amount if $bsr_amount < 0; $ctot += $bsr_amount if $bsr_amount > 0; my $btwtag = _T("BTW "); push(@$ret, [$bsk_date, $bsk_dbk_id, $bsk_id, $bsr_date, $bsr_nr, $nr++, 0, $bsr_acc_id, $bsr_amount - $btw, undef, $bsr_desc, $bsr_type ? ($bsr_rel_code, $bsr_rel_dbk) : (undef, undef), undef]); push(@$ret, [$bsk_date, $bsk_dbk_id, $bsk_id, $bsr_date, $bsr_nr, $nr++, 1, $bsr_btw_acc, $btw, undef, $btwtag.$bsr_desc, undef, undef, undef]) if $btw; } if ( defined($total) && $tot != $total && $cfg->val(qw(strategy iv_vc), 1) ) { # mismatch! #warn("=> $tot <-> $total\n"); # Vaak het gevolg van verschil in BTW berekening per # boekingsregel versus per boekstuktotaal. while ( my($k,$v) = each(%$vat) ) { # Bereken BTW over totaal van deze tariefgroep. my $t = numround($v->{amt} * ($v->{prc}/BTWSCALE)); if ( $t != $v->{btw} ) { # Aha! #warn("=> [$k] $v->{btw} <-> $t\n"); # Corrigeer het totaal, en maak een correctieboekstukregel. $tot -= $v->{btw} - $t; push(@$ret, [$bsk_date, $bsk_dbk_id, $bsk_id, $bsk_date, undef, $nr++, 1, $k, $t - $v->{btw}, undef, _T("BTW Afr. ").$bsk_desc, undef, undef, undef]); warn("!".__x("BTW rek. nr. {acct}, correctie van {amt} uitgevoerd", acct => $k, amt => numfmt($t-$v->{btw}))."\n"); } } } if ( $dbk_acc_id ) { if ( $dbkdcsplit ) { push(@$ret, [$bsk_date, $bsk_dbk_id, $bsk_id, $bsk_date, undef, $nr++, 0, $dbk_acc_id, -$tot, -$dtot, $bsk_desc, undef, undef, undef]); } else { push(@$ret, [$bsk_date, $bsk_dbk_id, $bsk_id, $bsk_date, undef, $nr++, 0, $dbk_acc_id, -$tot, undef, $bsk_desc, undef, undef, undef]); } } unshift(@$ret, [$bsk_date, $bsk_dbk_id, $bsk_id, $bsk_date, undef, 0, 0, undef, undef, undef, $bsk_desc, $g_bsr_rel_code, undef, $bsk_ref]); $ret; } 1; EekBoek-2.02.04/lib/EB/res/0000755000076500007650000000000012165465617012660 5ustar jvjvEekBoek-2.02.04/lib/EB/res/help/0000755000076500007650000000000012165465617013610 5ustar jvjvEekBoek-2.02.04/lib/EB/res/help/en/0000755000076500007650000000000012165465617014212 5ustar jvjvEekBoek-2.02.04/lib/EB/res/help/en/docs.htb0000444000076500007650000004525612165465617015653 0ustar jvjvPKs2A-^Hs commands.htmlUT hXPP!WPux ),IsO.M+I,SOSpMvOVHMK)ч(IORhkQJrsPKvp>Iddocs.hhcUT RMP!WPux _n09EؾuW&؞3)kc?TJ,P~ =nΦ#DŽ?;-i.Nw|+ ܒ><w' jj(W.Gw뷥wY H{pb0ůղ oi,l0VPIp<ā JUoP%Y>M7T+#ψMrё耭j(>%N( T9!$bQ@8m7T{!I%~7T{E\2`e4z% r˫{ Dr+^8Cʴ׳^o+ BhDww2^,?0]-1F ^nI'PKvp>LE;hdocs.hhkUT RMP!WPux )ͱRPQ `\PRYjTZQ_YXWRX T$sJԼbJ}sj3RR+2Jrs!qPKvp>R`docs.hhpUT RMP!WPux s+I+)VHIMO.HKI@ ,r]SS\Ks:K2\RKsJJ 2m3A2JrsPKvp>G'] index.htmlUT RMP!WPux eQn0 }+um Ilicښ6j& m&mVrK8; NXitĆ~ufrIkq l:o8ܭ9y}yyǜ/ex!$V:*7Fta"B' SR#,MvQ;$B{P h YwQhKDǠlpZN|]1g[%=+i/QFI :arv|~@)1ՎI*s9-Z~! IѿߩnGkx&@ϕ 7 \AjLU!l]B)5X_CzDf-Z?hۍ}xoPK vp>topics/UT RMWPux PKvp>֠Ӈtopics/schema.htmlUT RMQ!WPux eRn0 =[O6J;L=bB6HPs t84 5j뫆:,Eh2h*[Ch`6 *uh$4'^m^"M|Ja,̉ňnE1 SCG&$X#  9l%ȭ+eΚ{kO ޒ|x RslēOI-mV7 Ywl=:@K(:nWI%6`̴?%ڎtsM&qƕYapeTzUd$'uՄ١,\&͵'*y@3t%\SkM1v$\.Qd=Ne.w@7b6PKvp> jw,topics/btwaangifte.htmlUT RMQ!WPux USn0]gtopics/grootboek.htmlUT RMQ!WPux MPn0 2# k2Tl uIu@PG41 9}3r(3 ׁoi S ڞ ,"yjNxKZ)aOJm&r٠ƗRiotj)YU6A3yp-^⌧:\yHm`w$9OoRW"XbꪣibIFؔF{.d4ڵ6topics/toon.htmlUT RMQ!WPux Er0 )4{)w}ptuP8VNм}mB_/d*3ԏ5n?-B+rx`c ^cEǭs\Qw2KLM] ZǐEt}a^wi߈zGtp՞y#F`&ԻJJ*)Kq c̶[<3P槥Q62Ks8Mg܍C >FD`Us˔N1)5{u Ա-b rB[/PKvp>x,topics/rapporten.htmlUT RMQ!WPux Sn0 =_As/Cam-`UX" :u?ЛIG'- {"vf>^|pk{&ՌG3ƽJka*t(L@;Rܲ)"XHmn\28+g MS B` x@fWsmaS]6lꤚ`xxS$rc))figmtwq ##pz@O,ټ).j=UBIu\Yn5( ?'^ D?DӜZ\||0m̉2#wEMܯJ#*h̯NĚ 6NS~E*Ok/^Z Y4H}TV/ב=e/|>s$ϟGLlUS;ʿPKvp>6dtopics/import.htmlUT RMQ!WPux uPN0W %{1"j!KR bHRlG)8NۻwwwS6g+d|˴$DggƁݣ;0w3hoƀI_[1'3zJMݢ9@9V6y:KL]d#詧+XU(TF(cQ /\topics/relatie.htmlUT RMQ!WPux mQJ0<7_1 Zvۃ'Z?Eaizx?Kr PKvp>SOWd topics/balans.htmlUT RMQ!WPux Mn )V9'qcE,/C`c,֚U1v̚$4W,Wih.])w؁عt|4s}k#I`iUU+ʑ"|nb:P߻.W9E '}gd-x RjW=t=RRz9o[.SL^W%(2/XgW YzUmsA/,ShO;aH!.׶^TԪSu WLhl=}PKvp>1[topics/openstaand.htmlUT RMQ!WPux Un0 Dg+B9"cѶZ(A( A: Oe~Gdt$&S<`WԜpmpmss<s&ڠyϱEW&q;BC3q'GmDJ\xyBI4VbPW'fDKx>( Os/W;Ea"&սɩXmPKvp>߹topics/adm_btwperiode.htmlUT RMQ!WPux UOK0 O@gAۺ;I i?Mg?}|.ΜFk;<@ QrS<0YY3lf8|3BpEѴ|;w1X#*Ml It\Nx:Tzڄ==m`5iokWPKvp>1|xtopics/sql.htmlUT RMQ!WPux 50 D|}j ƂI6RT|>iUKg鼚4v}{hˡp^PFM^UH\Y'N(XQn:)c,$Y1dI!pĪ~26+Iw }-x:n=PKvp>a}topics/proefensaldibalans.htmlUT RMQ!WPux mN0DWzmG@*m[OSǶ_&Mܼޙ[914;cO\VJDŽ=ɀ&鸊Jl1("=r[r:ſ B>\.ַF$c].崥s+znuYg29!VV4ꨢ0s"b87,9֛y5_̋ jIAɥfj8Ɛ2˽Y\B-zxMHRD0A8RGZ,VyPKvp>T<topics/inbedrijf.htmlUT RMQ!WPux ?s0 Sh s)C;uu$c'\}e縆cȿdhc`o֗^vTT1LWJ}9P[퐡 `x[Xm[0T?CB1M4LP|WCvqZv|Ww)wuMn094F'Q6PKvp> (topics/crediteuren.htmlUT RMQ!WPux M0 D+z+ܷ)Е8z0` Ԏ,_j3yƤc).яf%2L:;Z@hE GU4Ψ䄣f}*y>tS< eYØȸ%-qq]V=LCcΡP/;&.)3!Q"LJh".O kDa$&.9ؘg*aR.*PKvp>l_{topics/inkoop.htmlUT RMQ!WPux mPn0 @݂ DB$ѐZhǻ=H%q;̳jwjN]ͨq,.(<,3flէNݮ)> ߒP3Mr8&u©r{O/ȑNt*/RXF905^K\LdEWX]8U2#x:xxǚu`KD6|PKvp>_oɭtopics/adm_naam.htmlUT RMQ!WPux u;0 D{b29&GjF$2 m$ѭ[ɗM/ Dɷcn?r/AFRbXX *Ό{22q±ݭnv1s(D:'6Nh(i/tœ)7X3jNM꾥o[nLLKx|;^PKvp>yEstopics/periodes.htmlUT RMQ!WPux }MR0 9aNSM{\@$rةp{,ð(;>ɶ$O# b_N 0C=ĖI"!F~s+^,\E()QTb@M" X;F >`SeZs91j天W&Y׀\'dz,awH*PFBfnJ"Y66dM!;cӒy&IO5gZ:tl%^\|PKvp>٭'7topics/journaal.htmlUT RMQ!WPux }Rj0<[_B\CC.&^;JdY)}0i `;;iA͙g@Q]e0, bȯ@)hmU[ #- 1YU;t e\ Ln?0]fI2}Nxp2Z̗-2pc)6U;Qv O],Z hndSoxgW :5>L[g7DJ O kx}p&K!eԎ4I[/Ǒ%[`}56б@O.%qq0 wܒPu-7PKvp>zp_"Stopics/kas.htmlUT RMQ!WPux n0 ),MBLpi!ˮ4qiDw헶ƶnom'Y&uȖ鬲qbm qBbu Axa@vּIl]v+C`0qS uB-topics/adm_begindatum.htmlUT RMQ!WPux ]N0 yўQP WvțMƩU7϶eIƎ~1HOm{3wo30.X<#,AF&^Sy"ZB<˿hVW)rx%Y)o8난g<^2&V)7x<D +eBّ7ЗڴmPR$=`-Y~& AH\X}- Kt&uKNwj[舊 U/6PKvp>9xtopics/verwijder.htmlUT RMQ!WPux MPAn@utopics/verkoop.htmlUT RMQ!WPux mPn0 @d%"$ת6@;ޑ Uaőj+D&ԸpFހk|CPօ(Dб rHx %"CT{~~EqHrqߛnc3߃kc~)3L9hH -J&~^`tO'SG~ڟ69{85{D6{PKvp> LZtopics/dagboeken.htmlUT RMQ!WPux = @{.ɐd3Etopics/export.htmlUT RMQ!WPux }R=O1 ɯmԁN *!k]8J|޿' b&J`_sfQC1Z>y͉%b7W +"[yXfl֑ŧou[BK9It]0vJJ3}}uoH li;մesS_Wˆ:=;;@r(W4DGBRGhuWP߮7b]#p2)%W2I7#\2zw@rڍ)J`.E&21 D0Yo~PKvp>-LWtopics/memoriaal.htmlUT RMQ!WPux N1 ),!UEv`=*׋muoAE-mH[`mS,bq} % q Bz/ހ*Cxk{R,2 !`r: s(;FSQ==PD `wl[E9)ɬ}QhyH Ibӭ.YqnV1"ƼN5P鎤P"ݛn[<\Kmltx͝=r8O't%hyY Z> ͆}FSGcnk83Ww2`sS,n>PKvp>.atopics/result.htmlUT RMQ!WPux mQr0 evcO/dHC7fd5ҏ$ptx V46 51CGb(t;sJf8h*D>'pœw*{et3(>Ge!֊e)4La_p,_'xh5fw@m։QVEN1k M ]`J,zCkV,@ 6>.6<_1PKvp>sBYtopics/adm_balanstotaal.htmlUT RMP!WPux eQn0  zv.hX+ #I#4S h 9f4[C9q{wcA+gT!8sptCȜRL%MSc>v+,qM,w.e }b{+*|B>o͔}$1L "F":'˸z_Ƒ:fcp1PMmz r7"gLI/4@RJZ.+_-jevPKvp>TWtopics/adm_relatie.htmlUT RMQ!WPux mRn0 +,PCWiݦ'4Z8״ [bZRpjHz{TGj=iZ9@ϒl8AȼX Ea@)Es/z[2hYk6!rX94#J}vY 献23swk֧M̐L,Z$/XdEeZ}8,0A8tt·6s2EHЩ>\mb}Μg4{Hy|ӑ*Z?=cQϵS([]}]eUj%VͽLv&6G?EYz[vOPKvp>Rvtopics/adm_balans.htmlUT RMP!WPux en0~U=U"[մj1K]k z͒b8MRzJԞ&2vĀ,DLbc!& Nl8wx$F)SDI~W*v=uVC&Q_$U Y ; ]:dt (R=ڲtQ^vnU OP>pΕ>ɐVK1qlfȁI)xEXFưX(vD*ޗHnRڱk`0 3ׂF Dl(iK3aj7h1zuŻC{%lC9FcPKvp> P~ topics/adm_open.htmlUT RMQ!WPux Ֆn0S̉S *Q !MfwcOj;cg7MYq@\8t3O)oM~u9-T!G,Yߒ -vML5VLx&~jYSު5o$0icCLGO6ā :'{Xzkkzz`! 1u4نI#e^ȕӠ.|:4Ĩ F@x97B:aQ(`yבzу#!`]uX@=v<{;4hvsd *0- ""ZA'8RT<}Αp ɱ4˲\Uo8XiON<8}=;cB֫ ԧ5 w;\BJc[b!lt֢_Dwd7`w@ oا "(R2[Y6D\) zL'rײcBOkV՛\zcUnܥuRpk}cJ!,s!:\>MGxĶDs}k>2+?6n4mͣ-p;1}6*?8o:||Lo0$|ѧP C4r"N8B [Lj @F(08ಁcD5&KDlYoYEnы=KC9w<,y~;Qy/h C} E;ўbZj뛬ǐY-sjLQq&+j!{fҚ@Gw҇b!"VM`m?WyJFI.Z]SoqNiv: ;oա_#/sYyuTPKvp>;topics/postbank.htmlUT RMQ!WPux r0 )4\о@^A˜8Vv+[~RS`ov-Ti_QPeh3P11u5XMs|qV `>`eurp M<֛!C)# s  Qfc##`C.bQQN^P6QE+;6Wλ%PMU,zyEшTꃽLѭ3% 1j ((HmmfcKct߁!2'jLjDnaQF^Gٸi0rSmk p١5=*7y/PKvp>topics/include.htmlUT RMQ!WPux -A0 +JUoU)DlݝmsI* 2nv4={2F9I#9KPvfV9Djμ\|C)`Y~topics/jaareinde.htmlUT RMQ!WPux uRM@ =3.h^ZC0c0F!Q}=+~E%8EI2e0p)p'-NVd"\(§EeQIgHq ?k7NO&Ds@Aҝ)ڠ ђqUْaϛG^ w8kt%kq:Lιŗa3?`|Boԍ˸RE:H1^nju^o_^Co: Tm8H 5oB ^`edU.LC79toU0%皦E^l=JC&,W_lN\i;?6rkI}zdž?y=#q3/XdC#PKvp>Дtopics/adm_boekjaarcode.htmlUT RMQ!WPux mR0 D1/gFMF4SۡC{pez咢z1( q䮽]nIܿ-<(Ǵ𢤃Ќ)5@tߔ?t{& Dg\ 'kؚ(')qFi׮juKgf[_VI%CCͬ6S =͋۵w/PKvp>PoStopics/bank.htmlUT RMQ!WPux n1 g*!*:H'`C E1{ %﷝IfQڸ-bq} -% qBz+@H"j`yŴfq[< &ǡ@1NcAϚ15 CEb7u;x ;G9+؋"=TL&Ǜ 72egŹ+Qňv$ kI9Dp5nX67n"o NMe k^V'Ba$|k~>8bRXy`l}~N.ûǧy u)O7PKvp>,!DZtopics/database.htmlUT RMQ!WPux ).)KKI,ILJ,Nч pg+d*%*䧁ɥEEy% 0Mz\\ p>H'PKvp>;lhtopics/boekjaar.htmlUT RMQ!WPux 5 0 3ś,`e 07Jt:Gcgz|NVtUrM jscWQȶ,8jUm)['APKvp> _~topics/debiteuren.htmlUT RMQ!WPux E0 D+z+ܷ)Е8z0` Ԏ,_qF3ۘTx{j]%26($Kdtv Њ<f-pUOW%هNz1],Kxs?vR%!R= =2iS`p9^@"Eqgم 1e4D> XIiCM^Ti[a (Ĥ%ǛzL%TPʅX[ߚ_PKs2A-^Hs commands.htmlUThXPux PKvp>Iddocs.hhcUTRMux PKvp>LE;hdocs.hhkUTRMux PKvp>R`cdocs.hhpUTRMux PKvp>G'] index.htmlUTRMux PK vp>Atopics/UTRMux PKvp>֠Ӈtopics/schema.htmlUTRMux PKvp> jw,topics/btwaangifte.htmlUTRMux PKvp>]g) topics/grootboek.htmlUTRMux PKvp>6` topics/toon.htmlUTRMux PKvp>x, topics/rapporten.htmlUTRMux PKvp>6dtopics/import.htmlUTRMux PKvp>/\topics/relatie.htmlUTRMux PKvp>SOWd Btopics/balans.htmlUTRMux PKvp>1[topics/openstaand.htmlUTRMux PKvp>߹topics/adm_btwperiode.htmlUTRMux PKvp>1|xtopics/sql.htmlUTRMux PKvp>a}topics/proefensaldibalans.htmlUTRMux PKvp>T<"topics/inbedrijf.htmlUTRMux PKvp> (topics/crediteuren.htmlUTRMux PKvp>l_{topics/inkoop.htmlUTRMux PKvp>_oɭtopics/adm_naam.htmlUTRMux PKvp>yEstopics/periodes.htmlUTRMux PKvp>٭'7jtopics/journaal.htmlUTRMux PKvp>zp_"Stopics/kas.htmlUTRMux PKvp>-{ topics/adm_begindatum.htmlUTRMux PKvp>9x!topics/verwijder.htmlUTRMux PKvp>u"topics/verkoop.htmlUTRMux PKvp> LZ$topics/dagboeken.htmlUTRMux PKvp>ɐd3E$topics/export.htmlUTRMux PKvp>-LW8&topics/memoriaal.htmlUTRMux PKvp>.a'topics/result.htmlUTRMux PKvp>sBY)topics/adm_balanstotaal.htmlUTRMux PKvp>TW*topics/adm_relatie.htmlUTRMux PKvp>Rv/,topics/adm_balans.htmlUTRMux PKvp> P~ -topics/adm_open.htmlUTRMux PKvp>;1topics/postbank.htmlUTRMux PKvp>&3topics/include.htmlUTRMux PKvp>`Y~3topics/jaareinde.htmlUTRMux PKvp>Д5topics/adm_boekjaarcode.htmlUTRMux PKvp>PoS!7topics/bank.htmlUTRMux PKvp>,!DZ8topics/database.htmlUTRMux PKvp>;lhP9topics/boekjaar.htmlUTRMux PKvp> _~:topics/debiteuren.htmlUTRMux PK,,QG;EekBoek-2.02.04/lib/EB/res/help/nl/0000755000076500007650000000000012165465617014221 5ustar jvjvEekBoek-2.02.04/lib/EB/res/help/nl/docs.htb0000444000076500007650000046210712165465617015660 0ustar jvjvPK o> bookings/UT ȳMWPux PK=s2AVamCWy6.4ۂCH{o} j }QI:"y"Xv|]]Xm"mxRD_Iˆ7oӢcnU2Ww/yNm`@Nu>բVU AOb=tYDw 8J cEujKe4>YWIk196i뤇c5KFq$ZM 3iE2_GG.a3|PK=s2A`bookings/cash.htmlUT VhXPVhXPux URn0+,^jRN8 hhn4hQKnP{dσ:ٜ ԶQ͙vXud/ʇ >OK`3!Y Qs-OvxhB2 eC7dA [=]K\̯bW%uvod^T-oՆ,>K!>I'D0% A-VV$m tF@Cyd_MǗ9.tso?PՅ-%B{Bs#'i! %c@$꥟S4`Zm{8ؑ[j`w'UwG'Bڏ"%+iz!NmrqX!u#˄,xXO PK=s2A {bookings/index.htmlUT VhXPVhXPux WMo6W*8WZ;M8 F:7E4+qE*IicΐXPbI {3]^Iց6BgQ ԩD¨ɫ7:Xtysq+g,\///-حrWh_J*gWP+(MvҶr+bj4ȳ; !+4l(Scb<"|k,BH`|JTvǒPB3'*7vȜ#O['n.9Xb TJ eoݫ⊁{J .; ~q,m]9iP OӈRv//8 iL V)ьIAia]95[%d "dL؈] SDi}RQ@yދ0N@rGo(ct8=QC`ZiuV46XWm1X)a֡ `Ǒ e5nTQ!*vRX*؀rSٖQ"XʫwJ#&7OTB yŃَs㣶ZUaK"}-F]\_+6"u}lmO#5*l_>f6w*v[ V !`zbc_Z/>H W/=#$P+{x'﹛d);oFS JB("[1hj ʀJS;%FRY@-X>^LnE?k:É>y*I=[9ʶa,HJgwBݾz*gqcƒa3)q #E]B:^._cc˃?q)j\ 9~pQ=[I^qt/5hFX_V-,nB)l؊͐}ud7VD!1̽x5:8]X'TLЈ6i"`ŤvptW66CnPRɍ9 pb 8:^n |ٿ@ @W!jy}t؁9\99aJk{uQEvL0X 6)נ6"^r셋ѥxvz߷ 0GqS]^% . %I?bE;;oPKYs2Ah&|bookings/receivable.htmlUT hXPdXPux XkolYwIqd-ۋ 46_9aɡdܙ!ENwD"u{FBli³<T%:UUvVO/.5= \on?;o޽4>[7L7j?XXbL)Fw~i->TBU$nuҕTiE&tECUؚǂڜȄ"ohufQҶ8Ktw?ٿg?^s >>^_4&m̒eU5N26YV˿Qֺ^ɵ`9 \bTf,69Kg/t?MrH~> 5U~d&nIۑ=)%QIY ՊM>OA(uFUP҆T?S eTkS"~73OZld>ůo+1 5Z&H qϙ3.sr]0{~G.Cw$+HZa ͵^@Yl*C)|h- uhX5ߡvǒ|H#R`i,  8 hApwꟘā> I, VV~(d&p2l"o|,ljt}V.%xUYo{#=BtXN1۹8 `oX)bӂJY)b3x"6}9y[h gV#L u.Y,j6OeUANNdsMCi\'Wܗl6= Nzqk*K ;Kěʶh%nۦ3:N ioQWRD>\aQVĮSqZ<lFs"4fe:6"hɉQ0fzŁŹbookings/oneline.ttUT ȳMdXPux eRKo0 WSc9fH=dvm"KĤ~(' LA;[i @۸Vۮ:ln2eTO%|Y[?-9>ͦMU)42Gղ4,}p';1"ThIF9)st M! 7HSل SVi rn &֫'j Z׏ō!%mVoQ5{ϯ2ۘC/η wx@{Ams Qةjwc=!mFnEY+jz\^f-y'pC7V PK=s2A1 ]bookings/btw.htmlUT VhXPVhXPux Y]s6}.fDf'ieN2u6MҁDB* ɉ{ò3u]? {<ƈm(BU [J%ӿ^3s/OD:_SHehWncf,WLvFUkqQ8FUN:4h9ޮEqڸF5+\*VZY/&JC*ǭ:NEJzs([_?)tm g~?'O&'X%'GOi\.emwU,UˬT?o/6W͕C·r *qi‰R%'V(q)e-eEo;Ykֵn)F+iD[[B])ArX4awsłLPTC\,I*ZwfאncƖkҪc\K 2ϮLs\yGGZ >JP7AA#hڏrwaAI" ;4& 8nJ%]B:vb`Q,>V\9? Sh(8P|> V;1t -@r,NI"Di$[! JnK0J0T5Z,T1Jl{uum!L R* u3vx4취{5 jPaoф8!]аu_!S}ة,ŵ:4&M6wq"+8BѸq޵lq-(Fga~ ^#Y4Hb|&5}bmr0r'ȴN4nvϞSi"f TM09}VXrPdw_z@q-ߔ~eYP8|1%{[obOAz^ֳ_wPYܴr0@>]TF~ d4 Pfhv$L'[Q;/trn{`kX [Yx84- o&ROj-?E\xμ[+`\Elv?"FvYj?O* ^5p^p솞ӟ@MNwڟ19`Z*R0TY|3V!yJfo +NUwI|JguϾ@-f] 7Bei UXT=f4SG܄w13sU;:i@Wh ޟk,Vj#i:50' DmNo>)0ܵvDߦoP$y^ζq܍^ Ҭw+oNS"'먋O1;QB;Dt(灋K):vŹvhs\ (19FqSupXOrb rA""8E@W!R]>D/#?FVM=sw U3Dz iwn 'BӍa7㰁i7"]yVEM *~Fpk7 *D*aҘXs:kj V?>EFJw|!w=37vx/ HqJ%|ģH@,9b[kUۓM%q d{wDnҴM}{Ypmk'd"9 `Pr3s`MU:XUg6N5]6^ꅡzW un mJj:vx8TEIXۏK"eEp4z-i?Be?tZ }nc53G5K&3IKC>< w#_Fk0:0J볣1Ϛ*̺Ÿ4 Y2JEğbeL+oZ޻nL+eUZ(eV׺PKr3GOnG|ek eA~I0P֕Ih}G. sJ?;RI`UANc+7,%V.PҹzW+`Jϗw4H/=R?RP )U2eqV;C~2ӱ\n+qX9U#u7y=쐻~(*;*B]P%#6`'^fp\ªoOߌMP*IS7 R1rlm`; VJŎЧR:@eftbLCy 3%;]tٚZcm9;:!&S@fD)*gӌ̸@&Grkؐvy|]pa.@5k>K&#Guc%ɹ̀Xwe ۄp^5jH/Yb) 4fgd&QABC0k:Q 7M\g#p.w Q3`6sveD R7P5'{3-x{,{ R.g_O7'ޱ gu&yK"-'l "h%7s-żK47^\8Ktk15i-uqߎ1(Cc9 ssa 9y!oJ5#xe}X{ɪv'IVj(5`I\PZ(n(˧WqVž`>6Az{ꗣTo֔lͦDú-6SP]`[=U\kQ.9h!b4M,HX&d ъY|mQ/07{_q>gU7O"Ďq .δGvt ABJ(W0o˔/N&S@wV^$Okᧆ _lgΚwL͜I- A~k@m'_鏹եB _50i!^Nbz^+r(#E _*ϣ/AFzѼ pei*++x8#]ʂw woahЙHm{E~݀ف3;^KXm3L~|2+XN7]A_n PKo> gbookings/refcode.ttUT ȳMdXPux URێ0}W Fb_Hdˮ@Z}(41Iq˖gɲ~Όܨ"IT֦Ʌm\⦈ۇ-}}olm.h窪}QB|SQܢ[[t`^V+AB8{;rs1sa$8Jn\x<ʦuxy7$ m'uKNtn8J]rqJUuGSOlFM|J ̟'Nvi4Rfh4Go Ed', LN {h8Fgff^AUGnC=#'kj*qRl7 /jFEOD%|@j gf fZp5:  Тx3nI|U LaF,уG㣫y.̯Lxa2,_PKYs2A &bookings/bank.htmlUT hXPdXPux Zmsl9Q!Po3fW`s:JPլ4Q ygFK0\]\]itϴ߽/rqF$ޟbĤNbݘѣE47x\x+g^x<=8Nޜ'}e-|:}S׶L_̭Z|ϟAd::"N=0b*0@œKU|JS^ Q Q@ Bc, XܙGOs52] *SĨ߰͡y /FV#=Mb°Ӹ UE\eK ,e.*m>R.uckr}/Օ|"Nlbc&1[@oMI*b9%r |Gy4wq\#}3Lz[$- T8i?IXV_WB,wU[OjW$<a"G"~?HB>߀5vQgLuar|78RJ)T `.R3U]p@D"* E-aJXPEڀL8ΐdwD*7fC7T!f^*Xd<(%.mf%miB$vQ9i n*;-=Xj|VJjUmsԩO`8[ꬵ¯~%Y U(caADW/.|LlЈGh\>`xB9꫺Y|{ lCσƱ_MAIB$lt/Xbxx`6V?i$Fqpxtka~6+uh'W13P|wԻAk/Sc?E#m41L<||4Z+˔H!w秿 ۿCc7wޢť_;/û/!09ߣ NlwSlX?vxq̓VUBܰ%`p8">ZScIkՓZnh똽D @F YKpm D^XV"ݞ%1{%UsFl) 4iD?X0V ܏yH7un>cl,|P}i|9uYթT4u-9,\ʍ_Kj&= P@EУx9yKy) JQ04+ BH.!`ټ] UjRȋ:QC+. ӅW9?<5'\qX0 |#O>Uhs+T?B5Ci6 *Q#їݠ'&jc0n-{V]Iz @Gn&s:Q* "+!vh%F(^sj7-U˝+a'ODͻaAga aNtȩC]G,/v ~?2ɁܒA0(i6Kd7A–5mH1E8s[U21_{7azEIؒ$!z 79"i?!˳[8|աj6EU۽/PKYs2A[Bi commands.htmlUT hXPVhXPux ),I/K-L(QpMvOV/H)J Cp$T C l;.PK=s2A5C config.htmlUT VhXPVhXPux \{s8[8M]&(g2xlo%ڼ֖ ! IpIPN鷻 (Q556AhtfZԍTi|0fTX6j//O>Ox|z}l<>?{=~:57~O5/aVfgRIĎisqr&VX4`j\Kf!|X-qY lYx43XOǘ鯕8kEUD_YU| FgpM|kxϟ>_ejXL4$33kU.dָD4(g@Qur*UW-fk ܓ<@ $7^z㼼v)[@嚯fJx>8y>TK{+}6i5(8 = J`3wk~N󒦲Ӱ-WkDQ.h?fu ipO"z8x`:]I9B tΆG$H-jNGB 7 $%$d{0y-yQEV- $#iœG,d'2JY ?񤞢tJw}A#Zp/  W.z,7B̬b |lկohA+ 1G5=;6/FeTm^Ĕ?Ɣ[a6zUwxe>pMĚ#1{gKh s4\'?VQ a"%ֽeh*(Jƕ@E+"fQ RjxH}Zu?O!q&ض%:Ժ:̀Gr%+J:켄L b DŽg NB^T{btΜˉ&m˼A A g@7W,|(61%]PS]8ksj8Ke(3Afe X8_d"ەv6N Lm>j浬4ދ+MPÐa聼{.8U/$"C\8LelF&H6&&Dbi_aJ%:Oo#CDqhLq\w\!Gxz~e.x0ʸɀDŞ<<%ΥXE燇 ^FUQ$dC Q] H'nc(0"_!٘܉{`.DgeǖvF$hS TLzCѴ-D%<_o6ȮrxdpWHb>Np,u ]ڗ FaJ d6.T2|6n7UOr .jX0] 2+Je G#aZ xK__!z Ty}ٳ!r~ l"W:y{hihE7[p#pJrsppkɹ_5zpJP]i=eFtr**7xX*`hyh".T $y`C-FR6|-ۼ \hI/BP)V tSCs0iwK'vև#޶k.K~- o*%x.3Ajшw6sqn?:ۑ=rqŏ>;S&7foK-zox09g{ߊ='haG{J$"Ē9O;۰;P6}]PE$sSh<&hLq\d _śWy';Jd R)]C*VIq))yXsJ}?2ab ݜ#Ce݁wIOպW{yRkb[IS>/C0 |l\px7_D!v# w1 nKNÁKW O=@ɍ_˫MWsKU4J@#qq"Rѹ BY]y[TC#wOr H| # sA !󳳳h4R'PjgHuMGw!'%6ȴ)!֘1j&+2PLR=h,܉'?\,/쏇=j*. p2UH,85<:FjBU!N jFDLJ&j5( %7P[Uxa,hS4u5iUwʐ1:e 8AZLRMyC%SM"VoLK%XKX8;T5`@ylB 7Bk,LI)r/K. ēJ2;ޒ}й,,l܁\|!? $ֱ&8inr4+4wxnaZKAƔ{{H*xEa"<m@pl%h2;ڶo>CV3Kn@K W@2tKjL0w k[>}f"CSP`/RwN! `lHR 9XBmľKL< Vm{J]+lpPjyEvLP" vJ*{vT޵F hdwتQ?YP3Hr=pf7b^)nI+  evI'Oިs΀v96bvVl S30'}`c*Y%ۦb0#Z3,9 ; "Z|[g޻I>p/gM!sUC V 6[d5&{ r@! bC6MHdqӒ55Q}Riy^:ύsŠE阑3%,a:J`H.6stIE΃" E*NI=jo|iE.߾&';?{Ë*`Φb2Ү2 h8}nOv[غ^HJ\8J1:<$=ὄ|[^5<9Bg~i`/e@ ev {~`j>RK*H-~;jwS~W]jڏYw wã2i_Ň|H0OOqr\ߟXrкi1ΚLmybk() TL Xһ؞`-[/T[| z]Qۋ4Ȃ)RtЩƟ@ϩ1 gZtĩBԼo3agR^2(9ﵑ`%"FF,LEfdC'#bs!njD*ֳ%ql n >"]A[я5O~:fq'~1V73 晰+ }֙vh;N~#]0Mڞԛ+mX(Ǡ*fc84b/ow=Zߧ-؟—j84# MDGFT>QmB3 ' QK "x-x(aMBW[}XEƶԼo_|&w捬{vgzme/W4mk2 a}J3!oS,fvX A'i˦K_t򣏖h#z|a6_7: h\-K͵͹o` Kn1yIoڃnRX߼-y{n<z{l֗ X-ȨTf]\SȒjt)oƮ oZTcuh7%պ:4r4Q\6ݍ@p擇o z4;3tYtJje9n?DV/Kuk1S߅m]G2'tU{aHHXO:@wYD.[ܝfEfƅܪDNN(LN ԐQ-u(춴 +p[PK Ro>css/UT MWPux PKRo>UY css/site.cssUT MdXPux T=o0+ "(( h)dBTl')+ѴXN ^BMz(g#VVRd3N+&pYP!mܢo^KO4M\GQ-tu绲Bbtug~4d1d5ml.ذEx,#*BǁjtB0X o..#M>c׊5 Ƽp&ܗvl1{[[*WVwܦ7>0h ulo5[^ m@gPKRo>Ivo css/cheat.cssUT MdXPux JOTRݴ̜J+ԢļDǢԜԒdHqb^nqjQf5B_qfUAA5W-^I:gSQ婙%V I9)n52PeHs vPK=s2AV date.htmlUT VhXPVhXPux TQO0~ϯyxI6TZ:@ZinrM8vf;w)eIKrsz|[KXB}2 U7? 8J_M&gi~yN/f`$v$4p$9~j9 - 'q|թ TO 0Y[r 4 NޝN+0(G̺;Dt JˬMca1.M*-t~"R{}-Fh-3ONN?!/~oO#k0U9dQąX22)SںgRd>WKaڌg UZPA-++r+nQE)5}˒ XU!IZr5N.MэuH9PM\0z5<%}:~aIn-)sdt34ξ|lMJ]{v[fO8ǷJln"D>؎sj'2dŹ☷",\zv$MAeJ U8A 9_DkxEyBBg*+{: !w'Q}%ZY %hh ߵ6Fߠǒ" "^^jiY{4 kv;_nTu?`N5T!z}\n{K\Ǖm]{f|GF0t4bֽ W?^&- PKRo>/jݗvV details.htmlUT MdXPux "p9$KQw[]q6pYMGg??_{PtO;w<lm\EaVǯ0R'@]*9bOG:VϏEf,QQ6^$*RGJ w&rw kKtW\jS׹juyU5&Q8,~uauuI/4yCopHga- 1*pFӮ0.70z[xH''d >+2X~rb󽡄\=3WhʵP* 7 -Y\ w nQ-ejF{Cl3=jKG &)X $b1АdJß.J'*f@#mtvw sdPj֙2NI*"**xCBI-rٔ4D:,a,m XH4;w=2 Y>2SD$k%"+J{afjn/+_ oo<HHXɠQfYtehR ,Z0qFqjF.ۧD4 Q@zWjXkeAK0n fʳWok"K~Hi p,&`ZoX6pc9AZZ VEhݒg-Mհ|rrB2R/6se͈ 8F)68 W2]<ghvaJF*,f2V`n+)8AP H* 0i)8ԗ$8֟7AuWT?+ wshChHF!DK^yVLJkCPqt5AFk198ӥ%>vL%efaa^5r)e% :K82[LHsO?FR\9q-Rk)_\$C$p_Iq+GK̮TmFT.Z5f ff\PfG?E}홊?)Sxs&uM&7If<@jD a7dX@v(% l ZTYMcˆ,YJ0EtS8dIE@Xl, ؝,RBW~5UYd*SHA$v]F#Æ밲˂L50_Lx-CǢPEQc%%(uqU[r>Vv:C0jIHo6_6$c)5B(`Y{JBH鸴g^Z3 ?[Ԅe1j[YaJ*Q'..N{XyT9*qwXuTe؛8<(u4U wk:A")JEckE0R-4W(yy!5*MCirz1deCo%rzTe** o+aK2N_$-h] !`]7Ai-]$2-qo\ӹ]%Y/qL"n%B@FdzRR࠽+U ڋbji-'Y= )vPY*u:/saeb!}Idtޚ_=Di! A> T&B8QbS UExX#3QA[_Q0!N"%K)*42,)PAR}`rIf2 crxBVL슋3}Ƈ-k[Xe( fHjDm] 8X)2M0"NM)z9mS1gζ>U5|ʀ~ɮe'& O>t:6@gؐb7bF5rj2*&R8bHNfMf$ 79K Sn} spnϝ2:RNXcIVyƭBps "6Ô n0FSn-Z$+35f~a>،4jo%"pƘG lū(/R̲HR0&cjű''&bo3L`*׸tPm0}؁U& Qy^o8LV @pcԞG'O\xpqrER TϣX M%/88r'vLgn;Z-ýWҚ ZR Aa\psf^AT.ƺꟋ\79qN[uާL4QF7Y܁f O2LS~cAs,I)yڠoN.TlQZ[/Ǒ*#`b A5&iШPxs R|3[4'׀)J=2Vi %@pO;KD>r]k&"aq=Cpk Օrݔь keE< N9*O{ŗ\Q >h5F^SaD4-`§gNL, b3HLdٕ>Id7aDzIch툐Bikiϰ[;/5ճxiTXYeQ9sIljI (h$[HG5k]oV=y]Lufw6t?xQ.&K?X:QIG~ vz֎2Gy3 OZ68%_8M=Psb}xB`p;OpMs#%V Ex4FI.6H.~]{zC8\xֳֶ蛇lC6clc;>؞tBsjGAq#i-~z 0M{ n;8}( uBt/#*&uM snQBHhH@wn5vϮ]<"j3jOp})_ *VS%EN^ځj62pfC%+R4 *@ z7'+aœ/wosj6_ˆ4w,ƭ*nLb.gpGC~FnARȁ ݐ7!kC$DrEC:K,ӎY|ٙxCO\R8h0dLj/ 66mfN=RWuI>{bG@8U\1oʗ|eI el^8*YtJ m=5Ej>q$me%*Y{ݥ住ΚD(+yg,2lr7MY!'oثO.74oxRJ&j$⍰ҋ9%.Bg9]|]Ssyw]J287Ǹ8?oI,ƈ,2 lΟ")_l\˝j[eUUfzǖ|*aq70侦Ų=u֋{WsߡfnO@ӆR7OPK>[.docs.hhcUT c3MdXPux ͚N1ykM+PZ/Ɖ^lo<}!)C U'36V>ʲ[|M^khG ԙ[|_5c-lx P%^XZ'K?-DQ U19'ldցhPűm͹av.PD̷O{.@pqN ]נJޏhIlR:A|H^ l:yo88lA~\TbkqkoAY %&چ4+]Wv*K{kTQצô¿Pz(!BwdWpJTNC^{Uop\0;k-k F6#f7KL!>`byjsٌG6#g Cԕ l6 j(N%ͭM 68b ޛ!k^u[\ E~fU_ڻw-5~T_ӜnDa';QH^iY9avR&X|g ׬….2>ꞔ m4w* \hp<x~FUY+C c0d X/asJk5T Z##%T!d$QÁ K a#Mr ms ҃UgcEM['`SlIS@ K|Y Ú6j˴m{syH5iB6jq/Eۉs%.ٽ/hK8=&d~R0j$= <޺BzCKfdocs.hhkUT MdXPux )ͱRPQ `\PRYjTZQ_YXWRX T$sJϼ }s*3RR+2Jrs!Vq胜PKo>eQ_docs.hhpUT ȳMdXPux s+I+)VHIMO.HKI@ ,r]SS\Ks:K2S\RKsJJ 2m3A2JrsPK Ro>ebshell/UT MWPux PK=s2Ak;$ebshell/commands.htmlUT VhXPVhXPux Xmo6_i4v&Ntي@Y Uݑ(JZl]@ͷPE֠j!`2(2ezZ=}wo秗\ח߱N޽9e^}<<.0?`(QtK痺g.'?jsAv"!c^.J`sh (54h;fLA~&z CTpuN&Ѣ#T 2}SqZBHz#2aqTᷯ_:}2Rk/_6OqoǧGTYdS&(x uT\gdv^%/JDMXPk`n[B1hY^ElʃTGLzBvgk 9 @gPPI" hD&llJp(Y(C])B'Ө]JJ6QQ+'%\3P p"C0 ָ'5.E-dS tjxh-4 B[K΋ctY˺OR\iMbz E̕zWIͲ, !<)yIaZI9}RԠ*h֍4-D)j+ơwRs+RKb H7000V+@ћ ? ʗ!ytdfD5$Zjo'sUa"<ȮthLc}U0vs>5"u}qtf FD:Kc'W4]k%OMON(wp^b=_&Q/LGmG}z3j㞀1K'<#(MUW`ԋb7;:ht:,RcL߾\ӥil CGFY{fLH+yvPt$Ems^.&Җs K]Z*W cV!Bo=YoZ[0r!5ݧ2=D1 ;ZCzݕpKz~Uh"٨r@܌Ws)e-aDADMAvԝ}O{۞{tqBmzh.Sm_)a wjʊdJ`}줡ϒkcΌ=_v}jF_;etX h6 tb L{EcZiu,JMh<̿nUԯ@vg>H;X_{fj)T/B Wfw{-`T]p(U@K0&T$-z/S#j 6EIF(̛|!d_۩ȚK=9,|/V/~Km&;hErRVaIf~P5ޟR)jL d\Ho3օ.3O C S;\ n|P qv.h>htWko9{\Oci= X݊4y'p%%0eE[A5i Uup$1%T$2$;/*Gw^,$vx2RĮݩ) (2e@5-BQ1P2Y& &"4_hcK32yl' X|dtSwGa#u[F_ߠ/w ?o'W)YwQ216tY ==Ŕ Lv7X5"CԮPPQ3{1(~`7PK=s2A+9 [ebshell/clo.htmlUT VhXPVhXPux Wo6luK*X+Эa? tKAv~H)qZ+@b:w=]+d2zD.Mt=K3&'ɋ8fw_߈w|\$,y-.i:=VjyC·Ƚ-/hJՓVi Sn:^zE"ϢJXjgZr ODci9K4+p$$X,tAf` S}E]YU$8#|xf>6W[m?lz+>?;yƫ Yjk6 ΩN䲢NkLDy2?7]'u%Bf|'s/DalE$;UDԶkY<=M"VlFDzs<[s$I|+'Gy uu=Tz"+aBVyTᯃ-|([Xn+}wǷ"w˼pqAG,oVG^\w`XӶQMզkkOvmtT6样e#:< 1-,59ajS5d~Bkc܈ZZ>C`;/1B)^u (>䙜1udž{ųއ=`NmU iNiIzQ?@V7!rh%GC ޏ[+;_ZOVLP.KȍBuQQYY,dX5m[?YYSik{:TnUaÆ`-RWA+c&!/e'O A.MP˘襪7C:wtj5Xڱ T׊Hc]\qQJDȷv C~)sׯ> e<\Gg=:#@CfIٚdάR-{-y ͩگh*)AɊX·5P*L4 5 nYE5nɕwk _c`b3#xDaB]˺EvVG ^KGaS7\ \,21FVA">)"7,{bGvCtsd:}+tq ѐ[[m(,I7Ab JP:/.ijz 9MMC0E\7ڢUO; 6%ZsG'MK~&<ؑ;E6*CtःNzQUeapC,j_PV|HbdmڵPK=s2A8fiebshell/index.htmlUT VhXPVhXPux Xis_1$ EV[Xq*5c̀:~}^ AH* GO_Ϳ+9IILZ4Y\X3<=p۟/?]x8bXGTM^R7lT"ٵn jδ)dlt3%uDVȂy .?5PωԔT,P;-%NpO="NUpY Vv%$h\ AS eEI6Jm,:pl)۝qiH=/8JkgjIL%&ǒ>Ar]mi& "<\256ƺnHMdr˂{-AQQ6UZMߝ/RZ󋟮Իts`)'hCY;8#6;zA3:-D~ b0_[־w*FQ,^ѡ-qb.Tź z"MLm쀟fAF~lHZsɑ;ǖt6lt32m6N ƬgS3xL#^H\ڹx:R_:,(Whu%H9;n@ITxs޻ %'Bb6źrk:7& r X0!ZIsŨYL]&Qrp62+.%zcqB#)G#ڝj;bjjXIA$jƅsm<3+n1 Ɂeo.GaG̥3)]Ņ7fa},ÇNDF:\]s 5Ӷ+˽8z.&mہ>/@ci򂯧Y k~s$*/AÖR/ 5El`[]١Wſ{Es GC}l-Ό8 AI_=rBBp磊uc;fIPԶ/55n Uk]}=<; 8~r3bK/7oӚL#W#a>̺׺>km]aS5w`#0;:Qw)O0BuL[aa(aK8~6]]#ՂG*7eud,YUy8C`W bnЬ_Rt*L9\xN^乪ub&&*kSew| vJʍgl[BD^в63탐k`R<~ąg"#}I'6R*L/V~_od2uK?TeR:łx]R+Y (Vp hE%B؆[%JůJvuOyus }XDȅ?PK Ro> ebwxshell/UT MWPux PKRo>H--IoOebwxshell/ebwxshell.pngUT MdXPux g\Sۻ. PeA[(ҕQ"wtB.B'$@hJH HB{gؿ̌=32TW诐PAk\%!!M2?H=2_(>'9'ZF(ܔ =IHhofIHȽ jRJjG$$wI ϟlZ9zdW+m7i&&ޙ*+_S־(B.]).g.*MWm1 Ro ;ͩFg)ɁI4a-%kڅ{ {G*##\`;>5ɍB_VBXܼKJB?-ʝ4|<~ %W#yS EϢVjoU,>,"Ӂ.H[ǴQ&rz(X^|4Yi-oIℝ*D !|(+ϙL)XYKv9G1R )+M:XﱾrLA EZ;"$N6JF7aM=m!V2']%ᦋUo~jR٦׋ 9f)\^.I!yYw 10/{Lt5zµ`Ν@ȴBNSQFSW}S >Ý]X;FűFrѠq[\Ր.4w뺦r_rS5.)2~{ћ7晤Kow(_Ng7U3ECYұ=]1'k({\4-[T1GH1Ȏ$ }ש9͂:T~-+1R1QF3j[x 2OχwLsҧ$dVp5"@DPAVT0kм$53Ps iדc&%0Ϡ`IwjS/y`϶x@۶o?M)X9/ŮD|Qs)o>1ն.ok|[q^^td/ waۊ OtZxg7wj[fFa@L MT\ԇ)`jj%=t8R5{i)cofuLmU癠>J>:]ŧ+gp؊>*6B}0oiTH$ rKV`)]ײ0l:m'uh;.`@;IO&C$oi!=UqŘu` oFU㛤NcO]s̵{CL|i|c`/]Vħ$qAӍ#iԌэ/F!!S5wҾ <pH:'@0.mYz~)=7H~aJ=@ɍ_14qw9?ń,7:-"GǢZҦrF]A1{j34UU>Ǔ_*׫BM,螂=./nf|MFU>{uхvq9k6?m9k31$h7vC9k<^i[9 dʝY76YFp LC dG j CVӏ:yXqi@`H=gNXME)gCI(=wٕpY3vz5lͭއE zpoom\2dZ/bpvS)_9קg{*+4< _wBk4u=F%+*yBMxZ׺e$MW)EV?k #+;/Qot auɦD+s%\$4h*ZR.slh[ђv+}ے\mSf:ɾH*l_SfPq,K2\iE]c< v3QyB `*ofc~`ZF#œЖt;"՘/,BR o(q5.}SW24;;%TkسS휦$|X&[a+TvLLCBnnP \Pfn[4aeݩɥ_Ǹt]/nj(^YZbG7,!}z8'H>\0짩şMLe;m;RU]%&?D`Pu$ֲS rM@)K蓆tKtX+>۪_nzs|)TavM@0YuwWn3<̏b0q)\p\x ܐ}>эFd\qx*S^ZMTCPgkd~a U|%7,+ &7|t5uƩeOcuu-^(~|jOkKɝ)= Lgw:5.4CV\tBn}p Q5C9Ƨ (z\ypF}t?wD \Q-ث2'sS[4$ :ob^X)nTg]l'22[;;$%_r>!wBal! K~ey6$V"1;EHͥjnpơ?dH4si4zeY뾨2`ChmTdxnm292rz"״{~|dd$lkcob^JJg崏_@z$짩e~}2qqp&qP ^EŒI=f[[9a45ykEZ%0 K 9Mݏ(KJ64//lG n nhgڔGc\`a!፫Aad52$ \w>۷'`}:9ݣ? ^B Wy收na6$@u$Wߪ9gsUЮ]m*%7)zں q*vVY0H6"Nt.o#>cmlnܚf*JȌ1.xdz>Y/3ý7>ŜS;7 U>ڏ 8LdڍXڠtk^k]M ֢ʮ]'{j:Ǫ* o^n=V-,Mu &/&Iy[D@u6ʖVomF0_۞ bV0nK?h99.f7 :ϷNi҅i`Sa`Rh=X>;\z,v%{B*:c{y i$䚹XTH۞l.3!۽piϳlu*vd`~d09ynY,ɝïHõ×=30*K菿Drѿde#3:I-38Vm~t !3@Tn6pnR VCkU]<}nNQVTE"oT< bmcRÌx9FedcNP4 ݝU /5SVInS_v>}?~2]Z;!%cm[Jx gOBefY|Xp!BsL KIxF񜟢 GvmxJm(f{f\T5QLvʵܤ12u]%=0mF %?KSgtJ8@'7m3^;b(`*VZ}Zl*ݶgrr%B/@gUT9+yv)H5S^{x1074߸=t=xN;Ƭ5!5~S1Fp\t.P;3:~1+(˓~YFyUwcdHlRA$~\ԣ](q&lc>UC"WRhְYi OݸF=YZɄ#DKJldmv.xWmTc5vj5 e~&CZ9WܛmNýq骐͌],p=Z>2h:c#Y<+ѿB us 6hK sR twƛ {dkby; 0ӻ煔bbD [1c]qkd$ AOܧVj ;nW/=Iaɸ[MIa`<Q>MFC%Ky\Fg8_)}(KJ]b#OzCd~ڑWcsa}6|56qp]\}Ql={:{5=R|фyjt/~\)q4n:6xG3k$5UU,%ݕԐt dP%Lum:"TFcT>}2cnq|P*/_->h2h̠3xzVY@}pye6߫Ս7ߺA7(֥'xz`fT "*5^ *6lkMZQHG *3$OV&%{ "`Ϡ"(dlD22B|:zоYc0幹95PDQe*َb, 霘ΕZvEkd, 2d;dU )+cMɟlcL*_Odzuvmv~$F0@/60UKdeU .|vD"nܾyGphSI_ct'1U'1nl\_`:oD\L99-ZߺծƟljk+-W.^X$q9QZk"$ޅBU3K.]m3ӈAPx<ꏅĨ1\M+h7\]wC ޻gJܮH(s+Ps hϻ͛Ԥ6J|ʀϯ"M9uu?ٚV$1~?MtY-˗"njexQT<][kg;Fm\H 4%B473Njil>3zA❛Gi^?y-X^~~>{c\P=c U f)M傞qR8xkDyNzBeˑ]F [zV}ŮURFILB5i>8}ņa5+mm'kJ {g~Y;֐SY*D(K؀ x<_i jNȠ+^Hs\ꎻBE[:Ӹzyڡ#&e(6cY{K&?ylg7`t٦_)md5-(o+73xS ڄho+k7ԮKQsW< {Q{Q "5.ޖU1ZjRm=זaL.ڗ\odkc(-Hg `"GE%olO58j%P`fӮ٣weƅA,RqciS25g;3cl6/1 V23$JmNV箭$-'iT  Q=],$Rj?x@{NAAׯ:-y>`W絏 v^*<U,HM;U5>+6QU4sDLpE OVYbDU2 8Y\LMrFaRyƍ`SVn 7GKx,}ԅ0e4֠OeP9V6|/^X?qNk]SyQ觛Bu2U%)^tfH‘Z~x|z0 , ?,?*ނbh:s* 1tdǏ5pq߿ y5oJƆg}'_}+0,,,'8ww.ӧkREWifRTٽGA}m^~۶yzkbZZ[Ž^(0uTtއA+Ԗ\gŮ"ϖ >ֻ)7WK: l aIJWg)=`{djWl ?euꎞrG (+ZmJ_,( e^ xww$wGt@2dnaF`dZ!L ~<."$Prqc79%ޢ5!O->I%%n)aE-X-%0_-XYȃW \JHUq˷z&[<ʳo) 蕛طDDDăXfK䨥YP(EB_&^F'HK:*++MJOokWzÛ[R߇.3F:oϵ@Oݣ6cb$w|j9?1dd; 4"Ay3|[XdŚdH&'XyTcd'"3 5,TQR<}m~1)m ZAA bC?4T`.\ϑںmB}Pᅧ{\?12^?V 0cyɾ᎚Ӑ) 1i $Ҿ  jjJDE_{>/jkb~O7؄leɘrWFε4^c΀ݻ,BKo;E&0dmXp2\pۻv] ]-4e|\ogۨ  < V(⌱Wۯw˯/49]NMGA?KmEsSmmp߆2xM^d%Wps`y-;׎ޓ ׶N8)qZYeIO\"f+MJo{/u_'1~xPΌ!Xg_tsALDa~`fS ͵b] ste?ZJ-7_gC4<Ի#fE3K.)JBw ]2 TSr f + Œ"o4^˷J6A7JWyS(Efn޽$2;"NyytavX@(%+Ipǻ:#)"sfKrʔVRVVvAcOn3e]d{?:EՈ"0}pDE!>nYڮT)Tɔ#]ykI)EEEܽum͛>hf1h"B^~}ӧV޼YS'CC*ęyWϷ>WGdED޾}K/T= 7@W-pg)5pwoZʀ q_FHHINޔ#X_d?#@/d򬻧g-^su\(pQ'%ݭ*t'cQ^(¦@˴ĎrDFr5}ip06?Eدg? s?3f 7Z_pf3Y_p.[Mýyaup{R=$Q03vQwahn~k`z2+6z#M.V!4T@^ Bm#-%1ilӥc8p<Ͻcig|Iaj_VdtZ<=p}[h^Q+B_vږ!x%$--H^ @{S[SЊ4Q}}F-J0wȳȀR[ `7j6(< 9QO ~nHHH,R5K/f!I5/lr 0a@{J inJ/.=2 c3~8 UhLV}sVA8s^tJM;i0S]WH.&`Mk V! Ϗ^z{x  nZ/.hZS- 6^_y-g@BȜc2e_sus ly3znEf6mg8Ǡڍt&6c͛_T`^˽4A6Q"Nv9~۳%:=^3ј 7\]]y8cus;Qa­({&"2#|і!v}VrpEuJ+g@,0n?;fPJcZvzajG.XϵI L@\dZ Q7u@nwOMp,ի[M]0L&##g jKq9l*@B/ a7nګ$QokvF5\% Kɲd]FJ% C=9sou`egsd1\Jb̥ޱV6.usz  2=,,\ }VgAkk]5&fh)sp4p44l^j6݇bI[XX8 Z^Xa_.c,5cNTmnJ6&*o7:q'Y˫]<0z0k;rB"2WK/6&zg`Npfw&>18=9@C #xDW ~T "v3€ɮV W\-J|dyNgsᓉ'ډޮ.v҄ΝRccɅ] T:[cP +3;W<^ L(EMߨ1-^GT!t=N<.  G{hP`4 j,l@WSn=1 |{ZtT!'F 5"&2_,fFjo()(_H6jpnH6H$ /FU㆗o׋/2j,20ɺQS᯷-P/<>=4HFeںOP)CW&8\xY953HMb_UakÒϟ Jp6w(쌋Zv@a4Q8̾C4LL3$1m?~^b{Q{u(wN u &>LSK + UL9i@&W ?S#拆,AGCP2 4(3D($}'-A-Y_>~2fjkku:}7jع*E#w¬E&Y^w?զt i\]h޴3{FXZ/3P.Z/_fMW 9FH3 T$=6ă2K<" 'DVx!zpkF O27jZp"~TTu(Rz14UQUp@x֍Θ @fEihmphdpid'-=f۩+4cI]/bbdZ^4˰]y>5 wgϫQƈlf?*G pJ 0:rst1i.hEbT,%{&4{HY/-ZZ|+2 .o v\2W,\Ib/Se)Zgrekoʎ}$􂔍=7uۭ`-3&#zٰ'*F \f L;t69p 9::Fރt~:>-4U'LNQPHm}n Z^_Nb͇~{G@ؕ#?rNOuN*C UORYN%RSn }{D!=Xjn~ ۝rkpSեlf׈)f4W;6$V{KcG'Z0W껊`* 4Q Q uںmj aڼ$SJkA9u슾$MmQVUmf 8f2^a)Eu87_czm camojfٔ ;Nz\nr׎g yzqUd_dTjXwk\Mj`xc*~g}\H,p=D*UqgdSC!JdU.GT*x#:sbţm. @ 2N4Mz8uRz*DVF73C-eWQtǚv]H[ݖ]S{JPEpdf/ߎ.p7~L$ ɵ Y|˟O*B#יѪ6]'ar˗/w7η3tBܾtK;ɑϙ,͞?taݫw4?Jw׽M M tb.p T1"c2eO51wO՟ @vpeOPQVxAc/WJk+:B/_޸I~ΘGXN;%K_zx(?ϏA4Z<q 'fq jn^ymU1hT8m}O;R vc!~ bA_.V.RQ=koz=(2U?Δ;?ßΟ #xw.R{붧uF}#C1>ۘ[,CME3%䕍R2\Ѯt"< 6='Wi ?<~!,utW~ d|qx4CKS摳IKwu%ߋP?).6=:o~ .d6Mi529QjX+t;+I>ZMͩkaŜSܞjuNN+ b!=RdvI[[$=2T҇d-aѾYHb/=#ڍ vߝMIu8c,6y"ILuxd11Hgnkw_$%T-uQGAN<v@zjNmͶgUGfn9_$AsFhܜqW{;77|O:ߒQ ye$R~U(W{4؋9"^8@CbۮY P#έ KP#Hɺ{,f&bfi~9Ɩ5|qM_sLwi -PO9rAʃBJJAhަ|i*e^mKQ8yc›%|tݔ(?3~~E ];qfm@ptMO-jꐏ?}2}1aI3`oj倕4 Y]v' ׿6tKIM"\mu_psYuk5 5uc?n36:Tՙ)D` -<y"bIr)C<,-ܜ/rǓ)AT;;/0%i2d3M'fcmT' bЧY髨\F7ǻ(? 4!9YbY;iXO'QJն7<]߿?[Gܾ};!1qij}B\ar5sJ .'oGeM_rNϫ/_2ཙ8 x>՝nN2mwS% +)Ti(Z4v<+u_دs:;;_Wαc I*c]KJR  Ebj?~`- < +R wee˝.B3BډG]'R1I06؀sE!! ӴE1Vu4Rv‹~zxxbbޣ]8*Q*X^#gYF炛5$\[a\pZʸ6wȄ=,>3[bLNIܦ˗/.A?j(8Xˌ{;]| sjZyIuӳp>匃`i,vk*~OFiQ)vyDj}5N<̚;P?>j=)_sr)Z64=^|S>jn;p UqV^wt/uV`x #[[_E_TKi{q_C׷jVIU-F~RdWfkH @9MŪ|VVVQ/{~uϺ{SYՄi^iPkD',,'VþIols(Osôfvvһ{Љk:::$6#$@YU\Yt.Խ}'*_ Ղ.LPX7sUWWwL{_S_(,PDG0AǨ_aYКh!}-^yd#FONN:CCVN:H.^Xiu d0aŢ7;)Rg-\#mWϗ-ÍtYh<=8Py99B~=593}돻@Ԥ']E_Hgŗ CdZer 4œ7\:'Y/Pé%2q,gܿf5ɮщFXx!~jۥXgA]1.cD^~}p){; u{`/=4jssPBb ?26/9>xHqnxsŽ`4Gݓ??5Fr t:))ߵS"YFhMpr=L0iK蹾ɰde{kŪėwSP5~:qt? Sc߾%YTV+T >^I{QFQ}7p`L]JUqG}9Px_hDjȈX6bI+gHgɼn^$_bjyU.<_XF{u:ր;tt].]g (pᯰϟ?WF =<[IUʲqM= ̃Y&^B[p;QWw NK[{l-X']%qHII|ۘBfVr,9y'-hɛ,xm .W6]eh؃A{ق+eZ[[bmQ3[[Uk׮mǬȞn=::iq@bGFxpz!aC }&?.=Ԟ_43W7OJJjR.e VݜY+4Қf)mxopo%}OҦz8S: _3=W&9kaÛ׿\}NzWEu6?5 nөʦҝ6+<lx}|Ui?-Nkt[6Fɞ7hIY3xړb0A%*\ $A^E;8;^v6 ͒bA]7p+E pC%wz2/EN"I{nDUA*AIluТD9r^*i a5|`ivr+jr܁ ڝAҐmn(ҡ{]COS'a[/%= 6 u']!AcO^ӄ<)anהǸ 96&G3q@P4$Ig o|X{hBJ‚-B৵L|߲@u?DePK=s2A Uebwxshell/files.htmlUT VhXPVhXPux Sn0<_e[-HS8 $@"!HRrziy}pgfահC536IRhJ+fLy;N/.v|y wxqp?6|b_tk'Wn::AV,1_bsckeܶh !CP 'opkv$JbB<`. ӮEUZm݌}IdM ׷-s|:Y(٭=8Պ =/R=UX4;ZhuZca6 Wѐ #EoP%Rip|bbn")(0 uH,+\2QGU:&}W#LÊZqo?__ş/r:xOKL-/ص (-.谁"\С2؝N.D-1 =n"ϋuĜn"]u0UNC׮u~!~.A5AdKM>|v|~A^|q~*nwU9ItF@S./5ض)Z?&Kƻ0Ťg0m뙱Fvy1S,]-e{GYzI R_LXхVƛ0Blץ0~ G ytf/znn$7:xQy4[mߔ6lR>j&`zbnYbqBYe~ Iɘ:x2qq{:45*qi`M!BǗV [HGa' #/<Đ*R+ٶq$9 l!MVJ}!rna!'{B|Ė%hvV%},15L Ƀݙj\. ?R&^0tG`'͞68Un$Ԏ)">৑N8X#R}䏺{_z^x.l,?y'$L3I&I#'5Zf{Od2;n>/ڇPP~էZjmĒSퟸ=h=PK Ro>8oILebwxshell/button-ok.pngUT MdXPux PNG  IHDR9sRGBbKGD pHYsgRtIME 6رtEXtCommentCreated with The GIMPd%noIDATHŖ_hSW?'^cޤ[ZLj6dMPH>\)I؟,L(m&c^Ln`L4ET:)MCr[={ &~;{~K)޹Y4MBuuuT @]H&z4M+ eYܽ}H!ģ](_H޻d4wfi7C~/UVh>DRjѼ/-ˢP(PI4b[Z Ggx3lo!N<я_ɟ3|ӳu}||9s]w1pcWß3WL&û|~E2mɮSjϾ!(B=my> bH >;7oix y"9A$'a tbInnjνccu}}dB|c'M6qH %GY~q]m۸b###Cb9νsdK;ʩV>f9v46>CO[LbS芎 cjL g}j"u-ARDOD9Z ma-~ WoExUswj_aMM(B!g刏 4vn70?h8^.x 0!78']ם\,ae=RuT2UU%!O-,xPGL\B"@J(!$H0Pm].TK.eU,8cÁak}= 6:%Ӕl\.GP(䊢t:q\ _ KIENDB`PK Ro>Debwxshell/button-edit.pngUT MdXPux PNG  IHDR9sRGBbKGD pHYsgRtIME tEXtCommentCreated with The GIMPd%n/IDATHǽK[Y?_FM*Rn:?]Tg)B]j]jA VH7V *Z1UIf@DTy3jp6w={N0y67qB(D4!r!|>޼J.]X,gcEGn|\q*.>Ue'~s9c2!KvP0ޏȚ!rz}VcC{pdCrrrW?nGϱܱB"nӧOpB}}W IRF!@$\.ccc|M>zFyH$u999 (~?f``)ϭ8y$%F~?"&4ϟvn}9aY4$I`0`4OVdd2t:Y__ghhH$餲Kc3Rzq\ܭ[$r߿(}&e=׎(//ON:;;ikkczzlo.gYF=ېb\XTĶǯB^G!]~%EQЎli("UWl2؋Dp~N(D,](rbrs;D0kt:rsseCsIENDB`PKRo>fHCIebwxshell/edit.pngUT MdXPux _Uy.E%[PEKRZinY3?0>{{}A`J@ /ȈHi.8;˩!oagBg)-gU;Sg7#G \0BSsq䦥jvtjgdKrq0|2 R}yip\/֤S_1ݖ=;DiG2[d䛽7L, wxmt;қTp4R!N !Lխa\ Z$>r]+$تrZ*|,d}$#0ՅbC̑C%pf\C̴V>7ޠN}r\ycmm9x6.'QY ܋_-KYAf0s M(C.|Lݻ= F R%EM] \1*MIU׉&1ԯS$q~ϕCKwuIy!٦+ՉWsFJz 7«]_ Z5 utM0.3JZOjLdR|pSmm+ JL?3 ^v`, Ct׌A?靹o gb r&ۅKXvOʠD?Džw6[v ,N@r&\4B*\[2&d-s6Ւs"~-[bWqnGI(Jȿ/yqk(k(GcӼy~ [&&QW?#u-L&nm] 5c̪@u"WܸǭZr>0ȩ|HP~\YV 0 :k>~6> #G}ڗfF9}B\+{\jL9gH AVu EN4CǡZ1>@>NB9?Xlo?eˆL/s<1y%m`]@?7͐K*9=as_ ^cVn݃~y$^Dy&oE$om)`d\7y:瑫VKmds5{^>J5i7 -;eQR׿ό*i5A:A'Sk"7YU0@ښ!h@ɬFqOp`lg2ϧa☠!`6mN_w'Vv^;(  8c~<6rI O(@+Tٚpf%>T2eᥦF'=歍}ːf.J=a6Ga>k_2q| %-LbƗ9;IkeF_$Ń^⓯*rLpovTX۪ow;B'7C2^7&plpA! waR$nܭ^ARro`i{cdž .\3?(yvwFm'^gk~]) ՟ (3Ce'Uc->/o@ha:>H!M_4Wq쒶׮ARONht/Ndt>6Mp[WH<JɊE45_2x,-)ZDH?rN)kA!B"q a' Jҹ=, H=]g܆d!'Nt_5ʚ#XFS<+pE29hF~O<.2:\{q D -WWVKez GC_6σJ =|lJ?W9#m^t4?v 1OZ S)5Yo>w@6DE_P3@1q&vy@h`9W 0K>{ay&G ~{fȤQ̑=ߎ͂KQPWWWJ!$Y}dP𤹓Y[Y{@ʁ̭"2\\-MCf U5ջ熿έvz=TIVmcPTT>Kcc8Bq_`#Y&oⷮ.ܻq7pKi~k1I].w;?u >)o4ꏣQd_ݟi"R#HÃϯYF3k˛\H>@í#߽]HpMw}*JA3קKt11L~5]/IH(b~16'qq{z} q I%Ϧl`ԉh=W+55u3>!!& K`'Xrr~/870w?ep[awWC-􌊌MMWTT&&fmTJ###z ,?* k0+i{V[r`.~ \;u][[ewVS ϤIE£K.%%EIGTQ9ƍC89Ϗ^xA-==jvV5X^*H5Lrkkk%50 Y쟟Y6z߷=ߋAfD=C؇ER>y{yT:C~KSSiHy__AHCCC^^uvӨ*~En()8,t1COOnEL@m?˞-Gm8jfz t $#{7*vFSF#\S54MPS2A|AAԧĴwpDJ-EFVJJ'Zzl՝PS"te_6#һ>%9D!=zxx0l`A܎I ? |QK"|& Ah0NU-5_qЀ$G@lm `(no64P"H/+)YKGgc\K94!&0v5njׯ_FFfi !Khh(33 vD7 ikk&etyyyF2ük;;Hm(`y?79`:xc@SBN"dttIc}*JJR+V>oM1CWW %X9Ʀo2쀝_o^V4I'4ՑPG!汎l)B?pL?>4.x*sO%UO4#5uwD*FPKLH _j u(6(4MV l Mk|ww3hA5ߴA ZIBuiWd EtK.$$\/).nb=/?? 6-.jjq1CZ1- ԼN.nnm`=[sOoc SA׈APWP>C cWc'TZ;ȿA, {.y[ZDiwe6PVI{ތ(38Urpzɍ>b ʾzAg/EY_bgԜVXŐ=|ĠV_@<ǶDm5 uw ͑ .9§Vc>N%RX Mr+f&_$'NQ2? 3}m֮^c'((C *W`׶ ' ݯSFĜ^Q 3>DܸΔM=X.bhpզ -,^wORl㥦P`[I!ɟnN]`n+{H˽ ^KHv"^-}g0 J&, &&&qoF~677"#% J\T7"HܚA@שMmly[hDE>S  @pu[}yv wCZ.ul qϠy oC%^3BoPB@ QD!/ٯ}ݼ/e )f⏀~Bg*,D=<`)BycSSuuuo4h 7tvtgaof0׆_5--|PZDo?YT`cX -~l:u-u j{(jD $+s`1_B(` __66s T9̞4_PzR6CRpǯnA`ddYȕV&絷u5HcM0088$`-W"xV0DXx4Pg{0ڠ D[P.Ջ71 (//bJ|UoX4Tilc1A~1WW֧;jLI+yǫSϣ. `}fegÁCKFL(02x$E0N>wP!?P8r\1'yں/B #%7!.$t Í)#1 D671C3lE^YRjjB߹s~L'h4w l]-tAͼC?-K8"$ (7{Ta7Au;#'J| ã, lq,@l\~';scU0c3 YN1~!F"T_^(qSpm QqKeӋ CgwnщIہ89zA3'HG%fJ -?&6*HTTT^^Bw> A 3طB"Er,a) ^Ete]/n"ĤM H5;"b[~ ՚eN Q^jjx~~~f ,PN4Ì/Tp}IHwZGvN5OY~ӽȅJS$e1U+mm Ma O?}>T:MJkW4//,y^ewwwP`4J(h{7:j}|<porhvZQq$eSoGjxWEoʹ^*kVJں$ <`i~O0@͠ g#_SK6x\,OmibdaI*RMy: N& _;p?sv\\\sUfd:ڄ-q#MeI3ޝ끮25& F 3 $&wږ?$) ƒGWkО8K),0"<.Jp~~^AF&ӳbg@5|0s 建kLqf)NbVB0+nlhQmw=(+l|Q n] ^:iƃMtOֻ?UPP }xWL J)PFbnPmD*Ϙڨ-q&ƏFde&M"׏F?f?"b&owoҊÎkO'gfkPJ}_M\GRu暑)62#.Gmϖt1«Xp*}x"SQmZnQA0t]5"Ȃ9&]KbTwD7_%/C6,VSpU%cN?"9GxRN2N uCo ۲9urv|ٳ0^R؏bP %14!Ӳ kDPRhh@SX --—FcZ?_djXD6и= "$v)<#y#]~bm'z ^kj4߾3"L$d88LV4IфEka}J9)q9++ɮ?h" i%zq=''uObo]´^UVr/2]NֿQ3癸$q\Y8xʟ{ FX} G} 0oKO,p|8y' Q02v ^jr|TO^1! rvhsjQ@Wj3}#1Jo/"I#)UB\8 {l[{*菈/P`ˀ bxf{?+5hFJcumںׯ5ڤ* NV_!c ֽOۅA^)ro+R7Q֗.g!59h&HΨ4){rdcaV33]i0/D/B4]-/ 5f>F㰙dt=a;] AW4ss +nͿ*:ttH[o9EWzr_GE9ϲuVkq2]E޻DDY{o귐G=b|WZ!2 #mm" ,MCp^K~E˧nT iim_y<n{B>>Z:%gl +jL%F"~)(zW1=qv?xP"`ABk; viԗ<hEKR?#g/tЅl`GZgdDSz)``C_8]ۚ#YHKP\ʝQ /7}A݉G-zJ#AUVZMd|yyFNN'wHlg:,fs`k0t kWi2=ζ[^0 `5A֛68x*(#Q.!ggiq/,E1H-}&gg= ؅ϫ߆1YD c iv00cQ{PmV&LLIS-YVG$c @Df]]0k}sywdz BB-ri7"+Xi┒T8}i'FEQ^DT[5$8oS U5::ep׬XFϰɋKwdms#mԱA7LJri [ꑒ`Gs:8U>nO݅q|ɡk彻Ny 1mBTBqb?)1 d/gܖgޅF%,(|D,+ N b8MI+眑2 ?PRh^xk;VyEQb)챑/Ȉg ucFp"Cؘ̯A-,؆|1۫.PQ7yXM \0ޥؤA8H¤4FGGCSSS999 uAL[ƢQ(O糏!-R5+FSi^^?|ܐǁDvy68%[_^a\&QrL1`mT5P7!LYXRQnop  W˽QSYCC7iߪEHܾ{7,gxE,,qJmIvlz:n޼)M˶$kq ߬tT1Gs5q@CW_ +| BZZ}u?Bbbև:6r;3YYk#邳[u걯( Rgv;5%K{8*e-O(5=aӯ'-[h#[Ъd(OP7v)GG?CI/eu>7G|xkGz6U/[#)e'Zs|upe?bMkRKپ 1;SP03X2?c l1q8"ot^ɠILgrr/>F!3w~=.>kZ@$ qvvm~Muu:uދvfG$pftANSKp~&TuuPFP A50oY(.(ª2ޖ[ r|6:`Q.dJ3;T@(j7`s{Sz=[< ֛s ~kJ +UeO[X8 jxF͒/ŌM!6v7jux_JxcBhEqJ+,k/H /y[C౗HڝS`SʆU<tc`:A|?#~rYuhmB<\:x`5ztҖsv;nF>m{uwT%,BNxFj̛ηa>Xb娛զ3-FUڻjGP3n+SQQ7Yh.Ά% ۦ$Dd--deM'=%yP#8UjtNhOߩ"u+kv^ueX6zBIxB+x6ļ:~G ,?Db4'8ݰM}x% Wb~`OlIɦ9PX=FOO$t_NGsPrș ۳W-Mav, "NFԦ0^n,HVO.ؘ0?]󠫇"k3`;GBrb[9.% $ Sc~Bx~s3f]q}lڰ? /B`: h{z{)s`B|r@^BDBZ;mbS.h%!15(6FjHМ+dym! Z]RŽb3I-Ht۽]_BG\IDwxWz>ڊ=bg2~ J,(BUWE(%Pu>2Kς4\F1Rz~^rVNԋ~{k= JJ{u+$J vJKW]).zxzz]j9 Raͯ^wvze}b}90XdOm߾y y(`eq]8D hJĄ <, N+IbX:Gu܂4M)Ѧ7BWd3>egG^3kv.3T}׆\|OmH N/n#f(R0지MW#T;^|W#z IV*|I},7PK Ro>images/UT MWPux PK=s2A!v) index.htmlUT VhXPVhXPux mUMo6WZ hmS$YYAlg۠fQd[TP"$e'R]]$y3NX'4%+åT:3\wE|Z<'イJqAy9M/ɳeI^7SEB7ɽ hZ'Jj KS hϼ(iK,Y4YZ9G2Hazx4(Q42Yc|RO$`hyz=]ۮח7VɪVX3hEGK Y$fҼ?˚ePXJO#9Y1MZ㛔1u#[,lN=%<ﰰT@Ry Ҳ0vHMvNI1P{Gxz G h,&i b!1=~xcO [y7g7Xvs/X/^rF ̘fm V3z[pXT=>ƺn$b["G5?Yj3ȔE!t_|,V}Ki5UgZQɘ_4=KiZ~)+uVaɳtU#Ѩ+->y2m`\(m0G%,C]^xJ?,i]& BNq}'Lr3WW[;M @yP(0>JEJR~Y)Z,D.)EF[i]j9UJucΈzqÞ}Z;Ǻ^/b8joǡĬAkc[KV~YOpqPK=s2A{a inex.htmlUT VhXPVhXPux Xn}WTHk"Y fYޚdjd+dSn ER]uҚ&? {qXyG;vߦ䇫Oo?y:~~OC-T^j *?vntd*7M)Oy>TLW&2έid9fTpz)ה9мy'*>:d.c]S+IdRSw~|>> 鐜^/. Ezx4.J UH S1@Te?LzuY2?dKSXMd <0VcL纴crR,.f7EyWYƉb.b9azeVQm\Zc>J\aNTma8eFă\,ݚ'}5YdL(H2iyIШ֔MFS\V傱ѺfŜRfN݂4aarMЇޤH~2 َ>b\ gŻ/锃w:Wy!S,_Wq0qxˁ8"0 X5;WXh9?8j_1e\hnp{U5D'O^E XE77*Mg^r+J[秵_)Z߁`C,G>.(GH[m'$)h S- `xZqv!|RŴ=뤿l Z2I+āwn!rJBAeL8qQnhQvRrr$R! Tj^OX2H/eyqr<(kum Ҽ?Y3<,wOz1FU5QE4+~/ft nZmN c1TAqz$9Y6JP~lnxELHUSބnK3M۪( aM푈&!y ŵzdT+W!{?ɴ!$`=swm>չL)JE*Uٛ B14i b`0wwp{;G vnb)h])Kt3r=g̢0حlLDhpt3y|0Уߒpb =Jo6UVᡳ:#X+:4akftZ=+!F ߝVNi}. /{%C3ʚ ݷZ/FD*"RHEifBhfKVU.!En`.P`SrG5 u/ [ a/TtiBi m| '< 9gܢwe[@Jq./2ҧ]oti%N`:ɜ][SnQְMn("K Ng!)H¾tn>eЅF4;4"s削!@kVr|=w> T6ހ.z@D'TĴc3x "؁@=y.!e ~t4ڙ\\8%l컆vo=T`]J J~'~ig] 6d|sϡ=T7Hw;NO{R aQ 1{܍XnQ*CDx1U{{`e/Б.Gj]\_,uY: w}K:n ͍ۑoC,@ǷCդ暏={"^Pyt\Ws\xܵ&h0`#6VJ-_i^i[+މvr:Չ/Z~*!KUXa B| A,y;$ kPK Ro>install/UT MWPux PK=s2A]ۘeinstall/index.htmlUT VhXPVhXPux =QMo0 Wp9} -lb E؂eɐ4tQ{$΃:؆' ԶQ͘v]o.__ʗ_[!Dy(wl*PUa ʆnH ={x1k Bii@dPX@Np;sx^PK03bžbiL^e Tmmu8EEĶ1:]?mRJ^vsY4pj-zQUGF[ِd|ZoӨ74h:%ÄAuìZh|QKt䟤Y}*{R 0!IU.N+WF%cP |ݼT>8UM4)Y9OHCGplPK Ro>intro/UT MWPux PKRo>L %intro/schema.datUT MdXPux Z[S9~_"5[dqM<@`&,eS[E_[mhkGI}@::tPYBqBdYW*bP*a{!,R/41*1ԉ0޼"J2׷__M|$ZD!H,KTkxL@-2W\DePhmg2IJ?WE)MD $ٷ?&/4ZX%J?#sp'wO¾"Wgjb0IRTx q P<˕Q*"^,OY< ʹ"E* Xމ4 ]b8% v;mP:8/.>_~.> AsWD-)~I`@-(ce/ΕX"X5Yfa XLT݆){ذ;"PwFgXmC\߮ II kR.XIx:˥2Ǐ26hgLs Vv&/׫Ců? #Á,Z9O*w%?쌞 /<Q<g9>ʜVI)cPq4p6D6^L@(v5hO* z8֏Hý6cQsN^s"d6R_**\FR>.UO\6Ϩ-x"*5%M[R7riE%S`2#XEY$Y!mؽE]y/DNEޝRNa )ХYHàD]R;5wf6+/D}gEGiˇਪ#V>bVPBc(Q޴j$TK򕃛sHڞeKHq ղu:dn,OL dAvg,uLA;uSUXu|O@rl;/ܑN̚v ffb6> c\рwKMd *𲳍2/&nq=x~ P::.x5nu{n Ё{:]4 N}7Boi`$]$Gr!L T8HC(.Ҧ>>4˨җ_D:OqxT|.MtkY?͆G8 $[a\8De2הB*fVǕ,J|S5k"{}V>1kəu!CCg3!m(y_ЋsC[=ꃞŜm>R||Q7 L&>o ;n{Zf2Ѻ7`OM3o1>v,t}" w(T7ݘ= .^~d‚v2RnxYi^;}@KXlq0.R^B<+݉Ch82,MQ3EKg+*͗)MPbm"$ w. FSXv~UZ'ѶS+^G8OV,"OLI &[O:+AsEfBf. 7g~wT!^0] {Ce WMVpo=]4=>{ckyZL<'/ȝx2膮4Dd tWZTW[!9|}COHӄB?b. MX=rkuHh (Q?UࣕXxkpSEmtvI]lmY@ԹKr'\$.l)eNwsNнS3Nmnrd!.NQH-YeQ459n{ ` :DzL?7~`rךn64f~IDu)/`|E7ۉI]fnг9.KiB_$"1Y;U鏙k%Q|f' Y*VmW~/Z4r,g4&[5]q1i{mڗPYONztT,דNGyAU@I37Iל!Ɯt9#U;dnlwszP#EX5=ע;KH EvNniYi:pΓ]i&C`P]'2Q **Y3N10 oGY5c6eӕ<'m?|!v\3w5Y;hQ*eaT:.E%|+_P ,u!b򯚔>9V'}_5߀..FwR~tITc98DU, [LA34Smt=$ͳA؋W̶4%@ ;mW_sދ Fi",䞡FYsm*mt0PEmvii٬oץ麫%׬O^Y=n܄k nCAv*ҳz;z?oVl&j6 {tlgP/̌^@zJBo2$Cz3d>8a-W?sqdUT͕7r?gysWx76'ə.gl1!>/O׻5Wiw4܏ 'k8ezU5i!ʷ*EŪ/- \ӳjaвkE:I8Vkr,+fSx$>EINp?t=Kt,6-o߅+Fp&+&)ooAQjz^\]nU}I1>VMôWr۶`C( Զ*@3"F YHM;[D{:ځ,:^钎$ضhE X(D謪(i; kXS}^1tF-.Y8PQݟV5BN8XNS ~ 6NZ<۩ޗ0b$ 0{QA29Ah hiBZؔ 閆}Wܐ\Bg#c րhdqق`܁r?ʫLDHp~VLt*4Xmb]m)mtNE^C =^Bj/Ex)]T^Id9M[4D#5%JLî؄Yikka1%\Ϡϋ17EMh"E Iȋ5x:,"a`d O_c]6 ڤAL1 =w#ltHew<g <" * u:*_95J_PK=s2A aNintro/index.htmlUT VhXPVhXPux UMs6Wlbr1N*c[I뙤IGX0A [v:Δo߾],K;x*O拒5^׮JwXq~t}E嬪tUUar$xU>Y¾K=+hٱe2/=tf8oaZVCr=2G˱cN%u7r>+9^JJ#I6J[ևU1"?%Iyqqrh7-8]\ᔚNOމU ~tgrvޚMI9ٵll{ hQo|0(Y{v8`f7Cs/Kg`Bvxר}lNm[RLJ9ښDe.1iʰW@b9fرj.&dq9` i&a{:rz)+Z{r=[h;HT,plP}oMCfb(nG!~a+[q]o-* ?. BxL(eU*g >ak˨ {2nNk2Xxx2 b/\ q}:‘S95>cbR*K~Ϧ >zTq#2Uk]HB8L)"mj5O O8.YO"0q/4B[-q`-eԝiPhM#sa\hDa HH֑DԳCҽ 2}U "^KR4GakcĄ34Ѥl߿\!2cY tq{+(PAJ7sL5p"mvhYRz0z yZtP">'c!MJ湑io✾ h%Ȗ/L[''6cu#ұLgD}1F bON4N'& ,94ʿhC`ڛ{֘h*'#*H% npPKRo>!XL intro/mutaties.ebUT MdXPux Yr):R@mjeKuŎU⤒" 5Pz}}t [@wOwWMyXæP,+x/22ee6x,V̙쐈?dke_Gɽ`KFl/U . f +<Al8?Ul'dR oZ%>oJϒ,$b\i9ܓssy}48;J M=E4XPԛX5>B: 3j|?Z{Q ؽfW?,U:AGeʊFSnXnؚ0vKPpd0`m*6(2x S co*Deh[*m7C:[4MWed,l47hh ?Ӂ0$E J QGi-›ѵ+r>"m M$[.BDh9xWC ^TH֥L7Hh[L"R]߻sT(ȀkkDDjb6<Ó vͥIUu-?tdrqZͶPX'(5VR JL.>g_VHP7RB #UfMmQ(>^Mvӷ^g=lwhQȌ< nZ&GwG0}UPKRo>XBZintro/relaties.ebUT MdXPux SQk0~8WHncm-HGׇ(%#n_i L}>69`P2'ЦG2jVф·[KxXgpVh+#֝PE 13 Xegem:֕ںFnuh> O9FW L:搣CJ qHQ!;kv{Z,J,Rݱ=YfXmp JePG/= [C:'黗?D oIv} ߥo4s7DOܜ6h^vu38+j+mR}Oz1yK[Yx1 naIꯊ ׺D) Cw6ZAɔ# P^"o>+t] 3\?J(=pSXf/% )2ku!CKz?޿PKRo>?3Fintro/opening.ebUT MdXPux uTM0+FEqp[ R+nc!I6 w&N}8CaLZr`0QZ9oWXڍx竔 Aޞ hKvja%6#W$5Gx RRI D yua`CRWK N$7k*Β#F9ZМusPq)vQintro/eekboek.confUT MdXPux }Un7}WCjnRCN ,רAP\rVˈKnI\5@p=zô[{6zG6\gta]okZq\o+2Scbq<+}ʚr2, FqGMf/;sץ"jgزgV17BB)p*iI}u^.=w^2+[ ń=wF`N#3(pM vL \YjE \Κъ1HaF=[NP5pi{ ʴCνmݑABb![kɹW"ZR\Nݴ:ӦwVxF݌O*r0.d>C9Y"wԉj`&wY[RKE<.Vy ^w!</#ɹ,xJ O'EXCtB%]`/$#P|"_|kI_|b?EP9rGS<='b Z`Vy.M0snzpl]n ";t5Kgh}7Z=I& ?s]-gФ^]wԯ.1 .wH’0L~)N30 -4!tGSI{]d2L*n>NGgU)3m6V9VtLty<GbJTb',;l0GH!p/^WKA]N ސlᒠ tѵmVl6u$]xjǖ&Xd}IK<)h4h(#0ބcUN'hruf_[i"Ƚ[2q@B9{F=p[w&Ow4ORaLEWBӨ}PKRo>O8  ix.htmlUT MdXPux Ko0 zN`MZl@aimQ#KGŏv\`/~iJ4Vh53T.*\X=>|q[.?v˒QxLzU Ɠ)[PV8Loo]%',"tgN wwVPV:?T8,Mj#oNsnݳDEtm n<6!8K|;Mjee6s~z}898^~Ngyqq=OdIVдA+>XA6q)6ߤ"7o}tHa@HێicS(_H |=(KRŋ&^[ xft|Gm2BU`  OqF3EKzd ~5;̈́q)U +5,dLcR#>AzEd`CiX2fIy#ȵIF;"٢ꉸb*ˆMj\Q;A"@ -^x;-FWV$ TH7Wail$Yځ"#:JG+ŒuФnXѸYU_HoR jŲ{ A^-DR-+Pk!;4k7}*IfOlx/0괿I}NsPKRo>9Ikop.htmlUT MdXPux }QMo0 +`ò5`*s u,ϩ(^bȗn'߸<7)Zcro ]vȡ?V$("lh( MNx Jȓ, ک]@c)$ZSrŷ$p@7*$j5*24 <ȍ&p4ۖNXZv1X򉮠鍡!Dm 2ͻ=Z+$(?GD&'(!Ef8y8h4xԑxi 5Zmy'.3qQUPEwokR⑦ u[h N=;t1ڄ? -/S6|PK=s2Al2#us period.htmlUT VhXPVhXPux T]o0}Wܱ>҉jTԮ}4сp16 iwm]'uҬ(`ߏsgJt2W,FE( OAfyX]~=\@E/nLn)+qR|e1 r+p\a 72\",U5(-!'N4Yh@S!*Y%,xocwJoU<̕Pz+$\&~0"yti //鉋ڰ.dA"6Doqɷ!J5WFŜoy5rBv~)KI!j} @het2Pm%(G5 ~WC$wquR0:?۟jaO%/A vvWȉJifFl2+GYGG,qj&$I>FIJ?oItfGzDA=s@M*҈:K.J7NlӺcL[&F ,Q0+SG{ILH=gb[!O1|hV\\PK(ؽ$v y=mJȎi; sGxn}j8lx&y~6r)`l/ʂ'UzP vw}LܐSrw x~PK Ro>reports/UT MWPux PKYs2AXkG reports/grootboek.htmlUT hXPdXPux XYs~~*(DqKk'^ek7 &8"!@wSR8z_\ln./dʅNU]篆I4e?_77?zZ(unfóQZ2*(z>+S@LV SLװҰaJ3h (4 $DD_ע"l̷ ŪE8E%&[>7nob-t?"h -ƽ~H%iVbպ-SN2&gL-C7`Ofj2(T|Z+$Vu)e>"kI$F(uU&:%Z9* ⻺-*%"ħS[pȭLDi˶(M_LgT%4h"sT<Փ7iūa % EJҐ`e75sc( [ E[LWA N=S%!32S)QD-JCHY"̌ɼu-Pֺ@a?NDkZl9~)U5>^ke\NJYL]YM9,}7: UeFs2Y+L(Ԭ.V%S[oS * 5;W$t:!a» =V M%a\b4-8m6 HLРG]6 8jA2-0SsY~"q342:iRu5[ukz@~C$)JQA!kԭTmUk#Yؼ1'#>j F*~9H19; i9YErTO-9~;c$Oatejֈx<]>Th-{3CَU.i6XH]MZaQԼ٣'Wƴ^nI[4AZ1R믔pk<虧ł6dqi#ﶝ賠yv>,{D1dS/cubi]SR}ɝT.}UmG\ }p#lyγzU)BL4,R-|!PubcIsӍ.ޖ⒌.kdϰ J Ejk7?WL7KK!5I}I#ntf6tK~%ʳ>O^c&ֵ6"lhM:m綒&He4ǹ9gy3sMdnVwoޞaڊcmŒE42[iis+UYkŝY oCx0DnU"_?t6 dVnoWXB2vH^`aJ28gj:ADYlJ*]]4&BP2Pd :HCx X"[NC}(פy1eQ<R[ :ڡY@tS2ŢSU kZ* bި`Vn.%}'\&hX+{tK9"Xk7v&jʞs}c0 ,Z`Ib_8kjWλz\bSNhRc `b2VDvk`U:" (cmLUpN'e.,$7Y5"'ںn"![L!BrfBpeH(;ԥ<$5c/Vͥ^;vyXMXt[t=JbD;ƣd%vґ(J2g~ݵޞ@iΣϺ#JDZ-!pxTوpRpډ+k*>_NM{X7E 6Pt8W7VXpId]&BOM3aVj[&†{ y;*קI- ?NÌdpnӦ 0//[,w/ٞg{$g?U7f3z\AH4 -Qcw >6iu7BF F񋨹̡0יqi  Q#FϜ`LAksi%qD!^Dg7`|$F!mm9<>=QJMTth}pQ NRQKrZA(1,=`HW.VހŌ{܇G!&z'udWbcL\NiҜٌQKxux:X]u=qOtz$;lF֝_cI}Ƴ1r\ECq8ބ}w[,2>x ?"1tߺWqB07Yn.9 #_khܞlb<-0/h<-b٫~Et/G PhWMb2r2 gT&L޴g>_8c (㡉D(tj S1{5BQ8-"Y5fB |9iA2,gfx6 yyPLD`+/L#K!Δxu$9q(hN\]q.o K#'^y]ES @8:vڕ m)T&I%f4Q;BKΜ\m1UIVb^RQH+ldOLt5w0`ﮯ+])# ʜ`K0Z_FYJ,񊈽E&aZQ\ɯF&% Z=2'JzfGfhd5Zb{V#)bd%s* j DHNtE"(IIsVƸXep]uGg. nJ( ;%K9qS͉8:oLi ̢-b 1Y,s_P^o"?ޙ \6kB1RtE:k>!*ҰB N+yQYbo. @ ꆉ,W4E9)$bNRby[zHSnd 'Ƶ F0L沊h J3ByG0"-q&qG&88W,GS a)j`I== 㸓IʤgY$VşS8mkR˙gMUuz YC:,G'n;9Ĕ8 #ۗs;@sukUxʌ; *Qkb&YzG'{)ȩ5Vcla) ? Hu8tYȩ djpesɌ́ ˦kr7$s}w6a(jUJ44lk$zk7M=-iёR aʰi3_1qS#ҡXx=( S0b#vSa1PnV&<yl煉";&mShbME#bsY*;Xز dq]isq,ԫx=*d_-z.vˑZ@`:8p=:؀;L"[+ʣۅ[g!!;޶BW`ǃ.~K-oC!/Z7)ъgz4ߜvS1:=]/aM$#d`YUC852V漓(oQ5X4n׈cJ̱3wվwυrg:F]>nQ}'"W&ҍ .7[?gru[.2m[[i>eh77HIV58 v9#;n6)c17w.ŏETȩoH&Uڨn79ߥ$L']biVBV{իq94[$iBj>|adz[q#R@LWҺŔ7e Yņ_ -Q\ fT-UE2e9Zmvc}bٝm%ٞ2|dGT[݊ &N灠nތ J(80|#. >]нD `92%V.S=-i7]ɟ7J{ď:? 810)-C =kpDseh7LnzQ-Ə_?A볳7.Ik0|>?o8lRU$1ƙ0`TCCU?4i.~qR !b2aswM_ GJW@͈eU&G={0鞖X{63ڨ&SxA% |GSOk\"Scے[GV}]U3bqa\#ar]ܷ:[G9s0"~y?h`A/xeqS7֊_C RDeMn ?],5ٮ߆Qz)r^ @M֎cĊ-農N a?PKYs2AȆ)_reports/crediteuren.htmlUT hXPdXPux Xms6l osM%Qvdul+d֞] W,` PI뻻+i;x,v}_p4[ȭ2< 0ҫPY?9yyNɿf7Ww޾o~?_^a?wtEq<].U$Ki &k1S.\؈O13"S &DF䐜}J\(9, ZX!KC(ܧ Coğ|0#D<yai[. p,W'S:5*7J l4_ Vj g=@\#"=G5A#1dәr }b `U+Rpb. -g\prQ8x]jarh [1.o$"e1&kx2!9qe02B8B[}T=Ob{aE"=џ XVS= ,pѯM:ޔG&r7T4' HLޕ_9V۝x:!~?\9*'RPDBƛ9r"wGt+Zctɩ Ԋe @+R Z+HdJ+r5]csW-[BVy.)`2zDWJܸAp0SBlP6+8aeZ:#pYἨK](5(tBd`[8q][l)f`zLPٯgDL)QѶࠥ,-tE,G^&v:XW`l i{,-StZB qeiH֡t|4p){u',(t{ -`wAcLꞒ(PqpԌ8SH*uYO-MEŪF魮19τ`j%ˮZ<_'))ͥ ӱ2j`sS@&*! ĥ'^pj$ns`>4+[RwSPٳԜ{vS$<Y'm-7bZ$Kf ɹ169'6! /l8.,ZS|,K`_a*J&Wte|Sŵ~%B߷<N WՌ\/&^؞pM8?OG(F\t,o?J*6堆%frMJY;.!%.ޠưR9E|J`e/5o 8F/_;1z4q)^#4/OǛs|w=8v7w\7YձVe'fVWҺQԄ]cդst&kw9deYnVLS)Ӭ[XIĤ)Y8i&x/zV!-;}}e*euh'GtL;!G'F;Z-RYqrP3X%})Š+|]&#YBբd#BH/^6!а_0;LU6N@'˟7r]0CS-N} ]R8$|"_)?*Lmyw/%~n6KWbSY҃S[UZU"=/?˶5ֱ 9qkk[c "xmz;R;q4[qzCbԢsRRR[b?)uE'mm,d 9+Ȋ݉|Fe0f3æa,b+6OĝuɛkZQgaVMKzH†RP8k`Hdڊju#c?8X k (,֎t*f !Z-4ƻ55iݫx9˜ȻD8e(/qJI(+H LrHi9d~g[i![CKPAv liERxOxL¬LΎv%O0LgGYnwklv4i#NO$@: !sN5.oJNɑ9Ee>Br -6Crl8m!ǰi+|^=+y$ Ȧn#A)r`C֊V3W*I "t<ăM>%L1NEͣWpGau,9u2Onh̔›1Nxp 8eM+,|pKL% (ò'A:x:pg,Fl焋Bh?|(7ngkD~k z:ı]ދp x/c솖Jv ?jx݋oG\Q˹Ǣ+^U"RFju4E)|?HxjSȚޗ-r;XpYc%lt`;EAy.Av/~ ׵6}3'Oѫ;81P\{uxn ϏØ8ޘ4%*]r{ =o'<=f:O|Zq[M-8S~S6<>PB$ivE"\/;R 3 7:jđ&\<()0۝߮v/XO}PTk_oWu+U9o0w~ P+GNQeu?PKYs2AŠXreports/journaal.htmlUT hXPdXPux X[s۸~6N3IG"%9qmE֎myl&ݶoxDA".ɉDʎlg9ۀq? LeB槱UI0F|K wË4L܋In40ȕiz/LY#6Z𗍌0/au`>n!$Kl:""Ƿ+8kz`b0?$u"!z ƻʾi>SҧW2EpgXxvcoKGRq|q?]S>[Zef%ϡNyy̬=Zky PQeWl%{͐2F V )\̀-=Jd>FP[qSi 86\U{ޭP (!Goqi"aVdfw_b6xj dhS!r,3j6n-*08Z%ƪv &X&|WnkB ٥̔u9Jm 4*M&pԬT)Su]cZP,3Bh[`n9%NG-j*gyawG< 6[0Ho֞f>/9_$:MoӂIk2ؕXo"UO*pQŇ`&b{mz B١e&ljv➡wIe檫C+KعX릘aY':n$iS^ nkqBvC, m9j[!; \߱=uQe)~۝o1…L!wևE.."3p@;i.lR8:m^En>6L$[bAɄ@!<X(!n\KG8iR4D#laÓ-RdPYcf9],\\F̔ZYwc[Qd3lW/B4BF){lt6^j%^EQ#^|":Q|"sC3,,1jBy9u@sZm= Ul"&K@4{3'l3ia? g $Q=S"]S==vp/>=ua4= R/W˕Rհ`g뫽\>jqFo~;rOz0=FzxEK0+Ľe=zXOV :ǽ-$I]Riy8JmHl96Ͳ}zwsB=jd0y?q҇qK؆GP@"u<o4Ma}f{l[P>#($,@~dZY@2m$lIQ? xZ[;/ M 9Z:Jn솶RſID|SKgPK=s2A/k7reports/open.htmlUT VhXPVhXPux ]SMS0WlLOЏ S I` %vڛlmlYr%9@~}W:ؒvx t^Y`tMi2Ղ)o'ɌInYm]·^pv=>l0^B[Fuht@V,16fAX۲kBN=8 ÓF_#݂)/D)m,cy@L'(j_8v/?^\\M_|"/1WY*DSJ+cSkM e)RC,A@2wIĄ=v@~:I;"ƃE'Si B(yMtTp*F0: D!Dr%5,p%${'A&ciӤ%^Uap}.P7(˘Gؾ:["eGu4uJ1;CL$/raziĢt!2"O3o+N52t˾H"vJGo'Pb1BQ"=D< ? Lg5((E7N|1PKYs2Aĺ:=reports/result.htmlUT hXPdXPux io+|xFP<đmY6A8H8",!RGd;m.ܝ[@U YI LE19E-;ˣN?]^_ኽ7DѯQtysi^qn*^B!VE{OU <֟OP `v.aƮN& `r4ϡP\ `8X٩_SiS? Q]GHB|\©^сOt#C2̆du|]X/YzvCZø_ n h6H5s"$ϴ<'2GV#̠@#]d_~1'!+}x# E a/3)׀1o2،Qsc`z]M0#]1NjOq_ JQjLL0))Y.wAts1i`!i܋7Y\ )74?j#Z(Ȑ]sh([u ]mD*@M݉-[Qz6\lu nv-72;2YA.5 h Vvj.fs5Y"âȌwH3树0сb4E^*&i C(9ϔ9W.ر;/uyb:e%{FM(:\gI%LE[~,ZEFŦB-0wT`:-ohy{ɭB`KtkVErE+N0S`ToWPP\rX`,Rz9(7x{B6@njD;W~IR ZJ/3kDDZKDqj zH fSnXRIҢ][|6lot܎f̞?YwMz;7X9 ({6/wa*qz{D͈ۙi(b3$?W=Ԝ~'o0 ̿\ŏY]HȥLmII9Mm]M um4ba*$䩉*I-n}fZClIぁٳitYko4* 9.1mn7Ƈi"2t_טvBcޘTuxLh~'dW=LgJ:,}K66&T#3p #7CƲg}Pv`Zc֍W8LEyMsS%䒝x8Ǎb׺!*EzeᘅaL7XTRz}L{<*FBԨlV x{;׫QKnM\ߜcԾ+-J2|+nH,9Fzk(21`;Q21Tye%'s_ !3%92cqb,hG7DqH Mi#E-Ȝ:,=n¨k KaٵukGz!&Qw E)Js[ʼÞ}?7M}="d7ǃYaa ޤM&qG.8h^@Rە'By@dՊҦ*, DNhQjrQ W@DK[++v8V<2+6W`&ŞuNjQؒeBq̫,R u&=^]"Q V*y3 vY]{U*g2T\ 9q>!}F%C飦 [SQik=U'.-.P^،L[d~Mȯ|I|ύ&W'G$86w5vdQ='?ֹۚaK\ a/; 2Ҹ-c$:m^$"#)/Tqe;QTȷ2ST#'2@V%ב«>4%?m1|ɘ#BkŊ~ Ó.?tld(Bd[?X*9V]tw&n00O1Ax3j o Q0 %<&A-u >靨8z#V=zE#(?P Gh'JTG`ڣ)i;h6)iTb\yb"ڥS&-!HP<g`Oa 9\%5-CIvh>3VIFմ8HKt O3BLȍb`߫8 fL÷*$ЍݕL`'cP+Yro߸h+K8fs[?ek8¿Ӗa@ƍ:Q '1 Ì:aZ7YtOFDqu[G.FU Ճ,-, Q~01{ |{ llL0p7- \6;탅 U; BtSRZa3nw)>Sfo;}k$7oC_|W{)5!]b\:}0:!Zx=kIˏ!,<$P ށJ]Q{?D%8[˘ܑ̮8V,7~VEX{po 1 ^'9_u!#`i2̰6AE~m [iAƹY߷x|U,(}l H&A/[/7 Zj`O\WgQɣxAN& h b5sp3:ufNՉujMbE} Z1$"9;o[TK3$:t ~}(y%#%Z4& 6zS07nUjϳcI [j4f4z͘:5|*$rIcn?@VYC^o >/*Y4-0|;{Ewt9(-妢W7ϟH\Eb'ѿu^EE};8 %%a(V͊B4vU";71q4AU{M!P]tjccjN3b;Q^¬>(^y_"R*.ET ]ɻ\TmОh3ƕuut (!L%36W1UʽisSF.z]Kw̅]4>nPKYs2A=dAreports/debiteuren.htmlUT hXPdXPux XYs6~6N=m"%IGVW'&u&ui r%$Ŀ ^cb{w\pC:1PY3:<|j4 //Ϯ~!\{+r38>:/qUImC2㋟BܿrE> t2_1u0@&.(WĹINƞm&*ȏC>`W. aʼn1oB>p:EHrc/&,:eEpuW(H,?|? d|v8yE2ɖuT!`2ZE(XՅ9+s4"Grv0X,JAt'*hA8]IuY T"E⍂WRr$ P`fLːuCjJ4KB8l z$6DKkC 'gh1]jfJ/{b!49eoq9B0tCQnwWH K@~NqZb;SvlJ gQ »c)đײB}@_)@d՘G=]Ax>=!Ҳq;To)x1G J`OPUƋĮuA 8|EݾQט"8u-=┒"z%}e]q\.&"z9Rs^טByG–Jy9TX$ t8_ɚ>Y3l]@,$mAĩ&1ҽ`H2d SXkLE[AՅ 5}4{"a~]c߸ao)fCgrqݦ aN/ѣkƳt*Ci?w߷Ci^-sPVk'jqHݐ[՗TB8`Kي[hЀi*!Wt??PŽ~ȏ<}Ao}v0$&tcV{$㗣 8Lv?ˆфސsТB|dچ5|yBZI\DafLx  N]=oP4e.VLx/{qixOׯ~6?a|xv?-W'n.uvt0E9hԮ11ɷOPƇ S>{)psetup/UT MWPux PK=s2A(G:,setup/schema.htmlUT VhXPVhXPux Zr7}2]˫,RʒvJ6/[ $;d}ns-F[}tc?g8&?-P:ߞti&/_p:Y~xuވ_n>yMf_f7׮t7Km1Lg70~g"˝1~6UoTriT">TJ\uJX\'D*=sʝRv$vڜٺ,gXRM0^0ugnaҖRfr)XE~kq;SNIA|=A*Nl>&.52*cyex'5Vx :t IahQ@X=rB/7,7=BhO*7V4Ngtv<u#S GMt_DfPx6gZǼoR2AHEKXjhXkZfbpTttq)SFp$||oLqE> :p7ݖf v2;.b)Zƛbq9On.TY{@J[\ GA≒ʪW7[Wk;FM)d\ Jm`ASdChg8; ȳbBсX,pݷ՝tA$9Jp㈄O n {GL鈜67ٯ73?1{JV%7,'LZa[L86Hnz׍Sn^3k]ʼv "PNÓBIU#Զ+ Ռ`x3;9]Ik*H(c3֞qwFa|yŌX-gTIe WHE5QY)𴖢+PWgS$ Nc~DM?^֩:xh:)R:J CC ѻSo"o/">A9 iұf,>७Ԟ 5? WiTKӾЇd&3:`AcVs=}EmaYZz,nPԿ$q˷2D7[+;Ceͱ/#"y׀[l1,2lh{R"JF%b:V5e7MZiΛ+ͲRUFvc B}<X=u@XfdH[mP{$Hݔd$ "D a)(U=GZJlwp~lК?vBTгo Q\oغiU?&gGi7'ʃjl&OYM#kINӭ@rcOo Y Op+<޴3wa2э;f362ti /`.`{d~k9/Ѭ5r n)^qeՄ( Y -!5`<9Sf ΅Hia/jxLuA|_r Nub: #Z)m$\3ݣvڸ<5T GS&Z&qV~}|:O`=`/jϹbPU:Ԝ|]}9&rR>9N W0/RQX1FmUqyS!rj\ = W[" 뢥 D*#RVbvoWTaQ2/sm`#qRj㴤!b>=kNؕ54 r1߁ǜu<B4*i 6+vQr~:N#:p!CӠGi2EPsC=:jDi瀶F>;'9J3vyțϢwLR[ z 2Shi7`vK;壆3z&OבFjMbGj#+?83ԯ$pzmsT Gbv?-B1.#jI9@؄GF!Q_]\AL,&;^aU|mnwZ4}8/=%`f&۱PH C9Dh#LݬA;hfj;;M4H,*t\ά};Վ|I4/ς4's!Rxۃ/ZN5|ȷ"|WP2'Q[D.DK.Yx9 6ޭLV;<]U)eChw}ܘ}i:cg V_5 dq垌,QZ2o?;(9Hǀ 2<{[ݺJk~Cp6)aSH[ece?Т#.h Q\γ6D]*V64ge K8|CGu!j*rD&MU؅<`w#bB /t>tOMy[ ee0A\H|WgHr*LT:SɑOA q9T*cPĎvn7''p K*}5,!"vS#xQ8r4nB5dowurPH%O$IO [ ,|+ ''ԁ]% mӾF`7X`&)5{b#D{EQh} ' Vıs'z/2''3u"cVGC\4f!)׳,}>PK=s2A9setup/mutaties.htmlUT VhXPVhXPux mRMs0W, tRv)3-!p-,KA腽Hi)~4yeM?6p}o/k`3!~,B9l4^*]t@֡l,`ãieJ[ Bĩh*lu|8jb`9|^%r0,Kl'bU9BV[h8M LѽMtJr~5*Yi [jyyEBi c1qhϱD Jqx_ѢH4h͒R}*!B k$ --wk A僋BJM7&«exr!AJb^KMqP=|hzԘvK簥ʐRsURM;b<[ -g|8}?PK=s2Aҝ2k0 setup/relaties.htmlUT VhXPVhXPux VnF}WLH9M'ؖuqRS /.Wݥ$_!|Y.grfnۆlJw0\UWNףg/Fi2pzzwAN.O)Ntv5&C2+ Iӳ1/lL# V'kЍc*[1eq|p3{~lcZI>IN~_$|kC,vSo\)/f=1lGaw잘Ĭ{=>~=R*SץѫpU*O2)\<' 9O'gۡ8GP+2Cx l9+2ߊZ@IӠ밵`KhmBMÄ0^DxoZ2|f9(E s~j,ZhDKy7yMX|G;d#YeE"@vкox>wUUsS}QRs$vtݚ~T:ʸ.PJ.K[vUS\A|L 8Ch~nO m2[`c .RkEKntjB"@):ȶ ^n2de3gk `JBQ vȍxaclܑ-쉶+KK1 [0 ?mŐn^LtN]GKn!D{|@6%KR2o] WM!I 0jKWhe(ȼFXŃ's)?W0B1=PҭMC]e|.N{CLȗ> Iޤ~0շ0#mr6zX!w92v'E=$EmT{_KM>KQno&Zו2Q+=vp&2Wyuu|`tkaͬ~=t L1MOsKAe!ݐ@葠Bz0aaer 7HJjǀ5̈́+Ew ;I^ |s׮ƞN每O/.(M#݈M?YWs897N#z!Z ;lA%a|;I'UUW/td51Ros:4ւrSN,_PK=s2A2~Xssetup/index.htmlUT VhXPVhXPux }TMo0 Wpe+>n4iCbGfmղdH׏K) ,Z{#VТu9F3K]̙tf<}:Oy2߬ͯK|۟7ߖƜ}Xrڬd +P*A\ ^arՅ zFXl[KNN+'D JsE{bڥ&Ȍ2v^uGBtAjrpjן'ɒ`/gӳ*KN֢@"*=4Y7=jhk6TORq\__0u+<Qj8/7QI,2eC[!"s`B՟ Ӂe%b\ / )Ӣv'1 (f)k)f| eHi@[{uoT(x]N/S9{0Є@Խdp,=_$ꕏyhc;5mrY).\پ۵VƚIQhb jEUUH#Ôѯ5\4t5QkMUW,ɇx68#0%)G}8pwyA7PK=s2ABܷ setup/config.htmlUT VhXPVhXPux YioH_ٝMG`bg$ `'X-My4lJ~n^:2X',W;ب֦ ϣY(T2.PfٓE0ͯW~d:tzƽxJ*6)VL-^QdPƬ\VZ|rMEJP+u{FtUST~ /UhK/B;ubLf'Mx:PZ?κE~9ZUT)b6N2QtD X0NY ت*5y6lJ ^fE {eB׶źR+k3jiM=[)+X񾥪,bۚ> TZVrQ/c*h$ev-Te.e04:*(3ioMG8ċWh ids<́HJF|O樭M&>^flf*;/w;$lLqM U.ܻfT.", /d[B _RSY% 1̤F@YwlE.'c6Qq4pHpYvDh(G]g{8*/"y7(v~ɬf[hXZblc01Rצ!ij7Y S}2*+T2VB;;3F9D8NDR"m .a! JUTSUq&mBf{A" 9 RZtIeK]0dcMxɔw(yIpœFx)+fP+ض8\;fۘJ's^M 9D2A-[ u;ƊFۍQOHst%T8V.Tr5׆qa >(j0A.UXp3%=c2qZ lzq7Rȥ䵲30=ydaƱ$#VW$vRCM m{Yyx#1<٭ nA23 F=q@\*ţ5\.}9< VЊ\f{2^P4{Y(-닐:-\]ͺQGJ)uBC+TK V:V4TVD'.pf Iji4MY3֋Cn}q2M# -rPrREDbE\5E]XdZI7|4ɷ":$aScbz QHnylB 5LUH.*<m. d"MyQk+.f'LT,&C(VA> mcEjuFQɲiAf38 I(ȿ/KO(nU .ŹE&ܡZ&s 0-Fnr1?|EB| ݿ (tA@&Ĝ[!P5 =:.g48.&?g~49VFTW+R"KdZ;xoK⣘7񥛳 L?85aK8GYu'e$8"OR&LйO~Cmuf먧mRWA@ܴ"IAR*&f8r{Fd  >CƉ4C ("3hMAUu" ӞQHV.IOnck! Nclk?PORJ&,ܩmLxݯDZAȍ7?¥Jo gR~0.5UaBhN @ꏋpis#:?@ѷārhN1맏S??5B)ܖpчKU-y NTDr;NoC['uVoN GHJ/s}s>T!Z6ŃX-#MdLT=2%HERfrTA:k>-%A>ۣiU-⃞Bsf"5ys *%M2\|)>f-]^=15۵5\`rpc2I)l'!xcx 2Ý#[DCu\s$Fr/m8V “57BWCV([?βO\ 1 _!'`''\3΅cp.S[o4M&nU{Og|E!49F7dt?ﺣlw7$QRk'fGt?PPK=s2AR3 setup/opening.htmlUT VhXPVhXPux YrF}WL*n-l2e*ڱ+MjDpR~O )V` L_Ow~TjKM"&zaҼ.5óg/hÛ|Voo޿S}7*7st4Fmn!U1lU^Fj"ⷚܖtyMŕB}e^Ŧj"^j[vEdcjhyFEێF#V.bK,Y)_I?$[4?O Ûv"?bϓݢ|r6yU?9]^Yc6u*Ψ'(˗VO/N !KQ2 5To*~OZtZuچ¥+ URkZRPVyVdfmtAH.Kы߬!P tdJsYwI:7dG#MՖ ݚRg)՛cr}Ue뭡`/vM|SA*T)M(TMĐvj-l:TuT-Rh9 kՏZBA9"W5s9sRiRR ݪ!}tIf܄[cTz`U+Ԫ";[D-4ύREb]k]88>ʨ{Jc6JC7*)d-JEBX( `l4x&!.&W.S]*5^^;0y;`C(tVP贰DMu9]t/5`Ma$'rJVgu̲M/6k?TvD]KsDٷ6_2/(ylrIHqbԡ(rzPUut2QEa&i4͸.e7\ؘV &d1ܖ")cq Ct%oTC*Z%luqI~4ɴECi2yFF=H3ӕ`i,_dt͖ Kj',5VXg@d'-]s)!r:a8:)*n!a nw.-N_ H]P{dd]#Ү}yQ[cN>%P?%G.׼5!p22m6'P5 kvE/'qa{da>! Edu m-*-/[₾_̻ےoaVSWȹQvSMwr*ݐaE% lVʲ?zV4Ȏs;GfPcqz;I_~SUZU:(}r' ,}! .CR >| ?{x?PK=s2A\ޑsetup/init.htmlUT VhXPVhXPux To8 ~_^;Eh=ðGbղ_Q 3D(>*:R'R:뛕),z8Q| oO7l@-(|yQdjWW*έ3( CI p#lC=tIE(In=:L{DR[U" _mο0}ǹn)%`Lޢ! :  ۬\@) 5V\ `|T~X ! =ۣ&q`RB.>/~ %r]hٻ&096hfрxb>3 `2>'8,6&k;xD@)K8DN&(⊚O= 8}Ż1چϟ[tP9.h cːv)y=zln06m[ &O!xùobA6 Śȝ3Ų 6p}#p@3R:rN<zAo7(b)"ru$Ɗ;Fd]@!J4)Ї&K0D"&2:9(~򆠲wc-g.J0{DPK=s2AY=n* stdacc.htmlUT VhXPVhXPux Wmo6Sl];"S,XbJ<˴(Q#i;ɯtzH0xaQ|y,X! )M9d7{u7ɟWGX7I>4Jd^XH*WIr3W 7N:V+iJ6c],jlw!M$?F+0̺{v N6!}أw9sJZV ًa <~ Iuf|ƯyQF/ANy6^) WݶHJlȶdYfc R$Rx9B !m ;9:VqK#\2E|l,/&my)KR#*q:΍ _5gԺ)N%Fd8U~72(Ԅ\RމYt6 k/ Ŏ4Y*+kV}o:UkTEE*B?@#mFVš ȣT1r i}_9%w[~u3lx]Zl`u C9$aZQ2J*QTwЈ@/}->'.Х8?.X}t.~]Q/ݓߊF.O NM:}`$OJ|j/7`.GSWO}犤\2k5Ȱm(OfNt?!C5hD;rAa27fWMkt.`KYXyBS!YYJ_=TMޅetij _\}j%em"_0:ePK lp>topics/UT RMWPux PK;q2A, ;x"topics/schema.htmlUT dXPBfXPux }S=o0.ENC/@sdAP%* {~wd[ڝJj1Kǣ.dKi葡$1m[x*= !~U lz)_+r#vڢk#qĕzGnQHPmI "c.4":[}sdu%:gHyRY PK;q2ALtopics/btwaangifte.htmlUT dXPBfXPux mSn0 =_A$=˰C Ѓӎbd{r)v3G=:wRԦ g[w$P͘4I }oz_gT޸t<^'BG~O{R9P;ny|@YRfM͝RKV9CA>9-i%KZ:J`-cpś+@<8ho-ψ9 J2}apm͂hy7'q5b9Kftsqa(2bP)t2j[XRGމRj1)d* ɺ[oqҔz]rK=Cm%LɄ91p4"X,-,4b 6Bd h6u_oMeH-O,8CF8T[.F-[&"{'b!龇lwRh&d>\sp3E~l{S< Ρ N q@R9oP4 ]%yPK;q2Ao7topics/grootboek.htmlUT dXPBfXPux UQN0 /_aRQ0 qۨ]9"$Sd u"C1vR_D8BGΌ"@}FOci EΨ5 eY»1S w9B\x#Fᦸ-p"r_&R/XE![4~1O!RO8̙/=[QwPbӉ4Kѩfk )r)54Ƅwq0(HL1g}шɴ2f~PK;q2A=&topics/toon.htmlUT dXPBfXPux eQR02)IAEPPE:tgz$(= oj9CB zr hSRU;ˆuTō{qZ~1|4^ܵ(wF Sj]? ZKzA:<̖zG:(d-Z\{M%`gēwHKk139X>RPK;q2Ac{ topics/rapporten.htmlUT dXPBfXPux Ko0)F9%EZU9$U> pږ=PO4ʽ'yZOsZu{Ȗ; K`D?q ̨5ظ5f/Ie Pݱ]A˥=cQ|F@hDB,%Flʢ(JD5 W a$B+`r|b5iDu ]Tق;K&dlB8DoWu,dJg$҈tb # rh!i5E$J{Ǎ%V!6mΆU0F5>}YRz=ca߉/EuT\~ &jK"^9!n=e$RV!HB~Uco3t@i7ix;x|}IRCi~l+PK;q2Af-topics/import.htmlUT dXPBfXPux uQMO1=_xJBdc6PҸm7mA;%x޼B63m:c6"<͊T$D3]KLyA*fBCK";K?sC6c Q|Gn1jl7%+4JA#=wH ƿ3ć,' 5t& r]n*nzT. /ŪVyUB,wSy圇l\(2%D2U9>Y5A$bG 3xtQ}{)XdPK;q2A~otopics/relatie.htmlUT dXPBfXPux mQN0<_M(&8 n<m܄w$zvg<3YS1Z2a!{Fulp ump@1BQqx#3}.l4q:6a/EE͙8ml׳>EݣE㢉ѹb}Z+n) YǝRFp WXjEx E<騦˫${kBL|.Ojq{N?5YPK;q2AQtopics/balans.htmlUT dXPBfXPux M1r0 Ekw$eP)IN8k,q8%$)'}sCa2&ODw .Wcv4j3cjz`[Gs1/u퐕NgRF=Uq. f jx:3p/) wa {iqliKRlJ-ۂMMƴvҧ-)0$S9e !<9F .tdZpef}D٨>@Tˇ?PK;q2A^topics/openstaand.htmlUT dXPBfXPux ]1o g+NSԡsvjb^Cg⡿@$ꂸOSR N"”킌C$$ )yE“1̚d۲*|ƼUdltRӼ*^pa^^ּc@U"4/Pu'U\˗X((Z8qtٶ,#ȇXR.hsNۖ?0PK;q2ARzxtopics/adm_btwperiode.htmlUT dXPBfXPux U]N0}Q\q@mI⦱eHcၧ}Ls; goJ9зU=<ƁT"iq㚳b!E^6W&&Dq̛KjsOr $lYCgCO7Z$,ϜoI9<wU6-C7VKӐulokl PK;q2A#Wtopics/sql.htmlUT dXPBfXPux EN@ D WJu%Q8!n^g ]tšd\.ַF$c].崥s+znuYg29!VV4ꨢ0s"b87,9֛y5_̋ jIAɥfj8Ɛ2˽Y\B-zxMHRD0A8RGZ,VyPKRo>T<topics/inbedrijf.htmlUT MdXPux ?s0 Sh s)C;uu$c'\}e縆cȿdhc`o֗^vTT1LWJ}9P[퐡 `x[Xm[0T?CB1M4LP|WCvqZv|Ww)wuMn094F'Q6PK;q2Atopics/crediteuren.htmlUT dXPBfXPux Mn0 Dg+B1/hvj/YhCtǃvJ*ah;E~6glT"!Hf뮉f%0?zm =j$;dUx~'=Q]t6eJ.ee+^jʗu ]KDsqDE192]A9Fmiv>mS*&(t@^%Da 3H3V8%8}( oBH]UNd>[9+Ylɿf1ZG>e/?hO/dNpL kAy._QdolEt""K??Y|PK;q2A揦'(_topics/journaal.htmlUT dXPBfXPux }RKO0 >7 $F9Ю!^Gd;&e08Uv:e (=2uѾ >cLµRpk;*Nߪv)wa=1x`lk~X x!Obw-P84 'pY겗 R1[Jӕ_ ebDQU\A "ޡ8se|A E n.t$jٜQғ~GɥJ=YOlv`SCnѝjݢ#F{lF((FwW#QPK;q2A&[7topics/kas.htmlUT dXPBfXPux =o0WdG)KǮU`aL_tv{B bwybb v_XӷZ7aOh1@ym~[/JT80GR׌:GiFSWv;f(e[_@Ȼlufur8( 6tqf4.akA<#ZhrL^`k1"bhA~DgZ8m,4+~˹ =T ~ 4t)g3J$@,u„1#֛ٝ1|ꄇYܲCFzU %@^ L<;̱ ([Y0jjf=!,QmoPK;q2A{topics/verwijder.htmlUT dXPBfXPux En0 )^]\u𽱂Q0 ݧBYR+L+% u] WFHl 't3w6\p`eTW~:T>w6_[Eo!)YiqnV\%ć  EÓJf2GIKAgGn{mС9Us NP٘mrAF;̼HQ|]PK;q2Atopics/verkoop.htmlUT dXPBfXPux un0DrP`C/ZG"Um3;~;14 3O޴yg$F@ϺEBޅբ"("4[֫8D9i2<ΟWRÖ(GvEgLȽ3ˣ_h}Jn?Gmp=3e+BIY];1O='@tמʼtV̻|Bn2^?PK;q2Ao_Latopics/dagboeken.htmlUT dXPBfXPux ).)KKILOONͳчpڅ()dfd*%)$'gdf'%*uqq) x\6 \PK;q2Aj̾5;_topics/export.htmlUT dXPBfXPux uRN0a~I]u8l@=_z혡*5`xp De37XFIаEQN3q ;^ B{ #X eVꓢPԢQ 5l6j$qc+dN'/ yH^җI<ujU.dlX9VUerPK;q2A.atopics/result.htmlUT dXPBfXPux mQr0 evcO/dHC7fd5ҏ$ptx V46 51CGb(t;sJf8h*D>'pœw*{et3(>Ge!֊e)4La_p,_'xh5fw@m։QVEN1k M ]`J,zCkV,@ 6>.6<_1PK;q2A6+Ttopics/adm_balanstotaal.htmlUT dXPBfXPux ]RAn0 ֞)Rzﭗ*.$ҾvbxSߕ~*7:$F[ckF-@H#3V@ =%hO2ón1D7Ȯ.:[ؘ#7| Dhu8B uo0w@ 2zFh𬑹C&A&@ @P ʹ|p65 dji5Jc׽Ҟ雱[G}@vz}zlJuW9h~P5eѻFyٳ%M?IBNƷط"PK;q2AFftopics/adm_relatie.htmlUT dXPBfXPux mRN0 3(tXPڸmMR9iOnzPcsSXI8PW;LXغε1@1lLsLW k Mb 8H^ RMyu%Yh>BdvDW k&GK^O{H[neb]jdBVR܁K\u_U[{˸+36;vMb1Gܵ],xɞCd{~*NCCH3$& C^)=6 r()pb]_D1˄t,S tct֮t%gPK;q2AU}Vtopics/adm_balans.htmlUT dXPBfXPux Ur0 D{&u~d ^@،1}}dpXVO5xgZѓkU%U-;nU[y2 Pߏ]:{IYv|(u6QZÁQz0;yl`HzD㝯Vimi? ZOe K>oScWnLHI^}ch2s;ڂ9Yg&T &I^7fGG3[T\>EIu[) *_{^$;e"(9/4v՜cO{?Zw*՗U^K.K/n CՒ 9wDt ="AyCEJ S?-;*f[.i/<29Q8ݣx Ct&j_/.ks@+A+VGQ`Lݻ.v<Xm3c&R(M};S3sKzEW,sbeWwm=kuȐ t3L8 65ʓ^!]J FDɏLbTnXivp\3euK2@r.Tc $9LsF ӗL( qh/IN~qv}9 lDD$ߤLJ^LAk߈A>0;8gNUPKRo>;topics/postbank.htmlUT MdXPux r0 )4\о@^A˜8Vv+[~RS`ov-Ti_QPeh3P11u5XMs|qV `>`eurp M<֛!C)# s  Qfc##`C.bQQN^P6QE+;6Wλ%PMU,zyEшTꃽLѭ3% 1j ((HmmfcKct߁!2'jLjDnaQF^Gٸi0rSmk p١5=*7y/PK;q2AA Ltopics/include.htmlUT dXPBfXPux =0 D+mwub`@CڜB8ߧ移4KjsohdǨV$D{엠mm䛢ݾAr(*,ӹ̯8u#39c^ U2>PK;q2AQtopics/jaareinde.htmlUT dXPBfXPux mRM0=_1?Wl=j&1Q@}PO9IlsBcp t"nvzz[DZ$y}p-!N)30pOA^鳀r y8msvνk'>3d$ e @QRF|&N)24sI[ڥ[0*`FW 6[Q&яJ2i-aseD:q$+bI!J [_AƬ{[ӇselاKUhNYrڣ 1(]SU_T\Z說jŝrM=EZ Wz w G۲dcb$4{9*ؠ-;~PK;q2ATztopics/adm_boekjaarcode.htmlUT dXPBfXPux en0 w=toKXgN>}%'Ft(>JbCWNMΊxF#4yУ.1*0 Jgʊ9gw.-'x4LF3<+M0.PƖTh|tm.gO!ſXY YC2$K:ҜнIөz7m_KJl -;С)'sy7]ᤫ>! +^Ѿge<꽬JomuTPK;q2Aչ7topics/bank.htmlUT dXPBfXPux 0E+QbV _LcG'h~y -z|6rPh_)Py8|]E'HlMSm@{Qk>L.ǽգNQ١nW.o}혡5dB8\xl`N8:Y Dmh0eDkAڃwE/g5Tl/ {qWJ+"DE1H  4Aٯ)QW̟LyH^җ{y =y5NNsU/]]$5[ҁ?PK;q2ANDFDYtopics/database.htmlUT dXPBfXPux ).)KKI,ILJ,Nч pڅ(*%&*%) 0=z\\ p>H#PK;q2A]ف]}topics/boekjaar.htmlUT dXPBfXPux =̻ 0 Sx9 9bdB$_Vr ރdw̹h-$u* O732ڭGK,PK;q2AnQNtopics/debiteuren.htmlUT dXPBfXPux Mn0 D+B1/hfj/YhCtǃvJ*o:\\"nI$$ uh@ͅ'HL˛W9tYUUt6m_J.#]}U V~ͬDžk7mKDsvWK6eJ|:Pn4(ǽry\ im "J{ c\r:%ȷ[?PK=s2AFc yearend.htmlUT VhXPVhXPux Wێ6}W* v7ؠiM>8iQJRv /  .CΙ3gfb[N=O)]!u9O3_Oҧdoow_a$|ee|[+WYv:k_Efk^*FOhkО{ lE#2Ƿ5Ojex2y螜f+^F|dyYe pًh=xws}V弨JkZ-Ě಼rxfРٖk_Khw,G.6[D5\ku fl-cOv m X ֙%.1 koL:Bd\9&0a;|[X.j2 X+PrSA=e +ST#,wj 2eE5'b.<ł~-`NF&[Z 2ۢXzځl˃g`eg_PrB7_lzf[nt5꜄; r9dH0|h,$쇝*Jw2j;MH ‡-]\>xm=WsON=VV~5]VV5`(2ꭄe)=FE⮉ WA2f+pLx-rœؓH)uO9Áտ:+PyOJNd ,F3 \/4)YO&N!B۵iiI q%d Z9Pcۑ홢;^fS֟ ϗ'mRɤ *s Rr R8*EBSFz 8oqITx{5ë>Qx*Q8I.7P(XMFsMD+KH)`&(NSPkEk^u5#M"F=O˧"`* 7O&Aߣy`@Yc4O4 %a?bUum2`{qj_ v\UAIP;jy^kZ܍^,udQ%(R߂q(7qG-.FQ&L\4N="7*<#OFh{R<>qX`pues\֭y8[>:kno{E|dO PK o> Abookings/UTȳMux PK=s2AŹtbookings/oneline.ttUTȳMux PK=s2A1 ]zbookings/btw.htmlUTVhXPux PKYs2AE6  bookings/payable.htmlUThXPux PKo> g+bookings/refcode.ttUTȳMux PKYs2A &-bookings/bank.htmlUThXPux PKYs2A[Bi 9commands.htmlUThXPux PK=s2A5C }:config.htmlUTVhXPux PK Ro>ANcss/UTMux PKRo>UY 5Ocss/site.cssUTMux PKRo>Ivo (Qcss/cheat.cssUTMux PK=s2AV Qdate.htmlUTVhXPux PKRo>/jݗvV  Udetails.htmlUTMux PK>[.hdocs.hhcUTc3Mux PKRo>CKfmdocs.hhkUTMux PKo>eQ_mdocs.hhpUTȳMux PK Ro>ABnebshell/UTMux PK=s2Ak;$nebshell/commands.htmlUTVhXPux PK=s2A+9 [vebshell/clo.htmlUTVhXPux PK=s2A&B O{ebshell/files.htmlUTVhXPux PK=s2A8fit}ebshell/index.htmlUTVhXPux PK Ro> A)ebwxshell/UTMux PKRo>H--IoOmebwxshell/ebwxshell.pngUTMux PK=s2Ap]ebwxshell/clo.htmlUTVhXPux PK=s2A Uebwxshell/files.htmlUTVhXPux PK=s2A`mC7ebwxshell/index.htmlUTVhXPux PK Ro>8oIL?ebwxshell/button-ok.pngUTMux PK Ro>Debwxshell/button-edit.pngUTMux PKRo>fHCIebwxshell/edit.pngUTMux PK Ro>A'images/UTMux PK=s2A!v) S'index.htmlUTVhXPux PK=s2A{a +inex.htmlUTVhXPux PK Ro>A3install/UTMux PK=s2A]ۘe+4install/index.htmlUTVhXPux PK Ro>A6intro/UTMux PKRo>L %O6intro/schema.datUTMux PK=s2AKl aCintro/working.htmlUTVhXPux PK=s2A`ܮMintro/backups.htmlUTVhXPux PK=s2A aNQintro/index.htmlUTVhXPux PKRo>!XL Uintro/mutaties.ebUTMux PKRo>XBZV_intro/relaties.ebUTMux PKRo>?3Faintro/opening.ebUTMux PKRo>vQ*dintro/eekboek.confUTMux PKRo>O8  hix.htmlUTMux PKRo>9I'kkop.htmlUTMux PK;q2A^#a¬ llicense.htmlUTdXPux PK=s2Al2#us pperiod.htmlUTVhXPux PK Ro>Asreports/UTMux PKYs2AXkG sreports/grootboek.htmlUThXPux PKYs2A7N 1t|reports/unpaid.htmlUThXPux PKYs2Avo˃reports/proef.htmlUThXPux PKYs2A~( g׊reports/balans.htmlUThXPux PKYs2AȆ)_reports/crediteuren.htmlUThXPux PKYs2AX< reports/index.htmlUThXPux PKYs2AŠXreports/journaal.htmlUThXPux PK=s2A/k7Oreports/open.htmlUTVhXPux PKYs2Aĺ:=reports/result.htmlUThXPux PKYs2A*B U(reports/btw.htmlUThXPux PKYs2A=dAureports/debiteuren.htmlUThXPux PK Ro>Asetup/UTMux PK=s2A(G:,Gsetup/schema.htmlUTVhXPux PK=s2A9Csetup/mutaties.htmlUTVhXPux PK=s2Aҝ2k0 osetup/relaties.htmlUTVhXPux PK=s2A2~Xs'setup/index.htmlUTVhXPux PK=s2ABܷ setup/config.htmlUTVhXPux PK=s2AR3 setup/opening.htmlUTVhXPux PK=s2A\ޑesetup/init.htmlUTVhXPux PK=s2AY=n* stdacc.htmlUTVhXPux PK lp>Atopics/UTRMux PK;q2A, ;x"4topics/schema.htmlUTdXPux PK;q2ALtopics/btwaangifte.htmlUTdXPux PK;q2Ao7[topics/grootboek.htmlUTdXPux PK;q2A=&topics/toon.htmlUTdXPux PK;q2Ac{ 5 topics/rapporten.htmlUTdXPux PK;q2Af-D topics/import.htmlUTdXPux PK;q2A~o topics/relatie.htmlUTdXPux PK;q2AQtopics/balans.htmlUTdXPux PK;q2A^Otopics/openstaand.htmlUTdXPux PK;q2ARzxtopics/adm_btwperiode.htmlUTdXPux PK;q2A#Wtopics/sql.htmlUTdXPux PK;q2Aa}topics/proefensaldibalans.htmlUTdXPux PKRo>T< topics/inbedrijf.htmlUTMux PK;q2Atopics/crediteuren.htmlUTdXPux PK;q2Altopics/inkoop.htmlUTdXPux PK;q2A`x8topics/adm_naam.htmlUTdXPux PK;q2A}&topics/periodes.htmlUTdXPux PK;q2A揦'(_[topics/journaal.htmlUTdXPux PK;q2A&[7topics/kas.htmlUTdXPux PK;q2AYQtopics/adm_begindatum.htmlUTdXPux PK;q2A{topics/verwijder.htmlUTdXPux PK;q2Atopics/verkoop.htmlUTdXPux PK;q2Ao_La!topics/dagboeken.htmlUTdXPux PK;q2Aj̾5;_!topics/export.htmlUTdXPux PK;q2A"7:*#topics/memoriaal.htmlUTdXPux PK;q2A.a$topics/result.htmlUTdXPux PK;q2A6+T%topics/adm_balanstotaal.htmlUTdXPux PK;q2AFft'topics/adm_relatie.htmlUTdXPux PK;q2AU}V+)topics/adm_balans.htmlUTdXPux PK;q2A  *topics/adm_open.htmlUTdXPux PKRo>;.topics/postbank.htmlUTMux PK;q2AA LC0topics/include.htmlUTdXPux PK;q2AQ$1topics/jaareinde.htmlUTdXPux PK;q2ATz2topics/adm_boekjaarcode.htmlUTdXPux PK;q2Aչ7o4topics/bank.htmlUTdXPux PK;q2ANDFDY5topics/database.htmlUTdXPux PK;q2A]ف]}6topics/boekjaar.htmlUTdXPux PK;q2AnQN-7topics/debiteuren.htmlUTdXPux PK=s2AFc f8yearend.htmlUTVhXPux PKpp"&>EekBoek-2.02.04/lib/EB/res/migrate/0000755000076500007650000000000012165465617014310 5ustar jvjvEekBoek-2.02.04/lib/EB/res/migrate/001000009001000010.sql0000444000076500007650000000376612165465617016676 0ustar jvjv-- Migratie EekBoek database van versie 1.0.9 naar 1.0.10 (EB 1.01.xx). BEGIN WORK; -- Table Dagboeken ALTER TABLE ONLY Dagboeken ADD COLUMN dbk_dcsplit BOOLEAN; ALTER TABLE ONLY Dagboeken ALTER COLUMN dbk_dcsplit SET DEFAULT false; UPDATE Dagboeken SET dbk_dcsplit = 'false'; -- Table Journal ALTER TABLE ONLY Journal ADD COLUMN jnl_damount int8; -- Table Boekstukregels ALTER TABLE ONLY Boekstukregels DROP COLUMN bsr_id; -- Table Boekstukken -- Operatie: wijzig type van bsk_id van serial naar int. -- Omdat bsk_id vanuit diverse andere tabellen wordt gerefereerd als -- foreign key moeten deze constraints eerst worden vervijderd, en -- later weer aangemaakt. ALTER TABLE ONLY Journal DROP CONSTRAINT "journal_jnl_bsk_id_fkey"; ALTER TABLE ONLY Boekstukregels DROP CONSTRAINT "boekstukregels_bsr_paid_fkey"; ALTER TABLE ONLY Boekstukregels DROP CONSTRAINT "boekstukregels_bsr_bsk_id_fkey"; -- De eigenlijke wijziging. ALTER TABLE ONLY Boekstukken ADD COLUMN temp int8; UPDATE Boekstukken SET temp = bsk_id; ALTER TABLE ONLY Boekstukken DROP COLUMN bsk_id; ALTER TABLE ONLY Boekstukken RENAME COLUMN temp TO bsk_id; ALTER TABLE ONLY Boekstukken ADD CONSTRAINT "boekstukken_pkey" PRIMARY KEY ( bsk_id ); -- Expliciete sequence. CREATE SEQUENCE boekstukken_bsk_id_seq; SELECT setval('boekstukken_bsk_id_seq', max(bsk_id)) FROM Boekstukken; -- Restore de FK constraints. ALTER TABLE ONLY Journal ADD CONSTRAINT "journal_jnl_bsk_id_fkey" FOREIGN KEY ( jnl_bsk_id ) REFERENCES Boekstukken ( bsk_id ); ALTER TABLE ONLY Boekstukregels ADD CONSTRAINT "boekstukregels_bsr_paid_fkey" FOREIGN KEY ( bsr_paid ) REFERENCES Boekstukken ( bsk_id ); ALTER TABLE ONLY Boekstukregels ADD CONSTRAINT "boekstukregels_bsr_bsk_id_fkey" FOREIGN KEY ( bsr_bsk_id ) REFERENCES Boekstukken ( bsk_id ); -- Bump version. UPDATE Constants SET value = 10 WHERE name = 'SCM_REVISION'; UPDATE Metadata SET adm_scm_revision = (SELECT int4(value) FROM Constants WHERE name = 'SCM_REVISION'); COMMIT WORK; EekBoek-2.02.04/lib/EB/res/migrate/001000015001000016.sql0000444000076500007650000000473112165465617016672 0ustar jvjvBEGIN WORK; -- Aanpassen BTW Tabel. -- Nieuwe velden: ALTER TABLE BTWTabel ADD COLUMN btw_alias varchar(10); ALTER TABLE BTWTabel ADD COLUMN btw_start date; ALTER TABLE BTWTabel ADD COLUMN btw_end date; -- Markeer 'oude' hoog-tarief. UPDATE BTWTabel SET btw_end = '2012-09-30' WHERE btw_perc = 1900 AND btw_tariefgroep = 1; -- Voeg nieuwe 'hoog' tarief toe. -- We have to use '1' for true and '0' for false to satisfy both PostgreSQL and SQLite. INSERT INTO BTWTabel (btw_id, btw_desc, btw_perc, btw_tariefgroep, btw_incl, btw_alias, btw_start, btw_end) VALUES(1024, 'BTW 21% incl.', 2100, 1, '1', 'h21', '2012-10-01', NULL); INSERT INTO BTWTabel (btw_id, btw_desc, btw_perc, btw_tariefgroep, btw_incl, btw_alias, btw_start, btw_end) VALUES(1025, 'BTW 21% excl.', 2100, 1, '0', 'h21-', '2012-10-01', NULL); -- Aanpassen Journaal. -- column jnl_bsr_seq wordt jnl_seq -- nieuwe column jnl_bsr_seq -- nieuwe column jnl_type -- SQLite cannot rename a column... ALTER TABLE Journal RENAME TO tmp_Journal; CREATE TABLE Journal ( jnl_date date not null, -- boekstukdatum jnl_dbk_id varchar(4) references Dagboeken, jnl_bsk_id int not null references Boekstukken, jnl_bsk_ref text, jnl_bsr_date date not null, -- boekstukregeldatum jnl_bsr_seq int, -- boekstukregelvolgnummer jnl_seq int not null, -- volgnummer journaalregel jnl_type smallint, -- 0 = primary, 1 = derived (VAT, ...), ... jnl_acc_id int references Accounts, jnl_amount int8, -- total amount jnl_damount int8, -- debet portion jnl_desc text, jnl_rel CHAR(10), jnl_rel_dbk varchar(4) references Dagboeken, CONSTRAINT "jnl_fk_rel" FOREIGN KEY (jnl_rel, jnl_rel_dbk) REFERENCES Relaties, UNIQUE(jnl_bsk_id, jnl_dbk_id, jnl_seq) ); INSERT INTO Journal (jnl_date, jnl_dbk_id, jnl_bsk_id, jnl_bsk_ref, jnl_bsr_date, jnl_bsr_seq, jnl_seq, jnl_type, jnl_acc_id, jnl_amount, jnl_damount, jnl_desc, jnl_rel, jnl_rel_dbk) SELECT jnl_date, jnl_dbk_id, jnl_bsk_id, jnl_bsk_ref, jnl_bsr_date, NULL, jnl_bsr_seq, NULL, jnl_acc_id, jnl_amount, jnl_damount, jnl_desc, jnl_rel, jnl_rel_dbk FROM tmp_Journal; DROP TABLE tmp_Journal; ALTER TABLE Journal ADD CONSTRAINT "jnl_type" CHECK(jnl_type >= 0 AND jnl_type <= 1); -- Bump version. UPDATE Constants SET value = '16' WHERE name = 'SCM_REVISION' AND value = '15'; UPDATE Metadata SET adm_scm_revision = (SELECT int2(value) FROM Constants WHERE name = 'SCM_REVISION'); COMMIT WORK; EekBoek-2.02.04/lib/EB/res/migrate/001000010001000011.sql0000444000076500007650000000256112165465617016657 0ustar jvjvBEGIN WORK; -- Drop foreign keys to Relaties. ALTER TABLE Boekstukregels DROP CONSTRAINT "boekstukregels_bsr_rel_code_fkey"; ALTER TABLE Journal DROP CONSTRAINT "journal_jnl_rel_fkey"; -- Drop primary key Relaties. ALTER TABLE Relaties DROP CONSTRAINT "relaties_pkey"; -- New PK constraint for Relaties. ALTER TABLE Relaties ADD CONSTRAINT "relaties_pkey" PRIMARY KEY (rel_code, rel_ledger); -- Add column bsr_dbk_id for Boekstukregels. ALTER TABLE Boekstukregels ADD COLUMN bsr_dbk_id VARCHAR(4) REFERENCES Dagboeken; -- Fix FK to Relaties. ALTER TABLE Boekstukregels ADD CONSTRAINT "bsr_fk_rel" FOREIGN KEY (bsr_rel_code, bsr_dbk_id) REFERENCES Relaties; -- Fill. UPDATE Boekstukregels SET bsr_dbk_id = ( SELECT rel_ledger FROM Relaties WHERE rel_code = Boekstukregels.bsr_rel_code ); -- Add column jnl_rel_dbk_id for Journal. ALTER TABLE Journal ADD COLUMN jnl_rel_dbk VARCHAR(4) REFERENCES Dagboeken; -- Fix FK to Relaties. ALTER TABLE Journal ADD CONSTRAINT "jnl_fk_rel" FOREIGN KEY (jnl_rel, jnl_rel_dbk) REFERENCES Relaties; -- Fill. UPDATE Journal SET jnl_rel_dbk = ( SELECT rel_ledger FROM Relaties WHERE rel_code = Journal.jnl_rel_dbk); -- Bump version. UPDATE Constants SET value = '11' WHERE name = 'SCM_REVISION' AND value = '10'; UPDATE Metadata SET adm_scm_revision = (SELECT int2(value) FROM Constants WHERE name = 'SCM_REVISION'); COMMIT WORK; EekBoek-2.02.04/lib/EB/res/migrate/001000013001000014.sql0000444000076500007650000000102712165465617016661 0ustar jvjvBEGIN WORK; -- ONLY: SQLite SELECT * INTO TEMP TAccounts FROM Accounts WHERE acc_id = 0; ALTER TABLE Accounts ADD COLUMN acc_dcfixed boolean; -- fixed d/c -- ONLY: SQLite ALTER TABLE TAccounts ADD COLUMN acc_dcfixed boolean; -- fixed d/c UPDATE Accounts SET acc_dcfixed = 'f' WHERE acc_balres; -- Bump version. UPDATE Constants SET value = '14' WHERE name = 'SCM_REVISION' AND value = '13'; UPDATE Metadata SET adm_scm_revision = (SELECT int2(value) FROM Constants WHERE name = 'SCM_REVISION'); COMMIT WORK; EekBoek-2.02.04/lib/EB/res/migrate/001000014001000015.sql0000444000076500007650000000046612165465617016671 0ustar jvjvBEGIN WORK; ALTER TABLE Boekstukregels ADD COLUMN bsr_ref text; -- reference -- Bump version. UPDATE Constants SET value = '15' WHERE name = 'SCM_REVISION' AND value = '14'; UPDATE Metadata SET adm_scm_revision = (SELECT int2(value) FROM Constants WHERE name = 'SCM_REVISION'); COMMIT WORK; EekBoek-2.02.04/lib/EB/res/migrate/001000011001000012.sql0000444000076500007650000000052312165465617016655 0ustar jvjvBEGIN WORK; ALTER TABLE Boekstukken ADD COLUMN bsk_ref TEXT; ALTER TABLE Journal ADD COLUMN jnl_bsk_ref TEXT; -- Bump version. UPDATE Constants SET value = '12' WHERE name = 'SCM_REVISION' AND value = '11'; UPDATE Metadata SET adm_scm_revision = (SELECT int2(value) FROM Constants WHERE name = 'SCM_REVISION'); COMMIT WORK; EekBoek-2.02.04/lib/EB/res/migrate/001000012001000013.sql0000444000076500007650000000173712165465617016667 0ustar jvjvBEGIN WORK; ALTER TABLE Standaardrekeningen ADD COLUMN std_acc_btw_vp int references Accounts; -- BTW verkoop priv ALTER TABLE Standaardrekeningen ADD COLUMN std_acc_btw_ip int references Accounts; -- BTW inkoop priv ALTER TABLE Standaardrekeningen ADD COLUMN std_acc_btw_va int references Accounts; -- BTW verkoop anders ALTER TABLE Standaardrekeningen ADD COLUMN std_acc_btw_ia int references Accounts; -- BTW inkoop anders INSERT INTO Constants (name, value) VALUES ('BTWTARIEF_PRIV', '3'); INSERT INTO Constants (name, value) VALUES ('BTWTARIEF_ANDERS', '4'); ALTER TABLE ONLY BTWTabel DROP CONSTRAINT "btw_tariefgroep"; ALTER TABLE ONLY BTWTabel ADD CONSTRAINT "btw_tariefgroep" CHECK (btw_tariefgroep >= 0 AND btw_tariefgroep <= 4); -- Bump version. UPDATE Constants SET value = '13' WHERE name = 'SCM_REVISION' AND value = '12'; UPDATE Metadata SET adm_scm_revision = (SELECT int2(value) FROM Constants WHERE name = 'SCM_REVISION'); COMMIT WORK; EekBoek-2.02.04/lib/EB/res/migrate/001000008001000009.pl0000444000076500007650000000406612165465617016513 0ustar jvjv# -- Migratie EekBoek database van versie 1.0.8 naar 1.0.9 (EB 0.92). package main; our $cfg; our $dbh; package EB::DatabaseMigrator; use strict; use warnings; use EB; use EB::Tools::SQLEngine; my $en = EB::Tools::SQLEngine->new(dbh => $dbh->dbh, trace => $cfg->val(qw(internal trace_migration), 0)); $en->process(<trace($cfg->val(qw(internal trace_migration), 0)); my $sth1 = $dbh->sql_exec("SELECT dbk_id". " FROM Dagboeken". " WHERE dbk_type = ? OR dbk_type = ?", DBKTYPE_BANK, DBKTYPE_KAS); while ( my $rr1 = $sth1->fetchrow_arrayref ) { my ($dbk_id) = @$rr1; my $sth3 = $dbh->sql_exec("SELECT bky_code FROM Boekjaren"); while ( my $rb = $sth3->fetchrow_arrayref ) { my $bky = $rb->[0]; my %saldi; my %amt; my $sth2 = $dbh->sql_exec("SELECT bsk_nr,bsk_amount,bsk_saldo". " FROM Boekstukken". " WHERE bsk_dbk_id = ?". " AND bsk_bky = ?", $dbk_id, $bky); while ( my $rr2 = $sth2->fetchrow_arrayref ) { $amt{$rr2->[0]} = $rr2->[1]; $saldi{$rr2->[0]} = $rr2->[2]; } $sth2->finish; foreach my $bsk_nr ( keys(%saldi) ) { if ( exists $saldi{$bsk_nr-1} ) { warn("SALDO MISMATCH: dbk=$dbk_id nr=$bsk_nr -- PLEASE REBUILD DATABASE\n") unless $saldi{$bsk_nr-1} == $saldi{$bsk_nr} - $amt{$bsk_nr}; $dbh->sql_exec("UPDATE Boekstukken". " SET bsk_isaldo = ?". " WHERE bsk_nr = ?". " AND bsk_dbk_id = ?". " AND bsk_bky = ?", $saldi{$bsk_nr-1}, $bsk_nr, $dbk_id, $bky)->finish; } else { $dbh->sql_exec("UPDATE Boekstukken". " SET bsk_isaldo = bsk_saldo - bsk_amount". " WHERE bsk_nr = ?". " AND bsk_dbk_id = ?". " AND bsk_bky = ?", $bsk_nr, $dbk_id, $bky)->finish; } } } } $en->process(<MZ%Z#Z=Z,[!A[%c[ [ [[[%[ [['\(6\4_\ \a\ ]#]+6]b]q]*w]*]>] ^ ^G'^$o^)^>^$^'"_!J_$l_#_=_F_::`<u`&`2`& a>3a.ra7a2aG b.Tb"b'b/b.b+-c%YccDeJe1Se eeee e;e<f!Yfe{f fOg@Rggg?ghh: h[hshhhhhhhiZ&ii&ijiN%j!tjIjj(jk 0k1=k.ok.k=k llA.m@pmDmFm-=n)knMnn6n)o8(qaqpqqqq'q(q(q("r4Kr#r3r9r4s(Gs;ps!s-s.s;+tgtttNtrtfx=z LzZze {h{8{%(|N|,|}3=}q}}}&}G})"~7L~)~~~~$~*4H }&  6'^$e  Ҁ7A/^.$: *I:X5ɂr&A<41Hz=#D'h,!Ď:!$)2CGZE_ɏߏ :  {%ED/H"x.2ʒ + /.:'iÓ ߓ(43],”)I^#y#"LD1vĖ Tb-sC**AX$u(*ٚ$<;UBԛ"I)!s#Ԝ%$EC+)7/F)v0#*'@hɟ%؟)(-Mc"ʠ0ݠ' 6W8f5)ա00A I?V8.Ϥ('07O"ȥ + 4/?+o,,Ȧ+ 7 >I.h$DϧUNj+N*4._+2ɩ16$?Id5$- +73c իܫD3S ( $ǯð"߰^a 1$2W I S`hw ~(%' & .;1[! tUh33Mg:^43DtG ;UJZB37Ke5n)-#"FN e$s9  x+12'<BW[ds   % 3@ O Z h s     3H`t)BXn !$&KRZ_fou|    + 4BWp  ) 1 >IXgv    , 8 C P^f oy}o?'5*]$W+%3YVQ.i' %%2K3~27 )0 9 E Q ]i ."HVk) 6JR[ n{ CPUAH+O {0#:75MC0 *'RJb"<$>cDh' 57@QI0J/,G,t62. :5B x   I-g 6->SZ1c "#"6""Y#|3&"* IV_h*~ ->A< ~^ ,GV/[*< @ )M+w3*$*'$RBwQL 3Y=*4$+:P$H:J4.#-#%$%J1p~/( 3"6V.b _@0 CU^-e4COa %gNMD *3 G3U00@,  4K J 6 . 1 *N Ry  1  ' 0>]s{ $1&9&`- *"!#D3h= Rdmdzy/Y!)H#r2"D$.i8!0!K1m "! #.+? ku ,C0E,v+6  +/8'hH"&"&>'C^''+'') )2)(),*L*R*Bq********G*/+H+P+g+)+!,+<,h,w, },,g,--C-@`-#---$- .#.8.=.E. H.&S.z..... .. /'/&F/1m///,//0 +0L0a0&z000<05 1C1[1p114 $4,04;]4%4444!5#$5H5^5&}555585;-6i6%6"6R67#;7(_7$7!7#7?738H8,\8(8*8*89&9/C9 s9%9%999 :!:1:!::#\::&:::::-: "; /;0=;(n;; ;1;?;/1<;a<< <<6<<5 ?-A?o?x?:??? @@@'.@V@p@ y@$@&@%@'@ A*,AWA ^AhA1AAAAA?AS BFtB&B=B( C%ICoC/C5CC3C $D!.D5PD;D$D@D*(EBSEEEEE E EEQF9`F F$F(F F F G G"G(Gq1G%II%J,J?Jz.LM yNPR6T?TWT`TqT wT&TT#T"TTU!U)U"2U*UU+U UUfFYhZ4\IK\]3_"I_l`,aCbcd d!d 0d k Ik Tk _k kk wk k kk k k k kkk kkl&lpMp\pkpzp p pp p p p p p ppqqq$q-q1qm7q?qqr"r1r Brcrwrrrr " oHs.3FBdP6$Lx q={([XaU!DaP~KkSGO%v~@x 6GUPjt!/&2tBiEZ/1kF90+WjI,n- (EdV*y3WX#^}57p cM)O\D_I Yo;^w`"K<LU:n4>s8mHE_Q%!-3^[4*].@N1JYHf{$pve2g)` ] RGSvK7uCuiu}ireAM+rbA./Wz:T#J0SonRb;kFLD-R#<&l79e8'pZ\O5=Zf| "{|| qdh> t+Vg,1: *8Yyz?z4Nhg(;QT29\ 6'w&] 5l[l)?jm~VywcmBQqA>I 0NMc'r}_J`xXC @Ta s%$,=?<bfhC --btw= BTW type: normaal, verlegd, intra, extra *** BTW type 'verlegd' wordt nog niet ondersteund *** *** BTW type 'intra' wordt nog niet geheel ondersteund *** [:nr] [ ] gevolgd door een of meer: crd [ ] (betaling van crediteur) deb [ ] (betaling van debiteur) std [ ] (vrije boeking) Controle van het eindsaldo kan met de optie --saldo=. Controle van het totale boekstukbedrag kan met de optie --totaal=. Voor deelbetalingen of betalingen met afwijkend bedrag kan in plaats van de het boekstuknummer worden opgegeven. [:nr] [ ] gevolgd door een of meer: Controle van het totale boekstukbedrag kan met de optie --totaal=. De laatste mag worden weggelaten. [:nr] [ ] gevolgd door een of meer Controle van het totale boekstukbedrag kan met de optie --totaal=. De laatste mag worden weggelaten. (balanstotaal {total}) ****** Afgebroken wegens fouten in de invoer ****** Boekstuk totaal is {act} in plaats van {exp}&Bestand&Edit invoerregel Ctrl+Enter&Hulp&Hulp...&Open Ctrl-O&Rapporten&Uitvoeren invoerregel Enter, of N om een nieuwe administratie aan te maken>-- Inkoop Verkoop Bank Kas Memoriaal--per sluit --boekjaar uit--per sluit --periode uit--periode sluit --boekjaar uit--standaard--01-01-1.234,561e kwartaal2e kwartaal3e kwartaal4e kwartaal

Voor het uitwisselen van ervaringen, vragen om ondersteuning e.d. kunt u zich abonneren op de mailing list voor gebruikers op SourceForge.

De EekBoek gebruikers houden zelf een wiki bij met tips en andere wetenswaardigheden.

EekBoek kan gratis worden gedownload en gebruikt. Mocht u echter aanvullende wensen hebben op het gebied van ondersteuning dan kan dat ook. Squirrel Consultancy is gaarne bereid u betaalde ondersteuning te bieden, bijvoorbeeld bij het installeren van EekBoek, het opzetten van administraties, en het overzetten van uw bestaande administraties naar EekBoek. Ook kunnen specifieke uitbreidingen of aanpassingen naar uw wens worden gerealiseerd.

Voor meer informatie: info@squirrel.nl.

==== Meldingen ======== Uitvoer ====Aangemaakt door {id} op {date}Aangemaakt door {pkg} {version} op {ts}Aangifte {per} komt niet overeen met de BTW instelling van de administratie ({admper})AangifteperiodeAangifteperiode voor de BTWAanmaken een of meer nieuwe relaties. relatie [ ] { } ... Opties: --dagboek= Selecteer dagboek voor deze relatie Aanmaken {cfg}: Aanmaken {sql}...Aantal te bewaren regels invoer historie:AdministratieAdministratie verwijderen?AdministratiekeuzeAdministratienummerAdministratieve gegevensAdresAfgebroken!AfrondingsmethodeAfsluiten Ctrl-QAfsluiting boekjaar {bky}AlgemeenAlle rapport-producerende opdrachten kennen de volgende opties: --per= De einddatum voor de rapportage. (Niet voor elke opdracht relevant.) Zie "help periodes" voor details. --periode= De periode waarover de rapportage moet plaatsvinden. (Niet voor elke opdracht relevant.) Zie "help periodes" voor details. --output= Produceer het rapport in dit bestand Uitvoertype is afhankelijk van bestandsextensie, bv. xx.html levert HTML, xx.txt een tekstbestand, xx.csv een CSV, etc. --gen- Forceer uitvoertype (html, csv, text, ...) Afhankelijk van de beschikbare uitvoertypes zijn ook de kortere opties --html, --csv en --text mogelijk. (Let op: --gen-XXX, niet --gen=XXX) --page= Paginagrootte voor tekstrapporten. Antwoordt 'ja' of 'nee' a.u.b.B&ewerkenBTWBTW BTW %BTW 0%BTW AangifteBTW Afr. BTW aanduiding "{spec}" kent meerdere tariefcodes: {list} (code {code} "{desc}" is gebruikt)BTW aangifte periode sluit niet aan bij de vorige aangifteBTW betaaldBTW correctiesBTW rek. nr. {acct}, correctie van {amt} uitgevoerdBTW tarief {id}: geen percentage en de tariefgroep is niet "{none}"BTW tarief {id}: onbekende info "{info}"BTW toepassenBTW toepassen is niet mogelijk op een neutrale rekeningBTW toepassen op deze administratieBTW-code: {code} aangepast naar {new} i.v.m. de boekingsdatumBTW-code: {code} is niet meer geldig op de boekingsdatumBTW-code: {code} is nog niet geldig op de boekingsdatumBalansBalansrekening {acct}, saldo aangepast met {exp}Balansrekening {acct}, saldo aangepast naar {exp}BankBedragBedrijfsgegevensBegindatumBegindatum {year} komt in de toekomst te liggenBeginsaldoBeginsaldo komt niet overeen met het eindsaldo van de voorgaande boekingBeginsaldo: {bal}Beschikbare administratiesBeschikbare administraties in {dir}:Bestand "{file}" is niet beschikbaar ({err})Bestand "{file}" ontbreekt ({err})BetaaldBetaling {rel} {amt} voldoet de open posten {amtss} en {amts}BeveiligingBeveiliging voor MS Vista uitschakelenBevestigingBevestiging: {state}Boekhoudkundig residu debet = {rdeb}, credit = {rcrd}Boeking BoekingenBoekingen met BTW zijn niet mogelijk in een memoriaal. De BTW is op nul gesteld.Boekingsdatum valt niet binnen het boekjaarBoekingsreferentie moet tenminste één niet-numeriek teken bevatten: {ref}Boekjaar voor deze sessie: {bky} ({desc})Boekjaar {bky} is definitief afgeslotenBoekjaar {bky} is reeds definitief afgeslotenBoekjaar {code} is gesloten, er kan niet meer in worden gewijzigdBoekjaar-code {year} bestaat al ({desc}Boekjaarcode "{code}" is reeds in gebruikBoekstukBoekstuk is niet in balans (verschil is {diff})Boekstuk {bsk} is in gebruik door {lst}Boekstuk {bsk} is reeds in gebruikBoekstuk {bsk} niet verwijderdBoekstuk {bsk} verwijderdBoekstuk {nr}Boekstuk/GrootboekBoekstuk/regelBoekstukNrBoekstukken in voorafgaande boekjaren moeten verplicht worden voorzien van een boekstuknummerCONSISTENTIE-VERIFICATIE STANDAARDREKENINGEN MISLUKTCSV rapportenCodeConfiguratiebestandConfiguratiefout: [format]numwidth moet een getal zijnConfiguratiefout: ongeldige waarde voor {item}Controleer automatisch op nieuwe versiesControleren op nieuwe versies...CreditCrediteurCrediteur {code} -> {acct} ({desc}), dagboek {dbk}CrediteurenCrediteurenadministratieDE IMPORT IS NIET UITGEVOERDDE OPENING IS NIET UITGEVOERD!Dagboek naam "{dbk}" is niet toegestaan.Dagboek {dbk} implicieert {typ1} maar {acct} impliceert {typ2}Dagboek {id} heeft geen tegenrekeningDagboek {id} onbekend type "{type}"Dagboek {id}: :dc is alleen toegestaan voor Kas en BankboekenDagboek {id}: het :rekening nummer ontbreektDagboek {id}: het :type ontbreektDagboek {id}: onbekende info "{info}"Dagboek {nr}DagboekenDatabaseDatabase Test ResultaatDatabase journal voor {db} verwijderdDatabase naamDatabase probleem: {err}Database sequences voor {db} verwijderdDatabase server host, indien niet lokaalDatabase server netwerk poort, indien niet standaardDatabase typeDatabase type {drv} ondersteunt niet het import commando. Gebruik de --import command line optie.Database userDatabase verbindingsprobleem: {err}Database {name} is niet in UTF-8 maar {enc}Database: {db}DatumDatum {date} valt niet vóór het boekjaarDatum {per} valt na de huidige datum {now}Datum {per} valt vóór het begin van de administratie {begin}Datum: {date}DatumformaatDe "D" of "C" toevoeging aan het rekeningnummer is hier niet toegestaanDe BTW periode is nog niet opgegevenDe aangifteperiode voor de omzetbelastingDe administratie is gesloten en kan niet meer worden gewijzigdDe administratie is nog niet geopendDe administratie is nog niet in gebruikDe administratie is reeds geopendDe administratie is reeds in gebruikDe begindatum is nog niet opgegevenDe begindatum. Het boekjaar begint op 1 januari van dit jaar.De boekingsdatum valt in de periode waarover al BTW aangifte is gedaanDe boekingsdatum {date} valt na het einde van dit boekjaarDe boekingsdatum {date} valt vóór aanvang van dit boekjaarDe database wordt aangemaakt en gevuldDe database wordt aangepast aan de nieuwere versieDe gewenste bestanden zijn aangemaakt.De migratie is mislukt. Gelieve de documentatie te raadplegen.De mutatiegegevens ontbreken in bestand {file}De naam van de aan te maken database, b.v. "admin2009".De naam van de administratie is nog niet opgegevenDe netwerkpoort waarop de database server luistert, indien niet lokaal.De omschrijving van de boekstukregel ontbreektDe openingsbalans is niet correct!De openingsbalans is nog niet opgegevenDe openingsgegevens ontbreken in bestand {file}De relatiegegevens ontbreken in bestand {file}De uitvoer-backend kon niet worden gevondenDe user naam voor de database server.De volgende periode-aanduidingen zijn mogelijk. Indien het jaartal ontbreekt, wordt het huidige boekjaar verondersteld. 2005-04-01 - 2005-07-31 01-04-2005 - 31-07-2005 01-04 - 31-07-2005 01-04 - 31-07 1 april 2005 - 31 juli 2005 (en varianten) 1 apr 2005 - 31 jul 2005 (en varianten) apr - jul k2 (tweede kwartaal) april 2003 (01-04-2003 - 30-04-2003) april (01-04 - 30-04 boekjaar) m4 (vierde maand) jaar (gehele boekjaar) DebetDebiteurDebiteur {code} -> {acct} ({desc}), dagboek {dbk}DebiteurenDebiteuren en CrediteurenDebiteurenadministratieDemo administratieDetails...Deze administratie kent geen koppeling voor inkoopboekingenDeze administratie kent geen koppeling voor verkoopboekingenDeze administratie voert geen BTWDeze boeking valt in de periode waarover al BTW aangifte is gedaan en kan niet meer worden verwijderdDeze herinnering niet meer tonenDeze opdracht is onvolledig. Gebruik de "help" opdracht voor meer aanwijzingen.Deze opdracht is vervallen. Gebruik in plaats daarvan "export". Directory {dir} bestaat nietDit is {pkg} [{name} {version}]Dit overzicht is ter referentie, de boeking is niet uitgevoerd!DoorgaanDriverDruk op 'Voltooien' om de volgende bestanden aan te maken:Dubbel: BTW tarief {id}Dubbel: dagboek {dbk}Dubbel: hoofdverdichting {vrd}Dubbel: rekening {acct}Dubbel: verdichting {vrd}EekBoekEekBoek MiniAdm SetupEekBoek UpdateEekBoek VoorbeeldadministratieEekBoek is VRIJE software, ontwikkeld om vrij over uw eigen gegevens te kunnen beschikken.EekBoek opstartenEekBoek versie x.yy.zz is beschikbaar.EekBoek versie x.yy.zz is beschikbaar. U wordt aangeraden de release notes te lezen en daarna te ugraden.Een korte, unieke aanduiding van deze administratie, bijvoorbeeld "admin2009".Een nieuwe administratie aanmakenEen omschrijving van deze administratie, bijvoorbeeld "Boekhouding 2009".Eigen uitbreidingenEindbalans bij afsluiting boekjaar {bky}Einde {pkg} schemaEinde {what}Er bestaat al een administratie met code "{code}"Er bestaat al een administratie met deze code.Er bestaat al een administratie met deze naam.Er is een probleem opgetreden. Raadplaag uw systeembeheerder.Er is een verschil van {amount} tussen de berekende en werkelijk afgedragen BTW {type}. Voor de aangifte is de werkelijk afgedragen waarde gebruikt.Er is een verschil van {amount} tussen de berekende en werkelijk ingehouden BTW. Voor de aangifte is de werkelijk ingehouden waarde gebruikt.Er is geen boekjaarcode opgegeven, de waarde {val} wordt gebruiktEr is geen nieuwe BTW periode opgegeven, deze blijft ongewijzigdEr is {amt} te veel aan openstaande {dc} (rekening {acct}) opgegevenEr is {amt} te weinig aan openstaande {dc} (rekening {acct}) opgegevenEr wordt gebruik gemaakt van een bankrekeningEr zijn geen openstaande posten opgegevenEr zijn openstaande posten opgegeven, maar geen corresponderende balanspostenEven geduld...Export van dataset {db} aangemaakt door {id} op {date}Exporteert de complete administratie. export [ ] Opties: --file= Selecteer uitvoerbestand --dir= Selecteer uitvoerdirectory --xaf= Export XML Auditfile Financieel --boekjaar= Selecteer boekjaar (alleen met --xaf) Er moet een --file, --dir of een --xaf optie worden opgegeven. De XAF export exporteert altijd één enkel boekjaar. Voor de andere exports wordt altijd de gehele administratie geëxporteerd. Eventueel bestaande files worden overschreven. FOUTEN GEVONDEN IN SCHEMA BESTAND, VERWERKING AFGEBROKENFiscaal nummerFolder voor administratiesForceer wizardFormatenFoutFout bij aanmaken bestand {file}: {err}Fout bij aanmaken directory {dir}: {err}Fout bij afsluiten bestand {file}: {err}Fout bij schrijven bestand {file}: {err}Fout in de invoerregel. Controleer de " en ' tekens.Fout tijdens aanmaken {file}: {err}Fout tijdens het aanmaken van bestand {file}: {err}Fout tijdens het aanmaken van exportbestand {name}: {err}Fout tijdens het opslaan van grootboekrekening {gbk}Fout {code} tijdens het lezen van {file}Fout {status} tijdens het aanmaken van exportbestand {name}Foutieve BTW specificatie: {spec}Foutieve grootboekrekening voor {dc} ({acct})GESTOPT: Er is al een administratie aangemaaktGESTOPT: Er is al een administratie gedeeltelijk aangemaaktGUI ontwerp met {wxglade}Gaarne een boekstukGeboekt: {bsk}Gebruik voor navolgende opdrachten het opgegeven boekjaar. boekjaar Gebruik: {prog} [options] [file ...] --command -c voer de rest van de opdrachtregel uit als command --echo -e toon ingelezen opdrachten --boekjaar=XXX specificeer boekjaar --import importeer een nieuwe administratie --export exporteer een administratie --dir=XXX directory voor im/export --file=XXX bestand voor im/export --titel=XXX omschrijving voor export --init (re)creëer administratie --help deze hulpboodschap --ident toon identificatie --verbose geef meer uitgebreide information Voor experts: --config=XXX -f specificeer configuratiebestand --nostdconf -X gebruik uitsluitend dit configuratiebestand --define=XXX -D definieer configuratiesetting --printconfig -P print config waarden --[no]interactive forceer [non]interactieve modus --[no]errexit stop direct na een fout in de invoer Gebruik: {prog} [options] [file ...] --config=XXX -f specificeer configuratiebestand --nostdconf -X gebruik uitsluitend dit configuratiebestand --define=XXX -D definieer configuratiesetting --printconfig -P print config waarden --admdir=XXX directory voor de config files --[no]wizard gebruik de aanmaken/selectiewizard --help deze hulpboodschap --ident toon identificatie --verbose geef meer uitgebreide information GebruikersnaamGedetailleerdGeef een unieke code voor de administratie. Deze wordt gebruikt als interne naam voor de database en administratiefolders. De standaardwaarde is afgeleid van de administratienaam en de begindatum. Geef een unieke naam voor de nieuwe administratie. Deze wordt gebruikt voor rapporten en dergelijke. Geef het boekjaar voor deze administratie. De administratie begint op 1 januari van het opgegeven jaar. Geen BTW tarief gevonden met tariefgroep {gr}, inclusiefGeen BTW tariefgroep voor code {code}Geen EekBoek database opgegeven. Specificeer een database in de configuratiefile, of selecteer een andere configuratiefile op de command line met "--config=...".Geen Jaar 2 3 Kwartaal 5 6 7 8 9 10 11 MaandGeen administratie geselecteerdGeen alternatieven beschikbaar (teveel open posten)Geen boekingen gevondenGeen boekjaar opgegevenGeen configuratieGeen database met naam {name} gevondenGeen dataset opgegeven. Specificeer een dataset in de configuratiefile.Geen geldige UTF-8 tekens for ZIP elementGeen geldige UTF-8 tekens in regel {line} van de invoerGeen grootboekrekening voor {dc} ({acct})Geen hulp beschikbaar.Geen informatie gevondenGeen informatie gevonden.Geen koppeling gevonden voor "{std}"Geen ondersteuning voor database type {db}Geen open post van {amt} gevonden voor relatie {rel}Geen openstaande posten gevondenGeen post gevonden voor boekstuk {bsk}Geen stylesheet voor {style}Geen toegang tot directory {dir}Geen updatesGeen updates gevonden.Gelieve BTW tariefgroep "Geen" te vervangen door "Nul"GereedGereed om de bestanden aan te maken.Geschreven door {author}GetalformaatGrBkGrootboekGrootboek/BoekstukGrootboekrekeningGrootboekrekening {acct} ({desc}) is een balansrekeningGrootboekrekening {acct} heeft BTW in een BTW-vrije administratieGrootboekrekening {acct} is geen balansrekeningGrootboekrekening {gbk} ({desc}) bestaat reedsHET NIEUWE BOEKJAAR IS NIET GEOPEND!HOOFDVERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGENHTML UitvoerHTML bestanden (*.html)|*.htmlHTML rapportenHet boekstuknummer moet een geheel getal (volgnummer) zijnHet databasesysteem waar de database wordt opgeslagenHet openen van een administratie kan slechts éénmaal gebeuren, vóór het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar één keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze laatste opdracht niet is gegeven blijft de administratie ongewijzigd. Alle benodigde opdrachten moeten dan ook in één enkele EekBoek shell sessie worden afgehandeld. Mogelijke opdrachten voor openen van een boekjaar: adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden geïdentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden geïdentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in één administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie Invoeren van een openstaande post uit het voorgaande boekjaar. Het moet volledig zijn, dus ::. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Het password van deze user.Het schema ontbreekt in bestand {file}Het systeem waarop de database server draait, indien niet lokaal.Het totaalbedrag van de openingsbalans is nog niet opgegevenHuidig saldo: {bal}Hulp is beschikbaar voor de volgende onderwerpen.Importeert een complete, geëxporteerde administratie. import [ ] Opties: --file= Selecteer exportbestand --dir= Selecteer exportdirectory Er moet of een --file of een --dir optie worden opgegeven. LET OP: IMPORT VERVANGT DE COMPLETE ADMINISTRATIE! Deze opdracht wordt niet door alle database systemen ondersteund. Deze opdracht is alleen in de command line versie beschikbaar. Incomplete SQL opdracht: {sql}InkoopInkoop- en CrediteurenadministratieInstallatiefout -- geen database schemaInternal error -- unbalance {arg1} <> {arg2}InvoerInvoer moet Unicode (UTF-8) zijn.Invoerregel {lno} bevat onzichtbare tekens na de backslashJaJaarJournaalJournal: {state}KasKas (contant geld)KiesKies het type database dat u wilt gebruiken voor deze administratie. Kolombreedte voor getallenKwartaalLees de release notesLeest opdrachten uit een bestand. include [ ] Opties: --optioneel Het bestand mag ontbreken. De opdracht wordt dan verder genegeerd. Lege administratieLege database {db} is aangemaaktLet op! Eventuele bestaande bestanden worden overschreven!Maak uw keuzeMaandMededelingMeervoudig afboekenMet uw keuze voor het Microsoft Windows besturingssysteem geeft u echter alle vrijheden weer uit handen. Dat is erg triest.Mijn eerste EekBoekMisluktModule Archive::Zip, nodig voor export naar file, is niet beschikbaarModule Archive::Zip, nodig voor import van file, is niet beschikbaarMoet BTW worden toegepast in deze administratieMoet de database worden aangemaaktMoet het configuratiebestand worden aangemaaktMoeten de administratiebestanden worden aangemaaktMutatiesMutaties (boekingen)NaamNederlandsNeeNiet uniekNiet-bestaande administratie-eigenschap: {adm}Niet-bestaande standaardrekening: {std}Nieuw saldo: {bal}Normaal Verlegd Intra ExtraNrNul Hoog Laag Privé AndersOmschrijvingOmschrijving: {desc}Onbekend boekjaar: {bky}Onbekend boekjaar: {code}Onbekend boekstuk {bsk} in dagboek {dbk}Onbekend boekstuk {ref} voor relatie {rel} ({desc})Onbekend boekstuk: {bsk}Onbekend dagboek: {dbk}Onbekend of verkeerd dagboek: {dbk} [{type}]Onbekend rekeningnummer: {acct}Onbekend schema: {schema}Onbekend transactietype: {type}Onbekend veld: {fld}Onbekende BTW-code: {code}Onbekende afrondingsmethode: {meth}Onbekende grootboekrekening: {acct}Onbekende grootboekrekening: {gbk}Onbekende opdracht "{cmd}". "help" geeft een lijst van mogelijke opdrachten.Onbekende opdracht. "help" geeft een lijst van mogelijke opdrachten.Onbekende relatie: {rel}Onbekende verdichting: {vrd}Onbekende {what}: {who}Onderhoud van het schema. Deze opdracht kent sub-opdrachten: schema [ ] Aanmaken grootboekrekening schema gbk [ ] de gewenste grootboekrekening D/C voor Debet / Credit K/O/N voor Kosten / Omzet / Neutraal Eventueel gevolgd door ! als deze balansrekening vast staat aan één kant De omschrijving van deze grootboekrekening De verdichting waaronder deze rekening valt Wanneer enkel een nummer wordt opgegeven dan worden de gegevens van de betreffende grootboekrekening getoond. OndersteuningOndersteuning...Ongeldig aantal argumenten voor deze opdrachtOngeldig antwoord, het moet een getal tussen {first} en {last} zijnOngeldig antwoord, het moet een getal zijnOngeldig bedrag: {amount}Ongeldig bedrag: {amt}Ongeldig bedrag: {num}Ongeldig beginsaldo: {saldo}Ongeldig dagboek voor relatie: {dbk}Ongeldig getal: {num}Ongeldig grootboekrekeningnummer: {acct}Ongeldig of ontbrekend rekeningnummer: {x}Ongeldig rekeningnummer: {acct}Ongeldig saldo: {saldo}Ongeldig totaal: {total}Ongeldig type voor balansrekening (alleen D / C toegestaan)Ongeldig type voor resultaatrekening (alleen K / O / N toegestaan)Ongeldig veld: {fld}Ongeldige BTW periode: {per}Ongeldige BTW-specificatie: {spec}Ongeldige EekBoek database: {db} versie {ver}. Benodigde versie is {req}.Ongeldige EekBoek database: {db}.Ongeldige boekjaar-code: {year}Ongeldige boekjaarcode: {code}Ongeldige boekstukaanduiding: {bsk}Ongeldige breedte {w} voor veld {fld}Ongeldige code voor BTW tarief: {id}Ongeldige code voor BTW tarief: {id} (moet minstens twee tekens zijn)Ongeldige datum: {date}Ongeldige datum: {per}Ongeldige datumaanduiding in {key}: {value}Ongeldige datumformaatspecificatie: {fmt}Ongeldige invoer in schema bestand, regel {lno}: {line}Ongeldige of ontbrekende type specificatie: {x}Ongeldige of ontbrekende verdichting: {x}Ongeldige openingsdatum: {date}Ongeldige operatie (IV) voor dagboek type {type}Ongeldige periode-aanduiding: {per}Ongeldige waarde voor BTW periode: "{per}"Ongeldige waarde voor BTW status: {btw}Onherkenbare datum: {date}Ontbrekend "name" of "style"Op grootboekrekeningOp hoofdverdichtingOp verdichtingOpdracht "{cmd}" is niet beschikbaar.Opdrachtnamen zijn hoofdletterongevoelig.OpenOpen posten voor relatie {rel}:Openen nieuw boekjaarOpenen van de administratieOpeningOpeningsbalansOpeningsbalans kent geen einddatumOpeningsgegevensOpenstaande postenOpenstaande posten bij afsluiting boekjaar {bky}Openstaande transactie is teruggedraaidOpgegeven balanstotaal = {total}Opslaan als...Optie --boekjaar wordt niet ondersteund door deze exportOpties "definitief" en "verwijder" sluiten elkaar uitOpties --dir en --file sluiten elkaar uitOpties --dir, --file en --xaf sluiten elkaar uitOver {pkg} {app}Over...OvergeslagenOverzicht aangemaakt op {date} door {ident}Overzicht journaalposten. journaal all Alle posten journaal Alleen boekstuknummer met dit id journaal Alle journaalposten van dit dagboek journaal : Boekstuk van dit dagboek journaal Journaalposten van de laatste boeking Opties --[no]detail Mate van detail, standaard is met details --totaal Alleen het totaal (detail = 0) --bkstsort Sorteer op boekstuk, standaard is sorteren op datum --periode=XXX Alleen over deze periode Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Pas op! Boekjaar {bky} is nog niet afgesloten.Pas op! U boekt {ko} in een {iv} dagboekPasswordPassword voor de database userPeriode begint {from}, dit is na de huidige datum {now}Periode: t/m {to}Periode: {from} t/m {to}Periode: {per}PlaatsPopup window voor foutboodschappenPopup window voor mededelingenPopup window voor waarschuwingenPostcodePostgreSQLProbleem met het aanmaken van {file}: Zip errorProbleem met het aanmaken van {file}: {err}Probleem met het afsluiten van {file}: {err}Probleem met het benaderen van {file}: {err}Proef- en SaldibalansProgrammafout: Ongeldige BTW periode: {per}PromptRapportageRapporten in hetzelfde vensterReferentie {ref} bestaat al voor relatie {rel}RekRekNrRekeningRekening {id} heeft geen verdichtingRekening {id}: BTW koppeling '{ko}' met een {acc} is niet toegestaanRekening {id}: BTW koppeling met een balansrekening vereist kosten/omzet specificatieRekening {id}: BTW koppeling met neutrale resultaatrekening is niet toegestaanRekening {id}: extra koppeling voor "{std}"Rekening {id}: gelieve BTW tariefcode {code} te vervangen door een tariefgroepRekening {id}: onbekende koppeling "{std}"Rekening {id}: onherkenbare vlaggetjes {flags}RekeningschemaRekeningschema, dagboeken, BTW instellingenRekenkundig residu debet = {rdeb}, credit = {rcrd}RelatieRelatiecode {code} is niet uniek in dagboek {dbk}RelatiesRelaties (debiteuren en crediteuren)Relaties met intra-communautaire BTW worden nog niet volledig ondersteundRelaties met verlegde BTW worden nog niet ondersteundRelatietype moet "deb" of "crd" zijnResultaatrekening {acct}, beginsaldo is {exp}Resultaatrekening {acct}, mutaties is {exp}Resultaatrekening {acct}, saldo aangepast met {exp}ResultatenSQL Trace: {state}SQLEngine: No callback for {cb}SQLiteSaldo CrSaldo DbSaldo voorgaande boeking: {bal}Saldo {new} klopt niet met beginsaldo eropvolgende boekstuk {isaldo}Saldo {new} klopt niet met de vereiste waarde {act}ScheidingstekenSchema {schema} geïnitialiseerdSelecteer eerst een geldige eekboek.confServer hostServer poortServer portServer systeemShellSjabloonSluit het boekjaar af. De BTW rekeningen worden afgeboekt, en de winst of het verlies wordt verrekend met de daartoe aangewezen balansrekening. Deze opdracht genereert twee rapporten: een journaal van de afboekingen en een overzicht van eventuele openstaande posten. Indien gewenst kan een bestand worden aangemaakt met openingsopdrachten voor het volgende boekjaar. jaareinde [ ] Opties: --boekjaar= Sluit het opgegeven boekjaar af. --definitief Sluit het boekjaar definitief af. Er zijn dan geen boekingen meer mogelijk. --verwijder Verwijder een niet-definitieve jaarafsluiting. --eb= Schrijf openingsopdrachten in dit bestand. Sorry, geen hulp voor {topic}.Specifeer de BTW aangifteperiode voor het nieuw te openen jaar. adm_btwperiode [ jaar | kwartaal | maand ] Deze opdracht kan worden gebruikt bij het openen van een boekjaar. Zie "help adm_open" voor meer informatie. Specificeer --dir of --fileSpecificeer --dir, --file of --xafSpecificeert de begindatum van de administratie. Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. Daarom moet als begindatum een jaartal worden opgegeven. adm_begindatum Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. Specificeert de boekjaarcode voor het nieuw te openen jaar. adm_boekjaarcode De boekjaarcode telt maximaal 4 letters en/of cijfers. Standaard wordt het jaartal van het te openen boekjaar genomen. De boekjaarcode is alleen belangrijk indien er meerdere boekjaren in één administratie worden bijgehouden. Deze opdracht kan worden gebruikt bij het openen van een boekjaar. Zie "help adm_open" voor meer informatie. Specificeert de naam van de administratie, te gebruiken voor rapportages. adm_naam "Naam van de administratie" Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. Specificeert een balanspost voor de openingsbalans. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of voor Debiteuren, dan moeten er ook openstaande posten voor in totaal dit bedrag worden ingevoerd met een of meer adm_relatie opdrachten. Zie ook "help adm_relatie". Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. Specificeert een openstaande post uit een voorgaand boekjaar. adm_relatie Het moet volledig zijn, dus ::. Indien er voor de openingsbalans een bedrag is opgegeven voor de balansrekening Crediteuren of voor Debiteuren, dan moeten er ook openstaande posten voor in totaal dit bedrag worden ingevoerd. Zie ook "help adm_balans". Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. Specificeert het balanstotaal voor de in te voeren openingbalans. adm_balanstotaal Het balanstotaal is de zowel de som van alle debet-posten als de som van alle credit-posten van de openingsbalans. Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. Zie ook "help adm_balans". Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe administratie. Zie "help adm_open" voor meer informatie. StrategieStyle sheetsSucces!SysteemdagboekTOTAALTOTAAL {rep}Tabel {table} ontbreekt in database {db}TariefTe veel argumenten voor deze opdrachtTe weinig argumenten voor deze opdrachtTekstrapportenTest databaseThe WizToegangscodeToegangsfout schema data: {err}Toevoegen boekstuk in een dagboek van type {type}Toon journaalpost na elke boekingToon versie.Toont de BTW aangifte. btwaangifte [ ] [ ] Aangifteperiode kan zijn: j jaar Het gehele jaar k1 k2 k3 k4 1e/2e/3e/4e kwartaal (ook: q1, ...) 1 2 3 ... Maand (op nummer) jan feb ... Maand (korte naam) januari ... Maand (lange naam) Standaard is de eerstvolgende periode waarover nog geen aangifte is gedaan. Opties: --definitief De BTW periode wordt afgesloten. Er zijn geen boekingen in deze periode meer mogelijk. --periode= Selecteer aangifteperiode. Dit kan niet samen met --boekjaar, en evenmin met de bovenvermelde methode van periode-specificatie. --boekjaar= Selecteer boekjaar --noreport Geen rapportage. Dit is enkel zinvol samen met --definitief om de afgesloten BTW periode aan te passen. --noround Alle bedragen zonder af te ronden. Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Toont de Proef- en Saldibalans. Opties: Proef- en Saldibalans op grootboekrekening --verdicht Verdicht, gedetailleerd (hetzelfde als --detail=2) --detail= Verdicht, mate van detail = 0,1,2 --per= Selecteer einddatum --boekjaar= Selecteer boekjaar Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Toont de balansrekening. Opties: Balans op grootboekrekening --verdicht Verdicht, gedetailleerd --detail= Verdicht, mate van detail = 0, 1 of 2 --per= Selecteer einddatum --boekjaar= Selecteer boekjaar --opening Toon openingsbalans Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Toont de naam van de huidige database. database Toont de resultatenrekening. Opties: Overzicht op grootboekrekening --verdicht Verdicht, gedetailleerd --detail= Verdicht, mate van detail = 0,1,2 --periode= Selecteer periode --boekjaar= Selecteer boekjaar Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Toont een boekstuk in tekst- of commando-vorm. toon [ ] Opties: --boekjaar= Selekteer boekjaar --verbose Toon in uitgebreide (tekst) vorm --btw Vermeld altijd BTW codes --bsknr Vermeld altijd het boekstuknummer (default) Het getoonde boekstuk wordt in de commando-historie geplaatst. Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele wijziging opnieuw ingevoerd. Toont een lijstje van beschikbare dagboeken. dagboeken Toont een overzicht van boekingen op crediteuren. crediteuren [ ] [ ... ] Opties: --periode= Periode --boekjaar= Selecteer boekjaar --openstaand Alleen met openstaande posten Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Toont een overzicht van boekingen op debiteuren. debiteuren [ ] [ ... ] Opties: --periode Periode --boekjaar= Selecteer boekjaar --openstaand Alleen met openstaande posten Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Toont een overzicht van openstaande posten. openstaand [ ] [ ] Opties: --per= Einddatum --boekjaar= Selecteer boekjaar --deb --debiteuren Alleen debiteuren --crd --crediteuren Alleen crediteuren Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. Toont het Grootboek, of een selectie daaruit. grootboek [ ... ] Opties: --detail= Mate van detail, =0,1,2 (standaard is 2) --periode= Alleen over deze periode Naast rekeningnummers kunnen ook nummers van verdichtingen en hoofdverdichtingen worden opgegeven. Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. TotaalTotaal mutatiesTotaal {adesc}Totaal {debcrd}Totaal {pfx}Totaal {rel}Totaal {vrd}Typ 'help [onderwerp]' voor meer gedetailleerde informatie.TypeU kunt een van de meegeleverde sjablonen gebruiken voor uw administratie. U kunt meteen aan de slag.U wordt aangeraden de release notes te lezen en daarna te ugraden.Uitvoer in de vorm {gen} is niet mogelijk: {reason}Uitvoer schoonmakenUsernaam voor de databaseUw keuzeVERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGENVerbinden met een bestaande administratieVerdichting {vrd} heeft geen hoofdverdichtingVerdichting/GrootboekrekeningVerkoopVerkoop- en DebiteurenadministratieVerliesVerlies boekjaar {bky}Verlies/WinstVervolgregel ontbreekt in de invoer.Verwijderen administratieVerwijdert een boekstuk. Het boekstuk mag niet in gebruik zijn. verwijder [ ] Opties: --boekjaar= Selekteer boekjaar Het verwijderde boekstuk wordt in de commando-historie geplaatst. Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele wijziging opnieuw ingevoerd. Voer een SQL opdracht uit via de database driver. Met het gebruik hiervan vervalt alle garantie op correcte financiële resultaten. sql [ ] Deze opdracht is alleen in de command line versie beschikbaar. Voor ondersteuning: {url}VoorkeurenVoorkeuren...VoorkeursinstellingenWaarschuwingWaarschuwing: De toevoeging 'D' of 'C' aan het grootboeknummer wordt afgeraden! Gebruik de --dagboek optie indien nodig.Welkom bij de EekBoek administratie-wizard.Wellicht de betaling van de volgende open posten:Wellicht is de database nog niet geïnitialiseerd?Wijzigen invoerregelWinstWinst boekjaar {bky}aanboekstukcmd:adm_balanscmd:adm_balanstotaalcmd:adm_begindatumcmd:adm_boekjaarcodecmd:adm_btwperiodecmd:adm_naamcmd:adm_opencmd:adm_relatiecmd:balanscmd:boekjaarcmd:btwaangiftecmd:crediteurencmd:dagboekencmd:databasecmd:debiteurencmd:exportcmd:grootboekcmd:importcmd:includecmd:jaareindecmd:journaalcmd:openstaandcmd:periodescmd:proefensaldibalanscmd:rapportencmd:relatiecmd:resultcmd:schemacmd:sqlcmd:tooncmd:verwijdercmo:boeking:beginsaldocmo:boeking:boekjaarcmo:boeking:boekstuk|nrcmo:boeking:confirmcmo:boeking:journal|journaalcmo:boeking:refcmo:boeking:saldocmo:boeking:totaalcmo:btwaangifte:definitiefcmo:btwaangifte:noreportcmo:btwaangifte:periodecmo:jaareinde:boekjaarcmo:jaareinde:definitiefcmo:journaal:bkstsortcmo:journaal:boekjaarcmo:journaal:detail|detailscmo:journaal:periodecmo:journaal:totaalcmo:relatie:btwcmo:relatie:dagboekcmo:report:outputcmo:report:pagecmo:report:stylecmo:report:title|titelgeenhttp://www.squirrel.nl/relnotes.htmlinkoopj(aar)?jaarkostenkwartaalmaandn.v.t.omzetoverboeking winstper jaarper kwartaalper maandraport.htmlscm:balansscm:btwscm:dagboekenscm:dbk:bankscm:dbk:inkoopscm:dbk:kasscm:dbk:memoriaalscm:dbk:verkoopscm:exclscm:exclusiefscm:hdr:BTW Tarievenscm:hdr:Balansrekeningenscm:hdr:Dagboekenscm:hdr:Resultaatrekeningenscm:hdr:Verdichtingscm:inclscm:inclusiefscm:koppelingscm:kostenscm:kostenrekeningscm:omzetscm:omzetrekeningscm:percscm:percentagescm:rekscm:rekeningscm:resultscm:std:btw_iascm:std:btw_ihscm:std:btw_ilscm:std:btw_ipscm:std:btw_okscm:std:btw_vascm:std:btw_vhscm:std:btw_vlscm:std:btw_vpscm:std:crdscm:std:debscm:std:winstscm:tariefgroepscm:tg:andersscm:tg:geenscm:tg:hoogscm:tg:laagscm:tg:nulscm:tg:privescm:tg:privéscm:totscm:typescm:vanafuitverkoop{balres} {gbk} {debcrd}{fixed}{kstomz} ({desc}); Verdichting {vrd} ({vdesc}); Hoofdverdichting {hvrd} ({hdesc}){ident}{extra}{locale} -- Copyright {year} Squirrel Consultancy{id} ZOU EEN BALANSREKENING MOETEN ZIJN{id} ZOU EEN RESULTAATREKENING MOETEN ZIJN{month} {year}{name} {version}{pkg} Rekeningschema voor {db}{pkg} versie {ver}{pkg} {app} versie {ver}{quarter} {year}{what} voor administratie {adm}{year}Project-Id-Version: EekBoek Report-Msgid-Bugs-To: POT-Creation-Date: 2013-06-04 14:48+0200 PO-Revision-Date: 2013-06-04 14:49+0200 Last-Translator: Automatically generated <> Language-Team: none <> Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); --btw= VAT type: normaal (normal), verlegd (delegated), intra, extra *** VAT type 'verlegd' is not yet supported *** *** VAT type 'intra' is not fully supported *** [:num] [ ] followed by one or more: crd [ ] (payment by creditor) deb [ ] (payment by debtor) std [ ] > (free entry) Total amount for this posting can be checked with --totaal=. The new balance amount for this account can be verified with --saldo=. For partial payments or payments with an amount not equal to the corresponding posting, replace with the posting's reference. [:num] [ ] followed by one or more: A check of the total amount for this posting can be done with the option --totaal=. The last may be omitted. [:num] [ ] followed by one or more: A check of the total amount for this posting can be done with the option --totaal=. The last may be omitted. (balance total {total})*** Aborted because of errors in the input ***Posting total is {act} instead of {exp}&File&Edit input line Ctrl+Enter&Help&Help...&Open Ctrl-OReports&Execute input line Ctrl+Enter, or N to create a new administration-- A/Payable A/Receivable Sales Bank Cash MemorialOptions --per and --boekjaar are mutually exclusiveOptions --per and --periode are mutually exclusiveOptions --periode and --boekjaar are mutually exclusive--default--01-01-1.234,561st quarter2nd quarter3rd quarter4th quarter

For support questions you can subscribe to the mailing list for EekBoek users: SourceForge.

The EekBoek users maintain a een wiki where they share experienes, tips and techniques, and so on.

EekBoek can be downloaded and used for free. If you have additional wishes for features or support you can contact Squirrel Consultancy for commercial support, for example, to help you migrating your current administration to EekBoek. Also they can implement custom features and extensions according to your demands.

For more information: info@squirrel.nl.

==== Messages ======== Output ====Created by {id} on {date}Created by {pkg} {version} on {ts}{per} report does not match the corresponding setting ({admper}) of the administrationSubmission periodVAT submission periodCreate one or more new relations. relatie [ ] { } ... Options: --dagboek= Select daybook for this relation Create {cfg}: Generating {sql}...Number of input lines to keep in history:AdministrationRemove administration data?Administration selectionAdministration numberAdministrative dataAddressAborted!Rounding algorithmE&xit Ctrl-QClosing financial year {bky}GeneralAll commands producing reports have the following options: --per= The end date for the report. Not necessarily relevant for every command. See "help periodes" for details. --period= The reporting period. Not necessarily relevant for every command. See "help periodes" for details. --output= Write the report to this file Output type is dependent on the file extension, for example xx.html produces an HTML file, and xx.txt produces a text file, xx.csv prodices a CSV file, etc. --gen- Force output type (html, csv, text, ...) Depending on the available output types, also the abbreviated options, such as --html, --csv and --text are possible. Caution: --gen-XXX, not --gen=XXX --page= Page size for textual reports. Please answer 'yes' or 'no'.&EditVATVATVAT %VAT 0%VAT submissionVAT corr. VAT code "{spec}" is ambiguous: {list} (using code {code} "{desc}")The period of the VAT submission does not match with the previous VAT submissionVAT paidFix VAT calculationsVAT account number {acct}, correction of {amt} has been completedVAT code {id}: no percentage specified, and tariff class is not "{none}"VAT code {id}: unknown information "{info}"Apply VATApplying VAT on a neutral account is not allowedApplying VAT in administration modeVAT code {code} adjusted to {new} for booking date reasonsVAT code {code} is no longer valid on this booking dateVAT code {code} is not yet valid on this booking dateBalanceBalance account {acct}, balance total has been corrected with {exp}Balance account {acct}, balance changed to {exp}BankAmountCompany dataStarting dateOpening date {year} would be in the futureInitial balanceOpening balance is not equal to the ending balance of the previous bookingOpening balance: {bal}Available administrationsAvailable administrations in {dir}Cannot access file "{file}" or file is not available ({err})File "{file}" does not exist ({err})PaidPayment {rel} {amt} conforms to the open bookings {amtss} and {amts}SecurityBypass restrictions for Microsoft VistaConfirmationConfirmation: {state}Accounting difference debit = {rdeb}, credit = {rcrd}Posting BookingsPostings that involve VAT are not allowed in a memorial. The VAT has been nulled.Date of posting falls outside the financial yearBooking reference must contain at least one non-numerical character: {ref}Financial year for this session: {bky} ({desc})Financial year {bky} has already been closedFinancial year {bky} has already been closedFinancial year {code} is closed and cannot be modifiedFinancial year code {year} already exists ({desc})Financial year code "{code}" is already in usePostingPosting does not level out (the difference is {diff})Posting {bsk} is in use by {lst}Posting {bsk} is already in usePosting {bsk} not removedPosting {bsk} removedPosting {nr}Booking/AccountPosting/linePostingNrPostings in preceding financial years must have an explicit serial numberCONSISTENCY CHECK OF STANDARD ACCOUNTS FAILEDCSV reportsCodeConfiguration fileConfiguration error: [format]numwidth must be a numberConfiguration error: invalid value for {item}Automatically check for updatesCheck for updates...CreditCreditorCreditor {code} -> {acct} ({desc}), daybook {dbk}CreditorsCreditors administrationTHE IMPORT HAS NOT BEEN COMPLETED!THE OPENING HAS NOT BEEN COMPLETED!Daybook name {dbk} is not allowed.Daybook {dbk} implies {typ1} but {acct} implies {typ2}Account {id} has no contra accountDaybook {id}: unknown type "{type}"Daybook {id}: :dc is only allowed for Cash and BankDaybook {id}: the :rekening is missingDaybook {id}: the :type is missingDaybook {id}: unknown information "{info}"Daybook {nr}DaybooksDatabaseDatabase test resultsDatabase journal for {db} has been removedDatabase nameDatabase problem: {err}Database sequences for {db} have been removedFor a remote database server, the system that runs the server.Database server network port, in case it is not the standard portDatabase typeDatabase type {drv} does not support the import command. Use the --import command line option.Database userDatabase connection error: {err}Database {name} is not in UTF-8 but in {enc}Database: {db}DateDate {date} does not precede the financial yearDate {per} is after the current date {now}Date {per} is before the start {begin} of the administrationDate: {date}Date formatThe postfix "D" or "C" to the account number is not allowed hereThe VAT period has not yet been specifiedThe submission period for the corporate taxThe administration is closed and cannot be modifiedThe administration has not yet been openedThe administration is not yet in useThe administration has already been openedThe administration is already in useThe opening date for the administration has not yet been specifiedThe opening date. The financial year starts on the first of January of this year.Booking date falls within a period for which VAT has already been submitted.Booking date {date} is after the financial year endBooking date {date} is before the start of the financial yearThe database is being set up and populatedThe database has been upgraded to the latest versionThe administration has been created.Database upgrade failed. Please consult the documentation.File {file} postings data is missingThe name of the database that should be set up, for example "admin2009".The name for the administration has not yet been specifiedFor a remote database server, the network port the server is listening to.The description of the booking line is missingThe opening balance is not correct!The opening balance has not yet been suppliedFile {file} opening data is missingFile {file} relations data is missingThe export backend could not be foundThe user name to access the database server with.The following period identifiers are possible. If the year is omitted, it is assumed the current financial year is meant. 2005-04-01 - 2005-07-31 01-04-2005 - 31-07-2005 01-04 - 31-07-2005 01-04 - 31-07 1 april 2005 - 31 juli 2005 (and variants) 1 apr 2005 - 31 jul 2005 (and variants) apr - jul k2 (second quarter) april 2003 (01-04-2003 - 30-04-2003) april (01-04 - 30-04 of current financial year) m4 (fourth month) jaar (entire calendar year) DebetDebtorDebtor {code} -> {acct} ({desc}), daybook {dbk}DebtorsAccounts receivable and Accounts payableDebtors administrationDemo administrationDetails...This administration doesn't handle accounts payableThis administration doesn't handle accounts receivableThe administration does not have VAT specifiedThis booking falls within a period for which VAT has already been submitted and cannot be removed.Do not show this message anymoreThis accounting instruction is incomplete. Please use the "help" function for more information.This command is obsolete. Use "export" instead. Directory {dir} does not existThis is {pkg} [{name} {version}]This overview is for your reference, the booking has not been done!ContinueDriverPress 'Finish' to create the following files:Duplicate: VAT tariff {id}Duplicate: daybook {dbk}Duplicate: master group {vrd}Duplicate: account {acct}Duplicate: group {vrd}EekBoekEekBoek MiniAdm SetupEekBoek UpdateEekBoek Sample AdministrationEekBoek is FREE software, intended to give you full control over your own data.Start EekBoekEekBoek version x.yy.zz is available.EekBoek version x.yy.zz is available. Please consult the release notes and upgrade to the new version.A concise, unique description of this administration, for example "admin2009".Create a new administrationA description of this administration, for example "Accounting 2009".ExtensionsFinal balance closing financial year {bky}End of {pkg} schemaEnd of {what}An administration with code "{code}" already existsAn administration with that code already exists.An administration with that name already exists.A problem has occurred, please contact your system administratorThere is a difference of {round}{amount} between the calculated VAT and deducted VAT {type}. For the submission the deducted amount has been used.There is a difference of {round}{amount} between the calculated VAT and deducted VAT. For the submission the deducted amount has been used.No financial year code supplied, using {val} insteadNo new VAT period has been entered, using current VAT period codes insteadUnsettled {dc} (account {acct}) has an excess of {amt}Unsettled {dc} (account {acct}) is {amt} shortA bank account is being usedUnsettled postings have not been specifiedThere are open postings, but no corresponding balance accounts have been specifiedPlease be patient...Export of data set {db} created by {id} on {date}Exports the complete administration. export [ ] Options: --file= Select output file --dir= Select output directory --xaf= Export XML Auditfile Financieel --boekjaar= Select financial year (only with --xaf) One of the following options must be specified: --file, --dir or --xaf The XAF export exports always one financial year only. For the other export types the complete administration is exported. Any existing export files are overwritten. ERRORS FOUND IN SCHEMA, PROCESS ABORTEDFiscal numberFolder for administration dataForce wizard start-upFormatsErrorError {err} creating file {file}Error {err} creating directory {dir}Error {err} closing file {file}Error {err} writing file {file}Error in the input: check the " and ' characters.Error {err} while creating file {file}Error {err} while creating file {file}Error {err} while creating export file {name}Error when saving account {gbk}Error {code} reading file {file}Error {status} creating export file {name}Error in VAT specification: {spec}Erroneous account for {dc} ({acct})ABORTED: An administration has already been createdABORTED: An administration has already been partially createdGUI design with {wxglade}Please supply a postingPosted: {bsk}Use the specified financial year for all commands that follow. boekjaar Usage: {prog} [options] [file ...] --command -c execute the rest of the command line as a command --echo -e echo commands --boekjaar=XXX specify financial year --import import configuration --export export configuration --dir=XXX directory for im/export --file=XXX file for im/export --title=XXX specify description for export data --init (re)create complete administration --createdb create a new database --help this message --ident show identification --verbose verbose information Fo expert use only: --config=XXX specify a configuration file --nostdconf -X only use the configuration file specified --define=XXX -D define configuration setting --printconfig -P print config values --[no]interactive force [non]interactive mode --[no]errexit abort execution upon errors Usage: {prog} [options] [file ...] --config=XXX -f specify config file --nostdconf -X only use this config file --define=XXX -D define config setting --printconfig -P print config values --admdir=XXX directory where the config files are kept --[no]wizard use the create/selection wizard --help this help message --ident show identificatiion --verbose provide verbose information UsernameDetailedProvide a unique name for the new administration. This name will be used as an internal name for the database and the administration folders. The default value has been derived from the administration name and the initial date. Provide a unique name for the new administration. This name will be used for reports, among others. Provide the financial year for this administration. The administration starts on the first of January of the given year. No VAT code found with group {gr} and inclusiveMissing VAT class for code {code}No dataset. Please specify a dataset name in the configuration file, or pass an alternative configuration file name on the command line with "--dataset=..."No year 2 3 quarter 5 6 7 8 9 10 11 monthNo administration has been selectedNo alternatives available (too many open postings)No bookings foundMissing financial yearMissing configNo database with name {name} foundNo dataset. Please specify a dataset name in the configuration file.Invalid UTF-8 characters for ZIP element foundLine {line} contains characters that are not valid UTF-8Missing account for {dc} ({acct})No help available.No information foundNo information foundNo account for {std} foundNo support for database type {db}No open posting of {amt} found for relation {rel}No open postings have been foundNo posting found for booking {bsk}Style sheet for {style} not foundCannot access directory {dir}No updatesNo updates foundPlease replace VAT class "None" with "Zero"CompletedReady to create the files.Written by {author}Number formatAccLedgerLedger/PostingAccountAccount {acct} ({desc}) is a balance accountAccount {acct} carries VAT while it is in a VAT-free administrationAccount {acct} ({desc}) is not a balance accountLedger account {gbk} ({desc}) already existsTHE NEW FINANCIAL YEAR HAS NOT BEEN OPENED!MASTER GROUP MUST BE BETWEEN {min} AND {max} INCLUSIVEHTML ViewHTML files (*.html)|*.htmlHTML reportsThis posting must have an integer serial numberThe system where the database is storedOpening an administratie can be done only once and only before the first mutatioon is entered. Opening a new financial year is always possible, provided it is done no more than once a year. Opening an admininstration can encompass a number of steps and must be concluded with the command "adm_open". As long as this command has not been given, the administration remains unsaved. Therefore, all required commands must be handled within the same EekBoek shell session. Possible commands for opening a financial year: adm_btwperiode [ year | quarter | month ] adm_boekjaarcode A code of max 4 letters and/or digits with which the financial year can be identified. By default the year of the financial year is taken. adm_open All information executed with the commands above is processed. Commands for opening an administration: adm_naam "Name of the administration" adm_btwperiode [ year | quarter | month ] adm_begindatum An administration always runs from 1 januari to 31 december of a calender year. adm_boekjaarcode A code of max 4 letters and/or digits with which the financial year can be identified. By default the year of the financial year is taken. The boekjaar code is only relevant if more than one boekjaren are maintained within one administration. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie Invoeren van een openstaande post uit het voorgaande boekjaar. Het moet volledig zijn, dus ::. adm_open All information executed with the commands above is processed. The password of the database user.File {file} schema data is missingFor a remote database server, the system that runs the server.The total amount for the initial balance has not yet been specifiedCurrent balance: {bal}Help is available for the following topics.Imports a complete administration that was previously exported. import [ ] Options: --file= Select export file for import --dir= Select directory for import One of the options --input or --dir must be specified. CAUTION: IMPORT REPLACES THE COMPLETE EXISTING ADMINISTRATION! This command may be unavailable due to database limitations. This command is only available in the command line version. Incomplete SQL command: {sql}ProcurementProcurement and Accounts receivable administrationInstallation error -- no database schemaInternal error -- unbalance {arg1} <> {arg2}InputInput must be Unicode (UTF-8).Input line {lno} contains invisible characters after the backslashYesYearJournalJournal: {state}CashCashSelectSelect the database type that you wish to use for this administration. Column width for numbersQuarterRead the release notesReads commands from a file. include [ ] Options: --optioneel The file can be omitted. The command is then ignored. Empty administration (DOES NOT WORK YET!)Created empty dataset {db}Caution: existing files will be overwrittenYour selectionMonthInformationBooking multiciplyHowever, by choosing this Microsoft Windows operating system you surrender this freedom. Sad. Very sad.My first EekBoekFailedExport to file requires module Archive::Zip, which is not availableFile import requires module Archive::Zip, which is not availableApplying VAT in administration modeCreate database?Create the configuration fileCreate the administration data filesMutationsMovements (postings)NameEnglishNoNot uniqueUnknown administration property: {adm}Unknown standard account: {std}New balance: {bal}Normal Delegated Intra ExtraNrNone High Low Private OtherDescriptionDescription: {desc}Unknown financial year: {bky}Unknown financial year: {code}Unknown posting {bsk} in daybook {dbk}Unknown posting {ref} for relation {rel} ({desc})Unknown posting: {bsk}Unknown daybook: {dbk}Unknown or erroneous daybook: {dbk} [{type}]Unknown account: {acct}Unknown schema: {schema}Unknown transaction type: {type}Unknown field: {fld}Unknown VAT code: {code}Unknown number rounding method: {meth}Unknown account: {acct}Unknown account: {gbk}Unknown command "{cmd}. Enter "help" for a list of commands.Unknown command. Enter "help" for a list of commands.Unknown relation: {rel}Unknown group: {vrd}Unknown {what}: {who}Maintenance of the accounting scheme. This command has the following sub-commands: schema [ ] Create general ledger schema gbk [ ] The intended general ledger account. D/C for Debit / Credit K/O/N for Costs / Revenue / Neutral Optionally followed by ! if this balance account is fixed on one side. The description of this general account The group account to which this account belongs When only a number is specified, then all data of the respective general ledger account are shown. Support&Support...Invalid number of arguments for this commandInvalid answer: must be a number between {first} and {last}Configuration error: must be a numberInvalid amount {amount}Invalid amount {amt}Invalid amount: {num}Invalid initial balance: {saldo}.Invalid daybook for relation: {dbk}Invalid amount: {num}Invalid account number: {acct}Invalid or missing account number: {x}Invalid account number: {acct}Invalid balance: {saldo}.Invalid total: {total}Invalid type for account balance (only D / C is allowed)Invalid type for resultaatrekening (only K / O / N allowed)Invalid field: {fld}.Invalid value for VAT period: "{per}"Error in VAT specification: {spec}EekBoek database {db} has version {ver}, while at least version {req} is required.Invalid EekBoek database: {db}.Invalid financial year code: {year}Invalid value for financial year: {code}Invalid posting specification: {bsk}Invalid width {w} for field {fld}Invalid code for VAT tariff: "{id}"Invalid VAT tariff code {id}: must be at least three charactersInvalid date: {date}Invalid date: {per}Invalid date specification in {key}: {value}Invalid date format specification: {fmt}Invalid input in schema, line {lno} {line}Invalid or missing type specification: {x}Invalid or missing group: {x}Invalid opening date: {date}Invalid operation (IV) voor daybook type {type}Invalid period identifier: {per}Illegal value for VAT period: "{per}"Invalid value for VAT status: "{btw}"Unrecognizable date: {date}Missing "name" or "style"By accountBy master groupBy groupCommand "{cmd}" is not available.Command names are case insensitive.OpenUnsettled postings for relation {rel}:Open new financial yearEntering administrationOpeningOpening balanceThe opening balance does not have an end dateOpening dataOpen postingsUnsettled postings at financial year {bky} closePending transaction has been rolled backTotal as specified = {total}Save as...Option --boekjaar is not supported by this exportThe options "definitief" and "verwijder" are mutually exclusiveOptions --dir and --file are mutually exclusiveThe options --dir, --file, and --xaf are mutually exclusiveAbout {pkg} {app}&About...SkippedOverview made on {date} by {ident}Summary of journal entries. journal all All posts journal Select posting by id journal All journal entries from this daybook journal : Select posting from daybook Journal Journal entries from the last booking Options --[no]detail Level of detail, default is all details --total Only the overall total (detail = 0) --bkstsort Sort on booking number, default is sort on date --period=XXX Only over this period See "help reports" for general information on creating reports. Warning! Financial year {bky} has not been closed yetWarning! Posting has {ko} but daybook is {iv}PasswordPassword to access the databasePeriod starts {from}, this is after the current date {now}Period: through {to}Period {from} through {to}Period: {per}CityPopup window for errorsPopup window for informational messagesPopup window for warningsZip codePostgreSQLZip error while creating file {file}Error {err} while creating file {file}Error {err} while closing file {file}Error {err} while accessing file {file}Trial balanceProgram error: Invalid VAT period: "{per}"PromptReportingSingle window for reportsReference {ref} already exists for relation {rel}AccAccNrAccountAccount {id} has no groupAccount {id}: Mapping VAT code '{ko}' with {acc} is not allowedAccount {id}: Mapping a VAT code with a balance account requires a KO specificationAccount {id}: Mapping a VAT code with a neutral account is not allowedAccount {id}: extra mapping to "{std}"Account {id}: please replace VAT code {code} with a VAT classAccount {id}: unknown mapping to "{std}"Account {id}: unknown flags "{flags}"Accounting schemeAccount schema, daybooks and VAT configurationsArithmetic difference debit = {rdeb}, credit = {rcrd}RelationRelation code {code} is not unique in daybook {dbk}RelationsRelations (debitors en creditors)Intra-EC VAT transactions are not yet fully supportedTransactions with delegated VAT are not yet fully supportedRelation type must be "deb" or "crd"Result account {acct}, initial balance has been changed to {exp}Result account {acct}, mutations are {exp}Result account {acct}, balance total has been corrected with {exp}ResultsSQL Trace: {state}SQLEngine: No callback for {cb}SQLiteBalance CrBalance DbBalance previous booking: {bal}Balance {new} does not match the initial value of the subsequent posting {isaldo}New balance {new} does not match the required value {act}SeparatorSchema {schema} has been initialisedPlease select a valid eekboek.conf firstServer hostServer portServer portServer hostShellTemplateCloses the financial year. The VAT accounts are debited and profit or loss is deducted from the designated account balance. This command generates two reports: a journal of debits and a summary of any outstanding items. If desired, a file can be created with the opening orders for the coming financial year. jaareinde [ ] Options: --boekjaar= Closes the specified financial year. --definitief Closes the financial year definitively. No more bookings are then possible. --verwijder Remove a financial year close which is not definitive. --eb= Write opening commands to this file. Sorry, no help available for {topic}.Specify the VAT submission period for the new to be opened year. adm_btwperiode [ year | quarter | month ] This command can be used when opening a financial year. See "help adm_open" for more information. Please specify one of --dir or --filePlease specify one of --dir, --file or --xafSpecifies the opening date of the administration. An administration always runs from January 1 through December 31 of a calendar year. Therefore, the beginning date only needs to specify a year. adm_begindatum This command can be used when opening a financial year. Use "help adm_open" for more information. Specifies the code for the new financial year. adm_boekjaarcode The code has a maximum of 4 letters and/or digits. By default, the year of the new financial year is taken. The year code is only required if multiple financial years are kept in a single administration. This command can be used when opening a financial year. Use "help adm_open" for more information. Specifies the name of the administration to be used for reporting. adm_naam "Name of the administration" This command can be used when opening a financial year. Use "help adm_open" for more information. Specifies a balance reservation for the opening balance sheet. adm_balans The debit and credit entries must ultimately both be equal to the total amount as specified with "adm_balanstotaal". If reservations are specified for Accounts Payable or Accounts Receivable, you should also specify unsettled postings for a total amount with one or more "adm_relatie" commands. See also "help adm_relatie". This command can be used when opening a financial year. Use "help adm_open" for more information. Specifies an unsettled posting from a previous financial year. adm_relatie The must be fully qualified, ::. If reservations are specified for Accounts Payable or Accounts Receivable, you should also specify unsettled postings for a total amount with one or more "adm_relatie" commands. See also "help adm_relatie". This command can be used when opening a financial year. Use "help adm_open" for more information. Specifies the balance total for the new opening balance sheet. adm_balanstotaal The balance total is the sum of all debit items and credit items in the opening balance. If a balance total is specified, then one or more opening balance reservations must also be made with "adm_balans" commands. See also "help adm_balans". This command can be used when opening a financial year. Use "help adm_open" for more information. StrategyFolder for style sheetsSuccess!Internal daybookTOTALTOTAL {rep}Database table {table} missing in {db}TariffToo many arguments for this commandToo few arguments for this commandTextual reportsTest database connectionThe WizPasswordError accessing schema data: {err}Adds a posting to a daybook of type {type}Show journal details after making a bookingShow version.Shows the VAT submission. btwaangifte [ ] [ ] Submission period can be: j jaar The whole year k1 k2 k3 k4 Quarter 1, 2, 3, 4 (also: q1, etc...) 1 2 3 ... Month (by number) jan feb ... Month (short name) januari ... Month (long name) The default period is the first period over which no VAT has been submitted. Options: --definitief The VAT period is completed. No further bookings within this period are possible. --periode= Select submission period. Dit kan niet samen met boekjaar, en evenmin met de bovenvermelde methode van periode-specificatie. --boekjaar= Selecteer boekjaar --noreport Geen rapportage. Dit is enkel zinvol samen met --definitief om de afgesloten BTW periode aan te passen. --noround Alle bedragen zonder af te ronden. See also "help rapporten" for general information on creating reports. Shows the Trial balance en Account balance. Options: At the general ledger account level --verdicht Aggregated, detailed (same as --detail=2) --detail= Aggregated, level of detail = 0,1,2 --per= Select end date --boekjaar= Select financial year See also "help rapporten" for general information on creating reports. Shows the balance account. Options: Balance on general ledger account --verdicht Aggregated, detailed --detail= Aggregated, level of detail = 0, 1 or 2 --per= Select end date --boekjaar= Selecteer financial year --opening Show opening balance See also "help rapporten" for general information on creating reports. Shows the name of the current database. database Shows the results account. Options: Overview at general ledger account level --verdicht Aggregated, detailed --detail= Aggregated, level of detail = 0,1,2 --periode= Select period --boekjaar= Select financial year See also "help rapporten" for general information on creating reports. Shows a booking in text or command-form. toon [ ] Options: --boekjaar= Select financial year --verbose Show in verbose (text) mode --btw Specify VAT codes --bsknr Specify the booking number (default) The displayed booking will be placed in the command-history. With arrow up this can be retrieved and after possible editing entered again. Displays a list of available daybooks dagboeken Shows an overview of bookings by creditor. crediteuren [ ] [ ... ] Options: --periode Period --boekjaar= Select financial year --openstaand Only with open postings See also "help rapporten" for general information on creating reports. Shows an overview of bookings by debtor. debiteuren [ ] [ ... ] Options: --periode Period --boekjaar= Select financial year --openstaand Only with open postings See also "help rapporten" for general information on creating reports. Shows an overview of open postings. openstaand [ ] [ ] Options: --per= End date --boekjaar= Select financial year --deb --debiteuren Only debtors --crd --crediteuren Only creditors See also "help rapporten" for general information on creating reports. Shows the General ledger, or a selection from it. grootboek [ ... ] Options: --detail= Level of detail, =0,1,2 (default is 2) --periode= Only over this period Account groups may be specified instead of account numbers. See also "help rapporten" for general information on creating reports. TotalMutations totalTotal {adesc}Total {debcrd}Total {pfx}Total {rel}Total {vrd}Enter 'help [topic] for more detailed information.TypeYou can use one of the available templates for your administration. You can start now.Please consult the release notes and upgrade to the new version.Export to {gen} could not be completed: {reason}&Clear outputUser name to access the databaseYour selectionGROUP MUST BE BETWEEN {min} AND {max} INCLUSIVEConnect to an existing administration on a serverGroup {vrd} has no corresponding master groupGroup/AccountSalesSales and Accounts payable administrationLossLoss for financial year {bky}Profit/LossSubsequent line is missing in the inputRemove administrationRemoves a posting. The posting may not be in use. verwijder [ ] Options: --boekjaar= Select financial year The posting that is removed is placed in the command history. With arrow up this command can be retrieved and after any necessary editing the posting can be reinserted. Execute a SQL command via the database driver. When using this command, you void your warranty for the correctness of the financial results. sql [ ] This command is only available in the command line version. Support: {url}PreferencesPreferences...PreferencesWarningWarning: Using 'D' or 'C' attached to the account number is deprecated. Use the --daybook option if appropriate.Welcome to the EekBoek administration wizard.Perhaps the payment of the following open postings:Has the database been initialised?Edit Input LineProfitProfit for financial year {bky}onpostingcmd:adm_balancecmd:adm_balancetotalcmd:adm_startdatecmd:adm_finyearcmd:adm_vatperiodcmd:adm_namecmd:adm_opencmd:adm_relationcmd:balancecmd:finyearcmd:vatsubmissioncmd:creditorscmd:daybookscmd:databasecmd:debtorscmd:exportcmd:ledgercmd:importcmd:includecmd:yearendcmd:journalcmd:unsettledcmd:periodscmd:trialbalancecmd:reportscmd:relationcmd:resultcmd:schemacmd:sqlcmd:showcmd:removecmo:boeking:init-balancecmo:boeking:finyearcmo:boeking:number|nrcmo:boeking:confirmcmo:boeking:journalcmo:boeking:refcmo:boeking:balancecmo:boeking:totalcmo:btwaangifte:finalcmo:btwaangifte:noreportcmo:btwaangifte:periodcmo:yearend:finyearcmo:yearend:finalcmo:journaal:bkstsortcmo:journaal:finyearcmo:journaal:detail|detailscmo:journaal:periodcmo:journaal:totalcmo:relation:vatcmo:relation:daybookcmo:report:outputcmo:report:pagecmo:report:stylecmo:report:titlenonehttp://www.squirrel.nl/relnotes.htmlprocurementy(ear)?yearexpensesquartermonthN/Arevenueprofit transferannuallyquarterlymonthlyreport.htmlscm:balancescm:vatscm:daybooksscm:dbk:bankscm:dbk:purchasesscm:dbk:cashscm:dbk:memorialscm:dbk:salesscm:exclscm:exclusivescm:hdr:VAT Tariffsscm:hdr:Balance Accountsscm:hdr:Daybooksscm:hdr:Result Accountsscm:hdr:Groupingscm:inclscm:inclusivescm:mappingscm:expensesscm:expenses accountscm:revenuescm:revenue accountscm:percscm:percentagescm:acctscm:accountscm:resultscm:std:vat_pascm:std:vat_phscm:std:vat_plscm:std:vat_ppscm:std:vat_okscm:std:vat_sascm:std:vat_shscm:std:vat_slscm:std:vat_spscm:std:crdscm:std:debscm:std:profitscm:classscm:tg:otherscm:tg:nonescm:tg:highscm:tg:lowscm:tg:zeroscm:tg:privatescm:tg:privatescm:toscm:typescm:fromoffsales{balres} {gbk} {debcrd}{fixed}{kstomz} ({desc}); Group account {vrd} ({vdesc}); Master group {hvrd} ({hdesc}){ident}{extra}{locale} -- Copyright {year} Squirrel Consultancy{id} MUST BE A BALANCE ACCOUNT{id} MUST BE A RESULT ACCOUNT{month} {year}{name} {version}{pkg} Accounting scheme for {db}{pkg} version {ver}{pkg} {app} version {ver}{quarter} {year}{what} for administration {adm}{year}EekBoek-2.02.04/lib/EB/res/Wx/0000755000076500007650000000000012165465617013256 5ustar jvjvEekBoek-2.02.04/lib/EB/res/Wx/icons/0000755000076500007650000000000012165465617014371 5ustar jvjvEekBoek-2.02.04/lib/EB/res/Wx/icons/edit.png0000444000076500007650000000132412165465617016022 0ustar jvjvPNG  IHDR sBIT|dIDAT81K#AYImADF 9AQ$]@mlT.` @2-@q(0777H)L&Cww7\?8訝rL8fjjrBa5:BPp۶6Bt])n(B4d4evvt:iRJ.//n $ gccR&dm ]1Ezzzxzzz?`Yx#(JÇ,j:G>h~:}~~VR\yi8mK{l6bx}+˛}Pg 2kŤlIENDB`EekBoek-2.02.04/lib/EB/res/Wx/icons/eb.ico0000444000076500007650000052054612165465617015465 0ustar jvjv  (((L00 %>00B00_  6n  ~  h.hh( ŠhB"S¸JAU7r!°q+\–ˆÇ0i“±»nV†¨¸¨ƒ<*h“¯¹Ÿp R¸º¨‡CFy¢¶¹®J>r™³—a/j±»´nfffeeefeffefffeEexfxfFeefe eje}f`febe@emeqfLfeeedesf`feefee]ezekf,fefd eSeofmf<efeEeyevfDfehXdeedeeffjbMdfdeee'ej] ceedeefebAdedeee5ia1dfeeeeag`!dfddee~ ceeeeeffju{yrjfeftb2pz{tlfee \kut{zrjfeVd%oz{vmgefbmy|wngfeOXlw|xpieeviu{yrjfe~fevJpfeGewhff{)pfeYehxiet}ke~elfa,tDqge7  ped ; yge ~  qe }guKgj{ l^p  pfe ƽ##2244-- nb --5500!!tfF ##2255-- n_#t--6622##x{))4433&&}y''5544** p##2244,, me0 CC^^``RR55|f.Ҹ77TTccYY@@## ht  CC]]ccTT77bAН55UUcc\\CC'' --OO``^^GG++ ((JJbbaaNN00 CC^^``SS55yj2 66jjSS++ x.$$XXdd99wx 55jjVV,,jO UUgg>>JJ||ooDDBBttxxLL$$ 77kkTT++ z/ Cpe#HJqq::0 s5V SS !!-- MM..6 00xxMM2i ")./ /0678AGHtt==u6UU! D>1%?? rr 66(( DD22**.."" $ ""ܦ*+ssSS!!'ee]]'' *)YYhh11JJqq::UUJRBB :s44YY""# N HODD ߏ 77)Ĝe$.__%% r h% pqll,, @ U&^byy77PPBB }DD=>a&%||UU!`.A??S|oU$ vw[[ ]\ehh'(7zIUww22Q~FF>> fl&O$qvkj%+0';;||͘˝˝̜юmm72rLU@@YFEN!ksmm--]MEDƱЎoo;;&&rrΕ̝˞̜ΓuuEE ~>PEE}lT9>QQQLH3__**𣣽mmF&&vvjj%%''Ɵ9W [G3mnmm9=[ɣ¹KR[zzNNSR¸˜K<1hnnn<<vuſğ~~ЍƮ_KW||SS!(  CJ{|\\&*) BAvxee00Ŀmq88nnnn99~~  o)G!!,-"$4H QQъƭˠQQ r)*'( kkþ66,A\ >L+. #(*»͛ԋteƷt,,_``~~ɦȪgg^#*++! ()ky5&*,Yc9",."69öԃi`b@!!--$$..DXXpW  "ffɿII]| cw W987 d< 0000 ##pqOO4Equ8 ee*fe::16  1ee fffdf?S+ 5577? 6is!ee  r7>M<NVC" roeeeecffgEc9if5Q`?%heeee]fhbd{ed6Q* GG4 WB<N>Lp8g<)Vfee>gf''d2Usqmk `(PGonjgeefc<jnmlk]$6TnmjfeexhWhmnkjer8M) frokj0R^rnigeeEe)B[zo_pA~mffMem|xkYbK{lfeTw~qe&>>-/ qvjLG .gwjfee1   qh;  pewV  jg:   ob}A  u:O L (Go |eD  jdke gWs""''!! `zO ''## le/$$'' )XtZ""&&"" i &&$$ r UU22* %%&&|b?; $$&& ~id <911HHNNFF//v***BBOOFF22 ef 55JJNNCC++t,//GGNNFF00{++DDOOHH44 &B99MMLL>>&&o44JJKK@@))se5#%RRvvqqNN**KKqqvvVV00pz ++XXyyllHH%%  ""NNvvssPP--IIppwwVV115&& I66aa}}}}ee@@ --[[||mmGG## s: 58yypp==,,llxxEEyv AAhh66 44uussBB++kk||HH6Y44GPP]]-- BCee44,, XK ADKKK44UU!!O MMBB ۸<>,,??ґz__UB$qDDll%*$$HC4ww33 F&ɥ{r7=E\\:>ك}O82x~hh,, ~KKSS??\\CCaa##--ϼooܰ<44ow|tlgeg;X{~}vnnKGcow~|tmj]mfu~}vnhfflIs}~xohee1 .Yh~yql aAT~{sjfeeeB ~MsgbLz$xm(51shc`yjct |je5q>M6peezz>FF  s` z1T{ te_ zd ~huL p me$$ t LL!˿&&889911j ##44::44""u  :2((($%%5599"" 2'S%%66::11r 449944##q 11;;66&&u..;;77))TO++8899,, h++))&&$=d M3""GGccffXX99BB``hh\\??!!  "GGcchhXX:: @@__gg^^@@$$ ;;[[ii``GG''33TThhbbKK,, ,,PPffeeQQ33 o U##699qqXX..//hhaa44  68nnYY..++bbbb99$$\\kk>>QQssFFFF{{zzNN$$  V GGjj)JJuu<< @@FF -FJww>>47:KK00{{RR!!$$ll\\(( (^^hh00  `?== EEOOBB DDOO X GOEE)y3=SSط44]]##&&vvhh++Ieevv55 So m944 AAtAA<<m_77HH c| s w wv |  n3>>>cs8>.MMѨD**yyWWffcc#% _ PVpp// ]lXj t  ; "))mmee'''``qq,2 , &%iihh'*' mS\vv55 UNN??_a??HJj.8/}UUF@aa F  7 $$ O55aavvbb55O/++XXvvei5>#`<11__vvaa35.WE*-VWuuii@@{##OOssnnGGFFnnpsIR"#X lI9alrwRY#*; qoo99 w : @$$,,$$B-!!1-K"dRN 9$$..#%+貹Fw L!--((` }--**jh.*F%W{UpU$Tw$--< t99-, 11H // )+  F%.!/ 5 V.%>>.II  ^33$ 2  R]$$<! 3@@@ 0 ++)) y :: BBLL "hh jj 3 $$ tI??XXWA44'' N3pp,,ff77 J * pLL00::"PP=QQ++ p v,82 n'f--(( f q**YY> V**nn c0kkFF( 88+  R//22 i <33T T22ccG 8 d.. II BBMM55FF'' 7 KK\\ &}}WW >!! ]eexMff?R# r44WW.. U>>DD 2B($$$$$$$$$$!!$%2 H s ..OOm Y44(((I T77 $ t.%%< T m ,,SS p22 :: _X 00""$$! ],,//&& |s g]U F@3((+))VVnnHH##HH'((& &.++56 6=%%FEENUUU_e dent ts _9  ~ nbVGFU V^d kst     vE44 ww0 >|8?`?@???`???????? ???p?    pp???????(¿¿fffeeefeffefffeeffeefeeeffebeeeffeeeeffeefeeeeffefdeeffefeeeffehXdeedeeffjbdfdeeeej]ceedeefebdedeeeiadfeeeeg`dfddee ceeeeeffju{yrjfeftbpz{tlfee\kt{zrjfeVdoz{vmgefbmy|wngfeXlw|xpieeiu{yrjfefevpfeewhff{pfeehxie}ke~lfatqge  ped yge  qe }gugj l^  pfe##2244-- nb--5500!!tf##2255-- n_--6622##x{))4433&&}y''5544** p##2244,, me CC^^``RR55|f77TTccYY@@## h CC]]ccTT77b55UUcc\\CC'' --OO``^^GG++ ((JJbbaaNN00 CC^^``SS55yj 66jjSS++ x$$XXdd99w 55jjVV,,j UUgg>>JJ||ooDDBBttxxLL$$ 77kkTT++ z p#HJqq::0 sVSS!!--MM..6 00xxMM2i  8GHtt==uUU ??rr66((DD22**..""  "*+ssSS!!'ee]]'' *)YYhh11JJqq::UJRBB :s44YY""# N HODD  7e$.__%% r h% pqll,, @ U&^byy77PPBB }DD=>a&%||UU!`.A??S|$ vw[[ ]\ehh'(Ϭ7zIUww22FF>> &O$qvkj%+0';;||͘˝˝̜юmm72rLU@@YFEN!ksmm--]MEƱЎoo;;&&rrΕ̝˞̜ΓuuEE ~>PEE}lT9>QQQLH3郆__**⣣mm&&vvjj%%''㏏ [G3mnmm9=[ɣľ¿¹KR[zzNNSR޺¸˜K<1hnnn<<vuſ~~Ѝ¿Ʈ_KW||SS!(  CJ{|\\&*) BAvxee00Ŀmq88nnnn99~~ o)!!,-"$4ٷH QQъƭˠQQ r)*'( kkݹþ66 >L+. #(*»͛ԋƷ,,``~~ɦȪgg^#*++! ()y5&*,Yc9",."69öԃi`!!--$$..XXp ffɿII W97 < 0000 ##pOO4E eefe::1  eefffdf?S 5577 6see  r7>M<NVC" reeeeffgEcif5Q`?%heeeefhbded6Q* GG WB<N>Lp8g<)Vfeegf''2Usqmk `(PGonjgeefcjnmlk]$6TnmjfeehWhmnkjer8) frokj0R^rnigeeeB[zo_pA~mffem|xkYbK{lfew~qe&>>-/ qvjLG .gwjfee1   qh;  pew  jg:   ob}  u:O  Go |eD  jde Ws""''!! `zO ''## le$$'' )XtZ""&&"" i &&$$ r UU22 %%&&|b?; $$&& ~id 911HHNNFF//v***BBOOFF22 e55JJNNCC++t,//GGNNFF00{++DDOOHH44 &99MMLL>>&&o44JJKK@@))se5#%RRvvqqNN**KKqqvvVV00p++XXyyllHH%%  ""NNvvssPP--IIppwwVV115&&66aa}}}}ee@@ --[[||mmGG## s: 58yypp==,,llxxEEyAAhh66 44uussBB++kk||HH644PP]]-- BCee44,, K ADKKK44UU!!MMBB <>,,??ґDDll%*$$HC4ww33 ɥ{r7=E\\:>帐ك}O82x~hh,, ~KKSS??ṹ\\CCaa##--ꢢϼoo<M6peezzFF  s` z1T te zd ~hu p me$$  LL&&889911j ##44::44""u  ((%%5599""'%%66::11r 449944##q 11;;66&&u..;;77))TO++8899,, h++))&& ""GGccffXX99BB``hh\\??!!  "GGcchhXX:: @@__gg^^@@$$ ;;[[ii``GG''33TThhbbKK,, ,,PPffeeQQ33 o ##99qqXX..//hhaa44  68nnYY..++bbbb99$$\\kk>>QQssFFFF{{zzNN$$   GGjjJJuu<< @@FF -FJww>>47:KK00{{RR!!$$ll\\(( (^^hh00  == EEOOBB DDOO X GOEE)y3=SS44]]##&&vvhh++ۍIeevv55 So 44AAAA<<77HH c|    n3>>>cs8>.MM**yyWWffcc#% _ PVpp// ]l   ))mmee''``qq,2 , &%iihh'*' mS\vv55 NN????HJj.8/}UUF@aa  $$ 55aavvbb55++XXvvei5>#`11__vvaa35.WE*-VWuuii@@##OOssnnGGFFnnpsIR"#X lI9alrwRY#*; oo99   $$,,$$!!1-K"dR $$..#%+Fw !--(( --**.*F%W{UpU$Tw$-- 991нH //   5ǰV.%>>II  33 2  $$ @@  ++)) :: BBLL hhjj  $$??XX44'' pp,,ff77   LL00::PPQQ++  --((  **YY **nn kkFF 88  //22  33 22cc  .. II BBMM55FF''  KK\\}}WW !! eeff 44WW..>>DD$$$$$$!!  ..OO 44(( 77 %%  ,,SS22 ::00""$$ ,,//&&   (())VVnnHH##HH(( ++ %%             44 ww0 >|8?`?@???`???????? ???p?    pp???????(  b?UDHI&?M#NIl?.4S^0U\b}9^G&cu@h2>Tdk*_m%s H4nrx ZuaTmLw@WRJ/t\ybs:+o{5mu j|;YF a z a& w ;.' &r4$)VM F+ Z -*j +a"7;/;7KQ%!!A4A;%!"*'G(;&455HHD-,,/0&/PR4/TTE7A=976>48N6;A?=<C<1>]aAA_~YDE9ILHeo@KWVMOGQMVTQqqUWPX]Zxq^`fc{ln`h׃~hipl{ykpqqӋswѐ{yw~~Ι̜ȣƮijù¼Ϻ))*##)*##)))#!'))##!)),')),#)))#/QQQL.#*=QQQ/).?HQL/!=UQJ8#=QBJ9*!8?HQ9.!9?HQL*#?M\uiH9#9Ubu}inL)=huiHL#U\{dQ.'QY}bnQ.Dh}}{H.!?h}}id8#yW/!}viL#yd/!}yiL))}y{Q)*yH.#eH.!sd*`n9eĺU.h99s{8/y{Q.}U)zӺ{9QsϾb=sƵ}UQʸUQsϷh?eӼ{/+ͤ}?:jsڳh $I$+ͪ}U)++jojIxݺY_۾{dƦbDyǤu?"|ӫs>伏]$$qۮyVK]0ǝu>ϪeM׵U+CרsF+伎J$Tڪy2+羓b|ɔV XϜt׮sƔfλkڪz$$ʜyλ~λC۱w05vR3侓ƞ+++4ɦTٌӳI$6ʪz|Ϻg+ZڼgZĠêʪl3؟k++ܴzRTA+++t&$++$$++++$$$I$$++++I++$ +#!! $ +$)#'!  !!'!!!! $!#!!!!+$+ ##'!$##'+/L9.)! /99/*'*/8L.)$/99/)!).8L/)! +(889*#  9L9.)!+$ Lh{inQ.!/h{{nQ/#9Bh{ndJ.! /h{inQ/!)BMhihU/)2Uh{nd8*%Jh{idL*+;\y{H.-\yid9!}iQ.0`y{H.!]H/!$+`iQ#>`yiQ*!+O{H)@sH*\viQ'@H)Bd9 $eh=(ViQ#fʷY.Yʼ{=yƷh9nʼ{9Yͼ}B$$syĮH8eƸh.+cʵ?bϱU)ƪ}D\ʱD\ӷh+ݾ{L}Ʀb8O۷BS༏Y׫M຅M༔]ʤ\ElϫuDZݸ>4y]۱sYsཔ]ed$++Ӭs-Rڵy~ӵmFc۷\Ϡm۱y۷m$[~[$+ǒg3ʝyܿŧǜt۷zëǞέδ~ϮvFkݼGy6w~臻yCXc~ANToTNXGGI$I~[+[~3GANN+$+$$$++$I$$$++$$ $ $$!!!!!!! !'!"!!I!).*#'*)*##!+#).*!'#)*#!#**#!*.)#!+.*)#+*8BHQL.#/QdHQ/) +*/BHHJ.)9?dHQ/,.=dHQL.'=UHHL*!=BHdL.!+$+P}{d8#Y}bd=)h}{dL!MuV?)M}nL)D{nQ.#7]iU9'+++]yd9!dyn?)jIVyn8!Uen?!=y{Q)9eviH* }viH/j+$$++ed.{ƾW.bƾd/hh.Ui/B{=/sƽQ+ڼbLeuD׼b={?\ʮQPϷUBzϷh,+++ͮ}BeӮuDxͮJfڳDݷM།]@\7I$ڱsvJ$|ۮy_Z༄]uYeƍe%ϝy1ӪyP۳z<+++++Aګv<&ݷy`伔\Y^ʦy+++tsʒ$tgϠzӪڱzFzSIƝT$gT3ƫDZɸRAͽc+$wz^5w3atpC5kpa$++3++4+I+$$$$$++$$+++$$$++$$$$$+$++$$$$$$+$+$$+$+++++$$+j++$$$$$$+$$$$$+$$++$$$$$++++j+++++++++++++++++++++++++++?8__W_`?8?@? ?wPWwp*w ???????? u@???p?0 _"  * ?pG??????Wt?*? ??ꪯ(0`     !    k²r Š@g²wRbªv²m np-b c>> np*s cCCi m(o-yzshay2xmdElyztha`xVxmc'yowje{uhmzshai""l#!!zg""l& %%v $$ }$$ ""n O%zz + #푑``)1' xx!!:'' 77뙙YY AA@@aa00 zz * Z>,u03 X<2%kOƯ! _;w~gjRSZZDF廬55FF'<wbP{Q cccΖϒOgIEGɗPJ /QQvytyyԄ͗Ћ//8dj7?+x{wYw "nQt>rfXbcmmǼn +j  #=3Y   e  Z? !y ,   8Zfijc)eqxm0kmeHtscā9j]BTMmgo^ dm mV|r\Uo y ,aD3  Fgip@tuff !SS1ggxxttii~~UU>> ?MN*) jjww* *Jb&l- c22ᄎ77-  00S *IDB /0kVtNk[iTuZMICgb}ih`痘͍ccbbssܘӋppRSqMG{{̘~~::Ζ1wKЩmnF{hBӖ   &G 00 +3# RR ))_^rl'     NnukmDMv;COd?R3 6oid+pnhHHDRc@7Xaf Q }  %dO  rp cH s?448 - 2VVcc aaUT |SUdd __VV hhFF))oo99;;nn#*bTa n//ܽs6.E00 [[qs({tKUW A ??99rr΂##9vvmj r : w2qo̓u7lymm}77?VVeMMkZC:2b-GN! #K **##. L$7e((:"2y0"% ((!!>H)w;w;XZ >. @ F 2H z&&%%h & FOO 2 111 6$$v"" s`  X !(V &&mmKK%%++ **  ++    ϏLJ?|??~xx(0`¿ npb c>> nps cCCimoyzshayxmdlyztha`xxmcywje{uhmzsha""l!!z""l %%v $$ }$$ ""nO%zz  #``)1'xx!!''77YY AA@@aa00 zz  Z>,u03 X<2%kƯ _;w~gjRSZZDF嬬55FFbP{Qԣ cccΖϒOgIEGPJ /QΌQvyyyԄ͗Ћ//8dj7?+{wYw "nQt>rfXbcmmݼ +  #3Yˮ   Z? !y ,  8Zfijceqxm0kmetsc9j]BTMmg^ dm mV|rUo y ,aD  Fgi@tuff !SS1ggxxttii~~UU>> MN*) jjww*b&l- 22ﺺ77-  00IDB /0VtNk[iTuZMIgb}ih`ٗccbbss֘ppRSqMG{{̘~~::Ζ1wKЁmnF{hB  &G 00 +#RR))_^rl    nkmv;COd?R3 6oidpnhHHDRc@7Xaf }  %d  rp cH s44 2VVcc aaUT |SUdd __VV hhFF))oo99;;nn#*bT //s6.E00 [[qs({tKUW ??99rr##vvmj r  wqou7lymm77VVMMZC:2b-ĵG!  **## L$7((:"y" ((>)Z   &&%% OO 11 $$""    &&mmKK%%++ **  ++  ϏLJ?|??~xx(0` 0\Cx;7a@AO>QVL>eHCTk jg8[eb7W%d&-bnmktw) aT<(Eg8~ ym#ZdnUn W{[ v a Uf @}  s'  +* v 0"u & $m4Bm$kCd!':6! L&08 $$)#;%a*0l-%(!$7(t1-+-,KM,+009312QGv=Oh:6]:6948FTqTx?>F>>ZCOLCCKEdbGGEFPOJzRKLkPYvYIUSUe_ZVkZUWPXYZhs^`|zphc`b{hdeggsrlhcihin҄pozrӋsssvixyw{yΒw~̕~͙ù-$0"-$0 $$ |Cio0Q|CY^${L.h?9xC}X}LAfqJO/a/Hrz^$Afo4:zc0F{XdjC+fo5tL߼qed߾D ///ߘcj]y}\a2<2PçʽӼǚƃuB /// //    Xd0YW?cc-=cL LX9$WfI Mi5n^_̼W RczɾLm̲AӝWӎ(_Gw|_s3TgӁb)t,   / // // //////////ϏLJ |//p???~UDxD( @ =n.z;o_`\i//~%b$22$ff%\\%]-`Bi]2a Lf}yQj^+ABVV~35aa=>XXvv MNKJ wwBBWWӌ[9]]\V_4]qJkpp44bbLLjepk{v8Aw~⇇__ʉ>., (// 6 8)$651('3u8.(+ *<5ջ, J WFC}_1eyjz~q9gQx\j_a2+QQ33II _`**RRa_ cb86GG"P-~?:[pttᕙ##޽>>ll׫|00<<Ζo=!`K jSOi`>3J% l55 P@7U+--P}u$ KH''YS\ M Uz{pp86-fv8w|,]GG*{f{]rc889a\C!na4uk**88LLz}")99KK!!AAGG'FF!yZyy45ztJ99ggֵ䷾BI}?< ^ 99!!'((pE0u, %I$ׅ35h1,,xA-e:{ )   ZctrG XGN <KK O (>  DDbb//  ,  ??   #&..!cッ``s{~>pXXvv MNKJ wwBBWW[̂9]]\V_Ӝ4]ӆqJpp44bbLLjepk{v8Aw~__>., ( 8)$51('u8.(+ *<ջ  WFC}_eyj~q9gQx\j_a2+QQ33II _`**RRa_ cb86GGϠ-~?:[Ϊtt##>>ll|00<<Ζ!K ŋjޒi`>3J% l55 Pؔ--}u$ KH''YS M Uzpp8-fv8w,]GG{f{rc89a\C!na**88LL")99KK!!AAGG'FF!yy45ztJ99gg侾BI}?< 99!!((E0, I$35,,A-:{   Z  KK  DDbb//   ??  ..!cッ``s{~>p :> ! 8 Mj Uu v l%JP< j $ e |{''(')$(+.,00' 44513JK -~<<##!!4I$**")**2+((KHLLE03345}?88358699?:3599qJYS>>*<\V8A=>]]AABBABbbFFGGGGIIBIKJKKLLMNQQ__RR[[pp]VVWW_XX_`}u_aaacbjggllpztttvvwwyyk{w~ڽھ?2<>3C-DB6ڗڇIړڸX\g$yڧoW[PВ4Ei=(FdpceL0#f/5*7+;, 8 &Jh~@ڃOj{1nZtԊڷwϏ^lvQs:rSRUqڮYaHK" ')! }Mb|N`xGkmA ں]ՄڶT֌͝Vڂ%zu9 _ . wgS`Aa@G qp{p>A?AAA(AAAAAAA'$A)+5.A- A3&,AAA% "AA @701A2A;!#AA6AA AAA AA8A4A*9:A/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEEekBoek-2.02.04/lib/EB/res/Wx/icons/eb.icns0000444000076500007650000007322612165465617015645 0ustar jvjvicnsvit3262 CY, 4        " ) .   .  $ $  +F+ 016   ' 0  $ @        6 aC !+ ǖ? 5|ҭfB{ $ LfC4 W V!@  gAX^(ÙX  ޠ jˀ7Y ӓߤ3֛駻{q +̐3Ďҍؐࡎk џkܭx ԥrܱsvr˕Z ֬|Uڶ`C $ ٮ~\ݸ\߿`{ǘl=͡rT ť^LȬeA2ŧ_PˮeOrͲiT^йo[~ҾwYO$g~s^SMczzcY 2hzu^TMmyzdVNNt~fVPqj\;(n[QLZbjf^XSPIDeihaYY61IZbif_YUJX_ig`YTRJW]hhbZTQN Tijd\XMAkif]VRQIRSTRRPK VXWX8 KQUXUY0@RTTRRPQPSTRRPN D[WXJ 8[WTRP+ 3NQPO3] ! LRPO9MOPPI' '9 .@̿̿ $XePGD9 Pgz2^`^N[澱39DD@)#} 6dY"(da,Mdy>䷳#佲´ǔ#nǬ']tg ~_ ܒjyŇ4ְⳮvE;|T" _湅]2+384. .}6ߺu@hЀ Gߩ嚓nܨ!yٗt ׍ޠc͘ܖ( ʂh sDžZ{~ȏ'ڣ}n[ʙaПkP_̛fԣt ䷃Z翌^G^ĝqL=ʥvXLܿkEGƟsT|ʦz]׷g/tݽiUK$q\, u[QzmV+r[Nfx`= YgQ3kVO@Hyue[K1vvhYROUfx~rcWF 8vvfXQO`qxi\Q(\~|oaV6S{~qbVRM B^\YWL6[YVSPPMUYYXVJ @YYVRQQ@SYYWVP* R][WV@J]YUSPN );<2\QPQP@LUQ>/RPQPPIFOQP? 2<:* -CRON JON!fMPN@R;  ']D   [̀+  ̄)' 6?w?Ӷ#  -ǴwݳLjT  O뿴pKų GGӰ 9Ŭ jz  xm𽲴ű ,h{Y%4m4{Z,^a4 iW@:حٷ hM  Lf! (ܤ߲ | v % P+TѤޞy [,Ґ[$U9- U  'Ԝ^ +mU 3  겎Ŝҋl {^ ӑb T)ښ⠏寇wdΜgNݱvTѠkK~s羄xǑpΜdU ѦxXH ݸ_P ԨzXI߼ceÕgc̞oZѦvXI ξz[P@ pŪdSM fо~\P)vǭgS_˲nSU͸tXIν{[PM `zq[ROkybTR dtq[QP'j{cUQlhWPh}mXRK^zp\SOV`fd]VQO@MZef_XRPN+U_fe]VRQ'L[efaYSQJMXdgbYSQQ8, 5w40 3"7'?2+(0.~ɓ jǫX)8""7'b!+q}C'{k7fN41yr9(C)l~HW!bP pvhc90dhC '`lL{YUlUg ]Q dxS  8QTG, 2NVJ1 ?8QVG- 2MUL2 -IVN8 'CVP;" "?TS@' +,& (-(D*-&  (,( &.*  $.*  B!+,"   %2         ۈ      /  ,: 2z8J9 ۈ|h}o9@͊|Ӕzg 2ĵ13#Ȳ}}Ё-3-2Ȥ7.. ")5(>)<61(%:8#+ʵ ѸmE/5$rl+4'1Dl/sJ-З+eU" ,;}vB1I4pO#[-gVཷ뿷Hm5p_=x? /i׺r2 z5S:2&s׭h* &`սw40UĂ?MDZ4ӟY4xԮc' e3˂=*"rӐG7w3 +~χ@%pגKɛIg) nNЮk1-)f]/"Ye6 3nV* (b`3!Wi8?z~K# 3oS('Acl^>  ;^pcE% !GfmY8  >cl`?# 8]ldE&x *OjjS2  #IilZ8 +&8>7$ !3?7&  ):>4! !$8>7% !5?8(  ,=<0(:;2 E  g   a    O-    U     T     ,6  s  3]N ;#& ?(_ $_/.D݃(M(E./]T /D"(ƺ _ X A .Vq[/b ų*M;mhBp4hmJ t3cpS%}Y+[p[,j">]X%¿_%  4LNB) &(#   #)% ')# ) #*&  (' )(  &("        &               t8mk@|sg]UF@3+'&&.566=FEENUUU_edentts_9~nbVGFUV^dkstvE!] _X p$t.]xM78di<TTG+R(>Vc0n'ffq pv,82*p"=N3J3 tIWA" 3@0y^$R]fI1YeB m&P;ix>'{y- PHdoD ZoP-(N/3}6|Pil ,TqrpXk`7+j{nrre? d|mrs\߁mrpV+G9xljM"&ԥ⦰ē5 DV`aVM3$ z__UB$qF%d XO 8v YGz I8*61 +?i!qquW "]|cw 8dGߋ,A\tet_kb@DWlDF9oUQ~fUﵦ7)ö/Ce5  ").//067A6!D>1%    $"2.xO0.t A F #t ; ~K{p JG)Yte,D72 u%Ov~M' A51a!~ExxF j}`@mqLds`]zk, Som<EyvD0inV<*hp RCFyJ>ra/jnq+\ޖފhB"SJAU7r!މEekBoek-2.02.04/lib/EB/res/Wx/icons/ebwiz.jpg0000444000076500007650000003605012165465617016215 0ustar jvjvJFIFCreated with The GIMPC  !"$"$C" P !1"A2Qaq#BR$37rs &CUb4SVt<!1AQaq"2R4r#BSb ?ܺRD»QYz}ah|G GwⱌN`&ֶԓY.z.rHű!MJ S ?UY55%~7}mzo S綣@ʹyh֫H%ODXϧْZ:6;jwŶOE~|UҘO&nKjmc,%Kud'88J>u9}e+?+wXwQ+sõZsRzD;]*^/SfrS{?|Zjd}*wpII BڹTxE* 95)J;N]QҝKf{aَ B_-~v? }+VXnZcR\4|N9"JNtb *ds^VCƤp# mͻ˜2 nT|nZnSLxZSϺBA*Q 1^]0ߺj=VBxWDv$[~;-Ӊ JF H<A#|'Nbt얳eۢ-0nډN1$|\ [㘀 Ng,R=N[/ISV޿ڷi~_`⺈t'E޺iije\nm{[Hmr$rSG~~&V: ʹ3C#I#rI휟ewNͤt˽lYIb{UB]2s݃TO7Cu FvĸP>jB>WSN)-I=]r#]:*̒ Gƭ":&?mZ#4GCuz;VRܗ[;!Бz׉Զ59\$%)JªpD4'yiN:[BFJpce.y6 O*%W+4icu7 $_v\>^YuR$/mRWI~q?8za_ֽŬu! [I>nER6Ph%"7ɖe?5A)IҶx{LlP#[BBO)Y̟Œ+p#&Z+.3 n JVZtlmw@R*OXĶRI5{韶:͕1dshksaת31NrtQT踹V bfl0[m 씤mq@!)%D`bF]u:&r4))UʘCh>fXW:FRN>cl+bWl%?DsR!Gu,Ʈ:=uq*H"ý3I'SnP'S7k6TAb;'2GUmnҳZB^{ őגCrnc> my ::obߧMxP0ZOw?2NI>W8/]'˒ܭ)JTj+&ڈ.ܺƗ*d]Q8 3vo:KV7ٳu&>Im/m>}q'>Տ]"k]EĎ@ *CH'V#.sZ^ęaDX3Y-熬(%w$ gDԧp["©auWH,O ~ӕLdyGIVZCWk ;jE7[{QeJY$k~,q;|B0lgWHBq̓J6i/֣FֶLswn{LePIB %a p99GƳ=?N]K~@*l_{Bi<;Tԭ^ŲҖ/ Rm`>$b/slj:9O\- 5%QVEc dXklhh$+ހU&#%KiHT%Z4+}InQpUBXk7`6N 6AYF='8Rg[64;vFI22-$bƻKz:rh[f֔FpqA$3eӧ궝_ % _| $k3:&ޛnr7e6#BwxIە/eIO3klK};b.toDX-E1Pģ*J* RӜOj[r_uXjSqz)َO:8 \N'뜭t-nJ+Gv}3nRThI'ӹ7k⺷mJY';mI_i}wh"i.3Hnro.y-u.~\$Fn*]js?$ @TkD =/ GoIc.\'TQJVݸ{ڝ' V뮈tVfFnALwPmWRї{FP-i} }cɸA1-{(œP>sۏNV_}";qZG&. en7cHem}pwqbϣSjgpx޶tU*k)an$~qaJYݏ59idީ5un{r]QK)X.(_q..-iF~RéV{I7@KFoMFwwŸSW֐Ѭ/[ZC\~48?!*?ժAs^G+5-Ek6Y 6$),0)j8 $xBu?%S)R\unU+l-'!C :~#,p`iJwu{4m' )UTJL0q kR ھ tM_fsq`(QG{`NT;,$ VMnIHbdNq ߊnNw_!sd2ڹ(O3E"d9**; c/awY,q!ևWIK BJJx>\,aN2NTy Jy!MϥWr$+U@=H?/ TLiܵD9N0`s8qWO*g~.σKft4'LH+kOZuV΅ Z6vy;-NG+z}7/.ozBԑ?,kkI4!p1_Զ=3C!nK9@g*K vmK!AăwJpq,"eoӪ6[E/k1)L||E`>@"ce&$7ĦR㌜hue\+F℟AO`T:v>Jqv#Q\鲫Z͡趙…G9Ůzv:ELM1iעqX`I 661֨2%yۄUQ+gisCڈh^hgn,oZCZ}sxHPP9/gLКW.Q.WTEܦ R(TG|y]!27{G<},[y.wxV<ž|ٽ9Hh~oZzŶ'RRJ8=8N'kvᦦ;8&}&nW X-/+ZUh-{tu-5E}qf;d* G^E9.-HK]A bc 7UnL{@nT9tu TN0--I!ĩHL#g͚qR}Ci!)ўqI'> oVn Hn& Op_}y-zwܤ\:SIǭcm5j*umŻKG% sVX =q\Ґ_zK> :RBf0-8@p))Q1rsg[eW♗QM#y +N7v5uޭp'h𯾼66bUrJǽajYU)d]֝9쯨LWj[t%ɋVߔo:'0TiQBRRU*٣f2RղM\)GE'+ h'x_t6oQnV(֝]2o)Jv9@)ܤQXcы˳-퐴(6xT,j#6>{d93WUeN=֛;)SQNi6U$v>:b>%R^l6H\KE):zߣ}ݦ#ĕ PmnI JPq Vv8ĞI[lZE͛Skj1e[[>\edO"ɧmn<,,A[p\kp)C ` mZy;I]20\u)0@x9)@q$VC9ui\y-&ceqS/!۩ճiǡ8Cl#mzkT[ &][!/!IYZd;ПCxo]@՚mizݩ/Lʅ1! Bi! nX)* cx檭-K^6 9kY\aVұsUjqFڻ6-d$r "*a | p)&BS'aN0/L14=.F TN2rT;v$k閫tUJi/*@N IRBNlW^=g K"ΤFy! )Iu+Z+L[kI͖^v Uw! VF89'+RiJ"f(7ZuN;$g#t!<˅dmQe!Y7.jVB.ꔌ ~5K3a.MΊ BފhQRWYB c@ߙU]b,s5,I#V?ZU@;+{_ן ^ĩ#n2s{z" mr[ O2{`$rr1LT" mwq8r 2]S P!@)ް._Vy!*~F)#9QW| ,Lo.ςiƩ_g?.JKW\q\q(5TU5zHhH_#m +#-OH!ITBRTɬabL06%%%`}REC#X^RE*Z3Z)vP*x[`VW]WԘh2ft #@%E\d *'[lX2Z$ T|΍8q5=ŲRh]HZޠ7Q GX4eMd;|=k1bxm:#܌eO؛uL\ZA<葤ڕlqFp4kpd"덴ڜuiB2({"'eE]r^j3 }MZ$;W֤=! P@EU=o굆OAnZKDxeЅ!c< 3-ի6@ |UU]S su[BȑlLS>\ae5T7 2|F CEF 'zVdftRݏdaZV.RSGԕ-DM[vnM廴8+LTVܗM&:h'|g,uZˊ@C/oiKHm d>8?>ֺ骬-sbCe%䩐R#$]qP;w6WS0iwl_q mWȌ4{p9y+J6TTGCVJ#mKC % S~oB@}ɀ5Dvb#A҇aO2Y|QSجRڞ #ﺋܧ8 H+k )c>n8VVf<ou52m(+BNI!8r1+MyƌnXb7fN\&xN'*ڱ_{ݧܺ2(T8NRQH~!VIjZhzǨI\.N-G#,dwʶ0_){r5-3Z_>J _nZv5KGpܒ qJ8H&u55]3$-1kBFUP >Iz9v5Uy.PYv]w$f.́zJq*Vr S#ިǽx&#i䶧Tv,86*mHA;-i C[3޲2&g]l/l:NhkQ@>v[M!֖{ԯ`AJG<<"iM>nxOKqJ q .ҫN͞{QE@ORm:kMLg=.%*1ҝ-Yn$6H ǡ6XwDiGڱ_orCIszS*Y*(I< >M٪4g]$ܹ"@y)ԕKv[agocnG>KFCe*rGpFy #֥q+g'A07'UZ*Uש2}QFT;e Ճ=jPoEex\u@fDhlE8$02{7K.;Iaݑ'PSoص\T~ኦtu*ׯArb35@2ƭCgRTkM_h{5+.䰉PIlw=Y,w$@rhm<Vʳ8Dz'X"P068O֦]n{Zىb DŁ m!O/IBsگqFWm!ǚ}v+Rӽ=7Lf]mFZZZnGq2ں|_J }l#ZD|T3թq 6ZfJ4T&rZh 2ʏ'w Qi=*şDi юJ! euQԳ:K[.tr l5'tIJkrܱZLZYm$+\pAZAvA&^05v23Ij2YKI1 !>=|})MFՐRBqTcjgYox-xPq 1cc;6ֽZrNV<\rJ;n/C\q'TW U0:bȌACmխS n*Ϩ74pZk#rV ΪV%'jBNT6}?ZuHQPq;g CMm5KYd95Xn\wyFRFG*9ُ"S^YMr!NAv Z֋9XqpmH *MRJmk F)sXdڕqKɺJږ.6~#ĸ'9nr LycKckBqs T15{"tsy!A?8R0 3ںt+>{Sń볣Y xm Qws/$4CbNs]_$ˡyF___~%G]`=dR41pL%ڤS %#T2ys%G]O0ܘaє,aB*Opih-a_G2l\ܞ+ **8Jw,ҫ+oK[gUK \iNmX(T>:_HX4yv +qc$O=|j ׈KHʉ<}~ 8~-nJm)N56]ԏ(a@=;M!]5<8f-I$+k ' 5z2lBPF0к[^5D(I;gmVR4iIZau;T\e>Ydԏ <}+ek: % NxHuEӳ,sm蒚-8Ӕk.򴄫ޟӓW2ZSrR%I) qv}92yLaUKޞO{`M*RMDt2))=f&>ml Ô -$r8r!6-GQu#TrJ$y5.'I$4O}P5Jow l".4H}6H}zCi=O]=7i Nܲ\Z+nA'ɭٴ ڢ p ?=HfHOmĂ?ebqVnܩ*Mt-+3Š;|8G'뎁%=XϺ/Q†#*Al7wǧstfyG5]9(_jPފfӤ)).HxBa~Ǧ5.t=rHi!Xqjl&2X+)p5**Lwڴ !'}t痿I 8Fmw\- $HFeū v )C)Ǘ 5 OGxq}>,IVݧqRVRQzP4 *«__R]QF12meCN;GF*3g[JR;!DȆ\$UsڰI&*=vK*HyQ SN;a > {OYԨV\\l7)(iSxu*p' FV2{ڊk*@H*K%_JBTnp?"ϮsGcMԶzvn C1Qr~VԖan), ޠRU)W'}n;uSp}8jA%^ Q8i@y9W 8l}F<ĉh4~6egqJ@ExJ%IڕK!]1(N[$hZ$wҪDAYqGlp_eĝ ռmPZpAHP+'J#z,NEaf[ϱ2#BV]SBV`(m#Ӣ^*kyt(%ֈQuEIQ^啁s0Xhaeef1׼鶣A-i+RJL3BJ‚Aݓ8B0Um| /dIU ҽH[>"OxN^H'9Uݛ:,~[S~z,t9!˒qN)*8mjIAV3vC8#zd 6>[{hwd2N8YZUKw ֨ݜzoxx`Z-gΟ8nL\ޥ%('ʄ vpۧNjs2lym9 S3d)Ljf͘lKQ#+e%jyjp:A~!;FsؑۊV BK JDÕ( Vg!Y:U;6U>2t"(8O>$$$ Sfi<ߏeMRV^-N÷)ٳU>a^ҶYr|+AhKJVohb@v,\SpDcEj#d 67yݒuC:$!/5k9K|ROpugP෕h$ gC> /ti׏ J3.i' e[^'8Ը؇͏ PЖя1aZɾ#z=ޔb&n٦Vލ=/ui#`}(e(]~ TUQbgj7GX\ߖQB銀@銭/SNP@q:7-v͖|5/IV : PYlsߣI xlIENDB`EekBoek-2.02.04/lib/EB/res/Wx/icons/ebicon.png0000444000076500007650000007043112165465617016341 0ustar jvjvPNG  IHDRQOsRGBbKGD pHYs u u-xutIME  m: IDATxieU97U*JUeIUGKeI Cz0M@~4`<63d˖d[e5T*+;q>s3Sx//"Wĩsޛk}`[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[e[,JDExPҁ Z0Њ ` ( )14N AރPePh  ƀUP9(Kރ{l{g9HJAy E*t[n_  P1AT |{:0ӂ];.ړs'1L6av&['n6&c+‘A9(|NCՇl{(<6H0CZo?s^YLU`1(|5_Qy\#$`4u2O7Yn2P0RQyZ a03әemEk5*N@$Q 6rTznq]Q8?XU Y*4U -\ǟ< &ne# "%|+xMB0Q2v2L4K31IYU>]%h&`XZ[hTGBk*QG l#HD1TȀƀ+J—^ #" *F2+1Ơ1%@FaM!ȴ,Z(Sl&^z(aT x 0vP4QR!Cb0acEY9hRWW? B4RB$¾IVVDZh65iH%Jڬ4im2LKQD4$b'Q4EQx1O6{O+-PޓhӊڔE HR8NoD'EL8'T>*ՒhE!dg5 e^ N *0J$_r.k_]@hcmР,@0K5#EyơیhlSe/Xvhr4ʆbJDxe[*hǑ !Jw2Ko}={W@k" yp 6 "hcS9y!Edbhu1뒴&ɋTZRe(DimAW)Zܭ|SЪ2$1+dD Y)h\G^Q૔.(AJNwD װc6lx㛏2=hK^hLNR9Ώ'裪zABTCQx$C7TxYF>Y#=FGJP*$MrD4 KU>G%m|YPhDk[467gOqLV3 ńy"@wQJj2x &|CʃuKĴ:B-ĥA(k7F{ek;vbD!o @#!!,-8iΞg4Ϋ=.";AY905 |SG1D FF%0 IH 9Uy/u_T"I `Mpy"AZ_>Cp+;KaHS8u Oq:4Zu4ݚgh *|ˀI\gyO|M\riH!^dn$RH)"x"LdX"?!r2; p\ A/]! v$RPSA5P`YL#cri4WdGw> "iyNsQQr(\gD>Q5i8!(Fr(Je/{JD|}lxՇs"E)RV"y%U"Lde 7. pϤ8RTT t%(yh/uL<)Diǵu~O,uDJd|^wkA~DIhDVFOH=@.-BT , F"q"t_d(#rᱏz&2"J/)8EI_ dH*"}?3k"VO$S.EX#c Q H(E l$kC\ BN>/Bϊ1$R]02fdо60/0x G>)gUy=RD\Ug$^F;/y&D"S xTT}Ϻ%Bzc'qSB/ʆIcU{E(@U.(׋H!au|i X[4AYЦUug4+BW[n˸+A.:$bԼ@&0(fIeB/uW>*i)R{52DFaNev/kyo>&NKCW{\P RZq.mNqrX_>?>ʱD)D|*2EXz~SEN0yqa˵Dپ4dq]DOIHk|GQa p`G>@H#|ޠĠ/, R09]jx_\ـ7-HF*sqM?ſch "M@¡ .!QE+¢`Jչsk,b ooDoϿ6];]kwaD٤ʇD&* o(&yx|0#Ʊ{WnFE #~հk/vZ$p(<5@s5$x $X&@ :Go 7~*xI%L*P(zRk` t6݇( AT6\ 7cWۦe`,Hb(D {m :T&VA=Z7h׃yNA nحs(e(]BUn|b=@@jhՖsqZ*,CF ׿ !w⨁֚eQeW`ϾqrԮWy!VؚU0DWظz^q4:pJlu (r*)ym ^4,nR9 ,:%kшhDT5aVBGzF<j7 +I |+gp2<^w9P}U[PMb+R(o-*LNβ,gP5Ia nzQQS9e̸-7L* R&+nVxwfк) /a|u ]#T"[Qړ͠U# )-j0`;܇{(BFX ̝Wx2(r0&GY*~:F|yo05Ё8}]=(lt5B aw r0ݘaUTՊj _/0ӧɧBT6$_ŋB0aBxnxi]GXoGm 8'I!@-e9:=ً-ӌA+X^hqN׾_6 { R>m?c?5jDpĝe,qs9|q0Clc"c:ʆ7 @{w}CXr_%pu_wb84AO _A=^5Y]$D1/ C8.56 K*LNq+=.ݍL86sMTu?MPփB%(,^j_&{KVƅ(Zx'=^wU`C+s J.[נX^6pJc \5 L7c!fCDٖo0@NC(!Hw_$`@N?υ THxk.*@`!x?޴ƴJ= p4|1WcUFz!amWQp8A 95(*I0O}n 26`DꔵDIQJ/y1 x¡`/3Bò*Syip&Q$%;GvGkֳ \ɀJK'Pj[BI |aCNDVhJ x"pM1U(tbL)e^F lW| h_."r,<q+5@ mCE J4TRp4zz-x{FiKވ Wp$)OU YxCUu@,$#*yP=^~a5'C(o0RP8 n,JXUK\9 >z bPRgZ#5b+Dv׾0ک1g P6^ocCB6Ij~3)=М!Z]Tٿ5^4zPja1ē'M N*nt 7 qc/aZcKfPe  Hr`[_=iE+dr&cL EF۵8hd1(n޴ T$еZ(GQUz4\0(m72!gZ_W*‡uFukw>HلpŁWq-4u#j8p~K/ 7ҷx9|V} 4sOÙE8viy7Ah4Z%$+څC)PhlլvP>$ q2“ L9A&CEW 'цa;\cS-k6jˁHTu yA%@rpxI H1k3Yj(i ϟ&YDBY&00$қ@ -U$Lެk6Cy2@S09>i֪ Tuxm@Y^r_qohiMB4t^{-BekVnK3 ʛ: %r/= u BT> |3R DQ!(6JָeGt@32_mM{5 zОlV? zӌJWmf f Ե2`P3wWs5|ͷL">}7X1O4fmlTBEǿgpEyTHI * .f+瘖C,pߜcJ@5`I0 ]'8 )@CŸoXx;#0J V4qU{&^~45%6e0 ݡ,Xy"*gT4Z\]ETżPgBR`L yކ7jwpuh߻#JluK~4cx$v?v|VPir\ .<*9KR%=Ӕ̀" 4Ri2)PSm$*7<`sǹbK6NCuBh r{>C@.69&L PE^-yz/ QQYP8߽j2Pn]k_B]Xq+(@"0v\,T)Yk2J'z",\ CY j}.a@Qʣ>0ZEH>AJ GtIGuX MT7CᜃךAbն(Cm&8D0!d.hFh퐡V|!fRH G,q`٣U'ʃpp/lDAl>hz0Z}ʀKlM\ל'wi(i[ > ]Wv #bH DL@K&+g8xn kǐE \1Wm`o'Qy]4>_Ct]zw`+2 :1xI=ڳs|seEW0 +ti^ 84.yv6i>'| Ose4Y5/O{_Σԙ0Cb+j_vP<+v&M'<3wϟhr(TIqtY^qhpvY Ws^o>rfMlW_n\:ӵ<i#Ӝ< B,ɍ Z׵KyBUwj"U:-τx"Do| FgDƂaߟw]3G?Ƿ?i]xazN:>_˿؅7?`S<_{=rKUv W%k(LN&}JY^~KU&1 ٕ$59p{%hؒ[9*Ȥ=~vIf5,aG=k IDAT8q[QUU~{w|.R v朕.fu+j.NQ~c%N&DL.L `_ĵ75K\dwsy^yvy``C '<*\y/仾İ(>BVOJCݰ]2m?kx[­5"(KI'8t *(<~SٿN gZW2y]'꒗3N?x?]v):vO1?a"1(vjȳ#rXf?rGp3VUh jXh(;xp7ٹc?\~94'Ai~,KIy)̉9rˡk_W^UP|s\c/|QV?~f`41Lj_JeyZO%oU?reWa4`J"2{|iA.XMa$tYG9^9) ͉@[:y8,|?=@VGe:'hSU*UInO^[~CIJqMCi 9OSʈ. f]MG>4Sr_oGSS;g H^v3tBsͮ3_e2Dcslo=1pSbyId;/fK?L!AoVg8>͉w05p >su< 4}МMyJ V:ZV1v/9W]~.<c@TY . `ѐS|;B9Fw.ܷ n);>Ñ#p7t9o4Z! Xܨ.]'?~vM.h5L@Ԡ,-?}_t v@k %}<$(hqAs4<#"0ds<_N&]&Uѡb&aXPzTɇ07!;1Lqͱ\z\w\x LN׍~M'it/cdH}3Bry ?ΌQ! ]`;c4XUulXstt5k0*h`0V͜$) hLh K[↥ i6Y.,s<^")DC91Ӭr Y0;`R Rl VW82uSPp柆0QXo|?Nb XX? y?nwtL-3X$3ZaHq9 ),5i9qDU aUk&1.PUh ;v'{< ] -JmT!4% 6mvm){; # pvFC]as\.5(F)+2x$gu {I4D:UOZ )eHBN`,U5j1̖&y9. V=%Qt1%jQ(-.3<4ĖA^ :Y,ƒNlaueu4ȓszx24-,StW#FVX3=I^_y8qa4[ìi&'нYXH5it1?C[a}}W4MrVk'+>)"|hGƠaŽ-p g8,H}UÆHŠcJZQn(DÜ5ZP Qcr:moun(cQVPơ?ouD CVҞ>S)̓-zrXiP&gNbL(!"[\duyK#KW4Bu^)aUE.,* at h֘jMmMZčFC[EF%KN2L0d=GcA $E3gةE6v =$͆NH'[X&?9h0bBl"2$'];"rgOG9yNyv&Y+:qF3ZJG V(Ks24ROci@iz$j|igkOa?71׾5) =KoP-zb@؅y<A`Ͻ泟Y#&MW0 ;FYCت3[l:yw47,Xf,%ό z};GbfxuRgKEwuHwq_1W̰^VGDy>!"w삏a;PiR**msž |f mQ4kOژ5+[+YV #Òl%H9X,'MMeWXXs.{=_爂gѬ#QDS:-,SgWY8{?0ݒG2e3\pz L&25Ѳ 5&*5ז3N:pῼlh@v "χ?,S낾ߋ`!!u%!rqNt!K}>=>㽿OBܪtJ[MߵzתQ-8x>~n;Fztӌn!K̳!OQݿɏ}F%$ggH,WeuqhpsXuR:!#c+W9tp` $P讷Z'Y՞(0\}5|k*ء'2dX,[o}~AZ`nb89;"' ?tm 2\*nzrz0=3Qe{G=Wv.򻿃=tĐJ Z='~2/{ѿ 7Bdzf>1C}Tgo>WJJnS )yQd#r / Sb9mp'U.'8xGº,Ś/_3tD,@44-X~c@6׿^ N4H#&|- &l76t~7HװUUṏ; Oʁ215W\ŧ︃S]d3E`2%g뿦yPE.}wp=C"9CO]Ⱥr3}!PP"J\IOsK/A Q%^hrBQҌsn'=P*LʲdΣ4pM8׾©uҜ! xEE~W/{KǕy=_n:;%=,;Z;PN,ZJ r2&`1c_gsx=\2 ` $MZRsWN'k{Wu O}zvٖ 8׿wZܴ?:E'C* "#],%^w(l2P -9| vq)EEZWtZa)?`VPAipЪ<2*rQ6}:{qEB$AJ˱A'gJ*兯7?N5|k?ZbY]a-"5]RHstFn+_K2 䏐h)0q yybUQcS̱.е3{Njx߃ilo|Q҉4OnEq5^K?G_N^qxa?KးZ?3q`*|C1+3°-5ǚ:oKྔd0"Q$"Zd3ꄥ7[(\C9)"_P;"qs10 a# 翴fKZ/-$.Wlώ\Gѫs)^v^^YPpN{%@oUB^K:BE} <@\9}/WkLTA6g% {57 uQq5)n}rMFG@HaT&JRHJQ֗|:9]K*7y/?jA>6fɝ>\ב9cU+P2 p_>?|&`/Fm <2fiA>Ĵ 쯥 {?Ϳz\n%Acsf G븹b%(_y!= 2UPb 2EII&0b6 sĮxJeakp(ߌTS8O u }K+H#a#ЌK@AְMNh2nUZ>/-W 8+_m ]_h=,ilAIٵChp-.T 0왉nu!Q4%~YBH JX/ɹbD4מ!ҷB2ɐ *0xn`#ˆܪc Ǻ sX67pTUJ8G,`# ﳘ.*' ĊAhg5( V}aRs'uyVA2,$UDB)ˆ B44MT(au<@W.OHpu;`y0>]' xSwNPCHLi1,|V^_ޡdIrvSSRPK y!Z&#CYhKӜ0 rHmc7T|qqCTsD.*WU|\PtB4UQeCjBp烷Xb3rQE[!o6z :>u{Chqql fk*#p˹N.ADcY2 C ޣ$wYudgJ` 3İ@J2)NmN3V`J2Hc I322BOK6O7KZ._\c.>6k6پТx(XovLa&CejcQ␍ad(d/>1Axu?S׎pK=!ڠkYJe G~HCm4a!H=įx&i,a6nUBw'?O}"`lEmI0 iۀ#9}~#40:J  D չMo;5Ϊ/U9BL[w0mɅr'(*d {I4Ri)=;kz]y(GH^GxzQQɂQ*Iz@(k$E&`@FE#5_xϟ9}Ԉ \nu99#ͻ9qLc1O`pi1]5>0?G0A ݇ > tGHIȣLI 4BMaK o{[GLLc1)78{83j~ޅ^zsouK+r^pL&ϢY !"4&JLÀԇKxwxƑ1&JΗng~DyS~';zskhC~G]-Z"ẽ{{)*q z ;.>V8u)S_[~$(&; NX[6&0uLߢZ}L2Z069MurE;f$W rGHsf+ǭ78~S{C20 SUZf}ܥyc Ʀ|fg2U 5")RBN>#'~+0&Iص nj'7zhsP sx ʭ"O~AV7NH|ƾpL{1|?&/Ȃ 8dGj3z H朇BWܢj;Uha<ƒCy?+>i(9|߾ǩ>Gųu@ys[l xyxw ce3SϬO  Z9l,r1>Di<""ae3cs 4htW9/yQkjM#R.MS)qQR*cBKEF`Ɛ4%tFʱ-/8orttʞ2<({6CpBDm\!na@yc)A3塯}MςW$5&q_A}U6 jQ&`lyG1Tz4jx)"5cdLF R&܌s3Rd蒥6HTAxT0LBvIR)Qƶ2^2 N*F!90).!tIc_"I P7%=*q$Y1rph zEkާS2]oqeiTa @Oɣd8nfGߔ#A:[yR0'1k )>c qN@c<3o€,yꇏ -JJ80dg؏[P"*Ll}*{9 ˭>VTȈTj5'jܑ 0B]lS&TdY -GyXʩ~ZDByω VHɂ*p`C狡pAKB퀺 XIF;hpHE9LuekJ Dwc ~F (u*<'۱M3͊*ns}[5ʻx bJE79j[z60PB bdP]- #n۳mCtZʯv VNsIŕz./8ˆhQrWK$.Q@&h-aS4WݾsveA=s. TVΊTc#ւ$ڄh$N1}5A0UY#nD٘&#CW%Lrrs~JMsV Z$J'RlEV[-aJŋ^ynIi)=z>AJҧB1.Rd;ZCº|6m2anJ>̝z^"wzCM- ,)+l71 5VY]Y0Y6!iV4,u|U16;׶nS>ΝJ%? *OIk^2`SJΣM7i R45l.̰Zx 14ZtVQ$?]Q~Ǫt 6\{]|_Ɣ% OD ؈V؈!ʬ)V6ۤi:m9m _lk~u-?@ch'd.3fA7]c-mY S"5$i+<.Ӈ+GnE.ŷ!eiyvԛP$eN=P;TiʜL̙\0$(cV6+u ey#lF\2a$lwB֓m /KŘW)%RZhtm kǺ0,qZ͔} t$K ` !]RSbJNAE  r7>HrU ZQWe~RDsm?g~\k01%m)IlkXNaKGY'G_$n3xiBfe*#f+.a16,DTL+# @]+M0"b(JXBaBCKh:r?iIH.aFkTC'%ɪ|3-?GC_a48A~OOMz 9%s(-]nMx/B(Wbny]! (ijC"#K0$aI"YfE}ʌdsIZ$EDO V5q+ں#kqN!)T)7Oy(`/ߥT%*|Pz&!="YzY%Q#Ź0K*ѐm1obvy]yV2Z$$:ztdto@g.DgܙBϕ& ;R ocPϱ'Idf(! =2|C4[_ZV@ f",㬟11HC-^ Z-]󇁍Z;w!$FvEG7ʈ8 i+Lg _VVtcɲӰ1y;~Zr"ˢvox;x~0\"[O0ЦMD~ݐ9W/'Fk~MZ8𧟺ޚ+*M;ש+K_)*U" ?Z2ރGPIX#!RKxl`26yE++ꡇkq]LC>OD8 re!GSΏ$hȐ>\-*DLw%@; -w2ec@ 3O/sϖ(d~7,%ܖ'߾QVW ʌUkC0ڨllȾ1IJ%B SBQ7c+y;3picݬ'Cg<-CT@RMO3@Ut%n0")x &:s1DHM:ɯ,QʨW& ׏@/J%ags|K>o|*NkұE&-BBYb ⋼qKp pA+;ŽXc*m Xq xF(}*Q2N PxV<+- VH)&)|st( :{ {|%Z.s1ۧ .$cnV(:d\C $4)*1uʸ5`F,쬉‘vJC7}ZXɊ4E'z8{#2p9À AS iMy阹{&TeLtKl\`6x/ ^Y6N^'t]W9a"EA>r{$<0|/qc?B8$OI #_Pm7w0f;HpQQqq؋6Bj|CR>Y[H*)F?HbZt2:7gus5à EH@].|9*cL}do0RX.(D J8K@ ggZq랄hFMl$xnB_o}{Vzl,3`_F >ôY<4Elpjlrgp-I5yCy~nƆ[&4)ci)z*pϴMp[,}sXbT9MDgqYcM,mnƖGC/mza6ޔ F}ryzSLߡSghc1P'8=mϜ$Pl$ >VY>kcGBn9QCX_lrnq%r~7/b#(\acs ۶20V+@O0gz#q:TJTH)ȴ0G@X ܀?~e.felĝKTXQ o^}Oȱgt _ę'q U^Ob9ܮoxމQ/Tl }<ЪMKf21` ¹CxCl3tΟc)kx[UB'8rz~~>GoLsLsc};#o=H'a\r}}`߂XݠzQ O.fN᯳_߿ }Z\^Ĵs^n+_ӳ\faHdԐk+#=ӛ5/kaJ,ySŁ23x\7?,2>^ AhR.̙.':=|!m~7snω iddYBj7XYpt#TTbJr~>\IcHVFk;U7taVq;>c#RC0 /;75c꣔V ;Iv[ V[-c.%U(T~_ej~J0SĻ|sdb;n{bTjF3<'\|yDw",fNpDŽJ* E0Ӄ%jGDwC'9DC$7ʃڗxqs `NzeJ^qz{h~-TaacJ,&CJdhr@>'90¾Y!Q'|e'6? 3b~[_JnFJ§CΥ$R L pI9ThFnU}ZRy86{YS4'8tڇ2vnJuvÇcqL~pFYJup47Ntkq \srs$6≻[OU,&Oܐ".A30Ge.E-yɶ0KO\^RSW_ƺ)j6s0IRBVcӦ=Jja&QO؆G q͔OثL)ƶ] Tj`k|?^±NL5:.F954,"^fomrot,Nͽom,|!?*.e*]Ĉz 1ɔİ (KeYBdBp% av(.9H MrZce&7Ol1exG(lX114 񀉹\>ʅ$Fe0p.րq(ǘ%(9YLx| 3`?{K%y'Bk"\i*-覄U8s<ހ ބ2 <񪍭5y(}AHX 6/=8M^b W\P1R|c9܏3GJ@`k S~}4fr ^<6: !7yE{ ֖H{lH Mc+L7c[i.7[{No!kJ aFM 6I3b=3nP*B%ٙip >ٓzhٳDfLV=>L7s eeJ^ \{C=/B%#).z|C_/`T_I1^L|Qr?~v.\Á-o27Y{F j2KK0Hriho4#Agn W&| ʰסդL%z+]fm3`ٵ|!)/S5[25I f&?hX&č3^Ef]KKp@;H2Y44) ͏A88uIDATi9ip*h"TH5bYȠrnfDy&G!-f_܈?ṵv6qqC_buZ[?ǣX#RٰvE}RWe[5I_?"I 2@ kya@&"]x:dy+`r*v"4;S+S :ۈeԓY)*f$#i@7(Dm`@ hn-tT˜km"c ۋԯ!]oq]xÀUַF%a121sRnWM &#{yor8g> FA(E$$C3 jlG Hw L2ϻ`AƈH7W%M$Acu"2YiifsW(1zYXqhdHWhGE٪XjD#4$I*u?̞^ێ$d7OӍ,X4%"m*C/ dˏq1-\Mep Zm|V6&ve2i97zԲh/o_& B EL.&&ؘ˖=kz!PxNȩӤ#zNN66ʵ]\E&Fjg0F\⁤M@zaF;pvc fn l-]zIFDa@PQʞ9Ǹ,c:U5>qVXLJE  :ဖ0\&>*Sz/Kiw Ki#Q?? I w+e?SͩM\^ƠRLk ʼRpd0XJm2fdLx'`0Hd7`t`m$bZr~Cナ/}XUZ:.>yƠ&z^~^Wt:bjBMHZp%׼G -10PB[09Lr|K\;NYˆ xY.>,Qc"$):"5E|]neO|+_fu 5- W2UOqiD(+|KlLzr|>=?Ůl":7wW_&5Q8Y8v!s~ګ M:8zO9tY㜸Z~}yy9\kBԡ(Z? ɕ>1a/ G6eE:SHBP jdM{qǹ|e i.xPȸE(Y +(̍,ZAĝ#GXY_lyɑ䣟?KE@>`iCm7k9aUp)-gTk075 L(|4S)Q]]Kopish.:yG?s@^hudPDB!:›BXk \jRE-s%Ɩu J謝n7Srfr*yk-֖I̶ѓ`g٧JgS@T$8fh .3B aH.$Zba >W֥Age RJgmb(bͣhc@k]D&y9J=? dZF?+Z[]3}cz,01Zk܅YA1bčkAk]/J={Z3kP3f v**;!<4CE՘^<IhA*T5 śx+ƷZ-:Z !_S P#s>?RZ-jqqϜ֚~O\*M48?mżwL&RMfuh4b00+B1QU;>Yka2TtFAV^ό1jFQhiU6LX__geeb#@)%%Ny<Fs/qO_RGV$M.V%.vʛ10B\qDe~RqOl~} Toj$W&(?>YPj7qEmVI$dQj xN$+POpDTqc)*x1pV= <ښ-%_?9sW_Tڋn2:bD(zNFZ֑UZ= kuJZ|J8=9⡛v(WSN 68>ڽx#Zyk#$`(MZT<(k,%S| !_`H?I;AJw{t%M2S}lTHR2t>[ ȝ)x)V{%) dv;]ͤmD6C_)3*9jfzhr#lJq BpRpzA^7OT\5Ze\PTGֿ^M4d7zGk- #[QBU!UWP9g$pzuj6~)(Hv'YIQ:>&"f*nMnSH>APu86E$wh-9sv2R\*סqj(YYBҧ@3A ˴&6;d#:ʇG)>4B5%Cm QcH 0OԄ}t֯HKվTALĂ?y*-dtd"[u [_:"Ȱ> QH_ *„ݦp:i: z+v(u٤RZ-LO+"{̞+G:tZE,Ai#=U{gwEp&ZJ.EXpzP@3hiNY[j+].4n4#9m]BBF0|vDYa0heWj(Y3HEKhEKV+}}n8ܔ;v, M<!E 9@ 9*2(Nİ u!Ry(t`?A'hIv6sM5Z\׻{s&PaeA+NH1TjLޅ'+dur_&uSiP*`6r:;?g )] $+V|nm 5j:T$s1Ge?̵%##D ڹ&#(kOum,Ik!R>lB]JOL!]^"qHҐz6; *%$ne04 rC1t„5!rCZI[YR2I> ;󴔦T=DDJ( :[5Xe$ƩiH mh# овz̸Zبu.gQH;iB}{3S!₏2R_J>x_MSۙ6T'ˊVAs侾({ «U&+' o wv뫊SbiPK 2 2=5Zi1Kǐ+8³G> E]]M|.If<9_GlJ8Q7`}#Xn^Ŷ,%-y!=g*)O`?a%Z.Zʮ25fÀ+s9$+qR-UHӤw%=[ e3&YJX&W-'rgjp*AeUN2ˆAz骤ʭgw/4JCJ)|'!d}HӃpUD&G"epWP }3 YzuʤEH9)j;e(eSFngWT-)%H nAQKlHNI@Ӭ Ͽ'w_i*ڛ6:G5S>vTYu n jtJH Θ ꍰs.+q3gs*S ?r篘=^s7l;54,ip<`ʲN>'PqLhALĵ T)Lp3]zxR3nt6%%,gCj*#ѪICEJ~G*JBsbWoL:T.HmCl@h5ʙ%uIZ\\P(YV-ڵf1("4ťP{-~zu>T)J+Fʠ3JguOh=Y$'bJcO@Ts RGnhWNhL{z6^$G\uF }ā!|yH9G"~:c? ~2Dr} !*#zGjz ~ECpuז]mP.!ƜHR;Ma1ԆD0zPPاJs[JN[ \'ĖRvRJOV,[riFԮ}T1$_UM+W`G=N2HKQ>}V!$J*CߙK] *Z^jRQ4R/QI}U6_pJUyiuӊ*RϯzkӸU~PnFQ̗P`-!\x>.X3E*HU)r_R H1ɶSŌWهyGL|Jܰ+7Ce΄ #==4!pWVQlZ>_[,u:"7ʤqKe$)@3Zz[.YԚfbNX܉m8M_XPğ).SR\.h+9GYrf+-:IEd~%:zN?N;O.ɐ }%X *`*$zR^e n,)_>*^7EС?[L@g)ԣN뽛S-~\H- G ĢI?\ui:ny(3_KgC GCX _ȠR[p[_㩤6[ːΉSo};R% 2g\qJW̝6kgoϥ><)T$2˸ERqWm]UHd)HӖ}m:wtAizJUK>=KC[N&\-1H•VxHXv2̴i! 3夫-DJ%GhTh@OA}@8Ԣ~l%1r~rڏfX !VrZ]g̉ ),+ʏSݵYX ηrMN$KDvV|JVU`Rh݋%O+ %)SjGQAƜ7#16`hKܭլuv3YGhen2|@TI\iՕ8JH&`#R mNҊB_ٶ,wv*YRR;ZsL\O% dc'' ]˚(uHLv*ՏFPzΖm mR *4MlNj@B-neM*>RG{{uvկ{bSMni A oI#V^iKB(ZL JV[*ӎ(c:I|˜+PLs\t< ^|A(2bI$e'Xzt6u}||I-™Bp q9(O>`26uMd:rV9`:[MA(Ą,<`;yÓ]{.JRĔ>j)%#Ӑ¾ښПdmM.V<qE\>Rq hĠvJdFޏ>6֔^uUURT40?MMMtfb!L#l/>%5PuII!OjjDS\-S@Kߦ[\C.6ˏSSR$|\ rd)?NJiM+'|響-MV* e9:ԉSSSR$cT_R('W#ܕilҚQ'|響2*r)$(-z}cV-JpqG/jjjD8ZT4|u\3J,"%~ԉ,{lx_oMMMMHEekBoek-2.02.04/lib/EB/res/schema/0000755000076500007650000000000012165465617014120 5ustar jvjvEekBoek-2.02.04/lib/EB/res/schema/eekboek.sql0000444000076500007650000002131312165465617016244 0ustar jvjv-- eekboek.sql -- EekBoek Database Schema -- Author : Johan Vromans -- Created On : Thu Jul 14 12:54:08 2005 -- Last Modified By: Johan Vromans -- Last Modified On: Fri Jun 8 21:33:50 2012 -- Update Count : 118 -- Constants -- These are generated by the EB::Globals module. -- Use varchar(24). MySQL cannot handle indexed text keys. CREATE TABLE Constants ( name varchar(24) not null primary key, value text ); \i constants.sql -- Verdichtingen / group accounts CREATE TABLE Verdichtingen ( vdi_id int not null primary key, vdi_desc text not null, vdi_balres boolean, -- t:balans f:resultaten vdi_kstomz boolean, -- t:kosten f:omzet vdi_struct int references Verdichtingen ); \i vrd.sql -- Grootboekrekeningen / ledger accounts CREATE TABLE Accounts ( acc_id int not null primary key, acc_desc text not null, acc_struct int references Verdichtingen, acc_balres boolean, -- t:balans f:resultaten acc_debcrd boolean, -- t:debet f:credit acc_dcfixed boolean, -- always d/c despite sign acc_kstomz boolean, -- t:kosten f:omzet acc_btw smallint, -- references BTWTabel (constraint postponed) acc_ibalance int8, -- openingsbalanswaarde acc_balance int8 ); \i acc.sql -- Standaardrekeningen bevat details van de rekeningen, en is tevens -- referentietabel naar tabel Accounts. -- De gekoppelde rekeningen (voor crediteuren, debiteuren, winst, btw, etc). CREATE TABLE Standaardrekeningen ( std_acc_deb int references Accounts, -- debiteurenrekening std_acc_crd int references Accounts, -- crediteurenrekening std_acc_btw_ih int references Accounts, -- BTW inkoop hoog std_acc_btw_il int references Accounts, -- BTW inkoop laag std_acc_btw_vh int references Accounts, -- BTW verkoop hoog std_acc_btw_vl int references Accounts, -- BTW verkoop laag std_acc_btw_vp int references Accounts, -- BTW verkoop privé std_acc_btw_ip int references Accounts, -- BTW inkoop privé std_acc_btw_va int references Accounts, -- BTW verkoop anders std_acc_btw_ia int references Accounts, -- BTW inkoop anders std_acc_btw_ok int references Accounts, -- BTW betaald std_acc_winst int references Accounts -- Winstrekening ); \i std.sql -- BTW tarieven / VAT tariffs CREATE TABLE BTWTabel ( btw_id smallint not null primary key, btw_alias varchar(10) unique, btw_desc text not null, btw_perc int not null, -- perc * BTWSCALE btw_tariefgroep smallint not null, -- 0 (Geen) 1 (Hoog) 2 (Laag) btw_incl boolean, -- inclusief / exclusief btw_start date, -- valid as of btw_end date, -- valid until CONSTRAINT "btw_tariefgroep" CHECK (btw_tariefgroep >= 0 AND btw_tariefgroep <= 4) ); \i btw.sql -- Create a foreign key reference from Accounts to BTWTabel ALTER TABLE ONLY Accounts ADD CONSTRAINT "acc_btw_fk_btw_id" FOREIGN KEY (acc_btw) REFERENCES BTWTabel(btw_id); -- Dagboeken / Daybooks CREATE TABLE Dagboeken ( dbk_id varchar(4) primary key, dbk_desc text not null, dbk_type smallint not null, -- inkoop, verkoop, bank/giro, kas, memoriaal dbk_dcsplit boolean default false, -- splits journaal bedrag in debet/credit dbk_acc_id int references Accounts, CONSTRAINT "dbk_types" CHECK (dbk_type >= 1 AND dbk_type <= 5) ); \i dbk.sql -- Sequence voor openstaande / vorig boekjaar boekingen. CREATE SEQUENCE bsk_nr_0_seq; -- Debiteuren / Crediteuren -- Note that rel_debcrd is for convenience only, since it always -- matches acc_debcrd of rec_acc_id. CREATE TABLE Relaties ( rel_code char(10) not null, rel_desc text not null, rel_debcrd boolean, -- t: debiteur f: crediteur rel_btw_status smallint default 0, -- BTWTYPE NORMAAL, VERLEGD, INTRA, EXTRA. rel_ledger varchar(4) references Dagboeken, -- verkoop/inkoopdagboek rel_acc_id int references Accounts, -- standaard grootboekrekening CONSTRAINT "relaties_pkey" PRIMARY KEY (rel_code, rel_ledger), CONSTRAINT "rel_btw_status" CHECK (rel_btw_status >= 0 AND rel_btw_status <= 3) ); -- Boekjaren / Financial years CREATE TABLE Boekjaren ( bky_code varchar(4) not null primary key, bky_name text not null, bky_begin date not null, bky_end date not null, -- btw periode: 0 = geen, 1 = jaar, 4 = kwartaal, 12 = maand bky_btwperiod smallint, bky_opened date, -- openingsdatum bky_closed date, -- sluitdatum CONSTRAINT "bky_btwperiod" CHECK (bky_btwperiod = 0 OR bky_btwperiod = 1 OR bky_btwperiod = 4 OR bky_btwperiod = 12) ); -- Verplichte entry voor openstaande boekingen (openingsbalans). INSERT INTO Boekjaren (bky_code, bky_name, bky_begin, bky_end, bky_btwperiod, bky_opened) VALUES('<<<<', 'Voorgaand boekjaar', '1900-01-01', '2099-12-31', 0, (SELECT now())); -- Boekstukken / postings CREATE TABLE Boekstukken ( bsk_id int not null primary key, bsk_nr int not null, -- serienummer bsk_desc text not null, bsk_ref text, -- referentie bsk_dbk_id varchar(4) references Dagboeken, bsk_date date, bsk_bky VARCHAR(4) references Boekjaren, bsk_amount int8, -- bedrag, negatief voor inkoop bsk_open int8, -- openstaand bedrag bsk_isaldo int8, -- beginsaldo boeking bsk_saldo int8, -- eindsaldo na boeking UNIQUE(bsk_nr, bsk_dbk_id, bsk_bky) ); -- Sequence voor Boekstuknummers CREATE SEQUENCE boekstukken_bsk_id_seq; -- Boekstukregels CREATE TABLE Boekstukregels ( bsr_nr int, -- volgnummer in dit boekstuk (1, 2, 3, ...) bsr_date date, bsr_bsk_id int references Boekstukken, bsr_desc text, -- editable copy of bsk_desc bsr_amount int8, bsr_btw_id smallint references BTWTabel, bsr_btw_acc int references Accounts, bsr_btw_class int, -- see BTWKLASSE definitions bsr_type smallint, -- I: Standaard, [- Artikel (levering van) -], ..., -- Open post vorige periode -- BKM: Standaard, Debiteur (betaling), Crediteur (betaling) -- V: -, ..., -- Open post vorige periode bsr_acc_id int references Accounts, -- IBKM: Standaard -- V -- #bsr_art_id I: Artikel (levering van) -- #bsr_art_num I: Artikel (levering van) bsr_rel_code CHAR(10), -- BKM: Debiteur (betaling van), Crediteur (betaling aan) -- I: Crediteur, V: Debiteur (alle bsrs dezelfde) bsr_dbk_id VARCHAR(4) references Dagboeken, bsr_paid int references Boekstukken, -- Boekstuknummer dat door deze bsr wordt betaald bsr_ref text, UNIQUE(bsr_nr, bsr_bsk_id), CONSTRAINT "bsr_fk_rel" FOREIGN KEY (bsr_rel_code, bsr_dbk_id) REFERENCES Relaties, CONSTRAINT "bsr_type" CHECK (bsr_type >= 0 AND bsr_type <= 2 OR bsr_type = 9) ); -- Journals CREATE TABLE Journal ( jnl_date date not null, -- boekstukdatum jnl_dbk_id varchar(4) references Dagboeken, jnl_bsk_id int not null references Boekstukken, jnl_bsk_ref text, jnl_bsr_date date not null, -- boekstukregeldatum jnl_bsr_seq int, -- boekstukregelvolgnummer jnl_seq int not null, -- volgnummer journaalregel jnl_type smallint, -- 0 = primary, 1 = derived (VAT, ...), ... jnl_acc_id int references Accounts, jnl_amount int8, -- total amount jnl_damount int8, -- debet portion jnl_desc text, jnl_rel CHAR(10), jnl_rel_dbk varchar(4) references Dagboeken, CONSTRAINT "jnl_fk_rel" FOREIGN KEY (jnl_rel, jnl_rel_dbk) REFERENCES Relaties, CONSTRAINT "jnl_type" CHECK(jnl_type >= 0 AND jnl_type <= 1), UNIQUE(jnl_bsk_id, jnl_dbk_id, jnl_seq) ); -- Balance of financial year -- Rekeningsaldi ten bate van semi-temporary table TAccounts CREATE TABLE Boekjaarbalans ( bkb_bky varchar(4) references Boekjaren, bkb_end date, bkb_acc_id int references Accounts, bkb_balance int8 ); -- Metadata of the administration CREATE TABLE Metadata ( adm_scm_majversion smallint NOT NULL, adm_scm_minversion smallint NOT NULL, adm_scm_revision smallint NOT NULL, adm_bky varchar(4) references Boekjaren, adm_btwbegin date -- starting date of current VAT period ); -- Database (Schema) version. -- Deze moet overeenkomen met de hardgecodeerde waarde in EB::DB. -- Bij wijziging van het schema in de code kan aan de hand van deze -- versie de automigratie een bestaande database bijwerken. INSERT INTO Metadata (adm_scm_majversion, adm_scm_minversion, adm_scm_revision) VALUES (1, 0, 16); UPDATE Metadata SET adm_bky = '<<<<'; -- Voorgaand boekjaar EekBoek-2.02.04/lib/EB/res/templates/0000755000076500007650000000000012165465617014656 5ustar jvjvEekBoek-2.02.04/lib/EB/res/templates/en/0000755000076500007650000000000012165465617015260 5ustar jvjvEekBoek-2.02.04/lib/EB/res/templates/en/templates.txt0000444000076500007650000000001712165465617020013 0ustar jvjvDo not remove! EekBoek-2.02.04/lib/EB/res/templates/en/sampledb.ebz0000444000076500007650000001563312165465617017557 0ustar jvjvPKB[u= .( schema.datUT QQux Z_s۸?ƙt([ɃWϝcO\ODIH A6/ ,޳BGvǪ.*YS Ty v䲐Ҽ8x.HbݐFh03Ud8:~ǟgcJúsV2Sgdz4l)aD,e! YƪT0S1KxRLi@XiUL-7͜PpɊF-xƋH/&XvuP|xL@ _/zD?0XF{UBuQL9}j2+L^-e2RnRh UХD p@"VI#0+3qfzN`*3"F] 痗?=\_9 -בd*Ah2ѷ.Ug8 (4EDej~jʚ4XXX،, 5ȣ52!GD5Z.Pf$tg|mШ &ֲ^$iV+nrHl؀3:F?{UVw`%P!8 XȊ%g/b w$Zo+˃y0N `²̀ @3- @Iv<]. z0R&\f# #OUW*WiQj BԵ]03kX֖#4vy L08\,*,Jb}j:(:yΥ":a1TνKF}$5D#7J" 3W Bh Ȇ(CwcfqFo!w☁v*ݐTɄfH~_WSB|0NɄZ-eL8ώ$&)5Χء%:D])א!" ]z.ׂk&`b)#ݥLa24 ihf/k=J`Z#M&Mq[N<)Ggt.(ڝS.#m0;fٚsn0SsUSgf8Miol]l"y]98%(-Mc Y| £8k1Оoc7e" %kL1`5±xڗM|hzH8r+_+tsQʱG)#UE^^_:[zh{ 5q{i" m FIQ.cĶ]ɖDc%^xDY#qᥬmf Ok7m\m(Fe1yK=: ק(9_ JsQјi+ FJC3/ݦ=`κ~wyL*`V|!ڨ kѲZ櫿FפI;^֑t"m#i`?TUj!E 3fn=fxi.AW߅LMF~@/ ~=h2bXhϜܗJcaG@K81#uaj{yXֿ:_2~BNha"GIw _ڰ+3{O=PfhdeJ'Gxjxo8^Ty/7mQBӮp}|?zxpW uF~Ǣ+gDOk)a- Y**wW'OpP[hSFņ:ۅd:MSMnz[Yk.7csYKUCewXOqᙏ`YNjt_4B_؍3zã0uwzq|.+̶00> t{&*%̳{Ua'9|j՜>he|g+\. KU m`ZkϺcۂД"_LjRv~SoYKd?)p0u.8QK՚gU96j-Wdd=MOC&rz>",Φ2(ypѳv68& Ul^ vV}m*Yo)~=@<<oT|ckP6/Lڅf#PCb/`E nxoRB$Z vSOB˕ci$^ ʿ]3"4|4~h;G3|I e.J-_p4%B<{>R4,Xg_yq{=u|/z,u)Vߟi85}@g-Ǎ ^kؽ1au\7uͤ6X{du^0g{a t *qS6ph`KqIiJ@.x~h# .i ;l7lZm9Ѕ*m۵C/lěWlU &".ma &͵{gkB{v|Sf| Qr|^+k3l/T7ivDcsxowɹ ˗{R+Wl>)3뫫{o*ljႈz,"6cvyBlpH>rhȁ;D@h?þ!!T*[-lS#/+dcjU6*Oۍ^f`ji{UrI][zIA3OY2(ZFAAtdЭӢ l~!C)!+Xx8{S&A"eĶh;xgUY5rm!wU>\(ZB9l_~80g7u߼Cd KzْeMاRw׮)AbLo5v4႗R*,haY\Ẑɼo7,`oKa)GǾt†ȷd_0(!h7Xo6 }y6G[~D硽!b2n |Eg!&n`Zwg "cѴl|{PKB 45^ relaties.ebUT QQux RN0}+n ѧbA]@bb4>]$[e,{{ι GL%Tʦ6j 5YrxT 펭O^ $4 o 0dӵxUY%bJ6);:DBJm[6;IavGXc}V@8GT hSVv2fX>^>' wPyp1ͲaT ڋH3݂bc,2NJ. Zݵ0(APKB*Q opening.ebUT QQux }OS0;p&fBxvv %ipۛ=e^ov7Cx~<8zj#om&C9&5_h*$ ApӑN"jgGlCJBJewzIBwYz,CI?Z]c;~q͵$lUN=y PKB-4 ! mutaties.ebUT QQux ZKs6W`C C")jLf*klU$B2K%Htŗl{Z6n}N8Z q"ESm8ې[F歷g}h"[]v,#@ڎkڎK n)S&Kh@4 o?>l$兒"$og)%;Fs|)2W1 R3,N_S!-,d|Sp`\\tyvd)iB.-r**-M#1;;$R,oJ 5]3 2gQ\|#FI2 C. Fm ȃv$b+Z&c\PV xl.c$g X -.!wyZ p^NNKS`Z9"DSFJX$ᏸXpPI𼳉~"^Ch%;LTPIe ^z^8~poً;)Sr! ?(PsXRp^)\\veN+95IO2h`Сck D!}SVȿn/_h~}eD\md348XXcHV(20R!\:+M ( is@f9{pBbp$ߓ;O7ӔuOg;6\pjOH1H"P^Sv_~{hB^|a= v{6xU+v#k-Oז}X-~Lj b==^,B#hjˁi V`:υ{-8Fm8nSFK峚 "%9 c%vl%1N\ϱ3!wLа'@Jݮ29ʶT lS:892w@'=MZ7~b9˸Ud"h4p975KN`JN XF3tFH:[d1[p!b)8I>::`K..J,Rm')U5X+{!x KGd%s)$Ao~8F3^d&q/r( bv{"sc1%@~@nDg,/+̩T&l`4Y:el+Ȟ+W4`3rE^N<@*PXQDñ?dwIZLEo ܻDCyE9k#yRˀ B B.T LM~: SO%YB%'6;]<<*=1-#X Z,5BH4BTI\T՚JU|Gʂ&x&K!CFEMb:\Yr9 Ä(-X1$:Mލ|?9/XқL c f2LҎzVD' *BwԀ2 |"}CtbyMcgj$0>B[6C P=cǒsrޖD~DL} z}IpU%&ۜ1䤆2iB ǞS'CQE[Sҵܮ!ߊ.xE71+XR}C&N;HrR5ei846ҝ&Ӥ߁PQ+A`C2|MBtG[RV IrZ[j;~^ly%sڒykM~p^XIyj]9[b6|f`g4^wX^uwzGdsrC" _dZ`4 n/(( QWmM7W0$%e[G}ѠE v7{C耇§>D y>&[17!Ehk6fUek0Wmy=IqC!̹e`ѹ6S$5,YR=ܨ&t5n!.a8G&?V3P7kk-E5_zpO܋xkN86#с@FTT!R:\5t-`js`ueo/ ݨi}}xs8?lHE@M^ ,X.NɛFL 2UD' "\ch96dZ_J1vBteH)7֥D@ޓ̰qZL>qۘj$_XNH\@ EgRGk.cm#{Eτ~!!j vM}C~QM]c+p-K!zokLa2uDRPBcWK7մq\K5Nv4LJöF<%jә~zq}ZW1獫U&Qu"D4cDv1ӓeWe]Dj5uscJrm@ߦO+g0G?d-(gh鞜g!,Qd& d) Aj6ՀA"0u Y[ ޥ^u#dQ1WzHǪaCװK 6Y,>򌫺`(45 1u`] "W-JBULmZDMZ>RۜNžHaJ#g47SbGy\Hj{1Ri DjP*&c-Fid7yVgi{lHo.J@ '2T2ɉGniV \|;E5 f)o4zM=h5ɉ=9\wi#MtSԆiFμ(8oH֤iiH:"I@;8Np[]iXb M4g V228"^irs"ÐDOU⇱8p6\IgjɷZweZ5Ǧ7h֑;gެZ9g" ;< ژ2%nڷڛ˅-?bsw"ݬfзS8^y=yHJuŘW3?"FU29+h LV:6J9񓷀I.hIk6tj7%l#R"F@l8|̻L#MmSVrIOytwB\Ҭ1?vOP舼~&` l}T<ܼi)pk>qK,=J]d|\1S%NJ“!:-u[{! 3 n*鯕!vQcJiO+1]?9(i4`\2[J@%sϘYv:b+9VR=yy~:Щi;k1o#5Lgd?cpyO !|-lD'̇3FNgl+O=PmGG]5iZh^Y}=쫌( ̾kOmc5,-fc7,aX +4=)`%k*hgݸ\M~ bզ[Ձo}^wi߂r۾}Lya\;mu-Jal'؟8Lc3A8M̉MС!ZͣGIɑD㊫~0ls={={=nGM9g{,Zb,p{қw9lD樋>c]_ȱ4w2`nv3&ӊEeϨ=|TÅg12Es.5+3yUr|mγR9<ḣ3z8X^V==~<~<Z _Z)bw A/ K '‡gB# \E (h?t"),ʴJvRptߢ:8o?~;/oB(7?eLv з YZCKDaXp Â}H92O6Z n74nD>:s<|iR!*O Sk_fKVPpoO6P*ec s>˔@3Hӷbc<j cUcL0M\ oNkPY ?1qT"7 ҡvR+swJo0 ɼofa>ԷktGڭN(Z{—ÝcQ+rΛg!32QYM4%"МRt򳈴Bl@aR~ /aN70:R@k0XBG$c.}X|oOΌ̧v"׏g%5@r:3=/?-[C|>r\yۨ*'m-| ZvA>(Q!UUܝebL.$(=PKBO - schema.datUTQux PKP VDataset vereniging.ebz aangemaakt door bootstrap Omschrijving: Vereniging / StichtingEekBoek-2.02.04/lib/EB/res/templates/nl/eenmanszaak.ebz0000444000076500007650000001256312165465617020273 0ustar jvjvPKBž}/}D schema.datUT QQux \r:$["Jlz+v8'vv9$4$%'~ڋ}bۍ?$dI$|h4XӢztKiM޿'glu"؊l(e))يXT%˩lo%h?GbI rW DShRrUOvf$I4> #UM9N~wH@(cK5LObSjhE͊5;"5UXgIfKZV&ɏ%trKn>}9vL&7dry:t|;9L.]]]9p~vrcrAnϫӳK[Edʪ)IٜeeMh11` eE_ \*BpU]Қ3"@fQ #[vJ3d5un")]L8~rԴQO8[T*۬:MA7~Bo)=e ^[L⬖lu @?Xr]2Igy֥s 4u)͌ n(R(ޚG~_8BG=GpC볋R9/]i,aAKZΖ~#b` ZEIl2X 3]X]&K!e,k?CD9Ip-!j\Gg4jJ)t#j݁aN%ϒ4<.i-%I XHDpu],X}׌հRG`5?ep)ۭfz!^W9%ۀ!Lu j8^^g>i^#Adnd()P\9Z\aCH+X|yL4Ƴ 6|I0} I)lV|E6́cM|Z42Joo;E5$+ 0 ~BI3r_Vbfbmf3N3TZw@-b?K.5 $TVÄL_)pp[3lS~H-J5.L@ӧɀTjd@x%j 1-,xm{) Sqԍ4OXjOQR0zKIA0C)=H;P @ [dF@AT "\0 5G E<، #t^eNӬ/.9]+W6oȬҮQƙ5Z ;3c `€cQ&KC.7󻜮tq6@dzPВM>+dD >ZE@+%m!cآT΃a"UQ"()f5 QcjVh7(6y go g$r+ZsaUr"Mpθt@$U=s肝a>ZB+j4b9i '倘,sQ?$w(=+  o&fB;$QiM/MHrGLD@'ao@['7(:!8S"a>;"}Y ;;Ţ cZW2qAJ|{A4̓r#Щdp영 @5Hfk! t`~r{bs#ih`QfS <NذIM& 6 3CAmj%HÅECB>lh`IlAI**h%~ 6`rBR*i%I=r52/fbS]e,-[z N|~v}SX 8ft~!3QLb\Ȁ7S(˽If$)\T0C22dQͅ(-aB(;lRz{+Ҍ]̀drYnxepqQYFs`ps(lK4v4 !׸.kb~s6($}' ZY~5q k1ˌu|LO."'Xy&j{qQ\wQyM[mVZTnQ e$4 !Ý7*@7Uդ~͢uQ!zj[pGAp,c"gzi&OA8k(T5P;uOtqM00m.!gcwׅ](#_42]ѰEFqO1ѨVvmgKVڨ=&x8LZh/V-".hXVS ܓWAguЮkQC_R2܎$t:8 YЁъI?¢0̤Oz +%k5IXǝf!<:62cp 8 yVa1jSvi6ܜ8R S icc3fjǃ9xїx9]M~P^G ܩ O^4uҋ[JHoR6=7{=ؙom-K;9IU3YgN^™p|ttVU][*Dd3liMiTD-f|x27r~Z`h)TV &9ƺz X4~+>[CAvv$UC~uG47th7l[o:t09/iZT\ Hc/4$h dh w.Ϗ=h"kDX7yӛX oZn;g?enM\iѰquӶZuWI*ԟDsu*ezt:_ Z9~lfQ?feh_.I1.kT-?;g^@5ٜZqh,a`5ˉ v$ `7 >hi]8&. Z(-AK}9.Fmq kgC;sx`[i!G I2!J@VfJYz{.ȂG*o+ݺ7N$uז+dA*b#k^?3@LFq.p!FPLcprKGv^8`ݫ?vFWTxg<x/"]p^lսe0:pGa,m]ñUg23`/ #?ywR+?2BiMc'"26ç{nz'bp!-BoeAKSzvjA:f5i{nX]w{l+::36}R͟ΠNa@Yq2h,:u`ЫWO=ӳ'ݩPȋR辄V+:3է7rtn^1v8\Aa㝎݇[$;9 }0s)c=nŌciY=Bk,O; \P 9ĸ8|(kViwv^pҜDJbzkRLA= t=zDN&'ȗv%]/C0gVmO9Xeݗ~hބ V\a},1Ҫa|v y$ ԲB׌aְ/;@\ȋ9+j# @ (l }j4fq:f"odcC֑x둓32]…E [CnaNH"Y2n5V I҅ צLBb@H( Qd_0iߖIot"Hy9Jgnb?d^lʂPp+@Y%vH7<%#S&˯f2UǚxwFɾlXcR?Hem<*A2NOz?PKBž}/}D schema.datUTQux PKPLDataset eenmanszaak.ebz aangemaakt door bootstrap Omschrijving: EenmanszaakEekBoek-2.02.04/lib/EB/res/templates/nl/ondernemer.ebz0000444000076500007650000001431212165465617020126 0ustar jvjvPKBu/_S schema.datUT QQux }^Oŵ\_%r->˵xWri 2$IgRF%Y_d٩'b@BdozOť/ΑON\ĝ@ab[̢0[['I v2$i)@~"P..E*DdQ?|vފ@D""&e< :G=I4G)H,y!Vy8;SFQr\qH?'E$Ϥ\@g,YYS$4; 14ʓFG Gɴ?s@Nc8E*zÌJFrISWIldPI4FHtwwwS]Eb&FW20d|"d H o)8:{q\c%E: @8Î|-6'IO$O1}~0o1_iB>}dS61Y"ÿW`Q.Rd@"`pY9^24[! [T*"gh4Ds>i삚!/+gr1ۀث\JT%`DC @69)V '(kVD}<0̂b.Q;vSD Jom\S:ZVut|ۏ}%M[`+Дl>.7%"@JPz +^IJEUC%[}`#S*6eJ4<DZ6w)E6ld!PW\;R(N`gC&(z;G/23F埁+LercĦPw γ ,Qt|rB1Id FpN}6q+64.C:`| ɛ xi( iBj|2b(b=&~AڦU}4H$)&R$g*d um<#4򜀲g@MnQ>!(lDƪ(EO߇ ť4Gl3H> 0&[MYbgɀTkd@y+$T c,!+)ѷ*rCDqR$B'>[MNa))($kApϨ gywcC~ A$:$f~AU"M"1-Ƽv:( @ -!f4W| 2 ހi_rdB)Ϩ}4"uqY7R7`K '#mU' Np_SQP@0(}h%g3SgF?b͒$'c3) 2׽`&I:aHsT8b@k N6r,b16CqZp:3ީeJlI:$   ^ct*LLsN $?H:f%F%EV0o)06ppc"NZ.9nKM80j\zW)d<`B?ÝNoar2UwuwaYxWE̬aJ%U07* 1%Ё'GB:aZ .rr&q.TR%ARt kaMCwcF4vX0z:{`GW<̞a.*h$Qò`uƁZD$"#+ 05z  @_`*k0lFgRDDxoc賆AsO4&վhy DC#WRx/E4K"ޤ?}-S) Cx, enITN'̮=A%-G[.$ERmp@W›DP̱J_2݈Ux.d2p5c! Sy.-c,ye>Xb5MuSCdYigPNlaN,^cÅ9*m'E#z Tþb|\$tݢij4:>׍h@QL$`ZN!m0- lZ Q SNip->T)WB}P_M %Hpզ\n @[Ze 3u߆lkZAa(P{3; H6ۖ K[(g<[["  ZKPBYJH+ǟLE8x詭,!9WU6E- ƥ-&qLJ0AkzsS#Tfnr EVJ1R515)B.~/5Cθۺ[3+U*S2 3ait*IکT@$ki\:_\g0sW$i4/av [7 r_K^ _6DY9vLa"olṴ,x\v<\iZ[s\\{sUmu&44G>nFT*,1tU, b&c ȥ\nqGy .ۢc.M. <\qD5)Vt<ź &hPsڥZ@\)7& WKaD406j^)ۨkXpsCRJ.QmV/z# ]͢ b΂)cèߙ4T^0RW{X/% ԇ?!=QIbk98 C[9yV}XY/#Q,i:tzN3F3j6ϥ/G}M-?CjYZLg2 2("i֮a6ǃcj!w"XtVĆԦW6֜VöC^ktH~q=obr1o.8{+O~y dQ>rfj Xp Evڇ{ΊR;iT?TJ#69R}Saq?^㎴k*A'꘺wsV;;~l5Emx 5(-ǦKv)M0;HiEV-ON 3VŭUQSA ZY_nſŒdTY`4ĥV+r_%OZ` 3<р%BSS}7ckf?)VQې~?}ŤZ{x)0b&z,2=HAQt^isjM1*]5tKMHݮ^X؞Nr~٤_z]`*F-LZRKDEHeˠML7 lrUJ% e55@ H3`v؞PB`D#+x'pЉ+ծpG&05Pr5uI\QEmCIj~F$ZB1)%[j0s0XF@X|<<9s8 z? wΌUgD{V L4 H<}w>>=pW~w8y`D@prKT\r/ +kE,@-HV*9=4)U)i8+b׎A9쫿B`fB$r ? -2cEff~GmD5PF0˵( PnRUMyav?¢r. +1U^_'0hW1P:ks(~弥X FQga#>f#ЀtF T|}uН$ QbQf6s?&k;V+Z|-nISquA0$oa6 8[`RMe뷋W[Z$ilԇT"8DY??Ei|Ah!ۗ! #0STR w&f#I}MN-oA4Է7.yszu@7)(mRH/Ah \T$էKP"iWWN{W+=ַdjA\mUdԠ&*^ _#t=B{78<9O?."? YOuDEoe[H)fX6ZؖAF&?sU&au8x;<4Bm ΍%Y" QyC~]G<deM.5wGSO{%TW}1[2<#AJZ&ɸl 3pkz-yp jA\\{}UBk{*jt-". ňS`($]]_]E_m,փJ=PcJPKBu/_S schema.datUTQux PKPJDataset ondernemer.ebz aangemaakt door bootstrap Omschrijving: OndernemerEekBoek-2.02.04/lib/EB/res/templates/nl/templates.txt0000444000076500007650000000002212165465617020016 0ustar jvjvNiet verwijderen! EekBoek-2.02.04/lib/EB/res/templates/nl/sampledb.ebz0000444000076500007650000001746312165465617017571 0ustar jvjvPKBܺ֏-+ schema.datUT QQux Zr8}L9S,J"i+vxs-O65"9$(;}؏ CF߁Se8|ֲJsA/x!N1t0qq'b:YNEi'crT\#^ߥ">J8N xY*0XuF`A K-d:@"q=$ai)q%goZ8˒_l, ?C |^~焘ͫ0e++׿%yP҈-N:"$LZQe*Lk&*fVnooYcTCX=~<<8)GO)ڌ*sDir<`g(]"ZIDLo/X7+7,܇y n>t#-%pϸ GI S@7v9RpI8"/D)DSEky锢(R4"f2W| 䢈KMA/rO%ϸbbbnҾUM;6fאַ'Aboug祎(9ȥZhGaܩfp*nJfmVqH1fTJr*i8'_K?bFPҹMQ,yi[A.V|Wz¡(,qb#?70rhY;{ Bh#&ġU*J 3 ʛΤ:vZ5؏P$+ZL.9uRADa)K`Hn5l+5o3,5Cj3I&[tW1^k P`L|zlnF AbO⪂\6,Q/2QPjW'vO#ZZpX5wh#:Okn:+hq?/t-1Mʁ[w Ae2k >Li[J-qAƐ˰ =`iWExdɹUi=ai& C!?KM&̾Zfy'g/ϐrItxí0 !Es#"1Dž^hHEbڙ4Z +y1rAaZm'{y 8\> G!זPS:9d)ETˬW{i&ǫcH bb6#BFgsmI'CgWP[*ŜxA{xNA̚^xD{B b$TNi)Y4z)I/%i* Z "$(>#!!=8~輵Jꁑ4ϽuCںBzߖe0?9)2 *iN ##Yr&#םov02w^ Y$ SM躴mp/CY 8=tlUYRrg9u! OnbЂMD}T]4M8-=*Ф\ҝr*݋3Sbb5PDw^cVd8&]cR>NacF4o8ϚW etP{x.O_зFF@K(F]vh൉,LuoQ i ';Ѣmo@: f"ܚd^| D2|' s ON>XLu0O`;dV6v;F'Wg>/U+Zg֨4ǁ,GXf9=PE;+>1^#ޫ.j#^wuyvl<f9ZGpbOeZx;:pVVgֳ 1*!v#XRs>U,hFdk{*0kn`elyNܮYP:N .BkOZJQɗ HϞb{U͕ <י)٩emX8CI9 }M&?b9 nj䲯1SdW~08 '5j@Zq*#,*H)+Q+f辙 vq}`@P]@# 4-A(02쑢v` QR.֔}Im)PKBͶ/ relaties.ebUT QQux To0_q"ؤ􇺨DH.S:m/c#chҿ~ MJ4p{~Gw| %~ 9bF'5LVy^brBʲwpj_LF,k>)Θb8'3xֆ[XؼsTUBeZMwSQ`&XrHТqT9 )RA[$`M0aZ46> %w{<'j/-]؇J0C6ֲbe'pznwA:VoNi|~K wj&p9:zhzDhj tU]u "Z-fN{={}lfX7ŷ4Gզ 7ǭ)H*`Rhn~FEc&5,LzR,ƌ^RAA#q@>}<,pkp~(Nӎ,PHNX_-yPKBt` opening.ebUT QQux uTKo@Wp 4Ej$Ubde`;ij=YpqW`:JW"XBU]E!Dq%"ֿ;p]JYVP|Aj(`F_57kּ2KìnR[t7D .ܾd.-TqF|rv-G%1dCA~:/N6d;U~@ӎHA끸$zNXt65/d#uW;,qDU?zV\lB LP@N9\ۢHumZ-acTGXdOǬnA0qq owpRGڼ8 ?'߼؀) AQOi+@D"\i^6A8D,Ut<ɦ4@RxL JgS%GiAs2e:Ţp0Mrɜ)Rё6|~z-2bóN=[<ݯ׏=bg{$y`ZDqD̙Gvӻ]ML\MP.a^˔RDw{J=ڃ$ձ|0XuPKBB;{O mutaties.ebUT QQux YrS.,5 x&6ۑVN\@Zr3y<_# PdrF">.OHs/kv99NB~ Pf,7𷻿)ObR8 {XӗIV,er0XG2? S<F¿XOʸ@'. ݬ#Kr.b)Y"b|PR-YOJ/yFa(#x2I?Ϭ 1 L9c2bڥ{YegϜdIs2ьzۻ#<-j>c9,D'"!$0| ,&aVLE.t|gAѼ7߬LAD*9vu$=v"+P.UY QsekF;$ېm5SH@+:`N,و"ⱡVHOt55-F14eG]^}81hRN[do=3̄6LWh+a$)uEXb@R,ɋ@`! FǘB.&R-'iCEB#pfƶ&7T)x`x3k mPE})Pt Xd@hʸ3r^4nu80-Õ@)l6IC-pP>{PᴄM;RC8: 3١B鳇 ~c)6m`|ޗo` o 閒럩(p*e-IՊɋ& rLb?”6pw~SF4'Ff_4oy^I_C''(S#!zjݑ 6ve=0Wͽ &xiM{oA"MQbDe ʌwd .},⎧:G"K3ydYgCQ82`NL}aQ*5!ڳ"Оm=iQT=#tU%&g(|&+ET,sCc-2k6LpU_Vz[n/ zh:줁`k*tk Lygx=XT^YhJNuyNATv&T¼:0. +N18+Zd| N_^8TTqiYGUR.֕c;(u/uؔFeAouYW%tҦ @HA )]X -"IJz'%"nFp:U"J*!0t8xH\EYl.kg*9#c%\cpb͟+N37 6JBi4n=޳Z868633Jmmhpq 4͖ݶ`n#db g:`.VU>.6l6{|Fo ,54&4&gkC&8h(9ۖCmm6 4K6v6ԣ [`:PAwM൒ƘnccZiOʡ L:8 V̂Q`wd?\=-m6A=7W*UJ tl^\;v^[ꪤcĥ^ yKgGT]n.ۛV{L8 xd{w tXX%Xgĉ>ɰGv} TC o`Iվǵ .l7jYXUvƓxG+>ߜm(qMԒ&z ޕ&Ǜ1ڼ^X,1$"Wk w\!Wu7zCb._V49}]QyQHZhr;'+z!/)58`S RLwy+겺j|X2 鍜߶wr\V6٬.yiFmo뛖V6A qպ1ʝyFPB z-drV_(FT7ۏi"G!_%miF9q;ɑ@g+w;xLbyut׆>n2IfKZ"}r\ޑϧ翓kxv~}Onnnpq>ܟ7g(w) LH| m5I! |%|E6APVOmVZ2Jo"wf^ R7|%,u5EDLQ_+ $S 4C#@O ϟ? cG"> cLΊIig7ܼ6öڇ4_qAh;} K'3]"ZIƈi5 e5M!A=5`%MC>La)Hc S/Q7Ď_pjF|tPIlD0,bXsɵJ1(\Glb4EcG*\}3*1^:,bY7Rohδ' eڤt/<Cئ+LNtҎ-d esh!RCK6|iC'hIr,wS`tlrݥ2O`y0YyqX }{z+BSPf!||^hvc `E"@[+U8!:H"[t1DN-'i`E: d ^TO A AK̈́Y:}de۠^ }`bl#b9z/AH>qfM;jmI/ l CM:]'5iM٬dqa)l+ˮ8YvP?&Nvs*O44" [F]݇UqX>6H1;c_X+6wBXo0ͱ%,- :bQrH'BwrʑgAvĆ32[8p\6ag\vaqd( ()kQԎMh*6qw6Ý/Xk';]~qRb0{ x![+\|7g8U Iw0Et+i1kI3\,]S\v,T489J~}+^7YGf `x#܄[[5+zd_)rQKTʱ&2stf,D>}iz^t.-E$R8DtXq, : E"(9->~)U; A+RrA~԰fRt%:Bt[TWAcdk<5oJ$y+vɷ6U56߫黶ˡW]MA+ĻCQ|KKi:S(m(F#81&%חB{l sRlupGHkӷ)~q<IC7GNN/ _w5f|*v3{igJ+]ަ+5!&tDrs\:/,Ahꕰ<Ͱ}. иI_?{ii7갡 m.^zfb(%WhbJ#Yxcw,t7&b`%!7a4pbeyYGt]jَfH|knv_Q/]\Q{MF4bgz+"n@if"b.Y>2;^eaJ1jf!! sӟ/0 UQɆo޼iYCj4%$:9.ȣcT g݈ɪZӁzh, ҏ 0d/2ͩ}ףXG!\ӓt|gVtt;+'s UU@?06eY䴟Q^v= 륊gs/P1@PZVn &$؍{>,7ȸWH[v&6Cu=`=oGXc>i Ǝ|lY|RiW=!\[М;#W,&-w26 X!'h!םЮOXv-0(nE:[Qk+`tkt05: ].)j.{`7hhcV}kF0V\ uf Ҽ~N83—$X0DR,MDc":Nmd{G/.oxOgB$d tpjC e(O߱aLޟNoVy%"/4PU☧:zCtj!a~C)󂬶 &V qEbNWh&/|q˽`ՙSqk~iIE>Ana򄲼%[ix'" dR]APsg  e!N n8mthhpPS_ūh#I2O6kvdo mHNR#@qlUƛI `"Z0soc`x_{*"Ԧw93`_,{CWX+bjO4;X *Wt֝1U7;$:LG!G*aT4d3~ʖ4 SHY }> p I*,OY-+fa8Q\߈}y16/IݍBs忮Nt1%oQ'A#3^ >%2偹VI5D]uX@e}YAMfbnLqG'Y_o*3^%0`,)RYnR@3;D~ #69kǿ"c-rq'sP 64OPDQ<^ԲғT^.qc2PǦe[6Atk젗^^Nק7h{"xA}CPKB.4N schema.datUTQux PKP NDataset bvnv.ebz aangemaakt door bootstrap Omschrijving: BV / NV Flags: -btwEekBoek-2.02.04/lib/EB/res/templates/sample.conf0000444000076500007650000000473312165465617017013 0ustar jvjv; Example EekBoek config file. ; ; This file will be placed in your current directory when you execute ; the command: ; ; $ ebshell --createsampleconfig ; ; Change as needed. See http://www.eekboek.nl/docs/config.html ; for details. ; ; NOTE THAT FOR MOST PURPOSES, ONLY THE DATABASE NAME AND DRIVER NEED ; TO BE SPECIFIED. ALL OTHER SETTINGS MAY REMAIN AS THEY ARE. [database] ; Name of the database to use. This is the name EekBoek uses to ; identify the database. Note that the actual name as used by the ; database system may be different. name = sample ; The database driver (postgres or sqlite). driver = sqlite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; NOTE THAT FOR MOST PURPOSES, ALL OTHER SETTINGS MAY REMAIN AS THEY ; ARE. ; THESE ARE EXAMPLES. See http://www.eekboek.nl/docs/config.html ; for details. [general] ; Default location for administrations. ;admdir = $HOME/.eekboek/admdir ; Force use of selection wizard even if a config is present. ;wizard = 1 [locale] ; Language selection (for international version only). ; Default value depends on the locale. ;lang = nl_NL [preferences] ; Show journal after each booking. ;journal = 1 [database] ; Name of the database to use. This is the name EekBoek uses to ; identify the database. Note that the actual name as used by the ; database system may be different. ;name = sample ; The database driver (postgres or sqlite). ;driver = sqlite ; Name of the system that runs the database, if not local. ;host = dbhost.example.com ; Access port for the database, if not local. ;port = 5432 ; User to access the database, if not current. ;user = eekboek ; Password for database access, if needed. ;password = secret [strategy] ; Method for rounding numbers (ieee, posix, bankers). ;round = ieee ; Combine bookings to match a payment. ;bkm_multi = 1 ; Do not try an alternative calculation if BTW does not match. ;iv_vc = 0 [shell] ; Private module with EekBoek extensions. ;userdefs = Userdefs [format] ; Date format (YYYY-MM-DD, DD-MM-YYY, DD-MM). ;date = DD-MM-YYYY ; Format for amounts (1.234,56 1,234.56 1234.56 1234,56) ;amount = 1.234,56 ; ; If you need big numbers, just increase the format accordingly, e.g. ;amount = 1.234.567,89 [html] ; Where to find stylesheets. If omitted, default styles will be included. ; See the docs. ;cssdir = css [csv] ; Field separator for generated CSV files. ;separator = , [security] ; Microsoft Vista users may need to set this. ;override_security_for_vista = 1 EekBoek-2.02.04/lib/EB/IniWiz.pm0000444000076500007650000003306312165465617013641 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; package main; use strict; use warnings; use EekBoek; use EB; our $cfg; package EB::IniWiz; use EB; use EB::Tools::MiniAdm; use File::Basename; use Encode; use File::Glob qw(:glob); my @adm_dirs; my @adm_names; my $default = _T("--standaard--"); sub getadm { # STATIC my ( $pkg, $opts ) = @_; chdir($opts->{admdir}); my %h; $h{$_} = 1 foreach glob( "*/" . $cfg->std_config ); $h{$_} = 1 foreach glob( "*/" . $cfg->std_config_alt ); my @files = keys(%h); foreach ( sort @files ) { push( @adm_dirs, dirname($_) ); } my $ret = -1; if ( @adm_dirs ) { print STDERR (__x("Beschikbare administraties in {dir}:", dir => $opts->{admdir}), "\n\n"); for ( my $i = 0; $i < @adm_dirs; $i++ ) { my $desc = $adm_dirs[$i]; if ( open( my $fd, '<:utf8', $adm_dirs[$i]."/opening.eb" ) ) { while ( <$fd> ) { next unless /adm_naam\s+"(.+)"/; $desc = $1; last; } close($fd); } printf STDERR ("%3d: %s\n", $i+1, $desc); push( @adm_names, $desc ); } print STDERR ("\n"); while ( 1 ) { print STDERR (_T("Uw keuze"), " <1", @adm_dirs > 1 ? "..".scalar(@adm_dirs) : "", _T(", of N om een nieuwe administratie aan te maken>"), ": " ); my $ans = ; $ans = '', print STDERR "\n" unless defined $ans; return unless $ans; chomp($ans); return -1 if lc($ans) eq 'n'; next unless $ans =~ /^\d+$/; next unless $ans && $ans <= @adm_dirs; $ret = $ans; chdir( $adm_dirs[ $ret-1 ] ) || die("chdir"); last; } } return $ret; } sub run { my ( $self, $opts ) = @_; my $admdir = $opts->{admdir} || $cfg->val(qw(general admdir), $cfg->user_dir("admdir")); $admdir =~ s/\$([A-Z_]+)/$ENV{$1}/ge; mkdir($admdir) unless -d $admdir; die("No admdir $admdir: $!") unless -d $admdir; $opts->{admdir} = $admdir; my $ret = EB::IniWiz->getadm($opts); if ( defined $ret ) { $ret = EB::IniWiz->runwizard($opts) if $ret < 0; $opts->{runeb} = $ret >= 0; } } sub find_db_drivers { my %drivers; if ( $Cava::Packager::PACKAGED ) { # Trust packager. unless ( $Cava::Packager::PACKAGED ) { # Ignored, but force packaging. require EB::DB::Postgres; require EB::DB::Sqlite; } return { sqlite => "SQLite", postgres => "PostgreSQL", }; } foreach my $lib ( @INC ) { next unless -d "$lib/EB/DB"; foreach my $drv ( glob("$lib/EB/DB/*.pm") ) { open( my $fd, "<", $drv ) or next; while ( <$fd> ) { if ( /sub\s+type\s*{\s*\"([^\"]+)\"\s*;?\s*}/ ) { my $s = $1; my $t = substr($drv,length("$lib/EB/DB/")); $t =~ s/\.pm$//; $drivers{lc($t)} ||= $s; last; } } close($fd); } } \%drivers; } sub findchoice { my ( $choice, $choices ) = @_; $choice = lc($choice); my $i = 0; while ( $i < @$choices ) { return $i if lc($choices->[$i]) eq $choice; $i++; } return; } sub runwizard { my ( $self ) = @_; my $year = 1900 + (localtime(time))[5]; my $dir = dirname( findlib( "templates.txt", "templates" ) ); my @ebz = map { [ $_, "" ] } glob( "$dir/*.ebz" ); my @ebz_desc = ( _T("Lege administratie") ); my $i = 0; my $dp = quotemeta( _T("Omschrijving").": " ); foreach my $ebz ( @ebz ) { require Archive::Zip; my $zip = Archive::Zip->new(); next unless $zip->read($ebz->[0]) == 0; my $desc = $zip->zipfileComment; if ( $desc =~ /flags:\s*(.*)/i ) { $ebz->[1] = $1; } if ( $desc =~ /^$dp\s*(.*)$/m ) { $desc = $1; } elsif ( $desc =~ /export van (.*) aangemaakt door eekboek/i ) { $desc = _T($1); } else { $desc = $1 if $ebz->[0] =~ m/([^\\\/]+)\.ebz$/i; } $desc =~ s/[\n\r]+$//; # can't happen? think again... push( @ebz_desc, $desc); $i++; } unshift (@ebz, undef ); # skeleton # Enumerate DB drivers. my $drivers = find_db_drivers(); my @db_drivers; foreach ( sort keys %$drivers ) { push( @db_drivers, $_ ); } my $db_default = findchoice( "sqlite", \@db_drivers ); my @btw = ( _T("Maand"), _T("Kwartaal"), _T("Jaar") ); my @noyes = ( _T("Nee"), _T("Ja") ); my $answers = { admname => _T("Mijn eerste EekBoek"), begindate => $year, admbtw => 1, btwperiod => findchoice( _T("Kwartaal"), \@btw ), template => findchoice( _T("EekBoek Voorbeeldadministratie"), \@ebz_desc ), dbdriver => $db_default, dbcreate => 1, }; $answers->{dbhost} = $ENV{EB_DB_HOST} || $default; $answers->{dbport} = $ENV{EB_DB_PORT} || $default; $answers->{dbuser} = $ENV{EB_DB_USER} || $default; $answers->{dbpassword} = $ENV{EB_DB_PASSWORD} || ""; $answers->{dbcr_config} = 1; $answers->{dbcr_admin} = 1; $answers->{dbcr_database} = 1; my $queries; $queries = [ { code => "admname", text => _T(< "string", prompt => _T("Naam"), post => sub { my $c = shift; foreach ( @adm_names ) { next unless lc($_) eq lc($c); warn(_T("Er bestaat al een administratie met deze naam.")."\n"); return; } $c = lc($c); $c =~ s/\W+/_/g; $c .= "_" . $answers->{begindate}, $answers->{admcode} = $c; return 1; }, }, { code => "begindate", text => _T(< _T("Begindatum"), type => "int", range => [ $year-20, $year+10 ], post => sub { my $c = shift; return unless $answers->{admcode}; $answers->{admcode} =~ s/_\d\d\d\d$/_$c/; return 1; }, }, { code => "admcode", text => _T(< "string", prompt => _T("Code"), pre => sub { return if $answers->{admcode}; my $c = $answers->{admname}; $c = lc($c); $c =~ s/\W+/_/g; $c .= "_" . $answers->{begindate}, $answers->{admcode} = $c; return 1; }, post => sub { my $c = shift; foreach ( @adm_dirs ) { next unless lc($_) eq lc($c); warn(__x("Er bestaat al een administratie met code \"{code}\"", code => $c)."\n"); return; } return 1; }, }, { code => "template", text => _T(< "choice", prompt => _T("Sjabloon"), choices => \@ebz_desc, post => sub { my $c = shift; if ( $c == 0 ) { $queries->[4]->{skip} = 0; $queries->[5]->{skip} = 0; } elsif ( $ebz[$c]->[1] =~ /\B-btw\b/i ) { $answers->{admbtw} = 0; $queries->[4]->{skip} = 1; $queries->[5]->{skip} = 1; } else { $answers->{admbtw} = 1; $queries->[4]->{skip} = 1; $queries->[5]->{skip} = 0; } return 1; }, }, { code => "admbtw", prompt => _T("Moet BTW worden toegepast in deze administratie"), type => "bool", post => sub { my $c = shift; $queries->[5]->{skip} = !$c; return 1; }, }, { code => "btwperiod", prompt => _T("Aangifteperiode voor de BTW"), type => "choice", choices => \@btw, }, { code => "dbdriver", text => _T(< "choice", prompt => _T("Database"), choices => \@db_drivers, post => sub { my $c = shift; $queries->[$_]->{skip} = $c == $db_default for ( 7 .. 10 ); return 1; } }, { code => "dbhost", prompt => _T("Database server host, indien niet lokaal"), type => "string", skip => 1, }, { code => "dbport", prompt => _T("Database server netwerk poort, indien niet standaard"), type => "int", skip => 1, }, { code => "dbuser", prompt => _T("Usernaam voor de database"), type => "string", skip => 1, }, { code => "dbpassword", prompt => _T("Password voor de database user"), type => "string", skip => 1, }, { code => "dbcr_config", prompt => _T("Moet het configuratiebestand worden aangemaakt"), type => "bool", }, { code => "dbcr_admin", prompt => _T("Moeten de administratiebestanden worden aangemaakt"), type => "bool", }, { code => "dbcr_database", prompt => _T("Moet de database worden aangemaakt"), type => "bool", }, { code => "dbcreate", text => _T("Gereed om de bestanden aan te maken."), prompt => _T("Doorgaan"), type => "bool", }, ]; QL: for ( my $i = 0; $i < @$queries; $i++ ) { $i = 0 if $i < 0; my $q = $queries->[$i]; next if $q->{skip}; my $code = $q->{code}; print STDERR ( "\n" ); print STDERR ( $q->{text}, "\n" ) if $q->{text}; QQ: while ( 1 ) { $q->{pre}->() if $q->{pre}; if ( $q->{choices} ) { for ( my $i = 0; $i < @{ $q->{choices} }; $i++ ) { printf STDERR ( "%3d: %s\n", $i+1, $q->{choices}->[$i] ); } print STDERR ("\n"); $q->{range} = [ 1, scalar(@{ $q->{choices} }) ]; } print STDERR ( $q->{prompt} ); print STDERR ( " <", $q->{range}->[0], "..", $q->{range}->[1], ">" ) if $q->{range}; print STDERR ( " [", $q->{type} eq 'choice' ? $answers->{$code}+1 : $q->{type} eq 'bool' ? $noyes[$answers->{$code}] : $answers->{$code}, "]" ) if defined $answers->{$code}; print STDERR ( ": " ); my $a = decode_utf8( scalar ); $a = "-\n" unless defined $a; chomp($a); if ( $a eq '-' ) { while ( $i > 0 ) { $i--; redo QL unless $queries->[$i]->{skip}; } } if ( $q->{type} eq 'string' ) { if ( $a eq '' ) { $a = $answers->{$code}; } } elsif ( $q->{type} eq 'bool' ) { if ( $a eq '' ) { $a = $answers->{$code}; } elsif ( $a =~ /^(ja?|ne?e?)$/i ) { $a = $a =~ /^j/i ? 1 : 0; } #### FIXME elsif ( $a =~ /^(ye?s?|no?)$/i ) { $a = $a =~ /^y/i ? 1 : 0; } else { warn( _T("Antwoordt 'ja' of 'nee' a.u.b.") ); redo QQ; } } elsif ( $q->{type} eq 'int' || $q->{type} eq 'choice' ) { if ( $a eq '' ) { $a = $answers->{$code}; $a++ if $q->{type} eq 'choice'; } elsif ( $a !~ /^\d+$/ or $q->{range} && ( $a < $q->{range}->[0] || $a > $q->{range}->[1] ) ) { if ( $q->{range} ) { warn(__x("Ongeldig antwoord, het moet een getal tussen {first} en {last} zijn", first => $q->{range}->[0], last => $q->{range}->[1]) . "\n"); } else { warn(_T("Ongeldig antwoord, het moet een getal zijn")."\n"); } redo QQ; } $a-- if $q->{type} eq 'choice'; } else { die("PROGRAM ERROR: Unhandled request type: ", $q->{type}, "\n"); } if ( $q->{post} ) { redo QQ unless $q->{post}->($a, $answers->{$code}); } $answers->{$code} = $a; last QQ if defined $answers->{$code}; } } return -1 unless $answers->{dbcreate}; my %opts; $opts{lang} = $ENV{EB_LANG} || $ENV{LANG}; $opts{lang} =~ s/\..*//; # strip .utf8 $opts{adm_naam} = $answers->{admname}; $opts{adm_code} = $answers->{admcode}; $opts{adm_begindatum} = $answers->{begindate}; $opts{db_naam} = $answers->{admcode}; $opts{db_driver} = $db_drivers[$answers->{dbdriver}]; unless ( $answers->{dbdriver} == $db_default ) { $opts{db_host} = $answers->{dbhost} if $answers->{dbhost} && $answers->{dbhost} ne $default; $opts{db_port} = $answers->{dbport} if $answers->{dbport} && $answers->{dbport} ne $default; $opts{db_user} = $answers->{dbuser} if $answers->{dbuser} && $answers->{dbuser} ne $default; $opts{db_password} = $answers->{dbpassword} if $answers->{dbpassword} && $answers->{dbpassword} ne ""; } $opts{"has_$_"} = 1 foreach qw(debiteuren crediteuren kas bank); $opts{has_btw} = $answers->{admbtw}; $opts{"create_$_"} = $answers->{dbcr_admin} foreach qw(schema relaties opening mutaties); $opts{"create_$_"} = $answers->{"dbcr_$_"} foreach qw(config database); $opts{adm_btwperiode} = @btw[ $answers->{btwperiod} ] if $opts{has_btw}; $opts{template} = $ebz[ $answers->{template} ]->[0]; if ( $opts{adm_code} ) { mkdir($opts{adm_code}) unless -d $opts{adm_code}; chdir($opts{adm_code}) or die("chdir($opts{adm_code}): $!\n");; } EB::Tools::MiniAdm->sanitize(\%opts); # warn Dumper \%opts; my @req = qw(config schema relaties opening mutaties database); my $req = @req; foreach my $c ( @req ) { if ( $c eq "database" ) { next unless $opts{create_database}; $req--; my $ret; undef $cfg; EB->app_init( { app => $EekBoek::PACKAGE, %opts } ); require EB::Main; local @ARGV = qw( --init ); $ret = EB::Main->run; die(_T("Er is een probleem opgetreden. Raadplaag uw systeembeheerder.")."\n") if $ret; } else { $req--; my $m = "generate_". $c; EB::Tools::MiniAdm->$m(\%opts); } } if ( $req ) { print STDERR ("\n", _T("De gewenste bestanden zijn aangemaakt."), "\n\n"); return -1; } print STDERR ("\n", _T("De gewenste bestanden zijn aangemaakt."), " ", _T("U kunt meteen aan de slag.")."\n\n"); return 0; } 1; EekBoek-2.02.04/lib/EB/Config/0000755000076500007650000000000012165465617013274 5ustar jvjvEekBoek-2.02.04/lib/EB/Config/Data.pm0000444000076500007650000001205112165465617014500 0ustar jvjv#! perl # Data.pm -- Multi-purpose definition of config data # Author : Johan Vromans # Created On : Sat Oct 24 21:30:54 2009 # Last Modified By: Johan Vromans # Last Modified On: Wed Mar 16 20:22:16 2011 # Update Count : 17 # Status : Unknown, Use with caution! use strict; use warnings; package EB::Config::Data; use EB; my $data = [ { section => "cpy", tag => N__("Bedrijfsgegevens"), keys => [ { name => "name", tag => N__("Naam"), type => 'string', value => undef }, { name => "id", tag => N__("Administratienummer"), type => 'string', value => undef }, { name => "address", tag => N__("Adres"), type => 'string', value => undef }, { name => "zip", tag => N__("Postcode"), type => 'string', value => undef }, { name => "city", tag => N__("Plaats"), type => 'string', value => undef }, { name => "taxreg", tag => N__("Fiscaal nummer"), type => 'string', value => undef }, ], }, { section => "general", tag => N__("Algemeen"), keys => [ { name => "admdir", tag => N__("Folder voor administraties"), type => 'folder', value => '$HOME/.eekboek/admdir' }, { name => "wizard", tag => N__("Forceer wizard"), type => 'bool', value => undef }, ], }, { section => "prefs", tag => N__("Voorkeursinstellingen"), keys => [ { name => "journal", tag => N__("Toon journaalpost na elke boeking"), type => 'bool', value => undef }, ], }, { section => "Database", keys => [ { name => "name", tag => N__("Naam"), type => 'string', value => undef }, { name => "driver", tag => N__("Driver"), type => 'choice', value => undef, choices => [ qw(SQLite PostgreSQL) ], values => [ qw(sqlite postgres) ], }, { name => "user", tag => N__("Gebruikersnaam"), type => 'string', value => undef }, { name => "password", tag => N__("Toegangscode"), type => 'string', value => undef }, { name => "host", tag => N__("Server systeem"), type => 'string', value => undef }, { name => "port", tag => N__("Server poort"), type => 'int', value => undef }, ], }, { section => "Strategy", tag => N__("Strategie"), keys => [ { name => "round", tag => N__("Afrondingsmethode"), type => 'choice', value => undef, choices => [ qw(IEEE Bankers POSIX) ], values => [ qw(ieee bankers posix) ], }, { name => "bkm_multi", tag => N__("Meervoudig afboeken"), type => 'bool', value => undef }, { name => "iv_vc", tag => N__("BTW correcties"), type => 'bool', value => undef }, ], }, { section => "shell", tag => N__("Shell"), keys => [ { name => "prompt", tag => N__("Prompt"), type => 'string', value => undef }, { name => "userdefs", tag => N__("Eigen uitbreidingen"), type => 'string', value => undef }, ], }, { section => "Format", tag => N__("Formaten"), keys => [ { name => "numfmt", tag => N__("Getalformaat"), type => 'choice', value => undef, choices => [ "12345,99 (decimaalkomma)", "12345.99 (decimaalpunt)", "12.345,99 (duizendpunt + decimaalkomma)", "12,345.99 (duizendkomma + decimaalpunt)" ], values => [ "12345,99", "12345.99", "12.345,99", "12,345.99" ], }, { name => "date", tag => N__("Datumformaat"), type => 'choice', value => undef, choices => [ "2008-05-31 (ISO)", "31-05-2008 (NEN)", "31-05 (NEN, verkort)" ], values => [ "YYYY-MM-DD", "DD-MM-YYYY", "DD-MM" ], }, ], }, { section => "text", tag => N__("Tekstrapporten"), keys => [ { name => "numwidth", tag => N__("Kolombreedte voor getallen"), type => 'slider', range => [5, 20, 9], value => undef, } ], }, { section => "html", tag => N__("HTML rapporten"), keys => [ { name => "cssdir", tag => N__("Style sheets"), type => 'folder', value => undef, }, ], }, { section => "csv", tag => N__("CSV rapporten"), keys => [ { name => "separator", tag => N__("Scheidingsteken"), type => 'choice', value => undef, choices => [ ", (komma)", "; (puntkomma)", ": (dubbelpunt)", "Tab", ], values => [ ",", ";", ":", "\t", ], }, ], }, { section => "security", tag => N__("Beveiliging"), keys => [ { name => "override_security_for_vista", tag => N__("Beveiliging voor MS Vista uitschakelen"), type => 'bool', value => undef, }, ], }, ]; sub get_data { # class method return bless $data; } sub get_name { my ($self) = $_; "EekBoek"; } sub get_site_url { my ($self) = $_; "http://www.eekboek.nl/"; } sub get_help_url { my ($self) = @_; $self->get_site_url . "docs/config.html"; } sub get_topic_help_url { my ($self, $section, $key) = @_; $self->get_help_url . "#" . join("_", map { lc } $section, $key ); } unless ( caller ) { require YAML; # Use Bless to reorder the data a bit. foreach ( @$data ) { YAML::Bless($_)->keys([qw(section tag keys)]); foreach ( @{$_->{keys}} ) { my %h = map { $_ => 1 } keys %$_; delete @h{qw(name tag type value)}; YAML::Bless($_)->keys([qw(name tag type value), keys(%h)]); } } warn YAML::Dump($data); } 1; EekBoek-2.02.04/lib/EB/Globals.pm0000444000076500007650000000537212165465617014015 0ustar jvjv#! perl # Globals.pm -- # Author : Johan Vromans # Created On : Thu Jul 14 12:54:08 200 # Last Modified By: Johan Vromans # Last Modified On: Tue May 29 12:40:13 2012 # Update Count : 104 # Status : Unknown, Use with caution! use utf8; package EB::Globals; use strict; use warnings; use base qw(Exporter); our @EXPORT; # Define new constant subroutine, and add it to @EXPORT. sub _newconst($$) { my $t = $_[1]; $t = "'$t'" unless $t =~ /^\d+$/ || $t =~ /^\[.*\]$/; #warn("sub $_[0](){$t}\n"); eval("sub $_[0](){$t}"); push(@EXPORT, $_[0]); } # Define an enumeration of constant subroutines. sub _enumconst($@) { my ($pfx, @list) = @_; my $index = 0; foreach ( @list ) { my $key = $pfx.$_; if ( $key =~ /^(.*)=(\d+)$/ ) { $key = $1; $index = $2; } _newconst( $key, $index++ ); } } # To defeat gettext. Strings here are not for translation. sub N__($) { $_[0] } _newconst("SCM_MAJVERSION", 1); _newconst("SCM_MINVERSION", 0); _newconst("SCM_REVISION", 16); _newconst("AMTPRECISION", 2); _newconst("AMTWIDTH", 9); _newconst("NUMGROUPS", 3); _newconst("BTWPRECISION", 4); _newconst("BTWWIDTH", 5); _newconst("AMTSCALE", 100); _newconst("BTWSCALE", 10000); _newconst("BKY_PREVIOUS", "<<<<"); _enumconst("DBKTYPE_", qw(INKOOP=1 VERKOOP BANK KAS MEMORIAAL) ); _newconst("DBKTYPES", "[qw(".N__("-- Inkoop Verkoop Bank Kas Memoriaal").")]"); _enumconst("BTWTARIEF_", qw(NUL=0 HOOG LAAG PRIV ANDERS) ); _newconst("BTWTARIEVEN", "[qw(".N__("Nul Hoog Laag Privé Anders").")]"); _newconst("BTWPERIODES", "[qw(".N__("Geen Jaar 2 3 Kwartaal 5 6 7 8 9 10 11 Maand").")]"); _newconst("BTWPER_GEEN", 0); _newconst("BTWPER_JAAR", 1); _newconst("BTWPER_KWARTAAL", 4); _newconst("BTWPER_MAAND", 12); _enumconst("BTWTYPE_", qw(NORMAAL=0 VERLEGD INTRA EXTRA) ); _newconst("BTWTYPES", "[qw(".N__("Normaal Verlegd Intra Extra").")]"); _newconst("BTWKLASSE_BTW_BIT", 0x200); _newconst("BTWKLASSE_KO_BIT", 0x100); _newconst("BTWKLASSE_TYPE_BITS", 0x0ff); # Starting value for automatically defined BTW codes. _newconst("BTW_CODE_AUTO", 1024); # Eval, since it uses the (run-time defined) subroutines. eval( 'sub BTWKLASSE($$$) {'. ' ($_[0] ? BTWKLASSE_BTW_BIT : 0)'. ' | ($_[1] ? ($_[1] & BTWKLASSE_TYPE_BITS) : 0)'. ' | ($_[2] ? BTWKLASSE_KO_BIT : 0);'. '}' ); push(@EXPORT, qw(BTWKLASSE)); unless ( caller ) { print STDOUT ("-- Constants\n\n", "COMMENT ON TABLE Constants IS\n", " 'This is generated from ", __PACKAGE__, ". DO NOT CHANGE.';\n\n", "COPY Constants (name, value) FROM stdin;\n"); foreach my $key ( sort(@EXPORT) ) { no strict; next if ref($key->()); print STDOUT ("$key\t", $key->(), "\n"); } print STDOUT ("\\.\n"); } 1; EekBoek-2.02.04/lib/EB/DB.pm0000444000076500007650000004663512165465617012726 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Sat May 7 09:18:15 2005 # Last Modified By: Johan Vromans # Last Modified On: Thu Jun 7 14:23:32 2012 # Update Count : 448 # Status : Unknown, Use with caution! ################ Common stuff ################ package main; our $cfg; package EB::DB; use strict; use warnings; use EB; use DBI; use File::Glob qw(:glob); # glob that allows space (for Windows); my $dbh; # singleton for DB my $verbose = 0; my $trace = 0; ################ high level ################ sub check_db { my ($self) = @_; my $fail = 0; # Check the existence of the required tables. my %tables = map { $_, 1 } @{$self->tablesdb}; foreach my $table ( qw(constants standaardrekeningen verdichtingen accounts relaties accounts boekstukken boekstukregels btwtabel journal metadata) ) { next if $tables{$table}; $fail++; warn("?".__x("Tabel {table} ontbreekt in database {db}", table => $table, db => $dbh->{Name}) . "\n"); } warn(join(" ", sort keys %tables)."\n") if $fail; die("?".__x("Ongeldige EekBoek database: {db}.", db => $dbh->{Name}) . " " . _T("Wellicht is de database nog niet geïnitialiseerd?")."\n") if $fail; # Check version, and try automatic upgrade. my ($maj, $min, $rev) = @{$self->do("SELECT adm_scm_majversion, adm_scm_minversion, adm_scm_revision". " FROM Metadata")}; while ( !($maj == SCM_MAJVERSION && sprintf("%03d%03d", $min, $rev) eq sprintf("%03d%03d", SCM_MINVERSION, SCM_REVISION)) ) { # Basically, this will migrate to the highest possibly version, and then retry. my $cur = sprintf("%03d%03d%03d", $maj, $min, $rev); my $tmpl = libfile("migrate/$cur?????????.*l"); my @a = reverse sort glob($tmpl); last unless @a == 1; if ( $a[0] =~ /\.sql$/ && open(my $fh, "<:encoding(utf-8)", $a[0])) { warn("!"._T("De database wordt aangepast aan de nieuwere versie")."\n"); local($/); # slurp mode my $sql = <$fh>; # slurp close($fh); require EB::Tools::SQLEngine; eval { EB::Tools::SQLEngine->new(dbh => $self, trace => $trace)->process($sql); }; warn("?".$@) if $@; $dbh->rollback if $@; } elsif ( $a[0] =~ /\.pl$/ ) { warn("!"._T("De database wordt aangepast aan de nieuwere versie")."\n"); my $sd = $::dbh; $::dbh = $self; eval { require $a[0] }; $::dbh = $sd; warn("?".$@) if $@; } ($maj, $min, $rev) = @{$self->do("SELECT adm_scm_majversion, adm_scm_minversion, adm_scm_revision". " FROM Metadata")}; die("?"._T("De migratie is mislukt. Gelieve de documentatie te raadplegen.")."\n") if $cur eq sprintf("%03d%03d%03d", $maj, $min, $rev); } die("?".__x("Ongeldige EekBoek database: {db} versie {ver}.". " Benodigde versie is {req}.", db => $dbh->{Name}, ver => "$maj.$min.$rev", req => join(".", SCM_MAJVERSION, SCM_MINVERSION, SCM_REVISION)) . "\n") unless $maj == SCM_MAJVERSION && sprintf("%03d%03d", $min, $rev) eq sprintf("%03d%03d", SCM_MINVERSION, SCM_REVISION); # Verify koppelingen. for ( $self->std_acc("deb", undef) ) { next unless defined; my $rr = $self->do("SELECT acc_debcrd, acc_balres FROM Accounts where acc_id = ?", $_); $fail++, warn("?".__x("Geen grootboekrekening voor {dc} ({acct})", dc => _T("Debiteuren"), acct => $_)."\n") unless $rr; # $fail++, warn("?".__x("Foutieve grootboekrekening voor {dc} ({acct})", dc => _T("Debiteuren"), acct => $_)."\n") unless $rr->[0] && $rr->[1]; } for ( $self->std_acc("crd", undef) ) { next unless defined; my $rr = $self->do("SELECT acc_debcrd, acc_balres FROM Accounts where acc_id = ?", $_); $fail++, warn("?".__x("Geen grootboekrekening voor {dc} ({acct})", dc => _T("Crediteuren"), acct => $_)."\n") unless $rr; # $fail++, warn("?".__x("Foutieve grootboekrekening voor {dc} ({acct})", dc => _T("Crediteuren"), acct => $_)."\n") if $rr->[0] || !$rr->[1]; } for ( $self->std_acc("btw_ok", undef) ) { next unless defined; my $rr = $self->do("SELECT acc_balres FROM Accounts where acc_id = ?", $_); $fail++, warn("?".__x("Geen grootboekrekening voor {dc} ({acct})", dc => _T("BTW betaald"), acct => $_)."\n") unless $rr; warn("?".__x("Foutieve grootboekrekening voor {dc} ({acct})", dc => _T("BTW betaald"), acct => $_)."\n") unless $rr->[0]; } for ( $self->std_acc("winst") ) { my $rr = $self->do("SELECT acc_balres FROM Accounts where acc_id = ?", $_); $fail++, warn("?".__x("Geen grootboekrekening voor {dc} ({acct})", dc => _T("overboeking winst"), acct => $_)."\n") unless $rr; warn("?".__x("Foutieve grootboekrekening voor {dc} ({acct})", dc => _T("overboeking winst"), acct => $_)."\n") unless $rr->[0]; } die("?"._T("CONSISTENTIE-VERIFICATIE STANDAARDREKENINGEN MISLUKT")."\n") if $fail; $self->setup; } sub setup { my ($self) = @_; $dbh->begin_work; setupdb(); # Create temp table for account mangling. # This table has the purpose of copying the data from Accounts, so that # data from already completed financial years can be corrected when # creating overviews, such as Balance statements and Result accounts. # This way no backdated calculations need to be made when transitions # to previous financial years are involved. my $sql = "SELECT * INTO TEMP TAccounts FROM Accounts WHERE acc_id = 0"; $sql = $self->feature("filter")->($sql) if $self->feature("filter"); $dbh->do($sql) if $sql; # Make it semi-permanent (this connection only). $dbh->commit; } #### UNUSED sub upd_account { my ($self, $acc, $amt) = @_; my $op = '+'; # perfectionism if ( $amt < 0 ) { $amt = -$amt; $op = '-'; } $self->sql_exec("UPDATE Accounts". " SET acc_balance = acc_balance $op ?". " WHERE acc_id = ?", $amt, $acc); } sub store_journal { my ($self, $jnl) = @_; foreach ( @$jnl ) { $self->sql_insert("Journal", [qw(jnl_date jnl_dbk_id jnl_bsk_id jnl_bsr_date jnl_bsr_seq jnl_seq jnl_type jnl_acc_id jnl_amount jnl_damount jnl_desc jnl_rel jnl_rel_dbk jnl_bsk_ref)], @$_); } } sub bskid { my ($self, $nr, $bky) = @_; return $nr if $nr =~ /^\d+$/ && !wantarray; # Formats: # NNN # DBK:NNN # DBK:BKY:NNN # REL:REF # REL:BKY:REF my $rr; $bky = $self->adm("bky") unless defined($bky); if ( $nr =~ /^([[:alpha:]][^:]+)(?::([^:]+))?:(.*?\D.*)$/ and $rr = $self->do("SELECT rel_code, rel_desc". " FROM Relaties". " WHERE upper(rel_code) = ?", uc($1)) ) { my ($rel_id, $rel_desc) = @$rr; if ( defined($2) ) { unless ( defined $self->lookup($2, qw(Boekjaren bky_code bky_code)) ) { return wantarray ? (undef, undef, __x("Onbekend boekjaar: {bky}", bky => $2)) : undef; } $bky = $2; } $rr = $self->do("SELECT bsk_id, bsk_dbk_id". " FROM Boekstukken, Boekstukregels". " WHERE bsr_rel_code = ?". " AND bsr_bsk_id = bsk_id". " AND upper(bsk_ref) = ?". " AND bsk_bky = ?", $rel_id, uc($3), $bky); unless ( $rr ) { return wantarray ? (undef, undef, __x("Onbekend boekstuk {ref} voor relatie {rel} ({desc})", rel => $rel_id, desc => $rel_desc, ref => $3)) : undef; } $bky = $bky eq $self->adm("bky") ? "" : ":$bky"; return wantarray ? ($rr->[0], $self->lookup($rr->[1], qw(Dagboeken dbk_id dbk_desc))."$bky:$3", undef) : $rr->[0]; } if ( $nr =~ /^([[:alpha:]][^:]+)(?::([^:]+))?:(\d+)$/ ) { $rr = $self->do("SELECT dbk_id, dbk_desc". " FROM Dagboeken". " WHERE upper(dbk_desc) LIKE ?", uc($1)); unless ( $rr ) { return wantarray ? (undef, undef, __x("Onbekend dagboek: {dbk}", dbk => $1)) : undef; } my ($dbk_id, $dbk_desc) = @$rr; if ( defined($2) ) { unless ( defined $self->lookup($2, qw(Boekjaren bky_code bky_code)) ) { return wantarray ? (undef, undef, __x("Onbekend boekjaar: {bky}", bky => $2)) : undef; } $bky = $2; } $rr = $self->do("SELECT bsk_id". " FROM Boekstukken". " WHERE bsk_nr = ?". " AND bsk_bky = ?". " AND bsk_dbk_id = ?", $3, $bky, $dbk_id); unless ( $rr ) { return wantarray ? (undef, undef, __x("Onbekend boekstuk {bsk} in dagboek {dbk}", dbk => $dbk_desc, bsk => $3)) : undef; } $bky = $bky eq $self->adm("bky") ? "" : ":$bky"; return wantarray ? ($rr->[0], "$dbk_desc$bky:$3", undef) : $rr->[0]; } if ( $nr =~ /^(\d+)$/ ) { $rr = $self->do("SELECT bsk_nr, dbk_id, dbk_desc, bsk_bky". " FROM Boekstukken, Dagboeken". " WHERE bsk_dbk_id = dbk_id". " AND bsk_id = ?", $nr); unless ( $rr ) { return wantarray ? (undef, undef, __x("Onbekend boekstuk: {bsk}", bsk => $nr)) : undef; } my ($bsk_nr, $dbk_id, $dbk_desc, $bsk_bky) = @$rr; $bsk_nr =~ s/\s+$//; $bky = $bsk_bky eq $self->adm("bky") ? "" : ":$bsk_bky"; return wantarray ? ($nr, "$dbk_desc$bky:$bsk_nr", undef) : $nr; } die("?".__x("Ongeldige boekstukaanduiding: {bsk}", bsk => $nr)."\n"); } ################ low level ################ sub new { my ($pkg, %atts) = @_; $pkg = ref($pkg) || $pkg; $verbose = delete($atts{verbose}) || 0; $trace = delete($atts{trace}) || 0; my $self = {}; bless $self, $pkg; $self->_init; $self; } sub _init { my ($self) = @_; } my %adm; sub adm { my ($self, $name, $value, $notx) = @_; if ( $name eq "" ) { %adm = (); return; } unless ( %adm ) { $self->connectdb; my $sth = $self->sql_exec("SELECT *". " FROM Metadata, Boekjaren". " WHERE adm_bky = bky_code"); my $rr = $sth->fetchrow_hashref; $sth->finish; while ( my($k,$v) = each(%$rr) ) { my $k1 = $k; $k =~ s/^(adm|bky)_//; $adm{lc($k)} = [$k1, $v]; } } exists $adm{lc($name)} || die("?".__x("Niet-bestaande administratie-eigenschap: {adm}", adm => $name)."\n"); $name = lc($name); if ( @_ >= 3 ) { $self->begin_work unless $notx; $self->sql_exec("UPDATE Metadata". " SET ".$adm{$name}->[0]." = ?", $value)->finish; $self->commit unless $notx; $adm{$name}->[1] = $value; } else { defined $adm{$name} ? $adm{$name}->[1] : ""; } } sub dbver { my ($self) = @_; sprintf("%03d%03d%03d", $self->adm("scm_majversion"), $self->adm("scm_minversion")||0, $self->adm("scm_revision")); } my %std_acc; my @std_acc; sub std_acc { my ($self, $name, $def) = @_; if ( $name eq "" ) { %std_acc = (); @std_acc = (); return; } $self->std_accs unless %std_acc; return $std_acc{lc($name)} if defined($std_acc{lc($name)}); return $def if @_ > 2; die("?".__x("Niet-bestaande standaardrekening: {std}", std => $name)."\n"); } sub std_accs { my ($self) = @_; unless ( @std_acc ) { $self->connectdb; my $sth = $self->sql_exec("SELECT * FROM Standaardrekeningen"); my $rr = $sth->fetchrow_hashref; $sth->finish; while ( my($k,$v) = each(%$rr) ) { next unless defined $v; $k =~ s/^std_acc_//; $std_acc{lc($k)} = $v; } @std_acc = sort(keys(%std_acc)); } \@std_acc; } my $accts; sub accts { my ($self, $sel) = @_; $sel = $sel ? " WHERE $sel" : ""; return $accts->{$sel} if $accts->{$sel}; my $sth = $self->sql_exec("SELECT acc_id,acc_desc". " FROM Accounts". $sel. " ORDER BY acc_id"); my $rr; while ( $rr = $sth->fetchrow_arrayref ) { $accts->{$sel}->{$rr->[0]} = $rr->[1]; } $accts->{$sel}; } sub acc_inuse { my ($dbh, $acc) = @_; my $rr; $rr = $dbh->do("SELECT jnl_acc_id FROM Journal". " WHERE jnl_acc_id = ?". " LIMIT 1", $acc); return 1 if $rr && $rr->[0]; $rr = $dbh->do("SELECT dbk_acc_id FROM Dagboeken". " WHERE dbk_acc_id = ?". " LIMIT 1", $acc); return 1 if $rr && $rr->[0]; $rr = $dbh->do("SELECT rel_acc_id FROM Relaties". " WHERE rel_acc_id = ?". " LIMIT 1", $acc); return 1 if $rr && $rr->[0]; $rr = $dbh->do("SELECT bkb_acc_id FROM Boekjaarbalans". " WHERE bkb_acc_id = ?", $acc); return 1 if $rr && $rr->[0]; if ( $rr = $dbh->do("SELECT * FROM Standaardrekeningen") ) { for ( @$rr ) { return 1 if defined($_) && $_ == $acc; } } return; } sub dbh{ $dbh; } sub adm_open { my ($self) = @_; $self->connectdb; $self->adm("bky") ne BKY_PREVIOUS; } sub adm_busy { my ($self) = @_; $self->connectdb; $self->do("SELECT COUNT(*) FROM Journal")->[0]; } sub does_btw { my ($self) = @_; $self->connectdb; return defined($self->adm("btwbegin")) if $self->adm_open; $self->do("SELECT COUNT(*)". " FROM BTWTabel". " WHERE btw_tariefgroep != 0")->[0]; } ################ API calls for simple applications ################ sub connect { my $dataset = $cfg->val(qw(database name)); if ( !$dataset ) { die(_T("Geen dataset opgegeven.". " Specificeer een dataset in de configuratiefile."). "\n"); } $::dbh = EB::DB::->new(); } sub disconnect { $::dbh->disconnectdb; undef $::dbh; } ################ API calls for database backend ################ my $tx; my $dbpkg; sub connectdb { my ($self, $nocheck) = @_; return $dbh if $dbh; my $pkg = $dbpkg || $self->_loaddbbackend; my $dbname = $cfg->val(qw(database name)); croak("?INTERNAL ERROR: No database name") unless defined $dbname; eval { $dbh = $pkg->connect($dbname) or die("?".__x("Database verbindingsprobleem: {err}", err => $DBI::errstr)."\n"); }; die($@) if $@; $dbpkg = $pkg; $dbh->{RaiseError} = 1; #$dbh->{AutoCommit} = 0; $dbh->{ChopBlanks} = 1; $self->check_db unless $nocheck; $tx = 0; $dbh; } sub disconnectdb { my ($self) = shift; return unless $dbpkg; return unless $dbh; resetdbcache($self); $dbpkg->disconnect; $tx = 0; undef $dbh; } sub feature { my ($self) = shift; $dbpkg ||= $self->_loaddbbackend; $dbpkg->feature(@_); } sub setupdb { my ($self) = shift; $dbpkg ||= $self->_loaddbbackend; $dbpkg->setup; } sub listdb { my ($self) = shift; $dbpkg ||= $self->_loaddbbackend; $dbpkg->list; } sub tablesdb { my ($self) = shift; $dbpkg ||= $self->_loaddbbackend; $dbpkg->get_tables; } sub cleardb { my ($self) = shift; $dbpkg ||= $self->_loaddbbackend; $self->resetdbcache; $dbpkg->clear; } sub createdb { my ($self, $dbname) = @_; $dbpkg ||= $self->_loaddbbackend; Carp::confess("DB backend setup failed") unless $dbpkg; $self->resetdbcache; $dbpkg->create($dbname); } sub driverdb { my ($self) = shift; $dbpkg ||= $self->_loaddbbackend; $dbpkg->type; } sub isql { my ($self) = shift; $dbpkg ||= $self->_loaddbbackend; $dbpkg->isql(@_); } sub get_sequence { my ($self) = shift; warn("=> GET-SEQUENCE ", $_[0], "\n") if $trace; $self->connectdb; Carp::confess("DB backend setup failed") unless $dbpkg; Carp::croak("INTERNAL ERROR: get_sequence takes only one argument") if @_ != 1; $dbpkg->get_sequence(@_); } sub set_sequence { my ($self) = shift; warn("=> SET-SEQUENCE ", $_[0], " TO ", $_[1], "\n") if $trace; $self->connectdb; Carp::confess("DB backend setup failed") unless $dbpkg; $dbpkg->set_sequence(@_); } sub _loaddbbackend { my ($self) = @_; my $dbtype = $cfg->val(qw(database driver), "sqlite"); # Trim whitespace for stupid users. for ( $dbtype ) { s/^\s+//; s/\s+$//; } my $pkg = __PACKAGE__ . "::" . ucfirst(lc($dbtype)); my $pkgfile = __PACKAGE__ . "::" . ucfirst(lc($dbtype)) . ".pm"; $pkgfile =~ s/::/\//g; eval { require $pkgfile }; die("?".__x("Geen ondersteuning voor database type {db}", db => $dbtype)."\n$@") if $@; #Carp::cluck("Returning: $pkg"); return $pkg; } ################ End API calls for database backend ################ sub trace { my ($self, $value) = @_; my $cur = $trace; $trace = !$trace, return $cur unless defined $value; $trace = $value; $cur; } sub sql_insert { my ($self, $table, $columns, @args) = @_; $self->sql_exec("INSERT INTO $table ". "(" . join(",", @$columns) . ") ". "VALUES (" . join(",", ("?") x @$columns) . ")", @args); } my %sth; my $sql_prep_cache_hits; my $sql_prep_cache_miss; sub sql_prep { my ($self, $sql) = @_; $dbh ||= $self->connectdb(); $sql = $self->feature("filter")->($sql) if $self->feature("filter"); return $dbh->prepare($sql) unless $self->feature("prepcache"); if ( defined($sth{$sql}) ) { $sql_prep_cache_hits++; return $sth{$sql}; } $sql_prep_cache_miss++; $sth{$sql} = $dbh->prepare($sql); } sub prepstats { warn("SQL Prep Cache: number of hits = ", $sql_prep_cache_hits || 0, ", misses = ", $sql_prep_cache_miss || 0, "\n") if %sth && $cfg->val("internal sql", qw(prepstats), 0); } sub resetdbcache { my ($self) = @_; %sth = (); return unless $self; $self->std_acc(""); $self->adm(""); } sub show_sql($$@) { my ($self, $sql, @args) = @_; my @a = map { !defined($_) ? "NULL" : /^[0-9]+$/ ? $_ : $dbh->quote($_) } @args; $sql =~ s/\?/shift(@a)/eg; warn("=> $sql;\n"); } sub sql_exec { my ($self, $sql, @args) = @_; $dbh ||= $self->connectdb(); $self->show_sql($sql, @args) if $trace; checktx($sql); my $sth = $self->sql_prep($sql); $sth->execute(@args); $sth; } sub lookup($$$$$;$) { my ($self, $value, $table, $arg, $res, $op) = @_; $op ||= "="; my $sth = $self->sql_exec("SELECT $res FROM $table". " WHERE $arg $op ?", $value); my $rr = $sth->fetchrow_arrayref; $sth->finish; return ($rr && defined($rr->[0]) ? $rr->[0] : undef); } sub get_value { my ($self, $column, $table) = @_; my $sth = $self->sql_exec("SELECT $column FROM $table"); my $rr = $sth->fetchrow_arrayref; $sth->finish; return ($rr && defined($rr->[0]) ? $rr->[0] : undef); } sub do { my $self = shift; my $sql = shift; my $atts = ref($_[0]) eq 'HASH' ? shift : undef; my @args = @_; my $sth = $self->sql_exec($sql, @args); my $rr = $sth->fetchrow_arrayref; $sth->finish; $rr; } sub da { # do_all my $self = shift; my $sql = shift; my $atts = ref($_[0]) eq 'HASH' ? shift : undef; my @args = @_; my $sth = $self->sql_exec($sql, @args); my $res; while ( my $rr = $sth->fetchrow_arrayref ) { push( @$res, [@$rr] ); } $sth->finish; $res; } sub errstr { $dbh->errstr; } sub in_transaction { my $self = shift; $tx; } sub checktx { my ($sql, $allow) = @_; return if $tx; $sql =~ /^\s*(\w+)\s+(\S+)/i; my $cmd = $1 ? uc($1) : die("?INTERNAL ERROR: Invalid SQL command: $sql\n"); return if $cmd eq "SELECT"; my $msg = "INTERNAL ERROR: $cmd $2 while not in transaction"; $allow ? warn("!$msg\n") : die("?$msg\n"); } # # http://en.wikipedia.org/wiki/Database_transaction#In_SQL sub begin_work { my ($self) = @_; warn("=> BEGIN WORK;", $dbh ? "" : " (ignored)", "\n") if $trace; return unless $dbh; die("?INTERNAL ERROR: BEGIN WORK while in transaction\n") if $tx++; $dbh->begin_work; } sub commit { my ($self) = @_; warn("=> COMMIT WORK;", $dbh ? "" : " (ignored)", "\n") if $trace; return unless $dbh; die("?INTERNAL ERROR: COMMIT while not in transaction\n") unless $tx; $tx = 0; $dbh->commit; } sub rollback { my ($self) = @_; warn("=> ROLLBACK WORK;", $dbh ? "" : " (ignored)", "\n") if $trace; return unless $dbh; die("?INTERNAL ERROR: ROLLBACK while not in transaction\n") unless $tx; $tx = 0; $dbh->rollback } END { prepstats(); disconnectdb(); } 1; EekBoek-2.02.04/lib/EB/Shell/0000755000076500007650000000000012165465617013136 5ustar jvjvEekBoek-2.02.04/lib/EB/Shell/Base.pm0000444000076500007650000004170712165465617014355 0ustar jvjv#! perl package main; our $cfg; package EB::Shell::Base; # ---------------------------------------------------------------------- # Shell::Base - A generic class to build line-oriented command interpreters. # ---------------------------------------------------------------------- # Copyright (C) 2003 darren chamberlain # # This module is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # ---------------------------------------------------------------------- # # Modified for use by EekBoek by Johan Vromans. use strict; use EB; use Text::ParseWords qw(shellwords); # ---------------------------------------------------------------------- # new(\%args) # # Basic constructor. # # new() calls initialization methods: # # - init_rl # # o Initializes the Term::ReadLine instance # # - init_help # # o Initializes the list of help methods # # - init_completions # # o Initializes the list of tab-completable commands # # - init # # o Subclass-specific intializations. # # ---------------------------------------------------------------------- sub new { my $class = shift; $class = ref($class) || $class; # make it work with derived classes - jv my $args = UNIVERSAL::isa($_[0], 'HASH') ? shift : { @_ }; my $self = bless { COMPLETIONS => undef, # tab completion HELPS => undef, # help methods HISTFILE => undef, # history file PROMPT => "eb> ", # default prompt TERM => undef, # Term::ReadLine instance RL_DEBUG => $cfg->val(qw(readline debug), 0), } => $class; $self->init_cm($args); $self->init_rl($args); $self->init_completions($args); $self->init_help($args); $self->init($args); return $self; } # ---------------------------------------------------------------------- # init_km(\%args) # # Initialize command name maps for translation. # ---------------------------------------------------------------------- sub init_cm { my ($self, $args) = @_; # See EB::Utils for __XN, __xt and N__ . my %cm = map { __XN($_) => __xt($_) } # Opening. N__("cmd:adm_balans"), N__("cmd:adm_balanstotaal"), N__("cmd:adm_begindatum"), N__("cmd:adm_boekjaarcode"), N__("cmd:adm_btwperiode"), N__("cmd:adm_naam"), N__("cmd:adm_open"), N__("cmd:adm_relatie"), # Globale settings. N__("cmd:boekjaar"), # Rapporten. N__("cmd:balans"), N__("cmd:btwaangifte"), N__("cmd:crediteuren"), N__("cmd:debiteuren"), N__("cmd:grootboek"), N__("cmd:journaal"), N__("cmd:openstaand"), N__("cmd:proefensaldibalans"), N__("cmd:result"), # Informatie. N__("cmd:dagboeken"), N__("cmd:database"), N__("cmd:periodes"), N__("cmd:rapporten"), # Bewerkingen. N__("cmd:export"), N__("cmd:import"), N__("cmd:jaareinde"), N__("cmd:relatie"), N__("cmd:schema"), N__("cmd:toon"), N__("cmd:verwijder"), # Diversen. N__("cmd:include"), N__("cmd:sql"), ; $self->{cm} = \%cm; } # ---------------------------------------------------------------------- # init_rl(\%args) # # Initialize Term::ReadLine. Subclasses can override this method if # readline support is not needed or wanted. # ---------------------------------------------------------------------- sub init_rl { my ($self, $args) = @_; my ($term, $attr); $ENV{PERL_READLINE_NOWARN} = 1 unless $self->{RL_DEBUG}; require Term::ReadLine; warn("\%Trying: ReadLine (", $ENV{PERL_RL}||"default", ")\n") if $self->{RL_DEBUG}; $term = Term::ReadLine->new(ref $self); warn("\%Using: ", $term->ReadLine, "\n") if $self->{RL_DEBUG}; $self->term($term); # Setup default tab-completion function. # Note that this will be overridden by EB::Shell->new. $attr = $term->Attribs; $attr->{completion_function} = sub { $self->complete(@_) }; if (my $histfile = $args->{ HISTFILE }) { # Should use $term->Features->{addhistory} . $self->histfile($histfile); if ( $term->can("ReadHistory") ) { $term->ReadHistory($histfile); } elsif ( open( my $fd, '<:encoding(utf8)', $histfile ) ) { $self->{_history} = []; while ( <$fd> ) { chomp; $term->addhistory($_); push( @{ $self->{_history} }, $_, "\n" ); } close($fd); } } return $self; } # ---------------------------------------------------------------------- # init_help() # # Initializes the internal HELPS list, which is a list of all the # help_foo methods defined within the current class, and all the # classes from which the current class inherits from. # ---------------------------------------------------------------------- sub init_help { my $self = shift; my $class = ref $self || $self; my %uniq = (); no strict qw(refs); $self->helps( grep { ++$uniq{$_} == 1 } map { s/^help_//; $self->{cm}->{$_}||$_ } grep /^help_/, map({ %{"$_\::"} } @{"$class\::ISA"}), keys %{"$class\::"}); } sub _xtr { my ( $self, $t ) = @_; (my $pfx, $t) = ( $1, $2 ) if $t =~ /^(.*):(.*)/; keys( %{$self->{cm}} ); # reset iteration while ( my ($k, $v) = each %{$self->{cm}} ) { next unless $t eq $v; return $1 if $k =~ /^tg_(.*)/; return $k; } undef; } # ---------------------------------------------------------------------- # init_completions() # # Initializes the internal COMPLETIONS list, which is used by the # complete method, which is, in turn, used by Term::ReadLine to # do tab-compleion. # ---------------------------------------------------------------------- sub init_completions { my $self = shift; my $class = ref $self || $self; my %uniq = (); no strict qw(refs); $self->completions( sort "help", grep { ++$uniq{$_} == 1 } map { s/^(do|pp)_//; $self->{cm}->{$_}||$_ } grep /^(do|pp)_/, map({ %{"$_\::"} } @{"$class\::ISA"}), keys %{"$class\::"}); } # ---------------------------------------------------------------------- # init(\%args) # # Basic init method; subclasses can override this as needed. This is # the place to do any subclass-specific initialization. # # Command completion is initialized here, so subclasses should call # $self->SUPER::init(@_) within overridden init methods if they want # this completion to be setup. # ---------------------------------------------------------------------- sub init { my ($self, $args) = @_; return $self; } # ---------------------------------------------------------------------- # run() # # run is the main() of the interpreter. Its duties are: # # - Get a line of input, via $self->term->readline. # This begins the run loop. # # o Pass this line to $self->parseline for splitting into # (command_name, arguments) # # o Check contents of command_name; there are a few special # cases: # # + If the line is a help line, then call $self->help(@args) # # + If the line is a quit line, then return with $self->quit() # # + Otherwise, attempt to invoke $self->do_$command_name # # o The output from whichever of the above is chosen will be # be printed via $self->print() if defined. # # o The prompt is reset, and control returns to the top of # the run loop. # ---------------------------------------------------------------------- sub run { my $self = shift; my $prompt = $self->prompt; my $anyfail; while (defined (my $line = $self->readline($prompt))) { my (@args, $cmd, $output); ($cmd, @args) = $self->parseline($line); # If there's a quoting mistake, parseline returns nothing. if ( $line =~ /\S/ && $cmd !~ /\S/ ) { warn("?"._T("Fout in de invoerregel. Controleer de \" en ' tekens.")."\n"); next; } if (! length($cmd)) { next; } elsif ( $cmd =~ /^\s*(help|\?)/i ) { $output = $self->help(@args); } elsif ( $cmd =~ /^\s*(exit|quit|logout)/i ) { return $self->quit($anyfail?1:0); } else { my $meth = "pp_".lc($self->_xtr("cmd:$cmd")||$cmd); if ( $self->can($meth) ) { eval { ($cmd, @args) = $self->$meth($cmd, @args); }; if ($@) { my $err = $@; chomp $err; warn "?$err\n"; next; } } $meth = "do_".lc($self->_xtr("cmd:".lc($cmd))||$cmd); $meth =~ s/\s+/_/g; if ( $self->can($meth) ) { eval { # Check warnings for ? (errors). my $fail = 0; local $SIG{__WARN__} = sub { $fail++ if $_[0] =~ /^\?/; warn(@_); }; $output = $self->$meth(@args); # Throw error if errors detected. die(bless {}, 'FatalError') if $fail && $self->{errexit}; }; if ( !$@ && $self->{errexit} && $output =~ /^\?/m ) { eval { die($output) }; } if ($@) { $anyfail++; unless ( UNIVERSAL::isa($@, 'FatalError') ) { my $err = $@; chomp $err; # jv warn "$output ($err)\n"; warn "?$err\n"; } if ( $self->{errexit} ) { warn("?"._T(" ****** Afgebroken wegens fouten in de invoer ******")."\n"); return $self->quit(1); } } } else { warn("?".__x("Onbekende opdracht \"{cmd}\".\n\"help\" geeft een lijst van mogelijke opdrachten.", cmd => $cmd)."\n"); undef($output); return $self->quit(1) if $self->{errexit}; } } # Suppress the newline if there's nothing to print. if ( defined $output ) { $output =~ s/\n*$//; chomp $output; $self->print("$output\n") if $output; } # Make sure we're not in a pending transaction. if ( $::dbh->in_transaction ) { warn("?INTERNAL ERROR: Command failed but did not rollback.\n"); $::dbh->rollback; } # In case someone modified the prompt, we recollect it before # displaying it. $prompt = $self->prompt(); } $self->quit($anyfail?1:0); } # ---------------------------------------------------------------------- # readline() # # Calls readline on the internal Term::ReadLine instance. Provided # as a separate method within Shell::Base so that subclasses which # do not want to use Term::ReadLine don't have to. # ---------------------------------------------------------------------- sub __orig_readline { my ($self, $prompt) = @_; return $self->term->readline($prompt); } sub readline { my ($self, $prompt) = @_; my $line = $self->term->readline($prompt); push( @{ $self->{_history} }, $line."\n" ) if $line =~ /\S/; return $line; } # ---------------------------------------------------------------------- # print(@data) # # This method is here to that subclasses can redirect their output # stream without having to do silly things like tie STDOUT (although # they still can if they want, by overriding this method). # ---------------------------------------------------------------------- sub __orig_print { my ($self, @stuff) = @_; my $OUT = $self->term->Attribs->{'outstream'}; $OUT ||= *STDOUT; CORE::print $OUT @stuff; } sub print { my ($self, @stuff) = @_; CORE::print STDOUT @stuff; } # ---------------------------------------------------------------------- # quit([$status]) # # Exits the interpreter with $status as the exit status (0 by default). # ---------------------------------------------------------------------- sub quit { my ($self, $status) = @_; $status = 0 unless defined $status; if (my $h = $self->histfile) { # XXX Can this be better encapsulated? if ( $self->term->can("WriteHistory") ) { $self->term->WriteHistory($h); } elsif ( open( my $fd, '>:encoding(utf8)', $h ) ) { print { $fd } @{ $self->{_history} }; close($fd); } } return $status; } # ---------------------------------------------------------------------- # do_version() # # Show version. # ---------------------------------------------------------------------- sub do_version { my $self = shift; return $EB::ident; } sub help_version { return _T("Toon versie."); } # ---------------------------------------------------------------------- # parseline($line) # # parseline splits a line into three components: # # 1. Command # # 3. Arguments # # returns an array that looks like: # # ($cmd, @args) # # This parseline method doesn't handle pipelines gracefully; pipes # ill treated like any other token. # ---------------------------------------------------------------------- sub parseline { my ($self, $line) = @_; my ($cmd, @args); @args = shellwords($line); while (@args) { $cmd = shift @args; last; } return (($cmd or ""), @args); } # ---------------------------------------------------------------------- # term() # # Returns the Term::ReadLine instance. Useful if the subclass needs # do something like modify attributes on the instance. # ---------------------------------------------------------------------- sub term { my $self = shift; $self->{ TERM } = shift if (@_); return $self->{ TERM }; } # ---------------------------------------------------------------------- # histfile([$histfile]) # # Gets/set the history file. # ---------------------------------------------------------------------- sub histfile { my $self = shift; $self->{ HISTFILE } = shift if (@_); return $self->{ HISTFILE }; } # ---------------------------------------------------------------------- # prompt([$prompt[, @args]]) # # The prompt can be modified using this method. For example, multiline # commands (which much be handled by the subclass) might modify the # prompt, e.g., PS1 and PS2 in bash. If $prompt is a coderef, it is # executed with $self and @args: # # $self->{ PROMPT } = &$prompt($self, @args); # ---------------------------------------------------------------------- sub prompt { my $self = shift; if (@_) { my $p = shift; if (ref($p) eq 'CODE') { $self->{ PROMPT } = &$p($self, @_); } else { $self->{ PROMPT } = $p; } } return $self->{ PROMPT }; } # ---------------------------------------------------------------------- # help([$topic[, @args]]) # # Displays help. With $topic, it attempts to call $self->help_$topic, # which is expected to return a string. Without $topic, it lists the # available help topics, which is a list of methods that begin with # help_; these names are massaged with s/^help_// before being displayed. # ---------------------------------------------------------------------- sub help { my ($self, $topic, @args) = @_; my @ret; if ($topic) { if (my $sub = $self->can("help_". ($self->_xtr("cmd:".lc($topic))||lc($topic)))) { push @ret, $self->$sub(@_); push(@ret, _T("Opdrachtnamen zijn hoofdletterongevoelig.") ) unless $topic eq lc($topic); } else { push @ret, __x("Sorry, geen hulp voor {topic}.", topic => $topic); } } else { my @helps = $self->helps; if (@helps) { push( @ret, _T("Hulp is beschikbaar voor de volgende onderwerpen."), _T("Typ 'help [onderwerp]' voor meer gedetailleerde informatie."), _T("Opdrachtnamen zijn hoofdletterongevoelig.") ); my $t = "=" x max( length($ret[-1]), length($ret[-2]) ); push(@ret, $t, map({ " * $_" } sort @helps), $t); } else { push @ret, _T("Geen hulp beschikbaar."); } } return join "\n", @ret; } # ---------------------------------------------------------------------- # helps([@helps]) # # Returns or sets a list of possible help functions. # ---------------------------------------------------------------------- sub helps { my $self = shift; if (@_) { $self->{ HELPS } = \@_; } return @{ $self->{ HELPS } }; } # ---------------------------------------------------------------------- # complete(@_) # # Command completion -- this method is designed to be assigned as: # # $term->Attribs->{completion_function} = sub { $self->complete(@_) }; # # Note the silly setup -- it will be called as a function, without # any references to $self, so we need to force $self into the equation # using a closure. # ---------------------------------------------------------------------- sub complete { my ($self, $word, $line, $pos) = @_; #warn "Completing '$word' in '$line' (pos $pos)"; # This is grossly suboptimal, and only completes on # defined keywords. A better idea is to: # 1. If subtr($line, ' ') is less than $pos, # then we are completing a command # (the current method does this correctly) # 2. Otherwise, we are completing something else. # By default, this should defer to regular filename # completion. return grep { /$word/ } $self->completions; } sub completions { my $self = shift; if (@_) { $self->{ COMPLETIONS } = \@_; } return @{ $self->{ COMPLETIONS } }; } 1; # =head1 AUTHOR # # darren chamberlain Edarren@cpan.orgE # # Modified for EekBoek by Ejv@cpan.orgE # # =head1 COPYRIGHT # # Copyright (C) 2003 darren chamberlain. All Rights Reserved. # # This module is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. EekBoek-2.02.04/lib/EB/Shell/DeLuxe.pm0000444000076500007650000001104212165465617014656 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Author : Johan Vromans # Created On : Thu Jul 7 15:53:48 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Aug 25 22:48:50 2012 # Update Count : 294 # Status : Unknown, Use with caution! ################ Common stuff ################ ################ WARNING: This file crashes xgettext. # Translateable strings should be maintained in DeLuxe_Fake.pm as well. ################ package main; our $cfg; package EB::Shell::DeLuxe; use strict; use base qw(EB::Shell::Base); use EB; sub new { my $class = shift; $class = ref($class) || $class; my $opts = UNIVERSAL::isa($_[0], 'HASH') ? shift : { @_ }; $opts->{interactive} = 0 if $opts->{command}; $opts->{interactive} = -t unless defined $opts->{interactive}; unless ( $opts->{interactive} ) { no strict 'refs'; *{"init_rl"} = sub {}; *{"histfile"} = sub {}; *{"print"} = sub { shift; CORE::print @_ }; } else { no strict 'refs'; *{"init_rl"} = sub { shift->SUPER::init_rl(@_) }; *{"histfile"} = sub { shift->SUPER::histfile(@_) }; *{"print"} = sub { shift->SUPER::print(@_) }; } my $self = $class->SUPER::new($opts); $self->{$_} = $opts->{$_} foreach keys(%$opts); if ( $opts->{command} ) { $self->{readline} = \&readline_command; } elsif ( $opts->{interactive} ) { $self->{readline} = \&readline_interactive; } else { $self->{readline} = sub { $self->readline_file(sub { }) }; } $self->{inputstack} = []; $self->{errexit} = -t STDIN ? 0 : $opts->{errexit}; $self; } sub readline_interactive { my ($self, $prompt) = @_; return $self->SUPER::readline($prompt); } use Encode; sub readline_file { my ($self, $rl) = @_; my $line; my $pre = ""; while ( 1 ) { $line = $rl->(); unless ( $line ) { warn("?"._T("Vervolgregel ontbreekt in de invoer.")."\n") if $pre; return; } if ( $line =~ /^\# \s* content-type: \s* text (?: \s* \/ \s* plain)? \s* ; \s* charset \s* = \s* (\S+) \s* $/ix ) { my $charset = lc($1); if ( $charset =~ /^(?:utf-?8)$/i ) { next; } die("?"._T("Invoer moet Unicode (UTF-8) zijn.")."\n"); } =begin thismustbefixed if ( $self->{unicode} xor $cfg->unicode ) { my $s = $line; eval { if ( $cfg->unicode ) { $line = decode($self->{unicode} ? 'utf8' : 'latin1', $s, 1); } else { Encode::from_to($line, 'utf8', 'latin1', 1); } }; if ( $@ ) { warn("?".__x("Geen geldige {cs} tekens in regel {line} van de invoer", cs => $self->{unicode} ? "UTF-8" : "Latin1", line => $.)."\n".$line."\n"); next; } } =cut my $s = $line; my $t = "".$line; eval { $line = decode('utf8', $s, 1); }; if ( $@ ) { warn("?".__x("Geen geldige UTF-8 tekens in regel {line} van de invoer", line => $.)."\n".$t."\n"); next; } if ( $self->{echo} ) { my $pr = $self->{echo}; $pr =~ s/\>/>>/ if $pre; print($pr, $line); } unless ( $line =~ /\S/ ) { # Empty line will stop \ continuation. return $pre if $pre ne ""; next; } next if $line =~ /^\s*#/; $line =~ s/\s*[\r\n]+$//; # be forgiving $line =~ s/\s+#.+$//; warn("!".__x("Invoerregel {lno} bevat onzichtbare tekens na de backslash", lno => $.)."\n") # can't happen? if $line =~ /\\\s+$/; if ( $line =~ /(^.*)\\$/ ) { $line = $1; $line =~ s/\s+$/ /; $pre .= $line; next; } return $pre.$line; } } sub attach_file { my ($self, $file) = @_; push( @{ $self->{inputstack} }, [ $self->{readline} ] ); $self->{readline} = sub { shift->readline_file(sub { <$file> }) }; } sub attach_lines { my ($self, $lines) = @_; push( @{ $self->{inputstack} }, [ $self->{readline} ] ); my @lines = @$lines; $self->{readline} = sub { shift->readline_file(sub { shift(@lines); }) }; } sub readline_command { my ($self, $prompt) = @_; return undef unless @ARGV; return shift(@ARGV) if @ARGV == 1; my $line = ""; while ( @ARGV ) { my $word = shift(@ARGV); $word =~ s/('|\\)/\\$1/g; $line .= " " if $line ne ""; $line .= "'" . $word . "'"; } return $line; } sub readline { my ($self, $prompt) = @_; my $ret; while ( !defined($ret = $self->{readline}->($self, $prompt)) ) { return unless @{$self->{inputstack}}; ( $self->{readline} ) = @{pop(@{$self->{inputstack}})}; } # Command parsing gets stuck on leading blanks. $ret =~ s/^\s+//; $ret =~ s/\s+$//; return $ret; } 1; EekBoek-2.02.04/lib/EB/user/0000755000076500007650000000000012165465617013045 5ustar jvjvEekBoek-2.02.04/lib/EB/user/css/0000755000076500007650000000000012165465617013635 5ustar jvjvEekBoek-2.02.04/lib/EB/user/css/crdrept.css0000444000076500007650000000002612165465617016006 0ustar jvjv@import "debcrd.css"; EekBoek-2.02.04/lib/EB/user/css/debcrd.css0000444000076500007650000000377312165465617015602 0ustar jvjv/* $Id */ /* CSS for Debiteuren/Crediteuren reports */ @import eekboek.css; .title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; margin-bottom: 0pt; } .subtitle { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; } .footer { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: normal; } body { font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #000000; table-width: 100%; } /* Table and borders */ table { border: thin solid #000000; border-collapse: collapse; } table td { border-left: thin solid #000000; border-right: thin solid #000000; } table th { border-left: thin solid #000000; border-right: thin solid #000000; border-bottom: thin solid #000000; } /* By default, align rows at top */ th { vertical-align: top; } tr { vertical-align: top; } /* Row styles */ .r_total { padding-bottom: 10pt; font-weight: bold; border-bottom: thin solid #000000; } .r_bsk, .r_h1, .r_grand { font-weight: bold; } /* Column styles */ .c_debcrd, .h_debcrd { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_date, .h_date { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_desc, .h_desc { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_amount, .h_amount { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_open, .h_open { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_paid, .h_paid { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_bsknr, .h_bsknr { padding-left: 10pt; padding-right: 10pt; text-align: left; } /* Special style */ .r_paid .c_desc { text-indent: 1em; } .r_bskprv .c_date { color: #0000FF; } .r_bskprv .c_bsknr { color: #0000FF; } EekBoek-2.02.04/lib/EB/user/css/journaal.css0000444000076500007650000000410312165465617016156 0ustar jvjv/* $Id */ @import eekboek.css; .title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; margin-bottom: 0pt; } .subtitle { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; } .footer { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: normal; } body { font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #000000; table-width: 100%; } table { border: thin solid #000000; border-collapse: collapse; } table td { border-left: thin solid #000000; border-right: thin solid #000000; } table th { border-left: thin solid #000000; border-right: thin solid #000000; border-bottom: thin solid #000000; } th { vertical-align: top } tr { vertical-align: top } .r_head { color: #0000FF; border-top: thin solid #000000; } .r_chead { color: #0000FF; border-top: thin solid #000000; } .r_dhead { color: #0000FF; border-top: thin solid #000000; } .r_total { color: #FF0000; border-top: thin solid #000000; } .c_acct, .h_acct { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_date, .h_date { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_bsk, .h_bsk { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_desc, .h_desc { padding-left: 10pt; padding-right: 10pt; text-align: left; } .r_data .c_desc, .r_data .c_bsk { padding-left: 20pt; } .r_cdata .c_desc, .r_cdata .c_bsk { padding-left: 20pt; } .r_ddata .c_desc, .r_ddata .c_bsk { padding-left: 20pt; } .c_bsk, .h_bsk { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_rel, .h_rel { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_deb, .h_deb { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_crd, .h_crd { padding-left: 10pt; padding-right: 10pt; text-align: right; } EekBoek-2.02.04/lib/EB/user/css/openstaand.css0000444000076500007650000000341612165465617016505 0ustar jvjv/* $Id */ @import eekboek.css; .title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; margin-bottom: 0pt; } .subtitle { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; } .footer { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: normal; } body { font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #000000; table-width: 100%; } table { border: thin solid #000000; border-collapse: collapse; } table td { border-left: thin solid #000000; border-right: thin solid #000000; } table th { border-left: thin solid #000000; border-right: thin solid #000000; border-bottom: thin solid #000000; } th { vertical-align: top } tr { vertical-align: top } .r_trelatie { font-weight: bold; } .r_tdebcrd { border-top: thin solid #000000; color: #FF0000; border-bottom: thin solid #000000; } .c_date, .h_date { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_bsk, .h_bsk { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_desc, .h_desc { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_rel, .h_rel { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_amt, .h_amt { padding-left: 10pt; padding-right: 10pt; text-align: right; } .r_trelatie .c_desc { border-bottom: thin solid #000000; } .r_trelatie .c_bsk { border-bottom: thin solid #000000; } .r_trelatie .c_amt { border-bottom: thin solid #000000; } .r_prevdata .c_date { color: #0000FF; } .r_prevdata .c_bsk { color: #0000FF; } EekBoek-2.02.04/lib/EB/user/css/btwaangifte.css0000444000076500007650000000257212165465617016646 0ustar jvjv/* btwaangifte.css -- stylesheet for BTW aangifte report * Author : Johan Vromans * Created On : Sat Oct 8 14:45:33 2005 * Last Modified By: Johan Vromans * Last Modified On: Mon Jun 14 22:06:06 2010 * Update Count : 12 * Status : Unknown, Use with caution! */ @import eekboek.css; .title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; margin-bottom: 0pt; } .subtitle { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; } .footer { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: normal; } body { font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #000000; table-width: 100%; } table { border-collapse: collapse; } th { vertical-align: top } tr { vertical-align: top } .heading { font-size: 120%; font-weight: bold; } .subheading { font-weight: bold; } .c_num { padding-left: 10pt; padding-right: 6pt; } .c_desc { padding-right: 10pt; } .c_col1 { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_col2 { padding-left: 10pt; padding-right: 10pt; text-align: right; } .notice { font-size: 100%; font-weight: bold; color: #ff0000; } EekBoek-2.02.04/lib/EB/user/css/result.css0000444000076500007650000000002612165465617015661 0ustar jvjv@import "balres.css"; EekBoek-2.02.04/lib/EB/user/css/balans.css0000444000076500007650000000002612165465617015603 0ustar jvjv@import "balres.css"; EekBoek-2.02.04/lib/EB/user/css/balres.css0000444000076500007650000000313312165465617015615 0ustar jvjv/* $Id */ @import eekboek.css; .title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; margin-bottom: 0pt; } .subtitle { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; } .footer { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: normal; } body { font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #000000; table-width: 100%; } table { border: thin solid #000000; border-collapse: collapse; } table td { border-left: thin solid #000000; border-right: thin solid #000000; } table th { border-left: thin solid #000000; border-right: thin solid #000000; border-bottom: thin solid #000000; } th { vertical-align: top } tr { vertical-align: top } .r_h1 { color: #0000FF; border-top: thin solid #000000; } .r_h2 { color: #0000FF; } .r_v { color: #FF0000; border-top: thin solid #000000; } .r_grand { border-top: thin solid #000000; } .c_acct, .h_acct { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_desc, .h_desc { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_deb, .h_deb { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_crd, .h_crd { padding-left: 10pt; padding-right: 10pt; text-align: right; } .r_h2 .c_desc { padding-left: 20pt; } .r_t2 .c_desc { padding-left: 20pt; } .r_d2 .c_desc { padding-left: 30pt; } EekBoek-2.02.04/lib/EB/user/css/debrept.css0000444000076500007650000000002612165465617015770 0ustar jvjv@import "debcrd.css"; EekBoek-2.02.04/lib/EB/user/css/grootboek.css0000444000076500007650000000415412165465617016344 0ustar jvjv/* $Id */ @import eekboek.css; .title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-bottom: 0pt; } .subtitle { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; font-weight: bold; margin-top: 0pt; } .footer { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; font-weight: normal; } body { font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 150%; color: #000000; table-width: 100%; } table { border: thin solid #000000; border-collapse: collapse; } table td { border-left: thin solid #000000; border-right: thin solid #000000; } table th { border-left: thin solid #000000; border-right: thin solid #000000; border-bottom: thin solid #000000; } th { vertical-align: top } tr { vertical-align: top } .r_hd { color: #0000FF; border-top: thin solid #000000; } .r_tm, .r_mut { border-top: thin solid #000000; } .r_h1 { color: #0000FF; border-top: thin solid #000000; } .r_tg { color: #FF0000; border-top: thin solid #000000; } .c_acct, .h_acct { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_date, .h_date { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_bsk, .h_bsk { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_desc, .h_desc { padding-left: 10pt; padding-right: 10pt; text-align: left; } .r_d .c_desc { padding-left: 30pt; padding-right: 10pt; text-align: left; } .r_h2 .c_desc { padding-left: 20pt; padding-right: 10pt; text-align: left; } .r_t2 .c_desc { padding-left: 20pt; padding-right: 10pt; text-align: left; } .c_bsr, .h_bsr { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_rel, .h_rel { padding-left: 10pt; padding-right: 10pt; text-align: left; } .c_deb, .h_deb { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_crd, .h_crd { padding-left: 10pt; padding-right: 10pt; text-align: right; } EekBoek-2.02.04/lib/EB/user/css/eekboek.css0000444000076500007650000000114712165465617015755 0ustar jvjv/* eekboek.css -- common stylesheet for reports * Author : Johan Vromans * Created On : Sat Oct 8 14:45:33 2005 * Last Modified By: Johan Vromans * Last Modified On: Sat Mar 19 22:24:43 2011 * Update Count : 12 * Status : Unknown, Use with caution! */ body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; } th { vertical-align: top } tr { vertical-align: top } tr:nth-child(2n) { background-color: #ddd; } .i_row { } .i_cell { padding-left: 10pt; padding-right: 10pt; text-align: left; padding-top: 6px; padding-bottom: 6px; } EekBoek-2.02.04/lib/EB/user/css/proef.css0000444000076500007650000000032212165465617015455 0ustar jvjv@import "balres.css"; .c_sdeb, .h_sdeb { padding-left: 10pt; padding-right: 10pt; text-align: right; } .c_scrd, .h_scrd { padding-left: 10pt; padding-right: 10pt; text-align: right; } EekBoek-2.02.04/lib/EB/CPAN/0000755000076500007650000000000012165465617012610 5ustar jvjvEekBoek-2.02.04/lib/EB/CPAN/Term/0000755000076500007650000000000012165465617013517 5ustar jvjvEekBoek-2.02.04/lib/EB/CPAN/Term/ReadLine/0000755000076500007650000000000012165465617015202 5ustar jvjvEekBoek-2.02.04/lib/EB/CPAN/Term/ReadLine/readline.pm0000555000076500007650000040456412165465617017341 0ustar jvjv## ## Perl Readline -- The Quick Help ## (see the manual for complete info) ## ## Once this package is included (require'd), you can then call ## $text = &readline'readline($input); ## to get lines of input from the user. ## ## Normally, it reads ~/.inputrc when loaded... to suppress this, set ## $readline'rl_NoInitFromFile = 1; ## before requiring the package. ## ## Call rl_bind to add your own key bindings, as in ## &readline'rl_bind('C-L', 'possible-completions'); ## ## Call rl_set to set mode variables yourself, as in ## &readline'rl_set('TcshCompleteMode', 'On'); ## ## To change the input mode (emacs or vi) use ~/.inputrc or call ## &readline::rl_set('EditingMode', 'vi'); ## or &readline::rl_set('EditingMode', 'emacs'); ## ## Call rl_basic_commands to set your own command completion, as in ## &readline'rl_basic_commands('print', 'list', 'quit', 'run', 'status'); ## ## # Wrap the code below (initially Perl4, now partially Perl4) into a fake # Perl5 pseudo-module; mismatch of package and file name is intentional # to make is harder to abuse this (very fragile) code... package readline; my $autoload_broken = 1; # currently: defined does not work with a-l my $useioctl = 1; my $usestty = 1; my $max_include_depth = 10; # follow $include's in init files this deep BEGIN { # Some old systems have ioctl "unsupported" *ioctl = sub ($$$) { eval { ioctl $_[0], $_[1], $_[2] } }; } ## ## BLURB: ## A pretty full-function package similar to GNU's readline. ## Includes support for EUC-encoded Japanese text. ## ## Written by Jeffrey Friedl, Omron Corporation (jfriedl@omron.co.jp) ## ## Comments, corrections welcome. ## ## Thanks to the people at FSF for readline (and the code I referenced ## while writing this), and for Roland Schemers whose line_edit.pl I used ## as an early basis for this. ## $VERSION = $VERSION = '1.0303'; ## - Changes from Slaven Rezic (slaven@rezic.de): ## * reverted the usage of $ENV{EDITOR} to set startup mode ## only ~/.inputrc or an explicit call to rl_set should ## be used to set startup mode ## # 1011109.011 - Changes from Russ Southern (russ@dvns.com): ## * Added $rl_vi_replace_default_on_insert # 1000510.010 - Changes from Joe Petolino (petolino@eng.sun.com), requested ## by Ilya: ## ## * Make it compatible with perl 5.003. ## * Rename getc() to getc_with_pending(). ## * Change unshift(@Pending) to push(@Pending). ## ## 991109.009 - Changes from Joe Petolino (petolino@eng.sun.com): ## Added vi mode. Also added a way to set the keymap default ## action for multi-character keymaps, so that a 2-character ## sequence (e.g. A) can be treated as two one-character ## commands (, then A) if the sequence is not explicitly ## mapped. ## ## Changed subs: ## ## * preinit(): Initialize new keymaps and other data structures. ## Use $ENV{EDITOR} to set startup mode. ## ## * init(): Sets the global *KeyMap, since &F_ReReadInitFile ## may have changed the key map. ## ## * InitKeymap(): $KeyMap{default} is now optional - don't ## set it if $_[1] eq ''; ## ## * actually_do_binding(): Set $KeyMap{default} for '\*' key; ## warning if double-defined. ## ## * rl_bind(): Implement \* to set the keymap default. Also fix ## some existing regex bugs that I happened to notice. ## ## * readline(): No longer takes input from $pending before ## calling &$rl_getc(); instead, it calls getc_with_pending(), ## which takes input from the new array @Pending ## before calling &$rl_getc(). Sets the global ## *KeyMap after do_command(), since do_command() ## may change the keymap now. Does some cursor ## manipulation after do_command() when at the end ## of the line in vi command mode, to match the ## behavior of vi. ## ## * rl_getc(): Added a my declaration for $key, which was ## apparently omitted by the author. rl_getc() is ## no longer called directly; instead, getc_with_pending() calls ## it only after exhausting any requeued characters ## in @Pending. @Pending is used to implement the ## vi '.' command, as well as the emacs DoSearch ## functionality. ## ## * do_command(): Now defaults the command to 'F_Ding' if ## $KeyMap{default} is undefined. This is part ## of the new \* feature. ## ## * savestate()/getstate(): Now use an anonymous array instead ## of packing the fields into a string. ## ## * F_AcceptLine(): Code moved to new sub add_line_to_history(), ## so that it may be called by F_SaveLine() ## as well as by F_AcceptLine(). ## ## * F_QuotedInsert(): Calls getc_with_pending() instead of &$rl_getc(). ## ## * F_UnixWordRubout(): Fixed bug: changed 'my' declaration of ## global $rl_basic_word_break_characters to 'local'. ## ## * DoSearch(): Calls getc_with_pending() instead of &$rl_getc(). Ungets ## character onto @Pending instead of $pending. ## ## * F_EmacsEditingMode(): Resets global $Vi_mode; ## ## * F_ToggleEditingMode(): Deleted. We use F_ViInput() and ## F_EmacsEditingMode() instead. ## ## * F_PrefixMeta(): Calls getc_with_pending() instead of &$rl_getc(). ## ## * F_DigitArgument(): Calls getc_with_pending() instead of &$rl_getc(). ## ## * F_Ding(): Returns undef, for testing by vi commands. ## ## * F_Complete(): Returns true if a completion was done, false ## otherwise, so vi completion routines can test it. ## ## * complete_internal(): Returns true if a completion was done, ## false otherwise, so vi completion routines can ## test it. Does a little cursor massaging in vi ## mode, to match the behavior of ksh vi mode. ## ## Disclaimer: the original code dates from the perl 4 days, and ## isn't very pretty by today's standards (for example, ## extensive use of typeglobs and localized globals). In the ## interests of not breaking anything, I've tried to preserve ## the old code as much as possible, and I've avoided making ## major stylistic changes. Since I'm not a regular emacs user, ## I haven't done much testing to see that all the emacs-mode ## features still work. ## ## 940817.008 - Added $var_CompleteAddsuffix. ## Now recognizes window-change signals (at least on BSD). ## Various typos and bug fixes. ## Changes from Chris Arthur (csa@halcyon.com): ## Added a few new keybindings. ## Various typos and bug fixes. ## Support for use from a dumb terminal. ## Pretty-printing of filename-completion matches. ## ## 930306.007 - Added rl_start_default_at_beginning. ## Added optional message arg to &redisplay. ## Added explicit numeric argument var to functions that use it. ## Redid many commands to simplify. ## Added TransposeChars, UpcaseWord, CapitalizeWord, DownCaseWord. ## Redid key binding specs to better match GNU.. added ## undocumented "new-style" bindings.... can now bind ## arrow keys and other arbitrairly long key sequences. ## Added if/else/then to .inputrc. ## ## 930305.006 - optional "default" added (from mmuegel@cssmp.corp.mot.com). ## ## 930211.005 - fixed strange problem with eval while keybinding ## ## ## Ilya: ## ## Added support for ReadKey, ## ## Added customization variable $minlength ## to denote minimal lenth of a string to be put into history buffer. ## ## Added support for a bug in debugger: preinit cannot be a subroutine ?!!! ## (See immendiately below) ## ## Added support for WINCH hooks. The subroutine references should be put into ## @winchhooks. ## ## Added F_ToggleInsertMode, F_HistorySearchBackward, ## F_HistorySearchForward, PC keyboard bindings. ## 0.93: Updates to Operate, couple of keybindings added. ## $rl_completer_terminator_character, $rl_correct_sw added. ## Reload-init-file moved to C-x C-x. ## C-x ? and C-x * list/insert possible completions. $rl_getc = \&rl_getc; &preinit; &init; # # # # use strict 'vars'; # # # # # Separation into my and vars needs some thought... # # # # use vars qw(@KeyMap %KeyMap $rl_screen_width $rl_start_default_at_beginning # # # # $rl_completion_function $rl_basic_word_break_characters # # # # $rl_completer_word_break_characters $rl_special_prefixes # # # # $rl_readline_name @rl_History $rl_MaxHistorySize # # # # $rl_max_numeric_arg $rl_OperateCount # # # # $KillBuffer $dumb_term $stdin_not_tty $InsertMode # # # # $rl_NoInitFromFile); # # # # my ($InputLocMsg, $term_OUT, $term_IN); # # # # my ($winsz_t, $TIOCGWINSZ, $winsz, $rl_margin, $hooj, $force_redraw); # # # # my ($hook, %var_HorizontalScrollMode, %var_EditingMode, %var_OutputMeta); # # # # my ($var_HorizontalScrollMode, $var_EditingMode, $var_OutputMeta); # # # # my (%var_ConvertMeta, $var_ConvertMeta, %var_MarkModifiedLines, $var_MarkModifiedLines); # # # # my ($term_readkey, $inDOS); # # # # my (%var_PreferVisibleBell, $var_PreferVisibleBell); # # # # my (%var_TcshCompleteMode, $var_TcshCompleteMode); # # # # my (%var_CompleteAddsuffix, $var_CompleteAddsuffix); # # # # my ($minlength, @winchhooks); # # # # my ($BRKINT, $ECHO, $FIONREAD, $ICANON, $ICRNL, $IGNBRK, $IGNCR, $INLCR, # # # # $ISIG, $ISTRIP, $NCCS, $OPOST, $RAW, $TCGETS, $TCOON, $TCSETS, $TCXONC, # # # # $TERMIOS_CFLAG, $TERMIOS_IFLAG, $TERMIOS_LFLAG, $TERMIOS_NORMAL_IOFF, # # # # $TERMIOS_NORMAL_ION, $TERMIOS_NORMAL_LOFF, $TERMIOS_NORMAL_LON, # # # # $TERMIOS_NORMAL_OOFF, $TERMIOS_NORMAL_OON, $TERMIOS_OFLAG, # # # # $TERMIOS_READLINE_IOFF, $TERMIOS_READLINE_ION, $TERMIOS_READLINE_LOFF, # # # # $TERMIOS_READLINE_LON, $TERMIOS_READLINE_OOFF, $TERMIOS_READLINE_OON, # # # # $TERMIOS_VMIN, $TERMIOS_VTIME, $TIOCGETP, $TIOCGWINSZ, $TIOCSETP, # # # # $fion, $fionread_t, $mode, $sgttyb_t, # # # # $termios, $termios_t, $winsz, $winsz_t); # # # # my ($line, $initialized, $term_readkey); # # # # # Global variables added for vi mode (I'm leaving them all commented # # # # # out, like the declarations above, until SelfLoader issues # # # # # are resolved). # # # # # True when we're in one of the vi modes. # # # # my $Vi_mode; # # # # # Array refs: saves keystrokes for '.' command. Undefined when we're # # # # # not doing a '.'-able command. # # # # my $Dot_buf; # Working buffer # # # # my $Last_vi_command; # Gets $Dot_buf when a command is parsed # # # # # These hold state for vi 'u' and 'U'. # # # # my($Dot_state, $Vi_undo_state, $Vi_undo_all_state); # # # # # Refs to hashes used for cursor movement # # # # my($Vi_delete_patterns, $Vi_move_patterns, # # # # $Vi_change_patterns, $Vi_yank_patterns); # # # # # Array ref: holds parameters from the last [fFtT] command, for ';' # # # # # and ','. # # # # my $Last_findchar; # # # # # Globals for history search commands (/, ?, n, N) # # # # my $Vi_search_re; # Regular expression (compiled by qr{}) # # # # my $Vi_search_reverse; # True for '?' search, false for '/' ## ## What's Cool ## ---------------------------------------------------------------------- ## * hey, it's in perl. ## * Pretty full GNU readline like library... ## * support for ~/.inputrc ## * horizontal scrolling ## * command/file completion ## * rebinding ## * history (with search) ## * undo ## * numeric prefixes ## * supports multi-byte characters (at least for the Japanese I use). ## * Has a tcsh-like completion-function mode. ## call &readline'rl_set('tcsh-complete-mode', 'On') to turn on. ## ## ## What's not Cool ## ---------------------------------------------------------------------- ## Can you say HUGE? ## I can't spell, so comments riddled with misspellings. ## Written by someone that has never really used readline. ## History mechanism is slightly different than GNU... may get fixed ## someday, but I like it as it is now... ## Killbuffer not a ring.. just one level. ## Obviously not well tested yet. ## Written by someone that doesn't have a bell on his terminal, so ## proper readline use of the bell may not be here. ## ## ## Functions beginning with F_ are functions that are mapped to keys. ## Variables and functions beginning rl_ may be accessed/set/called/read ## from outside the package. Other things are internal. ## ## Some notable internal-only variables of global proportions: ## $prompt -- line prompt (passed from user) ## $line -- the line being input ## $D -- ``Dot'' -- index into $line of the cursor's location. ## $InsertMode -- usually true. False means overwrite mode. ## $InputLocMsg -- string for error messages, such as "[~/.inputrc line 2]" ## *emacs_keymap -- keymap for emacs-mode bindings: ## @emacs_keymap - bindings indexed by ASCII ordinal ## $emacs_keymap{'name'} = "emacs_keymap" ## $emacs_keymap{'default'} = "SelfInsert" (default binding) ## *vi_keymap -- keymap for vi input mode bindings ## *vicmd_keymap -- keymap for vi command mode bindings ## *vipos_keymap -- keymap for vi positioning command bindings ## *visearch_keymap -- keymap for vi search pattern input mode bindings ## *KeyMap -- current keymap in effect. ## $LastCommandKilledText -- needed so that subsequent kills accumulate ## $lastcommand -- name of command previously run ## $lastredisplay -- text placed upon screen during previous &redisplay ## $si -- ``screen index''; index into $line of leftmost char &redisplay'ed ## $force_redraw -- if set to true, causes &redisplay to be verbose. ## $AcceptLine -- when set, its value is returned from &readline. ## $ReturnEOF -- unless this also set, in which case undef is returned. ## @Pending -- characters to be used as input. ## @undo -- array holding all states of current line, for undoing. ## $KillBuffer -- top of kill ring (well, don't have a kill ring yet) ## @tcsh_complete_selections -- for tcsh mode, possible selections ## ## Some internal variables modified by &rl_set (see comment at &rl_set for ## info about how these set'able variables work) ## $var_EditingMode -- a keymap typeglob like *emacs_keymap or *vi_keymap ## $var_TcshCompleteMode -- if true, the completion function works like ## in tcsh. That is, the first time you try to complete something, ## the common prefix is completed for you. Subsequent completion tries ## (without other commands in between) cycles the command line through ## the various possibilities. If/when you get the one you want, just ## continue typing. ## Other $var_ things not supported yet. ## ## Some variables used internally, but may be accessed from outside... ## $VERSION -- just for good looks. ## $rl_readline_name = name of program -- for .initrc if/endif stuff. ## $rl_NoInitFromFile -- if defined when package is require'd, ~/.inputrc ## will not be read. ## @rl_History -- array of previous lines input ## $rl_HistoryIndex -- history pointer (for moving about history array) ## $rl_completion_function -- see "How Command Completion Works" (way) below. ## $rl_basic_word_break_characters -- string of characters that can cause ## a word break for forward-word, etc. ## $rl_start_default_at_beginning -- ## Normally, the user's cursor starts at the end of any default text ## passed to readline. If this variable is true, it starts at the ## beginning. ## $rl_completer_word_break_characters -- ## like $rl_basic_word_break_characters (and in fact defaults to it), ## but for the completion function. ## $rl_completer_terminator_character -- what to insert to separate ## a completed token from the rest. Reset at beginning of ## completion to ' ' so completion function can change it. ## $rl_special_prefixes -- characters that are part of this string as well ## as of $rl_completer_word_break_characters cause a word break for the ## completer function, but remain part of the word. An example: consider ## when the input might be perl code, and one wants to be able to ## complete on variable and function names, yet still have the '$', ## '&', '@',etc. part of the $text to be completed. Then set this var ## to '&@$%' and make sure each of these characters is in ## $rl_completer_word_break_characters as well.... ## $rl_MaxHistorySize -- maximum size that the history array may grow. ## $rl_screen_width -- width readline thinks it can use on the screen. ## $rl_correct_sw -- is substructed from the real width of the terminal ## $rl_margin -- scroll by moving to within this far from a margin. ## $rl_CLEAR -- what to output to clear the screen. ## $rl_max_numeric_arg -- maximum numeric arg allowed. ## $rl_vi_replace_default_on_insert ## Normally, the text you enter is added to any default text passed to ## readline. If this variable is true, default text will start out ## highlighted (if supported by your terminal) and text entered while the ## default is highlighted (during the _first_ insert mode only) will ## replace the entire default line. Once you have left insert mode (hit ## escape), everything works as normal. ## - This is similar to many GUI controls' behavior, which select the ## default text so that new text replaces the old. ## - Use with $rl_start_default_at_beginning for normal-looking behavior ## (though it works just fine without it). ## Notes/Bugs: ## - Control characters (like C-w) do not actually terminate this replace ## mode, for the same reason it does not work in emacs mode. ## - Spine-crawlingly scary subroutine redefinitions ## $rl_mark - start of the region ## $line_rl_mark - the line on which $rl_mark is active ## $_rl_japanese_mb - For character movement suppose Japanese (which?!) ## multi-byte encoding. (How to make a sane default?) ## sub get_window_size { my $sig = shift; local($., $@, $!, $^E, $?); # Preserve $! etc; the rest for hooks my ($num_cols,$num_rows); if (defined $term_readkey) { ($num_cols,$num_rows) = Term::ReadKey::GetTerminalSize($term_OUT); $rl_screen_width = $num_cols - $rl_correct_sw if defined($num_cols) && $num_cols; } elsif (defined $TIOCGWINSZ and &ioctl($term_IN,$TIOCGWINSZ,$winsz)) { ($num_rows,$num_cols) = unpack($winsz_t,$winsz); $rl_screen_width = $num_cols - $rl_correct_sw if defined($num_cols) && $num_cols; } $rl_margin = int($rl_screen_width/3); if (defined $sig) { $force_redraw = 1; &redisplay(); } for $hook (@winchhooks) { eval {&$hook()}; warn $@ if $@ and $^W; } local $^W = 0; # WINCH may be illegal... $SIG{'WINCH'} = "readline::get_window_size"; } # Fix: case-sensitivity of inputrc on/off keywords in # `set' commands. readline lib doesn't care about case. # changed case of keys 'On' and 'Off' to 'on' and 'off' # &rl_set changed so that it converts the value to # lower case before hash lookup. sub preinit { ## Set up the input and output handles $term_IN = \*STDIN unless defined $term_IN; $term_OUT = \*STDOUT unless defined $term_OUT; ## not yet supported... always on. $var_HorizontalScrollMode = 1; $var_HorizontalScrollMode{'On'} = 1; $var_HorizontalScrollMode{'Off'} = 0; $var_EditingMode{'emacs'} = *emacs_keymap; $var_EditingMode{'vi'} = *vi_keymap; $var_EditingMode{'vicmd'} = *vicmd_keymap; $var_EditingMode{'vipos'} = *vipos_keymap; $var_EditingMode{'visearch'} = *visearch_keymap; ## this is an addition. Very nice. $var_TcshCompleteMode = 0; $var_TcshCompleteMode{'On'} = 1; $var_TcshCompleteMode{'Off'} = 0; $var_CompleteAddsuffix = 1; $var_CompleteAddsuffix{'On'} = 1; $var_CompleteAddsuffix{'Off'} = 0; $var_DeleteSelection = $var_DeleteSelection{'On'} = 1; $var_DeleteSelection{'Off'} = 0; *rl_delete_selection = \$var_DeleteSelection; # Alias ## not yet supported... always on for ('InputMeta', 'OutputMeta') { ${"var_$_"} = 1; ${"var_$_"}{'Off'} = 0; ${"var_$_"}{'On'} = 1; } ## not yet supported... always off for ('ConvertMeta', 'MetaFlag', 'MarkModifiedLines', 'PreferVisibleBell', 'BlinkMatchingParen', 'VisibleStats', 'ShowAllIfAmbiguous', 'PrintCompletionsHorizontally', 'MarkDirectories', 'ExpandTilde', 'EnableKeypad', 'DisableCompletion', 'CompletionIgnoreCase') { ${"var_$_"} = 0; ${"var_$_"}{'Off'} = 0; ${"var_$_"}{'On'} = 1; } # To conform to interface $minlength = 1 unless defined $minlength; # WINCH hooks @winchhooks = (); $inDOS = $^O eq 'os2' || defined $ENV{OS2_SHELL} unless defined $inDOS; eval { require Term::ReadKey; $term_readkey++; } unless defined $ENV{PERL_RL_USE_TRK} and not $ENV{PERL_RL_USE_TRK}; unless ($term_readkey) { eval {require "ioctl.pl"}; ## try to get, don't die if not found. eval {require "sys/ioctl.ph"}; ## try to get, don't die if not found. eval {require "sgtty.ph"}; ## try to get, don't die if not found. if ($inDOS and !defined $TIOCGWINSZ) { $TIOCGWINSZ=0; $TIOCGETP=1; $TIOCSETP=2; $sgttyb_t="I5 C8"; $winsz_t=""; $RAW=0xf002; $ECHO=0x0008; } $TIOCGETP = &TIOCGETP if defined(&TIOCGETP); $TIOCSETP = &TIOCSETP if defined(&TIOCSETP); $TIOCGWINSZ = &TIOCGWINSZ if defined(&TIOCGWINSZ); $FIONREAD = &FIONREAD if defined(&FIONREAD); $TCGETS = &TCGETS if defined(&TCGETS); $TCSETS = &TCSETS if defined(&TCSETS); $TCXONC = &TCXONC if defined(&TCXONC); $TIOCGETP = 0x40067408 if !defined($TIOCGETP); $TIOCSETP = 0x80067409 if !defined($TIOCSETP); $TIOCGWINSZ = 0x40087468 if !defined($TIOCGWINSZ); $FIONREAD = 0x4004667f if !defined($FIONREAD); $TCGETS = 0x40245408 if !defined($TCGETS); $TCSETS = 0x80245409 if !defined($TCSETS); $TCXONC = 0x20005406 if !defined($TCXONC); ## TTY modes $ECHO = &ECHO if defined(&ECHO); $RAW = &RAW if defined(&RAW); $RAW = 040 if !defined($RAW); $ECHO = 010 if !defined($ECHO); #$CBREAK = 002 if !defined($CBREAK); $mode = $RAW; ## could choose CBREAK for testing.... $IGNBRK = 1 if !defined($IGNBRK); $BRKINT = 2 if !defined($BRKINT); $ISTRIP = 040 if !defined($ISTRIP); $INLCR = 0100 if !defined($INLCR); $IGNCR = 0200 if !defined($IGNCR); $ICRNL = 0400 if !defined($ICRNL); $OPOST = 1 if !defined($OPOST); $ISIG = 1 if !defined($ISIG); $ICANON = 2 if !defined($ICANON); $TCOON = 1 if !defined($TCOON); $TERMIOS_READLINE_ION = $BRKINT; $TERMIOS_READLINE_IOFF = $IGNBRK | $ISTRIP | $INLCR | $IGNCR | $ICRNL; $TERMIOS_READLINE_OON = 0; $TERMIOS_READLINE_OOFF = $OPOST; $TERMIOS_READLINE_LON = 0; $TERMIOS_READLINE_LOFF = $ISIG | $ICANON | $ECHO; $TERMIOS_NORMAL_ION = $BRKINT; $TERMIOS_NORMAL_IOFF = $IGNBRK; $TERMIOS_NORMAL_OON = $OPOST; $TERMIOS_NORMAL_OOFF = 0; $TERMIOS_NORMAL_LON = $ISIG | $ICANON | $ECHO; $TERMIOS_NORMAL_LOFF = 0; #$sgttyb_t = 'C4 S'; #$winsz_t = "S S S S"; # rows,cols, xpixel, ypixel $sgttyb_t = 'C4 S' if !defined($sgttyb_t); $winsz_t = "S S S S" if !defined($winsz_t); # rows,cols, xpixel, ypixel $winsz = pack($winsz_t,0,0,0,0); $fionread_t = "L"; $fion = pack($fionread_t, 0); $NCCS = 17; $termios_t = "LLLLc" . ("c" x $NCCS); # true for SunOS 4.1.3, at least... $termios = ''; ## just to shut up "perl -w". $termios = pack($termios, 0); # who cares, just make it long enough $TERMIOS_IFLAG = 0; $TERMIOS_OFLAG = 1; $TERMIOS_CFLAG = 2; $TERMIOS_LFLAG = 3; $TERMIOS_VMIN = 5 + 4; $TERMIOS_VTIME = 5 + 5; } $rl_delete_selection = 1; $rl_correct_sw = ($inDOS ? 1 : 0); $rl_scroll_nextline = 1 unless defined $rl_scroll_nextline; $rl_last_pos_can_backspace = ($inDOS ? 0 : 1) # Can backspace when the unless defined $rl_last_pos_can_backspace; # whole line is filled? $rl_start_default_at_beginning = 0; $rl_vi_replace_default_on_insert = 0; $rl_screen_width = 79; ## default $rl_completion_function = "rl_filename_list" unless defined($rl_completion_function); $rl_basic_word_break_characters = "\\\t\n' \"`\@\$><=;|&{("; $rl_completer_word_break_characters = $rl_basic_word_break_characters; $rl_special_prefixes = ''; ($rl_readline_name = $0) =~ s#.*[/\\]## if !defined($rl_readline_name); @rl_History=() if !(@rl_History); $rl_MaxHistorySize = 100 if !defined($rl_MaxHistorySize); $rl_max_numeric_arg = 200 if !defined($rl_max_numeric_arg); $rl_OperateCount = 0 if !defined($rl_OperateCount); $rl_term_set = \@Term::ReadLine::TermCap::rl_term_set; @$rl_term_set or $rl_term_set = ["","","",""]; $InsertMode=1; $KillBuffer=''; $line=''; $D = 0; $InputLocMsg = ' [initialization]'; &InitKeymap(*emacs_keymap, 'SelfInsert', 'emacs_keymap', ($inDOS ? () : ('C-@', 'SetMark') ), 'C-a', 'BeginningOfLine', 'C-b', 'BackwardChar', 'C-c', 'Interrupt', 'C-d', 'DeleteChar', 'C-e', 'EndOfLine', 'C-f', 'ForwardChar', 'C-g', 'Abort', 'M-C-g', 'Abort', 'C-h', 'BackwardDeleteChar', "TAB" , 'Complete', "C-j" , 'AcceptLine', 'C-k', 'KillLine', 'C-l', 'ClearScreen', "C-m" , 'AcceptLine', 'C-n', 'NextHistory', 'C-o', 'OperateAndGetNext', 'C-p', 'PreviousHistory', 'C-q', 'QuotedInsert', 'C-r', 'ReverseSearchHistory', 'C-s', 'ForwardSearchHistory', 'C-t', 'TransposeChars', 'C-u', 'UnixLineDiscard', ##'C-v', 'QuotedInsert', 'C-v', 'HistorySearchForward', 'C-w', 'UnixWordRubout', qq/"\cX\cX"/, 'ExchangePointAndMark', qq/"\cX\cR"/, 'ReReadInitFile', qq/"\cX?"/, 'PossibleCompletions', qq/"\cX*"/, 'InsertPossibleCompletions', qq/"\cX\cU"/, 'Undo', qq/"\cXu"/, 'Undo', qq/"\cX\cW"/, 'KillRegion', qq/"\cXw"/, 'CopyRegionAsKill', qq/"\cX\ec\\*"/, 'DoControlVersion', qq/"\cX\ec\0"/, 'SetMark', qq/"\cX\ec\@"/, 'SetMark', qq/"\cX\ec "/, 'SetMark', qq/"\cX\em\\*"/, 'DoMetaVersion', qq/"\cX\@c\\*"/, 'DoControlVersion', qq/"\cX\@c\0"/, 'SetMark', qq/"\cX\@c\@"/, 'SetMark', qq/"\cX\@c "/, 'SetMark', qq/"\cX\@m\\*"/, 'DoMetaVersion', 'C-y', 'Yank', 'C-z', 'Suspend', 'C-\\', 'Ding', 'C-^', 'Ding', 'C-_', 'Undo', 'DEL', ($inDOS ? 'BackwardKillWord' : # + 'BackwardDeleteChar' ), 'M-<', 'BeginningOfHistory', 'M->', 'EndOfHistory', 'M-DEL', 'BackwardKillWord', 'M-C-h', 'BackwardKillWord', 'M-C-j', 'ViInput', 'M-C-v', 'QuotedInsert', 'M-b', 'BackwardWord', 'M-c', 'CapitalizeWord', 'M-d', 'KillWord', 'M-f', 'ForwardWord', 'M-h', 'PrintHistory', 'M-l', 'DownCaseWord', 'M-r', 'RevertLine', 'M-t', 'TransposeWords', 'M-u', 'UpcaseWord', 'M-v', 'HistorySearchBackward', 'M-y', 'YankPop', "M-?", 'PossibleCompletions', "M-TAB", 'TabInsert', 'M-#', 'SaveLine', qq/"\e[A"/, 'previous-history', qq/"\e[B"/, 'next-history', qq/"\e[C"/, 'forward-char', qq/"\e[D"/, 'backward-char', qq/"\eOA"/, 'previous-history', qq/"\eOB"/, 'next-history', qq/"\eOC"/, 'forward-char', qq/"\eOD"/, 'backward-char', qq/"\eOy"/, 'HistorySearchBackward', # vt: PageUp qq/"\eOs"/, 'HistorySearchForward', # vt: PageDown qq/"\e[[A"/, 'previous-history', qq/"\e[[B"/, 'next-history', qq/"\e[[C"/, 'forward-char', qq/"\e[[D"/, 'backward-char', qq/"\e[2~"/, 'ToggleInsertMode', # X: # Mods: 1 + bitmask: 1 Shift, 2 Alt, 4 Control, 8 (sometimes) Meta qq/"\e[2;2~"/, 'YankClipboard', # + qq/"\e[3;2~"/, 'KillRegionClipboard', # + #qq/"\0\16"/, 'Undo', # + qq/"\eO5D"/, 'BackwardWord', # + qq/"\eO5C"/, 'ForwardWord', # + qq/"\e[5D"/, 'BackwardWord', # + qq/"\e[5C"/, 'ForwardWord', # + qq/"\eO5F"/, 'KillLine', # + qq/"\e[5F"/, 'KillLine', # + qq/"\e[4;5~"/, 'KillLine', # + qq/"\eO5s"/, 'EndOfHistory', # + qq/"\e[6;5~"/, 'EndOfHistory', # + qq/"\e[5H"/, 'BackwardKillLine', # + qq/"\eO5H"/, 'BackwardKillLine', # + qq/"\e[1;5~"/, 'BackwardKillLine', # + qq/"\eO5y"/, 'BeginningOfHistory', # + qq/"\e[5;5y"/, 'BeginningOfHistory', # + qq/"\e[2;5~"/, 'CopyRegionAsKillClipboard', # + qq/"\e[3;5~"/, 'KillWord', # + # XTerm mouse editing (f202/f203 not in mainstream yet): # Paste may be: move f200 STRING f201 # or f202 move f200 STRING f201 f203; # and Cut may be f202 move delete f203 qq/"\e[200~"/, 'BeginPasteGroup', # Pre-paste qq/"\e[201~"/, 'EndPasteGroup', # Post-paste qq/"\e[202~"/, 'BeginEditGroup', # Pre-edit qq/"\e[203~"/, 'EndEditGroup', # Post-edit # OSX xterm: # OSX xterm: home \eOH end \eOF delete \e[3~ help \e[28~ f13 \e[25~ # gray- \eOm gray+ \eOk gray-enter \eOM gray* \eOj gray/ \eOo gray= \eO # grayClear \e\e. qq/"\eOH"/, 'BeginningOfLine', # home qq/"\eOF"/, 'EndOfLine', # end # HP xterm #qq/"\e[A"/, 'PreviousHistory', # up arrow #qq/"\e[B"/, 'NextHistory', # down arrow #qq/"\e[C"/, 'ForwardChar', # right arrow #qq/"\e[D"/, 'BackwardChar', # left arrow qq/"\e[H"/, 'BeginningOfLine', # home #'C-k', 'KillLine', # clear display qq/"\e[5~"/, 'HistorySearchBackward', # prev qq/"\e[6~"/, 'HistorySearchForward', # next qq/"\e[\0"/, 'BeginningOfLine', # home # These contradict: ($^O =~ /^hp\W?ux/i ? ( qq/"\e[1~"/, 'HistorySearchForward', # find qq/"\e[3~"/, 'ToggleInsertMode', # insert char qq/"\e[4~"/, 'ToggleInsertMode', # select ) : ( # "Normal" xterm qq/"\e[1~"/, 'BeginningOfLine', # home qq/"\e[3~"/, 'DeleteChar', # delete qq/"\e[4~"/, 'EndOfLine', # end )), # hpterm (($ENV{'TERM'} and $ENV{'TERM'} eq 'hpterm') ? ( qq/"\eA"/, 'PreviousHistory', # up arrow qq/"\eB"/, 'NextHistory', # down arrow qq/"\eC"/, 'ForwardChar', # right arrow qq/"\eD"/, 'BackwardChar', # left arrow qq/"\eS"/, 'BeginningOfHistory', # shift up arrow qq/"\eT"/, 'EndOfHistory', # shift down arrow qq/"\e&r1R"/, 'EndOfLine', # shift right arrow qq/"\e&r1L"/, 'BeginningOfLine', # shift left arrow qq/"\eJ"/, 'ClearScreen', # clear display qq/"\eM"/, 'UnixLineDiscard', # delete line qq/"\eK"/, 'KillLine', # clear line qq/"\eG\eK"/, 'BackwardKillLine', # shift clear line qq/"\eP"/, 'DeleteChar', # delete char qq/"\eL"/, 'Yank', # insert line qq/"\eQ"/, 'ToggleInsertMode', # insert char qq/"\eV"/, 'HistorySearchBackward',# prev qq/"\eU"/, 'HistorySearchForward',# next qq/"\eh"/, 'BeginningOfLine', # home qq/"\eF"/, 'EndOfLine', # shift home qq/"\ei"/, 'Suspend', # shift tab ) : () ), ($inDOS ? ( qq/"\0\2"/, 'SetMark', # 2: + qq/"\0\3"/, 'SetMark', # 3: +<@> qq/"\0\4"/, 'YankClipboard', # 4: + qq/"\0\5"/, 'KillRegionClipboard', # 5: + qq/"\0\16"/, 'Undo', # 14: + # qq/"\0\23"/, 'RevertLine', # 19: + # qq/"\0\24"/, 'TransposeWords', # 20: + # qq/"\0\25"/, 'YankPop', # 21: + # qq/"\0\26"/, 'UpcaseWord', # 22: + # qq/"\0\31"/, 'ReverseSearchHistory', # 25: +

# qq/"\0\40"/, 'KillWord', # 32: + # qq/"\0\41"/, 'ForwardWord', # 33: + # qq/"\0\46"/, 'DownCaseWord', # 38: + #qq/"\0\51"/, 'TildeExpand', # 41: +<\'> # qq/"\0\56"/, 'CapitalizeWord', # 46: + # qq/"\0\60"/, 'BackwardWord', # 48: + # qq/"\0\61"/, 'ForwardSearchHistory', # 49: + #qq/"\0\64"/, 'YankLastArg', # 52: +<.> qq/"\0\65"/, 'PossibleCompletions', # 53: + qq/"\0\107"/, 'BeginningOfLine', # 71: qq/"\0\110"/, 'previous-history', # 72: qq/"\0\111"/, 'HistorySearchBackward', # 73: qq/"\0\113"/, 'backward-char', # 75: qq/"\0\115"/, 'forward-char', # 77: qq/"\0\117"/, 'EndOfLine', # 79: qq/"\0\120"/, 'next-history', # 80: qq/"\0\121"/, 'HistorySearchForward', # 81: qq/"\0\122"/, 'ToggleInsertMode', # 82: qq/"\0\123"/, 'DeleteChar', # 83: qq/"\0\163"/, 'BackwardWord', # 115: + qq/"\0\164"/, 'ForwardWord', # 116: + qq/"\0\165"/, 'KillLine', # 117: + qq/"\0\166"/, 'EndOfHistory', # 118: + qq/"\0\167"/, 'BackwardKillLine', # 119: + qq/"\0\204"/, 'BeginningOfHistory', # 132: + qq/"\0\x92"/, 'CopyRegionAsKillClipboard', # 146: + qq/"\0\223"/, 'KillWord', # 147: + qq/"\0#"/, 'PrintHistory', # Alt-H ) : ( 'C-@', 'Ding') ) ); *KeyMap = *emacs_keymap; my @add_bindings = (); foreach ('-', '0' .. '9') { push(@add_bindings, "M-$_", 'DigitArgument'); } foreach ("A" .. "Z") { next if # defined($KeyMap[27]) && defined (%{"$KeyMap{name}_27"}) && defined $ {"$KeyMap{name}_27"}[ord $_]; push(@add_bindings, "M-$_", 'DoLowercaseVersion'); } if ($inDOS) { # Default translation of Alt-char $ {"$KeyMap{name}_0"}{'Esc'} = *{"$KeyMap{name}_27"}; $ {"$KeyMap{name}_0"}{'default'} = 'F_DoEscVersion'; } &rl_bind(@add_bindings); # Vi input mode. &InitKeymap(*vi_keymap, 'SelfInsert', 'vi_keymap', "\e", 'ViEndInsert', 'C-c', 'Interrupt', 'C-h', 'BackwardDeleteChar', 'C-w', 'UnixWordRubout', 'C-u', 'UnixLineDiscard', 'C-v', 'QuotedInsert', 'DEL', 'BackwardDeleteChar', "\n", 'ViAcceptInsert', "\r", 'ViAcceptInsert', ); # Vi command mode. &InitKeymap(*vicmd_keymap, 'Ding', 'vicmd_keymap', 'C-c', 'Interrupt', 'C-e', 'EmacsEditingMode', 'C-h', 'ViMoveCursor', 'C-l', 'ClearScreen', "\n", 'ViAcceptLine', "\r", 'ViAcceptLine', ' ', 'ViMoveCursor', '#', 'SaveLine', '$', 'ViMoveCursor', '%', 'ViMoveCursor', '*', 'ViInsertPossibleCompletions', '+', 'NextHistory', ',', 'ViMoveCursor', '-', 'PreviousHistory', '.', 'ViRepeatLastCommand', '/', 'ViSearch', '0', 'ViMoveCursor', '1', 'ViDigit', '2', 'ViDigit', '3', 'ViDigit', '4', 'ViDigit', '5', 'ViDigit', '6', 'ViDigit', '7', 'ViDigit', '8', 'ViDigit', '9', 'ViDigit', ';', 'ViMoveCursor', '=', 'ViPossibleCompletions', '?', 'ViSearch', 'A', 'ViAppendLine', 'B', 'ViMoveCursor', 'C', 'ViChangeLine', 'D', 'ViDeleteLine', 'E', 'ViMoveCursor', 'F', 'ViMoveCursor', 'G', 'ViHistoryLine', 'H', 'PrintHistory', 'I', 'ViBeginInput', 'N', 'ViRepeatSearch', 'P', 'ViPutBefore', 'R', 'ViReplaceMode', 'S', 'ViChangeEntireLine', 'T', 'ViMoveCursor', 'U', 'ViUndoAll', 'W', 'ViMoveCursor', 'X', 'ViBackwardDeleteChar', 'Y', 'ViYankLine', '\\', 'ViComplete', '^', 'ViMoveCursor', 'a', 'ViAppend', 'b', 'ViMoveCursor', 'c', 'ViChange', 'd', 'ViDelete', 'e', 'ViMoveCursor', 'f', 'ViMoveCursorFind', 'h', 'ViMoveCursor', 'i', 'ViInput', 'j', 'NextHistory', 'k', 'PreviousHistory', 'l', 'ViMoveCursor', 'n', 'ViRepeatSearch', 'p', 'ViPut', 'r', 'ViReplaceChar', 's', 'ViChangeChar', 't', 'ViMoveCursorTo', 'u', 'ViUndo', 'w', 'ViMoveCursor', 'x', 'ViDeleteChar', 'y', 'ViYank', '|', 'ViMoveCursor', '~', 'ViToggleCase', (($inDOS and (not $ENV{'TERM'} or $ENV{'TERM'} !~ /^(vt|xterm)/i)) ? ( qq/"\0\110"/, 'PreviousHistory', # 72: qq/"\0\120"/, 'NextHistory', # 80: qq/"\0\113"/, 'BackwardChar', # 75: qq/"\0\115"/, 'ForwardChar', # 77: "\e", 'ViCommandMode', ) : (('M-C-j','EmacsEditingMode'), # Conflicts with \e otherwise (($ENV{'TERM'} and $ENV{'TERM'} eq 'hpterm') ? ( qq/"\eA"/, 'PreviousHistory', # up arrow qq/"\eB"/, 'NextHistory', # down arrow qq/"\eC"/, 'ForwardChar', # right arrow qq/"\eD"/, 'BackwardChar', # left arrow qq/"\e\\*"/, 'ViAfterEsc', ) : # Default ( qq/"\e[A"/, 'PreviousHistory', # up arrow qq/"\e[B"/, 'NextHistory', # down arrow qq/"\e[C"/, 'ForwardChar', # right arrow qq/"\e[D"/, 'BackwardChar', # left arrow qq/"\e\\*"/, 'ViAfterEsc', qq/"\e[\\*"/, 'ViAfterEsc', ) ))), ); # Vi positioning commands (suffixed to vi commands like 'd'). &InitKeymap(*vipos_keymap, 'ViNonPosition', 'vipos_keymap', '^', 'ViFirstWord', '0', 'BeginningOfLine', '1', 'ViDigit', '2', 'ViDigit', '3', 'ViDigit', '4', 'ViDigit', '5', 'ViDigit', '6', 'ViDigit', '7', 'ViDigit', '8', 'ViDigit', '9', 'ViDigit', '$', 'EndOfLine', 'h', 'BackwardChar', 'l', 'ForwardChar', ' ', 'ForwardChar', 'C-h', 'BackwardChar', 'f', 'ViForwardFindChar', 'F', 'ViBackwardFindChar', 't', 'ViForwardToChar', 'T', 'ViBackwardToChar', ';', 'ViRepeatFindChar', ',', 'ViInverseRepeatFindChar', '%', 'ViFindMatchingParens', '|', 'ViMoveToColumn', # Arrow keys ($inDOS ? ( qq/"\0\115"/, 'ForwardChar', # 77: qq/"\0\113"/, 'BackwardChar', # 75: "\e", 'ViPositionEsc', ) : ($ENV{'TERM'} and $ENV{'TERM'} eq 'hpterm') ? ( qq/"\eC"/, 'ForwardChar', # right arrow qq/"\eD"/, 'BackwardChar', # left arrow qq/"\e\\*"/, 'ViPositionEsc', ) : # Default ( qq/"\e[C"/, 'ForwardChar', # right arrow qq/"\e[D"/, 'BackwardChar', # left arrow qq/"\e\\*"/, 'ViPositionEsc', qq/"\e[\\*"/, 'ViPositionEsc', ) ), ); # Vi search string input mode for '/' and '?'. &InitKeymap(*visearch_keymap, 'SelfInsert', 'visearch_keymap', "\e", 'Ding', 'C-c', 'Interrupt', 'C-h', 'ViSearchBackwardDeleteChar', 'C-w', 'UnixWordRubout', 'C-u', 'UnixLineDiscard', 'C-v', 'QuotedInsert', 'DEL', 'ViSearchBackwardDeleteChar', "\n", 'ViEndSearch', "\r", 'ViEndSearch', ); # These constant hashes hold the arguments to &forward_scan() or # &backward_scan() for vi positioning commands, which all # behave a little differently for delete, move, change, and yank. # # Note: I originally coded these as qr{}, but changed them to q{} for # compatibility with older perls at the expense of some performance. # # Note: Some of the more obscure key combinations behave slightly # differently in different vi implementation. This module matches # the behavior of /usr/ucb/vi, which is different from the # behavior of vim, nvi, and the ksh command line. One example is # the command '2de', when applied to the string ('^' represents the # cursor, not a character of the string): # # ^5.6 7...88888888 # # With /usr/ucb/vi and with this module, the result is # # ^...88888888 # # but with the other three vi implementations, the result is # # ^ 7...88888888 $Vi_delete_patterns = { ord('w') => q{(?:\w+|[^\w\s]+|)\s*}, ord('W') => q{\S*\s*}, ord('b') => q{\w+\s*|[^\w\s]+\s*|^\s+}, ord('B') => q{\S+\s*|^\s+}, ord('e') => q{.\s*\w+|.\s*[^\w\s]+|.\s*$}, ord('E') => q{.\s*\S+|.\s*$}, }; $Vi_move_patterns = { ord('w') => q{(?:\w+|[^\w\s]+|)\s*}, ord('W') => q{\S*\s*}, ord('b') => q{\w+\s*|[^\w\s]+\s*|^\s+}, ord('B') => q{\S+\s*|^\s+}, ord('e') => q{.\s*\w*(?=\w)|.\s*[^\w\s]*(?=[^\w\s])|.?\s*(?=\s$)}, ord('E') => q{.\s*\S*(?=\S)|.?\s*(?=\s$)}, }; $Vi_change_patterns = { ord('w') => q{\w+|[^\w\s]+|\s}, ord('W') => q{\S+|\s}, ord('b') => q{\w+\s*|[^\w\s]+\s*|^\s+}, ord('B') => q{\S+\s*|^\s+}, ord('e') => q{.\s*\w+|.\s*[^\w\s]+|.\s*$}, ord('E') => q{.\s*\S+|.\s*$}, }; $Vi_yank_patterns = { ord('w') => q{(?:\w+|[^\w\s]+|)\s*}, ord('W') => q{\S*\s*}, ord('b') => q{\w+\s*|[^\w\s]+\s*|^\s+}, ord('B') => q{\S+\s*|^\s+}, ord('e') => q{.\s*\w*(?=\w)|.\s*[^\w\s]*(?=[^\w\s])|.?\s*(?=\s$)}, ord('E') => q{.\s*\S*(?=\S)|.?\s*(?=\s$)}, }; my $default_mode = 'emacs'; *KeyMap = $var_EditingMode = $var_EditingMode{$default_mode}; ## my $name; ## for $name ( keys %{'readline::'} ) { ## # Create aliases accessible via tied interface ## *{"rl_$1"} = \$ {"var_$1"} if $name =~ /$var_(.*)/; ## } 1; # Returning a glob causes a bug in db5.001m } sub init { if ($ENV{'TERM'} and ($ENV{'TERM'} eq 'emacs' || $ENV{'TERM'} eq 'dumb')) { $dumb_term = 1; } elsif (! -c $term_IN && $term_IN eq \*STDIN) { # Believe if it is given $stdin_not_tty = 1; } else { &get_window_size; &F_ReReadInitFile if !defined($rl_NoInitFromFile); $InputLocMsg = ''; *KeyMap = $var_EditingMode; } $initialized = 1; } ## ## InitKeymap(*keymap, 'default', 'name', bindings.....) ## sub InitKeymap { local(*KeyMap) = shift(@_); my $default = shift(@_); my $name = $KeyMap{'name'} = shift(@_); # 'default' is now optional - if '', &do_command() defaults it to # 'F_Ding'. Meta-maps now don't set a default - this lets # us detect multiple '\*' default declarations. JP if ($default ne '') { my $func = $KeyMap{'default'} = "F_$default"; ### Temporarily disabled die qq/Bad default function [$func] for keymap "$name"/ if !$autoload_broken and !defined(&$func); } &rl_bind if @_ > 0; ## The rest of @_ gets passed silently. } ## ## Accepts an array as pairs ($keyspec, $function, [$keyspec, $function]...). ## and maps the associated bindings to the current KeyMap. ## ## keyspec should be the name of key sequence in one of two forms: ## ## Old (GNU readline documented) form: ## M-x to indicate Meta-x ## C-x to indicate Ctrl-x ## M-C-x to indicate Meta-Ctrl-x ## x simple char x ## where 'x' above can be a single character, or the special: ## special means ## -------- ----- ## space space ( ) ## spc space ( ) ## tab tab (\t) ## del delete (0x7f) ## rubout delete (0x7f) ## newline newline (\n) ## lfd newline (\n) ## ret return (\r) ## return return (\r) ## escape escape (\e) ## esc escape (\e) ## ## New form: ## "chars" (note the required double-quotes) ## where each char in the list represents a character in the sequence, except ## for the special sequences: ## \\C-x Ctrl-x ## \\M-x Meta-x ## \\M-C-x Meta-Ctrl-x ## \\e escape. ## \\x x (if not one of the above) ## ## ## FUNCTION should be in the form 'BeginningOfLine' or 'beginning-of-line'. ## It is an error for the function to not be known.... ## ## As an example, the following lines in .inputrc will bind one's xterm ## arrow keys: ## "\e[[A": previous-history ## "\e[[B": next-history ## "\e[[C": forward-char ## "\e[[D": backward-char ## sub filler_Pending ($) { my $keys = shift; sub { my $c = shift; push @Pending, map chr, @$keys; return if not @$keys or $c == 1 or not defined(my $in = &getc_with_pending); # provide the numeric argument local(*KeyMap) = $var_EditingMode; $doingNumArg = 1; # Allow NumArg inside NumArg &do_command(*KeyMap, $c, ord $in); return; } } sub _unescape ($) { my($key, @keys) = shift; ## New-style bindings are enclosed in double-quotes. ## Characters are taken verbatim except the special cases: ## \C-x Control x (for any x) ## \M-x Meta x (for any x) ## \e Escape ## \* Set the keymap default (JP: added this) ## (must be the last character of the sequence) ## ## \x x (unless it fits the above pattern) ## ## Look for special case of "\C-\M-x", which should be treated ## like "\M-\C-x". while (length($key) > 0) { # JP: fixed regex bugs below: changed all 's#' to 's#^' if ($key =~ s#^\\C-\\M-(.)##) { push(@keys, ord("\e"), &ctrl(ord($1))); } elsif ($key =~ s#^\\(M-|e)##) { push(@keys, ord("\e")); } elsif ($key =~ s#^\\C-(.)##) { push(@keys, &ctrl(ord($1))); } elsif ($key =~ s#^\\x([0-9a-fA-F]{2})##) { push(@keys, eval('0x'.$1)); } elsif ($key =~ s#^\\([0-7]{3})##) { push(@keys, eval('0'.$1)); } elsif ($key =~ s#^\\\*$##) { # JP: added push(@keys, 'default'); } elsif ($key =~ s#^\\([afnrtv])##) { push(@keys, ord(eval(qq("\\$1")))); } elsif ($key =~ s#^\\d##) { push(@keys, 4); # C-d } elsif ($key =~ s#^\\b##) { push(@keys, 0x7f); # Backspace } elsif ($key =~ s#^\\(.)##) { push(@keys, ord($1)); } else { push(@keys, ord($key)); substr($key,0,1) = ''; } } @keys } sub RL_func ($) { my $name_or_macro = shift; if ($name_or_macro =~ /^"((?:\\.|[^\\\"])*)"|^'((?:\\.|[^\\\'])*)'/s) { filler_Pending [_unescape "$+"]; } else { "F_$name_or_macro"; } } sub actually_do_binding { ## ## actually_do_binding($function1, \@sequence1, ...) ## ## Actually inserts the binding for @sequence to $function into the ## current map. @sequence is an array of character ordinals. ## ## If @sequence is more than one element long, all but the last will ## cause meta maps to be created. ## ## $Function will have an implicit "F_" prepended to it. ## while (@_) { my $func = shift; my ($key, @keys) = @{shift()}; $key += 0; local(*KeyMap) = *KeyMap; my $map; while (@keys) { if (defined($KeyMap[$key]) && ($KeyMap[$key] ne 'F_PrefixMeta')) { warn "Warning$InputLocMsg: ". "Re-binding char #$key from [$KeyMap[$key]] to meta for [@keys] => $func.\n" if $^W; } $KeyMap[$key] = 'F_PrefixMeta'; $map = "$KeyMap{'name'}_$key"; InitKeymap(*$map, '', $map) if !(%$map); *KeyMap = *$map; $key = shift @keys; #&actually_do_binding($func, \@keys); } my $name = $KeyMap{'name'}; if ($key eq 'default') { # JP: added warn "Warning$InputLocMsg: ". " changing default action to $func in $name key map\n" if $^W && defined $KeyMap{'default'}; $KeyMap{'default'} = RL_func $func; } else { if (defined($KeyMap[$key]) && $KeyMap[$key] eq 'F_PrefixMeta' && $func ne 'PrefixMeta') { warn "Warning$InputLocMsg: ". " Re-binding char #$key to non-meta ($func) in $name key map\n" if $^W; } $KeyMap[$key] = RL_func $func; } } } sub rl_bind { my (@keys, $key, $func, $ord, @arr); while (defined($key = shift(@_)) && defined($func = shift(@_))) { ## ## Change the function name from something like ## backward-kill-line ## to ## BackwardKillLine ## if not already there. ## unless ($func =~ /^[\"\']/) { $func = "\u$func"; $func =~ s/-(.)/\u$1/g; # Temporary disabled if (!$autoload_broken and !defined($ {'readline::'}{"F_$func"})) { warn "Warning$InputLocMsg: bad bind function [$func]\n" if $^W; next; } } ## print "sequence [$key] func [$func]\n"; ##DEBUG @keys = (); ## See if it's a new-style binding. if ($key =~ m/"((?:\\.|[^\\])*)"/s) { @keys = _unescape "$1"; } else { ## ol-dstyle binding... only one key (or Meta+key) my ($isctrl, $orig) = (0, $key); $isctrl = $key =~ s/\b(C|Control|CTRL)-//i; push(@keys, ord("\e")) if $key =~ s/\b(M|Meta)-//i; ## is meta? ## Isolate key part. This matches GNU's implementation. ## If the key is '-', be careful not to delete it! $key =~ s/.*-(.)/$1/; if ($key =~ /^(space|spc)$/i) { $key = ' '; } elsif ($key =~ /^(rubout|del)$/i) { $key = "\x7f"; } elsif ($key =~ /^tab$/i) { $key = "\t"; } elsif ($key =~ /^(return|ret)$/i) { $key = "\r"; } elsif ($key =~ /^(newline|lfd)$/i) { $key = "\n"; } elsif ($key =~ /^(escape|esc)$/i) { $key = "\e"; } elsif (length($key) > 1) { warn "Warning$InputLocMsg: strange binding [$orig]\n" if $^W; } $key = ord($key); $key = &ctrl($key) if $isctrl; push(@keys, $key); } # ## Now do the mapping of the sequence represented in @keys # # print "&actually_do_binding($func, @keys)\n"; ##DEBUG push @arr, $func, [@keys]; #&actually_do_binding($func, \@keys); } &actually_do_binding(@arr); } sub read_an_init_file { my $file = shift; my $include_depth = shift; local *RC; $file =~ s/^~([\\\/])/$ENV{HOME}$1/ if not -f $file and exists $ENV{HOME}; return unless open RC, "< $file"; my (@action) = ('exec'); ## exec, skip, ignore (until appropriate endif) my (@level) = (); ## if, else local $/ = "\n"; while () { s/^\s+//; next if m/^\s*(#|$)/; $InputLocMsg = " [$file line $.]"; if (/^\$if\s+(.*)/) { my($test) = $1; push(@level, 'if'); if ($action[$#action] ne 'exec') { ## We're supposed to be skipping or ignoring this level, ## so for subsequent levels we really ignore completely. push(@action, 'ignore'); } else { ## We're executing this IF... do the test. ## The test is either "term=xxxx", or just a string that ## we compare to $rl_readline_name; if ($test =~ /term=([a-z0-9]+)/) { $test = ($ENV{'TERM'} && $1 eq $ENV{'TERM'}); } else { $test = $test =~ /^(perl|$rl_readline_name)\s*$/i; } push(@action, $test ? 'exec' : 'skip'); } next; } elsif (/^\$endif\b/) { die qq/\rWarning$InputLocMsg: unmatched endif\n/ if @level == 0; pop(@level); pop(@action); next; } elsif (/^\$else\b/) { die qq/\rWarning$InputLocMsg: unmatched else\n/ if @level == 0 || $level[$#level] ne 'if'; $level[$#level] = 'else'; ## an IF turns into an ELSE if ($action[$#action] eq 'skip') { $action[$#action] = 'exec'; ## if were SKIPing, now EXEC } else { $action[$#action] = 'ignore'; ## otherwise, just IGNORE. } next; } elsif (/^\$include\s+(\S+)/) { if ($include_depth > $max_include_depth) { warn "Deep recursion in \$include directives in $file.\n"; } else { read_an_init_file($1, $include_depth + 1); } } elsif ($action[$#action] ne 'exec') { ## skipping this one.... # readline permits trailing comments in inputrc # this seems to solve the warnings caused by trailing comments in the # default /etc/inputrc on Mandrake Linux boxes. } elsif (m/\s*set\s+(\S+)\s+(\S*)/) { # Allow trailing comment &rl_set($1, $2, $file); } elsif (m/^\s*(\S+):\s+("(?:\\.|[^\\\"])*"|'(\\.|[^\\\'])*')/) { # Allow trailing comment &rl_bind($1, $2); } elsif (m/^\s*(\S+|"[^\"]+"):\s+(\S+)/) { # Allow trailing comment &rl_bind($1, $2); } else { chomp; warn "\rWarning$InputLocMsg: Bad line [$_]\n" if $^W; } } close(RC); } sub F_ReReadInitFile { my ($file) = $ENV{'TRP_INPUTRC'}; $file = $ENV{'INPUTRC'} unless defined $file; unless (defined $file) { return unless defined $ENV{'HOME'}; $file = "$ENV{'HOME'}/.inputrc"; } read_an_init_file($file, 0); } sub get_ornaments_selected { return if @$rl_term_set >= 6; local $^W=0; my $Orig = $Term::ReadLine::Perl::term->ornaments(); eval { # Term::ReadLine does not expose its $terminal, so make another require Term::Cap; my $terminal = Tgetent Term::Cap ({OSPEED=>9600}); # and be sure the terminal supports highlighting $terminal->Trequire('mr'); }; if (!$@ and $Orig ne ',,,'){ my @set = @$rl_term_set; $Term::ReadLine::Perl::term->ornaments (join(',', (split(/,/, $Orig))[0,1]) . ',mr,me') ; @set[4,5] = @$rl_term_set[2,3]; $Term::ReadLine::Perl::term->ornaments($Orig); @$rl_term_set = @set; } else { @$rl_term_set[4,5] = @$rl_term_set[2,3]; } } sub readline_dumb { local $\ = ''; print $term_OUT $prompt; local $/ = "\n"; return undef if !defined($line = $Term::ReadLine::Perl::term->get_line); chomp($line); $| = $oldbar; select $old; return $line; } ## ## This is it. Called as &readline'readline($prompt, $default), ## (DEFAULT can be omitted) the next input line is returned (undef on EOF). ## sub readline { $Term::ReadLine::Perl::term->register_Tk if not $Term::ReadLine::registered and $Term::ReadLine::toloop and defined &Tk::DoOneEvent; if ($stdin_not_tty) { local $/ = "\n"; return undef if !defined($line = <$term_IN>); chomp($line); return $line; } $old = select $term_OUT; $oldbar = $|; local($|) = 1; local($input); ## prompt should be given to us.... $prompt = defined($_[0]) ? $_[0] : 'INPUT> '; # Try to move cursor to the beginning of the next line if this line # contains anything. # On DOSish 80-wide console # perl -we "print 1 x shift, qq(\b2\r3); sleep 2" 79 # prints 3 on the same line, # perl -we "print 1 x shift, qq(\b2\r3); sleep 2" 80 # on the next; $rl_screen_width is 79. # on XTerm one needs to increase the number by 1. print $term_OUT ' ' x ($rl_screen_width - !$rl_last_pos_can_backspace) . "\b \r" if $rl_scroll_nextline; if ($dumb_term) { return readline_dumb; } # test if we resume an 'Operate' command if ($rl_OperateCount > 0 && (!defined $_[1] || $_[1] eq '')) { ## it's from a valid previous 'Operate' command and ## user didn't give a default line ## we leave $rl_HistoryIndex untouched $line = $rl_History[$rl_HistoryIndex]; } else { ## set history pointer at the end of history $rl_HistoryIndex = $#rl_History + 1; $rl_OperateCount = 0; $line = defined $_[1] ? $_[1] : ''; } $rl_OperateCount-- if $rl_OperateCount > 0; $line_for_revert = $line; # I don't think we need to do this, actually... # while (&ioctl(STDIN,$FIONREAD,$fion)) # { # local($n_chars_available) = unpack ($fionread_t, $fion); # ## print "n_chars = $n_chars_available\n"; # last if $n_chars_available == 0; # $line .= getc_with_pending; # should we prepend if $rl_start_default_at_beginning? # } $D = $rl_start_default_at_beginning ? 0 : length($line); ## set dot. $LastCommandKilledText = 0; ## heck, was no last command. $lastcommand = ''; ## Well, there you go. $line_rl_mark = -1; ## ## some stuff for &redisplay. ## $lastredisplay = ''; ## Was no last redisplay for this time. $lastlen = length($lastredisplay); $lastpromptlen = 0; $lastdelta = 0; ## Cursor was nowhere $si = 0; ## Want line to start left-justified $force_redraw = 1; ## Want to display with brute force. if (!eval {SetTTY()}) { ## Put into raw mode. warn $@ if $@; $dumb_term = 1; return readline_dumb; } *KeyMap = $var_EditingMode; undef($AcceptLine); ## When set, will return its value. undef($ReturnEOF); ## ...unless this on, then return undef. @Pending = (); ## Contains characters to use as input. @undo = (); ## Undo history starts empty for each line. @undoGroupS = (); ## Undo groups start empty for each line. undef $memorizedArg; ## No digitArgument memorized undef $memorizedPos; ## No position memorized undef $Vi_undo_state; undef $Vi_undo_all_state; # We need to do some additional initialization for vi mode. # RS: bug reports/platform issues are welcome: russ@dvns.com if ($KeyMap{'name'} eq 'vi_keymap'){ &F_ViInput(); if ($rl_vi_replace_default_on_insert){ local $^W=0; my $Orig = $Term::ReadLine::Perl::term->ornaments(); eval { # Term::ReadLine does not expose its $terminal, so make another require Term::Cap; my $terminal = Tgetent Term::Cap ({OSPEED=>9600}); # and be sure the terminal supports highlighting $terminal->Trequire('mr'); }; if (!$@ and $Orig ne ',,,'){ $Term::ReadLine::Perl::term->ornaments (join(',', (split(/,/, $Orig))[0,1]) . ',mr,me') } my $F_SelfInsert_Real = \&F_SelfInsert; *F_SelfInsert = sub { $Term::ReadLine::Perl::term->ornaments($Orig); &F_ViChangeEntireLine; local $^W=0; *F_SelfInsert = $F_SelfInsert_Real; &F_SelfInsert; }; my $F_ViEndInsert_Real = \&F_ViEndInsert; *F_ViEndInsert = sub { $Term::ReadLine::Perl::term->ornaments($Orig); local $^W=0; *F_SelfInsert = $F_SelfInsert_Real; *F_ViEndInsert = $F_ViEndInsert_Real; &F_ViEndInsert; $force_redraw = 1; redisplay(); }; } } if ($rl_default_selected) { redisplay_high(); } else { &redisplay(); ## Show the line (prompt+default at this point). } # pretend input if we 'Operate' on more than one line &F_OperateAndGetNext($rl_OperateCount) if $rl_OperateCount > 0; $rl_first_char = 1; while (!defined($AcceptLine)) { ## get a character of input $input = &getc_with_pending(); # bug in debugger, returns 42. - No more! unless (defined $input) { # XXX What to do??? Until this is clear, just pretend we got EOF $AcceptLine = $ReturnEOF = 1; last; } preserve_state(); $ThisCommandKilledText = 0; ##print "\n\rline is @$D:[$line]\n\r"; ##DEBUG my $cmd = get_command($var_EditingMode, ord($input)); if ( $rl_first_char && $cmd =~ /^F_(SelfInsert$|Yank)/ && length $line && $rl_default_selected ) { # (Backward)?DeleteChar specialcased in the code $line = ''; $D = 0; $cmd = 'F_BackwardDeleteChar' if $cmd eq 'F_DeleteChar'; } undef $doingNumArg; &$cmd(1, ord($input)); ## actually execute input $rl_first_char = 0; $lastcommand = $cmd; *KeyMap = $var_EditingMode; # JP: added # In Vi command mode, don't position the cursor beyond the last # character of the line buffer. &F_BackwardChar(1) if $Vi_mode and $line ne '' and &at_end_of_line and $KeyMap{'name'} eq 'vicmd_keymap'; &redisplay(); $LastCommandKilledText = $ThisCommandKilledText; } undef @undo; ## Release the memory. undef @undoGroupS; ## Release the memory. &ResetTTY; ## Restore the tty state. $| = $oldbar; select $old; return undef if defined($ReturnEOF); #print STDOUT "|al=`$AcceptLine'"; $AcceptLine; ## return the line accepted. } ## ctrl(ord('a')) will return the ordinal for Ctrl-A. sub ctrl { $_[0] ^ (($_[0]>=ord('a') && $_[0]<=ord('z')) ? 0x60 : 0x40); } sub SetTTY { return if $dumb_term || $stdin_not_tty; #return system 'stty raw -echo' if defined &DB::DB; if (defined $term_readkey) { Term::ReadKey::ReadMode(4, $term_IN); if ($^O eq 'MSWin32') { # If we reached this, Perl isn't cygwin; Enter sends \r; thus we need binmode # XXXX Do we need to undo??? $term_IN is most probably private now... binmode $term_IN; } return 1; } # system 'stty raw -echo'; $sgttyb = ''; ## just to quiet "perl -w"; if ($useioctl && $^O ne 'solaris' && defined $TIOCGETP && &ioctl($term_IN,$TIOCGETP,$sgttyb)) { @tty_buf = unpack($sgttyb_t,$sgttyb); if (defined $ENV{OS2_SHELL}) { $tty_buf[3] &= ~$mode; $tty_buf[3] &= ~$ECHO; } else { $tty_buf[4] |= $mode; $tty_buf[4] &= ~$ECHO; } $sgttyb = pack($sgttyb_t,@tty_buf); &ioctl($term_IN,$TIOCSETP,$sgttyb) || die "Can't ioctl TIOCSETP: $!"; } elsif (!$usestty) { return 0; } else { warn < cygwin # The symptoms: now Enter sends \r; thus we need binmode # XXXX Do we need to undo??? $term_IN is most probably private now... binmode $term_IN; } } return 1; } sub ResetTTY { return if $dumb_term || $stdin_not_tty; #return system 'stty -raw echo' if defined &DB::DB; if (defined $term_readkey) { return Term::ReadKey::ReadMode(0, $term_IN); } # system 'stty -raw echo'; if ($useioctl) { &ioctl($term_IN,$TIOCGETP,$sgttyb) || die "Can't ioctl TIOCGETP: $!"; @tty_buf = unpack($sgttyb_t,$sgttyb); if (defined $ENV{OS2_SHELL}) { $tty_buf[3] |= $mode; $tty_buf[3] |= $ECHO; } else { $tty_buf[4] &= ~$mode; $tty_buf[4] |= $ECHO; } $sgttyb = pack($sgttyb_t,@tty_buf); &ioctl($term_IN,$TIOCSETP,$sgttyb) || die "Can't ioctl TIOCSETP: $!"; } elsif ($usestty) { system 'stty -raw echo' and die "Cannot call `stty': $!"; } } # Substr_with_props: gives the substr of prompt+string with embedded # face-change commands sub substr_with_props { my ($p, $s, $from, $len, $ket, $bsel, $esel) = @_; my $lp = length $p; defined $from or $from = 0; defined $len or $len = length($p) + length($s) - $from; unless (defined $ket) { warn 'bug in Term::ReadLine::Perl, please report to its author cpan@ilyaz.org'; $ket = ''; } # We may draw over to put cursor in a correct position: $ket = '' if $len < length($p) + length($s) - $from; # Not redrawn if ($from >= $lp) { $p = ''; $s = substr $s, $from - $lp; $lp = 0; } else { $p = substr $p, $from; $lp -= $from; $from = 0; } $s = substr $s, 0, $len - $lp; $p =~ s/^(\s*)//; my $bs = $1; $p =~ s/(\s*)$//; my $as = $1; $p = $rl_term_set->[0] . $p . $rl_term_set->[1] if length $p; $p = "$bs$p$as"; $ket = chop $s if $ket; if (defined $bsel and $bsel != $esel) { $bsel = $len if $bsel > $len; $esel = $len if $esel > $len; } if (defined $bsel and $bsel != $esel) { get_ornaments_selected; $bsel -= $lp; $esel -= $lp; my ($pre, $sel, $post) = (substr($s, 0, $bsel), substr($s, $bsel, $esel-$bsel), substr($s, $esel)); $pre = $rl_term_set->[2] . $pre . $rl_term_set->[3] if length $pre; $sel = $rl_term_set->[4] . $sel . $rl_term_set->[5] if length $sel; $post = $rl_term_set->[2] . $post . $rl_term_set->[3] if length $post; $s = "$pre$sel$post" } else { $s = $rl_term_set->[2] . $s . $rl_term_set->[3] if length $s; } if (!$lp) { # Should not happen... return $s; } elsif (!length $s) { # Should not happen return $p; } else { # Do not underline spaces in the prompt return "$p$s" . (length $ket ? ($rl_term_set->[0] . $ket . $rl_term_set->[1]) : ''); } } sub redisplay_high { get_ornaments_selected(); @$rl_term_set[2,3,4,5] = @$rl_term_set[4,5,2,3]; &redisplay(); ## Show the line, default inverted. @$rl_term_set[2,3,4,5] = @$rl_term_set[4,5,2,3]; $force_redraw = 1; } ## ## redisplay() ## ## Updates the screen to reflect the current $line. ## ## For the purposes of this routine, we prepend the prompt to a local copy of ## $line so that we display the prompt as well. We then modify it to reflect ## that some characters have different sizes (i.e. control-C is represented ## as ^C, tabs are expanded, etc.) ## ## This routine is somewhat complicated by two-byte characters.... must ## make sure never to try do display just half of one. ## ## NOTE: If an argument is given, it is used instead of the prompt. ## ## This is some nasty code. ## sub redisplay { ## local $line has prompt also; take that into account with $D. local($prompt) = defined($_[0]) ? $_[0] : $prompt; my ($thislen, $have_bra); my($dline) = $prompt . $line; local($D) = $D + length($prompt); my ($bsel, $esel); if (defined pos $line) { $bsel = (pos $line) + length $prompt; } my ($have_ket) = ''; ## ## If the line contains anything that might require special processing ## for displaying (such as tabs, control characters, etc.), we will ## take care of that now.... ## if ($dline =~ m/[^\x20-\x7e]/) { local($new, $Dinc, $c) = ('', 0); ## Look at each character of $dline in turn..... for ($i = 0; $i < length($dline); $i++) { $c = substr($dline, $i, 1); ## A tab to expand... if ($c eq "\t") { $c = ' ' x (8 - (($i-length($prompt)) % 8)); ## A control character.... } elsif ($c =~ tr/\000-\037//) { $c = sprintf("^%c", ord($c)+ord('@')); ## the delete character.... } elsif (ord($c) == 127) { $c = '^?'; } $new .= $c; ## Bump over $D if this char is expanded and left of $D. $Dinc += length($c) - 1 if (length($c) > 1 && $i < $D); ## Bump over $bsel if this char is expanded and left of $bsel. $bsel += length($c) - 1 if (defined $bsel && length($c) > 1 && $i < $bsel); } $dline = $new; $D += $Dinc; } ## ## Now $dline is what we'd like to display (with a prepended prompt) ## $D is the position of the cursor on it. ## ## If it's too long to fit on the line, we must decide what we can fit. ## ## If we end up moving the screen index ($si) [index of the leftmost ## character on the screen], to some place other than the front of the ## the line, we'll have to make sure that it's not on the first byte of ## a 2-byte character, 'cause we'll be placing a '<' marker there, and ## that would screw up the 2-byte character. ## ## $si is preserved between several displays (if possible). ## ## Similarly, if the line needs chopped off, we make sure that the ## placement of the tailing '>' won't screw up any 2-byte character in ## the vicinity. # Now $si keeps the value from previous display if ($D == length($prompt) # If prompts fits exactly, show only if need not show trailing '>' and length($prompt) < $rl_screen_width - (0 != length $dline)) { $si = 0; ## prefer displaying the whole prompt } elsif ($si >= $D) { # point to the left of what was displayed $si = &max(0, $D - $rl_margin); $si-- if $si > 0 && $si != length($prompt) && !&OnSecondByte($si); } elsif ($si + $rl_screen_width <= $D) { # Point to the right of ... $si = &min(length($dline), ($D - $rl_screen_width) + $rl_margin); $si-- if $si > 0 && $si != length($prompt) && !&OnSecondByte($si); } elsif (length($dline) - $si < $rl_screen_width - $rl_margin and $si) { # Too little of the line shown $si = &max(0, length($dline) - $rl_screen_width + 3); $si-- if $si > 0 && $si != length($prompt) && !&OnSecondByte($si); } else { ## Fine as-is.... don't need to change $si. } $have_bra = 1 if $si != 0; # Need the "chopped-off" marker $thislen = &min(length($dline) - $si, $rl_screen_width); if ($si + $thislen < length($dline)) { ## need to place a '>'... make sure to place on first byte. $thislen-- if &OnSecondByte($si+$thislen-1); substr($dline, $si+$thislen-1,1) = '>'; $have_ket = 1; } ## ## Now know what to display. ## Must get substr($dline, $si, $thislen) on the screen, ## with the cursor at $D-$si characters from the left edge. ## $dline = substr($dline, $si, $thislen); $delta = $D - $si; ## delta is cursor distance from beginning of $dline. if (defined $bsel) { # Highlight the selected part $bsel -= $si; $esel = $delta; ($bsel, $esel) = ($esel, $bsel) if $bsel > $esel; $bsel = 0 if $bsel < 0; if ($have_ket) { $esel = $thislen - 1 if $esel > $thislen - 1; } else { $esel = $thislen if $esel > $thislen; } } if ($si >= length($prompt)) { # Keep $dline for $lastredisplay... $prompt = ($have_bra ? "<" : ""); $dline = substr $dline, 1; # After prompt $bsel = 1 if defined $bsel and $bsel == 0; } else { $dline = substr($dline, (length $prompt) - $si); $prompt = substr($prompt,$si); substr($prompt, 0, 1) = '<' if $si > 0; } # Now $dline is the part after the prompt... ## ## Now must output $dline, with cursor $delta spaces from left of TTY ## local ($\, $,) = ('',''); ## ## If $force_redraw is not set, we can attempt to optimize the redisplay ## However, if we don't happen to find an easy way to optimize, we just ## fall through to the brute-force method of re-drawing the whole line. ## if (not $force_redraw and not defined $bsel) { ## can try to optimize here a bit. ## For when we only need to move the cursor if ($lastredisplay eq $dline and $lastpromptlen == length $prompt) { ## If we need to move forward, just overwrite as far as we need. if ($lastdelta < $delta) { print $term_OUT substr_with_props($prompt, $dline, $lastdelta, $delta-$lastdelta, $have_ket); ## Need to move back. } elsif($lastdelta > $delta) { ## Two ways to move back... use the fastest. One is to just ## backspace the proper amount. The other is to jump to the ## the beginning of the line and overwrite from there.... my $out = substr_with_props($prompt, $dline, 0, $delta, $have_ket); if ($lastdelta - $delta <= length $out) { print $term_OUT "\b" x ($lastdelta - $delta); } else { print $term_OUT "\r", $out; } } ($lastlen, $lastredisplay, $lastdelta, $lastpromptlen) = ($thislen, $dline, $delta, length $prompt); # print $term_OUT "\a"; # Debugging return; } ## for when we've just added stuff to the end if ($thislen > $lastlen && $lastdelta == $lastlen && $delta == $thislen && $lastpromptlen == length($prompt) && substr($dline, 0, $lastlen - $lastpromptlen) eq $lastredisplay) { print $term_OUT substr_with_props($prompt, $dline, $lastdelta, undef, $have_ket); # print $term_OUT "\a"; # Debugging ($lastlen, $lastredisplay, $lastdelta, $lastpromptlen) = ($thislen, $dline, $delta, length $prompt); return; } ## There is much more opportunity for optimizing..... ## something to work on later..... } ## ## Brute force method of redisplaying... redraw the whole thing. ## print $term_OUT "\r", substr_with_props($prompt, $dline, 0, undef, $have_ket, $bsel, $esel); my $back = length ($dline) + length ($prompt) - $delta; $back += $lastlen - $thislen, print $term_OUT ' ' x ($lastlen - $thislen) if $lastlen > $thislen; if ($back) { my $out = substr_with_props($prompt, $dline, 0, $delta, $have_ket, $bsel, $esel); if ($back <= length $out and not defined $bsel) { print $term_OUT "\b" x $back; } else { print $term_OUT "\r", $out; } } ($lastlen, $lastredisplay, $lastdelta, $lastpromptlen) = ($thislen, $dline, $delta, length $prompt); $force_redraw = 0; } sub min { $_[0] < $_[1] ? $_[0] : $_[1]; } sub getc_with_pending { my $key = @Pending ? shift(@Pending) : &$rl_getc; # Save keystrokes for vi '.' command push(@$Dot_buf, $key) if $Dot_buf; $key; } sub rl_getc { my $key; # JP: Added missing declaration if (defined $term_readkey) { # XXXX ??? $Term::ReadLine::Perl::term->Tk_loop if $Term::ReadLine::toloop && defined &Tk::DoOneEvent; $key = Term::ReadKey::ReadKey(0, $term_IN); } else { $key = $Term::ReadLine::Perl::term->get_c; } } ## ## get_command(keymap, ord_command_char) ## ## If the KEYMAP has an entry for COMMAND, it is returned. ## Otherwise, the default command is returned. ## sub get_command { local *KeyMap = shift; my ($key) = @_; my $cmd = defined($KeyMap[$key]) ? $KeyMap[$key] : ($KeyMap{'default'} || 'F_Ding'); if (!defined($cmd) || $cmd eq ''){ warn "internal error (key=$key)"; $cmd = 'F_Ding'; } $cmd } ## ## do_command(keymap, numericarg, command) ## ## If the KEYMAP has an entry for COMMAND, it is executed. ## Otherwise, the default command for the keymap is executed. ## sub do_command { my ($keymap, $count, $key) = @_; my $cmd = get_command($keymap, $key); local *KeyMap = $keymap; # &$cmd may expect it... &$cmd($count, $key); $lastcommand = $cmd; } ## ## Save whatever state we wish to save as an anonymous array. ## The only other function that needs to know about its encoding is getstate/preserve_state. ## sub savestate { [$D, $si, $LastCommandKilledText, $KillBuffer, $line, @_]; } # consolidate only-movement changes together... sub preserve_state { return if $Vi_mode; push(@undo, savestate()), return unless @undo; my $last = $undo[-1]; my @only_movement; if ( #$last->[1] == $si and $last->[2] eq $LastCommandKilledText # and $last->[3] eq $KillBuffer and $last->[4] eq $line ) { # Only position changed; remove old only-position-changed records pop @undo if $undo[-1]->[5]; @only_movement = 1; } push(@undo, savestate(@only_movement)); } ## ## $_[1] is an ASCII ordinal; inserts as per $count. ## sub F_SelfInsert { remove_selection(); my ($count, $ord) = @_; my $text2add = pack('C', $ord) x $count; if ($InsertMode) { substr($line,$D,0) .= $text2add; } else { ## note: this can screw up with 2-byte characters. substr($line,$D,length($text2add)) = $text2add; } $D += length($text2add); } ## ## Return the line as-is to the user. ## sub F_AcceptLine { &add_line_to_history; $AcceptLine = $line; local $\ = ''; print $term_OUT "\r\n"; $force_redraw = 0; (pos $line) = undef; # Another way to force redraw... } sub add_line_to_history { ## Insert into history list if: ## * bigger than the minimal length ## * not same as last entry ## if (length($line) >= $minlength && (!@rl_History || $rl_History[$#rl_History] ne $line) ) { ## if the history list is full, shift out an old one first.... while (@rl_History >= $rl_MaxHistorySize) { shift(@rl_History); $rl_HistoryIndex--; } push(@rl_History, $line); ## tack new one on the end } } sub remove_selection { if ( $rl_first_char && length $line && $rl_default_selected ) { $line = ''; $D = 0; return 1; } if ($rl_delete_selection and defined pos $line and $D != pos $line) { kill_text(pos $line, $D); return 1; } return; } #sub F_ReReadInitFile; #sub rl_getc; sub F_ForwardChar; sub F_BackwardChar; sub F_BeginningOfLine; sub F_EndOfLine; sub F_ForwardWord; sub F_BackwardWord; sub F_RedrawCurrentLine; sub F_ClearScreen; # sub F_SelfInsert; sub F_QuotedInsert; sub F_TabInsert; #sub F_AcceptLine; sub F_OperateAndGetNext; sub F_BackwardDeleteChar; sub F_DeleteChar; sub F_UnixWordRubout; sub F_UnixLineDiscard; sub F_UpcaseWord; sub F_DownCaseWord; sub F_CapitalizeWord; sub F_TransposeWords; sub F_TransposeChars; sub F_PreviousHistory; sub F_NextHistory; sub F_BeginningOfHistory; sub F_EndOfHistory; sub F_ReverseSearchHistory; sub F_ForwardSearchHistory; sub F_HistorySearchBackward; sub F_HistorySearchForward; sub F_KillLine; sub F_BackwardKillLine; sub F_Yank; sub F_YankPop; sub F_YankNthArg; sub F_KillWord; sub F_BackwardKillWord; sub F_Abort; sub F_DoLowercaseVersion; sub F_DoMetaVersion; sub F_DoControlVersion; sub F_Undo; sub F_RevertLine; sub F_EmacsEditingMode; sub F_Interrupt; sub F_PrefixMeta; sub F_UniversalArgument; sub F_DigitArgument; sub F_OverwriteMode; sub F_InsertMode; sub F_ToggleInsertMode; sub F_Suspend; sub F_Ding; sub F_PossibleCompletions; sub F_Complete; sub F_YankClipboard; sub F_CopyRegionAsKillClipboard; sub F_KillRegionClipboard; sub clipboard_set; sub F_BeginUndoGroup; sub F_EndUndoGroup; sub F_DoNothing; sub F_ForceMemorizeDigitArgument; sub F_MemorizeDigitArgument; sub F_UnmemorizeDigitArgument; sub F_ResetDigitArgument; sub F_MergeInserts; sub F_MemorizePos; sub F_BeginPasteGroup; sub F_EndPasteGroup; sub F_BeginEditGroup; sub F_EndEditGroup; # Comment next line and __DATA__ line below to disable the selfloader. #use SelfLoader; 1; #__DATA__ # From here on anything may be autoloaded sub max { $_[0] > $_[1] ? $_[0] : $_[1]; } sub isupper { ord($_[0]) >= ord('A') && ord($_[0]) <= ord('Z'); } sub islower { ord($_[0]) >= ord('a') && ord($_[0]) <= ord('z'); } sub toupper { &islower ? pack('c', ord($_[0])-ord('a')+ord('A')) : $_[0];} sub tolower { &isupper ? pack('c', ord($_[0])-ord('A')+ord('a')) : $_[0];} ## ## rl_set(var_name, value_string) ## ## Sets the named variable as per the given value, if both are appropriate. ## Allows the user of the package to set such things as HorizontalScrollMode ## and EditingMode. Value_string may be of the form ## HorizontalScrollMode ## horizontal-scroll-mode ## ## Also called during the parsing of ~/.inputrc for "set var value" lines. ## ## The previous value is returned, or undef on error. ########################################################################### ## Consider the following example for how to add additional variables ## accessible via rl_set (and hence via ~/.inputrc). ## ## Want: ## We want an external variable called "FooTime" (or "foo-time"). ## It may have values "January", "Monday", or "Noon". ## Internally, we'll want those values to translate to 1, 2, and 12. ## ## How: ## Have an internal variable $var_FooTime that will represent the current ## internal value, and initialize it to the default value. ## Make an array %var_FooTime whose keys and values are are the external ## (January, Monday, Noon) and internal (1, 2, 12) values: ## ## $var_FooTime = $var_FooTime{'January'} = 1; #default ## $var_FooTime{'Monday'} = 2; ## $var_FooTime{'Noon'} = 12; ## sub rl_set { local($var, $val) = @_; # &preinit's keys are all Capitalized $val = ucfirst lc $val if $val =~ /^(on|off)$/i; $var = 'CompleteAddsuffix' if $var eq 'visible-stats'; ## if the variable is in the form "some-name", change to "SomeName" local($_) = "\u$var"; local($return) = undef; s/-(.)/\u$1/g; # Skip unknown variables: return unless defined $ {'readline::'}{"var_$_"}; local(*V); # avoid warning { local $^W; *V = $ {'readline::'}{"var_$_"}; } if (!defined($V)) { # XXX Duplicate check? warn("Warning$InputLocMsg:\n". " Invalid variable `$var'\n") if $^W; } elsif (!defined($V{$val})) { local(@selections) = keys(%V); warn("Warning$InputLocMsg:\n". " Invalid value `$val' for variable `$var'.\n". " Choose from [@selections].\n") if $^W; } else { $return = $V; $V = $V{$val}; ## make the setting } $return; } ## ## OnSecondByte($index) ## ## Returns true if the byte at $index into $line is the second byte ## of a two-byte character. ## sub OnSecondByte { return 0 if !$_rl_japanese_mb || $_[0] == 0 || $_[0] == length($line); die 'internal error' if $_[0] > length($line); ## ## must start looking from the beginning of the line .... can ## have one- and two-byte characters interspersed, so can't tell ## without starting from some know location..... ## local($i); for ($i = 0; $i < $_[0]; $i++) { next if ord(substr($line, $i, 1)) < 0x80; ## We have the first byte... must bump up $i to skip past the 2nd. ## If that one we're skipping past is the index, it should be changed ## to point to the first byte of the pair (therefore, decremented). return 1 if ++$i == $_[0]; } 0; ## seemed to be OK. } ## ## CharSize(index) ## ## Returns the size of the character at the given INDEX in the ## current line. Most characters are just one byte in length, ## but if the byte at the index and the one after has the high ## bit set those two bytes are one character of size=2. ## ## Assumes that index points to the first of a 2-byte char if not ## pointing to a 2-byte char. ## sub CharSize { return 2 if $_rl_japanese_mb && ord(substr($line, $_[0], 1)) >= 0x80 && ord(substr($line, $_[0]+1, 1)) >= 0x80; 1; } sub GetTTY { $base_termios = $termios; # make it long enough &ioctl($term_IN,$TCGETS,$base_termios) || die "Can't ioctl TCGETS: $!"; } sub XonTTY { # I don't know which of these I actually need to do this to, so we'll # just cover all bases. &ioctl($term_IN,$TCXONC,$TCOON); # || die "Can't ioctl TCXONC STDIN: $!"; &ioctl($term_OUT,$TCXONC,$TCOON); # || die "Can't ioctl TCXONC STDOUT: $!"; } sub ___SetTTY { # print "before SetTTY\n\r"; # system 'stty -a'; &XonTTY; &GetTTY if !defined($base_termios); @termios = unpack($termios_t,$base_termios); $termios[$TERMIOS_IFLAG] |= $TERMIOS_READLINE_ION; $termios[$TERMIOS_IFLAG] &= ~$TERMIOS_READLINE_IOFF; $termios[$TERMIOS_OFLAG] |= $TERMIOS_READLINE_OON; $termios[$TERMIOS_OFLAG] &= ~$TERMIOS_READLINE_OOFF; $termios[$TERMIOS_LFLAG] |= $TERMIOS_READLINE_LON; $termios[$TERMIOS_LFLAG] &= ~$TERMIOS_READLINE_LOFF; $termios[$TERMIOS_VMIN] = 1; $termios[$TERMIOS_VTIME] = 0; $termios = pack($termios_t,@termios); &ioctl($term_IN,$TCSETS,$termios) || die "Can't ioctl TCSETS: $!"; # print "after SetTTY\n\r"; # system 'stty -a'; } sub normal_tty_mode { return if $stdin_not_tty || $dumb_term || !$initialized; &XonTTY; &GetTTY if !defined($base_termios); &ResetTTY; } sub ___ResetTTY { # print "before ResetTTY\n\r"; # system 'stty -a'; @termios = unpack($termios_t,$base_termios); $termios[$TERMIOS_IFLAG] |= $TERMIOS_NORMAL_ION; $termios[$TERMIOS_IFLAG] &= ~$TERMIOS_NORMAL_IOFF; $termios[$TERMIOS_OFLAG] |= $TERMIOS_NORMAL_OON; $termios[$TERMIOS_OFLAG] &= ~$TERMIOS_NORMAL_OOFF; $termios[$TERMIOS_LFLAG] |= $TERMIOS_NORMAL_LON; $termios[$TERMIOS_LFLAG] &= ~$TERMIOS_NORMAL_LOFF; $termios = pack($termios_t,@termios); &ioctl($term_IN,$TCSETS,$termios) || die "Can't ioctl TCSETS: $!"; # print "after ResetTTY\n\r"; # system 'stty -a'; } ## ## WordBreak(index) ## ## Returns true if the character at INDEX into $line is a basic word break ## character, false otherwise. ## sub WordBreak { index($rl_basic_word_break_characters, substr($line,$_[0],1)) != -1; } sub getstate { ($D, $si, $LastCommandKilledText, $KillBuffer, $line) = @{$_[0]}; $ThisCommandKilledText = $LastCommandKilledText; } ## ## kills from D=$_[0] to $_[1] (to the killbuffer if $_[2] is true) ## sub kill_text { my($from, $to, $save) = (&min($_[0], $_[1]), &max($_[0], $_[1]), $_[2]); my $len = $to - $from; if ($save) { $KillBuffer = '' if !$LastCommandKilledText; if ($from < $LastCommandKilledText - 1) { $KillBuffer = substr($line, $from, $len) . $KillBuffer; } else { $KillBuffer .= substr($line, $from, $len); } $ThisCommandKilledText = 1 + $from; } substr($line, $from, $len) = ''; ## adjust $D if ($D > $from) { $D -= $len; $D = $from if $D < $from; } } ########################################################################### ## Bindable functions... pretty much in the same order as in readline.c ### ########################################################################### ## ## Returns true if $D at the end of the line. ## sub at_end_of_line { ($D + &CharSize($D)) == (length($line) + 1); } ## ## Move forward (right) $count characters. ## sub F_ForwardChar { my $count = shift; return &F_BackwardChar(-$count) if $count < 0; while (!&at_end_of_line && $count-- > 0) { $D += &CharSize($D); } } ## ## Move backward (left) $count characters. ## sub F_BackwardChar { my $count = shift; return &F_ForwardChar(-$count) if $count < 0; while (($D > 0) && ($count-- > 0)) { $D--; ## Move back one regardless, $D-- if &OnSecondByte($D); ## another if over a big char. } } ## ## Go to beginning of line. ## sub F_BeginningOfLine { $D = 0; } ## ## Move to the end of the line. ## sub F_EndOfLine { &F_ForwardChar(100) while !&at_end_of_line; } ## ## Move to the end of this/next word. ## Done as many times as $count says. ## sub F_ForwardWord { my $count = shift; return &F_BackwardWord(-$count) if $count < 0; while (!&at_end_of_line && $count-- > 0) { ## skip forward to the next word (if not already on one) &F_ForwardChar(1) while !&at_end_of_line && &WordBreak($D); ## skip forward to end of word &F_ForwardChar(1) while !&at_end_of_line && !&WordBreak($D); } } ## ## ## Move to the beginning of this/next word. ## Done as many times as $count says. ## sub F_BackwardWord { my $count = shift; return &F_ForwardWord(-$count) if $count < 0; while ($D > 0 && $count-- > 0) { ## skip backward to the next word (if not already on one) &F_BackwardChar(1) while (($D > 0) && &WordBreak($D-1)); ## skip backward to start of word &F_BackwardChar(1) while (($D > 0) && !&WordBreak($D-1)); } } ## ## Refresh the input line. ## sub F_RedrawCurrentLine { $force_redraw = 1; } ## ## Clear the screen and refresh the line. ## If given a numeric arg other than 1, simply refreshes the line. ## sub F_ClearScreen { my $count = shift; return &F_RedrawCurrentLine if $count != 1; $rl_CLEAR = `clear` if !defined($rl_CLEAR); local $\ = ''; print $term_OUT $rl_CLEAR; $force_redraw = 1; } ## ## Insert the next character read verbatim. ## sub F_QuotedInsert { my $count = shift; &F_SelfInsert($count, ord(&getc_with_pending)); } ## ## Insert a tab. ## sub F_TabInsert { my $count = shift; &F_SelfInsert($count, ord("\t")); } ## Operate - accept the current line and fetch from the ## history the next line relative to current line for default. sub F_OperateAndGetNext { my $count = shift; &F_AcceptLine; my $remainingEntries = $#rl_History - $rl_HistoryIndex; if ($count > 0 && $remainingEntries >= 0) { # there is something to repeat if ($remainingEntries > 0) { # if we are not on last line $rl_HistoryIndex++; # fetch next one $count = $remainingEntries if $count > $remainingEntries; } $rl_OperateCount = $count; } } ## ## Removes $count chars to left of cursor (if not at beginning of line). ## If $count > 1, deleted chars saved to kill buffer. ## sub F_BackwardDeleteChar { return if remove_selection(); my $count = shift; return F_DeleteChar(-$count) if $count < 0; my $oldD = $D; &F_BackwardChar($count); return if $D == $oldD; &kill_text($oldD, $D, $count > 1); } ## ## Removes the $count chars from under the cursor. ## If there is no line and the last command was different, tells ## readline to return EOF. ## If there is a line, and the cursor is at the end of it, and we're in ## tcsh completion mode, then list possible completions. ## If $count > 1, deleted chars saved to kill buffer. ## sub F_DeleteChar { return if remove_selection(); my $count = shift; return F_DeleteBackwardChar(-$count) if $count < 0; if (length($line) == 0) { # EOF sent (probably OK in DOS too) $AcceptLine = $ReturnEOF = 1 if $lastcommand ne 'F_DeleteChar'; return; } if ($D == length ($line)) { &complete_internal('?') if $var_TcshCompleteMode; return; } my $oldD = $D; &F_ForwardChar($count); return if $D == $oldD; &kill_text($oldD, $D, $count > 1); } ## ## Kill to previous whitespace. ## sub F_UnixWordRubout { return &F_Ding if $D == 0; (my $oldD, local $rl_basic_word_break_characters) = ($D, "\t "); # JP: Fixed a bug here - both were 'my' F_BackwardWord(1); kill_text($D, $oldD, 1); } ## ## Kill line from cursor to beginning of line. ## sub F_UnixLineDiscard { return &F_Ding if $D == 0; kill_text(0, $D, 1); } sub F_UpcaseWord { &changecase($_[0], 'up'); } sub F_DownCaseWord { &changecase($_[0], 'down'); } sub F_CapitalizeWord { &changecase($_[0], 'cap'); } ## ## Translated from GNUs readline.c ## One arg is 'up' to upcase $_[0] words, ## 'down' to downcase them, ## or something else to capitolize them. ## If $_[0] is negative, the dot is not moved. ## sub changecase { my $op = $_[1]; my ($start, $state, $c, $olddot) = ($D, 0); if ($_[0] < 0) { $olddot = $D; $_[0] = -$_[0]; } &F_ForwardWord; ## goes forward $_[0] words. while ($start < $D) { $c = substr($line, $start, 1); if ($op eq 'up') { $c = &toupper($c); } elsif ($op eq 'down') { $c = &tolower($c); } else { ## must be 'cap' if ($state == 1) { $c = &tolower($c); } else { $c = &toupper($c); $state = 1; } $state = 0 if $c !~ tr/a-zA-Z//; } substr($line, $start, 1) = $c; $start++; } $D = $olddot if defined($olddot); } sub F_TransposeWords { my $c = shift; return F_Ding() unless $c; # Find "this" word F_BackwardWord(1); my $p0 = $D; F_ForwardWord(1); my $p1 = $D; return F_Ding() if $p1 == $p0; my ($p2, $p3) = ($p0, $p1); if ($c > 0) { F_ForwardWord($c); $p3 = $D; F_BackwardWord(1); $p2 = $D; } else { F_BackwardWord(1 - $c); $p0 = $D; F_ForwardWord(1); $p1 = $D; } return F_Ding() if $p3 == $p2 or $p2 < $p1; my $r = substr $line, $p2, $p3 - $p2; substr($line, $p2, $p3 - $p2) = substr $line, $p0, $p1 - $p0; substr($line, $p0, $p1 - $p0) = $r; $D = $c > 0 ? $p3 : $p0 + $p3 - $p2; # End of "this" word after edit return 1; ## Exchange words: C-Left, C-right, C-right, C-left. If positions do ## not overlap, we get two things to transpose. Repeat count? } ## ## Switch char at dot with char before it. ## If at the end of the line, switch the previous two... ## (NOTE: this could screw up multibyte characters.. should do correctly) sub F_TransposeChars { if ($D == length($line) && $D >= 2) { substr($line,$D-2,2) = substr($line,$D-1,1).substr($line,$D-2,1); } elsif ($D >= 1) { substr($line,$D-1,2) = substr($line,$D,1) .substr($line,$D-1,1); } else { &F_Ding; } } sub F_PreviousHistory { &get_line_from_history($rl_HistoryIndex - shift); } sub F_NextHistory { &get_line_from_history($rl_HistoryIndex + shift); } sub F_BeginningOfHistory { &get_line_from_history(0); } sub F_EndOfHistory { &get_line_from_history(@rl_History); } sub F_ReverseSearchHistory { &DoSearch($_[0] >= 0 ? 1 : 0); } sub F_ForwardSearchHistory { &DoSearch($_[0] >= 0 ? 0 : 1); } sub F_HistorySearchBackward { &DoSearchStart(($_[0] >= 0 ? 1 : 0),substr($line,0,$D)); } sub F_HistorySearchForward { &DoSearchStart(($_[0] >= 0 ? 0 : 1),substr($line,0,$D)); } ## returns a new $i or -1 if not found. sub search { my ($i, $str) = @_; return -1 if $i < 0 || $i > $#rl_History; ## for safety while (1) { return $i if rindex($rl_History[$i], $str) >= 0; if ($reverse) { return -1 if $i-- == 0; } else { return -1 if $i++ == $#rl_History; } } } sub DoSearch { local $reverse = shift; # Used in search() my $oldline = $line; my $oldD = $D; my $searchstr = ''; ## string we're searching for my $I = -1; ## which history line $si = 0; while (1) { if ($I != -1) { $line = $rl_History[$I]; $D += index($rl_History[$I], $searchstr); } &redisplay( '('.($reverse?'reverse-':'') ."i-search) `$searchstr': "); $c = &getc_with_pending; if (($KeyMap[ord($c)] || 0) eq 'F_ReverseSearchHistory') { if ($reverse && $I != -1) { if ($tmp = &search($I-1,$searchstr), $tmp >= 0) { $I = $tmp; } else { &F_Ding; } } $reverse = 1; } elsif (($KeyMap[ord($c)] || 0) eq 'F_ForwardSearchHistory') { if (!$reverse && $I != -1) { if ($tmp = &search($I+1,$searchstr), $tmp >= 0) { $I = $tmp; } else { &F_Ding; } } $reverse = 0; } elsif ($c eq "\007") { ## abort search... restore line and return $line = $oldline; $D = $oldD; return; } elsif (ord($c) < 32 || ord($c) > 126) { push(@Pending, $c) if $c ne "\e"; if ($I < 0) { ## just restore $line = $oldline; $D = $oldD; } else { #chose this line $line = $rl_History[$I]; $D = index($rl_History[$I], $searchstr); } &redisplay(); last; } else { ## Add this character to the end of the search string and ## see if that'll match anything. $tmp = &search($I < 0 ? $rl_HistoryIndex-$reverse: $I, $searchstr.$c); if ($tmp == -1) { &F_Ding; } else { $searchstr .= $c; $I = $tmp; } } } } ## returns a new $i or -1 if not found. sub searchStart { my ($i, $reverse, $str) = @_; $i += $reverse ? - 1: +1; return -1 if $i < 0 || $i > $#rl_History; ## for safety while (1) { return $i if index($rl_History[$i], $str) == 0; if ($reverse) { return -1 if $i-- == 0; } else { return -1 if $i++ == $#rl_History; } } } sub DoSearchStart { my ($reverse,$what) = @_; my $i = searchStart($rl_HistoryIndex, $reverse, $what); return if $i == -1; $rl_HistoryIndex = $i; ($D, $line) = (0, $rl_History[$rl_HistoryIndex]); F_BeginningOfLine(); F_ForwardChar(length($what)); } ########################################################################### ########################################################################### ## ## Kill from cursor to end of line. ## sub F_KillLine { my $count = shift; return F_BackwardKillLine(-$count) if $count < 0; kill_text($D, length($line), 1); } ## ## Delete from cursor to beginning of line. ## sub F_BackwardKillLine { my $count = shift; return F_KillLine(-$count) if $count < 0; return F_Ding if $D == 0; kill_text(0, $D, 1); } ## ## TextInsert(count, string) ## sub TextInsert { my $count = shift; my $text2add = shift(@_) x $count; if ($InsertMode) { substr($line,$D,0) .= $text2add; } else { substr($line,$D,length($text2add)) = $text2add; } $D += length($text2add); } sub F_Yank { remove_selection(); &TextInsert($_[0], $KillBuffer); } sub F_YankPop { 1; ## not implemented yet } sub F_YankNthArg { 1; ## not implemented yet } ## ## Kill to the end of the current word. If not on a word, kill to ## the end of the next word. ## sub F_KillWord { my $count = shift; return &F_BackwardKillWord(-$count) if $count < 0; my $oldD = $D; &F_ForwardWord($count); ## moves forward $count words. kill_text($oldD, $D, 1); } ## ## Kill backward to the start of the current word, or, if currently ## not on a word (or just at the start of a word), to the start of the ## previous word. ## sub F_BackwardKillWord { my $count = shift; return F_KillWord(-$count) if $count < 0; my $oldD = $D; &F_BackwardWord($count); ## moves backward $count words. kill_text($D, $oldD, 1); } ########################################################################### ########################################################################### ## ## Abort the current input. ## sub F_Abort { &F_Ding; } ## ## If the character that got us here is upper case, ## do the lower-case equiv... ## sub F_DoLowercaseVersion { if ($_[1] >= ord('A') && $_[1] <= ord('Z')) { &do_command(*KeyMap, $_[0], $_[1] - ord('A') + ord('a')); } else { &F_Ding; } } ## ## do the equiv with control key... ## sub F_DoControlVersion { local *KeyMap = $var_EditingMode; my $key = $_[1]; if ($key == ord('?')) { $key = 0x7F; } else { $key &= ~(0x80 | 0x60); } &do_command(*KeyMap, $_[0], $key); } ## ## do the equiv with meta key... ## sub F_DoMetaVersion { local *KeyMap = $var_EditingMode; unshift @Pending, chr $_[1]; &do_command(*KeyMap, $_[0], ord "\e"); } ## ## If the character that got us here is Alt-Char, ## do the Esc Char equiv... ## sub F_DoEscVersion { my ($ord, $t) = $_[1]; &F_Ding unless $KeyMap{'Esc'}; for $t (([ord 'w', '`1234567890-='], [ord ',', 'zxcvbnm,./\\'], [16, 'qwertyuiop[]'], [ord(' ') - 2, 'asdfghjkl;\''])) { next unless $ord >= $t->[0] and $ord < $t->[0] + length($t->[1]); $ord = ord substr $t->[1], $ord - $t->[0], 1; return &do_command($KeyMap{'Esc'}, $_[0], $ord); } &F_Ding; } ## ## Undo one level. ## sub F_Undo { pop(@undo); # unless $undo[-1]->[5]; ## get rid of the state we just put on, so we can go back one. if (@undo) { &getstate(pop(@undo)); } else { &F_Ding; } } ## ## Replace the current line to some "before" state. ## sub F_RevertLine { if ($rl_HistoryIndex >= $#rl_History+1) { $line = $line_for_revert; } else { $line = $rl_History[$rl_HistoryIndex]; } $D = length($line); } sub F_EmacsEditingMode { $var_EditingMode = $var_EditingMode{'emacs'}; $Vi_mode = 0; } ########################################################################### ########################################################################### ## ## (Attempt to) interrupt the current program. ## sub F_Interrupt { local $\ = ''; print $term_OUT "\r\n"; &ResetTTY; kill ("INT", 0); ## We're back.... must not have died. $force_redraw = 1; } ## ## Execute the next character input as a command in a meta keymap. ## sub F_PrefixMeta { my($count, $keymap) = ($_[0], "$KeyMap{'name'}_$_[1]"); ##print "F_PrefixMeta [$keymap]\n\r"; die "" unless %$keymap; do_command(*$keymap, $count, ord(&getc_with_pending)); } sub F_UniversalArgument { &F_DigitArgument; } ## ## For typing a numeric prefix to a command.... ## sub F_DigitArgument { my $in = chr $_[1]; my ($NumericArg, $sawDigit) = (1, 0); my ($increment, $ord); ($NumericArg, $sawDigit) = ($_[0], $_[0] !~ /e0$/i) if $doingNumArg; # XXX What if Esc-- 1 ? do { $ord = ord $in; if (defined($KeyMap[$ord]) && $KeyMap[$ord] eq 'F_UniversalArgument') { $NumericArg *= 4; } elsif ($ord == ord('-') && !$sawDigit) { $NumericArg = -$NumericArg; } elsif ($ord >= ord('0') && $ord <= ord('9')) { $increment = ($ord - ord('0')) * ($NumericArg < 0 ? -1 : 1); if ($sawDigit) { $NumericArg = $NumericArg * 10 + $increment; } else { $NumericArg = $increment; $sawDigit = 1; } } else { local(*KeyMap) = $var_EditingMode; &redisplay(); $doingNumArg = 1; # Allow NumArg inside NumArg &do_command(*KeyMap, $NumericArg . ($sawDigit ? '': 'e0'), $ord); return; } ## make sure it's not toooo big. if ($NumericArg > $rl_max_numeric_arg) { $NumericArg = $rl_max_numeric_arg; } elsif ($NumericArg < -$rl_max_numeric_arg) { $NumericArg = -$rl_max_numeric_arg; } &redisplay(sprintf("(arg %d) ", $NumericArg)); } while defined($in = &getc_with_pending); } sub F_OverwriteMode { $InsertMode = 0; } sub F_InsertMode { $InsertMode = 1; } sub F_ToggleInsertMode { $InsertMode = !$InsertMode; } ## ## (Attempt to) suspend the program. ## sub F_Suspend { if ($inDOS && length($line)==0) { # EOF sent $AcceptLine = $ReturnEOF = 1 if $lastcommand ne 'F_DeleteChar'; return; } local $\ = ''; print $term_OUT "\r\n"; &ResetTTY; eval { kill ("TSTP", 0) }; ## We're back.... &SetTTY; $force_redraw = 1; } ## ## Ring the bell. ## Should do something with $var_PreferVisibleBell here, but what? ## sub F_Ding { local $\ = ''; print $term_OUT "\007"; return; # Undefined return value } ########################################################################## #### command/file completion ############################################ ########################################################################## ## ## How Command Completion Works ## ## When asked to do a completion operation, readline isolates the word ## to the immediate left of the cursor (i.e. what's just been typed). ## This information is then passed to some function (which may be supplied ## by the user of this package) which will return an array of possible ## completions. ## ## If there is just one, that one is used. Otherwise, they are listed ## in some way (depends upon $var_TcshCompleteMode). ## ## The default is to do filename completion. The function that performs ## this task is readline'rl_filename_list. ## ## A minimal-trouble way to have command-completion is to call ## readline'rl_basic_commands with an array of command names, such as ## &readline'rl_basic_commands('quit', 'run', 'set', 'list') ## Those command names will then be used for completion if the word being ## completed begins the line. Otherwise, completion is disallowed. ## ## The way to have the most power is to provide a function to readline ## which will accept information about a partial word that needs completed, ## and will return the appropriate list of possibilities. ## This is done by setting $readline'rl_completion_function to the name of ## the function to run. ## ## That function will be called with three args ($text, $line, $start). ## TEXT is the partial word that should be completed. LINE is the entire ## input line as it stands, and START is the index of the TEXT in LINE ## (i.e. zero if TEXT is at the beginning of LINE). ## ## A cool completion function will look at LINE and START and give context- ## sensitive completion lists. Consider something that will do completion ## for two commands ## cat FILENAME ## finger USERNAME ## status [this|that|other] ## ## It (untested) might look like: ## ## $readline'rl_completion_function = "main'complete"; ## sub complete { local($text, $_, $start) = @_; ## ## return commands which may match if at the beginning.... ## return grep(/^$text/, 'cat', 'finger') if $start == 0; ## return &rl_filename_list($text) if /^cat\b/; ## return &my_namelist($text) if /^finger\b/; ## return grep(/^text/, 'this', 'that','other') if /^status\b/; ## (); ## } ## Of course, a real completion function would be more robust, but you ## get the idea (I hope). ## ## ## List possible completions ## sub F_PossibleCompletions { &complete_internal('?'); } ## ## List possible completions ## sub F_InsertPossibleCompletions { &complete_internal('*'); } ## ## Do a completion operation. ## If the last thing we did was a completion operation, we'll ## now list the options available (under normal emacs mode). ## ## Under TcshCompleteMode, each contiguous subsequent completion operation ## lists another of the possible options. ## ## Returns true if a completion was done, false otherwise, so vi completion ## routines can test it. ## sub F_Complete { if ($lastcommand eq 'F_Complete') { if ($var_TcshCompleteMode && @tcsh_complete_selections > 0) { substr($line, $tcsh_complete_start, $tcsh_complete_len) = $tcsh_complete_selections[0]; $D -= $tcsh_complete_len; $tcsh_complete_len = length($tcsh_complete_selections[0]); $D += $tcsh_complete_len; push(@tcsh_complete_selections, shift(@tcsh_complete_selections)); } else { &complete_internal('?') or return; } } else { @tcsh_complete_selections = (); &complete_internal("\t") or return; } 1; } ## ## The meat of command completion. Patterned closely after GNU's. ## ## The supposedly partial word at the cursor is "completed" as per the ## single argument: ## "\t" complete as much of the word as is unambiguous ## "?" list possibilities. ## "*" replace word with all possibilities. (who would use this?) ## ## A few notable variables used: ## $rl_completer_word_break_characters ## -- characters in this string break a word. ## $rl_special_prefixes ## -- but if in this string as well, remain part of that word. ## ## Returns true if a completion was done, false otherwise, so vi completion ## routines can test it. ## sub complete_internal { my $what_to_do = shift; my ($point, $end) = ($D, $D); # In vi mode, complete if the cursor is at the *end* of a word, not # after it. ($point++, $end++) if $Vi_mode; if ($point) { ## Not at the beginning of the line; Isolate the word to be completed. 1 while (--$point && (-1 == index($rl_completer_word_break_characters, substr($line, $point, 1)))); # Either at beginning of line or at a word break. # If at a word break (that we don't want to save), skip it. $point++ if ( (index($rl_completer_word_break_characters, substr($line, $point, 1)) != -1) && (index($rl_special_prefixes, substr($line, $point, 1)) == -1) ); } my $text = substr($line, $point, $end - $point); $rl_completer_terminator_character = ' '; @matches = &completion_matches($rl_completion_function,$text,$line,$point); if (@matches == 0) { return &F_Ding; } elsif ($what_to_do eq "\t") { my $replacement = shift(@matches); $replacement .= $rl_completer_terminator_character if @matches == 1; &F_Ding if @matches != 1; if ($var_TcshCompleteMode) { @tcsh_complete_selections = (@matches, $text); $tcsh_complete_start = $point; $tcsh_complete_len = length($replacement); } if ($replacement ne '') { substr($line, $point, $end-$point) = $replacement; $D = $D - ($end - $point) + length($replacement); } } elsif ($what_to_do eq '?') { shift(@matches); ## remove prepended common prefix local $\ = ''; print $term_OUT "\n\r"; # print "@matches\n\r"; &pretty_print_list (@matches); $force_redraw = 1; } elsif ($what_to_do eq '*') { shift(@matches); ## remove common prefix. local $" = $rl_completer_terminator_character; my $replacement = "@matches$rl_completer_terminator_character"; substr($line, $point, $end-$point) = $replacement; ## insert all. $D = $D - ($end - $point) + length($replacement); } else { warn "\r\n[Internal error]"; return &F_Ding; } 1; } ## ## completion_matches(func, text, line, start) ## ## FUNC is a function to call as FUNC(TEXT, LINE, START) ## where TEXT is the item to be completed ## LINE is the whole command line, and ## START is the starting index of TEXT in LINE. ## The FUNC should return a list of items that might match. ## ## completion_matches will return that list, with the longest common ## prefix prepended as the first item of the list. Therefor, the list ## will either be of zero length (meaning no matches) or of 2 or more..... ## ## Works with &rl_basic_commands. Return items from @rl_basic_commands ## that start with the pattern in $text. sub use_basic_commands { my ($text, $line, $start) = @_; return () if $start != 0; grep(/^$text/, @rl_basic_commands); } sub completion_matches { my ($func, $text, $line, $start) = @_; ## get the raw list my @matches; #print qq/\r\neval("\@matches = &$func(\$text, \$line, \$start)\n\r/;#DEBUG #eval("\@matches = &$func(\$text, \$line, \$start);1") || warn "$@ "; @matches = &$func($text, $line, $start); ## if anything returned , find the common prefix among them if (@matches) { my $prefix = $matches[0]; my $len = length($prefix); for ($i = 1; $i < @matches; $i++) { next if substr($matches[$i], 0, $len) eq $prefix; $prefix = substr($prefix, 0, --$len); last if $len == 0; $i--; ## retry this one to see if the shorter one matches. } unshift(@matches, $prefix); ## make common prefix the first thing. } @matches; } ## ## For use in passing to completion_matches(), returns a list of ## filenames that begin with the given pattern. The user of this package ## can set $rl_completion_function to 'rl_filename_list' to restore the ## default of filename matching if they'd changed it earlier, either ## directly or via &rl_basic_commands. ## sub rl_filename_list { my $pattern = $_[0]; my @files = (<$pattern*>); if ($var_CompleteAddsuffix) { foreach (@files) { if (-l $_) { $_ .= '@'; } elsif (-d _) { $_ .= '/'; } elsif (-x _) { $_ .= '*'; } elsif (-S _ || -p _) { $_ .= '='; } } } return @files; } ## ## For use by the user of the package. Called with a list of possible ## commands, will allow command completion on those commands, but only ## for the first word on a line. ## For example: &rl_basic_commands('set', 'quit', 'type', 'run'); ## ## This is for people that want quick and simple command completion. ## A more thoughtful implementation would set $rl_completion_function ## to a routine that would look at the context of the word being completed ## and return the appropriate possibilities. ## sub rl_basic_commands { @rl_basic_commands = @_; $rl_completion_function = 'use_basic_commands'; } ## ## Print an array in columns like ls -C. Originally based on stuff ## (lsC2.pl) by utashiro@sran230.sra.co.jp (Kazumasa Utashiro). ## sub pretty_print_list { my @list = @_; return unless @list; my ($lines, $columns, $mark, $index); ## find width of widest entry my $maxwidth = 0; grep(length > $maxwidth && ($maxwidth = length), @list); $maxwidth++; $columns = $maxwidth >= $rl_screen_width ? 1 : int($rl_screen_width / $maxwidth); ## if there's enough margin to interspurse among the columns, do so. $maxwidth += int(($rl_screen_width % $maxwidth) / $columns); $lines = int((@list + $columns - 1) / $columns); $columns-- while ((($lines * $columns) - @list + 1) > $lines); $mark = $#list - $lines; local $\ = ''; for ($l = 0; $l < $lines; $l++) { for ($index = $l; $index <= $mark; $index += $lines) { printf("%-$ {maxwidth}s", $list[$index]); } print $term_OUT $list[$index] if $index <= $#list; print $term_OUT "\n\r"; } } ##----------------- Vi Routines -------------------------------- sub F_ViAcceptLine { &F_AcceptLine(); &F_ViInput(); } # Repeat the most recent one of these vi commands: # # a A c C d D i I p P r R s S x X ~ # sub F_ViRepeatLastCommand { my($count) = @_; return &F_Ding if !$Last_vi_command; my @lastcmd = @$Last_vi_command; # Multiply @lastcmd's numeric arg by $count. unless ($count == 1) { my $n = ''; while (@lastcmd and $lastcmd[0] =~ /^\d$/) { $n *= 10; $n += shift(@lastcmd); } $count *= $n unless $n eq ''; unshift(@lastcmd, split(//, $count)); } push(@Pending, @lastcmd); } sub F_ViMoveCursor { my($count, $ord) = @_; my $new_cursor = &get_position($count, $ord, undef, $Vi_move_patterns); return &F_Ding if !defined $new_cursor; $D = $new_cursor; } sub F_ViFindMatchingParens { # Move to the first parens at or after $D my $old_d = $D; &forward_scan(1, q/[^[\](){}]*/); my $parens = substr($line, $D, 1); my $mate_direction = { '(' => [ ')', 1 ], '[' => [ ']', 1 ], '{' => [ '}', 1 ], ')' => [ '(', -1 ], ']' => [ '[', -1 ], '}' => [ '{', -1 ], }->{$parens}; return &F_Ding() unless $mate_direction; my($mate, $direction) = @$mate_direction; my $lvl = 1; while ($lvl) { last if !$D && ($direction < 0); &F_ForwardChar($direction); last if &at_end_of_line; my $c = substr($line, $D, 1); if ($c eq $parens) { $lvl++; } elsif ($c eq $mate) { $lvl--; } } if ($lvl) { # We didn't find a match $D = $old_d; return &F_Ding(); } } sub F_ViForwardFindChar { &do_findchar(1, 1, @_); } sub F_ViBackwardFindChar { &do_findchar(-1, 0, @_); } sub F_ViForwardToChar { &do_findchar(1, 0, @_); } sub F_ViBackwardToChar { &do_findchar(-1, 1, @_); } sub F_ViMoveCursorTo { &do_findchar(1, -1, @_); } sub F_ViMoveCursorFind { &do_findchar(1, 0, @_); } sub F_ViRepeatFindChar { my($n) = @_; return &F_Ding if !defined $Last_findchar; &findchar(@$Last_findchar, $n); } sub F_ViInverseRepeatFindChar { my($n) = @_; return &F_Ding if !defined $Last_findchar; my($c, $direction, $offset) = @$Last_findchar; &findchar($c, -$direction, $offset, $n); } sub do_findchar { my($direction, $offset, $n) = @_; my $c = &getc_with_pending; $c = &getc_with_pending if $c eq "\cV"; return &F_ViCommandMode if $c eq "\e"; $Last_findchar = [$c, $direction, $offset]; &findchar($c, $direction, $offset, $n); } sub findchar { my($c, $direction, $offset, $n) = @_; my $old_d = $D; while ($n) { last if !$D && ($direction < 0); &F_ForwardChar($direction); last if &at_end_of_line; my $char = substr($line, $D, 1); $n-- if substr($line, $D, 1) eq $c; } if ($n) { # Not found $D = $old_d; return &F_Ding; } &F_ForwardChar($offset); } sub F_ViMoveToColumn { my($n) = @_; $D = 0; my $col = 1; while (!&at_end_of_line and $col < $n) { my $c = substr($line, $D, 1); if ($c eq "\t") { $col += 7; $col -= ($col % 8) - 1; } else { $col++; } $D += &CharSize($D); } } sub start_dot_buf { my($count, $ord) = @_; $Dot_buf = [pack('c', $ord)]; unshift(@$Dot_buf, split(//, $count)) if $count > 1; $Dot_state = savestate(); } sub end_dot_buf { # We've recognized an editing command # Save the command keystrokes for use by '.' $Last_vi_command = $Dot_buf; undef $Dot_buf; # Save the pre-command state for use by 'u' and 'U'; $Vi_undo_state = $Dot_state; $Vi_undo_all_state = $Dot_state if !$Vi_undo_all_state; # Make sure the current line is treated as new line for history purposes. $rl_HistoryIndex = $#rl_History + 1; } sub save_dot_buf { &start_dot_buf(@_); &end_dot_buf; } sub F_ViUndo { return &F_Ding unless defined $Vi_undo_state; my $state = savestate(); &getstate($Vi_undo_state); $Vi_undo_state = $state; } sub F_ViUndoAll { $Vi_undo_state = $Vi_undo_all_state; &F_ViUndo; } sub F_ViChange { my($count, $ord) = @_; &start_dot_buf(@_); &do_delete($count, $ord, $Vi_change_patterns) || return(); &vi_input_mode; } sub F_ViDelete { my($count, $ord) = @_; &start_dot_buf(@_); &do_delete($count, $ord, $Vi_delete_patterns); &end_dot_buf; } sub do_delete { my($count, $ord, $poshash) = @_; my $other_end = &get_position($count, undef, $ord, $poshash); return &F_Ding if !defined $other_end; if ($other_end < 0) { # dd - delete entire line &kill_text(0, length($line), 1); } else { &kill_text($D, $other_end, 1); } 1; # True return value } sub F_ViDeleteChar { my($count) = @_; &save_dot_buf(@_); my $other_end = $D + $count; $other_end = length($line) if $other_end > length($line); &kill_text($D, $other_end, 1); } sub F_ViBackwardDeleteChar { my($count) = @_; &save_dot_buf(@_); my $other_end = $D - $count; $other_end = 0 if $other_end < 0; &kill_text($other_end, $D, 1); $D = $other_end; } ## ## Prepend line with '#', add to history, and clear the input buffer ## (this feature was borrowed from ksh). ## sub F_SaveLine { local $\ = ''; $line = '#'.$line; &redisplay(); print $term_OUT "\r\n"; &add_line_to_history; $line_for_revert = ''; &get_line_from_history(scalar @rl_History); &F_ViInput() if $Vi_mode; } # # Come here if we see a non-positioning keystroke when a positioning # keystroke is expected. # sub F_ViNonPosition { # Not a positioning command - undefine the cursor to indicate the error # to get_position(). undef $D; } # # Come here if we see , but *not* an arrow key or other # mapped sequence, when a positioning keystroke is expected. # sub F_ViPositionEsc { my($count, $ord) = @_; # We got in vipos mode. Put back onto the # input stream and terminate the positioning command. unshift(@Pending, pack('c', $ord)); &F_ViNonPosition; } # Interpret vi positioning commands sub get_position { my ($count, $ord, $fullline_ord, $poshash) = @_; # Manipulate a copy of the cursor, not the real thing local $D = $D; # $ord (first character of positioning command) is an optional argument. $ord = ord(&getc_with_pending) if !defined $ord; # Detect double character (for full-line operation, e.g. dd) return -1 if defined $fullline_ord and $ord == $fullline_ord; my $re = $poshash->{$ord}; if ($re) { my $c = pack('c', $ord); if (lc($c) eq 'b') { &backward_scan($count, $re); } else { &forward_scan($count, $re); } } else { # Move the local copy of the cursor &do_command($var_EditingMode{'vipos'}, $count, $ord); } # Return the new cursor (undef if illegal command) $D; } ## ## Go to first non-space character of line. ## sub F_ViFirstWord { $D = 0; &forward_scan(1, q{\s+}); } sub forward_scan { my($count, $re) = @_; while ($count--) { last unless substr($line, $D) =~ m{^($re)}; $D += length($1); } } sub backward_scan { my($count, $re) = @_; while ($count--) { last unless substr($line, 0, $D) =~ m{($re)$}; $D -= length($1); } } # Note: like the emacs case transforms, this doesn't work for # two-byte characters. sub F_ViToggleCase { my($count) = @_; &save_dot_buf(@_); while ($count-- > 0) { substr($line, $D, 1) =~ tr/A-Za-z/a-zA-Z/; &F_ForwardChar(1); if (&at_end_of_line) { &F_BackwardChar(1); last; } } } # Go to the numbered history line, as listed by the 'H' command, i.e. the # current $line is line 1, the youngest line in @rl_History is 2, etc. sub F_ViHistoryLine { my($n) = @_; &get_line_from_history(@rl_History - $n + 1); } sub get_line_from_history { my($n) = @_; return &F_Ding if $n < 0 or $n > @rl_History; return if $n == $rl_HistoryIndex; # If we're moving from the currently-edited line, save it for later. $line_for_revert = $line if $rl_HistoryIndex == @rl_History; # Get line from history buffer (or from saved edit line). $line = ($n == @rl_History) ? $line_for_revert : $rl_History[$n]; $D = $Vi_mode ? 0 : length $line; # Subsequent 'U' will bring us back to this point. $Vi_undo_all_state = savestate() if $Vi_mode; $rl_HistoryIndex = $n; } sub F_PrintHistory { my($count) = @_; $count = 20 if $count == 1; # Default - assume 'H', not '1H' my $end = $rl_HistoryIndex + $count/2; $end = @rl_History if $end > @rl_History; my $start = $end - $count + 1; $start = 0 if $start < 0; my $lmh = length $rl_MaxHistorySize; my $lspace = ' ' x ($lmh+3); my $hdr = "$lspace-----"; $hdr .= " (Use ESC UP to retrieve command ) -----" unless $Vi_mode; $hdr .= " (Use 'G' to retrieve command ) -----" if $Vi_mode; local ($\, $,) = ('',''); print "\n$hdr\n"; print $lspace, ". . .\n" if $start > 0; my $i; my $shift = ($Vi_mode != 0); for $i ($start .. $end) { print + ($i == $rl_HistoryIndex) ? '>' : ' ', sprintf("%${lmh}d: ", @rl_History - $i + $shift), ($i < @rl_History) ? $rl_History[$i] : ($i == $rl_HistoryIndex) ? $line : $line_for_revert, "\n"; } print $lspace, ". . .\n" if $end < @rl_History; print "$hdr\n"; &force_redisplay(); &F_ViInput() if $line eq '' && $Vi_mode; } # Redisplay the line, without attempting any optimization sub force_redisplay { local $force_redraw = 1; &redisplay(@_); } # Search history for matching string. As with vi in nomagic mode, the # ^, $, \<, and \> positional assertions, the \* quantifier, the \. # character class, and the \[ character class delimiter all have special # meaning here. sub F_ViSearch { my($n, $ord) = @_; my $c = pack('c', $ord); my $str = &get_vi_search_str($c); if (!defined $str) { # Search aborted by deleting the '/' at the beginning of the line return &F_ViInput() if $line eq ''; return(); } # Null string repeats last search if ($str eq '') { return &F_Ding unless defined $Vi_search_re; } else { # Convert to a regular expression. Interpret $str Like vi in nomagic # mode: '^', '$', '\<', and '\>' positional assertions, '\*' # quantifier, '\.' and '\[]' character classes. my @chars = ($str =~ m{(\\?.)}g); my(@re, @tail); unshift(@re, shift(@chars)) if @chars and $chars[0] eq '^'; push (@tail, pop(@chars)) if @chars and $chars[-1] eq '$'; my $in_chclass; my %chmap = ( '\<' => '\b(?=\w)', '\>' => '(?<=\w)\b', '\*' => '*', '\[' => '[', '\.' => '.', ); my $ch; foreach $ch (@chars) { if ($in_chclass) { # Any backslashes in vi char classes are literal push(@re, "\\") if length($ch) > 1; push(@re, $ch); $in_chclass = 0 if $ch =~ /\]$/; } else { push(@re, (length $ch == 2) ? ($chmap{$ch} || $ch) : ($ch =~ /^\w$/) ? $ch : ("\\", $ch)); $in_chclass = 1 if $ch eq '\['; } } my $re = join('', @re, @tail); $Vi_search_re = q{$re}; } local $reverse = $Vi_search_reverse = ($c eq '/') ? 1 : 0; &do_vi_search(); } sub F_ViRepeatSearch { my($n, $ord) = @_; my $c = pack('c', $ord); return &F_Ding unless defined $Vi_search_re; local $reverse = $Vi_search_reverse; $reverse ^= 1 if $c eq 'N'; &do_vi_search(); } ## returns a new $i or -1 if not found. sub vi_search { my ($i) = @_; return -1 if $i < 0 || $i > $#rl_History; ## for safety while (1) { return $i if $rl_History[$i] =~ /$Vi_search_re/; if ($reverse) { return -1 if $i-- == 0; } else { return -1 if $i++ == $#rl_History; } } } sub do_vi_search { my $incr = $reverse ? -1 : 1; my $i = &vi_search($rl_HistoryIndex + $incr); return &F_Ding if $i < 0; # Not found. $rl_HistoryIndex = $i; ($D, $line) = (0, $rl_History[$rl_HistoryIndex]); } # Using local $line, $D, and $prompt, get and return the string to search for. sub get_vi_search_str { my($c) = @_; local $prompt = $prompt . $c; local ($line, $D) = ('', 0); &redisplay(); # Gather a search string in our local $line. while ($lastcommand ne 'F_ViEndSearch') { &do_command($var_EditingMode{'visearch'}, 1, ord(&getc_with_pending)); &redisplay(); # We've backspaced past beginning of line return undef if !defined $line; } $line; } sub F_ViEndSearch {} sub F_ViSearchBackwardDeleteChar { if ($line eq '') { # Backspaced past beginning of line - terminate search mode undef $line; } else { &F_BackwardDeleteChar(@_); } } ## ## Kill entire line and enter input mode ## sub F_ViChangeEntireLine { &start_dot_buf(@_); kill_text(0, length($line), 1); &vi_input_mode; } ## ## Kill characters and enter input mode ## sub F_ViChangeChar { &start_dot_buf(@_); &F_DeleteChar(@_); &vi_input_mode; } sub F_ViReplaceChar { &start_dot_buf(@_); my $c = &getc_with_pending; $c = &getc_with_pending if $c eq "\cV"; # ctrl-V return &F_ViCommandMode if $c eq "\e"; &end_dot_buf; local $InsertMode = 0; local $D = $D; # Preserve cursor position &F_SelfInsert(1, ord($c)); } ## ## Kill from cursor to end of line and enter input mode ## sub F_ViChangeLine { &start_dot_buf(@_); &F_KillLine(@_); &vi_input_mode; } sub F_ViDeleteLine { &save_dot_buf(@_); &F_KillLine(@_); } sub F_ViPut { my($count) = @_; &save_dot_buf(@_); my $text2add = $KillBuffer x $count; my $ll = length($line); $D++; $D = $ll if $D > $ll; substr($line, $D, 0) = $KillBuffer x $count; $D += length($text2add) - 1; } sub F_ViPutBefore { &save_dot_buf(@_); &TextInsert($_[0], $KillBuffer); } sub F_ViYank { my($count, $ord) = @_; my $pos = &get_position($count, undef, $ord, $Vi_yank_patterns); &F_Ding if !defined $pos; if ($pos < 0) { # yy &F_ViYankLine; } else { my($from, $to) = ($pos > $D) ? ($D, $pos) : ($pos, $D); $KillBuffer = substr($line, $from, $to-$from); } } sub F_ViYankLine { $KillBuffer = $line; } sub F_ViInput { @_ = (1, ord('i')) if !@_; &start_dot_buf(@_); &vi_input_mode; } sub F_ViBeginInput { &start_dot_buf(@_); &F_BeginningOfLine; &vi_input_mode; } sub F_ViReplaceMode { &start_dot_buf(@_); $InsertMode = 0; $var_EditingMode = $var_EditingMode{'vi'}; $Vi_mode = 1; } sub vi_input_mode { $InsertMode = 1; $var_EditingMode = $var_EditingMode{'vi'}; $Vi_mode = 1; } # The previous keystroke was an escape, but the sequence was not recognized # as a mapped sequence (like an arrow key). Enter vi comand mode and # process this keystroke. sub F_ViAfterEsc { my($n, $ord) = @_; &F_ViCommandMode; &do_command($var_EditingMode, 1, $ord); } sub F_ViAppend { &start_dot_buf(@_); &vi_input_mode; &F_ForwardChar; } sub F_ViAppendLine { &start_dot_buf(@_); &vi_input_mode; &F_EndOfLine; } sub F_ViCommandMode { $var_EditingMode = $var_EditingMode{'vicmd'}; $Vi_mode = 1; } sub F_ViAcceptInsert { local $in_accept_line = 1; &F_ViEndInsert; &F_ViAcceptLine; } sub F_ViEndInsert { if ($Dot_buf) { if ($line eq '' and $Dot_buf->[0] eq 'i') { # We inserted nothing into an empty $line - assume it was a # &F_ViInput() call with no arguments, and don't save command. undef $Dot_buf; } else { # Regardless of which keystroke actually terminated this insert # command, replace it with an in the dot buffer. @{$Dot_buf}[-1] = "\e"; &end_dot_buf; } } &F_ViCommandMode; # Move cursor back to the last inserted character, but not when # we're about to accept a line of input &F_BackwardChar(1) unless $in_accept_line; } sub F_ViDigit { my($count, $ord) = @_; my $n = 0; my $ord0 = ord('0'); while (1) { $n *= 10; $n += $ord - $ord0; my $c = &getc_with_pending; return unless defined $c; $ord = ord($c); last unless $c =~ /^\d$/; } $n *= $count; # So 2d3w deletes six words $n = $rl_max_numeric_arg if $n > $rl_max_numeric_arg; &do_command($var_EditingMode, $n, $ord); } sub F_ViComplete { my($n, $ord) = @_; $Dot_state = savestate(); # Completion is undo-able undef $Dot_buf; # but not redo-able my $ch; while (1) { &F_Complete() or return; # Vi likes the cursor one character right of where emacs like it. &F_ForwardChar(1); &force_redisplay(); # Look ahead to the next input keystroke. $ch = &getc_with_pending(); last unless ord($ch) == $ord; # Not a '\' - quit. # Another '\' was typed - put the cursor back where &F_Complete left # it, and try again. &F_BackwardChar(1); $lastcommand = 'F_Complete'; # Play along with &F_Complete's kludge } unshift(@Pending, $ch); # Unget the lookahead keystroke # Successful completion - enter input mode with cursor beyond end of word. &vi_input_mode; } sub F_ViInsertPossibleCompletions { $Dot_state = savestate(); # Completion is undo-able undef $Dot_buf; # but not redo-able &complete_internal('*') or return; # Successful completion - enter input mode with cursor beyond end of word. &F_ForwardChar(1); &vi_input_mode; } sub F_ViPossibleCompletions { # List possible completions &complete_internal('?'); # Enter input mode with cursor where we left off. &F_ForwardChar(1); &vi_input_mode; } sub F_SetMark { $rl_mark = $D; pos $line = $rl_mark; $line_rl_mark = $rl_HistoryIndex; $force_redraw = 1; } sub F_ExchangePointAndMark { return F_Ding unless $line_rl_mark == $rl_HistoryIndex; ($rl_mark, $D) = ($D, $rl_mark); pos $line = $rl_mark; $D = length $line if $D > length $line; $force_redraw = 1; } sub F_KillRegion { return F_Ding unless $line_rl_mark == $rl_HistoryIndex; $rl_mark = length $line if $rl_mark > length $line; kill_text($rl_mark, $D, 1); $line_rl_mark = -1; # Disable mark } sub F_CopyRegionAsKill { return F_Ding unless $line_rl_mark == $rl_HistoryIndex; $rl_mark = length $line if $rl_mark > length $line; my ($s, $e) = ($rl_mark, $D); ($s, $e) = ($e, $s) if $s > $e; $ThisCommandKilledText = 1 + $s; $KillBuffer = '' if !$LastCommandKilledText; $KillBuffer .= substr($line, $s, $e - $s); } sub clipboard_set { my $in = shift; if ($^O eq 'os2') { eval { require OS2::Process; OS2::Process::ClipbrdText_set($in); # Do not disable \r\n-conversion 1 } and return; } elsif ($^O eq 'MSWin32') { eval { require Win32::Clipboard; Win32::Clipboard::Set($in); 1 } and return; } my $mess; if ($ENV{RL_CLCOPY_CMD}) { $mess = "Writing to pipe `$ENV{RL_CLCOPY_CMD}'"; open COPY, "| $ENV{RL_CLCOPY_CMD}" or warn("$mess: $!"), return; } elsif (defined $ENV{HOME}) { $mess = "Writing to file `$ENV{HOME}/.rl_cutandpaste'"; open COPY, "> $ENV{HOME}/.rl_cutandpaste" or warn("$mess: $!"), return; } else { return; } print COPY $in; close COPY or warn("$mess: closing $!"); } sub F_CopyRegionAsKillClipboard { return clipboard_set($line) unless $line_rl_mark == $rl_HistoryIndex; &F_CopyRegionAsKill; clipboard_set($KillBuffer); } sub F_KillRegionClipboard { &F_KillRegion; clipboard_set($KillBuffer); } sub F_YankClipboard { remove_selection(); my $in; if ($^O eq 'os2') { eval { require OS2::Process; $in = OS2::Process::ClipbrdText(); $in =~ s/\r\n/\n/g; # With old versions, or what? } } elsif ($^O eq 'MSWin32') { eval { require Win32::Clipboard; $in = Win32::Clipboard::GetText(); $in =~ s/\r\n/\n/g; # is this needed? } } else { my $mess; if ($ENV{RL_PASTE_CMD}) { $mess = "Reading from pipe `$ENV{RL_PASTE_CMD}'"; open PASTE, "$ENV{RL_PASTE_CMD} |" or warn("$mess: $!"), return; } elsif (defined $ENV{HOME}) { $mess = "Reading from file `$ENV{HOME}/.rl_cutandpaste'"; open PASTE, "< $ENV{HOME}/.rl_cutandpaste" or warn("$mess: $!"), return; } if ($mess) { local $/; $in = ; close PASTE or warn("$mess, closing: $!"); } } if (defined $in) { $in =~ s/\n+$//; return &TextInsert($_[0], $in); } &TextInsert($_[0], $KillBuffer); } sub F_BeginUndoGroup { push @undoGroupS, $#undo; } sub F_EndUndoGroup { return F_Ding unless @undoGroupS; my $last = pop @undoGroupS; return unless $#undo > $last + 1; my $now = pop @undo; $#undo = $last; push @undo, $now; } sub F_DoNothing { # E.g., reset digit-argument 1; } sub F_ForceMemorizeDigitArgument { $memorizedArg = shift; } sub F_MemorizeDigitArgument { return if defined $memorizedArg; $memorizedArg = shift; } sub F_UnmemorizeDigitArgument { $memorizedArg = undef; } sub F_MemorizePos { $memorizedPos = $D; } # It is assumed that F_MemorizePos was called, then something was inserted, # then F_MergeInserts is called with a prefix argument to multiply # insertion by sub F_MergeInserts { my $n = shift; return F_Ding unless defined $memorizedPos and $n > 0; my ($b, $e) = ($memorizedPos, $D); ($b, $e) = ($e, $b) if $e < $b; if ($n) { substr($line, $e, 0) = substr($line, $b, $e - $b) x ($n - 1); } else { substr($line, $b, $e - $b) = ''; } $D = $b + ($e - $b) * $n; } sub F_ResetDigitArgument { return F_Ding unless defined $memorizedArg; my $in = &getc_with_pending; return unless defined $in; my $ord = ord $in; local(*KeyMap) = $var_EditingMode; &do_command(*KeyMap, $memorizedArg, $ord); } sub F_BeginPasteGroup { my $c = shift; $memorizedArg = $c unless defined $memorizedArg; F_BeginUndoGroup(1); $memorizedPos = $D; } sub F_EndPasteGroup { my $c = $memorizedArg; undef $memorizedArg; $c = 1 unless defined $c; F_MergeInserts($c); F_EndUndoGroup(1); } sub F_BeginEditGroup { $memorizedArg = shift; F_BeginUndoGroup(1); } sub F_EndEditGroup { undef $memorizedArg; F_EndUndoGroup(1); } 1; __END__ EekBoek-2.02.04/lib/EB/CPAN/Term/ReadLine/Perl.pm0000555000076500007650000001002512165465617016441 0ustar jvjvpackage Term::ReadLine::Perl; use Carp; @ISA = qw(Term::ReadLine::Stub Term::ReadLine::Compa Term::ReadLine::Perl::AU); #require 'readline.pl'; $VERSION = $VERSION = 1.0303; sub readline { shift; #my $in = &readline::readline(@_); #$loaded = defined &Term::ReadKey::ReadKey; #print STDOUT "\nrl=`$in', loaded = `$loaded'\n"; #if (ref \$in eq 'GLOB') { # Bug under debugger # ($in = "$in") =~ s/^\*(\w+::)+//; #} #print STDOUT "rl=`$in'\n"; #$in; } #sub addhistory {} *addhistory = \&AddHistory; #$term; $readline::minlength = 1; # To peacify -w $readline::rl_readline_name = undef; # To peacify -w $readline::rl_basic_word_break_characters = undef; # To peacify -w sub new { if (defined $term) { warn "Cannot create second readline interface, falling back to dumb.\n"; return Term::ReadLine::Stub::new(@_); } shift; # Package if (@_) { if ($term) { warn "Ignoring name of second readline interface.\n" if defined $term; shift; } else { $readline::rl_readline_name = shift; # Name } } if (!@_) { if (!defined $term) { ($IN,$OUT) = Term::ReadLine->findConsole(); # Old Term::ReadLine did not have a workaround for a bug in Win devdriver $IN = 'CONIN$' if $^O eq 'MSWin32' and "\U$IN" eq 'CON'; open IN, # A workaround for another bug in Win device driver (($IN eq 'CONIN$' and $^O eq 'MSWin32') ? "+< $IN" : "< $IN") or croak "Cannot open $IN for read"; open(OUT,">$OUT") || croak "Cannot open $OUT for write"; $readline::term_IN = \*IN; $readline::term_OUT = \*OUT; } } else { if (defined $term and ($term->IN ne $_[0] or $term->OUT ne $_[1]) ) { croak "Request for a second readline interface with different terminal"; } $readline::term_IN = shift; $readline::term_OUT = shift; } eval {require Term::ReadLine::readline}; die $@ if $@; # The following is here since it is mostly used for perl input: # $readline::rl_basic_word_break_characters .= '-:+/*,[])}'; $term = bless [$readline::term_IN,$readline::term_OUT]; unless ($ENV{PERL_RL} and $ENV{PERL_RL} =~ /\bo\w*=0/) { local $Term::ReadLine::termcap_nowarn = 1; # With newer Perls local $SIG{__WARN__} = sub {}; # With older Perls $term->ornaments(1); } return $term; } sub newTTY { my ($self, $in, $out) = @_; $readline::term_IN = $self->[0] = $in; $readline::term_OUT = $self->[1] = $out; my $sel = select($out); $| = 1; # for DB::OUT select($sel); } sub ReadLine {'Term::ReadLine::Perl'} sub MinLine { my $old = $readline::minlength; $readline::minlength = $_[1] if @_ == 2; return $old; } sub SetHistory { shift; @readline::rl_History = @_; $readline::rl_HistoryIndex = @readline::rl_History; } sub GetHistory { @readline::rl_History; } sub AddHistory { shift; push @readline::rl_History, @_; $readline::rl_HistoryIndex = @readline::rl_History + @_; } %features = (appname => 1, minline => 1, autohistory => 1, getHistory => 1, setHistory => 1, addHistory => 1, preput => 1, attribs => 1, 'newTTY' => 1, tkRunning => Term::ReadLine::Stub->Features->{'tkRunning'}, ornaments => Term::ReadLine::Stub->Features->{'ornaments'}, ); sub Features { \%features; } # my %attribs; tie %attribs, 'Term::ReadLine::Perl::Tie' or die ; sub Attribs { \%attribs; } sub DESTROY {} package Term::ReadLine::Perl::AU; sub AUTOLOAD { { $AUTOLOAD =~ s/.*:://; } # preserve match data my $name = "readline::rl_$AUTOLOAD"; die "Unknown method `$AUTOLOAD' in Term::ReadLine::Perl" unless exists $readline::{"rl_$AUTOLOAD"}; *$AUTOLOAD = sub { shift; &$name }; goto &$AUTOLOAD; } package Term::ReadLine::Perl::Tie; sub TIEHASH { bless {} } sub DESTROY {} sub STORE { my ($self, $name) = (shift, shift); $ {'readline::rl_' . $name} = shift; } sub FETCH { my ($self, $name) = (shift, shift); $ {'readline::rl_' . $name}; } package Term::ReadLine::Compa; sub get_c { my $self = shift; getc($self->[0]); } sub get_line { my $self = shift; my $fh = $self->[0]; scalar <$fh>; } 1; EekBoek-2.02.04/lib/EB/CPAN/Carp/0000755000076500007650000000000012165465617013475 5ustar jvjvEekBoek-2.02.04/lib/EB/CPAN/Carp/Assert.pm0000444000076500007650000003660712165465617015306 0ustar jvjvpackage Carp::Assert; require 5.004; use strict qw(subs vars); use Exporter; use vars qw(@ISA $VERSION %EXPORT_TAGS); BEGIN { $VERSION = '0.20'; @ISA = qw(Exporter); %EXPORT_TAGS = ( NDEBUG => [qw(assert affirm should shouldnt DEBUG)], ); $EXPORT_TAGS{DEBUG} = $EXPORT_TAGS{NDEBUG}; Exporter::export_tags(qw(NDEBUG DEBUG)); } # constant.pm, alas, adds too much load time (yes, I benchmarked it) sub REAL_DEBUG () { 1 } # CONSTANT sub NDEBUG () { 0 } # CONSTANT # Export the proper DEBUG flag according to if :NDEBUG is set. # Also export noop versions of our routines if NDEBUG sub noop { undef } sub noop_affirm (&;$) { undef }; sub import { my $env_ndebug = exists $ENV{PERL_NDEBUG} ? $ENV{PERL_NDEBUG} : $ENV{'NDEBUG'}; if( grep(/^:NDEBUG$/, @_) or $env_ndebug ) { my $caller = caller; foreach my $func (grep !/^DEBUG$/, @{$EXPORT_TAGS{'NDEBUG'}}) { if( $func eq 'affirm' ) { *{$caller.'::'.$func} = \&noop_affirm; } else { *{$caller.'::'.$func} = \&noop; } } *{$caller.'::DEBUG'} = \&NDEBUG; } else { *DEBUG = *REAL_DEBUG; Carp::Assert->_export_to_level(1, @_); } } # 5.004's Exporter doesn't have export_to_level. sub _export_to_level { my $pkg = shift; my $level = shift; (undef) = shift; # XXX redundant arg my $callpkg = caller($level); $pkg->export($callpkg, @_); } sub unimport { *DEBUG = *NDEBUG; push @_, ':NDEBUG'; goto &import; } # Can't call confess() here or the stack trace will be wrong. sub _fail_msg { my($name) = shift; my $msg = 'Assertion'; $msg .= " ($name)" if defined $name; $msg .= " failed!\n"; return $msg; } =head1 NAME Carp::Assert - executable comments =head1 SYNOPSIS # Assertions are on. use Carp::Assert; $next_sunrise_time = sunrise(); # Assert that the sun must rise in the next 24 hours. assert(($next_sunrise_time - time) < 24*60*60) if DEBUG; # Assert that your customer's primary credit card is active affirm { my @cards = @{$customer->credit_cards}; $cards[0]->is_active; }; # Assertions are off. no Carp::Assert; $next_pres = divine_next_president(); # Assert that if you predict Dan Quayle will be the next president # your crystal ball might need some polishing. However, since # assertions are off, IT COULD HAPPEN! shouldnt($next_pres, 'Dan Quayle') if DEBUG; =head1 DESCRIPTION =begin testing BEGIN { local %ENV = %ENV; delete @ENV{qw(PERL_NDEBUG NDEBUG)}; require Carp::Assert; Carp::Assert->import; } local %ENV = %ENV; delete @ENV{qw(PERL_NDEBUG NDEBUG)}; =end testing "We are ready for any unforseen event that may or may not occur." - Dan Quayle Carp::Assert is intended for a purpose like the ANSI C library assert.h. If you're already familiar with assert.h, then you can probably skip this and go straight to the FUNCTIONS section. Assertions are the explict expressions of your assumptions about the reality your program is expected to deal with, and a declaration of those which it is not. They are used to prevent your program from blissfully processing garbage inputs (garbage in, garbage out becomes garbage in, error out) and to tell you when you've produced garbage output. (If I was going to be a cynic about Perl and the user nature, I'd say there are no user inputs but garbage, and Perl produces nothing but...) An assertion is used to prevent the impossible from being asked of your code, or at least tell you when it does. For example: =for example begin # Take the square root of a number. sub my_sqrt { my($num) = shift; # the square root of a negative number is imaginary. assert($num >= 0); return sqrt $num; } =for example end =for example_testing is( my_sqrt(4), 2, 'my_sqrt example with good input' ); ok( !eval{ my_sqrt(-1); 1 }, ' and pukes on bad' ); The assertion will warn you if a negative number was handed to your subroutine, a reality the routine has no intention of dealing with. An assertion should also be used as something of a reality check, to make sure what your code just did really did happen: open(FILE, $filename) || die $!; @stuff = ; @stuff = do_something(@stuff); # I should have some stuff. assert(@stuff > 0); The assertion makes sure you have some @stuff at the end. Maybe the file was empty, maybe do_something() returned an empty list... either way, the assert() will give you a clue as to where the problem lies, rather than 50 lines down at when you wonder why your program isn't printing anything. Since assertions are designed for debugging and will remove themelves from production code, your assertions should be carefully crafted so as to not have any side-effects, change any variables, or otherwise have any effect on your program. Here is an example of a bad assertation: assert($error = 1 if $king ne 'Henry'); # Bad! It sets an error flag which may then be used somewhere else in your program. When you shut off your assertions with the $DEBUG flag, $error will no longer be set. Here's another example of B use: assert($next_pres ne 'Dan Quayle' or goto Canada); # Bad! This assertion has the side effect of moving to Canada should it fail. This is a very bad assertion since error handling should not be placed in an assertion, nor should it have side-effects. In short, an assertion is an executable comment. For instance, instead of writing this # $life ends with a '!' $life = begin_life(); you'd replace the comment with an assertion which B the comment. $life = begin_life(); assert( $life =~ /!$/ ); =for testing my $life = 'Whimper!'; ok( eval { assert( $life =~ /!$/ ); 1 }, 'life ends with a bang' ); =head1 FUNCTIONS =over 4 =item B assert(EXPR) if DEBUG; assert(EXPR, $name) if DEBUG; assert's functionality is effected by compile time value of the DEBUG constant, controlled by saying C or C. In the former case, assert will function as below. Otherwise, the assert function will compile itself out of the program. See L for details. =for testing { package Some::Other; no Carp::Assert; ::ok( eval { assert(0) if DEBUG; 1 } ); } Give assert an expression, assert will Carp::confess() if that expression is false, otherwise it does nothing. (DO NOT use the return value of assert for anything, I mean it... really!). =for testing ok( eval { assert(1); 1 } ); ok( !eval { assert(0); 1 } ); The error from assert will look something like this: Assertion failed! Carp::Assert::assert(0) called at prog line 23 main::foo called at prog line 50 =for testing eval { assert(0) }; like( $@, '/^Assertion failed!/', 'error format' ); like( $@, '/Carp::Assert::assert\(0\) called at/', ' with stack trace' ); Indicating that in the file "prog" an assert failed inside the function main::foo() on line 23 and that foo() was in turn called from line 50 in the same file. If given a $name, assert() will incorporate this into your error message, giving users something of a better idea what's going on. assert( Dogs->isa('People'), 'Dogs are people, too!' ) if DEBUG; # Result - "Assertion (Dogs are people, too!) failed!" =for testing eval { assert( Dogs->isa('People'), 'Dogs are people, too!' ); }; like( $@, '/^Assertion \(Dogs are people, too!\) failed!/', 'names' ); =cut sub assert ($;$) { unless($_[0]) { require Carp; Carp::confess( _fail_msg($_[1]) ); } return undef; } =item B affirm BLOCK if DEBUG; affirm BLOCK $name if DEBUG; Very similar to assert(), but instead of taking just a simple expression it takes an entire block of code and evaluates it to make sure its true. This can allow more complicated assertions than assert() can without letting the debugging code leak out into production and without having to smash together several statements into one. =for example begin affirm { my $customer = Customer->new($customerid); my @cards = $customer->credit_cards; grep { $_->is_active } @cards; } "Our customer has an active credit card"; =for example end =for testing my $foo = 1; my $bar = 2; eval { affirm { $foo == $bar } }; like( $@, '/\$foo == \$bar/' ); affirm() also has the nice side effect that if you forgot the C suffix its arguments will not be evaluated at all. This can be nice if you stick affirm()s with expensive checks into hot loops and other time-sensitive parts of your program. If the $name is left off and your Perl version is 5.6 or higher the affirm() diagnostics will include the code begin affirmed. =cut sub affirm (&;$) { unless( eval { &{$_[0]}; } ) { my $name = $_[1]; if( !defined $name ) { eval { require B::Deparse; $name = B::Deparse->new->coderef2text($_[0]); }; $name = 'code display non-functional on this version of Perl, sorry' if $@; } require Carp; Carp::confess( _fail_msg($name) ); } return undef; } =item B =item B should ($this, $shouldbe) if DEBUG; shouldnt($this, $shouldntbe) if DEBUG; Similar to assert(), it is specially for simple "this should be that" or "this should be anything but that" style of assertions. Due to Perl's lack of a good macro system, assert() can only report where something failed, but it can't report I failed or I. should() and shouldnt() can produce more informative error messages: Assertion ('this' should be 'that'!) failed! Carp::Assert::should('this', 'that') called at moof line 29 main::foo() called at moof line 58 So this: should($this, $that) if DEBUG; is similar to this: assert($this eq $that) if DEBUG; except for the better error message. Currently, should() and shouldnt() can only do simple eq and ne tests (respectively). Future versions may allow regexes. =cut sub should ($$) { unless($_[0] eq $_[1]) { require Carp; &Carp::confess( _fail_msg("'$_[0]' should be '$_[1]'!") ); } return undef; } sub shouldnt ($$) { unless($_[0] ne $_[1]) { require Carp; &Carp::confess( _fail_msg("'$_[0]' shouldn't be that!") ); } return undef; } # Sorry, I couldn't resist. sub shouldn't ($$) { # emacs cperl-mode madness #' sub { my $env_ndebug = exists $ENV{PERL_NDEBUG} ? $ENV{PERL_NDEBUG} : $ENV{'NDEBUG'}; if( $env_ndebug ) { return undef; } else { shouldnt($_[0], $_[1]); } } =back =head1 Debugging vs Production Because assertions are extra code and because it is sometimes necessary to place them in 'hot' portions of your code where speed is paramount, Carp::Assert provides the option to remove its assert() calls from your program. So, we provide a way to force Perl to inline the switched off assert() routine, thereby removing almost all performance impact on your production code. no Carp::Assert; # assertions are off. assert(1==1) if DEBUG; DEBUG is a constant set to 0. Adding the 'if DEBUG' condition on your assert() call gives perl the cue to go ahead and remove assert() call from your program entirely, since the if conditional will always be false. # With C the assert() has no impact. for (1..100) { assert( do_some_really_time_consuming_check ) if DEBUG; } If C gets too annoying, you can always use affirm(). # Once again, affirm() has (almost) no impact with C for (1..100) { affirm { do_some_really_time_consuming_check }; } Another way to switch off all asserts, system wide, is to define the NDEBUG or the PERL_NDEBUG environment variable. You can safely leave out the "if DEBUG" part, but then your assert() function will always execute (and its arguments evaluated and time spent). To get around this, use affirm(). You still have the overhead of calling a function but at least its arguments will not be evaluated. =head1 Differences from ANSI C assert() is intended to act like the function from ANSI C fame. Unfortunately, due to Perl's lack of macros or strong inlining, it's not nearly as unobtrusive. Well, the obvious one is the "if DEBUG" part. This is cleanest way I could think of to cause each assert() call and its arguments to be removed from the program at compile-time, like the ANSI C macro does. Also, this version of assert does not report the statement which failed, just the line number and call frame via Carp::confess. You can't do C because $a and $b will probably be lexical, and thus unavailable to assert(). But with Perl, unlike C, you always have the source to look through, so the need isn't as great. =head1 EFFICIENCY With C (or NDEBUG) and using the C suffixes on all your assertions, Carp::Assert has almost no impact on your production code. I say almost because it does still add some load-time to your code (I've tried to reduce this as much as possible). If you forget the C on an C, C or C, its arguments are still evaluated and thus will impact your code. You'll also have the extra overhead of calling a subroutine (even if that subroutine does nothing). Forgetting the C on an C is not so bad. While you still have the overhead of calling a subroutine (one that does nothing) it will B evaluate its code block and that can save alot. Try to remember the B. =head1 ENVIRONMENT =over 4 =item NDEBUG Defining NDEBUG switches off all assertions. It has the same effect as changing "use Carp::Assert" to "no Carp::Assert" but it effects all code. =item PERL_NDEBUG Same as NDEBUG and will override it. Its provided to give you something which won't conflict with any C programs you might be working on at the same time. =back =head1 BUGS, CAVETS and other MUSINGS =head2 Conflicts with C The C module exports an C routine which will conflict with C if both are used in the same namespace. If you are using both together, prevent C from exporting like so: use POSIX (); use Carp::Assert; Since C exports way too much, you should be using it like that anyway. =head2 C and C<$^S> affirm() mucks with the expression's caller and it is run in an eval so anything that checks $^S will be wrong. =head2 C Yes, there is a C routine. It mostly works, but you B put the C after it. =head2 missing C It would be nice if we could warn about missing C. =head1 SEE ALSO L is a new module available in 5.9.0 which provides assertions which can be enabled/disabled at compile time for real, no C necessary. =head1 COPYRIGHT Copyright 2001-2007 by Michael G Schwern Eschwern@pobox.comE. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See F =head1 AUTHOR Michael G Schwern =cut return q|You don't just EAT the largest turnip in the world!|; EekBoek-2.02.04/lib/EB/CPAN/Locale/0000755000076500007650000000000012165465617014007 5ustar jvjvEekBoek-2.02.04/lib/EB/CPAN/Locale/gettext_pp.pm0000444000076500007650000005722012165465617016534 0ustar jvjv # vim: set autoindent shiftwidth=4 tabstop=4: # $Id$ # Pure Perl implementation of Uniforum message translation. # Copyright (C) 2002-2009 Guido Flohr , # all rights reserved. # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. package Locale::gettext_pp; use strict; require 5.004; use vars qw ($__gettext_pp_default_dir $__gettext_pp_textdomain $__gettext_pp_domain_bindings $__gettext_pp_domain_codeset_bindings $__gettext_pp_domains $__gettext_pp_recoders $__gettext_pp_unavailable_dirs $__gettext_pp_domain_cache $__gettext_pp_alias_cache $__gettext_pp_context_glue); use locale; BEGIN { $__gettext_pp_textdomain = 'messages'; $__gettext_pp_domain_bindings = {}; $__gettext_pp_domain_codeset_bindings = {}; $__gettext_pp_domains = {}; $__gettext_pp_recoders = {}; $__gettext_pp_unavailable_dirs = {}; $__gettext_pp_domain_cache = {}; $__gettext_pp_alias_cache = {}; # The separator between msgctxt and msgid in a .mo file. */ $__gettext_pp_context_glue = "\004"; $__gettext_pp_default_dir = ''; for my $dir (qw (/usr/share/locale /usr/local/share/locale)) { if (-d $dir) { $__gettext_pp_default_dir = $dir; last; } } } BEGIN { require POSIX; require Exporter; use IO::Handle; require Locale::Recode; local $@; my ($has_messages, $five_ok); $has_messages = eval '&POSIX::LC_MESSAGES'; unless (defined $has_messages && length $has_messages) { $five_ok = ! grep {my $x = eval "&POSIX::$_" || 0; $x eq '5';} qw (LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_ALL); if ($five_ok) { $five_ok = POSIX::setlocale (5, ''); } } if (defined $has_messages && length $has_messages) { eval <<'EOF'; sub LC_MESSAGES() { local $!; # Do not clobber errno! return &POSIX::LC_MESSAGES; } EOF } elsif ($five_ok) { eval <<'EOF'; sub LC_MESSAGES() { local $!; # Do not clobber errno! # Hack: POSIX.pm deems LC_MESSAGES an invalid macro until # Perl 5.8.0. However, on LC_MESSAGES should be 5 ... return 5; } EOF } else { eval <<'EOF'; sub LC_MESSAGES() { local $!; # Do not clobber errno! # This fallback value is widely used, # when LC_MESSAGES is not available. return 1729; } EOF } } use vars qw (%EXPORT_TAGS @EXPORT_OK @ISA $VERSION); %EXPORT_TAGS = (locale_h => [ qw ( gettext dgettext dcgettext ngettext dngettext dcngettext pgettext dpgettext dcpgettext npgettext dnpgettext dcnpgettext textdomain bindtextdomain bind_textdomain_codeset ) ], libintl_h => [ qw (LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_ALL) ], ); @EXPORT_OK = qw (gettext dgettext dcgettext ngettext dngettext dcngettext pgettext dpgettext dcpgettext npgettext dnpgettext dcnpgettext textdomain bindtextdomain bind_textdomain_codeset nl_putenv LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_ALL); @ISA = qw (Exporter); my $has_nl_langinfo; sub __load_catalog; sub __load_domain; sub __locale_category; sub LC_NUMERIC() { &POSIX::LC_NUMERIC; } sub LC_CTYPE() { &POSIX::LC_CTYPE; } sub LC_TIME() { &POSIX::LC_TIME; } sub LC_COLLATE() { &POSIX::LC_COLLATE; } sub LC_MONETARY() { &POSIX::LC_MONETARY; } sub LC_ALL() { &POSIX::LC_ALL; } sub textdomain(;$) { my $new_domain = shift; $__gettext_pp_textdomain = $new_domain if defined $new_domain && length $new_domain; return $__gettext_pp_textdomain; } sub bindtextdomain($;$) { my ($domain, $directory) = @_; my $retval; if (defined $domain && length $domain) { if (defined $directory && length $directory) { $retval = $__gettext_pp_domain_bindings->{$domain} = $directory; } elsif (exists $__gettext_pp_domain_bindings->{$domain}) { $retval = $__gettext_pp_domain_bindings->{$domain}; } else { $retval = $__gettext_pp_default_dir; } $retval = '/usr/share/locale' unless defined $retval && length $retval; return $retval; } else { return; } } sub bind_textdomain_codeset($;$) { my ($domain, $codeset) = @_; if (defined $domain && length $domain) { if (defined $codeset && length $codeset) { return $__gettext_pp_domain_codeset_bindings->{$domain} = $codeset; } elsif (exists $__gettext_pp_domain_codeset_bindings->{$domain}) { return $__gettext_pp_domain_codeset_bindings->{$domain}; } } return; } sub gettext($) { my ($msgid) = @_; return dcnpgettext ('', undef, $msgid, undef, undef, undef); } sub dgettext($$) { my ($domainname, $msgid) = @_; return dcnpgettext ($domainname, undef, $msgid, undef, undef, undef); } sub dcgettext($$$) { my ($domainname, $msgid, $category) = @_; return dcnpgettext ($domainname, undef, $msgid, undef, undef, undef); } sub ngettext($$$) { my ($msgid, $msgid_plural, $n) = @_; return dcnpgettext ('', undef, $msgid, $msgid_plural, $n, undef); } sub dngettext($$$$) { my ($domainname, $msgid, $msgid_plural, $n) = @_; return dcnpgettext ($domainname, undef, $msgid, $msgid_plural, $n, undef); } sub dcngettext($$$$$) { my ($domainname, $msgid, $msgid_plural, $n, $category) = @_; return dcnpgettext ($domainname, undef, $msgid, $msgid_plural, $n, , $category); } sub pgettext($$) { my ($msgctxt, $msgid) = @_; return dcnpgettext ('', $msgctxt, $msgid, undef, undef, undef); } sub dpgettext($$$) { my ($domainname, $msgctxt, $msgid) = @_; return dcnpgettext ($domainname, $msgctxt, $msgid, undef, undef, undef); } sub dcpgettext($$$$) { my ($domainname, $msgctxt, $msgid, $category) = @_; return dcnpgettext ($domainname, $msgctxt, $msgid, undef, undef, undef); } sub npgettext($$$$) { my ($msgctxt, $msgid, $msgid_plural, $n) = @_; return dcnpgettext ('', $msgctxt, $msgid, $msgid_plural, $n, undef); } sub dnpgettext($$$$$) { my ($domainname, $msgctxt, $msgid, $msgid_plural, $n) = @_; return dcnpgettext ($domainname, $msgctxt, $msgid, $msgid_plural, $n, undef); } sub dcnpgettext($$$$$$) { my ($domainname, $msgctxt, $msgid, $msgid_plural, $n, $category) = @_; return unless defined $msgid; my $plural = defined $msgid_plural; my $msg_ctxt_id = defined $msgctxt ? join($__gettext_pp_context_glue, ($msgctxt, $msgid)) : $msgid; local $!; # Do not clobber errno! # This is also done in __load_domain but we need a proper value. $domainname = $__gettext_pp_textdomain unless defined $domainname && length $domainname; # Category is always LC_MESSAGES (other categories are ignored). my $category_name = 'LC_MESSAGES'; $category = LC_MESSAGES; my $domains = __load_domain ($domainname, $category, $category_name); my @trans = (); my $domain; my $found; foreach my $this_domain (@$domains) { if ($this_domain && defined $this_domain->{messages}->{$msg_ctxt_id}) { @trans = @{$this_domain->{messages}->{$msg_ctxt_id}}; shift @trans; $domain = $this_domain; $found = 1; last; } } @trans = ($msgid, $msgid_plural) unless @trans; my $trans = $trans[0]; if ($plural) { if ($domain) { my $nplurals = 0; ($nplurals, $plural) = &{$domain->{plural_func}} ($n); $plural = 0 unless defined $plural; $nplurals = 0 unless defined $nplurals; $plural = 0 if $nplurals <= $plural; } else { $plural = $n != 1 || 0; } $trans = $trans[$plural] if defined $trans[$plural]; } if ($found && defined $domain->{po_header}->{charset}) { my $input_codeset = $domain->{po_header}->{charset}; # Convert into output charset. my $output_codeset = $__gettext_pp_domain_codeset_bindings->{$domainname}; $output_codeset = $ENV{OUTPUT_CHARSET} unless defined $output_codeset; $output_codeset = __get_codeset ($category, $category_name, $domain->{locale_id}) unless defined $output_codeset; unless (defined $output_codeset) { # Still no point. my $lc_ctype = __locale_category (POSIX::LC_CTYPE(), 'LC_CTYPE'); $output_codeset = $1 if $lc_ctype =~ /^[a-z]{2}(?:_[A-Z]{2})?\.([^@]+)/; } # No point. :-( $output_codeset = $domain->{po_header}->{charset} unless defined $output_codeset; if (exists $__gettext_pp_domain_cache->{$output_codeset}) { $output_codeset = $__gettext_pp_domain_cache->{$output_codeset}; } else { $output_codeset = 'utf-8' if lc $output_codeset eq 'utf8'; $output_codeset = $__gettext_pp_domain_cache->{$output_codeset} = Locale::Recode->resolveAlias ($output_codeset); } if (defined $output_codeset && $output_codeset ne $domain->{po_header}->{charset}) { # We have to convert. my $recoder; if (exists $__gettext_pp_recoders->{$input_codeset}->{$output_codeset}) { $recoder = $__gettext_pp_recoders->{$input_codeset}->{$output_codeset}; } else { $recoder = $__gettext_pp_recoders->{$input_codeset}->{$output_codeset} = Locale::Recode->new (from => $input_codeset, to => $output_codeset, ); } $recoder->recode ($trans); } } return $trans; } sub nl_putenv ($) { my ($envspec) = @_; return unless defined $envspec; return unless length $envspec; return if substr ($envspec, 0, 1) eq '='; my ($var, $value) = split /=/, $envspec, 2; # In Perl we *could* set empty environment variables even under # MS-DOS, but for compatibility reasons, we implement the # brain-damaged behavior of the Microsoft putenv(). if ($^O eq 'MSWin32') { $value = '' unless defined $value; if (length $value) { $ENV{$var} = $value; } else { delete $ENV{$var}; } } else { if (defined $value) { $ENV{$var} = $value; } else { delete $ENV{$var}; } } return 1; } sub __load_domain { my ($domainname, $category, $category_name) = @_; $domainname = $__gettext_pp_textdomain unless defined $domainname && length $domainname; my $dir = bindtextdomain ($domainname, ''); $dir = $__gettext_pp_default_dir unless defined $dir && length $dir; return [] unless defined $dir && length $dir; my @locales; my $cache_key; if (defined $ENV{LANGUAGE} && length $ENV{LANGUAGE}) { @locales = split /:/, $ENV{LANGUAGE}; $cache_key = $ENV{LANGUAGE}; } else { @locales = $cache_key = __locale_category ($category, $category_name); } # Have we looked that one up already? my $domains = $__gettext_pp_domain_cache->{$dir}->{$cache_key}->{$category_name}->{$domainname}; if (@locales && !defined $domains) { my @dirs = ($dir); my @tries = (@locales); my %locale_lookup = map { $_ => $_ } @tries; foreach my $locale (@locales) { if ($locale =~ /^([a-z][a-z]) (?:(_[A-Z][A-Z])? (\.[-_A-Za-z0-9]+)? )? (\@[-_A-Za-z0-9]+)?$/x) { if (defined $3) { defined $2 ? push @tries, $1 . $2 . $3 : push @tries, $1 . $3; } if (defined $2) { push @tries, $1 . $2; $locale_lookup{$1 . $2} = $locale; } if (defined $1) { push @tries, $1 if defined $1; $locale_lookup{$1} = $locale; } } } push @dirs, $__gettext_pp_default_dir if $__gettext_pp_default_dir && $dir ne $__gettext_pp_default_dir; my %seen = (); foreach my $basedir (@dirs) { foreach my $try (@tries) { my $fulldir = "$basedir/$try/$category_name"; next if $seen{$fulldir}++; # If the cache for unavailable directories is removed, # the three lines below should be replaced by: # 'next unless -d $fulldir;' next if $__gettext_pp_unavailable_dirs->{$fulldir}; ++$__gettext_pp_unavailable_dirs->{$fulldir} and next unless -d $fulldir; my $domain = __load_catalog $fulldir, $domainname; next unless $domain; unless (defined $domain->{po_header}->{charset} && length $domain->{po_header}->{charset} && $try =~ /^(?:[a-z][a-z]) (?:(?:_[A-Z][A-Z])? (\.[-_A-Za-z0-9]+)? )? (?:\@[-_A-Za-z0-9]+)?$/x) { $domain->{po_header}->{charset} = $1; } if (defined $domain->{po_header}->{charset}) { $domain->{po_header}->{charset} = Locale::Recode->resolveAlias ($domain->{po_header}->{charset}); } $domain->{locale_id} = $locale_lookup{$try}; push @$domains, $domain; } } $__gettext_pp_domain_cache->{$dir}->{$cache_key}->{$category_name}->{$domainname} = $domains; } $domains = [] unless defined $domains; return $domains; } sub __load_catalog { my ($directory, $domainname) = @_; my $filename = "$directory/$domainname.mo"; # Alternatively we could check the filename for evil characters ... # (Important for CGIs). return unless -f $filename && -r $filename; local $/; local *HANDLE; open HANDLE, "<$filename" or return; binmode HANDLE; my $raw = ; close HANDLE; # Corrupted? return if ! defined $raw || length $raw < 28; my $filesize = length $raw; # Read the magic number in order to determine the byte order. my $domain = {}; my $unpack = 'N'; $domain->{potter} = unpack $unpack, substr $raw, 0, 4; if ($domain->{potter} == 0xde120495) { $unpack = 'V'; } elsif ($domain->{potter} != 0x950412de) { return; } my $domain_unpack = $unpack x 6; my ($revision, $num_strings, $msgids_off, $msgstrs_off, $hash_size, $hash_off) = unpack (($unpack x 6), substr $raw, 4, 24); return unless $revision == 0; # Invalid revision number. $domain->{revision} = $revision; $domain->{num_strings} = $num_strings; $domain->{msgids_off} = $msgids_off; $domain->{msgstrs_off} = $msgstrs_off; $domain->{hash_size} = $hash_size; $domain->{hash_off} = $hash_off; return if $msgids_off + 4 * $num_strings > $filesize; return if $msgstrs_off + 4 * $num_strings > $filesize; my @orig_tab = unpack (($unpack x (2 * $num_strings)), substr $raw, $msgids_off, 8 * $num_strings); my @trans_tab = unpack (($unpack x (2 * $num_strings)), substr $raw, $msgstrs_off, 8 * $num_strings); my $messages = {}; for (my $count = 0; $count < 2 * $num_strings; $count += 2) { my $orig_length = $orig_tab[$count]; my $orig_offset = $orig_tab[$count + 1]; my $trans_length = $trans_tab[$count]; my $trans_offset = $trans_tab[$count + 1]; return if $orig_offset + $orig_length > $filesize; return if $trans_offset + $trans_length > $filesize; my @origs = split /\000/, substr $raw, $orig_offset, $orig_length; my @trans = split /\000/, substr $raw, $trans_offset, $trans_length; # The singular is the key, the plural plus all translations is the # value. my $msgid = $origs[0]; $msgid = '' unless defined $msgid && length $msgid; my $msgstr = [ $origs[1], @trans ]; $messages->{$msgid} = $msgstr; } $domain->{messages} = $messages; # Try to find po header information. my $po_header = {}; my $null_entry = $messages->{''}->[1]; if ($null_entry) { my @lines = split /\n/, $null_entry; foreach my $line (@lines) { my ($key, $value) = split /:/, $line, 2; $key =~ s/-/_/g; $po_header->{lc $key} = $value; } } $domain->{po_header} = $po_header; if (exists $domain->{po_header}->{content_type}) { my $content_type = $domain->{po_header}->{content_type}; if ($content_type =~ s/.*=//) { $domain->{po_header}->{charset} = $content_type; } } my $code = $domain->{po_header}->{plural_forms} || ''; # Whitespace, locale-independent. my $s = '[ \t\r\n\013\014]'; # Untaint the plural header. # Keep line breaks as is (Perl 5_005 compatibility). if ($code =~ m{^($s* nplurals$s*=$s*[0-9]+ $s*;$s* plural$s*=$s*(?:$s|[-\?\|\&=!<>+*/\%:;a-zA-Z0-9_\(\)])+ )}xms) { $domain->{po_header}->{plural_forms} = $1; } else { $domain->{po_header}->{plural_forms} = ''; } # Determine plural rules. # The leading and trailing space is necessary to be able to match # against word boundaries. my $plural_func; if ($domain->{po_header}->{plural_forms}) { my $code = ' ' . $domain->{po_header}->{plural_forms} . ' '; $code =~ s/([^_a-zA-Z0-9]|\A)([_a-z][_A-Za-z0-9]*)([^_a-zA-Z0-9])/$1\$$2$3/g; $code = "sub { my \$n = shift; my (\$plural, \$nplurals); $code; return (\$nplurals, \$plural ? \$plural : 0); }"; # Now try to evaluate the code. There is no need to run the code in # a Safe compartment. The above substitutions should have destroyed # all evil code. Corrections are welcome! $plural_func = eval $code; undef $plural_func if $@; } # Default is Germanic plural (which is incorrect for French). $plural_func = eval "sub { (2, 1 != shift || 0) }" unless $plural_func; $domain->{plural_func} = $plural_func; return $domain; } sub __locale_category { my ($category, $category_name) = @_; local $@; my $value = eval {POSIX::setlocale ($category)}; # We support only XPG syntax, i. e. # language[_territory[.codeset]][@modifier]. undef $value unless (defined $value && length $value && $value =~ /^[a-z][a-z] (?:_[A-Z][A-Z] (?:\.[-_A-Za-z0-9]+)? )? (?:\@[-_A-Za-z0-9]+)?$/x); unless ($value) { $value = $ENV{LC_ALL}; $value = $ENV{$category_name} unless defined $value && length $value; $value = $ENV{LANG} unless defined $value && length $value; return 'C' unless defined $value && length $value; } return $value if $value ne 'C' && $value ne 'POSIX'; } sub __get_codeset { my ($category, $category_name, $locale_id) = @_; local $@; unless (defined $has_nl_langinfo) { eval { require I18N::Langinfo; }; $has_nl_langinfo = !$@; } if ($has_nl_langinfo) { # Try to set the locale via the specified id. my $saved_locale = eval { POSIX::setlocale (LC_ALL) }; my $saved_lc_all = $ENV{LC_ALL}; # Now try to set the locale via the environment. There is no # point in calling the langinfo routines if this fails. $ENV{LC_ALL} = $locale_id; my $codeset; my $lc_all = eval { POSIX::setlocale (LC_ALL, $locale_id); }; $codeset = I18N::Langinfo::langinfo (I18N::Langinfo::CODESET()) if defined $lc_all; if ($saved_locale) { eval { POSIX::setlocale (LC_ALL, $saved_locale); } } return $codeset; } return; } 1; __END__ =head1 NAME Locale::gettext_pp - Pure Perl Implementation of Uniforum Message Translation =head1 SYNOPSIS use gettext_pp (:locale_h :libintl_h); gettext $msgid; dgettext $domainname, $msgid; dcgettext $domainname, $msgid, LC_MESSAGES; ngettext $msgid, $msgid_plural, $count; dngettext $domainname, $msgid, $msgid_plural, $count; dcngettext $domainname, $msgid, $msgid_plural, $count, LC_MESSAGES; pgettext $msgctxt, $msgid; dpgettext $domainname, $msgctxt, $msgid; dcpgettext $domainname, $msgctxt, $msgid, LC_MESSAGES; npgettext $msgctxt, $msgid, $msgid_plural, $count; dnpgettext $domainname, $msgctxt, $msgid, $msgid_plural, $count; dcnpgettext $domainname, $msgctxt, $msgid, $msgid_plural, $count, LC_MESSAGES; textdomain $domainname; bindtextdomain $domainname, $directory; bind_textdomain_codeset $domainname, $encoding; my $category = LC_CTYPE; my $category = LC_NUMERIC; my $category = LC_TIME; my $category = LC_COLLATE; my $category = LC_MONETARY; my $category = LC_MESSAGES; my $category = LC_ALL; =head1 DESCRIPTION The module B is the low-level interface to message translation according to the Uniforum approach that is for example used in GNU gettext and Sun's Solaris. Normally you should not use this module directly, but the high level interface Locale::TextDomain(3) that provides a much simpler interface. This description is therefore deliberately kept brief. Please refer to the GNU gettext documentation available at L for in-depth and background information on the topic. =head1 FUNCTIONS The module exports by default nothing. Every function has to be imported explicitely or via an export tag (L<"EXPORT TAGS">). =over 4 =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B See L. =item B =item B See L. =back =head1 CONSTANTS You can (maybe) get the same constants from POSIX(3); see there for a detailed description =over 4 =item B =item B =item B =item B =item B =item B =item B See L for more information. =back =head1 EXPORT TAGS This module does not export anything unless explicitely requested. You can import groups of functions via two tags: =over 4 =item B Imports the functions that are normally defined in the C include file F: =over 8 =item B =item B =item B =item B =item B =item B =item B Introduced with libintl-perl 1.17. =item B Introduced with libintl-perl 1.17. =item B Introduced with libintl-perl 1.17. =item B Introduced with libintl-perl 1.17. =item B Introduced with libintl-perl 1.17. =item B Introduced with libintl-perl 1.17. =item B =item B =item B =back =item B Imports the locale category constants: =over 8 =item B =item B =item B =item B =item B =item B =item B =back =back =head1 AUTHOR Copyright (C) 2002-2009, Guido Flohr Eguido@imperia.netE, all rights reserved. See the source code for details. This software is contributed to the Perl community by Imperia (L). =head1 SEE ALSO Locale::TextDomain(3pm), Locale::Messages(3pm), Encode(3pm), perllocale(3pm), POSIX(3pm), perl(1), gettext(1), gettext(3) =cut Local Variables: mode: perl perl-indent-level: 4 perl-continued-statement-offset: 4 perl-continued-brace-offset: 0 perl-brace-offset: -4 perl-brace-imaginary-offset: 0 perl-label-offset: -4 tab-width: 4 End: =cut EekBoek-2.02.04/lib/EB/DB/0000755000076500007650000000000012165465617012354 5ustar jvjvEekBoek-2.02.04/lib/EB/DB/Sqlite.pm0000444000076500007650000001703512165465617014157 0ustar jvjv#! perl # Sqlite.pm -- EekBoek driver for SQLite database # Author : Johan Vromans # Created On : Sat Oct 7 10:10:36 2006 # Last Modified By: Johan Vromans # Last Modified On: Mon Mar 7 23:09:44 2011 # Update Count : 163 # Status : Unknown, Use with caution! package main; our $cfg; package EB::DB::Sqlite; use strict; use warnings; use EB; use DBI; use File::Spec; my $CONCURRENT; sub CONCURRENT() { return $CONCURRENT if defined $CONCURRENT; $CONCURRENT = $cfg->val(__PACKAGE__, "concurrent", 1); } my $dbh; # singleton my $sdb; # singleton, DB for sequences my $dataset; my $trace = $cfg->val(__PACKAGE__, "trace", 0); # API: type type of driver sub type { "SQLite" } sub _dbname { my ($dbname) = @_; $dbname = File::Spec->catfile( $cfg->val(qw(database path)), $dbname ) if $cfg->val(qw(database path), undef); $dbname =~ s;(^|.*[/\\])(ebsqlite_|eekboek_)?([^/\\]+)$;${1}ebsqlite_$3;; return $dbname; } sub _dsn { my $dsn = "dbi:SQLite:dbname=" . shift; } # API: create a new, empty database. sub create { my ($self, $dbname) = @_; $dbname = _dbname($dbname); # Create (empty) db file. open(my $db, '>', $dbname); close($db); unlink("$dbname-journal") and warn("%".__x("Database journal voor {db} verwijderd", db => $dbname)."\n"); unlink("$dbname-seq") and warn("%".__x("Database sequences voor {db} verwijderd", db => $dbname)."\n"); } # API: connect to an existing database. sub connect { my ($self, $dbname) = @_; croak("?INTERNAL ERROR: connect db without dataset name") unless $dbname; if ( $dataset && $dbh && $dbname eq $dataset ) { return $dbh; } $self->disconnect; $dbname = _dbname($dbname); $cfg->newval(qw(database fullname), $dbname); unless ( -e $dbname ) { die("?".__x("Geen database met naam {name} gevonden", name => $dbname)."\n"); } $dbh = DBI::->connect(_dsn($dbname)) or die("?".__x("Database verbindingsprobleem: {err}", err => $DBI::errstr)."\n"); $dataset = $dbname; if ( CONCURRENT ) { $sdb = DBI::->connect(_dsn($dbname)."-seq") or die("?".__x("Database verbindingsprobleem: {err}", err => $DBI::errstr)."\n"); $sdb->{RaiseError} = 1; $sdb->{AutoCommit} = 0; } else { $sdb = $dbh; } # Our database is UTF8, so deal with it properly. if ( $DBD::SQLite::VERSION ge "1.26_06" ) { $dbh->{sqlite_unicode} = 1; } else { $dbh->{unicode} = 1; } # Create some missing functions. register_functions(); return $dbh; } # API: Disconnect from a database. sub disconnect { my ($self) = @_; return unless $dbh; $dbh->disconnect; $sdb->disconnect if CONCURRENT; undef $dbh; undef $sdb; undef $dataset; } # API: Clear database contents, including tables and such. sub clear { my ($self) = @_; croak("?INTERNAL ERROR: clear db while not connected") unless $dbh; croak("?INTERNAL ERROR: clear db not supperted by this driver"); my $ds = $dataset; $self->disconnect; $self->create($ds); $self->connect($ds); } # API: Setup whatever is needed. sub setup { # setup will be called after the connection to the database has # been established. # Create table for sequences. unless ( $sdb->selectrow_arrayref("SELECT name". " FROM sqlite_master". " WHERE name = 'eb_seq'". " AND type = 'table'") ) { $sdb->do("CREATE TABLE eb_seq". " (name TEXT PRIMARY KEY,". " value INT)"); $sdb->commit if CONCURRENT; } # Clone Accounts table into TAccounts. # This table has the purpose of copying the data from Accounts, so that # data from already completed financial years can be corrected when # creating overviews, such as Balance statements and Result accounts. # This way no backdated calculations need to be made when transitions # to previous financial years are involved. unless ( $dbh->selectrow_arrayref("SELECT name". " FROM sqlite_master". " WHERE name like 'taccounts'". " AND type = 'table'") ) { my $sql = $dbh->selectrow_arrayref("SELECT sql". " FROM sqlite_master". " WHERE name like 'accounts'". " AND type = 'table'")->[0]; $sql =~ s/TABLE Accounts/TABLE TAccounts/; $dbh->do($sql); } # Caller will commit. } # API: Get a array ref with table names (lowcased). sub get_tables { my $self = shift; my @t; foreach ( $dbh->tables ) { # SQLite returns table names with quotes. # Our tables all start with an uppercase letter. next unless /^"(?:main"\.")?([[:upper:]].+)"$/i; push(@t, lc($1)); } \@t; } # API: List available data sources. sub list { [] } ################ Sequences ################ # Currently non-atomic, restricting to single user mode. sub _create_sequence { my ($sn, $value) = (@_, 1); $sdb->do("INSERT INTO eb_seq (name, value) VALUES (?, ?)", {}, $sn, $value); $sdb->commit if CONCURRENT; $value; } sub _get_sequence { my ($seq) = @_; # Get the current (=next) value. my $rr = $sdb->selectrow_arrayref("SELECT value". " FROM eb_seq". " WHERE name = ?", {}, $seq); $rr ? $rr->[0] : undef; } sub _set_sequence { my ($seq, $value) = @_; $sdb->do("UPDATE eb_seq SET value = ? WHERE name = ?", {}, $value, $seq); $sdb->commit if CONCURRENT; return; } # API: Get the next value for a sequence, incrementing it. sub get_sequence { my ($self, $seq) = @_; if ( my $v = _get_sequence($seq) ) { _set_sequence($seq, $v+1); return $v; } _create_sequence($seq, 2); 1; } # API: Set the next value for a sequence. sub set_sequence { my ($self, $seq, $value) = @_; _get_sequence($seq) ? _set_sequence($seq, $value) : _create_sequence($seq, $value); return; } ################ Interactive SQL ################ # API: Interactive SQL. sub isql { my ($self, @args) = @_; my $dbname = $cfg->val(qw(database fullname)); my $cmd = "sqlite3"; my @cmd = ( $cmd ); push(@cmd, $dbname); if ( @args ) { push(@cmd, "@args"); } my $res = system { $cmd } @cmd; # warn(sprintf("=> ret = %02x", $res)."\n") if $res; } ################ PostgreSQL Compatibility ################ # API: feature Can we? sub feature { my ($self, $feat) = @_; $feat = lc($feat); # Known features: # # pgcopy F PostgreSQL fast input copying # prepcache T Statement handles may be cached # filter C SQL filter routine # # Unknown/unsupported features may be ignored. return \&sqlfilter if $feat eq "filter"; return 1 if $feat eq "prepcache"; return 0 if $feat eq "import"; # Return false for all others. return; } sub sqlfilter { local $_ = shift; my (@args) = @_; # No sequences. return if /^(?:create|drop)\s+sequence\b/i; # Constraints are ignored in table defs, but an # explicit alter needs to be skipped. return if /^alter\s+table\b.*\b(add|drop)\s+constraint\b/i; # UNSOLVED: No insert into temp tables. return if /^select\s+\*\s+into\s+temp\b/i; # Fortunately, LIKE behaves mostly like ILIKE. s/\bilike\b/like/gi; return $_; } sub register_functions { $dbh->func("now", 0, \&iso8601date, "create_function"); $dbh->func("sign", 1, sub { defined $_[0] ? $_[0] <=> 0 : 0 }, "create_function"); $dbh->func("int2", 1, sub { 0+$_[0] }, "create_function"); } ################ End PostgreSQL Compatibility ################ 1; EekBoek-2.02.04/lib/EB/DB/Postgres.pm0000444000076500007650000001716212165465617014525 0ustar jvjv#! perl # Postgres.pm -- EekBoek driver for PostgreSQL database # Author : Johan Vromans # Created On : Tue Jan 24 10:43:00 2006 # Last Modified By: Johan Vromans # Last Modified On: Tue Sep 18 13:42:09 2012 # Update Count : 194 # Status : Unknown, Use with caution! package main; our $cfg; package EB::DB::Postgres; use strict; use warnings; use EB; use DBI; use DBD::Pg; my $dbh; # singleton my $dataset; my $trace = $cfg->val(__PACKAGE__, "trace", 0) if $cfg; # API: type type of driver sub type { "PostgreSQL" } sub _dsn { my $dsn = "dbi:Pg:dbname=" . shift; my $t; $dsn .= ";host=" . $t if $t = $cfg->val(qw(database host), undef); $dsn .= ";port=" . $t if $t = $cfg->val(qw(database port), undef); wantarray ? ( $dsn, $cfg->val("database", "user", undef), $cfg->val("database", "password", undef)) : $dsn; } # API: create a new database, reuse an existing one if possible. sub create { my ($self, $dbname) = @_; if ( $dbh && !$dbname ) { # use current DB. $dbh->{RaiseError} = 0; $dbh->{PrintError} = 0; $dbh->{AutoCommit} = 1; $self->clear; $dbh->{RaiseError} = 1; $dbh->{PrintError} = 1; # $dbh->{AutoCommit} = 0; return; } croak("?INTERNAL ERROR: create db while connected") if $dbh; eval { { local($SIG{__WARN__}) = sub {}; $self->connect($dbname); } $dbh->{RaiseError} = 0; $dbh->{PrintError} = 0; $dbh->{AutoCommit} = 1; $self->clear; $self->disconnect; }; return unless $@; die($@) if $@ =~ /UNICODE/; $dbname =~ s/^(?!=eekboek_)/eekboek_/; # Normally, sql treats names as lowcased. By using " " we can # maintain the case of the database name. my $sql = "CREATE DATABASE \"$dbname\""; $sql .= " ENCODING 'UNICODE'"; for ( $cfg->val("database", "user", undef) ) { next unless $_; $sql .= " OWNER $_"; } my $dbh = DBI->connect(_dsn("template1")); my $errstr = $DBI::errstr; if ( $dbh ) { warn("+ $sql\n") if $trace; $dbh->do($sql); $errstr = $DBI::errstr; $dbh->disconnect; return unless $errstr; } die("?".__x("Database probleem: {err}", err => $errstr)."\n"); } # API: connect to an existing database. sub connect { my ($self, $dbname) = @_; croak("?INTERNAL ERROR: connect db without dataset name") unless $dbname; if ( $dataset && $dbh && $dbname eq $dataset ) { return $dbh; } $self->disconnect; $dbname = "eekboek_".$dbname unless $dbname =~ /^eekboek_/; $cfg->newval(qw(database fullname), $dbname); $dbh = DBI::->connect(_dsn($dbname)) or die("?".__x("Database verbindingsprobleem: {err}", err => $DBI::errstr)."\n"); $dataset = $dbname; my $enc = $dbh->selectall_arrayref("SHOW CLIENT_ENCODING")->[0]->[0]; if ( $enc !~ /^unicode|utf8$/i ) { warn("!".__x("Database {name} is niet in UTF-8 maar {enc}", name => $_[1], enc => $enc)."\n"); } $dbh->do("SET CLIENT_ENCODING TO 'UNICODE'"); $dbh->{pg_enable_utf8} = 1; return $dbh; } # API: Disconnect from a database. sub disconnect { my ($self) = @_; return unless $dbh; $dbh->disconnect; undef $dbh; undef $dataset; } # API: Setup whatever is needed. sub setup { } sub clear { my ($self) = @_; croak("?INTERNAL ERROR: clear db while not connected") unless $dbh; for my $tbl ( qw(Boekstukregels Journal Boekjaarbalans Metadata Standaardrekeningen Relaties Boekstukken Dagboeken Boekjaren Constants Accounts Btwtabel Verdichtingen Taccounts) ) { warn("+ DROP TABLE $tbl\n") if $trace; eval { $dbh->do("DROP TABLE $tbl") }; } eval { my $rr = $dbh->selectall_arrayref("SELECT relname". " FROM pg_class". " WHERE relkind = 'S'". ' AND relname LIKE \'%bsk_%_seq\''); foreach my $seq ( @$rr ) { warn("+ DROP SEQUENCE $seq->[0]\n") if $trace; eval { $dbh->do("DROP SEQUENCE $seq->[0]") }; } }; $dbh->commit unless $dbh->{AutoCommit}; } # API: Test db connection. sub test { my $self = shift; my $db = shift; $db = $db ? "eekboek_$db" : "template1"; my $opts = shift || {}; my $d; my $dsn = "dbi:Pg:dbname=$db"; my $t; $dsn .= ";host=" . $t if $t = $opts->{host}; $dsn .= ";port=" . $t if $t = $opts->{port}; eval { $d = DBI->connect( $dsn, $opts->{user} || undef, $opts->{password} || undef, ); }; return $@ if $@; return DBI->errstr unless $d; $d->{RaiseError} = 1; unless ( $db eq "template1" ) { # Check if we really can access the db. eval { $d->do("SELECT * FROM Metadata"); }; return $@ if $@; return DBI->errstr unless $d; } eval { $d->disconnect; }; return; } # API: List available data sources. sub list { my @ds; my $t; local $ENV{PGHOST} = $t if $t = $cfg->val(qw(database host), undef); local $ENV{PGPORT} = $t if $t = $cfg->val(qw(database port), undef); local $ENV{DBI_USER} = $t if $t = $cfg->val("database", "user", undef); local $ENV{DBI_PASS} = $t if $t = $cfg->val("database", "password", undef); eval { @ds = DBI->data_sources("Pg"); }; # If the list cannot be established, @ds will be (undef). return [] unless defined($ds[0]); my $d = []; foreach ( @ds ) { next unless s/^.*?dbname=eekboek_(.+)//; push( @$d, $1 ); } return $d; } # API: Get a array ref with table names (lowcased). sub get_tables { my $self = shift; my @t; foreach ( $dbh->tables ) { next unless /^public\.(.+)/i; push(@t, lc($1)); } \@t; } ################ Sequences ################ # API: Get the next value for a sequence, incrementing it. sub get_sequence { my ($self, $seq) = @_; croak("?INTERNAL ERROR: get sequence while not connected") unless $dbh; my $rr = $dbh->selectall_arrayref("SELECT nextval('$seq')"); return ($rr && defined($rr->[0]) && defined($rr->[0]->[0])? $rr->[0]->[0] : undef); } # API: Set the next value for a sequence. sub set_sequence { my ($self, $seq, $value) = @_; croak("?INTERNAL ERROR: set sequence while not connected") unless $dbh; # Init a sequence to value. # The next call to get_sequence will return this value. $dbh->do("SELECT setval('$seq', $value, false)"); $value; } ################ Interactive SQL ################ # API: Interactive SQL. sub isql { my ($self, @args) = @_; my $dbname = $cfg->val(qw(database fullname)); my $cmd = "psql"; my @cmd = ( $cmd ); for ( $cfg->val("database", "user", undef) ) { next unless $_; push(@cmd, "-U", $_); } for ( $cfg->val("database", "host", undef) ) { next unless $_; push(@cmd, "-h", $_); } for ( $cfg->val("database", "port", undef) ) { next unless $_; push(@cmd, "-p", $_); } push(@cmd, "-d", $dbname); if ( @args ) { push(@cmd, "-c", "@args"); } my $res = system { $cmd } @cmd; # warn(sprintf("=> ret = %02x", $res)."\n") if $res; } ################ PostgreSQL Compatibility ################ # API: feature Can we? sub feature { my $self = shift; my $feat = lc(shift); # Known features: # # pgcopy F PostgreSQL fast input copying # prepcache T Statement handles may be cached # filter C SQL filter routine # # Unknown/unsupported features may be ignored. if ( $feat eq "pgcopy" ) { return 1 if ($DBD::Pg::VERSION||"0") ge "1.41"; warn("%"."Not using PostgreSQL fast load. DBD::Pg::VERSION = ", ($DBD::Pg::VERSION||"0"), ", needs 1.41 or later\n"); return; } return 1 if $feat eq "prepcache"; return 1 if $feat eq "import"; return 1 if $feat eq "test"; # Return false for all others. return; } ################ End PostgreSQL Compatibility ################ 1; EekBoek-2.02.04/lib/EB/Import.pm0000444000076500007650000001056512165465617013704 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Import.pm -- Import EekBoek administratie # Author : Johan Vromans # Created On : Tue Feb 7 11:56:50 2006 # Last Modified By: Johan Vromans # Last Modified On: Wed May 30 16:07:58 2012 # Update Count : 110 # Status : Unknown, Use with caution! package main; our $cfg; our $dbh; package EB::Import; use strict; use warnings; use EB; use EB::Format; # needs to be setup before we can use Schema my $ident; sub do_import { my ($self, $cmdobj, $opts) = @_; require EB::Tools::Schema; my $dir = $opts->{dir}; if ( defined $dir ) { die("?".__x("Directory {dir} bestaat niet", dir => $dir)."\n") unless -d $dir; die("?".__x("Geen toegang tot directory {dir}", dir => $dir)."\n") unless -r _ || -x _; -r "$dir/schema.dat" or die("?".__x("Bestand \"{file}\" ontbreekt ({err})", file => "schema.dat", err => $!)."\n"); # Do not open these with :encoding(utf-8) -- we'll do it ourselves. open(my $relaties, "<", "$dir/relaties.eb") or die("?".__x("Bestand \"{file}\" ontbreekt ({err})", file => "relaties.eb", err => $!)."\n"); open(my $opening, "<", "$dir/opening.eb") or die("?".__x("Bestand \"{file}\" ontbreekt ({err})", file => "opening.eb", err => $!)."\n"); open(my $mutaties, "<", "$dir/mutaties.eb") or die("?".__x("Bestand \"{file}\" ontbreekt ({err})", file => "mutaties.eb", err => $!)."\n"); # To temporary suspend journaling. my $jnl_state = $cfg->val(qw(preferences journal), undef); # Delete daybook-associated shell functions. $cmdobj->_forget_cmds; # Create DB. $dbh->cleardb if $opts->{clean}; # Schema. EB::Tools::Schema->create("$dir/schema.dat"); $dbh->setup; # Add daybook-associated shell functions. $cmdobj->_plug_cmds; # Relaties, Opening, Mutaties. # Remember: These are executed in LIFO. $cmdobj->attach_lines(["journal --quiet $jnl_state"]) if $jnl_state; $cmdobj->attach_file($mutaties); $cmdobj->attach_file($opening); $cmdobj->attach_file($relaties); $cmdobj->attach_lines(["journal --quiet 0"]) if $jnl_state; return; } my $inp = $opts->{file}; if ( defined $inp ) { # die("?"._T("Import van bestand is nog niet geïmplementeerd")."\n"); eval { require Archive::Zip } or die("?"._T("Module Archive::Zip, nodig voor import van file, is niet beschikbaar")."\n"); open(my $zipf, "<", $inp) or die("?".__x("Bestand \"{file}\" is niet beschikbaar ({err})", file => $inp, err => $!)."\n"); binmode($zipf); my $zip = Archive::Zip->new; my $status = $zip->read($zipf); die("?".__x("Fout {code} tijdens het lezen van {file}", code => $status, file => $inp)."\n") if $status; my $c = $zip->zipfileComment; if ( $c ) { warn("$inp: $c\n"); } my $fail; my $d_schema = $zip->contents("schema.dat"); unless ( $d_schema ) { warn("?".__x("Het schema ontbreekt in bestand {file}", file => $inp)."\n"); $fail++; } my $d_relaties = $zip->contents("relaties.eb"); unless ( $d_relaties ) { warn("?".__x("De relatiegegevens ontbreken in bestand {file}", file => $inp)."\n"); $fail++; } my $d_opening = $zip->contents("opening.eb"); unless ( $d_opening ) { warn("?".__x("De openingsgegevens ontbreken in bestand {file}", file => $inp)."\n"); $fail++; } my $d_mutaties = $zip->contents("mutaties.eb"); unless ( $d_mutaties ) { warn("?".__x("De mutatiegegevens ontbreken in bestand {file}", file => $inp)."\n"); $fail++; } close($zipf); die("?"._T("DE IMPORT IS NIET UITGEVOERD")."\n") if $fail; foreach ( $d_mutaties, $d_relaties, $d_opening, $d_schema ) { # Do not recode, the input loop will do that for us. $_ = [ map { "$_\n" } split(/[\n\r]+/, $_) ]; } # Delete daybook-associated shell functions. $cmdobj->_forget_cmds; eval { #### TODO: Why eval? # Create DB. $dbh->cleardb if $opts->{clean}; # Schema. my @s = @$d_schema; # copy for 2nd pass EB::Tools::Schema->_create1(sub { shift(@$d_schema) }); EB::Tools::Schema->_create2(sub { shift(@s) }); $dbh->setup; # Add daybook-associated shell functions. $cmdobj->_plug_cmds; # Relaties, Opening, Mutaties. In reverse order. $cmdobj->attach_lines($d_mutaties); $cmdobj->attach_lines($d_opening ); $cmdobj->attach_lines($d_relaties); }; return $@; } die("?ASSERT ERROR: missing --dir / --file in Import\n"); } 1; EekBoek-2.02.04/lib/EB/Export.pm0000444000076500007650000002542212165465617013711 0ustar jvjv#! perl -- -*- coding: utf-8 -*- use utf8; # Export.pm -- Export EekBoek administratie # Author : Johan Vromans # Created On : Mon Jan 16 20:47:38 2006 # Last Modified By: Johan Vromans # Last Modified On: Mon Jan 16 15:11:32 2012 # Update Count : 243 # Status : Unknown, Use with caution! package main; our $dbh; our $cfg; package EB::Export; use strict; use warnings; use EB; use EB::Format; use Encode; my $ident; sub export { my ($self, $opts) = @_; my $dir = $opts->{dir}; if ( defined $dir ) { mkdir($dir, 0777) unless -d $dir; die("?".__x("Fout bij aanmaken directory {dir}: {err}", dir => $dir, err => $!)."\n") unless -d $dir; die("?".__x("Geen toegang tot directory {dir}", dir => $dir)."\n") unless -w $dir; $self->_write("$dir/schema.dat", sub { $self->_schema(shift) }); $self->_write("$dir/relaties.eb", sub { print { shift } $self->_relaties }); $self->_write("$dir/opening.eb", sub { print { shift } $self->_opening }); $self->_write("$dir/mutaties.eb", sub { print { shift } $self->_mutaties($opts) }); return; } my $out = $opts->{file}; if ( defined $out ) { eval { require Archive::Zip } or die("?"._T("Module Archive::Zip, nodig voor export naar file, is niet beschikbaar")."\n"); my $zip = Archive::Zip->new(); my $comment = __x("Export van dataset {db} aangemaakt door {id} op {date}", id => $EB::ident, db => $cfg->val(qw(database name)), date => datefmt_full(iso8601date())); $comment .= "\n".__x("Omschrijving: {desc}", desc => $opts->{desc}) if $opts->{desc}; $zip->zipfileComment($comment); my $m; # For the schema, we need a temp file. my ($fh, $tmpname) = Archive::Zip::tempFile(); binmode($fh, ":encoding(utf8)"); $self->_schema($fh); $fh->close; $m = $zip->addFile($tmpname, "schema.dat"); $m->desiredCompressionMethod(8); # The others can be added directly. # Note that the encoding needs to be fixed since there's no IO involved. $m = $zip->addString(_enc($self->_relaties), "relaties.eb"); $m->desiredCompressionMethod(8); $m = $zip->addString(_enc($self->_opening), "opening.eb"); $m->desiredCompressionMethod(8); $m = $zip->addString(_enc($self->_mutaties($opts)), "mutaties.eb"); $m->desiredCompressionMethod(8); my $status = $zip->writeToFileNamed($out); unlink($tmpname); die("?", __x("Fout {status} tijdens het aanmaken van exportbestand {name}", status => $status, name => $out)."\n") if $status; return; } die("?ASSERT ERROR: missing --dir / --file in Export\n"); } sub _enc { my $t; eval { $t = encode( 'utf8', "".$_[0], 1 ); }; if ( $@ ) { warn("?".__x("Geen geldige UTF-8 tekens for ZIP element", ). "\n".$_[0]."\n"); return; } $t; } sub _write { my ($self, $file, $producer) = @_; my $fh; open($fh, ">:encoding(utf-8)", $file) or die("?".__x("Fout bij aanmaken bestand {file}: {err}", file => $file, err => $!)."\n"); $producer->($fh) or die("?".__x("Fout bij schrijven bestand {file}: {err}", file => $file, err => $!)."\n"); close($fh) or die("?".__x("Fout bij afsluiten bestand {file}: {err}", file => $file, err => $!)."\n"); } sub _schema { my ($self, $fh) = @_; use EB::Tools::Schema; EB::Tools::Schema->dump_schema($fh); } sub _quote { my ($t) = @_; $t =~ s/(\\")/\\$1/g; '"'.$t.'"'; } sub _relaties { my ($self) = @_; my $sth = $dbh->sql_exec("SELECT rel_code, rel_desc, rel_debcrd,". " rel_btw_status, dbk_desc, rel_acc_id". " FROM Relaties, Dagboeken". " WHERE rel_ledger = dbk_id". " ORDER BY rel_ledger, rel_btw_status, rel_code"); my $cur_dbk = ""; my $cur_btw = -1; my $out = "# " . __x("{what} voor administratie {adm}", what => _T("Relaties"), adm => $dbh->adm("name")) . "\n" . "# " . __x("Aangemaakt door {id} op {date}", id => $EB::ident, date => datefmt_full(iso8601date())) . "\n" . "# Content-Type: text/plain; charset = UTF-8"; while ( my $rr = $sth->fetchrow_arrayref ) { my ($code, $desc, $debcrd, $btw, $dbk, $acct) = @$rr; if ( $cur_btw != $btw || $cur_dbk ne $dbk ) { $cur_btw = $btw; $cur_dbk = $dbk; $dbk =~ s/[^[:alnum]]/_/g; $out .= "\n\n" if $out; $out .= _xt("cmd:relatie")." --".__xt("cmo:relatie:dagboek")."=".lc($dbk); $out .= " --".__xt("cmo:relatie:btw")."=".lc(BTWTYPES->[$btw]) unless $btw == BTWTYPE_NORMAAL; } $out .= " \\\n "; $out .= sprintf("%-12s %-40s %d", _quote($code), _quote($desc), $acct); } $out .= "\n\n# " . __x("Einde {what}", what => _T("Relaties")) . "\n"; } sub _opening { my ($self) = @_; require EB::Booking::Decode; my $sth; my $out = "# " . __x("{what} voor administratie {adm}", what => _T("Openingsgegevens"), adm => $dbh->adm("name")) . "\n" . "# " . __x("Aangemaakt door {id} op {date}", id => $EB::ident, date => datefmt_full(iso8601date())) . "\n" . "# Content-Type: text/plain; charset = UTF-8\n\n"; $out .= _xt("cmd:adm_naam") . " " . _quote($dbh->adm("name")) . "\n"; my $begin = $dbh->do("SELECT min(bky_begin)". " FROM Boekjaren". " WHERE bky_begin > ( SELECT bky_end FROM Boekjaren WHERE bky_code = ? )", BKY_PREVIOUS); $begin = $begin->[0]; $out .= _xt("cmd:adm_begindatum") . " " . substr($begin, 0, 4) . "\n"; $out .= _xt("cmd:adm_boekjaarcode") . " " . _quote($dbh->lookup($begin, qw(Boekjaren bky_begin bky_code))) . "\n"; $out .= _xt("cmd:adm_btwperiode") . " " . _T(qw(geen jaar x x kwartaal x x x x x x x maand)[$dbh->lookup($begin, qw(Boekjaren bky_begin bky_btwperiod))]). "\n" if $dbh->does_btw; $out .= "\n# " . _T("Openingsbalans") . "\n"; $sth = $dbh->sql_exec("SELECT acc_id, acc_desc, acc_ibalance, acc_debcrd". " FROM Accounts". " WHERE acc_balres". " AND acc_ibalance <> 0". " ORDER BY acc_debcrd DESC, acc_id"); my ($dt, $ct) = (0, 0); my $debcrd; while ( my $rr = $sth->fetchrow_arrayref ) { my ($acc_id, $acc_desc, $acc_balance, $acc_debcrd) = @$rr; next unless $acc_balance; # Export boekhoudkundig saldo (zie EB::Tools::Opening). if ( $acc_balance >= 0 ) { $dt += $acc_balance; } else { $ct -= $acc_balance; } $acc_balance = 0 - $acc_balance unless $acc_debcrd; if ( !defined($debcrd) || $acc_debcrd != $debcrd ) { $out .= "\n# " . ($acc_debcrd ? _T("Debet") : _T("Credit")) . "\n"; } $out .= sprintf("%s %-5s %10s # %s\n", _xt("cmd:adm_balans"), $acc_id, numfmt_plain($acc_balance), $acc_desc); $debcrd = $acc_debcrd; } die("?".__x("Internal error -- unbalance {arg1} <> {arg2}", arg1 => numfmt_plain($dt), arg2 => numfmt_plain($ct))."\n") unless $dt == $ct; $out .= "\n# " . _T("Totaal") . "\n" . _xt("cmd:adm_balanstotaal") . " " . numfmt_plain($dt) . "\n"; $sth = $dbh->sql_exec("SELECT bsk_id". " FROM Boekstukken". " WHERE bsk_date <= ( SELECT bky_end FROM Boekjaren WHERE bky_code = ? )". " ORDER BY bsk_dbk_id, bsk_nr, bsk_date", BKY_PREVIOUS); my $rr = $sth->fetchrow_arrayref; if ( $rr ) { $out .= "\n# "._T("Openstaande posten")."\n\n"; } while ( $rr ) { my ($bsk_id) = @$rr; $out .= "adm_relatie " . EB::Booking::Decode->decode ($bsk_id, { trail => 1, single => 0, btw => 0, bsknr => 1, bky => 1, total => 0, noivbskdesc => 1, debcrd => 0 }) . "\n"; $rr = $sth->fetchrow_arrayref; } $out .= "\n# "._T("Openen van de administratie")."\n\n"._xt("cmd:adm_open")."\n"; $out .= "\n# " . __x("Einde {what}", what => _T("Openingsgegevens")) . "\n"; $out; } sub _mutaties { my ($self, $opts) = @_; my $out = "# " . __x("{what} voor administratie {adm}", what => _T("Boekingen"), adm => $dbh->adm("name")) . "\n" . "# " . __x("Aangemaakt door {id} op {date}", id => $EB::ident, date => datefmt_full(iso8601date())) . "\n" . "# Content-Type: text/plain; charset = UTF-8\n\n"; my @bky; my $sth = $dbh->sql_exec("SELECT bky_code". " FROM Boekjaren". " WHERE bky_begin > ( SELECT bky_end FROM Boekjaren WHERE bky_code = ? )". " ORDER BY bky_code", BKY_PREVIOUS); while ( my $rr = $sth->fetchrow_arrayref ) { push(@bky, $rr->[0]); } my $check_je = sub { my ($bky) = @_; if ( $dbh->lookup($bky, qw(Boekjaren bky_code bky_closed)) ) { $out .= _xt("cmd:jaareinde") . " --" . __xt("cmo:jaareinde:boekjaar") . "=" . _quote($bky) . " --" . __xt("cmo:jaareinde:definitief") . "\n"; } else { $sth = $dbh->sql_exec("SELECT COUNT(*)". " FROM Boekjaarbalans". " WHERE bkb_bky = ?", $bky); my $rr; if ( ($rr = $sth->fetchrow_arrayref) && $rr->[0] ) { $out .= _xt("cmd:jaareinde") . " --" . __xt("cmo:jaareinde:boekjaar") . "=" . _quote($bky) . "\n"; } $sth->finish; } if ( $dbh->does_btw ) { my $bb = $dbh->adm("btwbegin"); my $bke = $dbh->lookup($bky, qw(Boekjaren bky_code bky_end)); my $bkb = $dbh->lookup($bky, qw(Boekjaren bky_code bky_begin)); if ( $bb gt $bkb ) { $bke = parse_date($bb, undef, -1) if $bb le $bke; $out .= _xt("cmd:btwaangifte"). " --" . __xt("cmo:btwaangifte:periode") . "=". datefmt_full($bkb)."-".datefmt_full($bke) . " --" . __xt("cmo:btwaangifte:definitief") . " --" . __xt("cmo:btwaangifte:noreport") . "\n"; } } }; my $cur_bky = $bky[0]; foreach my $bky ( @bky ) { next if $bky eq BKY_PREVIOUS; if ( $cur_bky ne $bky ) { $check_je->($cur_bky); my $bp = $dbh->lookup($bky, qw(Boekjaren bky_code bky_btwperiod)); $out .= "\n# ". _T("Openen nieuw boekjaar") . "\n\n"; $out .= _xt("cmd:adm_boekjaarcode") . " " . _quote($bky) . "\n"; $out .= _xt("cmd:adm_btwperiode") . " " . lc(BTWPERIODES->[$bp]) . "\n" if $bp; $out .= _xt("cmd:adm_open") . "\n"; $cur_bky = $bky; } $out .= _xt("cmd:boekjaar") . " " . _quote($bky) . "\n"; $sth = $dbh->sql_exec("SELECT bsk_id, dbk_id". " FROM Boekstukken, Dagboeken". " WHERE bsk_dbk_id = dbk_id". " AND bsk_bky = ?". " ORDER BY dbk_type, bsk_dbk_id, bsk_nr", $bky); my $cur_dbk = ""; while ( my $rr = $sth->fetchrow_arrayref ) { my ($bsk_id, $dbk_id) = @$rr; if ( $cur_dbk ne $dbk_id ) { $out .= "\n"; $cur_dbk = $dbk_id; } $out .= EB::Booking::Decode->decode ($bsk_id, { trail => 1, d_boekjaar => $bky, bsknr => defined($opts->{bsknr}) ? $opts->{bsknr} : 1, single => $opts->{single} || 0, btw => $opts->{explicit} || 0, total => defined($opts->{totals}) ? $opts->{totals} : 1, debcrd => 0 }) . "\n"; } $out .= "\n"; } $check_je->($cur_bky); $out .= "# " . __x("Einde {what}", what => _T("Boekingen")) . "\n"; $out; } sub _xt { # scm:btw -> scm:vat -> vat my $t = _T(shift); $t =~ s/^.*://; $t; } 1; EekBoek-2.02.04/import/0000755000076500007650000000000012165465617012345 5ustar jvjvEekBoek-2.02.04/import/daviaccount/0000755000076500007650000000000012165465617014645 5ustar jvjvEekBoek-2.02.04/import/daviaccount/exirel.pl0000444000076500007650000002170312165465617016473 0ustar jvjv#!/usr/bin/perl -w # Author : Johan Vromans # Created On : Fri Jun 17 21:31:52 2005 # Last Modified By: Johan Vromans # Last Modified On: Mon Jun 14 21:56:24 2010 # Update Count : 102 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; # Package or program libraries, if appropriate. # $LIBDIR = $ENV{'LIBDIR'} || '/usr/local/lib/sample'; # use lib qw($LIBDIR); # require 'common.pl'; # Package name. my $my_package = 'EekBoek'; # Program name and version. my ($my_name, $my_version) = qw(exirel 1.12); ################ Command line parameters ################ use Getopt::Long 2.13; # Command line options. my $all = 0; # all my $verbose = 0; # verbose processing my $ac5 = 0; # DaviDOS compatibility # Development options (not shown with -help). my $debug = 0; # debugging my $trace = 0; # trace (show process) my $test = 0; # test mode. # Process command line options. app_options(); # Post-processing. $trace |= ($debug || $test); ################ Presets ################ my $TMPDIR = $ENV{TMPDIR} || $ENV{TEMP} || '/usr/tmp'; ################ The Process ################ use Text::CSV_XS; use EB::Config qw(EekBoek); use EB::Globals; unless ( @ARGV ) { foreach ( "DEBITR.CSV", "CREDIT.CSV" ) { if ( -s $_ ) { push(@ARGV, $_); } elsif ( -s lc($_) ) { push(@ARGV, lc($_)); } } } # Load field names from __DATA__. my @debfieldnames; my @crdfieldnames; my $fieldnames = \@debfieldnames; while ( ) { next if /^#/; $fieldnames = \@crdfieldnames, next unless /\S/; my @a = split(/\t/); push(@$fieldnames, $a[1]); } # Load maps, if provided. my $crdmap = -s "crdmap.pl" ? require "crdmap.pl" : {}; my $debmap = -s "debmap.pl" ? require "debmap.pl" : {} ; # Find out which codes are actually used. my %used; my $csv = new Text::CSV_XS ({binary => 1}); my $db; if ( open($db, "fmuta6.csv") || open($db, "FMUTA6.CSV") ) { my $mut; while ( <$db> ) { s/0""/0,""/g; $csv->parse($_); my @a = $csv->fields(); $used{uc($a[9]||$a[10])}++; } close($db); } $csv = new Text::CSV_XS ({binary => 1}); while ( <> ) { s/0""/0,""/g; unless ( $csv->parse($_) ) { warn("Geen geldige invoer op regel $., file $ARGV\n"); next; } my %a; my @a = $csv->fields(); if ( @a == @debfieldnames ) { # debiteur @a{@debfieldnames} = @a; $a{debzk} ||= $a{debnr} if $ac5; if ( $a{debzk} ) { next unless $all || $used{$a{debzk}}; } elsif ( $debmap->{$a{naam}} ) { $a{debzk} = $debmap->{$a{naam}}; next unless $all || $used{$a{debzk}}; } else { warn("Geen relatiecode voor debiteur $a{naam} -- overgeslagen\n"); next; } $a{debzk} = "R_".$a{debzk} if $a{debzk} =~ /^\d+$/; print("relatie ", ($a{btw_nummer} ne "" && $a{btw_nummer} eq "0") ? "--btw=extra " : "", '"', $a{debzk}, '"', " ", '"', $a{naam}, '"', " ", "8000C", "\n"); next; } if ( @a == @crdfieldnames ) { # crediteur @a{@crdfieldnames} = @a; $a{crdzk} ||= $a{crdnr} if $ac5; if ( $a{crdzk} ) { next unless $all || $used{$a{crdzk}}; } elsif ( $crdmap->{$a{naam}} ) { $a{crdzk} = $crdmap->{$a{naam}}; next unless $all || $used{$a{crdzk}}; } else { warn("Geen relatiecode voor crediteur $a{naam} -- overgeslagen\n"); next; } $a{crdzk} = "R_".$a{crdzk} if $a{crdzk} =~ /^\d+$/; print("relatie ", ($a{btw_nummer} ne "" && $a{btw_nummer} eq "0") ? "--btw=extra " : "", '"', $a{crdzk}, '"', " ", '"', $a{naam}, '"', " ", "4990D", "\n"); next; } warn("Geen geldige debiteur/crediteur op regel $., file $ARGV\n"); } continue { close(ARGV) if eof; } exit 0; ################ Subroutines ################ sub app_options { my $help = 0; # handled locally my $ident = 0; # handled locally # Process options, if any. # Make sure defaults are set before returning! return unless @ARGV > 0; if ( !GetOptions( 'ac5' => \$ac5, 'all' => \$all, 'ident' => \$ident, 'verbose' => \$verbose, 'trace' => \$trace, 'help|?' => \$help, 'debug' => \$debug, ) or $help ) { app_usage(2); } app_ident() if $ident; } sub app_ident { print STDERR ("This is $my_package [$my_name $my_version]\n"); } sub app_usage { my ($exit) = @_; app_ident(); print STDERR <new(trace => $trace); my $TMPDIR = $ENV{TMPDIR} || $ENV{TEMP} || '/usr/tmp'; ################ The Process ################ use Text::CSV_XS; use EB::Format; @ARGV = (-s "FMUTA6.CSV" ? "FMUTA6.CSV" : "fmuta6.csv") unless @ARGV; my @fieldnames0; my @fieldnames; my $f = \@fieldnames0; while ( ) { next if /^#/; $f = \@fieldnames, next unless /\S/; my @a = split(/\t/); push(@$f, $a[1]); } my @dagboeken; my @dbkvolgnr; my $sth = $dbh->sql_exec("SELECT dbk_id,dbk_desc FROM Dagboeken"); my $rr; while ( $rr = $sth->fetchrow_arrayref ) { $dagboeken[$rr->[0]] = lc($rr->[1]); $dbkvolgnr[$rr->[0]] = 1; } my $csv = new Text::CSV_XS ({binary => 1}); open (my $db, $ARGV[0]) or die("Missing: $ARGV[0]\n"); # Collect and split into IV and others. # This is to prevent BGK bookings to preceede the corresponding IV booking. my @prim; my @sec; while ( <$db> ) { s/0""/0,""/g; $csv->parse($_); my @a = $csv->fields(); if ( $a[1] =~ /^[iv]$/i ) { push(@prim, [@a]); } else { push(@sec, [@a]); } } # Process bookings. my $mut; foreach ( @prim, @sec) { my @a = @$_; my %a; if ( $a[0] == 0 ) { flush($mut) if $mut && @$mut > 1; @a{@fieldnames0} = @a; $mut = [ \%a ]; next; } @a{@fieldnames} = @a; warn("OOPS: $a[0] should be " . scalar(@$mut) . "\n") unless $a[0] == @$mut; push(@$mut, \%a); } flush($mut) if $mut; sub flush { my ($mut) = @_; my $r0 = shift(@$mut); my $dbk = $r0->{dagbknr}; my $dbktype = $r0->{dagb_type}; my $cmd = $dagboeken[$dbk]; $cmd =~ s/\s+/_/g if $cmd; # you won't believe it $r0->{crdnr} = "R_".$r0->{crdnr} if $r0->{crdnr} =~ /^\d+$/; $r0->{debnr} = "R_".$r0->{debnr} if $r0->{debnr} =~ /^\d+$/; if ( $dbktype eq 'I' ) { # Inkoop $cmd ||= "Onbekend_InkoopDagboek"; foreach my $r ( @$mut ) { check_rel($r0->{crdnr}, $r->{reknr}, "D"); } my $bkstnr = $renumber ? $dbkvolgnr[$dbk]++ : $mut->[0]->{bkstnr}; print($cmd, ":", $bkstnr, " ", dd($mut->[0]->{Date}), ' "' . ($r0->{oms25}||$mut->[0]->{oms25}) . '"', ' "' . uc($r0->{crdnr}) . '" --totaal=' . (0+$r0->{bedrag})); foreach my $r ( @$mut ) { print join(" ", "", '"' . $r->{oms25} . '"', # ($ac5 ? 0-$r->{bedrag} : $r->{bedrag}). ????? $r->{bedrag}. fixbtw($r), $r->{reknr}); } print("\n"); } elsif ( $dbktype eq 'V' ) { # Verkoop $cmd ||= "Onbekend_VerkoopDagboek"; foreach my $r ( @$mut ) { check_rel($r0->{debnr}, $r->{reknr}, "C"); } my $bkstnr = $renumber ? $dbkvolgnr[$dbk]++ : $mut->[0]->{bkstnr}; print($cmd, ":", $bkstnr, " ", dd($mut->[0]->{Date}), ' "' . ($r0->{oms25}||$mut->[0]->{oms25}) . '"', ' "' . uc($r0->{debnr}) . '" --totaal=' . ($ac5 ? 0+$r0->{bedrag} : 0-$r0->{bedrag})); foreach my $r ( @$mut ) { print join(" ", "", '"' . $r->{oms25} . '"', ($ac5 ? $r->{bedrag} : 0-$r->{bedrag}). fixbtw($r), $r->{reknr}); } print("\n"); } # elsif ( $dbktype eq 'M' ) { # Memoriaal # return unless @$mut; # print($cmd, " ", dd($mut->[0]->{Date})); # foreach my $r ( @$mut ) { # print join(" ", "", # '"' . $r->{oms25} . '"', # debcrd($r->{reknr}) ? $r->{bedrag} : 0-$r->{bedrag}, # $r->{reknr}); # } # print("\n"); # } elsif ( $dbktype =~ /^[GB]$/ ) { # Bank/Giro return unless @$mut; $cmd ||= "Onbekend_BankDagboek"; foreach my $r ( @$mut ) { $r->{crdnr} = "R_".$r->{crdnr} if $r->{crdnr} =~ /^\d+$/; $r->{debnr} = "R_".$r->{debnr} if $r->{debnr} =~ /^\d+$/; if ( $r->{crdnr} ) { check_rel($r->{crdnr}, 4990, "D"); } elsif ( $r->{debnr} ) { check_rel($r->{debnr}, 8000, "C"); } } my $bkstnr = $renumber ? $dbkvolgnr[$dbk]++ : $r0->{bkstnr}; print($cmd, ":", $bkstnr, " ", dd($mut->[0]->{Date}), ' "', $r0->{oms25} ||"Diverse boekingen", '"'); my $tot = 0; foreach my $r ( @$mut ) { if ( $r->{crdnr} ) { print join(" ", " crd", '"'.uc($r->{crdnr}).'"', sprintf("%.2f", $ac5 ? $r->{bedrag} : 0-$r->{bedrag}), # sprintf("%.2f", 0-$r->{bedrag}), ); $tot += $r->{bedrag}; } elsif ( $r->{debnr} ) { print join(" ", " deb", '"'.uc($r->{debnr}).'"', sprintf("%.2f", $ac5 ? $r->{bedrag} : 0-$r->{bedrag}), ); $tot += $r->{bedrag}; } else { print join(" ", " std", '"'.$r->{oms25}.'"', sprintf("%.2f", # debcrd($r->{reknr}) ? $r->{bedrag} : 0-$r->{bedrag}). $ac5 ? $r->{bedrag} : 0-$r->{bedrag}). # 0-$r->{bedrag}). fixbtw($r, 1), $r->{reknr}# . (debcrd($r->{reknr}) ? 'D' : 'C'), ); $tot += $r->{bedrag}; } } print("\n"); warn("!!BOEKSTUK ".$r0->{bkstnr}. " IS NIET IN BALANS ($tot)\n") if $dbktype eq "M" && abs($tot) >= 0.01; } elsif ( $dbktype =~ /^[K]$/ ) { # Kas return unless @$mut; $cmd ||= "Onbekend_BankDagboek"; foreach my $r ( @$mut ) { $r->{crdnr} = "R_".$r->{crdnr} if $r->{crdnr} =~ /^\d+$/; $r->{debnr} = "R_".$r->{debnr} if $r->{debnr} =~ /^\d+$/; if ( $r->{crdnr} ) { check_rel($r->{crdnr}, 4990, "D"); } elsif ( $r->{debnr} ) { check_rel($r->{debnr}, 8000, "C"); } } my $bkstnr = $renumber ? $dbkvolgnr[$dbk]++ : $r0->{bkstnr}; print($cmd, ":", $bkstnr, " ", dd($mut->[0]->{Date}), ' "', $r0->{oms25} ||"Diverse boekingen", '"'); my $tot = 0; foreach my $r ( @$mut ) { if ( $r->{crdnr} ) { print join(" ", " crd", '"'.uc($r->{crdnr}).'"', sprintf("%.2f", $ac5 ? $r->{bedrag} : 0-$r->{bedrag}), # sprintf("%.2f", 0-$r->{bedrag}), ); $tot += $r->{bedrag}; } elsif ( $r->{debnr} ) { print join(" ", " deb", '"'.uc($r->{debnr}).'"', sprintf("%.2f", $ac5 ? $r->{bedrag} : 0-$r->{bedrag}), ); $tot += $r->{bedrag}; } else { print join(" ", " std", '"'.$r->{oms25}.'"', sprintf("%.2f", # debcrd($r->{reknr}) ? $r->{bedrag} : 0-$r->{bedrag}). $ac5 ? $r->{bedrag} : 0-$r->{bedrag}). # 0-$r->{bedrag}). fixbtw($r, 1), $r->{reknr}# . (debcrd($r->{reknr}) ? 'D' : 'C'), ); $tot += $r->{bedrag}; } } print("\n"); warn("!!BOEKSTUK ".$r0->{bkstnr}. " IS NIET IN BALANS ($tot)\n") if $dbktype eq "M" && abs($tot) >= 0.01; } elsif ( $dbktype =~ /^[M]$/ ) { # Memoriaal; return unless @$mut; $cmd ||= "Onbekend_Memoriaal"; foreach my $r ( @$mut ) { $r->{crdnr} = "R_".$r->{crdnr} if $r->{crdnr} =~ /^\d+$/; $r->{debnr} = "R_".$r->{debnr} if $r->{debnr} =~ /^\d+$/; if ( $r->{crdnr} ) { check_rel($r->{crdnr}, 4990, "D"); } elsif ( $r->{debnr} ) { check_rel($r->{debnr}, 8000, "C"); } } my $bkstnr = $renumber ? $dbkvolgnr[$dbk]++ : $r0->{bkstnr}; print($cmd, ":", $bkstnr, " ", dd($mut->[0]->{Date}), ' "', $r0->{oms25} ||"Diverse boekingen", '"'); my $tot = 0; foreach my $r ( @$mut ) { if ( $r->{crdnr} ) { print join(" ", " crd", '"'.uc($r->{crdnr}).'"', # sprintf("%.2f", $ac5 ? $r->{bedrag} : 0-$r->{bedrag}), sprintf("%.2f", 0-$r->{bedrag}), ); $tot += $r->{bedrag}; } elsif ( $r->{debnr} ) { print join(" ", " deb", '"'.uc($r->{debnr}).'"', sprintf("%.2f", $ac5 ? $r->{bedrag} : 0-$r->{bedrag}), ); $tot += $r->{bedrag}; } else { print join(" ", " std", '"'.$r->{oms25}.'"', sprintf("%.2f", # debcrd($r->{reknr}) ? $r->{bedrag} : 0-$r->{bedrag}). # $ac5 ? $r->{bedrag} : 0-$r->{bedrag}). 0-$r->{bedrag}). fixbtw($r, 1), $r->{reknr}# . (debcrd($r->{reknr}) ? 'D' : 'C'), ); $tot += $r->{bedrag}; } } print("\n"); warn("!!MEMORIAAL BOEKSTUK ".$r0->{bkstnr}. " IS NIET IN BALANS ($tot)\n") if $dbktype eq "M" && abs($tot) >= 0.01; } #use Data::Dumper; #print Dumper($mut); $mut = 0; #exit; } sub fixbtw { # Correctie BTW code indien niet conform de grootboekrekening. my $r = shift; my $must = shift; my $b = $r->{btw_code}; unless ( $r->{btw_bdr} && 0 + $r->{btw_bdr}) { return btw_code($r->{reknr}) ? "\@0" : ""; } return "" if $b eq ""; # FMUTA6.CSV heeft alle bedragen altijd inclusief BTW. $b = btwmap($b) unless $ac5; my $br = btw_code($r->{reknr}); return "" if $b == $br && !$must; '@'.$b; } sub dd { my ($date) = @_; # Kantelpunt is willekeurig gekozen. # sprintf("%04d-%02d-%02d", $3 < 90 ? 2000 + $3 : 1900 + $3, $2, $1) if $date =~ /^(\d\d)(\d\d)(\d\d\d?)$/; } exit 0; ################ Subroutines ################ my %debcrd; sub debcrd { my($acct) = @_; return $debcrd{$acct} if defined $debcrd{$acct}; _lku($acct); $debcrd{$acct}; } my %btw_code; sub btw_code { my($acct) = @_; return $btw_code{$acct} if defined $btw_code{$acct}; _lku($acct); $btw_code{$acct}; } my %kstomz; sub kstomz { my($acct) = @_; return $kstomz{$acct} if defined $kstomz{$acct}; _lku($acct); $kstomz{$acct}; } sub _lku { my ($acct) = @_; my $rr = $dbh->do("SELECT acc_debcrd,acc_kstomz,acc_btw". " FROM Accounts". " WHERE acc_id = ?", $acct); die("Onbekend rekeningnummer $acct\n") unless $rr; $debcrd{$acct} = $rr->[0]; $kstomz{$acct} = $rr->[1]; $btw_code{$acct} = $rr->[2]; } my %rel; sub check_rel { my ($code, $acc, $debcrd) = @_; $rel{$code} ||= do { my $r = $dbh->do("SELECT rel_acc_id FROM Relaties WHERE rel_code = ?", $code); unless ( $r && $r->[0] ) { print("relatie \"$code\" \"Automatisch aangemaakt voor code $code\" ", $acc, $debcrd, "\n") if $auto; $rel{$code} = $acc; } else { $r->[0]; } }; } # Map BTW excl -> incl. my @btwmap; sub btwmap { my ($code) = @_; unless ( defined $btwmap[$code] ) { $btwmap[$code] = $dbh->do("SELECT b.btw_id". " FROM BTWTabel a, BTWTabel b". " WHERE a.btw_perc = b.btw_perc". " AND (b.btw_incl OR b.btw_perc = 0)". " AND a.btw_id = ?", $code)->[0]; } $btwmap[$code]; } ################ Subroutines ################ sub app_options { my $help = 0; # handled locally my $ident = 0; # handled locally # Process options, if any. # Make sure defaults are set before returning! return unless @ARGV > 0; if ( !GetOptions( 'ident' => \$ident, 'ac5' => \$ac5, 'auto' => \$auto, 'renumber' => \$renumber, 'verbose' => \$verbose, 'trace' => \$trace, 'help|?' => \$help, 'debug' => \$debug, ) or $help ) { app_usage(2); } app_ident() if $ident; } sub app_ident { print STDERR ("This is $my_package [$my_name $my_version]\n"); } sub app_usage { my ($exit) = @_; app_ident(); print STDERR < Exact. Deze produceert de volgende bestanden: EXACT61.TXT Beschrijving GRTBK.CSV Grootboekinformatie FMUTA6.CSV Mutaties DEBITR.CSV Debiteureninformatie CREDIT.CSV Crediteureninformatie Het programma dvimport.pl leest deze bestanden, en produceert een aantal .sql bestanden ten behoeve van het aanmaken van de EekBoek database. Dit kan dan gebeuren met: createdb psql -f /EB/schema/eekboek.sql Daarna kunnen de programma's exirel.pl en eximut.pl de EekBoek opdrachten produceren om respectievelijk de relaties en de mutaties aan te maken. Deze programma's dienen uitsluitend om u op weg te helpen en pretenderen onder geen enkel beding volledig en/of betrouwbaar te zijn. DaviDOS compatibility note -------------------------- Voor bestanden aangemaakt door DaviDOS moet aan de programma's de command line optie '--ac5' worden meegegeven. EekBoek-2.02.04/import/daviaccount/dvimport.pl0000444000076500007650000003003212165465617017042 0ustar jvjv#!/usr/bin/perl -w # Author : Johan Vromans # Created On : June 2005 # Last Modified By: Johan Vromans # Last Modified On: Mon Jun 14 21:54:46 2010 # Update Count : 323 # Status : Unknown, Use with caution! ################ Common stuff ################ use strict; # Package name. my $my_package = 'EekBoek'; # Program name and version. my ($my_name, $my_version) = qw(dvimport 1.22); ################ Command line parameters ################ use Getopt::Long 2.13; # Command line options. my $verbose = 0; # verbose processing my $ac5 = 0; # DaviDOS compatible # Development options (not shown with -help). my $debug = 0; # debugging my $trace = 0; # trace (show process) my $test = 0; # test mode. # Process command line options. app_options(); # Post-processing. $trace |= ($debug || $test); ################ Presets ################ my $TMPDIR = $ENV{TMPDIR} || $ENV{TEMP} || '/usr/tmp'; use POSIX qw(tzset strftime); tzset(); my @tm = localtime(time); my $tsdate = strftime("%Y-%m-%d %k:%M:%S +0100", @tm[0..5], -1, -1, -1); ################ The Process ################ use EB::Config qw(EekBoek); use EB::Globals; use EB::Format; read_exact_data(); write_rekeningschema(); exit 0; ################ Subroutines ################ use Data::Dumper; use Encode; my $db; sub read_exact_data { open ($db, " ) { if ( /^ ?HOOFDVERDICHTINGEN/ ) { $next = \&read_hoofdverdichtingen; } elsif ( /^ ?VERDICHTINGEN/ ) { $next = \&read_verdichtingen; } elsif ( /^ ?BTW-TARIEVEN/ ) { $next = \&read_btw; } elsif ( /^ ?DAGBOEKEN/ ) { $next = \&read_dagboeken; } elsif ( /^-{40}/ ) { next unless $next; $next->(0); } elsif ( /^ {40}/ ) { next unless $next; $next->(1); } elsif ( /^ \201{40}/ ) { next unless $next; $next->(1); } } close($db); read_grootboek(); sql_constants(); } sub sql_constants { my $out = "-- Constants. DO NOT MODIFY.\n". "COPY Constants (name, value) FROM stdin;\n"; foreach my $key ( sort(@EB::Globals::EXPORT) ) { no strict; next if prototype($key); next if ref($key->()); #next unless $key->() =~ /^\d+$/ || $key->() =~ /^\[.*\]$/; $out .= "$key\t" . $key->() . "\n"; } $out .= "KO_OK\t0\n"; $out .= "\\.\n"; open(my $f, ">constants.sql") or die("Cannot create constants.sql: $!\n"); print $f $out; close($f); } sub _trim { my ($t) = @_; for ( $t ) { s/\s+/ /g; s/^\s+//; s/\s+$//; return $_; } } sub _tsv { join("\t", map { _trim($_) } @_) . "\n"; } sub read_dagboeken { my ($off) = @_; my @dagboeken; while ( <$db> ) { last unless $_ =~ /\S/; substr($_, 0, $off) = "" if $off; my @a = split(' ', $_); my ($id, $desc, $type, $aux); $id = shift(@a); $aux = pop(@a); $type = pop(@a); $desc = "@a"; $desc =~ s/\s+/_/g; $dagboeken[0+$id] = [ $desc, $type, lc($aux) eq "n.v.t." ? "\\N" : 0+$aux ]; # # 1 Kas Kas 1000 # #my @a = unpack("a6a41a20a6", $_); # my @a = /^(\d+)\s+(\S+)\s+(\S+)\s+(\d+|n\.v\.t\.)\s*$/i; # for ( @a[1,2] ) { # s/\s+$//; # } # $dagboeken[0+$a[0]] = [ @a[1,2], lc($a[3]) eq "n.v.t." ? "\\N" : 0+$a[3] ]; } open(my $f, ">dbk.sql") or die("Cannot create dbk.sql: $!\n"); print $f ("-- Dagboeken\n\n", "COPY Dagboeken (dbk_id, dbk_desc, dbk_type, dbk_acc_id) FROM stdin;\n"); my %dbmap = ("Kas" => DBKTYPE_KAS, "Bank/Giro" => DBKTYPE_BANK, "Bank" => DBKTYPE_BANK, "Giro" => DBKTYPE_BANK, "Inkoop" => DBKTYPE_INKOOP, "Verkoop" => DBKTYPE_VERKOOP, "Memoriaal" => DBKTYPE_MEMORIAAL ); for ( my $i = 0; $i < @dagboeken; $i++ ) { next unless exists $dagboeken[$i]; my $db = $dagboeken[$i]; print $f (_tsv($i, $db->[0], $dbmap{$db->[1]}, $db->[2])); } print $f ("\\.\n\n"); print $f("-- Sequences for Boekstuknummers, one for each Dagboek\n\n"); for ( my $i = 0; $i < @dagboeken; $i++ ) { next unless exists $dagboeken[$i]; print $f ("CREATE SEQUENCE bsk_nr_${i}_seq;\n"); } print $f ("\n"); close($f); } my @hoofdverdichtingen; sub read_hoofdverdichtingen { my ($off) = @_; while ( <$db> ) { last unless $_ =~ /\S/; substr($_,0,$off) = "" if $off; # 2 Vlottende activa my @a = m/(\d+)\s+(.*)/; for ( $a[1] ) { s/\s+$//; } $hoofdverdichtingen[$a[0]] = [ $a[1], undef ]; # desc balres } } my @verdichtingen; sub read_verdichtingen { my ($off) = @_; while ( <$db> ) { last unless $_ =~ /\S/; substr($_,0,$off) = "" if $off; # 21 Handelsvoorraden 2 my @a = m/^(\d+)\s+(.*?)\s+(\d+)\s*$/; for ( $a[1] ) { s/\s+$//; } $verdichtingen[$a[0]] = [ $a[1], undef, undef, 0+$a[2] ]; # desc balres kstomz hoofdverdichting } } my %grootboek; my @transactions; my $op_deb; my $op_crd; INIT { $op_deb = $op_crd = 0; } sub read_grootboek { use Text::CSV_XS; my $csv = new Text::CSV_XS ({binary => 1}); my $db; open ($db, " ) { if ( $csv->parse($_) ) { my @a = $csv->fields(); $grootboek{0+$a[0]} = [ @a[1,3,4,5,6,7,12] ]; # desc B/W D/C N/.. struct btw N/J(omzet)? my $balance = $a[17] - $a[16]; if ( $balance ) { $balance = -$balance if $a[4] eq 'D'; push(@transactions, [0+$a[0], $balance]); if ( $balance < 0 ) { $a[4] = ($a[4] eq 'D') ? 'C' : 'D'; $balance = -$balance; } if ( $a[4] eq 'C' ) { $op_crd += $balance; } else { $op_deb += $balance; } } $balance = $a[19] - $a[18]; if ( $balance ) { warn(sprintf("GrbRk $a[0]: saldo = %.2f\n", $balance)); } $verdichtingen[$a[6]][1] = $a[3]; # balres $verdichtingen[$a[6]][2] = $a[12]; # kstomz } else { warn("Parse error at line $.\n"); } } # print Dumper(\%grootboek); foreach ( @verdichtingen ) { next unless $_; $hoofdverdichtingen[$_->[3]][1] = $_->[1]; $hoofdverdichtingen[$_->[3]][2] = $_->[2]; } } sub read_btw { my ($off) = @_; my $hi; my $lo; my $btw_acc_hi_i; my $btw_acc_hi_v; my $btw_acc_lo_i; my $btw_acc_lo_v; my @btwtable; while ( <$db> ) { last unless $_ =~ /\S/; substr($_, 0, $off) = "" if $off; # Nr. Omschrijving Perc. Type Ink.reknr. Verk.reknr. # ---------------------------------------------------------------------------------- # 1 BTW 17,5% incl. 17,50 Incl. 1520 1500 # 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 # 1 2 3 4 5 6 7 8 9 #my @a = unpack("a6a41a7a6a11a*", $_); my @a = m/^(\d+)\s+(.+?)\s+(\d\d?[.,]\d\d)\s+((?:In|Ex)cl(?:\.|usief))\s+(?:$|(\d+)\s+(\d+))\s*$/; warn("? $_"), next unless $a[1]; # 3 - BTW 6% -> code 3 -- NOT! if ( $a[1] =~ /^(\d+) - (.*)/ ) { #$a[0] = $1; $a[1] = $2; } for ( @a[1,2,3] ) { s/\s+$//; } my $btw = amount($a[2]); if ( AMTPRECISION > BTWPRECISION-2 ) { $btw = substr($btw, 0, length($btw) - (AMTPRECISION - BTWPRECISION-2)) } elsif ( AMTPRECISION < BTWPRECISION-2 ) { $btw .= "0" x (BTWPRECISION-2 - AMTPRECISION); } $btwtable[$a[0]] = [ $a[1], $btw, $a[3] =~ /^I/ ? 't' : 'f' ]; if ( $btw ) { if ( !$lo || $btw < $lo ) { $lo = $btw; undef $btw_acc_lo_i; undef $btw_acc_lo_v; } if ( !$hi || $btw > $hi ) { $hi = $btw; undef $btw_acc_hi_i; undef $btw_acc_hi_v; } } next unless $btw; if ( $btw == $hi ) { if ( $btw_acc_hi_i && ($btw_acc_hi_i != $a[4] || $btw_acc_hi_v != $a[5]) ) { warn("BTW probleem 1\n"); } else { $btw_acc_hi_i = 0+$a[4]; $btw_acc_hi_v = 0+$a[5]; } } elsif ( $btw == $lo ) { if ( $btw_acc_lo_i && ($btw_acc_lo_i != $a[4] || $btw_acc_lo_v != $a[5]) ) { warn("BTW probleem 2\n"); } else { $btw_acc_lo_i = 0+$a[4]; $btw_acc_lo_v = 0+$a[5]; } } } foreach ( @btwtable ) { push(@$_, $_->[1] == 0 ? BTWTARIEF_NUL : $_->[1] == $hi ? BTWTARIEF_HOOG : $_->[1] == $lo ? BTWTARIEF_LAAG : warn("Onbekende BTW group: $_->[1]\n")); } open(my $f, ">btw.sql") or die("Cannot create btw.sql: $!\n"); print $f ("-- BTW Tabel\n\n", "COPY BTWTabel (btw_id, btw_desc, btw_perc, btw_incl, btw_tariefgroep) FROM stdin;\n"); for ( my $i = 0; $i < @btwtable; $i++ ) { next unless exists $btwtable[$i]; my $b = $btwtable[$i]; print $f (_tsv($i, @$b)); } print $f ("\\.\n\n"); close($f); } sub write_rekeningschema { open(my $f, ">vrd.sql") or die("Cannot create vrd.sql: $!\n"); print $f ("-- Hoofdverdichtingen\n\n", "COPY Verdichtingen (vdi_id, vdi_desc, vdi_balres, vdi_kstomz, vdi_struct)". " FROM stdin;\n"); for ( my $i = 0; $i < @hoofdverdichtingen; $i++ ) { next unless exists $hoofdverdichtingen[$i]; my $v = $hoofdverdichtingen[$i]; # Skip unused verdichtingen. next unless defined($v->[1]) && defined($v->[2]); $v->[0] = decode("cp-850", $v->[0]) if $ac5; print $f (_tsv($i, $v->[0], $v->[1] eq 'B' ? 't' : 'f', $v->[2] eq 'N' ? 't' : 'f', "\\N")); } print $f ("\\.\n\n"); print $f ("-- Verdichtingen\n\n", "COPY Verdichtingen (vdi_id, vdi_desc, vdi_balres, vdi_kstomz, vdi_struct) FROM stdin;\n"); for ( my $i = 0; $i < @verdichtingen; $i++ ) { next unless exists $verdichtingen[$i]; my $v = $verdichtingen[$i]; # Skip unused verdichtingen. next unless defined($v->[1]) && defined($v->[2]); $v->[0] = decode("cp-850", $v->[0]) if $ac5; print $f (_tsv($i, $v->[0], $v->[1] eq 'B' ? 't' : $v->[1] eq 'W' ? 'f' : '?', $v->[2] eq 'N' ? 't' : $v->[2] eq 'J' ? 'f' : '?', $v->[3])); } print $f ("\\.\n\n"); close($f); open($f, ">acc.sql") or die("Cannot create acc.sql: $!\n"); print $f ("-- Grootboekrekeningen\n\n", "COPY Accounts (acc_id, acc_desc, acc_struct, acc_balres, acc_debcrd,". " acc_kstomz, acc_btw, acc_ibalance, acc_balance) FROM stdin;\n"); for my $i ( sort { $a <=> $b } keys(%grootboek) ) { my $g = $grootboek{$i}; # desc B/W D/C N/.. struct btw N/J(omzet)? $g->[0] = decode("cp-850", $g->[0]) if $ac5; print $f (_tsv($i, $g->[0], $g->[4], $g->[1] eq 'B' ? 't' : 'f', $g->[2] eq 'D' ? 't' : 'f', $g->[6] eq 'N' ? 't' : 'f', $g->[5], 0, 0)); } print $f ("\\.\n\n"); close($f); open($f, ">std.sql") or die("Cannot create std.sql: $!\n"); print $f ("-- Standaardrekeningen\n", "INSERT INTO Standaardrekeningen\n", " (std_acc_crd, std_acc_winst, std_acc_btw_il, std_acc_deb,". " std_acc_btw_vh, std_acc_btw_ok, std_acc_btw_vl, std_acc_btw_ih)\n", "VALUES (1600, 500, 1530, 1200, 1500, 1560, 1510, 1520);\n"); close($f); die("Openingsbalans is niet in balans: $op_deb <> $op_crd\n") unless sprintf("%.2f", $op_deb) == sprintf("%.2f", $op_crd); open($f, ">opening.eb") or die("Cannot create opening.eb: $!\n"); print $f ("# Data voor openingsbalans:\n\n"); printf $f ("adm_balanstotaal %10.2f\n", $op_deb); foreach ( @transactions ) { printf $f ("adm_balans %5d %10.2f\n", @$_); } print $f ("\n"); close($f); } ################ Subroutines ################ sub app_options { my $help = 0; # handled locally my $ident = 0; # handled locally my $man = 0; # handled locally # Process options. if ( @ARGV > 0 ) { GetOptions('ident' => \$ident, 'verbose' => \$verbose, 'ac5' => \$ac5, 'trace' => \$trace, 'help|?' => \$help, 'man' => \$man, 'debug' => \$debug) or pod2usage(2); } if ( $ident or $help or $man ) { print STDERR ("This is $my_package [$my_name $my_version]\n"); } if ( $man or $help ) { # Load Pod::Usage only if needed. require "Pod/Usage.pm"; import Pod::Usage; pod2usage(1) if $help; pod2usage(VERBOSE => 2) if $man; } } EekBoek-2.02.04/README.2012100000444000076500007650000001066612165465617012446 0ustar jvjvBTW migratie Ter gelegenheid van het invoeren van een verhoogd BTW tarief op 1 oktober a.s. Nieuwe features in EekBoek 2.02 BTW codes mogen nu alfanumeriek zijn Bijvoorbeeld: BTW Tarieven ... Hoog19 BTW 19% incl. :tariefgroep=hoog :perc=19,00 Laag BTW 6,0% incl. :tariefgroep=laag :perc=6,00 De codes worden hoofdletterongevoelig toegepast. Numerieke BTW codes voor grootboekrekeningen worden uitgefaseerd. Deze dienen te worden vervangen door de corresponderende tariefgroep. BTW codes kunnen worden gebruikt in boekingen Dit kon al voor numerieke codes, en aanduidingen als H, L, en zo. Postfix + en - zijn nu toegestaan op alle BTW codes. Het verdient aanbeveling het gebruik van de numerieke codes uit te faseren. inkopen 02-01 "Telefoon + ADSL" XS4ALL \ "Mail" 18,30@Hoog19- 6905 \ "ADSL" 33,61@Hoog19- 6905 Het toegepaste BTW tarief wordt getoond in het journaal Hiermee kan snel visueel worden vastgesteld of de juiste BTW code is opgegeven bij een boekstukregel. Datum Boekstuk/Grootboek Rek Debet Credit BTW % Tarief Boekstuk/regel Relatie ------------------------------------------------------------------------------------------------------------------------------------------ 2012-01-11 Inkopen:27 Contributie 2012 FNVZZP 2012-01-11 BTW Inkoop Hoog 4220 31,13 BTW Contributie 2012 2012-01-11 Vakbond 6320 163,87 19,00 Hoog Contributie 2012 2012-01-11 Crediteuren 4100 195,00 Contributie 2012 ------------------------------------------------------------------------------------------------------------------------------------------ Totaal Boekstuk 46 195,00 195,00 BTW codes kunnen een begin- en/of einddatum toegekend krijgen Een waarschuwing wordt gegeven wanneer een boeking een btw code heeft die nog niet, of niet meer, geldig is. Hoog19 BTW 19% incl. :tariefgroep=hoog :perc=19,00 :tot=2012-10-01 Hoog21 BTW 21% incl. :tariefgroep=hoog :perc=21,00 :vanaf=2012-10-01 Let op: de 'tot' datum is tot, en niet tot en met. Het is mogelijk in boekingen om de btw code automatisch te laten corrigeren. Daarbij moet rekening worden gehouden met het feit dat wettelijk de leverdatum van het product of dienst bepalend is, niet de boekingsdatum of de factuurdatum. Als dat geen probleem is, dan kan de volgende setting in de EekBoek config worden aangebracht: [strategy] btw_adapt = 1 EekBoek zal nu voor boekingen waarvoor de btw code niet geldig is proberen de juiste, wel geldige, btw code toe te passen. Uiteraard wordt daarvan melding gemaakt. Niet-eenduidig gebruik van @H en @L codes geeft een melding Een melding wordt gegenereerd wanneer in een boeking een BTW aanduiding wordt gebruikt als @H of @L, terwijl in het schema meerdere BTW tarieven zijn gedefinieerd met tariefgroep 'hoog' resp. 'laag'. In deze gevallen wordt het tarief met de laagste code gebruikt. Auto-migratie De auto-migratie faciliteit van EekBoek voert automatisch de volgende wijzigingen door in uw administratie: 1. De BTW en Journaal tabellen worden bijgewerkt met nieuwe attributen. 2. Bestaande BTW tarieven van 19% en tariefgroep Hoog worden gemarkeerd als geldig tot 1-10-2012. 3. Twee nieuwe BTW tarieven met naam 'H21' (inclusief) en 'H21-' (exclusief) worden aangemaakt en gemarkeerd als geldig vanaf 1-10-2012. Na de migratie De veronderstelling is dat in het schema alle koppelingen tussen grootboekrekeningen en BTW tariefcodes zijn gemaakt op basis van het nu nog huidige 19% tarief. Indien niet gebruik gemaakt wordt van de btw_adapt strategie dan moeten alle boekingen met levering na 1 oktober expliciet worden voorzien van @h21 of @h21+ (inclusief) dan wel @h21- (exclusief). De verwachting is dat de periode september-november de boekingen soms handmatig zullen moeten voorzien van een code, en dat daarna de btw_adapt strategie het werk betrouwbaar overneemt. Hou niettemin altijd het journaal in de gaten of het juiste tarief is toegepast! Hint: Neem in de EekBoek config op: [preferences] journal = 1 Hiermee wordt na elke boeking automatisch de betreffende journaalrapportage getoond. EekBoek-2.02.04/TODO0000444000076500007650000000020312165465617011514 0ustar jvjvDeze TODO wordt niet langer bijgehouden. Raadpleeg http://sourceforge.net/tracker/?group_id=154512 voor Bugs en Feature requests. EekBoek-2.02.04/relnotes-2.02.html0000444000076500007650000002623612165465617014142 0ustar jvjv

Inhoud

Voor een volledige, gedetailleerde lijst van veranderingen zie het bestand CHANGES.

LEES OOK HET ITEM "MIGRATIE" AAN HET EIND VAN DIT BESTAND.

Raadpleeg ‘Installeren’ en ‘Download’ op de EekBoek wiki om EekBoek op uw systeem te installeren.

Wijzigingen in EekBoek 2.02

Overzicht

Wijzigingen in de BTW tariefcodes

BTW codes mogen nu alfanumeriek zijn

Bijvoorbeeld:

BTW Tarieven
    ...
    Hoog19   BTW 19% incl.          :tariefgroep=hoog :perc=19,00
    Laag     BTW 6,0% incl.         :tariefgroep=laag :perc=6,00

De codes worden hoofdletterongevoelig toegepast.

Numerieke BTW codes voor grootboekrekeningen worden uitgefaseerd.

Deze dienen te worden vervangen door de corresponderende tariefgroep.

BTW codes kunnen worden gebruikt in boekingen

Dit kon al voor numerieke codes, en aanduidingen als H, L, en zo.
Postfix + en - zijn nu toegestaan op alle BTW codes. Het verdient aanbeveling het gebruik van de numerieke codes uit te faseren.

    inkopen 02-01 "Telefoon + ADSL" XS4ALL \
        "Mail"                            18,30@Hoog19-  6905  \
        "ADSL"                            33,61@Hoog19-  6905

Het toegepaste BTW tarief wordt getoond in het journaal

Hiermee kan snel visueel worden vastgesteld of de juiste BTW code is opgegeven bij een boekstukregel.

Datum       Boekstuk/Grootboek                Rek      Debet     Credit      BTW %  Tarief      Boekstuk/regel                  Relatie
------------------------------------------------------------------------------------------------------------------------------------------
2012-01-11  Inkopen:27                                                                          Contributie 2012                FNVZZP
2012-01-11    BTW Inkoop Hoog                4220      31,13                                      BTW Contributie 2012
2012-01-11    Vakbond                        6320     163,87                 19,00  Hoog          Contributie 2012
2012-01-11    Crediteuren                    4100                195,00                           Contributie 2012
------------------------------------------------------------------------------------------------------------------------------------------
            Totaal Boekstuk 46                        195,00     195,00

BTW codes kunnen een begin- en/of einddatum toegekend krijgen

Een waarschuwing wordt gegeven wanneer een boeking een btw code heeft die nog niet, of niet meer, geldig is.

   Hoog19   BTW 19% incl.          :tariefgroep=hoog :perc=19,00 :tot=2012-10-01
   Hoog21   BTW 21% incl.          :tariefgroep=hoog :perc=21,00 :vanaf=2012-10-01

Let op: de 'tot' datum is tot, en niet tot en met.

Het is mogelijk in boekingen om de btw code automatisch te laten corrigeren. Daarbij moet rekening worden gehouden met het feit dat wettelijk de leverdatum van het product of dienst bepalend is, niet de boekingsdatum of de factuurdatum. Als dat geen probleem is, dan kan de volgende setting in de EekBoek config worden aangebracht:

[strategy]
btw_adapt = 1

EekBoek zal nu voor boekingen waarvoor de btw code niet geldig is proberen de juiste, wel geldige, btw code toe te passen. Uiteraard wordt daarvan melding gemaakt.

Niet-eenduidig gebruik van @H en @L codes geeft een melding

Een melding wordt gegenereerd wanneer in een boeking een BTW aanduiding wordt gebruikt als @H of @L, terwijl in het schema meerdere BTW tarieven zijn gedefinieerd met tariefgroep 'hoog' resp. 'laag'. In deze gevallen wordt het tarief met de laagste code gebruikt.

Auto-migratie

De auto-migratie faciliteit van EekBoek voert automatisch de volgende wijzigingen door in uw administratie:

  1. De BTW en Journaal tabellen worden bijgewerkt met nieuwe attributen.
  2. Bestaande BTW tarieven van 19% en tariefgroep Hoog worden gemarkeerd als geldig tot 1-10-2012.
  3. Twee nieuwe BTW tarieven met naam 'H21' (inclusief) en 'H21-' (exclusief) worden aangemaakt en gemarkeerd als geldig vanaf 1-10-2012.

Na de migratie

De veronderstelling is dat in het schema alle koppelingen tussen grootboekrekeningen en BTW tariefcodes zijn gemaakt op basis van het nu nog huidige 19% tarief.
Indien niet gebruik gemaakt wordt van de btw_adapt strategie dan moeten alle boekingen met levering na 1 oktober expliciet worden voorzien van @h21 of @h21+ (inclusief) dan wel @h21- (exclusief).

De verwachting is dat de periode september-november de boekingen soms handmatig zullen moeten voorzien van een code, en dat daarna de btw_adapt strategie het werk betrouwbaar overneemt. Hou niettemin altijd het journaal in de gaten of het juiste tarief is toegepast!

Hint: Neem in de EekBoek config op:

[preferences]
journal = 1

Hiermee wordt na elke boeking automatisch de betreffende journaalrapportage getoond.

On-line hulp

De GUI versie van EekBoek heeft nu een on-line hulpfaciliteit.

Wizards

Met de GUI versie van de EekBoek wizard is het nu mogelijk om een administratie op te zetten die gekoppeld is aan een bestaande administratie op een server. Hiervoor is het gebruik van de PostgreSQL database vereist.

Boekingen

Voor het afletteren wordt de boekingsdatum gebruikt, en niet langer de boekingsvolgorde.

Rapporten

In het journaal wordt het toegepaste BTW tarief getoond.

Configuratiebestand

Nieuwe settings in het configuratiebestand:

[shell]
errexit = 1

Verwerking wordt afgebroken indien fouten worden gedetecteerd. Dit is een manier om de shell optie --errexit permanent aan te zetten.

[strategy]
btw_adapt = 1

EekBoek zal voor boekingen waarvoor het BTW tarief niet geldig is proberen het juiste, wel geldige, BTW tarief toe te passen.

Migratie

De database-structuur is gewijzigd. Auto-migratie is beschikbaar. Het wordt echter ten sterkste aangeraden VOOR INSTALLATIE VAN 2.02 eerst een export te doen, en deze na installatie van 2.02 te importeren.

Bugfixes

Zoals gebruikelijk zijn er verschillende bugs gefixed. Dank aan allen die hebben meegewerkt aan het vinden en oplossen van deze bugs.

Packaging

Met ingang van deze release worden installeerbare kits beschikbaar gesteld voor verschillende platforms. Met behulp van de Cava Packager wordt EekBoek gepackaged met Citrus Perl en alle verder benodigde libraries en modules, waarna van dit package een installeerbare kit wordt gemaakt.

Het grote voordeel van deze aanpak is dat de gebruiker zich niet langer hoeft te bekommeren om de installatie van Perl, wxWidgets, enzovoorts. Alles zit verpakt in de kit.

Installeerbare kits zijn beschikbaar voor:

  • Microsoft Windows (GUI installer)
  • Linux (GUI of command line installer)
  • Mac OSX (DMG container)

Alle kits zijn beschikbaar op SourceForge.

De interne structuur van de EekBoek bestanden is gewijzigd om deze packaging mogelijk te maken. Dit heeft verder geen consequenties voor het normale gebruik.

Uitfasering EekBoek repositories

[% sf_git = 'Test versies kunnen worden aangemaakt vanuit de GIT repository'; sf_files = 'SourceForge'; %]

Met het beschikbaar komen van standaard EekBoek kits voor verschillende systemen is het niet langer van belang eigen repositories te onderhouden. De volgende repositories zullen daarom worden uitgefaseerd:

  • http://www.eekboek.nl/repo/debian/
    EekBoek zit in de standaard Debian repositories

  • http://www.eekboek.nl/repo/debian-testing/
    [% sf_git %]

  • http://www.eekboek.nl/repo/fedora/
    EekBoek zit in de standaard Fedora repositories

  • http://www.eekboek.nl/repo/fedora-testing/
    [% sf_git %]

  • http://www.eekboek.nl/repo/macosx/
    DMG container beschikbaar op [% sf_files %]

  • http://www.eekboek.nl/repo/macosx-testing/

  • http://www.eekboek.nl/repo/ubuntu_10.10/

  • http://www.eekboek.nl/repo/windows/
    Installer beschikbaar op [% sf_files %]

  • http://www.eekboek.nl/repo/windows-testing/
    [% sf_git %]

Diversen

Grote delen van EekBoek zijn inmiddels vertaald in het Engels. Binnenkort zal een engelstalige productieversie worden gelanceerd.

Wijzigingen in EekBoek 2.02.02

Overzicht

Deze versie is een bugfix release.

Er is gebleken dat bij het bepalen van de periode maart 2013 per ongeluk de data 2013-03-01 t/m 2013-03-30 werd gebruikt. De fout werd veroorzaakt doordat precies op 30 maart de zomertijd is ingegaan.

Let op: Dit kan mogelijke consequenties hebben voor een BTW-aangifte die eindigde in maart 2013, du seen aangifte over de maand maart, of een over het eerste kwartaal van 2013. Maak daarom eerst een afdruk van de BTW-aangifte zoals gedaan is met EekBoek 2.02.00, en maak na de upgrade een nieuwe afdruk met EekBoek 2.02.02. Eventuele verschillen kunt u verrekenen met de eerstvolgende BTW-aangifte.

Wijzigingen in EekBoek 2.02.04

Overzicht

Deze versie is een bugfix release.

Op sommige systemen crashte de GUI shell wanneer bij het bekijken van een rapport window op de [Opslaan] button wordt gedrukt.

EekBoek-2.02.04/META.yml0000444000076500007650000000142212165465617012301 0ustar jvjv--- name: EekBoek version: 2.02.04 author: - Johan Vromans (jvromans@squirrel.nl) abstract: Elementary Bookkeeping (for the Dutch/European market) license: perl resources: MailingList: http://lists.sourceforge.net/lists/listinfo/eekboek homepage: http://www.eekboek.nl license: ~ requires: Archive::Zip: 1.16 DBD::SQLite: 1.13 DBI: 1.40 Getopt::Long: 2.13 Term::ReadLine: 0 Term::ReadLine::Gnu: 0 build_requires: IPC::Run3: 0.034 Module::Build: 0.26 recommends: DBD::Pg: 1.41 Getopt::Long: 2.32 HTML::Entities: 1.35 provides: EekBoek: file: lib/EekBoek.pm version: 2.02.04 generated_by: Module::Build version 0.32 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.2.html version: 1.2 no_index: directory: - inc - lib EekBoek-2.02.04/CHANGES-1040000444000076500007650000002222512165465617012331 0ustar jvjvWijzigingen in EekBoek 1.04 =========================== Voor een volledige, gedetailleerde lijst van veranderingen zie het bestand CHANGES. BELANGRIJK: Om alle nieuwe features van deze versie te kunnen benutten dient de administratie nieuw in 1.04 te worden gemporteerd. Het is daarom sterk aan te raden eerst uw administraties te exporteren alvorens tot upgrade over te gaan. Heeft u de upgrade al uitgevoerd? Exporteer en importeer dan uw administraties alsnog eenmalig. LEES VOORAL HET ITEM "MIGRATIE" AAN HET EIND VAN DIT BESTAND. Schema ------ * BTW tariefgroepen Priv en Anders. In schema: 5 BTW Priv :tariefgroep=priv :perc=12,00 :exclusief 6 BTW Anders :tariefgroep=anders :perc=14,50 :exclusief Als deze taeriefgroepen worden opgevoerd dan moeten de betreffende koppelingen ook worden opgegeven: 4240 D BTW Inkoop Anders :koppeling=btw_ia 4250 C BTW Verkoop Anders :koppeling=btw_va Etc. BTW 'Priv' komt in de BTW aangifte in groep 1d, BTW 'Anders' komt in groep 1e. Deze groepen worden niet op het aangifteformulier vermeld als de betreffende tariefgroep ontbreekt. * Debiteuren en crediteuren kunnen nu per dagboek verschillend worden opgegeven. Boekingen --------- * Bij een inkoop/verkoop boeking kun je een willekeurige (moet tenminste n niet-cijfer bevatten) string opgeven als referentie: inkoop 25-12 CREDITEUR "Diversen" --ref="P24XyzBla!" 100 Een geschikte kandidaat is b.v. het faktuurnummer van de klant, of een ordernummer. Deze referentie kun je later gebruiken bij de betaling: postbank 25-12 Afschrijving \ crd 25-12 "CREDITEUR:P24XyzBla!" -100 Dus net zoals: postbank 25-12 Afschrijving \ crd 25-12 inkoop:54 -100 Overigens met dezelfde functionaliteit: er wordt niet gekeken of de boeking open staat. Je kunt dus op deze manier ook op voorhand boeken. De combinatie relatiecode - referentie moet per boekjaar uniek zijn. * Boekingen in een periode waarover BTW aangifte is gedaan kunnen nog steeds worden gewijzigd als deze boeken geen betrekking heeft op de BTW (m.a.w., BTW type Neutraal). * Inkoop/Verkoopboekingen - Config optie strategy:iv_vc. Bij het boeken in een Inkoop- of Verkoopdagboek wordt BTW berekend per boekstukregel. Sommige leveranciers berekenen echter de BTW over het totaal van de boekstukregels. Daardoor kunnen afrondingsverschillen ontstaan met als gevolg een boekstuktotaal dat niet klopt met de opgegeven waarde. De boeking zal dan worden geweigerd. EekBoek zal proberen zo'n boeking te corrigeren door de BTW te herberekenen over het totaal. Er wordt dan een melding gegeven, en een correctieboekstukregel aangemaakt. Dit gedrag kan worden afgezet door de strategy optie iv_vc de waarde 0 te geven. * Bank/Kas/Memoriaalboekingen - Config optie strategy:bkm_multi. Indien gezet en niet nul (kortom, true) dan wordt in geval een boeking niet kan worden gematched tegen een openstaande post geprobeerd of deze boeking wellicht voor meerdere openstaande posten tegelijk bedoeld is. - Toon bedrag en relatie indien geen openstaande post kan worden gevonden. Rapporten --------- * Alle rapporten in HTML kunnen een expliciete titel meekrijgen: balans --title="Voorlopige balans 2009" --out=x.html * Bij de rapportage openstaande posten kan nu ook worden geselecteerd dat alleen de debiteuren, crediteuren, of een enkele relatie wordt weergegeven. * Bij de crediteuren/debiteurenrapportages kan nu ook worden aangegeven dat alleen de openstaande posten moeten worden weergegeven. Let op: Openstaande posten van voorgaande boekjaren worden NIET vernmeld. * BTW Aangifte - Toon ook het onafgeronde totaal en de afronding. - Optie --noround voor een onafgerond rapport. EekBoek Shell ------------- * Alle odrachten zijn nu case-insensitive. * Commando's 'journal', 'trace' en 'confirm' kennen nu een'--quiet' optie, waardoor de opdrachten stil worden uitgevoerd. * Journaalposten worden niet meer gerapporteerd tijdens import en init. * Command line optie "--init". Hiermee wordt een nieuwe administratie opgezet in de huidige directory. Equivalent met "--import --dir=.". * Command line opties "--database" (en de verkorte vorm, "--db") en "--journaal" komen binnenkort te vervallen. * LET OP: EekBoek met SQLite ondersteunt niet de opdracht "import". Importeren uitsluitend met de command line versie ebshell --import ... * Optie --errexit: Verwerking van invoer breekt direct af na geconstateerde fouten. * Optie --[no]interactive om interactief gedrag te forceren ook al komt de invoer niet van een terminal. Niet bedoeld voor uitwendig gebruik. * Optie: --createsampledb. Deze creeert de voorbeelddatabase. Configuratie ------------ * Kleine wijzigingen in het verwerken van de config files. De ".eekboek.conf" in de huidige directory wordt niet langer meegenomen indien ebshell wordt opgestart met een "-f" optie. * --config (-f) accepteert nu ook de naam van een directory, en probeert dan eekboek.conf en .eekboek.conf. * Nieuwe configuratie settings: [preferences] journal = 1 Hiermee wordt na elke boeking automatisch de betreffende journaalpost getoond. Deze preference setting vervangt de command line optie "--journaal". [strategy] iv_vc = 1 Zie bij "Boekingen". [strategy] bkm_multi = 1 Zie bij "Boekingen". [strategy] bkm_multi_max = 15 Omdat het zoekproces enige tijd in beslag kan nemen (enkele minuten bij 25 openstaande posten) is een begrenzing ingebouwd. [strategy] round = ieee Hiermee kan worden ingesteld op welke wijze EekBoek bij berekeningen bedragen moet afronden. De volgende methoden worden ondersteund: ieee Afronding volgens de IEEE standaard. Dit is de standaardinstelling. bankers Afronding naar even getallen (het zg. Bankers algoritme) posix Afronding volgens de POSIX standaard. Bugfixes -------- * Meer dan n -D / --define op de command line mogelijk. * Geen reporter backends laden indien AUTOMATED_TESTING. Hiermee worden test failures vermeden indien er achterhaalde EekBoek installaties rondzwerven. * BKM deb/crd boeking gebruikt altijd de standaardrekeningen voor deb/crd i.p.v. de aan het dagboek gekoppelde rekening. * Fix issue 1901436. * Fix issue 1871576. * Fix bug waardoor een adm_relatie met datum 31-12 niet werd geaccepteerd wanneer er al eerdere boekingen in dat jaar waren. * Fix bug waardoor openstaande posten uit voorgaande jaren XXXX leidden tot de melding "Boekjaar XXXX nog niet afgesloten". * Fix probleem met foutieve export van adm_btwperiode in multi-jaar admin (issue 1628783). * Fix probleem met jaareinde van BTW-loze administratie. * Fix probleem met rapportbreedte jaareinde. * Fix probleem met SQLite en opdrachten die direct na een createdb/schema worden uitgevoerd, zoals b.v.: $ cat relaties.eb opening.eb | ebshell --createdb --schema=schema * Fix probleem met het opruimen van de directories na (rpm) uninstall. * Fix bug met strings in de export die " en \ bevatten. Aanvullingen ------------ * Uitbreidingen contrib/afschr.pl . * eekboek-mode.el: Emacs major mode voor EekBoek data. * Nieuw voorbeeldschema voor een vereniging, met dank aan Edwin Hakkennes. Diversen -------- * Verwacht wordt dat EekBoek met Debian GNU/Linux meegeleverd gaat worden, zie http://bugs.debian.org/491113 voor de actuele status. Mensen die 'unstable' (of 'testing') draaien zullen het snel in hun software-lijst zijn verschijnen. * Voorbeeldschema's verplaatst van lib/EB/schema naar lib/EB/examples. * Voorbeelden verplaatst van lib/EB/example naar lib/EB/examples. * RPM packages zijn gesplitst in een common package, en twee database packages: EekBoek-1.04-1.noarch.rpm EekBoek-db-postgres-1.04-1.noarch.rpm EekBoek-db-sqlite-1.04-1.noarch.rpm Bij installatie dient naast het common deel tenminste een van beide database kits te worden genstalleerd. Zie http://www.eekboek.nl/docs/install/linux.html * DEB packages zijn gesplistst in een basis package, gebaseerd op SQLite, en een add-on package voor PostgreSQL: eekboek_1.04-1_all.deb eekboek-db-postgresql_1.04-1_all.deb Zie http://www.eekboek.nl/docs/install/linux.html * PPM package voor Microsoft Windows: EekBoek-1_04.ppd Zie http://www.eekboek.nl/docs/install/windows.html Examples -------- * Nieuw, actueel, eenvoudiger en beter schema voor de example database. Migratie -------- De database-structuur is gewijzigd. Auto-migratie is beschikbaar. Het wordt echter ten sterkste aangeraden VOOR INSTALLATIE VAN 1.04 eerst een export te doen, en deze na installatie van 1.04 te importeren. Bij auto-migratie van SQLite databases treedt een fout op: !De database wordt aangepast aan de nieuwere versie DBD::SQLite::st execute failed: database schema has changed(1) at dbdimp.c line 421 at /home/jv/src/eekboek/src/lib/EB/DB.pm line 649. DBD::SQLite::st execute failed: database schema has changed(1) at dbdimp.c line 421 at /home/jv/src/eekboek/src/lib/EB/DB.pm line 649. U dient dan NOG TWEE MAAL de EekBoek shell op te starten, en u krijgt nog twee maal deze boodschap. Daarna is de migratie compleet. EekBoek-2.02.04/MANIFEST0000444000076500007650000002117112165465617012164 0ustar jvjvBuild.PL CHANGES CHANGES-104 EekBoek.spec INSTALL MANIFEST META.yml Makefile.PL README README.emacs README.gui README.postgres README.201210 TODO doc/html/bookings/bank.html doc/html/bookings/btw.html doc/html/bookings/cash.html doc/html/bookings/index.html doc/html/bookings/memorial.html doc/html/bookings/payable.html doc/html/bookings/receivable.html doc/html/cheat/cheat.css doc/html/cheat/details.html doc/html/cheat/index.html doc/html/cheat/ix.html doc/html/cheat/kop.html doc/html/cmdref.html doc/html/config.html doc/html/css/site.css doc/html/date.html doc/html/ebshell/clo.html doc/html/ebshell/commands.html doc/html/ebshell/files.html doc/html/ebshell/index.html doc/html/ebwxshell/button-edit.png doc/html/ebwxshell/button-ok.png doc/html/ebwxshell/clo.html doc/html/ebwxshell/ebwxshell.png doc/html/ebwxshell/edit.png doc/html/ebwxshell/files.html doc/html/ebwxshell/index.html doc/html/images/bg.gif doc/html/images/eb.jpg doc/html/images/ebname.jpg doc/html/images/perl_powered.png doc/html/images/valid-html401-blue.png doc/html/images/valid-html401.png doc/html/images/validcss.png doc/html/index.html doc/html/inex.html doc/html/intro/backups.html doc/html/intro/eekboek.conf doc/html/intro/index.html doc/html/intro/mutaties.eb doc/html/intro/opening.eb doc/html/intro/relaties.eb doc/html/intro/schema.dat doc/html/intro/working.html doc/html/period.html doc/html/reports/balans.html doc/html/reports/btw.html doc/html/reports/crediteuren.html doc/html/reports/debiteuren.html doc/html/reports/grootboek.html doc/html/reports/index.html doc/html/reports/journaal.html doc/html/reports/open.html doc/html/reports/proef.html doc/html/reports/result.html doc/html/reports/unpaid.html doc/html/setup/config.html doc/html/setup/index.html doc/html/setup/init.html doc/html/setup/mutaties.html doc/html/setup/opening.html doc/html/setup/relaties.html doc/html/setup/schema.html doc/html/stdacc.html doc/html/yearend.html ebwxshell.desktop emacs/eekboek-mode.el emacs/eekboek-site-start.el import/daviaccount/README import/daviaccount/dvimport.pl import/daviaccount/eximut.pl import/daviaccount/exirel.pl inc/IPC/Run3.pm inc/IPC/Run3/ProfArrayBuffer.pm inc/IPC/Run3/ProfLogReader.pm inc/IPC/Run3/ProfLogger.pm inc/IPC/Run3/ProfPP.pm inc/IPC/Run3/ProfReporter.pm inc/Module/Build.pm inc/Module/Build/API.pod inc/Module/Build/Authoring.pod inc/Module/Build/Base.pm inc/Module/Build/Compat.pm inc/Module/Build/Config.pm inc/Module/Build/ConfigData.pm inc/Module/Build/Cookbook.pm inc/Module/Build/Dumper.pm inc/Module/Build/ModuleInfo.pm inc/Module/Build/Notes.pm inc/Module/Build/PPMMaker.pm inc/Module/Build/Platform/Amiga.pm inc/Module/Build/Platform/Default.pm inc/Module/Build/Platform/EBCDIC.pm inc/Module/Build/Platform/MPEiX.pm inc/Module/Build/Platform/MacOS.pm inc/Module/Build/Platform/RiscOS.pm inc/Module/Build/Platform/Unix.pm inc/Module/Build/Platform/VMS.pm inc/Module/Build/Platform/VOS.pm inc/Module/Build/Platform/Windows.pm inc/Module/Build/Platform/aix.pm inc/Module/Build/Platform/cygwin.pm inc/Module/Build/Platform/darwin.pm inc/Module/Build/Platform/os2.pm inc/Module/Build/PodParser.pm inc/Module/Build/Version.pm inc/Module/Build/YAML.pm inc/build_common.pl lib/EB.pm lib/EB/Booking.pm lib/EB/Booking/BKM.pm lib/EB/Booking/Decode.pm lib/EB/Booking/Delete.pm lib/EB/Booking/IV.pm lib/EB/CPAN/Carp/Assert.pm lib/EB/CPAN/Locale/gettext_pp.pm lib/EB/CPAN/Term/ReadLine/Perl.pm lib/EB/CPAN/Term/ReadLine/readline.pm lib/EB/Config.pm lib/EB/Config/Data.pm lib/EB/DB.pm lib/EB/DB/Postgres.pm lib/EB/DB/Sqlite.pm lib/EB/Export.pm lib/EB/Export/XAF.pm lib/EB/Format.pm lib/EB/Globals.pm lib/EB/Import.pm lib/EB/IniWiz.pm lib/EB/Locale.pm lib/EB/Main.pm lib/EB/Relation.pm lib/EB/Report.pm lib/EB/Report/BTWAangifte.pm lib/EB/Report/BTWAangifte/Wxhtml.pm lib/EB/Report/Balres.pm lib/EB/Report/Balres/Wxhtml.pm lib/EB/Report/Debcrd.pm lib/EB/Report/Debcrd/Wxhtml.pm lib/EB/Report/GenBase.pm lib/EB/Report/Grootboek.pm lib/EB/Report/Grootboek/Wxhtml.pm lib/EB/Report/Journal.pm lib/EB/Report/Journal/Wxhtml.pm lib/EB/Report/Open.pm lib/EB/Report/Open/Wxhtml.pm lib/EB/Report/Proof.pm lib/EB/Report/Proof/Wxhtml.pm lib/EB/Report/Reporter.pm lib/EB/Report/Reporter/Csv.pm lib/EB/Report/Reporter/Html.pm lib/EB/Report/Reporter/Text.pm lib/EB/Report/Reporter/WxHtml.pm lib/EB/Shell.pm lib/EB/Shell/Base.pm lib/EB/Shell/DeLuxe.pm lib/EB/Tools/Einde.pm lib/EB/Tools/MiniAdm.pm lib/EB/Tools/Opening.pm lib/EB/Tools/SQLEngine.pm lib/EB/Tools/Schema.pm lib/EB/Utils.pm lib/EB/Version.pm lib/EB/Wx/FakeApp.pm lib/EB/Wx/Help.pm lib/EB/Wx/IniWiz.pm lib/EB/Wx/IniWiz/OpenDialog.pm lib/EB/Wx/Locale.pm lib/EB/Wx/Shell/EditDialog.pm lib/EB/Wx/Shell/HtmlViewer.pm lib/EB/Wx/Shell/Main.pm lib/EB/Wx/Shell/MainFrame.pm lib/EB/Wx/Shell/PreferencesDialog.pm lib/EB/Wx/Shell/Window.pm lib/EB/examples/Kasverkoop.pm lib/EB/examples/README lib/EB/examples/Userdefs.pm lib/EB/examples/eekboek.conf lib/EB/examples/en/mutaties.eb lib/EB/examples/en/opening.eb lib/EB/examples/en/relaties.eb lib/EB/examples/en/schema.dat lib/EB/examples/nl/bvnv.dat lib/EB/examples/nl/eenmanszaak.dat lib/EB/examples/nl/mutaties.eb lib/EB/examples/nl/ondernemer.dat lib/EB/examples/nl/opening.eb lib/EB/examples/nl/relaties.eb lib/EB/examples/nl/schema.dat lib/EB/examples/nl/vereniging.dat lib/EB/examples/nl_BE/schema.dat lib/EB/res/Wx/icons/button_ok.png lib/EB/res/Wx/icons/eb.icns lib/EB/res/Wx/icons/eb.ico lib/EB/res/Wx/icons/eb.jpg lib/EB/res/Wx/icons/ebicon.png lib/EB/res/Wx/icons/ebwiz.jpg lib/EB/res/Wx/icons/edit.png lib/EB/res/help/en/docs.htb lib/EB/res/help/nl/docs.htb lib/EB/res/locale/en/LC_MESSAGES/ebcore.mo lib/EB/res/migrate/001000008001000009.pl lib/EB/res/migrate/001000009001000010.sql lib/EB/res/migrate/001000010001000011.sql lib/EB/res/migrate/001000011001000012.sql lib/EB/res/migrate/001000012001000013.sql lib/EB/res/migrate/001000013001000014.sql lib/EB/res/migrate/001000014001000015.sql lib/EB/res/migrate/001000015001000016.sql lib/EB/res/schema/eekboek.sql lib/EB/res/templates/en/sampledb.ebz lib/EB/res/templates/en/templates.txt lib/EB/res/templates/nl/bvnv.ebz lib/EB/res/templates/nl/eenmanszaak.ebz lib/EB/res/templates/nl/ondernemer.ebz lib/EB/res/templates/nl/sampledb.ebz lib/EB/res/templates/nl/templates.txt lib/EB/res/templates/nl/vereniging.ebz lib/EB/res/templates/sample.conf lib/EB/user/css/balans.css lib/EB/user/css/balres.css lib/EB/user/css/btwaangifte.css lib/EB/user/css/crdrept.css lib/EB/user/css/debcrd.css lib/EB/user/css/debrept.css lib/EB/user/css/eekboek.css lib/EB/user/css/grootboek.css lib/EB/user/css/journaal.css lib/EB/user/css/openstaand.css lib/EB/user/css/proef.css lib/EB/user/css/result.css lib/EekBoek.pm locale/ebcore-en.po locale/ebcore-en.pox locale/ebcore.pot locale/make_locales_en relnotes-2.00.html relnotes-2.02.html script/ebshell script/ebwxshell t/10_basic.t t/20_dates.t t/30_amounts.t t/31_expr.t t/80_db_postgresql.t t/81_db_sqlite.t t/90_ivp_common.pl t/91_ivp_sqlite.t t/92_ivp_postgres.t t/ivp/ivp.conf t/ivp/ref/balans.html t/ivp/ref/balans.txt t/ivp/ref/balans0.txt t/ivp/ref/balans1.txt t/ivp/ref/balans2.csv t/ivp/ref/balans2.html t/ivp/ref/balans2.txt t/ivp/ref/balans2xxx.html t/ivp/ref/balans2xxx.html t/ivp/ref/btw.html t/ivp/ref/btw.txt t/ivp/ref/btw7.txt t/ivp/ref/btwk2.txt t/ivp/ref/crdrept.txt t/ivp/ref/debrept.txt t/ivp/ref/export.xaf t/ivp/ref/grootboek.txt t/ivp/ref/grootboek0.txt t/ivp/ref/grootboek1.txt t/ivp/ref/grootboek2.txt t/ivp/ref/grootboek_2.txt t/ivp/ref/grootboek_23.txt t/ivp/ref/grootboek_2320.txt t/ivp/ref/grootboek_23_22.txt t/ivp/ref/journaal-postbank.txt t/ivp/ref/journaal-postbank24.txt t/ivp/ref/journaal.txt t/ivp/ref/obalans.txt t/ivp/ref/proef.txt t/ivp/ref/proef0.txt t/ivp/ref/proef1.txt t/ivp/ref/proef2.txt t/ivp/ref/result.txt t/ivp/ref/result0.txt t/ivp/ref/result1.txt t/ivp/ref/result2.txt t/ivp/reports.eb t/ivp_en/ivp.conf t/ivp_en/ref/balans.html t/ivp_en/ref/balans.txt t/ivp_en/ref/balans0.txt t/ivp_en/ref/balans1.txt t/ivp_en/ref/balans2.csv t/ivp_en/ref/balans2.html t/ivp_en/ref/balans2.txt t/ivp_en/ref/balans2xxx.html t/ivp_en/ref/balans2xxx.html t/ivp_en/ref/btw.html t/ivp_en/ref/btw.txt t/ivp_en/ref/btw7.txt t/ivp_en/ref/btwk2.txt t/ivp_en/ref/crdrept.txt t/ivp_en/ref/debrept.txt t/ivp_en/ref/export.xaf t/ivp_en/ref/grootboek.txt t/ivp_en/ref/grootboek0.txt t/ivp_en/ref/grootboek1.txt t/ivp_en/ref/grootboek2.txt t/ivp_en/ref/grootboek_2.txt t/ivp_en/ref/grootboek_23.txt t/ivp_en/ref/grootboek_2320.txt t/ivp_en/ref/grootboek_23_22.txt t/ivp_en/ref/journaal-postbank.txt t/ivp_en/ref/journaal-postbank24.txt t/ivp_en/ref/journaal.txt t/ivp_en/ref/obalans.txt t/ivp_en/ref/proef.txt t/ivp_en/ref/proef0.txt t/ivp_en/ref/proef1.txt t/ivp_en/ref/proef2.txt t/ivp_en/ref/result.txt t/ivp_en/ref/result0.txt t/ivp_en/ref/result1.txt t/ivp_en/ref/result2.txt t/ivp_en/reports.eb EekBoek-2.02.04/README.emacs0000444000076500007650000000110112165465617012771 0ustar jvjvThe EekBoek kit contains two files to be used with GNU Emacs. eekboek-mode.el defines the 'eekboek' major mode for editing EekBoek data files. It is nothing fancy yet. eekboek-site-init.el contains the necessary autoload settings and type associations for EekBoek files. Place these files according to how your distribution configures GNU Emacs. For Fedora systems: /usr/share/emacs/site-lisp/site-start.d/eekboek.el /usr/share/emacs/site-lisp/eekboek-mode.el For Debian systems: /etc/emacs/site-start.d/50eekboek.el /usr/share/emacs/site-lisp/eekboek-mode.el EekBoek-2.02.04/Makefile.PL0000555000076500007650000000241012165465617013003 0ustar jvjv# Makefile.PL -- Build file for EekBoek # Author : Johan Vromans # Created On : Fri Sep 2 14:25:11 2005 # Last Modified By: Johan Vromans # Last Modified On: Tue Jul 6 23:24:13 2010 # Update Count : 105 # Status : Unknown, Use with caution! # Ease the life of the CPAN testers. exit 0 if $ENV{AUTOMATED_TESTING} && $] < 5.008003; use 5.008003; use strict; #use inc::Module::Install; use ExtUtils::MakeMaker; our $data = {}; require 'inc/build_common.pl'; # Warn on non-standard install locations. checkbin(<{usrbin} (or some other convenient location) to "make install". EOD # Write Makefile. my $x = WriteMakefile( NAME => $data->{distname}, AUTHOR => $data->{author}, ABSTRACT => $data->{abstract}, PL_FILES => $data->{pl_files}, INSTALLDIRS => $data->{installtype}, DISTNAME => $data->{distname}, EXE_FILES => $data->{script_files}, VERSION_FROM => "lib/EekBoek.pm", PREREQ_PM => { %{$data->{prereq_pm}}, %{$data->{buildreq_pm}}, }, PM => filelist("lib", '$(INST_LIBDIR)/'), ); # Write .spec file, Debian control, ... ProcessTemplates($data->{distname}, $x->{VERSION}); EekBoek-2.02.04/CHANGES0000444000076500007650000015137612165465617012041 0ustar jvjv2.02.04 * Fix issue #38, crash bij rapport 'save' knop. 2.02.02 2013-05-15 21:45 * Emergency bugfix release. * Fix probleem dat maart 2013 loopt van 2013-03-01 t/m 2013-03-30. Oorzaak is de zomertijd die op 30 maart 2013 inging. 2.02.00 2012-09-18 14:37 * Update documentation, site, help documents. * Update relnotes-2.02 document. * Update README.201210 document. * Aanpassen spec file t.b.v. rpm bouwers. 2.01.06 2012-08-31 22:24 * Eerste beta voor 2.02. * Openen van een nieuw boekjaar is nu mogelijk vanaf juli. * Kleine bugfixes in de nieuwe BTW tariefcodes en afhandeling daarvan. 2.01.05 2012-08-30 11:30 * Voeg de README.201210 toe aan de kit :) 2.01.04 2012-08-29 21:50 * Verschillende wijzigingen in het definiëren en gebruiken van BTW tariefcodes in verband met de invoering van een nieuw BTW tarief per 1 oktober 2012. Zie het bestand README.201210 voor alle details. * Er is nu ook een engelstalige IVP (installatie-verificatie procedure) * Config setting voor errexit waarmee het effect van de command line optie --errexit permanent kan worden afgedwongen voor alle niet-interactieve EekBoek verwerkingen. [shell] errexit = 1 * Elimineer de undefined warning als er geen LANG environment variabele is gezet. * Script om het EekBoek versienummer uit de git repo te halen. 2.01.03 2012-08-01 20:55 * (Bootstrap) Seriële make afdwingen. * Voor het afletteren wordt de boekingsdatum gebruikt, en niet langer de boekingsvolgorde. * Term::ReadLine: Fallback naar T::R::Perl (meegeleverd) met command history en completion. * Er wordt een waarschuwing gegeven wanneer in een boeking '@H' en/of '@L' wordt gebruikt en er meerdere BTW tarieven corresponderen met '@H' of '@L'. * In het grootboek commando kunnen nu ook (hoofd)verdichtingen worden opgegeven. * Voer een rollback uit wanneer een mislukte opdracht dat vergeet te doen. Dit is een tijdelijke stoplap totdat alle opdrachten zich keurig aan de regels voor database transacties houden. * Deprecieer het plaatsen van een D of C na het rekeningnummer bij de specificatie van relaties. * Fix bug 3510006. * Fix bug 3499522. * Many translation / localisation changes for the on-going translatability project. * Several small updates to work with wxWidgets 2.9.x. * Eliminated using Wx :allclasses and :everything. This solves some problems with Cava packager and Wx 2.9.x. * Fix typo in messages (Issue #3477452). * Fix --help handling. * Fix bug #2624283 Dagboeken met whitespace erin worden intern van een underscore voorzien. Dus de opdrachten "Post Bank" "post bank" en post_bank en POST_bank zijn gelijkwaardig. Voor de export wordt de lowercase met underscores naam gehanteerd (zoals al het geval was). * Fix bug #2209529 Dagboeknamen die overlappen met ingebouwde commando's worden niet meer toegestaan. 2.01.02 2011-07-28 21:31 * (ebshell, ebwxshell) Forceer locale naar nl_NL totdat de engelse vertaling klaar is. * (ebshell) Verwijder de Term::ReadLine::Gnu fallback hack zodat de workaround met PERL_RL weer bruikbaar is. * (ebshell) Accepteer commando's weer case-insenstive. 2.01.01 2011-07-25 08:11 * Alle programmacomponenten zijn nu in het Nederlands. Er is nog één enkele vertaling, namelijk die van Nederlands naar Engels. 2.01.00 2011-07-21 22:04 >>> Nieuwe database versie; auto-migratie beschikbaar <<< * Interne cleanups en rework voor de EekBoek API. * Localisatie cleanup. Alle componenten gedragen zich nu gelocaliseerd. De locale instelling wordt initieel overgenomen van de omgeving. De wizards nemen de locale op in de gegenereerde config file. Locale switching op run time is mogelijk. * Verbetering wizards om aan bestaande databases (op server) te kunnen connecten. * Introductie resource- en user-dir. Resources en user info kunnen locale-dependent zijn. * Packaging met Cava Packager en Windows installer met InnoSetup. * Fix bug #3374176. BELANGRIJK: Administraties die last hebben van deze bug moeten opnieuw worden aangemaakt. 2.00.03 2011-03-22 20:42 * (schema) Fix probleem dat het gebruik van een ongedefinieerde BTW tariefgroep onopgemerkt bleef wanneer er wel een groep was gedefinieerd met een afwijkende exclusiviteit. 2.00.02 2010-05-06 * (ebwxshell, linux) Workaround voor het HTML rendering probleem met wxPerl versies 0.95 en 0.95. Dit probleem treft met name Ubuntu 10.4 LTS. * (ebshell) Meer flexibele invoer. Accepteer newlines en returns als regeleinde. Negeer trailing whitespace. Dit elimineert het probleem van spaties achter de laatste backslash. * (eekboek-mode.el) Kleine, niet strict noodzakelijke verbetering. * (ebshell, errexit) Invoerverwerking afbreken indien er een foutboodschap is gegeven. * INSTALL: Refereer naar de wiki. 2.00.01.01 * Packaging for Windows: (build_common.pl) use PL_files to avoid .pl files to be processed. 2.00.01 2010-03-28 20:42 * Fix probleem met Term::ReadLine::Perl. Gebruik in plaats daarvan Term::ReadLine::Gnu. Meest relevant voor Windows en MacOSX. * Elimineer File::HomeDir. Relevant voor MacOSX, omdat de benodigde Mac::Files daar problematisch is en enkel in 32bit beschikbaar. * Nieuwe packaging. Default is cli, gui is optioneel, contrib verhuist naar de wiki. 2.00.00 2010-03-23 20:59 * Release 2.00.00 2.00.00.RC03 2010-03-22 14:04 * Fix probleem dat een overbodige dialoog vraagt om een eekboek.conf. 2.00.00.RC02 2010-03-17 13:40 * Tweede release candidate 2.00. * Diverse fixes voor Windows. * Fix probleem met niet eenduidige interpretatie van getallen. In expressies als "5*0.005" werd 0.005 als 5 gezien i.p.v. 0,005. * Kleine verbeteringen in de wizards. 2.00.RC01 2010-03-12 23:13 * Eerste release candidate 2.00. * (iniwiz) Fix dubbele foutmelding. * Kleine, maar belangrijke aanpassingen t.b.v. Microsoft Windows. * Onderhoud vertalingen toegevoegd aan de kit. 1.05.20 2010-02-19 23:26 * Documentatie aanpassingen. * (iniwiz) Fix probleem met crash na db selectie. * Fix probleem met \ op laatste regel. (wbwxshell) Fix probleem met de result rapporten. 1.05.19 2010-01-27 10:25 * (ebshell) Fix unicode probleem in help strings. * (ebshell) Fix unicode probleem in wizard waardoor administratie namen/codes geen non-ascii tekens konden bevatten. 1.05.18 2010-01-26 10:56 * (ebwxshell) Fix unicode issues. * (ebwxshell) Filter duplicaten uit de history en beperk het aantal teruggeschreven regels tot een instelbaar maximum (default 200). * Upgrade Wx::Perl::ProcessStream to 0.24. 1.05.17 2010-01-22 13:10 * Nieuw command: schema. Hiermee kunnen interactief (vooralsnog alleen) grootboekrekeningen worden aangemaakt. Onderhoud van het schema. Deze opdracht kent sub-opdrachten: schema [ ] Aanmaken grootboekrekening schema gbk [ ] de gewenste grootboekrekening D/C voor Debet / Credit K/O/N voor Kosten / Omzet / Neutraal Eventueel gevolgd door ! als deze balansrekening vast staat aan één kant De omschrijving van deze grootboekrekening De verdichting waaronder deze rekening valt Wanneer enkel een nummer wordt opgegeven dan worden de gegevens van de betreffende grootboekrekening getoond. * Fix probleem met completion van rekeningnummers. * Upgrade Module::Build to 0.32 to have decent prereq support. 1.05.16 2010-01-17 00:14 * (ebshell) Non-zero exit status indien fouten zijn opgetreden. Dit kan consequenties hebben als ebshell wordt toegepast in makefiles. * (ebshell) Verwijderen opties --createsampleconfig en --createsampledb (vervangen door de wizard). * (ebshell, wizard) Gebruik eigen code (recursief) om --init uit te voeren. * (ebshell, shell) Grote opruiming. * (migration) Fix: DB automigratie van SQLite zat PostgreSQL in de weg. 1.05.15 2010-01-16 16:32 * Small changes for the packaging. 1.05.14 2010-01-13 11:12 * (ebwxshell) Icon buttons i.p.v. [Edit] en [Send]. Conform to Gnome Human Interface Guide. * (ebwxshell, editdialoog) Resizable, onthoudt size/pos. * (ebwxshell) Meer rapporten in het menu. * (ebwxshell) EditDialog meeleveren :) * Eerste herziening van de documentatie. * Fix test probleem op een virgo install. * Fix probleem met het verwerken van het schema (privé werd niet herkend). * Kleine aanpassingen om het opstartgedrag van ebshell en ebwxshell consistent te maken. 1.05.13 2010-01-06 21:21 1.05.12 2010-01-06 20:09 === EXPERIMENTAL === * De configuratie file mag nu ook "eekboek.conf" heten. Sterker nog, "eekboek.conf" wordt geprefereerd boven ".eekboek.conf". Dus wanneer beide er zijn wordt alleen "eekboek.conf" gebruikt. Wanneer nieuwe files worden aangemaakt wordt alleen "eekboek.conf" aangemaakt. Wanneer er alleen ".eekboek.conf" bestanden zijn moet het gedrag ongewijzigd zijn gebleven. 1.05.11 2010-01-06 13:56 * (ebwxshell, wizard) Verplicht unieke administratie naam en code. * (ebshell) Wizard om administraties aan te maken. * (ebwxshell) Mogelijkheid om de input regel uitgebreid te editen, inclusief multi-line support. 1.05.10 2009-12-23 22:32 * (ebwxshell) Persistent window size/positions. * (MS-Windows) Consequent gebruik van de registry. HKCU\Software\Squirrel Consultancy\EekBoek\ebwxshell * (Config) Gebruik HOMEDRIVE/HOMEPATH voor Windows. 1.05.09 2009-12-23 13:18 * (ebwxshell) Drill-down. In de rapportage windows kun je klikken op (de meeste) grootboeknummers, journaalposten en relatiecodes om daarmee het bijbehorende overzicht op te roepen. Voor het beste resultaat verdient het aanbeveling de preference "Rapporten in hetzelfde venster" uit te zetten. 1.05.08 2009-12-22 23:00 * Configuratie files: [locale] lang werkt nu (weer). [database] - fullname is vervallen. - name prefix "eekboek_" wordt niet langer gestript. - driver = sqlite is nu default. * (ebwxshell) Fix preferences save/restore. * examples/eekboek.conf bijgewerkt. * Meer vertaald. 1.05.07 2009-12-22 14:00 * (ebwxshell) Preferences voor error/warning/info popup windows. * (ebwxshell) Icon. * (ebwxshell) Altijd wizard/sel opstarten, ook als er een .eekboek.conf is. 1.05.06 2009-12-20 13:18 * Fix probleem dat ebshell niet langer create{database|sampleconfig} kon doen. * Missend icon toevoegen. * ebwxshell installeren ipv. ebgui. * Nieuwe settings toegevoegd aan examples/eekboek.conf. 1.05.05 2009-12-19 15:23 * Integratie met EB WxShell. * Verwijder (tijdelijk) GUI voor ombouw tot browser. * (Wizard) Config 'admdir' in sectie '[general]' kan worden gebruikt om te bepalen waar de administraties (moeten komen te) staan. * (Wizard) Voorkom dat de verkeerde ebshell wordt opgestart. * (Wizard) Gebruik de voorbeeldadministratie als default. * Bugfix (regressie) BTW werd niet afgeboekt in de volgjaren van een meerjarige boekhouding. * Bugfix: meervoudige definitie van 'min' in EB/Tools/Einde.pm. * Bugfix: ebgui kende --[no]wizard niet. * (Wizard): Defaults voor adm code en database naam. 1.05.04 2009-10-28 23:47 * Many internal changes for GUI integration. * Consistent gedrag gui/wizard. 1.05.03 2009-10-27 16:15 * !!! SNAPSHOT !!! SNAPSHOT !!! SNAPSHOT !!! * (GUI) Bugfix: Dagboeken -> Inkoop/Verkoop hadden geen title. * (Wizard) Toon alle beschkbare database drivers. * (Wizard) Fix vertaling buttons. * (Wizard) Ingave database folder. * (Wizard) Automatisch vormen van database naam uit de naam van de administratie. * (GUI) Aanmaken van en kiezen uit administraties die in een folder zijn ondergebracht. --admdir command line optie. 1.05.02 2009-10-19 11:47 * !!! SNAPSHOT !!! SNAPSHOT !!! SNAPSHOT !!! * (GUI) Verhelpen probleem van opstarten GUI vanuit Wizard. * Verhelpen probleem met de voorbeeldadmin (mutaties waren nog niet omgezet naar UTF-8). 1.05.01 2009-10-18 22:46 * !!! SNAPSHOT !!! SNAPSHOT !!! SNAPSHOT !!! * (GUI) Templates voor de setup wizard. * Discontinueer ondersteuning voor latin1 bestanden. Alles is nu UTF-8. * Export ondersteunt --titel (omschrijving van de export kit). Vooralsnog alleen relevant voor export naar ebz file. * (GUI) Export/EekBoek: Omschrijving kan worden opgegeven. * (GUI) IniWiz: Gebruik omschrijving in de templates lijst. * (SQLite) Config database::path bepaalt waar de databases worden neergezet. * Andere processing van de configuratiefiles. Mag geen zichtbare gevolgen hebben. * Andere processing van numerieke expressies in bedragen. Mag geen zichtbare gevolgen hebben. * Bedragen mogen nu ook worden ingegeven met duizendtalscheidingstekens, dus b.v. 1.234,56 of 1,234.56 . * (IVP) Verbetering opzet en afhandeling. * (Config) format:amount vervangt locale:decimalpt, locale:thousandsep en text:numwidth. 1234.56 -> dpt = "." 1234,56 -> dpt = "," 1.234,56 -> dpt = ",", sep = "." 1,234.56 -> dpt = ".", sep = "," 1.234.567,89 -> dpt = ",", sep = ".", width = 12 De width wordt alleen aangepast als het format breder is dan 9 tekens. 1.05.00 2009-10-09 17:50 * !!! SNAPSHOT !!! SNAPSHOT !!! SNAPSHOT !!! * (GUI) Admin setup wizard. * Strafbankje voor balansrekeningen. * Fix problem dat 'privé' niet wordt gematched als content-type = utf8 en $cfg->unicode. 1.04.04 2009-06-10 12:13 * Bugfix voor --createsampleconfig . * Bugfix voor --createsampledb . 1.04.03 2009-04-03 12:18 * Consolidatie. Geen wijzigingen. 1.04.02 2009-01-25 21:20 * Nieuwe voorbeeldmodule voor userdefs: examples/Kasveroop.pm . * bkm_multi: Fix probleem dat de intern aangemaakte boekingen worden geformatteerd volgens thousandsep, wat ongeldige invoer kan opleveren. * Fix bug 2172095. 1.04.01 2008-09-04 * Fix probleem met Windows Vista. 1.04 2008-08-30 10:53 * Versienummer aangepast. 1.03.93 2008-08-24 18:52 * Revisie en actualisatie on-line documentatie. 1.03.92 2008-08-10 21:18 * Kleine verbeteringen XAF export. Fix --boekjaar voor --xaf export. * Verwijder --boekjaar optie voor gewone export. 1.03.91 2008-08-02 15:06 (CPAN only) * Bugfix headerinderdrukking van de BTW-aangifte. 1.03.90 2008-07-19 18:58 * Alle rapporten in HTML kunnen een expliciete titel meekrijgen: balans --title="Voorlopige balans 2009" --out=x.html * Bugfix: Meer dan één -D / --define op de command line mogelijk. * Kleine wijzigingen in het verwerken van de config files. De ".eekboek.conf" in de huidige directory wordt niet langer meegenomen indien ebshell wordt opgestart met een "-f" optie. 1.03.13 2008-04-13 16:09 * Voorkom warnings indien bij de BTWaangifte er geen voorheffingen hebben plaatsgevonden in de periode waarover aangifte wordt gedaan. * (EB::Report::Genbase) Geen backends laden indien AUTOMATED_TESTING. Hiermee worden test failures vermeden indien er achterhaalde EekBoek installaties rondzwerven. * Oplossen installatieprobleem met RPM. * Uitbreidingen contrib/afschr.pl . 1.03.12 10-04-2008 13:47 * BKM deb/crd boeking gebruikt altijd de standaardrekeningen voor deb/crd i.p.v. de aan het dagboek gekoppelde rekening. * Kleine wijzigingen in de BTW rapportage. * Debian kit is now also 'unstable'. 1.03.11 22-032008 17:07 * BTW tariefgroepen Privé en Anders. In schema: 5 BTW Privé :tariefgroep=privé :perc=12,00 :exclusief 6 BTW Anders :tariefgroep=anders :perc=14,50 :exclusief Als deze taeriefgroepen worden opgevoerd dan moeten de betreffende koppelingen ook worden opgegeven: 4240 D BTW Inkoop Anders :koppeling=btw_ia 4250 C BTW Verkoop Anders :koppeling=btw_va Etc. BTW 'Privé' komt in de BTW aangifte in groep 1d, BTW 'Anders' komt in groep 1e. Deze groepen worden niet op het aangifteformulier vermeld als de betreffende tariefgroep ontbreekt. * BTW Aangifte: Uitgebreidere signalering discrepanties in BTW posten. * Kleine wijzigingen in de BTW rapportage. * EekBoek shell opdrachten zijn nu case-insensitive. * contrib/afschr.pl: tooltje om afschrijvingen te berekenen. * Fix regressie in debiteuren/crediteuren overzichten. * CPAN testing: Skip silently if perl < 5.8.3. 1.03.10 27-02-2008 11:55 * CPAN testing: Skip PostgreSQL tests if no database access. * CPAN testing: Encode reference data to UTF-8 if running in an Unicode environment. * Fix issue 1901436. 1.03.09 25-02-2008 13:01 * Update PPD met 5.10 info. * --config (-f) accepteert nu ook de naam van een directory, en probeert dan eekboek.conf en .eekboek.conf. * Commando's 'journal', 'trace' en 'confirm' kennen nu een'--quiet' optie, waardoor de opdrachten stil worden uitgevoerd. * Journaalposten worden niet meer gerapporteerd tijdens import en init. * Nieuw, actueel, eenvoudiger en beter schema voor de example database. * Verified to work with Perl 5.10.0 and DBD::Pg 2.0.0. * CPAN testing: Fix problems that cause the wrong perl to be used. * CPAN testing:Fix problems that cause the wrong sample files to be used. * Elimineer warnings bij export van administraties die niet alle standaardkoppelingen hebben. * Fix issue 1871576. 1.03.08 15-02-2008 21:08 * Boekingen in een periode waarover BTW aangifte is gedaan kunnen toch worden gewijzigd als deze boeken geen betrekking heeft op de BTW (m.a.w., BTW type Neutraal). * Fix problem met #! in ebshell script bij CPAN build. * Kleine aanpassingen t.b.v. de GUI. 1.03.07 06-02-2008 18:12 * Fix bug waardoor een adm_relatie met datum 31-12 niet werd geaccepteerd wanneer er al eerdere boekingen in dat jaar waren. * Fix bug waardoor openstaande posten uit voorgaande jaren XXXX leidden tot de melding "Boekjaar XXXX nog niet afgesloten". * Fix auto-migratie bug. 1.03.06 05-02-2008 11:57 * Enkele aanpassingen in het strategy:bkm_multi gebeuren. Omdat het zoekproces enige tijd in beslag kan nemen (enkele minuten bij 25 openstaande posten) is een begrenzing ingebouwd. Config: strategy:bkm_multi_max (default = 15). * Bij een inkoop/verkoop boeking kun je een willekeurige (moet tenminste één niet-cijfer bevatten) string opgeven als referentie: inkoop 25-12 CREDITEUR "Diversen" --ref="P24XyzBla!" 100 Een geschikte kandidaat is b.v. het faktuurnummer van de klant, of een ordernummer. Deze referentie kun je later gebruiken bij de betaling: postbank 25-12 Afschrijving \ crd 25-12 "CREDITEUR:P24XyzBla!" -100 Dus net zoals: postbank 25-12 Afschrijving \ crd 25-12 inkoop:54 -100 Overigens met dezelfde functionaliteit: er wordt niet gekeken of de boeking open staat. Je kunt dus op deze manier ook op voorhand boeken. De combinatie relatiecode - referentie moet per boekjaar uniek zijn. * De journaal-rapporten laten nu ook de relatiecodes zien bij inkoop- en verkoopboekingen. * Bij de rapportage openstaande posten kan nu ook worden geselecteerd dat alleen de debiteuren, crediteuren, of een enkele relatie wordt weergegeven. * Bij de crediteuren/debiteurenrapportages kan nu ook worden aangegeven dat alleen de openstaande posten moeten worden weergegeven. Let op: Openstaande posten van voorgaande boekjaren worden NIET vernmeld. * Fix enkele problemen met SQLite en Unicode. * Makefile.PL toegevoegd. * Nieuwe configuratie setting: [preferences] journal = 1 Hiermee wordt na elke boeking automatisch de betreffende journaalpost getoond. Deze preference setting vervangt de command line optie "--journaal". * Command line optie "--init". Hiermee wordt een nieuwe administratie opgezet in de huidige directory. Equivalent met "--import --dir=.". * Command line opties "--database" (en de verkorte vorm, "--db") en "--journaal" komen binnenkort te vervallen. * LET OP: EekBoek met SQLite ondersteunt niet de opdracht "import". Importeren uitsluitend met de command line versie ebshell --import ... * Database structuur is gewijzigd, auto-migratie is beschikbaar. Let op: automigratie voor SQLite geeft een foutmelding: !De database wordt aangepast aan de nieuwere versie DBD::SQLite::st execute failed: database schema has changed(1) ... DBD::SQLite::st execute failed: database schema has changed(1) ... De migratie is echter ok. Daarna kun je opnieuw opstarten. 1.03.05 28-10-2007 20:57 IV Boekingen: Config optie strategy:iv_vc. Bij het boeken in een Inkoop- of Verkoopdagboek wordt BTW berekend per boekstukregel. Sommige leveranciers berekenen echter de BTW over het totaal van de boekstukregels. Daardoor kunnen afrondingsverschillen ontstaan met als gevolg een boekstuktotaal dat niet klopt met de opgegeven waarde. De boeking zal dan worden geweigerd. EekBoek zal proberen zo'n boeking te corrigeren door de BTW te herberekenen over het totaal. Er wordt dan een melding gegeven, en een correctieboekstukregel aangemaakt. Dit gedrag kan worden afgezet door de strategy optie iv_vc de waarde 0 te geven. 1.03.04 18-07-2007 19:15 WAARSCHUWING: Hoewel de database niet is gewijzigd moeten bestaande administraties worden geëxporteerd en weer geïmporteerd. Dit kan met de nieuwe versie van EekBoek, dus na de upgrade. BTW Aangifte: Toon ook het onafgeronde totaal en de afronding. BTW Aangifte: Optie --noround voor een onafgerond rapport. BTW Aangifte: Fix probleem met relaties die zowel debiteur als crediteur zijn. BKM Boekingen: Config optie strategy:bkm_multi. Indien gezet en niet nul (kortom, true) dan wordt in geval een boeking niet kan worden gematched tegen een openstaande post geprobeerd of deze boeking wellicht voor meerdere openstaande posten tegelijk bedoeld is. Klant-specifieke wijzigingen in de (niet ondersteunde) DaviAccount import module. 1.03.03 27-06-2007 12:39 BKM Boekingen: Toon bedrag en relatie indien geen openstaande post kan worden gevonden. Shell: Optie --errexit: Verwerking van invoer breekt direct af na geconstateerde fouten. Shell: Optie --[no]interactive om interactief gedrag te forceren ook al komt de invoer niet van een terminal. Niet bedoeld voor uitwendig gebruik. Redesign en implementatie van de reporter backends. eekboek-mode.el: Emacs major mode voor EekBoek data. Kleine bugfixes. 1.03.02 04-02-2007 21:29 Fix probleem met foutieve export van adm_btwperiode in multi-jaar admin (issue 1628783). HTML reports: Use normal comments /* */ instead of for included styles. Voorbeeldschema's verplaatst van lib/EB/schema naar lib/EB/example. Voorbeelden verplaatst van lib/EB/example naar lib/EB/examples. Nieuw voorbeeldschema voor een vereniging, met dank aan Edwin Hakkennes. Fix probleem met UTF-8 data in Latin1 files in export zip. 1.03.01 27-12-2006 15:48 *** DATABASE STRUCTUUR IS GEWIJZIGD *** Export de data voor de upgrade! Database migratie werkt alleen met PostgreSQL. Optie: --createsampledb. Geen gezeur meer over de plaats van de demo data, of gecompresste data files. Debiteuren en crediteuren kunnen nu per dagboek verschillend worden opgegeven. Fix probleem met jaareinde van BTW-loze administratie. Fix probleem met rapportbreedte jaareinde. Fix probleem met SQLite en opdrachten die direct na een createdb/schema worden uitgevoerd, zoals b.v.: $ cat relaties.eb opening.eb | ebshell --createdb --schema=schema Fix probleem met het opruimen van de directories na (rpm) uninstall. 1.03.00 13-12-2006 21:55 Expliciete controle of een nieuw boekstuknummer nog vrij is, ter voorkoming van een onvriendelijke "dup key" melding. Fix bug met strings in de export die " en \ bevatten. Expliciete(re) sorteervolgorde voor alle uitvoer. Afronding mogelijk via 'bankers rounding'. 1.02.01 Config::IniFiles is nu onderdeel van EekBoek en hoeft niet langer apart te worden geïnstalleerd. Fix migratieprobleem 1.0.9 -> 1.0.10 voor PostgreSQL 7.x of zo. 1.02.00 2006-10-23 12:15 Release 1.02.00. 1.01.03 -> 1.02.00 Elimineer setting van environment variabelen in de lees-loop. Foute opdrachten als "foo=bar" werden daardoor niet gezien. 1.01.02 2006-10-16 22:36 Fix bug in export van :dc property voor dagboeken. Foutmelding "geen schema" is nu "geen database schema" om onderscheid te maken met het rekening schema. Kleine workarounds i.v.m. het INIT block probleem van PAR. Multi-user implementatie van sequences voor SQLite. Deze database zou daarom nu ook volledig multi-user moeten kunnen worden gebruikt. 1.01.01 2006-10-13 15:59 Fix migratieprobleem 1.0.9 -> 1.0.10. 1.01.00 2006-10-13 14:34 Retrofit: Hernoem de rpm's naar EekBoek-unstable. 1.01.00 2006-10-11 15:15 Support voor SQLite database. Inclusief IVP test. Eliminatie PostgreSQL afhankelijkheden. Stabiele sorteervolgorde voor Journaal. IVP voor een database wordt overgeslagen wanneer geen driver voor die database beschikbaar is. IVP gebruikt nu de bestanden uit de example directory. Database versie 1.0.10; migratie beschikbaar. WAARSCHUWING: Bij teruggaan naar 1.0.9 moet de database eerst fysiek worden verwijderd! 1.00.04 2006-10-11 14:59 Trace messages voor SET/GET SEQUENCE. Update EekBoek.spec[.in] met goede URLs en zo. 1.00.03 2006-10-06 15:05 Fix bug met TAccounts tabel bij interactief commando import. Fix bug in --ident display. 1.00.02 2006-09-30 13:54 Forceer UNICODE onder Windows, tenzij locale:unicode dit overruled. Fix een bug in de inputafhandeling waar regels die met whitespace geheel worden genegeerd. Fix bug in het opstarten van het (ongedocumenteerde) sql commando. 1.00.01 2006-09-28 15:43 Fix een bug waardoor de TAccounts tabel niet werd aangemaakt in geval van --import. Over het algemeen onschadelijk, tenzij de mutaties.eb een opdracht bevat die TAccounts nodig heeft, zoals een jaareinde. Fix detectie van Windows. 1.00 2006-08-27 21:15 Op de kop af 18 maanden nadat ik de eerste regels intoetste tot wat nu EekBoek geworden is is het zover: de stabiliteit, functionaliteit, degelijkheid, veelzijdigheid en gebruiksgemak zijn naar tevredenheid van de gebruikers (en van mij!). Hier is hij dan: Versie 1.00! * http://www.eekboek.nl/dl/EekBoek-1.00-1.noarch.rpm * http://www.eekboek.nl/dl/EekBoek-1.00-1.src.rpm * http://www.eekboek.nl/dl/EekBoek-1.00.tar.gz * http://www.eekboek.nl/dl/EekBoek.ppd Alle kits zijn voorzien van een aparte digitale handtekening. De key ervan vind je op http://www.eekboek.nl/fedora/RPM-PGP-KEY-EekBoek. YUM liefhebbers kunnen een (experimentele) repository toevoegen door het installeren van http://www.eekboek.nl/fedora/EekBoek-yum-1.0-1.noarch.rpm. Zie voor meer informatie http://www.eekboek.nl/fedora/repodata . De aanbevolen manier van installeren is door middel van de RPM. Belangrijkste wijzigingen: * Deze versie is identiek aan 0.93, met alleen het versienummer aangepast. 1.0RC3 2006-08-05 14:45 EekBoek heeft nu een eigen web site: http://www.eekboek.nl . EekBoek 1.0 Release Candidate 3 is daar nu beschikbaar: * http://www.eekboek.nl/dl/EekBoek-0.93-1.noarch.rpm * http://www.eekboek.nl/dl/EekBoek-0.93-1.src.rpm * http://www.eekboek.nl/dl/EekBoek-0.93.tar.gz * http://www.eekboek.nl/dl/EekBoek.ppd Alle kits zijn voorzien van een aparte digitale handtekening. De key ervan vind je op http://www.eekboek.nl/fedora/RPM-PGP-KEY-EekBoek. YUM liefhebbers kunnen een (experimentele) repository toevoegen door het installeren van http://www.eekboek.nl/fedora/EekBoek-yum-1.0-1.noarch.rpm. Zie voor meer informatie http://www.eekboek.nl/fedora/repodata . De aanbevolen manier van installeren is door middel van de RPM. Belangrijkste wijzigingen: * Deze versie is identiek aan 0.92, met uitsluitend de gewijzigde web site in sources en documentatie. 1.0RC2 2006-07-20 15:11 * Deze versie is identiek aan 0.63. 0.63 2006-07-12 19:02 * Herstel ernstige fout in het hernieuwde saldoberekeningsmechanisme. VERSIE 0.62 NIET GEBRUIKEN. RESTORE DE PRE-0.62 DATABASE! * Controleer bij het verwijderen van een boeking of het boekjaar of de BTW periode niet is afgesloten. 0.62 XXXXXXXXXXXXXXXX * Bank- en kasboekingen kunnen ook een --beginsaldo meekrijgen. Saldobepaling gaat op volgorde van boekstuknummer (was: invoervolgorde). Het beginsaldo moet overeenkoment met het eindsaldo van het eraan voorafgaande boekstuk (indien aanwezig). Het eindsaldo moet overeenkoment met het beginsaldo van het erop volgende boekstuk (indien aanwezig). Dit lost tevens een im/exportprobleem op met boekstukken die worden verwijderd en later opnieuw ingevoerd. * Export van boekstukken gaat nu per dagboek, op volgorde van boekstuknummer. * Database structuur is gewijzigd -- automigratie is beschikbaar. * Boekingen laten geen informatie meer zien tenzij de optie --verbose wordt meegegeven. (Is dit een goed idee?) 0.91 2006-07-03 14:37 1.0 Release Candidate 1 * UNICODE is nu default, de ebshell 'banner' toont nu in voorkomende gevallen (Latin1) in plaats van (UNICODE). * De tekensetaanduiding in bestanden is gewijzigd van # Content-Type: text; charset = ... in # Content-Type: text/plain; charset = ... De oude vorm blijft vooralsnog herkend. * De automigratie-bestanden zijn verwijderd. 0.61 2006-06-20 22:04 * Import naar en Export van files. $ ebshell --export --file data.ebx $ ebshell --import --file data.ebx Dit vereist het beschikbaar zijn van de module Archive::Zip. * Voor inkoop- en verkoopboekingen mag de boekstukomschrijving of de boekstukregelomschrijving (maar niet beide) leeg zijn. De waarde van de andere omschrijving wordt dan overgenomen. Dit is met name handig voor simpele inkoop-/verkoopboekingen waarbij normaalgesproken beide beschrijvingen toch hetzelfde zouden zijn: inkopen 10-10 "Internetkosten" XS4ALL "" 10,00 * Fix een (overigens onschuldige) "undefined" warning bij verwijderen van een partiële boeking. 0.60 2006-06-09 15:08 * Lokatie van de 'example' directory: - In geval van Build install: /EB/example - In geval van RPM install: /EekBoek-x.xx/example - In geval van PPM install: /EB/example * Het sample database script is vervallen. Met de nieuwe import functionaliteit kan de sample database eenvoudig worden opgezet met $ ebshell --db=sample --import --dir= waarin de 'example' directory is. 0.59 2006-06-05 21:48 * Het main programma ebshell is nu een triviale wrapper rondom module EB::Shell. (Dat is nu zo'n wijziging waar niemand iets van zou moeten kunnen merken, maar je weet maar nooit.) * Er is nu een command line import en export commando. $ ebshell --export --dir=foo Equivalent met: $ ebshell -c export --dir=foo $ ebshell --import --dir=foo Equivalent met: $ ebshell --createdb -c import --dir=foo * Bijkomende wijzigingen voor CSS handling (zie 0.58). * Fix probleem met verwijderen script dir van geïnstalleerde rpm. * Fix 1 januari-probleem met openingsbalans. 0.58 2006-06-01 18:04 * CSS stylesheet afhandeling in HTML rapporten Er is nu een config setting `cssdir' in sectie `html' waar de directory kan worden opgegeven waar de CSS stylesheets zijn te vinden. Het uiteindelijke resultaat hangt af van deze `cssdir', en de voor het rapport opgegeven `style' optie. Style Cssdir Resultaat -------------------------------- - - De EekBoek standaard style voor dit type rapport wordt opgenomen in het rapport. naam - De EekBoek standaard style `naam' wordt opgenomen in het rapport. - dir Stylesheet link naar dir/std.css, waarin std de naam is van de EekBoek standaard style voor dit type rapport. naam dir Stylesheet link naar dir/naam.css bestandsnaam n.v.t. Stylesheet link naar bestandsnaam Zonder wijzigingen betekent het dat de standaard stylesheet nu in de rapporten wordt opgenomen, zodat deze direct toonbaar zijn. Om hetzelfde resultaat te bereiken als tot nu toe het geval is, moet de config setting [html] cssdir = css worden opgegeven. 0.57 25-05-2006 20:54 * Probeerdatabase Na afloop van de installatieverificatietests is er een probeerdatabase "sample" beschikbaar. Deze wordt nu ook in de vorm van een SQL file in de example directory meegeleverd. Dit is met name van belang indien er wordt geïnstalleerd vanuit een RPM, want dan is de probeerdatabase niet aangemaakt. De probeerdatabase kan te allen tijde worden (her)aangemaakt met: $ dropdb eekboek_sample $ psql template1 < example/sampledb.sql Na een RPM installatie is de example directory te vinden in de zogenaamde 'doc' dir, meestal /usr/share/doc/eekboek-X.XX'. * Controle op numeriek zijn van het boekstuknummer. * "--opening" optie voor "balans". Hiermee wordt de openingsbalans opnieuw getoond. In geval van meervoudige boekjaren dienen de voorgaande boekjaren te zijn afgesloten, anders is deze openingsbalans gelijk aan de eindbalans van het voorgaande boekjaar. 0.56 05-05-2006 21:53 * (Enigszins experimenteel) Betere Unicode transparantie. Alle door EekBoek te verwerken bestanden kunnen middels een Content-Type aanduiding aangeven of de inhoud Latin1 dan wel UTF-8 is. Dit geldt voor: - schema - invoer via redirectie en de 'include' opdracht. Bij het schrijven van export-bestanden wordt standaard een Content-Type toegevoegd. De Content-Type aanduiding is: # Content-Type: text; charset = XXX XXX = Latin1, Latin9, ISO-8859.1 of ISO-8859.15 (voor Latin1 invoer) XXX = UTF-8 (voor Unicode UTF-8 invoer) Zonder Content-Type aanduiding worden de invoerbestanden verondersteld overeen te komen met de omgeving, dus UTF-8 in een Unicode omgeving, en anders Latin1. De meegeleverde bestanden (schema's) zijn nu in UTF-8, en hebben een overeenkomstige Content-Type aanduiding. De restrictie dat in een Unicode omgeving een database ook Unicode moet zijn is (voorlopig) (weer) vervallen. * Onder MS Windows wordt default een Unicode omgeving verondersteld. * Keuze uit afrondingsalgoritmen. In de config file: [strategy] round = XXX Op dit moment zijn er twee mogelijkheden: "ieee", de huidige methode, en "posix", een over het algemeen iets betere afrondingsmethode. Suggesties (plus implementatie, zie EB::Format) voor meer afrondingsalgoritmen zijn welkom. * Fix probleem met trailing backslash in non-file invoer. 0.55 04-04-2006 15:22 * Instelbaar datumformaat. In de config file: [format] date = yyyy-mm-dd Mogelijke formaten zijn: YYYY-MM-DD (default), DD-MM-YYY en DD-MM. In het laatste geval wordt, waar nodig, het formaat aangevuld tot DD-MM-YYYY. 0.54 04-04-2006 12:01 * Aanvullende fixes voor UNICODE. Bestanden worden gecontroleerd op valide UNICODE tekens. Non-UNICODE databases worden geweigerd indien UNICODE is geactiveerd. Een database kan gemakkelijk worden geconverteerd met: $ pg_dump eekboek_XXX > xx $ dropdb eekboek_XXX $ createdb -E unicode eekboek_XXX $ psql eekboek_XXX < xx Let op: De standaardbestanden (schema's en zo) zijn nog steeds Latin1. * De HTML uitvoer kan gebruik maken van de module HTML::Entities, indien deze is geïnstalleerd. 0.53 29-03-2005 20:35 * UNICODE support. ****EXPERIMENTEEL**** Aanzetten met de EekBoek locale in de config file: [locale] unicode = 1 of [locale] lang = nl_NL.utf8 Elke suffix anders dan utf8 (of utf-8) wordt als latin1 geïnterpreteerd. ("unicode" heeft prioriteit over "lang"). Semantiek: - Alle geproduceerde uitvoer (scherm, maar ook rapporten, exports, etc) wordt in UTF-8 weggeschreven. - Alle invoerbestanden (schema, opening.eb, imports, etc) moeten UTF-8 zijn. Geen databasewijzigingen. Echter, alle met 0,53 aangemaakte databases zijn niet te verwerken met pre-0.53 versies. Zonder het aanzetten van UNICODE moet alles zijn zoals het was. Zoals gezegd, is e.e.a. nog een beetje experimenteel. Testresultaten en feedback wordt op prijs gesteld. Let op: De standaardbestanden (schema's en zo) zijn nog steeds Latin1. 0.52 27-03-2006 15:21 * Wijzigingen in packaging t.b.v. RPM-build en CPAN. * Database-tests kunnen worden uitgevoerd met een RPM-build: $ rpmbuild ... --with dbtests ... * De source-RPM is getekend met mijn GPG key. Om de source-RPM te verifiëren moet je mijn GPG key in het rpm systeem importeren, bijvoorbeeld: $ wget http://www.squirrel.nl/people/jvromans/pubkey.asc $ sudo rpm --import pubkey.asc * Fix probleem met aanmaken database op remote database server. Hierdoor faalt de IVP indien de database nog niet bestaat. 0.51 24-02-2006 15:03 * Bouwen en installeren gaat nu middels het Module::Build framework. $ perl Build.PL $ ./Build $ ./Build test $ su # ./Build install * Het Module::Build framework wordt (vooralsnog) meegeleverd. * Een compatibility-mode Makefile.PL is meegeleverd. * De installatie-verificatieprocedure is nu geïntegreerd in de build tests. * De build, test en installatie kan nu ook onder ActiveState Perl onder Windows. * Fix probleem met ophalen database naam op remote database server. 0.50 17-03-2006 19:34 * Bugfixes m.b.t. de boekhoudkundige/rekenkundige berekening van balanstotaal. 0.49 16-03-2006 * De oorspronkelijke, boekhoudkundige berekening van het balanstotaal voor de openingsbalans wordt nu ook weer geaccepteerd, evenals de in de vorige versie geïntroduceerde rekenkundige berekening. Zie de documentatie. * Kleine bugfixes. 0.48 13-03-2006 20:54 * Negatieve getallen in de openingsbalans blijven gehandhaafd. In vorige versies werd (foutief!) de D/C status gewisseld. B.v., oude situatie: adm_balans 100 adm_balans -10 adm_balans 90 adm_balanstotaal 100 Nieuwe situatie: adm_balans 100 adm_balans -10 adm_balans 90 adm_balanstotaal 90 Dit is een incompatibele wijziging, doch enkel indien er negatieve bedragen in de openingsbalans voorkomen (wat doorgaans niet het geval zal zijn). In dat geval moet het balanstotaal even worden aangepast. * Fix BTW afsluiting na export/import indien BTW periode != jaar. 0.47 10-03-2006 13:54 * Additionele fixes voor duizendpuntjes in jaarafsluiting. * Fix BTW afsluiting na export/import indien BTW periode != jaar. 0.46 07-03-2006 10:06 * Duizendpuntjes worden niet worden toegepast in geëporteerde gegevens omdat die anders niet meer kunnen worden ingelezen. 0.45 06-03-2006 17:23 * Kolombreedte van bedragen in tekstuele rapportages is instelbaar. Configuratievariabele 'numwidth' in sectie 'text' kan hiervoor worden gebruikt: [text] numwidth = 10 numwidth = +1 numwidth = 111% Elk van deze settings vergroot de standaardwaarde van 9 naar 10. * Duizendpuntjes. Configuratievariabele 'thousandsep' in sectie 'locale' kan hiervoor worden gebruikt: [locale] decimalpt = , thousandsep = . De kolombreedte in tekstuele rapportages wordt automatisch vergroot bij het gebruik van duizendpuntjes. * Windows install kit voor de ActiveState Perl Package Manager. Zie README.WINDOWS. 0.44 05-03-2006 22:26 * Inkoop/Verkoopdagboeken mogen ook een :rekening specificatie krijgen in het schema. Indien deze ontbreekt wordt de koppeling "crd" resp "deb" gebruikt. * Koppelingen voor "deb" en "crd" mogen ontbreken in het schema mits er geen dagboeken zijn die er gebruik van maken. * De BTW tabel mag ontbreken in het schema. Er wordt dan geen BTW toegepast. Bijvoorbeeld voor organisaties die niet BTW-plichtig zijn. (Experimenteel) * Alle koppelingen voor BTW (btw_ih, btw_vl, etc...) mogen ontbreken in een BTW-vrije administratie. * Configuratie-setting "userdefs" in sectie "shell" om een userdefs module te selecteren. Pas op: als de module niet succesvol laadt is dit een fatale fout. 0.43 03-03-2006 23:01 * Nieuw aangemaakte administraties (aangemaakt met 0.43 of later) kunnen bedragen groter dan 21.474.836,47 aan. De huidige limiet ligt op 92.233.720.368.547.758,07. Bestaande databases worden ge-automigreerd. * Diverse aanpassingen in de toepassing van BTW voor minder-triviale boekingen. * Export/import verbeteringen, waarondr behoud van BTW aangifteperiode. * Mogelijkheid tot draaien zonder Term::ReadLine::Gnu. Niet dat je het leuk zult vinden... 0.42 20-02-2006 22:59 * Toepassen van BTW is nu volledig gedreven door de kosten/omzet classificatie van de grootboekrekeningen. * Meer flexibele BTW codering in schema: naast hoog/laag kan ook kosten/omzet en incl/excl worden opgegeven. * BTW koppeling met balansrekening in schema is weer mogelijk, daarbij moet dan een kosten/omzet classificatie worden opgegeven. * Naast kosten (code K) en omzet (code O) kan een grootboekrekening in het schema ook als neutraal (code N) worden opgegeven. Op een neutrale rekening kan nooit BTW worden geboekt. * Meer flexibele BTW codering in boekingsbedragen: naast H/L is ook K/O mogelijk (en soms verplicht). BTW exclusief kan worden opgegeven met een "-". * Herziene en aanvullende documentatie inzake het toepassen van BTW. 0.41 09-02-2006 18:47 * BTW koppeling met balansrekening in schema niet langer toegestaan. * Config variabelen op command line: --define database:name=foo 0.40 07-02-2006 12:55 * Opdrachten "import" en "include" (experimenteel). Met "import" kan een eerder geëxporteerde administratie in één klap weer worden gereconstrueerd. De huidige inhoud van de database wordt daarbij volledig overschreven. Opdracht "include" neemt een bestandsnaam en voert alle opdrachten uit dit bestand uit. * Schema-naam (ebshell --schema=naam) mag nu ook een bestand zijn in plaats van een naam (alleen letters, cijfers en _). In het geval van een bestand wordt geen zoekstrategie toegepast. 0.39 06-02-2006 19:22 * Kleine bugfixjes. 0.38 04-02-2006 20:41 * BTW Aangifteformulier aangepast aan de moderne tijd. Kleineondernemenrsregeling verwerkt in formulier. * Betere foutdetectie op verkeerde commando-invoer. * Herziening alle hulpteksten. * Bug fix: RPM bouwprobleem met Config::IniFiles. 0.37 02-02-2006 15:08 In batch mode wordt backslash-continuering ook beëindigd door een lege regel. 0.36 24-01-2006 18:16 Wijzigen rapportopmaak d.m.v. de configuratiefiles (Experimenteel). Fix periode-einde balans/resultaat. Fix enkele warnings voor "missing configs". Eerste aanzet afscheiden database-specifieke code. 0.35 23-01-2006 11:31 Better checks on user input for bookings. Fix problem with null object if no configs. 0.34 22-01-2006 21:38 Config files. Uitfasering environment variabelen. Fix .eb generatie door jaareinde. Export jaareinde. Kleine fixes. 0.33 20-01-2006 09:38 Emergency fix. Please do not use 0.32. 0.32 18-01-2006 22:47 INCOMPATIBELE WIJZIGING ======================= Openstaande posten ingevoerd bij het openen van het boekjaar door middel van de vorm "adm_relatie ..." hebben de omschrijving en relatiecode omgewisseld. Dat betekent dat de opdracht ter invoering van de openstaande boeking nu identiek is aan de oorspronkelijke boekingsopdracht, voorafgegaan door het woord "adm_relatie". ======================= Database structuur is gewijzigd, auto-migratie is beschikbaar. 0.31 17-01-2006 22:19 Export functionaliteit. Tegenrekening voor Memoriaal. Verbetering PostgreSQL tests. 0.30 14-01-2006 22:37 Afronden documentatie. Extra build test op database. IVP: Verificatie Crediteuren/Debiteurenoverzicht. IVP: Verificatie HTML en CSV generatie. Issue 1404053: Grootboekrekeningen als '0005' toestaan. Openstaande posten: FQbsknr voor openstaande posten vorig boekjaar. Aparte style / kleurtje voor openstaande posten vorig boekjaar. Fix Issue 1404051: Fout bij TABs in Schema. 0.29 12-01-2006 22:44 Issue 1395916. Openstaande posten ondersteunt --per en --boekjaar. Debiteuren/Crediteurenboekingen ondersteunen --boekjaar. Issue 1403886. Debiteuren/Crediteurenboekingen tonen openstaande betalingen nu correct. Geen waarschuwing meer als de einddatum van een periode in de toekomst ligt. Fix HTML generatiefout (stylesheet spec ontbrak tenzij expliciet meegegeven). 0.28 11-01-2006 23:03 :btw= in schema. Lay-out fix Balans/Resultaatrekening. Fix openstaande posten rapportage bij jaareinde. Documentatie-updates. 0.27 09-01-2005 18:48 Uitgebreider rapport over Openstaande posten. Jaareinde kan nu ook de openingsopdrachten voor het komende boekjaar aanmaken. Stylesheet fixes voor Proef- en Saldibalans. 0.26 08-01-2005 19:56 Aanpassingen voor BTW aangifte met --periode en --boekjaar. Alle rapporten kennen nu ook een CSV variant. Debiteuren: Fix voor openstaande inkoopfacturen. adm_naam niet langer toegestaan bij openen boekjaar. CSS Style sheet voor openstaande posten. 0.25 05-01-2006 10:24 Toepassen regeling Kleine Ondernemers. Nieuwe reporter backend. Alle rapporten kennen nu ook een HTML variant. Kleine bugfixes. Enkele documentatie updates. 0.24 28-12-2005 23:26 Overzichten voor Debiteuren en Crediteuren. Environment variabelen EB_DB_USER, EB_DB_PASSWORD, EB_DB_HOST en EB_DB_PORT voor database access. 0.23 23-12-2005 11:41 Kleine bugfixes. Enkele documentatie updates. Boekstuknummers in Grootboek overzicht nu ook in Dagboek:Volgnummer vorm. 0.22 14-12-2005 17:25 Packaging t.b.v. CPAN. 0.21 13-12-2005 20:20 *** EERSTE PUBLIEKE BETA RELEASE *** Meer dan 9 hoofdverdichtingen en meer dan 89 verdichtingen mogelijk. Twee voorbeeld-schema's: eenmanszaak en bvnv. adm_relatie neemt nu een fully-qualified boekstuknummer: adm_relatie inkopen:1998:1245 1998-12-31 "Consultancy" SCS 1877.09 0.20 12-12-2005 11:55 Aanzet documentatie op web site. Opdracht "relaties" kan meerdere relaties tegelijk aanmaken. BTW intracomm. in aangifte. Bugfixes jaareinde. ebshell command line opties --boekjaar, --db (alias voor --dataset) en --journaal (preferred voor --journal). Waarschuwing voor relaties met BTW intra en BTW verlegd (nog niet (geheel)) ondersteund. Dagboek-ids kunnen nu alfanumeriek (max. 4 tekens) zijn. Invoeren syntax Dagboek:BoekjaarCode:VolgNummer voor boekstukken. *** INCOMPATIBLE DATABASE CHANGES *** GEEN MIGRATIE *** 0.19 30-11-2005 21:45 sample renamed naar ivp. example aangemaakt. spec file generatie in tarball. Uitfasering van dubbele vlaggetjes in schema. Temporary disable Build.PL building. 0.18 21-11-2005 17:04 Emergency fix voor PostgreSQL temp tables probleem. PATH fix in sample/setup.csh. 0.17 19-11-2005 23:18 HTML uitvoer-plugins voor Balans en Resultaat. HTML uitvoer-plugin voor Journaal. HTML uitvoer-plugin voor Grootboek. 0.16 16-11-2005 15:25 Aanvang invoering universele uitvoer-plugins voor rapporten. Meer help: "help periodes" en "help rapporten". btwaangifte heeft nu een --definitief optie. Is netter. Openstaande posten worden gegroepeerd per dagboek. Openstaande posten per einddatum. Relatiecodes worden nu case-insensitive herkend. Meerdere boekjaren per administratie (experimenteel). 0.15 08-10-2005 18:20 BTW aangifte nu ook naar bestand (optie --output=...) en in HTML formaat (optie --html). Lange boekstukomschrijvingen worden in het journaal en grootboek over meerdere regels afgedrukt. Wijziging boekstuknummer in numeriek. Bugfix: BTW aangifte gebruikte harde nummers voor BTW rekeningen. 0.14 03-10-2005 23:09 Automatische migratie van database naar een nieuwe versie. (EB::Tools::SQLEngine): Afvangen transactionele commandos. (Shell) Correct completions after "help". (EB::Booking::*) Partiële boekingen. 0.13 30-09-2005 18:40 (EB::Report::Open) Overzicht openstaande posten. (Shell) Niewe opdracht: "openstaand". (Utils) Meer ISO-achtige periodeformaten: YYYY-MM-DD/YYY-MM-DD, YYYY-MM-DD/MM-DD en YYYY-MM-DD/DD. (Shell) Experimentele invoer-completion op debiteur/crediteurcodes en grootboekrekeningen. 0.12 29-09-2005 22:05 (Shell) Periode-selectie (--periode=XXX) voor (sommige) commando's. (Grootboek) Periode-selectie. (Journaal) Periode-selectie. (Relatie) Dagboek-selectie met --dagboek. Periode-aanduidingen zijn erg flexibel. B.v. als 2003 het huidige boekjaar is, dan zijn de volgende aanduidingen equivalent: 2003-01-01 - 2003-03-31 01-01-2003 - 31-03-2003 01-01 - 31-03 januari - maart jan - mrt (korte namen) m1 - m3 (maandnummers) k1 (eerste kwartaal) Eveneens: 2003-02-01 - 2003-02-28 01-02-2003 - 28-02-2003 01-02 - 28-02 februari feb m2 Verder is toegestaan: jaar (01-01 - 31-12) Een subset hiervan is ook bruikbaar voor b.v. btw aangifte. 0.11 28-09-2005 22:59 (BKM.IV) Datumcontrole op boekingen. Boekingen moeten in het huidige boekjaar vallen. (BTWAangfite) Als er definitief BTW aangifte is gedaan kan er niet meer worden geboekt in die periode. Een BTW aangifte wordt definitief door toevoeging van het woord "definitief" aan de opdracht, b.v.: btwaangifte augustus definitief Introductie database migratie. Om te migreren van database versie 1.0.0 (EekBoek 0.10) naar 1.0.1 (EekBoek 0.11) kan het script migrate/1_0_0_to_1_0_1.sql worden gebruikt: pg_dump -c $EB_DB_NAME > backup.sql psql $EB_DB_NAME < migrate/1_0_0_to_1_0_1.sql (Wordt later wsl. geautomatiseerd) (EB::Tools::Schema,EB::Tools::SQLEngine) Afsplitsen SQL engine. 0.10 27-09-2005 23:09 (IV, BKM) Her-invoering van de mogelijkheid om BTW te boeken op 'std' boekingen. Zie de beschrijving in samples/mutaties.eb. BTW tariefcodewijzigingen kunnen nu ook zijn "@H" en "@L" voor hoog resp. laagtarief. Correctie van de dependencies in Makefile.PL. 0.09 26-09-2005 22:34 Belangrijkste wijziging: Uitfaseren van de rol van de D/C setting van grootboekrekeningen tijdens het boekingsproces. Tot nu toe werd de richting van een boeking bepaald door het dagboek en de Debet/Credit setting van de betreffende grootboekrekening. Dit werd door enkele testers als contra-intuïtief ervaren en daarom heb ik in overleg een nieuwe manier geïmplementeerd. Consequenties voor bestaande mutatie-bestanden: - Inkoop / Verkoop boekingen: geen consequenties. - Bank / Kas / Memoriaal: - 'deb' boekingen: geen - 'crd' boekingen: het bedrag moet nu negatief worden opgegeven (het saldo vermindert immers) - 'std' boekingen: Boekingen met BTW zijn niet langer toegestaan. Deze zijn boekhoudtechnisch nl. vrijwel altijd incorrect, en doorgaans illegaal. Als je perse een 'std' boeking met BTW wilt, dan kun je die met de hand uitsplitsen. Zie de beschrijving in samples/mutaties.eb. 0.08 22-09-2005 15:45 (BKM) BKM boekingen kunnen nu een datum per boekstukregel krijgen. (Grootboek) Opdracht 'grootboek' kan selectief worden uitgevoerd op een of meer rekeningen. (EB::Utils) Nieuw: Utility functies. 0.07 21-09-2005 12:25 (IV,BKM) Datum ook als DD-MM-JJJJ en DD-MM. (IV,BKM) --totaal optie. (IV,BKM) Melding over balansrekening vervalt. (IV,BKM) Melding over D/C conflict niet langer fataal. (EB::Locale) Alles onder I18n (gettext). Alle tools printen een banner. (EB): Nieuwe, algemene module. Handelt Globals en Locale af. (EB::Booking::Delete) Verwijderen boekstukken. (EB::Booking::Decode) Decoderen boekstukken. (EB::Shell) Nieuwe opdracht: "verwijder". (EB::Shell) Nieuwe opdracht: "toon". 0.06 02-09-2005 19:15 (EB::Tools::Schema) Schema handling. (ebshell) Schema initialisatie. (Makefile.PL, build_common.inc) Installer Introductie EB library (@INC/EB). 0.05 30-08-2005 10:50 (Shell) Alle shell spul van Shell:: -> EB::Shell:: (EB::Shell::Base) Opvangen ontbreken van Term::Size. (Term::Size): Verwijderd. (opening, schema) tools -> EB::Tools (ebshell.pl) Integratie nieuwe stijl opening (dvimport, newdb, ...) Nieuwe stijl opening 0.04 28-08-2005 16:34 (Schema) Tabel BTWTariefgroepen afgeschaft. (Database) Geen pgplsql (CREATE LANGUAGE) meer nodig. (Schema) CHECK constraints toegevoegd. (sample/setup.sh) Opvangen ontbreken van PERL5LIB (sample/setup.csh) Opvangen ontbreken van PERL5LIB (sample/newdb.sh) Creëer database met Latin1 encoding. (Term::Size) Stub voor mogelijk ontbrekende module. 0.03 15-08-2005 22:42 (schema) Volledige database setup uitgaande van schema.dat. EekBoek-2.02.04/README.postgres0000444000076500007650000000013712165465617013557 0ustar jvjvEekBoek database driver voor PostgreSQL. Alle documentatie van EekBoek vindt u onder EekBoek. EekBoek-2.02.04/Build.PL0000444000076500007650000000446012165465617012331 0ustar jvjv# Build.PL -- Buildfile for EekBoek -*-perl-*- # Author : Johan Vromans # Created On : Thu Sep 1 17:28:26 2005 # Last Modified By: Johan Vromans # Last Modified On: Sat Aug 4 19:56:57 2012 # Update Count : 138 # Status : Experimental # Ease the life of the CPAN testers. exit 0 if $ENV{AUTOMATED_TESTING} && $] < 5.008003; use 5.008003; use strict; use lib 'inc'; use Module::Build 0.32; use File::Find; our $data = {}; require "inc/build_common.pl"; require "lib/EB/Version.pm"; # Warn on non-standard install locations. checkbin(<subclass(code => <<'EOF'); sub ACTION_test { my $self = shift; if ( $self->args("skipdbtests") ) { warn("WARNING: Skipping database tests\n"); $ENV{EB_SKIPDBTESTS} = 1; } require Cwd; my $cwd = Cwd::getcwd(); require lib; lib->import( "$cwd/lib/EB/CPAN", "$cwd/inc" ); $self->SUPER::ACTION_test; } EOF my $build = $class->new ( module_name => $data->{distname}, dist_name => $data->{distname}, dist_author => $data->{author}, dist_abstract => $data->{abstract}, license => $data->{license}, requires => $data->{prereq_pm}, build_requires => $data->{buildreq_pm}, recommends => $data->{recomm_pm}, script_files => $data->{script_files}, pm_files => filelist("lib"), PL_files => $data->{PL_files}, get_options => { skipdbtests => { } }, dist_version => $EB::Version::VERSION, add_to_cleanup => [ 'pod2htm*', map { +"t/ivp/*.$_" } qw(sql log txt html csv) ], meta_merge => { resources => { homepage => 'http://www.eekboek.nl', MailingList => 'http://lists.sourceforge.net/lists/listinfo/eekboek', } }, meta_add => { no_index => { directory => [ qw(inc lib) ] }, provides => { 'EekBoek' => { file => "lib/EekBoek.pm", version => $EB::Version::VERSION, }, }, }, ); $build->create_build_script; # Update some files. ProcessTemplates( $build->dist_name, $EB::Version::VERSION ); # Debian needs this. 1; EekBoek-2.02.04/locale/0000755000076500007650000000000012165465617012272 5ustar jvjvEekBoek-2.02.04/locale/ebcore-en.po0000444000076500007650000037672712165465617014515 0ustar jvjv# English translations for EekBoek. # Copyright (C) 2005 Squirrel Consultancy. # This file is distributed under the same license as the EekBoek package. # Automatically generated, 2005. # Automatically generated <>, 2011. msgid "" msgstr "" "Project-Id-Version: EekBoek\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-11 21:16+0200\n" "PO-Revision-Date: 2012-03-22 11:45+0100\n" "Last-Translator: Automatically generated <>\n" "Language-Team: none <>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../lib/EB.pm:130 #, perl-brace-format msgid "{name} {version}" msgstr "{name} {version}" #: ../lib/EB.pm:134 msgid "Nederlands" msgstr "English" #: ../lib/EB.pm:135 #, perl-brace-format msgid "{ident}{extra}{locale} -- Copyright {year} Squirrel Consultancy" msgstr "{ident}{extra}{locale} -- Copyright {year} Squirrel Consultancy" #: ../lib/EB.pm:151 msgid "" "EekBoek is VRIJE software, ontwikkeld om vrij over uw eigen gegevens te " "kunnen beschikken." msgstr "" "EekBoek is FREE software, intended to give you full control over your\n" "own data." #: ../lib/EB.pm:152 msgid "" "Met uw keuze voor het Microsoft Windows besturingssysteem geeft u echter " "alle vrijheden weer uit handen. Dat is erg triest." msgstr "" "However, by choosing this Microsoft Windows operating system you surrender\n" "this freedom. Sad. Very sad." #: ../lib/EB/Booking/Delete.pm:57 msgid "" "Deze boeking valt in de periode waarover al BTW aangifte is gedaan en kan " "niet meer worden verwijderd" msgstr "" "This booking falls within a period for which VAT has already been submitted " "and cannot be removed." #: ../lib/EB/Booking/Delete.pm:82 #, perl-brace-format msgid "Boekstuk {bsk} is in gebruik door {lst}" msgstr "Posting {bsk} is in use by {lst}" #: ../lib/EB/Booking/Delete.pm:146 #, perl-brace-format msgid "Boekstuk {bsk} niet verwijderd" msgstr "Posting {bsk} not removed" #: ../lib/EB/Booking/Delete.pm:150 #, perl-brace-format msgid "Boekstuk {bsk} verwijderd" msgstr "Posting {bsk} removed" #: ../lib/EB/Booking/BKM.pm:48 ../lib/EB/Booking/IV.pm:62 #, perl-brace-format msgid "Ongeldig totaal: {total}" msgstr "Invalid total: {total}" #: ../lib/EB/Booking/BKM.pm:55 #, perl-brace-format msgid "Ongeldig saldo: {saldo}" msgstr "Invalid balance: {saldo}." #: ../lib/EB/Booking/BKM.pm:62 #, perl-brace-format msgid "Ongeldig beginsaldo: {saldo}" msgstr "Invalid initial balance: {saldo}." #: ../lib/EB/Booking/BKM.pm:77 ../lib/EB/Booking/BKM.pm:145 #: ../lib/EB/Booking/BKM.pm:283 ../lib/EB/Booking/IV.pm:75 #, perl-brace-format msgid "Onherkenbare datum: {date}" msgstr "Unrecognizable date: {date}" #: ../lib/EB/Booking/BKM.pm:83 ../lib/EB/Booking/BKM.pm:133 #: ../lib/EB/Booking/BKM.pm:150 ../lib/EB/Booking/BKM.pm:271 #: ../lib/EB/Booking/BKM.pm:288 ../lib/EB/Booking/IV.pm:81 #: ../lib/EB/Booking/IV.pm:153 msgid "" "Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer " "aanwijzingen." msgstr "" "This accounting instruction is incomplete. Please use the \"help\" function " "for more information." #: ../lib/EB/Booking/BKM.pm:100 msgid "" "Beginsaldo komt niet overeen met het eindsaldo van de voorgaande boeking" msgstr "" "Opening balance is not equal to the ending balance of the previous booking" #: ../lib/EB/Booking/BKM.pm:103 #, perl-brace-format msgid "Beginsaldo: {bal}" msgstr "Opening balance: {bal}" #: ../lib/EB/Booking/BKM.pm:108 #, perl-brace-format msgid "Saldo voorgaande boeking: {bal}" msgstr "Balance previous booking: {bal}" #: ../lib/EB/Booking/BKM.pm:113 #, perl-brace-format msgid "Huidig saldo: {bal}" msgstr "Current balance: {bal}" #: ../lib/EB/Booking/BKM.pm:140 ../lib/EB/Booking/BKM.pm:278 #: ../lib/EB/Booking/IV.pm:87 msgid "De boekingsdatum valt in de periode waarover al BTW aangifte is gedaan" msgstr "" "Booking date falls within a period for which VAT has already been submitted." #: ../lib/EB/Booking/BKM.pm:157 ../lib/EB/Booking/BKM.pm:292 #: ../lib/EB/Booking/IV.pm:163 msgid "boekstuk" msgstr "posting" #: ../lib/EB/Booking/BKM.pm:162 ../lib/EB/Booking/IV.pm:172 msgid "" "De \"D\" of \"C\" toevoeging aan het rekeningnummer is hier niet toegestaan" msgstr "The postfix \"D\" or \"C\" to the account number is not allowed here" #: ../lib/EB/Booking/BKM.pm:165 ../lib/EB/Booking/IV.pm:175 #, perl-brace-format msgid "Ongeldig grootboekrekeningnummer: {acct}" msgstr "Invalid account number: {acct}" #: ../lib/EB/Booking/BKM.pm:175 ../lib/EB/Booking/IV.pm:182 #: ../lib/EB/Relation.pm:110 ../lib/EB/Tools/Opening.pm:108 #, perl-brace-format msgid "Onbekende grootboekrekening: {acct}" msgstr "Unknown account: {acct}" #: ../lib/EB/Booking/BKM.pm:183 ../lib/EB/Booking/IV.pm:189 #: ../lib/EB/Relation.pm:115 #, perl-brace-format msgid "Grootboekrekening {acct} ({desc}) is een balansrekening" msgstr "Account {acct} ({desc}) is a balance account" #: ../lib/EB/Booking/BKM.pm:188 ../lib/EB/Booking/IV.pm:196 #, perl-brace-format msgid "Grootboekrekening {acct} heeft BTW in een BTW-vrije administratie" msgstr "Account {acct} carries VAT while it is in a VAT-free administration" #: ../lib/EB/Booking/BKM.pm:196 ../lib/EB/Booking/BKM.pm:298 #: ../lib/EB/Booking/IV.pm:226 #, perl-brace-format msgid "Ongeldig bedrag: {amt}" msgstr "Invalid amount {amt}" #: ../lib/EB/Booking/BKM.pm:204 msgid "" "Boekingen met BTW zijn niet mogelijk in een memoriaal. De BTW is op nul " "gesteld." msgstr "" "Postings that involve VAT are not allowed in a memorial. The VAT has been " "nulled." #: ../lib/EB/Booking/BKM.pm:214 ../lib/EB/Booking/IV.pm:235 #, perl-brace-format msgid "Ongeldige BTW-specificatie: {spec}" msgstr "Error in VAT specification: {spec}" #: ../lib/EB/Booking/BKM.pm:220 ../lib/EB/Booking/IV.pm:270 msgid "BTW toepassen is niet mogelijk op een neutrale rekening" msgstr "Applying VAT on a neutral account is not allowed" #: ../lib/EB/Booking/BKM.pm:323 #, perl-brace-format msgid "Geen post gevonden voor boekstuk {bsk}" msgstr "No posting found for booking {bsk}" #: ../lib/EB/Booking/BKM.pm:336 ../lib/EB/Booking/BKM.pm:475 #: ../lib/EB/Booking/IV.pm:113 ../lib/EB/Booking/IV.pm:136 #, perl-brace-format msgid "Onbekende {what}: {who}" msgstr "Unknown {what}: {who}" #: ../lib/EB/Booking/BKM.pm:337 ../lib/EB/Booking/BKM.pm:476 #: ../lib/EB/Booking/IV.pm:114 ../lib/EB/Booking/IV.pm:137 #: ../lib/EB/Relation.pm:99 ../lib/EB/Relation.pm:101 #: ../lib/EB/Report/Debcrd.pm:54 msgid "Debiteur" msgstr "Debtor" #: ../lib/EB/Booking/BKM.pm:337 ../lib/EB/Booking/BKM.pm:476 #: ../lib/EB/Booking/IV.pm:114 ../lib/EB/Booking/IV.pm:137 #: ../lib/EB/Relation.pm:99 ../lib/EB/Relation.pm:101 #: ../lib/EB/Report/Debcrd.pm:54 msgid "Crediteur" msgstr "Creditor" #: ../lib/EB/Booking/BKM.pm:403 #, perl-brace-format msgid "Betaling {rel} {amt} voldoet de open posten {amtss} en {amts}" msgstr "Payment {rel} {amt} conforms to the open bookings {amtss} and {amts}" #: ../lib/EB/Booking/BKM.pm:422 msgid "Wellicht de betaling van de volgende open posten:" msgstr "Perhaps the payment of the following open postings:" #: ../lib/EB/Booking/BKM.pm:440 msgid "Geen alternatieven beschikbaar (teveel open posten)" msgstr "No alternatives available (too many open postings)" #: ../lib/EB/Booking/BKM.pm:445 ../lib/EB/Booking/BKM.pm:499 #, perl-brace-format msgid "Geen open post van {amt} gevonden voor relatie {rel}" msgstr "No open posting of {amt} found for relation {rel}" #: ../lib/EB/Booking/BKM.pm:452 #, perl-brace-format msgid "Open posten voor relatie {rel}:" msgstr "Unsettled postings for relation {rel}:" #: ../lib/EB/Booking/BKM.pm:529 #, perl-brace-format msgid "Onbekend transactietype: {type}" msgstr "Unknown transaction type: {type}" #: ../lib/EB/Booking/BKM.pm:540 #, perl-brace-format msgid "Nieuw saldo: {bal}" msgstr "New balance: {bal}" #: ../lib/EB/Booking/BKM.pm:548 #, perl-brace-format msgid "Saldo {new} klopt niet met de vereiste waarde {act}" msgstr "New balance {new} does not match the required value {act}" #: ../lib/EB/Booking/BKM.pm:555 ../lib/EB/Booking/IV.pm:316 #, perl-brace-format msgid " Boekstuk totaal is {act} in plaats van {exp}" msgstr "Posting total is {act} instead of {exp}" #: ../lib/EB/Booking/BKM.pm:561 #, perl-brace-format msgid "Saldo {new} klopt niet met beginsaldo eropvolgende boekstuk {isaldo}" msgstr "" "Balance {new} does not match the initial value of the subsequent posting " "{isaldo}" #: ../lib/EB/Booking/BKM.pm:566 #, perl-brace-format msgid "Boekstuk is niet in balans (verschil is {diff})" msgstr "Posting does not level out (the difference is {diff})" #: ../lib/EB/Booking/BKM.pm:576 ../lib/EB/Booking/IV.pm:304 msgid "Dit overzicht is ter referentie, de boeking is niet uitgevoerd!" msgstr "This overview is for your reference, the booking has not been done!" #: ../lib/EB/Booking/BKM.pm:584 ../lib/EB/Booking/IV.pm:313 msgid "Boeking " msgstr "Posting " #: ../lib/EB/Booking/IV.pm:44 #, perl-brace-format msgid "" "Boekingsreferentie moet tenminste één niet-numeriek teken bevatten: {ref}" msgstr "" "Booking reference must contain at least one non-numerical character: {ref}" #: ../lib/EB/Booking/IV.pm:49 #, perl-brace-format msgid "Ongeldige operatie (IV) voor dagboek type {type}" msgstr "Invalid operation (IV) voor daybook type {type}" #: ../lib/EB/Booking/IV.pm:166 msgid "De omschrijving van de boekstukregel ontbreekt" msgstr "The description of the booking line is missing" #: ../lib/EB/Booking/IV.pm:211 #, perl-brace-format msgid "Referentie {ref} bestaat al voor relatie {rel}" msgstr "Reference {ref} already exists for relation {rel}" #: ../lib/EB/Booking/IV.pm:251 #, perl-brace-format msgid "Pas op! U boekt {ko} in een {iv} dagboek" msgstr "Warning! Posting has {ko} but daybook is {iv}" #: ../lib/EB/Booking/IV.pm:252 msgid "kosten" msgstr "expenses" #: ../lib/EB/Booking/IV.pm:252 msgid "omzet" msgstr "revenue" #: ../lib/EB/Booking/IV.pm:253 msgid "inkoop" msgstr "procurement" #: ../lib/EB/Booking/IV.pm:253 msgid "verkoop" msgstr "sales" #: ../lib/EB/Booking/IV.pm:261 #, perl-brace-format msgid "Onbekende BTW-code: {code}" msgstr "Unknown VAT code: {code}" #: ../lib/EB/Booking/Decode.pm:64 ../lib/EB/DB.pm:273 #, perl-brace-format msgid "Onbekend boekstuk: {bsk}" msgstr "Unknown posting: {bsk}" #: ../lib/EB/Booking/Decode.pm:84 ../lib/EB/Shell.pm:479 msgid "cmo:boeking:ref" msgstr "cmo:boeking:ref" #: ../lib/EB/Booking/Decode.pm:93 ../lib/EB/Shell.pm:478 msgid "cmo:boeking:totaal" msgstr "cmo:boeking:total" #: ../lib/EB/Booking/Decode.pm:299 ../lib/EB/Shell.pm:721 #, perl-brace-format msgid "Onbekend rekeningnummer: {acct}" msgstr "Unknown account: {acct}" #: ../lib/EB/Report.pm:55 #, perl-brace-format msgid "Balansrekening {acct}, saldo aangepast naar {exp}" msgstr "Balance account {acct}, balance changed to {exp}" #: ../lib/EB/Report.pm:69 #, perl-brace-format msgid "Balansrekening {acct}, saldo aangepast met {exp}" msgstr "Balance account {acct}, balance total has been corrected with {exp}" #: ../lib/EB/Report.pm:118 #, perl-brace-format msgid "Resultaatrekening {acct}, beginsaldo is {exp}" msgstr "Result account {acct}, initial balance has been changed to {exp}" #: ../lib/EB/Report.pm:132 #, perl-brace-format msgid "Resultaatrekening {acct}, saldo aangepast met {exp}" msgstr "Result account {acct}, balance total has been corrected with {exp}" #: ../lib/EB/Report.pm:157 #, perl-brace-format msgid "Resultaatrekening {acct}, mutaties is {exp}" msgstr "Result account {acct}, mutations are {exp}" #: ../lib/EB/Import.pm:35 #, perl-brace-format msgid "Directory {dir} bestaat niet" msgstr "Directory {dir} does not exist" #: ../lib/EB/Import.pm:37 ../lib/EB/Export.pm:37 #, perl-brace-format msgid "Geen toegang tot directory {dir}" msgstr "Cannot access directory {dir}" #: ../lib/EB/Import.pm:41 ../lib/EB/Import.pm:46 ../lib/EB/Import.pm:49 #: ../lib/EB/Import.pm:52 #, perl-brace-format msgid "Bestand \"{file}\" ontbreekt ({err})" msgstr "File \"{file}\" does not exist ({err})" #: ../lib/EB/Import.pm:86 msgid "Module Archive::Zip, nodig voor import van file, is niet beschikbaar" msgstr "File import requires module Archive::Zip, which is not available" #: ../lib/EB/Import.pm:89 #, perl-brace-format msgid "Bestand \"{file}\" is niet beschikbaar ({err})" msgstr "Cannot access file \"{file}\" or file is not available ({err})" #: ../lib/EB/Import.pm:95 #, perl-brace-format msgid "Fout {code} tijdens het lezen van {file}" msgstr "Error {code} reading file {file}" #: ../lib/EB/Import.pm:107 #, perl-brace-format msgid "Het schema ontbreekt in bestand {file}" msgstr "File {file} schema data is missing" #: ../lib/EB/Import.pm:114 #, perl-brace-format msgid "De relatiegegevens ontbreken in bestand {file}" msgstr "File {file} relations data is missing" #: ../lib/EB/Import.pm:121 #, perl-brace-format msgid "De openingsgegevens ontbreken in bestand {file}" msgstr "File {file} opening data is missing" #: ../lib/EB/Import.pm:128 #, perl-brace-format msgid "De mutatiegegevens ontbreken in bestand {file}" msgstr "File {file} postings data is missing" #: ../lib/EB/Import.pm:135 msgid "DE IMPORT IS NIET UITGEVOERD" msgstr "THE IMPORT HAS NOT BEEN COMPLETED!" #: ../lib/EB/IniWiz.pm:25 ../lib/EB/Wx/IniWiz.pm:38 msgid "--standaard--" msgstr "--default--" #: ../lib/EB/IniWiz.pm:42 #, perl-brace-format msgid "Beschikbare administraties in {dir}:" msgstr "Available administrations in {dir}" #: ../lib/EB/IniWiz.pm:59 msgid "Uw keuze" msgstr "Your selection" #: ../lib/EB/IniWiz.pm:62 msgid ", of N om een nieuwe administratie aan te maken>" msgstr ", or N to create a new administration" #: ../lib/EB/IniWiz.pm:149 ../lib/EB/Wx/IniWiz.pm:125 msgid "Lege administratie" msgstr "Empty administration (DOES NOT WORK YET!)" #: ../lib/EB/IniWiz.pm:152 ../lib/EB/Report/Debcrd.pm:57 #: ../lib/EB/Report/Open.pm:42 ../lib/EB/Wx/IniWiz.pm:180 msgid "Omschrijving" msgstr "Description" #: ../lib/EB/IniWiz.pm:184 ../lib/EB/Wx/IniWiz.pm:128 msgid "Maand" msgstr "Month" #: ../lib/EB/IniWiz.pm:184 ../lib/EB/IniWiz.pm:191 ../lib/EB/Wx/IniWiz.pm:128 msgid "Kwartaal" msgstr "Quarter" #: ../lib/EB/IniWiz.pm:184 ../lib/EB/Wx/IniWiz.pm:128 msgid "Jaar" msgstr "Year" #: ../lib/EB/IniWiz.pm:185 msgid "Nee" msgstr "No" #: ../lib/EB/IniWiz.pm:185 msgid "Ja" msgstr "Yes" #: ../lib/EB/IniWiz.pm:188 ../lib/EB/Wx/IniWiz.pm:118 msgid "Mijn eerste EekBoek" msgstr "My first EekBoek" #: ../lib/EB/IniWiz.pm:192 msgid "EekBoek Voorbeeldadministratie" msgstr "EekBoek Sample Administration" #: ../lib/EB/IniWiz.pm:210 msgid "" "Geef een unieke naam voor de nieuwe administratie. Deze wordt gebruikt\n" "voor rapporten en dergelijke.\n" msgstr "" "Provide a unique name for the new administration. This name will be used\n" "for reports, among others.\n" #: ../lib/EB/IniWiz.pm:214 ../lib/EB/Config/Data.pm:24 #: ../lib/EB/Config/Data.pm:50 ../lib/EB/Shell.pm:765 #: ../lib/EB/Wx/IniWiz.pm:117 msgid "Naam" msgstr "Name" #: ../lib/EB/IniWiz.pm:219 ../lib/EB/Wx/IniWiz.pm:581 msgid "Er bestaat al een administratie met deze naam." msgstr "An administration with that name already exists." #: ../lib/EB/IniWiz.pm:231 msgid "" "Geef het boekjaar voor deze administratie. De administratie\n" "begint op 1 januari van het opgegeven jaar.\n" msgstr "" "Provide the financial year for this administration. The administration\n" "starts on the first of January of the given year.\n" #: ../lib/EB/IniWiz.pm:234 ../lib/EB/Wx/IniWiz.pm:121 msgid "Begindatum" msgstr "Starting date" #: ../lib/EB/IniWiz.pm:246 msgid "" "Geef een unieke code voor de administratie. Deze wordt gebruikt als\n" "interne naam voor de database en administratiefolders.\n" "De standaardwaarde is afgeleid van de administratienaam en de begindatum.\n" msgstr "" "Provide a unique name for the new administration. This name will be used\n" "as an internal name for the database and the administration folders.\n" "The default value has been derived from the administration name and the " "initial date.\n" #: ../lib/EB/IniWiz.pm:251 ../lib/EB/Wx/IniWiz.pm:119 msgid "Code" msgstr "Code" #: ../lib/EB/IniWiz.pm:265 #, perl-brace-format msgid "Er bestaat al een administratie met code \"{code}\"" msgstr "An administration with code \"{code}\" already exists" #: ../lib/EB/IniWiz.pm:273 msgid "" "U kunt een van de meegeleverde sjablonen gebruiken voor uw\n" "administratie.\n" msgstr "You can use one of the available templates for your administration.\n" #: ../lib/EB/IniWiz.pm:277 ../lib/EB/Wx/IniWiz.pm:124 msgid "Sjabloon" msgstr "Template" #: ../lib/EB/IniWiz.pm:299 msgid "Moet BTW worden toegepast in deze administratie" msgstr "Applying VAT in administration mode" #: ../lib/EB/IniWiz.pm:308 msgid "Aangifteperiode voor de BTW" msgstr "VAT submission period" #: ../lib/EB/IniWiz.pm:314 msgid "" "Kies het type database dat u wilt gebruiken voor deze\n" "administratie.\n" msgstr "" "Select the database type that you wish to use for this administration.\n" #: ../lib/EB/IniWiz.pm:318 ../lib/EB/Wx/IniWiz.pm:108 #: ../lib/EB/Wx/IniWiz.pm:152 msgid "Database" msgstr "Database" #: ../lib/EB/IniWiz.pm:328 msgid "Database server host, indien niet lokaal" msgstr "For a remote database server, the system that runs the server." #: ../lib/EB/IniWiz.pm:333 msgid "Database server netwerk poort, indien niet standaard" msgstr "Database server network port, in case it is not the standard port" #: ../lib/EB/IniWiz.pm:338 msgid "Usernaam voor de database" msgstr "User name to access the database" #: ../lib/EB/IniWiz.pm:343 msgid "Password voor de database user" msgstr "Password to access the database" #: ../lib/EB/IniWiz.pm:348 msgid "Moet het configuratiebestand worden aangemaakt" msgstr "Create the configuration file" #: ../lib/EB/IniWiz.pm:352 msgid "Moeten de administratiebestanden worden aangemaakt" msgstr "Create the administration data files" #: ../lib/EB/IniWiz.pm:356 msgid "Moet de database worden aangemaakt" msgstr "Create database?" #: ../lib/EB/IniWiz.pm:360 msgid "Gereed om de bestanden aan te maken." msgstr "Ready to create the files." #: ../lib/EB/IniWiz.pm:361 msgid "Doorgaan" msgstr "Continue" #: ../lib/EB/IniWiz.pm:431 msgid "Antwoordt 'ja' of 'nee' a.u.b." msgstr "Please answer 'yes' or 'no'." #: ../lib/EB/IniWiz.pm:447 #, perl-brace-format msgid "Ongeldig antwoord, het moet een getal tussen {first} en {last} zijn" msgstr "Invalid answer: must be a number between {first} and {last}" #: ../lib/EB/IniWiz.pm:452 msgid "Ongeldig antwoord, het moet een getal zijn" msgstr "Configuration error: must be a number" #: ../lib/EB/IniWiz.pm:530 msgid "Er is een probleem opgetreden. Raadplaag uw systeembeheerder." msgstr "A problem has occurred, please contact your system administrator" #: ../lib/EB/IniWiz.pm:542 ../lib/EB/IniWiz.pm:547 msgid "De gewenste bestanden zijn aangemaakt." msgstr "The administration has been created." #: ../lib/EB/IniWiz.pm:548 msgid "U kunt meteen aan de slag." msgstr "You can start now." #: ../lib/EB/Shell/Base.pm:84 msgid "cmd:adm_balans" msgstr "cmd:adm_balance" #: ../lib/EB/Shell/Base.pm:85 msgid "cmd:adm_balanstotaal" msgstr "cmd:adm_balancetotal" #: ../lib/EB/Shell/Base.pm:86 msgid "cmd:adm_begindatum" msgstr "cmd:adm_startdate" #: ../lib/EB/Shell/Base.pm:87 msgid "cmd:adm_boekjaarcode" msgstr "cmd:adm_finyear" #: ../lib/EB/Shell/Base.pm:88 msgid "cmd:adm_btwperiode" msgstr "cmd:adm_vatperiod" #: ../lib/EB/Shell/Base.pm:89 msgid "cmd:adm_naam" msgstr "cmd:adm_name" #: ../lib/EB/Shell/Base.pm:90 msgid "cmd:adm_open" msgstr "cmd:adm_open" #: ../lib/EB/Shell/Base.pm:91 msgid "cmd:adm_relatie" msgstr "cmd:adm_relation" #: ../lib/EB/Shell/Base.pm:94 msgid "cmd:boekjaar" msgstr "cmd:finyear" #: ../lib/EB/Shell/Base.pm:97 msgid "cmd:balans" msgstr "cmd:balance" #: ../lib/EB/Shell/Base.pm:98 msgid "cmd:btwaangifte" msgstr "cmd:vatsubmission" #: ../lib/EB/Shell/Base.pm:99 msgid "cmd:crediteuren" msgstr "cmd:creditors" #: ../lib/EB/Shell/Base.pm:100 msgid "cmd:debiteuren" msgstr "cmd:debtors" #: ../lib/EB/Shell/Base.pm:101 msgid "cmd:grootboek" msgstr "cmd:ledger" #: ../lib/EB/Shell/Base.pm:102 msgid "cmd:journaal" msgstr "cmd:journal" #: ../lib/EB/Shell/Base.pm:103 msgid "cmd:openstaand" msgstr "cmd:unsettled" #: ../lib/EB/Shell/Base.pm:104 msgid "cmd:proefensaldibalans" msgstr "cmd:trialbalance" #: ../lib/EB/Shell/Base.pm:105 msgid "cmd:result" msgstr "cmd:result" #: ../lib/EB/Shell/Base.pm:108 msgid "cmd:dagboeken" msgstr "cmd:daybooks" #: ../lib/EB/Shell/Base.pm:109 msgid "cmd:database" msgstr "cmd:database" #: ../lib/EB/Shell/Base.pm:110 msgid "cmd:periodes" msgstr "cmd:periods" #: ../lib/EB/Shell/Base.pm:111 msgid "cmd:rapporten" msgstr "cmd:reports" #: ../lib/EB/Shell/Base.pm:114 msgid "cmd:export" msgstr "cmd:export" #: ../lib/EB/Shell/Base.pm:115 msgid "cmd:import" msgstr "cmd:import" #: ../lib/EB/Shell/Base.pm:116 msgid "cmd:jaareinde" msgstr "cmd:yearend" #: ../lib/EB/Shell/Base.pm:117 msgid "cmd:relatie" msgstr "cmd:relation" #: ../lib/EB/Shell/Base.pm:118 msgid "cmd:schema" msgstr "cmd:schema" #: ../lib/EB/Shell/Base.pm:119 msgid "cmd:toon" msgstr "cmd:show" #: ../lib/EB/Shell/Base.pm:120 msgid "cmd:verwijder" msgstr "cmd:remove" #: ../lib/EB/Shell/Base.pm:123 msgid "cmd:include" msgstr "cmd:include" #: ../lib/EB/Shell/Base.pm:124 msgid "cmd:sql" msgstr "cmd:sql" #: ../lib/EB/Shell/Base.pm:283 ../lib/EB/Wx/Shell/MainFrame.pm:368 msgid "Fout in de invoerregel. Controleer de \" en ' tekens." msgstr "Error in the input: check the \" and ' characters." #: ../lib/EB/Shell/Base.pm:335 msgid " ****** Afgebroken wegens fouten in de invoer ******" msgstr "*** Aborted because of errors in the input ***" #: ../lib/EB/Shell/Base.pm:341 #, perl-brace-format msgid "" "Onbekende opdracht \"{cmd}\".\n" "\"help\" geeft een lijst van mogelijke opdrachten." msgstr "" "Unknown command \"{cmd}.\n" "Enter \"help\" for a list of commands." #: ../lib/EB/Shell/Base.pm:440 msgid "Toon versie." msgstr "Show version." #: ../lib/EB/Shell/Base.pm:537 ../lib/EB/Shell/Base.pm:552 msgid "Opdrachtnamen zijn hoofdletterongevoelig." msgstr "Command names are case insensitive." #: ../lib/EB/Shell/Base.pm:542 #, perl-brace-format msgid "Sorry, geen hulp voor {topic}." msgstr "Sorry, no help available for {topic}." #: ../lib/EB/Shell/Base.pm:550 msgid "Hulp is beschikbaar voor de volgende onderwerpen." msgstr "Help is available for the following topics." #: ../lib/EB/Shell/Base.pm:551 msgid "Typ 'help [onderwerp]' voor meer gedetailleerde informatie." msgstr "Enter 'help [topic] for more detailed information." #: ../lib/EB/Shell/Base.pm:557 msgid "Geen hulp beschikbaar." msgstr "No help available." #: ../lib/EB/Shell/DeLuxe_Fake.pm:11 msgid "Vervolgregel ontbreekt in de invoer." msgstr "Subsequent line is missing in the input" #: ../lib/EB/Shell/DeLuxe_Fake.pm:12 ../lib/EB/Tools/Schema.pm:465 msgid "Invoer moet Unicode (UTF-8) zijn." msgstr "Input must be Unicode (UTF-8)." #: ../lib/EB/Shell/DeLuxe_Fake.pm:13 ../lib/EB/Tools/Schema.pm:473 #, perl-brace-format msgid "Geen geldige UTF-8 tekens in regel {line} van de invoer" msgstr "Line {line} contains characters that are not valid UTF-8" #: ../lib/EB/Shell/DeLuxe_Fake.pm:15 #, perl-brace-format msgid "Invoerregel {lno} bevat onzichtbare tekens na de backslash" msgstr "Input line {lno} contains invisible characters after the backslash" #: ../lib/EB/Format.pm:121 msgid "Configuratiefout: [format]numwidth moet een getal zijn" msgstr "Configuration error: [format]numwidth must be a number" #: ../lib/EB/Format.pm:130 msgid "1.234,56" msgstr "1.234,56" #: ../lib/EB/Format.pm:131 #, perl-brace-format msgid "Configuratiefout: ongeldige waarde voor {item}" msgstr "Configuration error: invalid value for {item}" #: ../lib/EB/Format.pm:190 #, perl-brace-format msgid "Onbekende afrondingsmethode: {meth}" msgstr "Unknown number rounding method: {meth}" #: ../lib/EB/Format.pm:211 #, perl-brace-format msgid "Ongeldige datumformaatspecificatie: {fmt}" msgstr "Invalid date format specification: {fmt}" #: ../lib/EB/Format.pm:223 #, perl-brace-format msgid "Ongeldig bedrag: {num}" msgstr "Invalid amount: {num}" #: ../lib/EB/Format.pm:277 #, perl-brace-format msgid "Ongeldig getal: {num}" msgstr "Invalid amount: {num}" #: ../lib/EB/Main.pm:88 msgid "Geen administratie geselecteerd" msgstr "No administration has been selected" #: ../lib/EB/Main.pm:98 msgid "" "Geen EekBoek database opgegeven. Specificeer een database in de " "configuratiefile, of selecteer een andere configuratiefile op de command " "line met \"--config=...\"." msgstr "" "No dataset. Please specify a dataset name in the configuration file, or pass " "an alternative configuration file name on the command line with \"--" "dataset=...\"" #: ../lib/EB/Main.pm:136 #, perl-brace-format msgid "Lege database {db} is aangemaakt" msgstr "Created empty dataset {db}" #: ../lib/EB/Main.pm:217 ../lib/EB/Wx/Shell/Main.pm:227 #, perl-brace-format msgid "Dit is {pkg} [{name} {version}]" msgstr "This is {pkg} [{name} {version}]" #: ../lib/EB/Main.pm:227 #, perl-brace-format msgid "" "Gebruik: {prog} [options] [file ...]\n" "\n" " --command -c\tvoer de rest van de opdrachtregel uit als command\n" " --echo -e\t\ttoon ingelezen opdrachten\n" " --boekjaar=XXX\tspecificeer boekjaar\n" " --import\t\timporteer een nieuwe administratie\n" " --export\t\texporteer een administratie\n" " --dir=XXX\t\tdirectory voor im/export\n" " --file=XXX\t\tbestand voor im/export\n" " --titel=XXX\t\tomschrijving voor export\n" " --init\t\t(re)creëer administratie\n" " --help\t\tdeze hulpboodschap\n" " --ident\t\ttoon identificatie\n" " --verbose\t\tgeef meer uitgebreide information\n" "\n" "Voor experts:\n" "\n" " --config=XXX -f\tspecificeer configuratiebestand\n" " --nostdconf -X\tgebruik uitsluitend dit configuratiebestand\n" " --define=XXX -D\tdefinieer configuratiesetting\n" " --printconfig -P\tprint config waarden\n" " --[no]interactive\tforceer [non]interactieve modus\n" " --[no]errexit\tstop direct na een fout in de invoer\n" msgstr "" "Usage: {prog} [options] [file ...]\n" "\n" " --command -c\texecute the rest of the command line as a command\n" " --echo -e\t\techo commands\n" " --boekjaar=XXX\tspecify financial year\n" " --import\t\timport configuration\n" " --export\t\texport configuration\n" " --dir=XXX\t\tdirectory for im/export\n" " --file=XXX\t\tfile for im/export\n" " --title=XXX\t\tspecify description for export data\n" " --init\t\t(re)create complete administration\n" " --createdb\t\tcreate a new database\n" " --help\t\tthis message\n" " --ident\t\tshow identification\n" " --verbose\t\tverbose information\n" "\n" "Fo expert use only:\n" "\n" " --config=XXX\tspecify a configuration file\n" " --nostdconf -X\tonly use the configuration file specified\n" " --define=XXX -D\tdefine configuration setting\n" " --printconfig -P\tprint config values\n" " --[no]interactive\tforce [non]interactive mode\n" " --[no]errexit\t\tabort execution upon errors\n" "\n" #: ../lib/EB/DB/Mysql_dummy.pm:63 ../lib/EB/DB/Sqlite.pm:63 #, perl-brace-format msgid "Database journal voor {db} verwijderd" msgstr "Database journal for {db} has been removed" #: ../lib/EB/DB/Mysql_dummy.pm:66 ../lib/EB/DB/Sqlite.pm:66 #, perl-brace-format msgid "Database sequences voor {db} verwijderd" msgstr "Database sequences for {db} have been removed" #: ../lib/EB/DB/Mysql_dummy.pm:85 ../lib/EB/DB/Pglite.pm:91 #: ../lib/EB/DB/Sqlite.pm:85 #, perl-brace-format msgid "Geen database met naam {name} gevonden" msgstr "No database with name {name} found" #: ../lib/EB/DB/Mysql_dummy.pm:89 ../lib/EB/DB/Mysql_dummy.pm:95 #: ../lib/EB/DB/Mysql.pm:79 ../lib/EB/DB/Mysql.pm:85 ../lib/EB/DB/Pglite.pm:95 #: ../lib/EB/DB/Sqlite.pm:89 ../lib/EB/DB/Sqlite.pm:95 #: ../lib/EB/DB/Postgres.pm:111 ../lib/EB/DB.pm:485 #, perl-brace-format msgid "Database verbindingsprobleem: {err}" msgstr "Database connection error: {err}" #: ../lib/EB/DB/Mysql.pm:96 ../lib/EB/DB/Postgres.pm:116 #, perl-brace-format msgid "Database {name} is niet in UTF-8 maar {enc}" msgstr "Database {name} is not in UTF-8 but in {enc}" #: ../lib/EB/DB/Postgres.pm:93 #, perl-brace-format msgid "Database probleem: {err}" msgstr "Database problem: {err}" #: ../lib/EB/Utils.pm:162 ../lib/EB/Tools/Opening.pm:50 #: ../lib/EB/Tools/Opening.pm:54 msgid "jaar" msgstr "year" #: ../lib/EB/Relation.pm:46 #, perl-brace-format msgid "Ongeldige waarde voor BTW status: {btw}" msgstr "Invalid value for VAT status: \"{btw}\"" #: ../lib/EB/Relation.pm:50 msgid "Relaties met verlegde BTW worden nog niet ondersteund" msgstr "Transactions with delegated VAT are not yet fully supported" # what do you mean by "delegated VAT"? #: ../lib/EB/Relation.pm:54 msgid "" "Relaties met intra-communautaire BTW worden nog niet volledig ondersteund" msgstr "Intra-EC VAT transactions are not yet fully supported" #: ../lib/EB/Relation.pm:65 ../lib/EB/Tools/Opening.pm:152 #: ../lib/EB/Report/Journal.pm:76 ../lib/EB/Report/Journal.pm:97 #: ../lib/EB/DB.pm:244 #, perl-brace-format msgid "Onbekend dagboek: {dbk}" msgstr "Unknown daybook: {dbk}" #: ../lib/EB/Relation.pm:76 #, perl-brace-format msgid "Ongeldig dagboek voor relatie: {dbk}" msgstr "Invalid daybook for relation: {dbk}" #: ../lib/EB/Relation.pm:93 msgid "" "Waarschuwing: De toevoeging 'D' of 'C' aan het grootboeknummer wordt " "afgeraden! Gebruik de --dagboek optie indien nodig." msgstr "" "Warning: Using 'D' or 'C' attached to the account number is deprecated. Use " "the --daybook option if appropriate." #: ../lib/EB/Relation.pm:97 #, perl-brace-format msgid "Dagboek {dbk} implicieert {typ1} maar {acct} impliceert {typ2}" msgstr "Daybook {dbk} implies {typ1} but {acct} implies {typ2}" #: ../lib/EB/Relation.pm:137 #, perl-brace-format msgid "Relatiecode {code} is niet uniek in dagboek {dbk}" msgstr "Relation code {code} is not unique in daybook {dbk}" #: ../lib/EB/Relation.pm:149 #, perl-brace-format msgid "Debiteur {code} -> {acct} ({desc}), dagboek {dbk}" msgstr "Debtor {code} -> {acct} ({desc}), daybook {dbk}" #: ../lib/EB/Relation.pm:151 #, perl-brace-format msgid "Crediteur {code} -> {acct} ({desc}), dagboek {dbk}" msgstr "Creditor {code} -> {acct} ({desc}), daybook {dbk}" #: ../lib/EB/Export/XAF.pm:35 #, perl-brace-format msgid "Fout tijdens het aanmaken van exportbestand {name}: {err}" msgstr "Error {err} while creating export file {name}" #: ../lib/EB/Export/XAF.pm:77 ../lib/EB/Tools/Einde.pm:69 #: ../lib/EB/Report/GenBase.pm:141 ../lib/EB/Report/BTWAangifte.pm:105 #: ../lib/EB/Report/BTWAangifte.pm:129 ../lib/EB/DB.pm:221 ../lib/EB/DB.pm:249 #, perl-brace-format msgid "Onbekend boekjaar: {bky}" msgstr "Unknown financial year: {bky}" #: ../lib/EB/Globals.pm:64 msgid "-- Inkoop Verkoop Bank Kas Memoriaal" msgstr "-- A/Payable A/Receivable Sales Bank Cash Memorial" #: ../lib/EB/Globals.pm:67 msgid "Nul Hoog Laag Privé Anders" msgstr "None High Low Private Other" # TODO #: ../lib/EB/Globals.pm:68 msgid "Geen Jaar 2 3 Kwartaal 5 6 7 8 9 10 11 Maand" msgstr "No year 2 3 quarter 5 6 7 8 9 10 11 month" #: ../lib/EB/Globals.pm:74 msgid "Normaal Verlegd Intra Extra" msgstr "Normal Delegated Intra Extra" #: ../lib/EB/Tools/Schema.pm:59 #, perl-brace-format msgid "Onbekend schema: {schema}" msgstr "Unknown schema: {schema}" #: ../lib/EB/Tools/Schema.pm:61 #, perl-brace-format msgid "Toegangsfout schema data: {err}" msgstr "Error accessing schema data: {err}" #: ../lib/EB/Tools/Schema.pm:64 #, perl-brace-format msgid "Schema {schema} geïnitialiseerd" msgstr "Schema {schema} has been initialised" #: ../lib/EB/Tools/Schema.pm:111 msgid "scm:tg:hoog" msgstr "scm:tg:high" #: ../lib/EB/Tools/Schema.pm:112 msgid "scm:tg:laag" msgstr "scm:tg:low" #: ../lib/EB/Tools/Schema.pm:113 msgid "scm:tg:nul" msgstr "scm:tg:zero" #: ../lib/EB/Tools/Schema.pm:114 msgid "scm:tg:geen" msgstr "scm:tg:none" #: ../lib/EB/Tools/Schema.pm:115 msgid "scm:tg:privé" msgstr "scm:tg:private" #: ../lib/EB/Tools/Schema.pm:116 msgid "scm:tg:anders" msgstr "scm:tg:other" #: ../lib/EB/Tools/Schema.pm:119 msgid "scm:std:winst" msgstr "scm:std:profit" #: ../lib/EB/Tools/Schema.pm:120 msgid "scm:std:crd" msgstr "scm:std:crd" #: ../lib/EB/Tools/Schema.pm:121 msgid "scm:std:deb" msgstr "scm:std:deb" #: ../lib/EB/Tools/Schema.pm:122 msgid "scm:std:btw_il" msgstr "scm:std:vat_pl" #: ../lib/EB/Tools/Schema.pm:123 msgid "scm:std:btw_vl" msgstr "scm:std:vat_sl" #: ../lib/EB/Tools/Schema.pm:124 msgid "scm:std:btw_ih" msgstr "scm:std:vat_ph" #: ../lib/EB/Tools/Schema.pm:125 msgid "scm:std:btw_vp" msgstr "scm:std:vat_sp" #: ../lib/EB/Tools/Schema.pm:126 msgid "scm:std:btw_ip" msgstr "scm:std:vat_pp" #: ../lib/EB/Tools/Schema.pm:127 msgid "scm:std:btw_va" msgstr "scm:std:vat_sa" #: ../lib/EB/Tools/Schema.pm:128 msgid "scm:std:btw_ia" msgstr "scm:std:vat_pa" #: ../lib/EB/Tools/Schema.pm:129 msgid "scm:std:btw_ok" msgstr "scm:std:vat_ok" #: ../lib/EB/Tools/Schema.pm:130 msgid "scm:std:btw_vh" msgstr "scm:std:vat_sh" #: ../lib/EB/Tools/Schema.pm:133 msgid "scm:hdr:Verdichting" msgstr "scm:hdr:Grouping" #: ../lib/EB/Tools/Schema.pm:134 msgid "scm:hdr:Balansrekeningen" msgstr "scm:hdr:Balance Accounts" #: ../lib/EB/Tools/Schema.pm:135 msgid "scm:balans" msgstr "scm:balance" #: ../lib/EB/Tools/Schema.pm:136 msgid "scm:hdr:Resultaatrekeningen" msgstr "scm:hdr:Result Accounts" #: ../lib/EB/Tools/Schema.pm:137 msgid "scm:result" msgstr "scm:result" #: ../lib/EB/Tools/Schema.pm:138 msgid "scm:hdr:Dagboeken" msgstr "scm:hdr:Daybooks" #: ../lib/EB/Tools/Schema.pm:139 msgid "scm:dagboeken" msgstr "scm:daybooks" #: ../lib/EB/Tools/Schema.pm:140 msgid "scm:hdr:BTW Tarieven" msgstr "scm:hdr:VAT Tariffs" #: ../lib/EB/Tools/Schema.pm:143 msgid "scm:dbk:inkoop" msgstr "scm:dbk:purchases" #: ../lib/EB/Tools/Schema.pm:144 msgid "scm:dbk:verkoop" msgstr "scm:dbk:sales" #: ../lib/EB/Tools/Schema.pm:145 msgid "scm:dbk:bank" msgstr "scm:dbk:bank" #: ../lib/EB/Tools/Schema.pm:146 msgid "scm:dbk:kas" msgstr "scm:dbk:cash" #: ../lib/EB/Tools/Schema.pm:147 msgid "scm:dbk:memoriaal" msgstr "scm:dbk:memorial" #: ../lib/EB/Tools/Schema.pm:150 msgid "scm:inclusief" msgstr "scm:inclusive" #: ../lib/EB/Tools/Schema.pm:151 msgid "scm:exclusief" msgstr "scm:exclusive" #: ../lib/EB/Tools/Schema.pm:152 msgid "scm:incl" msgstr "scm:incl" #: ../lib/EB/Tools/Schema.pm:153 msgid "scm:excl" msgstr "scm:excl" #: ../lib/EB/Tools/Schema.pm:154 msgid "scm:btw" msgstr "scm:vat" #: ../lib/EB/Tools/Schema.pm:155 msgid "scm:kosten" msgstr "scm:expenses" #: ../lib/EB/Tools/Schema.pm:156 msgid "scm:kostenrekening" msgstr "scm:expenses account" #: ../lib/EB/Tools/Schema.pm:157 msgid "scm:omzet" msgstr "scm:revenue" #: ../lib/EB/Tools/Schema.pm:158 msgid "scm:omzetrekening" msgstr "scm:revenue account" #: ../lib/EB/Tools/Schema.pm:159 msgid "scm:koppeling" msgstr "scm:mapping" #: ../lib/EB/Tools/Schema.pm:160 msgid "scm:type" msgstr "scm:type" #: ../lib/EB/Tools/Schema.pm:161 msgid "scm:rek" msgstr "scm:acct" #: ../lib/EB/Tools/Schema.pm:162 msgid "scm:rekening" msgstr "scm:account" #: ../lib/EB/Tools/Schema.pm:163 msgid "scm:percentage" msgstr "scm:percentage" #: ../lib/EB/Tools/Schema.pm:164 msgid "scm:perc" msgstr "scm:perc" #: ../lib/EB/Tools/Schema.pm:165 msgid "scm:tariefgroep" msgstr "scm:class" #: ../lib/EB/Tools/Schema.pm:195 #, perl-brace-format msgid "Dubbel: dagboek {dbk}" msgstr "Duplicate: daybook {dbk}" #: ../lib/EB/Tools/Schema.pm:211 #, perl-brace-format msgid "Dagboek {id} onbekend type \"{type}\"" msgstr "Daybook {id}: unknown type \"{type}\"" #: ../lib/EB/Tools/Schema.pm:221 #, perl-brace-format msgid "Dagboek {id}: onbekende info \"{info}\"" msgstr "Daybook {id}: unknown information \"{info}\"" #: ../lib/EB/Tools/Schema.pm:226 #, perl-brace-format msgid "Dagboek {id}: het :type ontbreekt" msgstr "Daybook {id}: the :type is missing" #: ../lib/EB/Tools/Schema.pm:227 #, perl-brace-format msgid "Dagboek {id}: het :rekening nummer ontbreekt" msgstr "Daybook {id}: the :rekening is missing" #: ../lib/EB/Tools/Schema.pm:229 #, perl-brace-format msgid "Dagboek {id}: :dc is alleen toegestaan voor Kas en Bankboeken" msgstr "Daybook {id}: :dc is only allowed for Cash and Bank" #: ../lib/EB/Tools/Schema.pm:234 #, perl-brace-format msgid "Dagboek naam \"{dbk}\" is niet toegestaan." msgstr "Daybook name {dbk} is not allowed." #: ../lib/EB/Tools/Schema.pm:246 #, perl-brace-format msgid "Dubbel: BTW tarief {id}" msgstr "Duplicate: VAT tariff {id}" # TODO #: ../lib/EB/Tools/Schema.pm:272 msgid "Gelieve BTW tariefgroep \"Geen\" te vervangen door \"Nul\"" msgstr "Please replace VAT class \"None\" with \"Zero\"" # TODO #: ../lib/EB/Tools/Schema.pm:288 #, perl-brace-format msgid "BTW tarief {id}: onbekende info \"{info}\"" msgstr "VAT code {id}: unknown information \"{info}\"" #: ../lib/EB/Tools/Schema.pm:293 #, perl-brace-format msgid "BTW tarief {id}: geen percentage en de tariefgroep is niet \"{none}\"" msgstr "" "VAT code {id}: no percentage specified, and tariff class is not \"{none}\"" #: ../lib/EB/Tools/Schema.pm:294 msgid "geen" msgstr "none" #: ../lib/EB/Tools/Schema.pm:337 #, perl-brace-format msgid "Dubbel: hoofdverdichting {vrd}" msgstr "Duplicate: master group {vrd}" #: ../lib/EB/Tools/Schema.pm:341 #, perl-brace-format msgid "Dubbel: verdichting {vrd}" msgstr "Duplicate: group {vrd}" #: ../lib/EB/Tools/Schema.pm:342 #, perl-brace-format msgid "Verdichting {vrd} heeft geen hoofdverdichting" msgstr "Group {vrd} has no corresponding master group" #: ../lib/EB/Tools/Schema.pm:347 #, perl-brace-format msgid "Dubbel: rekening {acct}" msgstr "Duplicate: account {acct}" #: ../lib/EB/Tools/Schema.pm:348 #, perl-brace-format msgid "Rekening {id} heeft geen verdichting" msgstr "Account {id} has no group" #: ../lib/EB/Tools/Schema.pm:360 #, perl-brace-format msgid "Rekening {id}: onherkenbare vlaggetjes {flags}" msgstr "Account {id}: unknown flags \"{flags}\"" #: ../lib/EB/Tools/Schema.pm:395 #, perl-brace-format msgid "Foutieve BTW specificatie: {spec}" msgstr "Error in VAT specification: {spec}" #: ../lib/EB/Tools/Schema.pm:405 #, perl-brace-format msgid "Rekening {id}: onbekende koppeling \"{std}\"" msgstr "Account {id}: unknown mapping to \"{std}\"" #: ../lib/EB/Tools/Schema.pm:408 #, perl-brace-format msgid "Rekening {id}: extra koppeling voor \"{std}\"" msgstr "Account {id}: extra mapping to \"{std}\"" #: ../lib/EB/Tools/Schema.pm:415 #, perl-brace-format msgid "Rekening {id}: BTW koppeling '{ko}' met een {acc} is niet toegestaan" msgstr "Account {id}: Mapping VAT code '{ko}' with {acc} is not allowed" #: ../lib/EB/Tools/Schema.pm:419 #, perl-brace-format msgid "" "Rekening {id}: BTW koppeling met neutrale resultaatrekening is niet " "toegestaan" msgstr "Account {id}: Mapping a VAT code with a neutral account is not allowed" #: ../lib/EB/Tools/Schema.pm:421 #, perl-brace-format msgid "" "Rekening {id}: BTW koppeling met een balansrekening vereist kosten/omzet " "specificatie" msgstr "" "Account {id}: Mapping a VAT code with a balance account requires a KO " "specification" #: ../lib/EB/Tools/Schema.pm:512 ../lib/EB/Tools/Schema.pm:517 #, perl-brace-format msgid "" "Ongeldige invoer in schema bestand, regel {lno}:\n" "{line}" msgstr "" "Invalid input in schema, line {lno}\n" "{line}" #: ../lib/EB/Tools/Schema.pm:545 #, perl-brace-format msgid "Dagboek {id} heeft geen tegenrekening" msgstr "Account {id} has no contra account" #: ../lib/EB/Tools/Schema.pm:566 #, perl-brace-format msgid "Geen BTW tarief gevonden met tariefgroep {gr}, inclusief" msgstr "No VAT code found with group {gr} and inclusive" #: ../lib/EB/Tools/Schema.pm:579 #, perl-brace-format msgid "Geen koppeling gevonden voor \"{std}\"" msgstr "No account for {std} found" #: ../lib/EB/Tools/Schema.pm:582 msgid "FOUTEN GEVONDEN IN SCHEMA BESTAND, VERWERKING AFGEBROKEN" msgstr "ERRORS FOUND IN SCHEMA, PROCESS ABORTED" #: ../lib/EB/Tools/Schema.pm:618 msgid "Installatiefout -- geen database schema" msgstr "Installation error -- no database schema" #: ../lib/EB/Tools/Schema.pm:675 #, perl-brace-format msgid "Geen BTW tariefgroep voor code {code}" msgstr "Missing VAT class for code {code}" #: ../lib/EB/Tools/Schema.pm:748 #, perl-brace-format msgid "Aanmaken {sql}..." msgstr "Generating {sql}..." #: ../lib/EB/Tools/Schema.pm:807 #, perl-brace-format msgid "{pkg} Rekeningschema voor {db}" msgstr "{pkg} Accounting scheme for {db}" #: ../lib/EB/Tools/Schema.pm:812 #, perl-brace-format msgid "Aangemaakt door {pkg} {version} op {ts}" msgstr "Created by {pkg} {version} on {ts}" #: ../lib/EB/Tools/Schema.pm:956 #, perl-brace-format msgid "Einde {pkg} schema" msgstr "End of {pkg} schema" #: ../lib/EB/Tools/Schema.pm:973 #, perl-brace-format msgid "HOOFDVERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGEN" msgstr "MASTER GROUP MUST BE BETWEEN {min} AND {max} INCLUSIVE" #: ../lib/EB/Tools/Schema.pm:983 #, perl-brace-format msgid "VERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGEN" msgstr "GROUP MUST BE BETWEEN {min} AND {max} INCLUSIVE" #: ../lib/EB/Tools/Schema.pm:1056 #, perl-brace-format msgid "{id} ZOU EEN BALANSREKENING MOETEN ZIJN" msgstr "{id} MUST BE A BALANCE ACCOUNT" #: ../lib/EB/Tools/Schema.pm:1058 #, perl-brace-format msgid "{id} ZOU EEN RESULTAATREKENING MOETEN ZIJN" msgstr "{id} MUST BE A RESULT ACCOUNT" #: ../lib/EB/Tools/Schema.pm:1130 #, perl-brace-format msgid "Grootboekrekening {gbk} ({desc}) bestaat reeds" msgstr "Ledger account {gbk} ({desc}) already exists" #: ../lib/EB/Tools/Schema.pm:1137 #, perl-brace-format msgid "Onbekende verdichting: {vrd}" msgstr "Unknown group: {vrd}" #: ../lib/EB/Tools/Schema.pm:1147 msgid "Ongeldig type voor balansrekening (alleen D / C toegestaan)" msgstr "Invalid type for account balance (only D / C is allowed)" #: ../lib/EB/Tools/Schema.pm:1157 msgid "Ongeldig type voor resultaatrekening (alleen K / O / N toegestaan)" msgstr "Invalid type for resultaatrekening (only K / O / N allowed)" #: ../lib/EB/Tools/Schema.pm:1174 #, perl-brace-format msgid "Fout tijdens het opslaan van grootboekrekening {gbk}" msgstr "Error when saving account {gbk}" #: ../lib/EB/Tools/Schema.pm:1188 #, perl-brace-format msgid "Onbekende grootboekrekening: {gbk}" msgstr "Unknown account: {gbk}" #: ../lib/EB/Tools/Schema.pm:1196 #, perl-brace-format msgid "" "{balres} {gbk} {debcrd}{fixed}{kstomz} ({desc}); Verdichting {vrd} " "({vdesc}); Hoofdverdichting {hvrd} ({hdesc})" msgstr "" "{balres} {gbk} {debcrd}{fixed}{kstomz} ({desc}); Group account {vrd} " "({vdesc}); Master group {hvrd} ({hdesc})" #: ../lib/EB/Tools/MiniAdm.pm:37 msgid "GESTOPT: Er is al een administratie aangemaakt" msgstr "ABORTED: An administration has already been created" #: ../lib/EB/Tools/MiniAdm.pm:41 msgid "GESTOPT: Er is al een administratie gedeeltelijk aangemaakt" msgstr "ABORTED: An administration has already been partially created" #: ../lib/EB/Tools/MiniAdm.pm:66 msgid "Demo administratie" msgstr "Demo administration" #: ../lib/EB/Tools/MiniAdm.pm:89 #, perl-brace-format msgid "Probleem met het benaderen van {file}: {err}" msgstr "Error {err} while accessing file {file}" #: ../lib/EB/Tools/MiniAdm.pm:102 #, perl-brace-format msgid "Probleem met het aanmaken van {file}: Zip error" msgstr "Zip error while creating file {file}" #: ../lib/EB/Tools/MiniAdm.pm:123 #, perl-brace-format msgid "Probleem met het aanmaken van {file}: {err}" msgstr "Error {err} while creating file {file}" #: ../lib/EB/Tools/MiniAdm.pm:135 #, perl-brace-format msgid "Probleem met het afsluiten van {file}: {err}" msgstr "Error {err} while closing file {file}" #: ../lib/EB/Tools/MiniAdm.pm:177 ../lib/EB/Wx/IniWiz.pm:148 msgid "Rekeningschema" msgstr "Accounting scheme" #: ../lib/EB/Tools/MiniAdm.pm:499 ../lib/EB/Export.pm:142 #: ../lib/EB/Export.pm:161 msgid "Relaties" msgstr "Relations" #: ../lib/EB/Tools/MiniAdm.pm:508 msgid "Opening" msgstr "Opening" #: ../lib/EB/Tools/MiniAdm.pm:531 msgid "Mutaties" msgstr "Mutations" #: ../lib/EB/Tools/Einde.pm:55 #, perl-brace-format msgid "Fout tijdens het aanmaken van bestand {file}: {err}" msgstr "Error {err} while creating file {file}" #: ../lib/EB/Tools/Einde.pm:64 msgid "Geen boekjaar opgegeven" msgstr "Missing financial year" #: ../lib/EB/Tools/Einde.pm:74 #, perl-brace-format msgid "Boekjaar {bky} is definitief afgesloten" msgstr "Financial year {bky} has already been closed" #: ../lib/EB/Tools/Einde.pm:77 #, perl-brace-format msgid "Boekjaar {bky} is reeds definitief afgesloten" msgstr "Financial year {bky} has already been closed" #: ../lib/EB/Tools/Einde.pm:90 ../lib/EB/Report/Grootboek.pm:46 #: ../lib/EB/Report/Journal.pm:40 ../lib/EB/Report/Debcrd.pm:56 #: ../lib/EB/Report/Open.pm:41 msgid "Datum" msgstr "Date" #: ../lib/EB/Tools/Einde.pm:91 ../lib/EB/Report/Journal.pm:41 msgid "Boekstuk/Grootboek" msgstr "Booking/Account" #: ../lib/EB/Tools/Einde.pm:92 ../lib/EB/Report/Journal.pm:42 msgid "Rek" msgstr "Acc" #: ../lib/EB/Tools/Einde.pm:93 ../lib/EB/Tools/Einde.pm:285 #: ../lib/EB/Export.pm:214 ../lib/EB/Report/Grootboek.pm:47 #: ../lib/EB/Report/Journal.pm:43 ../lib/EB/Report/Balres.pm:74 #: ../lib/EB/Report/Proof.pm:59 msgid "Debet" msgstr "Debet" #: ../lib/EB/Tools/Einde.pm:94 ../lib/EB/Tools/Einde.pm:285 #: ../lib/EB/Export.pm:214 ../lib/EB/Report/Grootboek.pm:48 #: ../lib/EB/Report/Journal.pm:44 ../lib/EB/Report/Balres.pm:75 #: ../lib/EB/Report/Proof.pm:60 msgid "Credit" msgstr "Credit" #: ../lib/EB/Tools/Einde.pm:95 ../lib/EB/Report/Journal.pm:45 msgid "Boekstuk/regel" msgstr "Posting/line" #: ../lib/EB/Tools/Einde.pm:96 ../lib/EB/Report/Grootboek.pm:50 #: ../lib/EB/Report/Journal.pm:46 ../lib/EB/Report/Open.pm:40 msgid "Relatie" msgstr "Relation" #: ../lib/EB/Tools/Einde.pm:123 ../lib/EB/Tools/Einde.pm:190 #: ../lib/EB/Report/Journal.pm:66 ../lib/EB/Wx/Shell/MainFrame.pm:260 msgid "Journaal" msgstr "Journal" #: ../lib/EB/Tools/Einde.pm:124 ../lib/EB/Tools/Einde.pm:191 #: ../lib/EB/Tools/Einde.pm:243 #, perl-brace-format msgid "Afsluiting boekjaar {bky}" msgstr "Closing financial year {bky}" #: ../lib/EB/Tools/Einde.pm:129 ../lib/EB/Tools/Einde.pm:199 msgid "Systeemdagboek" msgstr "Internal daybook" #: ../lib/EB/Tools/Einde.pm:147 #, perl-brace-format msgid "Winst boekjaar {bky}" msgstr "Profit for financial year {bky}" #: ../lib/EB/Tools/Einde.pm:148 #, perl-brace-format msgid "Verlies boekjaar {bky}" msgstr "Loss for financial year {bky}" #: ../lib/EB/Tools/Einde.pm:243 ../lib/EB/Report/Journal.pm:187 #, perl-brace-format msgid "Totaal {pfx}" msgstr "Total {pfx}" #: ../lib/EB/Tools/Einde.pm:253 #, perl-brace-format msgid "Eindbalans bij afsluiting boekjaar {bky}" msgstr "Final balance closing financial year {bky}" #: ../lib/EB/Tools/Einde.pm:294 ../lib/EB/Export.pm:223 #, perl-brace-format msgid "Internal error -- unbalance {arg1} <> {arg2}" msgstr "Internal error -- unbalance {arg1} <> {arg2}" #: ../lib/EB/Tools/Einde.pm:298 ../lib/EB/Export.pm:227 #: ../lib/EB/Report/Grootboek.pm:192 ../lib/EB/Report/Debcrd.pm:256 #: ../lib/EB/Report/Debcrd.pm:270 msgid "Totaal" msgstr "Total" #: ../lib/EB/Tools/Einde.pm:302 #, perl-brace-format msgid "Openstaande posten bij afsluiting boekjaar {bky}" msgstr "Unsettled postings at financial year {bky} close" #: ../lib/EB/Tools/Opening.pm:50 ../lib/EB/Tools/Opening.pm:56 msgid "maand" msgstr "month" #: ../lib/EB/Tools/Opening.pm:50 ../lib/EB/Tools/Opening.pm:55 msgid "kwartaal" msgstr "quarter" #: ../lib/EB/Tools/Opening.pm:51 #, perl-brace-format msgid "Ongeldige BTW periode: {per}" msgstr "Invalid value for VAT period: \"{per}\"" #: ../lib/EB/Tools/Opening.pm:70 #, perl-brace-format msgid "Ongeldige openingsdatum: {date}" msgstr "Invalid opening date: {date}" #: ../lib/EB/Tools/Opening.pm:83 #, perl-brace-format msgid "Ongeldige boekjaar-code: {year}" msgstr "Invalid financial year code: {year}" #: ../lib/EB/Tools/Opening.pm:84 #, perl-brace-format msgid "Boekjaar-code {year} bestaat al ({desc}" msgstr "Financial year code {year} already exists ({desc})" #: ../lib/EB/Tools/Opening.pm:96 ../lib/EB/Tools/Opening.pm:122 #: ../lib/EB/Tools/Opening.pm:209 #, perl-brace-format msgid "Ongeldig bedrag: {amount}" msgstr "Invalid amount {amount}" #: ../lib/EB/Tools/Opening.pm:111 #, perl-brace-format msgid "Grootboekrekening {acct} is geen balansrekening" msgstr "Account {acct} ({desc}) is not a balance account" #: ../lib/EB/Tools/Opening.pm:159 msgid "Relatietype moet \"deb\" of \"crd\" zijn" msgstr "Relation type must be \"deb\" or \"crd\"" #: ../lib/EB/Tools/Opening.pm:165 #, perl-brace-format msgid "Ongeldige datum: {date}" msgstr "Invalid date: {date}" #: ../lib/EB/Tools/Opening.pm:168 #, perl-brace-format msgid "Datum {date} valt niet vóór het boekjaar" msgstr "Date {date} does not precede the financial year" #: ../lib/EB/Tools/Opening.pm:182 ../lib/EB/Tools/Opening.pm:205 #, perl-brace-format msgid "Onbekende relatie: {rel}" msgstr "Unknown relation: {rel}" #: ../lib/EB/Tools/Opening.pm:228 msgid "De naam van de administratie is nog niet opgegeven" msgstr "The name for the administration has not yet been specified" #: ../lib/EB/Tools/Opening.pm:230 msgid "De begindatum is nog niet opgegeven" msgstr "The opening date for the administration has not yet been specified" #: ../lib/EB/Tools/Opening.pm:236 ../lib/EB/Tools/Opening.pm:540 #, perl-brace-format msgid "Er is geen boekjaarcode opgegeven, de waarde {val} wordt gebruikt" msgstr "No financial year code supplied, using {val} instead" #: ../lib/EB/Tools/Opening.pm:238 #, perl-brace-format msgid "Boekjaarcode \"{code}\" is reeds in gebruik" msgstr "Financial year code \"{code}\" is already in use" #: ../lib/EB/Tools/Opening.pm:243 #, perl-brace-format msgid "Ongeldige boekjaarcode: {code}" msgstr "Invalid value for financial year: {code}" #: ../lib/EB/Tools/Opening.pm:248 msgid "De BTW periode is nog niet opgegeven" msgstr "The VAT period has not yet been specified" #: ../lib/EB/Tools/Opening.pm:252 msgid "Het totaalbedrag van de openingsbalans is nog niet opgegeven" msgstr "The total amount for the initial balance has not yet been specified" #: ../lib/EB/Tools/Opening.pm:278 msgid "De openingsbalans is nog niet opgegeven" msgstr "The opening balance has not yet been supplied" #: ../lib/EB/Tools/Opening.pm:308 msgid "De openingsbalans is niet correct!" msgstr "The opening balance is not correct!" #: ../lib/EB/Tools/Opening.pm:309 #, perl-brace-format msgid "Opgegeven balanstotaal = {total}" msgstr "Total as specified = {total}" #: ../lib/EB/Tools/Opening.pm:311 #, perl-brace-format msgid "Rekenkundig residu debet = {rdeb}, credit = {rcrd}" msgstr "Arithmetic difference debit = {rdeb}, credit = {rcrd}" #: ../lib/EB/Tools/Opening.pm:315 ../lib/EB/Tools/Opening.pm:321 #, perl-brace-format msgid " (balanstotaal {total})" msgstr "(balance total {total})" #: ../lib/EB/Tools/Opening.pm:317 #, perl-brace-format msgid "Boekhoudkundig residu debet = {rdeb}, credit = {rcrd}" msgstr "Accounting difference debit = {rdeb}, credit = {rcrd}" #: ../lib/EB/Tools/Opening.pm:326 msgid "Er zijn geen openstaande posten opgegeven" msgstr "Unsettled postings have not been specified" #: ../lib/EB/Tools/Opening.pm:328 msgid "" "Er zijn openstaande posten opgegeven, maar geen corresponderende balansposten" msgstr "" "There are open postings, but no corresponding balance accounts have been " "specified" #: ../lib/EB/Tools/Opening.pm:342 msgid "Deze administratie kent geen koppeling voor verkoopboekingen" msgstr "This administration doesn't handle accounts receivable" #: ../lib/EB/Tools/Opening.pm:357 msgid "Deze administratie kent geen koppeling voor inkoopboekingen" msgstr "This administration doesn't handle accounts payable" #: ../lib/EB/Tools/Opening.pm:376 msgid "Boekingsdatum valt niet binnen het boekjaar" msgstr "Date of posting falls outside the financial year" #: ../lib/EB/Tools/Opening.pm:399 ../lib/EB/Tools/Opening.pm:419 #, perl-brace-format msgid "Er is {amt} te weinig aan openstaande {dc} (rekening {acct}) opgegeven" msgstr "Unsettled {dc} (account {acct}) is {amt} short" #: ../lib/EB/Tools/Opening.pm:401 ../lib/EB/Tools/Opening.pm:406 #: ../lib/EB/DB.pm:108 ../lib/EB/DB.pm:112 ../lib/EB/Wx/Shell/MainFrame.pm:265 msgid "Debiteuren" msgstr "Debtors" #: ../lib/EB/Tools/Opening.pm:404 ../lib/EB/Tools/Opening.pm:414 #, perl-brace-format msgid "Er is {amt} te veel aan openstaande {dc} (rekening {acct}) opgegeven" msgstr "Unsettled {dc} (account {acct}) has an excess of {amt}" #: ../lib/EB/Tools/Opening.pm:416 ../lib/EB/Tools/Opening.pm:421 #: ../lib/EB/DB.pm:120 ../lib/EB/DB.pm:124 ../lib/EB/Wx/Shell/MainFrame.pm:264 msgid "Crediteuren" msgstr "Creditors" #: ../lib/EB/Tools/Opening.pm:428 msgid "DE OPENING IS NIET UITGEVOERD!" msgstr "THE OPENING HAS NOT BEEN COMPLETED!" #: ../lib/EB/Tools/Opening.pm:527 #, perl-brace-format msgid "Begindatum {year} komt in de toekomst te liggen" msgstr "Opening date {year} would be in the future" #: ../lib/EB/Tools/Opening.pm:536 msgid "Er is geen nieuwe BTW periode opgegeven, deze blijft ongewijzigd" msgstr "" "No new VAT period has been entered, using current VAT period codes instead" #: ../lib/EB/Tools/Opening.pm:543 msgid "HET NIEUWE BOEKJAAR IS NIET GEOPEND!" msgstr "THE NEW FINANCIAL YEAR HAS NOT BEEN OPENED!" #: ../lib/EB/Tools/Opening.pm:580 msgid "" "Het openen van een administratie kan slechts éénmaal gebeuren, vóór\n" "het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar\n" "kan te allen tijde worden uitgevoerd, uiteraard maar één keer per\n" "boekjaar.\n" "\n" "Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met\n" "de opdracht \"adm_open\". Zolang deze laatste opdracht niet is gegeven\n" "blijft de administratie ongewijzigd. Alle benodigde opdrachten moeten\n" "dan ook in één enkele EekBoek shell sessie worden afgehandeld.\n" "\n" "Mogelijke opdrachten voor openen van een boekjaar:\n" "\n" " adm_btwperiode [ jaar | kwartaal | maand ]\n" " adm_boekjaarcode \n" "\t\tEen code van max 4 letters en/of cijfers waarmee het\n" "\t\tboekjaar kan worden geïdentificeerd.\n" "\t\tStandaard wordt het jaartal van het boekjaar genomen.\n" " adm_open\n" "\t\tAlle informatie die met de bovenstaande opdrachten is\n" "\t\tingevoerd, wordt verwerkt.\n" "\n" "Opdrachten voor het openen van een administratie:\n" "\n" " adm_naam \"Naam van de administratie\"\n" " adm_btwperiode [ jaar | kwartaal | maand ]\n" " adm_begindatum \n" "\t\tEen administratie loopt altijd van 1 januari tot en\n" "\t\tmet 31 december van een kalenderjaar.\n" " adm_boekjaarcode \n" "\t\tEen code van max 4 letters en/of cijfers waarmee het\n" "\t\tboekjaar kan worden geïdentificeerd.\n" "\t\tStandaard wordt het jaartal van het boekjaar genomen.\n" "\t\tDe boekjaarcode is alleen relevant indien er meerdere\n" "\t\tboekjaren in één administratie worden bijgehouden.\n" " adm_balanstotaal \n" "\t\tAls een balanstotaal is opgegeven, moeten er ook\n" "\t\topeningsbalansboekingen worden uitgevoerd met een of\n" "\t\tmeer adm_balans opdrachten.\n" " adm_balans \n" "\t\tDe debet en credit boekingen moeten uiteindelijk\n" "\t\tallebei gelijk zijn aan het opgegeven balanstotaal.\n" "\t\tIndien er een bedrag is opgegeven voor de balansrekening\n" "\t\tCrediteuren of Debiteuren, dan moet er voor dit bedrag\n" "\t\took openstaande posten worden ingevoerd met een of\n" "\t\tmeer adm_relatie opdrachten.\n" " adm_relatie \n" "\t\tInvoeren van een openstaande post uit het voorgaande\n" "\t\tboekjaar. Het moet volledig zijn, dus\n" "\t\t::.\n" " adm_open\n" "\t\tAlle informatie die met de bovenstaande opdrachten is\n" "\t\tingevoerd, wordt verwerkt.\n" msgstr "" "Opening an administratie can be done only once and only \n" "before the first mutatioon is entered. Opening a new financial year \n" "is always possible, provided it is done no more than once a year.\n" "\n" "Opening an admininstration can encompass a number of steps and must \n" "be concluded with the command \"adm_open\". As long as this command \n" "has not been given, the administration remains unsaved. Therefore, \n" "all required commands must be handled within the same EekBoek shell " "session.\n" "\n" "Possible commands for opening a financial year:\n" "\n" " adm_btwperiode [ year | quarter | month ]\n" " adm_boekjaarcode \n" "\t\tA code of max 4 letters and/or digits with which\n" "\t\tthe financial year can be identified.\n" "\t\tBy default the year of the financial year is taken.\n" " adm_open\n" "\t\tAll information executed with the commands above \n" "\t\tis processed.\n" "\n" "Commands for opening an administration:\n" "\n" " adm_naam \"Name of the administration\"\n" " adm_btwperiode [ year | quarter | month ]\n" " adm_begindatum \n" "\t\tAn administration always runs from 1 januari to \n" "\t\t31 december of a calender year.\n" " adm_boekjaarcode \n" "\t\tA code of max 4 letters and/or digits with which\n" "\t\tthe financial year can be identified.\n" "\t\tBy default the year of the financial year is taken.\n" "\t\tThe boekjaar code is only relevant if more than one\n" "\t\tboekjaren are maintained within one administration.\n" " adm_balanstotaal \n" "\t\tAls een balanstotaal is opgegeven, moeten er ook\n" "\t\topeningsbalansboekingen worden uitgevoerd met een of\n" "\t\tmeer adm_balans opdrachten.\n" " adm_balans \n" "\t\tDe debet en credit boekingen moeten uiteindelijk\n" "\t\tallebei gelijk zijn aan het opgegeven balanstotaal.\n" "\t\tIndien er een bedrag is opgegeven voor de balansrekening\n" "\t\tCrediteuren of Debiteuren, dan moet er voor dit bedrag\n" "\t\took openstaande posten worden ingevoerd met een of\n" "\t\tmeer adm_relatie opdrachten.\n" " adm_relatie \n" "\t\tInvoeren van een openstaande post uit het voorgaande\n" "\t\tboekjaar. Het moet volledig zijn, dus\n" "\t\t::.\n" " adm_open\n" "\t\tAll information executed with the commands above \n" "\t\tis processed.\n" #: ../lib/EB/Tools/Opening.pm:637 msgid "" "Specifeer de BTW aangifteperiode voor het nieuw te openen jaar.\n" "\n" " adm_btwperiode [ jaar | kwartaal | maand ]\n" "\n" "Deze opdracht kan worden gebruikt bij het openen van een boekjaar.\n" "Zie \"help adm_open\" voor meer informatie.\n" msgstr "" "Specify the VAT submission period for the new to be opened year.\n" "\n" " adm_btwperiode [ year | quarter | month ]\n" "\n" "This command can be used when opening a financial year.\n" "See \"help adm_open\" for more information.\n" #: ../lib/EB/Tools/Opening.pm:648 msgid "" "Specificeert de boekjaarcode voor het nieuw te openen jaar.\n" "\n" " adm_boekjaarcode \n" "\n" "De boekjaarcode telt maximaal 4 letters en/of cijfers.\n" "Standaard wordt het jaartal van het te openen boekjaar genomen.\n" "De boekjaarcode is alleen belangrijk indien er meerdere boekjaren in één\n" "administratie worden bijgehouden.\n" "\n" "Deze opdracht kan worden gebruikt bij het openen van een boekjaar.\n" "Zie \"help adm_open\" voor meer informatie.\n" msgstr "" "Specifies the code for the new financial year.\n" "\n" " adm_boekjaarcode \n" "\n" "The code has a maximum of 4 letters and/or digits.\n" "By default, the year of the new financial year is taken.\n" "The year code is only required if multiple financial years are kept in\n" "a single administration.\n" "\n" "This command can be used when opening a financial year.\n" "Use \"help adm_open\" for more information.\n" #: ../lib/EB/Tools/Opening.pm:664 msgid "" "Specificeert de naam van de administratie, te gebruiken voor rapportages.\n" "\n" " adm_naam \"Naam van de administratie\"\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" "Specifies the name of the administration to be used for reporting.\n" "\n" " adm_naam \"Name of the administration\"\n" "\n" "This command can be used when opening a financial year.\n" "Use \"help adm_open\" for more information.\n" #: ../lib/EB/Tools/Opening.pm:675 msgid "" "Specificeert de begindatum van de administratie.\n" "Een administratie loopt altijd van 1 januari tot en met 31 december\n" "van een kalenderjaar. Daarom moet als begindatum een jaartal worden\n" "opgegeven.\n" "\n" " adm_begindatum \n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" "Specifies the opening date of the administration.\n" "An administration always runs from January 1 through December 31 of a\n" "calendar year. Therefore, the beginning date only needs to specify a year.\n" "\n" " adm_begindatum \n" "\n" "This command can be used when opening a financial year.\n" "Use \"help adm_open\" for more information.\n" #: ../lib/EB/Tools/Opening.pm:689 msgid "" "Specificeert het balanstotaal voor de in te voeren openingbalans.\n" "\n" " adm_balanstotaal \n" "\n" "Het balanstotaal is de zowel de som van alle debet-posten als de som\n" "van alle credit-posten van de openingsbalans. Als een balanstotaal is\n" "opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met\n" "een of meer adm_balans opdrachten. Zie ook \"help adm_balans\".\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" "Specifies the balance total for the new opening balance sheet.\n" "\n" " adm_balanstotaal \n" "\n" "The balance total is the sum of all debit items and credit items in\n" "the opening balance. If a balance total is specified, then one or more\n" "opening balance reservations must also be made with \"adm_balans\"\n" "commands. See also \"help adm_balans\".\n" "\n" "This command can be used when opening a financial year.\n" "Use \"help adm_open\" for more information.\n" #: ../lib/EB/Tools/Opening.pm:705 msgid "" "Specificeert een balanspost voor de openingsbalans.\n" "\n" " adm_balans \n" "\n" "De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn\n" "aan het opgegeven balanstotaal.\n" "\n" "Indien er een bedrag is opgegeven voor de balansrekening Crediteuren\n" "of voor Debiteuren, dan moeten er ook openstaande posten voor in\n" "totaal dit bedrag worden ingevoerd met een of meer adm_relatie\n" "opdrachten. Zie ook \"help adm_relatie\".\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" "Specifies a balance reservation for the opening balance sheet.\n" "\n" " adm_balans \n" "\n" "The debit and credit entries must ultimately both be equal to the\n" "total amount as specified with \"adm_balanstotaal\".\n" "\n" "If reservations are specified for Accounts Payable or Accounts\n" "Receivable, you should also specify unsettled postings for a total\n" "amount with one or more \"adm_relatie\" commands. See also \"help\n" "adm_relatie\".\n" "\n" "This command can be used when opening a financial year.\n" "Use \"help adm_open\" for more information.\n" #: ../lib/EB/Tools/Opening.pm:724 msgid "" "Specificeert een openstaande post uit een voorgaand boekjaar.\n" "\n" " adm_relatie \n" "\n" "Het moet volledig zijn, dus ::.\n" "\n" "Indien er voor de openingsbalans een bedrag is opgegeven voor de\n" "balansrekening Crediteuren of voor Debiteuren, dan moeten er ook\n" "openstaande posten voor in totaal dit bedrag worden ingevoerd. Zie ook\n" "\"help adm_balans\".\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" "Specifies an unsettled posting from a previous financial year. \n" "\n" " adm_relatie \n" "\n" "The must be fully qualified, ::" ". \n" "\n" "If reservations are specified for Accounts Payable or Accounts\n" "Receivable, you should also specify unsettled postings for a total\n" "amount with one or more \"adm_relatie\" commands. See also \"help\n" "adm_relatie\".\n" "\n" "This command can be used when opening a financial year.\n" "Use \"help adm_open\" for more information.\n" #: ../lib/EB/Tools/Opening.pm:744 ../lib/EB/Shell.pm:1625 #: ../lib/EB/Booking.pm:35 ../lib/EB/Report/BTWAangifte.pm:45 msgid "De administratie is nog niet geopend" msgstr "The administration has not yet been opened" #: ../lib/EB/Tools/Opening.pm:747 ../lib/EB/Shell.pm:1640 msgid "De administratie is reeds in gebruik" msgstr "The administration is already in use" #: ../lib/EB/Tools/SQLEngine.pm:60 #, perl-brace-format msgid "SQLEngine: No callback for {cb}" msgstr "SQLEngine: No callback for {cb}" #: ../lib/EB/Tools/SQLEngine.pm:167 #, perl-brace-format msgid "Incomplete SQL opdracht: {sql}" msgstr "Incomplete SQL command: {sql}" #: ../lib/EB/Config/Data.pm:21 msgid "Bedrijfsgegevens" msgstr "Company data" #: ../lib/EB/Config/Data.pm:25 msgid "Administratienummer" msgstr "Administration number" #: ../lib/EB/Config/Data.pm:26 msgid "Adres" msgstr "Address" #: ../lib/EB/Config/Data.pm:27 msgid "Postcode" msgstr "Zip code" #: ../lib/EB/Config/Data.pm:28 msgid "Plaats" msgstr "City" #: ../lib/EB/Config/Data.pm:29 msgid "Fiscaal nummer" msgstr "Fiscal number" #: ../lib/EB/Config/Data.pm:33 msgid "Algemeen" msgstr "General" #: ../lib/EB/Config/Data.pm:36 msgid "Folder voor administraties" msgstr "Folder for administration data" #: ../lib/EB/Config/Data.pm:37 msgid "Forceer wizard" msgstr "Force wizard start-up" #: ../lib/EB/Config/Data.pm:41 ../lib/EB/Wx/Shell/PreferencesDialog.pm:76 msgid "Voorkeursinstellingen" msgstr "Preferences" #: ../lib/EB/Config/Data.pm:44 msgid "Toon journaalpost na elke boeking" msgstr "Show journal details after making a booking" #: ../lib/EB/Config/Data.pm:51 msgid "Driver" msgstr "Driver" #: ../lib/EB/Config/Data.pm:55 msgid "Gebruikersnaam" msgstr "Username" #: ../lib/EB/Config/Data.pm:56 msgid "Toegangscode" msgstr "Password" #: ../lib/EB/Config/Data.pm:57 msgid "Server systeem" msgstr "Server host" #: ../lib/EB/Config/Data.pm:58 msgid "Server poort" msgstr "Server port" #: ../lib/EB/Config/Data.pm:61 msgid "Strategie" msgstr "Strategy" #: ../lib/EB/Config/Data.pm:64 msgid "Afrondingsmethode" msgstr "Rounding algorithm" #: ../lib/EB/Config/Data.pm:68 msgid "Meervoudig afboeken" msgstr "" #: ../lib/EB/Config/Data.pm:69 msgid "BTW correcties" msgstr "Fix VAT calculations" #: ../lib/EB/Config/Data.pm:72 msgid "Shell" msgstr "Shell" #: ../lib/EB/Config/Data.pm:75 msgid "Prompt" msgstr "Prompt" #: ../lib/EB/Config/Data.pm:76 msgid "Eigen uitbreidingen" msgstr "Extensions" #: ../lib/EB/Config/Data.pm:79 msgid "Formaten" msgstr "Formats" #: ../lib/EB/Config/Data.pm:82 msgid "Getalformaat" msgstr "Number format" #: ../lib/EB/Config/Data.pm:89 msgid "Datumformaat" msgstr "Date format" #: ../lib/EB/Config/Data.pm:95 msgid "Tekstrapporten" msgstr "Textual reports" #: ../lib/EB/Config/Data.pm:98 msgid "Kolombreedte voor getallen" msgstr "Column width for numbers" #: ../lib/EB/Config/Data.pm:102 msgid "HTML rapporten" msgstr "HTML reports" #: ../lib/EB/Config/Data.pm:105 msgid "Style sheets" msgstr "Folder for style sheets" #: ../lib/EB/Config/Data.pm:108 msgid "CSV rapporten" msgstr "CSV reports" #: ../lib/EB/Config/Data.pm:111 msgid "Scheidingsteken" msgstr "Separator" #: ../lib/EB/Config/Data.pm:117 msgid "Beveiliging" msgstr "Security" #: ../lib/EB/Config/Data.pm:120 msgid "Beveiliging voor MS Vista uitschakelen" msgstr "Bypass restrictions for Microsoft Vista" #: ../lib/EB/Shell.pm:93 msgid "Openstaande transactie is teruggedraaid" msgstr "Pending transaction has been rolled back" #: ../lib/EB/Shell.pm:110 #, perl-brace-format msgid "Pas op! Boekjaar {bky} is nog niet afgesloten." msgstr "Warning! Financial year {bky} has not been closed yet" #: ../lib/EB/Shell.pm:300 #, perl-brace-format msgid "Toevoegen boekstuk in een dagboek van type {type}" msgstr "Adds a posting to a daybook of type {type}" #: ../lib/EB/Shell.pm:305 msgid "" " [:nr] [ ] \n" "\n" "gevolgd door een of meer:\n" "\n" " \n" "\n" "Controle van het totale boekstukbedrag kan met de optie --totaal=.\n" "De laatste mag worden weggelaten.\n" msgstr "" " [:num] [ ] \n" "\n" "followed by one or more:\n" "\n" " \n" "\n" "A check of the total amount for this posting can be done with the\n" "option --totaal=.\n" "The last may be omitted.\n" #: ../lib/EB/Shell.pm:317 msgid "" " [:nr] [ ] \n" "\n" "gevolgd door een of meer\n" "\n" " \n" "\n" "Controle van het totale boekstukbedrag kan met de optie --totaal=.\n" "De laatste mag worden weggelaten.\n" msgstr "" " [:num] [ ] \n" "\n" "followed by one or more:\n" "\n" " \n" "\n" "A check of the total amount for this posting can be done with the\n" "option --totaal=.\n" "The last may be omitted.\n" #: ../lib/EB/Shell.pm:331 msgid "" " [:nr] [ ] \n" "\n" "gevolgd door een of meer:\n" "\n" " crd [ ] \t\t\t(betaling van crediteur)\n" " deb [ ] \t\t\t(betaling van debiteur)\n" " std [ ] \t(vrije boeking)\n" "\n" "Controle van het eindsaldo kan met de optie --saldo=.\n" "Controle van het totale boekstukbedrag kan met de optie --totaal=.\n" "Voor deelbetalingen of betalingen met afwijkend bedrag kan in plaats van de\n" " het boekstuknummer worden opgegeven.\n" msgstr "" " [:num] [ ] \n" "\n" "followed by one or more:\n" "\n" " crd [ ] \t\t(payment by creditor)\n" " deb [ ] \t\t(payment by debtor)\n" " std [ ] > \t(free entry)\n" "\n" "Total amount for this posting can be checked with --totaal=.\n" "The new balance amount for this account can be verified with --" "saldo=.\n" "For partial payments or payments with an amount not equal to the\n" "corresponding posting, replace with the posting's reference.\n" #: ../lib/EB/Shell.pm:350 #, perl-brace-format msgid "Opdracht \"{cmd}\" is niet beschikbaar." msgstr "Command \"{cmd}\" is not available." #: ../lib/EB/Shell.pm:360 msgid "Te weinig argumenten voor deze opdracht" msgstr "Too few arguments for this command" #: ../lib/EB/Shell.pm:361 ../lib/EB/Shell.pm:643 ../lib/EB/Shell.pm:807 msgid "Te veel argumenten voor deze opdracht" msgstr "Too many arguments for this command" #: ../lib/EB/Shell.pm:370 ../lib/EB/Shell.pm:392 ../lib/EB/Shell.pm:406 #: ../lib/EB/Shell.pm:420 msgid "aan" msgstr "on" #: ../lib/EB/Shell.pm:371 ../lib/EB/Shell.pm:392 ../lib/EB/Shell.pm:406 #: ../lib/EB/Shell.pm:420 msgid "uit" msgstr "off" #: ../lib/EB/Shell.pm:392 #, perl-brace-format msgid "SQL Trace: {state}" msgstr "SQL Trace: {state}" #: ../lib/EB/Shell.pm:406 #, perl-brace-format msgid "Journal: {state}" msgstr "Journal: {state}" #: ../lib/EB/Shell.pm:420 #, perl-brace-format msgid "Bevestiging: {state}" msgstr "Confirmation: {state}" #: ../lib/EB/Shell.pm:426 #, perl-brace-format msgid "Database: {db}" msgstr "Database: {db}" #: ../lib/EB/Shell.pm:431 msgid "" "Toont de naam van de huidige database.\n" "\n" " database\n" msgstr "" "Shows the name of the current database.\n" "\n" " database\n" #: ../lib/EB/Shell.pm:458 #, perl-brace-format msgid "Onbekend of verkeerd dagboek: {dbk} [{type}]" msgstr "Unknown or erroneous daybook: {dbk} [{type}]" #: ../lib/EB/Shell.pm:475 msgid "cmo:boeking:boekstuk|nr" msgstr "cmo:boeking:number|nr" #: ../lib/EB/Shell.pm:476 msgid "cmo:boeking:boekjaar" msgstr "cmo:boeking:finyear" #: ../lib/EB/Shell.pm:477 msgid "cmo:boeking:journal|journaal" msgstr "cmo:boeking:journal" #: ../lib/EB/Shell.pm:480 msgid "cmo:boeking:confirm" msgstr "cmo:boeking:confirm" #: ../lib/EB/Shell.pm:483 msgid "cmo:boeking:saldo" msgstr "cmo:boeking:balance" #: ../lib/EB/Shell.pm:484 msgid "cmo:boeking:beginsaldo" msgstr "cmo:boeking:init-balance" #: ../lib/EB/Shell.pm:490 #, perl-brace-format msgid "Geboekt: {bsk}" msgstr "Posted: {bsk}" #: ../lib/EB/Shell.pm:507 msgid "cmo:journaal:detail|details" msgstr "cmo:journaal:detail|details" #: ../lib/EB/Shell.pm:508 msgid "cmo:journaal:totaal" msgstr "cmo:journaal:total" #: ../lib/EB/Shell.pm:509 msgid "cmo:journaal:boekjaar" msgstr "cmo:journaal:finyear" #: ../lib/EB/Shell.pm:510 msgid "cmo:journaal:periode" msgstr "cmo:journaal:period" #: ../lib/EB/Shell.pm:524 msgid "" "Overzicht journaalposten.\n" "\n" " journaal all\t\tAlle posten\n" " journaal \t\tAlleen boekstuknummer met dit id\n" " journaal \tAlle journaalposten van dit dagboek\n" " journaal : Boekstuk van dit dagboek\n" " journaal\t\tJournaalposten van de laatste boeking\n" "\n" "Opties\n" "\n" " --[no]detail\t\tMate van detail, standaard is met details\n" " --totaal\t\tAlleen het totaal (detail = 0)\n" " --periode=XXX\t\tAlleen over deze periode\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Summary of journal entries. \n" "\n" " journal all\t\tAll posts\n" " journal \t\tSelect posting by id\n" " journal \tAll journal entries from this daybook\n" " journal : Select posting from daybook\n" " Journal\t\tJournal entries from the last booking\n" "\n" "Options\n" "\n" " --[no]detail\t\tLevel of detail, default is all details\n" " --total\t\tOnly the overall total (detail = 0)\n" " --period=XXX\t\tOnly over this period\n" "\n" "See \"help reports\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:563 msgid "Openingsbalans kent geen einddatum" msgstr "The opening balance does not have an end date" #: ../lib/EB/Shell.pm:573 msgid "" "Toont de balansrekening.\n" "\n" "Opties:\n" " \t\tBalans op grootboekrekening\n" " --verdicht\t\tVerdicht, gedetailleerd\n" " --detail=\t\tVerdicht, mate van detail = 0, 1 of 2\n" " --per=\t\tSelecteer einddatum\n" " --boekjaar=\tSelecteer boekjaar\n" " --opening\t\tToon openingsbalans\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows the balance account.\n" "\n" "Options:\n" " \t\tBalance on general ledger account\n" " --verdicht\t\tAggregated, detailed\n" " --detail=\t\tAggregated, level of detail = 0, 1 or 2\n" " --per=\t\tSelect end date\n" " --boekjaar=\tSelecteer financial year\n" " --opening\t\tShow opening balance\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:612 msgid "" "Toont de resultatenrekening.\n" "\n" "Opties:\n" " \t\tOverzicht op grootboekrekening\n" " --verdicht\t\tVerdicht, gedetailleerd\n" " --detail=\t\tVerdicht, mate van detail = 0,1,2\n" " --periode=\tSelecteer periode\n" " --boekjaar=\tSelecteer boekjaar\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows the results account.\n" "\n" "Options:\n" " \t\tOverview at general ledger account level\n" " --verdicht\t\tAggregated, detailed\n" " --detail=\t\tAggregated, level of detail = 0,1,2\n" " --periode=\tSelect period\n" " --boekjaar=\tSelect financial year\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:650 msgid "" "Toont de Proef- en Saldibalans.\n" "\n" "Opties:\n" " \t\tProef- en Saldibalans op grootboekrekening\n" " --verdicht\t\tVerdicht, gedetailleerd (hetzelfde als --detail=2)\n" " --detail=\t\tVerdicht, mate van detail = 0,1,2\n" " --per=\t\tSelecteer einddatum\n" " --boekjaar=\tSelecteer boekjaar\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows the Trial balance en Account balance.\n" "\n" "Options:\n" " \t\tAt the general ledger account level\n" " --verdicht\t\tAggregated, detailed (same as --detail=2)\n" " --detail=\t\tAggregated, level of detail = 0,1,2\n" " --per=\t\tSelect end date\n" " --boekjaar=\tSelect financial year\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:727 #, perl-brace-format msgid "Ongeldig rekeningnummer: {acct}" msgstr "Invalid account number: {acct}" #: ../lib/EB/Shell.pm:741 msgid "" "Toont het Grootboek, of een selectie daaruit.\n" "\n" " grootboek [ ... ]\n" "\n" "Opties:\n" "\n" " --detail=\t\tMate van detail, =0,1,2 (standaard is 2)\n" " --periode=\tAlleen over deze periode\n" "\n" "Naast rekeningnummers kunnen ook nummers van verdichtingen en\n" "hoofdverdichtingen worden opgegeven.\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows the General ledger, or a selection from it.\n" "\n" " grootboek [ ... ]\n" "\n" "Options:\n" "\n" " --detail=\t\tLevel of detail, =0,1,2 (default is 2)\n" " --periode=\tOnly over this period\n" "\n" "Account groups may be specified instead of account numbers.\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:765 msgid "Nr" msgstr "Nr" #: ../lib/EB/Shell.pm:765 msgid "Type" msgstr "Type" #: ../lib/EB/Shell.pm:765 msgid "Rekening" msgstr "Account" #: ../lib/EB/Shell.pm:768 msgid "n.v.t." msgstr "N/A" #: ../lib/EB/Shell.pm:776 msgid "" "Toont een lijstje van beschikbare dagboeken.\n" "\n" " dagboeken\n" msgstr "" "Displays a list of available daybooks\n" "\n" " dagboeken\n" #: ../lib/EB/Shell.pm:810 msgid "Deze administratie voert geen BTW" msgstr "The administration does not have VAT specified" #: ../lib/EB/Shell.pm:818 msgid "" "Toont de BTW aangifte.\n" "\n" " btwaangifte [ ] [ ]\n" "\n" "Aangifteperiode kan zijn:\n" "\n" " j jaar\t\tHet gehele jaar\n" " k1 k2 k3 k4\t\t1e/2e/3e/4e kwartaal (ook: q1, ...)\n" " 1 2 3 ...\t\tMaand (op nummer)\n" " jan feb ...\t\tMaand (korte naam)\n" " januari ...\t\tMaand (lange naam)\n" "\n" "Standaard is de eerstvolgende periode waarover nog geen aangifte is\n" "gedaan.\n" "\n" "Opties:\n" "\n" " --definitief\t\tDe BTW periode wordt afgesloten. Er zijn geen\n" "\t\t\tboekingen in deze periode meer mogelijk.\n" " --periode=\tSelecteer aangifteperiode. Dit kan niet samen\n" "\t\t\tmet --boekjaar, en evenmin met de bovenvermelde\n" "\t\t\tmethode van periode-specificatie.\n" " --boekjaar=\tSelecteer boekjaar\n" " --noreport\t\tGeen rapportage. Dit is enkel zinvol samen\n" "\t\t\tmet --definitief om de afgesloten BTW periode\n" "\t\t\taan te passen.\n" " --noround\t\tAlle bedragen zonder af te ronden.\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows the VAT submission.\n" "\n" " btwaangifte [ ] [ ]\n" "\n" "Submission period can be:\n" "\n" " j jaar\t\tThe whole year\n" " k1 k2 k3 k4\t\tQuarter 1, 2, 3, 4 (also: q1, etc...)\n" " 1 2 3 ...\t\tMonth (by number)\n" " jan feb ...\t\tMonth (short name)\n" " januari ...\t\tMonth (long name)\n" "\n" "The default period is the first period over which no VAT has been " "submitted.\n" "\n" "Options:\n" "\n" " --definitief\t\tThe VAT period is completed. No further bookings within \n" "\t\t\tthis period are possible.\n" " --periode=\tSelect submission period. Dit kan niet samen\n" "\t\t\tmet boekjaar, en evenmin met de bovenvermelde\n" "\t\t\tmethode van periode-specificatie.\n" " --boekjaar=\tSelecteer boekjaar\n" " --noreport\t\tGeen rapportage. Dit is enkel zinvol samen\n" "\t\t\tmet --definitief om de afgesloten BTW periode\n" "\t\t\taan te passen.\n" " --noround\t\tAlle bedragen zonder af te ronden.\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:872 msgid "" "Toont een overzicht van boekingen op debiteuren.\n" "\n" " debiteuren [ ] [ ... ]\n" "\n" "Opties:\n" "\n" " --periode \tPeriode\n" " --boekjaar=\tSelecteer boekjaar\n" " --openstaand\t\tAlleen met openstaande posten\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows an overview of bookings by debtor.\n" "\n" " debiteuren [ ] [ ... ]\n" "\n" "Options:\n" "\n" " --periode \tPeriod\n" " --boekjaar=\tSelect financial year\n" " --openstaand\t\tOnly with open postings\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:908 msgid "" "Toont een overzicht van boekingen op crediteuren.\n" "\n" " crediteuren [ ] [ ... ]\n" "\n" "Opties:\n" "\n" " --periode=\tPeriode\n" " --boekjaar=\tSelecteer boekjaar\n" " --openstaand\t\tAlleen met openstaande posten\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows an overview of bookings by creditor.\n" "\n" " crediteuren [ ] [ ... ]\n" "\n" "Options:\n" "\n" " --periode \tPeriod\n" " --boekjaar=\tSelect financial year\n" " --openstaand\t\tOnly with open postings\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:946 msgid "" "Toont een overzicht van openstaande posten.\n" "\n" " openstaand [ ] [ ]\n" "\n" "Opties:\n" "\n" " --per=\t\tEinddatum\n" " --boekjaar=\tSelecteer boekjaar\n" " --deb --debiteuren\tAlleen debiteuren\n" " --crd --crediteuren\tAlleen crediteuren\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" "Shows an overview of open postings.\n" "\n" " openstaand [ ] [ ]\n" "\n" "Options:\n" "\n" " --per=\t\tEnd date\n" " --boekjaar=\tSelect financial year\n" " --deb --debiteuren\tOnly debtors\n" " --crd --crediteuren\tOnly creditors\n" "\n" "See also \"help rapporten\" for general information on creating reports.\n" #: ../lib/EB/Shell.pm:964 msgid "" "Alle rapport-producerende opdrachten kennen de volgende opties:\n" "\n" " --per=\t\tDe einddatum voor de rapportage.\n" "\t\t\t(Niet voor elke opdracht relevant.)\n" "\t\t\tZie \"help periodes\" voor details.\n" " --periode=\tDe periode waarover de rapportage moet\n" "\t\t\tplaatsvinden. (Niet voor elke opdracht relevant.)\n" "\t\t\tZie \"help periodes\" voor details.\n" " --output=\tProduceer het rapport in dit bestand\n" "\t\t\tUitvoertype is afhankelijk van bestandsextensie,\n" "\t\t\tbv. xx.html levert HTML, xx.txt een tekstbestand,\n" "\t\t\txx.csv een CSV, etc.\n" " --gen-\t\tForceer uitvoertype (html, csv, text, ...)\n" "\t\t\tAfhankelijk van de beschikbare uitvoertypes zijn\n" "\t\t\took de kortere opties --html, --csv en --text\n" "\t\t\tmogelijk.\n" "\t\t\t(Let op: --gen-XXX, niet --gen=XXX)\n" " --page=\t\tPaginagrootte voor tekstrapporten.\n" msgstr "" "All commands producing reports have the following options:\n" "\n" " --per=\t\tThe end date for the report.\n" "\t\t\tNot necessarily relevant for every command.\n" "\t\t\tSee \"help periodes\" for details.\n" " --period=\tThe reporting period.\n" "\t\t\tNot necessarily relevant for every command.\n" "\t\t\tSee \"help periodes\" for details.\n" " --output=\tWrite the report to this file\n" "\t\t\tOutput type is dependent on the file extension,\n" "\t\t\tfor example xx.html produces an HTML file, and xx.txt \n" "\t\t\tproduces a text file, xx.csv prodices a CSV file, etc.\n" " --gen-\t\tForce output type (html, csv, text, ...)\n" "\t\t\tDepending on the available output types, also \n" "\t\t\tthe abbreviated options, such as --html, --csv and --text\n" "\t\t\tare possible.\n" "\t\t\tCaution: --gen-XXX, not --gen=XXX\n" " --page=\t\tPage size for textual reports.\n" #: ../lib/EB/Shell.pm:987 msgid "" "De volgende periode-aanduidingen zijn mogelijk. Indien het jaartal " "ontbreekt,\n" "wordt het huidige boekjaar verondersteld.\n" "\n" " 2005-04-01 - 2005-07-31\n" " 01-04-2005 - 31-07-2005\n" " 01-04 - 31-07-2005\n" " 01-04 - 31-07\n" " 1 april 2005 - 31 juli 2005 (en varianten)\n" " 1 apr 2005 - 31 jul 2005 (en varianten)\n" " apr - jul\n" " k2 (tweede kwartaal)\n" " april 2003 (01-04-2003 - 30-04-2003)\n" " april (01-04 - 30-04 boekjaar)\n" " m4 (vierde maand)\n" " jaar (gehele boekjaar)\n" msgstr "" "The following period identifiers are possible.\n" "If the year is omitted, it is assumed the current financial year is meant.\n" "\n" " 2005-04-01 - 2005-07-31\n" " 01-04-2005 - 31-07-2005\n" " 01-04 - 31-07-2005\n" " 01-04 - 31-07\n" " 1 april 2005 - 31 juli 2005 (and variants)\n" " 1 apr 2005 - 31 jul 2005 (and variants)\n" " apr - jul\n" " k2 (second quarter)\n" " april 2003 (01-04-2003 - 30-04-2003)\n" " april (01-04 - 30-04 of current financial year)\n" " m4 (fourth month)\n" " jaar (entire calendar year)\n" #: ../lib/EB/Shell.pm:1025 #, perl-brace-format msgid "Ongeldig of ontbrekend rekeningnummer: {x}" msgstr "Invalid or missing account number: {x}" #: ../lib/EB/Shell.pm:1031 #, perl-brace-format msgid "Ongeldige of ontbrekende type specificatie: {x}" msgstr "Invalid or missing type specification: {x}" #: ../lib/EB/Shell.pm:1036 #, perl-brace-format msgid "Ongeldige of ontbrekende verdichting: {x}" msgstr "Invalid or missing group: {x}" #: ../lib/EB/Shell.pm:1052 msgid "" "Onderhoud van het schema. Deze opdracht kent sub-opdrachten:\n" "\n" " schema [ ] \n" "\n" "Aanmaken grootboekrekening\n" "\n" " schema gbk [ ]\n" "\n" " \t\tde gewenste grootboekrekening\n" " \t\tD/C voor Debet / Credit\n" "\t\t\tK/O/N voor Kosten / Omzet / Neutraal\n" "\t\t\tEventueel gevolgd door ! als deze \n" "\t\t\tbalansrekening vast staat aan één kant\n" " \tDe omschrijving van deze grootboekrekening\n" " \tDe verdichting waaronder deze rekening valt\n" "\n" " Wanneer enkel een nummer wordt opgegeven dan worden de gegevens\n" " van de betreffende grootboekrekening getoond.\n" msgstr "" "Maintenance of the accounting scheme. This command has the following \n" "sub-commands:\n" "\n" " schema [ ] \n" "\n" "Create general ledger\n" "\n" " schema gbk [ ]\n" "\n" " \t\tThe intended general ledger account.\n" " \t\tD/C for Debit / Credit\n" "\t\t\tK/O/N for Costs / Revenue / Neutral\n" "\t\t\tOptionally followed by ! if this \n" "\t\t\tbalance account is fixed on one side.\n" " \tThe description of this general account\n" " \tThe group account to which this account belongs\n" "\n" " When only a number is specified, then all data of the respective " "general \n" " ledger account are shown.\n" #: ../lib/EB/Shell.pm:1083 ../lib/EB/Export.pm:154 msgid "cmo:relatie:dagboek" msgstr "cmo:relation:daybook" #: ../lib/EB/Shell.pm:1085 ../lib/EB/Export.pm:155 msgid "cmo:relatie:btw" msgstr "cmo:relation:vat" #: ../lib/EB/Shell.pm:1090 msgid "Ongeldig aantal argumenten voor deze opdracht" msgstr "Invalid number of arguments for this command" #: ../lib/EB/Shell.pm:1103 msgid "" "Aanmaken een of meer nieuwe relaties.\n" "\n" " relatie [ ] { } ...\n" "\n" "Opties:\n" "\n" " --dagboek=\tSelecteer dagboek voor deze relatie\n" msgstr "" "Create one or more new relations.\n" "\n" " relatie [ ] { } ...\n" "\n" "Options:\n" "\n" " --dagboek=\tSelect daybook for this relation\n" #: ../lib/EB/Shell.pm:1113 msgid "" " --btw=\t\tBTW type: normaal, verlegd, intra, extra\n" "\n" "*** BTW type 'verlegd' wordt nog niet ondersteund ***\n" "*** BTW type 'intra' wordt nog niet geheel ondersteund ***\n" msgstr "" " --btw=\t\tVAT type: normaal (normal), verlegd (delegated), intra, " "extra\n" "\n" "*** VAT type 'verlegd' is not yet supported ***\n" "*** VAT type 'intra' is not fully supported ***\n" #: ../lib/EB/Shell.pm:1149 msgid "Opties --dir, --file en --xaf sluiten elkaar uit" msgstr "The options --dir, --file, and --xaf are mutually exclusive" #: ../lib/EB/Shell.pm:1153 msgid "Specificeer --dir, --file of --xaf" msgstr "Please specify one of --dir, --file or --xaf" #: ../lib/EB/Shell.pm:1168 msgid "Optie --boekjaar wordt niet ondersteund door deze export" msgstr "Option --boekjaar is not supported by this export" #: ../lib/EB/Shell.pm:1181 msgid "" "Exporteert de complete administratie.\n" "\n" " export [ ]\n" "\n" "Opties:\n" "\n" " --file=\tSelecteer uitvoerbestand\n" " --dir=\tSelecteer uitvoerdirectory\n" " --xaf=\tExport XML Auditfile Financieel\n" " --boekjaar=\tSelecteer boekjaar (alleen met --xaf)\n" "\n" "Er moet een --file, --dir of een --xaf optie worden opgegeven.\n" "De XAF export exporteert altijd één enkel boekjaar. Voor de andere\n" "exports wordt altijd de gehele administratie geëxporteerd.\n" "Eventueel bestaande files worden overschreven.\n" msgstr "" "Exports the complete administration.\n" "\n" " export [ ]\n" "\n" "Options:\n" "\n" " --file=\tSelect output file\n" " --dir=\tSelect output directory\n" " --xaf=\tExport XML Auditfile Financieel\n" " --boekjaar=\tSelect financial year (only with --xaf)\n" "\n" "One of the following options must be specified: --file, --dir or --xaf\n" "The XAF export exports always one financial year only. \n" "For the other export types the complete administration is exported.\n" "Any existing export files are overwritten.\n" #: ../lib/EB/Shell.pm:1213 msgid "Opties --dir en --file sluiten elkaar uit" msgstr "Options --dir and --file are mutually exclusive" #: ../lib/EB/Shell.pm:1217 msgid "Specificeer --dir of --file" msgstr "Please specify one of --dir or --file" #: ../lib/EB/Shell.pm:1224 #, perl-brace-format msgid "" "Database type {drv} ondersteunt niet het import commando. Gebruik de --" "import command line optie." msgstr "" "Database type {drv} does not support the import command. Use the --import " "command line option." #: ../lib/EB/Shell.pm:1237 msgid "" "Importeert een complete, geëxporteerde administratie.\n" "\n" " import [ ]\n" "\n" "Opties:\n" "\n" " --file=\tSelecteer exportbestand\n" " --dir=\tSelecteer exportdirectory\n" "\n" "Er moet of een --file of een --dir optie worden opgegeven.\n" "\n" "LET OP: IMPORT VERVANGT DE COMPLETE ADMINISTRATIE!\n" "\n" "Deze opdracht wordt niet door alle database systemen ondersteund.\n" "Deze opdracht is alleen in de command line versie beschikbaar.\n" msgstr "" "Imports a complete administration that was previously exported.\n" "\n" " import [ ]\n" "\n" "Options:\n" "\n" " --file=\tSelect export file for import\n" " --dir=\tSelect directory for import\n" "\n" "One of the options --input or --dir must be specified.\n" "\n" "CAUTION: IMPORT REPLACES THE COMPLETE EXISTING ADMINISTRATION!\n" "\n" "This command may be unavailable due to database limitations.\n" "This command is only available in the command line version.\n" #: ../lib/EB/Shell.pm:1279 msgid "" "Leest opdrachten uit een bestand.\n" "\n" " include [ ] \n" "\n" "Opties:\n" "\n" " --optioneel\t\tHet bestand mag ontbreken. De opdracht\n" "\t\t\twordt dan verder genegeerd.\n" msgstr "" "Reads commands from a file.\n" "\n" " include [ ] \n" "\n" "Options:\n" "\n" " --optioneel\t\tThe file can be omitted. The command\n" "\t\t\tis then ignored.\n" #: ../lib/EB/Shell.pm:1296 #, perl-brace-format msgid "Onbekend boekjaar: {code}" msgstr "Unknown financial year: {code}" #: ../lib/EB/Shell.pm:1299 #, perl-brace-format msgid "Boekjaar voor deze sessie: {bky} ({desc})" msgstr "Financial year for this session: {bky} ({desc})" #: ../lib/EB/Shell.pm:1304 msgid "" "Gebruik voor navolgende opdrachten het opgegeven boekjaar.\n" "\n" " boekjaar \n" msgstr "" "Use the specified financial year for all commands that follow.\n" "\n" " boekjaar \n" #: ../lib/EB/Shell.pm:1314 msgid "Deze opdracht is vervallen. Gebruik in plaats daarvan \"export\".\n" msgstr "This command is obsolete. Use \"export\" instead.\n" #: ../lib/EB/Shell.pm:1333 ../lib/EB/Shell.pm:1391 msgid "Gaarne een boekstuk" msgstr "Please supply a posting" #: ../lib/EB/Shell.pm:1353 msgid "" "Verwijdert een boekstuk. Het boekstuk mag niet in gebruik zijn.\n" "\n" " verwijder [ ] \n" "\n" "Opties:\n" "\n" " --boekjaar=\tSelekteer boekjaar\n" "\n" "Het verwijderde boekstuk wordt in de commando-historie geplaatst.\n" "Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele\n" "wijziging opnieuw ingevoerd.\n" msgstr "" "Removes a posting. The posting may not be in use.\n" "\n" " verwijder [ ] \n" "\n" "Options:\n" "\n" " --boekjaar=\tSelect financial year\n" "\n" "The posting that is removed is placed in the command history.\n" "With arrow up this command can be retrieved and after any necessary editing\n" "the posting can be reinserted.\n" #: ../lib/EB/Shell.pm:1408 msgid "" "Toont een boekstuk in tekst- of commando-vorm.\n" "\n" " toon [ ] \n" "\n" "Opties:\n" "\n" " --boekjaar=\tSelekteer boekjaar\n" " --verbose\t\tToon in uitgebreide (tekst) vorm\n" " --btw\t\t\tVermeld altijd BTW codes\n" " --bsknr\t\tVermeld altijd het boekstuknummer (default)\n" "\n" "Het getoonde boekstuk wordt in de commando-historie geplaatst.\n" "Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele\n" "wijziging opnieuw ingevoerd.\n" msgstr "" "Shows a booking in text or command-form.\n" "\n" " toon [ ] \n" "\n" "Options:\n" "\n" " --boekjaar=\tSelect financial year\n" " --verbose\t\tShow in verbose (text) mode\n" " --btw\t\t\tSpecify VAT codes\n" " --bsknr\t\tSpecify the booking number (default)\n" "\n" "The displayed booking will be placed in the command-history.\n" "With arrow up this can be retrieved and after possible editing\n" "entered again.\n" #: ../lib/EB/Shell.pm:1438 msgid "Opties \"definitief\" en \"verwijder\" sluiten elkaar uit" msgstr "The options \"definitief\" and \"verwijder\" are mutually exclusive" #: ../lib/EB/Shell.pm:1447 msgid "" "Sluit het boekjaar af. De BTW rekeningen worden afgeboekt, en de\n" "winst of het verlies wordt verrekend met de daartoe aangewezen\n" "balansrekening.\n" "\n" "Deze opdracht genereert twee rapporten: een journaal van de\n" "afboekingen en een overzicht van eventuele openstaande posten. Indien\n" "gewenst kan een bestand worden aangemaakt met openingsopdrachten voor\n" "het volgende boekjaar.\n" "\n" " jaareinde [ ]\n" "\n" "Opties:\n" "\n" " --boekjaar=\tSluit het opgegeven boekjaar af.\n" " --definitief\t\tSluit het boekjaar definitief af. Er zijn\n" "\t\t\tdan geen boekingen meer mogelijk.\n" " --verwijder\t\tVerwijder een niet-definitieve jaarafsluiting.\n" " --eb=\tSchrijf openingsopdrachten in dit bestand.\n" msgstr "" "Closes the financial year. The VAT accounts are debited and profit or loss " "is \n" "deducted from the designated account balance.\n" "\n" "This command generates two reports: a journal of debits and a summary \n" "of any outstanding items. If desired, a file can be created with the " "opening \n" "orders for the coming financial year.\n" "\n" " jaareinde [ ]\n" "\n" "Options:\n" "\n" " --boekjaar=\tCloses the specified financial year.\n" " --definitief\t\tCloses the financial year definitively. No more \n" "\t\t\tbookings are then possible.\n" " --verwijder\t\tRemove a financial year close which is not definitive.\n" " --eb=\tWrite opening commands to this file.\n" #: ../lib/EB/Shell.pm:1477 msgid "" "Voer een SQL opdracht uit via de database driver. Met het gebruik\n" "hiervan vervalt alle garantie op correcte financiële resultaten.\n" "\n" " sql [ ]\n" "\n" "Deze opdracht is alleen in de command line versie beschikbaar.\n" msgstr "" "Execute a SQL command via the database driver. When using this command,\n" "you void your warranty for the correctness of the financial results.\n" "\n" " sql [ ]\n" "\n" "This command is only available in the command line version.\n" #: ../lib/EB/Shell.pm:1605 #, perl-brace-format msgid "Ongeldige periode-aanduiding: {per}" msgstr "Invalid period identifier: {per}" #: ../lib/EB/Shell.pm:1616 #, perl-brace-format msgid "Ongeldige datum: {per}" msgstr "Invalid date: {per}" #: ../lib/EB/Shell.pm:1628 msgid "De administratie is reeds geopend" msgstr "The administration has already been opened" #: ../lib/EB/Shell.pm:1637 msgid "De administratie is nog niet in gebruik" msgstr "The administration is not yet in use" #: ../lib/EB/Booking.pm:51 #, perl-brace-format msgid "Boekstuk {bsk} is reeds in gebruik" msgstr "Posting {bsk} is already in use" #: ../lib/EB/Booking.pm:64 msgid "Het boekstuknummer moet een geheel getal (volgnummer) zijn" msgstr "This posting must have an integer serial number" #: ../lib/EB/Booking.pm:73 msgid "" "Boekstukken in voorafgaande boekjaren moeten verplicht worden voorzien van " "een boekstuknummer" msgstr "" "Postings in preceding financial years must have an explicit serial number" #: ../lib/EB/Booking.pm:95 #, perl-brace-format msgid "Boekjaar {code} is gesloten, er kan niet meer in worden gewijzigd" msgstr "Financial year {code} is closed and cannot be modified" #: ../lib/EB/Booking.pm:103 msgid "De administratie is gesloten en kan niet meer worden gewijzigd" msgstr "The administration is closed and cannot be modified" #: ../lib/EB/Booking.pm:115 #, perl-brace-format msgid "De boekingsdatum {date} valt vóór aanvang van dit boekjaar" msgstr "Booking date {date} is before the start of the financial year" #: ../lib/EB/Booking.pm:120 #, perl-brace-format msgid "De boekingsdatum {date} valt na het einde van dit boekjaar" msgstr "Booking date {date} is after the financial year end" #: ../lib/EB/Booking.pm:153 #, perl-brace-format msgid "BTW specificatie {spec}: Gebruik K of O in plaats van I of V" msgstr "VAT specification {spec}: Please use K / O instead of I / V" #: ../lib/EB/Booking.pm:183 ../lib/EB/Booking.pm:199 #, perl-brace-format msgid "" "BTW aanduiding \"{spec}\" kent meerdere tariefcodes: {list} (code {code} " "\"{desc}\" is gebruikt)" msgstr "" #: ../lib/EB/Booking.pm:333 #, perl-brace-format msgid "BTW rek. nr. {acct}, correctie van {amt} uitgevoerd" msgstr "VAT account number {acct}, correction of {amt} has been completed" #: ../lib/EB/Export.pm:35 #, perl-brace-format msgid "Fout bij aanmaken directory {dir}: {err}" msgstr "Error {err} creating directory {dir}" #: ../lib/EB/Export.pm:51 msgid "Module Archive::Zip, nodig voor export naar file, is niet beschikbaar" msgstr "Export to file requires module Archive::Zip, which is not available" #: ../lib/EB/Export.pm:54 #, perl-brace-format msgid "Export van dataset {db} aangemaakt door {id} op {date}" msgstr "Export of data set {db} created by {id} on {date}" #: ../lib/EB/Export.pm:58 #, perl-brace-format msgid "Omschrijving: {desc}" msgstr "Description: {desc}" #: ../lib/EB/Export.pm:81 #, perl-brace-format msgid "Fout {status} tijdens het aanmaken van exportbestand {name}" msgstr "Error {status} creating export file {name}" #: ../lib/EB/Export.pm:96 msgid "Geen geldige UTF-8 tekens for ZIP element" msgstr "Invalid UTF-8 characters for ZIP element found" #: ../lib/EB/Export.pm:108 #, perl-brace-format msgid "Fout bij aanmaken bestand {file}: {err}" msgstr "Error {err} creating file {file}" #: ../lib/EB/Export.pm:111 #, perl-brace-format msgid "Fout bij schrijven bestand {file}: {err}" msgstr "Error {err} writing file {file}" #: ../lib/EB/Export.pm:114 #, perl-brace-format msgid "Fout bij afsluiten bestand {file}: {err}" msgstr "Error {err} closing file {file}" #: ../lib/EB/Export.pm:141 ../lib/EB/Export.pm:171 ../lib/EB/Export.pm:264 #, perl-brace-format msgid "{what} voor administratie {adm}" msgstr "{what} for administration {adm}" #: ../lib/EB/Export.pm:143 ../lib/EB/Export.pm:173 ../lib/EB/Export.pm:266 #, perl-brace-format msgid "Aangemaakt door {id} op {date}" msgstr "Created by {id} on {date}" #: ../lib/EB/Export.pm:161 ../lib/EB/Export.pm:257 ../lib/EB/Export.pm:353 #, perl-brace-format msgid "Einde {what}" msgstr "End of {what}" #: ../lib/EB/Export.pm:172 ../lib/EB/Export.pm:257 ../lib/EB/Wx/IniWiz.pm:150 msgid "Openingsgegevens" msgstr "Opening data" #: ../lib/EB/Export.pm:191 ../lib/EB/Report/Balres.pm:94 #: ../lib/EB/Report/Balres.pm:99 msgid "Openingsbalans" msgstr "Opening balance" #: ../lib/EB/Export.pm:237 ../lib/EB/Report/Open.pm:81 #: ../lib/EB/Wx/Shell/MainFrame.pm:262 msgid "Openstaande posten" msgstr "Open postings" #: ../lib/EB/Export.pm:256 msgid "Openen van de administratie" msgstr "Entering administration" #: ../lib/EB/Export.pm:265 ../lib/EB/Export.pm:353 msgid "Boekingen" msgstr "Bookings" #: ../lib/EB/Export.pm:284 ../lib/EB/Export.pm:294 msgid "cmo:jaareinde:boekjaar" msgstr "cmo:yearend:finyear" #: ../lib/EB/Export.pm:285 msgid "cmo:jaareinde:definitief" msgstr "cmo:yearend:final" #: ../lib/EB/Export.pm:305 msgid "cmo:btwaangifte:periode" msgstr "cmo:btwaangifte:period" #: ../lib/EB/Export.pm:307 msgid "cmo:btwaangifte:definitief" msgstr "cmo:btwaangifte:final" #: ../lib/EB/Export.pm:308 msgid "cmo:btwaangifte:noreport" msgstr "cmo:btwaangifte:noreport" #: ../lib/EB/Export.pm:319 msgid "Openen nieuw boekjaar" msgstr "Open new financial year" #: ../lib/EB/Report/Grootboek.pm:44 msgid "GrBk" msgstr "Acc" #: ../lib/EB/Report/Grootboek.pm:45 msgid "Grootboek/Boekstuk" msgstr "Ledger/Posting" #: ../lib/EB/Report/Grootboek.pm:49 msgid "BoekstukNr" msgstr "PostingNr" #: ../lib/EB/Report/Grootboek.pm:61 msgid "Grootboek" msgstr "Ledger" #: ../lib/EB/Report/Grootboek.pm:109 msgid "Beginsaldo" msgstr "Initial balance" #: ../lib/EB/Report/Grootboek.pm:151 ../lib/EB/Report/Grootboek.pm:187 msgid "Totaal mutaties" msgstr "Mutations total" # Mutations? discrepacies? differences? #: ../lib/EB/Report/Grootboek.pm:172 #, perl-brace-format msgid "Totaal {adesc}" msgstr "Total {adesc}" #: ../lib/EB/Report/Grootboek.pm:198 msgid "Geen informatie gevonden" msgstr "No information found" #: ../lib/EB/Report/Reporter.pm:56 msgid "Ontbrekend \"name\" of \"style\"" msgstr "Missing \"name\" or \"style\"" #: ../lib/EB/Report/Reporter.pm:75 ../lib/EB/Report/Reporter.pm:89 #, perl-brace-format msgid "Onbekend veld: {fld}" msgstr "Unknown field: {fld}" #: ../lib/EB/Report/Reporter.pm:106 #, perl-brace-format msgid "Ongeldige breedte {w} voor veld {fld}" msgstr "Invalid width {w} for field {fld}" #: ../lib/EB/Report/Reporter.pm:123 msgid "Rapportage" msgstr "Reporting" #: ../lib/EB/Report/Reporter.pm:131 #, perl-brace-format msgid "Periode: t/m {to}" msgstr "Period: through {to}" #: ../lib/EB/Report/Reporter.pm:135 ../lib/EB/Report/BTWAangifte.pm:598 #, perl-brace-format msgid "Periode: {from} t/m {to}" msgstr "Period {from} through {to}" #: ../lib/EB/Report/Reporter.pm:178 #, perl-brace-format msgid "Ongeldig veld: {fld}" msgstr "Invalid field: {fld}." #: ../lib/EB/Report/GenBase.pm:88 msgid "De uitvoer-backend kon niet worden gevonden" msgstr "The export backend could not be found" #: ../lib/EB/Report/GenBase.pm:90 #, perl-brace-format msgid "Uitvoer in de vorm {gen} is niet mogelijk: {reason}" msgstr "Export to {gen} could not be completed: {reason}" #: ../lib/EB/Report/GenBase.pm:98 #, perl-brace-format msgid "Fout tijdens aanmaken {file}: {err}" msgstr "Error {err} while creating file {file}" #: ../lib/EB/Report/GenBase.pm:122 msgid "--per sluit --periode uit" msgstr "Options --per and --periode are mutually exclusive" #: ../lib/EB/Report/GenBase.pm:123 msgid "--per sluit --boekjaar uit" msgstr "Options --per and --boekjaar are mutually exclusive" #: ../lib/EB/Report/GenBase.pm:129 msgid "--periode sluit --boekjaar uit" msgstr "Options --periode and --boekjaar are mutually exclusive" #: ../lib/EB/Report/GenBase.pm:155 #, perl-brace-format msgid "Datum {per} valt na de huidige datum {now}" msgstr "Date {per} is after the current date {now}" #: ../lib/EB/Report/GenBase.pm:168 #, perl-brace-format msgid "Periode begint {from}, dit is na de huidige datum {now}" msgstr "Period starts {from}, this is after the current date {now}" #: ../lib/EB/Report/GenBase.pm:173 ../lib/EB/Report/GenBase.pm:178 #, perl-brace-format msgid "Datum {per} valt vóór het begin van de administratie {begin}" msgstr "Date {per} is before the start {begin} of the administration" #: ../lib/EB/Report/GenBase.pm:211 msgid "cmo:report:output" msgstr "cmo:report:output" #: ../lib/EB/Report/GenBase.pm:212 msgid "cmo:report:page" msgstr "cmo:report:page" #: ../lib/EB/Report/GenBase.pm:248 msgid "cmo:report:style" msgstr "cmo:report:style" #: ../lib/EB/Report/GenBase.pm:249 msgid "cmo:report:title|titel" msgstr "cmo:report:title" #: ../lib/EB/Report/BTWAangifte.pm:62 msgid "per maand" msgstr "monthly" #: ../lib/EB/Report/BTWAangifte.pm:63 msgid "per jaar" msgstr "annually" #: ../lib/EB/Report/BTWAangifte.pm:64 msgid "per kwartaal" msgstr "quarterly" #: ../lib/EB/Report/BTWAangifte.pm:202 msgid "BTW aangifte periode sluit niet aan bij de vorige aangifte" msgstr "" "The period of the VAT submission does not match with the previous VAT " "submission" #: ../lib/EB/Report/BTWAangifte.pm:219 #, perl-brace-format msgid "{year}" msgstr "{year}" #: ../lib/EB/Report/BTWAangifte.pm:222 #, perl-brace-format msgid "{quarter} {year}" msgstr "{quarter} {year}" #: ../lib/EB/Report/BTWAangifte.pm:223 msgid "1e kwartaal" msgstr "1st quarter" #: ../lib/EB/Report/BTWAangifte.pm:223 msgid "2e kwartaal" msgstr "2nd quarter" #: ../lib/EB/Report/BTWAangifte.pm:224 msgid "3e kwartaal" msgstr "3rd quarter" #: ../lib/EB/Report/BTWAangifte.pm:224 msgid "4e kwartaal" msgstr "4th quarter" #: ../lib/EB/Report/BTWAangifte.pm:228 #, perl-brace-format msgid "{month} {year}" msgstr "{month} {year}" #: ../lib/EB/Report/BTWAangifte.pm:233 #, perl-brace-format msgid "Programmafout: Ongeldige BTW periode: {per}" msgstr "Program error: Invalid VAT period: \"{per}\"" #: ../lib/EB/Report/BTWAangifte.pm:244 #, perl-brace-format msgid "" "Aangifte {per} komt niet overeen met de BTW instelling van de administratie " "({admper})" msgstr "" "{per} report does not match the corresponding setting ({admper}) of the " "administration" #: ../lib/EB/Report/BTWAangifte.pm:263 msgid "j(aar)?" msgstr "y(ear)?" #: ../lib/EB/Report/BTWAangifte.pm:287 #, perl-brace-format msgid "Ongeldige waarde voor BTW periode: \"{per}\"" msgstr "Illegal value for VAT period: \"{per}\"" #: ../lib/EB/Report/BTWAangifte.pm:595 ../lib/EB/Wx/Shell/MainFrame.pm:267 msgid "BTW Aangifte" msgstr "VAT submission" #: ../lib/EB/Report/BTWAangifte.pm:597 #, perl-brace-format msgid "Periode: {per}" msgstr "Period: {per}" #: ../lib/EB/Report/BTWAangifte.pm:702 #, perl-brace-format msgid "" "Er is een verschil van {round}{amount} tussen de berekende en werkelijk " "ingehouden BTW. Voor de aangifte is de werkelijk ingehouden waarde gebruikt." msgstr "" "There is a difference of {round}{amount} between the calculated VAT and " "deducted VAT. For the submission the deducted amount has been used." #: ../lib/EB/Report/BTWAangifte.pm:714 #, perl-brace-format msgid "" "Er is een verschil van {round}{amount} tussen de berekende en werkelijk " "afgedragen BTW {type}. Voor de aangifte is de werkelijk afgedragen waarde " "gebruikt." msgstr "" "There is a difference of {round}{amount} between the calculated VAT and " "deducted VAT {type}. For the submission the deducted amount has been used." #: ../lib/EB/Report/Journal.pm:89 ../lib/EB/Report/Journal.pm:120 #, perl-brace-format msgid "Boekstuk {nr}" msgstr "Posting {nr}" #: ../lib/EB/Report/Journal.pm:109 #, perl-brace-format msgid "Dagboek {nr}" msgstr "Daybook {nr}" #: ../lib/EB/Report/Balres.pm:69 ../lib/EB/Report/Proof.pm:54 msgid "RekNr" msgstr "AccNr" #: ../lib/EB/Report/Balres.pm:71 ../lib/EB/Report/Proof.pm:56 msgid "Verdichting/Grootboekrekening" msgstr "Group/Account" #: ../lib/EB/Report/Balres.pm:72 ../lib/EB/Report/Proof.pm:57 msgid "Grootboekrekening" msgstr "Account" #: ../lib/EB/Report/Balres.pm:95 ../lib/EB/Report/Balres.pm:100 #, perl-brace-format msgid "Datum: {date}" msgstr "Date: {date}" #: ../lib/EB/Report/Balres.pm:114 ../lib/EB/Report/Balres.pm:280 #: ../lib/EB/Wx/Shell/MainFrame.pm:251 msgid "Balans" msgstr "Balance" #: ../lib/EB/Report/Balres.pm:114 ../lib/EB/Wx/Shell/MainFrame.pm:258 msgid "Verlies/Winst" msgstr "Profit/Loss" #: ../lib/EB/Report/Balres.pm:209 ../lib/EB/Report/Balres.pm:220 #: ../lib/EB/Report/Proof.pm:190 ../lib/EB/Report/Proof.pm:222 #, perl-brace-format msgid "Totaal {vrd}" msgstr "Total {vrd}" #: ../lib/EB/Report/Balres.pm:261 msgid "Winst" msgstr "Profit" #: ../lib/EB/Report/Balres.pm:261 msgid "Verlies" msgstr "Loss" #: ../lib/EB/Report/Balres.pm:280 #, perl-brace-format msgid "TOTAAL {rep}" msgstr "TOTAL {rep}" #: ../lib/EB/Report/Balres.pm:280 msgid "Resultaten" msgstr "Results" #: ../lib/EB/Report/Proof.pm:61 msgid "Saldo Db" msgstr "Balance Db" #: ../lib/EB/Report/Proof.pm:62 msgid "Saldo Cr" msgstr "Balance Cr" #: ../lib/EB/Report/Proof.pm:73 ../lib/EB/Wx/Shell/MainFrame.pm:244 msgid "Proef- en Saldibalans" msgstr "Trial balance" #: ../lib/EB/Report/Proof.pm:256 ../lib/EB/Report/Proof.pm:289 msgid "TOTAAL" msgstr "TOTAL" #: ../lib/EB/Report/Debcrd.pm:58 ../lib/EB/Report/Open.pm:43 msgid "Bedrag" msgstr "Amount" #: ../lib/EB/Report/Debcrd.pm:59 msgid "Open" msgstr "Open" #: ../lib/EB/Report/Debcrd.pm:60 msgid "Betaald" msgstr "Paid" #: ../lib/EB/Report/Debcrd.pm:61 ../lib/EB/Report/Open.pm:44 msgid "Boekstuk" msgstr "Posting" #: ../lib/EB/Report/Debcrd.pm:98 msgid "Geen boekingen gevonden" msgstr "No bookings found" #: ../lib/EB/Report/Debcrd.pm:100 msgid "Debiteurenadministratie" msgstr "Debtors administration" #: ../lib/EB/Report/Debcrd.pm:101 msgid "Crediteurenadministratie" msgstr "Creditors administration" #: ../lib/EB/Report/Open.pm:107 ../lib/EB/Report/Open.pm:161 #, perl-brace-format msgid "Totaal {rel}" msgstr "Total {rel}" # Mutations? discrepacies? differences? #: ../lib/EB/Report/Open.pm:115 ../lib/EB/Report/Open.pm:169 #, perl-brace-format msgid "Totaal {debcrd}" msgstr "Total {debcrd}" #: ../lib/EB/Report/Open.pm:180 msgid "Geen openstaande posten gevonden" msgstr "No open postings have been found" #: ../lib/EB/Report/Reporter/Html.pm:51 #, perl-brace-format msgid "Overzicht aangemaakt op {date} door {ident}" msgstr "Overview made on {date} by {ident}" #: ../lib/EB/Report/Reporter/Html.pm:131 #, perl-brace-format msgid "Geen stylesheet voor {style}" msgstr "Style sheet for {style} not found" #: ../lib/EB/DB.pm:47 #, perl-brace-format msgid "Tabel {table} ontbreekt in database {db}" msgstr "Database table {table} missing in {db}" #: ../lib/EB/DB.pm:51 #, perl-brace-format msgid "Ongeldige EekBoek database: {db}." msgstr "Invalid EekBoek database: {db}." #: ../lib/EB/DB.pm:53 msgid "Wellicht is de database nog niet geïnitialiseerd?" msgstr "Has the database been initialised?" #: ../lib/EB/DB.pm:68 ../lib/EB/DB.pm:83 msgid "De database wordt aangepast aan de nieuwere versie" msgstr "The database has been upgraded to the latest version" #: ../lib/EB/DB.pm:93 msgid "De migratie is mislukt. Gelieve de documentatie te raadplegen." msgstr "Database upgrade failed. Please consult the documentation." #: ../lib/EB/DB.pm:96 #, perl-brace-format msgid "" "Ongeldige EekBoek database: {db} versie {ver}. Benodigde versie is {req}." msgstr "" "EekBoek database {db} has version {ver}, while at least version {req} is " "required." #: ../lib/EB/DB.pm:107 ../lib/EB/DB.pm:119 ../lib/EB/DB.pm:131 #: ../lib/EB/DB.pm:141 #, perl-brace-format msgid "Geen grootboekrekening voor {dc} ({acct})" msgstr "Missing account for {dc} ({acct})" #: ../lib/EB/DB.pm:111 ../lib/EB/DB.pm:123 ../lib/EB/DB.pm:134 #: ../lib/EB/DB.pm:144 #, perl-brace-format msgid "Foutieve grootboekrekening voor {dc} ({acct})" msgstr "Erroneous account for {dc} ({acct})" #: ../lib/EB/DB.pm:132 ../lib/EB/DB.pm:135 msgid "BTW betaald" msgstr "VAT paid" #: ../lib/EB/DB.pm:142 ../lib/EB/DB.pm:145 msgid "overboeking winst" msgstr "profit transfer" #: ../lib/EB/DB.pm:149 msgid "CONSISTENTIE-VERIFICATIE STANDAARDREKENINGEN MISLUKT" msgstr "CONSISTENCY CHECK OF STANDARD ACCOUNTS FAILED" #: ../lib/EB/DB.pm:232 #, perl-brace-format msgid "Onbekend boekstuk {ref} voor relatie {rel} ({desc})" msgstr "Unknown posting {ref} for relation {rel} ({desc})" #: ../lib/EB/DB.pm:259 #, perl-brace-format msgid "Onbekend boekstuk {bsk} in dagboek {dbk}" msgstr "Unknown posting {bsk} in daybook {dbk}" #: ../lib/EB/DB.pm:282 #, perl-brace-format msgid "Ongeldige boekstukaanduiding: {bsk}" msgstr "Invalid posting specification: {bsk}" #: ../lib/EB/DB.pm:324 #, perl-brace-format msgid "Niet-bestaande administratie-eigenschap: {adm}" msgstr "Unknown administration property: {adm}" #: ../lib/EB/DB.pm:359 #, perl-brace-format msgid "Niet-bestaande standaardrekening: {std}" msgstr "Unknown standard account: {std}" #: ../lib/EB/DB.pm:458 msgid "Geen dataset opgegeven. Specificeer een dataset in de configuratiefile." msgstr "No dataset. Please specify a dataset name in the configuration file." #: ../lib/EB/DB.pm:590 #, perl-brace-format msgid "Geen ondersteuning voor database type {db}" msgstr "No support for database type {db}" #: ../lib/EB/Wx/IniWiz.pm:105 msgid "Administratie" msgstr "Administration" #: ../lib/EB/Wx/IniWiz.pm:106 msgid "BTW" msgstr "VAT" #: ../lib/EB/Wx/IniWiz.pm:107 msgid "Dagboeken" msgstr "Daybooks" #: ../lib/EB/Wx/IniWiz.pm:109 msgid "Bevestiging" msgstr "Confirmation" #: ../lib/EB/Wx/IniWiz.pm:112 msgid "EekBoek opstarten" msgstr "Start EekBoek" #: ../lib/EB/Wx/IniWiz.pm:113 msgid "Details..." msgstr "Details..." #: ../lib/EB/Wx/IniWiz.pm:115 msgid "Welkom bij de EekBoek administratie-wizard." msgstr "Welcome to the EekBoek administration wizard." #: ../lib/EB/Wx/IniWiz.pm:116 msgid "Maak uw keuze" msgstr "Your selection" #: ../lib/EB/Wx/IniWiz.pm:116 msgid "Een nieuwe administratie aanmaken" msgstr "Create a new administration" #: ../lib/EB/Wx/IniWiz.pm:116 msgid "Verbinden met een bestaande administratie" msgstr "Connect to an existing administration on a server" #: ../lib/EB/Wx/IniWiz.pm:122 msgid "01-01-" msgstr "01-01-" #: ../lib/EB/Wx/IniWiz.pm:126 msgid "BTW toepassen op deze administratie" msgstr "Applying VAT in administration mode" #: ../lib/EB/Wx/IniWiz.pm:127 msgid "Aangifteperiode" msgstr "Submission period" #: ../lib/EB/Wx/IniWiz.pm:129 msgid "Verkoop" msgstr "Sales" #: ../lib/EB/Wx/IniWiz.pm:130 msgid "Inkoop" msgstr "Procurement" #: ../lib/EB/Wx/IniWiz.pm:131 msgid "Kas" msgstr "Cash" #: ../lib/EB/Wx/IniWiz.pm:132 msgid "Bank" msgstr "Bank" #: ../lib/EB/Wx/IniWiz.pm:133 msgid "Database naam" msgstr "Database name" #: ../lib/EB/Wx/IniWiz.pm:135 msgid "Database type" msgstr "Database type" #: ../lib/EB/Wx/IniWiz.pm:136 msgid "PostgreSQL" msgstr "PostgreSQL" #: ../lib/EB/Wx/IniWiz.pm:136 msgid "SQLite" msgstr "SQLite" #: ../lib/EB/Wx/IniWiz.pm:137 msgid "Server host" msgstr "Server host" #: ../lib/EB/Wx/IniWiz.pm:139 msgid "Server port" msgstr "Server port" #: ../lib/EB/Wx/IniWiz.pm:141 msgid "Database user" msgstr "Database user" #: ../lib/EB/Wx/IniWiz.pm:143 msgid "Password" msgstr "Password" #: ../lib/EB/Wx/IniWiz.pm:145 msgid "Test database" msgstr "Test database connection" #: ../lib/EB/Wx/IniWiz.pm:146 msgid "Druk op 'Voltooien' om de volgende bestanden aan te maken:" msgstr "Press 'Finish' to create the following files:" #: ../lib/EB/Wx/IniWiz.pm:147 msgid "Configuratiebestand" msgstr "Configuration file" #: ../lib/EB/Wx/IniWiz.pm:149 msgid "Relaties (debiteuren en crediteuren)" msgstr "Relations (debitors en creditors)" #: ../lib/EB/Wx/IniWiz.pm:151 ../lib/EB/Wx/IniWiz.pm:374 msgid "Mutaties (boekingen)" msgstr "Movements (postings)" #: ../lib/EB/Wx/IniWiz.pm:153 msgid "Let op! Eventuele bestaande bestanden worden overschreven!" msgstr "Caution: existing files will be overwritten" #: ../lib/EB/Wx/IniWiz.pm:286 ../lib/EB/Wx/Shell/MainFrame.pm:579 msgid "Kies" msgstr "Select" #: ../lib/EB/Wx/IniWiz.pm:298 msgid "Administratie verwijderen?" msgstr "Remove administration data?" #: ../lib/EB/Wx/IniWiz.pm:299 msgid "Verwijderen administratie" msgstr "Remove administration" #: ../lib/EB/Wx/IniWiz.pm:325 msgid "EekBoek MiniAdm Setup" msgstr "EekBoek MiniAdm Setup" #: ../lib/EB/Wx/IniWiz.pm:332 msgid "" "Een omschrijving van deze administratie, bijvoorbeeld \"Boekhouding 2009\"." msgstr "A description of this administration, for example \"Accounting 2009\"." #: ../lib/EB/Wx/IniWiz.pm:333 msgid "" "Een korte, unieke aanduiding van deze administratie, bijvoorbeeld " "\"admin2009\"." msgstr "" "A concise, unique description of this administration, for example " "\"admin2009\"." #: ../lib/EB/Wx/IniWiz.pm:334 msgid "De begindatum. Het boekjaar begint op 1 januari van dit jaar." msgstr "" "The opening date. The financial year starts on the first of January of this " "year." #: ../lib/EB/Wx/IniWiz.pm:337 msgid "BTW toepassen" msgstr "Apply VAT" #: ../lib/EB/Wx/IniWiz.pm:339 msgid "De aangifteperiode voor de omzetbelasting" msgstr "The submission period for the corporate tax" #: ../lib/EB/Wx/IniWiz.pm:342 msgid "Verkoop- en Debiteurenadministratie" msgstr "Sales and Accounts payable administration" #: ../lib/EB/Wx/IniWiz.pm:344 msgid "Inkoop- en Crediteurenadministratie" msgstr "Procurement and Accounts receivable administration" #: ../lib/EB/Wx/IniWiz.pm:346 msgid "Kas (contant geld)" msgstr "Cash" #: ../lib/EB/Wx/IniWiz.pm:348 msgid "Er wordt gebruik gemaakt van een bankrekening" msgstr "A bank account is being used" #: ../lib/EB/Wx/IniWiz.pm:351 msgid "De naam van de aan te maken database, b.v. \"admin2009\"." msgstr "" "The name of the database that should be set up, for example \"admin2009\"." #: ../lib/EB/Wx/IniWiz.pm:352 msgid "Het databasesysteem waar de database wordt opgeslagen" msgstr "The system where the database is stored" #: ../lib/EB/Wx/IniWiz.pm:355 msgid "Het systeem waarop de database server draait, indien niet lokaal." msgstr "For a remote database server, the system that runs the server." #: ../lib/EB/Wx/IniWiz.pm:358 msgid "De netwerkpoort waarop de database server luistert, indien niet lokaal." msgstr "" "For a remote database server, the network port the server is listening to." #: ../lib/EB/Wx/IniWiz.pm:361 msgid "De user naam voor de database server." msgstr "The user name to access the database server with." #: ../lib/EB/Wx/IniWiz.pm:364 msgid "Het password van deze user." msgstr "The password of the database user." #: ../lib/EB/Wx/IniWiz.pm:368 msgid "Rekeningschema, dagboeken, BTW instellingen" msgstr "Account schema, daybooks and VAT configurations" #: ../lib/EB/Wx/IniWiz.pm:370 msgid "Debiteuren en Crediteuren" msgstr "Accounts receivable and Accounts payable" #: ../lib/EB/Wx/IniWiz.pm:372 msgid "Administratieve gegevens" msgstr "Administrative data" #: ../lib/EB/Wx/IniWiz.pm:376 msgid "De database wordt aangemaakt en gevuld" msgstr "The database is being set up and populated" #: ../lib/EB/Wx/IniWiz.pm:571 msgid "Niet uniek" msgstr "Not unique" #: ../lib/EB/Wx/IniWiz.pm:590 msgid "Er bestaat al een administratie met deze code." msgstr "An administration with that code already exists." #: ../lib/EB/Wx/IniWiz.pm:602 ../lib/EB/Wx/IniWiz.pm:978 msgid "Database Test Resultaat" msgstr "Database test results" #: ../lib/EB/Wx/IniWiz.pm:757 #, perl-brace-format msgid "Aanmaken {cfg}: " msgstr "Create {cfg}: " #: ../lib/EB/Wx/IniWiz.pm:762 msgid "Even geduld..." msgstr "Please be patient..." #: ../lib/EB/Wx/IniWiz.pm:794 msgid "Mislukt" msgstr "Failed" #: ../lib/EB/Wx/IniWiz.pm:799 ../lib/EB/Wx/IniWiz.pm:820 msgid "Gereed" msgstr "Completed" #: ../lib/EB/Wx/IniWiz.pm:806 msgid "==== Meldingen ====" msgstr "==== Messages ====" #: ../lib/EB/Wx/IniWiz.pm:810 msgid "==== Uitvoer ====" msgstr "==== Output ====" #: ../lib/EB/Wx/IniWiz.pm:825 msgid "Overgeslagen" msgstr "Skipped" #: ../lib/EB/Wx/IniWiz.pm:858 msgid "Afgebroken!" msgstr "Aborted!" #: ../lib/EB/Wx/IniWiz.pm:977 msgid "Succes!" msgstr "Success!" #: ../lib/EB/Wx/IniWiz.pm:1013 msgid "The Wiz" msgstr "The Wiz" #: ../lib/EB/Wx/IniWiz/OpenDialog.pm:42 msgid "Beschikbare administraties" msgstr "Available administrations" #: ../lib/EB/Wx/IniWiz/OpenDialog.pm:86 msgid "Administratiekeuze" msgstr "Administration selection" #: ../lib/EB/Wx/Shell/HtmlViewer.pm:93 msgid "HTML Uitvoer" msgstr "HTML View" #: ../lib/EB/Wx/Shell/HtmlViewer.pm:132 msgid "Opslaan als..." msgstr "Save as..." #: ../lib/EB/Wx/Shell/HtmlViewer.pm:133 msgid "raport.html" msgstr "report.html" #: ../lib/EB/Wx/Shell/HtmlViewer.pm:134 msgid "HTML bestanden (*.html)|*.html" msgstr "HTML files (*.html)|*.html" #: ../lib/EB/Wx/Shell/EditDialog.pm:71 msgid "Wijzigen invoerregel" msgstr "Edit Input Line" #: ../lib/EB/Wx/Shell/Main.pm:237 #, perl-brace-format msgid "" "Gebruik: {prog} [options] [file ...]\n" "\n" " --config=XXX -f specificeer configuratiebestand\n" " --nostdconf -X gebruik uitsluitend dit configuratiebestand\n" " --define=XXX -D definieer configuratiesetting\n" " --printconfig -P\tprint config waarden\n" " --admdir=XXX\tdirectory voor de config files\n" " --[no]wizard\tgebruik de aanmaken/selectiewizard\n" " --help\t\tdeze hulpboodschap\n" " --ident\t\ttoon identificatie\n" " --verbose\t\tgeef meer uitgebreide information\n" msgstr "" "Usage: {prog} [options] [file ...]\n" "\n" " --config=XXX -f specify config file\n" " --nostdconf -X only use this config file\n" " --define=XXX -D define config setting\n" " --printconfig -P\tprint config values\n" " --admdir=XXX\tdirectory where the config files are kept\n" " --[no]wizard\tuse the create/selection wizard\n" " --help\t\tthis help message\n" " --ident\t\tshow identificatiion\n" " --verbose\t\tprovide verbose information\n" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:49 msgid "Voorkeuren" msgstr "Preferences" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:50 msgid "Rapporten in hetzelfde venster" msgstr "Single window for reports" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:51 msgid "Popup window voor foutboodschappen" msgstr "Popup window for errors" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:52 msgid "Popup window voor waarschuwingen" msgstr "Popup window for warnings" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:53 msgid "Popup window voor mededelingen" msgstr "Popup window for informational messages" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:54 msgid "Aantal te bewaren regels invoer historie:" msgstr "Number of input lines to keep in history:" #: ../lib/EB/Wx/Shell/MainFrame.pm:151 msgid "Invoer" msgstr "Input" #: ../lib/EB/Wx/Shell/MainFrame.pm:231 msgid "&Open\tCtrl-O" msgstr "&Open\tCtrl-O" #: ../lib/EB/Wx/Shell/MainFrame.pm:233 msgid "Voorkeuren..." msgstr "Preferences..." #: ../lib/EB/Wx/Shell/MainFrame.pm:235 msgid "Afsluiten\tCtrl-Q" msgstr "E&xit\tCtrl-Q" #: ../lib/EB/Wx/Shell/MainFrame.pm:236 msgid "&Bestand" msgstr "&File" #: ../lib/EB/Wx/Shell/MainFrame.pm:238 msgid "&Edit invoerregel\tCtrl+Enter" msgstr "&Edit input line\tCtrl+Enter" #: ../lib/EB/Wx/Shell/MainFrame.pm:239 msgid "&Uitvoeren invoerregel\tEnter" msgstr "&Execute input line\tCtrl+Enter" #: ../lib/EB/Wx/Shell/MainFrame.pm:241 msgid "Uitvoer schoonmaken" msgstr "&Clear output" #: ../lib/EB/Wx/Shell/MainFrame.pm:242 msgid "B&ewerken" msgstr "&Edit" #: ../lib/EB/Wx/Shell/MainFrame.pm:246 ../lib/EB/Wx/Shell/MainFrame.pm:253 msgid "Op grootboekrekening" msgstr "By account" #: ../lib/EB/Wx/Shell/MainFrame.pm:248 ../lib/EB/Wx/Shell/MainFrame.pm:255 msgid "Op hoofdverdichting" msgstr "By master group" #: ../lib/EB/Wx/Shell/MainFrame.pm:249 ../lib/EB/Wx/Shell/MainFrame.pm:256 msgid "Op verdichting" msgstr "By group" #: ../lib/EB/Wx/Shell/MainFrame.pm:250 ../lib/EB/Wx/Shell/MainFrame.pm:257 msgid "Gedetailleerd" msgstr "Detailed" #: ../lib/EB/Wx/Shell/MainFrame.pm:268 msgid "&Rapporten" msgstr "Reports" #: ../lib/EB/Wx/Shell/MainFrame.pm:270 msgid "&Hulp..." msgstr "&Help..." #: ../lib/EB/Wx/Shell/MainFrame.pm:272 msgid "Ondersteuning..." msgstr "&Support..." #: ../lib/EB/Wx/Shell/MainFrame.pm:274 msgid "Over..." msgstr "&About..." #: ../lib/EB/Wx/Shell/MainFrame.pm:275 msgid "&Hulp" msgstr "&Help" #: ../lib/EB/Wx/Shell/MainFrame.pm:284 msgid "EekBoek" msgstr "EekBoek" #: ../lib/EB/Wx/Shell/MainFrame.pm:339 msgid "Selecteer eerst een geldige eekboek.conf" msgstr "Please select a valid eekboek.conf first" #: ../lib/EB/Wx/Shell/MainFrame.pm:340 msgid "Geen configuratie" msgstr "Missing config" #: ../lib/EB/Wx/Shell/MainFrame.pm:393 msgid "Onbekende opdracht. \"help\" geeft een lijst van mogelijke opdrachten." msgstr "Unknown command. Enter \"help\" for a list of commands." #: ../lib/EB/Wx/Shell/MainFrame.pm:501 msgid "Fout" msgstr "Error" #: ../lib/EB/Wx/Shell/MainFrame.pm:506 msgid "Waarschuwing" msgstr "Warning" #: ../lib/EB/Wx/Shell/MainFrame.pm:511 msgid "Mededeling" msgstr "Information" #: ../lib/EB/Wx/Shell/MainFrame.pm:691 #, perl-brace-format msgid "{pkg} {app} versie {ver}" msgstr "{pkg} {app} version {ver}" #: ../lib/EB/Wx/Shell/MainFrame.pm:696 #, perl-brace-format msgid "Geschreven door {author}" msgstr "Written by {author}" #: ../lib/EB/Wx/Shell/MainFrame.pm:700 #, perl-brace-format msgid "Voor ondersteuning: {url}" msgstr "Support: {url}" #: ../lib/EB/Wx/Shell/MainFrame.pm:703 #, perl-brace-format msgid "GUI ontwerp met {wxglade}" msgstr "GUI design with {wxglade}" #: ../lib/EB/Wx/Shell/MainFrame.pm:705 ../lib/EB/Wx/Shell/MainFrame.pm:708 #: ../lib/EB/Wx/Shell/MainFrame.pm:711 ../lib/EB/Wx/Shell/MainFrame.pm:715 #, perl-brace-format msgid "{pkg} versie {ver}" msgstr "{pkg} version {ver}" #: ../lib/EB/Wx/Shell/MainFrame.pm:719 #, perl-brace-format msgid "Over {pkg} {app}" msgstr "About {pkg} {app}" #: ../lib/EB/Wx/Shell/MainFrame.pm:734 msgid "Ondersteuning" msgstr "Support" #: ../lib/EB/Wx/Shell/MainFrame.pm:738 msgid "" "

Voor het uitwisselen van ervaringen, vragen om ondersteuning e.d.\n" "kunt u zich abonneren op de mailing list voor gebruikers op\n" "SourceForge.

\n" "

De EekBoek gebruikers houden zelf\n" "een wiki bij met\n" "tips en andere wetenswaardigheden.

\n" "

EekBoek kan gratis worden gedownload en\n" "gebruikt. Mocht u echter aanvullende wensen hebben op het gebied van\n" "ondersteuning dan kan dat ook.\n" "Squirrel " "Consultancy\n" "is gaarne bereid u betaalde ondersteuning te bieden, bijvoorbeeld bij het\n" "installeren van EekBoek, het opzetten van\n" "administraties, en het overzetten van uw bestaande administraties naar\n" "EekBoek. Ook kunnen specifieke uitbreidingen\n" "of aanpassingen naar uw wens worden gerealiseerd.

\n" "

Voor meer informatie:\n" "info@squirrel.nl.

\n" msgstr "" "

For support questions you can subscribe to the mailing list for\n" "EekBoek users: SourceForge.

\n" "\n" "

The EekBoek users maintain a een wiki where they " "share experienes, tips and techniques, and so on.

\n" "\n" "

EekBoek can be downloaded and used for " "free.\n" "If you have additional wishes for features or support you can contact\n" "Squirrel Consultancy for commercial support, for " "example, to help you \n" "migrating your current administration to EekBoek.\n" "Also they can implement custom features and extensions according to your " "demands.

\n" "

For more information: info@squirrel.nl.

\n" #~ msgid "# Aangemaakt door {id} op {date}" #~ msgstr "# Created by {id} on {date}" #~ msgid "Ongeldige optiespecificatie \"{opt}\"" #~ msgstr "Unknown option specification \"{opt}\"" #~ msgid "Onbekende optie: \"{opt}\"" #~ msgstr "Unknown option: \"{opt}\"" #~ msgid "Optie \"{opt}\" moet een waarde krijgen." #~ msgstr "Option \"{opt}\" requires an argument." #~ msgid "Optie \"{opt}\" neemt geen waarde." #~ msgstr "Option \"{opt}\" does not take an argument." #~ msgid "Optie \"{opt}\" oeps {ref}." #~ msgstr "Option \"{opt}\" oops {ref}." EekBoek-2.02.04/locale/make_locales_en0000444000076500007650000000263512165465617015322 0ustar jvjv#!/bin/sh APP=ebcore PODIR=. SRCROOT=../ MODIR=${SRCROOT}lib/EB/res/locale GTF="-LPerl -j -k -k__x -k_T -kN__ -k__xt -k__XN --from-code=utf-8" test -d ${PODIR} || { echo "Wrong dir! Cannot find ${PODIR}"; exit 1; } test -d ${MODIR} || { echo "Wrong dir! Cannot find ${MODIR}"; exit 1; } cp /dev/null ${PODIR}/${APP}.pot xgettext ${GTF} -o ${PODIR}/${APP}.pot ${SRCROOT}script/ebshell find ${SRCROOT}lib/EekBoek.pm ${SRCROOT}lib/EB.pm ${SRCROOT}lib/EB ${SRCROOT}lib/EB/Wx/IniWiz.pm ${SRCROOT}lib/EB/Wx/IniWiz ${SRCROOT}lib/EB/Wx/Shell \( -name CVS -prune \) -o \( -name Wx -prune \) -o \( -name DeLuxe.pm -prune \) -o \( -name '*.pm' -a -print -exec xgettext ${GTF} -o ${PODIR}/${APP}.pot {} \; \) for locale in en do if [ -f ${PODIR}/${APP}-${locale}.po ] then mkdir -p ${MODIR}/${locale}/LC_MESSAGES/ # Update current .po: msgmerge -U ${PODIR}/${APP}-${locale}.po ${PODIR}/${APP}.pot # Compile it: #msgfmt -c -v -o ${LIB}/EB/locale/${locale}/LC_MESSAGES/${APP}.mo $DIR/${APP}-${locale}.po msgfmt -c -v -o ${MODIR}/${locale}/LC_MESSAGES/${APP}.mo ${PODIR}/${APP}-${locale}.po else # Create a .po for translation: if [ $locale = "en" ] then cat ${PODIR}/${APP}-${locale}.pox ${PODIR}/${APP}.pot > ${PODIR}/${APP}-${locale}.po else msginit -i ${PODIR}/${APP}.pot -o ${PODIR}/${APP}-${locale}.po -l $locale --no-translator fi fi done EekBoek-2.02.04/locale/ebcore.pot0000444000076500007650000026050612165465617014264 0ustar jvjv# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-08-11 21:16+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../lib/EB.pm:130 #, perl-brace-format msgid "{name} {version}" msgstr "" #: ../lib/EB.pm:134 msgid "Nederlands" msgstr "" #: ../lib/EB.pm:135 #, perl-brace-format msgid "{ident}{extra}{locale} -- Copyright {year} Squirrel Consultancy" msgstr "" #: ../lib/EB.pm:151 msgid "" "EekBoek is VRIJE software, ontwikkeld om vrij over uw eigen gegevens te " "kunnen beschikken." msgstr "" #: ../lib/EB.pm:152 msgid "" "Met uw keuze voor het Microsoft Windows besturingssysteem geeft u echter " "alle vrijheden weer uit handen. Dat is erg triest." msgstr "" #: ../lib/EB/Booking/Delete.pm:57 msgid "" "Deze boeking valt in de periode waarover al BTW aangifte is gedaan en kan " "niet meer worden verwijderd" msgstr "" #: ../lib/EB/Booking/Delete.pm:82 #, perl-brace-format msgid "Boekstuk {bsk} is in gebruik door {lst}" msgstr "" #: ../lib/EB/Booking/Delete.pm:146 #, perl-brace-format msgid "Boekstuk {bsk} niet verwijderd" msgstr "" #: ../lib/EB/Booking/Delete.pm:150 #, perl-brace-format msgid "Boekstuk {bsk} verwijderd" msgstr "" #: ../lib/EB/Booking/BKM.pm:48 ../lib/EB/Booking/IV.pm:62 #, perl-brace-format msgid "Ongeldig totaal: {total}" msgstr "" #: ../lib/EB/Booking/BKM.pm:55 #, perl-brace-format msgid "Ongeldig saldo: {saldo}" msgstr "" #: ../lib/EB/Booking/BKM.pm:62 #, perl-brace-format msgid "Ongeldig beginsaldo: {saldo}" msgstr "" #: ../lib/EB/Booking/BKM.pm:77 ../lib/EB/Booking/BKM.pm:145 #: ../lib/EB/Booking/BKM.pm:283 ../lib/EB/Booking/IV.pm:75 #, perl-brace-format msgid "Onherkenbare datum: {date}" msgstr "" #: ../lib/EB/Booking/BKM.pm:83 ../lib/EB/Booking/BKM.pm:133 #: ../lib/EB/Booking/BKM.pm:150 ../lib/EB/Booking/BKM.pm:271 #: ../lib/EB/Booking/BKM.pm:288 ../lib/EB/Booking/IV.pm:81 #: ../lib/EB/Booking/IV.pm:153 msgid "" "Deze opdracht is onvolledig. Gebruik de \"help\" opdracht voor meer " "aanwijzingen." msgstr "" #: ../lib/EB/Booking/BKM.pm:100 msgid "" "Beginsaldo komt niet overeen met het eindsaldo van de voorgaande boeking" msgstr "" #: ../lib/EB/Booking/BKM.pm:103 #, perl-brace-format msgid "Beginsaldo: {bal}" msgstr "" #: ../lib/EB/Booking/BKM.pm:108 #, perl-brace-format msgid "Saldo voorgaande boeking: {bal}" msgstr "" #: ../lib/EB/Booking/BKM.pm:113 #, perl-brace-format msgid "Huidig saldo: {bal}" msgstr "" #: ../lib/EB/Booking/BKM.pm:140 ../lib/EB/Booking/BKM.pm:278 #: ../lib/EB/Booking/IV.pm:87 msgid "De boekingsdatum valt in de periode waarover al BTW aangifte is gedaan" msgstr "" #: ../lib/EB/Booking/BKM.pm:157 ../lib/EB/Booking/BKM.pm:292 #: ../lib/EB/Booking/IV.pm:163 msgid "boekstuk" msgstr "" #: ../lib/EB/Booking/BKM.pm:162 ../lib/EB/Booking/IV.pm:172 msgid "" "De \"D\" of \"C\" toevoeging aan het rekeningnummer is hier niet toegestaan" msgstr "" #: ../lib/EB/Booking/BKM.pm:165 ../lib/EB/Booking/IV.pm:175 #, perl-brace-format msgid "Ongeldig grootboekrekeningnummer: {acct}" msgstr "" #: ../lib/EB/Booking/BKM.pm:175 ../lib/EB/Booking/IV.pm:182 #: ../lib/EB/Relation.pm:110 ../lib/EB/Tools/Opening.pm:108 #, perl-brace-format msgid "Onbekende grootboekrekening: {acct}" msgstr "" #: ../lib/EB/Booking/BKM.pm:183 ../lib/EB/Booking/IV.pm:189 #: ../lib/EB/Relation.pm:115 #, perl-brace-format msgid "Grootboekrekening {acct} ({desc}) is een balansrekening" msgstr "" #: ../lib/EB/Booking/BKM.pm:188 ../lib/EB/Booking/IV.pm:196 #, perl-brace-format msgid "Grootboekrekening {acct} heeft BTW in een BTW-vrije administratie" msgstr "" #: ../lib/EB/Booking/BKM.pm:196 ../lib/EB/Booking/BKM.pm:298 #: ../lib/EB/Booking/IV.pm:226 #, perl-brace-format msgid "Ongeldig bedrag: {amt}" msgstr "" #: ../lib/EB/Booking/BKM.pm:204 msgid "" "Boekingen met BTW zijn niet mogelijk in een memoriaal. De BTW is op nul " "gesteld." msgstr "" #: ../lib/EB/Booking/BKM.pm:214 ../lib/EB/Booking/IV.pm:235 #, perl-brace-format msgid "Ongeldige BTW-specificatie: {spec}" msgstr "" #: ../lib/EB/Booking/BKM.pm:220 ../lib/EB/Booking/IV.pm:270 msgid "BTW toepassen is niet mogelijk op een neutrale rekening" msgstr "" #: ../lib/EB/Booking/BKM.pm:323 #, perl-brace-format msgid "Geen post gevonden voor boekstuk {bsk}" msgstr "" #: ../lib/EB/Booking/BKM.pm:336 ../lib/EB/Booking/BKM.pm:475 #: ../lib/EB/Booking/IV.pm:113 ../lib/EB/Booking/IV.pm:136 #, perl-brace-format msgid "Onbekende {what}: {who}" msgstr "" #: ../lib/EB/Booking/BKM.pm:337 ../lib/EB/Booking/BKM.pm:476 #: ../lib/EB/Booking/IV.pm:114 ../lib/EB/Booking/IV.pm:137 #: ../lib/EB/Relation.pm:99 ../lib/EB/Relation.pm:101 #: ../lib/EB/Report/Debcrd.pm:54 msgid "Debiteur" msgstr "" #: ../lib/EB/Booking/BKM.pm:337 ../lib/EB/Booking/BKM.pm:476 #: ../lib/EB/Booking/IV.pm:114 ../lib/EB/Booking/IV.pm:137 #: ../lib/EB/Relation.pm:99 ../lib/EB/Relation.pm:101 #: ../lib/EB/Report/Debcrd.pm:54 msgid "Crediteur" msgstr "" #: ../lib/EB/Booking/BKM.pm:403 #, perl-brace-format msgid "Betaling {rel} {amt} voldoet de open posten {amtss} en {amts}" msgstr "" #: ../lib/EB/Booking/BKM.pm:422 msgid "Wellicht de betaling van de volgende open posten:" msgstr "" #: ../lib/EB/Booking/BKM.pm:440 msgid "Geen alternatieven beschikbaar (teveel open posten)" msgstr "" #: ../lib/EB/Booking/BKM.pm:445 ../lib/EB/Booking/BKM.pm:499 #, perl-brace-format msgid "Geen open post van {amt} gevonden voor relatie {rel}" msgstr "" #: ../lib/EB/Booking/BKM.pm:452 #, perl-brace-format msgid "Open posten voor relatie {rel}:" msgstr "" #: ../lib/EB/Booking/BKM.pm:529 #, perl-brace-format msgid "Onbekend transactietype: {type}" msgstr "" #: ../lib/EB/Booking/BKM.pm:540 #, perl-brace-format msgid "Nieuw saldo: {bal}" msgstr "" #: ../lib/EB/Booking/BKM.pm:548 #, perl-brace-format msgid "Saldo {new} klopt niet met de vereiste waarde {act}" msgstr "" #: ../lib/EB/Booking/BKM.pm:555 ../lib/EB/Booking/IV.pm:316 #, perl-brace-format msgid " Boekstuk totaal is {act} in plaats van {exp}" msgstr "" #: ../lib/EB/Booking/BKM.pm:561 #, perl-brace-format msgid "Saldo {new} klopt niet met beginsaldo eropvolgende boekstuk {isaldo}" msgstr "" #: ../lib/EB/Booking/BKM.pm:566 #, perl-brace-format msgid "Boekstuk is niet in balans (verschil is {diff})" msgstr "" #: ../lib/EB/Booking/BKM.pm:576 ../lib/EB/Booking/IV.pm:304 msgid "Dit overzicht is ter referentie, de boeking is niet uitgevoerd!" msgstr "" #: ../lib/EB/Booking/BKM.pm:584 ../lib/EB/Booking/IV.pm:313 msgid "Boeking " msgstr "" #: ../lib/EB/Booking/IV.pm:44 #, perl-brace-format msgid "" "Boekingsreferentie moet tenminste één niet-numeriek teken bevatten: {ref}" msgstr "" #: ../lib/EB/Booking/IV.pm:49 #, perl-brace-format msgid "Ongeldige operatie (IV) voor dagboek type {type}" msgstr "" #: ../lib/EB/Booking/IV.pm:166 msgid "De omschrijving van de boekstukregel ontbreekt" msgstr "" #: ../lib/EB/Booking/IV.pm:211 #, perl-brace-format msgid "Referentie {ref} bestaat al voor relatie {rel}" msgstr "" #: ../lib/EB/Booking/IV.pm:251 #, perl-brace-format msgid "Pas op! U boekt {ko} in een {iv} dagboek" msgstr "" #: ../lib/EB/Booking/IV.pm:252 msgid "kosten" msgstr "" #: ../lib/EB/Booking/IV.pm:252 msgid "omzet" msgstr "" #: ../lib/EB/Booking/IV.pm:253 msgid "inkoop" msgstr "" #: ../lib/EB/Booking/IV.pm:253 msgid "verkoop" msgstr "" #: ../lib/EB/Booking/IV.pm:261 #, perl-brace-format msgid "Onbekende BTW-code: {code}" msgstr "" #: ../lib/EB/Booking/Decode.pm:64 ../lib/EB/DB.pm:273 #, perl-brace-format msgid "Onbekend boekstuk: {bsk}" msgstr "" #: ../lib/EB/Booking/Decode.pm:84 ../lib/EB/Shell.pm:479 msgid "cmo:boeking:ref" msgstr "" #: ../lib/EB/Booking/Decode.pm:93 ../lib/EB/Shell.pm:478 msgid "cmo:boeking:totaal" msgstr "" #: ../lib/EB/Booking/Decode.pm:299 ../lib/EB/Shell.pm:721 #, perl-brace-format msgid "Onbekend rekeningnummer: {acct}" msgstr "" #: ../lib/EB/Report.pm:55 #, perl-brace-format msgid "Balansrekening {acct}, saldo aangepast naar {exp}" msgstr "" #: ../lib/EB/Report.pm:69 #, perl-brace-format msgid "Balansrekening {acct}, saldo aangepast met {exp}" msgstr "" #: ../lib/EB/Report.pm:118 #, perl-brace-format msgid "Resultaatrekening {acct}, beginsaldo is {exp}" msgstr "" #: ../lib/EB/Report.pm:132 #, perl-brace-format msgid "Resultaatrekening {acct}, saldo aangepast met {exp}" msgstr "" #: ../lib/EB/Report.pm:157 #, perl-brace-format msgid "Resultaatrekening {acct}, mutaties is {exp}" msgstr "" #: ../lib/EB/Import.pm:35 #, perl-brace-format msgid "Directory {dir} bestaat niet" msgstr "" #: ../lib/EB/Import.pm:37 ../lib/EB/Export.pm:37 #, perl-brace-format msgid "Geen toegang tot directory {dir}" msgstr "" #: ../lib/EB/Import.pm:41 ../lib/EB/Import.pm:46 ../lib/EB/Import.pm:49 #: ../lib/EB/Import.pm:52 #, perl-brace-format msgid "Bestand \"{file}\" ontbreekt ({err})" msgstr "" #: ../lib/EB/Import.pm:86 msgid "Module Archive::Zip, nodig voor import van file, is niet beschikbaar" msgstr "" #: ../lib/EB/Import.pm:89 #, perl-brace-format msgid "Bestand \"{file}\" is niet beschikbaar ({err})" msgstr "" #: ../lib/EB/Import.pm:95 #, perl-brace-format msgid "Fout {code} tijdens het lezen van {file}" msgstr "" #: ../lib/EB/Import.pm:107 #, perl-brace-format msgid "Het schema ontbreekt in bestand {file}" msgstr "" #: ../lib/EB/Import.pm:114 #, perl-brace-format msgid "De relatiegegevens ontbreken in bestand {file}" msgstr "" #: ../lib/EB/Import.pm:121 #, perl-brace-format msgid "De openingsgegevens ontbreken in bestand {file}" msgstr "" #: ../lib/EB/Import.pm:128 #, perl-brace-format msgid "De mutatiegegevens ontbreken in bestand {file}" msgstr "" #: ../lib/EB/Import.pm:135 msgid "DE IMPORT IS NIET UITGEVOERD" msgstr "" #: ../lib/EB/IniWiz.pm:25 ../lib/EB/Wx/IniWiz.pm:38 msgid "--standaard--" msgstr "" #: ../lib/EB/IniWiz.pm:42 #, perl-brace-format msgid "Beschikbare administraties in {dir}:" msgstr "" #: ../lib/EB/IniWiz.pm:59 msgid "Uw keuze" msgstr "" #: ../lib/EB/IniWiz.pm:62 msgid ", of N om een nieuwe administratie aan te maken>" msgstr "" #: ../lib/EB/IniWiz.pm:149 ../lib/EB/Wx/IniWiz.pm:125 msgid "Lege administratie" msgstr "" #: ../lib/EB/IniWiz.pm:152 ../lib/EB/Report/Debcrd.pm:57 #: ../lib/EB/Report/Open.pm:42 ../lib/EB/Wx/IniWiz.pm:180 msgid "Omschrijving" msgstr "" #: ../lib/EB/IniWiz.pm:184 ../lib/EB/Wx/IniWiz.pm:128 msgid "Maand" msgstr "" #: ../lib/EB/IniWiz.pm:184 ../lib/EB/IniWiz.pm:191 ../lib/EB/Wx/IniWiz.pm:128 msgid "Kwartaal" msgstr "" #: ../lib/EB/IniWiz.pm:184 ../lib/EB/Wx/IniWiz.pm:128 msgid "Jaar" msgstr "" #: ../lib/EB/IniWiz.pm:185 msgid "Nee" msgstr "" #: ../lib/EB/IniWiz.pm:185 msgid "Ja" msgstr "" #: ../lib/EB/IniWiz.pm:188 ../lib/EB/Wx/IniWiz.pm:118 msgid "Mijn eerste EekBoek" msgstr "" #: ../lib/EB/IniWiz.pm:192 msgid "EekBoek Voorbeeldadministratie" msgstr "" #: ../lib/EB/IniWiz.pm:210 msgid "" "Geef een unieke naam voor de nieuwe administratie. Deze wordt gebruikt\n" "voor rapporten en dergelijke.\n" msgstr "" #: ../lib/EB/IniWiz.pm:214 ../lib/EB/Config/Data.pm:24 #: ../lib/EB/Config/Data.pm:50 ../lib/EB/Shell.pm:765 #: ../lib/EB/Wx/IniWiz.pm:117 msgid "Naam" msgstr "" #: ../lib/EB/IniWiz.pm:219 ../lib/EB/Wx/IniWiz.pm:581 msgid "Er bestaat al een administratie met deze naam." msgstr "" #: ../lib/EB/IniWiz.pm:231 msgid "" "Geef het boekjaar voor deze administratie. De administratie\n" "begint op 1 januari van het opgegeven jaar.\n" msgstr "" #: ../lib/EB/IniWiz.pm:234 ../lib/EB/Wx/IniWiz.pm:121 msgid "Begindatum" msgstr "" #: ../lib/EB/IniWiz.pm:246 msgid "" "Geef een unieke code voor de administratie. Deze wordt gebruikt als\n" "interne naam voor de database en administratiefolders.\n" "De standaardwaarde is afgeleid van de administratienaam en de begindatum.\n" msgstr "" #: ../lib/EB/IniWiz.pm:251 ../lib/EB/Wx/IniWiz.pm:119 msgid "Code" msgstr "" #: ../lib/EB/IniWiz.pm:265 #, perl-brace-format msgid "Er bestaat al een administratie met code \"{code}\"" msgstr "" #: ../lib/EB/IniWiz.pm:273 msgid "" "U kunt een van de meegeleverde sjablonen gebruiken voor uw\n" "administratie.\n" msgstr "" #: ../lib/EB/IniWiz.pm:277 ../lib/EB/Wx/IniWiz.pm:124 msgid "Sjabloon" msgstr "" #: ../lib/EB/IniWiz.pm:299 msgid "Moet BTW worden toegepast in deze administratie" msgstr "" #: ../lib/EB/IniWiz.pm:308 msgid "Aangifteperiode voor de BTW" msgstr "" #: ../lib/EB/IniWiz.pm:314 msgid "" "Kies het type database dat u wilt gebruiken voor deze\n" "administratie.\n" msgstr "" #: ../lib/EB/IniWiz.pm:318 ../lib/EB/Wx/IniWiz.pm:108 #: ../lib/EB/Wx/IniWiz.pm:152 msgid "Database" msgstr "" #: ../lib/EB/IniWiz.pm:328 msgid "Database server host, indien niet lokaal" msgstr "" #: ../lib/EB/IniWiz.pm:333 msgid "Database server netwerk poort, indien niet standaard" msgstr "" #: ../lib/EB/IniWiz.pm:338 msgid "Usernaam voor de database" msgstr "" #: ../lib/EB/IniWiz.pm:343 msgid "Password voor de database user" msgstr "" #: ../lib/EB/IniWiz.pm:348 msgid "Moet het configuratiebestand worden aangemaakt" msgstr "" #: ../lib/EB/IniWiz.pm:352 msgid "Moeten de administratiebestanden worden aangemaakt" msgstr "" #: ../lib/EB/IniWiz.pm:356 msgid "Moet de database worden aangemaakt" msgstr "" #: ../lib/EB/IniWiz.pm:360 msgid "Gereed om de bestanden aan te maken." msgstr "" #: ../lib/EB/IniWiz.pm:361 msgid "Doorgaan" msgstr "" #: ../lib/EB/IniWiz.pm:431 msgid "Antwoordt 'ja' of 'nee' a.u.b." msgstr "" #: ../lib/EB/IniWiz.pm:447 #, perl-brace-format msgid "Ongeldig antwoord, het moet een getal tussen {first} en {last} zijn" msgstr "" #: ../lib/EB/IniWiz.pm:452 msgid "Ongeldig antwoord, het moet een getal zijn" msgstr "" #: ../lib/EB/IniWiz.pm:530 msgid "Er is een probleem opgetreden. Raadplaag uw systeembeheerder." msgstr "" #: ../lib/EB/IniWiz.pm:542 ../lib/EB/IniWiz.pm:547 msgid "De gewenste bestanden zijn aangemaakt." msgstr "" #: ../lib/EB/IniWiz.pm:548 msgid "U kunt meteen aan de slag." msgstr "" #: ../lib/EB/Shell/Base.pm:84 msgid "cmd:adm_balans" msgstr "" #: ../lib/EB/Shell/Base.pm:85 msgid "cmd:adm_balanstotaal" msgstr "" #: ../lib/EB/Shell/Base.pm:86 msgid "cmd:adm_begindatum" msgstr "" #: ../lib/EB/Shell/Base.pm:87 msgid "cmd:adm_boekjaarcode" msgstr "" #: ../lib/EB/Shell/Base.pm:88 msgid "cmd:adm_btwperiode" msgstr "" #: ../lib/EB/Shell/Base.pm:89 msgid "cmd:adm_naam" msgstr "" #: ../lib/EB/Shell/Base.pm:90 msgid "cmd:adm_open" msgstr "" #: ../lib/EB/Shell/Base.pm:91 msgid "cmd:adm_relatie" msgstr "" #: ../lib/EB/Shell/Base.pm:94 msgid "cmd:boekjaar" msgstr "" #: ../lib/EB/Shell/Base.pm:97 msgid "cmd:balans" msgstr "" #: ../lib/EB/Shell/Base.pm:98 msgid "cmd:btwaangifte" msgstr "" #: ../lib/EB/Shell/Base.pm:99 msgid "cmd:crediteuren" msgstr "" #: ../lib/EB/Shell/Base.pm:100 msgid "cmd:debiteuren" msgstr "" #: ../lib/EB/Shell/Base.pm:101 msgid "cmd:grootboek" msgstr "" #: ../lib/EB/Shell/Base.pm:102 msgid "cmd:journaal" msgstr "" #: ../lib/EB/Shell/Base.pm:103 msgid "cmd:openstaand" msgstr "" #: ../lib/EB/Shell/Base.pm:104 msgid "cmd:proefensaldibalans" msgstr "" #: ../lib/EB/Shell/Base.pm:105 msgid "cmd:result" msgstr "" #: ../lib/EB/Shell/Base.pm:108 msgid "cmd:dagboeken" msgstr "" #: ../lib/EB/Shell/Base.pm:109 msgid "cmd:database" msgstr "" #: ../lib/EB/Shell/Base.pm:110 msgid "cmd:periodes" msgstr "" #: ../lib/EB/Shell/Base.pm:111 msgid "cmd:rapporten" msgstr "" #: ../lib/EB/Shell/Base.pm:114 msgid "cmd:export" msgstr "" #: ../lib/EB/Shell/Base.pm:115 msgid "cmd:import" msgstr "" #: ../lib/EB/Shell/Base.pm:116 msgid "cmd:jaareinde" msgstr "" #: ../lib/EB/Shell/Base.pm:117 msgid "cmd:relatie" msgstr "" #: ../lib/EB/Shell/Base.pm:118 msgid "cmd:schema" msgstr "" #: ../lib/EB/Shell/Base.pm:119 msgid "cmd:toon" msgstr "" #: ../lib/EB/Shell/Base.pm:120 msgid "cmd:verwijder" msgstr "" #: ../lib/EB/Shell/Base.pm:123 msgid "cmd:include" msgstr "" #: ../lib/EB/Shell/Base.pm:124 msgid "cmd:sql" msgstr "" #: ../lib/EB/Shell/Base.pm:283 ../lib/EB/Wx/Shell/MainFrame.pm:368 msgid "Fout in de invoerregel. Controleer de \" en ' tekens." msgstr "" #: ../lib/EB/Shell/Base.pm:335 msgid " ****** Afgebroken wegens fouten in de invoer ******" msgstr "" #: ../lib/EB/Shell/Base.pm:341 #, perl-brace-format msgid "" "Onbekende opdracht \"{cmd}\".\n" "\"help\" geeft een lijst van mogelijke opdrachten." msgstr "" #: ../lib/EB/Shell/Base.pm:440 msgid "Toon versie." msgstr "" #: ../lib/EB/Shell/Base.pm:537 ../lib/EB/Shell/Base.pm:552 msgid "Opdrachtnamen zijn hoofdletterongevoelig." msgstr "" #: ../lib/EB/Shell/Base.pm:542 #, perl-brace-format msgid "Sorry, geen hulp voor {topic}." msgstr "" #: ../lib/EB/Shell/Base.pm:550 msgid "Hulp is beschikbaar voor de volgende onderwerpen." msgstr "" #: ../lib/EB/Shell/Base.pm:551 msgid "Typ 'help [onderwerp]' voor meer gedetailleerde informatie." msgstr "" #: ../lib/EB/Shell/Base.pm:557 msgid "Geen hulp beschikbaar." msgstr "" #: ../lib/EB/Shell/DeLuxe_Fake.pm:11 msgid "Vervolgregel ontbreekt in de invoer." msgstr "" #: ../lib/EB/Shell/DeLuxe_Fake.pm:12 ../lib/EB/Tools/Schema.pm:465 msgid "Invoer moet Unicode (UTF-8) zijn." msgstr "" #: ../lib/EB/Shell/DeLuxe_Fake.pm:13 ../lib/EB/Tools/Schema.pm:473 #, perl-brace-format msgid "Geen geldige UTF-8 tekens in regel {line} van de invoer" msgstr "" #: ../lib/EB/Shell/DeLuxe_Fake.pm:15 #, perl-brace-format msgid "Invoerregel {lno} bevat onzichtbare tekens na de backslash" msgstr "" #: ../lib/EB/Format.pm:121 msgid "Configuratiefout: [format]numwidth moet een getal zijn" msgstr "" #: ../lib/EB/Format.pm:130 msgid "1.234,56" msgstr "" #: ../lib/EB/Format.pm:131 #, perl-brace-format msgid "Configuratiefout: ongeldige waarde voor {item}" msgstr "" #: ../lib/EB/Format.pm:190 #, perl-brace-format msgid "Onbekende afrondingsmethode: {meth}" msgstr "" #: ../lib/EB/Format.pm:211 #, perl-brace-format msgid "Ongeldige datumformaatspecificatie: {fmt}" msgstr "" #: ../lib/EB/Format.pm:223 #, perl-brace-format msgid "Ongeldig bedrag: {num}" msgstr "" #: ../lib/EB/Format.pm:277 #, perl-brace-format msgid "Ongeldig getal: {num}" msgstr "" #: ../lib/EB/Main.pm:88 msgid "Geen administratie geselecteerd" msgstr "" #: ../lib/EB/Main.pm:98 msgid "" "Geen EekBoek database opgegeven. Specificeer een database in de " "configuratiefile, of selecteer een andere configuratiefile op de command " "line met \"--config=...\"." msgstr "" #: ../lib/EB/Main.pm:136 #, perl-brace-format msgid "Lege database {db} is aangemaakt" msgstr "" #: ../lib/EB/Main.pm:217 ../lib/EB/Wx/Shell/Main.pm:227 #, perl-brace-format msgid "Dit is {pkg} [{name} {version}]" msgstr "" #: ../lib/EB/Main.pm:227 #, perl-brace-format msgid "" "Gebruik: {prog} [options] [file ...]\n" "\n" " --command -c\tvoer de rest van de opdrachtregel uit als command\n" " --echo -e\t\ttoon ingelezen opdrachten\n" " --boekjaar=XXX\tspecificeer boekjaar\n" " --import\t\timporteer een nieuwe administratie\n" " --export\t\texporteer een administratie\n" " --dir=XXX\t\tdirectory voor im/export\n" " --file=XXX\t\tbestand voor im/export\n" " --titel=XXX\t\tomschrijving voor export\n" " --init\t\t(re)creëer administratie\n" " --help\t\tdeze hulpboodschap\n" " --ident\t\ttoon identificatie\n" " --verbose\t\tgeef meer uitgebreide information\n" "\n" "Voor experts:\n" "\n" " --config=XXX -f\tspecificeer configuratiebestand\n" " --nostdconf -X\tgebruik uitsluitend dit configuratiebestand\n" " --define=XXX -D\tdefinieer configuratiesetting\n" " --printconfig -P\tprint config waarden\n" " --[no]interactive\tforceer [non]interactieve modus\n" " --[no]errexit\tstop direct na een fout in de invoer\n" msgstr "" #: ../lib/EB/DB/Mysql_dummy.pm:63 ../lib/EB/DB/Sqlite.pm:63 #, perl-brace-format msgid "Database journal voor {db} verwijderd" msgstr "" #: ../lib/EB/DB/Mysql_dummy.pm:66 ../lib/EB/DB/Sqlite.pm:66 #, perl-brace-format msgid "Database sequences voor {db} verwijderd" msgstr "" #: ../lib/EB/DB/Mysql_dummy.pm:85 ../lib/EB/DB/Pglite.pm:91 #: ../lib/EB/DB/Sqlite.pm:85 #, perl-brace-format msgid "Geen database met naam {name} gevonden" msgstr "" #: ../lib/EB/DB/Mysql_dummy.pm:89 ../lib/EB/DB/Mysql_dummy.pm:95 #: ../lib/EB/DB/Mysql.pm:79 ../lib/EB/DB/Mysql.pm:85 ../lib/EB/DB/Pglite.pm:95 #: ../lib/EB/DB/Sqlite.pm:89 ../lib/EB/DB/Sqlite.pm:95 #: ../lib/EB/DB/Postgres.pm:111 ../lib/EB/DB.pm:485 #, perl-brace-format msgid "Database verbindingsprobleem: {err}" msgstr "" #: ../lib/EB/DB/Mysql.pm:96 ../lib/EB/DB/Postgres.pm:116 #, perl-brace-format msgid "Database {name} is niet in UTF-8 maar {enc}" msgstr "" #: ../lib/EB/DB/Postgres.pm:93 #, perl-brace-format msgid "Database probleem: {err}" msgstr "" #: ../lib/EB/Utils.pm:162 ../lib/EB/Tools/Opening.pm:50 #: ../lib/EB/Tools/Opening.pm:54 msgid "jaar" msgstr "" #: ../lib/EB/Relation.pm:46 #, perl-brace-format msgid "Ongeldige waarde voor BTW status: {btw}" msgstr "" #: ../lib/EB/Relation.pm:50 msgid "Relaties met verlegde BTW worden nog niet ondersteund" msgstr "" #: ../lib/EB/Relation.pm:54 msgid "" "Relaties met intra-communautaire BTW worden nog niet volledig ondersteund" msgstr "" #: ../lib/EB/Relation.pm:65 ../lib/EB/Tools/Opening.pm:152 #: ../lib/EB/Report/Journal.pm:76 ../lib/EB/Report/Journal.pm:97 #: ../lib/EB/DB.pm:244 #, perl-brace-format msgid "Onbekend dagboek: {dbk}" msgstr "" #: ../lib/EB/Relation.pm:76 #, perl-brace-format msgid "Ongeldig dagboek voor relatie: {dbk}" msgstr "" #: ../lib/EB/Relation.pm:93 msgid "" "Waarschuwing: De toevoeging 'D' of 'C' aan het grootboeknummer wordt " "afgeraden! Gebruik de --dagboek optie indien nodig." msgstr "" #: ../lib/EB/Relation.pm:97 #, perl-brace-format msgid "Dagboek {dbk} implicieert {typ1} maar {acct} impliceert {typ2}" msgstr "" #: ../lib/EB/Relation.pm:137 #, perl-brace-format msgid "Relatiecode {code} is niet uniek in dagboek {dbk}" msgstr "" #: ../lib/EB/Relation.pm:149 #, perl-brace-format msgid "Debiteur {code} -> {acct} ({desc}), dagboek {dbk}" msgstr "" #: ../lib/EB/Relation.pm:151 #, perl-brace-format msgid "Crediteur {code} -> {acct} ({desc}), dagboek {dbk}" msgstr "" #: ../lib/EB/Export/XAF.pm:35 #, perl-brace-format msgid "Fout tijdens het aanmaken van exportbestand {name}: {err}" msgstr "" #: ../lib/EB/Export/XAF.pm:77 ../lib/EB/Tools/Einde.pm:69 #: ../lib/EB/Report/GenBase.pm:141 ../lib/EB/Report/BTWAangifte.pm:105 #: ../lib/EB/Report/BTWAangifte.pm:129 ../lib/EB/DB.pm:221 ../lib/EB/DB.pm:249 #, perl-brace-format msgid "Onbekend boekjaar: {bky}" msgstr "" #: ../lib/EB/Globals.pm:64 msgid "-- Inkoop Verkoop Bank Kas Memoriaal" msgstr "" #: ../lib/EB/Globals.pm:67 msgid "Nul Hoog Laag Privé Anders" msgstr "" #: ../lib/EB/Globals.pm:68 msgid "Geen Jaar 2 3 Kwartaal 5 6 7 8 9 10 11 Maand" msgstr "" #: ../lib/EB/Globals.pm:74 msgid "Normaal Verlegd Intra Extra" msgstr "" #: ../lib/EB/Tools/Schema.pm:59 #, perl-brace-format msgid "Onbekend schema: {schema}" msgstr "" #: ../lib/EB/Tools/Schema.pm:61 #, perl-brace-format msgid "Toegangsfout schema data: {err}" msgstr "" #: ../lib/EB/Tools/Schema.pm:64 #, perl-brace-format msgid "Schema {schema} geïnitialiseerd" msgstr "" #: ../lib/EB/Tools/Schema.pm:111 msgid "scm:tg:hoog" msgstr "" #: ../lib/EB/Tools/Schema.pm:112 msgid "scm:tg:laag" msgstr "" #: ../lib/EB/Tools/Schema.pm:113 msgid "scm:tg:nul" msgstr "" #: ../lib/EB/Tools/Schema.pm:114 msgid "scm:tg:geen" msgstr "" #: ../lib/EB/Tools/Schema.pm:115 msgid "scm:tg:privé" msgstr "" #: ../lib/EB/Tools/Schema.pm:116 msgid "scm:tg:anders" msgstr "" #: ../lib/EB/Tools/Schema.pm:119 msgid "scm:std:winst" msgstr "" #: ../lib/EB/Tools/Schema.pm:120 msgid "scm:std:crd" msgstr "" #: ../lib/EB/Tools/Schema.pm:121 msgid "scm:std:deb" msgstr "" #: ../lib/EB/Tools/Schema.pm:122 msgid "scm:std:btw_il" msgstr "" #: ../lib/EB/Tools/Schema.pm:123 msgid "scm:std:btw_vl" msgstr "" #: ../lib/EB/Tools/Schema.pm:124 msgid "scm:std:btw_ih" msgstr "" #: ../lib/EB/Tools/Schema.pm:125 msgid "scm:std:btw_vp" msgstr "" #: ../lib/EB/Tools/Schema.pm:126 msgid "scm:std:btw_ip" msgstr "" #: ../lib/EB/Tools/Schema.pm:127 msgid "scm:std:btw_va" msgstr "" #: ../lib/EB/Tools/Schema.pm:128 msgid "scm:std:btw_ia" msgstr "" #: ../lib/EB/Tools/Schema.pm:129 msgid "scm:std:btw_ok" msgstr "" #: ../lib/EB/Tools/Schema.pm:130 msgid "scm:std:btw_vh" msgstr "" #: ../lib/EB/Tools/Schema.pm:133 msgid "scm:hdr:Verdichting" msgstr "" #: ../lib/EB/Tools/Schema.pm:134 msgid "scm:hdr:Balansrekeningen" msgstr "" #: ../lib/EB/Tools/Schema.pm:135 msgid "scm:balans" msgstr "" #: ../lib/EB/Tools/Schema.pm:136 msgid "scm:hdr:Resultaatrekeningen" msgstr "" #: ../lib/EB/Tools/Schema.pm:137 msgid "scm:result" msgstr "" #: ../lib/EB/Tools/Schema.pm:138 msgid "scm:hdr:Dagboeken" msgstr "" #: ../lib/EB/Tools/Schema.pm:139 msgid "scm:dagboeken" msgstr "" #: ../lib/EB/Tools/Schema.pm:140 msgid "scm:hdr:BTW Tarieven" msgstr "" #: ../lib/EB/Tools/Schema.pm:143 msgid "scm:dbk:inkoop" msgstr "" #: ../lib/EB/Tools/Schema.pm:144 msgid "scm:dbk:verkoop" msgstr "" #: ../lib/EB/Tools/Schema.pm:145 msgid "scm:dbk:bank" msgstr "" #: ../lib/EB/Tools/Schema.pm:146 msgid "scm:dbk:kas" msgstr "" #: ../lib/EB/Tools/Schema.pm:147 msgid "scm:dbk:memoriaal" msgstr "" #: ../lib/EB/Tools/Schema.pm:150 msgid "scm:inclusief" msgstr "" #: ../lib/EB/Tools/Schema.pm:151 msgid "scm:exclusief" msgstr "" #: ../lib/EB/Tools/Schema.pm:152 msgid "scm:incl" msgstr "" #: ../lib/EB/Tools/Schema.pm:153 msgid "scm:excl" msgstr "" #: ../lib/EB/Tools/Schema.pm:154 msgid "scm:btw" msgstr "" #: ../lib/EB/Tools/Schema.pm:155 msgid "scm:kosten" msgstr "" #: ../lib/EB/Tools/Schema.pm:156 msgid "scm:kostenrekening" msgstr "" #: ../lib/EB/Tools/Schema.pm:157 msgid "scm:omzet" msgstr "" #: ../lib/EB/Tools/Schema.pm:158 msgid "scm:omzetrekening" msgstr "" #: ../lib/EB/Tools/Schema.pm:159 msgid "scm:koppeling" msgstr "" #: ../lib/EB/Tools/Schema.pm:160 msgid "scm:type" msgstr "" #: ../lib/EB/Tools/Schema.pm:161 msgid "scm:rek" msgstr "" #: ../lib/EB/Tools/Schema.pm:162 msgid "scm:rekening" msgstr "" #: ../lib/EB/Tools/Schema.pm:163 msgid "scm:percentage" msgstr "" #: ../lib/EB/Tools/Schema.pm:164 msgid "scm:perc" msgstr "" #: ../lib/EB/Tools/Schema.pm:165 msgid "scm:tariefgroep" msgstr "" #: ../lib/EB/Tools/Schema.pm:195 #, perl-brace-format msgid "Dubbel: dagboek {dbk}" msgstr "" #: ../lib/EB/Tools/Schema.pm:211 #, perl-brace-format msgid "Dagboek {id} onbekend type \"{type}\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:221 #, perl-brace-format msgid "Dagboek {id}: onbekende info \"{info}\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:226 #, perl-brace-format msgid "Dagboek {id}: het :type ontbreekt" msgstr "" #: ../lib/EB/Tools/Schema.pm:227 #, perl-brace-format msgid "Dagboek {id}: het :rekening nummer ontbreekt" msgstr "" #: ../lib/EB/Tools/Schema.pm:229 #, perl-brace-format msgid "Dagboek {id}: :dc is alleen toegestaan voor Kas en Bankboeken" msgstr "" #: ../lib/EB/Tools/Schema.pm:234 #, perl-brace-format msgid "Dagboek naam \"{dbk}\" is niet toegestaan." msgstr "" #: ../lib/EB/Tools/Schema.pm:246 #, perl-brace-format msgid "Dubbel: BTW tarief {id}" msgstr "" #: ../lib/EB/Tools/Schema.pm:272 msgid "Gelieve BTW tariefgroep \"Geen\" te vervangen door \"Nul\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:288 #, perl-brace-format msgid "BTW tarief {id}: onbekende info \"{info}\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:293 #, perl-brace-format msgid "BTW tarief {id}: geen percentage en de tariefgroep is niet \"{none}\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:294 msgid "geen" msgstr "" #: ../lib/EB/Tools/Schema.pm:337 #, perl-brace-format msgid "Dubbel: hoofdverdichting {vrd}" msgstr "" #: ../lib/EB/Tools/Schema.pm:341 #, perl-brace-format msgid "Dubbel: verdichting {vrd}" msgstr "" #: ../lib/EB/Tools/Schema.pm:342 #, perl-brace-format msgid "Verdichting {vrd} heeft geen hoofdverdichting" msgstr "" #: ../lib/EB/Tools/Schema.pm:347 #, perl-brace-format msgid "Dubbel: rekening {acct}" msgstr "" #: ../lib/EB/Tools/Schema.pm:348 #, perl-brace-format msgid "Rekening {id} heeft geen verdichting" msgstr "" #: ../lib/EB/Tools/Schema.pm:360 #, perl-brace-format msgid "Rekening {id}: onherkenbare vlaggetjes {flags}" msgstr "" #: ../lib/EB/Tools/Schema.pm:395 #, perl-brace-format msgid "Foutieve BTW specificatie: {spec}" msgstr "" #: ../lib/EB/Tools/Schema.pm:405 #, perl-brace-format msgid "Rekening {id}: onbekende koppeling \"{std}\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:408 #, perl-brace-format msgid "Rekening {id}: extra koppeling voor \"{std}\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:415 #, perl-brace-format msgid "Rekening {id}: BTW koppeling '{ko}' met een {acc} is niet toegestaan" msgstr "" #: ../lib/EB/Tools/Schema.pm:419 #, perl-brace-format msgid "" "Rekening {id}: BTW koppeling met neutrale resultaatrekening is niet " "toegestaan" msgstr "" #: ../lib/EB/Tools/Schema.pm:421 #, perl-brace-format msgid "" "Rekening {id}: BTW koppeling met een balansrekening vereist kosten/omzet " "specificatie" msgstr "" #: ../lib/EB/Tools/Schema.pm:512 ../lib/EB/Tools/Schema.pm:517 #, perl-brace-format msgid "" "Ongeldige invoer in schema bestand, regel {lno}:\n" "{line}" msgstr "" #: ../lib/EB/Tools/Schema.pm:545 #, perl-brace-format msgid "Dagboek {id} heeft geen tegenrekening" msgstr "" #: ../lib/EB/Tools/Schema.pm:566 #, perl-brace-format msgid "Geen BTW tarief gevonden met tariefgroep {gr}, inclusief" msgstr "" #: ../lib/EB/Tools/Schema.pm:579 #, perl-brace-format msgid "Geen koppeling gevonden voor \"{std}\"" msgstr "" #: ../lib/EB/Tools/Schema.pm:582 msgid "FOUTEN GEVONDEN IN SCHEMA BESTAND, VERWERKING AFGEBROKEN" msgstr "" #: ../lib/EB/Tools/Schema.pm:618 msgid "Installatiefout -- geen database schema" msgstr "" #: ../lib/EB/Tools/Schema.pm:675 #, perl-brace-format msgid "Geen BTW tariefgroep voor code {code}" msgstr "" #: ../lib/EB/Tools/Schema.pm:748 #, perl-brace-format msgid "Aanmaken {sql}..." msgstr "" #: ../lib/EB/Tools/Schema.pm:807 #, perl-brace-format msgid "{pkg} Rekeningschema voor {db}" msgstr "" #: ../lib/EB/Tools/Schema.pm:812 #, perl-brace-format msgid "Aangemaakt door {pkg} {version} op {ts}" msgstr "" #: ../lib/EB/Tools/Schema.pm:956 #, perl-brace-format msgid "Einde {pkg} schema" msgstr "" #: ../lib/EB/Tools/Schema.pm:973 #, perl-brace-format msgid "HOOFDVERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGEN" msgstr "" #: ../lib/EB/Tools/Schema.pm:983 #, perl-brace-format msgid "VERDICHTING MOET TUSSEN {min} EN {max} (INCL.) LIGGEN" msgstr "" #: ../lib/EB/Tools/Schema.pm:1056 #, perl-brace-format msgid "{id} ZOU EEN BALANSREKENING MOETEN ZIJN" msgstr "" #: ../lib/EB/Tools/Schema.pm:1058 #, perl-brace-format msgid "{id} ZOU EEN RESULTAATREKENING MOETEN ZIJN" msgstr "" #: ../lib/EB/Tools/Schema.pm:1130 #, perl-brace-format msgid "Grootboekrekening {gbk} ({desc}) bestaat reeds" msgstr "" #: ../lib/EB/Tools/Schema.pm:1137 #, perl-brace-format msgid "Onbekende verdichting: {vrd}" msgstr "" #: ../lib/EB/Tools/Schema.pm:1147 msgid "Ongeldig type voor balansrekening (alleen D / C toegestaan)" msgstr "" #: ../lib/EB/Tools/Schema.pm:1157 msgid "Ongeldig type voor resultaatrekening (alleen K / O / N toegestaan)" msgstr "" #: ../lib/EB/Tools/Schema.pm:1174 #, perl-brace-format msgid "Fout tijdens het opslaan van grootboekrekening {gbk}" msgstr "" #: ../lib/EB/Tools/Schema.pm:1188 #, perl-brace-format msgid "Onbekende grootboekrekening: {gbk}" msgstr "" #: ../lib/EB/Tools/Schema.pm:1196 #, perl-brace-format msgid "" "{balres} {gbk} {debcrd}{fixed}{kstomz} ({desc}); Verdichting {vrd} " "({vdesc}); Hoofdverdichting {hvrd} ({hdesc})" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:37 msgid "GESTOPT: Er is al een administratie aangemaakt" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:41 msgid "GESTOPT: Er is al een administratie gedeeltelijk aangemaakt" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:66 msgid "Demo administratie" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:89 #, perl-brace-format msgid "Probleem met het benaderen van {file}: {err}" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:102 #, perl-brace-format msgid "Probleem met het aanmaken van {file}: Zip error" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:123 #, perl-brace-format msgid "Probleem met het aanmaken van {file}: {err}" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:135 #, perl-brace-format msgid "Probleem met het afsluiten van {file}: {err}" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:177 ../lib/EB/Wx/IniWiz.pm:148 msgid "Rekeningschema" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:499 ../lib/EB/Export.pm:142 #: ../lib/EB/Export.pm:161 msgid "Relaties" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:508 msgid "Opening" msgstr "" #: ../lib/EB/Tools/MiniAdm.pm:531 msgid "Mutaties" msgstr "" #: ../lib/EB/Tools/Einde.pm:55 #, perl-brace-format msgid "Fout tijdens het aanmaken van bestand {file}: {err}" msgstr "" #: ../lib/EB/Tools/Einde.pm:64 msgid "Geen boekjaar opgegeven" msgstr "" #: ../lib/EB/Tools/Einde.pm:74 #, perl-brace-format msgid "Boekjaar {bky} is definitief afgesloten" msgstr "" #: ../lib/EB/Tools/Einde.pm:77 #, perl-brace-format msgid "Boekjaar {bky} is reeds definitief afgesloten" msgstr "" #: ../lib/EB/Tools/Einde.pm:90 ../lib/EB/Report/Grootboek.pm:46 #: ../lib/EB/Report/Journal.pm:40 ../lib/EB/Report/Debcrd.pm:56 #: ../lib/EB/Report/Open.pm:41 msgid "Datum" msgstr "" #: ../lib/EB/Tools/Einde.pm:91 ../lib/EB/Report/Journal.pm:41 msgid "Boekstuk/Grootboek" msgstr "" #: ../lib/EB/Tools/Einde.pm:92 ../lib/EB/Report/Journal.pm:42 msgid "Rek" msgstr "" #: ../lib/EB/Tools/Einde.pm:93 ../lib/EB/Tools/Einde.pm:285 #: ../lib/EB/Export.pm:214 ../lib/EB/Report/Grootboek.pm:47 #: ../lib/EB/Report/Journal.pm:43 ../lib/EB/Report/Balres.pm:74 #: ../lib/EB/Report/Proof.pm:59 msgid "Debet" msgstr "" #: ../lib/EB/Tools/Einde.pm:94 ../lib/EB/Tools/Einde.pm:285 #: ../lib/EB/Export.pm:214 ../lib/EB/Report/Grootboek.pm:48 #: ../lib/EB/Report/Journal.pm:44 ../lib/EB/Report/Balres.pm:75 #: ../lib/EB/Report/Proof.pm:60 msgid "Credit" msgstr "" #: ../lib/EB/Tools/Einde.pm:95 ../lib/EB/Report/Journal.pm:45 msgid "Boekstuk/regel" msgstr "" #: ../lib/EB/Tools/Einde.pm:96 ../lib/EB/Report/Grootboek.pm:50 #: ../lib/EB/Report/Journal.pm:46 ../lib/EB/Report/Open.pm:40 msgid "Relatie" msgstr "" #: ../lib/EB/Tools/Einde.pm:123 ../lib/EB/Tools/Einde.pm:190 #: ../lib/EB/Report/Journal.pm:66 ../lib/EB/Wx/Shell/MainFrame.pm:260 msgid "Journaal" msgstr "" #: ../lib/EB/Tools/Einde.pm:124 ../lib/EB/Tools/Einde.pm:191 #: ../lib/EB/Tools/Einde.pm:243 #, perl-brace-format msgid "Afsluiting boekjaar {bky}" msgstr "" #: ../lib/EB/Tools/Einde.pm:129 ../lib/EB/Tools/Einde.pm:199 msgid "Systeemdagboek" msgstr "" #: ../lib/EB/Tools/Einde.pm:147 #, perl-brace-format msgid "Winst boekjaar {bky}" msgstr "" #: ../lib/EB/Tools/Einde.pm:148 #, perl-brace-format msgid "Verlies boekjaar {bky}" msgstr "" #: ../lib/EB/Tools/Einde.pm:243 ../lib/EB/Report/Journal.pm:187 #, perl-brace-format msgid "Totaal {pfx}" msgstr "" #: ../lib/EB/Tools/Einde.pm:253 #, perl-brace-format msgid "Eindbalans bij afsluiting boekjaar {bky}" msgstr "" #: ../lib/EB/Tools/Einde.pm:294 ../lib/EB/Export.pm:223 #, perl-brace-format msgid "Internal error -- unbalance {arg1} <> {arg2}" msgstr "" #: ../lib/EB/Tools/Einde.pm:298 ../lib/EB/Export.pm:227 #: ../lib/EB/Report/Grootboek.pm:192 ../lib/EB/Report/Debcrd.pm:256 #: ../lib/EB/Report/Debcrd.pm:270 msgid "Totaal" msgstr "" #: ../lib/EB/Tools/Einde.pm:302 #, perl-brace-format msgid "Openstaande posten bij afsluiting boekjaar {bky}" msgstr "" #: ../lib/EB/Tools/Opening.pm:50 ../lib/EB/Tools/Opening.pm:56 msgid "maand" msgstr "" #: ../lib/EB/Tools/Opening.pm:50 ../lib/EB/Tools/Opening.pm:55 msgid "kwartaal" msgstr "" #: ../lib/EB/Tools/Opening.pm:51 #, perl-brace-format msgid "Ongeldige BTW periode: {per}" msgstr "" #: ../lib/EB/Tools/Opening.pm:70 #, perl-brace-format msgid "Ongeldige openingsdatum: {date}" msgstr "" #: ../lib/EB/Tools/Opening.pm:83 #, perl-brace-format msgid "Ongeldige boekjaar-code: {year}" msgstr "" #: ../lib/EB/Tools/Opening.pm:84 #, perl-brace-format msgid "Boekjaar-code {year} bestaat al ({desc}" msgstr "" #: ../lib/EB/Tools/Opening.pm:96 ../lib/EB/Tools/Opening.pm:122 #: ../lib/EB/Tools/Opening.pm:209 #, perl-brace-format msgid "Ongeldig bedrag: {amount}" msgstr "" #: ../lib/EB/Tools/Opening.pm:111 #, perl-brace-format msgid "Grootboekrekening {acct} is geen balansrekening" msgstr "" #: ../lib/EB/Tools/Opening.pm:159 msgid "Relatietype moet \"deb\" of \"crd\" zijn" msgstr "" #: ../lib/EB/Tools/Opening.pm:165 #, perl-brace-format msgid "Ongeldige datum: {date}" msgstr "" #: ../lib/EB/Tools/Opening.pm:168 #, perl-brace-format msgid "Datum {date} valt niet vóór het boekjaar" msgstr "" #: ../lib/EB/Tools/Opening.pm:182 ../lib/EB/Tools/Opening.pm:205 #, perl-brace-format msgid "Onbekende relatie: {rel}" msgstr "" #: ../lib/EB/Tools/Opening.pm:228 msgid "De naam van de administratie is nog niet opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:230 msgid "De begindatum is nog niet opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:236 ../lib/EB/Tools/Opening.pm:540 #, perl-brace-format msgid "Er is geen boekjaarcode opgegeven, de waarde {val} wordt gebruikt" msgstr "" #: ../lib/EB/Tools/Opening.pm:238 #, perl-brace-format msgid "Boekjaarcode \"{code}\" is reeds in gebruik" msgstr "" #: ../lib/EB/Tools/Opening.pm:243 #, perl-brace-format msgid "Ongeldige boekjaarcode: {code}" msgstr "" #: ../lib/EB/Tools/Opening.pm:248 msgid "De BTW periode is nog niet opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:252 msgid "Het totaalbedrag van de openingsbalans is nog niet opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:278 msgid "De openingsbalans is nog niet opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:308 msgid "De openingsbalans is niet correct!" msgstr "" #: ../lib/EB/Tools/Opening.pm:309 #, perl-brace-format msgid "Opgegeven balanstotaal = {total}" msgstr "" #: ../lib/EB/Tools/Opening.pm:311 #, perl-brace-format msgid "Rekenkundig residu debet = {rdeb}, credit = {rcrd}" msgstr "" #: ../lib/EB/Tools/Opening.pm:315 ../lib/EB/Tools/Opening.pm:321 #, perl-brace-format msgid " (balanstotaal {total})" msgstr "" #: ../lib/EB/Tools/Opening.pm:317 #, perl-brace-format msgid "Boekhoudkundig residu debet = {rdeb}, credit = {rcrd}" msgstr "" #: ../lib/EB/Tools/Opening.pm:326 msgid "Er zijn geen openstaande posten opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:328 msgid "" "Er zijn openstaande posten opgegeven, maar geen corresponderende balansposten" msgstr "" #: ../lib/EB/Tools/Opening.pm:342 msgid "Deze administratie kent geen koppeling voor verkoopboekingen" msgstr "" #: ../lib/EB/Tools/Opening.pm:357 msgid "Deze administratie kent geen koppeling voor inkoopboekingen" msgstr "" #: ../lib/EB/Tools/Opening.pm:376 msgid "Boekingsdatum valt niet binnen het boekjaar" msgstr "" #: ../lib/EB/Tools/Opening.pm:399 ../lib/EB/Tools/Opening.pm:419 #, perl-brace-format msgid "Er is {amt} te weinig aan openstaande {dc} (rekening {acct}) opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:401 ../lib/EB/Tools/Opening.pm:406 #: ../lib/EB/DB.pm:108 ../lib/EB/DB.pm:112 ../lib/EB/Wx/Shell/MainFrame.pm:265 msgid "Debiteuren" msgstr "" #: ../lib/EB/Tools/Opening.pm:404 ../lib/EB/Tools/Opening.pm:414 #, perl-brace-format msgid "Er is {amt} te veel aan openstaande {dc} (rekening {acct}) opgegeven" msgstr "" #: ../lib/EB/Tools/Opening.pm:416 ../lib/EB/Tools/Opening.pm:421 #: ../lib/EB/DB.pm:120 ../lib/EB/DB.pm:124 ../lib/EB/Wx/Shell/MainFrame.pm:264 msgid "Crediteuren" msgstr "" #: ../lib/EB/Tools/Opening.pm:428 msgid "DE OPENING IS NIET UITGEVOERD!" msgstr "" #: ../lib/EB/Tools/Opening.pm:527 #, perl-brace-format msgid "Begindatum {year} komt in de toekomst te liggen" msgstr "" #: ../lib/EB/Tools/Opening.pm:536 msgid "Er is geen nieuwe BTW periode opgegeven, deze blijft ongewijzigd" msgstr "" #: ../lib/EB/Tools/Opening.pm:543 msgid "HET NIEUWE BOEKJAAR IS NIET GEOPEND!" msgstr "" #: ../lib/EB/Tools/Opening.pm:580 msgid "" "Het openen van een administratie kan slechts éénmaal gebeuren, vóór\n" "het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar\n" "kan te allen tijde worden uitgevoerd, uiteraard maar één keer per\n" "boekjaar.\n" "\n" "Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met\n" "de opdracht \"adm_open\". Zolang deze laatste opdracht niet is gegeven\n" "blijft de administratie ongewijzigd. Alle benodigde opdrachten moeten\n" "dan ook in één enkele EekBoek shell sessie worden afgehandeld.\n" "\n" "Mogelijke opdrachten voor openen van een boekjaar:\n" "\n" " adm_btwperiode [ jaar | kwartaal | maand ]\n" " adm_boekjaarcode \n" "\t\tEen code van max 4 letters en/of cijfers waarmee het\n" "\t\tboekjaar kan worden geïdentificeerd.\n" "\t\tStandaard wordt het jaartal van het boekjaar genomen.\n" " adm_open\n" "\t\tAlle informatie die met de bovenstaande opdrachten is\n" "\t\tingevoerd, wordt verwerkt.\n" "\n" "Opdrachten voor het openen van een administratie:\n" "\n" " adm_naam \"Naam van de administratie\"\n" " adm_btwperiode [ jaar | kwartaal | maand ]\n" " adm_begindatum \n" "\t\tEen administratie loopt altijd van 1 januari tot en\n" "\t\tmet 31 december van een kalenderjaar.\n" " adm_boekjaarcode \n" "\t\tEen code van max 4 letters en/of cijfers waarmee het\n" "\t\tboekjaar kan worden geïdentificeerd.\n" "\t\tStandaard wordt het jaartal van het boekjaar genomen.\n" "\t\tDe boekjaarcode is alleen relevant indien er meerdere\n" "\t\tboekjaren in één administratie worden bijgehouden.\n" " adm_balanstotaal \n" "\t\tAls een balanstotaal is opgegeven, moeten er ook\n" "\t\topeningsbalansboekingen worden uitgevoerd met een of\n" "\t\tmeer adm_balans opdrachten.\n" " adm_balans \n" "\t\tDe debet en credit boekingen moeten uiteindelijk\n" "\t\tallebei gelijk zijn aan het opgegeven balanstotaal.\n" "\t\tIndien er een bedrag is opgegeven voor de balansrekening\n" "\t\tCrediteuren of Debiteuren, dan moet er voor dit bedrag\n" "\t\took openstaande posten worden ingevoerd met een of\n" "\t\tmeer adm_relatie opdrachten.\n" " adm_relatie \n" "\t\tInvoeren van een openstaande post uit het voorgaande\n" "\t\tboekjaar. Het moet volledig zijn, dus\n" "\t\t::.\n" " adm_open\n" "\t\tAlle informatie die met de bovenstaande opdrachten is\n" "\t\tingevoerd, wordt verwerkt.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:637 msgid "" "Specifeer de BTW aangifteperiode voor het nieuw te openen jaar.\n" "\n" " adm_btwperiode [ jaar | kwartaal | maand ]\n" "\n" "Deze opdracht kan worden gebruikt bij het openen van een boekjaar.\n" "Zie \"help adm_open\" voor meer informatie.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:648 msgid "" "Specificeert de boekjaarcode voor het nieuw te openen jaar.\n" "\n" " adm_boekjaarcode \n" "\n" "De boekjaarcode telt maximaal 4 letters en/of cijfers.\n" "Standaard wordt het jaartal van het te openen boekjaar genomen.\n" "De boekjaarcode is alleen belangrijk indien er meerdere boekjaren in één\n" "administratie worden bijgehouden.\n" "\n" "Deze opdracht kan worden gebruikt bij het openen van een boekjaar.\n" "Zie \"help adm_open\" voor meer informatie.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:664 msgid "" "Specificeert de naam van de administratie, te gebruiken voor rapportages.\n" "\n" " adm_naam \"Naam van de administratie\"\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:675 msgid "" "Specificeert de begindatum van de administratie.\n" "Een administratie loopt altijd van 1 januari tot en met 31 december\n" "van een kalenderjaar. Daarom moet als begindatum een jaartal worden\n" "opgegeven.\n" "\n" " adm_begindatum \n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:689 msgid "" "Specificeert het balanstotaal voor de in te voeren openingbalans.\n" "\n" " adm_balanstotaal \n" "\n" "Het balanstotaal is de zowel de som van alle debet-posten als de som\n" "van alle credit-posten van de openingsbalans. Als een balanstotaal is\n" "opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met\n" "een of meer adm_balans opdrachten. Zie ook \"help adm_balans\".\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:705 msgid "" "Specificeert een balanspost voor de openingsbalans.\n" "\n" " adm_balans \n" "\n" "De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn\n" "aan het opgegeven balanstotaal.\n" "\n" "Indien er een bedrag is opgegeven voor de balansrekening Crediteuren\n" "of voor Debiteuren, dan moeten er ook openstaande posten voor in\n" "totaal dit bedrag worden ingevoerd met een of meer adm_relatie\n" "opdrachten. Zie ook \"help adm_relatie\".\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:724 msgid "" "Specificeert een openstaande post uit een voorgaand boekjaar.\n" "\n" " adm_relatie \n" "\n" "Het moet volledig zijn, dus ::.\n" "\n" "Indien er voor de openingsbalans een bedrag is opgegeven voor de\n" "balansrekening Crediteuren of voor Debiteuren, dan moeten er ook\n" "openstaande posten voor in totaal dit bedrag worden ingevoerd. Zie ook\n" "\"help adm_balans\".\n" "\n" "Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe\n" "administratie. Zie \"help adm_open\" voor meer informatie.\n" msgstr "" #: ../lib/EB/Tools/Opening.pm:744 ../lib/EB/Shell.pm:1625 #: ../lib/EB/Booking.pm:35 ../lib/EB/Report/BTWAangifte.pm:45 msgid "De administratie is nog niet geopend" msgstr "" #: ../lib/EB/Tools/Opening.pm:747 ../lib/EB/Shell.pm:1640 msgid "De administratie is reeds in gebruik" msgstr "" #: ../lib/EB/Tools/SQLEngine.pm:60 #, perl-brace-format msgid "SQLEngine: No callback for {cb}" msgstr "" #: ../lib/EB/Tools/SQLEngine.pm:167 #, perl-brace-format msgid "Incomplete SQL opdracht: {sql}" msgstr "" #: ../lib/EB/Config/Data.pm:21 msgid "Bedrijfsgegevens" msgstr "" #: ../lib/EB/Config/Data.pm:25 msgid "Administratienummer" msgstr "" #: ../lib/EB/Config/Data.pm:26 msgid "Adres" msgstr "" #: ../lib/EB/Config/Data.pm:27 msgid "Postcode" msgstr "" #: ../lib/EB/Config/Data.pm:28 msgid "Plaats" msgstr "" #: ../lib/EB/Config/Data.pm:29 msgid "Fiscaal nummer" msgstr "" #: ../lib/EB/Config/Data.pm:33 msgid "Algemeen" msgstr "" #: ../lib/EB/Config/Data.pm:36 msgid "Folder voor administraties" msgstr "" #: ../lib/EB/Config/Data.pm:37 msgid "Forceer wizard" msgstr "" #: ../lib/EB/Config/Data.pm:41 ../lib/EB/Wx/Shell/PreferencesDialog.pm:76 msgid "Voorkeursinstellingen" msgstr "" #: ../lib/EB/Config/Data.pm:44 msgid "Toon journaalpost na elke boeking" msgstr "" #: ../lib/EB/Config/Data.pm:51 msgid "Driver" msgstr "" #: ../lib/EB/Config/Data.pm:55 msgid "Gebruikersnaam" msgstr "" #: ../lib/EB/Config/Data.pm:56 msgid "Toegangscode" msgstr "" #: ../lib/EB/Config/Data.pm:57 msgid "Server systeem" msgstr "" #: ../lib/EB/Config/Data.pm:58 msgid "Server poort" msgstr "" #: ../lib/EB/Config/Data.pm:61 msgid "Strategie" msgstr "" #: ../lib/EB/Config/Data.pm:64 msgid "Afrondingsmethode" msgstr "" #: ../lib/EB/Config/Data.pm:68 msgid "Meervoudig afboeken" msgstr "" #: ../lib/EB/Config/Data.pm:69 msgid "BTW correcties" msgstr "" #: ../lib/EB/Config/Data.pm:72 msgid "Shell" msgstr "" #: ../lib/EB/Config/Data.pm:75 msgid "Prompt" msgstr "" #: ../lib/EB/Config/Data.pm:76 msgid "Eigen uitbreidingen" msgstr "" #: ../lib/EB/Config/Data.pm:79 msgid "Formaten" msgstr "" #: ../lib/EB/Config/Data.pm:82 msgid "Getalformaat" msgstr "" #: ../lib/EB/Config/Data.pm:89 msgid "Datumformaat" msgstr "" #: ../lib/EB/Config/Data.pm:95 msgid "Tekstrapporten" msgstr "" #: ../lib/EB/Config/Data.pm:98 msgid "Kolombreedte voor getallen" msgstr "" #: ../lib/EB/Config/Data.pm:102 msgid "HTML rapporten" msgstr "" #: ../lib/EB/Config/Data.pm:105 msgid "Style sheets" msgstr "" #: ../lib/EB/Config/Data.pm:108 msgid "CSV rapporten" msgstr "" #: ../lib/EB/Config/Data.pm:111 msgid "Scheidingsteken" msgstr "" #: ../lib/EB/Config/Data.pm:117 msgid "Beveiliging" msgstr "" #: ../lib/EB/Config/Data.pm:120 msgid "Beveiliging voor MS Vista uitschakelen" msgstr "" #: ../lib/EB/Shell.pm:93 msgid "Openstaande transactie is teruggedraaid" msgstr "" #: ../lib/EB/Shell.pm:110 #, perl-brace-format msgid "Pas op! Boekjaar {bky} is nog niet afgesloten." msgstr "" #: ../lib/EB/Shell.pm:300 #, perl-brace-format msgid "Toevoegen boekstuk in een dagboek van type {type}" msgstr "" #: ../lib/EB/Shell.pm:305 msgid "" " [:nr] [ ] \n" "\n" "gevolgd door een of meer:\n" "\n" " \n" "\n" "Controle van het totale boekstukbedrag kan met de optie --totaal=.\n" "De laatste mag worden weggelaten.\n" msgstr "" #: ../lib/EB/Shell.pm:317 msgid "" " [:nr] [ ] \n" "\n" "gevolgd door een of meer\n" "\n" " \n" "\n" "Controle van het totale boekstukbedrag kan met de optie --totaal=.\n" "De laatste mag worden weggelaten.\n" msgstr "" #: ../lib/EB/Shell.pm:331 msgid "" " [:nr] [ ] \n" "\n" "gevolgd door een of meer:\n" "\n" " crd [ ] \t\t\t(betaling van crediteur)\n" " deb [ ] \t\t\t(betaling van debiteur)\n" " std [ ] \t(vrije boeking)\n" "\n" "Controle van het eindsaldo kan met de optie --saldo=.\n" "Controle van het totale boekstukbedrag kan met de optie --totaal=.\n" "Voor deelbetalingen of betalingen met afwijkend bedrag kan in plaats van de\n" " het boekstuknummer worden opgegeven.\n" msgstr "" #: ../lib/EB/Shell.pm:350 #, perl-brace-format msgid "Opdracht \"{cmd}\" is niet beschikbaar." msgstr "" #: ../lib/EB/Shell.pm:360 msgid "Te weinig argumenten voor deze opdracht" msgstr "" #: ../lib/EB/Shell.pm:361 ../lib/EB/Shell.pm:643 ../lib/EB/Shell.pm:807 msgid "Te veel argumenten voor deze opdracht" msgstr "" #: ../lib/EB/Shell.pm:370 ../lib/EB/Shell.pm:392 ../lib/EB/Shell.pm:406 #: ../lib/EB/Shell.pm:420 msgid "aan" msgstr "" #: ../lib/EB/Shell.pm:371 ../lib/EB/Shell.pm:392 ../lib/EB/Shell.pm:406 #: ../lib/EB/Shell.pm:420 msgid "uit" msgstr "" #: ../lib/EB/Shell.pm:392 #, perl-brace-format msgid "SQL Trace: {state}" msgstr "" #: ../lib/EB/Shell.pm:406 #, perl-brace-format msgid "Journal: {state}" msgstr "" #: ../lib/EB/Shell.pm:420 #, perl-brace-format msgid "Bevestiging: {state}" msgstr "" #: ../lib/EB/Shell.pm:426 #, perl-brace-format msgid "Database: {db}" msgstr "" #: ../lib/EB/Shell.pm:431 msgid "" "Toont de naam van de huidige database.\n" "\n" " database\n" msgstr "" #: ../lib/EB/Shell.pm:458 #, perl-brace-format msgid "Onbekend of verkeerd dagboek: {dbk} [{type}]" msgstr "" #: ../lib/EB/Shell.pm:475 msgid "cmo:boeking:boekstuk|nr" msgstr "" #: ../lib/EB/Shell.pm:476 msgid "cmo:boeking:boekjaar" msgstr "" #: ../lib/EB/Shell.pm:477 msgid "cmo:boeking:journal|journaal" msgstr "" #: ../lib/EB/Shell.pm:480 msgid "cmo:boeking:confirm" msgstr "" #: ../lib/EB/Shell.pm:483 msgid "cmo:boeking:saldo" msgstr "" #: ../lib/EB/Shell.pm:484 msgid "cmo:boeking:beginsaldo" msgstr "" #: ../lib/EB/Shell.pm:490 #, perl-brace-format msgid "Geboekt: {bsk}" msgstr "" #: ../lib/EB/Shell.pm:507 msgid "cmo:journaal:detail|details" msgstr "" #: ../lib/EB/Shell.pm:508 msgid "cmo:journaal:totaal" msgstr "" #: ../lib/EB/Shell.pm:509 msgid "cmo:journaal:boekjaar" msgstr "" #: ../lib/EB/Shell.pm:510 msgid "cmo:journaal:periode" msgstr "" #: ../lib/EB/Shell.pm:524 msgid "" "Overzicht journaalposten.\n" "\n" " journaal all\t\tAlle posten\n" " journaal \t\tAlleen boekstuknummer met dit id\n" " journaal \tAlle journaalposten van dit dagboek\n" " journaal : Boekstuk van dit dagboek\n" " journaal\t\tJournaalposten van de laatste boeking\n" "\n" "Opties\n" "\n" " --[no]detail\t\tMate van detail, standaard is met details\n" " --totaal\t\tAlleen het totaal (detail = 0)\n" " --periode=XXX\t\tAlleen over deze periode\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:563 msgid "Openingsbalans kent geen einddatum" msgstr "" #: ../lib/EB/Shell.pm:573 msgid "" "Toont de balansrekening.\n" "\n" "Opties:\n" " \t\tBalans op grootboekrekening\n" " --verdicht\t\tVerdicht, gedetailleerd\n" " --detail=\t\tVerdicht, mate van detail = 0, 1 of 2\n" " --per=\t\tSelecteer einddatum\n" " --boekjaar=\tSelecteer boekjaar\n" " --opening\t\tToon openingsbalans\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:612 msgid "" "Toont de resultatenrekening.\n" "\n" "Opties:\n" " \t\tOverzicht op grootboekrekening\n" " --verdicht\t\tVerdicht, gedetailleerd\n" " --detail=\t\tVerdicht, mate van detail = 0,1,2\n" " --periode=\tSelecteer periode\n" " --boekjaar=\tSelecteer boekjaar\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:650 msgid "" "Toont de Proef- en Saldibalans.\n" "\n" "Opties:\n" " \t\tProef- en Saldibalans op grootboekrekening\n" " --verdicht\t\tVerdicht, gedetailleerd (hetzelfde als --detail=2)\n" " --detail=\t\tVerdicht, mate van detail = 0,1,2\n" " --per=\t\tSelecteer einddatum\n" " --boekjaar=\tSelecteer boekjaar\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:727 #, perl-brace-format msgid "Ongeldig rekeningnummer: {acct}" msgstr "" #: ../lib/EB/Shell.pm:741 msgid "" "Toont het Grootboek, of een selectie daaruit.\n" "\n" " grootboek [ ... ]\n" "\n" "Opties:\n" "\n" " --detail=\t\tMate van detail, =0,1,2 (standaard is 2)\n" " --periode=\tAlleen over deze periode\n" "\n" "Naast rekeningnummers kunnen ook nummers van verdichtingen en\n" "hoofdverdichtingen worden opgegeven.\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:765 msgid "Nr" msgstr "" #: ../lib/EB/Shell.pm:765 msgid "Type" msgstr "" #: ../lib/EB/Shell.pm:765 msgid "Rekening" msgstr "" #: ../lib/EB/Shell.pm:768 msgid "n.v.t." msgstr "" #: ../lib/EB/Shell.pm:776 msgid "" "Toont een lijstje van beschikbare dagboeken.\n" "\n" " dagboeken\n" msgstr "" #: ../lib/EB/Shell.pm:810 msgid "Deze administratie voert geen BTW" msgstr "" #: ../lib/EB/Shell.pm:818 msgid "" "Toont de BTW aangifte.\n" "\n" " btwaangifte [ ] [ ]\n" "\n" "Aangifteperiode kan zijn:\n" "\n" " j jaar\t\tHet gehele jaar\n" " k1 k2 k3 k4\t\t1e/2e/3e/4e kwartaal (ook: q1, ...)\n" " 1 2 3 ...\t\tMaand (op nummer)\n" " jan feb ...\t\tMaand (korte naam)\n" " januari ...\t\tMaand (lange naam)\n" "\n" "Standaard is de eerstvolgende periode waarover nog geen aangifte is\n" "gedaan.\n" "\n" "Opties:\n" "\n" " --definitief\t\tDe BTW periode wordt afgesloten. Er zijn geen\n" "\t\t\tboekingen in deze periode meer mogelijk.\n" " --periode=\tSelecteer aangifteperiode. Dit kan niet samen\n" "\t\t\tmet --boekjaar, en evenmin met de bovenvermelde\n" "\t\t\tmethode van periode-specificatie.\n" " --boekjaar=\tSelecteer boekjaar\n" " --noreport\t\tGeen rapportage. Dit is enkel zinvol samen\n" "\t\t\tmet --definitief om de afgesloten BTW periode\n" "\t\t\taan te passen.\n" " --noround\t\tAlle bedragen zonder af te ronden.\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:872 msgid "" "Toont een overzicht van boekingen op debiteuren.\n" "\n" " debiteuren [ ] [ ... ]\n" "\n" "Opties:\n" "\n" " --periode \tPeriode\n" " --boekjaar=\tSelecteer boekjaar\n" " --openstaand\t\tAlleen met openstaande posten\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:908 msgid "" "Toont een overzicht van boekingen op crediteuren.\n" "\n" " crediteuren [ ] [ ... ]\n" "\n" "Opties:\n" "\n" " --periode=\tPeriode\n" " --boekjaar=\tSelecteer boekjaar\n" " --openstaand\t\tAlleen met openstaande posten\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:946 msgid "" "Toont een overzicht van openstaande posten.\n" "\n" " openstaand [ ] [ ]\n" "\n" "Opties:\n" "\n" " --per=\t\tEinddatum\n" " --boekjaar=\tSelecteer boekjaar\n" " --deb --debiteuren\tAlleen debiteuren\n" " --crd --crediteuren\tAlleen crediteuren\n" "\n" "Zie verder \"help rapporten\" voor algemene informatie over aan te maken\n" "rapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:964 msgid "" "Alle rapport-producerende opdrachten kennen de volgende opties:\n" "\n" " --per=\t\tDe einddatum voor de rapportage.\n" "\t\t\t(Niet voor elke opdracht relevant.)\n" "\t\t\tZie \"help periodes\" voor details.\n" " --periode=\tDe periode waarover de rapportage moet\n" "\t\t\tplaatsvinden. (Niet voor elke opdracht relevant.)\n" "\t\t\tZie \"help periodes\" voor details.\n" " --output=\tProduceer het rapport in dit bestand\n" "\t\t\tUitvoertype is afhankelijk van bestandsextensie,\n" "\t\t\tbv. xx.html levert HTML, xx.txt een tekstbestand,\n" "\t\t\txx.csv een CSV, etc.\n" " --gen-\t\tForceer uitvoertype (html, csv, text, ...)\n" "\t\t\tAfhankelijk van de beschikbare uitvoertypes zijn\n" "\t\t\took de kortere opties --html, --csv en --text\n" "\t\t\tmogelijk.\n" "\t\t\t(Let op: --gen-XXX, niet --gen=XXX)\n" " --page=\t\tPaginagrootte voor tekstrapporten.\n" msgstr "" #: ../lib/EB/Shell.pm:987 msgid "" "De volgende periode-aanduidingen zijn mogelijk. Indien het jaartal " "ontbreekt,\n" "wordt het huidige boekjaar verondersteld.\n" "\n" " 2005-04-01 - 2005-07-31\n" " 01-04-2005 - 31-07-2005\n" " 01-04 - 31-07-2005\n" " 01-04 - 31-07\n" " 1 april 2005 - 31 juli 2005 (en varianten)\n" " 1 apr 2005 - 31 jul 2005 (en varianten)\n" " apr - jul\n" " k2 (tweede kwartaal)\n" " april 2003 (01-04-2003 - 30-04-2003)\n" " april (01-04 - 30-04 boekjaar)\n" " m4 (vierde maand)\n" " jaar (gehele boekjaar)\n" msgstr "" #: ../lib/EB/Shell.pm:1025 #, perl-brace-format msgid "Ongeldig of ontbrekend rekeningnummer: {x}" msgstr "" #: ../lib/EB/Shell.pm:1031 #, perl-brace-format msgid "Ongeldige of ontbrekende type specificatie: {x}" msgstr "" #: ../lib/EB/Shell.pm:1036 #, perl-brace-format msgid "Ongeldige of ontbrekende verdichting: {x}" msgstr "" #: ../lib/EB/Shell.pm:1052 msgid "" "Onderhoud van het schema. Deze opdracht kent sub-opdrachten:\n" "\n" " schema [ ] \n" "\n" "Aanmaken grootboekrekening\n" "\n" " schema gbk [ ]\n" "\n" " \t\tde gewenste grootboekrekening\n" " \t\tD/C voor Debet / Credit\n" "\t\t\tK/O/N voor Kosten / Omzet / Neutraal\n" "\t\t\tEventueel gevolgd door ! als deze \n" "\t\t\tbalansrekening vast staat aan één kant\n" " \tDe omschrijving van deze grootboekrekening\n" " \tDe verdichting waaronder deze rekening valt\n" "\n" " Wanneer enkel een nummer wordt opgegeven dan worden de gegevens\n" " van de betreffende grootboekrekening getoond.\n" msgstr "" #: ../lib/EB/Shell.pm:1083 ../lib/EB/Export.pm:154 msgid "cmo:relatie:dagboek" msgstr "" #: ../lib/EB/Shell.pm:1085 ../lib/EB/Export.pm:155 msgid "cmo:relatie:btw" msgstr "" #: ../lib/EB/Shell.pm:1090 msgid "Ongeldig aantal argumenten voor deze opdracht" msgstr "" #: ../lib/EB/Shell.pm:1103 msgid "" "Aanmaken een of meer nieuwe relaties.\n" "\n" " relatie [ ] { } ...\n" "\n" "Opties:\n" "\n" " --dagboek=\tSelecteer dagboek voor deze relatie\n" msgstr "" #: ../lib/EB/Shell.pm:1113 msgid "" " --btw=\t\tBTW type: normaal, verlegd, intra, extra\n" "\n" "*** BTW type 'verlegd' wordt nog niet ondersteund ***\n" "*** BTW type 'intra' wordt nog niet geheel ondersteund ***\n" msgstr "" #: ../lib/EB/Shell.pm:1149 msgid "Opties --dir, --file en --xaf sluiten elkaar uit" msgstr "" #: ../lib/EB/Shell.pm:1153 msgid "Specificeer --dir, --file of --xaf" msgstr "" #: ../lib/EB/Shell.pm:1168 msgid "Optie --boekjaar wordt niet ondersteund door deze export" msgstr "" #: ../lib/EB/Shell.pm:1181 msgid "" "Exporteert de complete administratie.\n" "\n" " export [ ]\n" "\n" "Opties:\n" "\n" " --file=\tSelecteer uitvoerbestand\n" " --dir=\tSelecteer uitvoerdirectory\n" " --xaf=\tExport XML Auditfile Financieel\n" " --boekjaar=\tSelecteer boekjaar (alleen met --xaf)\n" "\n" "Er moet een --file, --dir of een --xaf optie worden opgegeven.\n" "De XAF export exporteert altijd één enkel boekjaar. Voor de andere\n" "exports wordt altijd de gehele administratie geëxporteerd.\n" "Eventueel bestaande files worden overschreven.\n" msgstr "" #: ../lib/EB/Shell.pm:1213 msgid "Opties --dir en --file sluiten elkaar uit" msgstr "" #: ../lib/EB/Shell.pm:1217 msgid "Specificeer --dir of --file" msgstr "" #: ../lib/EB/Shell.pm:1224 #, perl-brace-format msgid "" "Database type {drv} ondersteunt niet het import commando. Gebruik de --" "import command line optie." msgstr "" #: ../lib/EB/Shell.pm:1237 msgid "" "Importeert een complete, geëxporteerde administratie.\n" "\n" " import [ ]\n" "\n" "Opties:\n" "\n" " --file=\tSelecteer exportbestand\n" " --dir=\tSelecteer exportdirectory\n" "\n" "Er moet of een --file of een --dir optie worden opgegeven.\n" "\n" "LET OP: IMPORT VERVANGT DE COMPLETE ADMINISTRATIE!\n" "\n" "Deze opdracht wordt niet door alle database systemen ondersteund.\n" "Deze opdracht is alleen in de command line versie beschikbaar.\n" msgstr "" #: ../lib/EB/Shell.pm:1279 msgid "" "Leest opdrachten uit een bestand.\n" "\n" " include [ ] \n" "\n" "Opties:\n" "\n" " --optioneel\t\tHet bestand mag ontbreken. De opdracht\n" "\t\t\twordt dan verder genegeerd.\n" msgstr "" #: ../lib/EB/Shell.pm:1296 #, perl-brace-format msgid "Onbekend boekjaar: {code}" msgstr "" #: ../lib/EB/Shell.pm:1299 #, perl-brace-format msgid "Boekjaar voor deze sessie: {bky} ({desc})" msgstr "" #: ../lib/EB/Shell.pm:1304 msgid "" "Gebruik voor navolgende opdrachten het opgegeven boekjaar.\n" "\n" " boekjaar \n" msgstr "" #: ../lib/EB/Shell.pm:1314 msgid "Deze opdracht is vervallen. Gebruik in plaats daarvan \"export\".\n" msgstr "" #: ../lib/EB/Shell.pm:1333 ../lib/EB/Shell.pm:1391 msgid "Gaarne een boekstuk" msgstr "" #: ../lib/EB/Shell.pm:1353 msgid "" "Verwijdert een boekstuk. Het boekstuk mag niet in gebruik zijn.\n" "\n" " verwijder [ ] \n" "\n" "Opties:\n" "\n" " --boekjaar=\tSelekteer boekjaar\n" "\n" "Het verwijderde boekstuk wordt in de commando-historie geplaatst.\n" "Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele\n" "wijziging opnieuw ingevoerd.\n" msgstr "" #: ../lib/EB/Shell.pm:1408 msgid "" "Toont een boekstuk in tekst- of commando-vorm.\n" "\n" " toon [ ] \n" "\n" "Opties:\n" "\n" " --boekjaar=\tSelekteer boekjaar\n" " --verbose\t\tToon in uitgebreide (tekst) vorm\n" " --btw\t\t\tVermeld altijd BTW codes\n" " --bsknr\t\tVermeld altijd het boekstuknummer (default)\n" "\n" "Het getoonde boekstuk wordt in de commando-historie geplaatst.\n" "Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele\n" "wijziging opnieuw ingevoerd.\n" msgstr "" #: ../lib/EB/Shell.pm:1438 msgid "Opties \"definitief\" en \"verwijder\" sluiten elkaar uit" msgstr "" #: ../lib/EB/Shell.pm:1447 msgid "" "Sluit het boekjaar af. De BTW rekeningen worden afgeboekt, en de\n" "winst of het verlies wordt verrekend met de daartoe aangewezen\n" "balansrekening.\n" "\n" "Deze opdracht genereert twee rapporten: een journaal van de\n" "afboekingen en een overzicht van eventuele openstaande posten. Indien\n" "gewenst kan een bestand worden aangemaakt met openingsopdrachten voor\n" "het volgende boekjaar.\n" "\n" " jaareinde [ ]\n" "\n" "Opties:\n" "\n" " --boekjaar=\tSluit het opgegeven boekjaar af.\n" " --definitief\t\tSluit het boekjaar definitief af. Er zijn\n" "\t\t\tdan geen boekingen meer mogelijk.\n" " --verwijder\t\tVerwijder een niet-definitieve jaarafsluiting.\n" " --eb=\tSchrijf openingsopdrachten in dit bestand.\n" msgstr "" #: ../lib/EB/Shell.pm:1477 msgid "" "Voer een SQL opdracht uit via de database driver. Met het gebruik\n" "hiervan vervalt alle garantie op correcte financiële resultaten.\n" "\n" " sql [ ]\n" "\n" "Deze opdracht is alleen in de command line versie beschikbaar.\n" msgstr "" #: ../lib/EB/Shell.pm:1605 #, perl-brace-format msgid "Ongeldige periode-aanduiding: {per}" msgstr "" #: ../lib/EB/Shell.pm:1616 #, perl-brace-format msgid "Ongeldige datum: {per}" msgstr "" #: ../lib/EB/Shell.pm:1628 msgid "De administratie is reeds geopend" msgstr "" #: ../lib/EB/Shell.pm:1637 msgid "De administratie is nog niet in gebruik" msgstr "" #: ../lib/EB/Booking.pm:51 #, perl-brace-format msgid "Boekstuk {bsk} is reeds in gebruik" msgstr "" #: ../lib/EB/Booking.pm:64 msgid "Het boekstuknummer moet een geheel getal (volgnummer) zijn" msgstr "" #: ../lib/EB/Booking.pm:73 msgid "" "Boekstukken in voorafgaande boekjaren moeten verplicht worden voorzien van " "een boekstuknummer" msgstr "" #: ../lib/EB/Booking.pm:95 #, perl-brace-format msgid "Boekjaar {code} is gesloten, er kan niet meer in worden gewijzigd" msgstr "" #: ../lib/EB/Booking.pm:103 msgid "De administratie is gesloten en kan niet meer worden gewijzigd" msgstr "" #: ../lib/EB/Booking.pm:115 #, perl-brace-format msgid "De boekingsdatum {date} valt vóór aanvang van dit boekjaar" msgstr "" #: ../lib/EB/Booking.pm:120 #, perl-brace-format msgid "De boekingsdatum {date} valt na het einde van dit boekjaar" msgstr "" #: ../lib/EB/Booking.pm:153 #, perl-brace-format msgid "BTW specificatie {spec}: Gebruik K of O in plaats van I of V" msgstr "" #: ../lib/EB/Booking.pm:183 ../lib/EB/Booking.pm:199 #, perl-brace-format msgid "" "BTW aanduiding \"{spec}\" kent meerdere tariefcodes: {list} (code {code} " "\"{desc}\" is gebruikt)" msgstr "" #: ../lib/EB/Booking.pm:333 #, perl-brace-format msgid "BTW rek. nr. {acct}, correctie van {amt} uitgevoerd" msgstr "" #: ../lib/EB/Export.pm:35 #, perl-brace-format msgid "Fout bij aanmaken directory {dir}: {err}" msgstr "" #: ../lib/EB/Export.pm:51 msgid "Module Archive::Zip, nodig voor export naar file, is niet beschikbaar" msgstr "" #: ../lib/EB/Export.pm:54 #, perl-brace-format msgid "Export van dataset {db} aangemaakt door {id} op {date}" msgstr "" #: ../lib/EB/Export.pm:58 #, perl-brace-format msgid "Omschrijving: {desc}" msgstr "" #: ../lib/EB/Export.pm:81 #, perl-brace-format msgid "Fout {status} tijdens het aanmaken van exportbestand {name}" msgstr "" #: ../lib/EB/Export.pm:96 msgid "Geen geldige UTF-8 tekens for ZIP element" msgstr "" #: ../lib/EB/Export.pm:108 #, perl-brace-format msgid "Fout bij aanmaken bestand {file}: {err}" msgstr "" #: ../lib/EB/Export.pm:111 #, perl-brace-format msgid "Fout bij schrijven bestand {file}: {err}" msgstr "" #: ../lib/EB/Export.pm:114 #, perl-brace-format msgid "Fout bij afsluiten bestand {file}: {err}" msgstr "" #: ../lib/EB/Export.pm:141 ../lib/EB/Export.pm:171 ../lib/EB/Export.pm:264 #, perl-brace-format msgid "{what} voor administratie {adm}" msgstr "" #: ../lib/EB/Export.pm:143 ../lib/EB/Export.pm:173 ../lib/EB/Export.pm:266 #, perl-brace-format msgid "Aangemaakt door {id} op {date}" msgstr "" #: ../lib/EB/Export.pm:161 ../lib/EB/Export.pm:257 ../lib/EB/Export.pm:353 #, perl-brace-format msgid "Einde {what}" msgstr "" #: ../lib/EB/Export.pm:172 ../lib/EB/Export.pm:257 ../lib/EB/Wx/IniWiz.pm:150 msgid "Openingsgegevens" msgstr "" #: ../lib/EB/Export.pm:191 ../lib/EB/Report/Balres.pm:94 #: ../lib/EB/Report/Balres.pm:99 msgid "Openingsbalans" msgstr "" #: ../lib/EB/Export.pm:237 ../lib/EB/Report/Open.pm:81 #: ../lib/EB/Wx/Shell/MainFrame.pm:262 msgid "Openstaande posten" msgstr "" #: ../lib/EB/Export.pm:256 msgid "Openen van de administratie" msgstr "" #: ../lib/EB/Export.pm:265 ../lib/EB/Export.pm:353 msgid "Boekingen" msgstr "" #: ../lib/EB/Export.pm:284 ../lib/EB/Export.pm:294 msgid "cmo:jaareinde:boekjaar" msgstr "" #: ../lib/EB/Export.pm:285 msgid "cmo:jaareinde:definitief" msgstr "" #: ../lib/EB/Export.pm:305 msgid "cmo:btwaangifte:periode" msgstr "" #: ../lib/EB/Export.pm:307 msgid "cmo:btwaangifte:definitief" msgstr "" #: ../lib/EB/Export.pm:308 msgid "cmo:btwaangifte:noreport" msgstr "" #: ../lib/EB/Export.pm:319 msgid "Openen nieuw boekjaar" msgstr "" #: ../lib/EB/Report/Grootboek.pm:44 msgid "GrBk" msgstr "" #: ../lib/EB/Report/Grootboek.pm:45 msgid "Grootboek/Boekstuk" msgstr "" #: ../lib/EB/Report/Grootboek.pm:49 msgid "BoekstukNr" msgstr "" #: ../lib/EB/Report/Grootboek.pm:61 msgid "Grootboek" msgstr "" #: ../lib/EB/Report/Grootboek.pm:109 msgid "Beginsaldo" msgstr "" #: ../lib/EB/Report/Grootboek.pm:151 ../lib/EB/Report/Grootboek.pm:187 msgid "Totaal mutaties" msgstr "" #: ../lib/EB/Report/Grootboek.pm:172 #, perl-brace-format msgid "Totaal {adesc}" msgstr "" #: ../lib/EB/Report/Grootboek.pm:198 msgid "Geen informatie gevonden" msgstr "" #: ../lib/EB/Report/Reporter.pm:56 msgid "Ontbrekend \"name\" of \"style\"" msgstr "" #: ../lib/EB/Report/Reporter.pm:75 ../lib/EB/Report/Reporter.pm:89 #, perl-brace-format msgid "Onbekend veld: {fld}" msgstr "" #: ../lib/EB/Report/Reporter.pm:106 #, perl-brace-format msgid "Ongeldige breedte {w} voor veld {fld}" msgstr "" #: ../lib/EB/Report/Reporter.pm:123 msgid "Rapportage" msgstr "" #: ../lib/EB/Report/Reporter.pm:131 #, perl-brace-format msgid "Periode: t/m {to}" msgstr "" #: ../lib/EB/Report/Reporter.pm:135 ../lib/EB/Report/BTWAangifte.pm:598 #, perl-brace-format msgid "Periode: {from} t/m {to}" msgstr "" #: ../lib/EB/Report/Reporter.pm:178 #, perl-brace-format msgid "Ongeldig veld: {fld}" msgstr "" #: ../lib/EB/Report/GenBase.pm:88 msgid "De uitvoer-backend kon niet worden gevonden" msgstr "" #: ../lib/EB/Report/GenBase.pm:90 #, perl-brace-format msgid "Uitvoer in de vorm {gen} is niet mogelijk: {reason}" msgstr "" #: ../lib/EB/Report/GenBase.pm:98 #, perl-brace-format msgid "Fout tijdens aanmaken {file}: {err}" msgstr "" #: ../lib/EB/Report/GenBase.pm:122 msgid "--per sluit --periode uit" msgstr "" #: ../lib/EB/Report/GenBase.pm:123 msgid "--per sluit --boekjaar uit" msgstr "" #: ../lib/EB/Report/GenBase.pm:129 msgid "--periode sluit --boekjaar uit" msgstr "" #: ../lib/EB/Report/GenBase.pm:155 #, perl-brace-format msgid "Datum {per} valt na de huidige datum {now}" msgstr "" #: ../lib/EB/Report/GenBase.pm:168 #, perl-brace-format msgid "Periode begint {from}, dit is na de huidige datum {now}" msgstr "" #: ../lib/EB/Report/GenBase.pm:173 ../lib/EB/Report/GenBase.pm:178 #, perl-brace-format msgid "Datum {per} valt vóór het begin van de administratie {begin}" msgstr "" #: ../lib/EB/Report/GenBase.pm:211 msgid "cmo:report:output" msgstr "" #: ../lib/EB/Report/GenBase.pm:212 msgid "cmo:report:page" msgstr "" #: ../lib/EB/Report/GenBase.pm:248 msgid "cmo:report:style" msgstr "" #: ../lib/EB/Report/GenBase.pm:249 msgid "cmo:report:title|titel" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:62 msgid "per maand" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:63 msgid "per jaar" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:64 msgid "per kwartaal" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:202 msgid "BTW aangifte periode sluit niet aan bij de vorige aangifte" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:219 #, perl-brace-format msgid "{year}" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:222 #, perl-brace-format msgid "{quarter} {year}" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:223 msgid "1e kwartaal" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:223 msgid "2e kwartaal" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:224 msgid "3e kwartaal" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:224 msgid "4e kwartaal" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:228 #, perl-brace-format msgid "{month} {year}" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:233 #, perl-brace-format msgid "Programmafout: Ongeldige BTW periode: {per}" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:244 #, perl-brace-format msgid "" "Aangifte {per} komt niet overeen met de BTW instelling van de administratie " "({admper})" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:263 msgid "j(aar)?" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:287 #, perl-brace-format msgid "Ongeldige waarde voor BTW periode: \"{per}\"" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:595 ../lib/EB/Wx/Shell/MainFrame.pm:267 msgid "BTW Aangifte" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:597 #, perl-brace-format msgid "Periode: {per}" msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:702 #, perl-brace-format msgid "" "Er is een verschil van {round}{amount} tussen de berekende en werkelijk " "ingehouden BTW. Voor de aangifte is de werkelijk ingehouden waarde gebruikt." msgstr "" #: ../lib/EB/Report/BTWAangifte.pm:714 #, perl-brace-format msgid "" "Er is een verschil van {round}{amount} tussen de berekende en werkelijk " "afgedragen BTW {type}. Voor de aangifte is de werkelijk afgedragen waarde " "gebruikt." msgstr "" #: ../lib/EB/Report/Journal.pm:89 ../lib/EB/Report/Journal.pm:120 #, perl-brace-format msgid "Boekstuk {nr}" msgstr "" #: ../lib/EB/Report/Journal.pm:109 #, perl-brace-format msgid "Dagboek {nr}" msgstr "" #: ../lib/EB/Report/Balres.pm:69 ../lib/EB/Report/Proof.pm:54 msgid "RekNr" msgstr "" #: ../lib/EB/Report/Balres.pm:71 ../lib/EB/Report/Proof.pm:56 msgid "Verdichting/Grootboekrekening" msgstr "" #: ../lib/EB/Report/Balres.pm:72 ../lib/EB/Report/Proof.pm:57 msgid "Grootboekrekening" msgstr "" #: ../lib/EB/Report/Balres.pm:95 ../lib/EB/Report/Balres.pm:100 #, perl-brace-format msgid "Datum: {date}" msgstr "" #: ../lib/EB/Report/Balres.pm:114 ../lib/EB/Report/Balres.pm:280 #: ../lib/EB/Wx/Shell/MainFrame.pm:251 msgid "Balans" msgstr "" #: ../lib/EB/Report/Balres.pm:114 ../lib/EB/Wx/Shell/MainFrame.pm:258 msgid "Verlies/Winst" msgstr "" #: ../lib/EB/Report/Balres.pm:209 ../lib/EB/Report/Balres.pm:220 #: ../lib/EB/Report/Proof.pm:190 ../lib/EB/Report/Proof.pm:222 #, perl-brace-format msgid "Totaal {vrd}" msgstr "" #: ../lib/EB/Report/Balres.pm:261 msgid "Winst" msgstr "" #: ../lib/EB/Report/Balres.pm:261 msgid "Verlies" msgstr "" #: ../lib/EB/Report/Balres.pm:280 #, perl-brace-format msgid "TOTAAL {rep}" msgstr "" #: ../lib/EB/Report/Balres.pm:280 msgid "Resultaten" msgstr "" #: ../lib/EB/Report/Proof.pm:61 msgid "Saldo Db" msgstr "" #: ../lib/EB/Report/Proof.pm:62 msgid "Saldo Cr" msgstr "" #: ../lib/EB/Report/Proof.pm:73 ../lib/EB/Wx/Shell/MainFrame.pm:244 msgid "Proef- en Saldibalans" msgstr "" #: ../lib/EB/Report/Proof.pm:256 ../lib/EB/Report/Proof.pm:289 msgid "TOTAAL" msgstr "" #: ../lib/EB/Report/Debcrd.pm:58 ../lib/EB/Report/Open.pm:43 msgid "Bedrag" msgstr "" #: ../lib/EB/Report/Debcrd.pm:59 msgid "Open" msgstr "" #: ../lib/EB/Report/Debcrd.pm:60 msgid "Betaald" msgstr "" #: ../lib/EB/Report/Debcrd.pm:61 ../lib/EB/Report/Open.pm:44 msgid "Boekstuk" msgstr "" #: ../lib/EB/Report/Debcrd.pm:98 msgid "Geen boekingen gevonden" msgstr "" #: ../lib/EB/Report/Debcrd.pm:100 msgid "Debiteurenadministratie" msgstr "" #: ../lib/EB/Report/Debcrd.pm:101 msgid "Crediteurenadministratie" msgstr "" #: ../lib/EB/Report/Open.pm:107 ../lib/EB/Report/Open.pm:161 #, perl-brace-format msgid "Totaal {rel}" msgstr "" #: ../lib/EB/Report/Open.pm:115 ../lib/EB/Report/Open.pm:169 #, perl-brace-format msgid "Totaal {debcrd}" msgstr "" #: ../lib/EB/Report/Open.pm:180 msgid "Geen openstaande posten gevonden" msgstr "" #: ../lib/EB/Report/Reporter/Html.pm:51 #, perl-brace-format msgid "Overzicht aangemaakt op {date} door {ident}" msgstr "" #: ../lib/EB/Report/Reporter/Html.pm:131 #, perl-brace-format msgid "Geen stylesheet voor {style}" msgstr "" #: ../lib/EB/DB.pm:47 #, perl-brace-format msgid "Tabel {table} ontbreekt in database {db}" msgstr "" #: ../lib/EB/DB.pm:51 #, perl-brace-format msgid "Ongeldige EekBoek database: {db}." msgstr "" #: ../lib/EB/DB.pm:53 msgid "Wellicht is de database nog niet geïnitialiseerd?" msgstr "" #: ../lib/EB/DB.pm:68 ../lib/EB/DB.pm:83 msgid "De database wordt aangepast aan de nieuwere versie" msgstr "" #: ../lib/EB/DB.pm:93 msgid "De migratie is mislukt. Gelieve de documentatie te raadplegen." msgstr "" #: ../lib/EB/DB.pm:96 #, perl-brace-format msgid "" "Ongeldige EekBoek database: {db} versie {ver}. Benodigde versie is {req}." msgstr "" #: ../lib/EB/DB.pm:107 ../lib/EB/DB.pm:119 ../lib/EB/DB.pm:131 #: ../lib/EB/DB.pm:141 #, perl-brace-format msgid "Geen grootboekrekening voor {dc} ({acct})" msgstr "" #: ../lib/EB/DB.pm:111 ../lib/EB/DB.pm:123 ../lib/EB/DB.pm:134 #: ../lib/EB/DB.pm:144 #, perl-brace-format msgid "Foutieve grootboekrekening voor {dc} ({acct})" msgstr "" #: ../lib/EB/DB.pm:132 ../lib/EB/DB.pm:135 msgid "BTW betaald" msgstr "" #: ../lib/EB/DB.pm:142 ../lib/EB/DB.pm:145 msgid "overboeking winst" msgstr "" #: ../lib/EB/DB.pm:149 msgid "CONSISTENTIE-VERIFICATIE STANDAARDREKENINGEN MISLUKT" msgstr "" #: ../lib/EB/DB.pm:232 #, perl-brace-format msgid "Onbekend boekstuk {ref} voor relatie {rel} ({desc})" msgstr "" #: ../lib/EB/DB.pm:259 #, perl-brace-format msgid "Onbekend boekstuk {bsk} in dagboek {dbk}" msgstr "" #: ../lib/EB/DB.pm:282 #, perl-brace-format msgid "Ongeldige boekstukaanduiding: {bsk}" msgstr "" #: ../lib/EB/DB.pm:324 #, perl-brace-format msgid "Niet-bestaande administratie-eigenschap: {adm}" msgstr "" #: ../lib/EB/DB.pm:359 #, perl-brace-format msgid "Niet-bestaande standaardrekening: {std}" msgstr "" #: ../lib/EB/DB.pm:458 msgid "Geen dataset opgegeven. Specificeer een dataset in de configuratiefile." msgstr "" #: ../lib/EB/DB.pm:590 #, perl-brace-format msgid "Geen ondersteuning voor database type {db}" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:105 msgid "Administratie" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:106 msgid "BTW" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:107 msgid "Dagboeken" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:109 msgid "Bevestiging" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:112 msgid "EekBoek opstarten" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:113 msgid "Details..." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:115 msgid "Welkom bij de EekBoek administratie-wizard." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:116 msgid "Maak uw keuze" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:116 msgid "Een nieuwe administratie aanmaken" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:116 msgid "Verbinden met een bestaande administratie" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:122 msgid "01-01-" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:126 msgid "BTW toepassen op deze administratie" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:127 msgid "Aangifteperiode" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:129 msgid "Verkoop" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:130 msgid "Inkoop" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:131 msgid "Kas" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:132 msgid "Bank" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:133 msgid "Database naam" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:135 msgid "Database type" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:136 msgid "PostgreSQL" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:136 msgid "SQLite" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:137 msgid "Server host" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:139 msgid "Server port" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:141 msgid "Database user" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:143 msgid "Password" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:145 msgid "Test database" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:146 msgid "Druk op 'Voltooien' om de volgende bestanden aan te maken:" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:147 msgid "Configuratiebestand" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:149 msgid "Relaties (debiteuren en crediteuren)" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:151 ../lib/EB/Wx/IniWiz.pm:374 msgid "Mutaties (boekingen)" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:153 msgid "Let op! Eventuele bestaande bestanden worden overschreven!" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:286 ../lib/EB/Wx/Shell/MainFrame.pm:579 msgid "Kies" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:298 msgid "Administratie verwijderen?" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:299 msgid "Verwijderen administratie" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:325 msgid "EekBoek MiniAdm Setup" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:332 msgid "" "Een omschrijving van deze administratie, bijvoorbeeld \"Boekhouding 2009\"." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:333 msgid "" "Een korte, unieke aanduiding van deze administratie, bijvoorbeeld " "\"admin2009\"." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:334 msgid "De begindatum. Het boekjaar begint op 1 januari van dit jaar." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:337 msgid "BTW toepassen" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:339 msgid "De aangifteperiode voor de omzetbelasting" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:342 msgid "Verkoop- en Debiteurenadministratie" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:344 msgid "Inkoop- en Crediteurenadministratie" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:346 msgid "Kas (contant geld)" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:348 msgid "Er wordt gebruik gemaakt van een bankrekening" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:351 msgid "De naam van de aan te maken database, b.v. \"admin2009\"." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:352 msgid "Het databasesysteem waar de database wordt opgeslagen" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:355 msgid "Het systeem waarop de database server draait, indien niet lokaal." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:358 msgid "De netwerkpoort waarop de database server luistert, indien niet lokaal." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:361 msgid "De user naam voor de database server." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:364 msgid "Het password van deze user." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:368 msgid "Rekeningschema, dagboeken, BTW instellingen" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:370 msgid "Debiteuren en Crediteuren" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:372 msgid "Administratieve gegevens" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:376 msgid "De database wordt aangemaakt en gevuld" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:571 msgid "Niet uniek" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:590 msgid "Er bestaat al een administratie met deze code." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:602 ../lib/EB/Wx/IniWiz.pm:978 msgid "Database Test Resultaat" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:757 #, perl-brace-format msgid "Aanmaken {cfg}: " msgstr "" #: ../lib/EB/Wx/IniWiz.pm:762 msgid "Even geduld..." msgstr "" #: ../lib/EB/Wx/IniWiz.pm:794 msgid "Mislukt" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:799 ../lib/EB/Wx/IniWiz.pm:820 msgid "Gereed" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:806 msgid "==== Meldingen ====" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:810 msgid "==== Uitvoer ====" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:825 msgid "Overgeslagen" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:858 msgid "Afgebroken!" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:977 msgid "Succes!" msgstr "" #: ../lib/EB/Wx/IniWiz.pm:1013 msgid "The Wiz" msgstr "" #: ../lib/EB/Wx/IniWiz/OpenDialog.pm:42 msgid "Beschikbare administraties" msgstr "" #: ../lib/EB/Wx/IniWiz/OpenDialog.pm:86 msgid "Administratiekeuze" msgstr "" #: ../lib/EB/Wx/Shell/HtmlViewer.pm:93 msgid "HTML Uitvoer" msgstr "" #: ../lib/EB/Wx/Shell/HtmlViewer.pm:132 msgid "Opslaan als..." msgstr "" #: ../lib/EB/Wx/Shell/HtmlViewer.pm:133 msgid "raport.html" msgstr "" #: ../lib/EB/Wx/Shell/HtmlViewer.pm:134 msgid "HTML bestanden (*.html)|*.html" msgstr "" #: ../lib/EB/Wx/Shell/EditDialog.pm:71 msgid "Wijzigen invoerregel" msgstr "" #: ../lib/EB/Wx/Shell/Main.pm:237 #, perl-brace-format msgid "" "Gebruik: {prog} [options] [file ...]\n" "\n" " --config=XXX -f specificeer configuratiebestand\n" " --nostdconf -X gebruik uitsluitend dit configuratiebestand\n" " --define=XXX -D definieer configuratiesetting\n" " --printconfig -P\tprint config waarden\n" " --admdir=XXX\tdirectory voor de config files\n" " --[no]wizard\tgebruik de aanmaken/selectiewizard\n" " --help\t\tdeze hulpboodschap\n" " --ident\t\ttoon identificatie\n" " --verbose\t\tgeef meer uitgebreide information\n" msgstr "" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:49 msgid "Voorkeuren" msgstr "" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:50 msgid "Rapporten in hetzelfde venster" msgstr "" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:51 msgid "Popup window voor foutboodschappen" msgstr "" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:52 msgid "Popup window voor waarschuwingen" msgstr "" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:53 msgid "Popup window voor mededelingen" msgstr "" #: ../lib/EB/Wx/Shell/PreferencesDialog.pm:54 msgid "Aantal te bewaren regels invoer historie:" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:151 msgid "Invoer" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:231 msgid "&Open\tCtrl-O" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:233 msgid "Voorkeuren..." msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:235 msgid "Afsluiten\tCtrl-Q" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:236 msgid "&Bestand" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:238 msgid "&Edit invoerregel\tCtrl+Enter" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:239 msgid "&Uitvoeren invoerregel\tEnter" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:241 msgid "Uitvoer schoonmaken" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:242 msgid "B&ewerken" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:246 ../lib/EB/Wx/Shell/MainFrame.pm:253 msgid "Op grootboekrekening" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:248 ../lib/EB/Wx/Shell/MainFrame.pm:255 msgid "Op hoofdverdichting" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:249 ../lib/EB/Wx/Shell/MainFrame.pm:256 msgid "Op verdichting" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:250 ../lib/EB/Wx/Shell/MainFrame.pm:257 msgid "Gedetailleerd" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:268 msgid "&Rapporten" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:270 msgid "&Hulp..." msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:272 msgid "Ondersteuning..." msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:274 msgid "Over..." msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:275 msgid "&Hulp" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:284 msgid "EekBoek" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:339 msgid "Selecteer eerst een geldige eekboek.conf" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:340 msgid "Geen configuratie" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:393 msgid "Onbekende opdracht. \"help\" geeft een lijst van mogelijke opdrachten." msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:501 msgid "Fout" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:506 msgid "Waarschuwing" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:511 msgid "Mededeling" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:691 #, perl-brace-format msgid "{pkg} {app} versie {ver}" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:696 #, perl-brace-format msgid "Geschreven door {author}" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:700 #, perl-brace-format msgid "Voor ondersteuning: {url}" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:703 #, perl-brace-format msgid "GUI ontwerp met {wxglade}" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:705 ../lib/EB/Wx/Shell/MainFrame.pm:708 #: ../lib/EB/Wx/Shell/MainFrame.pm:711 ../lib/EB/Wx/Shell/MainFrame.pm:715 #, perl-brace-format msgid "{pkg} versie {ver}" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:719 #, perl-brace-format msgid "Over {pkg} {app}" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:734 msgid "Ondersteuning" msgstr "" #: ../lib/EB/Wx/Shell/MainFrame.pm:738 msgid "" "

Voor het uitwisselen van ervaringen, vragen om ondersteuning e.d.\n" "kunt u zich abonneren op de mailing list voor gebruikers op\n" "SourceForge.

\n" "

De EekBoek gebruikers houden zelf\n" "een wiki bij met\n" "tips en andere wetenswaardigheden.

\n" "

EekBoek kan gratis worden gedownload en\n" "gebruikt. Mocht u echter aanvullende wensen hebben op het gebied van\n" "ondersteuning dan kan dat ook.\n" "Squirrel " "Consultancy\n" "is gaarne bereid u betaalde ondersteuning te bieden, bijvoorbeeld bij het\n" "installeren van EekBoek, het opzetten van\n" "administraties, en het overzetten van uw bestaande administraties naar\n" "EekBoek. Ook kunnen specifieke uitbreidingen\n" "of aanpassingen naar uw wens worden gerealiseerd.

\n" "

Voor meer informatie:\n" "info@squirrel.nl.

\n" msgstr "" EekBoek-2.02.04/locale/ebcore-en.pox0000444000076500007650000000107612165465617014663 0ustar jvjv# English translations for EekBoek. # Copyright (C) 2005 Squirrel Consultancy. # This file is distributed under the same license as the EekBoek package. # Automatically generated, 2005. # msgid "" msgstr "" "Project-Id-Version: EekBoek\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-09-17 17:41+0200\n" "PO-Revision-Date: 2005-09-17 17:41+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" EekBoek-2.02.04/doc/0000755000076500007650000000000012165465617011600 5ustar jvjvEekBoek-2.02.04/doc/html/0000755000076500007650000000000012165465617012544 5ustar jvjvEekBoek-2.02.04/doc/html/reports/0000755000076500007650000000000012165465617014242 5ustar jvjvEekBoek-2.02.04/doc/html/reports/result.html0000444000076500007650000002746512165465617016462 0ustar jvjv EekBoek
{name}, "\">", $_->{title} ? $html->($_->{title}) : " '", "
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Resultatenrekening


De Verlies/Winst Rekening

De “Verlies/Winst Rekening”, “Resultatenrekening” of “Exploitatierekening” is een staat van opbrengsten en kosten (of baten en lasten), over de hele periode van het boekjaar.

Definities

De balanswaarde van een grootboekrekening is de waarde ingevoerd op de openingsbalans, vermeerderd met de waarde van alle op deze grootboekrekening uitgevoerde boekingen.

Het resultaat van een grootboekrekening is de waarde op het einde van de rapportage-periode verminderd met de waarde aan het begin van de rapportage-periode.

Syntaxis

result opties

Opties

--periode=periodeaanduiding De begin- en einddatum voor dit rapport. Deze datums moeten liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--detail=N Selecteert de verdichte vorm van rapportage, en bepaalt de mate van detail:
0  Geen detail, alleen totaal per hoofdverdichting.
1  Geen detail, alleen totaal per verdichting.
2  Alle resultaatrekeningen.

Zonder detailselectie wordt de onverdichte vorm van verlies/winst-rapportage aangemaakt.

--verdicht Een verkorte vorm voor --detail=2.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Zonder datum- en detail-opties wordt een rapportage op grootboekrekening aangemaakt over het lopende boekjaar.

Uitvoer (rapportage op grootboekrekening)

Verlies/Winst Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 RekNr Grootboekrekening Debet Credit ---------------------------------------------------------------------- ... 6900 Telefoon- en faxkosten 510,29 ... 8100 Omzet advisering 1200,00 ... << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Resultaten 8700,00 8700,00

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

RekNr
Het rekeningnummer van de grootboekrekening.
Grootboekrekening
De omschrijving van de grootboekrekening.
Debet
De debet waarde van het resultaat.
Credit
De credit waarde van het resultaat.

Uitvoer (verdichte rapportage)

Verlies/Winst Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 6 Kosten 68 Afschrijvingen 6800 Afschr. kosten inv. & inr. 411,26 6810 Afschr. kosten computers 396,82 68 Totaal Afschrijvingen 808,08 69 Algemene kosten 6900 Telefoon- en faxkosten 510,29 6905 Internetkosten 269,42 6980 Bankkosten 32,40 69 Totaal Algemene kosten 812,11 6 Totaal Kosten 1620,19 ... << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Resultaten 8700,00 8700,00

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

RekNr
Het rekeningnummer van de grootboekrekening.
Verdichting/Grootboekrekening
De verdichting, dan wel de omschrijving van de grootboekrekening.
Verdichtingen zijn ingesprongen ten opzichte van de hoofdverdichtingen; grootboekrekeningen zijn op hun beurt weer ingesprongen ten opzichte van de verdichtingen.
Debet
De debet waarde van het resultaat.
Credit
De credit waarde van het resultaat.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/result.html laatste aanpassing 28 juli 2010, 20:25:41

EekBoek-2.02.04/doc/html/reports/unpaid.html0000444000076500007650000002345112165465617016413 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Openstaande posten


De Openstaande Posten

Openstaande posten zijn in- of verkoopboekingen waarvoor de betaling nog niet geheel is geschied. Het totaal van de openstaande posten komt op elk tijdstip overeen met de balanswaarde van de grootboekrekeningen Debiteuren (voor verkopen) resp. Crediteuren (voor inkopen).

Definities

De waarde van een openstaande boeking is de waarde van de oorspronkelijke boeking, verminderd met alle voor deze boeking verwerkte betalingen tot op het tijdstip van de rapportage.

De balanswaarde van een grootboekrekening is de waarde ingevoerd op de openingsbalans, vermeerderd met de waarde van alle op deze grootboekrekening uitgevoerde boekingen.

Syntaxis

openstaand opties

Opties

--per=datum De einddatum voor dit rapport. Deze datum moet liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Zonder datum-opties worden de openstaande posten per huidige datum gerapporteerd.

Uitvoer

Openstaande posten Periode: t/m 2007-05-16 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 Relatie Datum Omschrijving Bedrag Boekstuk ------------------------------------------------------------------------- ACME 2007-04-18 Perl Cursus rest 595,00 Verkoop:3 ACME 2007-05-14 Consultancy 714,00 Verkoop:4 Totaal ACME 1309,00 --------- Totaal Debiteuren 1309,00 XS4ALL 2007-05-10 ADSL 22,80 Inkoop:9 Totaal XS4ALL 22,80 --------- Totaal Crediteuren 22,80 -------------------------------------------------------------------------

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

De openstaande posten worden gerapporteerd met één boeking per regel, en getotaliseerd per relatie en per debiteuren/crediteuren.

Relatie
De code van de betreffende debiteur/crediteur.
Datum
De boekingsdatum.
Omschrijving
De omschrijving van de boekingsregel.
Bedrag
Het bedrag van de boeking.
Boekstuk
Het boekstuknummer.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/unpaid.html laatste aanpassing 28 juli 2010, 20:25:45

EekBoek-2.02.04/doc/html/reports/proef.html0000444000076500007650000002315012165465617016242 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Proef- en Saldibalans


De Proef- en Saldibalans

De Proef- en Saldibalans is een in principe tussentijdse balans van de saldi van de grootboekrekeningen.

Het overzicht bestaat uit twee dubbele kolommen, waarvan het linker paar de totalen van alle debet en creditboekingen laten zien. Het rechter paar toont het netto (debet of credit) saldo.

Voor de balansrekeningen geldt dat de saldi-kolommen overeenkomen met de Debet/Credit kolommen van de Balans. Voor de resultatenrekeningen geldt dat deze kolommen overeenkomen met de Debet/Credit kolommen van de Verlies/Winst Rekening.

Syntax

proefensaldibalans opties

Opties

--per=datum De einddatum voor dit rapport. Deze datum moet liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--detail=N Selecteert de verdichte vorm van rapportage, en bepaalt de mate van detail:
0  Geen detail, alleen totaal per hoofdverdichting.
1  Geen detail, alleen totaal per verdichting.
2  Alle grootboekrekeningen.

Zonder detailselectie wordt de onverdichte vorm van rapportage aangemaakt.

--verdicht Een verkorte vorm voor --detail=2.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Zonder datum- en detail-opties wordt een rapportage op grootboekrekening aangemaakt over het lopende boekjaar.

Uitvoer

Kolommen

RekNr
Het rekeningnummer van de grootboekrekening.
Grootboekrekening of Verdichting/Grootboekrekening
De verdichting, dan wel de omschrijving van de grootboekrekening.
Verdichtingen zijn ingesprongen ten opzichte van de hoofdverdichtingen; grootboekrekeningen zijn op hun beurt weer ingesprongen ten opzichte van de verdichtingen.
Debet
Het totaal van alle debet-boekingen op deze rekening.
Credit
Het totaal van alle credit-boekingen op deze rekening.
Saldo Db
De uiteindelijke debet waarde van deze rekening.
Saldo Credit
De uiteindelijke credit waarde van deze rekening.

Voor verdere informatie, zie de beschrijving van de Balans en de Verlies/Winst Rekening.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/proef.html laatste aanpassing 28 juli 2010, 20:25:37

EekBoek-2.02.04/doc/html/reports/index.html0000444000076500007650000002450112165465617016237 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten


Rapportages

EekBoek ondersteunt alle voor een boekhouding relevante rapportages.

Elke rapportage kan standaard worden aangemaakt in tekstvorm. EekBoek werkt met uitvoer plug-ins, waardoor rapportages eenvoudig ook in andere vormen kunnen worden aangemaakt, zoals HTML voor op de web site, of OpenDocument formaat voor jaarverslagen en dergelijke.

Rapportages worden aangemaakt met EekBoek shell opdrachten. Deze opdrachten accepteren als regel de volgende opties:

--periode=periode De rapportage wordt uitgevoerd over de opgegeven periode.
Het hangt af van de rapportage of een --periode of --per optie is toegestaan.
--per=datum De rapportage wordt uitgevoerd met de opgegeven einddatum.
Het hangt af van de rapportage of een --periode of --per optie is toegestaan.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --per of --periode.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

De uitvoervorm kan worden geselecteerd met een van de hierondervermelde opties. Wanneer geen uitvoervormopties zijn opgegeven wordt de uitvoervorm bepaald aan de hand van de extensie van het uitvoerbestand. Zonder enige uitvoeroptie wordt een tekstuele rapportage aangemaakt.

De volgende uitvoervormen zijn standaard mogelijk voor vrijwel elke rapportage:

optie extensie omschrijving
--text
--gen-text
.txt Rapportage in platte tekst vorm. Deze vorm is voor alle rapportages mogelijk.
--html
--gen-html
.html Rapportage in HTML vorm.
--csv
--gen-csv
.csv Rapportage in CSV (generieke spreadsheet import) vorm.

Zie ook de beschrijving van de volgende configuratiegegevens:

  • decimalpt in sectie locale (decimaalpunt)
  • thousandsep in sectie locale (duizendpuntjes)
  • numwidth in sectie text (kolombreedte voor bedragen)
  • cssdir in sectie html (stylesheet bibliotheek)

De volgende rapportages zijn mogelijk:



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/index.html laatste aanpassing 28 juli 2010, 20:25:25

EekBoek-2.02.04/doc/html/reports/grootboek.html0000444000076500007650000002577712165465617017143 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Grootboek


Het Grootboekoverzicht

Het Grootboekoverzicht geeft evenals het Journaal een overzicht van alle uitgevoerde boekingen. In tegenstelling tot het Journaal zijn in het geval van het Grootboekoverzicht de boekingen geordend op grootboeknummer.

Definities

Het beginsaldo van een grootboekrekening is de waarde ingevoerd op de openingsbalans, vermeerderd met de waarde van alle op deze grootboekrekening uitgevoerde boekingen tot op het moment waarop de rapportage aanvangt.
Voor balansrekeningen komt dit overeen met de balanswaarde.

Syntaxis

grootboek opties selectie

Opties

--periode=periodeaanduiding De begin- en einddatum voor dit rapport. Deze datums moeten liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--detail=N Selecteert de mate van detail:
0  Geen detail, alleen totaal per grootboekrekening.
1  Geen detail, alleen beginsaldo, totaal mutaties en totaal per grootboekrekening.
2  Beginsaldo, mutaties, totaal mutaties en totaal per grootboekrekening.

Zonder detailselectie wordt de meest gedetailleerde rapportage aangemaakt.

--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Selectie

Voor een selectief overzicht kunt u één of meer grootboekrekeningen opgeven. Het resulterende overzicht zal dan alleen de boekingen met betrekking tot deze rekeningen tonen.

Zonder datum- en selectie-opties wordt een rapportage voor alle grootboekrekeningen aangemaakt over het lopende boekjaar.

Uitvoer

Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie -------------------------------------------------------------------------------------------- 1101 Afschrijving inventaris & inrichting Beginsaldo 0,00 1304,81 Afschrijving 2007-12-31 0,00 411,26 Memoriaal:1 Totaal mutaties 411,26 1101 Totaal Afschrijving inventaris 1716,07 ... Totaal mutaties 10971,08 10971,08 -------------------------------------------------------------------------------------------- Totaal 26825,85 26825,85

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Regels

Voor elke grootboekrekening worden de volgende regels aangemaakt:
  • Detail 1, 2: Kopregel met de omschrijving van de grootboekrekening.
  • Detail 1, 2: Het beginsaldo.
  • Detail 2: Regels met de boekingen.
  • Detail 1, 2: Totaalregel mutaties.
  • Altijd: Totaalregel voor de grootboekrekening.

Kolommen

GrBk
Het rekeningnummer van de grootboekrekening.
Grootboek/Boekstuk
Kopregel: De omschrijving van de grootboekrekening.
Beginsaldoregel: Beginsaldo.
Boekingsregel: De omschrijving van het boekstuk.
Datum
Boekingsregel: De boekingsdatum.
Debet
De debet waarde.
Credit
De credit waarde.
BoekstukNr
Boekingsregel: Het boekstuknummer.
Relatie
Boekingsregel: Als het een betaling betreft, de relatiecode.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/grootboek.html laatste aanpassing 28 juli 2010, 20:25:22

EekBoek-2.02.04/doc/html/reports/btw.html0000444000076500007650000003610412165465617015726 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » BTW aangifte


De Aangifte Omzetbelasting

De Aangifte Omzetbelasting, ofwel BTW Aangifte, is een bijzonder soort rapportage, in die zin dat deze specifiek is bedoeld om aangifte Omzetbelasting bij de belastingdienst te doen. De door EekBoek gebruikte rubriek-nummers komen overeen met de gangbare formulieren. Enkele niet-relevante rubrieken zijn weggelaten.

Aangifte geschiedt op verzoek van de belastingdienst per maand, kwartaal of per jaar.

Syntaxis

btwaangifte opties periodeselectie

Opties

--periode=periodeaanduiding De begin- en einddatum voor dit rapport. Deze datums moeten liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--definitief De aangifte is definitief. De betreffende periode wordt gesloten voor BTW boekingen.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Periodeselectie

Indien gewenst kan een expliciete periode worden geselecteerd binnen het lopende boekjaar. Mogelijke selecties zijn:

j jaar het gehele jaar
k1 k2 k3 k4 1e/2e/3e/4e kwartaal (ook: q1, ...)
1 2 3 ...
jan feb ...
januari ...
maand

Zonder datum-opties en periodeselectie worden de aangiftegegevens geproduceerd voor de eerstvolgende periode waarover nog aangifte moet worden gedaan, voor zover deze valt binnen het huidige boekjaar.

Uitvoer

BTW Aangifte Periode: 2007 EekBoek Demo Administratie EekBoek, 31-12-2007 --------------------------------------------------------------- Binnenland 1. Door mij verrichte leveringen/diensten 1a Belast met hoog tarief 7700 1463 1b Belast met laag tarief 0 0 1e Belast met 0% / verlegd 0 Buitenland 3. Door mij verrichte leveringen 3a Buiten de EU 1000 3b Binnen de EU 0 4. Aan mij verrichte leveringen 4a Van buiten de EU 0 0 4b Verwervingen van goederen uit de EU 0 0 Berekening 5. Berekening totaal 5a Subtotaal 1463 5b Voorbelasting 149 5c Subtotaal 1314 5d Vermindering kleineondernemersregeling 1314 5g Totaal te betalen 0 Totaal te betalen (onafgerond) 1314,87 Afrondingsverschil 0,87

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: De naam van de administratie.

Regels

Binnenland
1a Het totaal aan omzetboekingen waarover het hoge BTW tarief is verschuldigd, en de berekende omzetbelasting.
1b Het totaal aan omzetboekingen waarover het lage BTW tarief is verschuldigd, en de berekende omzetbelasting.
1c Het totaal aan omzetboekingen waarover een ander tarief van toepassing is, en geen omzetbelasting is verschuldigd.
Dit wordt nog niet ondersteund.
1d Het totaal aan omzetboekingen voor eigen gebruik.
1e Het totaal aan omzetboekingen waarover het nul-tarief van toepassing is, dan wel de BTW is verlegd.
Buitenland
3a Het totaal aan boekingen inzake leveringen aan EU landen.
Dit betreft omzetboekingen waarbij de debiteur de btw-code 'intra' (intra-communautair) heeft.
Dit wordt nog niet volledig ondersteund.
3b Het totaal aan boekingen inzake leveringen aan niet-EU landen.
Dit betreft omzetboekingen waarbij de debiteur de btw-code 'extra' (extra-communautair) heeft.
Dit wordt nog niet volledig ondersteund.
Aan mij verrichte leveringen
Dit wordt nog niet volledig ondersteund.
4a Het totaal aan boekingen inzake leveringen vanuit niet-EU landen, en de daarover verschuldigde omzetbelasting.
Dit betreft kostenboekingen waarbij de crediteur de btw-code 'extra' (extra-communautair) heeft.
Dit wordt nog niet volledig ondersteund.
4b Het totaal aan boekingen inzake leveringen vanuit EU landen, en de daarover verschuldigde omzetbelasting.
Dit betreft kostenboekingen waarbij de crediteur de btw-code 'intra' (intra-communautair) heeft.
Berekening totaal
5a Het totaal van alle hierbovengenoemde bedragen aan verschuldigde omzetbelasting.
5b Het totaal van alle reeds betaalde omzetbelasting.
Dit is de op de kostenboekingen toegepaste BTW.
5c Subtotaal.
5d Toepassing regeling Kleine Ondernemers.
Indien de omzetbelasting minder is dan een bepaald bedrag, kan het bedrag in veel gevallen geheel of gedeeltelijk worden kwijtgescholden: de regeling ‘Kleine Ondernemers’. EekBoek zal, indien het een jaaropgave betreft en de details van de regeling voor dat jaar bekend zijn, de eventuele korting vermelden.
5g Het uiteindelijk te betalen of terug te ontvangen bedrag aan omzetbelasting.
Naast het afgeronde bedrag voor de belastingdienst toont EekBoek ook de exacte, onafgeronde waarde en het afrondingsverschil. Hiermee kunt u straks bij betaling het juiste bedrag in uw administratie opnemen.

Definitief of niet?

De opdracht 'btwaangifte' is een rapportage-opdracht. Er wordt dus een lijstje voor de aangifte gemaakt, verder niets. Er wordt wel gecontroleerd of de direct eraan voorafgaande BTW periode is afgesloten voor BTW boekingen.

Om de periode af te sluiten dient de optie --definitief te worden toegepast. Er kunnen dan geen BTW-gerelateerde boekingen meer worden uitgevoerd in deze periode.

Het is niet mogelijk een BTW periode af te sluiten zonder dat er direct eraan voorafgaande periode ook is afgesloten.

Indien u steeds de gehele administratie opnieuw opbouwt uit de bestanden dan moet u na elke kwartaalaangifte de volgende opdracht toevoegen aan mutaties.eb:
btwaangifte --noreport --definitief periode

Er is een verschil ...

De onder 1a en 1b genoemde bedragen aan omzetbelasting zijn berekend uit de boekingen. Dit hoeft niet noodzakelijk overeen te komen met het bedrag dat uiteindelijk is betaald (het bedrag dat is geboekt op de BTW hoog of laag rekeningen). Afrondingen kunnen een oorzaak zijn, maar ook als er BTW is betaald voor geïmporteerde goederen. EekBoek zal in dit geval de volgende boodschap tonen:

Er is een verschil van bedrag tussen de berekende en werkelijk ingehouden BTW. Voor de aangifte is de werkelijk ingehouden BTW gebruikt.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/btw.html laatste aanpassing 30 oktober 2010, 10:51:30

EekBoek-2.02.04/doc/html/reports/open.html0000444000076500007650000001404712165465617016075 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Openingsbalans


De Openingsbalans

Bij het openen van een nieuwe administratie dienen onder meer de initële balansposten te worden ingevoerd. Voor een totaal nieuwe administratie zijn er uiteraard nog geen in te voeren posten, maar doorgaans sluit een administratie aan op een voorgaand boekjaar en dienen de resultaten van dit boekjaar te worden getransporteerd naar het nieuwe boekjaar. Dit proces staat beschreven in het hoofdstuk Opzetten administratie.

Na het openen van de administratie wordt een openingsbalans afgedrukt. Deze is qua uitvoering hetzelfde als een gewone balans. Zie De Balans.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/open.html laatste aanpassing 28 juli 2010, 20:25:32

EekBoek-2.02.04/doc/html/reports/crediteuren.html0000444000076500007650000002413212165465617017441 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Crediteuren


De Crediteurenboekingen

Dit overzicht geeft alle boekingen met betrekking tot één of meer crediteuren. Hieronder vallen zowel de inkoopboekingen als de betalingen.

Syntaxis

crediteuren opties selectie

Opties

--periode=periodeaanduiding De begin- en einddatum voor dit rapport. Deze datums moeten liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Selectie

Voor een selectief overzicht kunt u één of meer relatiecodes opgeven. Het resulterende overzicht zal dan alleen de boekingen met betrekking tot deze relaties tonen.

Zonder datum- en selectie-opties wordt een rapportage voor alle crediteuren aangemaakt over het lopende boekjaar.

Uitvoer

Crediteurenadministratie Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 Crediteur Datum Omschrijving Bedrag Openstaand Betaald Boekstuk ----------------------------------------------------------------------------------------- KPN 2007-01-15 ADSL + Telefoon 104,65 0,00 Inkoop:2 2007-01-31 *ADSL + Telefoon 104,65 Postbank:1 ... ---------- ---------- KPN Totaal 631,44 0,00 XS4ALL 2007-01-05 ADSL 22,80 0,00 Inkoop:1 2007-01-19 *ADSL 22,80 Postbank:1 ... ---------- ---------- XS4ALL Totaal 296,40 0,00 ----------------------------------------------------------------------------------------- Totaal 927,84 0,00

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

Crediteur
De relatiecode van de crediteur.
Datum
De datum van de boeking of betaling.
Omschrijving
De omschrijving van de boeking of betaling.
In geval van betaling zal de omschrijving beginnen met een ‘*’.
Bedrag
Voor boekingen: Het totale bedrag van de boeking.
Openstaand
Voor boekingen: Het bedrag dat na alle betalingen nog open staat.
Betaals
Voor betalingen: Het bedrag van de betaling.
Boekstuk
Het boekstuknummer van de boeking of betaling.
Totalen worden getoond per crediteur en voor alle crediteuren.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/crediteuren.html laatste aanpassing 28 juli 2010, 20:25:16

EekBoek-2.02.04/doc/html/reports/journaal.html0000444000076500007650000002535412165465617016752 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Journaal


Het Journaal

Het boeken van en naar grootboekrekeningen vindt plaats in zogenaamde journaalposten. Per regel wordt daarin aangegeven of een bedrag van of naar een rekening gaat (debet of credit). Hierbij kan geen geld onderweg verdwijnen: het totaal van de geboekte regels van en naar is altijd nul.

Syntaxis

journaal opties selectie

Opties

--periode=periodeaanduiding De begin- en einddatum voor dit rapport. Deze datums moeten liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--nodetail

Er wordt alleen het uiteindelijke totaalbedrag getoond, en niet de details van alle boekingen.

--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Selectie

De volgende selecties zijn mogelijk:
  • Op dagboek: door de naam van een dagboek op te geven worden alleen de boekingen van dat dagboek gerapporteerd.
    In plaats van de naam mag ook een zoekcode met SQL wildcards worden opgegenen.
  • Op boekstuk: de naam van het dagboek (of zoekcode) gevolgd door ‘:’ en het dagboeknummer.

Zonder datum-opties en andere selecties worden alle journaalposten van het lopende boekjaar gerapporteerd.

Uitvoer

Journaal Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 Datum Boekstuk/Grootboek Rek Debet Credit Boekstuk/regel Relatie --------------------------------------------------------------------------------------------- 2007-01-05 Inkoop:1 ADSL XS4ALL 2007-01-05 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-01-05 Internetkosten 6905 19,16 ADSL 2007-01-05 Crediteuren 4100 22,80 ADSL ... 2007-12-31 Memoriaal:2 Afschrijving comp 2007-12-31 Afschr. kosten comp 6810 396,82 Afschrijving 2007-12-31 Afschrijving comput 1111 396,82 Afschrijving --------------------------------------------------------------------------------------------- Totaal 22690,92 22690,92

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

Elke journaalpost bestaat uit een eigen kopregel, gevolgd door boekstukregels.

Datum
De datum van deze boeking
Boekstuk/Grootboek
Kopregel: Het boekstuk.
Boekstukregels: De omschrijving van de grootboekrekening.
Rek
Boekstukregels: Het rekeningnummer van de grootboekrekening.
Debet
De debet waarde.
Credit
De credet waarde.
Boekstuk/regel
Kopregel: De omschrijving van de grootboekrekening.
Boekstukregels: De omschrijving van deze boekstukregel.
Indien het een betaling betreft, zal de omschrijving worden voorafgegaan door een sterretje ‘*’.
Relatie
Indien het een betaling betreft, de code van de betreffende relatie.
Merk op dat de totaalbedragen voor debet en credit altijd gelijk zijn.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/journaal.html laatste aanpassing 28 juli 2010, 20:25:29

EekBoek-2.02.04/doc/html/reports/debiteuren.html0000444000076500007650000002436412165465617017265 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Debiteuren


De Debiteurenboekingen

Dit overzicht geeft alle boekingen met betrekking tot één of meer debiteuren. Hieronder vallen zowel de verkoopboekingen als de betalingen.

Syntaxis

debiteuren opties selectie

Opties

--periode=periodeaanduiding De begin- en einddatum voor dit rapport. Deze datums moeten liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Selectie

Voor een selectief overzicht kunt u één of meer relatiecodes opgeven. Het resulterende overzicht zal dan alleen de boekingen met betrekking tot deze relaties tonen.

Zonder datum- en selectie-opties wordt een rapportage voor alle debiteuren aangemaakt over het lopende boekjaar.

Uitvoer

Debiteurenadministratie Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 Debiteur Datum Omschrijving Bedrag Openstaand Betaald Boekstuk ----------------------------------------------------------------------------------------- ACME 2007-02-18 Perl Cursus 1e bet. 3570,00 0,00 Verkoop:1 2007-03-18 *Perl Cursus 1e bet. 3570,00 Postbank:3 ... 2007-07-16 Ondersteuning 714,00 0,00 Verkoop:5 2007-08-10 *Ondersteuning 714,00 Postbank:8 --------- ---------- ACME Totaal 9163,00 0,00 ORA 2007-08-19 Pocket Reference 1000,00 0,00 Verkoop:6 2007-08-19 *Pocket Reference 1000,00 Postbank:8 --------- ---------- ORA Totaal 1000,00 0,00 ----------------------------------------------------------------------------------------- Totaal 10163,00 0,00

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

Debiteur
De relatiecode van de debiteur.
Datum
De datum van de boeking of betaling.
Omschrijving
De omschrijving van de boeking of betaling.
In geval van betaling zal de omschrijving beginnen met een ‘*’.
Bedrag
Voor boekingen: Het totale bedrag van de boeking.
Openstaand
Voor boekingen: Het bedrag dat na alle betalingen nog open staat.
Betaals
Voor betalingen: Het bedrag van de betaling.
Boekstuk
Het boekstuknummer van de boeking of betaling.
Totalen worden getoond per debiteur en voor alle debiteuren.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/debiteuren.html laatste aanpassing 28 juli 2010, 20:25:19

EekBoek-2.02.04/doc/html/reports/balans.html0000444000076500007650000003112312165465617016366 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Overzichten » Balans


De Balans

De balans is een staat van bezittingen en schulden, doorgaans opgemaakt aan het einde van een boekjaar.

Debet op de balans staat het kapitaal. Dit bestaat uit de diverse bezittingen (activa). Bij elkaar vormen die de kapitaalsbestanddelen. Bijvoorbeeld:

  • Materiële vaste activa (gebouwen, inventaris, computers, vervoermiddelen);
  • Financiële vaste activa (waarborgen);
  • Vlottende activa (debiteuren, voorraden);
  • Liquide middelen (kas, bank).

Credit op de balans staat het vermogen. Dit bestaat uit de schulden (vreemd vermogen) en het eigen vermogen. Bij elkaar vormen die de vermogensbestanddelen. Bijvoorbeeld:

  • Eigen vermogen (algemene reserve, risicoreserve, bestemmingsreserves, resultaat lopend jaar);
  • Schulden op lange termijn, dus langer dan één jaar (banklening, hypotheek, leaseverplichtingen);
  • Schulden op korte termijn, dus korter dan één jaar (rekening-courant krediet, crediteuren, belastingen);

Voorzieningen met een korte tijdsduur (vakantiegeld of een projectsubsidie) vallen ook wel onder schulden op korte termijn.

Definities

De balanswaarde van een grootboekrekening is de waarde ingevoerd op de openingsbalans, vermeerderd met de waarde van alle op deze grootboekrekening uitgevoerde boekingen.

Syntaxis

balans opties

Opties

--per=datum De einddatum voor dit rapport. Deze datum moet liggen tussen het begin van de administratie en de huidige datum.
--boekjaar=code Het boekjaar waarover de rapportage moet worden aangemaakt.
Deze optie kan niet worden gebruikt samen met --periode.
--detail=N Selecteert de verdichte vorm van balansrapportage, en bepaalt de mate van detail:
0  Geen detail, alleen totaal per hoofdverdichting.
1  Geen detail, alleen totaal per verdichting.
2  Alle balansrekeningen.

Zonder detailselectie wordt de onverdichte vorm van balansrapportage aangemaakt.

--verdicht Een verkorte vorm voor --detail=2.
--opening Toont de openingsbalans van het huidige dan wel het opgegeven boekjaar. In geval van een administratie met meerdere boekjaren dienen de voorafgaande boekjaren te zijn afgesloten, anders zal deze openingsbalans gelijk zijn aan de eindbalans van het voorgaande boekjaar.
--output=file De uitvoer wordt naar het opgegeven bestand geschreven. De extensie van de bestandsnaam bepaalt de vorm waarin de rapportage plaatsvindt.
--page=regels Voor tekstuele rapportages, het aantal regels per pagina.
(Experimenteel)
--gen-type Bepaalt de vorm waarin de rapportage plaatsvindt. --gen-text, --gen-csv en --gen-html zijn vrijwel altijd mogelijk, overige waarden hangen af van de voor deze rapportage ondersteunde plug-ins.
--style=name Voor HTML uitvoer: specificeert de naam van de te gebruiken stylesheet.
Indien geen stylesheet wordt opgegeven wordt een stylesheet genoemd naar de rapportage gebruikt. Bijvoorbeeld, voor een balans rapportage wordt stylesheet css/balans.css gebruikt. Met de optie --style=other zou de gebruikte stylesheet worden: css/other.css
--title=text Voor HTML uitvoer: specificeert de titel van het document. Deze wordt opgenomen in de HTML <title>.

Zonder datum- en detail-opties wordt een rapportage op grootboekrekening aangemaakt over het lopende boekjaar.

Uitvoer (rapportage op grootboekrekening)

Balans Periode: t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 RekNr Grootboekrekening Debet Credit ---------------------------------------------------------------------- 1100 Inventaris en inrichting 1344,37 1101 Afschrijving inventaris & inrichting 1716,07 ... << Winst >> 7079,82 ---------------------------------------------------------------------- TOTAAL Balans 25205,67 25205,67

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

RekNr
Het rekeningnummer van de grootboekrekening.
Grootboekrekening
De omschrijving van de grootboekrekening.
Debet
De debet waarde.
Credit
De credit waarde.

Uitvoer (verdichte rapportage)

Balans Periode: t/m 2007-12-31 EekBoek Demo Administratie 2007 EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 1 Vaste Activa 11 Materiële vaste activa 1100 Inventaris en inrichting 1344,37 1101 Afschrijving inventaris & inrichting 1716,07 ... 11 Totaal Materiële vaste activa 503,18 1 Totaal Vaste Activa 503,18 ... << Winst >> 7079,82 ---------------------------------------------------------------------- TOTAAL Balans 25205,67 25205,67

Kopregels

Regel 1: De naam van dit rapport.
Regel 2: De rapportage-periode.
Regel 3: Links de naam van de administratie en rechts de programma-versie met de rapportagedatum.

Kolommen

RekNr
Het rekeningnummer van de grootboekrekening.
Verdichting/Grootboekrekening
De verdichting, dan wel de omschrijving van de grootboekrekening.
Verdichtingen zijn ingesprongen ten opzichte van de hoofdverdichtingen; grootboekrekeningen zijn op hun beurt weer ingesprongen ten opzichte van de verdichtingen.
Debet
De debet waarde.
Credit
De credet waarde.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
reports/balans.html laatste aanpassing 28 juli 2010, 20:24:27

EekBoek-2.02.04/doc/html/cmdref.html0000444000076500007650000006557012165465617014705 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek


eb> help adm_balans Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help adm_balanstotaal Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help adm_begindatum Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help adm_boekjaarcode Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help adm_btwperiode Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help adm_naam Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help adm_open Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help adm_relatie Het openen van een administratie kan slechts nmaal gebeuren, vr het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar kan te allen tijde worden uitgevoerd, uiteraard maar n keer per boekjaar. Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met de opdracht "adm_open". Zolang deze opdracht niet is gegeven blijft de administratie ongewijzigd. Mogelijke opdrachten voor openen van een boekjaar: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. Opdrachten voor het openen van een administratie: adm_naam "Naam van de administratie" adm_btwperiode [ jaar | kwartaal | maand ] adm_begindatum Een administratie loopt altijd van 1 januari tot en met 31 december van een kalenderjaar. adm_boekjaarcode Een code van max 4 letters en/of cijfers waarmee het boekjaar kan worden gedentificeerd. Standaard wordt het jaartal van het boekjaar genomen. De boekjaarcode is alleen relevant indien er meerdere boekjaren in n administratie worden bijgehouden. adm_balanstotaal Als een balanstotaal is opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met een of meer adm_balans opdrachten. adm_balans De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn aan het opgegeven balanstotaal. Indien er een bedrag is opgegeven voor de balansrekening Crediteuren of Debiteuren, dan moet er voor dit bedrag ook openstaande posten worden ingevoerd met een of meer adm_relatie opdrachten. adm_relatie "Omschrijving" [ crd | deb ] bedrag Invoeren van een openstaande post uit het voorgaande boekjaar. adm_open Alle informatie die met de bovenstaande opdrachten is ingevoerd, wordt verwerkt. eb> help balans Print de balansrekening. Opties: Balans op grootboekrekening --verdicht Verdicht, gedetailleerd --detail=N Verdicht, mate van detail N = 0, 1 of 2 --per=XXX Selecteer einddatum --boekjaar=XX Selecteer boekjaar eb> help boekjaar Gebruik voor navolgende opdrachten het opgegeven boekjaar. boekjaar eb> help btwaangifte Print de BTW aangifte. btwaangifte [ opties ] [ periode ] Aangifteperiode kan zijn: j jaar het gehele jaar k1 k2 k3 k4 1e/2e/3e/4e kwartaal (ook: q1, ...) 1 2 3 ... jan feb ... januari ... maand Standaard is de eerstvolgende periode waarover nog geen aangifte is gedaan. Opties: --definitief de BTW periode wordt afgesloten. Er zijn geen boekingen in deze periode meer mogelijk. Uit historische overwegingen kan dit ook door het woord "definitief" achter de opdracht te plaatsen. Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. eb> help dagboeken Print een lijstje van beschikbare dagboeken. eb> help dump_schema Reproduceert het schema van de huidige database en schrijft deze naar standaard uitvoer. dump_schema eb> help fortis Toevoegen boekstuk in dagboek Fortis (dagboek 5, type Bank). fortis[:nr] [ ] "Omschrijving" gevolgd door een of meer: std [ ] "Omschrijving" -- gewone betaling crd [ ] -- betaling van crediteur deb [ ] -- betaling van debiteur eb> help grootboek Print het Grootboek, of een selectie daaruit. grootboek [ ... ] Opties: --detail=N -- mate van detail, N=0,1,2 (standaard is 2) --periode=XXX -- alleen over deze periode eb> help inkopen Toevoegen boekstuk in dagboek Inkopen (dagboek 1, type Inkoop). inkopen[:nr] [ ] "Omschrijving" [ ] eb> help jaareinde Sluit het boekjaar af. De BTW rekeningen worden afgeboekt, en de winst/verlies wordt verrekend met de daartoe aangewezen balansrekening. jaareinde [ opties ] Opties: --boekjaar=XXX Sluit het opgegeven boekjaar af --definitief Sluit het boekjaar definitief af. Er zijn dan geen boekingen meer mogelijk. --verwijder Verwijder een tentatieve jaarafsluiting. eb> help journaal Print journaalposten. journaal all -- alle posten journaal -- alleen boekstuknummer met dit id journaal -- alle journaalposten van dit dagboek journaal : -- boekstuk n van dit dagboek journaal -- journaalposten van de laatste boeking Opties --[no]detail -- mate van detail, standaard is met details --totaal -- alleen het totaal (detail = 0) --periode=XXX -- alleen over deze periode Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. eb> help kas Toevoegen boekstuk in dagboek Kas (dagboek 4, type Kas). kas[:nr] [ ] "Omschrijving" gevolgd door een of meer: std [ ] "Omschrijving" -- gewone betaling crd [ ] -- betaling van crediteur deb [ ] -- betaling van debiteur eb> help memoriaal Toevoegen boekstuk in dagboek Memoriaal (dagboek 8, type Memoriaal). memoriaal[:nr] [ ] "Omschrijving" gevolgd door een of meer: std [ ] "Omschrijving" -- gewone betaling crd [ ] -- betaling van crediteur deb [ ] -- betaling van debiteur eb> help openstaand Toont een overzicht van openstaande posten. openstaand [ opties ] Opties: --per XXX t/m einddatum ***WERKT NOG NIET*** Zie verder "help rapporten" voor algemene informatie over aan te maken rapporten. eb> help periodes De volgende periode-aanduidingen zijn mogelijk: 2005-04-01 - 2005-07-31 01-04-2005 - 31-07-2005 01-04 - 31-07-2005 01-04 - 31-07 (vooropgesteld dat het boekjaar 2005 is) 1 april 2005 - 31 juli 2005 (en varianten) 1 apr 2005 - 31 jul 2005 (en varianten) apr - jul k2 (tweede kwartaal) april 2003 (01-04-2003 - 30-04-2003) april (01-04 - 30-04 boekjaar) m4 (vierde maand) jaar (gehele boekjaar) eb> help postbank Toevoegen boekstuk in dagboek Postbank (dagboek 3, type Bank). postbank[:nr] [ ] "Omschrijving" gevolgd door een of meer: std [ ] "Omschrijving" -- gewone betaling crd [ ] -- betaling van crediteur deb [ ] -- betaling van debiteur eb> help proefensaldibalans Print de Proef- en Saldibalans. Opties: Proef- en Saldibalans op grootboekrekening --verdicht verdicht, gedetailleerd --detail=N verdicht, mate van detail N = 0, 1 of 2 eb> help rapporten Alle rapport-producerende opdrachten kennen de volgende opties: --periode=XXX De periode waarover de rapportage moet plaatsvinden. (Niet voor elke opdracht relevant.) Zie "help periodes" voor details. --output=XXX Produceer het rapport in dit bestand Uitvoertype is afhankelijk van bestandsextensie, b.v. xx.html levert HTML, xx.txt een tekstbestand, xx.csv een CSV, etc. --gen-XXX Forceer uitvoertype (html, csv, text, ...) Afhankelijk van de beschikbare uitvoertypes zijn ook de kortere opties --html, --csv en --text toegestaan. (Let op: --gen-XXX, niet --gen=XXX) --page=NNN Paginagrootte voor tekstrapporten. eb> help relatie Aanmaken een of meer nieuwe relaties. relatie [ opties ] { "Omschrijving" } ... Opties: --dagboek=XXX -- selecteer dagboek voor deze relatie --btw=XXX -- BTW type: normaal, verlegd, intra, extra *** BTW type 'verlegd' wordt nog niet ondersteund *** *** BTW type 'intra' wordt nog niet geheel ondersteund *** eb> help result Print de resultatenrekening. Opties: Resultatenrekening op grootboekrekening --verdicht Verdicht, gedetailleerd --detail=N Verdicht, mate van detail N = 0, 1 of 2 --periode=XXX Selecteer periode --boekjaar=XX Selecteer boekjaar eb> help toon Toon een boekstuk in tekst- of commando-vorm. toon [opties] Opties: --boekjaar XXX selekteer boekjaar --verbose toon in uitgebreide (tekst) vorm --btw vermeld altijd BTW codes --bsknr vermeld altijd het boekstuknummer (default) eb> help verkopen Toevoegen boekstuk in dagboek Verkopen (dagboek 2, type Verkoop). verkopen[:nr] [ ] "Omschrijving" [ ] eb> help verwijder Verwijdert een boekstuk. Het boekstuk mag niet in gebruik zijn. verwijder [ ] Opties: --boekjaar XXX selekteer boekjaar


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
cmdref.html laatste aanpassing 09 december 2005, 18:16:47

EekBoek-2.02.04/doc/html/date.html0000444000076500007650000001233712165465617014353 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek


Datum-specificaties

In EekBoek kunnen datums op verschillende manieren worden opgegeven, afhankelijk van de context.

Een vorm die altijd wordt ondersteund is het z.g. ISO8601 formaat:

JJJJ-MM-DD

Eveneens altijd ondersteund is de conventionele europese vorm:

DD-MM-JJJJ

Als het jaar eenduidig bepaald is, mag dit ook in verkorte vorm worden opgegeven:

DD-MM

Andere vormen zijn:

"dag maand JJJJ"

In deze vorm mag de dag ook uit één cijfer bestaan. Voor de maand zijn zowel de lange vorm, b.v. 'januari', als de korte vorm, b.v. 'jan', en de maandnummering, b.v. 'm01' toegestaan.
Merk op dat in dit geval altijd aanhalingstekens om de datum moeten worden geplaatst!



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
date.html laatste aanpassing 28 juli 2010, 20:20:19

EekBoek-2.02.04/doc/html/period.html0000444000076500007650000001222512165465617014714 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek


Periode-specificaties

In EekBoek kunnen periodes op verschillende manieren worden opgegeven, afhankelijk van de context.

Op een enkele uitzondering na wordt een periode aangeduid met twee datums, gescheiden door een streepje '-'.

2007-01-01 - 2007-12-31

In veel gevallen kan overbodige informatie, b.v. een jaartal, worden weggelaten:

01-01 - 31-12-2007

Als het jaartal kan worden afgeleid uit de context, dan mag het helemaal worden weggelaten:

01-01 - 31-12

Meer vriendelijke vormen:

1 januari 2007 - 31 december 2007 1 jan 2007 - 31 dec 2007 1 jan - 31 dec 2007

Een maand kan ook een periode vormen:

januari 2007 jan - maart

Tot slot nog de genummerde maand en het kwartaal:

m01 2007 k2


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
period.html laatste aanpassing 28 juli 2010, 20:24:23

EekBoek-2.02.04/doc/html/index.html0000444000076500007650000001331212165465617014537 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek


EekBoek On-line documentatie

Dit is de documentatie van het eigenzinnige boekhoudprogramma EekBoek.

Deze documentatie volgt als regel de laatst uitgebrachte versie van EekBoek. Dit hoeft dus niet precies overeen te komen met de versie van EekBoek die u op dit moment gebruikt. De preciese documentatie daarvan is tezamen met de EekBoek programmatuur op uw eigen systeem geïnstalleerd.

Belangrijk: Voor het gebruik van EekBoek is enige basiskennis van boekhouden vereist. Deze documentatie gaat ervan uit dat u met tenminste de volgende boekhoudkundige begrippen vertrouwd bent:

  • balansrekening
  • btw
  • boekstuk
  • credit
  • crediteur
  • dagboek
  • debet
  • debiteur
  • giro/bankafschrift
  • grootboek
  • inkoopfaktuur
  • journaalpost
  • resultaatrekening
  • tegenrekening
  • verkoopfaktuur

Uitleg over de basisbegrippen van boekhouden vindt u onder meer op de sites van Kees van Asperen en CIRO. Ook het boek “Boekhouden voor Dummies” (geheel te lezen op internet) bevat veel bruikbare informatie.

Voor de voorbeelden in deze documentatie is zoveel mogelijk gebruik gemaakt van de voorbeeldadministratie welke met EekBoek wordt meegeleverd.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
index.html laatste aanpassing 31 oktober 2010, 13:20:12

EekBoek-2.02.04/doc/html/config.html0000444000076500007650000005014712165465617014704 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Configuratie


Configuratiebestanden

De configuratie van EekBoek wordt vastgelegd in configuratiebestanden. Deze bestanden zijn gemodelleerd naar een van de vele de-facto standaards, die van de z.g. INI-files.

Bij het opstarten zal EekBoek de volgende configuratiebestanden verwerken indien ze aanwezig zijn:

  1. Het systeem-globale configuratiebestand. Op een Unix of Linux systeem is dit het bestand /etc/eekboek/eekboek.conf.
    In dit bestand kan bijvoorbeeld de systeembeheerder de instellingen voor de databases opnemen.
  2. Het gebruikers-specifieke configuratiebestand. Op een Unix of Linux systeem is dit het bestand .eekboek/eekboek.conf in de home-directory van de gebruiker.
    In dit bestand kan een gebruiker bijvoorbeeld taalinstellingen en andere voorkeuren opnemen. Wanneer er met slechts één administratie wordt gewerkt kan hier ook de naam van de te gebruiken database worden opgenomen.
  3. Het administratie-specifieke configuratiebestand. Op een Unix of Linux systeem is dit het bestand eekboek.conf in de huidige directory.
    Wanneer met meerdere administraties wordt gewerkt is dit een goede plek om de naam van de te gebruiken database op te nemen.
    Let op: EekBoek versie 1 gebruikte de naam .eekboek.conf, dus met een punt aan het begin. EekBoek versie 2 zal een bestand met deze naam gebruiken wanneer het bestand zonder punt niet aanwezig is.

De gegevens uit de specifieke bestanden hebben voorrang boven die uit meer generieke bestanden.

Aan de EekBoek programma's kan bovendien op de command line een configuratie-optie --config worden meegegeven. Met deze optie wordt een niet-standaard configuratiebestand aangewezen dat in de plaats van het administratie-specifieke bestand komt. Tevens is het mogelijk om met de command line optie -X op te geven dat alle standaard-configuratiebestanden genegeerd moeten worden. Dit is uiteraard alleen zinvol in combinatie met --config.

Configuratie-variabelen kunnen ook worden gezet op de command line bij het opstarten van EekBoek. Zie hiervoor Command line opties.

De benodigde configuratiebestanden worden automatisch aangemaakt bij het opstarten van EekBoek. Zie “Het opzetten van de werkomgeving”.

De inhoud van de configuratiebestanden

De configuratiebestanden zijn verdeeld in secties, die elk een of meer variabelen kunnen bevatten. Bijvoorbeeld

[Database] name = demoadmin

In dit kleine voorbeeldje is er sprake van een sectie, ‘Database’, met een variabele ‘name’ met de waarde ‘demoadmin’. Voor meer details, zie b.v. WikiPedia.

De waarde van configuratie-variabelen kan worden opgevraagd met de EekBoek shell. Als de eerste optie op de command line --printcfg is, of de verkorte vorm -P, dan worden alle volgende argumenten gezien als configuratie-variabelen en wordt de waarde ervan afgedrukt. Dit is met name zinvol in shell scripts, bijvoorbeeld om de actuele naam van de database op te vragen. Na het afdrukken van de variabelen stopt de EekBoek shell, er wordt dus geen normale verwerking opgestart.
Configuratie-variabelen kunnen worden opgegeven in de vorm sectie:variabele. Ook is het mogelijk een sectie te selecteren voor een reeks van variabelen met de optie --section=sectie.

Omdat in de configuratiebestanden onder meer de internationalisatie-gegevens kunnen worden bepaald, kunnen deze bestanden zelf geen gebruik maken van internationalisatie. De gebruikte namen van secties en variabelen in de configuratiebestanden zijn daarom voor alle talen hetzelfde, en enigszins taal-neutraal (lees: engels-achtig).

Sectie "General"

admdir De standaardplek voor administraties.
Default: .eekboek/admdir in de home-directory van de gebruiker.
wizard Forceer de selectiewizard ook als er een eekboek/admdir in de directory staat. Hiermee kunt u meerdere administratie-directories realiseren.

Sectie "Locale"

lang Deze variable kan worden gebruikt om de door EekBoek te gebruiken taal (locale) te selecteren.
Standaard wordt de instelling van het systeem overgenomen.
De waarde is doorgaans een string als nl_NL.utf8.
Default: nl_NL.utf8.
Taalinstelling is alleen effectief in de internationale versie van EekBoek, en niet in de standaardversie.

Sectie "Company"

name De naam van de onderneming.
id Administratienummer van de onderneming.
address Adres.
postalcode Postcode.
city Woonplaats.
taxreg Het fiscale nummer van de onderneming.

Sectie "Preferences"

journal Door deze variable een waarde ongelijk nul te geven wordt na elke boeking automatisch de betreffende journaalpost getoond.

Sectie "Database"

name De naam van de te gebruiken database.
driver De te gebruiken database-driverer.
Mogelijke waarden zijn postgres voor het PostgreSQL database systeem, en sqlite voor SQLite.
Default: sqlite.

De volgende configuratie-variabelen zijn enkel van belang indien het gebruikte database systeem deze vereist.

user De naam van de database-gebruiker.
Indien deze configuratievariabele niet is gezet, wordt de loginnaam gebruikt.
password De toegangscode van de database-gebruiker, indien nodig.
host De naam van het systeem waarop de database draait.
Indien deze configuratievariabele niet is gezet wordt de database verondersteld op het lokale systeem te draaien.
port De poort waarlangs de database is te benaderen.
Indien deze configuratievariabele niet is gezet wordt een database-specifieke standaardwaarde genomen.

Sectie "Strategy"

round Hiermee kan worden ingesteld op welke wijze EekBoek bij berekeningen bedragen moet afronden.
De volgende methoden worden ondersteund:
ieeeAfronding volgens de IEEE standaard.
Dit is de standaardinstelling.
bankersAfronding naar even getallen (het zg. Bankers algoritme)
posixAfronding volgens de POSIX standaard.
bkm_multi Indien ingesteld op een waarde anders dan 0 (default) zal EekBoek proberen boekingen in een Bank, Kas of Memoriaaldagboek waarvoor geen overeenstemmende open post kan worden gevonden te verdelen over meerdere open posten.
De boeking wordt alleen uitgevoerd indien er meerdere open posten zijn die tezamen exact het gewenste bedrag uitmaken.
Alleen open posten met een boekingsdatum op of voor de boekingsdatum van de betaling komen in aanmerking. Zie ook bkm_multi_delta hieronder.
bkm_multi_delta Bij het bepalen van boekingen welke in aanmerking kunnen komen voor een gecombineerde betaling worden alleen de boekingen bekeken met een boekingsdatum op of voor de boekingsdatum van de betaling. Het kan echter voorkomen dat betalingen boekhoudkundig eerder worden verwerkt dan de factuur. bkm_multi_delta kan worden ingesteld op het aantal dagen dat de boekingsdatum van de factuur na de boekingsdatum dan de betaling mag liggen.
iv_vc Bij het boeken in een Inkoop- of Verkoopdagboek wordt BTW berekend per boekstukregel. Sommige leveranciers berekenen echter de BTW over het totaal van de boekstukregels. Daardoor kunnen afrondingsverschillen ontstaan met als gevolg een boekstuktotaal dat niet klopt met de opgegeven waarde. De boeking zal dan worden geweigerd.

EekBoek zal echter eerst proberen zo'n boeking te corrigeren door de BTW te herberekenen over het totaal. Er wordt dan een melding gegeven, en een correctieboekstukregel aangemaakt.

Dit gedrag kan worden afgezet door de strategy optie iv_vc de waarde 0 te geven.

Sectie "Shell"

prompt De prompt waarmee de EekBoek shell kenbaar maakt dat het invoer van de gebruiker verwacht. De standaardprompt is de tekst eekboek, gevolgd door de naam van de huidige database, bijvoorbeeld:
eekboek [sample]
userdefs De EekBoek shell zoekt bij het opstarten standaard een module met de naam EB::Shell::Userdefs. Indien deze module bestaat, wordt deze geladen. Deze module kan eigen opdrachten definiëren, of bestaande opdrachten aanpassen.
Met deze configuratie-variable kan een andere module in plaats van de standaardmodule worden gespecificeerd. In dit geval moet de module echter succesvol geladen kunnen worden.

Sectie "Format"

date De vorm waarin datums moeten worden getoond.
De volgende vormen zijn mogelijk:
YYYY-MM-DD ISO standaardvorm.
DD-MM-YYYY NEN standaardvorm.
DD-MM Verkorte NEN standaardvorm.
In dit geval zullen, waar nodig, de datums toch compleet met jaartal worden weergegeven.
amount De vorm waarin bedragen moeten worden getoond. Hierin zijn drie dingen van belang: de decimale punt, de duizendtallenscheider en de breedte van de te tonen bedragen. Het onderstaande overzicht geeft het verband tussen het opgegeven amount en het effect op de decimale punt, duizendtallenscheider en de breedte.
amountdecimaalpuntduizendscheiderbreedte
1234.56. (punt)(geen)9
1234,56, (komma)(geen)9
1.234,56, (komma). (punt)9
1,234.56. (punt), (komma)9
1.234.567,89, (komma). (punt)12

De breedte wordt alleen aangepast als het format breder is dan 9 tekens.

Sectie "Html"

cssdir De directory waar de HTML stylesheets zijn te vinden.
De uiteindelijk toegepaste stylesheet hangt af van deze setting, en de aan de rapport-opdracht meegegeven style optie.
StyleCssdirResultaat
  De EekBoek standaard style voor dit type rapport wordt opgenomen in het rapport
 dirStylesheet link naar ‘dir/std.css’, waarin std de naam is van de EekBoek standaard style voor dit type rapport
naamdirStylesheet link naar ‘dir/naam.css
bestandsnaamn.v.t.Stylesheet link naar ‘bestandsnaam

Sectie "CSV"

separator Deze variable kan worden gebruikt om de kolom-scheider in te stellen voor de in de vorm van CSV bestanden aangemaakte rapporten. Standaard staat de kolom-scheider ingesteld op ‘,’ (komma).

Sectie "Internal"

Het gebruik van deze variabelen is strict intern en kan tot ongewenste problemen leiden.

now Deze variable kan worden gebruikt om de 'huidige' datum te zetten. Dit is enkel relevant voor regressietests, waarin de gegenereerde rapporten worden vergeleken met standaardversies en het onwenselijk is als steeds de rapportage-datum zou wijzigen.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
config.html laatste aanpassing 28 juli 2010, 20:20:12

EekBoek-2.02.04/doc/html/setup/0000755000076500007650000000000012165465617013704 5ustar jvjvEekBoek-2.02.04/doc/html/setup/relaties.html0000444000076500007650000001733512165465617016411 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Opzetten administratie » Relaties


Bestand relaties.eb - Debiteuren en Crediteuren

Debiteuren en crediteuren vormen de relaties binnen het EekBoek pakket. Alle inkoop- en verkoop-, alsmede de meeste bankboekingen hebben te maken met relaties.

In EekBoek heeft elke relatie een code, de relatie-code. Dit is een serie van ten hoogste 10 tekens. Meest gebruikelijk is een acroniem. Deze code moet uniek zijn per dagboek. Het is dus mogelijk dezelfde code te gebruiken voor een relatie die zowel debiteur als crediteur is.

Aan elke relatie zijn de volgende gegevens gekoppeld:

  • De volledige naam van de relatie;
  • Het dagboek waarin de boekingen met betrekking tot deze relatie moeten plaatsvinden.
    De aard van het dagboek (Inkoop/Verkoop) bepaalt of deze relatie een Crediteur or een Debiteur is;
  • De grootboekrekening waarop de boekingen met betrekking tot deze relatie standaard plaatsvinden.
    Boekingen kunnen uiteraard ook op andere rekeningen worden uitgevoerd, de standaardrekening wordt gebruikt indien geen andere rekening is opgegeven;
  • De BTW status van deze relatie.
    De BTW status kan zijn Normaal (standaard), Verlegd, Intra (intra-communautair, binnen de EU) of Extra (extra-communautair, buiten de EU)

Het bestand relaties.eb wordt gevuld met "relatie"-opdrachten als volgt:

relatie --dagboek=inkoop KPN "KPN Telecom BV" 6900

In dit voorbeeld wordt een crediteur (dagboek = Inkoop) aangemaakt met code "KPN" en omschrijving "KPN Telecom BV". De standaard-grootboekrekening voor deze crediteur is 6900.

De BTW status kan worden opgegeven door aan de opdracht de optie "--btw=status mee te geven, waarin status een van de waarden normaal, intra, extra of verlegd heeft.

Waarschuwing: BTW status verlegd wordt nog niet ondersteund.
Waarschuwing: BTW status intra en intra worden slechts gedeeltelijk ondersteund. Gebruik op eigen risico.

Meerdere relaties kunnen in een enkele opdracht worden aangemaakt:

relatie --dagboek=inkoop \ KPN "KPN Telecom BV BV" 4900 \ XS4ALL "XS4All Internet Services BV" 4905 \ TPG "Posterijen" 4910

Let op het gebruik van de \ tekens om de opdracht te verlengen over meerdere regels.

Relaties kunnen later in een bestaande administratie worden toegevoegd door "relatie"-opdrachten aan de EekBoek shell te geven.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
setup/relaties.html laatste aanpassing 30 oktober 2010, 11:12:03

EekBoek-2.02.04/doc/html/setup/index.html0000444000076500007650000001335412165465617015705 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Opzetten administratie


Opzetten van een administratie

Het opzetten van een administratie omvat de volgende stappen:

  1. Het opzetten van de werkomgeving;
  2. Het aanmaken van de bestanden schema.dat (Administratiegegevens), relaties.eb (Debiteuren en crediteuren), opening.eb (Openingsbalans) en mutaties.eb (Boekingen);
  3. Het aanmaken van de administratie.

Wanneer u de verschillende aspecten van EekBoek wilt uitproberen kan dat gemakkelijk aan de hand van een eenvoudig op te zetten voorbeeldadministratie. Aanwijzingen daarvoor treft u aan onder Opzetten werkomgeving.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
setup/index.html laatste aanpassing 28 juli 2010, 20:25:54

EekBoek-2.02.04/doc/html/setup/config.html0000444000076500007650000002532412165465617016043 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Opzetten administratie » Opzetten werkomgeving


Het opzetten van de werkomgeving

EekBoek versie 2 werkt met een administratie directory, dit is een directory waar alle administratiebestanden worden ondergebracht. De standaardplek voor deze directory is afhankelijk van het gebruikte platform. Onder Linux systemen is dit de directory .eekboek/admdir in de home-directory van de gebruiker. Deze directory kan worden gewijzigd in het configuratiebestand.

Elke administratie heeft een naam, en een korte code. Deze laatste wordt bij het aanmaken van de administratie afgeleid van de naam. De code wordt gebruikt om een subdirectory in de administratie directory aan te maken waar de bestanden van deze administratie geplaatst gaan worden. Ook wordt de code gebruikt als naam voor de database waarin de administratie wordt onderhouden.

Wanneer een van de EekBoek programma's wordt opgestart zal deze eerst in de administratie directory kijken welke administraties daar zijn aangemaakt. U kunt dan een van deze administraties kiezen om mee te gaan werken, of om een nieuwe administratie aan te maken. Als er geen administraties beschikbaar zijn wordt automatisch de wizard voor het aanmaken van een nieuwe administratie gestart.

Let op: Uit compatibiliteit met vorige versies zal de EekBoek shell ebshell onmiddelijk tot uitvoering overgaan wanneer in de huidige directory een configuratiebestand aanwezig is. Om in dit geval de administratieselectiewizard te activeren dient de command line optie --wizard te worden meegegeven.

Het aanmaken van een nieuwe administratie

Met de wizard kunt u met het beantwoorden van enkele eenvoudige vragen een nieuwe administratie opzetten. U kunt daarbij kiezen uit een van de meegeleverde sjabloonadministraties, de EekBoek voorbeeldadministratie, of een compleet lege minimale administratie.

Als u voor het eerst met EekBoek gaat werken is het zeer aan te raden om eerst een voorbeeldadministratie aan te maken en daarmee van alles uit te proberen. Op deze manier raakt u snel vertrouwd met de wijze waarop EekBoek werkt.

Een voorbeeld van het aanmaken van een administratie. Op alle vragen wordt het standaardantwoord geaccepteerd door het indrukken van de Enter toets. Door een vraag met een ‘-’ teken te beantwoorden gaat de wizard terug naar de vorige vraag.

$ ebshell EekBoek 2.00.00 -- Copyright 2005-2010 Squirrel Consultancy Geef een unieke naam voor de nieuwe administratie. Deze wordt gebruikt voor rapporten en dergelijke. Naam [Mijn eerste EekBoek]: Geef het boekjaar voor deze administatie. De administatie begint op 1 januari van het opgegeven jaar. Begindatum <1990..2020> [2010]: Geef een unieke code voor de administratie. Deze wordt gebruikt als interne naam voor de database en administratiefolders. De standaardwaarde is afgeleid van de administratienaam en de begindatum. Code [mijn_eerste_eekboek_2010]: U kunt een van de meegeleverde sjablonen gebruiken voor uw administratie. 1: Lege administratie 2: Eenmanszaak (ZZP) 3: BV / NV 4: Ondernemer 5: EekBoek voorbeeldadministratie 6: Vereniging / Stichting Sjabloon <1..6> [5]: Kies het type database dat u wilt gebruiken voor deze administratie. 1: postgres 2: sqlite Database <1..2> [2]: Gereed om de administratieve bestanden en de database aan te maken. Doorgaan [Ja]: EekBoek 2.00.00 -- Copyright 2005-2010 Squirrel Consultancy %Lege database mijn_eerste_eekboek_2010 is aangemaakt ... De administratie is aangemaakt. U kunt meteen aan de slag.

Hierna krijgt u de prompt van de EekBoek shell en kunt u opdrachten ingeven.

Het aanmaken van een administratie met de GUI verloopt op eenzelfde wijze.

Als de wizard gereed is met het aanmaken van de administratie dan vindt u in de administratie directory een subdirectory met de naam mijn_eerste_eekboek_2010, met daarin de volgende bestanden:

  • eekboek.conf - het administratie-specifieke configuratiebestand;
  • schema.dat - de administratiegegevens;
  • relaties.eb - de relaties (debiteuren en crediteuren);
  • opening.eb - de openingsbalans;
  • mutaties.eb - de mutaties (boekingen). Dit bestand zal leeg zijn tenzij u heeft gekozen een voorbeeldadministratie aan te maken.

De volgende secties van de documentatie beschrijven wat er in deze bestanden moet komen.

De voorbeeldadministratie

De bestanden van de voorbeeldadministratie kunt u hier inzien::

  • schema.dat - de administratiegegevens;
  • relaties.eb - de relaties (debiteuren en crediteuren);
  • opening.eb - de openingsgegevens. Als uw voorbeeldadministratie met de wizard is aangemaakt zal de naam van de administratie en de begindatum zijn aangepast aan de in de wizard opgegeven waarden;
  • mutaties.eb - de mutaties.

Meerdere administratie directories

Als u een configuratiebestand maakt met daarin de sectie ‘general’ waarin de settings admdir alsmede wizard=1, en u start een van de EekBoek programma's op waarbij u dit configuratiebestand meegeeft aan de --config command line optie, dan zal het programma de selectiewizard opstarten in de opgegeven administratie directory. Op deze wijze kunt u meerdere groepen van administraties beheren.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
setup/config.html laatste aanpassing 28 juli 2010, 20:25:51

EekBoek-2.02.04/doc/html/setup/init.html0000444000076500007650000001043612165465617015537 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek


Het aanmaken van de administratie

Als alle benodigde bestanden klaar zijn, kan de administratie worden aangemaakt. Dit geschiedt met de volgende systeemopdracht:

ebshell --init

De administratie setup wizards zullen dit automatisch voor u doen.

Het is mogelijk dat er fouten worden gedetecteerd in de opdrachten die in de bestanden zijn vastgelegd. Handelt u deze een voor een af. Het is mogelijk dat foutmeldingen het gevolg zijn van eerdere fouten, zodat met het corrigeren van een enkel probleem een groot aantal foutmeldingen verdwijnen.

Het wijzigen van de administratie

Als u de structuur van de administratie wilt wijzigen kunt u het bestand schema.dat aanpassen en de administratie opnieuw aanmaken met de bovengenoemde init opdracht.

Let op! Als u reeds mutaties heeft aangebracht moet u eerst een export uitvoeren anders raakt u alle wijzigingen kwijt bij het opnieuw aanmaken van de administratie.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
setup/init.html laatste aanpassing 08 februari 2010, 21:59:19

EekBoek-2.02.04/doc/html/setup/schema.html0000444000076500007650000003532612165465617016041 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Opzetten administratie » Administratiegegevens


Bestand schema.dat - De administratiegegevens

Een administratie omvat twee soorten gegevens: de beschrijving van de structuur en de inhoud van de administratie.

De beschrijving van de structuur vindt plaats in het zogenaamde schema. In het schema worden de volgende gegevens gedefinieerd:

Algemene syntaxregels voor het schema-bestand:

  • Lege regels en regels die beginnen met een hekje ‘#’ worden niet geïnterpreteerd.
  • Een niet-ingesprongen tekst introduceert een nieuw onderdeel.
  • Alle ingesprongen regels zijn gegevens voor dat onderdeel.

Het rekeningschema

EekBoek maakt gebruik van een hierarchisch rekeningschema volgens het beproefde ‘Systeem Bakker’. EekBoek ondersteunt twee niveau's van verdichting, waarbij het hoogste niveau hoofdverdichting wordt genoemd. Er zijn standaard maximaal 9 hoofdverdichtingen, genummerd 1 tot en met 9. De verdichtingen zijn genummerd van 10 tot en met 99. De grootboekrekeningen dragen nummers vanaf 100. Deze grenzen kunnen indien nodig worden gewijzigd.

In het schema-bestand worden de hoofdverdichtingen en verdichtingen opgegeven op (ingesprongen) regels, met daarin het nummer gevolgd door de omschrijving. Bijvoorbeeld:

Balansrekeningen 1 Vaste Activa 11 Immateriële vaste activa

Het rekeningschema beslaat twee onderdelen uit het schema-bestand: balansrekeningen en resultaatrekeningen. Beide onderdelen verschillen slechts in één aspect, alle gemeenschappelijke informatie wordt besproken bij de resultaatrekeningen.

Resultaatrekeningen

Resultaatrekeningen worden net zoals balansrekeningen opgegeven in het onderdeel “resultaatrekeningen” in het schema-bestand.

Resultaatrekeningen 8 Bedrijfsopbrengsten 85 Omzet Projekten

Tussen het rekeningnummer en de omschrijving wordt door middel van de code ‘K’, ‘O’ of ‘N’ aangegeven of dit een kosten-, omzet, dan wel neutrale rekening betreft. Dit is van belang voor de omzetbelasting.

Achter de omschrijving kan extra informatie worden opgegeven in de vorm ‘:trefwoord=waarde’. Hiermee kan voor resultaatrekeningen worden opgegeven of een BTW tarief van toepassing is (trefwoord ‘btw’). Ook kunnen op deze wijze grootboekrekeningen worden aangegeven als rekeningen met een speciale betekenis, de zogenaamde koppelingen (trefwoord ‘koppeling’).

8500 O Omzet projekten :btw=hoog

Er zijn vijf BTW tariefgroepen die kunnen worden opgegeven:

:btw=nul :btw=hoog :btw=laag :btw=privé :btw=anders

Ook is het mogelijk een van de in het onderdeel BTW tarieven gedefinieerde BTW codes op te geven:

:btw=4

Wanneer geen van bovenstaande aanduidingen is opgegeven, wordt het BTW 0% tarief toegepast bij boekingen op deze resultaatrekening.

Let op: Er is een significant verschil tussen ‘BTW 0%’ en ‘geen BTW’. Hoewel in beide gevallen het BTW bedrag nul is, telt een boeking met ‘BTW 0%’ mee voor de BTW aangifte (omzetboekingen met 0% BTW worden opgegeven bij onderdeel Belast met 0% / verlegd), terwijl een boeking met ‘geen BTW’ niet meetelt voor de BTW aangifte.

Naast het BTW tarief kan ook worden aangegeven of bij boekingen op deze rekening het bedrag standaard inclusief of exclusief wordt opgegeven:

:btw=hoog,excl :btw=laag,incl

Zonder nadere aanduiding wordt opgave inclusief verondersteld.

Balansrekeningen

Elke balansrekening wordt als volgt opgegeven in het schema-bestand:

1100 D Inventaris en inrichting 2100 C Afschrijving aanloopkosten

In plaats van de kostem/omzet/neutraal-aanduiding zoals bij de resultaatrekeningen wordt bij de balansrekeningen de aanduidingen ‘D’ en ‘C’ gebruikt om aan te geven dat dit een debte- dan wel credit-rekening betreft.

Wanneer bij boekingen op een balansrekening standaard BTW moet worden toegepast dan kan dit worden opgegeven zoals bij de resultaatrekeningen. In het geval van balansrekeningen moet echter ook worden aangegeven of de boeking als kosten dan wel omzetboeking moet worden beschouwd:

:btw=hoog,kosten :btw=laag,omzet

Koppelingen worden op dezelfde wijze aangeduid. Bijvoorbeeld, de standaardrekening voor inkoopboekingen:

4100 C Crediteuren :koppeling=crd

Voor een volledig overzicht van alle mogelijke koppelingen, zie Koppelingen.

EekBoek hanteert het principe dat negatieve getallen niet mogen voorkomen op de balans. Een debetrekening die negatief zou zijn wordt daarom als een positieve creditrekening weergegeven, een negatieve creditrekening wordt als een positieve debetrekening weergegeven. Soms is dit onwenselijk, in dit geval kan er achter de ‘D’ of ‘C’ een uitroepteken worden geplaatst om aan te geven dat deze rekening niet van teken mag wisselen.

De dagboeken

Dagboeken worden gedefinieerd in het onderdeel “dagboeken”. EekBoek ondersteunt vijf typen dagboeken: Kas, Bank, Inkoop, Verkoop en Memoriaal.

Elke administratie heeft een of meer dagboeken. Elk dagboek heeft een vrij te kiezen naam en een alfanumerieke of numerieke code van maximaal 4 tekens. Zowel de naam als de code moeten uniek zijn. Verder moet voor elk dagboek worden opgegeven van welk type het is.

Bij dagboeken van het type Kas en Bank moet altijd een tegenrekening worden opgegeven.
Bij dagboeken van het type Inkoop en Verkoop mag een tegenrekening worden opgegeven. Indien deze ontbreekt wordt de betreffende standaardrekening genomen, zie Koppelingen.
Bij dagboeken van het type Memoriaal mag een tegenrekening worden opgegeven.

Een illustratief voorbeeld:

Dagboeken K Kas :type=kas :rekening=2300 P Postbank :type=bank :rekening=2320 :dc R Rabobank :type=bank :rekening=2330 :dc I Inkoop :type=inkoop V Verkoop :type=verkoop M Memoriaal :type=memoriaal

De aanduiding ‘:dc’ kan worden gebruikt om te bepalen dat in overzichtsboekingen van dit dagboek de debet- en creditboekingen afzonderlijk worden getotaliseerd.

De BTW tarieven

De BTW tarieven worden gespecificeerd in het onderdeel “btw tarieven”. Dit onderdeel moet enkel worden opgegeven wanneer een BTW administratie wordt gevoerd.

Er zijn vijf tariefgroepen: “nul”, “hoog”, “laag”, “privé” en “anders”. De tariefgroep bepaalt het rekeningnummer waarop de betreffende boeking plaatsvindt, en de rubriek in de BTW aangifte waar deze boeking zal worden opgegeven. Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit in de praktijk niet snel zal voorkomen.

Elke tarief heeft een unieke, numerieke code. Deze kan o.m. worden gebruikt om expliciet een BTW tarief op te geven bij het boeken. Voor elk tarief (behalve die van groep "nul") moet verder het percentage worden opgegeven. Met de aanduiding ‘:exclusief’ kan worden opgegeven dat boekingen op rekeningen met deze tariefgroep standaard het bedrag exclusief BTW aangeven.

Een illustratief voorbeeld:

BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 19% incl. :tariefgroep=hoog :perc=19,00 2 BTW 19% excl. :tariefgroep=hoog :perc=19,00 :exclusief 3 BTW 6,0% incl. :tariefgroep=laag :perc=6,00 4 BTW 6,0% excl. :tariefgroep=laag :perc=6,00 :exclusief

De rekeningen waarop de BTW moet worden geboekt worden gespecifieerd met koppelingen.

Uitbreiden van het aantal verdichtingen

Soms kan het zijn dat het maximale aantal mogelijke verdichtingen en hoofdverdichtingen niet toereikend is. Dit kan dan worden uitgebreid door in het schemabestand vóór de definitie van de balans- en resultaatrekeningen de opdracht ‘Verdichting’ te gebruiken.

Verdichting maxhvd maxvrd

De beschikbare nummers voor een hoofdverdichting zijn dan 1 t/m maxhvd; voor de verdichtingen zijn de nummers maxhvd+1 t/m maxvrd beschikbaar.

De standaardwaarden zijn:

Verdichting 9 99

Opnieuw aanmaken schema-gegevens

Met de export opdracht wordt het schema van de onderhavige administratie uitgevoerd in een vorm die later weer kan worden gebruikt om in te voeren.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
setup/schema.html laatste aanpassing 04 december 2010, 15:59:47

EekBoek-2.02.04/doc/html/setup/opening.html0000444000076500007650000002546412165465617016242 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Opzetten administratie » Opening


Bestand opening.eb - Het openen van de administratie

Het openen van de administratie is de laatste stap in het gebruiksklaar maken. Alle opdrachten daartoe benodigd dienen te worden opgenomen in het bestand opening.eb.

Het openen omvat de volgende stappen:

De EekBoek opdrachten die te maken hebben met het openen van de administratie beginnen alle met het voorvoegsel adm_.

Het invoeren van administratie-specifieke gegevens

adm_naam "EekBoek Demo Administratie 2007"

Met deze opdracht wordt de naam van de te openen administratie opgegeven.
Deze opdracht is verplicht.

adm_btwperiode jaar

Met deze opdracht wordt de periode opgegeven waarin BTW aangifte moet worden gedaan. Mogelijke waarden zijn "jaar", "kwartaal" of "maand".
Deze opdracht is verplicht.

adm_begindatum 2007

Met deze opdracht wordt de begindatum opgegeven. Het boekjaar loopt dan van 1 januari tot en met 31 december van het opgegeven jaar.
Deze opdracht is verplicht.

adm_boekjaarcode 2007

Met deze opdracht wordt een code (verkorte aanduiding van maximaal 4 tekens) voor het boekjaar opgegeven. Aan de hand van deze code kan later het boekjaar worden geselecteerd.

Deze opdracht is niet verplicht. Indien geen code is opgegeven dan wordt het jaartal gebruikt.

Het invoeren van de openingsbalans

De openingsbalans wordt ingevoerd met de opdracht adm_balanstotaal, indien nodig gevolgd door twee of meermaal adm_balans.

adm_balanstotaal 15.854,77

Het totaal van de openingsbalans.

adm_balans 1100 1.344,37 adm_balans 1101 1.304,81 ...

Elke opdracht geeft het openingssaldo van de betreffende grootboekrekening. Aan het eind van de reeks moet het totaal van de debetrekeningen gelijk zijn aan het totaal van de creditrekeningen, en tevens gelijk aan het eerder opgegeven balanstotaal.

Boekhouders hebben een speciale opvatting over hoe het balanstotaal te bepalen. Voor een boekhouder geldt dat een negatief bedrag op een debetrekening aan de credit kant hoort, terwijl het rekenkundig gebruikelijk is een negatief getal van het saldo af te trekken. Hetzelfde geldt uiteraard voor negatieve bedragen op creditrekeningen, die door een boekhouder als debet worden beschouwd.

Bijvoorbeeld:

adm_balans debetrek 100 adm_balans debetrek -10 adm_balans creditrek 90

Rekenkundig gezien is de som van de debetzijde 100-10, dus 90, en gelijk aan de creditzijde. Boekhoudkundig gezien is de debetzijde 100, en de creditzijde 10+90, ook 100. In beide opvattingen is de belans in evenwicht, alleen het balanstotaal wijkt af.

EekBoek vindt beide opvattingen correct en zal daarom zowel de boekhoudkundige als de rekenkundige berekening van het balanstotaal accepteren.

Het invoeren van de openstaande posten

Indien er nog onbetaalde fakturen uit het voorgaande boekjaar staan, dan moeten die nu worden ingevoerd met een of meer adm_relatie opdrachten.

adm_relatie inkoop:2006:67 2003-12-31 KESTER "Printwerk" 48,79

De adm_relatie opdracht kent de volgende onderdelen:

  • Het boekstuknummer, in volledige vorm: Dagboek:Boekjaar:Volgnummer.
    Hier kan dus hetzelfde nummer worden opgegeven als in het oorpronkelijke, voorafgaande boekjaar is gebruikt.
    Belangrijk: Indien het oorspronkelijke dagboek niet in de huidige administratie voorkomt, kan een willekeurig inkoop/verkoop dagboek worden genomen. Het dagboek wordt uitsluitend gebruikt om te bepalen of deze relatie een debiteur dan wel crediteur is.
  • De faktuurdatum. Deze ligt dus vòòr het begin van dit boekjaar.
  • De omschrijving van de faktuur.
  • De relatie-code voor de betreffende debiteur/crediteur.
    Belangrijk: Deze code moet bekend zijn, zodat het nodig kan zijn eerst de opdracht relatie te gebruiken om de relatie te definiëren.
  • Het bedrag van de openstaande post.

Merk op dat alles na adm_relatie precies overeenkomt met een ‘normale’ in- of verkoopboeking.

Het eigenlijke openen.

Nadat alle informatie op bovenstaande wijze is opgegeven wordt als laatste opdracht gegeven om de administratie te openen:

adm_open

Het bestand opening.eb is nu klaar voor gebruik.

Let op! Openingsopdrachten kunnen ook interactief in de EekBoek shell worden ingegeven. Daarbij is van belang dat alle adm_ opdrachten voor de opening in dezelfde shell worden ingegeven. Het programma mag dus niet meerdere malen worden gestart met telkens een deel van de adm_ opdrachten.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
setup/opening.html laatste aanpassing 28 juli 2010, 20:25:58

EekBoek-2.02.04/doc/html/setup/mutaties.html0000444000076500007650000001067512165465617016434 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Opzetten administratie » Mutaties


Bestand mutaties.eb - De mutaties (boekingen)

Dit bestand bevat de mutaties (boekingen) die moeten worden uitgevoerd. Voor een nieuwe administratie zal dit bestand leeg zijn. Het moet echter wel worden aangemaakt. Dat kan door er b.v. een enkele commentaarregel in te plaatsen:

# Mutaties


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
setup/mutaties.html laatste aanpassing 27 januari 2008, 21:08:17

EekBoek-2.02.04/doc/html/cheat/0000755000076500007650000000000012165465617013630 5ustar jvjvEekBoek-2.02.04/doc/html/cheat/ix.html0000444000076500007650000000620312165465617015135 0ustar jvjv adm_balans
adm_balanstotaal
adm_begindatum
adm_boekjaarcode
adm_btwperiode
adm_naam
adm_open
adm_relatie
balans
boekjaar
btwaangifte
crediteuren
dagboeken
database
debiteuren
dump_schema
export
grootboek
inkoop
jaareinde
journaal
kas
memoriaal
openstaand
periodes
postbank
proefensaldibalans
rapporten
relatie
result
sql
toon
verkoop
verwijder EekBoek-2.02.04/doc/html/cheat/kop.html0000444000076500007650000000017412165465617015307 0ustar jvjv

Overzicht EekBoek Shell Opdrachten

EekBoek-2.02.04/doc/html/cheat/cheat.css0000444000076500007650000000055712165465617015433 0ustar jvjv body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; } .tg { font-family: Verdana, Arial, Helvetica, sans-serif; } .h3 { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; font-size: 120%; } .h1 { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; font-size: 200%; } EekBoek-2.02.04/doc/html/cheat/index.html0000444000076500007650000000073212165465617015625 0ustar jvjv Overzicht EekBoek Shell Opdrachten EekBoek-2.02.04/doc/html/cheat/details.html0000444000076500007650000005046112165465617016147 0ustar jvjv adm_balans
Specificeer een balanspost voor de openingsbalans.

  adm_balans balansrekening bedrag

De debet en credit boekingen moeten uiteindelijk allebei gelijk zijn
aan het opgegeven balanstotaal.

Indien er een bedrag is opgegeven voor de balansrekening Crediteuren
of voor Debiteuren, dan moeten er ook openstaande posten voor in
totaal dit bedrag worden ingevoerd met een of meer adm_relatie
opdrachten. Zie ook adm_relatie.

Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe
administratie. Zie adm_open voor meer informatie.

adm_balanstotaal
Specificeer het balanstotaal voor de in te voeren openingbalans.

  adm_balanstotaal bedrag

Het balanstotaal is de zowel de som van alle debet-posten als de som
van alle credit-posten van de openingsbalans. Als een balanstotaal is
opgegeven, moeten er ook openingsbalansboekingen worden uitgevoerd met
een of meer adm_balans opdrachten. Zie ook adm_balans.

Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe
administratie. Zie adm_open voor meer informatie.

adm_begindatum
Specificeer de begindatum van de administratie.
Een administratie loopt altijd van 1 januari tot en met 31 december
van een kalenderjaar. Daarom moet als begindatum een jaartal worden
opgegeven.

  adm_begindatum jaar

Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe
administratie. Zie adm_open voor meer informatie.

adm_boekjaarcode
Specificeer de boekjaarcode voor het nieuw te openen jaar.

  adm_boekjaarcode code

De boekjaarcode telt maximaal 4 letters en/of cijfers.
Standaard wordt het jaartal van het te openen boekjaar genomen.
De boekjaarcode is alleen belangrijk indien er meerdere boekjaren in één
administratie worden bijgehouden.

Deze opdracht kan worden gebruikt bij het openen van een boekjaar.
Zie adm_open voor meer informatie.

adm_btwperiode
Specifeer de BTW aangifteperiode voor het nieuw te openen jaar.

  adm_btwperiode [ jaar | kwartaal | maand ]

Deze opdracht kan worden gebruikt bij het openen van een boekjaar.
Zie adm_open voor meer informatie.

adm_naam
Specificeer de naam van de administatie, te gebruiken voor rapportages.

  adm_naam "Naam van de administratie"

Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe
administratie. Zie adm_open voor meer informatie.

adm_open
Het openen van een administratie kan slechts éénmaal gebeuren, vóór
het invoeren van de eerste mutatie. Het openen van een nieuw boekjaar
kan te allen tijde worden uitgevoerd, uiteraard maar één keer per
boekjaar.

Het openen kan een aantal opdrachten omvatten, en wordt afgesloten met
de opdracht "adm_open". Zolang deze laatste opdracht niet is gegeven
blijft de administratie ongewijzigd. Alle benodigde opdrachten moeten
dan ook in één enkele EekBoek shell sessie worden afgehandeld.

Mogelijke opdrachten voor openen van een boekjaar:

  adm_btwperiode [ jaar | kwartaal | maand ]
  adm_boekjaarcode code
                Een code van max 4 letters en/of cijfers waarmee het
		boekjaar kan worden geïdentificeerd.
		Standaard wordt het jaartal van het boekjaar genomen.
  adm_open
		Alle informatie die met de bovenstaande opdrachten is
		ingevoerd, wordt verwerkt.

Opdrachten voor het openen van een administratie:

  adm_naam "Naam van de administratie"
  adm_btwperiode [ jaar | kwartaal | maand ]
  adm_begindatum jaar
		Een administratie loopt altijd van 1 januari tot en
		met 31 december van een kalenderjaar.
  adm_boekjaarcode code
                Een code van max 4 letters en/of cijfers waarmee het
		boekjaar kan worden geïdentificeerd.
		Standaard wordt het jaartal van het boekjaar genomen.
		De boekjaarcode is alleen relevant indien er meerdere
		boekjaren in één administratie worden bijgehouden.
  adm_balanstotaal bedrag
		Als een balanstotaal is opgegeven, moeten er ook
		openingsbalansboekingen worden uitgevoerd met een of
                meer adm_balans opdrachten.
  adm_balans balansrekening bedrag
		De debet en credit boekingen moeten uiteindelijk
		allebei gelijk zijn aan het opgegeven balanstotaal.
		Indien er een bedrag is opgegeven voor de balansrekening
		Crediteuren of Debiteuren, dan moet er voor dit bedrag
		ook openstaande posten worden ingevoerd met een of
		meer adm_relatie opdrachten.
  adm_relatie boekstuk datum code omschrijving bedrag
		Invoeren van een openstaande post uit het voorgaande
		boekjaar. Het boekstuk moet volledig zijn, dus
                dagboek:boekjaar:nummer.
  adm_open
		Alle informatie die met de bovenstaande opdrachten is
		ingevoerd, wordt verwerkt.

adm_relatie
Specificeer een openstaande post uit een voorgaand boekjaar.

  adm_relatie boekstuk datum code omschrijving bedrag

Het boekstuk moet volledig zijn, dus dagboek:boekjaar:nummer.

Indien er voor de openingsbalans een bedrag is opgegeven voor de
balansrekening Crediteuren of voor Debiteuren, dan moeten er ook
openstaande posten voor in totaal dit bedrag worden ingevoerd. Zie ook
adm_balans.

Deze opdracht kan alleen worden gebruikt bij het openen van een nieuwe
administratie. Zie adm_open voor meer informatie.

balans
Toon de balansrekening.

Opties:
  geen                        Balans op grootboekrekening
  --verdicht                  Verdicht, gedetailleerd
  --detail=n                  Verdicht, mate van detail n = 0, 1 of 2
  --per=datum                 Selecteer einddatum
  --boekjaar=code             Selecteer boekjaar

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

boekjaar
Gebruik voor navolgende opdrachten het opgegeven boekjaar.

  boekjaar code

btwaangifte
Toon de BTW aangifte.

  btwaangifte [ opties ] [ aangifteperiode ]

Aangifteperiode kan zijn:

  j jaar                      Het gehele jaar
  k1 k2 k3 k4                 1e/2e/3e/4e kwartaal (ook: q1, ...)
  1 2 3 ...                   Maand (op nummer)
  jan feb ...                 Maand (korte naam)
  januari ...                 Maand (lange naam)

Standaard is de eerstvolgende periode waarover nog geen aangifte is
gedaan.

Opties:

  --definitief                De BTW periode wordt afgesloten. Er zijn geen
                              boekingen in deze periode meer mogelijk.
  --periode=periode           Selecteer aangifteperiode. Dit kan niet samen
                              met --boekjaar, en evenmin met de bovenvermelde
                              methode van periode-specificatie.
  --boekjaar=code             Selecteer boekjaar

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

crediteuren
Toont een overzicht van boekingen op crediteuren.

  crediteuren [ opties ] [ relatiecode ... ]

Opties:

  --periode=periode           Periode
  --boekjaar=code             Selecteer boekjaar

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

dagboeken
Toon een lijstje van beschikbare dagboeken.

  dagboeken

database
Toon de naam van de huidige database.

  database

debiteuren
Toont een overzicht van boekingen op debiteuren.

  debiteuren [ opties ] [ relatiecodes ... ]

Opties:

  --periode periode           Periode
  --boekjaar=code             Selecteer boekjaar

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

dump_schema
Reproduceert het schema van de huidige database en schrijft deze naar
standaard uitvoer.

  dump_schema                 Reproduceert het schema van de huidige database
                              en schrijft deze naar standaard uitvoer.

  dump_schema --sql naam      Creëert losse SQL bestandjes om het genoemde
                              schema aan te kunnen maken.

Zie ook export.

export
Exporteert de complete administratie.

  export [ opties ]

Opties:

  --output=bestand            Selecteer uitvoerbestand
  --dir=directory             Selecteer uitvoerdirectory
  --boekjaar=code             Selecteer boekjaar

Er moet of een --output of een --dir optie worden opgegeven.
Zonder --boekjaar selectie wordt de gehele administratie geëxporteerd.

grootboek
Toon het Grootboek, of een selectie daaruit.

  grootboek [ rek ... ]

Opties:

  --detail=n                  Mate van detail, n=0,1,2 (standaard is 2)
  --periode=periode           Alleen over deze periode

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

inkoop
Toevoegen boekstuk in dagboek Inkoop (type Inkoop).

  inkoop[:nr] [ datum ] boekstukomschrijving crediteur

gevolgd door een of meer:

  boekstukregelomschrijving bedrag rekening

Controle van het totale boekstukbedrag kan met de optie --totaal=bedrag.
De laatste rekening mag worden weggelaten.

jaareinde
Sluit het boekjaar af. De BTW rekeningen worden afgeboekt, en de
winst of het verlies wordt verrekend met de daartoe aangewezen
balansrekening.

Deze opdracht genereert twee rapporten: een journaal van de
afboekingen en een overzicht van eventuele openstaande posten. Indien
gewenst kan een bestand worden aangemaakt met openingsopdrachten voor
het volgende boekjaar.

  jaareinde [ opties ]

Opties:

  --boekjaar=code             Sluit het opgegeven boekjaar af.
  --definitief                Sluit het boekjaar definitief af. Er zijn
                              dan geen boekingen meer mogelijk.
  --verwijder                 Verwijder een niet-definitieve jaarafsluiting.
  --eb=bestand                Schrijf openingsopdrachten in dit bestand.

journaal
Overzicht journaalposten.

  journaal all                Alle posten
  journaal id                 Alleen boekstuknummer met dit id
  journaal dagboek            Alle journaalposten van dit dagboek
  journaal dagboek:n          Boekstuk n van dit dagboek
  journaal                    Journaalposten van de laatste boeking

Opties

  --[no]detail                Mate van detail, standaard is met details
  --totaal                    Alleen het totaal (detail = 0)
  --periode=XXX               Alleen over deze periode

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

kas
Toevoegen boekstuk in dagboek Kas (type Kas).

  kas[:nr] [ datum ] boekstukomschrijving

gevolgd door een of meer:

  crd [ datum ] code bedrag                             (betaling van crediteur)
  deb [ datum ] code bedrag                             (betaling van debiteur)
  std [ datum ] omschrijving bedrag rekening            (vrije boeking)

Controle van het eindsaldo kan met de optie --saldo=bedrag.
Controle van het totale boekstukbedrag kan met de optie --totaal=bedrag.
Voor deelbetalingen of betalingen met afwijkend bedrag kan in plaats van de
code het boekstuknummer worden opgegeven.

memoriaal
Toevoegen boekstuk in dagboek Memoriaal (type Memoriaal).

  memoriaal[:nr] [ datum ] boekstukomschrijving

gevolgd door een of meer:

  crd [ datum ] code bedrag                             (betaling van crediteur)
  deb [ datum ] code bedrag                             (betaling van debiteur)
  std [ datum ] omschrijving bedrag rekening            (vrije boeking)

Controle van het eindsaldo kan met de optie --saldo=bedrag.
Controle van het totale boekstukbedrag kan met de optie --totaal=bedrag.
Voor deelbetalingen of betalingen met afwijkend bedrag kan in plaats van de
code het boekstuknummer worden opgegeven.

openstaand
Toont een overzicht van openstaande posten.

  openstaand [ opties ]

Opties:

  --per=datum                 Einddatum
  --boekjaar=code             Selecteer boekjaar

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

periodes
De volgende periode-aanduidingen zijn mogelijk. Indien het jaartal ontbreekt,
wordt het huidige boekjaar verondersteld.

  2005-04-01 - 2005-07-31
  01-04-2005 - 31-07-2005
  01-04 - 31-07-2005
  01-04 - 31-07
  1 april 2005 - 31 juli 2005 (en varianten)
  1 apr 2005 - 31 jul 2005 (en varianten)
  apr - jul
  k2  (tweede kwartaal)
  april 2003 (01-04-2003 - 30-04-2003)
  april  (01-04 - 30-04 boekjaar)
  m4  (vierde maand)
  jaar (gehele boekjaar)

postbank
Toevoegen boekstuk in dagboek Postbank (type Bank).

  postbank[:nr] [ datum ] boekstukomschrijving

gevolgd door een of meer:

  crd [ datum ] code bedrag                             (betaling van crediteur)
  deb [ datum ] code bedrag                             (betaling van debiteur)
  std [ datum ] omschrijving bedrag rekening            (vrije boeking)

Controle van het eindsaldo kan met de optie --saldo=bedrag.
Controle van het totale boekstukbedrag kan met de optie --totaal=bedrag.
Voor deelbetalingen of betalingen met afwijkend bedrag kan in plaats van de
code het boekstuknummer worden opgegeven.

proefensaldibalans
Toon de Proef- en Saldibalans.

Opties:
  geen                        Proef- en Saldibalans op grootboekrekening
  --verdicht                  Verdicht, gedetailleerd (zelfde als --detail=2)
  --detail=n                  Verdicht, mate van detail n = 0,1,2
  --per=datum                 Selecteer einddatum
  --boekjaar=code             Selecteer boekjaar

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

rapporten
Alle rapport-producerende opdrachten kennen de volgende opties:

  --per=datum                 De einddatum voor de rapportage.
                              (Niet voor elke opdracht relevant.)
                              Zie periodes voor details.
  --periode=periode           De periode waarover de rapportage moet
                              plaatsvinden. (Niet voor elke opdracht relevant.)
                              Zie periodes voor details.
  --output=bestand            Produceer het rapport in dit bestand
                              Uitvoertype is afhankelijk van bestandsextensie,
                              bv. xx.html levert HTML, xx.txt een tekstbestand,
                              xx.csv een CSV, etc.
  --gen-type                  Forceer uitvoertype (html, csv, text, ...)
                              Afhankelijk van de beschikbare uitvoertypes zijn
                              ook de kortere opties --html, --csv en --text
                              mogelijk.
		              (Let op: --gen-XXX, niet --gen=XXX)
  --page=size                 Paginagrootte voor tekstrapporten.

relatie
Aanmaken een of meer nieuwe relaties.

  relatie [ opties ] { code omschrijving rekening } ...

Opties:

  --dagboek=dagboek           Selecteer dagboek voor deze relatie
  --btw=type                  BTW type: normaal, verlegd, intra, extra

*** BTW type 'verlegd' wordt nog niet ondersteund ***
*** BTW type 'intra' wordt nog niet geheel ondersteund ***

result
Toon de resultatenrekening.

Opties:
  geen                        Overzicth op grootboekrekening
  --verdicht                  Verdicht, gedetailleerd
  --detail=n                  Verdicht, mate van detail n = 0,1,2
  --periode=periode           Selecteer periode
  --boekjaar=code             Selecteer boekjaar

Zie verder rapporten voor algemene informatie over aan te maken
rapporten.

sql
Voer een SQL opdracht uit via de database driver. Met het gebruik
hiervan vervalt alle garantie op correcte resultaten.

  sql [ opdracht ]

toon
Toon een boekstuk in tekst- of commando-vorm.

  toon [ opties ] boekstuk

Opties:

  --boekjaar=code             Selekteer boekjaar
  --verbose                   Toon in uitgebreide (tekst) vorm
  --btw                       Vermeld altijd BTW codes
  --bsknr                     Vermeld altijd het boekstuknummer (default)

Het getoonde boekstuk wordt in de commando-historie geplaatst.
Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele
wijziging opnieuw ingevoerd.

verkoop
Toevoegen boekstuk in dagboek Verkoop (type Verkoop).

  verkoop[:nr] [ datum ] boekstukomschrijving debiteur

gevolgd door een of meer

  boekstukregelomschrijving bedrag rekening

Controle van het totale boekstukbedrag kan met de optie --totaal=bedrag.
De laatste rekening mag worden weggelaten.

verwijder
Verwijdert een boekstuk. Het boekstuk mag niet in gebruik zijn.

  verwijder [ opties ] boekstuk

Opties:

  --boekjaar=code             Selekteer boekjaar

Het verwijderde boekstuk wordt in de commando-historie geplaatst.
Met een pijltje-omhoog kan dit worden teruggehaald en na eventuele
wijziging opnieuw ingevoerd.

EekBoek-2.02.04/doc/html/intro/0000755000076500007650000000000012165465617013677 5ustar jvjvEekBoek-2.02.04/doc/html/intro/opening.eb0000444000076500007650000000221112165465617015640 0ustar jvjv# Voorbeeld opening.eb # Administratiegegevens. # Naam van de administratie. adm_naam "EekBoek Demo Administratie" # Periode waarover BTW aangifte moet worden gedaan. adm_btwperiode jaar # Begindatum van deze administratie. adm_begindatum 2007 # Standaard wordt voor als boekjaarcode het jaartal gebruikt. U kunt # ook iets anders opgeven. adm_boekjaarcode "2007" # Data voor openingsbalans: # Het balanstotaal is het totaal van alle debet posten, dat uiteraard # overeenkomt met het totaal van alle credit posten. adm_balanstotaal 15854,77 # De openingsposten. adm_balans 1100 1344,37 # Inventaris en inrichting adm_balans 1101 1304,81 # Afschr. Inv. en inr. adm_balans 1110 13378,48 # Computers adm_balans 1111 12106,78 # Afscr. computers adm_balans 2320 1131,92 # Saldo Postbank adm_balans 3100 2443,18 # Kapitaal # Openstaande posten uit voorgaande boekjaren als volgt: # Eerst, indien nodig, de betreffende relatie toevoegen: #relatie KESTER "Repro van Kesteren" 6950 # Dan het openstaande boekstuk: #adm_relatie inkoop:2006:67 2006-12-11 "KESTER" "Printwerk" 48,79 # Open de administratie. adm_open EekBoek-2.02.04/doc/html/intro/schema.dat0000444000076500007650000002273712165465617015642 0ustar jvjv# EekBoek Rekeningschema voor eekboek_sample # Content-Type: text/plain; charset = UTF-8 # Dit bestand definiëert alle vaste gegevens van een administratie of # groep administraties: het rekeningschema (balansrekeningen en # resultaatrekeningen), de dagboeken en de BTW tarieven. # # Algemene syntaxregels: # # * Lege regels en regels die beginnen met een hekje # worden niet # geïnterpreteerd. # * Een niet-ingesprongen tekst introduceert een nieuw onderdeel. # * Alle ingesprongen regels zijn gegevens voor dat onderdeel. # REKENINGSCHEMA # # Het rekeningschema is hiërarchisch opgezet volgende de beproefde # methode Bakker. De hoofdverdichtingen lopen van 1 t/m 9, de # verdichtingen t/m 99. De grootboekrekeningen zijn verdeeld in # balansrekeningen en resultaatrekeningen. # # De omschrijving van de grootboekrekeningen wordt voorafgegaan door # een vlaggetje, een letter die resp. Debet/Credit (voor # balansrekeningen) en Kosten/Omzet/Neutraal (voor resultaatrekeningen) # aangeeft. De omschrijving wordt indien nodig gevolgd door extra # informatie. Voor grootboekrekeningen kan op deze wijze de BTW # tariefstelling worden aangegeven die op deze rekening van toepassing # is: # # :btw=nul # :btw=hoog # :btw=laag # # Ook is het mogelijk aan te geven dat een rekening een koppeling # (speciale betekenis) heeft met :koppeling=xxx. De volgende koppelingen # zijn mogelijk: # # crd de standaard tegenrekening (Crediteuren) voor inkoopboekingen # deb de standaard tegenrekening (Debiteuren) voor verkoopboekingen # btw_ih de rekening voor BTW boekingen voor inkopen, hoog tarief # btw_il idem, laag tarief # btw_vh idem, verkopen, hoog tarief # btw_vl idem, laag tarief # btw_ok rekening voor de betaalde BTW # winst rekening waarop de winst wordt geboekt # # De koppeling winst is verplicht en moet altijd in een administratie # voorkomen in verband met de jaarafsluiting. # De koppelingen voor BTW moeten worden opgegeven indien BTW # van toepassing is op de administratie. # De koppelingen voor Crediteuren en Debiteuren moeten worden # opgegeven indien er inkoop dan wel verkoopdagboeken zijn die gebruik # maken van de standaardwaarden (dus zelf geen tegenrekening hebben # opgegeven). # Normaal lopen hoofdverdichtingen van 1 t/m 9, en verdichtingen # van 10 t/m 99. Indien daarvan wordt afgeweken kan dit worden opgegeven # met de opdracht "Verdichting". De twee getallen geven het hoogste # nummer voor hoofdverdichtingen resp. verdichtingen. # De nummers van de grootboekrekeningen worden geacht groter te zijn # dan de maximale verdichting. Daarvan kan worden afgeweken door # middels voorloopnullen de _lengte_ van het nummer groter te maken # dan de lengte van de maximale verdichting. Als bijvoorbeeld 99 de # maximale verdichting is, dan geeft 001 een grootboekrekening met # nummer 1 aan. Balansrekeningen 1 Vaste Activa 11 Materiële vaste activa 1100 D Inventaris en inrichting :btw=hoog,kosten 1101 C Afschrijving inv. & inr. 1110 D Computers :btw=hoog,kosten 1111 C Afschrijving computers 1120 D Wagenpark :btw=hoog,kosten 1121 C Afschrijving Wagenpark 2 Vlottende activa 21 Handelsvoorraden 2100 C Voorraad 22 Vorderingen 2200 D Debiteuren :koppeling=deb 23 Liquide middelen 2300 D Kas 2320 D Postbank 2330 D Postbank Inbedrijf 2390 D Kruisposten 3 Eigen vermogen 31 Kapitaal 3100 C Kapitaal de heer/mevrouw :koppeling=winst 3110 C Privé stortingen 3120 D Privé opnamen 4 Vreemd vermogen 41 Leveranciers kredieten 4100 C Crediteuren :koppeling=crd 4150 C Nog te ontvangen fakturen 42 Belastingen & soc. lasten 4200 C BTW Verkoop Hoog :koppeling=btw_vh 4210 C BTW Verkoop Laag :koppeling=btw_vl 4220 D BTW Inkoop Hoog :koppeling=btw_ih 4230 D BTW Inkoop Laag :koppeling=btw_il 4240 C BTW Autokostenvergoeding 4290 C Omzetbelasting betaald :koppeling=btw_ok Resultaatrekeningen 6 Kosten 61 Verkoopkosten 6100 K Reis- en verblijfkosten :btw=hoog 6110 K Sponsoring 62 Huisvestingskosten 6200 K Verzekeringen 63 Bedrijfsvoering 6310 K Kamer van Koophandel 6320 K Vakbond 6330 K Branche-organisatiekosten 66 Autokosten 6600 K Leasekosten auto :btw=hoog 6610 K Brandstof auto :btw=hoog 6620 K Onderhoud auto :btw=hoog 6630 K Verzekering auto 6640 K Kilometervergoedingen 6650 K Huur auto :btw=hoog 6660 K Motorrijtuigenbelasting 6670 K Boetes 6671 K Boetes 0% aftrekbaar 6680 K BTW privégebruik auto 6690 K Overige autokosten :btw=hoog 67 Contributies & abonnementen 6700 K Contributies & abonnementen :btw=hoog 6710 K Contr. & abonn. BTW 0% 68 Afschrijvingen 6800 K Afschr. kosten inv. & inr. 6810 K Afschr. kosten computers 6820 K Afschr. kosten wagenpark 69 Algemene kosten 6900 K Telefoon- en faxkosten :btw=hoog 6905 K Internetkosten :btw=hoog 6920 K Kantoorartikelen :btw=hoog 6921 K Computerbenodigdheden :btw=hoog 6930 K Vakliteratuur :btw=laag 6940 K Administratiekosten :btw=hoog 6950 K Drukwerk & papier :btw=hoog 6970 K Postzegels 6971 K Verzending portikosten 6980 K Bankkosten 6981 K Kasverschillen 6990 K Overige algemene kosten :btw=hoog 8 Bedrijfsopbrengsten 81 Omzet Consultancy 8100 O Omzet advisering :btw=hoog 8110 O Omzet advisering BTW vrij 82 Omzet Royalties 8200 O Omzet royalties BTW vrij 83 Omzet Editing 8300 O Omzet editing :btw=hoog 84 Omzet Cursussen 8400 O Omzet cursussen :btw=hoog 8410 O Omzet cursuslicenties :btw=hoog 85 Omzet Projekten 8500 O Omzet projekten :btw=hoog 89 Omzet Diversen 8900 O Omzet diversen BTW hoog :btw=hoog 8910 O Omzet diversen BTW laag :btw=laag 8920 O Omzet diversen BTW vrij 9 Financiële baten & lasten 91 Rente baten 9120 O Rente bate Postbank 9130 O Rente bate Postbank Inbedrijf 9190 O Rente bate overige 92 Rente- en overige financiële lasten 9220 K Rente last Postbank 9230 K Rente last Postbank Inbedrijf 9290 K Rente last overige 93 Overige baten 9390 O Kleine ondernemersregeling # DAGBOEKEN # # EekBoek ondersteunt vijf soorten dagboeken: Kas, Bank, Inkoop, # Verkoop en Memoriaal. Er kunnen een in principe onbeperkt aantal # dagboeken worden aangemaakt. # In de eerste kolom wordt de korte naam (code) voor het dagboek # opgegeven. Verder moet voor elk dagboek worden opgegeven van welk # type het is. Voor dagboeken van het type Kas en Bank moet een # tegenrekening worden opgegeven, voor de overige dagboeken mag een # tegenrekening worden opgegeven. Dagboeken I Inkoop :type=inkoop K Kas :type=kas :rekening=2300 M Memoriaal :type=memoriaal P Postbank :type=bank :rekening=2320 R Inbedrijf :type=bank :rekening=2330 V Verkoop :type=verkoop # BTW TARIEVEN # # Er zijn drie tariefgroepen: "hoog", "laag" en "nul". De tariefgroep # bepaalt het rekeningnummer waarop de betreffende boeking plaatsvindt. # Binnen elke tariefgroep zijn meerdere tarieven mogelijk, hoewel dit # in de praktijk niet snel zal voorkomen. # In de eerste kolom wordt de (numerieke) code voor dit tarief # opgegeven. Deze kan o.m. worden gebruikt om expliciet een BTW tarief # op te geven bij het boeken. Voor elk tarief (behalve die van groep # "nul") moet het percentage worden opgegeven. Met de aanduiding # :exclusief kan worden opgegeven dat boekingen op rekeningen met deze # tariefgroep standaard het bedrag exclusief BTW aangeven. # # BELANGRIJK: Mutaties die middels de command line shell of de API # worden uitgevoerd maken gebruik van het geassocieerde BTW tarief van # de grootboekrekeningen. Wijzigingen hierin kunnen dus consequenties # hebben voor de reeds in scripts vastgelegde boekingen. BTW Tarieven 0 BTW 0% :tariefgroep=nul 1 BTW 19% incl. :tariefgroep=hoog :perc=19,00 2 BTW 19% excl. :tariefgroep=hoog :perc=19,00 :exclusief 3 BTW 6,0% incl. :tariefgroep=laag :perc=6,00 4 BTW 6,0% excl. :tariefgroep=laag :perc=6,00 :exclusief # Einde EekBoek schema EekBoek-2.02.04/doc/html/intro/index.html0000444000076500007650000001402712165465617015676 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Inleiding


Inleiding

EekBoek is een boekhoudprogramma bedoeld voor het midden- en kleinbedrijf.

EekBoek is niet zomaar een conventioneel boekhoudprogramma. EekBoek is ontstaan uit de gedachte die iedere wat meer technisch onderlegde bedrijfsvoerder wel eens heeft gehad: “Boekhouden, da's toch gewoon wat getalletjes organiseren? Dat moet toch gemakkelijk kunnen met wat slimme scriptjes.”

Velen hebben pogingen daartoe gedaan, maar de meesten faalden omdat het toch iets complexer bleek te zijn. De goedbedoelde ‘slimme scriptjes’ werden weer afgedankt, en men nam noodgedwongen een commercieel, meestal op Microsoft Windows gebaseerd boekhoudpakket.

EekBoek is wel geslaagd in deze opzet. De ‘slimme scriptjes’ zijn weliswaar uitgegroeid tot een stevige applicatie, maar het geheel vertoont nog steeds alle kenmerken die zo belangrijk waren: eenvoudig in gebruik, zowel command line als GUI inzetbaar, en een programmeerbare API.

EekBoek slaat alle data op in een relationele database. De structuur van de administratie en de boekingsopdrachten kunnen worden onderhouden in twee eenvoudige tekstbestanden met overigens ook los uit te voeren commando's. Voor de andersdenkenden is een grafische user interface beschikbaar die op dezelfde database werkt. Een export-faciliteit kan van alles wat met de GUI is uitgevoerd weer tekstbestandjes maken. Op deze wijze blijft het geheel overzichtelijk.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
intro/index.html laatste aanpassing 28 juli 2010, 20:21:13

EekBoek-2.02.04/doc/html/intro/relaties.eb0000444000076500007650000000213212165465617016013 0ustar jvjvVoorbeeld relaties.eb # Aanmaken relaties. # # Syntax: # # Relatie "" standaardrekening # # Als dagboek wordt het laagstgenummerde inkoop/verkoop dagboek # genomen. Het is altijd beter het dagboek expliciet op te geven. # # Opties: # # --dagboek=XXXX selecteer dagboek # --btw=XXX btw type, zie verderop # # Een relatie is crediteur indien het dagboek een inkoopdagboek is. relatie --dagboek=inkoop \ XS4ALL "XS4All Internet B.V." 6905 relatie --dagboek=inkoop \ KPN "KPN" 6900 # Meerdere relaties kunnen ook in een keer: # # relatie --dagboek=inkoop \ # XS4ALL "XS4All Internet B.V." 6905 \ # KPN "KPN" 6900 # Een relatie is debiteur indien het dagboek een verkoopdagboek is. # Relatie "" standaardrekening relatie --dagboek=verkoop \ ACME "Acme Corp." 8100 # Relatie van buiten Europa. BTW code is 'extra'. # Andere mogelijkheden voor BTW zijn 'normaal', # 'verlegd' en 'intra' (intra-communautair, binnen Europa). relatie --dagboek=verkoop --btw=extra \ ORA "O'Reilly & Associates" 8200 EekBoek-2.02.04/doc/html/intro/backups.html0000444000076500007650000001411012165465617016210 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Inleiding » Backups


Backups

Alle waardevolle computergegevens moeten goed beveiligd worden en de Eekboek boekhouding vormt daar geen uitzondering op. Toch biedt EekBoek in tegenstelling tot de meeste andere boekhoudpakketten geen backupfaciliteiten.

De reden daarvoor is eenvoudig: het zou overbodig zijn. Immers, in tegenstelling tot de meeste andere boekhoudpakketten slaat EekBoek de gegevens niet op in allerlei cryptische en moeilijk toegankelijke bestanden. Zoals eerder beschreven kan de volledige administratie worden vastgelegd in enkele tekstbestanden. En deze zijn erg gemakkelijk te backuppen. En natuurlijk brengt u of uw systeembeheerder deze bestanden onder een versiebeheersysteem zoals CVS of GIT.

Hetzelfde kan worden toegepast voor de actuele EekBoek database. Het database management systeem biedt de mogelijkheid om een actuele database te 'dumpen' in de vorm van een tekstbestand met SQL opdrachten waarmee de database kan worden gereconstrueerd. En dit tekstbestand kunt u weer onder een versiebeheersysteem brengen.

De aanbevolen werkwijze is daarom ook om periodiek, bijvoorbeeld elke nacht, een dump van de database te maken, deze te updaten in het versiebeheersysteem, en vervolgens de data in het versiebeheersysteem te backuppen op een verwijderbaar medium. Op deze wijze zijn niet alleen de actuele gegevens veilig, maar ook de historie ervan.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
intro/backups.html laatste aanpassing 28 juli 2010, 20:21:09

EekBoek-2.02.04/doc/html/intro/working.html0000444000076500007650000002531412165465617016250 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Inleiding » Werkwijze


Werkwijze

Zoals verderop in deze documentatie wordt beschreven, wordt een EekBoek administratie bepaald door twee zaken: het schema en de mutaties.

Het schema bepaalt de structuur van de administratie, zoals het rekeningschema, de dagboeken en BTW tarieven. Het schema wordt aangemaakt en onderhouden in de vorm van een tekstbestand, dat bij het aanmaken van de administratie eenmalig wordt geladen in de database. Meer hierover in Het vullen van de database met de administratiegegevens.

De mutaties (in bredere zin) bepalen de inhoud van de administratie, zoals de debiteuren en crediteuren, openingsbalans, en de eigenlijke boekingen.

Vanwege de batch-faciliteit van de EekBoek shell is het mogelijk ook alle mutaties te onderhouden in een tekstbestand. Met een enkele druk op de knop kan te allen tijde de gehele administratie opnieuw worden opgebouwd door het verwerken van het schema en het mutatiebestand.

Natuurlijk is het ook mogelijk om incrementeel te werken, en steeds interactief met de EekBoek command line shell of de grafische shell mutaties toe te voegen. Of een combinatie: elke nieuwe mutatie toevoegen aan het mutatiebestand en dan alleen de nieuw toegevoegde mutaties via de batch-faciliteit verwerken. De meeste tekst-editors beschikken over de mogelijkheid om een deel van een tekstbestand naar een programma te sturen.

De EekBoek grafische shell werkt uiteraard incrementeel.

Het vier-bestanden systeem

De aanbevolen werkwijze omvat vijf bestanden.

Het schema: schema.dat
De structuur van de administratie.
Bekijk een voorbeeld.

De relaties: relaties.eb
In dit bestand worden alle relaties gedefinieerd.
Bekijk een voorbeeld.

De openingsgegevens: opening.eb
Dit bestand bevat de openingsgegevens, zoals administratienaam, BTW-periode en openingsbalans.
Bekijk een voorbeeld.

De mutaties: mutaties.eb
De boekingen. Voor een nieuwe administratie zal dit bestand nog leeg zijn.
Bekijk een voorbeeld.

De configuratiebeschrijving: eekboek.conf
Dit bestand beschrijft eigenschappen als de naam van de database en de te gebruiken database driver.
Bekijk een voorbeeld.

Het is ook mogelijk de relaties, opening en mutaties in een enkel bestand te onderhouden. In de praktijk werkt dit echter minder handig.

Tijdens het werken met de administratie kunnen nieuwe boekingen worden toegevoegd aan het mutaties bestand. Nieuwe relaties komen vanzelfsprekend in het relaties bestand. Het schema dient doorgaans enkel te worden aangepast als nieuwe grootboekrekeningen nodig zijn. De openingsgegevens zullen niet wijzigen.

Het is niet nodig om voor elke nieuwe boeking de gehele set bestanden opnieuw te verwerken. U kunt bijvoorbeeld de nieuwe boekingen in een afzonderlijk bestandje op te nemen, dit bestandje te verwerken in de bestaande administratie, en daarna de inhoud ervan toevoegen aan het mutaties bestand.

Er zijn vele wegen die naar Rome leiden. De ondersteuning door de standaard EekBoek tools gaat uit van het hier beschreven vier-bestandensysteem.

Import en Export

Met behulp van de EekBoek import voorziening kan een set van de vier hierboven beschreven bestanden eenvoudig worden verwerkt. Met de export voorziening kan te allen tijde de volledige inhoud van de administratie weer worden weggeschreven naar een volledige set van vier bestanden.
Zie voor meer informatie Import en Export.

Meerdere boekjaren

Na het einde van een boekjaar kan naar keuze in de huidige administratie worden doorgegaan met boeken, dan wel een nieuwe administratie worden opgezet. Beide methodes hebben voor- en nadelen.

In het geval meerdere boekjaren in een enkele administratie voorkomen is het gemakkelijker om oude boekstukken terug te vinden en rapportages te maken die over boekjaargrenzen lopen. Denk bijvoorbeeld aan een resultaatrekening van mei tot en met april voor een seizoensgebonden bedrijf. Of een resultaatrekening die meerdere jaren omvat.

Met één boekjaar per administratie blijft de administratie echter kleiner en gemakkelijker hanteerbaar.

EekBoek biedt voor deze laatste werkwijze een extra faciliteit: bij het afsluiten van een boekjaar kunnen de openingsgegevens voor het eropvolgende boekjaar automatisch worden aangemaakt. Door deze door middel van de include opdracht in de opening van het nieuwe boekjaar op te nemen, kunnen meerdere boekjaren in onafhankelijke administraties worden gevoerd, terwijl elke administratie toch steeds automatisch de meest actuele eindgegevens van het voorgaande boekjaar kan gebruiken.

Een voorbeeld. Stel u heeft de bestanden van boekjaar 2009 in de directory adm2009, en die van 2010 in adm2010. U neemt dan in adm2009/mutaties.eb als laatste opdracht op:

jaareinde --eb=opening2010.eb

Bij het verwerken van de mutaties wordt het boekjaar afgesloten en de openingsgegevens voor het volgende boekjaar geplaatst in het bestand opening2010.eb.

In het bestand adm2010/opening.eb neemt u dan de volgende opdrachten op:

adm_naam "Mijn Administratie 2010" adm_begindatum 2010 adm_btwperiode jaar include "../adm2009/opening2010.eb" adm_open

Bij het openen van de administratie worden dan steeds de meest recente, bij het afsluiten van het voorgaande boekjaar aangemaakte, gegevens gebruikt.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
intro/working.html laatste aanpassing 28 juli 2010, 20:24:19

EekBoek-2.02.04/doc/html/intro/mutaties.eb0000444000076500007650000001777612165465617016062 0ustar jvjv# Voorbeeld mutaties.eb. # Content-Type: text/plain; charset = UTF-8 # Inkopen (Dagboek: Inkoop) # Algemene vorm van de opdrachten: # # dagboek [ datum ] argumenten # # Argumenten inkoop: "Omschrijving" crediteurcode boekstukregel # Boekstukregel: "Omschrijving" bedrag [ grootboekrekening ] # # Standaard wordt de met deze crediteur geassocieerde # grootboekrekening gebruikt (zie relaties.eb). # # Standaard wordt het met de grootboekrekening geassocieerde BTW # tarief gebruikt. Dit kan worden gewijzigd door een toevoeging aan # het bedrag: # @0 geen BTW # @H pas het hoge tarief toe # @L pas het lage tarief toe # @n pas BTW code n toe (afgeraden) # # Een credit-boeking kan worden gespecificeerd door een negatief # bedrag. # Enkelvoudig, met één enkele boekstukregel. inkoop 05-01 "Internet" XS4ALL "ADSL" 22,80 # Meerdere boekstukregels; de grootboekrekening is dan verplicht. # De totaaltelling is optioneel, maar sterk aangeraden om fouten # te voorkomen. inkoop 15-01 "ADSL + Telefoon" KPN --totaal=104,65 \ "ADSL" 24,20 6905 \ "Telefoonkosten" 80,45 6900 inkoop 09-02 "Internet" XS4ALL "ADSL" 22,80 inkoop 08-03 "Internet" XS4ALL "ADSL" 22,80 inkoop 18-03 "Telefoonkosten" KPN "ADSL + Telefoon" 101,52 inkoop 05-04 "Internet" XS4ALL "ADSL" 22,80 inkoop 10-05 "Internet" XS4ALL "ADSL" 22,80 inkoop 20-05 "Telefoonkosten" KPN "ADSL + Telefoon" 102,22 inkoop 07-06 "Internet" XS4ALL "ADSL" 22,80 inkoop 05-07 "Internet" XS4ALL "ADSL" 22,80 inkoop 15-07 "Telefoonkosten" KPN "ADSL + Telefoon" 104,66 inkoop 09-08 "Internet" XS4ALL "ADSL" 22,80 inkoop 06-09 "Internet" XS4ALL "ADSL" 22,80 inkoop 16-09 "Telefoonkosten" KPN "ADSL + Telefoon" 108,72 inkoop 11-10 "Internet" XS4ALL "ADSL" 22,80 inkoop 07-11 "Internet" XS4ALL "ADSL" 22,80 inkoop 17-11 "Telefoonkosten" KPN "ADSL + Telefoon" 109,67 inkoop 06-12 "Internet" XS4ALL "ADSL" 22,80 # Expliciet boekstuknummer: inkoop:20 07-12 "Internet" XS4ALL "ADSL" 22,80 # Verkopen (Dagboek: Verkoop) # # Argumenten verkoop: "Omschrijving" debiteurcode boekstukregel # Boekstukregel: "Omschrijving" bedrag [ grootboekrekening ] # # Standaard wordt de met deze debiteur geassocieerde # grootboekrekening gebruikt (zie file relaties.eb). # # Zie de beschrijving bij Inkopen voor de mogelijkheden het # toegepaste BTW tarief te specificeren. # # Meerdere boekstukregels zijn mogelijk; de grootboekrekening is dan # verplicht. Zie bij Inkopen voor een voorbeeld. # # Een debet-boeking kan worden gespecificeerd door een negatief # bedrag. verkoop 18-02 "Perl Cursus" ACME "Perl Cursus 1e bet." 3570 8400 verkoop 18-03 "Perl Cursus" ACME "Perl Cursus 2e bet." 3570 8400 verkoop 18-04 "Perl Cursus" ACME "Perl Cursus rest" 595 8400 verkoop 14-05 "Ondersteuning" ACME "Consultancy" 714 verkoop 16-07 "Ondersteuning" ACME "Consultancy" 714 verkoop 19-08 "Pocket Reference" ORA "Produktie boek" 1000 8300 # Bank (Dagboek: Postbank) # # Argumenten bankboeking: "Omschrijving" boekstukregel # Boekstukregel: # std "Omschrijving" bedrag grootboekrekening # crd "Omschrijving" crediteurcode bedrag (negatief!) # deb "Omschrijving" debiteurcode bedrag # # Standaard wordt het eerste met deze crediteur/debiteur geassocieerde # open inkoop/verkoop-boekstuk afgeboekt. # # Voor deze boekingen geldt dat een negatief getal het banksaldo # vermindert, en een positief getal het saldo vermeerdert. # # 'std' boekingen met BTW zijn ongebruikelijk. # Daarom moet in dat geval de toepassing van BTW expliciet worden # opgegeven met de "@" toevoeging: # @0 geen BTW (onderdrukt de warschuwing) # @H pas het hoge tarief toe # @L pas het lage tarief toe # @n pas BTW code n toe (afgeraden) # BTW wordt geboekt op de BTW-Verkooprekening voor positieve bedragen, # en op de BTW-Inkooprekening voor negatieve bedragen. Dit kan worden # gewijzigd door aan de codering een "I" (Inkoop) of "V" (verkoop) toe # te voegen. # # Door het eindsaldo op te geven wordt dit geverifieerd. postbank 31-01 "Afschrift 1" --saldo=1001,77 \ std 06-01 "Girotel" -2,70 6980 \ crd 19-01 XS4ALL -22,80 \ crd 31-01 KPN -104,65 postbank 28-02 "Afschrift 2" --saldo=976,27 \ std 10-02 "Girotel" -2,70 6980 \ crd 23-02 XS4ALL -22,80 postbank 31-03 "Afschrift 3" --saldo=4419,25 \ std 09-03 "Girotel" -2,70 6980 \ deb 18-03 ACME 3570,00 \ crd 31-03 XS4ALL -22,80 \ crd 31-03 KPN -101,52 postbank 30-04 "Afschrift 4" --saldo=7963,75 \ std 06-04 "Girotel" -2,70 6980 \ crd 06-04 XS4ALL -22,80 \ deb 12-04 ACME 3570,00 postbank 31-05 "Afschrift 5" --saldo=8431,03 \ std 11-05 "Girotel" -2,70 6980 \ crd 31-05 XS4ALL -22,80 \ deb 31-05 ACME 595,00 \ crd 31-05 KPN -102,22 postbank 30-06 "Afschrift 6" --saldo=9119,53 \ std 08-06 "Girotel" -2,70 6980 \ deb 08-06 ACME 714,00 \ crd 21-06 XS4ALL -22,80 postbank 31-07 "Afschrift 7" --saldo=8989,37 \ std 06-07 "Girotel" -2,70 6980 \ crd 30-07 XS4ALL -22,80 \ crd 31-07 KPN -104,66 postbank 31-08 "Afschrift 8" --saldo=10677,87 \ std 10-08 "Girotel" -2,70 6980 \ deb 10-08 ACME 714,00 \ crd 10-08 XS4ALL -22,80 \ deb 19-08 ORA 1000,00 postbank 30-09 "Afschrift 9" --saldo=10543,65 \ std 17-09 "Girotel" -2,70 6980 \ crd 30-09 XS4ALL -22,80 \ crd 30-09 KPN -108,72 postbank 31-10 "Afschrift 10" --saldo=10518,15 \ std 12-10 "Girotel" -2,70 6980 \ crd 13-10 XS4ALL -22,80 postbank 30-11 "Afschrift 11" --saldo=10382,98 \ std 08-11 "Girotel" -2,70 6980 \ crd 30-11 XS4ALL -22,80 \ crd 30-11 KPN -109,67 # Er kan een expliciet volgnummer worden opgegeven. postbank:12 07-12 "Afschrift 12" --saldo 10357,48 \ std 06-12 "Girotel" -2,70 6980 \ crd 07-12 XS4ALL -22,80 # Partiele betalingen door het boekstuk op te geven i.p.v. de # debiteur/crediteur. postbank 09-12 "Eerste deel ADSL" --saldo=10347,48 \ crd 09-12 Inkoop:20 -10,00 # De rest van de betaling kan met opgave van boekstuk, maar natuurlijk # ook op de 'handige' manier waarbij EekBoek het zelf uitzoekt. postbank 10-12 "Tweede deel ADSL" --saldo=10334,68 \ crd 10-12 XS4ALL -12,80 # Afschrijvingen # # Memoriaal is als een bankboeking, maar er is geen impliciete # grootboekrekening waarop het totaal wordt geboekt. Het boekstuk moet # dus precies in balans zijn. # Ook hier geldt dat een positief bedrag de betreffende rekening # crediteert (vermeerdert) en een negatief bedrag vermindert. # Eveneens van toepassing is de opmerking bij Bankboekingen over 'std' # boekingen met BTW. memoriaal 31-12 "Afschrijving inventaris" \ std "Afschrijving" -411,26 6800 \ std "Afschrijving" 411,26 1101 memoriaal 31-12 "Afschrijving computers" \ std "Afschrijving" -396,82 6810 \ std "Afschrijving" 396,82 1111 # Rapportages voor de accountant. balans --output=balans.html balans --detail=2 --output=balans2.html result --output=result.html result --detail=2 --output=result2.html journaal --output=journaal.html grootboek --output=grootboek.html btwaangifte --output=btwaangifte.html openstaand --output=openstaand.html EekBoek-2.02.04/doc/html/intro/eekboek.conf0000444000076500007650000000336312165465617016156 0ustar jvjv; Example EekBoek config file. ; ; THESE ARE EXAMPLES. See http://www.eekboek.nl/docs/config.html ; for details. [general] ; Location where administrations are placed. ;admdir = $HOME/.eekboek/admdir ; Force wizard even if there's a config file in place. ;wizard = 0 [locale] ; Language selection (for international version only). ; Default value depends on the locale. ;lang = nl_NL [preferences] ; Show journal after each booking. ;journal = 1 [database] ; Name of the database to use. This is the name EekBoek uses to ; identify the database. Note that the actual name as used by the ; database system may be different. name = sample ; The database driver (postgres or sqlite). driver = sqlite ; Name of the system that runs the database, if not local. ;host = dbhost.example.com ; Access port for the database, if not local. ;port = 5432 ; User to access the database, if not current. ;user = eekboek ; Password for database access, if needed. ;password = secret [strategy] ; Method for rounding numbers (ieee, posix, bankers). ;round = ieee ; Combine bookings to match a payment. ;bkm_multi = 1 ; Do not try an alternative calculation if BTW does not match. ;iv_vc = 0 [shell] ; Private module with EekBoek extensions. ;userdefs = Userdefs [format] ; Date format (YYYY-MM-DD, DD-MM-YYY, DD-MM). ;date = DD-MM-YYYY ; Formatted numbers. Used to specify the decimal point and ; thousands separator. If longer than 9 characters, the display width ; is adjusted as well. ;amount = 1234,56 ;amount = 1.234,56 ;amount = 1234.56 ;amount = 1,234.56 [html] ; Where to find stylesheets. If omitted, default styles will be included. ; See the docs. ;cssdir = css [csv] ; Field separator for generated CSV files. ;separator = , [security] ; None, currently. EekBoek-2.02.04/doc/html/inex.html0000444000076500007650000002150412165465617014375 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Import en Export


Import en Export

Een EekBoek administratie kan te allen tijde worden geëxporteerd in de vorm van een set EekBoek bestanden, zoals beschreven in Werkwijze. Deze set bestanden kan vervolgens weer worden geïmporteerd. De resulterende administratie is dan zoveel mogelijk identiek aan het origineel.

Ook is het mogelijk een zogenaamde XML Auditfile Financieel (XAF) te produceren ten behoeve van accountantskantoren en de belastingdienst.

Export

De opdracht tot exporteren is export en heeft één argument: de bestemming. Dit kan zowel een bestandsnaam zijn, als een directory, welke zo nodig wordt aangemaakt.

export --dir=directory

Het is ook mogelijk deze opdracht direct op de command-line uit te voeren:

ebshell --export --dir=directory

In de opgegeven directory worden de volgende bestanden geplaatst:

  • Het schema: schema.dat
  • De relaties: relaties.eb
  • De openingsgegevens: opening.eb
  • De mutaties: mutaties.eb

Indien wordt geëxporteerd naar een bestand:

export --file=archive

Dit creëert het opgeven bestand met daarin alle benodigde data. Een eventueel reeds bestaand bestand wordt daarbij overschreven.

Het export-bestand is een ZIP file met daarin de eerdergenoemde bestanden. Het kan daarom ook met standaard zip utilities worden benaderd, bijvoorbeeld:

$ unzip -v export.ebz Archive: export.ebz Export van dataset sample aangemaakt door EekBoek op 2008-08-24 Length Method Size Ratio Date Time CRC-32 Name -------- ------ ------- ----- ---- ---- ------ ---- 9981 Defl:N 3376 66% 08-24-08 17:54 766dfc1a schema.dat 540 Defl:N 268 50% 08-24-08 17:54 2cb8b17d relaties.eb 726 Defl:N 384 47% 08-24-08 17:54 500ae1a9 opening.eb 4797 Defl:N 1183 75% 08-24-08 17:54 fc5f1b0e mutaties.eb -------- ------- --- ------- 16044 5211 68% 4 files

Import

Met de opdracht import wordt een eerder aangemaakt export bestand of set exportbestanden weer geïmporteerd.

import --dir=directory import --file=archive

Het is ook mogelijk deze opdracht direct op de command-line uit te voeren. Daarbij wordt, indien nodig, de database automatisch aangemaakt:

ebshell --import --dir=directory ebshell --import --file=archive

In dit geval moeten de --import en --file of --dir opties achteraan de opdrachtregel staan.

Aanmaken XML Auditfile Financieel

Iedere ondernemer krijgt op gezette tijden te maken met een controle van de Belastingdienst. Eén van de meest tijdrovende bezigheden daarbij is het verzamelen en overzichtelijk maken van de gegevens die de Belastingdienst voor de controle nodig heeft. Om te komen tot administratieve lastenverlichting voor het bedrijfsleven heeft de Belastingdienst in 1999 de Auditfile ontwikkeld, waarin de meeste gegevens die voor de controle noodzakelijk zijn, zijn opgenomen. Door technische vooruitgang heeft het XML-platform daarna de XML Auditfile Financieel ontwikkeld. Het platform is een samenwerkingsverband van SRA (samenwerkende registeraccountants & accountants-administratieconsulenten), softwareleveranciers en de Belastingdienst.

In tegenstelling tot de ‘oude’ Auditfile kunt u met de XML Auditfile Financieel maximaal gebruik maken van de mogelijkheden om gegevens uit te wisselen tussen de verschillende standaardpakketten, zoals die worden gebruikt in de accountantspraktijk.

De opdracht tot aanmaken van een XAF is export en heeft één verplicht argument: de bestemming.

export --xaf=bestand

Daarnaast kan met --boekjaar=code een ander dan het huidige boekjaar worden geselecteerd.

EekBoek exporteert op dit moment een partieel, doch bruikbaar XAF bestand.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
inex.html laatste aanpassing 28 juli 2010, 20:21:05

EekBoek-2.02.04/doc/html/stdacc.html0000444000076500007650000001711412165465617014675 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek


Koppelingen

Door middel van zogenaamde koppelingen kan een speciale betekenis worden toegekend aan grootboekrekeningen.

Bijvoorbeeld, de standaard tegenrekening voor inkoopboekingen heet conventioneel “Crediteuren”. In het schema kan deze koppeling worden aangegeven als volgt:

4100 C Crediteuren :koppeling=crd

De volgende koppelingen zijn mogelijk:

crd De standaard tegenrekening voor inkoopboekingen.
Deze koppeling moet in het schema voorkomen indien de adminstratie inkoopdagboeken heeft waaraan niet expliciet een rekeningnummer is verbonden.
deb De standaard tegenrekening voor verkoopboekingen.
Deze koppeling moet in het schema voorkomen indien de adminstratie verkoopdagboeken heeft waaraan niet expliciet een rekeningnummer is verbonden.
btw_ih De rekening voor BTW boekingen voor inkopen, hoog tarief.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_vh Idem, verkopen, hoog tarief.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_il Idem, inkopen, laag tarief.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_vl Idem, verkopen, laag tarief.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_ip Idem, inkopen, tarief ‘Privé’.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_vp Idem, verkopen, tarief ‘Privé’.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_ia Idem, inkopen, tarief ‘Anders’.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_va Idem, verkopen, tarief ‘Anders’.
Deze koppeling moet in het schema voorkomen als er BTW tarieven met deze tariefgroep zijn gedefinieerd.
btw_ok Rekening voor de betaalde BTW.
Deze koppeling moet in het schema voorkomen als de administratie BTW-plichtig is.
winst Rekening waarop het bedrijfsresultaat wordt geboekt.
Deze koppeling moet in het schema voorkomen.

Elke koppelingen mag ten hoogste éénmaal in het schema voorkomen.

Ongebruikte koppelingen worden bij het exporteren van het schema weggelaten.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
stdacc.html laatste aanpassing 28 juli 2010, 20:26:10

EekBoek-2.02.04/doc/html/ebshell/0000755000076500007650000000000012165465617014162 5ustar jvjvEekBoek-2.02.04/doc/html/ebshell/index.html0000444000076500007650000002124512165465617016161 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
De EekBoek shell


De EekBoek Shell

De EekBoek Shell ebshell is een tekst-interface voor het EekBoek systeem.

De shell kan op drie manieren worden gebruikt: interactief, single-line en batch.

In single-line mode wordt een enkele opdracht direct op de opstartregel meegegeven, voorafgegaan door de aanduiding -c:

ebshell -c btwaangifte januari

De shell draait in batch mode indien er bij het opstarten een bestand als standaardinvoer wordt meegegeven:

ebshell < opdrachten.eb

Het gehele bestand wordt gelezen en alle opdrachten uitgevoerd.

In batch mode geldt dat lege regels, en regels die met een #-teken beginnen worden genegeerd. Verder mogen opdrachten over meerdere regels worden gespreid door het plaatsen van een \-teken aan het eind van alle regels behalve de laatste, bijvoorbeeld:

postbank:12 12-03-2004 "Diverse boekingen" \ crd XS4ALL 21,78 \ deb ACME 632,11

Als de shell niet op een van bovengenoemde manieren wordt opgestart, dan draait hij interactief en zal opdrachten lezen vanaf de terminal. Elke ingelezen regel vormt een opdracht. Het inlezen van opdrachten vindt indien mogelijk plaats door middel van de Perl module Term::ReadLine::Gnu. Zie de documentatie van deze module voor alle mogelijkheden. Uitgevoerde opdrachten worden tot in bepaalde mate bewaard en kunnen later worden teruggehaald door middel van de pijltje-omhoog toets.

De shell interpreteert de invoer als een serie argumenten gescheiden door spaties of andere whitespace. Indien een argument spaties moet bevatten, bijvoorbeeld de omschrijving van een boeking, dan dient om dit argument aanhalingstekens te worden geplaatst. Een voorbeeld hiervan zag u reeds hierboven.

Completion

De shell ondersteunt zg. completion door middel van de TAB toets.

Aan het begin van de regel, bij het intoetsen van de naam van de opdracht, zal het indrukken van de TAB toets de opdrachtnaam aanvullen voor zover mogelijk, en anders een lijstje tonen van mogelijkheden.

Bij voorbeeld:

eekboek> ver[TAB] verkopen verwijder ver_

Na het intoetsen van de letters "ver" wordt op de TAB gedrukt. De opdracht "ver" is nog niet uniek, en de twee mogelijkheden "verkopen" en "verwijder" worden getoond. De ingetoetste tekst wordt weer aangeboden om verder afgemaakt te worden.

In boekingsopdrachten, op plaatsen waar de code van een relatie wordt verwacht, zal het indrukken van de TAB toets proberen de relatie code op te zoeken en af te maken. Zijn er meerdere mogelijkheden dan worden deze getoond:

eekboek> inkopen:24 16-08-2007 XS[TAB] inkopen:24 16-08-2007 XS4ALL _

In boekingsopdrachten, op plaatsen waar een grootboekrekening wordt verwacht, zal het indrukken van de TAB toets proberen dit nummer op te zoeken en af te maken, Zijn er meerdere mogelijkheden dan worden deze getoond, samen met de beschrijving van de grootboekrekening:

eekboek> inkopen:24 16-08-2007 XS4ALL Kosten 690[TAB] 6900 Telefoon- en faxkosten 6905 Internetkosten inkopen:24 16-08-2007 XS4ALL Kosten 490_

Emacs ondersteuning

Afhankelijk van de uitgevoerde installatie bevindt zich in de examples directory een major mode voor GNU Emacs: eekboek-mode.el.

Excuus

De EekBoek shell maakt gebruik van enkele standaard CPAN modules. Hierdoor kan het voorkomen dat er soms Engelse meldingen tussen de Nederlandse teksten door verschrijnen. Dit zal op termijn worden aangepast.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
ebshell/index.html laatste aanpassing 28 juli 2010, 20:20:44

EekBoek-2.02.04/doc/html/ebshell/files.html0000444000076500007650000001217612165465617016157 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
De EekBoek shell » Bestanden


Bestanden

Naast de configuratiebestanden maakt dit EekBoek programma gebruik van:

$HOME/.eekboek/history In dit bestand worden de eerder uitgevoerde opdrachten opgeslagen voor hergebruik.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
ebshell/files.html laatste aanpassing 28 juli 2010, 20:20:39

EekBoek-2.02.04/doc/html/ebshell/clo.html0000444000076500007650000001724412165465617015633 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
De EekBoek shell » Opties


Command line opties

--boekjaar=code Selecteer een boekjaar uit een administratie die meerdere boekjaren omvat.
-c
--command
De rest van de opdrachtregel wordt als een EekBoek shell opdracht geïnterpreteerd.
-e
--echo
In batch mode worden alle ingelezen commando's ook weggeschreven (ge-echo-t) naar de standaard uitvoer.
--export export-parameters Exporteer een administratie.
Zie de EekBoek opdracht export voor details.
--import import-parameters Importeer een administratie.
Zie de EekBoek opdracht import voor details.
Deze opdracht impliceert --createdb.
--init Initialiseer een nieuwe administratie uitgaande van de vier bestanden die zich in de huidige directory bevinden.
Zie de EekBoek opdracht import voor details.

De volgende opdrachten zijn alleen voor experts.

--wizard Forceer het opstarten van de administratie selectie wizard ook als er een configuratiebestand in de huidige directory aanwezig is.
-D var=waarde
--define var=waarde
Definieer configuratievariabelen. var heeft de vorm sectie:naam
-f cfg
--config=cfg
Specificeert een configuratiebestand. Zie Configuratiebestanden.
De wizard wordt in dit geval niet opgestart.
-P
--printcfg
De rest van de opdrachtregel wordt geïnterpreteerd als namen van configuratie-variabelen en de bijbehorenden waardes worden uitgeprint. Zie Configuratiebestanden.
Deze optie moet als eerste op de commandoregel voorkomen.
-X De standaard-configuratiebestanden worden niet gelezen. Dit is uiteraard alleen zinvol in combinatie met --config. Zie Configuratiebestanden.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
ebshell/clo.html laatste aanpassing 05 december 2010, 17:57:06

EekBoek-2.02.04/doc/html/ebshell/commands.html0000444000076500007650000002471212165465617016655 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
De EekBoek shell » Opdrachten


Opdrachten

De meeste ebshell opdrachten hebben betrekking op het uitvoeren van boekingen en het maken van rapportages. Deze opdrachten worden in de betreffende documentatie besproken.

Voor vrijwel alle ebshell opdrachten geldt dat er een korte uitleg wordt gegeven na ingeven van de opdracht help gevolgd door de naam van de opdracht. De losse opdracht help geeft een overzicht van alle opdrachten die uitleg kunnen geven.

adm_balans

Zie Het openen van de administratie.

adm_balanstotaal

Zie Het openen van de administratie.

adm_begindatum

Zie Het openen van de administratie.

adm_boekjaarcode

Zie Het openen van de administratie.

adm_btwperiode

Zie Het openen van de administratie.

adm_naam

Zie Het openen van de administratie.

adm_open

Zie Het openen van de administratie.

adm_relatie

Zie Het openen van de administratie.

balans

Maakt een balansoverzicht.
Zie Rapportages: Balans.

boekjaar

boekjaar code

Maakt het opgegeven boekjaar het standaard boekjaar voor volgende opdrachten.

btwaangifte

Produceert de gegevens voor de BTW aangifte.
Zie Rapportages: BTW aangifte.

dagboeken

Deze opdracht geeft een lijstje van beschikbare dagboeken.

exit

Deze opdracht beëindigt de EekBoek shell.

export

Zie Import en Export.

grootboek

Maakt het grootboekoverzicht.

Zie Rapportages: Grootboek.

help periodes

Deze opdracht geeft uitleg over de verschillende vormen waarin een periode-aanduiding kan worden gegeven.

help rapporten

Deze opdracht geeft uitleg over algemene zaken met betrekking tot het aanmaken van rapportages.

import

Zie Import en Export.

jaareinde

Zie De jaarafsluiting.

journaal

Toont alle uitgevoerde boekingen (het Journaal).
Zie Rapportages: Journaal.

logout

Deze opdracht beëindigt de EekBoek shell.

openstaand

Zie Rapportages: Openstaande posten.

proefensaldibalans

Zie Rapportages: Proef- en Saldibalans.

quit

Deze opdracht beëindigt de EekBoek shell.

relatie

Aanmaken nieuwe debiteur of crediteur. Zie Debiteuren en Crediteuren.

result

Aanmaken overzicht resultatenrekening.
Zie Rapportages: Resultatenrekening.

schema

Onderhoud van het schema.
Op dit moment kunnen hiermee alleen grootboekrekeningen worden toegevoegd aan een bestaande administratie. Dit is de in de praktijk meestvoorkomende behoefte.

Voorbeeld:

schema gbk 2305 D "Mijn bankrekening" 23

Dit maakt een nieuwe balansrekening 2305 aan als debetrekening onder verdichting 23. De verdichting bepaalt of het een balans of resultaatrekening is. Zie De administratiegegevens voor meer details over het schema en de grootboekrekeningen.

toon

Deze opdracht toont een boeking in een vorm waarin deze opnieuw (of gewijzigd) kan worden uitgevoerd.

De getoonde boeking wordt tevens teruggeplaatst in de invoer van de EekBoek shell en kan met de Pijltje-Omhoog toets worden klaargezet voor verdere verwerking.

De opdracht toont standaard de laatst uitgevoerde boeking, maar er kan ook een boekstuk worden geselecteerd door dit als argument mee te geven, bijvoorbeeld:

toon inkopen:12

verwijder

Deze opdracht verwijdert een boeking.

De verwijderde boeking wordt teruggeplaatst in de invoer van de EekBoek shell en kan met de Pijltje-Omhoog toets worden klaargezet voor verdere verwerking.

De opdracht verwijdert standaard de laatst uitgevoerde boeking, maar er kan ook een boekstuk worden geselecteerd door dit als argument mee te geven, bijvoorbeeld:

verwijder inkopen:12

Let op: Een boeking kan alleen worden verwijderd wanneer deze niet wordt gebruikt, bijvoorbeeld in een ander boekstuk.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
ebshell/commands.html laatste aanpassing 28 juli 2010, 20:20:34

EekBoek-2.02.04/doc/html/images/0000755000076500007650000000000012165465617014011 5ustar jvjvEekBoek-2.02.04/doc/html/images/valid-html401.png0000444000076500007650000000300612165465617017002 0ustar jvjvPNG  IHDRXTPLTE     $,#1'5*###(((432;;;B4G8M=NK?WE"[H$cO'lV+oX,uG9r[-~d1NNNROKVRMUUU\\\j]Jeeekkkrkappp{{{Z_ `cehkm!o%r)u1y6}8~>ELUZ]dhmt|̖ 6'<>*j5m6u:x<?B!L&rSN'P(_/o7z=~?kAEFXHJLkgrĜNފEΤQЦS֫UڮVޱXJMPTZ\^abe΅ЋҐԖ֘כ؟ڣۨݫ޲yC,tRNSVbKGDH pHYsHHFk>'IDATHOAǧZ @bJ+/KB )ED*J`F)mnkm# ߝ->5~~kݵZ8X4aSl.41Urɘ r|p0fppO$v7|'?խ9# 8``d0߱MQgKSP<(4&( 8ܢ=ǗЛpn l*<N`?SlE/pY ȅǺvx{ xosHnb mR 2ٛfL+e,XY@.|Cl|&n֕)+L$<ȱd Oa+n ڻLQS#MQQiEHV*1 GƋj*Q@JYe ;j.')nȇގ238{M" Ą @DܵJʪPnin+"n4Qxэ jjK`Fz\ 9O3CcKؘ7o=tmw{bk JgSWh5a8,þ֞x*,JM>A ' -n.g^xX d4W)AbX}yrW@NWJMoqbjIENDB`EekBoek-2.02.04/doc/html/images/validcss.png0000444000076500007650000000327212165465617016331 0ustar jvjvPNG  IHDRXTgAMA|Q cHRMz%u._:oi+PLTEs G6dT|LLLࡷْ,,,}}}!U捍 Md D]]]&YEp<<1999 ÜN^f3a̙3JZޱX{sf( fffffffffffffffffffffffffffffffffffffffffffffL1V9IDATxbP>bPa ݴ   @43 hf0@` 2 983 @s3120b`/ (@ &&!&&nÅEDDD93 CBAId8HOLAF0 CJ{m 9K!Dffl+~Җ $IaJ22`_ޭM\*LKNۥɍ擭\VJTHfQuyt(sJxž{RHǸ԰dGJ%iP>|F ֽuuHV*Ԕ8+.@@RzdVMۻo*4( q* )d' =6#5XN^3JYN&\ 1LETb!峜QݍGۧCݴr P:!*`hjR¸c @:<~习FN% ćPd(N9oXd62& Ft Npe(N鎵wm.iFiq\[eŖVJ\ *?J6e: j?("*ۆeHZp9rbsWrfJ@)S4\WK{[{=d.%$^sTR+|lm˃WJm\\i)  lϼ[>'eϬ@(č(5u2) mh B$l_ 8崁Lid_6Wk qOx*3-^,h+%Cn,wsHzX?JʔDlOF]庿ZWv-J#\erJ Fn)6錠y->gܨѮMs櫐N|ƕ}3-Ke6ĥvCδqWʹNFsV5dߋ+FoR[l%5T2ɭRcŹvŋ6|Tm.X+[~ r25Pv;vt"Lye~Q^%.'1F([zkp6v7'8yrϗߗ]5,{q䱞ٔpM Xaw3oVnkQ H_5Esۨ)X)=5w foʃ>N -IJG@HWP{hѦXn STPѶfcϭA( \ G:TWb9[R^aKI9#5;5FvoOqjm$;+SFLn{TJ` $YdtrJo_{ c^}H]uDRO$+KrӧM4i~0.Zk؄EekBoek-2.02.04/doc/html/images/perl_powered.png0000444000076500007650000000262412165465617017210 0ustar jvjvPNG  IHDR04PLTEIKYYVWzYgo{0,-LHI>:;dqussgeeN]", pHYsHHFk>zIDATX͘ҳ* {ݺz7y گ.Zi^BE 5KN|»|ԻywOccnr/ﻧ/acx12O)^PÇ1i]Wt`7O1K]bМ5{Ã5/m(i ~=۝o!kPJV(~èۨUk I{]P|B;Q@hz%p`hZFc\obL!qխǣa 5"\ʸ3No c>=a$X!J  #7Y60:{G^g6jh`7nC HЧ<䌂l_]rEz b,_DZ")YR4A'Mҋc.Eq sG1?˴ TgbWS1]+^Ǹ@Z8`!DCDt4 Q0Jcsc$X$ .IpV0pp6hX"C[nb,Q304b "5 S\iAy*B;ٷV1f<[Dϳv7P%ZZe^gB:jy0$1-߸!Pi?ŘA 碰5y׸9[\@bAa@ k|F7sV9 a<>ĸ;d8QŨ=^DA|GV#ŀ0apRLS0Y~z F2B& gNo(]+!Qxw2HEuw{{0 xoEM*OoԂv`I U 6le`j«-M1Iz` !Ԏ^U!X_&ּđ\=MSIOuUmNAT#]D%ѫ= lPLǟZ͛Gv׉pF-N.IENDB`EekBoek-2.02.04/doc/html/images/bg.gif0000444000076500007650000000022412165465617015064 0ustar jvjvGIF87a2,2sڋ޼H扦ʶ L ĢL*̦ JԪjܮ N (8HXhxiX;EekBoek-2.02.04/doc/html/images/valid-html401-blue.png0000444000076500007650000000320512165465617017730 0ustar jvjvPNG  IHDRXTPLTE !!%###!&*$*-(((&,0.5:33319>;;;5=C=FL?HO?IPKKLBLSOOPKW_TTT\\\D]oMYaP\dY^bVclYfp]kueeejkk`nxppp{{{Z_[ ` behkm2m!o%r)u1y9t5|8~gvhxIDATHǭSGbҩ0Z2IjwUZ*j0TIN*no~8d{~n=?e'/#_bzKM ,]# _ok;+tVD\&Eb_ڒ<Qo/pp3SթFFYNӇ勶8 &+XY'֧ ,uPw&)pm[2xM`p% L! T GA J|n mߐO1;>t[>/^ +(1_ĒΪwp 6ɧS9rTҘ 2FsŭO耙8KIC&U__Sx[1M, æY ыIRa1%*$QpX$9I4oQmp^=3(HGcD>XpV`mZ4^c- jȼP~{$&2 Gjչ4l[ud^GR1ǘ?3g?L!\\+(V6fڑ! ;3O۝Jq]&DDNu7j`{ܫ\JAQ:{uzBC,L~y6끭YzE(W?w^*0ؐ N@Q쉆VV? 1b ,ۋ}kZcq%­]r恭9X>WF5M]Igxlg!_<^\xR[cJhoQPb-9hOI\st^s'M!x~@m卯a*FHcYg i>c_\j=R;~qWh<>22]λ%%N3 5{9:.tIENDB`EekBoek-2.02.04/doc/html/images/eb.jpg0000444000076500007650000001533612165465617015107 0ustar jvjvJFIFQQC  !"$"$CW" =!1Aa"Qq2BRr# %b9!1AQ"aq2#B3Rr ?r555"@_4YW)?r`y<Fs/qO_RGV$M.V%.vʛ10B\qDe~RqOl~} Toj$W&(?>YPj7qEmVI$dQj xN$+POpDTqc)*x1pV= <ښ-%_?9sW_Tڋn2:bD(zNFZ֑UZ= kuJZ|J8=9⡛v(WSN 68>ڽx#Zyk#$`(MZT<(k,%S| !_`H?I;AJw{t%M2S}lTHR2t>[ ȝ)x)V{%) dv;]ͤmD6C_)3*9jfzhr#lJq BpRpzA^7OT\5Ze\PTGֿ^M4d7zGk- #[QBU!UWP9g$pzuj6~)(Hv'YIQ:>&"f*nMnSH>APu86E$wh-9sv2R\*סqj(YYBҧ@3A ˴&6;d#:ʇG)>4B5%Cm QcH 0OԄ}t֯HKվTALĂ?y*-dtd"[u [_:"Ȱ> QH_ *„ݦp:i: z+v(u٤RZ-LO+"{̞+G:tZE,Ai#=U{gwEp&ZJ.EXpzP@3hiNY[j+].4n4#9m]BBF0|vDYa0heWj(Y3HEKhEKV+}}n8ܔ;v, M<!E 9@ 9*2(Nİ u!Ry(t`?A'hIv6sM5Z\׻{s&PaeA+NH1TjLޅ'+dur_&uSiP*`6r:;?g )] $+V|nm 5j:T$s1Ge?̵%##D ڹ&#(kOum,Ik!R>lB]JOL!]^"qHҐz6; *%$ne04 rC1t„5!rCZI[YR2I> ;󴔦T=DDJ( :[5Xe$ƩiH mh# овz̸Zبu.gQH;iB}{3S!₏2R_J>x_MSۙ6T'ˊVAs侾({ «U&+' o wv뫊SbiPK 2 2=5Zi1Kǐ+8³G> E]]M|.If<9_GlJ8Q7`}#Xn^Ŷ,%-y!=g*)O`?a%Z.Zʮ25fÀ+s9$+qR-UHӤw%=[ e3&YJX&W-'rgjp*AeUN2ˆAz骤ʭgw/4JCJ)|'!d}HӃpUD&G"epWP }3 YzuʤEH9)j;e(eSFngWT-)%H nAQKlHNI@Ӭ Ͽ'w_i*ڛ6:G5S>vTYu n jtJH Θ ꍰs.+q3gs*S ?r篘=^s7l;54,ip<`ʲN>'PqLhALĵ T)Lp3]zxR3nt6%%,gCj*#ѪICEJ~G*JBsbWoL:T.HmCl@h5ʙ%uIZ\\P(YV-ڵf1("4ťP{-~zu>T)J+Fʠ3JguOh=Y$'bJcO@Ts RGnhWNhL{z6^$G\uF }ā!|yH9G"~:c? ~2Dr} !*#zGjz ~ECpuז]mP.!ƜHR;Ma1ԆD0zPPاJs[JN[ \'ĖRvRJOV,[riFԮ}T1$_UM+W`G=N2HKQ>}V!$J*CߙK] *Z^jRQ4R/QI}U6_pJUyiuӊ*RϯzkӸU~PnFQ̗P`-!\x>.X3E*HU)r_R H1ɶSŌWهyGL|Jܰ+7Ce΄ #==4!pWVQlZ>_[,u:"7ʤqKe$)@3Zz[.YԚfbNX܉m8M_XPğ).SR\.h+9GYrf+-:IEd~%:zN?N;O.ɐ }%X *`*$zR^e n,)_>*^7EС?[L@g)ԣN뽛S-~\H- G ĢI?\ui:ny(3_KgC GCX _ȠR[p[_㩤6[ːΉSo};R% 2g\qJW̝6kgoϥ><)T$2˸ERqWm]UHd)HӖ}m:wtAizJUK>=KC[N&\-1H•VxHXv2̴i! 3夫-DJ%GhTh@OA}@8Ԣ~l%1r~rڏfX !VrZ]g̉ ),+ʏSݵYX ηrMN$KDvV|JVU`Rh݋%O+ %)SjGQAƜ7#16`hKܭլuv3YGhen2|@TI\iՕ8JH&`#R mNҊB_ٶ,wv*YRR;ZsL\O% dc'' ]˚(uHLv*ՏFPzΖm mR *4MlNj@B-neM*>RG{{uvկ{bSMni A oI#V^iKB(ZL JV[*ӎ(c:I|˜+PLs\t< ^|A(2bI$e'Xzt6u}||I-™Bp q9(O>`26uMd:rV9`:[MA(Ą,<`;yÓ]{.JRĔ>j)%#Ӑ¾ښПdmM.V<qE\>Rq hĠvJdFޏ>6֔^uUURT40?MMMtfb!L#l/>%5PuII!OjjDS\-S@Kߦ[\C.6ˏSSR$|\ rd)?NJiM+'|響-MV* e9:ԉSSSR$cT_R('W#ܕilҚQ'|響2*r)$(-z}cV-JpqG/jjjD8ZT4|u\3J,"%~ԉ,{lx_oMMMMHEekBoek-2.02.04/doc/html/bookings/0000755000076500007650000000000012165465617014357 5ustar jvjvEekBoek-2.02.04/doc/html/bookings/receivable.html0000444000076500007650000002040512165465617017345 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Boekingen » Verkoopfakturen


Verkoopfakturen

Verkoopfakturen worden geboekt in een dagboek van het type Verkoop. Zo'n dagboek heet typisch “Verkoop” of “Verkopen”. De keuze van de naam is vrij, en er mogen meerdere verkoopdagboeken tegelijk zijn.

De naam van de boekingsopdracht is gelijk aan die van het dagboek. We nemen hier als voorbeeld het dagboek “Verkoop”.

Zoals alle boekingen bestaat ook de verkoopboeking uit twee delen: de boekstukkop en een of meer boekstukregels.

Syntaxvoorbeeld van een boekstukkop:

verkoop:12 11-09-2007 Consultancy ACME

De onderdelen:

verkoop:12 Het boekstuknummer. Dit bestaat uit de naam van het dagboek en het (vrij te kiezen) boekstuknummer, gescheiden door een dubbele punt ':'.
Het volgnummer mag worden weggelaten, in welk geval EekBoek zelf een volgnummer toekent. Het verdient echter aanbeveling om altijd expliciet een volgnummer op te geven.
11-09-2007 De boekingsdatum in een van de ondersteunde vormen.
Consultancy De omschrijving van dit boekstuk.
Indien deze spaties bevat moeten er aanhalingstekens omheen worden geplaatst.
ACME De code van de debiteur. Conventioneel wordt deze in hoofdletters gegeven, maar dit is niet vereist.

Syntaxvoorbeeld van een boekingsregel:

Werkzaamheden 369,82 8900

De onderdelen:

Werkzaamheden De omschrijving van deze boekstukregel.
Indien deze spaties bevat moeten er aanhalingstekens omheen worden geplaatst.
Als de boekstukregelomschrijving leeg is, b.v. "", dan wordt de omschrijving van het boekstuk overgenomen.
369,82 Het bedrag.
Een te ontvangen bedrag wordt als positief bedrag opgegeven, een debitering als negatief bedrag.
Achter het bedrag mag een BTW-specificatie worden opgegeven.
8900 De grootboekrekening waarop dit bedrag moet worden geboekt. Deze rekening behoort een omzetrekening te zijn.

Zoals gezegd kan een boekstuk meerdere regels bevatten. Dit wordt voornamelijk bepaald door de aard van de faktuur. De som van alle bedragen is het boekstuktotaal. Dit wordt geboekt op de vaste tegenrekening voor verkoopboekingen (zie Koppelingen).

Let op: Als u opdrachten direct ingeeft in de EekBoek shell, moet de gehele opdracht op één enkele regel worden ingegeven! Dit in tegenstelling tot de zogenaamde batch mode, waarbij opdrachten over meerdere regels mogen worden ingegeven.

Aan een boeking kan ook een referentienaam worden toegekend met --ref=XXXX. De opgegeven code moet tenminste één letter of onderstreep bevatten. Bij het boeken van betalingen kan aan deze boeking worden gerefereerd door de relatiecode en referentie op te geven, gescheiden door een dubbele punt ':'.

Tot slot is het mogelijk het boekstuktotaal te verifiëren door aan de boekingsopdracht de optie '--totaal=bedrag' toe te voegen.

Creditering van verkoopfakturen

Met het crediteren van een verkoopfaktuur wordt deze niet automatisch als afgewerkt beschouwd. In het overzicht Openstaande Posten zullen dus zowel de oorspronkelijke, als de credit-faktuur worden getoond.

De beide boekingen dienen daarom tegen elkaar te worden weggeboekt in een memoriaalboeking, bijvoorbeeld:

memoriaal 20-11-2007 Creditering \ deb ACME 369,82 \ deb ACME -369,82


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
bookings/receivable.html laatste aanpassing 22 februari 2010, 09:34:08

EekBoek-2.02.04/doc/html/bookings/index.html0000444000076500007650000001615712165465617016364 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Boekingen


Boekingen

Alle wijzigingen in de boekhouding worden uitgevoerd door middel van boekingen. Voorbeelden van boekingen zijn inkoopfakturen, verkoopfakturen, giro- en bankafschriften, en afschrijvingen.

Boekingen vinden plaats in z.g. dagboeken. Een administratie kan een willekeurig aantal dagboeken omvatten, variërend van een stuk of vijf tot vele tientallen, zelfs honderden. In elk van de dagboeken vinden verwante boekingen plaats.

EekBoek ondersteunt vijf soorten dagboeken:

  • Inkoop, voor het boeken van inkoopfakturen;
  • Verkoop, voor het boeken van verkoopfakturen;
  • Bank, voor het boeken van giro- en bankafschriften;
  • Kas, voor het boeken van kastransacties;
  • Memoriaal, voor overige boekingen.

Aan elk dagboek, behalve de memoriaals, is een grootboekrekening gekoppeld (zie Koppelingen). Boekhoudtechnisch moet elke boeking in evenwicht zijn, dus evenveel debet als credit. Dit wordt bereikt door het totale bedrag van de boeking tegen te boeken op de gekoppelde grootboekrekening.

Elke boeking resulteert in een journaalpost. In de EekBoek shell kan deze journaalpost worden getoond door direct na de boekingsopdracht de opdracht journaal in te geven. Ook is het mogelijk de EekBoek shell op te starten met de command line optie --journaal, waardoor de journaalposten automatisch worden getoond na elke boeking.

Identificatie van boekingen: boekstuknummers

Elke boeking in het systeem is uniek identificeerbaar middels het boekstuknummer.

Het boekstuknummer wordt gevormd door de naam van het dagboek, een dubbele punt ':', en het volgnummer. Dit laatste nummer is bij het boeken vrij te kiezen maar het verdient aanbeveling (en het is wettelijk verplicht) om aaneengesloten nummers te gebruiken.

Indien een administratie meerdere boekjaren omvat kunnen de boekstukken uit een ander boekjaar worden geïdentificeerd door de boekjaarcode ook op te nemen in het boekstuknummer, b.v. inkopen:2006:57.

Verwijderen van boekingen

De EekBoek shell opdracht verwijder verwijdert een boeking.

De verwijderde boeking wordt teruggeplaatst in de invoer van de EekBoek shell en kan met de Pijltje-Omhoog toets worden klaargezet voor verdere verwerking.

De opdracht verwijdert standaard de laatst uitgevoerde boeking, maar er kan ook een boekstuk worden geselecteerd door dit als argument mee te geven, bijvoorbeeld:

verwijder inkopen:12

Let op: Een boeking kan alleen worden verwijderd wanneer deze niet wordt gebruikt, bijvoorbeeld in een ander boekstuk.

De opdracht toon toont een boeking in een vorm waarin deze opnieuw (of gewijzigd) kan worden uitgevoerd.

De getoonde boeking wordt tevens teruggeplaatst in de invoer van de EekBoek shell en kan met de Pijltje-Omhoog toets worden klaargezet voor verdere verwerking.

De opdracht toont standaard de laatst uitgevoerde boeking, maar er kan ook een boekstuk worden geselecteerd door dit als argument mee te geven, bijvoorbeeld:

toon inkopen:12


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
bookings/index.html laatste aanpassing 24 augustus 2008, 16:42:10

EekBoek-2.02.04/doc/html/bookings/btw.html0000444000076500007650000002076712165465617016053 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Boekingen


BTW (Omzetbelasting)

Indien wordt geboekt op een grootboekrekening waaraan een BTW-tarief is gekoppeld, dan zal dit voor deze boeking worden doorberekend. Het opgegeven bedrag is dan het te boeken bedrag inclusief BTW. Het is mogelijk hiervan af te wijken door een expliciete BTW-specifcatie op te geven, zie verderop.

Er zijn drie factoren die een rol spelen bij het bepalen van de omzetbelasting.

  1. De BTW tariefgroep: Hoog, Laag, Privé, Anders, of Nul.
    Dit bepaalt de hoogte van de in rekening te brengen BTW, en waar deze op de BTW aangifte moet worden vermeld.

  2. Voor inkoop- en verkoopboekingen: de BTW-status van de relatie.
    Bepalend is of de relatie binnen of buiten de EU is gevestigd, of dat BTW is verlegd.

  3. Of de boeking betrekking heeft op Kosten, Omzet, of Neutraal.
    BTW berekend op kostenboekingen wordt bij de uiteindelijke BTW aangifte verrekend als voorheffing. De BTW berekend op omzet moet bij de aangifte worden afgedragen. Daarnaast bepaalt deze indeling of een boeking zonder BTW, dus met tarief ‘Nul’, moet worden opgevoerd op de aangifte. Enkel boekingen op neutrale grootboekrekeningen worden niet meegenomen in de BTW aangifte.

BTW-specificatie in boekstukken

Met een expliciete BTW-specificatie kan worden bepaald of op een boeking BTW moet worden toegepast, en kan worden gekozen voor het hoge of lage tarief. Tevens kan worden opgegeven of het te boekden bedrag inclusief of exclusief BTW is. Tot slot kan worden bepaald of de boeking betrekking heeft op kosten of omzet. Elk van deze onderdelen mag ontbreken, en EekBoek zal dan de instellingen van de betreffende grootboekrekening gebruiken.

Een BTW-specificatie wordt toegevoegd aan het te boeken bedrag in de vorm ‘@XX’. XX bestaat uit drie tekens, die elk mogen ontbreken.

N
H
L
0
n
(Neutraal) Pas geen BTW toe.
(Hoog) Pas het hoge BTW tarief toe.
(Laag) Pas het lage BTW tarief toe.
(Het cijfer nul) BTW 0% toepassen.
Pas de BTW toe volgens de BTW code n.
Standaard wordt het BTW-tarief toegepast dat aan de betreffende grootboekrekening is toegekend.
-
+
Het opgegeven bedrag is exclusief BTW.
Het opgegeven bedrag is inclusief BTW.
Het standaardgedrag wordt afgeleid van het BTW-type van de betreffende grootboekrekening.
Deze aanduiding kan niet worden gebruikt indien voorafgaand een BTW code is opgegeven.
K
O
De boeking betreft Kosten.
(De letter O) De boeking betreft Omzet.
Standaard wordt de kosten/omzet indeling van de betreffende grootboekrekening gebruikt. Deze aanduiding moet worden opgegeven indien BTW moet worden toegepast bij boeking op een balansrekening, of op een neutrale resultaatrekening.
Voor boekingen in inkoop- en verkoopdagboeken, alsmede boekingen gekoppeld aan een debiteuren of crediteurenbetaling maakt het niet uit of kosten of omzet wordt aangegeven, in deze gevallen bepaalt de debiteuren- of crediteurenrekening altijd de aard van de boeking.

BTW-afrondingen

Bij het boeken in een Inkoop- of Verkoopdagboek wordt de BTW berekend per boekstukregel. Soms worden in fakturen de boekstukregels opgeteld, en daarover de BTW berekend. Hierdoor kunnen afrondingsverschillen ontstaan. Wanneer aan een boeking een totaalbedrag is meegegenve (de --totaal optie) zal het boekstuktotaal niet kloppen met de opgegeven waarde en de boeking zal dan worden geweigerd.

EekBoek zal in dit geval echter eerst proberen zo'n boeking te corrigeren door de BTW te herberekenen over het totaal van de boekstukregels. Indien het opgeven totaalbedrag dan wel klopt met het boekstuktotaal dan wordt een melding gegeven, en een correctieboekstukregel aangemaakt.

Indien deze voorziening ongewenst is kan deze worden afgezet met de configuratie-optie iv_vc.

Zie ook ...

BTW codering in het schema.

De BTW aangifte.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
bookings/btw.html laatste aanpassing 12 februari 2009, 16:37:33

EekBoek-2.02.04/doc/html/bookings/memorial.html0000444000076500007650000001240512165465617017052 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Boekingen » Memoriaal


Het memoriaal

In dagboeken van het type Memoriaal kunnen vrije boekingen worden uitgevoerd, d.w.z. boekingen die niet zijn gekoppeld aan inkoop, verkoop, bank en kas. Een typisch voorbeeld zijn afschrijvingen en correcties.

Een memoriaal dagboek heet typisch “Memoriaal”. De keuze van de naam is vrij, en er mogen meerdere memoriaal-dagboeken tegelijk zijn.

Een memoriaal-boeking is in vrijwel alle opzichten hetzelfde als het boeken van een giro- of bankafschrift, op deze verschillen na:

  • Er hoeft geen grootboekrekening (tegenrekening) te zijn gekoppeld aan het memoriaal. Is dat niet het geval dan moet het boekstuktotaal nul zijn omdat een boeking immers altijd in balans moet zijn.
  • Vrije boekingen waarop BTW moet worden toegepast zijn niet zonder meer mogelijk. Indien er wordt geboekt op een grootboekrekening waaraan een BTW tarief is gekoppeld dan moet een expliciete BTW-specificatie worden meegegeven. Zonder deze specificatie krijgt u de waarschuwing: “Boekingen met BTW zijn niet mogelijk in een memoriaal. De BTW is op nul gesteld.”
Zie verder bij Giro- en Bankafschriften.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
bookings/memorial.html laatste aanpassing 24 augustus 2008, 17:02:31

EekBoek-2.02.04/doc/html/bookings/payable.html0000444000076500007650000002652112165465617016666 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Boekingen » Inkoopfakturen


Inkoopfakturen

Inkoopfakturen worden geboekt in een dagboek van het type Inkoop. Zo'n dagboek heet typisch “Inkoop” of “Inkopen”, maar de keuze van de naam is vrij. Ook mogen er meerdere inkoopdagboeken tegelijk zijn.

De naam van de boekingsopdracht is gelijk aan die van het dagboek. We nemen hier als voorbeeld het dagboek “Inkoop”.

Zoals alle boekingen bestaat ook de inkoopboeking uit twee delen: de boekstukkop en een of meer boekstukregels.

Syntaxvoorbeeld van een boekstukkop:

inkoop:24 14-09-2007 Kantoorartikelen OFFCENTR

De onderdelen:

inkoop:24 Het boekstuknummer. Dit bestaat uit de naam van het dagboek en het (vrij te kiezen) boekstuknummer, gescheiden door een dubbele punt ':'.
Het volgnummer mag worden weggelaten, in welk geval EekBoek zelf een volgnummer toekent. Het verdient echter aanbeveling om altijd expliciet een volgnummer op te geven.
14-09-2007 De boekingsdatum in een van de ondersteunde vormen.
Kantoorartikelen De omschrijving van dit boekstuk.
Indien deze spaties bevat moeten er aanhalingstekens omheen worden geplaatst.
OFFCENTR De code van de crediteur. Conventioneel wordt deze in hoofdletters gegeven, maar dit is niet vereist.

Syntaxvoorbeeld van een boekingsregel:

Papier 29,95 6950

De onderdelen:

Papier De omschrijving van deze boekstukregel.
Indien deze spaties bevat moeten er aanhalingstekens omheen worden geplaatst.
Als de boekstukregelomschrijving leeg is, b.v. "", dan wordt de omschrijving van het boekstuk overgenomen.
29,95 Het bedrag.
Een te betalen bedrag wordt als positief bedrag opgegeven, een credit-faktuur als negatief bedrag.
Achter het bedrag mag een BTW-specificatie worden opgegeven.
6950 De grootboekrekening waarop dit bedrag moet worden geboekt. Deze rekening behoort een kostenrekening te zijn.

Zoals gezegd kan een boekstuk meerdere regels bevatten. Dit wordt voornamelijk bepaald door de aard van de faktuur. De som van alle bedragen is het boekstuktotaal. Dit wordt geboekt op de vaste tegenrekening voor inkoopboekingen (zie Koppelingen).

Let op: Als u opdrachten direct ingeeft in de EekBoek shell, moet de gehele opdracht op één enkele regel worden ingegeven! Dit in tegenstelling tot de zogenaamde batch mode, waarbij opdrachten over meerdere regels mogen worden ingegeven.

Aan een boeking kan ook een referentienaam worden toegekend met --ref=XXXX. De opgegeven code moet tenminste één letter of onderstreep bevatten. Bij het boeken van betalingen kan aan deze boeking worden gerefereerd door de relatiecode en referentie op te geven, gescheiden door een dubbele punt ':'.

Tot slot is het mogelijk het boekstuktotaal te verifiëren door aan de boekingsopdracht de optie --totaal=bedrag toe te voegen.

Een voorbeeld (de opdracht is over meerdere regels gespreid voor de duidelijkheid):

inkoop:24 14-09-2007 Kantoorartikelen OFFCENTR --totaal=54,25 \ Papier 29,95 6950 \ Leerboek 24,30@L 6930

In dit voorbeeld worden twee boekstukregels verwerkt in dagboek Inkoop. Op het leerboek is het lage BTW tarief van toepassing, dit is opgegeven door middel van de toevoeging @L.

Een wat meer complex voorbeeld. KPN stuurt een telefoonrekening van 131,68. Het bedrag exclusief BTW is 110,73. Van dit bedrag is 0,48 BTW-vrij. Dit resulteert in de volgende boeking:

Inkoop:22 31-08-2007 KPN --totaal=131,68 \ "Telefoon BTW hoog" 110,73-0,48@H- 6900 \ "Telefoon BTW vrij" 0,48@0 6900

In de eerste boekstukregel wordt de 0,48 afgetrokken van 110,73, en dat geheel wordt geboekt tegen BTW tariefcode H-, dit is hoog tarief waarbij het bedrag exclusief de BTW wordt opgegeven.

In de tweede boekstukregel wordt de 0,48 opgevoerd zonder BTW (toevoeging @0).

Afrondingsverschillen in de BTW berekening

Neem de volgende faktuur.

inkoop 03-03-2007 "Twee dingetjes" LCIER --totaal=11,06 \ "Ding 1" 0,69@- 6920 \ "Ding 2" 8,60@- 6920

De BTW over 0,69 bedraagt 0,13, en de BTW over 8,60 bedraagt 1,63. Het boekstuktotaal wordt daarmee 11,05, wat niet overeenkomt met de opgegeven 11,06.

In dit geval heeft de leverancier de BTW namelijk niet berekend per faktuurregel, maar over het totaal. De BTW over 9,29 bedraagt 1,77 wat het boekstuktotaal op 11,06 brengt.

EekBoek zal, na vaststelling dat het boekstuktotaal niet klopt, een herberekening van de BTW uitvoeren, ditmaal over het totaal van de faktuurregels. Klopt het boekstuktotaal dan wel dan wordt een melding afgedrukt en een correctieboeking aangemaakt. De journaalpost voor bovenstaande boeking wordt dan:

Boekstuk/Grootboek Rek Debet Credit Boekstuk/regel --------------------------------------------------------------- Inkoop:83 Twee dingetjes BTW Inkoop Hoog 4220 1,63 BTW Ding 2 BTW Inkoop Hoog 4220 0,13 BTW Ding 1 BTW Inkoop Hoog 4220 0,01 BTW Afr. Twee dingetjes Kosten 6920 8,60 Ding 2 Kosten 6920 0,69 Ding 1 Crediteuren 4100 11,06 Twee dingetjes --------------------------------------------------------------- Totaal Boekstuk 143 11,06 11,06

Het is ook mogelijk dat de correctie de andere kant op werkt, bijvoorbeeld:

Boekstuk/Grootboek Rek Debet Credit Boekstuk/regel --------------------------------------------------------------- Inkoop:84 Twee dingetjes BTW Inkoop Hoog 4220 1,63 BTW Ding 2 BTW Inkoop Hoog 4220 0,13 BTW Ding 1 Kosten 6920 8,60 Ding 2 Kosten 6920 0,69 Ding 1 BTW Inkoop Hoog 4220 0,01 BTW Afr. Twee dingetjes Crediteuren 4100 11,05 Twee dingetjes --------------------------------------------------------------- Totaal Boekstuk 144 11,06 11,06

In dit geval wijkt het boekstuktotaal, 11,05, af van het gerapporteerde totaal, 11,06. Het werkelijke boekstuktotaal is het bedrag dat uiteindelijk wordt geboekt op de tegenrekening, in dit geval dus de 11,05 die wordt geboekt op rekening 4100.

Zie ook BTW-afrondingen.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
bookings/payable.html laatste aanpassing 22 februari 2010, 09:34:41

EekBoek-2.02.04/doc/html/bookings/cash.html0000444000076500007650000001052412165465617016163 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Boekingen » Kas


Kas transacties

Deze transacties worden geboekt in een dagboek van het type Kas. Zo'n dagboek heet typisch “Kas”. De keuze van de naam is vrij, en er mogen meerdere kasdagboeken tegelijk zijn.

Een kas transactie is in alle opzichten hetzelfde als het boeken van een bankafschrift. Zie aldaar.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
bookings/cash.html laatste aanpassing 24 augustus 2008, 17:02:05

EekBoek-2.02.04/doc/html/bookings/bank.html0000444000076500007650000003255512165465617016170 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Boekingen » Bankafschriften


Giro- en Bankafschriften

Deze afschriften worden geboekt in een dagboek van het type Bank. Zo'n dagboek heet typisch “Postgiro” of “Rabobank”. De keuze van de naam is vrij, en er mogen meerdere bankdagboeken tegelijk zijn.

Aan elk bank-dagboek is een grootboekrekening gekoppeld (zie Koppelingen). De balanswaarde van deze grootboekrekening komt overeen met het saldo op de bank- of giro-rekening.

De naam van de boekingsopdracht is gelijk aan die van het dagboek. We nemen hier als voorbeeld het dagboek “Postbank”.

Tijdens het boeken kunnnen een aantal verificaties plaatsvinden.
Het boekstuktotaal kan worden geverifieerd door aan de boekingsopdracht de optie --totaal=bedrag toe te voegen. Het eindsaldo na boeking kan worden geverifieerd met de optie --saldo=bedrag. Een beginsaldo kan worden opgegeven met de optie --beginsaldo=bedrag. Als dit niet is opgegeven wordt het eindsaldo van het eraan voorafgaande boekstuk genomen, indien deze reeds in de administratie aanwezig is. Het beginstaldo van de eerste boeking is uiteraard het op de openingsbalans opgevoerde bedrag.
Zowel het boekstuktotaal als het begin- en eindsaldo treft u als regel aan op het bankafschrift.

Naast deze verificaties zal EekBoek tevens verifiëren dat het beginsaldo overeenkomt met het eindsaldo van het eraan voorafgaande boekstuk (indien aanwezig), alsmede dat het eindsaldo overeenkomt met het beginsaldo van het eropvolgende boekstuk (indien aanwezig). Het is daarom zeer aan te bevelen om bij het invoeren van deze boekstukken altijd expliciet een boekstuknummer op te geven.

Zoals alle boekingen bestaat ook de verkoopboeking uit twee delen: de boekstukkop en een of meer boekstukregels. Er zijn drie soorten boekstukregels: betaling aan crediteur (crd), betaling van debiteur (deb), en vrije betaling (std). Het totaal van alle boekstukregels vormt het boekstuktotaal, dit wordt geboekt op de aan het betreffende dagboek gekoppelde grootboekrekening.

Syntaxvoorbeeld van een boekstukkop:

postbank:16 19-09-2007 "KPN, ACME"

De onderdelen:

postbank:16 Het boekstuknummer. Dit bestaat uit de naam van het dagboek en een vrij te kiezen volgnummer, gescheiden door een dubbele punt ‘:’.
Het volgnummer mag worden weggelaten, in welk geval EekBoek zelf een volgnummer toekent. Het verdient echter aanbeveling om altijd expliciet een volgnummer op te geven.
Het is een goede gewoonte om hier altijd het volgnummer van het bankafschrift op te geven.
11-09-2007 De boekingsdatum in een van de ondersteunde vormen.
"KPN, ACME" De omschrijving van dit boekstuk.
Indien deze spaties bevat moeten er aanhalingstekens omheen worden geplaatst.

Syntaxvoorbeeld van een boekingsregel “betaling aan crediteur”:

crd 04-09-2007 KPN -131,68

De onderdelen:

crd Dit geeft aan dat het een betaling aan een crediteur betreft.
04-09-2007 De boekingsdatum voor deze boekstukregel.
Deze mag worden weggelaten, in welk geval de boekingsdatum van het boekstuk wordt gebruikt.
KPN De code van de crediteur. Conventioneel wordt deze in hoofdletters gegeven, maar dit is niet vereist.
U kunt hier ook een dagboek en boekstuknummer gebruiken, gescheiden door een dubbele punt, bijvoorbeeld inkoop:23 of een relatiecode en referentiecode, eveneens gescheiden door een dubbele punt, bijvoorbeeld KPN:factuur12345.
-131,68 Het bedrag.
Een te betalen bedrag wordt als negatief bedrag opgegeven, want het banksaldo vermindert erdoor.
Een te ontvangen bedrag wordt als positief bedrag opgegeven.
Achter het bedrag mag een BTW-specificatie worden opgegeven.
Zie hieronder voor een omschrijving hoe EekBoek bepaalt met welk inkoop-boekstuk deze betaling correspondeert.

Syntaxvoorbeeld van een boekingsregel “betaling van debiteur”:

deb 06-09-2007 ACME 369,82

De onderdelen:

deb Dit geeft aan dat het een betaling van een debiteur betreft.
06-09-2007 De boekingsdatum voor deze boekstukregel.
Deze mag worden weggelaten, in welk geval de boekingsdatum van het boekstuk wordt gebruikt.
ACME De code van de debiteur. Conventioneel wordt deze in hoofdletters gegeven, maar dit is niet vereist.
U kunt hier ook een dagboek en boekstuknummer gebruiken, gescheiden door een dubbele punt, bijvoorbeeld inkoop:23 of een relatiecode en referentiecode, eveneens gescheiden door een dubbele punt, bijvoorbeeld KPN:factuur12345.
369,82 Het bedrag.
Een te ontvangen bedrag wordt als positief bedrag opgegeven, want het banksaldo vermeerdert erdoor.
Een te betalen bedrag wordt als negatief bedrag opgegeven.
Achter het bedrag mag een BTW-specificatie worden opgegeven.
Zie hieronder voor een omschrijving hoe EekBoek bepaalt met welk verkoop-boekstuk deze betaling correspondeert.

Syntaxvoorbeeld van een vrije boekingsregel:

std 07-09-2007 Girotel -3,50 4980

De onderdelen:

std Dit geeft aan dat het een standaard (vrije) boeking betreft.
07-09-2007 De boekingsdatum voor deze boekstukregel.
Deze mag worden weggelaten, in welk geval de boekingsdatum van het boekstuk wordt gebruikt.
Girotel De omschrijving van deze boekstukregel.
Indien deze spaties bevat moeten er aanhalingstekens omheen worden geplaatst.
-3,50 Het bedrag.
Een te ontvangen bedrag wordt als positief bedrag opgegeven, want het banksaldo vermeerdert erdoor.
Een te betalen bedrag wordt als negatief bedrag opgegeven.
Achter het bedrag mag een BTW-specificatie worden opgegeven.
6980 De grootboekrekening waarop dit bedrag dient te worden geboekt.

Let op: Als u opdrachten direct ingeeft in de EekBoek shell, moet de gehele opdracht op één enkele regel worden ingegeven! Dit in tegenstelling tot de zogenaamde batch mode, waarbij opdrachten over meerdere regels mogen worden ingegeven.

Hoe wordt een betaling gekoppeld aan een boekstuk?

Wanneer een betaling wordt geboekt voor een bepaalde crediteur of debiteur, dan zal EekBoek in de openstaande posten van het huidige én eventuele voorafgaande boekjaren zoeken naar een boekstuk (inkoop resp. verkoop) waarvan het boekstuktotaal overeenkomt met het opgegeven bedrag. Hiermee kunnen bijna alle betalingen soepel en eenvoudig worden afgewerkt.

Wanneer er meerdere openstaande posten zijn voor dezelfde relatie met hetzelfde bedrag, dan wordt de oudste openstaande post geacht te zijn voldaan.

De configuratie-instelling bkm_multi kan worden gebruikt om dit proces te versoepelen: De boeking wordt dan ook uitgevoerd indien er meerdere open posten zijn die tezamen exact het gewenste bedrag uitmaken.

Een complicatie ontstaat wanneer een betaling niet precies overeenkomt met het bedrag van een inkoop/verkoop boekstuk. Dit kan gebeuren wanneer een betaling in gedeelten wordt voldaan. In dit geval kunt u, in plaats van de gebruikelijke debiteur/crediteur code, het boekstuknummer van het gewenste te betalen boekstuk opgeven. Het opgegeven bedrag wordt dan op dit (geheel of gedeeltelijk openstaande) boekstuk in mindering gebracht.

Om een boekstuk uit het huidige boekjaar aan te geven, kan worden volstaan met de boekstuknummeraanduiding Dagboek:Volgnummer; voor een boekstuk uit een ander boekjaar moet de boekjaarcode ook worden meegegeven: Dagboek:Boekjaarcode:Volgnummer.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
bookings/bank.html laatste aanpassing 22 februari 2010, 09:53:05

EekBoek-2.02.04/doc/html/yearend.html0000444000076500007650000001655412165465617015072 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
Jaarafsluiting


Het openen van een nieuw boekjaar

Wanneer de eerste boekingen van een nieuw jaar moeten worden ingevoerd moet eerst een nieuw boekjaar worden geopend. De EekBoek shell opdracht daarvoor is hetzelfde als die waarmee de administratie oorspronkelijk werd geopend:

adm_open

Na het uitvoeren van deze opdracht is de administratie gereed om boekingen in het nieuwe jaar uit te voeren.

De opdracht adm_open kan worden voorafgegaan door:

adm_boekjaarcode code

Hiermee wordt aan het nieuwe boekjaar expliciet een code toegekend. Wanneer deze opdracht niet is gegeven dan wordt het jaartal van het nieuwe boekjaar gebruikt.

adm_btwperiode keuze

Hiermee wordt aan het nieuwe boekjaar een, mogelijk gewijzigde, BTW periode toegekend.

Voor meer informatie over de adm_ opdrachten, zie Het openen van de administratie

De jaarafsluiting

Wanneer alle boekingen voor het boekjaar zijn afgewerkt, kan het boekjaar worden afgesloten.

Afsluiten houdt in dat de saldi van alle resultaatrekeningen worden opgeteld, dit levert het bedrijfsresultaat, en de saldi op nul worden gesteld. Het nieuwe boekjaar begint dus voor wat betreft de resultaatrekeningen met een schone lei.

Het bedrijfsresultaat wordt geboekt op de balansrekening die daarvoor is aangewezen, zie Koppelingen.

Tevens worden de balansrekeningen voor de BTW afgeboekt naar de balansrekening “BTW betaald”, zie Koppelingen. Ook de BTW rekeningen beginnen dus met een schone lei.

De jaarafsluiting wordt uitgevoerd met de EekBoek shell opdracht:

jaareinde --boekjaar=code

Uit veiligheidsoverwegingen moet het boekjaar expliciet worden opgegeven.

Een jaarafsluiting kan zo vaak worden uitgevoerd als nodig is, bijvoorbeeld wanneer er toch nog nagekomen boekingen in het vorige boekjaar zijn uitgevoerd. Het is ook mogelijk de jaarafsluiting ongedaan te maken met de opdracht:

jaareinde --boekjaar=code --verwijder

De jaarafsluiting wordt definitief door de optie --definitief aan de opdracht mee te geven. Hierna kan niet meer worden geboekt in het afgesloten jaar, en de afsluiting kan uiteraard niet meer worden verwijderd.

De jaarafsluiting produceert twee rapporten: het journaal van de afboekingen, en een overzicht van (eventuele) openstaande posten.

Indien gewenst kan de jaarafsluiting uit opdrachten aanmaken om het nieuwe boekjaar te openen in een aparte administratie:

jaareinde --boekjaar=code --eb=bestand

De in het opgegeven bestand geplaatste opdrachten omvatten het invoeren van de openingsbalans, en de openstaande posten.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
yearend.html laatste aanpassing 28 juli 2010, 20:26:15

EekBoek-2.02.04/doc/html/css/0000755000076500007650000000000012165465617013334 5ustar jvjvEekBoek-2.02.04/doc/html/css/site.css0000444000076500007650000000313112165465617015006 0ustar jvjv body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 100%; } .info { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; } .title { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 200%; line-height: 30px; font-weight: bold; color: #000000; margin-top: 0px; margin-bottom: 2px; } a.menu { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; line-height: 18px; text-decoration: none; color: #0000FF; white-space:nowrap; } a { font-family: Verdana, Arial, Helvetica, sans-serif; text-decoration: none; color: #0000FF; } a:hover { color: #C81900; } a.menu { margin-right: 1em; } .menutitle { color: #C81900; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; white-space:nowrap; } a.menu:hover { color: #C81900; } a.menuselect { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 80%; line-height: 18px; text-decoration: none; color: #0000FF; white-space:nowrap; color: #C81900; font-weight: bold; margin-right: 1em; } a.menuselect:hover { font-weight: bold; color: #C81900; } /* Indentation for the left side menu */ div.sidemenu { margin-left: 0.2in; } blockquote.code { margin-left: 2em; margin-right: 2em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em; padding-bottom: 0.5em; background: #F0F0F0; white-space: pre; font-family: "Courier New", Courier, monospace; } dl dt { font-weight: bold; } EekBoek-2.02.04/doc/html/ebwxshell/0000755000076500007650000000000012165465617014541 5ustar jvjvEekBoek-2.02.04/doc/html/ebwxshell/edit.png0000444000076500007650000004466612165465617016212 0ustar jvjvPNG  IHDR?sBIT|dtEXtSoftwaregnome-screenshot> IDATxwXSgoao! Q2*TV[k]+_]֊uQP@("{ϐ(z\yγO9''I2B!4&}EB!m̳'8u~M0'/OBi fB!&b1BHk:JGRꜙ`tf{>^½1a%*Ebl:N&pCԿ*tH- j^+l"~Yo+omr?_t:9鈎(,ӊq~bǖbخjL 0=Bs\:CȋW^8yeksQigXiΞu'$&iAr2R`IvS^%V*_Kxm75cYYIRo4s@HC*EbʻKni.Fz&7sppSr-@ny|3GE8tDg7+- `gmO`i$Djf,0 +ť褫aEҳjx׎6e*FrF)Nȑvb)Ee?g t5bx\{y1Y((6 JE8 y%U2cG!}JϤYAڛh"7klׯ;OqNČ5g(*\10TڞH9{S\{|#e^S|m{DգGz `eJZrl9:GV*ow`56j Qaa|$UNK^^"V2X qcD 5ƃLBTUU0/RS276 Yw S}ܸgOH۶ K+qu8;vIm##YM޷3sV\Okxa\S ДcBtҁF!TSMps2Ee58v2G_{K#h v">F4-V ֑_1L~0&TVU+W{u+S~PXy>bTe]H] Ns°ݑv"; t.;H0`gÝ$#+B^rtу)t5>';3 5 'y[\̪J 8{!݄T>ӚSn#CTi):i:Ōy^7S|Ν1 uyvfvRSgEy T_8uWO0i8ۈ1zt>Ĭ>c˾XuWXPAc!/ry彧ByYHo2𞗅Ժ+j":Xǎ?+ ðG{9Fn!>~=7?j* Oqv{`70}C G;3ǙiK D"Νדs54TQ|A[BmQ5?pWUUׄ.IYQ*1 × Ԝ7n* ee9+Q;[hjeBmu M9?J+d/[*"=]5Vu3Q"q71t0yeAx ׌1̛ MyT6I^zYv&x*d롴O3 `mAd^;X9J˫pZ 0zbs@σ {Ipn,_SW"I]>hpW`px54bѵW,ܭ>2Ǘڴ4&XQw!/KGvǒ彧>+Js5T^^i}e[ ]P~%eS2h~:V Ɵ xq1чA,h%/̂rWVCSgj!B0&D>+_u~q%eBWPXR+؇paqC:BP5[g964'98٬sFL帺u T)#mT_ eRQh_-/s[g\;.6؁ !ro@@9c!Φb=<{ jC6IFڃ(Č! w\œ053c%3ĵL=~ O7ѯٿ8s%9p~Č!Y޿tTVBCS F%}G^q%'I$uUϚ:2q:)wQ^Rm=Cpx|݌ \wY騪,ǃM,snCu4ל}I[P{nnW^߮ @;uNQ- 6]ސ]޷( б3l Osq(xSf04YRW{MxvE~q>s ']GI[Z5l._Cu}}_oס@[z_7c)gy3B^v(,=y΄ڹ$#;=Bm>s !QZ5``)@sF^'V:.ϙ4y*s9O?5B!R׽j/sT !BD=B!c_t?!iy0+B!E|!B6 &! &! &!Qf?!9~t-B!-6nT.sB!D-LB!D-J ,P{Q,X#FҲs8ˍ7j > 'O4?X3g_|`]P(/T&-[ mmmhhhSN0anݺM6([WSQYYwyp8XhQi.ʾoUVVÇCKK QQQRyk. sssL8>`2-X@mEĉ/e5>FW-Um$===͛Ry=T0^'~gcL>}:{{FwŶm;wSY4EYYOhii!<<"Ha8q7nD޽~!==]ox;w.^oӖk.lݺ?{x-#F@\\"##1rH|Y\2ddQ^^Z]v uoT9~ ŃT#((G޽{2M= \\\Z/Bp5kmmݤyٴi=zwгgOt7og}֤4ŁPXXk?Gtt4F%7o;}\]]1m4;v fL8֭uwwǬYZ,XŋTmmڃ,mYaa!quDGGcȐ!2yγ+}aڴi|ÇѣGn:|76ו2U_#Ŷm۔(>>˗/Ǚ3g*IEDV.sԾ^~=  $@QTrիxyyAGGƅ d* 88K.E#66Va|0oʇcdd$\\\$;"888T? Cn' aaa*Ƿ~ǏgϞHn:5R߿ &puuULY~槹쯪˃7nݺcǎ $0` %%E*Xt)󛵯ŋ^RvՑI&C011APPP6_sSx q)ݏ 6`РARDcW_&Zܹ   1n8ddd͟OOOܿΝC޽qe 6 刈ݻQZZCڵkjEGGcƍػw/4551|p|Z~=B!ttt关g*U͛ٳL=`Vzz:?'b„ D^^JΝ;ׯ"Ж?(XYY.]j>}*-_(6Q$;;HNNƉ'0p@|Hʬ[x1l2k*yj); S888 44NƍxzzJW6""H)T9~m޼ U8899!88ӧ/7SŤMԡʨ{ F={ɓ'@&;W/0 ݺu 8vvv Sf[b\'''ܹsǎéSpyrJ;J35N}`ԨQԔږصkWZfPvm*$$$૯?y,Y%KH^w  .ccͩO>ؔ}SV/Fxx8=zjɺw煮ODӒ>3gTX,Fw^x<5^zaɒ%R7*s,&ɟpu?H6z566999XzT \c577*333rrrQ`%i>،^Jͅq/֭[=f]C.]+55`aa!I\y 4K0Q`alٲYشi6m$kZfPvmAa޼y3f qQֻヒ?\.&&&رcu[YY>êUW_)'E`SNUZٳgc˖-?> 00p@SO>J)9~ٳшCAAT C___`bb{9ݧw,&]5k1uT;z)S&33SU|%7:P6GGGJ5gpzɍ/ŋeo۶MkGPa7<,Rn:ٳgjYe닿 9r$9mmm|*os~Cppҁ})Ags]0m4,\P& SDљrN׍7 ~bʕXr%_.ދ6HAhh(x<&Nݻw#00@WPRR"ϩQQQpwwԡl>2aÆKt`9j(̙3ԩjժcJڵ O?$/?4rӧO%uݿ3V닫WO>*_R,2Ek=z41i$ 22jkddya޼y>|Re 2@UZQRm֭[O̡kr2e f̘;;;m7ׯGuu߿;jCBB0i$7Ă #F`ܹ`aҥ(,,ķ~+)l>tX|? zڞ={^߹sG9 ))) RSSb <}፶1sL[,X[[[)UEEE!''VϚ5 ~!N:IzZZ Xl޼RN:7߄lllPTT ii{K? 0裏`mm|$&&H؜e)((۶mԩSCCCCz?S ::z)_׮]q1=BPx2׊CXXw޽{ĉ郲i:e7lmmakk+;wj_[ߌ3cO>c !!!HJJ† $=fosȻ+W|_~%,""1عs瘇f:::ӓ?^neնtR־}{ünyEK2fhhȸ\.311acƌaJc>dcǎezzzLOO74? `zzzD|ŦM&3OOO"Sϊ+7333c<3777sNwew{>|M:k׎x}.B^MFڦW*`|vB!eB^Sm!// &! &!W"p8R3g/hE(_PZZ*˖-pvv6444ЩS'L0Axꗪ X^^^055@ >ˆ1wwwߣcB__ RQl۶MU'O`llSٳgM_Hƍj+L( 'M>8q6n܈޽{#88Czz$ի{1w\A .5֭['Nþ}&7xPߣʶzjrYRR$-))q\'$*ܹss5ˋuܙUVVJ*++YΝYhhhG/y5DXXuO>VVV_T=[?~o<{ FFFrӝ-h׮LZ߾}9s&|||T)yeۈ $ipqqnֆ 0h 6/!!R)?F_W'W"`I]Z8~8&N. & 22yyy*8w_~ CHHRRRZ|?yf$&&"44EڸyܟvttIqqa IDATqprrBpp0!ЧOJU~zB gϞUy D0ј;v&ML4 *222,--2eJ0!-)77gφ$iii믱|r?1m=gll\IOOqMð%׭[7ɔ?{Toƌؼy3bcc8s -x-0 ݺu 8vvv*_=eY{ wÇ1gtpuu]ii)PPPx<ɺ>{̙3[&ѡCݻѽ{w,YD?FBBΝldggc޼yHLL۴C͛1~x`„ 8uw5yŋq-=e̘1HHH{$˖-éSpXXX:IRVVѣGիF%كh,_}***XV`dd$cnn.U |||>___\rEcѢEXn`ffׯߖ: Nttt0zh\pAqDهŋH]@wЕuA汷ĉF i=@BB:HqD"\\\!Xr%6{?nݺ=z<|4d…ƵkDEE!%%nnn-?B^%t0QYY]va8yҧOl߾];>>%O>nֱ***0vX9sLӧ`ʔ)8y$jF$''K1 )) 6l|2bbb @ .য়~W_}%uRY))) RSSb <}*6Uxh"LOO]ϴشi$i$@ `ӓԳb c͍ܹS_._ܬ&D 'CjKL;?|;1===6n81ɓ'3CCC& +;~T7n0455Y߾}>K}:f͚ժصkn݊_ĿW`xzz9ݻÇK~1KbvtQҒ͂ +W@[[[BCC?0:`ذaΝ WWWTTT !!eeep8]^^^! (?5W5t0"fmm-7%@?&1!Ν;aeeprrBq̙3i&Ѷ=zضmyM?|r9st___|= @򂣣#~w|G+Bڢ0a WWW6[Y~.$$$ :::Յܟ(V&_BNNN8vXc(--ň#`iiW*^jj*`ll > 3"H.');wMQNm`'IvGFFEpqqjk̙q2ٰa $HȓI ~~~ؿ$M9h"-z% Ƙwݘ+++ҥKR6>>ӧO]{6lݻwCŵk$;wDdd$BBBpB7rǐOOOܿΝC޽noĉ8w֮]ӧOcÆ X,9m]wܪλcj{u6i$cΜ9Avv6kko$͛7ѳgO򎎎8l޼ m4! ///={VA='''}  2544Pvԝ+BڬWCzw%+**D"֣G6~f+H?BIZAA333cAAA*uƪ$iW\ao&3G]2gggr{͞=5RviDfii)-KKKvE<͝;WܹsF?y_U}1c w^"""3,66Vq BرcѣG٨Qv!I^z1...RcSvԙ+B^v +qfbbb0j(hjjB$A$1ooo9s@ll,F%uY__F:ݯl>`jCJKKw- 4:tɓ'affr{CXXVZk׮tjZSvLDu􄟟N8'NJ_k|޽{c̙ݼy3ƏL0N5;С ooo`޽;,Y"#!!sEvv61o<$&&M[233i&%$$999-V`nn.nnn\޵1ԊEzz:f̘]]&kϞ=;v,-[޽{˖-S4\)̝c"O0`lٲ֭[ѿ|駒|FFF˓) cccٳX|9 |@EE%ѣGH+WH},Z֭pu۰Sv:Wu9cll ̞=U5LL2T1k,cԩRw+۞5lnݺ̛7 l}u4۷ocĈ2Xf䵣̳3\=zPX7 ~;cʕXr%_.u9::*w…o^^^pssO9h\ֽ/^>}HJo(H.**BTTUΧ Px}ZRsԹ"{oLNNflС,""űC E5[Yy7`^t B΢ءC&zOQz׳gf|>*7p@n:vIvQ6uTpX\\$OϞ=Y߾}Y\\KLLTyi`ӧOgǎcǎco6֭['WXXlmmYϞ=ف؁XϞ==+..Sm#/ի8Μ9o444ٳgU[YY޽;5jfGa㱓'OJ]t-];v:u-_9sHէ2W5 ݀Z1C6uT֮];񘩩)cn ;w`LGGyzz7)_S /gJݻ3P4553ۻwT֥KdƯQ0~7֧O& P(doۼyLc2===ƍRRR3lڵ )o h&@YVصsQI ~MSt4G26@UI 3sw8n܋{V`رzOTIL;1Sii.F4CHs`Ɋ)CF􇠺ܲB 3H)@S&:07F>=, R &*E)f yߍݛD]LBZ$^=m`fkXiPQVVq5.`ji\lV i%v] =:S\L8zc\Z/75K VYոp3D7/S... yZeķ.A{Q.~&F"… _x?Y]p7AZuX2EfޔY^ե1tf^ d>Հ.ݿ>G \.<>x~%b.8{ νLǐ# .++޽{Xd PKOq|q* v?$g^GaA!|{L;)Æaԩ9cF(AW]ù~vCuz*8U:wkdoWz/T?]!>`&##QXX+W믿F̱cB#m/b(5uqIP y;P*aՇ=8Ru0@+++t %Z] >Ƥס Mm-Tgg>5 h; 9E zf938&@m5`0F 2m.;v@.]YĎ;dhikcѢE_س' G|ڑJ3?L 0t0ĝ9#S… rJtzuJL_U,E GeU {v&=GNΟ?LLMajf#FbbZb tFF&~R6:w=}}XY[ɓ09Y*ߓT5y2, J-LBZ]y.AO[qi)Ӊ~x\.Ȧ[M ѱ Eɜ)E\T =mrȽ'O"((˓>;"QcՊsnh8i222O޸OKIIaHMMo^XZX`Ѹ|T;vXf 8KKK+3U2˶z:Fx\zBp8{LsQ:°mVgp\~I3<GźkkNh  Uӌ wꄟWFLt4օ -- ~#FToo#!!+Wј3۵CuuR[r;=RSٳsP]\bS Tge`? ~?]Wh~ !ĒkVR m]cEeyu/Y ``߹}_ IZʗWr,7ܒX3 iI<`F7<ʹs`[vI 31x&Ž.AˠU9->8]]]ѳW/,'ؾj-o>hk憞NNX|9դ Iquq}8qc.]Yᅬ&M=zdW}ۙLB^4x<+j=@WS*+UVeaӐ+zpÝDJ;vΞ$===!YI*7|$] 3qq p 002}$I7;7nLۙ BH h V5j|fa;. $8B.fh*VsL DqAtiKpG~~d1b.$&"))I?Ymmm\n j>y㖗^?-++ l ##e ͕*gdd$ӆ*9V>=m!{OW?5Z8Z 4|yz>^K%χL>333\̗3w.VYI&}8}N< EvlߎѣFa՚5 ;{{ZZ-2!Tdط/2 W3OmpLh[4B.gO; ?=y8eH@ 0iy 0IDAT+| .oht%x?s(E|'~څC/mÚmu[ hJ%r47dwzՍ ut`֭BftvƭHiN;ى]{i֯[gΠ~ժklh7G@m]=֖|=ym7[_cLD.?WҷMs0Չ@lP050ibbj [0W֣Y>]]Xv f>|z-z;0@PYON^roU.BZIY݋w(-;Dp me-6 UVB*Ɠrm吾2 D1(Uŝ]$$.~e8,$ MU3A˘! 11ֲ,vSE4n)ez^N] T۫Ecywb1ADVǃp]prv8̞׮u>B;@ߏR,[ЌU )2ZU6 /J)!- PPxHO^o^b9d`1AD{٤Q4MqqM$`$0 B88Nbk">6DdLgN'teK|rMJ{Ts搹^kDd+׋h$`(P( C(}Y(a>f1ADZQSߺ )%oXQSжua{\ "[+*0 \|wq.BT`EAqq1˖?-s]%,&VBTWW# 4͌+V¦*rfm\ zeeeeEml;"""*\:q,obK?DDDdq}Ӗ{ފDsQ ""8kӟ%; ""{8re? VmXIENDB`EekBoek-2.02.04/doc/html/ebwxshell/index.html0000444000076500007650000001376612165465617016551 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
De grafische EekBoek shell


De grafische EekBoek Shell

De grafische EekBoek Shell ebwxshell is een GUI-interface voor het EekBoek systeem.

Na het opstarten zal EekBoek een keuzemenu tonen van beschikbare administraties. Ook krijgt u de mogelijkheid om een nieuwe administratie aan te maken met de wizard. Zie hiervoor bij Opzetten werkomgeving.

Nadat een administratie is gekozen is EekBoek gereed voor gebruik.

ebwxshell.png

In het invoergebied onderaan kunt u uw EekBoek opdrachten invoeren, welke worden uitgevoerd met een druk op de Enter-toets of op de OK-button button-ok.png . Met de toetsen pijltje omhoog en plijtje omlaag kunt u eerder gegeven opdrachten terugroepen, eventueel aanpassen en vervolgens opnieuw ter uitvoering aanbieden.

Met een druk op de Edit-button button-edit.png wordt een apart window geopend waar u de opdracht meer uitgebreid kunt aanpassen.

edit.png

Opdrachten die rapporten aanmaken openen een eigen window met daarin het gevraagde rapport. Enige voorbeelde hiervan ziet u hier.



Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
ebwxshell/index.html laatste aanpassing 28 juli 2010, 20:20:57

EekBoek-2.02.04/doc/html/ebwxshell/ebwxshell.png0000444000076500007650000004755712165465617017264 0ustar jvjvPNG  IHDRsRGBbKGD pHYsgRtIME 2 Յ0e IDATxwxw @*A+.ׂ^JJQJSEK &HBH&.|?3̙33lLWHC\$?%Sai0KѧO*ȓ$ lp%Hd6 7+T}HC28 s24m,7.8j3r3l(>1E;_ґڽ-lS}*7ϳhw{ 9] %$$WN'=ڬ.YҥTywC3iG&haflfHZoNOd[>:+NЂջTKWV*SЮuf`?h2KaIt!Uyլ2eUuU檋.KRV^uՊ)ZJѝl aoŦ*|sTWAoW]O2kq(+ÐajZꗣv0RgTLYjV#*QSynٿ=x0T&r__ `dKq6͟^9͟=Ǐ+Q]O!*|5IFTp7)3Ab>#X)f͙éH60d2i,m>-LjWND_u|5QV11:sŰĎ"T-W>ekTH1Ir24Ů:Wo٫TC*릶Ջ$-[GJQ3 .v-?0DAa'dre{N%3Nf[h^HR٬TI]ڻpgY?;+,^1bGafg wfVm2YBٚm-ڵh(I*Q[v5'T\BUx -n .&,1O^Q<ԳM-uz!hVɢ^2?x* V_xYXP)V%g/A6\Ln/]SfrSEt˹bzvUB7񟪪p$'g{l毁^YVg\SrX VsJ`HWFڴ;(jJ?]y#)Yn>i_גTMB Hp}Z IUP :q* %''Fm w ]v Jluc2Ο]]5^Ӳ%;m'ä3*2]wUƪs/I;Rr3L88|U5yMҿ1L&[|۩a&]0S| NI);!ogy{gx$ p';ܽ7KZ 5[w@mm*kF[ad{$kܸ[ZyJҌ@hr$`u%)@`[ $l \KARʩsnڲmM2|?a1 uhw=j1aaXOG^?fw? `zPOHbccZvʖ);!jԠ݉3wm3nN<ǫknںy|}}cQ#p{]FUUS5ڵ*npV;.,|{͚5^woNyr_)o Vo*)Irvv4c?`"*WVxعvؑ3gԯETpU^]O>R%PHX$i K|scVݺ*^*V~ĉc9sԠQ#(UJ[?eo߮+tiժ[WLvo{p`;ٳG!aaڹseٳ-۝B´nz($,LF֔SU~}/YRޚzO+U\Y@:}Z*QbbcqFf_}]g|qe\s ף]_њcڼa<<<,/UL$IcǍ3i?H’>Q>9SahGӲT;VXQںmjת%Iں}<<.]_~aa:u[?<ӕ/O:%I*i-גeTxq1²~ }b"""l*o~uSUTS%ILѣ=zd/~혱hd8nݱgp<V9sgIShR3s^^^ `U@IRzԲMM>?w֭MI4sڴ\%;f>XO i뙵^={͇?]i/@jڤ$ij٢2YhԨVXaYf*UxRIƪPL&S?o]Ϥ$M2E_XӧO+552ѣ7kTΖqʖM;te܎TVi͛%K~ґذ~} 5Jׯ_סÇ׼ΝzY3m߾]iں%K:tHvUr*P?V|5oΜ,g mٿZ4o~aFعS[T//8Բys߰~阹W$㱐iYͶ8qp"Rsڵcz5y.6&F .Ԃ dY挏>>GӦÇ+0 @{N 3 |hb 4HjՒ P.]tL=30N_IJNIB eYNGpqd;֯__IIIOڿ*FD(0 @kҶX5l2uKΝ;o%[ؖGyfXqㆢvЇ&hŪSWNM\\mK.Y/93jz,dݱw;+@ʔ. 7Z>qzgr/((Hnja:|fF%Ԯm\գ[7⋖q;g6),cbcXێʗW-*JWoiؠV~BBBZ5k\wnG z⢶]|rJIIѲ/dR /@.]lݪV7J?{ԬiS-]LeKVDDGEiUv7ƐAG3$i̓#v뭷ߖrlU@mK/iԝyGNoN<)ɤiԩY[ÆS^GJF7|SƎԫ}7@r/TN_1"Bs?L~+0 @}##S:#Q|bj*Yҟ^n]3,mMr24ڷwh=ᕹݻk̙0yZj%dս[7yyya_ʗ+gs+ 4f8=?hL&VM.TjGy~IN^~E%$$h̙4e֩Ӧqf9cO_rf'J)!j+8~_rY mzǏu6ӦǑ}i@Zq6|CV96v˾>qdp~;tHG֖+5v-9)@r96ȿΜ%`}P2-8 @ $C.9MfrZGm wZ9N6lB &I]ߨ_L۫c:w.i@[Nz= {U#___[111ٖMLLT>}奰0M &M>իW3fHŋK^^KY=*)HixCJN\dJFKwH}cXtMwԻ(HRҍԾ#͓C8.@:tH 6ԥKxb͙3GvR׮]eFf͒V^N:תU,Ӌ+*88XSTTmmUҀRiai֬NBCiӤMo:U:4s!22[Wn/m;u>mw2&I7K'JΙCRÆҥKҜ9Ү]R׮R6`^}",Üi 0޽{F\\nÆ $c˖-FF *f2.""hժUrƬY&M&Ɉ0ƎkDGGj0*Ul*6oެcǎO>Yٝ>?Kd7Z.1Qz饴Kig̐.\/xZ_&/7n,el[{!iѢ3wg{zU+[JIInv6 cccdZ___Iŋr?>>^|\]]aǧߗy2$/J[]΍fn]'__)cRiǎM if7iɒ >S6`5 EzWL 6f LΞ= hܹڳgի{OzM9-3key9;pwK(!!-S_h4{vOFLjԐ~:ߤ-lMtduըQCNNy?e˖,/yKR֭~z*22R-RDDPmۭ됵\RR@v횴fM{IQ[ul=+QB3&'2t@ZteMNȷ~[uQNԿZbʕ+g*q 4H={Ԓ%Kt7.C0sҥKաC v9nݤ/ZeKiBA3xTIw̘W89I*_ҠAiY$-ehS'leժis̴+۴oi:uO;yb4|tKX-sSھ}͛kȑ UbŲmjŊ1cڵkgrJu!Q:vLw/m{fH{p祾}'̹ޮ]^4aTtIR[{۶M q3fHŦjH mJ]hٲy7iig$GL tLDS>e7˗GP!lCH @d2d2UŊS^o׭[w}!a2ӛ>c/Wݺu-wwwըQC϶={ԬY3yyy)$$DoR3A F]&)e[[<R"##qF7N W֯_?{=zҠAVA ѣGf͚?{5kLO}T~} :T˖-Ӷm$I]g ^zI!!!rvvf̘a%[[kҤIjܸ~'{衇h"M4Iw2ժU+y{{+%%E)))U$xa5jm~___IWk˗g+&IkϞvn۶mYӿގ.۶mSTlYqyG;wT3]mݺeZ~-߯kСCǓ#Qtt}~S``eܐ!C4m4ںuvڥH=y>??,_ vշ|ruIcǎC=$ 2$+9bccdZ``>&dJJJ.=zkϞv un֭[յkW޽[q8W3$]t)ZgϞUvT~}M<9tvٳG{V||$e>k8>׹3Ӟ={$}/$-[L?^{58kn>ωYKHH`P͞=[t 5JSLQ5OKԢE +YfʃgO;>kqgլY_~YM6ܣgq秸Le?g,_g8iFEҥKk|YMLlr]#iTD 5l2.)))S v֬Y癬ׯ#t[۲eK/]%4fM>]'No޼85jX** 'E4ֶ=l_~>І kruu8S6lؠTvZ˴^$&&CJJJ҆ m6mhpx/&MouV;{mfye7|3gfвeK-\P~֮]]J*1c3MǏkРAڼy^:uhĉڸq֬YzJ&ImڴyuuI+WԖ-[4{luY˶^G=m;vX>niXӿ^n h޼y_o|ֱckƍ;w^z%խ[W7Kn/=8H7`{ZnLI&饗^rҥKtR>/]Ԯ%FppѣGٳgGypww7w}6lXO- 0 ,hYI2 b5=n6M6ta,_x衇 777# ۷cvX~w64ibxxxAAAưaÌd봶>'| F|t,<Ծ{ ϱcf͙3GԬY3_$PB>|4h`w]ּB 4|> ÐaKзoii8 ٵkWehڅ$&A~%l @H $ @ $H @H $ @  @H @ @ $ @H @H $ @ $@H @ @ $ @  @H @ @ $H @H $ @ $@H @ @ $ @H @H $ @ $H @ @ $ @  @H @ @ $ @H @H $ @ $@H @ @ $ @  @H $ @ $H @H $ @  @H @ @ $ @H @H $ @ $@H @ @ $ @  @H @ @ $H pOqmӧB.@QZYp Hc2hQ9 @Lf3pd%ٟ~Zu*$4T6զ͛-eV|2>}-guMa*^]k;gSGڵSTTTu>b&Nj)X1znHIZl|F ̑>Ο?/IzMjҥp6nڤz$ݻWtэ7k̙v:v)|:}Zmڶӧ5h[ڳgOe, mݶMcFEu⨊=<4\U͛k+';jz䔖]}$NCjE$կWO>Y$IcǍ/] H6h&͚ ϛ'7WWz69 dGIP$鯿{gO_ڲue%KԤqc-ZT6[[£$MڞպU++%%E)))2 CM6UԎ֭yG ɤīW}n$%I *OOKq_?L3֓>if*Q-_6m?О={ɬY2 ]t2>&&Fsyb'L.\8vnl.*X dOqΞ< Xbrn\~eR^4eTM0A -RԱcGK]p!˼.\P- ,?Aټu7f'0uE8zTfIm>EUdI%Vp̨w^=fk}ܩ2lذ[FWUKt}f6lh)עysݷOUTtooo,SF'<<5$o*SFaŋd}a\{B^TRJ*{+'8BH!uWo~"MrXݻUZ5(!|fYΞO?(ɤų-w"N^?w;P`_8qeSS _[WWpeU/rZ*.ISFˮ] ,RDټ X-Ft ʔ*txS"ErXtI!!S7 ݸ~= KLJ־1*Wܳj ־TY a%qv l6+555RRd &鎭5\k6r${0rsskX9 $Hv d mn={V&ɪAJ;u:j(soԩVx{'ΛZǍSqC@JUdۧԩS:_Сr{8yMj]{vҮi0T*66V111Q|| .XhԩҥN:%?lx m :TϼHao<籇C/ak׮)&&&ejI ХKtyL&9RڵSݺuefϞg jH;sЖ-[t:j[ɳF9R;vT*U.vnY㝜TP!dd2)88Xڻw;O>D׮]޽{Uxq5nԈAN6~&leLtkEw?@u… ڷoe\ZtiEGG[m޼Y^^^Rrr&N+Vp<,4ydzL&}9:0J=jwwrrRѢEg$կ_?u]ԳGUR{ >|͝7OcnjQ*UtI͞6WoxC)n)2 lKQu +?m2,ʜ?^zΟ?իׯ… { xjtԿWB|տ^~/:~\\]r,EӼfj@&&&D(::Z&IׯWtt 6hΝܹ 5 ?撇/Xͪb*zKKخƝ@@9_qֵ׮'_I\!L&C3g矫o߾$6䒇VZr`K>Gώ{V[7бg鳱Ur|Vr2::Z[+WԩSUJ)SF&Mӧk̙g rCQ wլ<$swh‹}vMz qxr͚5Zp;-]T퓿L[`z*Z\\@@{qzV>{{r%l=D/Z>KҲeTN;wN'NԪU?CT幄 KRB?=Pm_jƑjrQks51)^NO\\Ν;iڜ9sOzUpaܹSϟWttzt%l@~#UTI߬\v;:ꄾ]e)GWh2,3jԨO?TO=nݪXYF/_VvcoWI]RwlvY2m„ 0a$i駟qF?vLWq>O ͻ+h_t7VƍC?w.{ @9^bWta6^ Nfq?,{6ʸl6,IrsqVrjeOs{MRJ\[>r.ĨHPٰ󓳳sӽ\U94PSRӱsZX\#g Νqo_`ӏ?*tiyxzf>% Pe_~q%{FRJ6?Aգ5K) n.Ί(u˫|i2TtiƍJMͿ,wwwy撊L&+UD}^zIkTHhKVJLL'${[3vǀ-}nm/dLkٲ^%u>Eٙw&&6۶a[8;;s IIpsoˌ ٻgo}l,:u"y^ڶm[s..3xQ۶ݽ[Nݝl&*VR\+++n߾MN@Ɓ 2U-Է>: BBC ҒÆ1{,8PAgU6QWΟo|Y6,F.oL:'NnZ '''3aر}Ȩ(>}oQȏ_ /8l |$NTO"5 ###Ȥ+>Sxc`gkKb|i5fUU'x\LMMq1<h߾=299  m)ȃ Ry_+XqR]yK:2 Q9yR^6-(gs z_/]{ݛ\<|h//]v<<سo#E$X.(\xeF1tp"Gh ٳ|{ gCd:Į;䋘Tu:\ߨm4a)6HIKWWW۫Lk'O>&ܺu{?^8+@8dWKKֻnHqq1a=J5GIi)]5lɉ7n2,L,+/BQ]]@\!F)Uy)-żcf˶V/MQ'-WEnݸu떤1:ȕֻ3z4]t!!)+HHL OL1"fR"raB"K(u[xzzg&EJKcH>l߹SA'bEEͳg e:M|˴a)X[[ul,^ƶ [^z1t6)<%ԩEh_  V)nn\z~1p@WMŒY8|v wrr";'G>$;'z{RZO?(/{q%?w7tÇddfr"+py{+颡B}Ǐ'n&b7l`#/+/Æ>ޞ_ӓ?F[};223='/^LvNOѣEEE=vmlHJ hHhcR))$(\sdgUd$K.s333ֻz*ڴi9sU8QVMCCC~DFD0}4L |Θ Ly~76:J %KQdmjjʡ B-cNp0P _Z)$U~_q6Eѽ{aogǂ .[|ᇘ(:8?%*?v8A-|FIKMeʕL ĢKqfG'V䋐RSS~R)ɜKճ'QQQ&f:I-m`Z?|޼J.]X,gcEGn|\q*.>Ue'~s9c2!KvP0ޏȚ!rz}VcC{pdCrrrW?nGϱܱB"nӧOpB}}W IRF!@$\.ccc|M>zFyH$u999 (~?f``)ϭ8y$%F~?"&4ϟvn}9aY4$I`0`4OVdd2t:Y__ghhH$餲Kc3Rzq\ܭ[$r߿(}&e=׎(//ON:;;ikkczzlo.gYF=ېb\XTĶǯB^G!]~%EQЎli("UWl2؋Dp~N(D,](rbrs;D0kt:rsseCsIENDB`EekBoek-2.02.04/doc/html/ebwxshell/button-ok.png0000444000076500007650000000203012165465617017162 0ustar jvjvPNG  IHDR9sRGBbKGD pHYsgRtIME 6رtEXtCommentCreated with The GIMPd%noIDATHŖ_hSW?'^cޤ[ZLj6dMPH>\)I؟,L(m&c^Ln`L4ET:)MCr[={ &~;{~K)޹Y4MBuuuT @]H&z4M+ eYܽ}H!ģ](_H޻d4wfi7C~/UVh>DRjѼ/-ˢP(PI4b[Z Ggx3lo!N<я_ɟ3|ӳu}||9s]w1pcWß3WL&û|~E2mɮSjϾ!(B=my> bH >;7oix y"9A$'a tbInnjνccu}}dB|c'M6qH %GY~q]m۸b###Cb9νsdK;ʩV>f9v46>CO[LbS芎 cjL g}j"u-ARDOD9Z ma-~ WoExUswj_aMM(B!g刏 4vn70?h8^.x 0!78']ם\,ae=RuT2UU%!O-,xPGL\B"@J(!$H0Pm].TK.eU,8cÁak}= 6:%Ӕl\.GP(䊢t:q\ _ KIENDB`EekBoek-2.02.04/doc/html/ebwxshell/files.html0000444000076500007650000001257412165465617016540 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
De grafische EekBoek shell » Bestanden


Bestanden

Naast de configuratiebestanden maakt dit EekBoek programma gebruik van:

$HOME/.eekboek/history In dit bestand worden de eerder uitgevoerde opdrachten opgeslagen voor hergebruik.
$HOME/.eekboek/ebwxshell In dit bestand worden applicatie-specifieke zaken opgeslagen zoals de door u ingestelde voorkeuren, de afmetingen van gebruikte windows.
Onder Microsoft Windows worden deze gegevens opgeslagen in de registry.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
ebwxshell/files.html laatste aanpassing 28 juli 2010, 20:20:53

EekBoek-2.02.04/doc/html/ebwxshell/clo.html0000444000076500007650000001434412165465617016210 0ustar jvjv EekBoek
EekBoek Boekhouden

EekBoek

Electronisch Boekhouden voor het MKB
EekBoek
De grafische EekBoek shell » Opties


De volgende command line opdrachten zijn alleen voor experts.

--nowizard Voorkom het opstarten van de administratie selectie wizard en gebruik het configuratiebestand dat in de huidige directory staat of met -f (zie hieronder) is opgegeven.
-D var=waarde
--define var=waarde
Definieer configuratievariabelen. var heeft de vorm sectie:naam
-f cfg
--config=cfg
Specificeert een administratie-specifiek configuratiebestand. Zie Configuratiebestanden.
-P
--printcfg
De rest van de opdrachtregel wordt geïnterpreteerd als namen van configuratie-variabelen en de bijbehorenden waardes worden uitgeprint. Zie Configuratiebestanden.
Deze optie moet als eerste op de commandoregel voorkomen.
-X De standaard-configuratiebestanden worden niet gelezen. Dit is uiteraard alleen zinvol in combinatie met --config. Zie Configuratiebestanden.


Powered by Perl

[Valid HTML 4.01 Transitional] [Valid CSS]

Copyright © 2005-2010 Squirrel Consultancy. All Rights Reserved.
Deze site is gemaakt met de TT2Site Site Builder.
ebwxshell/clo.html laatste aanpassing 05 december 2010, 18:00:06

EekBoek-2.02.04/relnotes-2.00.html0000444000076500007650000002634612165465617014142 0ustar jvjv

Wijzigingen in EekBoek 2.00

Voor een volledige, gedetailleerde lijst van veranderingen zie het bestand CHANGES.

LEES OOK HET ITEM "MIGRATIE" AAN HET EIND VAN DIT BESTAND.

Raadpleeg ‘Installeren’ en ‘Download’ op de EekBoek wiki om EekBoek op uw systeem te installeren.

Overzicht

EekBoek standaard in het systeem

Verschillende Linux distributies leveren EekBoek standaard mee. Voor zover ons bekend:

  • Fedora
  • Debian
  • Ubuntu

Indien u een van deze systemen gebruikt verdient het voorkeur EekBoek met de bij uw systeem behorende installatieset te installeren.

Voor meer en bijgewerkte informatie raadpleeg de EekBoek wiki.

De administratie-folder

Het is nu mogelijk om al uw administraties eenvoudig te beheren door ze in een centrale folder op te slaan: de administratie-folder. Administraties die u nieuw aanmaakt met behulp van een van de wizards zullen automatisch in deze folder worden geplaatst.

Welke folder als administratie-folder wordt gebruikt hangt af van uw EekBoek installatie. De standaardfolders zijn:

Linux $HOME/.eekboek/admdir
Windows

$HOME\.eekboek\admdir of
$USERPROFILE\.eekboek\admdir of
$HOMEDRIVE:$HOMEPATH\.eekboek\admdir

Mac OSX $HOME/.eekboek/admdir

U kunt de plaats van de administratie-folder instellen in het EekBoek configuratiebestand, zie hiervoor de documentatie.

Raadpleeg in geval van twijfel uw systeembeheerder.

Het configuratiebestand

De naam van het standaard configuratiebestand is gewijzigd in eekboek.conf, dus zonder het puntje aan het begin. Uit compatibiliteitsoverwegingen zal, indien dit bestand niet bestaat, ook worden gekeken naar het bestand .eekboek.conf.

Unicode

Ingaande versie 2.00 werkt EekBoek uitsluitend nog met bestanden die zijn opgemaakt in de Unicode tekenset UTF-8. De ondersteuning voor ISO-8859-1 (Latin1) is vervallen.

Aangezien de meeste moderne computersystemen reeds lang met Unicode werken mag dit niet een probleem vormen.

Alle door EekBoek geproduceerde uitvoer wordt ook opgemaakt in de UTF-8 tekenset.

Met de volledige overstap naar Unicode worden veel problemen met b.v. tekens met accenten opgelost.

De GUI

Voor de gebruikers die niet uit de voeten kunnen met het werken met editors en de command line brengt EekBoek 2.00 een grafische user interface.

Met deze GUI is alles mogelijk wat ook met de EekBoek command line shell kan. Daarboven biedt de GUI fraai opgemaakte rapporten die ook afgedrukt kunnen worden. Op het scherm is het steeds mogelijk om in rapporten rekeningnummers, boekingen en relaties aan te klikken waardoor meteen het overzicht van het gewenste onderdeel wordt getoond. Hiermee kan snel worden vastgesteld waar bepaalde betalingen vandaan komen (z.g. drill-down).

Ook voor de verstokte command line gebruikers zal dit een interessante faciliteit zijn.

De Wizards

Bij het opstarten van EekBoek wordt gekeken of er administraties beschikbaar zijn in de administratie-folder. Is dat het geval dan biedt de opstartwizard u de mogelijkheid om een van deze administraties te kiezen. U krijgt ook de keuze om een nieuwe administratie aan te maken, waarbij u gebruik kunt maken van een van de meegeleverde sjabloonadministraties:

  • Eenmanszaak (ZZP)
  • BV / NV
  • Ondernemer
  • Vereniging / Stichting

Ook is het mogelijk een volledig lege administratie op te zetten of een kopie te maken van de EekBoek voorbeeldadministratie. Dit laatste is met name handig wanneer u eerst wat vertrouwd wilt raken met het werken met EekBoek alvorens uw echte administraties op te gaan zetten.

De EekBoek programma's hebben een command line optie --nowizard om dit opstartgedrag te onderdrukken.

Opmerking: Het programma ebshell zal eerst kijken of er in de current directory een configuratiebestand staat. Is dit niet het geval dat wordt de opstartwizard gestart. Als er wel een configuratiebestand is zal meteen het bewerken van deze administratie worden geactiveerd. Dit is uit compatibiliteit met versie 1.04 van de EekBoek shell.

Schema

EekBoek vermeld in principe alleen positieve getallen op de balans. Dat betekent dat een balansrekening die negatief is verschuift van de ene kant van de balans naar de andere kant.

In bepaalde gevallen kan dit niet wenselijk zijn. In de schema-definitie kan worden opgegeven dat een balansrekening altijd aan dezelfde kant moet blijven staan door een uitroepteken achter de debet/credit indicatie te zetten, bijvoorbeeld:

1 Vaste Activa 11 Materiële vaste activa 1100 D! Inventaris en inrichting

EekBoek Shell

Opdrachten

De nieuwe opdracht schema kan worden gebruikt om tijdens het werken aan een administratie grootboekrekeningen toe te voegen. Dit is een in de praktijk vaak voorkomende wens.

Gebruik de EekBoek opdracht help schema voor uitleg.

Command line opties

De volgende command line opties zijn vervallen:

--createsampleconfig --createsampledb --createdb --database --schema

Deze opties zijn achterhaald door het invoeren van de administratie-folder. Het aanmaken van administraties dient daarom bij voorkeur te geschieden met de wizards, of met een van de command line opties --init of --import.

Exit codes

Indien er fouten zijn opgetreden tijdens het werken met ebshell zal deze bij het beëndigen een error status afleveren. Shell procedures en make files kunnen hiervan gebruik maken.

Diversen

  • Bedragen mogen worden ingegeven met duizendtalscheidingstekens, bijvoorbeeld 1.235,56.

    In expressies zijn duizendtalscheidingstekens niet toegestaan. Dit om problemen te voorkomen met de interpretatie van expressies als 24,50*1.250. Is dit 30625 of 30,625?

  • De opdracht export kent de optie --titel. Hiermee kan een omschrijving worden opgegeven bij export naar een archive. Als zo'n archive wordt gekopieerd naar de EekBoek schema directory EB/schema dan kan deze als sjabloon worden gebruikt voor nieuwe administraties. In het lijstje van sjablonen wordt dan de opgegeven omschrijving getoond.

Configuratiebestand

  • Sectie ‘database’, item ‘fullname’ vervalt.

    Bij het bepalen van de interne naam van de database wordt een eventuele prefix eekboek_ niet langer verwijderd. Deze prefix was alleen van toepassing op PostgreSQL databases.

  • Sectie ‘general’, item ‘admdir’
    Kan worden gebruikt om de naam van de administratie-folder op te geven. Environment variabelen kunnen hier worden toegepast, bijvoorbeeld:

    [general] admdir = $HOME/.eekboek/admdir
  • Sectie ‘locale’, items ‘decimalpt’ en ‘thousandsep’ zijn vervallen, alsmede ‘numwidth’ uit sectie ‘text’.

    Hiervoor in de plaats komt een enkele setting ‘amount’ in de sectie ‘format’. Deze setting is de vorm waarin bedragen moeten worden weergegeven. De overeenkomst tussen de oude en nieuwe methode is als volgt:

    format = 1234.56 -> dpt = "." format = 1234,56 -> dpt = "," format = 1.234,56 -> dpt = ",", sep = "." format = 1,234.56 -> dpt = ".", sep = "," format = 1.234.567,89 -> dpt = ",", sep = ".", width = 12

    De breedte wordt alleen aangepast als het format breder is dan 9 tekens.

  • Sectie ‘locale’, item ‘unicode’ vervalt. Alles is nu standaard Unicode en opgemaakt in UTF-8.

Bugfixes

  • Fix afboeken BTW in de volgjaren van een meerjarige boekhouding.

  • Schema: Fix probleem met het herkennen van het woord ‘privé’.

  • Indien de laatste regel uit een invoerbestand eindigt in een backslash dan wordt een foutmelding gegeven.

Door gebruikers aangeleverd

EekBoek gebruikers hebben zelf ook materiaal aangeleverd, zoals voorbeeldbestanden en conversieprogramma's. Mogelijk is dit materiaal op uw systeem geïnstalleerd, raadpleeg daarvoor uw systeembeheerder. Anders kunt u deze vinden in de ‘contrib’ folder van de EekBoek sources.

Migratie

De database-structuur is gewijzigd. Auto-migratie is beschikbaar. Het wordt echter ten sterkste aangeraden VOOR INSTALLATIE VAN 2.00 eerst een export te doen, en deze na installatie van 2.00 te importeren.

Bestanden in de tekenset ISO-8859-1 (Latin1) worden niet langer ondersteund. UTF-8 is de enige toegestane tekenset. Zie ook Unicode hierboven.

Indien u bestanden heeft in de ISO-8859-1 tekenset kunt u deze eenvoudig omzetten naar UTF-8 met bijvoorbeeld het programma iconv. Indien u gebruik maakte van de tekensetindicatie

# content-type: text; charset=iso-8859-1

of een van de variaties daarop dan moet deze na conversie worden verwijderd, of vervangen door

# content-type: text; charset=utf-8

Dit betreft de vier standaardbestanden:

  • schema.dat
  • relaties.eb
  • opening.eb
  • mutaties.eb

En uiteraard ook andere bestanden welke u voor EekBoek invoer gebruikt.

EekBoek-2.02.04/EekBoek.spec0000444000076500007650000002651712165465617013225 0ustar jvjv# -*- rpm-spec -*- ################ Build Options ################### %define dbtests 1 %{?_with_dbtests: %{expand: %%global dbtests 1}} %{?_without_dbtests: %{expand: %%global dbtests 0}} ################ End Build Options ################ Name: EekBoek Summary: Bookkeeping software for small and medium-size businesses License: GPL+ or Artistic Group: Applications/Productivity Version: 2.02.04 Release: 1%{?dist} Source: http://www.eekboek.nl/dl/%{name}-%{version}.tar.gz URL: http://www.eekboek.nl BuildRoot: %{_tmppath}/rpm-buildroot-%{name}-%{version}-%{release} # The package name is CamelCased. However, for convenience some # of its data is located in files and directories that are all # lowercase. See the %%install section. %global lcname eekboek # It's all plain perl, nothing architecture dependent. BuildArch: noarch # This package would provide many (perl) modules, but these are # note intended for general use. AutoReqProv: 0 Requires: perl >= 5.8 Requires: perl(Archive::Zip) Requires: perl(HTML::Parser) Requires: perl(Term::ReadLine) Requires: perl(Term::ReadLine::Gnu) Requires: perl(DBI) >= 1.40 Requires: perl(DBD::SQLite) >= 1.12 Requires: perl(Carp::Assert) >= 0.20 BuildRequires: perl >= 5.8.8 BuildRequires: perl(Module::Build) >= 0.32 BuildRequires: perl(IPC::Run3) BuildRequires: perl(Archive::Zip) BuildRequires: perl(HTML::Parser) BuildRequires: perl(Term::ReadLine) BuildRequires: perl(Term::ReadLine::Gnu) BuildRequires: perl(DBI) >= 1.40 BuildRequires: perl(DBD::SQLite) >= 1.12 BuildRequires: perl(Carp::Assert) >= 0.20 BuildRequires: perl(Test::More) BuildRequires: desktop-file-utils BuildRequires: zip Obsoletes: %{name}-core < 2.00.01 Obsoletes: %{name}-contrib < 2.00.01 Conflicts: %{name}-core < 2.00.01 # For symmetry. %global __zip /usr/bin/zip %global __rmdir /bin/rmdir %global __find /usr/bin/find %description EekBoek is a bookkeeping package for small and medium-size businesses. Unlike other accounting software, EekBoek has both a command-line interface (CLI) and a graphical user-interface (GUI, currently under development and not included in this package). Furthermore, it has a complete Perl API to create your own custom applications. EekBoek is designed for the Dutch/European market and currently available in Dutch only. An English translation is in the works (help appreciated). EekBoek can make use of several database systems for its storage. Support for the SQLite database is included. For GUI support, install %{name}-gui. For production use, you are invited to install the %{name}-db-postgresql database package. %package gui Summary: %{name} graphical user interface Group: Applications/Productivity AutoReqProv: 0 Requires: %{name} = %{version}-%{release} Requires: perl(Wx) >= 0.89 Requires: wxGTK >= 2.8.8 Requires: gettext %description gui This package contains the wxWidgets (GUI) extension for %{name}. %package db-postgresql # This package only contains the necessary module(s) for EekBoek # to use the PostgreSQL database. # Installing this package will pull in the main package and # the Perl PostgreSQL modules, if necessary. # No %%doc required. Summary: PostgreSQL database driver for %{name} Group: Applications/Productivity AutoReqProv: 0 Requires: %{name} = %{version}-%{release} Requires: perl(DBD::Pg) >= 1.41 %description db-postgresql EekBoek can make use of several database systems for its storage. This package contains the PostgreSQL database driver for %{name}. %prep %setup -q chmod 0664 MANIFEST # Remove some build helper sources since we BuildRequire them. %{__rm} -fr inc/IPC inc/Module %{__perl} -ni~ -e 'print unless m;^inc/(Module|IPC)/;;' MANIFEST # Remove some library modules since we Require them. %{__rm} -fr lib/EB/CPAN/Carp %{__rm} -fr lib/EB/CPAN/Wx %{__perl} -ni~ -e 'print unless m;^lib/EB/CPAN/;;' MANIFEST %build %{__perl} Build.PL %{__perl} Build # Move some files into better places. %{__mkdir} examples %{__mv} emacs/eekboek-mode.el examples %install %{__rm} -rf %{buildroot} # Short names for our libraries. %global ebconf %{_sysconfdir}/%{lcname} %global ebshare %{_datadir}/%{name}-%{version} %{__mkdir_p} %{buildroot}%{ebconf} %{__mkdir_p} %{buildroot}%{ebshare}/lib %{__mkdir_p} %{buildroot}%{_bindir} # Install the default, system-wide config file. %{__install} -p -m 0644 blib/lib/EB/examples/%{lcname}.conf %{buildroot}%{ebconf}/%{lcname}.conf # Install locales. for lang in blib/lib/EB/res/locale/* do l=`basename ${lang}` %{__mkdir_p} %{buildroot}%{_datadir}/locale/${l}/LC_MESSAGES %{__mv} blib/lib/EB/res/locale/${l}/* %{buildroot}%{_datadir}/locale/${l}/LC_MESSAGES %{__rmdir} blib/lib/EB/res/locale/${l} done %{__rmdir} blib/lib/EB/res/locale # Create lib dirs and copy files. %{__find} blib/lib -type d -printf "%{__mkdir} %{buildroot}%{ebshare}/lib/%%P\n" | sh -x %{__find} blib/lib ! -type d -printf "%{__install} -p -m 0644 %p %{buildroot}%{ebshare}/lib/%%P\n" | sh -x for script in ebshell ebwxshell do # Create the main scripts. echo "#!%{__perl}" > %{buildroot}%{_bindir}/${script} %{__sed} -s "s;# use lib qw(EekBoekLibrary;use lib qw(%{ebshare}/lib;" \ < script/${script} >> %{buildroot}%{_bindir}/${script} %{__chmod} 0755 %{buildroot}%{_bindir}/${script} # And its manual page. %{__mkdir_p} %{buildroot}%{_mandir}/man1 pod2man blib/script/${script} > %{buildroot}%{_mandir}/man1/${script}.1 done # Handle localisations separately since we are not complete yet. for script in ebcore do %find_lang ${script} done # Desktop file, icons, ... %{__mkdir_p} %{buildroot}%{_datadir}/pixmaps %{__install} -p -m 0664 lib/EB/res/Wx/icons/ebicon.png %{buildroot}%{_datadir}/pixmaps/ for script in ebwxshell do desktop-file-install --delete-original \ --dir=%{buildroot}%{_datadir}/applications ${script}.desktop desktop-file-validate %{buildroot}/%{_datadir}/applications/${script}.desktop done # End of install section. %check %if %{dbtests} %{__perl} Build test %else %{__perl} Build test --skipdbtests %endif %clean %{__rm} -rf %{buildroot} %files -f ebcore.lang %defattr(-,root,root,-) %doc CHANGES README examples/ doc/html/ TODO %dir %{_sysconfdir}/%{lcname} %config(noreplace) %{_sysconfdir}/%{lcname}/%{lcname}.conf %{ebshare}/ %exclude %{ebshare}/lib/EB/DB/Postgres.pm %exclude %{ebshare}/lib/EB/Wx %{_bindir}/ebshell %{_mandir}/man1/ebshell* %files gui %defattr(-,root,root,-) %doc README.gui %{ebshare}/lib/EB/Wx %{_bindir}/ebwxshell %{_mandir}/man1/ebwxshell* %{_datadir}/applications/ebwxshell.desktop %{_datadir}/pixmaps/ebicon.png %files db-postgresql %defattr(-,root,root,-) %doc README.postgres %{ebshare}/lib/EB/DB/Postgres.pm %changelog * Thu Sep 13 2012 Johan Vromans - 2.01.06-1 - Upgrade to upstream 2.01.06. * Fri Jul 09 2010 Johan Vromans - 2.00.02-2 - Adjust emacs support files. * Thu May 06 2010 Johan Vromans - 2.00.02-1 - Upgrade to upstream 2.00.02. * Mon Mar 29 2010 Johan Vromans - 2.00.01-3 - More Obsoletes. * Mon Mar 29 2010 Johan Vromans - 2.00.01-2 - Fix duplicate %%description. - Fix BuildRequires and Obsoletes. * Sun Mar 28 2010 Johan Vromans - 2.00.01-1 - Upgrade to upstream 2.00.01. * Sat Mar 27 2010 Johan Vromans - 2.00.00-2 - Repackage according to user concensus. * Tue Mar 23 2010 Johan Vromans - 2.00.00-1 - Upgrade to upstream 2.00.00. * Mon Feb 08 2010 Johan Vromans - 1.05.20-1 - Upgrade to upstream 1.05.20. * Sat Jan 16 2010 Johan Vromans - 1.05.16-1 - Upgrade to upstream 1.05.16. * Fri Jan 15 2010 Johan Vromans - 1.05.15-2 - Add missing file to db-postgres package. * Fri Jan 15 2010 Johan Vromans - 1.05.15-1 - Upgrade to upstream 1.05.15. * Fri Jan 15 2010 Johan Vromans - 1.05.14-1 - Upgrade to upstream 1.05.14. - Re-structure the package into several subpackages. * Wed Jan 06 2010 Johan Vromans - 1.04.06-1 - Upgrade to upstream 1.04.06. * Mon Dec 28 2009 Johan Vromans - 1.04.05-2 - Fix for table detection with newer SQLite. * Mon Dec 28 2009 Johan Vromans - 1.04.05-1 - Upgrade to upstream 1.04.05. * Fri Jul 24 2009 Fedora Release Engineering - 1.04.04-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild * Fri Jun 19 2009 Johan Vromans - 1.04.04-1 - Upgrade to upstream 1.04.04. - Obsolete script patch. - Obsolete conversion to UTF-8 of README. * Wed Apr 22 2009 Johan Vromans - 1.04.03-3 - Remove Epoch: since it it not needed. - Make subpackage depend on EVR. * Mon Apr 20 2009 Johan Vromans - 1:1.04.03-2 - Use Epoch: to tighten dependency between basepackage and subpackage. - Use %%global instead of %%define. - Provide README.postgres as source, not as a patch. - Keep timestamps when copying and installing. - Simplify filelist building. - Remove INSTALL from %%doc. * Fri Apr 17 2009 Johan Vromans - 1.04.03-1 - Upgrade to upstream 1.04.03. - Include SQLite with the base package. - Enable database tests since we now require a db driver. * Fri Jan 30 2009 Johan Vromans - 1.04.02-1 - Adapt to Fedora guidelines * Sun Jan 26 2009 Johan Vromans - 1.04.02 - Remove QUICKSTART. * Sat Jul 19 2008 Johan Vromans - 1.03.90 - Remove debian stuff - Don't use unstable. * Fri Apr 11 2008 Johan Vromans - 1.03.12 - Simplify by setting variables from the .in template * Sun Apr 01 2007 Johan Vromans - 1.03.03 - Exclude some Wx files. * Sun Nov 05 2006 Johan Vromans - 1.03.00 - Move DB drivers to separate package, and adjust req/prov. * Mon Oct 16 2006 Johan Vromans - 1.01.02 - Prepare (but don't use) suffixes to separate production and unstable versions. * Wed Aug 02 2006 Johan Vromans 0.92 - New URL. Add Vendor. * Fri Jun 09 2006 Johan Vromans 0.60 - Remove man3. * Thu Jun 08 2006 Johan Vromans 0.60 - Fix example. * Mon Jun 05 2006 Johan Vromans 0.59 - Better script handling. * Mon Apr 17 2006 Johan Vromans 0.56 - Initial provisions for GUI. * Wed Apr 12 2006 Johan Vromans 0.56 - %%config(noreplace) for eekboek.conf. * Tue Mar 28 2006 Johan Vromans 0.52 - Perl Independent Install * Mon Mar 27 2006 Johan Vromans 0.52 - Add "--with dbtests" parameter for rpmbuild. - Resultant rpm may be signed. * Sun Mar 19 2006 Johan Vromans 0.50 - Switch to Build.PL instead of Makefile.PL. * Mon Jan 30 2006 Johan Vromans 0.37 - Add build dep perl(Config::IniFiles). * Fri Dec 23 2005 Wytze van der Raay 0.23 - Fixes for x86_64 building problems. * Wed Dec 12 2005 Johan Vromans 0.22 - Change some wordings. - Add man1. * Tue Dec 11 2005 Johan Vromans 0.21 - Add INSTALL QUICKSTART * Thu Dec 08 2005 Johan Vromans 0.20 - Include doc/html. * Tue Nov 22 2005 Johan Vromans 0.19 - More. * Sun Nov 20 2005 Jos Vos 0.17-XOS.0beta1 - Initial version. EekBoek-2.02.04/t/0000755000076500007650000000000012165465617011276 5ustar jvjvEekBoek-2.02.04/t/81_db_sqlite.t0000444000076500007650000000207612165465617013744 0ustar jvjv# 81_db_sqlite.t -- Basic SQLite access # Author : Johan Vromans # Created On : Tue Oct 10 18:46:26 2006 # Last Modified By: Johan Vromans # Last Modified On: Mon Jun 14 22:16:28 2010 # Update Count : 12 use strict; use warnings; use Test::More tests => 4; # Some basic tests. BEGIN { use_ok("DBI"); } SKIP: { eval { require DBD::SQLite }; skip("DBI SQLite driver (DBD::SQLite) not installed", 3) if $@; # Check minimal interface version. my $minpg = 1.12; ok($DBD::SQLite::VERSION >= $minpg, "DBD::SQLite version = $DBD::SQLite::VERSION,". " should be at least $minpg"); my $tmpdb = "tmp$$.db"; SKIP: { skip("Database tests skipped on request", 2) if $ENV{EB_SKIPDBTESTS}; # Check whether we can contact the database. open(my $db, ">", $tmpdb); close($db); my $dbh; eval { $dbh = DBI->connect("dbi:SQLite:dbname=$tmpdb"); ok(!$DBI::errstr, "Database Connect"); diag("Connect error:\n\t" . ($DBI::errstr||"")) if $DBI::errstr; }; ok($dbh, "Check databases"); } unlink($tmpdb); } EekBoek-2.02.04/t/30_amounts.t0000444000076500007650000000214412165465617013452 0ustar jvjv#! perl # $Id: 30_amounts.t,v 1.4 2010/03/17 10:51:33 jv Exp $ use strict; use warnings; use EB; use EB::Format; EB->app_init( { app => "Test", nostdconf => 1 } ); my @tests; BEGIN { @tests = ( # Integral '12345' => '1234500', # Fraction, EU + US '12345,66' => '1234566', '12345.66' => '1234566', # Too many fractional digits '12345,667' => '', '12345.667' => '', # Groups, EU + US '1.234.456' => '123445600', '1,234,456' => '123445600', # Illegal groups '1234.456' => '', '1234,456' => '', # Group + Fraction, EU + US '1.234,56' => '123456', '1,234.56' => '123456', # Illegal group/fract. '1.234.56' => '', '1.3' => '', '1,6' => '', ); } use Test::More tests => @tests/2; # Test numers (amount) parsing. while ( @tests ) { my $amt = shift(@tests); my $exp = shift(@tests); my $res = amount($amt); $res = '' unless defined $res; is($res, $exp, "amount $amt"); } EekBoek-2.02.04/t/91_ivp_sqlite.t0000444000076500007650000000042512165465617014152 0ustar jvjv#! perl # $Id: 91_ivp_sqlite.t,v 1.10 2009/10/15 16:27:04 jv Exp $ -*-perl-*- use strict; use warnings; our $dbdriver = "sqlite"; if ( !$dbdriver && $0 =~ /\d+_ivp_(.+).t/ ) { $dbdriver = $1; } chdir("t") if -d "t"; $ENV{LANG} = "nl_NL"; require "90_ivp_common.pl"; EekBoek-2.02.04/t/90_ivp_common.pl0000444000076500007650000002011712165465617014310 0ustar jvjv#! perl # 90_ivp_common.pl -- Common code for IVPs # Author : Johan Vromans # Created On : Thu Oct 15 16:27:04 2009 # Last Modified By: Johan Vromans # Last Modified On: Mon Jan 23 22:51:48 2012 # Update Count : 126 use strict; use warnings; # The actual number of database tests, as executed by report_tests. use constant NUMTESTS => 38; # There are 9 initial tests. # report_tests requires 1 more for the setup, and 1 for the export # (all but the last). my $remaining; use Test::More $ENV{EB_SKIPDBTESTS} ? (skip_all => "Database tests skipped on request") : (tests => ( $remaining = 3*(NUMTESTS+2)-1+10 )); use warnings; BEGIN { use_ok('IPC::Run3') } BEGIN { use_ok('EB::Config') } BEGIN { use_ok('EB') } BEGIN { use_ok('File::Copy') } EB->app_init( { app => "ivp" } ); ok( $::cfg, "Got config"); $remaining -= 5; our $dbdriver; my $dbddrv; $dbdriver = "postgres" unless $dbdriver; if ( $dbdriver eq "postgres" ) { $dbddrv = "DBD::Pg"; } elsif ( $dbdriver eq "sqlite" ) { $dbddrv = "DBD::SQLite"; } BAIL_OUT("Unsupported database driver: $dbdriver") unless $dbddrv; my $l = $ENV{LANG}; $l =~ s/_.*//; for ( "ivp_".$ENV{LANG}, "ivp_$l", "ivp" ) { chdir($_), last if -d $_; } SKIP: { diag("This test is not yet implemented -- SKIPPED") unless -d "ref"; skip("This test is not yet implemented", $remaining) unless -d "ref"; my $f; for ( qw(opening.eb relaties.eb mutaties.eb schema.dat) ) { ok(1, $_), next if -s $_; if ( $f = findlib($_, "examples") and -s $f ) { copy($f, $_); } ok(-s $_, $_); } $remaining -= 4; for ( qw(ivp.conf opening.eb relaties.eb mutaties.eb reports.eb schema.dat ) ) { die("=== IVP configuratiefout: $_ ===\n") unless -s $_; } mkdir("out") unless -d "out"; ok( -w "out" && -d "out", "writable output dir" ); $remaining--; eval "require $dbddrv"; skip("DBI $dbdriver driver ($dbddrv) not installed", $remaining) if $@; # Cleanup old files. unlink( glob("out/*.sql") ); unlink( glob("out/*.log") ); unlink( glob("out/*.txt") ); unlink( glob("out/*.html") ); unlink( glob("out/*.csv") ); unlink( glob("ebsqlite_sample*") ); my @ebcmd = qw(-MEB::Main -e EB::Main->run -- -X -f ivp.conf --echo); push(@ebcmd, "-D", "database:driver=$dbdriver") if $dbdriver; unshift(@ebcmd, map { ("-I", "../../$_" ) } grep { /^\w\w/ } reverse @INC); unshift(@ebcmd, $^X); # Check whether we can contact the database. eval { if ( $dbdriver eq "postgres" ) { my @ds = DBI->data_sources("Pg"); diag("Connect error:\n\t" . ($DBI::errstr||"")) if $DBI::errstr; skip("No access to database", $remaining) if $DBI::errstr; # && $DBI::errstr =~ /FATAL:\s*(user|role) .* does not exist/; } }; #### PASS 1: Construct from distributed files. for my $log ( "out/init.log" ) { ok(syscmd([@ebcmd, qw(--init)], undef, $log), "init"); checkerr($log); } report_tests(@ebcmd); for my $log ( "out/export1.log" ) { ok(syscmd([@ebcmd, qw(--export --dir=out)], undef, $log), "export1"); checkerr($log); } #### PASS 2: Construct from exported files. for my $log ( "out/import1.log" ) { ok(syscmd([@ebcmd, qw(--import --dir=out)], undef, $log), "import1"); checkerr($log); } report_tests(@ebcmd); for my $log ( "out/export2.log" ) { ok(syscmd([@ebcmd, qw(--export --file=out/export2.ebz)], undef, $log), "export2"); checkerr($log); } #### PASS 3: Construct from exported .ebz . for my $log ( "out/import2.log" ) { ok(syscmd([@ebcmd, qw(--import --file=out/export2.ebz)], undef, $log), "import2"); checkerr($log); } report_tests(@ebcmd); } # end SKIP ################ subroutines ################ sub report_tests { my @ebcmd = @_; for my $log ( "out/reports.log" ) { ok(syscmd(\@ebcmd, "reports.eb", $log), "reports"); checkerr($log); $remaining--; } # Verify: balans in varianten. vfy([@ebcmd, qw(-c balans) ], "balans.txt" ); vfy([@ebcmd, qw(-c balans --detail=0)], "balans0.txt"); vfy([@ebcmd, qw(-c balans --detail=1)], "balans1.txt"); vfy([@ebcmd, qw(-c balans --detail=2)], "balans2.txt"); vfy([@ebcmd, qw(-c balans --verdicht)], "balans2.txt"); vfy([@ebcmd, qw(-c balans --opening) ], "obalans.txt"); # Verify: verlies/winst in varianten. vfy([@ebcmd, qw(-c result) ], "result.txt" ); vfy([@ebcmd, qw(-c result --detail=0)], "result0.txt"); vfy([@ebcmd, qw(-c result --detail=1)], "result1.txt"); vfy([@ebcmd, qw(-c result --detail=2)], "result2.txt"); vfy([@ebcmd, qw(-c result --verdicht)], "result2.txt"); # Verify: Journaal. vfy([@ebcmd, qw(-c journaal) ], "journaal.txt"); # Verify: Journaal van dagboek. vfy([@ebcmd, qw(-c journaal postbank) ], "journaal-postbank.txt"); # Verify: Journaal van boekstuk. vfy([@ebcmd, qw(-c journaal postbank:24)], "journaal-postbank24.txt"); # Verify: Proef- en Saldibalans in varianten. vfy([@ebcmd, qw(-c proefensaldibalans) ], "proef.txt"); vfy([@ebcmd, qw(-c proefensaldibalans --detail=0)], "proef0.txt"); vfy([@ebcmd, qw(-c proefensaldibalans --detail=1)], "proef1.txt"); vfy([@ebcmd, qw(-c proefensaldibalans --detail=2)], "proef2.txt"); vfy([@ebcmd, qw(-c proefensaldibalans --verdicht)], "proef2.txt"); # Verify: Grootboek in varianten. vfy([@ebcmd, qw(-c grootboek) ], "grootboek.txt" ); vfy([@ebcmd, qw(-c grootboek --detail=0)], "grootboek0.txt" ); vfy([@ebcmd, qw(-c grootboek --detail=1)], "grootboek1.txt" ); vfy([@ebcmd, qw(-c grootboek --detail=2)], "grootboek2.txt" ); vfy([@ebcmd, qw(-c grootboek 2) ], "grootboek_2.txt" ); vfy([@ebcmd, qw(-c grootboek 23) ], "grootboek_23.txt" ); vfy([@ebcmd, qw(-c grootboek 23 22) ], "grootboek_23_22.txt"); vfy([@ebcmd, qw(-c grootboek 2320) ], "grootboek_2320.txt" ); # Verify: Crediteuren/Debiteuren. vfy([@ebcmd, qw(-c crediteuren) ], "crdrept.txt"); vfy([@ebcmd, qw(-c debiteuren) ], "debrept.txt"); # Verify: BTW aangifte. vfy([@ebcmd, qw(-c btwaangifte j) ], "btw.txt" ); vfy([@ebcmd, qw(-c btwaangifte k2) ], "btwk2.txt"); vfy([@ebcmd, qw(-c btwaangifte 7) ], "btw7.txt" ); # Verify: HTML generatie. vfy([@ebcmd, qw(-c balans --detail=2 --gen-html) ], "balans2.html"); vfy([@ebcmd, qw(-c balans --detail=2 --gen-html --style=xxx)], "balans2xxx.html"); vfy([@ebcmd, qw(-c btwaangifte j)], "btw.html"); # Verify: CSV generatie. vfy([@ebcmd, qw(-c balans --detail=2 --gen-csv)], "balans2.csv"); # Verify: XAF generatie. vfy([@ebcmd, qw(-c export --xaf=out/export.xaf)], "export.xaf"); } sub vfy { my ($cmd, $ref) = @_; my @c = @$cmd; while ( shift(@c) ne "-c" ) { } if ( $ref =~ /\.xaf$/ ) { push( @c, "--xaf=$ref" ); } else { push( @c, "--output=$ref" ); } ok(!diff($ref), $ref); } sub vfyxx { my ($cmd, $ref) = @_; syscmd($cmd, undef, $ref); ok(!diff($ref), $ref); } sub diff { my ($file1, $file2) = @_; $file2 = "ref/$file1" unless $file2; $file1 = "out/$file1"; my ($str1, $str2); local($/); open(my $fd1, "<:encoding(utf-8)", $file1) or die("$file1: $!\n"); $str1 = <$fd1>; close($fd1); open(my $fd2, "<:encoding(utf-8)", $file2) or die("$file2: $!\n"); $str2 = <$fd2>; close($fd2); $str1 =~ s/^EekBoek \d.*Squirrel Consultancy\n//; $str1 =~ s/[\n\r]+/\n/; $str2 =~ s/[\n\r]+/\n/; return 0 if $str1 eq $str2; 1; } sub syscmd { my ($cmd, $in, $out, $err) = @_; $in = \undef unless defined($in); $err = $out if @_ < 4; #warn("+ @$cmd\n"); run3($cmd, $in, $out, $err); printf STDERR ("Exit status 0x%x\n", $?) if $?; $? == 0; } sub checkerr { my $fail; unless ( -s $_[0] ) { warn("$_[0]: Bestand ontbreekt, of is leeg\n"); $fail++; } open(my $fd, "<", $_[0]) or die("$_[0]: $!\n"); while ( <$fd> ) { next unless /(^\?|^ERROR| at .* line \d+)/; warn($_); $fail++; } close($fd); die("=== IVP afgebroken ===\n") if $fail; } 1; EekBoek-2.02.04/t/20_dates.t0000444000076500007650000000524112165465617013064 0ustar jvjv#! perl # $Id: 20_dates.t,v 1.5 2009/10/28 22:43:05 jv Exp $ use strict; use warnings; use EB; my @tests1; my @tests2; BEGIN { @tests1 = ( "01-02" => "2004-02-01", "01-02-2003" => "2003-02-01", "2003-02-01" => "2003-02-01", "2011-09-01+3d" => "2011-09-04", "2011-09-01+30d" => "2011-10-01", "2011-09-01+30d+1m" => "2011-10-31", "2011-09-01+30d-1m" => "2011-08-31", "2011-12-31+1d" => "2012-01-01", map { sprintf("2012-10-%02d", $_) => sprintf("2012-10-%02d", $_) } 1..31, ); @tests2 = ( "jaar" => "2004-01-01 - 2004-12-31", "2003-03-04 - 2003-05-06" => "2003-03-04 - 2003-05-06", "2003-03-04 / 2003-05-06" => "2003-03-04 - 2003-05-06", "2003-03-04 / 05-06" => "2003-03-04 - 2003-05-06", "2003-03-04 / 06" => "2003-03-04 - 2003-03-06", "03-04-2003 - 05-06-2003" => "2003-04-03 - 2003-06-05", "03-04 - 25-06" => "2004-04-03 - 2004-06-25", "3 april - 25 jun" => "2004-04-03 - 2004-06-25", "3 april - 25 jun 2003" => "2003-04-03 - 2003-06-25", "3 april 2003 - 25 jun 2003" => "2003-04-03 - 2003-06-25", "april - jun" => "2004-04-01 - 2004-06-30", "april - jun 2003" => "2003-04-01 - 2003-06-30", "k2" => "2004-04-01 - 2004-06-30", "k2 2003" => "2003-04-01 - 2003-06-30", "jaar" => "2004-01-01 - 2004-12-31", "apr" => "2004-04-01 - 2004-04-30", "april" => "2004-04-01 - 2004-04-30", "m4" => "2004-04-01 - 2004-04-30", "m04" => "2004-04-01 - 2004-04-30", "apr 2003" => "2003-04-01 - 2003-04-30", "m04 2003" => "2003-04-01 - 2003-04-30", "2003" => "2003-01-01 - 2003-12-31", "maart 2013" => "2013-03-01 - 2013-03-31", ); } use Test::More tests => @tests1 + @tests2/2; EB->app_init( { app => "Test", nostdconf => 1 } ); # Test date parsing. while ( @tests1 ) { my $date = shift(@tests1); my $exp = shift(@tests1); my ($dy, $dm, $dd); $dy = $1 if $date =~ s/([-+]\d+)y//; $dm = $1 if $date =~ s/([-+]\d+)m//; $dd = $1 if $date =~ s/([-+]\d+)d//; my $res = parse_date($date, 2004, $dd, $dm, $dy); #ok(1, "$date -> undef"), next unless $exp || $res; is($res, $exp, "date $date"); my @res = parse_date($date, 2004, $dd, $dm, $dy); $res = sprintf("%04d-%02d-%02d", @res); is($res, $exp, "date $date"); } # Test range parsing. while ( @tests2 ) { my $range = shift(@tests2); my $exp = shift(@tests2); my $res = parse_date_range($range, 2004); #ok(1, "$range -> undef"), next unless $exp || $res; $res = defined($res) ? join(" - ", @$res) : ""; is($res, $exp, "range $range"); } EekBoek-2.02.04/t/31_expr.t0000444000076500007650000000163712165465617012751 0ustar jvjv#! perl # $Id: 31_expr.t,v 1.4 2010/03/17 10:51:33 jv Exp $ use strict; use warnings; use EB; use EB::Format; EB->app_init( { app => "Test", nostdconf => 1 } ); my @tests; BEGIN { @tests = ( '12345+98765' => '11111000', '3*2' => '600', '4.12+5,25' => '937', '+123+123' => '24600', '-123+123' => '0', '123.45*0.1253' => '1547', # 0.005 should not be treated as 0005, but as 0005. '25.50*1.19+0.005' => '3035', # Mix . and , '25,50*1.19+0.005+0,05' => '3040', # Disallow anything fancy '7.123,45*0.12' => '' ); } use Test::More tests => @tests/2; # Test numers (amount) parsing. while ( @tests ) { my $amt = shift(@tests); my $exp = shift(@tests); my $res = eval { amount($amt) }; $res = '' unless defined $res; diag($@) if $@; is($res, $exp, "amount $amt"); } EekBoek-2.02.04/t/80_db_postgresql.t0000444000076500007650000000221212165465617014635 0ustar jvjv# 80_db_postgresql.t -- Basic test PosgreSQL access # Author : Johan Vromans # Created On : Mon Jan 16 11:07:02 2006 # Last Modified By: Johan Vromans # Last Modified On: Mon Jun 14 22:15:34 2010 # Update Count : 1 use strict; use warnings; use Test::More tests => 4; # Some basic tests. BEGIN { use_ok("DBI"); } SKIP: { eval { require DBD::Pg }; skip("DBI PostgreSQL driver (DBD::Pg) not installed", 3) if $@; # Check minimal Pg interface version. my $minpg = 1.31; ok($DBD::Pg::VERSION >= $minpg, "DBD::PG version = $DBD::Pg::VERSION, should be at east $minpg"); SKIP: { skip("Database tests skipped on request", 2) if $ENV{EB_SKIPDBTESTS}; # Check whether we can contact the database. my @ds; eval { @ds = DBI->data_sources("Pg"); diag("Connect error:\n\t" . ($DBI::errstr||"")) if $DBI::errstr; skip("No access to database", 2) if $DBI::errstr;# && $DBI::errstr =~ /FATAL:\s*(user|role) .* does not exist/; diag("Connect error:\n\t" . ($DBI::errstr||"")) if $DBI::errstr; ok(!$DBI::errstr, "Database Connect"); }; ok(@ds > 1, "Check databases"); } } EekBoek-2.02.04/t/10_basic.t0000444000076500007650000000113712165465617013044 0ustar jvjv#! perl use strict; use Test::More tests => 11; # Some basic tests. BEGIN { $ENV{LANG} = "nl_NL"; use_ok("EB"); EB->app_init( { app => "Test", nostdconf => 1 } ); ok( $::cfg, "Got config" ); use_ok("EB::Format"); use_ok("EB::Booking::IV"); use_ok("EB::Booking::BKM"); } # Check some data files. foreach ( qw(eekboek.sql) ) { my $t = findlib("schema/$_"); ok(-s $t, $t); } foreach ( qw(schema.dat bvnv.dat) ) { my $t = findlib($_, "examples"); ok(-s $t, $t); } foreach ( qw(eekboek balans balres) ) { my $t = findlib("css/$_.css"); ok(-s $t, $t); } EekBoek-2.02.04/t/92_ivp_postgres.t0000444000076500007650000000043112165465617014515 0ustar jvjv#! perl # $Id: 92_ivp_postgres.t,v 1.1 2009/10/15 16:27:04 jv Exp $ -*-perl-*- use strict; use warnings; our $dbdriver = "postgres"; if ( !$dbdriver && $0 =~ /\d+_ivp_(.+).t/ ) { $dbdriver = $1; } chdir("t") if -d "t"; $ENV{LANG} = "nl_NL"; require "90_ivp_common.pl"; EekBoek-2.02.04/t/ivp_en/0000755000076500007650000000000012165465617012556 5ustar jvjvEekBoek-2.02.04/t/ivp_en/ivp.conf0000444000076500007650000000030112165465617014213 0ustar jvjv; Settings voor EekBoek Installatie-Verificatie Procedure. [locale] lang = en_US decimalpt = . [database] name = sample [internal] now = 2011-12-31 [csv] separator = , [html] cssdir = css EekBoek-2.02.04/t/ivp_en/reports.eb0000444000076500007650000000435012165465617014564 0ustar jvjv# Verify: balans in varianten. balance --output=out/balans.txt balance --detail=0 --output=out/balans0.txt balance --detail=1 --output=out/balans1.txt balance --detail=2 --output=out/balans2.txt #### TODO: --verdicht balance --verdicht --output=out/balans2.txt balance --opening --output=out/obalans.txt # Verify: verlies/winst in varianten. result --output=out/result.txt result --detail=0 --output=out/result0.txt result --detail=1 --output=out/result1.txt #### TODO: --verdicht result --verdicht --output=out/result2.txt result --period=apr --output=out/result-apr.txt #### TODO: mei -> may result --period=mei --output=out/result-mei.txt # Verify: Journaal. journal --output=out/journaal.txt # Verify: Journaal van dagboek. journal postbank --output=out/journaal-postbank.txt # Verify: Journaal van boekstuk. journal postbank:24 --output=out/journaal-postbank24.txt # Verify: Proef- en Saldibalans in varianten. trialbalance --output=out/proef.txt trialbalance --detail=0 --output=out/proef0.txt trialbalance --detail=1 --output=out/proef1.txt trialbalance --detail=2 --output=out/proef2.txt #### TODO: --verdicht trialbalance --verdicht --output=out/proef2.txt # Verify: Grootboek in varianten. ledger --output=out/grootboek.txt ledger --detail=0 --output=out/grootboek0.txt ledger --detail=1 --output=out/grootboek1.txt ledger --detail=2 --output=out/grootboek2.txt ledger 2 --output=out/grootboek_2.txt ledger 23 --output=out/grootboek_23.txt ledger 23 22 --output=out/grootboek_23_22.txt ledger 2320 --output=out/grootboek_2320.txt # Verify: Crediteuren/Debiteuren. creditors --output=out/crdrept.txt debtors --output=out/debrept.txt # Verify: BTW aangifte. #### TODO: j -> y; k2 -> q2 vatsubmission j --output=out/btw.txt vatsubmission k2 --output=out/btwk2.txt vatsubmission 7 --output=out/btw7.txt # Verify: HTML generatie. balance --detail=2 --gen-html --output=out/balans2.html balance --detail=2 --gen-html --style=xxx --output=out/balans2xxx.html #### TODO: j -> y vatsubmission j --output=out/btw.html # Verify: CSV generatie. balance --detail=2 --gen-csv --output=out/balans2.csv # Verify: XAF generatie. export --xaf=out/export.xaf EekBoek-2.02.04/t/ivp_en/ref/0000755000076500007650000000000012165465617013332 5ustar jvjvEekBoek-2.02.04/t/ivp_en/ref/journaal-postbank.txt0000444000076500007650000002060312165465617017524 0ustar jvjv Journal Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Date Booking/Account Acc Debet Credit BTW % Tarief Posting/line Relation ------------------------------------------------------------------------------------------------------------------------------------------ 2011-01-31 Postbank:1 Afschrift 1 2011-01-31 Creditors 4100 104.65 *ADSL + Telefoon KPN 2011-01-19 Creditors 4100 22.80 *Internet XS4ALL 2011-01-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-01-31 Bank 2320 130.15 Afschrift 1 2011-02-28 Postbank:2 Afschrift 2 2011-02-23 Creditors 4100 22.80 *Internet XS4ALL 2011-02-10 Bank costs 6980 2.70 0.00 Nul Girotel 2011-02-28 Bank 2320 25.50 Afschrift 2 2011-03-31 Postbank:3 Afschrift 3 2011-03-31 Bank 2320 3442.98 Afschrift 3 2011-03-31 Creditors 4100 101.52 *Telefoonkosten KPN 2011-03-31 Creditors 4100 22.80 *Internet XS4ALL 2011-03-09 Bank costs 6980 2.70 0.00 Nul Girotel 2011-03-18 Debtors 2200 3570.00 *Perl Cursus ACME 2011-04-30 Postbank:4 Afschrift 4 2011-04-30 Bank 2320 3544.50 Afschrift 4 2011-04-06 Creditors 4100 22.80 *Internet XS4ALL 2011-04-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-04-12 Debtors 2200 3570.00 *Perl Cursus ACME 2011-05-31 Postbank:5 Afschrift 5 2011-05-31 Bank 2320 467.28 Afschrift 5 2011-05-31 Creditors 4100 102.22 *Telefoonkosten KPN 2011-05-31 Creditors 4100 22.80 *Internet XS4ALL 2011-05-11 Bank costs 6980 2.70 0.00 Nul Girotel 2011-05-31 Debtors 2200 595.00 *Perl Cursus ACME 2011-06-30 Postbank:6 Afschrift 6 2011-06-30 Bank 2320 688.50 Afschrift 6 2011-06-21 Creditors 4100 22.80 *Internet XS4ALL 2011-06-08 Bank costs 6980 2.70 0.00 Nul Girotel 2011-06-08 Debtors 2200 714.00 *Ondersteuning ACME 2011-07-31 Postbank:7 Afschrift 7 2011-07-31 Creditors 4100 104.66 *Telefoonkosten KPN 2011-07-30 Creditors 4100 22.80 *Internet XS4ALL 2011-07-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-07-31 Bank 2320 130.16 Afschrift 7 2011-08-31 Postbank:8 Afschrift 8 2011-08-31 Bank 2320 1688.50 Afschrift 8 2011-08-10 Creditors 4100 22.80 *Internet XS4ALL 2011-08-10 Bank costs 6980 2.70 0.00 Nul Girotel 2011-08-10 Debtors 2200 714.00 *Ondersteuning ACME 2011-08-19 Debtors 2200 1000.00 *Pocket Reference ORA 2011-09-30 Postbank:9 Afschrift 9 2011-09-30 Creditors 4100 108.72 *Telefoonkosten KPN 2011-09-30 Creditors 4100 22.80 *Internet XS4ALL 2011-09-17 Bank costs 6980 2.70 0.00 Nul Girotel 2011-09-30 Bank 2320 134.22 Afschrift 9 2011-10-31 Postbank:10 Afschrift 10 2011-10-13 Creditors 4100 22.80 *Internet XS4ALL 2011-10-12 Bank costs 6980 2.70 0.00 Nul Girotel 2011-10-31 Bank 2320 25.50 Afschrift 10 2011-11-30 Postbank:11 Afschrift 11 2011-11-30 Creditors 4100 109.67 *Telefoonkosten KPN 2011-11-30 Creditors 4100 22.80 *Internet XS4ALL 2011-11-08 Bank costs 6980 2.70 0.00 Nul Girotel 2011-11-30 Bank 2320 135.17 Afschrift 11 2011-12-07 Postbank:12 Afschrift 12 2011-12-07 Creditors 4100 22.80 *Internet XS4ALL 2011-12-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-12-07 Bank 2320 25.50 Afschrift 12 2011-12-09 Postbank:13 Eerste deel ADSL 2011-12-09 Creditors 4100 10.00 *Internet XS4ALL 2011-12-09 Bank 2320 10.00 Eerste deel ADSL 2011-12-10 Postbank:14 Tweede deel ADSL 2011-12-10 Creditors 4100 12.80 *Internet XS4ALL 2011-12-10 Bank 2320 12.80 Tweede deel ADSL ------------------------------------------------------------------------------------------------------------------------------------------ Total Daybook Postbank 10792.00 10792.00 EekBoek-2.02.04/t/ivp_en/ref/grootboek_23_22.txt0000444000076500007650000000632012165465617016674 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 2200 Debtors Initial balance 0.00 0.00 Perl Cursus 2011-02-18 3570.00 0.00 Sales:1 Perl Cursus 2011-03-18 3570.00 0.00 Sales:2 *Perl Cursus 2011-03-18 0.00 3570.00 Postbank:3 ACME *Perl Cursus 2011-04-12 0.00 3570.00 Postbank:4 ACME Perl Cursus 2011-04-18 595.00 0.00 Sales:3 Ondersteuning 2011-05-14 714.00 0.00 Sales:4 *Perl Cursus 2011-05-31 0.00 595.00 Postbank:5 ACME *Ondersteuning 2011-06-08 0.00 714.00 Postbank:6 ACME Ondersteuning 2011-07-16 714.00 0.00 Sales:5 *Ondersteuning 2011-08-10 0.00 714.00 Postbank:8 ACME Pocket Reference 2011-08-19 1000.00 0.00 Sales:6 *Pocket Reference 2011-08-19 0.00 1000.00 Postbank:8 ORA Mutations total 0.00 2200 Total Debtors 0.00 2320 Bank Initial balance 1131.92 0.00 Afschrift 1 2011-01-31 0.00 130.15 Postbank:1 Afschrift 2 2011-02-28 0.00 25.50 Postbank:2 Afschrift 3 2011-03-31 3442.98 0.00 Postbank:3 Afschrift 4 2011-04-30 3544.50 0.00 Postbank:4 Afschrift 5 2011-05-31 467.28 0.00 Postbank:5 Afschrift 6 2011-06-30 688.50 0.00 Postbank:6 Afschrift 7 2011-07-31 0.00 130.16 Postbank:7 Afschrift 8 2011-08-31 1688.50 0.00 Postbank:8 Afschrift 9 2011-09-30 0.00 134.22 Postbank:9 Afschrift 10 2011-10-31 0.00 25.50 Postbank:10 Afschrift 11 2011-11-30 0.00 135.17 Postbank:11 Afschrift 12 2011-12-07 0.00 25.50 Postbank:12 Eerste deel ADSL 2011-12-09 0.00 10.00 Postbank:13 Tweede deel ADSL 2011-12-10 0.00 12.80 Postbank:14 Mutations total 9202.76 2320 Total Bank 10334.68 Mutations total 9202.76 0.00 --------------------------------------------------------------------------------------------------- Total 10334.68 0.00 EekBoek-2.02.04/t/ivp_en/ref/result.txt0000444000076500007650000000175712165465617015421 0ustar jvjv Profit/Loss Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Account Debet Credit ---------------------------------------------------------------------- 6800 Depreciation costs inventory 411.26 6810 Depreciation costs computers 396.82 6900 Phone costs and fax costs 510.29 6905 Internet costs 269.42 6980 Bank costs 32.40 8100 Revenue consultancy 1200.00 8300 Revenue editing 1000.00 8400 Revenue courses 6500.00 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Results 8700.00 8700.00 EekBoek-2.02.04/t/ivp_en/ref/journaal.txt0000444000076500007650000005076312165465617015717 0ustar jvjv Journal Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Date Booking/Account Acc Debet Credit BTW % Tarief Posting/line Relation ------------------------------------------------------------------------------------------------------------------------------------------ 2011-01-05 Purchase:1 Internet XS4ALL 2011-01-05 VAT Procurement high 4220 3.64 BTW ADSL 2011-01-05 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-01-05 Creditors 4100 22.80 Internet 2011-01-15 Purchase:2 ADSL + Telefoon KPN 2011-01-15 VAT Procurement high 4220 12.84 BTW Telefoonkosten 2011-01-15 VAT Procurement high 4220 3.86 BTW ADSL 2011-01-15 Phone costs and fax costs 6900 67.61 19.00 Hoog Telefoonkosten 2011-01-15 Internet costs 6905 20.34 19.00 Hoog ADSL 2011-01-15 Creditors 4100 104.65 ADSL + Telefoon 2011-01-31 Postbank:1 Afschrift 1 2011-01-31 Creditors 4100 104.65 *ADSL + Telefoon KPN 2011-01-19 Creditors 4100 22.80 *Internet XS4ALL 2011-01-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-01-31 Bank 2320 130.15 Afschrift 1 2011-02-09 Purchase:3 Internet XS4ALL 2011-02-09 VAT Procurement high 4220 3.64 BTW ADSL 2011-02-09 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-02-09 Creditors 4100 22.80 Internet 2011-02-18 Sales:1 Perl Cursus ACME 2011-02-18 Debtors 2200 3570.00 Perl Cursus 2011-02-18 VAT Revenue high 4200 570.00 BTW Perl Cursus 1e bet. 2011-02-18 Revenue courses 8400 3000.00 19.00 Hoog Perl Cursus 1e bet. 2011-02-28 Postbank:2 Afschrift 2 2011-02-23 Creditors 4100 22.80 *Internet XS4ALL 2011-02-10 Bank costs 6980 2.70 0.00 Nul Girotel 2011-02-28 Bank 2320 25.50 Afschrift 2 2011-03-08 Purchase:4 Internet XS4ALL 2011-03-08 VAT Procurement high 4220 3.64 BTW ADSL 2011-03-08 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-03-08 Creditors 4100 22.80 Internet 2011-03-18 Purchase:5 Telefoonkosten KPN 2011-03-18 VAT Procurement high 4220 16.21 BTW ADSL + Telefoon 2011-03-18 Phone costs and fax costs 6900 85.31 19.00 Hoog ADSL + Telefoon 2011-03-18 Creditors 4100 101.52 Telefoonkosten 2011-03-18 Sales:2 Perl Cursus ACME 2011-03-18 Debtors 2200 3570.00 Perl Cursus 2011-03-18 VAT Revenue high 4200 570.00 BTW Perl Cursus 2e bet. 2011-03-18 Revenue courses 8400 3000.00 19.00 Hoog Perl Cursus 2e bet. 2011-03-31 Postbank:3 Afschrift 3 2011-03-31 Bank 2320 3442.98 Afschrift 3 2011-03-31 Creditors 4100 101.52 *Telefoonkosten KPN 2011-03-31 Creditors 4100 22.80 *Internet XS4ALL 2011-03-09 Bank costs 6980 2.70 0.00 Nul Girotel 2011-03-18 Debtors 2200 3570.00 *Perl Cursus ACME 2011-04-05 Purchase:6 Internet XS4ALL 2011-04-05 VAT Procurement high 4220 3.64 BTW ADSL 2011-04-05 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-04-05 Creditors 4100 22.80 Internet 2011-04-18 Sales:3 Perl Cursus ACME 2011-04-18 Debtors 2200 595.00 Perl Cursus 2011-04-18 VAT Revenue high 4200 95.00 BTW Perl Cursus rest 2011-04-18 Revenue courses 8400 500.00 19.00 Hoog Perl Cursus rest 2011-04-30 Postbank:4 Afschrift 4 2011-04-30 Bank 2320 3544.50 Afschrift 4 2011-04-06 Creditors 4100 22.80 *Internet XS4ALL 2011-04-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-04-12 Debtors 2200 3570.00 *Perl Cursus ACME 2011-05-10 Purchase:7 Internet XS4ALL 2011-05-10 VAT Procurement high 4220 3.64 BTW ADSL 2011-05-10 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-05-10 Creditors 4100 22.80 Internet 2011-05-14 Sales:4 Ondersteuning ACME 2011-05-14 Debtors 2200 714.00 Ondersteuning 2011-05-14 VAT Revenue high 4200 114.00 BTW Consultancy 2011-05-14 Revenue consultancy 8100 600.00 19.00 Hoog Consultancy 2011-05-20 Purchase:8 Telefoonkosten KPN 2011-05-20 VAT Procurement high 4220 16.32 BTW ADSL + Telefoon 2011-05-20 Phone costs and fax costs 6900 85.90 19.00 Hoog ADSL + Telefoon 2011-05-20 Creditors 4100 102.22 Telefoonkosten 2011-05-31 Postbank:5 Afschrift 5 2011-05-31 Bank 2320 467.28 Afschrift 5 2011-05-31 Creditors 4100 102.22 *Telefoonkosten KPN 2011-05-31 Creditors 4100 22.80 *Internet XS4ALL 2011-05-11 Bank costs 6980 2.70 0.00 Nul Girotel 2011-05-31 Debtors 2200 595.00 *Perl Cursus ACME 2011-06-07 Purchase:9 Internet XS4ALL 2011-06-07 VAT Procurement high 4220 3.64 BTW ADSL 2011-06-07 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-06-07 Creditors 4100 22.80 Internet 2011-06-30 Postbank:6 Afschrift 6 2011-06-30 Bank 2320 688.50 Afschrift 6 2011-06-21 Creditors 4100 22.80 *Internet XS4ALL 2011-06-08 Bank costs 6980 2.70 0.00 Nul Girotel 2011-06-08 Debtors 2200 714.00 *Ondersteuning ACME 2011-07-05 Purchase:10 Internet XS4ALL 2011-07-05 VAT Procurement high 4220 3.64 BTW ADSL 2011-07-05 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-07-05 Creditors 4100 22.80 Internet 2011-07-15 Purchase:11 Telefoonkosten KPN 2011-07-15 VAT Procurement high 4220 16.71 BTW ADSL + Telefoon 2011-07-15 Phone costs and fax costs 6900 87.95 19.00 Hoog ADSL + Telefoon 2011-07-15 Creditors 4100 104.66 Telefoonkosten 2011-07-16 Sales:5 Ondersteuning ACME 2011-07-16 Debtors 2200 714.00 Ondersteuning 2011-07-16 VAT Revenue high 4200 114.00 BTW Consultancy 2011-07-16 Revenue consultancy 8100 600.00 19.00 Hoog Consultancy 2011-07-31 Postbank:7 Afschrift 7 2011-07-31 Creditors 4100 104.66 *Telefoonkosten KPN 2011-07-30 Creditors 4100 22.80 *Internet XS4ALL 2011-07-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-07-31 Bank 2320 130.16 Afschrift 7 2011-08-09 Purchase:12 Internet XS4ALL 2011-08-09 VAT Procurement high 4220 3.64 BTW ADSL 2011-08-09 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-08-09 Creditors 4100 22.80 Internet 2011-08-19 Sales:6 Pocket Reference ORA 2011-08-19 Debtors 2200 1000.00 Pocket Reference 2011-08-19 Revenue editing 8300 1000.00 19.00 Hoog Produktie boek 2011-08-31 Postbank:8 Afschrift 8 2011-08-31 Bank 2320 1688.50 Afschrift 8 2011-08-10 Creditors 4100 22.80 *Internet XS4ALL 2011-08-10 Bank costs 6980 2.70 0.00 Nul Girotel 2011-08-10 Debtors 2200 714.00 *Ondersteuning ACME 2011-08-19 Debtors 2200 1000.00 *Pocket Reference ORA 2011-09-06 Purchase:13 Internet XS4ALL 2011-09-06 VAT Procurement high 4220 3.64 BTW ADSL 2011-09-06 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-09-06 Creditors 4100 22.80 Internet 2011-09-16 Purchase:14 Telefoonkosten KPN 2011-09-16 VAT Procurement high 4220 17.36 BTW ADSL + Telefoon 2011-09-16 Phone costs and fax costs 6900 91.36 19.00 Hoog ADSL + Telefoon 2011-09-16 Creditors 4100 108.72 Telefoonkosten 2011-09-30 Postbank:9 Afschrift 9 2011-09-30 Creditors 4100 108.72 *Telefoonkosten KPN 2011-09-30 Creditors 4100 22.80 *Internet XS4ALL 2011-09-17 Bank costs 6980 2.70 0.00 Nul Girotel 2011-09-30 Bank 2320 134.22 Afschrift 9 2011-10-11 Purchase:15 Internet XS4ALL 2011-10-11 VAT Procurement high 4220 3.64 BTW ADSL 2011-10-11 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-10-11 Creditors 4100 22.80 Internet 2011-10-31 Postbank:10 Afschrift 10 2011-10-13 Creditors 4100 22.80 *Internet XS4ALL 2011-10-12 Bank costs 6980 2.70 0.00 Nul Girotel 2011-10-31 Bank 2320 25.50 Afschrift 10 2011-11-07 Purchase:16 Internet XS4ALL 2011-11-07 VAT Procurement high 4220 3.64 BTW ADSL 2011-11-07 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-11-07 Creditors 4100 22.80 Internet 2011-11-17 Purchase:17 Telefoonkosten KPN 2011-11-17 VAT Procurement high 4220 17.51 BTW ADSL + Telefoon 2011-11-17 Phone costs and fax costs 6900 92.16 19.00 Hoog ADSL + Telefoon 2011-11-17 Creditors 4100 109.67 Telefoonkosten 2011-11-30 Postbank:11 Afschrift 11 2011-11-30 Creditors 4100 109.67 *Telefoonkosten KPN 2011-11-30 Creditors 4100 22.80 *Internet XS4ALL 2011-11-08 Bank costs 6980 2.70 0.00 Nul Girotel 2011-11-30 Bank 2320 135.17 Afschrift 11 2011-12-06 Purchase:18 Internet XS4ALL 2011-12-06 VAT Procurement high 4220 3.64 BTW ÁDSL 2011-12-06 Internet costs 6905 19.16 19.00 Hoog ÁDSL 2011-12-06 Creditors 4100 22.80 Internet 2011-12-07 Postbank:12 Afschrift 12 2011-12-07 Creditors 4100 22.80 *Internet XS4ALL 2011-12-06 Bank costs 6980 2.70 0.00 Nul Girotel 2011-12-07 Bank 2320 25.50 Afschrift 12 2011-12-07 Purchase:20 Internet XS4ALL 2011-12-07 VAT Procurement high 4220 3.64 BTW ADSL 2011-12-07 Internet costs 6905 19.16 19.00 Hoog ADSL 2011-12-07 Creditors 4100 22.80 Internet 2011-12-09 Postbank:13 Eerste deel ADSL 2011-12-09 Creditors 4100 10.00 *Internet XS4ALL 2011-12-09 Bank 2320 10.00 Eerste deel ADSL 2011-12-10 Postbank:14 Tweede deel ADSL 2011-12-10 Creditors 4100 12.80 *Internet XS4ALL 2011-12-10 Bank 2320 12.80 Tweede deel ADSL 2011-12-31 Memorial:1 Afschrijving inventaris 2011-12-31 Depreciation costs inventory 6800 411.26 0.00 Nul Afschrijving 2011-12-31 Depreciation supplies 1101 411.26 Afschrijving 2011-12-31 Memorial:2 Afschrijving computers 2011-12-31 Depreciation costs computers 6810 396.82 0.00 Nul Afschrijving 2011-12-31 Depreciation computers 1111 396.82 Afschrijving ------------------------------------------------------------------------------------------------------------------------------------------ Total 22690.92 22690.92 EekBoek-2.02.04/t/ivp_en/ref/grootboek1.txt0000444000076500007650000001122212165465617016143 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 1100 Supplies Initial balance 1344.37 0.00 Mutations total 0.00 1100 Total Supplies 1344.37 1101 Depreciation supplies Initial balance 0.00 1304.81 Mutations total 411.26 1101 Total Depreciation supplies 1716.07 1110 Computers Initial balance 13378.48 0.00 Mutations total 0.00 1110 Total Computers 13378.48 1111 Depreciation computers Initial balance 0.00 12106.78 Mutations total 396.82 1111 Total Depreciation computers 12503.60 2200 Debtors Initial balance 0.00 0.00 Mutations total 0.00 2200 Total Debtors 0.00 2320 Bank Initial balance 1131.92 0.00 Mutations total 9202.76 2320 Total Bank 10334.68 3100 Capital Initial balance 0.00 2443.18 Mutations total 0.00 3100 Total Capital 2443.18 4100 Creditors Initial balance 0.00 0.00 Mutations total 0.00 4100 Total Creditors 0.00 4200 VAT Revenue high Initial balance 0.00 0.00 Mutations total 1463.00 4200 Total VAT Revenue high 1463.00 4220 VAT Procurement high Initial balance 0.00 0.00 Mutations total 148.13 4220 Total VAT Procurement high 148.13 6800 Depreciation costs inventory Initial balance 0.00 0.00 Mutations total 411.26 6800 Total Depreciation costs 411.26 inventory 6810 Depreciation costs computers Initial balance 0.00 0.00 Mutations total 396.82 6810 Total Depreciation costs 396.82 computers 6900 Phone costs and fax costs Initial balance 0.00 0.00 Mutations total 510.29 6900 Total Phone costs and fax 510.29 costs 6905 Internet costs Initial balance 0.00 0.00 Mutations total 269.42 6905 Total Internet costs 269.42 6980 Bank costs Initial balance 0.00 0.00 Mutations total 32.40 6980 Total Bank costs 32.40 8100 Revenue consultancy Initial balance 0.00 0.00 Mutations total 1200.00 8100 Total Revenue consultancy 1200.00 8300 Revenue editing Initial balance 0.00 0.00 Mutations total 1000.00 8300 Total Revenue editing 1000.00 8400 Revenue courses Initial balance 0.00 0.00 Mutations total 6500.00 8400 Total Revenue courses 6500.00 Mutations total 10971.08 10971.08 --------------------------------------------------------------------------------------------------- Total 26825.85 26825.85 EekBoek-2.02.04/t/ivp_en/ref/proef.txt0000444000076500007650000000403712165465617015210 0ustar jvjv Trial balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Account Debet Credit Balance Db Balance Cr -------------------------------------------------------------------------------------------- 1100 Supplies 1344.37 0.00 1344.37 1101 Depreciation supplies 0.00 1716.07 1716.07 1110 Computers 13378.48 0.00 13378.48 1111 Depreciation computers 0.00 12503.60 12503.60 2200 Debtors 10163.00 10163.00 2320 Bank 10963.68 629.00 10334.68 3100 Capital 0.00 2443.18 2443.18 4100 Creditors 927.84 927.84 4200 VAT Revenue high 0.00 1463.00 1463.00 4220 VAT Procurement high 148.13 0.00 148.13 6800 Depreciation costs inventory 411.26 0.00 411.26 6810 Depreciation costs computers 396.82 0.00 396.82 6900 Phone costs and fax costs 510.29 0.00 510.29 6905 Internet costs 269.42 0.00 269.42 6980 Bank costs 32.40 0.00 32.40 8100 Revenue consultancy 0.00 1200.00 1200.00 8300 Revenue editing 0.00 1000.00 1000.00 8400 Revenue courses 0.00 6500.00 6500.00 -------------------------------------------------------------------------------------------- TOTAL 38545.69 38545.69 26825.85 26825.85 EekBoek-2.02.04/t/ivp_en/ref/debrept.txt0000444000076500007650000000371212165465617015521 0ustar jvjv Debtors administration Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Debtor Date Description Amount Open Paid Posting ------------------------------------------------------------------------------------------------------ ACME 2011-02-18 Perl Cursus 3570.00 0.00 Sales:1 2011-03-18 *Perl Cursus 3570.00 Postbank:3 2011-03-18 Perl Cursus 3570.00 0.00 Sales:2 2011-04-12 *Perl Cursus 3570.00 Postbank:4 2011-04-18 Perl Cursus 595.00 0.00 Sales:3 2011-05-31 *Perl Cursus 595.00 Postbank:5 2011-05-14 Ondersteuning 714.00 0.00 Sales:4 2011-06-08 *Ondersteuning 714.00 Postbank:6 2011-07-16 Ondersteuning 714.00 0.00 Sales:5 2011-08-10 *Ondersteuning 714.00 Postbank:8 --------- --------- ACME Total 9163.00 0.00 ORA 2011-08-19 Pocket Reference 1000.00 0.00 Sales:6 2011-08-19 *Pocket Reference 1000.00 Postbank:8 --------- --------- ORA Total 1000.00 0.00 ------------------------------------------------------------------------------------------------------ Total 10163.00 0.00 EekBoek-2.02.04/t/ivp_en/ref/result2.txt0000444000076500007650000000314112165465617015470 0ustar jvjv Profit/Loss Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit ---------------------------------------------------------------------- 6 Costs 68 Depreciation 6800 Depreciation costs inventory 411.26 6810 Depreciation costs computers 396.82 68 Total Depreciation 808.08 69 General costs 6900 Phone costs and fax costs 510.29 6905 Internet costs 269.42 6980 Bank costs 32.40 69 Total General costs 812.11 6 Total Costs 1620.19 8 Revenues 81 Revenue Consultancy 8100 Revenue consultancy 1200.00 81 Total Revenue Consultancy 1200.00 83 Revenue Editing 8300 Revenue editing 1000.00 83 Total Revenue Editing 1000.00 84 Revenue Courses 8400 Revenue courses 6500.00 84 Total Revenue Courses 6500.00 8 Total Revenues 8700.00 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Results 8700.00 8700.00 EekBoek-2.02.04/t/ivp_en/ref/grootboek_2320.txt0000444000076500007650000000374512165465617016543 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 2320 Bank Initial balance 1131.92 0.00 Afschrift 1 2011-01-31 0.00 130.15 Postbank:1 Afschrift 2 2011-02-28 0.00 25.50 Postbank:2 Afschrift 3 2011-03-31 3442.98 0.00 Postbank:3 Afschrift 4 2011-04-30 3544.50 0.00 Postbank:4 Afschrift 5 2011-05-31 467.28 0.00 Postbank:5 Afschrift 6 2011-06-30 688.50 0.00 Postbank:6 Afschrift 7 2011-07-31 0.00 130.16 Postbank:7 Afschrift 8 2011-08-31 1688.50 0.00 Postbank:8 Afschrift 9 2011-09-30 0.00 134.22 Postbank:9 Afschrift 10 2011-10-31 0.00 25.50 Postbank:10 Afschrift 11 2011-11-30 0.00 135.17 Postbank:11 Afschrift 12 2011-12-07 0.00 25.50 Postbank:12 Eerste deel ADSL 2011-12-09 0.00 10.00 Postbank:13 Tweede deel ADSL 2011-12-10 0.00 12.80 Postbank:14 Mutations total 9202.76 2320 Total Bank 10334.68 Mutations total 9202.76 0.00 --------------------------------------------------------------------------------------------------- Total 10334.68 0.00 EekBoek-2.02.04/t/ivp_en/ref/proef0.txt0000444000076500007650000000206112165465617015263 0ustar jvjv Trial balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit Balance Db Balance Cr -------------------------------------------------------------------------------------------- 1 Total Non-current Assets 14722.85 14219.67 503.18 2 Total Current Assets 21126.68 10792.00 10334.68 3 Total Assets 2443.18 2443.18 4 Total Liabilities 1075.97 2390.84 1314.87 6 Total Costs 1620.19 1620.19 8 Total Revenues 8700.00 8700.00 -------------------------------------------------------------------------------------------- TOTAL 38545.69 38545.69 12458.05 12458.05 EekBoek-2.02.04/t/ivp_en/ref/balans2.html0000444000076500007650000001062712165465617015546 0ustar jvjv Balance

Balance

Period: through 2011-12-31
EekBoek Sample Administration

AccNr Group/Account Debet Credit
1 Non-current Assets    
11 Material non-current assets    
1100 Supplies 1344.37  
1101 Depreciation supplies   1716.07
1110 Computers 13378.48  
1111 Depreciation computers   12503.60
11 Total Material non-current assets 503.18  
1 Total Non-current Assets 503.18  
2 Current Assets    
23 Liquid assets    
2320 Bank 10334.68  
23 Total Liquid assets 10334.68  
2 Total Current Assets 10334.68  
3 Assets    
31 Capital    
3100 Capital   2443.18
31 Total Capital   2443.18
3 Total Assets   2443.18
4 Liabilities    
42 Taxes and expenses    
4200 VAT Revenue high   1463.00
4220 VAT Procurement high 148.13  
42 Total Taxes and expenses   1314.87
4 Total Liabilities   1314.87
  << Profit >>   7079.81
  TOTAL Balance 10837.86 10837.86
EekBoek-2.02.04/t/ivp_en/ref/grootboek_23.txt0000444000076500007650000000374512165465617016401 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 2320 Bank Initial balance 1131.92 0.00 Afschrift 1 2011-01-31 0.00 130.15 Postbank:1 Afschrift 2 2011-02-28 0.00 25.50 Postbank:2 Afschrift 3 2011-03-31 3442.98 0.00 Postbank:3 Afschrift 4 2011-04-30 3544.50 0.00 Postbank:4 Afschrift 5 2011-05-31 467.28 0.00 Postbank:5 Afschrift 6 2011-06-30 688.50 0.00 Postbank:6 Afschrift 7 2011-07-31 0.00 130.16 Postbank:7 Afschrift 8 2011-08-31 1688.50 0.00 Postbank:8 Afschrift 9 2011-09-30 0.00 134.22 Postbank:9 Afschrift 10 2011-10-31 0.00 25.50 Postbank:10 Afschrift 11 2011-11-30 0.00 135.17 Postbank:11 Afschrift 12 2011-12-07 0.00 25.50 Postbank:12 Eerste deel ADSL 2011-12-09 0.00 10.00 Postbank:13 Tweede deel ADSL 2011-12-10 0.00 12.80 Postbank:14 Mutations total 9202.76 2320 Total Bank 10334.68 Mutations total 9202.76 0.00 --------------------------------------------------------------------------------------------------- Total 10334.68 0.00 EekBoek-2.02.04/t/ivp_en/ref/btw.html0000444000076500007650000000670112165465617015016 0ustar jvjv VAT submission

VAT submission

Period: 2011
EekBoek Sample Administration

Binnenland    
1. Door mij verrichte leveringen/diensten    
1a Belast met hoog tarief 7700 1463
1b Belast met laag tarief 0 0
1e Belast met 0% / verlegd 0  
Buitenland    
3. Door mij verrichte leveringen    
3a Buiten de EU 1000  
3b Binnen de EU 0  
4. Aan mij verrichte leveringen    
4a Van buiten de EU 0 0
4b Verwervingen van goederen uit de EU 0 0
Berekening    
5. Berekening totaal    
5a Subtotaal   1463
5b Voorbelasting   149
5c Subtotaal   1314
5d Vermindering kleineondernemersregeling   1314
5g Totaal te betalen   0
  Totaal te betalen (onafgerond) 1314.87  
  Afrondingsverschil 0.87  
EekBoek-2.02.04/t/ivp_en/ref/balans2xxx.html0000444000076500007650000001062412165465617016313 0ustar jvjv Balance

Balance

Period: through 2011-12-31
EekBoek Sample Administration

AccNr Group/Account Debet Credit
1 Non-current Assets    
11 Material non-current assets    
1100 Supplies 1344.37  
1101 Depreciation supplies   1716.07
1110 Computers 13378.48  
1111 Depreciation computers   12503.60
11 Total Material non-current assets 503.18  
1 Total Non-current Assets 503.18  
2 Current Assets    
23 Liquid assets    
2320 Bank 10334.68  
23 Total Liquid assets 10334.68  
2 Total Current Assets 10334.68  
3 Assets    
31 Capital    
3100 Capital   2443.18
31 Total Capital   2443.18
3 Total Assets   2443.18
4 Liabilities    
42 Taxes and expenses    
4200 VAT Revenue high   1463.00
4220 VAT Procurement high 148.13  
42 Total Taxes and expenses   1314.87
4 Total Liabilities   1314.87
  << Profit >>   7079.81
  TOTAL Balance 10837.86 10837.86
EekBoek-2.02.04/t/ivp_en/ref/balans.txt0000444000076500007650000000177112165465617015337 0ustar jvjv Balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Account Debet Credit ---------------------------------------------------------------------- 1100 Supplies 1344.37 1101 Depreciation supplies 1716.07 1110 Computers 13378.48 1111 Depreciation computers 12503.60 2320 Bank 10334.68 3100 Capital 2443.18 4200 VAT Revenue high 1463.00 4220 VAT Procurement high 148.13 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Balance 25205.66 25205.66 EekBoek-2.02.04/t/ivp_en/ref/balans2.txt0000444000076500007650000000331312165465617015413 0ustar jvjv Balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit ---------------------------------------------------------------------- 1 Non-current Assets 11 Material non-current assets 1100 Supplies 1344.37 1101 Depreciation supplies 1716.07 1110 Computers 13378.48 1111 Depreciation computers 12503.60 11 Total Material non-current assets 503.18 1 Total Non-current Assets 503.18 2 Current Assets 23 Liquid assets 2320 Bank 10334.68 23 Total Liquid assets 10334.68 2 Total Current Assets 10334.68 3 Assets 31 Capital 3100 Capital 2443.18 31 Total Capital 2443.18 3 Total Assets 2443.18 4 Liabilities 42 Taxes and expenses 4200 VAT Revenue high 1463.00 4220 VAT Procurement high 148.13 42 Total Taxes and expenses 1314.87 4 Total Liabilities 1314.87 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Balance 10837.86 10837.86 EekBoek-2.02.04/t/ivp_en/ref/result0.txt0000444000076500007650000000116112165465617015466 0ustar jvjv Profit/Loss Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit ---------------------------------------------------------------------- 6 Costs 1620.19 8 Revenues 8700.00 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Results 8700.00 8700.00 EekBoek-2.02.04/t/ivp_en/ref/grootboek.txt0000444000076500007650000003736012165465617016075 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 1100 Supplies Initial balance 1344.37 0.00 Mutations total 0.00 1100 Total Supplies 1344.37 1101 Depreciation supplies Initial balance 0.00 1304.81 Afschrijving 2011-12-31 0.00 411.26 Memorial:1 Mutations total 411.26 1101 Total Depreciation supplies 1716.07 1110 Computers Initial balance 13378.48 0.00 Mutations total 0.00 1110 Total Computers 13378.48 1111 Depreciation computers Initial balance 0.00 12106.78 Afschrijving 2011-12-31 0.00 396.82 Memorial:2 Mutations total 396.82 1111 Total Depreciation computers 12503.60 2200 Debtors Initial balance 0.00 0.00 Perl Cursus 2011-02-18 3570.00 0.00 Sales:1 Perl Cursus 2011-03-18 3570.00 0.00 Sales:2 *Perl Cursus 2011-03-18 0.00 3570.00 Postbank:3 ACME *Perl Cursus 2011-04-12 0.00 3570.00 Postbank:4 ACME Perl Cursus 2011-04-18 595.00 0.00 Sales:3 Ondersteuning 2011-05-14 714.00 0.00 Sales:4 *Perl Cursus 2011-05-31 0.00 595.00 Postbank:5 ACME *Ondersteuning 2011-06-08 0.00 714.00 Postbank:6 ACME Ondersteuning 2011-07-16 714.00 0.00 Sales:5 *Ondersteuning 2011-08-10 0.00 714.00 Postbank:8 ACME Pocket Reference 2011-08-19 1000.00 0.00 Sales:6 *Pocket Reference 2011-08-19 0.00 1000.00 Postbank:8 ORA Mutations total 0.00 2200 Total Debtors 0.00 2320 Bank Initial balance 1131.92 0.00 Afschrift 1 2011-01-31 0.00 130.15 Postbank:1 Afschrift 2 2011-02-28 0.00 25.50 Postbank:2 Afschrift 3 2011-03-31 3442.98 0.00 Postbank:3 Afschrift 4 2011-04-30 3544.50 0.00 Postbank:4 Afschrift 5 2011-05-31 467.28 0.00 Postbank:5 Afschrift 6 2011-06-30 688.50 0.00 Postbank:6 Afschrift 7 2011-07-31 0.00 130.16 Postbank:7 Afschrift 8 2011-08-31 1688.50 0.00 Postbank:8 Afschrift 9 2011-09-30 0.00 134.22 Postbank:9 Afschrift 10 2011-10-31 0.00 25.50 Postbank:10 Afschrift 11 2011-11-30 0.00 135.17 Postbank:11 Afschrift 12 2011-12-07 0.00 25.50 Postbank:12 Eerste deel ADSL 2011-12-09 0.00 10.00 Postbank:13 Tweede deel ADSL 2011-12-10 0.00 12.80 Postbank:14 Mutations total 9202.76 2320 Total Bank 10334.68 3100 Capital Initial balance 0.00 2443.18 Mutations total 0.00 3100 Total Capital 2443.18 4100 Creditors Initial balance 0.00 0.00 Internet 2011-01-05 0.00 22.80 Purchase:1 ADSL + Telefoon 2011-01-15 0.00 104.65 Purchase:2 *Internet 2011-01-19 22.80 0.00 Postbank:1 XS4ALL *ADSL + Telefoon 2011-01-31 104.65 0.00 Postbank:1 KPN Internet 2011-02-09 0.00 22.80 Purchase:3 *Internet 2011-02-23 22.80 0.00 Postbank:2 XS4ALL Internet 2011-03-08 0.00 22.80 Purchase:4 Telefoonkosten 2011-03-18 0.00 101.52 Purchase:5 *Internet 2011-03-31 22.80 0.00 Postbank:3 XS4ALL *Telefoonkosten 2011-03-31 101.52 0.00 Postbank:3 KPN Internet 2011-04-05 0.00 22.80 Purchase:6 *Internet 2011-04-06 22.80 0.00 Postbank:4 XS4ALL Internet 2011-05-10 0.00 22.80 Purchase:7 Telefoonkosten 2011-05-20 0.00 102.22 Purchase:8 *Internet 2011-05-31 22.80 0.00 Postbank:5 XS4ALL *Telefoonkosten 2011-05-31 102.22 0.00 Postbank:5 KPN Internet 2011-06-07 0.00 22.80 Purchase:9 *Internet 2011-06-21 22.80 0.00 Postbank:6 XS4ALL Internet 2011-07-05 0.00 22.80 Purchase:10 Telefoonkosten 2011-07-15 0.00 104.66 Purchase:11 *Internet 2011-07-30 22.80 0.00 Postbank:7 XS4ALL *Telefoonkosten 2011-07-31 104.66 0.00 Postbank:7 KPN Internet 2011-08-09 0.00 22.80 Purchase:12 *Internet 2011-08-10 22.80 0.00 Postbank:8 XS4ALL Internet 2011-09-06 0.00 22.80 Purchase:13 Telefoonkosten 2011-09-16 0.00 108.72 Purchase:14 *Internet 2011-09-30 22.80 0.00 Postbank:9 XS4ALL *Telefoonkosten 2011-09-30 108.72 0.00 Postbank:9 KPN Internet 2011-10-11 0.00 22.80 Purchase:15 *Internet 2011-10-13 22.80 0.00 Postbank:10 XS4ALL Internet 2011-11-07 0.00 22.80 Purchase:16 Telefoonkosten 2011-11-17 0.00 109.67 Purchase:17 *Internet 2011-11-30 22.80 0.00 Postbank:11 XS4ALL *Telefoonkosten 2011-11-30 109.67 0.00 Postbank:11 KPN Internet 2011-12-06 0.00 22.80 Purchase:18 Internet 2011-12-07 0.00 22.80 Purchase:20 *Internet 2011-12-07 22.80 0.00 Postbank:12 XS4ALL *Internet 2011-12-09 10.00 0.00 Postbank:13 XS4ALL *Internet 2011-12-10 12.80 0.00 Postbank:14 XS4ALL Mutations total 0.00 4100 Total Creditors 0.00 4200 VAT Revenue high Initial balance 0.00 0.00 BTW Perl Cursus 1e bet. 2011-02-18 0.00 570.00 Sales:1 BTW Perl Cursus 2e bet. 2011-03-18 0.00 570.00 Sales:2 BTW Perl Cursus rest 2011-04-18 0.00 95.00 Sales:3 BTW Consultancy 2011-05-14 0.00 114.00 Sales:4 BTW Consultancy 2011-07-16 0.00 114.00 Sales:5 Mutations total 1463.00 4200 Total VAT Revenue high 1463.00 4220 VAT Procurement high Initial balance 0.00 0.00 BTW ADSL 2011-01-05 3.64 0.00 Purchase:1 BTW ADSL 2011-01-15 3.86 0.00 Purchase:2 BTW Telefoonkosten 2011-01-15 12.84 0.00 Purchase:2 BTW ADSL 2011-02-09 3.64 0.00 Purchase:3 BTW ADSL 2011-03-08 3.64 0.00 Purchase:4 BTW ADSL + Telefoon 2011-03-18 16.21 0.00 Purchase:5 BTW ADSL 2011-04-05 3.64 0.00 Purchase:6 BTW ADSL 2011-05-10 3.64 0.00 Purchase:7 BTW ADSL + Telefoon 2011-05-20 16.32 0.00 Purchase:8 BTW ADSL 2011-06-07 3.64 0.00 Purchase:9 BTW ADSL 2011-07-05 3.64 0.00 Purchase:10 BTW ADSL + Telefoon 2011-07-15 16.71 0.00 Purchase:11 BTW ADSL 2011-08-09 3.64 0.00 Purchase:12 BTW ADSL 2011-09-06 3.64 0.00 Purchase:13 BTW ADSL + Telefoon 2011-09-16 17.36 0.00 Purchase:14 BTW ADSL 2011-10-11 3.64 0.00 Purchase:15 BTW ADSL 2011-11-07 3.64 0.00 Purchase:16 BTW ADSL + Telefoon 2011-11-17 17.51 0.00 Purchase:17 BTW ÁDSL 2011-12-06 3.64 0.00 Purchase:18 BTW ADSL 2011-12-07 3.64 0.00 Purchase:20 Mutations total 148.13 4220 Total VAT Procurement high 148.13 6800 Depreciation costs inventory Initial balance 0.00 0.00 Afschrijving 2011-12-31 411.26 0.00 Memorial:1 Mutations total 411.26 6800 Total Depreciation costs 411.26 inventory 6810 Depreciation costs computers Initial balance 0.00 0.00 Afschrijving 2011-12-31 396.82 0.00 Memorial:2 Mutations total 396.82 6810 Total Depreciation costs 396.82 computers 6900 Phone costs and fax costs Initial balance 0.00 0.00 Telefoonkosten 2011-01-15 67.61 0.00 Purchase:2 ADSL + Telefoon 2011-03-18 85.31 0.00 Purchase:5 ADSL + Telefoon 2011-05-20 85.90 0.00 Purchase:8 ADSL + Telefoon 2011-07-15 87.95 0.00 Purchase:11 ADSL + Telefoon 2011-09-16 91.36 0.00 Purchase:14 ADSL + Telefoon 2011-11-17 92.16 0.00 Purchase:17 Mutations total 510.29 6900 Total Phone costs and fax 510.29 costs 6905 Internet costs Initial balance 0.00 0.00 ADSL 2011-01-05 19.16 0.00 Purchase:1 ADSL 2011-01-15 20.34 0.00 Purchase:2 ADSL 2011-02-09 19.16 0.00 Purchase:3 ADSL 2011-03-08 19.16 0.00 Purchase:4 ADSL 2011-04-05 19.16 0.00 Purchase:6 ADSL 2011-05-10 19.16 0.00 Purchase:7 ADSL 2011-06-07 19.16 0.00 Purchase:9 ADSL 2011-07-05 19.16 0.00 Purchase:10 ADSL 2011-08-09 19.16 0.00 Purchase:12 ADSL 2011-09-06 19.16 0.00 Purchase:13 ADSL 2011-10-11 19.16 0.00 Purchase:15 ADSL 2011-11-07 19.16 0.00 Purchase:16 ÁDSL 2011-12-06 19.16 0.00 Purchase:18 ADSL 2011-12-07 19.16 0.00 Purchase:20 Mutations total 269.42 6905 Total Internet costs 269.42 6980 Bank costs Initial balance 0.00 0.00 Girotel 2011-01-06 2.70 0.00 Postbank:1 Girotel 2011-02-10 2.70 0.00 Postbank:2 Girotel 2011-03-09 2.70 0.00 Postbank:3 Girotel 2011-04-06 2.70 0.00 Postbank:4 Girotel 2011-05-11 2.70 0.00 Postbank:5 Girotel 2011-06-08 2.70 0.00 Postbank:6 Girotel 2011-07-06 2.70 0.00 Postbank:7 Girotel 2011-08-10 2.70 0.00 Postbank:8 Girotel 2011-09-17 2.70 0.00 Postbank:9 Girotel 2011-10-12 2.70 0.00 Postbank:10 Girotel 2011-11-08 2.70 0.00 Postbank:11 Girotel 2011-12-06 2.70 0.00 Postbank:12 Mutations total 32.40 6980 Total Bank costs 32.40 8100 Revenue consultancy Initial balance 0.00 0.00 Consultancy 2011-05-14 0.00 600.00 Sales:4 Consultancy 2011-07-16 0.00 600.00 Sales:5 Mutations total 1200.00 8100 Total Revenue consultancy 1200.00 8300 Revenue editing Initial balance 0.00 0.00 Produktie boek 2011-08-19 0.00 1000.00 Sales:6 Mutations total 1000.00 8300 Total Revenue editing 1000.00 8400 Revenue courses Initial balance 0.00 0.00 Perl Cursus 1e bet. 2011-02-18 0.00 3000.00 Sales:1 Perl Cursus 2e bet. 2011-03-18 0.00 3000.00 Sales:2 Perl Cursus rest 2011-04-18 0.00 500.00 Sales:3 Mutations total 6500.00 8400 Total Revenue courses 6500.00 Mutations total 10971.08 10971.08 --------------------------------------------------------------------------------------------------- Total 26825.85 26825.85 EekBoek-2.02.04/t/ivp_en/ref/balans0.txt0000444000076500007650000000136312165465617015414 0ustar jvjv Balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit ---------------------------------------------------------------------- 1 Non-current Assets 503.18 2 Current Assets 10334.68 3 Assets 2443.18 4 Liabilities 1314.87 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Balance 10837.86 10837.86 EekBoek-2.02.04/t/ivp_en/ref/btwk2.txt0000444000076500007650000000223212165465617015121 0ustar jvjv VAT submission Period: 2nd quarter 2011 EekBoek Sample Administration EekBoek, 2011-12-31 ----------------------------------------------------------------- Binnenland 1. Door mij verrichte leveringen/diensten 1a Belast met hoog tarief 1100 209 1b Belast met laag tarief 0 0 1e Belast met 0% / verlegd 0 Buitenland 3. Door mij verrichte leveringen 3a Buiten de EU 0 3b Binnen de EU 0 4. Aan mij verrichte leveringen 4a Van buiten de EU 0 0 4b Verwervingen van goederen uit de EU 0 0 Berekening 5. Berekening totaal 5a Subtotaal 209 5b Voorbelasting 28 5c Subtotaal 181 5g Totaal te betalen 181 Totaal te betalen (onafgerond) 181.76 Afrondingsverschil 0.76 EekBoek-2.02.04/t/ivp_en/ref/balans1.txt0000444000076500007650000000212212165465617015407 0ustar jvjv Balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit ---------------------------------------------------------------------- 1 Non-current Assets 11 Material non-current assets 503.18 1 Total Non-current Assets 503.18 2 Current Assets 23 Liquid assets 10334.68 2 Total Current Assets 10334.68 3 Assets 31 Capital 2443.18 3 Total Assets 2443.18 4 Liabilities 42 Taxes and expenses 1314.87 4 Total Liabilities 1314.87 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Balance 10837.86 10837.86 EekBoek-2.02.04/t/ivp_en/ref/proef2.txt0000444000076500007650000000755412165465617015301 0ustar jvjv Trial balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit Balance Db Balance Cr -------------------------------------------------------------------------------------------- 1 Non-current Assets 11 Material non-current assets 1100 Supplies 1344.37 0.00 1344.37 1101 Depreciation supplies 0.00 1716.07 1716.07 1110 Computers 13378.48 0.00 13378.48 1111 Depreciation computers 0.00 12503.60 12503.60 11 Total Material non-current assets 14722.85 14219.67 503.18 1 Total Non-current Assets 14722.85 14219.67 503.18 2 Current Assets 22 Receivables 2200 Debtors 10163.00 10163.00 22 Total Receivables 10163.00 10163.00 23 Liquid assets 2320 Bank 10963.68 629.00 10334.68 23 Total Liquid assets 10963.68 629.00 10334.68 2 Total Current Assets 21126.68 10792.00 10334.68 3 Assets 31 Capital 3100 Capital 0.00 2443.18 2443.18 31 Total Capital 2443.18 2443.18 3 Total Assets 2443.18 2443.18 4 Liabilities 41 Suppliers credits 4100 Creditors 927.84 927.84 41 Total Suppliers credits 927.84 927.84 42 Taxes and expenses 4200 VAT Revenue high 0.00 1463.00 1463.00 4220 VAT Procurement high 148.13 0.00 148.13 42 Total Taxes and expenses 148.13 1463.00 1314.87 4 Total Liabilities 1075.97 2390.84 1314.87 6 Costs 68 Depreciation 6800 Depreciation costs inventory 411.26 0.00 411.26 6810 Depreciation costs computers 396.82 0.00 396.82 68 Total Depreciation 808.08 808.08 69 General costs 6900 Phone costs and fax costs 510.29 0.00 510.29 6905 Internet costs 269.42 0.00 269.42 6980 Bank costs 32.40 0.00 32.40 69 Total General costs 812.11 812.11 6 Total Costs 1620.19 1620.19 8 Revenues 81 Revenue Consultancy 8100 Revenue consultancy 0.00 1200.00 1200.00 81 Total Revenue Consultancy 1200.00 1200.00 83 Revenue Editing 8300 Revenue editing 0.00 1000.00 1000.00 83 Total Revenue Editing 1000.00 1000.00 84 Revenue Courses 8400 Revenue courses 0.00 6500.00 6500.00 84 Total Revenue Courses 6500.00 6500.00 8 Total Revenues 8700.00 8700.00 -------------------------------------------------------------------------------------------- TOTAL 38545.69 38545.69 12458.05 12458.05 EekBoek-2.02.04/t/ivp_en/ref/btw7.txt0000444000076500007650000000222312165465617014753 0ustar jvjv VAT submission Period: Juli 2011 EekBoek Sample Administration EekBoek, 2011-12-31 ----------------------------------------------------------------- Binnenland 1. Door mij verrichte leveringen/diensten 1a Belast met hoog tarief 600 114 1b Belast met laag tarief 0 0 1e Belast met 0% / verlegd 0 Buitenland 3. Door mij verrichte leveringen 3a Buiten de EU 0 3b Binnen de EU 0 4. Aan mij verrichte leveringen 4a Van buiten de EU 0 0 4b Verwervingen van goederen uit de EU 0 0 Berekening 5. Berekening totaal 5a Subtotaal 114 5b Voorbelasting 21 5c Subtotaal 93 5g Totaal te betalen 93 Totaal te betalen (onafgerond) 93.65 Afrondingsverschil 0.65 EekBoek-2.02.04/t/ivp_en/ref/btw.txt0000444000076500007650000000232012165465617014662 0ustar jvjv VAT submission Period: 2011 EekBoek Sample Administration EekBoek, 2011-12-31 ----------------------------------------------------------------- Binnenland 1. Door mij verrichte leveringen/diensten 1a Belast met hoog tarief 7700 1463 1b Belast met laag tarief 0 0 1e Belast met 0% / verlegd 0 Buitenland 3. Door mij verrichte leveringen 3a Buiten de EU 1000 3b Binnen de EU 0 4. Aan mij verrichte leveringen 4a Van buiten de EU 0 0 4b Verwervingen van goederen uit de EU 0 0 Berekening 5. Berekening totaal 5a Subtotaal 1463 5b Voorbelasting 149 5c Subtotaal 1314 5d Vermindering kleineondernemersregeling 1314 5g Totaal te betalen 0 Totaal te betalen (onafgerond) 1314.87 Afrondingsverschil 0.87 EekBoek-2.02.04/t/ivp_en/ref/crdrept.txt0000444000076500007650000001076412165465617015544 0ustar jvjv Creditors administration Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Creditor Date Description Amount Open Paid Posting ------------------------------------------------------------------------------------------------------ KPN 2011-01-15 ADSL + Telefoon 104.65 0.00 Purchase:2 2011-01-31 *ADSL + Telefoon 104.65 Postbank:1 2011-03-18 Telefoonkosten 101.52 0.00 Purchase:5 2011-03-31 *Telefoonkosten 101.52 Postbank:3 2011-05-20 Telefoonkosten 102.22 0.00 Purchase:8 2011-05-31 *Telefoonkosten 102.22 Postbank:5 2011-07-15 Telefoonkosten 104.66 0.00 Purchase:11 2011-07-31 *Telefoonkosten 104.66 Postbank:7 2011-09-16 Telefoonkosten 108.72 0.00 Purchase:14 2011-09-30 *Telefoonkosten 108.72 Postbank:9 2011-11-17 Telefoonkosten 109.67 0.00 Purchase:17 2011-11-30 *Telefoonkosten 109.67 Postbank:11 --------- --------- KPN Total 631.44 0.00 XS4ALL 2011-01-05 Internet 22.80 0.00 Purchase:1 2011-01-19 *Internet 22.80 Postbank:1 2011-02-09 Internet 22.80 0.00 Purchase:3 2011-02-23 *Internet 22.80 Postbank:2 2011-03-08 Internet 22.80 0.00 Purchase:4 2011-03-31 *Internet 22.80 Postbank:3 2011-04-05 Internet 22.80 0.00 Purchase:6 2011-04-06 *Internet 22.80 Postbank:4 2011-05-10 Internet 22.80 0.00 Purchase:7 2011-05-31 *Internet 22.80 Postbank:5 2011-06-07 Internet 22.80 0.00 Purchase:9 2011-06-21 *Internet 22.80 Postbank:6 2011-07-05 Internet 22.80 0.00 Purchase:10 2011-07-30 *Internet 22.80 Postbank:7 2011-08-09 Internet 22.80 0.00 Purchase:12 2011-08-10 *Internet 22.80 Postbank:8 2011-09-06 Internet 22.80 0.00 Purchase:13 2011-09-30 *Internet 22.80 Postbank:9 2011-10-11 Internet 22.80 0.00 Purchase:15 2011-10-13 *Internet 22.80 Postbank:10 2011-11-07 Internet 22.80 0.00 Purchase:16 2011-11-30 *Internet 22.80 Postbank:11 2011-12-06 Internet 22.80 0.00 Purchase:18 2011-12-07 *Internet 22.80 Postbank:12 2011-12-07 Internet 22.80 0.00 Purchase:20 2011-12-09 *Internet 10.00 Postbank:13 2011-12-10 *Internet 12.80 Postbank:14 --------- --------- XS4ALL Total 296.40 0.00 ------------------------------------------------------------------------------------------------------ Total 927.84 0.00 EekBoek-2.02.04/t/ivp_en/ref/grootboek2.txt0000444000076500007650000003736012165465617016157 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 1100 Supplies Initial balance 1344.37 0.00 Mutations total 0.00 1100 Total Supplies 1344.37 1101 Depreciation supplies Initial balance 0.00 1304.81 Afschrijving 2011-12-31 0.00 411.26 Memorial:1 Mutations total 411.26 1101 Total Depreciation supplies 1716.07 1110 Computers Initial balance 13378.48 0.00 Mutations total 0.00 1110 Total Computers 13378.48 1111 Depreciation computers Initial balance 0.00 12106.78 Afschrijving 2011-12-31 0.00 396.82 Memorial:2 Mutations total 396.82 1111 Total Depreciation computers 12503.60 2200 Debtors Initial balance 0.00 0.00 Perl Cursus 2011-02-18 3570.00 0.00 Sales:1 Perl Cursus 2011-03-18 3570.00 0.00 Sales:2 *Perl Cursus 2011-03-18 0.00 3570.00 Postbank:3 ACME *Perl Cursus 2011-04-12 0.00 3570.00 Postbank:4 ACME Perl Cursus 2011-04-18 595.00 0.00 Sales:3 Ondersteuning 2011-05-14 714.00 0.00 Sales:4 *Perl Cursus 2011-05-31 0.00 595.00 Postbank:5 ACME *Ondersteuning 2011-06-08 0.00 714.00 Postbank:6 ACME Ondersteuning 2011-07-16 714.00 0.00 Sales:5 *Ondersteuning 2011-08-10 0.00 714.00 Postbank:8 ACME Pocket Reference 2011-08-19 1000.00 0.00 Sales:6 *Pocket Reference 2011-08-19 0.00 1000.00 Postbank:8 ORA Mutations total 0.00 2200 Total Debtors 0.00 2320 Bank Initial balance 1131.92 0.00 Afschrift 1 2011-01-31 0.00 130.15 Postbank:1 Afschrift 2 2011-02-28 0.00 25.50 Postbank:2 Afschrift 3 2011-03-31 3442.98 0.00 Postbank:3 Afschrift 4 2011-04-30 3544.50 0.00 Postbank:4 Afschrift 5 2011-05-31 467.28 0.00 Postbank:5 Afschrift 6 2011-06-30 688.50 0.00 Postbank:6 Afschrift 7 2011-07-31 0.00 130.16 Postbank:7 Afschrift 8 2011-08-31 1688.50 0.00 Postbank:8 Afschrift 9 2011-09-30 0.00 134.22 Postbank:9 Afschrift 10 2011-10-31 0.00 25.50 Postbank:10 Afschrift 11 2011-11-30 0.00 135.17 Postbank:11 Afschrift 12 2011-12-07 0.00 25.50 Postbank:12 Eerste deel ADSL 2011-12-09 0.00 10.00 Postbank:13 Tweede deel ADSL 2011-12-10 0.00 12.80 Postbank:14 Mutations total 9202.76 2320 Total Bank 10334.68 3100 Capital Initial balance 0.00 2443.18 Mutations total 0.00 3100 Total Capital 2443.18 4100 Creditors Initial balance 0.00 0.00 Internet 2011-01-05 0.00 22.80 Purchase:1 ADSL + Telefoon 2011-01-15 0.00 104.65 Purchase:2 *Internet 2011-01-19 22.80 0.00 Postbank:1 XS4ALL *ADSL + Telefoon 2011-01-31 104.65 0.00 Postbank:1 KPN Internet 2011-02-09 0.00 22.80 Purchase:3 *Internet 2011-02-23 22.80 0.00 Postbank:2 XS4ALL Internet 2011-03-08 0.00 22.80 Purchase:4 Telefoonkosten 2011-03-18 0.00 101.52 Purchase:5 *Internet 2011-03-31 22.80 0.00 Postbank:3 XS4ALL *Telefoonkosten 2011-03-31 101.52 0.00 Postbank:3 KPN Internet 2011-04-05 0.00 22.80 Purchase:6 *Internet 2011-04-06 22.80 0.00 Postbank:4 XS4ALL Internet 2011-05-10 0.00 22.80 Purchase:7 Telefoonkosten 2011-05-20 0.00 102.22 Purchase:8 *Internet 2011-05-31 22.80 0.00 Postbank:5 XS4ALL *Telefoonkosten 2011-05-31 102.22 0.00 Postbank:5 KPN Internet 2011-06-07 0.00 22.80 Purchase:9 *Internet 2011-06-21 22.80 0.00 Postbank:6 XS4ALL Internet 2011-07-05 0.00 22.80 Purchase:10 Telefoonkosten 2011-07-15 0.00 104.66 Purchase:11 *Internet 2011-07-30 22.80 0.00 Postbank:7 XS4ALL *Telefoonkosten 2011-07-31 104.66 0.00 Postbank:7 KPN Internet 2011-08-09 0.00 22.80 Purchase:12 *Internet 2011-08-10 22.80 0.00 Postbank:8 XS4ALL Internet 2011-09-06 0.00 22.80 Purchase:13 Telefoonkosten 2011-09-16 0.00 108.72 Purchase:14 *Internet 2011-09-30 22.80 0.00 Postbank:9 XS4ALL *Telefoonkosten 2011-09-30 108.72 0.00 Postbank:9 KPN Internet 2011-10-11 0.00 22.80 Purchase:15 *Internet 2011-10-13 22.80 0.00 Postbank:10 XS4ALL Internet 2011-11-07 0.00 22.80 Purchase:16 Telefoonkosten 2011-11-17 0.00 109.67 Purchase:17 *Internet 2011-11-30 22.80 0.00 Postbank:11 XS4ALL *Telefoonkosten 2011-11-30 109.67 0.00 Postbank:11 KPN Internet 2011-12-06 0.00 22.80 Purchase:18 Internet 2011-12-07 0.00 22.80 Purchase:20 *Internet 2011-12-07 22.80 0.00 Postbank:12 XS4ALL *Internet 2011-12-09 10.00 0.00 Postbank:13 XS4ALL *Internet 2011-12-10 12.80 0.00 Postbank:14 XS4ALL Mutations total 0.00 4100 Total Creditors 0.00 4200 VAT Revenue high Initial balance 0.00 0.00 BTW Perl Cursus 1e bet. 2011-02-18 0.00 570.00 Sales:1 BTW Perl Cursus 2e bet. 2011-03-18 0.00 570.00 Sales:2 BTW Perl Cursus rest 2011-04-18 0.00 95.00 Sales:3 BTW Consultancy 2011-05-14 0.00 114.00 Sales:4 BTW Consultancy 2011-07-16 0.00 114.00 Sales:5 Mutations total 1463.00 4200 Total VAT Revenue high 1463.00 4220 VAT Procurement high Initial balance 0.00 0.00 BTW ADSL 2011-01-05 3.64 0.00 Purchase:1 BTW ADSL 2011-01-15 3.86 0.00 Purchase:2 BTW Telefoonkosten 2011-01-15 12.84 0.00 Purchase:2 BTW ADSL 2011-02-09 3.64 0.00 Purchase:3 BTW ADSL 2011-03-08 3.64 0.00 Purchase:4 BTW ADSL + Telefoon 2011-03-18 16.21 0.00 Purchase:5 BTW ADSL 2011-04-05 3.64 0.00 Purchase:6 BTW ADSL 2011-05-10 3.64 0.00 Purchase:7 BTW ADSL + Telefoon 2011-05-20 16.32 0.00 Purchase:8 BTW ADSL 2011-06-07 3.64 0.00 Purchase:9 BTW ADSL 2011-07-05 3.64 0.00 Purchase:10 BTW ADSL + Telefoon 2011-07-15 16.71 0.00 Purchase:11 BTW ADSL 2011-08-09 3.64 0.00 Purchase:12 BTW ADSL 2011-09-06 3.64 0.00 Purchase:13 BTW ADSL + Telefoon 2011-09-16 17.36 0.00 Purchase:14 BTW ADSL 2011-10-11 3.64 0.00 Purchase:15 BTW ADSL 2011-11-07 3.64 0.00 Purchase:16 BTW ADSL + Telefoon 2011-11-17 17.51 0.00 Purchase:17 BTW ÁDSL 2011-12-06 3.64 0.00 Purchase:18 BTW ADSL 2011-12-07 3.64 0.00 Purchase:20 Mutations total 148.13 4220 Total VAT Procurement high 148.13 6800 Depreciation costs inventory Initial balance 0.00 0.00 Afschrijving 2011-12-31 411.26 0.00 Memorial:1 Mutations total 411.26 6800 Total Depreciation costs 411.26 inventory 6810 Depreciation costs computers Initial balance 0.00 0.00 Afschrijving 2011-12-31 396.82 0.00 Memorial:2 Mutations total 396.82 6810 Total Depreciation costs 396.82 computers 6900 Phone costs and fax costs Initial balance 0.00 0.00 Telefoonkosten 2011-01-15 67.61 0.00 Purchase:2 ADSL + Telefoon 2011-03-18 85.31 0.00 Purchase:5 ADSL + Telefoon 2011-05-20 85.90 0.00 Purchase:8 ADSL + Telefoon 2011-07-15 87.95 0.00 Purchase:11 ADSL + Telefoon 2011-09-16 91.36 0.00 Purchase:14 ADSL + Telefoon 2011-11-17 92.16 0.00 Purchase:17 Mutations total 510.29 6900 Total Phone costs and fax 510.29 costs 6905 Internet costs Initial balance 0.00 0.00 ADSL 2011-01-05 19.16 0.00 Purchase:1 ADSL 2011-01-15 20.34 0.00 Purchase:2 ADSL 2011-02-09 19.16 0.00 Purchase:3 ADSL 2011-03-08 19.16 0.00 Purchase:4 ADSL 2011-04-05 19.16 0.00 Purchase:6 ADSL 2011-05-10 19.16 0.00 Purchase:7 ADSL 2011-06-07 19.16 0.00 Purchase:9 ADSL 2011-07-05 19.16 0.00 Purchase:10 ADSL 2011-08-09 19.16 0.00 Purchase:12 ADSL 2011-09-06 19.16 0.00 Purchase:13 ADSL 2011-10-11 19.16 0.00 Purchase:15 ADSL 2011-11-07 19.16 0.00 Purchase:16 ÁDSL 2011-12-06 19.16 0.00 Purchase:18 ADSL 2011-12-07 19.16 0.00 Purchase:20 Mutations total 269.42 6905 Total Internet costs 269.42 6980 Bank costs Initial balance 0.00 0.00 Girotel 2011-01-06 2.70 0.00 Postbank:1 Girotel 2011-02-10 2.70 0.00 Postbank:2 Girotel 2011-03-09 2.70 0.00 Postbank:3 Girotel 2011-04-06 2.70 0.00 Postbank:4 Girotel 2011-05-11 2.70 0.00 Postbank:5 Girotel 2011-06-08 2.70 0.00 Postbank:6 Girotel 2011-07-06 2.70 0.00 Postbank:7 Girotel 2011-08-10 2.70 0.00 Postbank:8 Girotel 2011-09-17 2.70 0.00 Postbank:9 Girotel 2011-10-12 2.70 0.00 Postbank:10 Girotel 2011-11-08 2.70 0.00 Postbank:11 Girotel 2011-12-06 2.70 0.00 Postbank:12 Mutations total 32.40 6980 Total Bank costs 32.40 8100 Revenue consultancy Initial balance 0.00 0.00 Consultancy 2011-05-14 0.00 600.00 Sales:4 Consultancy 2011-07-16 0.00 600.00 Sales:5 Mutations total 1200.00 8100 Total Revenue consultancy 1200.00 8300 Revenue editing Initial balance 0.00 0.00 Produktie boek 2011-08-19 0.00 1000.00 Sales:6 Mutations total 1000.00 8300 Total Revenue editing 1000.00 8400 Revenue courses Initial balance 0.00 0.00 Perl Cursus 1e bet. 2011-02-18 0.00 3000.00 Sales:1 Perl Cursus 2e bet. 2011-03-18 0.00 3000.00 Sales:2 Perl Cursus rest 2011-04-18 0.00 500.00 Sales:3 Mutations total 6500.00 8400 Total Revenue courses 6500.00 Mutations total 10971.08 10971.08 --------------------------------------------------------------------------------------------------- Total 26825.85 26825.85 EekBoek-2.02.04/t/ivp_en/ref/balans2.csv0000444000076500007650000000143612165465617015373 0ustar jvjv"AccNr","Group/Account","Debet","Credit" 1,"Non-current Assets",, 11,"Material non-current assets",, 1100,"Supplies",1344.37, 1101,"Depreciation supplies",,1716.07 1110,"Computers",13378.48, 1111,"Depreciation computers",,12503.60 11,"Total Material non-current assets",503.18, 1,"Total Non-current Assets",503.18, 2,"Current Assets",, 23,"Liquid assets",, 2320,"Bank",10334.68, 23,"Total Liquid assets",10334.68, 2,"Total Current Assets",10334.68, 3,"Assets",, 31,"Capital",, 3100,"Capital",,2443.18 31,"Total Capital",,2443.18 3,"Total Assets",,2443.18 4,"Liabilities",, 42,"Taxes and expenses",, 4200,"VAT Revenue high",,1463.00 4220,"VAT Procurement high",148.13, 42,"Total Taxes and expenses",,1314.87 4,"Total Liabilities",,1314.87 ,"<< Profit >>",,7079.81 ,"TOTAL Balance",10837.86,10837.86 EekBoek-2.02.04/t/ivp_en/ref/balans.html0000444000076500007650000000404612165465617015462 0ustar jvjv Balans

Balans

Periode: t/m 2007-12-31
EekBoek Demo Administratie

RekNr Grootboekrekening Debet Credit
1100 Inventaris en inrichting 1344,37  
1101 Afschrijving inv. & inr.   1716,07
1110 Computers 13378,48  
1111 Afschrijving computers   12503,60
2320 Postbank 10334,68  
3100 Kapitaal de heer/mevrouw   2443,18
4200 BTW Verkoop Hoog   1463,00
4220 BTW Inkoop Hoog 148,13  
  << Winst >>   7079,81
  TOTAAL Balans 25205,66 25205,66
EekBoek-2.02.04/t/ivp_en/ref/proef1.txt0000444000076500007650000000412112165465617015263 0ustar jvjv Trial balance Period: through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit Balance Db Balance Cr -------------------------------------------------------------------------------------------- 1 Non-current Assets 11 Total Material non-current assets 14722.85 14219.67 503.18 1 Total Non-current Assets 14722.85 14219.67 503.18 2 Current Assets 22 Total Receivables 10163.00 10163.00 23 Total Liquid assets 10963.68 629.00 10334.68 2 Total Current Assets 21126.68 10792.00 10334.68 3 Assets 31 Total Capital 2443.18 2443.18 3 Total Assets 2443.18 2443.18 4 Liabilities 41 Total Suppliers credits 927.84 927.84 42 Total Taxes and expenses 148.13 1463.00 1314.87 4 Total Liabilities 1075.97 2390.84 1314.87 6 Costs 68 Total Depreciation 808.08 808.08 69 Total General costs 812.11 812.11 6 Total Costs 1620.19 1620.19 8 Revenues 81 Total Revenue Consultancy 1200.00 1200.00 83 Total Revenue Editing 1000.00 1000.00 84 Total Revenue Courses 6500.00 6500.00 8 Total Revenues 8700.00 8700.00 -------------------------------------------------------------------------------------------- TOTAL 38545.69 38545.69 12458.05 12458.05 EekBoek-2.02.04/t/ivp_en/ref/grootboek0.txt0000444000076500007650000000350012165465617016142 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 1100 Total Supplies 1344.37 1101 Total Depreciation supplies 1716.07 1110 Total Computers 13378.48 1111 Total Depreciation computers 12503.60 2200 Total Debtors 0.00 2320 Total Bank 10334.68 3100 Total Capital 2443.18 4100 Total Creditors 0.00 4200 Total VAT Revenue high 1463.00 4220 Total VAT Procurement high 148.13 6800 Total Depreciation costs 411.26 inventory 6810 Total Depreciation costs 396.82 computers 6900 Total Phone costs and fax 510.29 costs 6905 Total Internet costs 269.42 6980 Total Bank costs 32.40 8100 Total Revenue consultancy 1200.00 8300 Total Revenue editing 1000.00 8400 Total Revenue courses 6500.00 Mutations total 10971.08 10971.08 --------------------------------------------------------------------------------------------------- Total 26825.85 26825.85 EekBoek-2.02.04/t/ivp_en/ref/grootboek_2.txt0000444000076500007650000000632012165465617016306 0ustar jvjv Ledger Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Acc Ledger/Posting Date Debet Credit PostingNr Relation --------------------------------------------------------------------------------------------------- 2200 Debtors Initial balance 0.00 0.00 Perl Cursus 2011-02-18 3570.00 0.00 Sales:1 Perl Cursus 2011-03-18 3570.00 0.00 Sales:2 *Perl Cursus 2011-03-18 0.00 3570.00 Postbank:3 ACME *Perl Cursus 2011-04-12 0.00 3570.00 Postbank:4 ACME Perl Cursus 2011-04-18 595.00 0.00 Sales:3 Ondersteuning 2011-05-14 714.00 0.00 Sales:4 *Perl Cursus 2011-05-31 0.00 595.00 Postbank:5 ACME *Ondersteuning 2011-06-08 0.00 714.00 Postbank:6 ACME Ondersteuning 2011-07-16 714.00 0.00 Sales:5 *Ondersteuning 2011-08-10 0.00 714.00 Postbank:8 ACME Pocket Reference 2011-08-19 1000.00 0.00 Sales:6 *Pocket Reference 2011-08-19 0.00 1000.00 Postbank:8 ORA Mutations total 0.00 2200 Total Debtors 0.00 2320 Bank Initial balance 1131.92 0.00 Afschrift 1 2011-01-31 0.00 130.15 Postbank:1 Afschrift 2 2011-02-28 0.00 25.50 Postbank:2 Afschrift 3 2011-03-31 3442.98 0.00 Postbank:3 Afschrift 4 2011-04-30 3544.50 0.00 Postbank:4 Afschrift 5 2011-05-31 467.28 0.00 Postbank:5 Afschrift 6 2011-06-30 688.50 0.00 Postbank:6 Afschrift 7 2011-07-31 0.00 130.16 Postbank:7 Afschrift 8 2011-08-31 1688.50 0.00 Postbank:8 Afschrift 9 2011-09-30 0.00 134.22 Postbank:9 Afschrift 10 2011-10-31 0.00 25.50 Postbank:10 Afschrift 11 2011-11-30 0.00 135.17 Postbank:11 Afschrift 12 2011-12-07 0.00 25.50 Postbank:12 Eerste deel ADSL 2011-12-09 0.00 10.00 Postbank:13 Tweede deel ADSL 2011-12-10 0.00 12.80 Postbank:14 Mutations total 9202.76 2320 Total Bank 10334.68 Mutations total 9202.76 0.00 --------------------------------------------------------------------------------------------------- Total 10334.68 0.00 EekBoek-2.02.04/t/ivp_en/ref/obalans.txt0000444000076500007650000000145112165465617015511 0ustar jvjv Opening balance Date: 2011-01-01 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Account Debet Credit ---------------------------------------------------------------------- 1100 Supplies 1344.37 1101 Depreciation supplies 1304.81 1110 Computers 13378.48 1111 Depreciation computers 12106.78 2320 Bank 1131.92 3100 Capital 2443.18 ---------------------------------------------------------------------- TOTAL Balance 15854.77 15854.77 EekBoek-2.02.04/t/ivp_en/ref/result1.txt0000444000076500007650000000173712165465617015500 0ustar jvjv Profit/Loss Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 AccNr Group/Account Debet Credit ---------------------------------------------------------------------- 6 Costs 68 Depreciation 808.08 69 General costs 812.11 6 Total Costs 1620.19 8 Revenues 81 Revenue Consultancy 1200.00 83 Revenue Editing 1000.00 84 Revenue Courses 6500.00 8 Total Revenues 8700.00 << Profit >> 7079.81 ---------------------------------------------------------------------- TOTAL Results 8700.00 8700.00 EekBoek-2.02.04/t/ivp_en/ref/export.xaf0000444000076500007650000017030712165465617015361 0ustar jvjv
CLAIR2.00.00 x 1 Squirrel Here There 1234AA 2011 2011-01-01 2011-12-31 EUR 2011-12-31 EekBoek 2.02.04
geen 1100 Supplies B 1100 1101 Depreciation supplies B 1101 1110 Computers B 1110 1111 Depreciation computers B 1111 1120 Fleet B 1120 1121 Depreciation fleet B 1121 2100 Inventory B 2100 2200 Debtors B 2200 2300 Cash B 2300 2320 Bank B 2320 3100 Capital B 3100 3110 Private deposits B 3110 3120 Private deductions B 3120 4100 Creditors B 4100 4150 Payables B 4150 4200 VAT Revenue high B 4200 4210 VAT Revenue low B 4210 4212 VAT Revenue private B 4212 4220 VAT Procurement high B 4220 4230 VAT Procurement low B 4230 4232 VAT Procurement private B 4232 4240 VAT Vehicle cost reimbursement B 4240 4290 Sales tax paid B 4290 6100 Travel costs P 6100 6110 Sponsoring P 6110 6200 Insurance P 6200 6310 Chamber of commerce P 6310 6320 Union costs P 6320 6330 Branche organisation costs P 6330 6600 Lease costs vehicle P 6600 6610 Fuel vehicle P 6610 6620 Maintenance vehicle P 6620 6630 Insurance vehicle P 6630 6640 Travel reimbursement P 6640 6650 Rental vehicle P 6650 6660 Road tax P 6660 6670 Fines P 6670 6671 Fines 0% deductible P 6671 6680 VAT private use vehicle P 6680 6690 Other vehicle costs P 6690 6700 Contributions & subscriptions P 6700 6710 Contributions & subscriptions VAT 0% P 6710 6800 Depreciation costs inventory P 6800 6810 Depreciation costs computers P 6810 6820 Depreciation costs fleet P 6820 6900 Phone costs and fax costs P 6900 6905 Internet costs P 6905 6920 Stationery P 6920 6921 Computer accessories P 6921 6930 Literature P 6930 6940 Administration costs P 6940 6950 Printing and paper P 6950 6970 Stamps P 6970 6971 Shipping costs P 6971 6980 Bank costs P 6980 6981 Cash differences P 6981 6982 Rounding errors P 6982 6990 Other general costs P 6990 8100 Revenue consultancy P 8100 8110 Revenue consultancy VAT exempt P 8110 8200 Revenue royalties VAT exempt P 8200 8300 Revenue editing P 8300 8400 Revenue courses P 8400 8410 Revenue licenses courses P 8410 8500 Revenue projects P 8500 8900 Revenue other VAT high P 8900 8910 Revenue other VAT low P 8910 8920 Revenue other VAT exempt P 8920 9120 Interest received Postbank P 9120 9130 Interest received Postbank Inbedrijf P 9130 9190 Interest received overige P 9190 9220 Interest paid Postbank P 9220 9230 Interest paid Postbank Inbedrijf P 9230 9290 Interest paid other P 9290 9380 Taxation on private use vehicle P 9380 9390 Small office home office tax exemption P 9390 ACME Acme Corp.
onbekend
ONBEKEND 0000 XX Nederland
FOO Foo
onbekend
ONBEKEND 0000 XX Nederland
KPN KPN
onbekend
ONBEKEND 0000 XX Nederland
ORA O'Reilly & Associates
onbekend
ONBEKEND 0000 XX Nederland
XS4ALL XS4All Internet B.V.
onbekend
ONBEKEND 0000 XX Nederland
138 38545.69 38545.69 B Postbank 3 1 01 2011-01-31 1 6980 1 Girotel 2.70 2 4100 1 *Internet 22.80 3 4100 1 *ADSL + Telefoon 104.65 4 2320 1 Afschrift 1 130.15 2 02 2011-02-28 1 6980 2 Girotel 2.70 2 4100 2 *Internet 22.80 3 2320 2 Afschrift 2 25.50 3 03 2011-03-31 1 6980 3 Girotel 2.70 2 2200 3 *Perl Cursus 3570.00 3 4100 3 *Internet 22.80 4 4100 3 *Telefoonkosten 101.52 5 2320 3 Afschrift 3 3442.98 4 04 2011-04-30 1 6980 4 Girotel 2.70 2 4100 4 *Internet 22.80 3 2200 4 *Perl Cursus 3570.00 4 2320 4 Afschrift 4 3544.50 5 05 2011-05-31 1 6980 5 Girotel 2.70 2 4100 5 *Internet 22.80 3 2200 5 *Perl Cursus 595.00 4 4100 5 *Telefoonkosten 102.22 5 2320 5 Afschrift 5 467.28 6 06 2011-06-30 1 6980 6 Girotel 2.70 2 2200 6 *Ondersteuning 714.00 3 4100 6 *Internet 22.80 4 2320 6 Afschrift 6 688.50 7 07 2011-07-31 1 6980 7 Girotel 2.70 2 4100 7 *Internet 22.80 3 4100 7 *Telefoonkosten 104.66 4 2320 7 Afschrift 7 130.16 8 08 2011-08-31 1 6980 8 Girotel 2.70 2 2200 8 *Ondersteuning 714.00 3 4100 8 *Internet 22.80 4 2200 8 *Pocket Reference 1000.00 5 2320 8 Afschrift 8 1688.50 9 09 2011-09-30 1 6980 9 Girotel 2.70 2 4100 9 *Internet 22.80 3 4100 9 *Telefoonkosten 108.72 4 2320 9 Afschrift 9 134.22 10 10 2011-10-31 1 6980 10 Girotel 2.70 2 4100 10 *Internet 22.80 3 2320 10 Afschrift 10 25.50 11 11 2011-11-30 1 6980 11 Girotel 2.70 2 4100 11 *Internet 22.80 3 4100 11 *Telefoonkosten 109.67 4 2320 11 Afschrift 11 135.17 12 12 2011-12-07 1 6980 12 Girotel 2.70 2 4100 12 *Internet 22.80 3 2320 12 Afschrift 12 25.50 13 12 2011-12-09 1 4100 13 *Internet 10.00 2 2320 13 Eerste deel ADSL 10.00 14 12 2011-12-10 1 4100 14 *Internet 12.80 2 2320 14 Tweede deel ADSL 12.80 C Cash 4 M Memorial 5 0 0 2011-01-01 1 1100 0 opening 1344.37 2 1101 0 opening 1304.81 3 1110 0 opening 13378.48 4 1111 0 opening 12106.78 5 2320 0 opening 1131.92 6 3100 0 opening 2443.18 1 12 2011-12-31 1 6800 1 Afschrijving 411.26 2 1101 1 Afschrijving 411.26 2 12 2011-12-31 1 6810 2 Afschrijving 396.82 2 1111 2 Afschrijving 396.82 P Purchase 1 1 01 2011-01-05 1 6905 XS4ALL 1 ADSL 19.16 2 4220 XS4ALL 1 BTW ADSL 3.64 3 4100 XS4ALL 1 Internet 22.80 2 01 2011-01-15 1 6905 KPN 2 ADSL 20.34 2 4220 KPN 2 BTW ADSL 3.86 3 6900 KPN 2 Telefoonkosten 67.61 4 4220 KPN 2 BTW Telefoonkosten 12.84 5 4100 KPN 2 ADSL + Telefoon 104.65 3 02 2011-02-09 1 6905 XS4ALL 3 ADSL 19.16 2 4220 XS4ALL 3 BTW ADSL 3.64 3 4100 XS4ALL 3 Internet 22.80 4 03 2011-03-08 1 6905 XS4ALL 4 ADSL 19.16 2 4220 XS4ALL 4 BTW ADSL 3.64 3 4100 XS4ALL 4 Internet 22.80 5 03 2011-03-18 1 6900 KPN 5 ADSL + Telefoon 85.31 2 4220 KPN 5 BTW ADSL + Telefoon 16.21 3 4100 KPN 5 Telefoonkosten 101.52 6 04 2011-04-05 1 6905 XS4ALL 6 ADSL 19.16 2 4220 XS4ALL 6 BTW ADSL 3.64 3 4100 XS4ALL 6 Internet 22.80 7 05 2011-05-10 1 6905 XS4ALL 7 ADSL 19.16 2 4220 XS4ALL 7 BTW ADSL 3.64 3 4100 XS4ALL 7 Internet 22.80 8 05 2011-05-20 1 6900 KPN 8 ADSL + Telefoon 85.90 2 4220 KPN 8 BTW ADSL + Telefoon 16.32 3 4100 KPN 8 Telefoonkosten 102.22 9 06 2011-06-07 1 6905 XS4ALL 9 ADSL 19.16 2 4220 XS4ALL 9 BTW ADSL 3.64 3 4100 XS4ALL 9 Internet 22.80 10 07 2011-07-05 1 6905 XS4ALL 10 ADSL 19.16 2 4220 XS4ALL 10 BTW ADSL 3.64 3 4100 XS4ALL 10 Internet 22.80 11 07 2011-07-15 1 6900 KPN 11 ADSL + Telefoon 87.95 2 4220 KPN 11 BTW ADSL + Telefoon 16.71 3 4100 KPN 11 Telefoonkosten 104.66 12 08 2011-08-09 1 6905 XS4ALL 12 ADSL 19.16 2 4220 XS4ALL 12 BTW ADSL 3.64 3 4100 XS4ALL 12 Internet 22.80 13 09 2011-09-06 1 6905 XS4ALL 13 ADSL 19.16 2 4220 XS4ALL 13 BTW ADSL 3.64 3 4100 XS4ALL 13 Internet 22.80 14 09 2011-09-16 1 6900 KPN 14 ADSL + Telefoon 91.36 2 4220 KPN 14 BTW ADSL + Telefoon 17.36 3 4100 KPN 14 Telefoonkosten 108.72 15 10 2011-10-11 1 6905 XS4ALL 15 ADSL 19.16 2 4220 XS4ALL 15 BTW ADSL 3.64 3 4100 XS4ALL 15 Internet 22.80 16 11 2011-11-07 1 6905 XS4ALL 16 ADSL 19.16 2 4220 XS4ALL 16 BTW ADSL 3.64 3 4100 XS4ALL 16 Internet 22.80 17 11 2011-11-17 1 6900 KPN 17 ADSL + Telefoon 92.16 2 4220 KPN 17 BTW ADSL + Telefoon 17.51 3 4100 KPN 17 Telefoonkosten 109.67 18 12 2011-12-06 1 6905 XS4ALL 18 ÁDSL 19.16 2 4220 XS4ALL 18 BTW ÁDSL 3.64 3 4100 XS4ALL 18 Internet 22.80 20 12 2011-12-07 1 6905 XS4ALL 20 ADSL 19.16 2 4220 XS4ALL 20 BTW ADSL 3.64 3 4100 XS4ALL 20 Internet 22.80 S Sales 2 1 02 2011-02-18 1 8400 ACME 1 Perl Cursus 1e bet. 3000.00 2 4200 ACME 1 BTW Perl Cursus 1e bet. 570.00 3 2200 ACME 1 Perl Cursus 3570.00 2 03 2011-03-18 1 8400 ACME 2 Perl Cursus 2e bet. 3000.00 2 4200 ACME 2 BTW Perl Cursus 2e bet. 570.00 3 2200 ACME 2 Perl Cursus 3570.00 3 04 2011-04-18 1 8400 ACME 3 Perl Cursus rest 500.00 2 4200 ACME 3 BTW Perl Cursus rest 95.00 3 2200 ACME 3 Perl Cursus 595.00 4 05 2011-05-14 1 8100 ACME 4 Consultancy 600.00 2 4200 ACME 4 BTW Consultancy 114.00 3 2200 ACME 4 Ondersteuning 714.00 5 07 2011-07-16 1 8100 ACME 5 Consultancy 600.00 2 4200 ACME 5 BTW Consultancy 114.00 3 2200 ACME 5 Ondersteuning 714.00 6 08 2011-08-19 1 8300 ORA 6 Produktie boek 1000.00 2 2200 ORA 6 Pocket Reference 1000.00
EekBoek-2.02.04/t/ivp_en/ref/journaal-postbank24.txt0000444000076500007650000000134112165465617017670 0ustar jvjv Journal Period 2011-01-01 through 2011-12-31 EekBoek Sample Administration EekBoek, 2011-12-31 Date Booking/Account Acc Debet Credit BTW % Tarief Posting/line Relation ------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------ Total Posting Postbank:24 0.00 0.00 EekBoek-2.02.04/t/ivp/0000755000076500007650000000000012165465617012074 5ustar jvjvEekBoek-2.02.04/t/ivp/ivp.conf0000444000076500007650000000030112165465617013531 0ustar jvjv; Settings voor EekBoek Installatie-Verificatie Procedure. [locale] lang = nl_NL decimalpt = , [database] name = sample [internal] now = 2007-12-31 [csv] separator = , [html] cssdir = css EekBoek-2.02.04/t/ivp/reports.eb0000444000076500007650000000422012165465617014076 0ustar jvjv# Verify: balans in varianten. balans --output=out/balans.txt balans --detail=0 --output=out/balans0.txt balans --detail=1 --output=out/balans1.txt balans --detail=2 --output=out/balans2.txt balans --verdicht --output=out/balans2.txt balans --opening --output=out/obalans.txt # Verify: verlies/winst in varianten. result --output=out/result.txt result --detail=0 --output=out/result0.txt result --detail=1 --output=out/result1.txt result --verdicht --output=out/result2.txt result --periode=apr --output=out/result-apr.txt result --periode=mei --output=out/result-mei.txt # Verify: Journaal. journaal --output=out/journaal.txt # Verify: Journaal van dagboek. journaal postbank --output=out/journaal-postbank.txt # Verify: Journaal van boekstuk. journaal postbank:24 --output=out/journaal-postbank24.txt # Verify: Proef- en Saldibalans in varianten. proefensaldibalans --output=out/proef.txt proefensaldibalans --detail=0 --output=out/proef0.txt proefensaldibalans --detail=1 --output=out/proef1.txt proefensaldibalans --detail=2 --output=out/proef2.txt proefensaldibalans --verdicht --output=out/proef2.txt # Verify: Grootboek in varianten. grootboek --output=out/grootboek.txt grootboek --detail=0 --output=out/grootboek0.txt grootboek --detail=1 --output=out/grootboek1.txt grootboek --detail=2 --output=out/grootboek2.txt grootboek 2 --output=out/grootboek_2.txt grootboek 23 --output=out/grootboek_23.txt grootboek 23 22 --output=out/grootboek_23_22.txt grootboek 2320 --output=out/grootboek_2320.txt # Verify: Crediteuren/Debiteuren. crediteuren --output=out/crdrept.txt debiteuren --output=out/debrept.txt # Verify: BTW aangifte. btwaangifte j --output=out/btw.txt btwaangifte k2 --output=out/btwk2.txt btwaangifte 7 --output=out/btw7.txt # Verify: HTML generatie. balans --detail=2 --gen-html --output=out/balans2.html balans --detail=2 --gen-html --style=xxx --output=out/balans2xxx.html btwaangifte j --output=out/btw.html # Verify: CSV generatie. balans --detail=2 --gen-csv --output=out/balans2.csv # Verify: XAF generatie. export --xaf=out/export.xaf EekBoek-2.02.04/t/ivp/ref/0000755000076500007650000000000012165465617012650 5ustar jvjvEekBoek-2.02.04/t/ivp/ref/journaal-postbank.txt0000444000076500007650000002100612165465617017040 0ustar jvjv Journaal Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 Datum Boekstuk/Grootboek Rek Debet Credit BTW % Tarief Boekstuk/regel Relatie ------------------------------------------------------------------------------------------------------------------------------------------ 2007-01-31 Postbank:1 Afschrift 1 2007-01-31 Crediteuren 4100 104,65 *ADSL + Telefoon KPN 2007-01-19 Crediteuren 4100 22,80 *Internet XS4ALL 2007-01-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-01-31 Postbank 2320 130,15 Afschrift 1 2007-02-28 Postbank:2 Afschrift 2 2007-02-23 Crediteuren 4100 22,80 *Internet XS4ALL 2007-02-10 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-02-28 Postbank 2320 25,50 Afschrift 2 2007-03-31 Postbank:3 Afschrift 3 2007-03-31 Postbank 2320 3442,98 Afschrift 3 2007-03-31 Crediteuren 4100 101,52 *Telefoonkosten KPN 2007-03-31 Crediteuren 4100 22,80 *Internet XS4ALL 2007-03-09 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-03-18 Debiteuren 2200 3570,00 *Perl Cursus ACME 2007-04-30 Postbank:4 Afschrift 4 2007-04-30 Postbank 2320 3544,50 Afschrift 4 2007-04-06 Crediteuren 4100 22,80 *Internet XS4ALL 2007-04-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-04-12 Debiteuren 2200 3570,00 *Perl Cursus ACME 2007-05-31 Postbank:5 Afschrift 5 2007-05-31 Postbank 2320 472,28 Afschrift 5 2007-05-31 Crediteuren 4100 102,22 *Telefoonkosten KPN 2007-05-31 Crediteuren 4100 22,80 *Internet XS4ALL 2007-05-11 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-05-31 Debiteuren 2200 600,00 *Perl Cursus ACME 2007-06-30 Postbank:6 Afschrift 6 2007-06-12 Debiteuren 2200 5,00 *Perl Cursus ACME 2007-06-30 Postbank 2320 683,50 Afschrift 6 2007-06-21 Crediteuren 4100 22,80 *Internet XS4ALL 2007-06-08 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-06-08 Debiteuren 2200 714,00 *Ondersteuning ACME 2007-07-31 Postbank:7 Afschrift 7 2007-07-31 Crediteuren 4100 104,66 *Telefoonkosten KPN 2007-07-30 Crediteuren 4100 22,80 *Internet XS4ALL 2007-07-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-07-31 Postbank 2320 130,16 Afschrift 7 2007-08-31 Postbank:8 Afschrift 8 2007-08-31 Postbank 2320 1688,50 Afschrift 8 2007-08-10 Crediteuren 4100 22,80 *Internet XS4ALL 2007-08-10 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-08-10 Debiteuren 2200 714,00 *Ondersteuning ACME 2007-08-19 Debiteuren 2200 1000,00 *Pocket Reference ORA 2007-09-30 Postbank:9 Afschrift 9 2007-09-30 Crediteuren 4100 108,72 *Telefoonkosten KPN 2007-09-30 Crediteuren 4100 22,80 *Internet XS4ALL 2007-09-17 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-09-30 Postbank 2320 134,22 Afschrift 9 2007-10-31 Postbank:10 Afschrift 10 2007-10-13 Crediteuren 4100 22,80 *Internet XS4ALL 2007-10-12 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-10-31 Postbank 2320 25,50 Afschrift 10 2007-11-30 Postbank:11 Afschrift 11 2007-11-30 Crediteuren 4100 109,67 *Telefoonkosten KPN 2007-11-30 Crediteuren 4100 22,80 *Internet XS4ALL 2007-11-08 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-11-30 Postbank 2320 135,17 Afschrift 11 2007-12-07 Postbank:12 Afschrift 12 2007-12-07 Crediteuren 4100 22,80 *Internet XS4ALL 2007-12-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-12-07 Postbank 2320 25,50 Afschrift 12 2007-12-09 Postbank:13 Eerste deel ADSL 2007-12-09 Crediteuren 4100 10,00 *Internet XS4ALL 2007-12-09 Postbank 2320 10,00 Eerste deel ADSL 2007-12-10 Postbank:14 Tweede deel ADSL 2007-12-10 Crediteuren 4100 12,80 *Internet XS4ALL 2007-12-10 Postbank 2320 12,80 Tweede deel ADSL ------------------------------------------------------------------------------------------------------------------------------------------ Totaal Dagboek Postbank 10797,00 10797,00 EekBoek-2.02.04/t/ivp/ref/grootboek_23_22.txt0000444000076500007650000000662312165465617016220 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 2200 Debiteuren Beginsaldo 0,00 0,00 Perl Cursus 2007-02-18 3570,00 0,00 Verkoop:1 Perl Cursus 2007-03-18 3570,00 0,00 Verkoop:2 *Perl Cursus 2007-03-18 0,00 3570,00 Postbank:3 ACME *Perl Cursus 2007-04-12 0,00 3570,00 Postbank:4 ACME Perl Cursus 2007-04-18 600,00 0,00 Verkoop:3 Perl Cursus 2007-05-12 0,00 5,00 Verkoop:4 Ondersteuning 2007-05-14 714,00 0,00 Verkoop:5 *Perl Cursus 2007-05-31 0,00 600,00 Postbank:5 ACME *Ondersteuning 2007-06-08 0,00 714,00 Postbank:6 ACME *Perl Cursus 2007-06-12 5,00 0,00 Postbank:6 ACME Ondersteuning 2007-07-16 714,00 0,00 Verkoop:6 *Ondersteuning 2007-08-10 0,00 714,00 Postbank:8 ACME Pocket Reference 2007-08-19 1000,00 0,00 Verkoop:7 *Pocket Reference 2007-08-19 0,00 1000,00 Postbank:8 ORA Totaal mutaties 0,00 2200 Totaal Debiteuren 0,00 2320 Postbank Beginsaldo 1131,92 0,00 Afschrift 1 2007-01-31 0,00 130,15 Postbank:1 Afschrift 2 2007-02-28 0,00 25,50 Postbank:2 Afschrift 3 2007-03-31 3442,98 0,00 Postbank:3 Afschrift 4 2007-04-30 3544,50 0,00 Postbank:4 Afschrift 5 2007-05-31 472,28 0,00 Postbank:5 Afschrift 6 2007-06-30 683,50 0,00 Postbank:6 Afschrift 7 2007-07-31 0,00 130,16 Postbank:7 Afschrift 8 2007-08-31 1688,50 0,00 Postbank:8 Afschrift 9 2007-09-30 0,00 134,22 Postbank:9 Afschrift 10 2007-10-31 0,00 25,50 Postbank:10 Afschrift 11 2007-11-30 0,00 135,17 Postbank:11 Afschrift 12 2007-12-07 0,00 25,50 Postbank:12 Eerste deel ADSL 2007-12-09 0,00 10,00 Postbank:13 Tweede deel ADSL 2007-12-10 0,00 12,80 Postbank:14 Totaal mutaties 9202,76 2320 Totaal Postbank 10334,68 Totaal mutaties 9202,76 0,00 --------------------------------------------------------------------------------------------------- Totaal 10334,68 0,00 EekBoek-2.02.04/t/ivp/ref/result.txt0000444000076500007650000000175612165465617014736 0ustar jvjv Verlies/Winst Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Grootboekrekening Debet Credit ---------------------------------------------------------------------- 6800 Afschr. kosten inv. & inr. 411,26 6810 Afschr. kosten computers 396,82 6900 Telefoon- en faxkosten 510,29 6905 Internetkosten 269,42 6980 Bankkosten 32,40 8100 Omzet advisering 1200,00 8300 Omzet editing 1000,00 8400 Omzet cursussen 6500,00 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Resultaten 8700,00 8700,00 EekBoek-2.02.04/t/ivp/ref/journaal.txt0000444000076500007650000005212412165465617015226 0ustar jvjv Journaal Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 Datum Boekstuk/Grootboek Rek Debet Credit BTW % Tarief Boekstuk/regel Relatie ------------------------------------------------------------------------------------------------------------------------------------------ 2007-01-05 Inkoop:1 Internet XS4ALL 2007-01-05 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-01-05 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-01-05 Crediteuren 4100 22,80 Internet 2007-01-15 Inkoop:2 ADSL + Telefoon KPN 2007-01-15 BTW Inkoop Hoog 4220 12,84 BTW Telefoonkosten 2007-01-15 BTW Inkoop Hoog 4220 3,86 BTW ADSL 2007-01-15 Telefoon- en faxkosten 6900 67,61 19,00 Hoog Telefoonkosten 2007-01-15 Internetkosten 6905 20,34 19,00 Hoog ADSL 2007-01-15 Crediteuren 4100 104,65 ADSL + Telefoon 2007-01-31 Postbank:1 Afschrift 1 2007-01-31 Crediteuren 4100 104,65 *ADSL + Telefoon KPN 2007-01-19 Crediteuren 4100 22,80 *Internet XS4ALL 2007-01-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-01-31 Postbank 2320 130,15 Afschrift 1 2007-02-09 Inkoop:3 Internet XS4ALL 2007-02-09 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-02-09 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-02-09 Crediteuren 4100 22,80 Internet 2007-02-18 Verkoop:1 Perl Cursus ACME 2007-02-18 Debiteuren 2200 3570,00 Perl Cursus 2007-02-18 BTW Verkoop Hoog 4200 570,00 BTW Perl Cursus 1e bet. 2007-02-18 Omzet cursussen 8400 3000,00 19,00 Hoog Perl Cursus 1e bet. 2007-02-28 Postbank:2 Afschrift 2 2007-02-23 Crediteuren 4100 22,80 *Internet XS4ALL 2007-02-10 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-02-28 Postbank 2320 25,50 Afschrift 2 2007-03-08 Inkoop:4 Internet XS4ALL 2007-03-08 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-03-08 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-03-08 Crediteuren 4100 22,80 Internet 2007-03-18 Inkoop:5 Telefoonkosten KPN 2007-03-18 BTW Inkoop Hoog 4220 16,21 BTW ADSL + Telefoon 2007-03-18 Telefoon- en faxkosten 6900 85,31 19,00 Hoog ADSL + Telefoon 2007-03-18 Crediteuren 4100 101,52 Telefoonkosten 2007-03-18 Verkoop:2 Perl Cursus ACME 2007-03-18 Debiteuren 2200 3570,00 Perl Cursus 2007-03-18 BTW Verkoop Hoog 4200 570,00 BTW Perl Cursus 2e bet. 2007-03-18 Omzet cursussen 8400 3000,00 19,00 Hoog Perl Cursus 2e bet. 2007-03-31 Postbank:3 Afschrift 3 2007-03-31 Postbank 2320 3442,98 Afschrift 3 2007-03-31 Crediteuren 4100 101,52 *Telefoonkosten KPN 2007-03-31 Crediteuren 4100 22,80 *Internet XS4ALL 2007-03-09 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-03-18 Debiteuren 2200 3570,00 *Perl Cursus ACME 2007-04-05 Inkoop:6 Internet XS4ALL 2007-04-05 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-04-05 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-04-05 Crediteuren 4100 22,80 Internet 2007-04-18 Verkoop:3 Perl Cursus ACME 2007-04-18 Debiteuren 2200 600,00 Perl Cursus 2007-04-18 BTW Verkoop Hoog 4200 95,80 BTW Perl Cursus rest 2007-04-18 Omzet cursussen 8400 504,20 19,00 Hoog Perl Cursus rest 2007-04-30 Postbank:4 Afschrift 4 2007-04-30 Postbank 2320 3544,50 Afschrift 4 2007-04-06 Crediteuren 4100 22,80 *Internet XS4ALL 2007-04-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-04-12 Debiteuren 2200 3570,00 *Perl Cursus ACME 2007-05-10 Inkoop:7 Internet XS4ALL 2007-05-10 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-05-10 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-05-10 Crediteuren 4100 22,80 Internet 2007-05-12 Verkoop:4 Perl Cursus ACME 2007-05-12 BTW Verkoop Hoog 4200 0,80 BTW Perl Cursus rest 2007-05-12 Omzet cursussen 8400 4,20 19,00 Hoog Perl Cursus rest 2007-05-12 Debiteuren 2200 5,00 Perl Cursus 2007-05-14 Verkoop:5 Ondersteuning ACME 2007-05-14 Debiteuren 2200 714,00 Ondersteuning 2007-05-14 BTW Verkoop Hoog 4200 114,00 BTW Consultancy 2007-05-14 Omzet advisering 8100 600,00 19,00 Hoog Consultancy 2007-05-20 Inkoop:8 Telefoonkosten KPN 2007-05-20 BTW Inkoop Hoog 4220 16,32 BTW ADSL + Telefoon 2007-05-20 Telefoon- en faxkosten 6900 85,90 19,00 Hoog ADSL + Telefoon 2007-05-20 Crediteuren 4100 102,22 Telefoonkosten 2007-05-31 Postbank:5 Afschrift 5 2007-05-31 Postbank 2320 472,28 Afschrift 5 2007-05-31 Crediteuren 4100 102,22 *Telefoonkosten KPN 2007-05-31 Crediteuren 4100 22,80 *Internet XS4ALL 2007-05-11 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-05-31 Debiteuren 2200 600,00 *Perl Cursus ACME 2007-06-07 Inkoop:9 Internet XS4ALL 2007-06-07 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-06-07 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-06-07 Crediteuren 4100 22,80 Internet 2007-06-30 Postbank:6 Afschrift 6 2007-06-12 Debiteuren 2200 5,00 *Perl Cursus ACME 2007-06-30 Postbank 2320 683,50 Afschrift 6 2007-06-21 Crediteuren 4100 22,80 *Internet XS4ALL 2007-06-08 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-06-08 Debiteuren 2200 714,00 *Ondersteuning ACME 2007-07-05 Inkoop:10 Internet XS4ALL 2007-07-05 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-07-05 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-07-05 Crediteuren 4100 22,80 Internet 2007-07-15 Inkoop:11 Telefoonkosten KPN 2007-07-15 BTW Inkoop Hoog 4220 16,71 BTW ADSL + Telefoon 2007-07-15 Telefoon- en faxkosten 6900 87,95 19,00 Hoog ADSL + Telefoon 2007-07-15 Crediteuren 4100 104,66 Telefoonkosten 2007-07-16 Verkoop:6 Ondersteuning ACME 2007-07-16 Debiteuren 2200 714,00 Ondersteuning 2007-07-16 BTW Verkoop Hoog 4200 114,00 BTW Consultancy 2007-07-16 Omzet advisering 8100 600,00 19,00 Hoog Consultancy 2007-07-31 Postbank:7 Afschrift 7 2007-07-31 Crediteuren 4100 104,66 *Telefoonkosten KPN 2007-07-30 Crediteuren 4100 22,80 *Internet XS4ALL 2007-07-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-07-31 Postbank 2320 130,16 Afschrift 7 2007-08-09 Inkoop:12 Internet XS4ALL 2007-08-09 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-08-09 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-08-09 Crediteuren 4100 22,80 Internet 2007-08-19 Verkoop:7 Pocket Reference ORA 2007-08-19 Debiteuren 2200 1000,00 Pocket Reference 2007-08-19 Omzet editing 8300 1000,00 19,00 Hoog Produktie boek 2007-08-31 Postbank:8 Afschrift 8 2007-08-31 Postbank 2320 1688,50 Afschrift 8 2007-08-10 Crediteuren 4100 22,80 *Internet XS4ALL 2007-08-10 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-08-10 Debiteuren 2200 714,00 *Ondersteuning ACME 2007-08-19 Debiteuren 2200 1000,00 *Pocket Reference ORA 2007-09-06 Inkoop:13 Internet XS4ALL 2007-09-06 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-09-06 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-09-06 Crediteuren 4100 22,80 Internet 2007-09-16 Inkoop:14 Telefoonkosten KPN 2007-09-16 BTW Inkoop Hoog 4220 17,36 BTW ADSL + Telefoon 2007-09-16 Telefoon- en faxkosten 6900 91,36 19,00 Hoog ADSL + Telefoon 2007-09-16 Crediteuren 4100 108,72 Telefoonkosten 2007-09-30 Postbank:9 Afschrift 9 2007-09-30 Crediteuren 4100 108,72 *Telefoonkosten KPN 2007-09-30 Crediteuren 4100 22,80 *Internet XS4ALL 2007-09-17 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-09-30 Postbank 2320 134,22 Afschrift 9 2007-10-11 Inkoop:15 Internet XS4ALL 2007-10-11 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-10-11 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-10-11 Crediteuren 4100 22,80 Internet 2007-10-31 Postbank:10 Afschrift 10 2007-10-13 Crediteuren 4100 22,80 *Internet XS4ALL 2007-10-12 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-10-31 Postbank 2320 25,50 Afschrift 10 2007-11-07 Inkoop:16 Internet XS4ALL 2007-11-07 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-11-07 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-11-07 Crediteuren 4100 22,80 Internet 2007-11-17 Inkoop:17 Telefoonkosten KPN 2007-11-17 BTW Inkoop Hoog 4220 17,51 BTW ADSL + Telefoon 2007-11-17 Telefoon- en faxkosten 6900 92,16 19,00 Hoog ADSL + Telefoon 2007-11-17 Crediteuren 4100 109,67 Telefoonkosten 2007-11-30 Postbank:11 Afschrift 11 2007-11-30 Crediteuren 4100 109,67 *Telefoonkosten KPN 2007-11-30 Crediteuren 4100 22,80 *Internet XS4ALL 2007-11-08 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-11-30 Postbank 2320 135,17 Afschrift 11 2007-12-06 Inkoop:18 Internet XS4ALL 2007-12-06 BTW Inkoop Hoog 4220 3,64 BTW ÁDSL 2007-12-06 Internetkosten 6905 19,16 19,00 Hoog ÁDSL 2007-12-06 Crediteuren 4100 22,80 Internet 2007-12-07 Inkoop:20 Internet XS4ALL 2007-12-07 BTW Inkoop Hoog 4220 3,64 BTW ADSL 2007-12-07 Internetkosten 6905 19,16 19,00 Hoog ADSL 2007-12-07 Crediteuren 4100 22,80 Internet 2007-12-07 Postbank:12 Afschrift 12 2007-12-07 Crediteuren 4100 22,80 *Internet XS4ALL 2007-12-06 Bankkosten 6980 2,70 0,00 Nul Girotel 2007-12-07 Postbank 2320 25,50 Afschrift 12 2007-12-09 Postbank:13 Eerste deel ADSL 2007-12-09 Crediteuren 4100 10,00 *Internet XS4ALL 2007-12-09 Postbank 2320 10,00 Eerste deel ADSL 2007-12-10 Postbank:14 Tweede deel ADSL 2007-12-10 Crediteuren 4100 12,80 *Internet XS4ALL 2007-12-10 Postbank 2320 12,80 Tweede deel ADSL 2007-12-31 Memoriaal:1 Afschrijving inventaris 2007-12-31 Afschr. kosten inv. & inr. 6800 411,26 0,00 Nul Afschrijving 2007-12-31 Afschrijving inv. & inr. 1101 411,26 Afschrijving 2007-12-31 Memoriaal:2 Afschrijving computers 2007-12-31 Afschr. kosten computers 6810 396,82 0,00 Nul Afschrijving 2007-12-31 Afschrijving computers 1111 396,82 Afschrijving ------------------------------------------------------------------------------------------------------------------------------------------ Totaal 22705,92 22705,92 EekBoek-2.02.04/t/ivp/ref/grootboek1.txt0000444000076500007650000001131312165465617015462 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 1100 Inventaris en inrichting Beginsaldo 1344,37 0,00 Totaal mutaties 0,00 1100 Totaal Inventaris en 1344,37 inrichting 1101 Afschrijving inv. & inr. Beginsaldo 0,00 1304,81 Totaal mutaties 411,26 1101 Totaal Afschrijving inv. & 1716,07 inr. 1110 Computers Beginsaldo 13378,48 0,00 Totaal mutaties 0,00 1110 Totaal Computers 13378,48 1111 Afschrijving computers Beginsaldo 0,00 12106,78 Totaal mutaties 396,82 1111 Totaal Afschrijving computers 12503,60 2200 Debiteuren Beginsaldo 0,00 0,00 Totaal mutaties 0,00 2200 Totaal Debiteuren 0,00 2320 Postbank Beginsaldo 1131,92 0,00 Totaal mutaties 9202,76 2320 Totaal Postbank 10334,68 3100 Kapitaal de heer/mevrouw Beginsaldo 0,00 2443,18 Totaal mutaties 0,00 3100 Totaal Kapitaal de 2443,18 heer/mevrouw 4100 Crediteuren Beginsaldo 0,00 0,00 Totaal mutaties 0,00 4100 Totaal Crediteuren 0,00 4200 BTW Verkoop Hoog Beginsaldo 0,00 0,00 Totaal mutaties 1463,00 4200 Totaal BTW Verkoop Hoog 1463,00 4220 BTW Inkoop Hoog Beginsaldo 0,00 0,00 Totaal mutaties 148,13 4220 Totaal BTW Inkoop Hoog 148,13 6800 Afschr. kosten inv. & inr. Beginsaldo 0,00 0,00 Totaal mutaties 411,26 6800 Totaal Afschr. kosten inv. & 411,26 inr. 6810 Afschr. kosten computers Beginsaldo 0,00 0,00 Totaal mutaties 396,82 6810 Totaal Afschr. kosten 396,82 computers 6900 Telefoon- en faxkosten Beginsaldo 0,00 0,00 Totaal mutaties 510,29 6900 Totaal Telefoon- en faxkosten 510,29 6905 Internetkosten Beginsaldo 0,00 0,00 Totaal mutaties 269,42 6905 Totaal Internetkosten 269,42 6980 Bankkosten Beginsaldo 0,00 0,00 Totaal mutaties 32,40 6980 Totaal Bankkosten 32,40 8100 Omzet advisering Beginsaldo 0,00 0,00 Totaal mutaties 1200,00 8100 Totaal Omzet advisering 1200,00 8300 Omzet editing Beginsaldo 0,00 0,00 Totaal mutaties 1000,00 8300 Totaal Omzet editing 1000,00 8400 Omzet cursussen Beginsaldo 0,00 0,00 Totaal mutaties 6500,00 8400 Totaal Omzet cursussen 6500,00 Totaal mutaties 10971,08 10971,08 --------------------------------------------------------------------------------------------------- Totaal 26825,85 26825,85 EekBoek-2.02.04/t/ivp/ref/proef.txt0000444000076500007650000000403612165465617014525 0ustar jvjv Proef- en Saldibalans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Grootboekrekening Debet Credit Saldo Db Saldo Cr -------------------------------------------------------------------------------------------- 1100 Inventaris en inrichting 1344,37 0,00 1344,37 1101 Afschrijving inv. & inr. 0,00 1716,07 1716,07 1110 Computers 13378,48 0,00 13378,48 1111 Afschrijving computers 0,00 12503,60 12503,60 2200 Debiteuren 10173,00 10173,00 2320 Postbank 10963,68 629,00 10334,68 3100 Kapitaal de heer/mevrouw 0,00 2443,18 2443,18 4100 Crediteuren 927,84 927,84 4200 BTW Verkoop Hoog 0,80 1463,80 1463,00 4220 BTW Inkoop Hoog 148,13 0,00 148,13 6800 Afschr. kosten inv. & inr. 411,26 0,00 411,26 6810 Afschr. kosten computers 396,82 0,00 396,82 6900 Telefoon- en faxkosten 510,29 0,00 510,29 6905 Internetkosten 269,42 0,00 269,42 6980 Bankkosten 32,40 0,00 32,40 8100 Omzet advisering 0,00 1200,00 1200,00 8300 Omzet editing 0,00 1000,00 1000,00 8400 Omzet cursussen 4,20 6504,20 6500,00 -------------------------------------------------------------------------------------------- TOTAAL 38560,69 38560,69 26825,85 26825,85 EekBoek-2.02.04/t/ivp/ref/debrept.txt0000444000076500007650000000422212165465617015034 0ustar jvjv Debiteurenadministratie Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 Debiteur Datum Omschrijving Bedrag Open Betaald Boekstuk ------------------------------------------------------------------------------------------------------ ACME 2007-02-18 Perl Cursus 3570,00 0,00 Verkoop:1 2007-03-18 *Perl Cursus 3570,00 Postbank:3 2007-03-18 Perl Cursus 3570,00 0,00 Verkoop:2 2007-04-12 *Perl Cursus 3570,00 Postbank:4 2007-04-18 Perl Cursus 600,00 0,00 Verkoop:3 2007-05-31 *Perl Cursus 600,00 Postbank:5 2007-05-12 Perl Cursus -5,00 0,00 Verkoop:4 2007-06-12 *Perl Cursus -5,00 Postbank:6 2007-05-14 Ondersteuning 714,00 0,00 Verkoop:5 2007-06-08 *Ondersteuning 714,00 Postbank:6 2007-07-16 Ondersteuning 714,00 0,00 Verkoop:6 2007-08-10 *Ondersteuning 714,00 Postbank:8 --------- --------- ACME Totaal 9163,00 0,00 ORA 2007-08-19 Pocket Reference 1000,00 0,00 Verkoop:7 2007-08-19 *Pocket Reference 1000,00 Postbank:8 --------- --------- ORA Totaal 1000,00 0,00 ------------------------------------------------------------------------------------------------------ Totaal 10163,00 0,00 EekBoek-2.02.04/t/ivp/ref/result2.txt0000444000076500007650000000315412165465617015012 0ustar jvjv Verlies/Winst Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 6 Kosten 68 Afschrijvingen 6800 Afschr. kosten inv. & inr. 411,26 6810 Afschr. kosten computers 396,82 68 Totaal Afschrijvingen 808,08 69 Algemene kosten 6900 Telefoon- en faxkosten 510,29 6905 Internetkosten 269,42 6980 Bankkosten 32,40 69 Totaal Algemene kosten 812,11 6 Totaal Kosten 1620,19 8 Bedrijfsopbrengsten 81 Omzet Consultancy 8100 Omzet advisering 1200,00 81 Totaal Omzet Consultancy 1200,00 83 Omzet Editing 8300 Omzet editing 1000,00 83 Totaal Omzet Editing 1000,00 84 Omzet Cursussen 8400 Omzet cursussen 6500,00 84 Totaal Omzet Cursussen 6500,00 8 Totaal Bedrijfsopbrengsten 8700,00 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Resultaten 8700,00 8700,00 EekBoek-2.02.04/t/ivp/ref/grootboek_2320.txt0000444000076500007650000000375012165465617016055 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 2320 Postbank Beginsaldo 1131,92 0,00 Afschrift 1 2007-01-31 0,00 130,15 Postbank:1 Afschrift 2 2007-02-28 0,00 25,50 Postbank:2 Afschrift 3 2007-03-31 3442,98 0,00 Postbank:3 Afschrift 4 2007-04-30 3544,50 0,00 Postbank:4 Afschrift 5 2007-05-31 472,28 0,00 Postbank:5 Afschrift 6 2007-06-30 683,50 0,00 Postbank:6 Afschrift 7 2007-07-31 0,00 130,16 Postbank:7 Afschrift 8 2007-08-31 1688,50 0,00 Postbank:8 Afschrift 9 2007-09-30 0,00 134,22 Postbank:9 Afschrift 10 2007-10-31 0,00 25,50 Postbank:10 Afschrift 11 2007-11-30 0,00 135,17 Postbank:11 Afschrift 12 2007-12-07 0,00 25,50 Postbank:12 Eerste deel ADSL 2007-12-09 0,00 10,00 Postbank:13 Tweede deel ADSL 2007-12-10 0,00 12,80 Postbank:14 Totaal mutaties 9202,76 2320 Totaal Postbank 10334,68 Totaal mutaties 9202,76 0,00 --------------------------------------------------------------------------------------------------- Totaal 10334,68 0,00 EekBoek-2.02.04/t/ivp/ref/proef0.txt0000444000076500007650000000206012165465617014600 0ustar jvjv Proef- en Saldibalans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit Saldo Db Saldo Cr -------------------------------------------------------------------------------------------- 1 Totaal Vaste Activa 14722,85 14219,67 503,18 2 Totaal Vlottende activa 21136,68 10802,00 10334,68 3 Totaal Eigen vermogen 2443,18 2443,18 4 Totaal Vreemd vermogen 1076,77 2391,64 1314,87 6 Totaal Kosten 1620,19 1620,19 8 Totaal Bedrijfsopbrengsten 4,20 8704,20 8700,00 -------------------------------------------------------------------------------------------- TOTAAL 38560,69 38560,69 12458,05 12458,05 EekBoek-2.02.04/t/ivp/ref/balans2.html0000444000076500007650000001100412165465617015052 0ustar jvjv Balans

Balans

Periode: t/m 2007-12-31
EekBoek Demo Administratie

RekNr Verdichting/Grootboekrekening Debet Credit
1 Vaste Activa    
11 Materiële vaste activa    
1100 Inventaris en inrichting 1344,37  
1101 Afschrijving inv. & inr.   1716,07
1110 Computers 13378,48  
1111 Afschrijving computers   12503,60
11 Totaal Materiële vaste activa 503,18  
1 Totaal Vaste Activa 503,18  
2 Vlottende activa    
23 Liquide middelen    
2320 Postbank 10334,68  
23 Totaal Liquide middelen 10334,68  
2 Totaal Vlottende activa 10334,68  
3 Eigen vermogen    
31 Kapitaal    
3100 Kapitaal de heer/mevrouw   2443,18
31 Totaal Kapitaal   2443,18
3 Totaal Eigen vermogen   2443,18
4 Vreemd vermogen    
42 Belastingen & soc. lasten    
4200 BTW Verkoop Hoog   1463,00
4220 BTW Inkoop Hoog 148,13  
42 Totaal Belastingen & soc. lasten   1314,87
4 Totaal Vreemd vermogen   1314,87
  << Winst >>   7079,81
  TOTAAL Balans 10837,86 10837,86
EekBoek-2.02.04/t/ivp/ref/grootboek_23.txt0000444000076500007650000000375012165465617015713 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 2320 Postbank Beginsaldo 1131,92 0,00 Afschrift 1 2007-01-31 0,00 130,15 Postbank:1 Afschrift 2 2007-02-28 0,00 25,50 Postbank:2 Afschrift 3 2007-03-31 3442,98 0,00 Postbank:3 Afschrift 4 2007-04-30 3544,50 0,00 Postbank:4 Afschrift 5 2007-05-31 472,28 0,00 Postbank:5 Afschrift 6 2007-06-30 683,50 0,00 Postbank:6 Afschrift 7 2007-07-31 0,00 130,16 Postbank:7 Afschrift 8 2007-08-31 1688,50 0,00 Postbank:8 Afschrift 9 2007-09-30 0,00 134,22 Postbank:9 Afschrift 10 2007-10-31 0,00 25,50 Postbank:10 Afschrift 11 2007-11-30 0,00 135,17 Postbank:11 Afschrift 12 2007-12-07 0,00 25,50 Postbank:12 Eerste deel ADSL 2007-12-09 0,00 10,00 Postbank:13 Tweede deel ADSL 2007-12-10 0,00 12,80 Postbank:14 Totaal mutaties 9202,76 2320 Totaal Postbank 10334,68 Totaal mutaties 9202,76 0,00 --------------------------------------------------------------------------------------------------- Totaal 10334,68 0,00 EekBoek-2.02.04/t/ivp/ref/btw.html0000444000076500007650000000670412165465617014337 0ustar jvjv BTW Aangifte

BTW Aangifte

Periode: 2007
EekBoek Demo Administratie

Binnenland    
1. Door mij verrichte leveringen/diensten    
1a Belast met hoog tarief 7700 1463
1b Belast met laag tarief 0 0
1e Belast met 0% / verlegd 0  
Buitenland    
3. Door mij verrichte leveringen    
3a Buiten de EU 1000  
3b Binnen de EU 0  
4. Aan mij verrichte leveringen    
4a Van buiten de EU 0 0
4b Verwervingen van goederen uit de EU 0 0
Berekening    
5. Berekening totaal    
5a Subtotaal   1463
5b Voorbelasting   149
5c Subtotaal   1314
5d Vermindering kleineondernemersregeling   1314
5g Totaal te betalen   0
  Totaal te betalen (onafgerond) 1314,87  
  Afrondingsverschil 0,87  
EekBoek-2.02.04/t/ivp/ref/balans2xxx.html0000444000076500007650000001100112165465617015617 0ustar jvjv Balans

Balans

Periode: t/m 2007-12-31
EekBoek Demo Administratie

RekNr Verdichting/Grootboekrekening Debet Credit
1 Vaste Activa    
11 Materiële vaste activa    
1100 Inventaris en inrichting 1344,37  
1101 Afschrijving inv. & inr.   1716,07
1110 Computers 13378,48  
1111 Afschrijving computers   12503,60
11 Totaal Materiële vaste activa 503,18  
1 Totaal Vaste Activa 503,18  
2 Vlottende activa    
23 Liquide middelen    
2320 Postbank 10334,68  
23 Totaal Liquide middelen 10334,68  
2 Totaal Vlottende activa 10334,68  
3 Eigen vermogen    
31 Kapitaal    
3100 Kapitaal de heer/mevrouw   2443,18
31 Totaal Kapitaal   2443,18
3 Totaal Eigen vermogen   2443,18
4 Vreemd vermogen    
42 Belastingen & soc. lasten    
4200 BTW Verkoop Hoog   1463,00
4220 BTW Inkoop Hoog 148,13  
42 Totaal Belastingen & soc. lasten   1314,87
4 Totaal Vreemd vermogen   1314,87
  << Winst >>   7079,81
  TOTAAL Balans 10837,86 10837,86
EekBoek-2.02.04/t/ivp/ref/balans.txt0000444000076500007650000000176612165465617014661 0ustar jvjv Balans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Grootboekrekening Debet Credit ---------------------------------------------------------------------- 1100 Inventaris en inrichting 1344,37 1101 Afschrijving inv. & inr. 1716,07 1110 Computers 13378,48 1111 Afschrijving computers 12503,60 2320 Postbank 10334,68 3100 Kapitaal de heer/mevrouw 2443,18 4200 BTW Verkoop Hoog 1463,00 4220 BTW Inkoop Hoog 148,13 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Balans 25205,66 25205,66 EekBoek-2.02.04/t/ivp/ref/balans2.txt0000444000076500007650000000333012165465617014730 0ustar jvjv Balans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 1 Vaste Activa 11 Materiële vaste activa 1100 Inventaris en inrichting 1344,37 1101 Afschrijving inv. & inr. 1716,07 1110 Computers 13378,48 1111 Afschrijving computers 12503,60 11 Totaal Materiële vaste activa 503,18 1 Totaal Vaste Activa 503,18 2 Vlottende activa 23 Liquide middelen 2320 Postbank 10334,68 23 Totaal Liquide middelen 10334,68 2 Totaal Vlottende activa 10334,68 3 Eigen vermogen 31 Kapitaal 3100 Kapitaal de heer/mevrouw 2443,18 31 Totaal Kapitaal 2443,18 3 Totaal Eigen vermogen 2443,18 4 Vreemd vermogen 42 Belastingen & soc. lasten 4200 BTW Verkoop Hoog 1463,00 4220 BTW Inkoop Hoog 148,13 42 Totaal Belastingen & soc. lasten 1314,87 4 Totaal Vreemd vermogen 1314,87 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Balans 10837,86 10837,86 EekBoek-2.02.04/t/ivp/ref/result0.txt0000444000076500007650000000116012165465617015003 0ustar jvjv Verlies/Winst Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 6 Kosten 1620,19 8 Bedrijfsopbrengsten 8700,00 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Resultaten 8700,00 8700,00 EekBoek-2.02.04/t/ivp/ref/grootboek.txt0000444000076500007650000004006012165465617015402 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 1100 Inventaris en inrichting Beginsaldo 1344,37 0,00 Totaal mutaties 0,00 1100 Totaal Inventaris en 1344,37 inrichting 1101 Afschrijving inv. & inr. Beginsaldo 0,00 1304,81 Afschrijving 2007-12-31 0,00 411,26 Memoriaal:1 Totaal mutaties 411,26 1101 Totaal Afschrijving inv. & 1716,07 inr. 1110 Computers Beginsaldo 13378,48 0,00 Totaal mutaties 0,00 1110 Totaal Computers 13378,48 1111 Afschrijving computers Beginsaldo 0,00 12106,78 Afschrijving 2007-12-31 0,00 396,82 Memoriaal:2 Totaal mutaties 396,82 1111 Totaal Afschrijving computers 12503,60 2200 Debiteuren Beginsaldo 0,00 0,00 Perl Cursus 2007-02-18 3570,00 0,00 Verkoop:1 Perl Cursus 2007-03-18 3570,00 0,00 Verkoop:2 *Perl Cursus 2007-03-18 0,00 3570,00 Postbank:3 ACME *Perl Cursus 2007-04-12 0,00 3570,00 Postbank:4 ACME Perl Cursus 2007-04-18 600,00 0,00 Verkoop:3 Perl Cursus 2007-05-12 0,00 5,00 Verkoop:4 Ondersteuning 2007-05-14 714,00 0,00 Verkoop:5 *Perl Cursus 2007-05-31 0,00 600,00 Postbank:5 ACME *Ondersteuning 2007-06-08 0,00 714,00 Postbank:6 ACME *Perl Cursus 2007-06-12 5,00 0,00 Postbank:6 ACME Ondersteuning 2007-07-16 714,00 0,00 Verkoop:6 *Ondersteuning 2007-08-10 0,00 714,00 Postbank:8 ACME Pocket Reference 2007-08-19 1000,00 0,00 Verkoop:7 *Pocket Reference 2007-08-19 0,00 1000,00 Postbank:8 ORA Totaal mutaties 0,00 2200 Totaal Debiteuren 0,00 2320 Postbank Beginsaldo 1131,92 0,00 Afschrift 1 2007-01-31 0,00 130,15 Postbank:1 Afschrift 2 2007-02-28 0,00 25,50 Postbank:2 Afschrift 3 2007-03-31 3442,98 0,00 Postbank:3 Afschrift 4 2007-04-30 3544,50 0,00 Postbank:4 Afschrift 5 2007-05-31 472,28 0,00 Postbank:5 Afschrift 6 2007-06-30 683,50 0,00 Postbank:6 Afschrift 7 2007-07-31 0,00 130,16 Postbank:7 Afschrift 8 2007-08-31 1688,50 0,00 Postbank:8 Afschrift 9 2007-09-30 0,00 134,22 Postbank:9 Afschrift 10 2007-10-31 0,00 25,50 Postbank:10 Afschrift 11 2007-11-30 0,00 135,17 Postbank:11 Afschrift 12 2007-12-07 0,00 25,50 Postbank:12 Eerste deel ADSL 2007-12-09 0,00 10,00 Postbank:13 Tweede deel ADSL 2007-12-10 0,00 12,80 Postbank:14 Totaal mutaties 9202,76 2320 Totaal Postbank 10334,68 3100 Kapitaal de heer/mevrouw Beginsaldo 0,00 2443,18 Totaal mutaties 0,00 3100 Totaal Kapitaal de 2443,18 heer/mevrouw 4100 Crediteuren Beginsaldo 0,00 0,00 Internet 2007-01-05 0,00 22,80 Inkoop:1 ADSL + Telefoon 2007-01-15 0,00 104,65 Inkoop:2 *Internet 2007-01-19 22,80 0,00 Postbank:1 XS4ALL *ADSL + Telefoon 2007-01-31 104,65 0,00 Postbank:1 KPN Internet 2007-02-09 0,00 22,80 Inkoop:3 *Internet 2007-02-23 22,80 0,00 Postbank:2 XS4ALL Internet 2007-03-08 0,00 22,80 Inkoop:4 Telefoonkosten 2007-03-18 0,00 101,52 Inkoop:5 *Internet 2007-03-31 22,80 0,00 Postbank:3 XS4ALL *Telefoonkosten 2007-03-31 101,52 0,00 Postbank:3 KPN Internet 2007-04-05 0,00 22,80 Inkoop:6 *Internet 2007-04-06 22,80 0,00 Postbank:4 XS4ALL Internet 2007-05-10 0,00 22,80 Inkoop:7 Telefoonkosten 2007-05-20 0,00 102,22 Inkoop:8 *Internet 2007-05-31 22,80 0,00 Postbank:5 XS4ALL *Telefoonkosten 2007-05-31 102,22 0,00 Postbank:5 KPN Internet 2007-06-07 0,00 22,80 Inkoop:9 *Internet 2007-06-21 22,80 0,00 Postbank:6 XS4ALL Internet 2007-07-05 0,00 22,80 Inkoop:10 Telefoonkosten 2007-07-15 0,00 104,66 Inkoop:11 *Internet 2007-07-30 22,80 0,00 Postbank:7 XS4ALL *Telefoonkosten 2007-07-31 104,66 0,00 Postbank:7 KPN Internet 2007-08-09 0,00 22,80 Inkoop:12 *Internet 2007-08-10 22,80 0,00 Postbank:8 XS4ALL Internet 2007-09-06 0,00 22,80 Inkoop:13 Telefoonkosten 2007-09-16 0,00 108,72 Inkoop:14 *Internet 2007-09-30 22,80 0,00 Postbank:9 XS4ALL *Telefoonkosten 2007-09-30 108,72 0,00 Postbank:9 KPN Internet 2007-10-11 0,00 22,80 Inkoop:15 *Internet 2007-10-13 22,80 0,00 Postbank:10 XS4ALL Internet 2007-11-07 0,00 22,80 Inkoop:16 Telefoonkosten 2007-11-17 0,00 109,67 Inkoop:17 *Internet 2007-11-30 22,80 0,00 Postbank:11 XS4ALL *Telefoonkosten 2007-11-30 109,67 0,00 Postbank:11 KPN Internet 2007-12-06 0,00 22,80 Inkoop:18 Internet 2007-12-07 0,00 22,80 Inkoop:20 *Internet 2007-12-07 22,80 0,00 Postbank:12 XS4ALL *Internet 2007-12-09 10,00 0,00 Postbank:13 XS4ALL *Internet 2007-12-10 12,80 0,00 Postbank:14 XS4ALL Totaal mutaties 0,00 4100 Totaal Crediteuren 0,00 4200 BTW Verkoop Hoog Beginsaldo 0,00 0,00 BTW Perl Cursus 1e bet. 2007-02-18 0,00 570,00 Verkoop:1 BTW Perl Cursus 2e bet. 2007-03-18 0,00 570,00 Verkoop:2 BTW Perl Cursus rest 2007-04-18 0,00 95,80 Verkoop:3 BTW Perl Cursus rest 2007-05-12 0,80 0,00 Verkoop:4 BTW Consultancy 2007-05-14 0,00 114,00 Verkoop:5 BTW Consultancy 2007-07-16 0,00 114,00 Verkoop:6 Totaal mutaties 1463,00 4200 Totaal BTW Verkoop Hoog 1463,00 4220 BTW Inkoop Hoog Beginsaldo 0,00 0,00 BTW ADSL 2007-01-05 3,64 0,00 Inkoop:1 BTW ADSL 2007-01-15 3,86 0,00 Inkoop:2 BTW Telefoonkosten 2007-01-15 12,84 0,00 Inkoop:2 BTW ADSL 2007-02-09 3,64 0,00 Inkoop:3 BTW ADSL 2007-03-08 3,64 0,00 Inkoop:4 BTW ADSL + Telefoon 2007-03-18 16,21 0,00 Inkoop:5 BTW ADSL 2007-04-05 3,64 0,00 Inkoop:6 BTW ADSL 2007-05-10 3,64 0,00 Inkoop:7 BTW ADSL + Telefoon 2007-05-20 16,32 0,00 Inkoop:8 BTW ADSL 2007-06-07 3,64 0,00 Inkoop:9 BTW ADSL 2007-07-05 3,64 0,00 Inkoop:10 BTW ADSL + Telefoon 2007-07-15 16,71 0,00 Inkoop:11 BTW ADSL 2007-08-09 3,64 0,00 Inkoop:12 BTW ADSL 2007-09-06 3,64 0,00 Inkoop:13 BTW ADSL + Telefoon 2007-09-16 17,36 0,00 Inkoop:14 BTW ADSL 2007-10-11 3,64 0,00 Inkoop:15 BTW ADSL 2007-11-07 3,64 0,00 Inkoop:16 BTW ADSL + Telefoon 2007-11-17 17,51 0,00 Inkoop:17 BTW ÁDSL 2007-12-06 3,64 0,00 Inkoop:18 BTW ADSL 2007-12-07 3,64 0,00 Inkoop:20 Totaal mutaties 148,13 4220 Totaal BTW Inkoop Hoog 148,13 6800 Afschr. kosten inv. & inr. Beginsaldo 0,00 0,00 Afschrijving 2007-12-31 411,26 0,00 Memoriaal:1 Totaal mutaties 411,26 6800 Totaal Afschr. kosten inv. & 411,26 inr. 6810 Afschr. kosten computers Beginsaldo 0,00 0,00 Afschrijving 2007-12-31 396,82 0,00 Memoriaal:2 Totaal mutaties 396,82 6810 Totaal Afschr. kosten 396,82 computers 6900 Telefoon- en faxkosten Beginsaldo 0,00 0,00 Telefoonkosten 2007-01-15 67,61 0,00 Inkoop:2 ADSL + Telefoon 2007-03-18 85,31 0,00 Inkoop:5 ADSL + Telefoon 2007-05-20 85,90 0,00 Inkoop:8 ADSL + Telefoon 2007-07-15 87,95 0,00 Inkoop:11 ADSL + Telefoon 2007-09-16 91,36 0,00 Inkoop:14 ADSL + Telefoon 2007-11-17 92,16 0,00 Inkoop:17 Totaal mutaties 510,29 6900 Totaal Telefoon- en faxkosten 510,29 6905 Internetkosten Beginsaldo 0,00 0,00 ADSL 2007-01-05 19,16 0,00 Inkoop:1 ADSL 2007-01-15 20,34 0,00 Inkoop:2 ADSL 2007-02-09 19,16 0,00 Inkoop:3 ADSL 2007-03-08 19,16 0,00 Inkoop:4 ADSL 2007-04-05 19,16 0,00 Inkoop:6 ADSL 2007-05-10 19,16 0,00 Inkoop:7 ADSL 2007-06-07 19,16 0,00 Inkoop:9 ADSL 2007-07-05 19,16 0,00 Inkoop:10 ADSL 2007-08-09 19,16 0,00 Inkoop:12 ADSL 2007-09-06 19,16 0,00 Inkoop:13 ADSL 2007-10-11 19,16 0,00 Inkoop:15 ADSL 2007-11-07 19,16 0,00 Inkoop:16 ÁDSL 2007-12-06 19,16 0,00 Inkoop:18 ADSL 2007-12-07 19,16 0,00 Inkoop:20 Totaal mutaties 269,42 6905 Totaal Internetkosten 269,42 6980 Bankkosten Beginsaldo 0,00 0,00 Girotel 2007-01-06 2,70 0,00 Postbank:1 Girotel 2007-02-10 2,70 0,00 Postbank:2 Girotel 2007-03-09 2,70 0,00 Postbank:3 Girotel 2007-04-06 2,70 0,00 Postbank:4 Girotel 2007-05-11 2,70 0,00 Postbank:5 Girotel 2007-06-08 2,70 0,00 Postbank:6 Girotel 2007-07-06 2,70 0,00 Postbank:7 Girotel 2007-08-10 2,70 0,00 Postbank:8 Girotel 2007-09-17 2,70 0,00 Postbank:9 Girotel 2007-10-12 2,70 0,00 Postbank:10 Girotel 2007-11-08 2,70 0,00 Postbank:11 Girotel 2007-12-06 2,70 0,00 Postbank:12 Totaal mutaties 32,40 6980 Totaal Bankkosten 32,40 8100 Omzet advisering Beginsaldo 0,00 0,00 Consultancy 2007-05-14 0,00 600,00 Verkoop:5 Consultancy 2007-07-16 0,00 600,00 Verkoop:6 Totaal mutaties 1200,00 8100 Totaal Omzet advisering 1200,00 8300 Omzet editing Beginsaldo 0,00 0,00 Produktie boek 2007-08-19 0,00 1000,00 Verkoop:7 Totaal mutaties 1000,00 8300 Totaal Omzet editing 1000,00 8400 Omzet cursussen Beginsaldo 0,00 0,00 Perl Cursus 1e bet. 2007-02-18 0,00 3000,00 Verkoop:1 Perl Cursus 2e bet. 2007-03-18 0,00 3000,00 Verkoop:2 Perl Cursus rest 2007-04-18 0,00 504,20 Verkoop:3 Perl Cursus rest 2007-05-12 4,20 0,00 Verkoop:4 Totaal mutaties 6500,00 8400 Totaal Omzet cursussen 6500,00 Totaal mutaties 10971,08 10971,08 --------------------------------------------------------------------------------------------------- Totaal 26825,85 26825,85 EekBoek-2.02.04/t/ivp/ref/balans0.txt0000444000076500007650000000136012165465617014727 0ustar jvjv Balans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 1 Vaste Activa 503,18 2 Vlottende activa 10334,68 3 Eigen vermogen 2443,18 4 Vreemd vermogen 1314,87 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Balans 10837,86 10837,86 EekBoek-2.02.04/t/ivp/ref/btwk2.txt0000444000076500007650000000223212165465617014437 0ustar jvjv BTW Aangifte Periode: 2e kwartaal 2007 EekBoek Demo Administratie EekBoek, 2007-12-31 ----------------------------------------------------------------- Binnenland 1. Door mij verrichte leveringen/diensten 1a Belast met hoog tarief 1100 209 1b Belast met laag tarief 0 0 1e Belast met 0% / verlegd 0 Buitenland 3. Door mij verrichte leveringen 3a Buiten de EU 0 3b Binnen de EU 0 4. Aan mij verrichte leveringen 4a Van buiten de EU 0 0 4b Verwervingen van goederen uit de EU 0 0 Berekening 5. Berekening totaal 5a Subtotaal 209 5b Voorbelasting 28 5c Subtotaal 181 5g Totaal te betalen 181 Totaal te betalen (onafgerond) 181,76 Afrondingsverschil 0,76 EekBoek-2.02.04/t/ivp/ref/balans1.txt0000444000076500007650000000213012165465617014724 0ustar jvjv Balans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 1 Vaste Activa 11 Materiële vaste activa 503,18 1 Totaal Vaste Activa 503,18 2 Vlottende activa 23 Liquide middelen 10334,68 2 Totaal Vlottende activa 10334,68 3 Eigen vermogen 31 Kapitaal 2443,18 3 Totaal Eigen vermogen 2443,18 4 Vreemd vermogen 42 Belastingen & soc. lasten 1314,87 4 Totaal Vreemd vermogen 1314,87 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Balans 10837,86 10837,86 EekBoek-2.02.04/t/ivp/ref/proef2.txt0000444000076500007650000000761412165465617014614 0ustar jvjv Proef- en Saldibalans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit Saldo Db Saldo Cr -------------------------------------------------------------------------------------------- 1 Vaste Activa 11 Materiële vaste activa 1100 Inventaris en inrichting 1344,37 0,00 1344,37 1101 Afschrijving inv. & inr. 0,00 1716,07 1716,07 1110 Computers 13378,48 0,00 13378,48 1111 Afschrijving computers 0,00 12503,60 12503,60 11 Totaal Materiële vaste activa 14722,85 14219,67 503,18 1 Totaal Vaste Activa 14722,85 14219,67 503,18 2 Vlottende activa 22 Vorderingen 2200 Debiteuren 10173,00 10173,00 22 Totaal Vorderingen 10173,00 10173,00 23 Liquide middelen 2320 Postbank 10963,68 629,00 10334,68 23 Totaal Liquide middelen 10963,68 629,00 10334,68 2 Totaal Vlottende activa 21136,68 10802,00 10334,68 3 Eigen vermogen 31 Kapitaal 3100 Kapitaal de heer/mevrouw 0,00 2443,18 2443,18 31 Totaal Kapitaal 2443,18 2443,18 3 Totaal Eigen vermogen 2443,18 2443,18 4 Vreemd vermogen 41 Leveranciers kredieten 4100 Crediteuren 927,84 927,84 41 Totaal Leveranciers kredieten 927,84 927,84 42 Belastingen & soc. lasten 4200 BTW Verkoop Hoog 0,80 1463,80 1463,00 4220 BTW Inkoop Hoog 148,13 0,00 148,13 42 Totaal Belastingen & soc. lasten 148,93 1463,80 1314,87 4 Totaal Vreemd vermogen 1076,77 2391,64 1314,87 6 Kosten 68 Afschrijvingen 6800 Afschr. kosten inv. & inr. 411,26 0,00 411,26 6810 Afschr. kosten computers 396,82 0,00 396,82 68 Totaal Afschrijvingen 808,08 808,08 69 Algemene kosten 6900 Telefoon- en faxkosten 510,29 0,00 510,29 6905 Internetkosten 269,42 0,00 269,42 6980 Bankkosten 32,40 0,00 32,40 69 Totaal Algemene kosten 812,11 812,11 6 Totaal Kosten 1620,19 1620,19 8 Bedrijfsopbrengsten 81 Omzet Consultancy 8100 Omzet advisering 0,00 1200,00 1200,00 81 Totaal Omzet Consultancy 1200,00 1200,00 83 Omzet Editing 8300 Omzet editing 0,00 1000,00 1000,00 83 Totaal Omzet Editing 1000,00 1000,00 84 Omzet Cursussen 8400 Omzet cursussen 4,20 6504,20 6500,00 84 Totaal Omzet Cursussen 4,20 6504,20 6500,00 8 Totaal Bedrijfsopbrengsten 4,20 8704,20 8700,00 -------------------------------------------------------------------------------------------- TOTAAL 38560,69 38560,69 12458,05 12458,05 EekBoek-2.02.04/t/ivp/ref/btw7.txt0000444000076500007650000000222312165465617014271 0ustar jvjv BTW Aangifte Periode: Juli 2007 EekBoek Demo Administratie EekBoek, 2007-12-31 ----------------------------------------------------------------- Binnenland 1. Door mij verrichte leveringen/diensten 1a Belast met hoog tarief 600 114 1b Belast met laag tarief 0 0 1e Belast met 0% / verlegd 0 Buitenland 3. Door mij verrichte leveringen 3a Buiten de EU 0 3b Binnen de EU 0 4. Aan mij verrichte leveringen 4a Van buiten de EU 0 0 4b Verwervingen van goederen uit de EU 0 0 Berekening 5. Berekening totaal 5a Subtotaal 114 5b Voorbelasting 21 5c Subtotaal 93 5g Totaal te betalen 93 Totaal te betalen (onafgerond) 93,65 Afrondingsverschil 0,65 EekBoek-2.02.04/t/ivp/ref/btw.txt0000444000076500007650000000232012165465617014200 0ustar jvjv BTW Aangifte Periode: 2007 EekBoek Demo Administratie EekBoek, 2007-12-31 ----------------------------------------------------------------- Binnenland 1. Door mij verrichte leveringen/diensten 1a Belast met hoog tarief 7700 1463 1b Belast met laag tarief 0 0 1e Belast met 0% / verlegd 0 Buitenland 3. Door mij verrichte leveringen 3a Buiten de EU 1000 3b Binnen de EU 0 4. Aan mij verrichte leveringen 4a Van buiten de EU 0 0 4b Verwervingen van goederen uit de EU 0 0 Berekening 5. Berekening totaal 5a Subtotaal 1463 5b Voorbelasting 149 5c Subtotaal 1314 5d Vermindering kleineondernemersregeling 1314 5g Totaal te betalen 0 Totaal te betalen (onafgerond) 1314,87 Afrondingsverschil 0,87 EekBoek-2.02.04/t/ivp/ref/crdrept.txt0000444000076500007650000001071512165465617015056 0ustar jvjv Crediteurenadministratie Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 Crediteur Datum Omschrijving Bedrag Open Betaald Boekstuk ------------------------------------------------------------------------------------------------------ KPN 2007-01-15 ADSL + Telefoon 104,65 0,00 Inkoop:2 2007-01-31 *ADSL + Telefoon 104,65 Postbank:1 2007-03-18 Telefoonkosten 101,52 0,00 Inkoop:5 2007-03-31 *Telefoonkosten 101,52 Postbank:3 2007-05-20 Telefoonkosten 102,22 0,00 Inkoop:8 2007-05-31 *Telefoonkosten 102,22 Postbank:5 2007-07-15 Telefoonkosten 104,66 0,00 Inkoop:11 2007-07-31 *Telefoonkosten 104,66 Postbank:7 2007-09-16 Telefoonkosten 108,72 0,00 Inkoop:14 2007-09-30 *Telefoonkosten 108,72 Postbank:9 2007-11-17 Telefoonkosten 109,67 0,00 Inkoop:17 2007-11-30 *Telefoonkosten 109,67 Postbank:11 --------- --------- KPN Totaal 631,44 0,00 XS4ALL 2007-01-05 Internet 22,80 0,00 Inkoop:1 2007-01-19 *Internet 22,80 Postbank:1 2007-02-09 Internet 22,80 0,00 Inkoop:3 2007-02-23 *Internet 22,80 Postbank:2 2007-03-08 Internet 22,80 0,00 Inkoop:4 2007-03-31 *Internet 22,80 Postbank:3 2007-04-05 Internet 22,80 0,00 Inkoop:6 2007-04-06 *Internet 22,80 Postbank:4 2007-05-10 Internet 22,80 0,00 Inkoop:7 2007-05-31 *Internet 22,80 Postbank:5 2007-06-07 Internet 22,80 0,00 Inkoop:9 2007-06-21 *Internet 22,80 Postbank:6 2007-07-05 Internet 22,80 0,00 Inkoop:10 2007-07-30 *Internet 22,80 Postbank:7 2007-08-09 Internet 22,80 0,00 Inkoop:12 2007-08-10 *Internet 22,80 Postbank:8 2007-09-06 Internet 22,80 0,00 Inkoop:13 2007-09-30 *Internet 22,80 Postbank:9 2007-10-11 Internet 22,80 0,00 Inkoop:15 2007-10-13 *Internet 22,80 Postbank:10 2007-11-07 Internet 22,80 0,00 Inkoop:16 2007-11-30 *Internet 22,80 Postbank:11 2007-12-06 Internet 22,80 0,00 Inkoop:18 2007-12-07 *Internet 22,80 Postbank:12 2007-12-07 Internet 22,80 0,00 Inkoop:20 2007-12-09 *Internet 10,00 Postbank:13 2007-12-10 *Internet 12,80 Postbank:14 --------- --------- XS4ALL Totaal 296,40 0,00 ------------------------------------------------------------------------------------------------------ Totaal 927,84 0,00 EekBoek-2.02.04/t/ivp/ref/grootboek2.txt0000444000076500007650000004006012165465617015464 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 1100 Inventaris en inrichting Beginsaldo 1344,37 0,00 Totaal mutaties 0,00 1100 Totaal Inventaris en 1344,37 inrichting 1101 Afschrijving inv. & inr. Beginsaldo 0,00 1304,81 Afschrijving 2007-12-31 0,00 411,26 Memoriaal:1 Totaal mutaties 411,26 1101 Totaal Afschrijving inv. & 1716,07 inr. 1110 Computers Beginsaldo 13378,48 0,00 Totaal mutaties 0,00 1110 Totaal Computers 13378,48 1111 Afschrijving computers Beginsaldo 0,00 12106,78 Afschrijving 2007-12-31 0,00 396,82 Memoriaal:2 Totaal mutaties 396,82 1111 Totaal Afschrijving computers 12503,60 2200 Debiteuren Beginsaldo 0,00 0,00 Perl Cursus 2007-02-18 3570,00 0,00 Verkoop:1 Perl Cursus 2007-03-18 3570,00 0,00 Verkoop:2 *Perl Cursus 2007-03-18 0,00 3570,00 Postbank:3 ACME *Perl Cursus 2007-04-12 0,00 3570,00 Postbank:4 ACME Perl Cursus 2007-04-18 600,00 0,00 Verkoop:3 Perl Cursus 2007-05-12 0,00 5,00 Verkoop:4 Ondersteuning 2007-05-14 714,00 0,00 Verkoop:5 *Perl Cursus 2007-05-31 0,00 600,00 Postbank:5 ACME *Ondersteuning 2007-06-08 0,00 714,00 Postbank:6 ACME *Perl Cursus 2007-06-12 5,00 0,00 Postbank:6 ACME Ondersteuning 2007-07-16 714,00 0,00 Verkoop:6 *Ondersteuning 2007-08-10 0,00 714,00 Postbank:8 ACME Pocket Reference 2007-08-19 1000,00 0,00 Verkoop:7 *Pocket Reference 2007-08-19 0,00 1000,00 Postbank:8 ORA Totaal mutaties 0,00 2200 Totaal Debiteuren 0,00 2320 Postbank Beginsaldo 1131,92 0,00 Afschrift 1 2007-01-31 0,00 130,15 Postbank:1 Afschrift 2 2007-02-28 0,00 25,50 Postbank:2 Afschrift 3 2007-03-31 3442,98 0,00 Postbank:3 Afschrift 4 2007-04-30 3544,50 0,00 Postbank:4 Afschrift 5 2007-05-31 472,28 0,00 Postbank:5 Afschrift 6 2007-06-30 683,50 0,00 Postbank:6 Afschrift 7 2007-07-31 0,00 130,16 Postbank:7 Afschrift 8 2007-08-31 1688,50 0,00 Postbank:8 Afschrift 9 2007-09-30 0,00 134,22 Postbank:9 Afschrift 10 2007-10-31 0,00 25,50 Postbank:10 Afschrift 11 2007-11-30 0,00 135,17 Postbank:11 Afschrift 12 2007-12-07 0,00 25,50 Postbank:12 Eerste deel ADSL 2007-12-09 0,00 10,00 Postbank:13 Tweede deel ADSL 2007-12-10 0,00 12,80 Postbank:14 Totaal mutaties 9202,76 2320 Totaal Postbank 10334,68 3100 Kapitaal de heer/mevrouw Beginsaldo 0,00 2443,18 Totaal mutaties 0,00 3100 Totaal Kapitaal de 2443,18 heer/mevrouw 4100 Crediteuren Beginsaldo 0,00 0,00 Internet 2007-01-05 0,00 22,80 Inkoop:1 ADSL + Telefoon 2007-01-15 0,00 104,65 Inkoop:2 *Internet 2007-01-19 22,80 0,00 Postbank:1 XS4ALL *ADSL + Telefoon 2007-01-31 104,65 0,00 Postbank:1 KPN Internet 2007-02-09 0,00 22,80 Inkoop:3 *Internet 2007-02-23 22,80 0,00 Postbank:2 XS4ALL Internet 2007-03-08 0,00 22,80 Inkoop:4 Telefoonkosten 2007-03-18 0,00 101,52 Inkoop:5 *Internet 2007-03-31 22,80 0,00 Postbank:3 XS4ALL *Telefoonkosten 2007-03-31 101,52 0,00 Postbank:3 KPN Internet 2007-04-05 0,00 22,80 Inkoop:6 *Internet 2007-04-06 22,80 0,00 Postbank:4 XS4ALL Internet 2007-05-10 0,00 22,80 Inkoop:7 Telefoonkosten 2007-05-20 0,00 102,22 Inkoop:8 *Internet 2007-05-31 22,80 0,00 Postbank:5 XS4ALL *Telefoonkosten 2007-05-31 102,22 0,00 Postbank:5 KPN Internet 2007-06-07 0,00 22,80 Inkoop:9 *Internet 2007-06-21 22,80 0,00 Postbank:6 XS4ALL Internet 2007-07-05 0,00 22,80 Inkoop:10 Telefoonkosten 2007-07-15 0,00 104,66 Inkoop:11 *Internet 2007-07-30 22,80 0,00 Postbank:7 XS4ALL *Telefoonkosten 2007-07-31 104,66 0,00 Postbank:7 KPN Internet 2007-08-09 0,00 22,80 Inkoop:12 *Internet 2007-08-10 22,80 0,00 Postbank:8 XS4ALL Internet 2007-09-06 0,00 22,80 Inkoop:13 Telefoonkosten 2007-09-16 0,00 108,72 Inkoop:14 *Internet 2007-09-30 22,80 0,00 Postbank:9 XS4ALL *Telefoonkosten 2007-09-30 108,72 0,00 Postbank:9 KPN Internet 2007-10-11 0,00 22,80 Inkoop:15 *Internet 2007-10-13 22,80 0,00 Postbank:10 XS4ALL Internet 2007-11-07 0,00 22,80 Inkoop:16 Telefoonkosten 2007-11-17 0,00 109,67 Inkoop:17 *Internet 2007-11-30 22,80 0,00 Postbank:11 XS4ALL *Telefoonkosten 2007-11-30 109,67 0,00 Postbank:11 KPN Internet 2007-12-06 0,00 22,80 Inkoop:18 Internet 2007-12-07 0,00 22,80 Inkoop:20 *Internet 2007-12-07 22,80 0,00 Postbank:12 XS4ALL *Internet 2007-12-09 10,00 0,00 Postbank:13 XS4ALL *Internet 2007-12-10 12,80 0,00 Postbank:14 XS4ALL Totaal mutaties 0,00 4100 Totaal Crediteuren 0,00 4200 BTW Verkoop Hoog Beginsaldo 0,00 0,00 BTW Perl Cursus 1e bet. 2007-02-18 0,00 570,00 Verkoop:1 BTW Perl Cursus 2e bet. 2007-03-18 0,00 570,00 Verkoop:2 BTW Perl Cursus rest 2007-04-18 0,00 95,80 Verkoop:3 BTW Perl Cursus rest 2007-05-12 0,80 0,00 Verkoop:4 BTW Consultancy 2007-05-14 0,00 114,00 Verkoop:5 BTW Consultancy 2007-07-16 0,00 114,00 Verkoop:6 Totaal mutaties 1463,00 4200 Totaal BTW Verkoop Hoog 1463,00 4220 BTW Inkoop Hoog Beginsaldo 0,00 0,00 BTW ADSL 2007-01-05 3,64 0,00 Inkoop:1 BTW ADSL 2007-01-15 3,86 0,00 Inkoop:2 BTW Telefoonkosten 2007-01-15 12,84 0,00 Inkoop:2 BTW ADSL 2007-02-09 3,64 0,00 Inkoop:3 BTW ADSL 2007-03-08 3,64 0,00 Inkoop:4 BTW ADSL + Telefoon 2007-03-18 16,21 0,00 Inkoop:5 BTW ADSL 2007-04-05 3,64 0,00 Inkoop:6 BTW ADSL 2007-05-10 3,64 0,00 Inkoop:7 BTW ADSL + Telefoon 2007-05-20 16,32 0,00 Inkoop:8 BTW ADSL 2007-06-07 3,64 0,00 Inkoop:9 BTW ADSL 2007-07-05 3,64 0,00 Inkoop:10 BTW ADSL + Telefoon 2007-07-15 16,71 0,00 Inkoop:11 BTW ADSL 2007-08-09 3,64 0,00 Inkoop:12 BTW ADSL 2007-09-06 3,64 0,00 Inkoop:13 BTW ADSL + Telefoon 2007-09-16 17,36 0,00 Inkoop:14 BTW ADSL 2007-10-11 3,64 0,00 Inkoop:15 BTW ADSL 2007-11-07 3,64 0,00 Inkoop:16 BTW ADSL + Telefoon 2007-11-17 17,51 0,00 Inkoop:17 BTW ÁDSL 2007-12-06 3,64 0,00 Inkoop:18 BTW ADSL 2007-12-07 3,64 0,00 Inkoop:20 Totaal mutaties 148,13 4220 Totaal BTW Inkoop Hoog 148,13 6800 Afschr. kosten inv. & inr. Beginsaldo 0,00 0,00 Afschrijving 2007-12-31 411,26 0,00 Memoriaal:1 Totaal mutaties 411,26 6800 Totaal Afschr. kosten inv. & 411,26 inr. 6810 Afschr. kosten computers Beginsaldo 0,00 0,00 Afschrijving 2007-12-31 396,82 0,00 Memoriaal:2 Totaal mutaties 396,82 6810 Totaal Afschr. kosten 396,82 computers 6900 Telefoon- en faxkosten Beginsaldo 0,00 0,00 Telefoonkosten 2007-01-15 67,61 0,00 Inkoop:2 ADSL + Telefoon 2007-03-18 85,31 0,00 Inkoop:5 ADSL + Telefoon 2007-05-20 85,90 0,00 Inkoop:8 ADSL + Telefoon 2007-07-15 87,95 0,00 Inkoop:11 ADSL + Telefoon 2007-09-16 91,36 0,00 Inkoop:14 ADSL + Telefoon 2007-11-17 92,16 0,00 Inkoop:17 Totaal mutaties 510,29 6900 Totaal Telefoon- en faxkosten 510,29 6905 Internetkosten Beginsaldo 0,00 0,00 ADSL 2007-01-05 19,16 0,00 Inkoop:1 ADSL 2007-01-15 20,34 0,00 Inkoop:2 ADSL 2007-02-09 19,16 0,00 Inkoop:3 ADSL 2007-03-08 19,16 0,00 Inkoop:4 ADSL 2007-04-05 19,16 0,00 Inkoop:6 ADSL 2007-05-10 19,16 0,00 Inkoop:7 ADSL 2007-06-07 19,16 0,00 Inkoop:9 ADSL 2007-07-05 19,16 0,00 Inkoop:10 ADSL 2007-08-09 19,16 0,00 Inkoop:12 ADSL 2007-09-06 19,16 0,00 Inkoop:13 ADSL 2007-10-11 19,16 0,00 Inkoop:15 ADSL 2007-11-07 19,16 0,00 Inkoop:16 ÁDSL 2007-12-06 19,16 0,00 Inkoop:18 ADSL 2007-12-07 19,16 0,00 Inkoop:20 Totaal mutaties 269,42 6905 Totaal Internetkosten 269,42 6980 Bankkosten Beginsaldo 0,00 0,00 Girotel 2007-01-06 2,70 0,00 Postbank:1 Girotel 2007-02-10 2,70 0,00 Postbank:2 Girotel 2007-03-09 2,70 0,00 Postbank:3 Girotel 2007-04-06 2,70 0,00 Postbank:4 Girotel 2007-05-11 2,70 0,00 Postbank:5 Girotel 2007-06-08 2,70 0,00 Postbank:6 Girotel 2007-07-06 2,70 0,00 Postbank:7 Girotel 2007-08-10 2,70 0,00 Postbank:8 Girotel 2007-09-17 2,70 0,00 Postbank:9 Girotel 2007-10-12 2,70 0,00 Postbank:10 Girotel 2007-11-08 2,70 0,00 Postbank:11 Girotel 2007-12-06 2,70 0,00 Postbank:12 Totaal mutaties 32,40 6980 Totaal Bankkosten 32,40 8100 Omzet advisering Beginsaldo 0,00 0,00 Consultancy 2007-05-14 0,00 600,00 Verkoop:5 Consultancy 2007-07-16 0,00 600,00 Verkoop:6 Totaal mutaties 1200,00 8100 Totaal Omzet advisering 1200,00 8300 Omzet editing Beginsaldo 0,00 0,00 Produktie boek 2007-08-19 0,00 1000,00 Verkoop:7 Totaal mutaties 1000,00 8300 Totaal Omzet editing 1000,00 8400 Omzet cursussen Beginsaldo 0,00 0,00 Perl Cursus 1e bet. 2007-02-18 0,00 3000,00 Verkoop:1 Perl Cursus 2e bet. 2007-03-18 0,00 3000,00 Verkoop:2 Perl Cursus rest 2007-04-18 0,00 504,20 Verkoop:3 Perl Cursus rest 2007-05-12 4,20 0,00 Verkoop:4 Totaal mutaties 6500,00 8400 Totaal Omzet cursussen 6500,00 Totaal mutaties 10971,08 10971,08 --------------------------------------------------------------------------------------------------- Totaal 26825,85 26825,85 EekBoek-2.02.04/t/ivp/ref/balans2.csv0000444000076500007650000000163412165465617014711 0ustar jvjv"RekNr","Verdichting/Grootboekrekening","Debet","Credit" 1,"Vaste Activa",, 11,"Materiële vaste activa",, 1100,"Inventaris en inrichting","1344,37", 1101,"Afschrijving inv. & inr.",,"1716,07" 1110,"Computers","13378,48", 1111,"Afschrijving computers",,"12503,60" 11,"Totaal Materiële vaste activa","503,18", 1,"Totaal Vaste Activa","503,18", 2,"Vlottende activa",, 23,"Liquide middelen",, 2320,"Postbank","10334,68", 23,"Totaal Liquide middelen","10334,68", 2,"Totaal Vlottende activa","10334,68", 3,"Eigen vermogen",, 31,"Kapitaal",, 3100,"Kapitaal de heer/mevrouw",,"2443,18" 31,"Totaal Kapitaal",,"2443,18" 3,"Totaal Eigen vermogen",,"2443,18" 4,"Vreemd vermogen",, 42,"Belastingen & soc. lasten",, 4200,"BTW Verkoop Hoog",,"1463,00" 4220,"BTW Inkoop Hoog","148,13", 42,"Totaal Belastingen & soc. lasten",,"1314,87" 4,"Totaal Vreemd vermogen",,"1314,87" ,"<< Winst >>",,"7079,81" ,"TOTAAL Balans","10837,86","10837,86" EekBoek-2.02.04/t/ivp/ref/balans.html0000444000076500007650000000404612165465617015000 0ustar jvjv Balans

Balans

Periode: t/m 2007-12-31
EekBoek Demo Administratie

RekNr Grootboekrekening Debet Credit
1100 Inventaris en inrichting 1344,37  
1101 Afschrijving inv. & inr.   1716,07
1110 Computers 13378,48  
1111 Afschrijving computers   12503,60
2320 Postbank 10334,68  
3100 Kapitaal de heer/mevrouw   2443,18
4200 BTW Verkoop Hoog   1463,00
4220 BTW Inkoop Hoog 148,13  
  << Winst >>   7079,81
  TOTAAL Balans 25205,66 25205,66
EekBoek-2.02.04/t/ivp/ref/proef1.txt0000444000076500007650000000414512165465617014607 0ustar jvjv Proef- en Saldibalans Periode: t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit Saldo Db Saldo Cr -------------------------------------------------------------------------------------------- 1 Vaste Activa 11 Totaal Materiële vaste activa 14722,85 14219,67 503,18 1 Totaal Vaste Activa 14722,85 14219,67 503,18 2 Vlottende activa 22 Totaal Vorderingen 10173,00 10173,00 23 Totaal Liquide middelen 10963,68 629,00 10334,68 2 Totaal Vlottende activa 21136,68 10802,00 10334,68 3 Eigen vermogen 31 Totaal Kapitaal 2443,18 2443,18 3 Totaal Eigen vermogen 2443,18 2443,18 4 Vreemd vermogen 41 Totaal Leveranciers kredieten 927,84 927,84 42 Totaal Belastingen & soc. lasten 148,93 1463,80 1314,87 4 Totaal Vreemd vermogen 1076,77 2391,64 1314,87 6 Kosten 68 Totaal Afschrijvingen 808,08 808,08 69 Totaal Algemene kosten 812,11 812,11 6 Totaal Kosten 1620,19 1620,19 8 Bedrijfsopbrengsten 81 Totaal Omzet Consultancy 1200,00 1200,00 83 Totaal Omzet Editing 1000,00 1000,00 84 Totaal Omzet Cursussen 4,20 6504,20 6500,00 8 Totaal Bedrijfsopbrengsten 4,20 8704,20 8700,00 -------------------------------------------------------------------------------------------- TOTAAL 38560,69 38560,69 12458,05 12458,05 EekBoek-2.02.04/t/ivp/ref/grootboek0.txt0000444000076500007650000000353712165465617015472 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 1100 Totaal Inventaris en 1344,37 inrichting 1101 Totaal Afschrijving inv. & 1716,07 inr. 1110 Totaal Computers 13378,48 1111 Totaal Afschrijving computers 12503,60 2200 Totaal Debiteuren 0,00 2320 Totaal Postbank 10334,68 3100 Totaal Kapitaal de 2443,18 heer/mevrouw 4100 Totaal Crediteuren 0,00 4200 Totaal BTW Verkoop Hoog 1463,00 4220 Totaal BTW Inkoop Hoog 148,13 6800 Totaal Afschr. kosten inv. & 411,26 inr. 6810 Totaal Afschr. kosten 396,82 computers 6900 Totaal Telefoon- en faxkosten 510,29 6905 Totaal Internetkosten 269,42 6980 Totaal Bankkosten 32,40 8100 Totaal Omzet advisering 1200,00 8300 Totaal Omzet editing 1000,00 8400 Totaal Omzet cursussen 6500,00 Totaal mutaties 10971,08 10971,08 --------------------------------------------------------------------------------------------------- Totaal 26825,85 26825,85 EekBoek-2.02.04/t/ivp/ref/grootboek_2.txt0000444000076500007650000000662312165465617015632 0ustar jvjv Grootboek Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 GrBk Grootboek/Boekstuk Datum Debet Credit BoekstukNr Relatie --------------------------------------------------------------------------------------------------- 2200 Debiteuren Beginsaldo 0,00 0,00 Perl Cursus 2007-02-18 3570,00 0,00 Verkoop:1 Perl Cursus 2007-03-18 3570,00 0,00 Verkoop:2 *Perl Cursus 2007-03-18 0,00 3570,00 Postbank:3 ACME *Perl Cursus 2007-04-12 0,00 3570,00 Postbank:4 ACME Perl Cursus 2007-04-18 600,00 0,00 Verkoop:3 Perl Cursus 2007-05-12 0,00 5,00 Verkoop:4 Ondersteuning 2007-05-14 714,00 0,00 Verkoop:5 *Perl Cursus 2007-05-31 0,00 600,00 Postbank:5 ACME *Ondersteuning 2007-06-08 0,00 714,00 Postbank:6 ACME *Perl Cursus 2007-06-12 5,00 0,00 Postbank:6 ACME Ondersteuning 2007-07-16 714,00 0,00 Verkoop:6 *Ondersteuning 2007-08-10 0,00 714,00 Postbank:8 ACME Pocket Reference 2007-08-19 1000,00 0,00 Verkoop:7 *Pocket Reference 2007-08-19 0,00 1000,00 Postbank:8 ORA Totaal mutaties 0,00 2200 Totaal Debiteuren 0,00 2320 Postbank Beginsaldo 1131,92 0,00 Afschrift 1 2007-01-31 0,00 130,15 Postbank:1 Afschrift 2 2007-02-28 0,00 25,50 Postbank:2 Afschrift 3 2007-03-31 3442,98 0,00 Postbank:3 Afschrift 4 2007-04-30 3544,50 0,00 Postbank:4 Afschrift 5 2007-05-31 472,28 0,00 Postbank:5 Afschrift 6 2007-06-30 683,50 0,00 Postbank:6 Afschrift 7 2007-07-31 0,00 130,16 Postbank:7 Afschrift 8 2007-08-31 1688,50 0,00 Postbank:8 Afschrift 9 2007-09-30 0,00 134,22 Postbank:9 Afschrift 10 2007-10-31 0,00 25,50 Postbank:10 Afschrift 11 2007-11-30 0,00 135,17 Postbank:11 Afschrift 12 2007-12-07 0,00 25,50 Postbank:12 Eerste deel ADSL 2007-12-09 0,00 10,00 Postbank:13 Tweede deel ADSL 2007-12-10 0,00 12,80 Postbank:14 Totaal mutaties 9202,76 2320 Totaal Postbank 10334,68 Totaal mutaties 9202,76 0,00 --------------------------------------------------------------------------------------------------- Totaal 10334,68 0,00 EekBoek-2.02.04/t/ivp/ref/obalans.txt0000444000076500007650000000145212165465617015030 0ustar jvjv Openingsbalans Datum: 2007-01-01 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Grootboekrekening Debet Credit ---------------------------------------------------------------------- 1100 Inventaris en inrichting 1344,37 1101 Afschrijving inv. & inr. 1304,81 1110 Computers 13378,48 1111 Afschrijving computers 12106,78 2320 Postbank 1131,92 3100 Kapitaal de heer/mevrouw 2443,18 ---------------------------------------------------------------------- TOTAAL Balans 15854,77 15854,77 EekBoek-2.02.04/t/ivp/ref/result1.txt0000444000076500007650000000175212165465617015013 0ustar jvjv Verlies/Winst Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 RekNr Verdichting/Grootboekrekening Debet Credit ---------------------------------------------------------------------- 6 Kosten 68 Afschrijvingen 808,08 69 Algemene kosten 812,11 6 Totaal Kosten 1620,19 8 Bedrijfsopbrengsten 81 Omzet Consultancy 1200,00 83 Omzet Editing 1000,00 84 Omzet Cursussen 6500,00 8 Totaal Bedrijfsopbrengsten 8700,00 << Winst >> 7079,81 ---------------------------------------------------------------------- TOTAAL Resultaten 8700,00 8700,00 EekBoek-2.02.04/t/ivp/ref/export.xaf0000444000076500007650000017317512165465617014705 0ustar jvjv
CLAIR2.00.00 x 1 Squirrel Here There 1234AA 2007 2007-01-01 2007-12-31 EUR 2007-12-31 EekBoek 2.02.04
geen 1100 Inventaris en inrichting B 1100 1101 Afschrijving inv. & inr. B 1101 1110 Computers B 1110 1111 Afschrijving computers B 1111 1120 Wagenpark B 1120 1121 Afschrijving Wagenpark B 1121 2100 Voorraad B 2100 2200 Debiteuren B 2200 2300 Kas B 2300 2320 Postbank B 2320 2330 Postbank Inbedrijf B 2330 2390 Kruisposten B 2390 3100 Kapitaal de heer/mevrouw B 3100 3110 Privé stortingen B 3110 3120 Privé opnamen B 3120 4100 Crediteuren B 4100 4150 Nog te ontvangen fakturen B 4150 4200 BTW Verkoop Hoog B 4200 4210 BTW Verkoop Laag B 4210 4212 BTW Verkoop Privé B 4212 4220 BTW Inkoop Hoog B 4220 4230 BTW Inkoop Laag B 4230 4232 BTW Inkoop Privé B 4232 4240 BTW Autokostenvergoeding B 4240 4290 Omzetbelasting betaald B 4290 6100 Reis- en verblijfkosten P 6100 6110 Sponsoring P 6110 6200 Verzekeringen P 6200 6310 Kamer van Koophandel P 6310 6320 Vakbond P 6320 6330 Branche-organisatiekosten P 6330 6600 Leasekosten auto P 6600 6610 Brandstof auto P 6610 6620 Onderhoud auto P 6620 6630 Verzekering auto P 6630 6640 Kilometervergoedingen P 6640 6650 Huur auto P 6650 6660 Motorrijtuigenbelasting P 6660 6670 Boetes P 6670 6671 Boetes 0% aftrekbaar P 6671 6680 BTW privégebruik auto P 6680 6690 Overige autokosten P 6690 6700 Contributies & abonnementen P 6700 6710 Contr. & abonn. BTW 0% P 6710 6800 Afschr. kosten inv. & inr. P 6800 6810 Afschr. kosten computers P 6810 6820 Afschr. kosten wagenpark P 6820 6900 Telefoon- en faxkosten P 6900 6905 Internetkosten P 6905 6920 Kantoorartikelen P 6920 6921 Computerbenodigdheden P 6921 6930 Vakliteratuur P 6930 6940 Administratiekosten P 6940 6950 Drukwerk & papier P 6950 6970 Postzegels P 6970 6971 Verzending portikosten P 6971 6980 Bankkosten P 6980 6981 Kasverschillen P 6981 6982 Afrondingen P 6982 6990 Overige algemene kosten P 6990 8100 Omzet advisering P 8100 8110 Omzet advisering BTW vrij P 8110 8200 Omzet royalties BTW vrij P 8200 8300 Omzet editing P 8300 8400 Omzet cursussen P 8400 8410 Omzet cursuslicenties P 8410 8500 Omzet projekten P 8500 8900 Omzet diversen BTW hoog P 8900 8910 Omzet diversen BTW laag P 8910 8920 Omzet diversen BTW vrij P 8920 9120 Rente bate Postbank P 9120 9130 Rente bate Postbank Inbedrijf P 9130 9190 Rente bate overige P 9190 9220 Rente last Postbank P 9220 9230 Rente last Postbank Inbedrijf P 9230 9290 Rente last overige P 9290 9380 Bijtelling privégebruik auto P 9380 9390 Kleine ondernemersregeling P 9390 ACME Acme Corp.
onbekend
ONBEKEND 0000 XX Nederland
KPN KPN
onbekend
ONBEKEND 0000 XX Nederland
ORA O'Reilly & Associates
onbekend
ONBEKEND 0000 XX Nederland
XS4ALL XS4All Internet B.V.
onbekend
ONBEKEND 0000 XX Nederland
142 38560.69 38560.69 I Inkoop 1 1 01 2007-01-05 1 6905 XS4ALL 1 ADSL 19.16 2 4220 XS4ALL 1 BTW ADSL 3.64 3 4100 XS4ALL 1 Internet 22.80 2 01 2007-01-15 1 6905 KPN 2 ADSL 20.34 2 4220 KPN 2 BTW ADSL 3.86 3 6900 KPN 2 Telefoonkosten 67.61 4 4220 KPN 2 BTW Telefoonkosten 12.84 5 4100 KPN 2 ADSL + Telefoon 104.65 3 02 2007-02-09 1 6905 XS4ALL 3 ADSL 19.16 2 4220 XS4ALL 3 BTW ADSL 3.64 3 4100 XS4ALL 3 Internet 22.80 4 03 2007-03-08 1 6905 XS4ALL 4 ADSL 19.16 2 4220 XS4ALL 4 BTW ADSL 3.64 3 4100 XS4ALL 4 Internet 22.80 5 03 2007-03-18 1 6900 KPN 5 ADSL + Telefoon 85.31 2 4220 KPN 5 BTW ADSL + Telefoon 16.21 3 4100 KPN 5 Telefoonkosten 101.52 6 04 2007-04-05 1 6905 XS4ALL 6 ADSL 19.16 2 4220 XS4ALL 6 BTW ADSL 3.64 3 4100 XS4ALL 6 Internet 22.80 7 05 2007-05-10 1 6905 XS4ALL 7 ADSL 19.16 2 4220 XS4ALL 7 BTW ADSL 3.64 3 4100 XS4ALL 7 Internet 22.80 8 05 2007-05-20 1 6900 KPN 8 ADSL + Telefoon 85.90 2 4220 KPN 8 BTW ADSL + Telefoon 16.32 3 4100 KPN 8 Telefoonkosten 102.22 9 06 2007-06-07 1 6905 XS4ALL 9 ADSL 19.16 2 4220 XS4ALL 9 BTW ADSL 3.64 3 4100 XS4ALL 9 Internet 22.80 10 07 2007-07-05 1 6905 XS4ALL 10 ADSL 19.16 2 4220 XS4ALL 10 BTW ADSL 3.64 3 4100 XS4ALL 10 Internet 22.80 11 07 2007-07-15 1 6900 KPN 11 ADSL + Telefoon 87.95 2 4220 KPN 11 BTW ADSL + Telefoon 16.71 3 4100 KPN 11 Telefoonkosten 104.66 12 08 2007-08-09 1 6905 XS4ALL 12 ADSL 19.16 2 4220 XS4ALL 12 BTW ADSL 3.64 3 4100 XS4ALL 12 Internet 22.80 13 09 2007-09-06 1 6905 XS4ALL 13 ADSL 19.16 2 4220 XS4ALL 13 BTW ADSL 3.64 3 4100 XS4ALL 13 Internet 22.80 14 09 2007-09-16 1 6900 KPN 14 ADSL + Telefoon 91.36 2 4220 KPN 14 BTW ADSL + Telefoon 17.36 3 4100 KPN 14 Telefoonkosten 108.72 15 10 2007-10-11 1 6905 XS4ALL 15 ADSL 19.16 2 4220 XS4ALL 15 BTW ADSL 3.64 3 4100 XS4ALL 15 Internet 22.80 16 11 2007-11-07 1 6905 XS4ALL 16 ADSL 19.16 2 4220 XS4ALL 16 BTW ADSL 3.64 3 4100 XS4ALL 16 Internet 22.80 17 11 2007-11-17 1 6900 KPN 17 ADSL + Telefoon 92.16 2 4220 KPN 17 BTW ADSL + Telefoon 17.51 3 4100 KPN 17 Telefoonkosten 109.67 18 12 2007-12-06 1 6905 XS4ALL 18 ÁDSL 19.16 2 4220 XS4ALL 18 BTW ÁDSL 3.64 3 4100 XS4ALL 18 Internet 22.80 20 12 2007-12-07 1 6905 XS4ALL 20 ADSL 19.16 2 4220 XS4ALL 20 BTW ADSL 3.64 3 4100 XS4ALL 20 Internet 22.80 K Kas 4 M Memoriaal 5 0 0 2007-01-01 1 1100 0 opening 1344.37 2 1101 0 opening 1304.81 3 1110 0 opening 13378.48 4 1111 0 opening 12106.78 5 2320 0 opening 1131.92 6 3100 0 opening 2443.18 1 12 2007-12-31 1 6800 1 Afschrijving 411.26 2 1101 1 Afschrijving 411.26 2 12 2007-12-31 1 6810 2 Afschrijving 396.82 2 1111 2 Afschrijving 396.82 P Postbank 3 1 01 2007-01-31 1 6980 1 Girotel 2.70 2 4100 1 *Internet 22.80 3 4100 1 *ADSL + Telefoon 104.65 4 2320 1 Afschrift 1 130.15 2 02 2007-02-28 1 6980 2 Girotel 2.70 2 4100 2 *Internet 22.80 3 2320 2 Afschrift 2 25.50 3 03 2007-03-31 1 6980 3 Girotel 2.70 2 2200 3 *Perl Cursus 3570.00 3 4100 3 *Internet 22.80 4 4100 3 *Telefoonkosten 101.52 5 2320 3 Afschrift 3 3442.98 4 04 2007-04-30 1 6980 4 Girotel 2.70 2 4100 4 *Internet 22.80 3 2200 4 *Perl Cursus 3570.00 4 2320 4 Afschrift 4 3544.50 5 05 2007-05-31 1 6980 5 Girotel 2.70 2 4100 5 *Internet 22.80 3 2200 5 *Perl Cursus 600.00 4 4100 5 *Telefoonkosten 102.22 5 2320 5 Afschrift 5 472.28 6 06 2007-06-30 1 6980 6 Girotel 2.70 2 2200 6 *Ondersteuning 714.00 3 2200 6 *Perl Cursus 5.00 4 4100 6 *Internet 22.80 5 2320 6 Afschrift 6 683.50 7 07 2007-07-31 1 6980 7 Girotel 2.70 2 4100 7 *Internet 22.80 3 4100 7 *Telefoonkosten 104.66 4 2320 7 Afschrift 7 130.16 8 08 2007-08-31 1 6980 8 Girotel 2.70 2 2200 8 *Ondersteuning 714.00 3 4100 8 *Internet 22.80 4 2200 8 *Pocket Reference 1000.00 5 2320 8 Afschrift 8 1688.50 9 09 2007-09-30 1 6980 9 Girotel 2.70 2 4100 9 *Internet 22.80 3 4100 9 *Telefoonkosten 108.72 4 2320 9 Afschrift 9 134.22 10 10 2007-10-31 1 6980 10 Girotel 2.70 2 4100 10 *Internet 22.80 3 2320 10 Afschrift 10 25.50 11 11 2007-11-30 1 6980 11 Girotel 2.70 2 4100 11 *Internet 22.80 3 4100 11 *Telefoonkosten 109.67 4 2320 11 Afschrift 11 135.17 12 12 2007-12-07 1 6980 12 Girotel 2.70 2 4100 12 *Internet 22.80 3 2320 12 Afschrift 12 25.50 13 12 2007-12-09 1 4100 13 *Internet 10.00 2 2320 13 Eerste deel ADSL 10.00 14 12 2007-12-10 1 4100 14 *Internet 12.80 2 2320 14 Tweede deel ADSL 12.80 R Inbedrijf 3 V Verkoop 2 1 02 2007-02-18 1 8400 ACME 1 Perl Cursus 1e bet. 3000.00 2 4200 ACME 1 BTW Perl Cursus 1e bet. 570.00 3 2200 ACME 1 Perl Cursus 3570.00 2 03 2007-03-18 1 8400 ACME 2 Perl Cursus 2e bet. 3000.00 2 4200 ACME 2 BTW Perl Cursus 2e bet. 570.00 3 2200 ACME 2 Perl Cursus 3570.00 3 04 2007-04-18 1 8400 ACME 3 Perl Cursus rest 504.20 2 4200 ACME 3 BTW Perl Cursus rest 95.80 3 2200 ACME 3 Perl Cursus 600.00 4 05 2007-05-12 1 8400 ACME 4 Perl Cursus rest 4.20 2 4200 ACME 4 BTW Perl Cursus rest 0.80 3 2200 ACME 4 Perl Cursus 5.00 5 05 2007-05-14 1 8100 ACME 5 Consultancy 600.00 2 4200 ACME 5 BTW Consultancy 114.00 3 2200 ACME 5 Ondersteuning 714.00 6 07 2007-07-16 1 8100 ACME 6 Consultancy 600.00 2 4200 ACME 6 BTW Consultancy 114.00 3 2200 ACME 6 Ondersteuning 714.00 7 08 2007-08-19 1 8300 ORA 7 Produktie boek 1000.00 2 2200 ORA 7 Pocket Reference 1000.00
EekBoek-2.02.04/t/ivp/ref/journaal-postbank24.txt0000444000076500007650000000133712165465617017213 0ustar jvjv Journaal Periode: 2007-01-01 t/m 2007-12-31 EekBoek Demo Administratie EekBoek, 2007-12-31 Datum Boekstuk/Grootboek Rek Debet Credit BTW % Tarief Boekstuk/regel Relatie ------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------ Totaal Boekstuk Postbank:24 0,00 0,00 EekBoek-2.02.04/README0000444000076500007650000000421612165465617011714 0ustar jvjvEekboek Boekhoudpakket ====================== EekBoek is een boekhoudprogramma bedoeld voor het midden- en kleinbedrijf. EekBoek is niet zomaar een conventioneel boekhoudprogramma. EekBoek is ontstaan uit de gedachte die iedere wat meer technisch onderlegde bedrijfsvoerder wel eens heeft gehad: "Boekhouden, da's toch gewoon wat getalletjes organiseren? Dat moet toch gemakkelijk kunnen met wat slimme scriptjes." Velen hebben pogingen daartoe gedaan, maar de meesten faalden omdat het toch iets complexer bleek te zijn. De goedbedoelde 'slimme scriptjes' werden weer afgedankt, en men nam noodgedwongen een commercieel, meestal op Microsoft Windows gebaseerd boekhoudpakket. EekBoek is wel geslaagd in deze opzet. De 'slimme scriptjes' zijn weliswaar uitgegroeid tot een stevige applicatie, maar het geheel vertoont nog steeds alle kenmerken die zo belangrijk waren: eenvoudig in gebruik, command line gedreven, en een programmeerbare API. EekBoek slaat alle data op in een relationele database, wat het geheel robuust en betrouwbaar maakt. De structuur van de administratie en de boekingsopdrachten kunnen worden onderhouden in twee eenvoudige tekstbestanden. Voor de andersdenkenden is een grafische user interface in ontwikkeling die op dezelfde database werkt, Een export-faciliteit kan van alles wat met de GUI is uitgevoerd weer tekstbestandjes maken. Op deze wijze blijft het geheel overzichtelijk. Na een uitgebreide test-periode is EekBoek nu voldoende capabel om aan het brede publiek te worden gepresenteerd. Voor meer informatie: http://www.eekboek.nl . Voor het uitwisselen van ervaringen, vragen om ondersteuning en zo: gebruik de mailing list http://lists.sourceforge.net/lists/listinfo/eekboek-users. ---------------------------------------------------------------------------- Johan Vromans jvromans@squirrel.nl Squirrel Consultancy Exloo, the Netherlands http://www.squirrel.nl http://johan.vromans.org PGP Key 2048/4783B14D http://johan.vromans.org/pgpkey.html ----------------------- "Arms are made for hugging" ------------------------ EekBoek-2.02.04/README.gui0000444000076500007650000000013512165465617012473 0ustar jvjvwxWidgets (GUI) extensie voor EekBoek. Alle documentatie van EekBoek vindt u onder EekBoek. EekBoek-2.02.04/inc/0000755000076500007650000000000012165465617011604 5ustar jvjvEekBoek-2.02.04/inc/IPC/0000755000076500007650000000000012165465617012217 5ustar jvjvEekBoek-2.02.04/inc/IPC/Run3/0000755000076500007650000000000012165465617013046 5ustar jvjvEekBoek-2.02.04/inc/IPC/Run3/ProfArrayBuffer.pm0000444000076500007650000000237712165465617016452 0ustar jvjvpackage IPC::Run3::ProfArrayBuffer; $VERSION = 0.030; =head1 NAME IPC::Run3::ProfArrayBuffer - Store profile events in RAM in an array =head1 SYNOPSIS =head1 DESCRIPTION =cut use strict; use warnings; =head1 METHODS =over =item C<< IPC::Run3::ProfArrayBuffer->new() >> =cut sub new { my $class = ref $_[0] ? ref shift : shift; my $self = bless { @_ }, $class; $self->{Events} = []; return $self; } =item C<< $buffer->app_call(@events) >> =item C<< $buffer->app_exit(@events) >> =item C<< $buffer->run_exit(@events) >> The three above methods push the given events onto the stack of recorded events. =cut for my $subname ( qw(app_call app_exit run_exit) ) { no strict 'refs'; *{$subname} = sub { push @{shift->{Events}}, [ $subname => @_ ]; }; } =item get_events Returns a list of all the events. Each event is an ARRAY reference like: [ "app_call", 1.1, ... ]; =cut sub get_events { my $self = shift; @{$self->{Events}}; } =back =head1 LIMITATIONS =head1 COPYRIGHT Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved =head1 LICENSE You may use this module under the terms of the BSD, Artistic, or GPL licenses, any version. =head1 AUTHOR Barrie Slaymaker Ebarries@slaysys.comE =cut 1; EekBoek-2.02.04/inc/IPC/Run3/ProfReporter.pm0000444000076500007650000001267712165465617016050 0ustar jvjvpackage IPC::Run3::ProfReporter; $VERSION = 0.000_1; =head1 NAME IPC::Run3::ProfReporter - base class for handling profiling data =head1 SYNOPSIS =head1 DESCRIPTION See L and for an example subclass. This class just notes and accumulates times; subclasses use methods like "handle_app_call", "handle_run_exit" and "handle_app_exit" to emit reports on it. The default methods for these handlers are noops. If run from the command line, a reporter will be created and run on each logfile given as a command line parameter or on run3.out if none are given. This allows reports to be run like: perl -MIPC::Run3::ProfPP -e1 perl -MIPC::Run3::ProfPP -e1 foo.out bar.out Use "-" to read from STDIN (the log file format is meant to be moderately greppable): grep "^cvs " run3.out perl -MIPC::Run3::ProfPP -e1 - Use --app to show only application level statistics (ie don't emit a report section for each command run). =cut use strict; my $loaded_by; sub import { $loaded_by = shift; } END { my @caller; for ( my $i = 0;; ++$i ) { my @c = caller $i; last unless @c; @caller = @c; } if ( $caller[0] eq "main" && $caller[1] eq "-e" ) { require IPC::Run3::ProfLogReader; require Getopt::Long; my ( $app, $run ); Getopt::Long::GetOptions( "app" => \$app, "run" => \$run, ); $app = 1, $run = 1 unless $app || $run; for ( @ARGV ? @ARGV : "" ) { my $r = IPC::Run3::ProfLogReader->new( Source => $_, Handler => $loaded_by->new( Source => $_, app_report => $app, run_report => $run, ), ); $r->read_all; } } } =head1 METHODS =over =item C<< IPC::Run3::ProfReporter->new >> Returns a new profile reporting object. =cut sub new { my $class = ref $_[0] ? ref shift : shift; my $self = bless { @_ }, $class; $self->{app_report} = 1, $self->{run_report} = 1 unless $self->{app_report} || $self->{run_report}; return $self; } =item C<< $reporter->handle_app_call( ... ) >> =item C<< $reporter->handle_app_exit( ... ) >> =item C<< $reporter->handle_run_exit( ... ) >> These methods are called by the handled events (see below). =cut sub handle_app_call {} sub handle_app_exit {} sub handle_run_exit {} =item C<< $reporter->app_call(\@cmd, $time) >> =item C<< $reporter->app_exit($time) >> =item C<< $reporter->run_exit(@times) >> $self->app_call( $time ); my $time = $self->get_app_call_time; Sets the time (in floating point seconds) when the application, run3(), or system() was called or exited. If no time parameter is passed, uses IPC::Run3's time routine. Use get_...() to retrieve these values (and _accum values, too). This is a separate method to speed the execution time of the setters just a bit. =cut sub app_call { my $self = shift; ( $self->{app_cmd}, $self->{app_call_time} ) = @_; $self->handle_app_call if $self->{app_report}; } sub app_exit { my $self = shift; $self->{app_exit_time} = shift; $self->handle_app_exit if $self->{app_report}; } sub run_exit { my $self = shift; @{$self}{qw( run_cmd run_call_time sys_call_time sys_exit_time run_exit_time )} = @_; ++$self->{run_count}; $self->{run_cumulative_time} += $self->get_run_time; $self->{sys_cumulative_time} += $self->get_sys_time; $self->handle_run_exit if $self->{run_report}; } =item C<< $reporter->get_run_count() >> =item C<< $reporter->get_app_call_time() >> =item C<< $reporter->get_app_exit_time() >> =item C<< $reporter->get_app_cmd() >> =item C<< $reporter->get_app_time() >> =cut sub get_run_count { shift->{run_count} } sub get_app_call_time { shift->{app_call_time} } sub get_app_exit_time { shift->{app_exit_time} } sub get_app_cmd { shift->{app_cmd} } sub get_app_time { my $self = shift; $self->get_app_exit_time - $self->get_app_call_time; } =item C<< $reporter->get_app_cumulative_time() >> =cut sub get_app_cumulative_time { my $self = shift; $self->get_app_exit_time - $self->get_app_call_time; } =item C<< $reporter->get_run_call_time() >> =item C<< $reporter->get_run_exit_time() >> =item C<< $reporter->get_run_time() >> =cut sub get_run_call_time { shift->{run_call_time} } sub get_run_exit_time { shift->{run_exit_time} } sub get_run_time { my $self = shift; $self->get_run_exit_time - $self->get_run_call_time; } =item C<< $reporter->get_run_cumulative_time() >> =cut sub get_run_cumulative_time { shift->{run_cumulative_time} } =item C<< $reporter->get_sys_call_time() >> =item C<< $reporter->get_sys_exit_time() >> =item C<< $reporter->get_sys_time() >> =cut sub get_sys_call_time { shift->{sys_call_time} } sub get_sys_exit_time { shift->{sys_exit_time} } sub get_sys_time { my $self = shift; $self->get_sys_exit_time - $self->get_sys_call_time; } =item C<< $reporter->get_sys_cumulative_time() >> =cut sub get_sys_cumulative_time { shift->{sys_cumulative_time} } =item C<< $reporter->get_run_cmd() >> =cut sub get_run_cmd { shift->{run_cmd} } =back =head1 LIMITATIONS =head1 COPYRIGHT Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved =head1 LICENSE You may use this module under the terms of the BSD, Artistic, or GPL licenses, any version. =head1 AUTHOR Barrie Slaymaker =cut 1; EekBoek-2.02.04/inc/IPC/Run3/ProfLogger.pm0000444000076500007650000000504412165465617015453 0ustar jvjvpackage IPC::Run3::ProfLogger; $VERSION = 0.030; =head1 NAME IPC::Run3::ProfLogger - write profiling data to a log file =head1 SYNOPSIS use IPC::Run3::ProfLogger; my $logger = IPC::Run3::ProfLogger->new; ## write to "run3.out" my $logger = IPC::Run3::ProfLogger->new( Destination => $fn ); $logger->app_call( \@cmd, $time ); $logger->run_exit( \@cmd1, @times1 ); $logger->run_exit( \@cmd1, @times1 ); $logger->app_exit( $time ); =head1 DESCRIPTION Used by IPC::Run3 to write a profiling log file. Does not generate reports or maintain statistics; its meant to have minimal overhead. Its API is compatible with a tiny subset of the other IPC::Run profiling classes. =cut use strict; use warnings; =head1 METHODS =head2 C<< IPC::Run3::ProfLogger->new( ... ) >> =cut sub new { my $class = ref $_[0] ? ref shift : shift; my $self = bless { @_ }, $class; $self->{Destination} = "run3.out" unless defined $self->{Destination} && length $self->{Destination}; open PROFILE, ">$self->{Destination}" or die "$!: $self->{Destination}\n"; binmode PROFILE; $self->{FH} = *PROFILE{IO}; $self->{times} = []; return $self; } =head2 C<< $logger->run_exit( ... ) >> =cut sub run_exit { my $self = shift; my $fh = $self->{FH}; print( $fh join( " ", ( map { my $s = $_; $s =~ s/\\/\\\\/g; $s =~ s/ /_/g; $s; } @{shift()} ), join( ",", @{$self->{times}}, @_, ), ), "\n" ); } =head2 C<< $logger->app_exit( $arg ) >> =cut sub app_exit { my $self = shift; my $fh = $self->{FH}; print $fh "\\app_exit ", shift, "\n"; } =head2 C<< $logger->app_call( $t, @args) >> =cut sub app_call { my $self = shift; my $fh = $self->{FH}; my $t = shift; print( $fh join( " ", "\\app_call", ( map { my $s = $_; $s =~ s/\\\\/\\/g; $s =~ s/ /\\_/g; $s; } @_ ), $t, ), "\n" ); } =head1 LIMITATIONS =head1 COPYRIGHT Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved =head1 LICENSE You may use this module under the terms of the BSD, Artistic, or GPL licenses, any version. =head1 AUTHOR Barrie Slaymaker Ebarries@slaysys.comE =cut 1; EekBoek-2.02.04/inc/IPC/Run3/ProfLogReader.pm0000444000076500007650000000561712165465617016106 0ustar jvjvpackage IPC::Run3::ProfLogReader; $VERSION = 0.030; =head1 NAME IPC::Run3::ProfLogReader - read and process a ProfLogger file =head1 SYNOPSIS use IPC::Run3::ProfLogReader; my $reader = IPC::Run3::ProfLogReader->new; ## use "run3.out" my $reader = IPC::Run3::ProfLogReader->new( Source => $fn ); my $profiler = IPC::Run3::ProfPP; ## For example my $reader = IPC::Run3::ProfLogReader->new( ..., Handler => $p ); $reader->read; $eaderr->read_all; =head1 DESCRIPTION Reads a log file. Use the filename "-" to read from STDIN. =cut use strict; use warnings; =head1 METHODS =head2 C<< IPC::Run3::ProfLogReader->new( ... ) >> =cut sub new { my $class = ref $_[0] ? ref shift : shift; my $self = bless { @_ }, $class; $self->{Source} = "run3.out" unless defined $self->{Source} && length $self->{Source}; my $source = $self->{Source}; if ( ref $source eq "GLOB" || UNIVERSAL::isa( $source, "IO::Handle" ) ) { $self->{FH} = $source; } elsif ( $source eq "-" ) { $self->{FH} = \*STDIN; } else { open PROFILE, "<$self->{Source}" or die "$!: $self->{Source}\n"; $self->{FH} = *PROFILE{IO}; } return $self; } =head2 C<< $reader->set_handler( $handler ) >> =cut sub set_handler { $_[0]->{Handler} = $_[1] } =head2 C<< $reader->get_handler() >> =cut sub get_handler { $_[0]->{Handler} } =head2 C<< $reader->read() >> =cut sub read { my $self = shift; my $fh = $self->{FH}; my @ln = split / /, <$fh>; return 0 unless @ln; return 1 unless $self->{Handler}; chomp $ln[-1]; ## Ignore blank and comment lines. return 1 if @ln == 1 && ! length $ln[0] || 0 == index $ln[0], "#"; if ( $ln[0] eq "\\app_call" ) { shift @ln; my @times = split /,/, pop @ln; $self->{Handler}->app_call( [ map { s/\\\\/\\/g; s/\\_/ /g; $_; } @ln ], @times ); } elsif ( $ln[0] eq "\\app_exit" ) { shift @ln; $self->{Handler}->app_exit( pop @ln, @ln ); } else { my @times = split /,/, pop @ln; $self->{Handler}->run_exit( [ map { s/\\\\/\\/g; s/\\_/ /g; $_; } @ln ], @times ); } return 1; } =head2 C<< $reader->read_all() >> This method reads until there is nothing left to read, and then returns true. =cut sub read_all { my $self = shift; 1 while $self->read; return 1; } =head1 LIMITATIONS =head1 COPYRIGHT Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved =head1 LICENSE You may use this module under the terms of the BSD, Artistic, or GPL licenses, any version. =head1 AUTHOR Barrie Slaymaker Ebarries@slaysys.comE =cut 1; EekBoek-2.02.04/inc/IPC/Run3/ProfPP.pm0000444000076500007650000000706012165465617014553 0ustar jvjvpackage IPC::Run3::ProfPP; $VERSION = 0.000_1; =head1 NAME IPC::Run3::ProfPP - Generate reports from IPC::Run3 profiling data =head1 SYNOPSIS =head1 DESCRIPTION Used by IPC::Run3 and/or run3profpp to print out profiling reports for human readers. Use other classes for extracting data in other ways. The output methods are plain text, override these (see the source for now) to provide other formats. This class generates reports on each run3_exit() and app_exit() call. =cut require IPC::Run3::ProfReporter; @ISA = qw( IPC::Run3::ProfReporter ); use strict; use warnings; use POSIX qw( floor ); =head1 METHODS =head2 C<< IPC::Run3::ProfPP->new() >> Returns a new profile reporting object. =cut sub _t { sprintf "%10.6f secs", @_; } sub _r { my ( $num, $denom ) = @_; return () unless $denom; sprintf "%10.6f", $num / $denom; } sub _pct { my ( $num, $denom ) = @_; return () unless $denom; sprintf " (%3d%%)", floor( 100 * $num / $denom + 0.5 ); } =head2 C<< $profpp->handle_app_call() >> =cut sub handle_app_call { my $self = shift; warn "IPC::Run3 parent: ", join( " ", @{$self->get_app_cmd} ), "\n"; $self->{NeedNL} = 1; } =head2 C<< $profpp->handle_app_exit() >> =cut sub handle_app_exit { my $self = shift; warn "\n" if $self->{NeedNL} && $self->{NeedNL} != 1; warn "IPC::Run3 total elapsed: ", _t( $self->get_app_cumulative_time ), "\n"; warn "IPC::Run3 calls to run3(): ", sprintf( "%10d", $self->get_run_count ), "\n"; warn "IPC::Run3 total spent in run3(): ", _t( $self->get_run_cumulative_time ), _pct( $self->get_run_cumulative_time, $self->get_app_cumulative_time ), ", ", _r( $self->get_run_cumulative_time, $self->get_run_count ), " per call", "\n"; my $exclusive = $self->get_app_cumulative_time - $self->get_run_cumulative_time; warn "IPC::Run3 total spent not in run3(): ", _t( $exclusive ), _pct( $exclusive, $self->get_app_cumulative_time ), "\n"; warn "IPC::Run3 total spent in children: ", _t( $self->get_sys_cumulative_time ), _pct( $self->get_sys_cumulative_time, $self->get_app_cumulative_time ), ", ", _r( $self->get_sys_cumulative_time, $self->get_run_count ), " per call", "\n"; my $overhead = $self->get_run_cumulative_time - $self->get_sys_cumulative_time; warn "IPC::Run3 total overhead: ", _t( $overhead ), _pct( $overhead, $self->get_sys_cumulative_time ), ", ", _r( $overhead, $self->get_run_count ), " per call", "\n"; } =head2 C<< $profpp->handle_run_exit() >> =cut sub handle_run_exit { my $self = shift; my $overhead = $self->get_run_time - $self->get_sys_time; warn "\n" if $self->{NeedNL} && $self->{NeedNL} != 2; $self->{NeedNL} = 3; warn "IPC::Run3 child: ", join( " ", @{$self->get_run_cmd} ), "\n"; warn "IPC::Run3 run3() : ", _t( $self->get_run_time ), "\n", "IPC::Run3 child : ", _t( $self->get_sys_time ), "\n", "IPC::Run3 overhead: ", _t( $overhead ), _pct( $overhead, $self->get_sys_time ), "\n"; } =head1 LIMITATIONS =head1 COPYRIGHT Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved =head1 LICENSE You may use this module under the terms of the BSD, Artistic, or GPL licenses, any version. =head1 AUTHOR Barrie Slaymaker Ebarries@slaysys.comE =cut 1; EekBoek-2.02.04/inc/IPC/Run3.pm0000444000076500007650000004253312165465617013411 0ustar jvjvpackage IPC::Run3; =head1 NAME IPC::Run3 - run a subprocess in batch mode (a la system) on Unix, Win32, etc. =head1 VERSION version 0.034 =cut $VERSION = '0.034'; =head1 SYNOPSIS use IPC::Run3; # Exports run3() by default run3 \@cmd, \$in, \$out, \$err; run3 \@cmd, \@in, \&out, \$err; =head1 DESCRIPTION This module allows you to run a subprocess and redirect stdin, stdout, and/or stderr to files and perl data structures. It aims to satisfy 99% of the need for using C, C, and C with a simple, extremely Perlish API and none of the bloat and rarely used features of IPC::Run. Speed, simplicity, and portability are paramount. (That's speed of Perl code; which is often much slower than the kind of buffered I/O that this module uses to spool input to and output from the child command.) Disk space is not. =head2 C<< run3(\@cmd, INPUT, OUTPUT, \$err) >> Note that passing in a reference to C explicitly redirects the associated file descriptor for C, C, or C from or to the local equivalent of C (this does I pass a closed filehandle). Passing in C (or not passing a redirection) allows the child to inherit the corresponding C, C, or C from the parent. Because the redirects come last, this allows C and C to default to the parent's by just not specifying them -- a common use case. B: This means that: run3 \@cmd, undef, \$out; # Pass on parent's STDIN B, it passes on the parent's. Use run3 \@cmd, \undef, \$out; # Close child's STDIN for that. It's not ideal, but it does work. If the exact same value is passed for C<$stdout> and C<$stderr>, then the child will write both to the same filehandle. In general, this means that run3 \@cmd, \undef, "foo.txt", "foo.txt"; run3 \@cmd, \undef, \$both, \$both; will DWYM and pass a single file handle to the child for both C and C, collecting all into C<$both>. =head1 DEBUGGING To enable debugging use the IPCRUN3DEBUG environment variable to a non-zero integer value: $ IPCRUN3DEBUG=1 myapp =head1 PROFILING To enable profiling, set IPCRUN3PROFILE to a number to enable emitting profile information to STDERR (1 to get timestamps, 2 to get a summary report at the END of the program, 3 to get mini reports after each run) or to a filename to emit raw data to a file for later analysis. =head1 COMPARISON Here's how it stacks up to existing APIs: =over =item compared to C, C, C, C: =over =item + redirects more than one file descriptor =item + returns TRUE on success, FALSE on failure =item + throws an error if problems occur in the parent process (or the pre-exec child) =item + allows a very perlish interface to Perl data structures and subroutines =item + allows 1 word invocations to avoid the shell easily: run3 ["foo"]; # does not invoke shell =item - does not return the exit code, leaves it in $? =back =item compared to C, C: =over =item + No lengthy, error prone polling / select loop needed =item + Hides OS dependancies =item + Allows SCALAR, ARRAY, and CODE references to source and sink I/O =item + I/O parameter order is like open3() (not like open2()). =item - Does not allow interaction with the subprocess =back =item compared to C: =over =item + Smaller, lower overhead, simpler, more portable =item + No select() loop portability issues =item + Does not fall prey to Perl closure leaks =item - Does not allow interaction with the subprocess (which IPC::Run::run() allows by redirecting subroutines). =item - Lacks many features of IPC::Run::run() (filters, pipes, redirects, pty support). =back =back =cut @EXPORT = qw( run3 ); %EXPORT_TAGS = ( all => \@EXPORT ); @ISA = qw( Exporter ); use Exporter; use strict; use constant debugging => $ENV{IPCRUN3DEBUG} || $ENV{IPCRUNDEBUG} || 0; use constant profiling => $ENV{IPCRUN3PROFILE} || $ENV{IPCRUNPROFILE} || 0; use constant is_win32 => 0 <= index $^O, "Win32"; BEGIN { if ( is_win32 ) { eval "use Win32 qw( GetOSName ); 1" or die $@; } } #use constant is_win2k => is_win32 && GetOSName() =~ /Win2000/i; #use constant is_winXP => is_win32 && GetOSName() =~ /WinXP/i; use Carp qw( croak ); use File::Temp qw( tempfile ); use POSIX qw( dup dup2 ); # We cache the handles of our temp files in order to # keep from having to incur the (largish) overhead of File::Temp my %fh_cache; my $fh_cache_pid = $$; my $profiler; sub _profiler { $profiler } # test suite access BEGIN { if ( profiling ) { eval "use Time::HiRes qw( gettimeofday ); 1" or die $@; if ( $ENV{IPCRUN3PROFILE} =~ /\A\d+\z/ ) { require IPC::Run3::ProfPP; IPC::Run3::ProfPP->import; $profiler = IPC::Run3::ProfPP->new(Level => $ENV{IPCRUN3PROFILE}); } else { my ( $dest, undef, $class ) = reverse split /(=)/, $ENV{IPCRUN3PROFILE}, 2; $class = "IPC::Run3::ProfLogger" unless defined $class && length $class; if ( not eval "require $class" ) { my $e = $@; $class = "IPC::Run3::$class"; eval "require IPC::Run3::$class" or die $e; } $profiler = $class->new( Destination => $dest ); } $profiler->app_call( [ $0, @ARGV ], scalar gettimeofday() ); } } END { $profiler->app_exit( scalar gettimeofday() ) if profiling; } sub _spool_data_to_child { my ( $type, $source, $binmode_it ) = @_; # If undef (not \undef) passed, they want the child to inherit # the parent's STDIN. return undef unless defined $source; warn "binmode()ing STDIN\n" if is_win32 && debugging && $binmode_it; my $fh; if ( ! $type ) { local *FH; # Do this the backcompat way open FH, "<$source" or croak "$!: $source"; $fh = *FH{IO}; if ( is_win32 ) { binmode $fh, ":raw"; # Remove all layers binmode $fh, ":crlf" unless $binmode_it; } warn "run3(): feeding file '$source' to child STDIN\n" if debugging >= 2; } elsif ( $type eq "FH" ) { $fh = $source; warn "run3(): feeding filehandle '$source' to child STDIN\n" if debugging >= 2; } else { $fh = $fh_cache{in} ||= tempfile; truncate $fh, 0; seek $fh, 0, 0; if ( is_win32 ) { binmode $fh, ":raw"; # Remove any previous layers binmode $fh, ":crlf" unless $binmode_it; } my $seekit; if ( $type eq "SCALAR" ) { # When the run3()'s caller asks to feed an empty file # to the child's stdin, we want to pass a live file # descriptor to an empty file (like /dev/null) so that # they don't get surprised by invalid fd errors and get # normal EOF behaviors. return $fh unless defined $$source; # \undef passed warn "run3(): feeding SCALAR to child STDIN", debugging >= 3 ? ( ": '", $$source, "' (", length $$source, " chars)" ) : (), "\n" if debugging >= 2; $seekit = length $$source; print $fh $$source or die "$! writing to temp file"; } elsif ( $type eq "ARRAY" ) { warn "run3(): feeding ARRAY to child STDIN", debugging >= 3 ? ( ": '", @$source, "'" ) : (), "\n" if debugging >= 2; print $fh @$source or die "$! writing to temp file"; $seekit = grep length, @$source; } elsif ( $type eq "CODE" ) { warn "run3(): feeding output of CODE ref '$source' to child STDIN\n" if debugging >= 2; my $parms = []; # TODO: get these from $options while (1) { my $data = $source->( @$parms ); last unless defined $data; print $fh $data or die "$! writing to temp file"; $seekit = length $data; } } seek $fh, 0, 0 or croak "$! seeking on temp file for child's stdin" if $seekit; } croak "run3() can't redirect $type to child stdin" unless defined $fh; return $fh; } sub _fh_for_child_output { my ( $what, $type, $dest, $binmode_it ) = @_; my $fh; if ( $type eq "SCALAR" && $dest == \undef ) { warn "run3(): redirecting child $what to oblivion\n" if debugging >= 2; $fh = $fh_cache{nul} ||= do { local *FH; open FH, ">" . File::Spec->devnull; *FH{IO}; }; } elsif ( $type eq "FH" ) { $fh = $dest; warn "run3(): redirecting $what to filehandle '$dest'\n" if debugging >= 3; } elsif ( !$type ) { warn "run3(): feeding child $what to file '$dest'\n" if debugging >= 2; local *FH; open FH, ">$dest" or croak "$!: $dest"; $fh = *FH{IO}; } else { warn "run3(): capturing child $what\n" if debugging >= 2; $fh = $fh_cache{$what} ||= tempfile; seek $fh, 0, 0; truncate $fh, 0; } if ( is_win32 ) { warn "binmode()ing $what\n" if debugging && $binmode_it; binmode $fh, ":raw"; binmode $fh, ":crlf" unless $binmode_it; } return $fh; } sub _read_child_output_fh { my ( $what, $type, $dest, $fh, $options ) = @_; return if $type eq "SCALAR" && $dest == \undef; seek $fh, 0, 0 or croak "$! seeking on temp file for child $what"; if ( $type eq "SCALAR" ) { warn "run3(): reading child $what to SCALAR\n" if debugging >= 3; # two read()s are used instead of 1 so that the first will be # logged even it reads 0 bytes; the second won't. my $count = read $fh, $$dest, 10_000; while (1) { croak "$! reading child $what from temp file" unless defined $count; last unless $count; warn "run3(): read $count bytes from child $what", debugging >= 3 ? ( ": '", substr( $$dest, -$count ), "'" ) : (), "\n" if debugging >= 2; $count = read $fh, $$dest, 10_000, length $$dest; } } elsif ( $type eq "ARRAY" ) { @$dest = <$fh>; if ( debugging >= 2 ) { my $count = 0; $count += length for @$dest; warn "run3(): read ", scalar @$dest, " records, $count bytes from child $what", debugging >= 3 ? ( ": '", @$dest, "'" ) : (), "\n"; } } elsif ( $type eq "CODE" ) { warn "run3(): capturing child $what to CODE ref\n" if debugging >= 3; local $_; while ( <$fh> ) { warn "run3(): read ", length, " bytes from child $what", debugging >= 3 ? ( ": '", $_, "'" ) : (), "\n" if debugging >= 2; $dest->( $_ ); } } else { croak "run3() can't redirect child $what to a $type"; } } sub _type { my ( $redir ) = @_; return "FH" if eval { $redir->isa("IO::Handle") }; my $type = ref $redir; return $type eq "GLOB" ? "FH" : $type; } sub _max_fd { my $fd = dup(0); POSIX::close $fd; return $fd; } my $run_call_time; my $sys_call_time; my $sys_exit_time; sub run3 { $run_call_time = gettimeofday() if profiling; my $options = @_ && ref $_[-1] eq "HASH" ? pop : {}; my ( $cmd, $stdin, $stdout, $stderr ) = @_; print STDERR "run3(): running ", join( " ", map "'$_'", ref $cmd ? @$cmd : $cmd ), "\n" if debugging; if ( ref $cmd ) { croak "run3(): empty command" unless @$cmd; croak "run3(): undefined command" unless defined $cmd->[0]; croak "run3(): command name ('')" unless length $cmd->[0]; } else { croak "run3(): missing command" unless @_; croak "run3(): undefined command" unless defined $cmd; croak "run3(): command ('')" unless length $cmd; } my $in_type = _type $stdin; my $out_type = _type $stdout; my $err_type = _type $stderr; if ($fh_cache_pid != $$) { # fork detected, close all cached filehandles and clear the cache close $_ foreach values %fh_cache; %fh_cache = (); $fh_cache_pid = $$; } # This routine procedes in stages so that a failure in an early # stage prevents later stages from running, and thus from needing # cleanup. my $in_fh = _spool_data_to_child $in_type, $stdin, $options->{binmode_stdin} if defined $stdin; my $out_fh = _fh_for_child_output "stdout", $out_type, $stdout, $options->{binmode_stdout} if defined $stdout; my $tie_err_to_out = defined $stderr && defined $stdout && $stderr eq $stdout; my $err_fh = $tie_err_to_out ? $out_fh : _fh_for_child_output "stderr", $err_type, $stderr, $options->{binmode_stderr} if defined $stderr; # this should make perl close these on exceptions local *STDIN_SAVE; local *STDOUT_SAVE; local *STDERR_SAVE; my $saved_fd0 = dup( 0 ) if defined $in_fh; # open STDIN_SAVE, "<&STDIN"# or croak "run3(): $! saving STDIN" # if defined $in_fh; open STDOUT_SAVE, ">&STDOUT" or croak "run3(): $! saving STDOUT" if defined $out_fh; open STDERR_SAVE, ">&STDERR" or croak "run3(): $! saving STDERR" if defined $err_fh; my $ok = eval { # The open() call here seems to not force fd 0 in some cases; # I ran in to trouble when using this in VCP, not sure why. # the dup2() seems to work. dup2( fileno $in_fh, 0 ) # open STDIN, "<&=" . fileno $in_fh or croak "run3(): $! redirecting STDIN" if defined $in_fh; # close $in_fh or croak "$! closing STDIN temp file" # if ref $stdin; open STDOUT, ">&" . fileno $out_fh or croak "run3(): $! redirecting STDOUT" if defined $out_fh; open STDERR, ">&" . fileno $err_fh or croak "run3(): $! redirecting STDERR" if defined $err_fh; $sys_call_time = gettimeofday() if profiling; my $r = ref $cmd ? system { $cmd->[0] } is_win32 ? map { # Probably need to offer a win32 escaping # option, every command may be different. ( my $s = $_ ) =~ s/"/"""/g; $s = qq{"$s"}; $s; } @$cmd : @$cmd : system $cmd; $sys_exit_time = gettimeofday() if profiling; unless ( defined $r && $r != -1 ) { if ( debugging ) { my $err_fh = defined $err_fh ? \*STDERR_SAVE : \*STDERR; print $err_fh "run3(): system() error $!\n" } die $!; } if ( debugging ) { my $err_fh = defined $err_fh ? \*STDERR_SAVE : \*STDERR; print $err_fh "run3(): \$? is $?\n" } 1; }; my $x = $@; my @errs; if ( defined $saved_fd0 ) { dup2( $saved_fd0, 0 ); POSIX::close( $saved_fd0 ); } # open STDIN, "<&STDIN_SAVE"# or push @errs, "run3(): $! restoring STDIN" # if defined $in_fh; open STDOUT, ">&STDOUT_SAVE" or push @errs, "run3(): $! restoring STDOUT" if defined $out_fh; open STDERR, ">&STDERR_SAVE" or push @errs, "run3(): $! restoring STDERR" if defined $err_fh; croak join ", ", @errs if @errs; die $x unless $ok; _read_child_output_fh "stdout", $out_type, $stdout, $out_fh, $options if defined $out_fh && $out_type && $out_type ne "FH"; _read_child_output_fh "stderr", $err_type, $stderr, $err_fh, $options if defined $err_fh && $err_type && $err_type ne "FH" && !$tie_err_to_out; $profiler->run_exit( $cmd, $run_call_time, $sys_call_time, $sys_exit_time, scalar gettimeofday() ) if profiling; return 1; } =head1 TODO pty support =head1 LIMITATIONS Often uses intermediate files (determined by File::Temp, and thus by the File::Spec defaults and the TMPDIR env. variable) for speed, portability and simplicity. Use extrem caution when using C in a threaded environment if concurrent calls of C are possible. Most likely, I/O from different invocations will get mixed up. The reason is that in most thread implementations all threads in a process share the same STDIN/STDOUT/STDERR. Known failures are Perl ithreads on Linux and Win32. Note that C on Win32 is emulated via Win32 threads and hence I/O mix up is possible between forked children here (C is "fork safe" on Unix, though). =head1 COPYRIGHT Copyright 2003, R. Barrie Slaymaker, Jr., All Rights Reserved =head1 LICENSE You may use this module under the terms of the BSD, Artistic, or GPL licenses, any version. =head1 AUTHOR Barrie Slaymaker ECE Ricardo SIGNES ECE performed some routine maintenance in 2005, thanks to help from the following ticket and/or patch submitters: Jody Belka, Roderich Schupp, David Morel, and anonymous others. =cut 1; EekBoek-2.02.04/inc/Module/0000755000076500007650000000000012165465617013031 5ustar jvjvEekBoek-2.02.04/inc/Module/Build/0000755000076500007650000000000012165465617014070 5ustar jvjvEekBoek-2.02.04/inc/Module/Build/PodParser.pm0000444000076500007650000000422512165465617016326 0ustar jvjvpackage Module::Build::PodParser; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use vars qw(@ISA); sub new { # Perl is so fun. my $package = shift; my $self; # Try using Pod::Parser first if (eval{ require Pod::Parser; 1; }) { @ISA = qw(Pod::Parser); $self = $package->SUPER::new(@_); $self->{have_pod_parser} = 1; } else { @ISA = (); *parse_from_filehandle = \&_myparse_from_filehandle; $self = bless {have_pod_parser => 0, @_}, $package; } unless ($self->{fh}) { die "No 'file' or 'fh' parameter given" unless $self->{file}; $self->{fh} = IO::File->new($self->{file}) or die "Couldn't open $self->{file}: $!"; } return $self; } sub _myparse_from_filehandle { my ($self, $fh) = @_; local $_; while (<$fh>) { next unless /^=(?!cut)/ .. /^=cut/; # in POD last if ($self->{abstract}) = /^ (?: [a-z:]+ \s+ - \s+ ) (.*\S) /ix; } my @author; while (<$fh>) { next unless /^=head1\s+AUTHORS?/ ... /^=/; next if /^=/; push @author, $_ if /\@/; } return unless @author; s/^\s+|\s+$//g foreach @author; $self->{author} = \@author; return; } sub get_abstract { my $self = shift; return $self->{abstract} if defined $self->{abstract}; $self->parse_from_filehandle($self->{fh}); return $self->{abstract}; } sub get_author { my $self = shift; return $self->{author} if defined $self->{author}; $self->parse_from_filehandle($self->{fh}); return $self->{author} || []; } ################## Pod::Parser overrides ########### sub initialize { my $self = shift; $self->{_head} = ''; $self->SUPER::initialize(); } sub command { my ($self, $cmd, $text) = @_; if ( $cmd eq 'head1' ) { $text =~ s/^\s+//; $text =~ s/\s+$//; $self->{_head} = $text; } } sub textblock { my ($self, $text) = @_; $text =~ s/^\s+//; $text =~ s/\s+$//; if ($self->{_head} eq 'NAME') { my ($name, $abstract) = split( /\s+-\s+/, $text, 2 ); $self->{abstract} = $abstract; } elsif ($self->{_head} =~ /^AUTHORS?$/) { push @{$self->{author}}, $text if $text =~ /\@/; } } sub verbatim {} sub interior_sequence {} 1; EekBoek-2.02.04/inc/Module/Build/YAML.pm0000444000076500007650000000771412165465617015177 0ustar jvjvpackage Module::Build::YAML; use strict; use vars qw($VERSION @EXPORT @EXPORT_OK); $VERSION = "0.50"; @EXPORT = (); @EXPORT_OK = qw(Dump Load DumpFile LoadFile); sub new { my $this = shift; my $class = ref($this) || $this; my $self = {}; bless $self, $class; return($self); } sub Dump { shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__); my $yaml = ""; foreach my $item (@_) { $yaml .= "---\n"; $yaml .= &_yaml_chunk("", $item); } return $yaml; } sub Load { shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__); die "not yet implemented"; } # This is basically copied out of YAML.pm and simplified a little. sub DumpFile { shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__); my $filename = shift; local $/ = "\n"; # reset special to "sane" my $mode = '>'; if ($filename =~ /^\s*(>{1,2})\s*(.*)$/) { ($mode, $filename) = ($1, $2); } open my $OUT, "$mode $filename" or die "Can't open $filename for writing: $!"; print $OUT Dump(@_); close $OUT; } # This is basically copied out of YAML.pm and simplified a little. sub LoadFile { shift if ($_[0] eq __PACKAGE__ || ref($_[0]) eq __PACKAGE__); my $filename = shift; open my $IN, $filename or die "Can't open $filename for reading: $!"; return Load(do { local $/; <$IN> }); close $IN; } sub _yaml_chunk { my ($indent, $values) = @_; my $yaml_chunk = ""; my $ref = ref($values); my ($value, @allkeys, %keyseen); if (!$ref) { # a scalar $yaml_chunk .= &_yaml_value($values) . "\n"; } elsif ($ref eq "ARRAY") { foreach $value (@$values) { $yaml_chunk .= "$indent-"; $ref = ref($value); if (!$ref) { $yaml_chunk .= " " . &_yaml_value($value) . "\n"; } else { $yaml_chunk .= "\n"; $yaml_chunk .= &_yaml_chunk("$indent ", $value); } } } else { # assume "HASH" if ($values->{_order} && ref($values->{_order}) eq "ARRAY") { @allkeys = @{$values->{_order}}; $values = { %$values }; delete $values->{_order}; } push(@allkeys, sort keys %$values); foreach my $key (@allkeys) { next if (!defined $key || $key eq "" || $keyseen{$key}); $keyseen{$key} = 1; $yaml_chunk .= "$indent$key:"; $value = $values->{$key}; $ref = ref($value); if (!$ref) { $yaml_chunk .= " " . &_yaml_value($value) . "\n"; } else { $yaml_chunk .= "\n"; $yaml_chunk .= &_yaml_chunk("$indent ", $value); } } } return($yaml_chunk); } sub _yaml_value { my ($value) = @_; # undefs become ~ return '~' if not defined $value; # empty strings will become empty strings return '""' if $value eq ''; # allow simple scalars (without embedded quote chars) to be unquoted # (includes $%_+=-\;:,./) return $value if $value !~ /["'`~\n!\@\#^\&\*\(\)\{\}\[\]\|<>\?]/; # quote and escape strings with special values return "'$value'" if $value !~ /['`~\n!\#^\&\*\(\)\{\}\[\]\|\?]/; # nothing but " or @ or < or > (email addresses) $value =~ s/\n/\\n/g; # handle embedded newlines $value =~ s/"/\\"/g; # handle embedded quotes return qq{"$value"}; } 1; __END__ =head1 NAME Module::Build::YAML - Provides just enough YAML support so that Module::Build works even if YAML.pm is not installed =head1 SYNOPSIS use Module::Build::YAML; ... =head1 DESCRIPTION Provides just enough YAML support so that Module::Build works even if YAML.pm is not installed. Currently, this amounts to the ability to write META.yml files when "perl Build distmeta" is executed via the Dump() and DumpFile() functions/methods. =head1 AUTHOR Stephen Adkins =head1 COPYRIGHT Copyright (c) 2006. Stephen Adkins. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See L =cut EekBoek-2.02.04/inc/Module/Build/Compat.pm0000444000076500007650000003615212165465617015656 0ustar jvjvpackage Module::Build::Compat; use strict; use vars qw($VERSION); $VERSION = '0.32'; use File::Spec; use IO::File; use Config; use Module::Build; use Module::Build::ModuleInfo; use Data::Dumper; my %convert_installdirs = ( PERL => 'core', SITE => 'site', VENDOR => 'vendor', ); my %makefile_to_build = ( TEST_VERBOSE => 'verbose', VERBINST => 'verbose', INC => sub { map {(extra_compiler_flags => $_)} Module::Build->split_like_shell(shift) }, POLLUTE => sub { (extra_compiler_flags => '-DPERL_POLLUTE') }, INSTALLDIRS => sub { (installdirs => $convert_installdirs{uc shift()}) }, LIB => sub { my $lib = shift; my %config = ( installprivlib => $lib, installsitelib => $lib, installarchlib => "$lib/$Config{archname}", installsitearch => "$lib/$Config{archname}" ); return map { (config => "$_=$config{$_}") } keys %config; }, # Convert INSTALLVENDORLIB and friends. ( map { my $name = "INSTALL".$_."LIB"; $name => sub { my @ret = (config => { lc $name => shift }); print STDERR "# Converted to @ret\n"; return @ret; } } keys %convert_installdirs ), # Some names they have in common map {$_, lc($_)} qw(DESTDIR PREFIX INSTALL_BASE UNINST), ); my %macro_to_build = %makefile_to_build; # "LIB=foo make" is not the same as "perl Makefile.PL LIB=foo" delete $macro_to_build{LIB}; sub create_makefile_pl { my ($package, $type, $build, %args) = @_; die "Don't know how to build Makefile.PL of type '$type'" unless $type =~ /^(small|passthrough|traditional)$/; my $fh; if ($args{fh}) { $fh = $args{fh}; } else { $args{file} ||= 'Makefile.PL'; local $build->{properties}{quiet} = 1; $build->delete_filetree($args{file}); $fh = IO::File->new("> $args{file}") or die "Can't write $args{file}: $!"; } print {$fh} "# Note: this file was auto-generated by ", __PACKAGE__, " version $VERSION\n"; # Minimum perl version should be specified as "require 5.XXXXXX" in # Makefile.PL my $requires = $build->requires; if ( my $minimum_perl = $requires->{perl} ) { print {$fh} "require $minimum_perl;\n"; } # If a *bundled* custom subclass is being used, make sure we add its # directory to @INC. Also, lib.pm always needs paths in Unix format. my $subclass_load = ''; if (ref($build) ne "Module::Build") { my $subclass_dir = $package->subclass_dir($build); if (File::Spec->file_name_is_absolute($subclass_dir)) { my $base_dir = $build->base_dir; if ($build->dir_contains($base_dir, $subclass_dir)) { $subclass_dir = File::Spec->abs2rel($subclass_dir, $base_dir); $subclass_dir = $package->unixify_dir($subclass_dir); $subclass_load = "use lib '$subclass_dir';"; } # Otherwise, leave it the empty string } else { $subclass_dir = $package->unixify_dir($subclass_dir); $subclass_load = "use lib '$subclass_dir';"; } } if ($type eq 'small') { printf {$fh} <<'EOF', $subclass_load, ref($build), ref($build); use Module::Build::Compat 0.02; %s Module::Build::Compat->run_build_pl(args => \@ARGV); require %s; Module::Build::Compat->write_makefile(build_class => '%s'); EOF } elsif ($type eq 'passthrough') { printf {$fh} <<'EOF', $subclass_load, ref($build), ref($build); unless (eval "use Module::Build::Compat 0.02; 1" ) { print "This module requires Module::Build to install itself.\n"; require ExtUtils::MakeMaker; my $yn = ExtUtils::MakeMaker::prompt (' Install Module::Build now from CPAN?', 'y'); unless ($yn =~ /^y/i) { die " *** Cannot install without Module::Build. Exiting ...\n"; } require Cwd; require File::Spec; require CPAN; # Save this 'cause CPAN will chdir all over the place. my $cwd = Cwd::cwd(); CPAN::Shell->install('Module::Build::Compat'); CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate or die "Couldn't install Module::Build, giving up.\n"; chdir $cwd or die "Cannot chdir() back to $cwd: $!"; } eval "use Module::Build::Compat 0.02; 1" or die $@; %s Module::Build::Compat->run_build_pl(args => \@ARGV); exit(0) unless(-e 'Build'); # cpantesters convention require %s; Module::Build::Compat->write_makefile(build_class => '%s'); EOF } elsif ($type eq 'traditional') { my (%MM_Args, %prereq); if (eval "use Tie::IxHash; 1") { tie %MM_Args, 'Tie::IxHash'; # Don't care if it fails here tie %prereq, 'Tie::IxHash'; # Don't care if it fails here } my %name = ($build->module_name ? (NAME => $build->module_name) : (DISTNAME => $build->dist_name)); my %version = ($build->dist_version_from ? (VERSION_FROM => $build->dist_version_from) : (VERSION => $build->dist_version) ); %MM_Args = (%name, %version); %prereq = ( %{$build->requires}, %{$build->build_requires} ); %prereq = map {$_, $prereq{$_}} sort keys %prereq; delete $prereq{perl}; $MM_Args{PREREQ_PM} = \%prereq; $MM_Args{INSTALLDIRS} = $build->installdirs eq 'core' ? 'perl' : $build->installdirs; $MM_Args{EXE_FILES} = [ sort keys %{$build->script_files} ] if $build->script_files; $MM_Args{PL_FILES} = $build->PL_files if $build->PL_files; local $Data::Dumper::Terse = 1; my $args = Data::Dumper::Dumper(\%MM_Args); $args =~ s/\{(.*)\}/($1)/s; print $fh <<"EOF"; use ExtUtils::MakeMaker; WriteMakefile $args; EOF } } sub subclass_dir { my ($self, $build) = @_; return (Module::Build::ModuleInfo->find_module_dir_by_name(ref $build) || File::Spec->catdir($build->config_dir, 'lib')); } sub unixify_dir { my ($self, $path) = @_; return join '/', File::Spec->splitdir($path); } sub makefile_to_build_args { my $class = shift; my @out; foreach my $arg (@_) { next if $arg eq ''; my ($key, $val) = ($arg =~ /^(\w+)=(.+)/ ? ($1, $2) : die "Malformed argument '$arg'"); # Do tilde-expansion if it looks like a tilde prefixed path ( $val ) = Module::Build->_detildefy( $val ) if $val =~ /^~/; if (exists $makefile_to_build{$key}) { my $trans = $makefile_to_build{$key}; push @out, $class->_argvify( ref($trans) ? $trans->($val) : ($trans => $val) ); } elsif (exists $Config{lc($key)}) { push @out, $class->_argvify( config => lc($key) . "=$val" ); } else { # Assume M::B can handle it in lowercase form push @out, $class->_argvify("\L$key" => $val); } } return @out; } sub _argvify { my ($self, @pairs) = @_; my @out; while (@pairs) { my ($k, $v) = splice @pairs, 0, 2; push @out, ("--$k", $v); } return @out; } sub makefile_to_build_macros { my @out; while (my ($macro, $trans) = each %macro_to_build) { # On some platforms (e.g. Cygwin with 'make'), the mere presence # of "EXPORT: FOO" in the Makefile will make $ENV{FOO} defined. # Therefore we check length() too. next unless exists $ENV{$macro} && length $ENV{$macro}; my $val = $ENV{$macro}; push @out, ref($trans) ? $trans->($val) : ($trans => $val); } return @out; } sub run_build_pl { my ($pack, %in) = @_; $in{script} ||= 'Build.PL'; my @args = $in{args} ? $pack->makefile_to_build_args(@{$in{args}}) : (); print "# running $in{script} @args\n"; Module::Build->run_perl_script($in{script}, [], \@args) or die "Couldn't run $in{script}: $!"; } sub fake_makefile { my ($self, %args) = @_; unless (exists $args{build_class}) { warn "Unknown 'build_class', defaulting to 'Module::Build'\n"; $args{build_class} = 'Module::Build'; } my $class = $args{build_class}; my $perl = $class->find_perl_interpreter; # VMS MMS/MMK need to use MCR to run the Perl image. $perl = 'MCR ' . $perl if $self->_is_vms_mms; my $noop = ($class->is_windowsish ? 'rem>nul' : $self->_is_vms_mms ? 'Continue' : 'true'); my $filetype = $class->is_vmsish ? '.COM' : ''; my $Build = 'Build' . $filetype . ' --makefile_env_macros 1'; my $unlink = $class->oneliner('1 while unlink $ARGV[0]', [], [$args{makefile}]); $unlink =~ s/\$/\$\$/g; my $maketext = <<"EOF"; all : force_do_it $perl $Build realclean : force_do_it $perl $Build realclean $unlink force_do_it : @ $noop EOF foreach my $action ($class->known_actions) { next if $action =~ /^(all|realclean|force_do_it)$/; # Don't double-define $maketext .= <<"EOF"; $action : force_do_it $perl $Build $action EOF } if ($self->_is_vms_mms) { # Roll our own .EXPORT as MMS/MMK don't honor that directive. $maketext .= "\n.FIRST\n\t\@ $noop\n"; for my $macro (keys %macro_to_build) { $maketext .= ".IFDEF $macro\n\tDEFINE $macro \"\$($macro)\"\n.ENDIF\n"; } $maketext .= "\n"; } else { $maketext .= "\n.EXPORT : " . join(' ', keys %macro_to_build) . "\n\n"; } return $maketext; } sub fake_prereqs { my $file = File::Spec->catfile('_build', 'prereqs'); my $fh = IO::File->new("< $file") or die "Can't read $file: $!"; my $prereqs = eval do {local $/; <$fh>}; close $fh; my @prereq; foreach my $section (qw/build_requires requires/) { foreach (keys %{$prereqs->{$section}}) { next if $_ eq 'perl'; push @prereq, "$_=>q[$prereqs->{$section}{$_}]"; } } return unless @prereq; return "# PREREQ_PM => { " . join(", ", @prereq) . " }\n\n"; } sub write_makefile { my ($pack, %in) = @_; unless (exists $in{build_class}) { warn "Unknown 'build_class', defaulting to 'Module::Build'\n"; $in{build_class} = 'Module::Build'; } my $class = $in{build_class}; $in{makefile} ||= $pack->_is_vms_mms ? 'Descrip.MMS' : 'Makefile'; open MAKE, "> $in{makefile}" or die "Cannot write $in{makefile}: $!"; print MAKE $pack->fake_prereqs; print MAKE $pack->fake_makefile(%in); close MAKE; } sub _is_vms_mms { return Module::Build->is_vmsish && ($Config{make} =~ m/MM[SK]/i); } 1; __END__ =head1 NAME Module::Build::Compat - Compatibility with ExtUtils::MakeMaker =head1 SYNOPSIS # In a Build.PL : use Module::Build; my $build = Module::Build->new ( module_name => 'Foo::Bar', license => 'perl', create_makefile_pl => 'passthrough' ); ... =head1 DESCRIPTION Because ExtUtils::MakeMaker has been the standard way to distribute modules for a long time, many tools (CPAN.pm, or your system administrator) may expect to find a working Makefile.PL in every distribution they download from CPAN. If you want to throw them a bone, you can use Module::Build::Compat to automatically generate a Makefile.PL for you, in one of several different styles. Module::Build::Compat also provides some code that helps out the Makefile.PL at runtime. =head1 METHODS =over 4 =item create_makefile_pl($style, $build) Creates a Makefile.PL in the current directory in one of several styles, based on the supplied Module::Build object C<$build>. This is typically controlled by passing the desired style as the C parameter to Module::Build's C method; the Makefile.PL will then be automatically created during the C action. The currently supported styles are: =over 4 =item small A small Makefile.PL will be created that passes all functionality through to the Build.PL script in the same directory. The user must already have Module::Build installed in order to use this, or else they'll get a module-not-found error. =item passthrough This is just like the C option above, but if Module::Build is not already installed on the user's system, the script will offer to use C to download it and install it before continuing with the build. =item traditional A Makefile.PL will be created in the "traditional" style, i.e. it will use C and won't rely on C at all. In order to create the Makefile.PL, we'll include the C and C dependencies as the C parameter. You don't want to use this style if during the C stage you ask the user questions, or do some auto-sensing about the user's environment, or if you subclass Module::Build to do some customization, because the vanilla Makefile.PL won't do any of that. =back =item run_build_pl(args => \@ARGV) This method runs the Build.PL script, passing it any arguments the user may have supplied to the C command. Because ExtUtils::MakeMaker and Module::Build accept different arguments, this method also performs some translation between the two. C accepts the following named parameters: =over 4 =item args The C parameter specifies the parameters that would usually appear on the command line of the C command - typically you'll just pass a reference to C<@ARGV>. =item script This is the filename of the script to run - it defaults to C. =back =item write_makefile() This method writes a 'dummy' Makefile that will pass all commands through to the corresponding Module::Build actions. C accepts the following named parameters: =over 4 =item makefile The name of the file to write - defaults to the string C. =back =back =head1 SCENARIOS So, some common scenarios are: =over 4 =item 1. Just include a Build.PL script (without a Makefile.PL script), and give installation directions in a README or INSTALL document explaining how to install the module. In particular, explain that the user must install Module::Build before installing your module. Note that if you do this, you may make things easier for yourself, but harder for people with older versions of CPAN or CPANPLUS on their system, because those tools generally only understand the F/C way of doing things. =item 2. Include a Build.PL script and a "traditional" Makefile.PL, created either manually or with C. Users won't ever have to install Module::Build if they use the Makefile.PL, but they won't get to take advantage of Module::Build's extra features either. If you go this route, make sure you explicitly set C in the call to C (probably to an empty hash reference), or else MakeMaker will mistakenly run the Build.PL and you'll get an error message about "Too early to run Build script" or something. For good measure, of course, test both the F and the F before shipping. =item 3. Include a Build.PL script and a "pass-through" Makefile.PL built using Module::Build::Compat. This will mean that people can continue to use the "old" installation commands, and they may never notice that it's actually doing something else behind the scenes. It will also mean that your installation process is compatible with older versions of tools like CPAN and CPANPLUS. =back =head1 AUTHOR Ken Williams =head1 COPYRIGHT Copyright (c) 2001-2006 Ken Williams. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L(3), L(3) =cut EekBoek-2.02.04/inc/Module/Build/ModuleInfo.pm0000444000076500007650000002706512165465617016477 0ustar jvjv# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*- # vim:ts=8:sw=2:et:sta:sts=2 package Module::Build::ModuleInfo; # This module provides routines to gather information about # perl modules (assuming this may be expanded in the distant # parrot future to look at other types of modules). use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use File::Spec; use IO::File; use Module::Build::Version; my $PKG_REGEXP = qr{ # match a package declaration ^[\s\{;]* # intro chars on a line package # the word 'package' \s+ # whitespace ([\w:]+) # a package name \s* # optional whitespace ; # semicolon line terminator }x; my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name ([\$*]) # sigil - $ or * ( ( # optional leading package name (?:::|\')? # possibly starting like just :: (ala $::VERSION) (?:\w+(?:::|\'))* # Foo::Bar:: ... )? VERSION )\b }x; my $VERS_REGEXP = qr{ # match a VERSION definition (?: \(\s*$VARNAME_REGEXP\s*\) # with parens | $VARNAME_REGEXP # without parens ) \s* =[^=~] # = but not ==, nor =~ }x; sub new_from_file { my $class = shift; my $filename = File::Spec->rel2abs( shift ); return undef unless defined( $filename ) && -f $filename; return $class->_init(undef, $filename, @_); } sub new_from_module { my $class = shift; my $module = shift; my %props = @_; $props{inc} ||= \@INC; my $filename = $class->find_module_by_name( $module, $props{inc} ); return undef unless defined( $filename ) && -f $filename; return $class->_init($module, $filename, %props); } sub _init { my $class = shift; my $module = shift; my $filename = shift; my %props = @_; my( %valid_props, @valid_props ); @valid_props = qw( collect_pod inc ); @valid_props{@valid_props} = delete( @props{@valid_props} ); warn "Unknown properties: @{[keys %props]}\n" if scalar( %props ); my %data = ( module => $module, filename => $filename, version => undef, packages => [], versions => {}, pod => {}, pod_headings => [], collect_pod => 0, %valid_props, ); my $self = bless(\%data, $class); $self->_parse_file(); unless($self->{module} and length($self->{module})) { my ($v, $d, $f) = File::Spec->splitpath($self->{filename}); if($f =~ /\.pm$/) { $f =~ s/\..+$//; my @candidates = grep /$f$/, @{$self->{packages}}; $self->{module} = shift(@candidates); # punt } else { if(grep /main/, @{$self->{packages}}) { $self->{module} = 'main'; } else { $self->{module} = $self->{packages}[0] || ''; } } } $self->{version} = $self->{versions}{$self->{module}} if defined( $self->{module} ); return $self; } # class method sub _do_find_module { my $class = shift; my $module = shift || die 'find_module_by_name() requires a package name'; my $dirs = shift || \@INC; my $file = File::Spec->catfile(split( /::/, $module)); foreach my $dir ( @$dirs ) { my $testfile = File::Spec->catfile($dir, $file); return [ File::Spec->rel2abs( $testfile ), $dir ] if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp return [ File::Spec->rel2abs( "$testfile.pm" ), $dir ] if -e "$testfile.pm"; } return; } # class method sub find_module_by_name { my $found = shift()->_do_find_module(@_) or return; return $found->[0]; } # class method sub find_module_dir_by_name { my $found = shift()->_do_find_module(@_) or return; return $found->[1]; } # given a line of perl code, attempt to parse it if it looks like a # $VERSION assignment, returning sigil, full name, & package name sub _parse_version_expression { my $self = shift; my $line = shift; my( $sig, $var, $pkg ); if ( $line =~ $VERS_REGEXP ) { ( $sig, $var, $pkg ) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 ); if ( $pkg ) { $pkg = ($pkg eq '::') ? 'main' : $pkg; $pkg =~ s/::$//; } } return ( $sig, $var, $pkg ); } sub _parse_file { my $self = shift; my $filename = $self->{filename}; my $fh = IO::File->new( $filename ) or die( "Can't open '$filename': $!" ); $self->_parse_fh($fh); } sub _parse_fh { my ($self, $fh) = @_; my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 ); my( @pkgs, %vers, %pod, @pod ); my $pkg = 'main'; my $pod_sect = ''; my $pod_data = ''; while (defined( my $line = <$fh> )) { my $line_num = $.; chomp( $line ); next if $line =~ /^\s*#/; $in_pod = ($line =~ /^=(?!cut)/) ? 1 : ($line =~ /^=cut/) ? 0 : $in_pod; # Would be nice if we could also check $in_string or something too last if !$in_pod && $line =~ /^__(?:DATA|END)__$/; if ( $in_pod || $line =~ /^=cut/ ) { if ( $line =~ /^=head\d\s+(.+)\s*$/ ) { push( @pod, $1 ); if ( $self->{collect_pod} && length( $pod_data ) ) { $pod{$pod_sect} = $pod_data; $pod_data = ''; } $pod_sect = $1; } elsif ( $self->{collect_pod} ) { $pod_data .= "$line\n"; } } else { $pod_sect = ''; $pod_data = ''; # parse $line to see if it's a $VERSION declaration my( $vers_sig, $vers_fullname, $vers_pkg ) = $self->_parse_version_expression( $line ); if ( $line =~ $PKG_REGEXP ) { $pkg = $1; push( @pkgs, $pkg ) unless grep( $pkg eq $_, @pkgs ); $vers{$pkg} = undef unless exists( $vers{$pkg} ); $need_vers = 1; # VERSION defined with full package spec, i.e. $Module::VERSION } elsif ( $vers_fullname && $vers_pkg ) { push( @pkgs, $vers_pkg ) unless grep( $vers_pkg eq $_, @pkgs ); $need_vers = 0 if $vers_pkg eq $pkg; unless ( defined $vers{$vers_pkg} && length $vers{$vers_pkg} ) { $vers{$vers_pkg} = $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); } else { # Warn unless the user is using the "$VERSION = eval # $VERSION" idiom (though there are probably other idioms # that we should watch out for...) warn <<"EOM" unless $line =~ /=\s*eval/; Package '$vers_pkg' already declared with version '$vers{$vers_pkg}', ignoring subsequent declaration on line $line_num. EOM } # first non-comment line in undeclared package main is VERSION } elsif ( !exists($vers{main}) && $pkg eq 'main' && $vers_fullname ) { $need_vers = 0; my $v = $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); $vers{$pkg} = $v; push( @pkgs, 'main' ); # first non-comement line in undeclared packge defines package main } elsif ( !exists($vers{main}) && $pkg eq 'main' && $line =~ /\w+/ ) { $need_vers = 1; $vers{main} = ''; push( @pkgs, 'main' ); # only keep if this is the first $VERSION seen } elsif ( $vers_fullname && $need_vers ) { $need_vers = 0; my $v = $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); unless ( defined $vers{$pkg} && length $vers{$pkg} ) { $vers{$pkg} = $v; } else { warn <<"EOM"; Package '$pkg' already declared with version '$vers{$pkg}' ignoring new version '$v' on line $line_num. EOM } } } } if ( $self->{collect_pod} && length($pod_data) ) { $pod{$pod_sect} = $pod_data; } $self->{versions} = \%vers; $self->{packages} = \@pkgs; $self->{pod} = \%pod; $self->{pod_headings} = \@pod; } { my $pn = 0; sub _evaluate_version_line { my $self = shift; my( $sigil, $var, $line ) = @_; # Some of this code came from the ExtUtils:: hierarchy. # We compile into $vsub because 'use version' would cause # compiletime/runtime issues with local() my $vsub; $pn++; # everybody gets their own package my $eval = qq{BEGIN { q# Hide from _packages_inside() #; package Module::Build::ModuleInfo::_version::p$pn; use Module::Build::Version; no strict; local $sigil$var; \$$var=undef; \$vsub = sub { $line; \$$var }; }}; local $^W; # Try to get the $VERSION eval $eval; warn "Error evaling version line '$eval' in $self->{filename}: $@\n" if $@; (ref($vsub) eq 'CODE') or die "failed to build version sub for $self->{filename}"; my $result = eval { $vsub->() }; die "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n" if $@; # Bless it into our own version class $result = Module::Build::Version->new($result); return $result; } } ############################################################ # accessors sub name { $_[0]->{module} } sub filename { $_[0]->{filename} } sub packages_inside { @{$_[0]->{packages}} } sub pod_inside { @{$_[0]->{pod_headings}} } sub contains_pod { $#{$_[0]->{pod_headings}} } sub version { my $self = shift; my $mod = shift || $self->{module}; my $vers; if ( defined( $mod ) && length( $mod ) && exists( $self->{versions}{$mod} ) ) { return $self->{versions}{$mod}; } else { return undef; } } sub pod { my $self = shift; my $sect = shift; if ( defined( $sect ) && length( $sect ) && exists( $self->{pod}{$sect} ) ) { return $self->{pod}{$sect}; } else { return undef; } } 1; __END__ =head1 NAME ModuleInfo - Gather package and POD information from a perl module files =head1 DESCRIPTION =over 4 =item new_from_file($filename, collect_pod => 1) Construct a ModuleInfo object given the path to a file. Takes an optional arguement C which is a boolean that determines whether POD data is collected and stored for reference. POD data is not collected by default. POD headings are always collected. =item new_from_module($module, collect_pod => 1, inc => \@dirs) Construct a ModuleInfo object given a module or package name. In addition to accepting the C argument as described above, this method accepts a C arguemnt which is a reference to an array of of directories to search for the module. If none are given, the default is @INC. =item name() Returns the name of the package represented by this module. If there are more than one packages, it makes a best guess based on the filename. If it's a script (i.e. not a *.pm) the package name is 'main'. =item version($package) Returns the version as defined by the $VERSION variable for the package as returned by the C method if no arguments are given. If given the name of a package it will attempt to return the version of that package if it is specified in the file. =item filename() Returns the absolute path to the file. =item packages_inside() Returns a list of packages. =item pod_inside() Returns a list of POD sections. =item contains_pod() Returns true if there is any POD in the file. =item pod($section) Returns the POD data in the given section. =item find_module_by_name($module, \@dirs) Returns the path to a module given the module or package name. A list of directories can be passed in as an optional paramater, otherwise @INC is searched. Can be called as either an object or a class method. =item find_module_dir_by_name($module, \@dirs) Returns the entry in C<@dirs> (or C<@INC> by default) that contains the module C<$module>. A list of directories can be passed in as an optional paramater, otherwise @INC is searched. Can be called as either an object or a class method. =back =head1 AUTHOR Ken Williams , Randy W. Sims =head1 COPYRIGHT Copyright (c) 2001-2006 Ken Williams. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO perl(1), L(3) =cut EekBoek-2.02.04/inc/Module/Build/Config.pm0000444000076500007650000000212112165465617015625 0ustar jvjvpackage Module::Build::Config; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Config; sub new { my ($pack, %args) = @_; return bless { stack => {}, values => $args{values} || {}, }, $pack; } sub get { my ($self, $key) = @_; return $self->{values}{$key} if ref($self) && exists $self->{values}{$key}; return $Config{$key}; } sub set { my ($self, $key, $val) = @_; $self->{values}{$key} = $val; } sub push { my ($self, $key, $val) = @_; push @{$self->{stack}{$key}}, $self->{values}{$key} if exists $self->{values}{$key}; $self->{values}{$key} = $val; } sub pop { my ($self, $key) = @_; my $val = delete $self->{values}{$key}; if ( exists $self->{stack}{$key} ) { $self->{values}{$key} = pop @{$self->{stack}{$key}}; delete $self->{stack}{$key} unless @{$self->{stack}{$key}}; } return $val; } sub values_set { my $self = shift; return undef unless ref($self); return $self->{values}; } sub all_config { my $self = shift; my $v = ref($self) ? $self->{values} : {}; return {%Config, %$v}; } 1; EekBoek-2.02.04/inc/Module/Build/Platform/0000755000076500007650000000000012165465617015654 5ustar jvjvEekBoek-2.02.04/inc/Module/Build/Platform/Default.pm0000444000076500007650000000106212165465617017573 0ustar jvjvpackage Module::Build::Platform::Default; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); 1; __END__ =head1 NAME Module::Build::Platform::Default - Stub class for unknown platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C. Please see the L for the docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/darwin.pm0000444000076500007650000000151412165465617017475 0ustar jvjvpackage Module::Build::Platform::darwin; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Platform::Unix; use vars qw(@ISA); @ISA = qw(Module::Build::Platform::Unix); # This class isn't necessary anymore, but we can't delete it, because # some people might still have the old copy in their @INC, containing # code we don't want to execute, so we have to make sure an upgrade # will replace it with this empty subclass. 1; __END__ =head1 NAME Module::Build::Platform::darwin - Builder class for Mac OS X platform =head1 DESCRIPTION This module provides some routines very specific to the Mac OS X platform. Please see the L for the general docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/cygwin.pm0000444000076500007650000000120612165465617017507 0ustar jvjvpackage Module::Build::Platform::cygwin; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Platform::Unix; use vars qw(@ISA); @ISA = qw(Module::Build::Platform::Unix); sub manpage_separator { '.' } 1; __END__ =head1 NAME Module::Build::Platform::cygwin - Builder class for Cygwin platform =head1 DESCRIPTION This module provides some routines very specific to the cygwin platform. Please see the L for the general docs. =head1 AUTHOR Initial stub by Yitzchak Scott-Thoennes =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/Unix.pm0000444000076500007650000000323212165465617017133 0ustar jvjvpackage Module::Build::Platform::Unix; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); sub make_tarball { my $self = shift; $self->{args}{tar} ||= ['tar']; $self->{args}{gzip} ||= ['gzip']; $self->SUPER::make_tarball(@_); } sub is_executable { # We consider the owner bit to be authoritative on a file, because # -x will always return true if the user is root and *any* # executable bit is set. The -x test seems to try to answer the # question "can I execute this file", but I think we want "is this # file executable". my ($self, $file) = @_; return +(stat $file)[2] & 0100; } sub _startperl { "#! " . shift()->perl } sub _construct { my $self = shift()->SUPER::_construct(@_); # perl 5.8.1-RC[1-3] had some broken %Config entries, and # unfortunately Red Hat 9 shipped it like that. Fix 'em up here. my $c = $self->{config}; for (qw(siteman1 siteman3 vendorman1 vendorman3)) { $c->{"install${_}dir"} ||= $c->{"install${_}"}; } return $self; } sub _detildefy { my ($self, $value) = @_; $value =~ s[^~(\w[-\w]*)?(?=/|$)] # tilde with optional username [$1 ? ((getpwnam $1)[7] || "~$1") : ($ENV{HOME} || (getpwuid $>)[7]) ]ex; return $value; } 1; __END__ =head1 NAME Module::Build::Platform::Unix - Builder class for Unix platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C. Please see the L for the docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/VMS.pm0000444000076500007650000002202712165465617016660 0ustar jvjvpackage Module::Build::Platform::VMS; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); =head1 NAME Module::Build::Platform::VMS - Builder class for VMS platforms =head1 DESCRIPTION This module inherits from C and alters a few minor details of its functionality. Please see L for the general docs. =head2 Overridden Methods =over 4 =item _set_defaults Change $self->{build_script} to 'Build.com' so @Build works. =cut sub _set_defaults { my $self = shift; $self->SUPER::_set_defaults(@_); $self->{properties}{build_script} = 'Build.com'; } =item cull_args '@Build foo' on VMS will not preserve the case of 'foo'. Rather than forcing people to write '@Build "foo"' we'll dispatch case-insensitively. =cut sub cull_args { my $self = shift; my($action, $args) = $self->SUPER::cull_args(@_); my @possible_actions = grep { lc $_ eq lc $action } $self->known_actions; die "Ambiguous action '$action'. Could be one of @possible_actions" if @possible_actions > 1; return ($possible_actions[0], $args); } =item manpage_separator Use '__' instead of '::'. =cut sub manpage_separator { return '__'; } =item prefixify Prefixify taking into account VMS' filepath syntax. =cut # Translated from ExtUtils::MM_VMS::prefixify() sub _prefixify { my($self, $path, $sprefix, $type) = @_; my $rprefix = $self->prefix; $self->log_verbose(" prefixify $path from $sprefix to $rprefix\n"); # Translate $(PERLPREFIX) to a real path. $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix; $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix; $self->log_verbose(" rprefix translated to $rprefix\n". " sprefix translated to $sprefix\n"); if( length $path == 0 ) { $self->log_verbose(" no path to prefixify.\n") } elsif( !File::Spec->file_name_is_absolute($path) ) { $self->log_verbose(" path is relative, not prefixifying.\n"); } elsif( $sprefix eq $rprefix ) { $self->log_verbose(" no new prefix.\n"); } else { my($path_vol, $path_dirs) = File::Spec->splitpath( $path ); my $vms_prefix = $self->config('vms_prefix'); if( $path_vol eq $vms_prefix.':' ) { $self->log_verbose(" $vms_prefix: seen\n"); $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.}; $path = $self->_catprefix($rprefix, $path_dirs); } else { $self->log_verbose(" cannot prefixify.\n"); return $self->prefix_relpaths($self->installdirs, $type); } } $self->log_verbose(" now $path\n"); return $path; } =item _quote_args Command-line arguments (but not the command itself) must be quoted to ensure case preservation. =cut sub _quote_args { # Returns a string that can become [part of] a command line with # proper quoting so that the subprocess sees this same list of args, # or if we get a single arg that is an array reference, quote the # elements of it and return the reference. my ($self, @args) = @_; my $got_arrayref = (scalar(@args) == 1 && UNIVERSAL::isa($args[0], 'ARRAY')) ? 1 : 0; # Do not quote qualifiers that begin with '/'. map { if (!/^\//) { $_ =~ s/\"/""/g; # escape C<"> by doubling $_ = q(").$_.q("); } } ($got_arrayref ? @{$args[0]} : @args ); return $got_arrayref ? $args[0] : join(' ', @args); } =item have_forkpipe There is no native fork(), so some constructs depending on it are not available. =cut sub have_forkpipe { 0 } =item _backticks Override to ensure that we quote the arguments but not the command. =cut sub _backticks { # The command must not be quoted but the arguments to it must be. my ($self, @cmd) = @_; my $cmd = shift @cmd; my $args = $self->_quote_args(@cmd); return `$cmd $args`; } =item do_system Override to ensure that we quote the arguments but not the command. =cut sub do_system { # The command must not be quoted but the arguments to it must be. my ($self, @cmd) = @_; $self->log_info("@cmd\n"); my $cmd = shift @cmd; my $args = $self->_quote_args(@cmd); return !system("$cmd $args"); } =item _infer_xs_spec Inherit the standard version but tweak the library file name to be something Dynaloader can find. =cut sub _infer_xs_spec { my $self = shift; my $file = shift; my $spec = $self->SUPER::_infer_xs_spec($file); # Need to create with the same name as DynaLoader will load with. if (defined &DynaLoader::mod2fname) { my $file = $$spec{module_name} . '.' . $self->{config}->get('dlext'); $file =~ tr/:/_/; $file = DynaLoader::mod2fname([$file]); $$spec{lib_file} = File::Spec->catfile($$spec{archdir}, $file); } return $spec; } =item rscan_dir Inherit the standard version but remove dots at end of name. This may not be necessary if File::Find has been fixed or DECC$FILENAME_UNIX_REPORT is in effect. =cut sub rscan_dir { my ($self, $dir, $pattern) = @_; my $result = $self->SUPER::rscan_dir( $dir, $pattern ); for my $file (@$result) { $file =~ s/\.$//; } return $result; } =item dist_dir Inherit the standard version but replace embedded dots with underscores because a dot is the directory delimiter on VMS. =cut sub dist_dir { my $self = shift; my $dist_dir = $self->SUPER::dist_dir; $dist_dir =~ s/\./_/g; return $dist_dir; } =item man3page_name Inherit the standard version but chop the extra manpage delimiter off the front if there is one. The VMS version of splitdir('[.foo]') returns '', 'foo'. =cut sub man3page_name { my $self = shift; my $mpname = $self->SUPER::man3page_name( shift ); my $sep = $self->manpage_separator; $mpname =~ s/^$sep//; return $mpname; } =item expand_test_dir Inherit the standard version but relativize the paths as the native glob() doesn't do that for us. =cut sub expand_test_dir { my ($self, $dir) = @_; my @reldirs = $self->SUPER::expand_test_dir( $dir ); for my $eachdir (@reldirs) { my ($v,$d,$f) = File::Spec->splitpath( $eachdir ); my $reldir = File::Spec->abs2rel( File::Spec->catpath( $v, $d, '' ) ); $eachdir = File::Spec->catfile( $reldir, $f ); } return @reldirs; } =item _detildefy The home-grown glob() does not currently handle tildes, so provide limited support here. Expect only UNIX format file specifications for now. =cut sub _detildefy { my ($self, $arg) = @_; # Apparently double ~ are not translated. return $arg if ($arg =~ /^~~/); # Apparently ~ followed by whitespace are not translated. return $arg if ($arg =~ /^~ /); if ($arg =~ /^~/) { my $spec = $arg; # Remove the tilde $spec =~ s/^~//; # Remove any slash folloing the tilde if present. $spec =~ s#^/##; # break up the paths for the merge my $home = VMS::Filespec::unixify($ENV{HOME}); # Trivial case of just ~ by it self if ($spec eq '') { return $home; } my ($hvol, $hdir, $hfile) = File::Spec::Unix->splitpath($home); if ($hdir eq '') { # Someone has tampered with $ENV{HOME} # So hfile is probably the directory since this should be # a path. $hdir = $hfile; } my ($vol, $dir, $file) = File::Spec::Unix->splitpath($spec); my @hdirs = File::Spec::Unix->splitdir($hdir); my @dirs = File::Spec::Unix->splitdir($dir); my $newdirs; # Two cases of tilde handling if ($arg =~ m#^~/#) { # Simple case, just merge together $newdirs = File::Spec::Unix->catdir(@hdirs, @dirs); } else { # Complex case, need to add an updir - No delimiters my @backup = File::Spec::Unix->splitdir(File::Spec::Unix->updir); $newdirs = File::Spec::Unix->catdir(@hdirs, @backup, @dirs); } # Now put the two cases back together $arg = File::Spec::Unix->catpath($hvol, $newdirs, $file); } else { return $arg; } } =item find_perl_interpreter On VMS, $^X returns the fully qualified absolute path including version number. It's logically impossible to improve on it for getting the perl we're currently running, and attempting to manipulate it is usually lossy. =cut sub find_perl_interpreter { return $^X; } =item localize_file_path Convert the file path to the local syntax =cut sub localize_file_path { my ($self, $path) = @_; $path =~ s/\.\z//; return VMS::Filespec::vmsify($path); } =item localize_dir_path Convert the directory path to the local syntax =cut sub localize_dir_path { my ($self, $path) = @_; return VMS::Filespec::vmspath($path); } =back =head1 AUTHOR Michael G Schwern Ken Williams Craig A. Berry =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut 1; __END__ EekBoek-2.02.04/inc/Module/Build/Platform/os2.pm0000444000076500007650000000117112165465617016713 0ustar jvjvpackage Module::Build::Platform::os2; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Platform::Unix; use vars qw(@ISA); @ISA = qw(Module::Build::Platform::Unix); sub manpage_separator { '.' } sub have_forkpipe { 0 } 1; __END__ =head1 NAME Module::Build::Platform::os2 - Builder class for OS/2 platform =head1 DESCRIPTION This module provides some routines very specific to the OS/2 platform. Please see the L for the general docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/MPEiX.pm0000444000076500007650000000106012165465617017127 0ustar jvjvpackage Module::Build::Platform::MPEiX; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); 1; __END__ =head1 NAME Module::Build::Platform::MPEiX - Builder class for MPEiX platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C. Please see the L for the docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/Amiga.pm0000444000076500007650000000106012165465617017223 0ustar jvjvpackage Module::Build::Platform::Amiga; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); 1; __END__ =head1 NAME Module::Build::Platform::Amiga - Builder class for Amiga platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C. Please see the L for the docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/MacOS.pm0000444000076500007650000000703012165465617017152 0ustar jvjvpackage Module::Build::Platform::MacOS; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); use ExtUtils::Install; sub have_forkpipe { 0 } sub new { my $class = shift; my $self = $class->SUPER::new(@_); # $Config{sitelib} and $Config{sitearch} are, unfortunately, missing. foreach ('sitelib', 'sitearch') { $self->config($_ => $self->config("install$_")) unless $self->config($_); } # For some reason $Config{startperl} is filled with a bunch of crap. (my $sp = $self->config('startperl')) =~ s/.*Exit \{Status\}\s//; $self->config(startperl => $sp); return $self; } sub make_executable { my $self = shift; require MacPerl; foreach (@_) { MacPerl::SetFileInfo('McPL', 'TEXT', $_); } } sub dispatch { my $self = shift; if( !@_ and !@ARGV ) { require MacPerl; # What comes first in the action list. my @action_list = qw(build test install); my %actions = map {+($_, 1)} $self->known_actions; delete @actions{@action_list}; push @action_list, sort { $a cmp $b } keys %actions; my %toolserver = map {+$_ => 1} qw(test disttest diff testdb); foreach (@action_list) { $_ .= ' *' if $toolserver{$_}; } my $cmd = MacPerl::Pick("What build command? ('*' requires ToolServer)", @action_list); return unless defined $cmd; $cmd =~ s/ \*$//; $ARGV[0] = ($cmd); my $args = MacPerl::Ask('Any extra arguments? (ie. verbose=1)', ''); return unless defined $args; push @ARGV, $self->split_like_shell($args); } $self->SUPER::dispatch(@_); } sub ACTION_realclean { my $self = shift; chmod 0666, $self->{properties}{build_script}; $self->SUPER::ACTION_realclean; } # ExtUtils::Install has a hard-coded '.' directory in versions less # than 1.30. We use a sneaky trick to turn that into ':'. # # Note that we do it here in a cross-platform way, so this code could # actually go in Module::Build::Base. But we put it here to be less # intrusive for other platforms. sub ACTION_install { my $self = shift; return $self->SUPER::ACTION_install(@_) if eval {ExtUtils::Install->VERSION('1.30'); 1}; local $^W = 0; # Avoid a 'redefine' warning local *ExtUtils::Install::find = sub { my ($code, @dirs) = @_; @dirs = map { $_ eq '.' ? File::Spec->curdir : $_ } @dirs; return File::Find::find($code, @dirs); }; return $self->SUPER::ACTION_install(@_); } 1; __END__ =head1 NAME Module::Build::Platform::MacOS - Builder class for MacOS platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C and override a few methods. Please see L for the docs. =head2 Overriden Methods =over 4 =item new() MacPerl doesn't define $Config{sitelib} or $Config{sitearch} for some reason, but $Config{installsitelib} and $Config{installsitearch} are there. So we copy the install variables to the other location =item make_executable() On MacOS we set the file type and creator to MacPerl so it will run with a double-click. =item dispatch() Because there's no easy way to say "./Build test" on MacOS, if dispatch is called with no arguments and no @ARGV a dialog box will pop up asking what action to take and any extra arguments. Default action is "test". =item ACTION_realclean() Need to unlock the Build program before deleting. =back =head1 AUTHOR Michael G Schwern =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/aix.pm0000444000076500007650000000147412165465617016777 0ustar jvjvpackage Module::Build::Platform::aix; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Platform::Unix; use vars qw(@ISA); @ISA = qw(Module::Build::Platform::Unix); # This class isn't necessary anymore, but we can't delete it, because # some people might still have the old copy in their @INC, containing # code we don't want to execute, so we have to make sure an upgrade # will replace it with this empty subclass. 1; __END__ =head1 NAME Module::Build::Platform::aix - Builder class for AIX platform =head1 DESCRIPTION This module provides some routines very specific to the AIX platform. Please see the L for the general docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/EBCDIC.pm0000444000076500007650000000106312165465617017121 0ustar jvjvpackage Module::Build::Platform::EBCDIC; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); 1; __END__ =head1 NAME Module::Build::Platform::EBCDIC - Builder class for EBCDIC platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C. Please see the L for the docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/VOS.pm0000444000076500007650000000105212165465617016655 0ustar jvjvpackage Module::Build::Platform::VOS; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); 1; __END__ =head1 NAME Module::Build::Platform::VOS - Builder class for VOS platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C. Please see the L for the docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/Windows.pm0000444000076500007650000001720112165465617017643 0ustar jvjvpackage Module::Build::Platform::Windows; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Config; use File::Basename; use File::Spec; use IO::File; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); sub manpage_separator { return '.'; } sub have_forkpipe { 0 } sub _detildefy { my ($self, $value) = @_; $value =~ s,^~(?= [/\\] | $ ),$ENV{HOME},x if $ENV{HOME}; return $value; } sub ACTION_realclean { my ($self) = @_; $self->SUPER::ACTION_realclean(); my $basename = basename($0); $basename =~ s/(?:\.bat)?$//i; if ( $basename eq $self->build_script ) { if ( $self->build_bat ) { my $full_progname = $0; $full_progname =~ s/(?:\.bat)?$/.bat/i; # Vodoo required to have a batch file delete itself without error; # Syntax differs between 9x & NT: the later requires a null arg (???) require Win32; my $null_arg = (Win32::IsWinNT()) ? '""' : ''; my $cmd = qq(start $null_arg /min "\%comspec\%" /c del "$full_progname"); my $fh = IO::File->new(">> $basename.bat") or die "Can't create $basename.bat: $!"; print $fh $cmd; close $fh ; } else { $self->delete_filetree($self->build_script . '.bat'); } } } sub make_executable { my $self = shift; $self->SUPER::make_executable(@_); foreach my $script (@_) { # Native batch script if ( $script =~ /\.(bat|cmd)$/ ) { $self->SUPER::make_executable($script); next; # Perl script that needs to be wrapped in a batch script } else { my %opts = (); if ( $script eq $self->build_script ) { $opts{ntargs} = q(-x -S %0 --build_bat %*); $opts{otherargs} = q(-x -S "%0" --build_bat %1 %2 %3 %4 %5 %6 %7 %8 %9); } my $out = eval {$self->pl2bat(in => $script, update => 1, %opts)}; if ( $@ ) { $self->log_warn("WARNING: Unable to convert file '$script' to an executable script:\n$@"); } else { $self->SUPER::make_executable($out); } } } } # This routine was copied almost verbatim from the 'pl2bat' utility # distributed with perl. It requires too much vodoo with shell quoting # differences and shortcomings between the various flavors of Windows # to reliably shell out sub pl2bat { my $self = shift; my %opts = @_; # NOTE: %0 is already enclosed in doublequotes by cmd.exe, as appropriate $opts{ntargs} = '-x -S %0 %*' unless exists $opts{ntargs}; $opts{otherargs} = '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9' unless exists $opts{otherargs}; $opts{stripsuffix} = '/\\.plx?/' unless exists $opts{stripsuffix}; $opts{stripsuffix} = ($opts{stripsuffix} =~ m{^/([^/]*[^/\$]|)\$?/?$} ? $1 : "\Q$opts{stripsuffix}\E"); unless (exists $opts{out}) { $opts{out} = $opts{in}; $opts{out} =~ s/$opts{stripsuffix}$//oi; $opts{out} .= '.bat' unless $opts{in} =~ /\.bat$/i or $opts{in} =~ /^-$/; } my $head = <new("< $opts{in}") or die "Can't open $opts{in}: $!"; my @file = <$in>; $in->close; foreach my $line ( @file ) { $linenum++; if ( $line =~ /^:endofperl\b/ ) { if (!exists $opts{update}) { warn "$opts{in} has already been converted to a batch file!\n"; return; } $taildone++; } if ( not $linedone and $line =~ /^#!.*perl/ ) { if (exists $opts{update}) { $skiplines = $linenum - 1; $line .= "#line ".(1+$headlines)."\n"; } else { $line .= "#line ".($linenum+$headlines)."\n"; } $linedone++; } if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) { $line = ""; } } my $out = IO::File->new("> $opts{out}") or die "Can't open $opts{out}: $!"; print $out $head; print $out $start, ( $opts{usewarnings} ? " -w" : "" ), "\n#line ", ($headlines+1), "\n" unless $linedone; print $out @file[$skiplines..$#file]; print $out $tail unless $taildone; $out->close; return $opts{out}; } sub _quote_args { # Returns a string that can become [part of] a command line with # proper quoting so that the subprocess sees this same list of args. my ($self, @args) = @_; my @quoted; for (@args) { if ( /^[^\s*?!\$<>;|'"\[\]\{\}]+$/ ) { # Looks pretty safe push @quoted, $_; } else { # XXX this will obviously have to improve - is there already a # core module lying around that does proper quoting? s/"/\\"/g; push @quoted, qq("$_"); } } return join " ", @quoted; } sub split_like_shell { # As it turns out, Windows command-parsing is very different from # Unix command-parsing. Double-quotes mean different things, # backslashes don't necessarily mean escapes, and so on. So we # can't use Text::ParseWords::shellwords() to break a command string # into words. The algorithm below was bashed out by Randy and Ken # (mostly Randy), and there are a lot of regression tests, so we # should feel free to adjust if desired. (my $self, local $_) = @_; return @$_ if defined() && UNIVERSAL::isa($_, 'ARRAY'); my @argv; return @argv unless defined() && length(); my $arg = ''; my( $i, $quote_mode ) = ( 0, 0 ); while ( $i < length() ) { my $ch = substr( $_, $i , 1 ); my $next_ch = substr( $_, $i+1, 1 ); if ( $ch eq '\\' && $next_ch eq '"' ) { $arg .= '"'; $i++; } elsif ( $ch eq '\\' && $next_ch eq '\\' ) { $arg .= '\\'; $i++; } elsif ( $ch eq '"' && $next_ch eq '"' && $quote_mode ) { $quote_mode = !$quote_mode; $arg .= '"'; $i++; } elsif ( $ch eq '"' && $next_ch eq '"' && !$quote_mode && ( $i + 2 == length() || substr( $_, $i + 2, 1 ) eq ' ' ) ) { # for cases like: a"" => [ 'a' ] push( @argv, $arg ); $arg = ''; $i += 2; } elsif ( $ch eq '"' ) { $quote_mode = !$quote_mode; } elsif ( $ch eq ' ' && !$quote_mode ) { push( @argv, $arg ) if $arg; $arg = ''; ++$i while substr( $_, $i + 1, 1 ) eq ' '; } else { $arg .= $ch; } $i++; } push( @argv, $arg ) if defined( $arg ) && length( $arg ); return @argv; } # system(@cmd) does not like having double-quotes in it on Windows. # So we quote them and run it as a single command. sub do_system { my ($self, @cmd) = @_; my $cmd = $self->_quote_args(@cmd); my $status = system($cmd); if ($status and $! =~ /Argument list too long/i) { my $env_entries = ''; foreach (sort keys %ENV) { $env_entries .= "$_=>".length($ENV{$_})."; " } warn "'Argument list' was 'too long', env lengths are $env_entries"; } return !$status; } 1; __END__ =head1 NAME Module::Build::Platform::Windows - Builder class for Windows platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C and override a few methods. Please see L for the docs. =head1 AUTHOR Ken Williams , Randy W. Sims =head1 SEE ALSO perl(1), Module::Build(3) =cut EekBoek-2.02.04/inc/Module/Build/Platform/RiscOS.pm0000444000076500007650000000106312165465617017352 0ustar jvjvpackage Module::Build::Platform::RiscOS; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; use Module::Build::Base; use vars qw(@ISA); @ISA = qw(Module::Build::Base); 1; __END__ =head1 NAME Module::Build::Platform::RiscOS - Builder class for RiscOS platforms =head1 DESCRIPTION The sole purpose of this module is to inherit from C. Please see the L for the docs. =head1 AUTHOR Ken Williams =head1 SEE ALSO perl(1), Module::Build(3), ExtUtils::MakeMaker(3) =cut EekBoek-2.02.04/inc/Module/Build/Base.pm0000444000076500007650000037334612165465617015316 0ustar jvjv# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*- # vim:ts=8:sw=2:et:sta:sts=2 package Module::Build::Base; use strict; use vars qw($VERSION); $VERSION = '0.32'; $VERSION = eval $VERSION; BEGIN { require 5.00503 } use Carp; use Cwd (); use File::Copy (); use File::Find (); use File::Path (); use File::Basename (); use File::Spec 0.82 (); use File::Compare (); use Module::Build::Dumper (); use IO::File (); use Text::ParseWords (); use Module::Build::ModuleInfo; use Module::Build::Notes; use Module::Build::Config; #################### Constructors ########################### sub new { my $self = shift()->_construct(@_); $self->{invoked_action} = $self->{action} ||= 'Build_PL'; $self->cull_args(@ARGV); die "Too early to specify a build action '$self->{action}'. Do 'Build $self->{action}' instead.\n" if $self->{action} && $self->{action} ne 'Build_PL'; $self->check_manifest; $self->check_prereq; $self->check_autofeatures; $self->dist_name; $self->dist_version; $self->_set_install_paths; $self->_find_nested_builds; return $self; } sub resume { my $package = shift; my $self = $package->_construct(@_); $self->read_config; # If someone called Module::Build->current() or # Module::Build->new_from_context() and the correct class to use is # actually a *subclass* of Module::Build, we may need to load that # subclass here and re-delegate the resume() method to it. unless ( UNIVERSAL::isa($package, $self->build_class) ) { my $build_class = $self->build_class; my $config_dir = $self->config_dir || '_build'; my $build_lib = File::Spec->catdir( $config_dir, 'lib' ); unshift( @INC, $build_lib ); unless ( $build_class->can('new') ) { eval "require $build_class; 1" or die "Failed to re-load '$build_class': $@"; } return $build_class->resume(@_); } unless ($self->_perl_is_same($self->{properties}{perl})) { my $perl = $self->find_perl_interpreter; $self->log_warn(" * WARNING: Configuration was initially created with '$self->{properties}{perl}',\n". " but we are now using '$perl'.\n"); } $self->cull_args(@ARGV); unless ($self->allow_mb_mismatch) { my $mb_version = $Module::Build::VERSION; die(" * ERROR: Configuration was initially created with Module::Build version '$self->{properties}{mb_version}',\n". " but we are now using version '$mb_version'. Please re-run the Build.PL or Makefile.PL script,\n". " or use --allow_mb_mismatch 1 to skip this version check.\n") if $mb_version ne $self->{properties}{mb_version}; } $self->{invoked_action} = $self->{action} ||= 'build'; $self->_set_install_paths; return $self; } sub new_from_context { my ($package, %args) = @_; # XXX Read the META.yml and see whether we need to run the Build.PL? # Run the Build.PL. We use do() rather than run_perl_script() so # that it runs in this process rather than a subprocess, because we # need to make sure that the environment is the same during Build.PL # as it is during resume() (and thereafter). { local @ARGV = $package->unparse_args(\%args); do './Build.PL'; die $@ if $@; } return $package->resume; } sub current { # hmm, wonder what the right thing to do here is local @ARGV; return shift()->resume; } sub _construct { my ($package, %input) = @_; my $args = delete $input{args} || {}; my $config = delete $input{config} || {}; my $self = bless { args => {%$args}, config => Module::Build::Config->new(values => $config), properties => { base_dir => $package->cwd, mb_version => $Module::Build::VERSION, %input, }, phash => {}, }, $package; $self->_set_defaults; my ($p, $ph) = ($self->{properties}, $self->{phash}); foreach (qw(notes config_data features runtime_params cleanup auto_features)) { my $file = File::Spec->catfile($self->config_dir, $_); $ph->{$_} = Module::Build::Notes->new(file => $file); $ph->{$_}->restore if -e $file; if (exists $p->{$_}) { my $vals = delete $p->{$_}; while (my ($k, $v) = each %$vals) { $self->$_($k, $v); } } } # The following warning could be unnecessary if the user is running # an embedded perl, but there aren't too many of those around, and # embedded perls aren't usually used to install modules, and the # installation process sometimes needs to run external scripts # (e.g. to run tests). $p->{perl} = $self->find_perl_interpreter or $self->log_warn("Warning: Can't locate your perl binary"); my $blibdir = sub { File::Spec->catdir($p->{blib}, @_) }; $p->{bindoc_dirs} ||= [ $blibdir->("script") ]; $p->{libdoc_dirs} ||= [ $blibdir->("lib"), $blibdir->("arch") ]; $p->{dist_author} = [ $p->{dist_author} ] if defined $p->{dist_author} and not ref $p->{dist_author}; # Synonyms $p->{requires} = delete $p->{prereq} if defined $p->{prereq}; $p->{script_files} = delete $p->{scripts} if defined $p->{scripts}; # Convert to arrays for ('extra_compiler_flags', 'extra_linker_flags') { $p->{$_} = [ $self->split_like_shell($p->{$_}) ] if exists $p->{$_}; } $self->add_to_cleanup( @{delete $p->{add_to_cleanup}} ) if $p->{add_to_cleanup}; return $self; } ################## End constructors ######################### sub log_info { my $self = shift; print @_ unless(ref($self) and $self->quiet); } sub log_verbose { my $self = shift; $self->log_info(@_) if(ref($self) and $self->verbose); } sub log_warn { # Try to make our call stack invisible shift; if (@_ and $_[-1] !~ /\n$/) { my (undef, $file, $line) = caller(); warn @_, " at $file line $line.\n"; } else { warn @_; } } sub _set_install_paths { my $self = shift; my $c = $self->{config}; my $p = $self->{properties}; my @libstyle = $c->get('installstyle') ? File::Spec->splitdir($c->get('installstyle')) : qw(lib perl5); my $arch = $c->get('archname'); my $version = $c->get('version'); my $bindoc = $c->get('installman1dir') || undef; my $libdoc = $c->get('installman3dir') || undef; my $binhtml = $c->get('installhtml1dir') || $c->get('installhtmldir') || undef; my $libhtml = $c->get('installhtml3dir') || $c->get('installhtmldir') || undef; $p->{install_sets} = { core => { lib => $c->get('installprivlib'), arch => $c->get('installarchlib'), bin => $c->get('installbin'), script => $c->get('installscript'), bindoc => $bindoc, libdoc => $libdoc, binhtml => $binhtml, libhtml => $libhtml, }, site => { lib => $c->get('installsitelib'), arch => $c->get('installsitearch'), bin => $c->get('installsitebin') || $c->get('installbin'), script => $c->get('installsitescript') || $c->get('installsitebin') || $c->get('installscript'), bindoc => $c->get('installsiteman1dir') || $bindoc, libdoc => $c->get('installsiteman3dir') || $libdoc, binhtml => $c->get('installsitehtml1dir') || $binhtml, libhtml => $c->get('installsitehtml3dir') || $libhtml, }, vendor => { lib => $c->get('installvendorlib'), arch => $c->get('installvendorarch'), bin => $c->get('installvendorbin') || $c->get('installbin'), script => $c->get('installvendorscript') || $c->get('installvendorbin') || $c->get('installscript'), bindoc => $c->get('installvendorman1dir') || $bindoc, libdoc => $c->get('installvendorman3dir') || $libdoc, binhtml => $c->get('installvendorhtml1dir') || $binhtml, libhtml => $c->get('installvendorhtml3dir') || $libhtml, }, }; $p->{original_prefix} = { core => $c->get('installprefixexp') || $c->get('installprefix') || $c->get('prefixexp') || $c->get('prefix') || '', site => $c->get('siteprefixexp'), vendor => $c->get('usevendorprefix') ? $c->get('vendorprefixexp') : '', }; $p->{original_prefix}{site} ||= $p->{original_prefix}{core}; # Note: you might be tempted to use $Config{installstyle} here # instead of hard-coding lib/perl5, but that's been considered and # (at least for now) rejected. `perldoc Config` has some wisdom # about it. $p->{install_base_relpaths} = { lib => ['lib', 'perl5'], arch => ['lib', 'perl5', $arch], bin => ['bin'], script => ['bin'], bindoc => ['man', 'man1'], libdoc => ['man', 'man3'], binhtml => ['html'], libhtml => ['html'], }; $p->{prefix_relpaths} = { core => { lib => [@libstyle], arch => [@libstyle, $version, $arch], bin => ['bin'], script => ['bin'], bindoc => ['man', 'man1'], libdoc => ['man', 'man3'], binhtml => ['html'], libhtml => ['html'], }, vendor => { lib => [@libstyle], arch => [@libstyle, $version, $arch], bin => ['bin'], script => ['bin'], bindoc => ['man', 'man1'], libdoc => ['man', 'man3'], binhtml => ['html'], libhtml => ['html'], }, site => { lib => [@libstyle, 'site_perl'], arch => [@libstyle, 'site_perl', $version, $arch], bin => ['bin'], script => ['bin'], bindoc => ['man', 'man1'], libdoc => ['man', 'man3'], binhtml => ['html'], libhtml => ['html'], }, }; } sub _find_nested_builds { my $self = shift; my $r = $self->recurse_into or return; my ($file, @r); if (!ref($r) && $r eq 'auto') { local *DH; opendir DH, $self->base_dir or die "Can't scan directory " . $self->base_dir . " for nested builds: $!"; while (defined($file = readdir DH)) { my $subdir = File::Spec->catdir( $self->base_dir, $file ); next unless -d $subdir; push @r, $subdir if -e File::Spec->catfile( $subdir, 'Build.PL' ); } } $self->recurse_into(\@r); } sub cwd { return Cwd::cwd(); } sub _quote_args { # Returns a string that can become [part of] a command line with # proper quoting so that the subprocess sees this same list of args. my ($self, @args) = @_; my @quoted; for (@args) { if ( /^[^\s*?!\$<>;\\|'"\[\]\{\}]+$/ ) { # Looks pretty safe push @quoted, $_; } else { # XXX this will obviously have to improve - is there already a # core module lying around that does proper quoting? s/('+)/'"$1"'/g; push @quoted, qq('$_'); } } return join " ", @quoted; } sub _backticks { my ($self, @cmd) = @_; if ($self->have_forkpipe) { local *FH; my $pid = open *FH, "-|"; if ($pid) { return wantarray ? : join '', ; } else { die "Can't execute @cmd: $!\n" unless defined $pid; exec { $cmd[0] } @cmd; } } else { my $cmd = $self->_quote_args(@cmd); return `$cmd`; } } # Tells us whether the construct open($fh, '-|', @command) is # supported. It would probably be better to dynamically sense this. sub have_forkpipe { 1 } # Determine whether a given binary is the same as the perl # (configuration) that started this process. sub _perl_is_same { my ($self, $perl) = @_; my @cmd = ($perl); # When run from the perl core, @INC will include the directories # where perl is yet to be installed. We need to reference the # absolute path within the source distribution where it can find # it's Config.pm This also prevents us from picking up a Config.pm # from a different configuration that happens to be already # installed in @INC. if ($ENV{PERL_CORE}) { push @cmd, '-I' . File::Spec->catdir(File::Basename::dirname($perl), 'lib'); } push @cmd, qw(-MConfig=myconfig -e print -e myconfig); return $self->_backticks(@cmd) eq Config->myconfig; } # cache _discover_perl_interpreter() results { my $known_perl; sub find_perl_interpreter { my $self = shift; return $known_perl if defined($known_perl); return $known_perl = $self->_discover_perl_interpreter; } } # Returns the absolute path of the perl interperter used to invoke # this process. The path is derived from $^X or $Config{perlpath}. On # some platforms $^X contains the complete absolute path of the # interpreter, on other it may contain a relative path, or simply # 'perl'. This can also vary depending on whether a path was supplied # when perl was invoked. Additionally, the value in $^X may omit the # executable extension on platforms that use one. It's a fatal error # if the interpreter can't be found because it can result in undefined # behavior by routines that depend on it (generating errors or # invoking the wrong perl.) sub _discover_perl_interpreter { my $proto = shift; my $c = ref($proto) ? $proto->{config} : 'Module::Build::Config'; my $perl = $^X; my $perl_basename = File::Basename::basename($perl); my @potential_perls; # Try 1, Check $^X for absolute path push( @potential_perls, $perl ) if File::Spec->file_name_is_absolute($perl); # Try 2, Check $^X for a valid relative path my $abs_perl = File::Spec->rel2abs($perl); push( @potential_perls, $abs_perl ); # Try 3, Last ditch effort: These two option use hackery to try to locate # a suitable perl. The hack varies depending on whether we are running # from an installed perl or an uninstalled perl in the perl source dist. if ($ENV{PERL_CORE}) { # Try 3.A, If we are in a perl source tree, running an uninstalled # perl, we can keep moving up the directory tree until we find our # binary. We wouldn't do this under any other circumstances. # CBuilder is also in the core, so it should be available here require ExtUtils::CBuilder; my $perl_src = Cwd::realpath( ExtUtils::CBuilder->perl_src ); if ( defined($perl_src) && length($perl_src) ) { my $uninstperl = File::Spec->rel2abs(File::Spec->catfile( $perl_src, $perl_basename )); push( @potential_perls, $uninstperl ); } } else { # Try 3.B, First look in $Config{perlpath}, then search the user's # PATH. We do not want to do either if we are running from an # uninstalled perl in a perl source tree. push( @potential_perls, $c->get('perlpath') ); push( @potential_perls, map File::Spec->catfile($_, $perl_basename), File::Spec->path() ); } # Now that we've enumerated the potential perls, it's time to test # them to see if any of them match our configuration, returning the # absolute path of the first successful match. my $exe = $c->get('exe_ext'); foreach my $thisperl ( @potential_perls ) { if (defined $exe) { $thisperl .= $exe unless $thisperl =~ m/$exe$/i; } if ( -f $thisperl && $proto->_perl_is_same($thisperl) ) { return $thisperl; } } # We've tried all alternatives, and didn't find a perl that matches # our configuration. Throw an exception, and list alternatives we tried. my @paths = map File::Basename::dirname($_), @potential_perls; die "Can't locate the perl binary used to run this script " . "in (@paths)\n"; } sub _is_interactive { return -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ; # Pipe? } # NOTE this is a blocking operation if(-t STDIN) sub _is_unattended { my $self = shift; return $ENV{PERL_MM_USE_DEFAULT} || ( !$self->_is_interactive && eof STDIN ); } sub _readline { my $self = shift; return undef if $self->_is_unattended; my $answer = ; chomp $answer if defined $answer; return $answer; } sub prompt { my $self = shift; my $mess = shift or die "prompt() called without a prompt message"; # use a list to distinguish a default of undef() from no default my @def; @def = (shift) if @_; # use dispdef for output my @dispdef = scalar(@def) ? ('[', (defined($def[0]) ? $def[0] . ' ' : ''), ']') : (' ', ''); local $|=1; print "$mess ", @dispdef; if ( $self->_is_unattended && !@def ) { die <_readline(); if ( !defined($ans) # Ctrl-D or unattended or !length($ans) ) { # User hit return print "$dispdef[1]\n"; $ans = scalar(@def) ? $def[0] : ''; } return $ans; } sub y_n { my $self = shift; my ($mess, $def) = @_; die "y_n() called without a prompt message" unless $mess; die "Invalid default value: y_n() default must be 'y' or 'n'" if $def && $def !~ /^[yn]/i; my $answer; while (1) { # XXX Infinite or a large number followed by an exception ? $answer = $self->prompt(@_); return 1 if $answer =~ /^y/i; return 0 if $answer =~ /^n/i; local $|=1; print "Please answer 'y' or 'n'.\n"; } } sub current_action { shift->{action} } sub invoked_action { shift->{invoked_action} } sub notes { shift()->{phash}{notes}->access(@_) } sub config_data { shift()->{phash}{config_data}->access(@_) } sub runtime_params { shift->{phash}{runtime_params}->read( @_ ? shift : () ) } # Read-only sub auto_features { shift()->{phash}{auto_features}->access(@_) } sub features { my $self = shift; my $ph = $self->{phash}; if (@_) { my $key = shift; if ($ph->{features}->exists($key)) { return $ph->{features}->access($key, @_); } if (my $info = $ph->{auto_features}->access($key)) { my $failures = $self->prereq_failures($info); my $disabled = grep( /^(?:\w+_)?(?:requires|conflicts)$/, keys %$failures ) ? 1 : 0; return !$disabled; } return $ph->{features}->access($key, @_); } # No args - get the auto_features & overlay the regular features my %features; my %auto_features = $ph->{auto_features}->access(); while (my ($name, $info) = each %auto_features) { my $failures = $self->prereq_failures($info); my $disabled = grep( /^(?:\w+_)?(?:requires|conflicts)$/, keys %$failures ) ? 1 : 0; $features{$name} = $disabled ? 0 : 1; } %features = (%features, $ph->{features}->access()); return wantarray ? %features : \%features; } BEGIN { *feature = \&features } # Alias sub _mb_feature { my $self = shift; if (($self->module_name || '') eq 'Module::Build') { # We're building Module::Build itself, so ...::ConfigData isn't # valid, but $self->features() should be. return $self->feature(@_); } else { require Module::Build::ConfigData; return Module::Build::ConfigData->feature(@_); } } sub add_build_element { my ($self, $elem) = @_; my $elems = $self->build_elements; push @$elems, $elem unless grep { $_ eq $elem } @$elems; } sub ACTION_config_data { my $self = shift; return unless $self->has_config_data; my $module_name = $self->module_name or die "The config_data feature requires that 'module_name' be set"; my $notes_name = $module_name . '::ConfigData'; # TODO: Customize name ??? my $notes_pm = File::Spec->catfile($self->blib, 'lib', split /::/, "$notes_name.pm"); return if $self->up_to_date(['Build.PL', $self->config_file('config_data'), $self->config_file('features') ], $notes_pm); $self->log_info("Writing config notes to $notes_pm\n"); File::Path::mkpath(File::Basename::dirname($notes_pm)); Module::Build::Notes->write_config_data ( file => $notes_pm, module => $module_name, config_module => $notes_name, config_data => scalar $self->config_data, feature => scalar $self->{phash}{features}->access(), auto_features => scalar $self->auto_features, ); } ######################################################################## { # enclosing these lexicals -- TODO my %valid_properties = ( __PACKAGE__, {} ); my %additive_properties; sub _mb_classes { my $class = ref($_[0]) || $_[0]; return ($class, $class->mb_parents); } sub valid_property { my ($class, $prop) = @_; return grep exists( $valid_properties{$_}{$prop} ), $class->_mb_classes; } sub valid_properties { return keys %{ shift->valid_properties_defaults() }; } sub valid_properties_defaults { my %out; for (reverse shift->_mb_classes) { @out{ keys %{ $valid_properties{$_} } } = map { $_->() } values %{ $valid_properties{$_} }; } return \%out; } sub array_properties { for (shift->_mb_classes) { return @{$additive_properties{$_}->{ARRAY}} if exists $additive_properties{$_}->{ARRAY}; } } sub hash_properties { for (shift->_mb_classes) { return @{$additive_properties{$_}->{'HASH'}} if exists $additive_properties{$_}->{'HASH'}; } } sub add_property { my ($class, $property) = (shift, shift); die "Property '$property' already exists" if $class->valid_property($property); my %p = @_ == 1 ? ( default => shift ) : @_; my $type = ref $p{default}; $valid_properties{$class}{$property} = $type eq 'CODE' ? $p{default} : sub { $p{default} }; push @{$additive_properties{$class}->{$type}}, $property if $type; unless ($class->can($property)) { # TODO probably should put these in a util package my $sub = $type eq 'HASH' ? _make_hash_accessor($property, \%p) : _make_accessor($property, \%p); no strict 'refs'; *{"$class\::$property"} = $sub; } return $class; } sub property_error { my $self = shift; die 'ERROR: ', @_; } sub _set_defaults { my $self = shift; # Set the build class. $self->{properties}{build_class} ||= ref $self; # If there was no orig_dir, set to the same as base_dir $self->{properties}{orig_dir} ||= $self->{properties}{base_dir}; my $defaults = $self->valid_properties_defaults; foreach my $prop (keys %$defaults) { $self->{properties}{$prop} = $defaults->{$prop} unless exists $self->{properties}{$prop}; } # Copy defaults for arrays any arrays. for my $prop ($self->array_properties) { $self->{properties}{$prop} = [@{$defaults->{$prop}}] unless exists $self->{properties}{$prop}; } # Copy defaults for arrays any hashes. for my $prop ($self->hash_properties) { $self->{properties}{$prop} = {%{$defaults->{$prop}}} unless exists $self->{properties}{$prop}; } } } # end closure ######################################################################## sub _make_hash_accessor { my ($property, $p) = @_; my $check = $p->{check} || sub { 1 }; return sub { my $self = shift; # This is only here to deprecate the historic accident of calling # properties as class methods - I suspect it only happens in our # test suite. unless(ref($self)) { carp("\n$property not a class method (@_)"); return; } my $x = $self->{properties}; return $x->{$property} unless @_; my $prop = $x->{$property}; if ( defined $_[0] && !ref $_[0] ) { if ( @_ == 1 ) { return exists $prop->{$_[0]} ? $prop->{$_[0]} : undef; } elsif ( @_ % 2 == 0 ) { my %new = (%{ $prop }, @_); local $_ = \%new; $x->{$property} = \%new if $check->($self); return $x->{$property}; } else { die "Unexpected arguments for property '$property'\n"; } } else { die "Unexpected arguments for property '$property'\n" if defined $_[0] && ref $_[0] ne 'HASH'; local $_ = $_[0]; $x->{$property} = shift if $check->($self); } }; } ######################################################################## sub _make_accessor { my ($property, $p) = @_; my $check = $p->{check} || sub { 1 }; return sub { my $self = shift; # This is only here to deprecate the historic accident of calling # properties as class methods - I suspect it only happens in our # test suite. unless(ref($self)) { carp("\n$property not a class method (@_)"); return; } my $x = $self->{properties}; return $x->{$property} unless @_; local $_ = $_[0]; $x->{$property} = shift if $check->($self); return $x->{$property}; }; } ######################################################################## # Add the default properties. __PACKAGE__->add_property(blib => 'blib'); __PACKAGE__->add_property(build_class => 'Module::Build'); __PACKAGE__->add_property(build_elements => [qw(PL support pm xs pod script)]); __PACKAGE__->add_property(build_script => 'Build'); __PACKAGE__->add_property(build_bat => 0); __PACKAGE__->add_property(config_dir => '_build'); __PACKAGE__->add_property(include_dirs => []); __PACKAGE__->add_property(metafile => 'META.yml'); __PACKAGE__->add_property(recurse_into => []); __PACKAGE__->add_property(use_rcfile => 1); __PACKAGE__->add_property(create_packlist => 1); __PACKAGE__->add_property(allow_mb_mismatch => 0); __PACKAGE__->add_property(config => undef); __PACKAGE__->add_property(test_file_exts => ['.t']); __PACKAGE__->add_property(use_tap_harness => 0); __PACKAGE__->add_property(tap_harness_args => {}); __PACKAGE__->add_property( 'installdirs', default => 'site', check => sub { return 1 if /^(core|site|vendor)$/; return shift->property_error( $_ eq 'perl' ? 'Perhaps you meant installdirs to be "core" rather than "perl"?' : 'installdirs must be one of "core", "site", or "vendor"' ); return shift->property_error("Perhaps you meant 'core'?") if $_ eq 'perl'; return 0; }, ); { my $Is_ActivePerl = eval {require ActivePerl::DocTools}; __PACKAGE__->add_property(html_css => $Is_ActivePerl ? 'Active.css' : ''); } { my @prereq_action_types = qw(requires build_requires conflicts recommends); foreach my $type (@prereq_action_types) { __PACKAGE__->add_property($type => {}); } __PACKAGE__->add_property(prereq_action_types => \@prereq_action_types); } __PACKAGE__->add_property($_ => {}) for qw( get_options install_base_relpaths install_path install_sets meta_add meta_merge original_prefix prefix_relpaths configure_requires ); __PACKAGE__->add_property($_) for qw( PL_files autosplit base_dir bindoc_dirs c_source create_license create_makefile_pl create_readme debugger destdir dist_abstract dist_author dist_name dist_version dist_version_from extra_compiler_flags extra_linker_flags has_config_data install_base libdoc_dirs license magic_number mb_version module_name orig_dir perl pm_files pod_files pollute prefix program_name quiet recursive_test_files script_files scripts sign test_files verbose xs_files ); sub config { my $self = shift; my $c = ref($self) ? $self->{config} : 'Module::Build::Config'; return $c->all_config unless @_; my $key = shift; return $c->get($key) unless @_; my $val = shift; return $c->set($key => $val); } sub mb_parents { # Code borrowed from Class::ISA. my @in_stack = (shift); my %seen = ($in_stack[0] => 1); my ($current, @out); while (@in_stack) { next unless defined($current = shift @in_stack) && $current->isa('Module::Build::Base'); push @out, $current; next if $current eq 'Module::Build::Base'; no strict 'refs'; unshift @in_stack, map { my $c = $_; # copy, to avoid being destructive substr($c,0,2) = "main::" if substr($c,0,2) eq '::'; # Canonize the :: -> main::, ::foo -> main::foo thing. # Should I ever canonize the Foo'Bar = Foo::Bar thing? $seen{$c}++ ? () : $c; } @{"$current\::ISA"}; # I.e., if this class has any parents (at least, ones I've never seen # before), push them, in order, onto the stack of classes I need to # explore. } shift @out; return @out; } sub extra_linker_flags { shift->_list_accessor('extra_linker_flags', @_) } sub extra_compiler_flags { shift->_list_accessor('extra_compiler_flags', @_) } sub _list_accessor { (my $self, local $_) = (shift, shift); my $p = $self->{properties}; $p->{$_} = [@_] if @_; $p->{$_} = [] unless exists $p->{$_}; return ref($p->{$_}) ? $p->{$_} : [$p->{$_}]; } # XXX Problem - if Module::Build is loaded from a different directory, # it'll look for (and perhaps destroy/create) a _build directory. sub subclass { my ($pack, %opts) = @_; my $build_dir = '_build'; # XXX The _build directory is ostensibly settable by the user. Shouldn't hard-code here. $pack->delete_filetree($build_dir) if -e $build_dir; die "Must provide 'code' or 'class' option to subclass()\n" unless $opts{code} or $opts{class}; $opts{code} ||= ''; $opts{class} ||= 'MyModuleBuilder'; my $filename = File::Spec->catfile($build_dir, 'lib', split '::', $opts{class}) . '.pm'; my $filedir = File::Basename::dirname($filename); $pack->log_info("Creating custom builder $filename in $filedir\n"); File::Path::mkpath($filedir); die "Can't create directory $filedir: $!" unless -d $filedir; my $fh = IO::File->new("> $filename") or die "Can't create $filename: $!"; print $fh <catdir(File::Spec->rel2abs($build_dir), 'lib'); eval "use $opts{class}"; die $@ if $@; return $opts{class}; } sub dist_name { my $self = shift; my $p = $self->{properties}; return $p->{dist_name} if defined $p->{dist_name}; die "Can't determine distribution name, must supply either 'dist_name' or 'module_name' parameter" unless $self->module_name; ($p->{dist_name} = $self->module_name) =~ s/::/-/g; return $p->{dist_name}; } sub dist_version_from { my ($self) = @_; my $p = $self->{properties}; if ($self->module_name) { $p->{dist_version_from} ||= join( '/', 'lib', split(/::/, $self->module_name) ) . '.pm'; } return $p->{dist_version_from} || undef; } sub dist_version { my ($self) = @_; my $p = $self->{properties}; return $p->{dist_version} if defined $p->{dist_version}; if ( my $dist_version_from = $self->dist_version_from ) { my $version_from = File::Spec->catfile( split( qr{/}, $dist_version_from ) ); my $pm_info = Module::Build::ModuleInfo->new_from_file( $version_from ) or die "Can't find file $version_from to determine version"; $p->{dist_version} = $pm_info->version(); } die ("Can't determine distribution version, must supply either 'dist_version',\n". "'dist_version_from', or 'module_name' parameter") unless defined $p->{dist_version}; return $p->{dist_version}; } sub dist_author { shift->_pod_parse('author') } sub dist_abstract { shift->_pod_parse('abstract') } sub _pod_parse { my ($self, $part) = @_; my $p = $self->{properties}; my $member = "dist_$part"; return $p->{$member} if defined $p->{$member}; my $docfile = $self->_main_docfile or return; my $fh = IO::File->new($docfile) or return; require Module::Build::PodParser; my $parser = Module::Build::PodParser->new(fh => $fh); my $method = "get_$part"; return $p->{$member} = $parser->$method(); } sub version_from_file { # Method provided for backwards compatability return Module::Build::ModuleInfo->new_from_file($_[1])->version(); } sub find_module_by_name { # Method provided for backwards compatability return Module::Build::ModuleInfo->find_module_by_name(@_[1,2]); } sub add_to_cleanup { my $self = shift; my %files = map {$self->localize_file_path($_), 1} @_; $self->{phash}{cleanup}->write(\%files); } sub cleanup { my $self = shift; my $all = $self->{phash}{cleanup}->read; return keys %$all; } sub config_file { my $self = shift; return unless -d $self->config_dir; return File::Spec->catfile($self->config_dir, @_); } sub read_config { my ($self) = @_; my $file = $self->config_file('build_params') or die "Can't find 'build_params' in " . $self->config_dir; my $fh = IO::File->new($file) or die "Can't read '$file': $!"; my $ref = eval do {local $/; <$fh>}; die if $@; my $c; ($self->{args}, $c, $self->{properties}) = @$ref; $self->{config} = Module::Build::Config->new(values => $c); close $fh; } sub has_config_data { my $self = shift; return scalar grep $self->{phash}{$_}->has_data(), qw(config_data features auto_features); } sub _write_data { my ($self, $filename, $data) = @_; my $file = $self->config_file($filename); my $fh = IO::File->new("> $file") or die "Can't create '$file': $!"; unless (ref($data)) { # e.g. magicnum print $fh $data; return; } print {$fh} Module::Build::Dumper->_data_dump($data); } sub write_config { my ($self) = @_; File::Path::mkpath($self->{properties}{config_dir}); -d $self->{properties}{config_dir} or die "Can't mkdir $self->{properties}{config_dir}: $!"; my @items = @{ $self->prereq_action_types }; $self->_write_data('prereqs', { map { $_, $self->$_() } @items }); $self->_write_data('build_params', [$self->{args}, $self->{config}->values_set, $self->{properties}]); # Set a new magic number and write it to a file $self->_write_data('magicnum', $self->magic_number(int rand 1_000_000)); $self->{phash}{$_}->write() foreach qw(notes cleanup features auto_features config_data runtime_params); } sub check_autofeatures { my ($self) = @_; my $features = $self->auto_features; return unless %$features; $self->log_info("Checking features:\n"); # TODO refactor into ::Util my $longest = sub { my @str = @_ or croak("no strings given"); my @len = map({length($_)} @str); my $max = 0; my $longest; for my $i (0..$#len) { ($max, $longest) = ($len[$i], $str[$i]) if($len[$i] > $max); } return($longest); }; my $max_name_len = length($longest->(keys %$features)); while (my ($name, $info) = each %$features) { $self->log_info(" $name" . '.' x ($max_name_len - length($name) + 4)); if ( my $failures = $self->prereq_failures($info) ) { my $disabled = grep( /^(?:\w+_)?(?:requires|conflicts)$/, keys %$failures ) ? 1 : 0; $self->log_info( $disabled ? "disabled\n" : "enabled\n" ); my $log_text; while (my ($type, $prereqs) = each %$failures) { while (my ($module, $status) = each %$prereqs) { my $required = ($type =~ /^(?:\w+_)?(?:requires|conflicts)$/) ? 1 : 0; my $prefix = ($required) ? '-' : '*'; $log_text .= " $prefix $status->{message}\n"; } } $self->log_warn("$log_text") unless $self->quiet; } else { $self->log_info("enabled\n"); } } $self->log_warn("\n") unless $self->quiet; } sub prereq_failures { my ($self, $info) = @_; my @types = @{ $self->prereq_action_types }; $info ||= {map {$_, $self->$_()} @types}; my $out; foreach my $type (@types) { my $prereqs = $info->{$type}; while ( my ($modname, $spec) = each %$prereqs ) { my $status = $self->check_installed_status($modname, $spec); if ($type =~ /^(?:\w+_)?conflicts$/) { next if !$status->{ok}; $status->{conflicts} = delete $status->{need}; $status->{message} = "$modname ($status->{have}) conflicts with this distribution"; } elsif ($type =~ /^(?:\w+_)?recommends$/) { next if $status->{ok}; $status->{message} = (!ref($status->{have}) && $status->{have} eq '' ? "Optional prerequisite $modname is not installed" : "$modname ($status->{have}) is installed, but we prefer to have $spec"); } else { next if $status->{ok}; } $out->{$type}{$modname} = $status; } } return $out; } # returns a hash of defined prerequisites; i.e. only prereq types with values sub _enum_prereqs { my $self = shift; my %prereqs; foreach my $type ( @{ $self->prereq_action_types } ) { if ( $self->can( $type ) ) { my $prereq = $self->$type() || {}; $prereqs{$type} = $prereq if %$prereq; } } return \%prereqs; } sub check_prereq { my $self = shift; # If we have XS files, make sure we can process them. my $xs_files = $self->find_xs_files; if (keys %$xs_files && !$self->_mb_feature('C_support')) { $self->log_warn("Warning: this distribution contains XS files, ". "but Module::Build is not configured with C_support. ". "Please install ExtUtils::CBuilder to enable C_support.\n"); } # Check to see if there are any prereqs to check my $info = $self->_enum_prereqs; return 1 unless $info; $self->log_info("Checking prerequisites...\n"); my $failures = $self->prereq_failures($info); if ( $failures ) { while (my ($type, $prereqs) = each %$failures) { while (my ($module, $status) = each %$prereqs) { my $prefix = ($type =~ /^(?:\w+_)?recommends$/) ? '*' : '- ERROR:'; $self->log_warn(" $prefix $status->{message}\n"); } } $self->log_warn(<log_info("Looks good\n\n"); return 1; } } sub perl_version { my ($self) = @_; # Check the current perl interpreter # It's much more convenient to use $] here than $^V, but 'man # perlvar' says I'm not supposed to. Bloody tyrant. return $^V ? $self->perl_version_to_float(sprintf "%vd", $^V) : $]; } sub perl_version_to_float { my ($self, $version) = @_; return $version if grep( /\./, $version ) < 2; $version =~ s/\./../; $version =~ s/\.(\d+)/sprintf '%03d', $1/eg; return $version; } sub _parse_conditions { my ($self, $spec) = @_; if ($spec =~ /^\s*([\w.]+)\s*$/) { # A plain number, maybe with dots, letters, and underscores return (">= $spec"); } else { return split /\s*,\s*/, $spec; } } sub check_installed_status { my ($self, $modname, $spec) = @_; my %status = (need => $spec); if ($modname eq 'perl') { $status{have} = $self->perl_version; } elsif (eval { no strict; $status{have} = ${"${modname}::VERSION"} }) { # Don't try to load if it's already loaded } else { my $pm_info = Module::Build::ModuleInfo->new_from_module( $modname ); unless (defined( $pm_info )) { @status{ qw(have message) } = ('', "$modname is not installed"); return \%status; } $status{have} = $pm_info->version(); if ($spec and !defined($status{have})) { @status{ qw(have message) } = (undef, "Couldn't find a \$VERSION in prerequisite $modname"); return \%status; } } my @conditions = $self->_parse_conditions($spec); foreach (@conditions) { my ($op, $version) = /^\s* (<=?|>=?|==|!=) \s* ([\w.]+) \s*$/x or die "Invalid prerequisite condition '$_' for $modname"; $version = $self->perl_version_to_float($version) if $modname eq 'perl'; next if $op eq '>=' and !$version; # Module doesn't have to actually define a $VERSION unless ($self->compare_versions( $status{have}, $op, $version )) { $status{message} = "$modname ($status{have}) is installed, but we need version $op $version"; return \%status; } } $status{ok} = 1; return \%status; } sub compare_versions { my $self = shift; my ($v1, $op, $v2) = @_; $v1 = Module::Build::Version->new($v1) unless UNIVERSAL::isa($v1,'Module::Build::Version'); my $eval_str = "\$v1 $op \$v2"; my $result = eval $eval_str; $self->log_warn("error comparing versions: '$eval_str' $@") if $@; return $result; } # I wish I could set $! to a string, but I can't, so I use $@ sub check_installed_version { my ($self, $modname, $spec) = @_; my $status = $self->check_installed_status($modname, $spec); if ($status->{ok}) { return $status->{have} if $status->{have} and "$status->{have}" ne ''; return '0 but true'; } $@ = $status->{message}; return 0; } sub make_executable { # Perl's chmod() is mapped to useful things on various non-Unix # platforms, so we use it in the base class even though it looks # Unixish. my $self = shift; foreach (@_) { my $current_mode = (stat $_)[2]; chmod $current_mode | oct(111), $_; } } sub is_executable { # We assume this does the right thing on generic platforms, though # we do some other more specific stuff on Unixish platforms. my ($self, $file) = @_; return -x $file; } sub _startperl { shift()->config('startperl') } # Return any directories in @INC which are not in the default @INC for # this perl. For example, stuff passed in with -I or loaded with "use lib". sub _added_to_INC { my $self = shift; my %seen; $seen{$_}++ foreach $self->_default_INC; return grep !$seen{$_}++, @INC; } # Determine the default @INC for this Perl { my @default_inc; # Memoize sub _default_INC { my $self = shift; return @default_inc if @default_inc; local $ENV{PERL5LIB}; # this is not considered part of the default. my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter; my @inc = $self->_backticks($perl, '-le', 'print for @INC'); chomp @inc; return @default_inc = @inc; } } sub print_build_script { my ($self, $fh) = @_; my $build_package = $self->build_class; my $closedata=""; my %q = map {$_, $self->$_()} qw(config_dir base_dir); my $case_tolerant = 0+(File::Spec->can('case_tolerant') && File::Spec->case_tolerant); $q{base_dir} = uc $q{base_dir} if $case_tolerant; $q{base_dir} = Win32::GetShortPathName($q{base_dir}) if $self->is_windowsish; $q{magic_numfile} = $self->config_file('magicnum'); my @myINC = $self->_added_to_INC; for (@myINC, values %q) { $_ = File::Spec->canonpath( $_ ); s/([\\\'])/\\$1/g; } my $quoted_INC = join ",\n", map " '$_'", @myINC; my $shebang = $self->_startperl; my $magic_number = $self->magic_number; print $fh <; close FH; return \$filenum == $magic_number; } my \$progname; my \$orig_dir; BEGIN { \$^W = 1; # Use warnings \$progname = basename(\$0); \$orig_dir = Cwd::cwd(); my \$base_dir = '$q{base_dir}'; if (!magic_number_matches()) { unless (chdir(\$base_dir)) { die ("Couldn't chdir(\$base_dir), aborting\\n"); } unless (magic_number_matches()) { die ("Configuration seems to be out of date, please re-run 'perl Build.PL' again.\\n"); } } unshift \@INC, ( $quoted_INC ); } close(*DATA) unless eof(*DATA); # ensure no open handles to this script use $build_package; # Some platforms have problems setting \$^X in shebang contexts, fix it up here \$^X = Module::Build->find_perl_interpreter; if (-e 'Build.PL' and not $build_package->up_to_date('Build.PL', \$progname)) { warn "Warning: Build.PL has been altered. You may need to run 'perl Build.PL' again.\\n"; } # This should have just enough arguments to be able to bootstrap the rest. my \$build = $build_package->resume ( properties => { config_dir => '$q{config_dir}', orig_dir => \$orig_dir, }, ); \$build->dispatch; EOF } sub create_build_script { my ($self) = @_; $self->write_config; my ($build_script, $dist_name, $dist_version) = map $self->$_(), qw(build_script dist_name dist_version); if ( $self->delete_filetree($build_script) ) { $self->log_info("Removed previous script '$build_script'\n\n"); } $self->log_info("Creating new '$build_script' script for ", "'$dist_name' version '$dist_version'\n"); my $fh = IO::File->new(">$build_script") or die "Can't create '$build_script': $!"; $self->print_build_script($fh); close $fh; $self->make_executable($build_script); return 1; } sub check_manifest { my $self = shift; return unless -e 'MANIFEST'; # Stolen nearly verbatim from MakeMaker. But ExtUtils::Manifest # could easily be re-written into a modern Perl dialect. require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean. local ($^W, $ExtUtils::Manifest::Quiet) = (0,1); $self->log_info("Checking whether your kit is complete...\n"); if (my @missed = ExtUtils::Manifest::manicheck()) { $self->log_warn("WARNING: the following files are missing in your kit:\n", "\t", join("\n\t", @missed), "\n", "Please inform the author.\n\n"); } else { $self->log_info("Looks good\n\n"); } } sub dispatch { my $self = shift; local $self->{_completed_actions} = {}; if (@_) { my ($action, %p) = @_; my $args = $p{args} ? delete($p{args}) : {}; local $self->{invoked_action} = $action; local $self->{args} = {%{$self->{args}}, %$args}; local $self->{properties} = {%{$self->{properties}}, %p}; return $self->_call_action($action); } die "No build action specified" unless $self->{action}; local $self->{invoked_action} = $self->{action}; $self->_call_action($self->{action}); } sub _call_action { my ($self, $action) = @_; return if $self->{_completed_actions}{$action}++; local $self->{action} = $action; my $method = "ACTION_$action"; die "No action '$action' defined, try running the 'help' action.\n" unless $self->can($method); return $self->$method(); } # cuts the user-specified options out of the command-line args sub cull_options { my $self = shift; my (@argv) = @_; # XXX is it even valid to call this as a class method? return({}, @argv) unless(ref($self)); # no object my $specs = $self->get_options; return({}, @argv) unless($specs and %$specs); # no user options require Getopt::Long; # XXX Should we let Getopt::Long handle M::B's options? That would # be easy-ish to add to @specs right here, but wouldn't handle options # passed without "--" as M::B currently allows. We might be able to # get around this by setting the "prefix_pattern" Configure option. my @specs; my $args = {}; # Construct the specifications for GetOptions. while (my ($k, $v) = each %$specs) { # Throw an error if specs conflict with our own. die "Option specification '$k' conflicts with a " . ref $self . " option of the same name" if $self->valid_property($k); push @specs, $k . (defined $v->{type} ? $v->{type} : ''); push @specs, $v->{store} if exists $v->{store}; $args->{$k} = $v->{default} if exists $v->{default}; } local @ARGV = @argv; # No other way to dupe Getopt::Long # Get the options values and return them. # XXX Add option to allow users to set options? if ( @specs ) { Getopt::Long::Configure('pass_through'); Getopt::Long::GetOptions($args, @specs); } return $args, @ARGV; } sub unparse_args { my ($self, $args) = @_; my @out; while (my ($k, $v) = each %$args) { push @out, (UNIVERSAL::isa($v, 'HASH') ? map {+"--$k", "$_=$v->{$_}"} keys %$v : UNIVERSAL::isa($v, 'ARRAY') ? map {+"--$k", $_} @$v : ("--$k", $v)); } return @out; } sub args { my $self = shift; return wantarray ? %{ $self->{args} } : $self->{args} unless @_; my $key = shift; $self->{args}{$key} = shift if @_; return $self->{args}{$key}; } # allows select parameters (with underscores) to be spoken with dashes # when used as command-line options sub _translate_option { my $self = shift; my $opt = shift; (my $tr_opt = $opt) =~ tr/-/_/; return $tr_opt if grep $tr_opt =~ /^(?:no_?)?$_$/, qw( create_license create_makefile_pl create_readme extra_compiler_flags extra_linker_flags html_css install_base install_path meta_add meta_merge test_files use_rcfile use_tap_harness tap_harness_args ); # normalize only selected option names return $opt; } sub _read_arg { my ($self, $args, $key, $val) = @_; $key = $self->_translate_option($key); if ( exists $args->{$key} ) { $args->{$key} = [ $args->{$key} ] unless ref $args->{$key}; push @{$args->{$key}}, $val; } else { $args->{$key} = $val; } } # decide whether or not an option requires/has an opterand sub _optional_arg { my $self = shift; my $opt = shift; my $argv = shift; $opt = $self->_translate_option($opt); my @bool_opts = qw( build_bat create_license create_readme pollute quiet uninst use_rcfile verbose sign use_tap_harness ); # inverted boolean options; eg --noverbose or --no-verbose # converted to proper name & returned with false value (verbose, 0) if ( grep $opt =~ /^no[-_]?$_$/, @bool_opts ) { $opt =~ s/^no-?//; return ($opt, 0); } # non-boolean option; return option unchanged along with its argument return ($opt, shift(@$argv)) unless grep $_ eq $opt, @bool_opts; # we're punting a bit here, if an option appears followed by a digit # we take the digit as the argument for the option. If there is # nothing that looks like a digit, we pretend the option is a flag # that is being set and has no argument. my $arg = 1; $arg = shift(@$argv) if @$argv && $argv->[0] =~ /^\d+$/; return ($opt, $arg); } sub read_args { my $self = shift; (my $args, @_) = $self->cull_options(@_); my %args = %$args; my $opt_re = qr/[\w\-]+/; my ($action, @argv); while (@_) { local $_ = shift; if ( /^(?:--)?($opt_re)=(.*)$/ ) { $self->_read_arg(\%args, $1, $2); } elsif ( /^--($opt_re)$/ ) { my($opt, $arg) = $self->_optional_arg($1, \@_); $self->_read_arg(\%args, $opt, $arg); } elsif ( /^($opt_re)$/ and !defined($action)) { $action = $1; } else { push @argv, $_; } } $args{ARGV} = \@argv; for ('extra_compiler_flags', 'extra_linker_flags') { $args{$_} = [ $self->split_like_shell($args{$_}) ] if exists $args{$_}; } # Hashify these parameters for ($self->hash_properties, 'config') { next unless exists $args{$_}; my %hash; $args{$_} ||= []; $args{$_} = [ $args{$_} ] unless ref $args{$_}; foreach my $arg ( @{$args{$_}} ) { $arg =~ /(\w+)=(.*)/ or die "Malformed '$_' argument: '$arg' should be something like 'foo=bar'"; $hash{$1} = $2; } $args{$_} = \%hash; } # De-tilde-ify any path parameters for my $key (qw(prefix install_base destdir)) { next if !defined $args{$key}; $args{$key} = $self->_detildefy($args{$key}); } for my $key (qw(install_path)) { next if !defined $args{$key}; for my $subkey (keys %{$args{$key}}) { next if !defined $args{$key}{$subkey}; my $subkey_ext = $self->_detildefy($args{$key}{$subkey}); if ( $subkey eq 'html' ) { # translate for compatability $args{$key}{binhtml} = $subkey_ext; $args{$key}{libhtml} = $subkey_ext; } else { $args{$key}{$subkey} = $subkey_ext; } } } if ($args{makefile_env_macros}) { require Module::Build::Compat; %args = (%args, Module::Build::Compat->makefile_to_build_macros); } return \%args, $action; } # Default: do nothing. Overridden for Unix & Windows. sub _detildefy {} # merge Module::Build argument lists that have already been parsed # by read_args(). Takes two references to option hashes and merges # the contents, giving priority to the first. sub _merge_arglist { my( $self, $opts1, $opts2 ) = @_; my %new_opts = %$opts1; while (my ($key, $val) = each %$opts2) { if ( exists( $opts1->{$key} ) ) { if ( ref( $val ) eq 'HASH' ) { while (my ($k, $v) = each %$val) { $new_opts{$key}{$k} = $v unless exists( $opts1->{$key}{$k} ); } } } else { $new_opts{$key} = $val } } return %new_opts; } # Look for a home directory on various systems. sub _home_dir { my @home_dirs; push( @home_dirs, $ENV{HOME} ) if $ENV{HOME}; push( @home_dirs, File::Spec->catpath($ENV{HOMEDRIVE}, $ENV{HOMEPATH}, '') ) if $ENV{HOMEDRIVE} && $ENV{HOMEPATH}; my @other_home_envs = qw( USERPROFILE APPDATA WINDIR SYS$LOGIN ); push( @home_dirs, map $ENV{$_}, grep $ENV{$_}, @other_home_envs ); my @real_home_dirs = grep -d, @home_dirs; return wantarray ? @real_home_dirs : shift( @real_home_dirs ); } sub _find_user_config { my $self = shift; my $file = shift; foreach my $dir ( $self->_home_dir ) { my $path = File::Spec->catfile( $dir, $file ); return $path if -e $path; } return undef; } # read ~/.modulebuildrc returning global options '*' and # options specific to the currently executing $action. sub read_modulebuildrc { my( $self, $action ) = @_; return () unless $self->use_rcfile; my $modulebuildrc; if ( exists($ENV{MODULEBUILDRC}) && $ENV{MODULEBUILDRC} eq 'NONE' ) { return (); } elsif ( exists($ENV{MODULEBUILDRC}) && -e $ENV{MODULEBUILDRC} ) { $modulebuildrc = $ENV{MODULEBUILDRC}; } elsif ( exists($ENV{MODULEBUILDRC}) ) { $self->log_warn("WARNING: Can't find resource file " . "'$ENV{MODULEBUILDRC}' defined in environment.\n" . "No options loaded\n"); return (); } else { $modulebuildrc = $self->_find_user_config( '.modulebuildrc' ); return () unless $modulebuildrc; } my $fh = IO::File->new( $modulebuildrc ) or die "Can't open $modulebuildrc: $!"; my %options; my $buffer = ''; while (defined( my $line = <$fh> )) { chomp( $line ); $line =~ s/#.*$//; next unless length( $line ); if ( $line =~ /^\S/ ) { if ( $buffer ) { my( $action, $options ) = split( /\s+/, $buffer, 2 ); $options{$action} .= $options . ' '; $buffer = ''; } $buffer = $line; } else { $buffer .= $line; } } if ( $buffer ) { # anything left in $buffer ? my( $action, $options ) = split( /\s+/, $buffer, 2 ); $options{$action} .= $options . ' '; # merge if more than one line } my ($global_opts) = $self->read_args( $self->split_like_shell( $options{'*'} || '' ) ); my ($action_opts) = $self->read_args( $self->split_like_shell( $options{$action} || '' ) ); # specific $action options take priority over global options '*' return $self->_merge_arglist( $action_opts, $global_opts ); } # merge the relevant options in ~/.modulebuildrc into Module::Build's # option list where they do not conflict with commandline options. sub merge_modulebuildrc { my( $self, $action, %cmdline_opts ) = @_; my %rc_opts = $self->read_modulebuildrc( $action || $self->{action} || 'build' ); my %new_opts = $self->_merge_arglist( \%cmdline_opts, \%rc_opts ); $self->merge_args( $action, %new_opts ); } sub merge_args { my ($self, $action, %args) = @_; $self->{action} = $action if defined $action; my %additive = map { $_ => 1 } $self->hash_properties; # Extract our 'properties' from $cmd_args, the rest are put in 'args'. while (my ($key, $val) = each %args) { $self->{phash}{runtime_params}->access( $key => $val ) if $self->valid_property($key); if ($key eq 'config') { $self->config($_ => $val->{$_}) foreach keys %$val; } else { my $add_to = $additive{$key} ? $self->{properties}{$key} : $self->valid_property($key) ? $self->{properties} : $self->{args} ; if ($additive{$key}) { $add_to->{$_} = $val->{$_} foreach keys %$val; } else { $add_to->{$key} = $val; } } } } sub cull_args { my $self = shift; my ($args, $action) = $self->read_args(@_); $self->merge_args($action, %$args); $self->merge_modulebuildrc( $action, %$args ); } sub super_classes { my ($self, $class, $seen) = @_; $class ||= ref($self) || $self; $seen ||= {}; no strict 'refs'; my @super = grep {not $seen->{$_}++} $class, @{ $class . '::ISA' }; return @super, map {$self->super_classes($_,$seen)} @super; } sub known_actions { my ($self) = @_; my %actions; no strict 'refs'; foreach my $class ($self->super_classes) { foreach ( keys %{ $class . '::' } ) { $actions{$1}++ if /^ACTION_(\w+)/; } } return wantarray ? sort keys %actions : \%actions; } sub get_action_docs { my ($self, $action) = @_; my $actions = $self->known_actions; die "No known action '$action'" unless $actions->{$action}; my ($files_found, @docs) = (0); foreach my $class ($self->super_classes) { (my $file = $class) =~ s{::}{/}g; # NOTE: silently skipping relative paths if any chdir() happened $file = $INC{$file . '.pm'} or next; my $fh = IO::File->new("< $file") or next; $files_found++; # Code below modified from /usr/bin/perldoc # Skip to ACTIONS section local $_; while (<$fh>) { last if /^=head1 ACTIONS\s/; } # Look for our action and determine the style my $style; while (<$fh>) { last if /^=head1 /; # only item and head2 are allowed (3&4 are not in 5.005) if(/^=(item|head2)\s+\Q$action\E\b/) { $style = $1; push @docs, $_; last; } } $style or next; # not here # and the content if($style eq 'item') { my ($found, $inlist) = (0, 0); while (<$fh>) { if (/^=(item|back)/) { last unless $inlist; } push @docs, $_; ++$inlist if /^=over/; --$inlist if /^=back/; } } else { # head2 style # stop at anything equal or greater than the found level while (<$fh>) { last if(/^=(?:head[12]|cut)/); push @docs, $_; } } # TODO maybe disallow overriding just pod for an action # TODO and possibly: @docs and last; } unless ($files_found) { $@ = "Couldn't find any documentation to search"; return; } unless (@docs) { $@ = "Couldn't find any docs for action '$action'"; return; } return join '', @docs; } sub ACTION_prereq_report { my $self = shift; $self->log_info( $self->prereq_report ); } sub ACTION_prereq_data { my $self = shift; $self->log_info( Module::Build::Dumper->_data_dump( $self->prereq_data ) ); } sub prereq_data { my $self = shift; my @types = @{ $self->prereq_action_types }; my $info = { map { $_ => $self->$_() } grep { %{$self->$_()} } @types }; return $info; } sub prereq_report { my $self = shift; my $info = $self->prereq_data; my $output = ''; foreach my $type (keys %$info) { my $prereqs = $info->{$type}; $output .= "\n$type:\n"; my $mod_len = 2; my $ver_len = 4; my %mods; while ( my ($modname, $spec) = each %$prereqs ) { my $len = length $modname; $mod_len = $len if $len > $mod_len; $spec ||= '0'; $len = length $spec; $ver_len = $len if $len > $ver_len; my $mod = $self->check_installed_status($modname, $spec); $mod->{name} = $modname; $mod->{ok} ||= 0; $mod->{ok} = ! $mod->{ok} if $type =~ /^(\w+_)?conflicts$/; $mods{lc $modname} = $mod; } my $space = q{ } x ($mod_len - 3); my $vspace = q{ } x ($ver_len - 3); my $sline = q{-} x ($mod_len - 3); my $vline = q{-} x ($ver_len - 3); my $disposition = ($type =~ /^(\w+_)?conflicts$/) ? 'Clash' : 'Need'; $output .= " Module $space $disposition $vspace Have\n". " ------$sline+------$vline-+----------\n"; for my $k (sort keys %mods) { my $mod = $mods{$k}; my $space = q{ } x ($mod_len - length $k); my $vspace = q{ } x ($ver_len - length $mod->{need}); my $f = $mod->{ok} ? ' ' : '!'; $output .= " $f $mod->{name} $space $mod->{need} $vspace ". (defined($mod->{have}) ? $mod->{have} : "")."\n"; } } return $output; } sub ACTION_help { my ($self) = @_; my $actions = $self->known_actions; if (@{$self->{args}{ARGV}}) { my $msg = eval {$self->get_action_docs($self->{args}{ARGV}[0], $actions)}; print $@ ? "$@\n" : $msg; return; } print < arg1=value arg2=value ... Example: $0 test verbose=1 Actions defined: EOF print $self->_action_listing($actions); print "\nRun `Build help ` for details on an individual action.\n"; print "See `perldoc Module::Build` for complete documentation.\n"; } sub _action_listing { my ($self, $actions) = @_; # Flow down columns, not across rows my @actions = sort keys %$actions; @actions = map $actions[($_ + ($_ % 2) * @actions) / 2], 0..$#actions; my $out = ''; while (my ($one, $two) = splice @actions, 0, 2) { $out .= sprintf(" %-12s %-12s\n", $one, $two||''); } return $out; } sub ACTION_retest { my ($self) = @_; # Protect others against our @INC changes local @INC = @INC; # Filter out nonsensical @INC entries - some versions of # Test::Harness will really explode the number of entries here @INC = grep {ref() || -d} @INC if @INC > 100; $self->do_tests; } sub ACTION_testall { my ($self) = @_; my @types; for my $action (grep { $_ ne 'all' } $self->get_test_types) { # XXX We can't just dispatch because we get multiple summaries but # we'll need to dispatch to support custom setup/teardown in the # action. To support that, we'll need to call something besides # Harness::runtests() because we'll need to collect the results in # parts, then run the summary. push(@types, $action); #$self->_call_action( "test$action" ); } $self->generic_test(types => ['default', @types]); } sub get_test_types { my ($self) = @_; my $t = $self->{properties}->{test_types}; return ( defined $t ? ( keys %$t ) : () ); } sub ACTION_test { my ($self) = @_; $self->generic_test(type => 'default'); } sub generic_test { my $self = shift; (@_ % 2) and croak('Odd number of elements in argument hash'); my %args = @_; my $p = $self->{properties}; my @types = ( (exists($args{type}) ? $args{type} : ()), (exists($args{types}) ? @{$args{types}} : ()), ); @types or croak "need some types of tests to check"; my %test_types = ( default => $p->{test_file_exts}, (defined($p->{test_types}) ? %{$p->{test_types}} : ()), ); for my $type (@types) { croak "$type not defined in test_types!" unless defined $test_types{ $type }; } # we use local here because it ends up two method calls deep local $p->{test_file_exts} = [ map { ref $_ ? @$_ : $_ } @test_types{@types} ]; $self->depends_on('code'); # Protect others against our @INC changes local @INC = @INC; # Make sure we test the module in blib/ unshift @INC, (File::Spec->catdir($p->{base_dir}, $self->blib, 'lib'), File::Spec->catdir($p->{base_dir}, $self->blib, 'arch')); # Filter out nonsensical @INC entries - some versions of # Test::Harness will really explode the number of entries here @INC = grep {ref() || -d} @INC if @INC > 100; $self->do_tests; } sub do_tests { my $self = shift; my $tests = $self->find_test_files; if(@$tests) { my $args = $self->tap_harness_args; if($self->use_tap_harness or ($args and %$args)) { $self->run_tap_harness($tests); } else { $self->run_test_harness($tests); } } else { $self->log_info("No tests defined.\n"); } $self->run_visual_script; } sub run_tap_harness { my ($self, $tests) = @_; require TAP::Harness; # TODO allow the test @INC to be set via our API? TAP::Harness->new({ lib => [@INC], verbosity => $self->{properties}{verbose}, switches => [ $self->harness_switches ], %{ $self->tap_harness_args }, })->runtests(@$tests); } sub run_test_harness { my ($self, $tests) = @_; require Test::Harness; my $p = $self->{properties}; my @harness_switches = $self->harness_switches; # Work around a Test::Harness bug that loses the particular perl # we're running under. $self->perl is trustworthy, but $^X isn't. local $^X = $self->perl; # Do everything in our power to work with all versions of Test::Harness local $Test::Harness::switches = join ' ', grep defined, $Test::Harness::switches, @harness_switches; local $Test::Harness::Switches = join ' ', grep defined, $Test::Harness::Switches, @harness_switches; local $ENV{HARNESS_PERL_SWITCHES} = join ' ', grep defined, $ENV{HARNESS_PERL_SWITCHES}, @harness_switches; $Test::Harness::switches = undef unless length $Test::Harness::switches; $Test::Harness::Switches = undef unless length $Test::Harness::Switches; delete $ENV{HARNESS_PERL_SWITCHES} unless length $ENV{HARNESS_PERL_SWITCHES}; local ($Test::Harness::verbose, $Test::Harness::Verbose, $ENV{TEST_VERBOSE}, $ENV{HARNESS_VERBOSE}) = ($p->{verbose} || 0) x 4; Test::Harness::runtests(@$tests); } sub run_visual_script { my $self = shift; # This will get run and the user will see the output. It doesn't # emit Test::Harness-style output. $self->run_perl_script('visual.pl', '-Mblib='.$self->blib) if -e 'visual.pl'; } sub harness_switches { shift->{properties}{debugger} ? qw(-w -d) : (); } sub test_files { my $self = shift; my $p = $self->{properties}; if (@_) { return $p->{test_files} = (@_ == 1 ? shift : [@_]); } return $self->find_test_files; } sub expand_test_dir { my ($self, $dir) = @_; my $exts = $self->{properties}{test_file_exts}; return sort map { @{$self->rscan_dir($dir, qr{^[^.].*\Q$_\E$})} } @$exts if $self->recursive_test_files; return sort map { glob File::Spec->catfile($dir, "*$_") } @$exts; } sub ACTION_testdb { my ($self) = @_; local $self->{properties}{debugger} = 1; $self->depends_on('test'); } sub ACTION_testcover { my ($self) = @_; unless (Module::Build::ModuleInfo->find_module_by_name('Devel::Cover')) { warn("Cannot run testcover action unless Devel::Cover is installed.\n"); return; } $self->add_to_cleanup('coverage', 'cover_db'); $self->depends_on('code'); # See whether any of the *.pm files have changed since last time # testcover was run. If so, start over. if (-e 'cover_db') { my $pm_files = $self->rscan_dir (File::Spec->catdir($self->blib, 'lib'), file_qr('\.pm$') ); my $cover_files = $self->rscan_dir('cover_db', sub {-f $_ and not /\.html$/}); $self->do_system(qw(cover -delete)) unless $self->up_to_date($pm_files, $cover_files) && $self->up_to_date($self->test_files, $cover_files); } local $Test::Harness::switches = local $Test::Harness::Switches = local $ENV{HARNESS_PERL_SWITCHES} = "-MDevel::Cover"; $self->depends_on('test'); $self->do_system('cover'); } sub ACTION_code { my ($self) = @_; # All installable stuff gets created in blib/ . # Create blib/arch to keep blib.pm happy my $blib = $self->blib; $self->add_to_cleanup($blib); File::Path::mkpath( File::Spec->catdir($blib, 'arch') ); if (my $split = $self->autosplit) { $self->autosplit_file($_, $blib) for ref($split) ? @$split : ($split); } foreach my $element (@{$self->build_elements}) { my $method = "process_${element}_files"; $method = "process_files_by_extension" unless $self->can($method); $self->$method($element); } $self->depends_on('config_data'); } sub ACTION_build { my $self = shift; $self->depends_on('code'); $self->depends_on('docs'); } sub process_files_by_extension { my ($self, $ext) = @_; my $method = "find_${ext}_files"; my $files = $self->can($method) ? $self->$method() : $self->_find_file_by_type($ext, 'lib'); while (my ($file, $dest) = each %$files) { $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest) ); } } sub process_support_files { my $self = shift; my $p = $self->{properties}; return unless $p->{c_source}; push @{$p->{include_dirs}}, $p->{c_source}; my $files = $self->rscan_dir($p->{c_source}, file_qr('\.c(pp)?$')); foreach my $file (@$files) { push @{$p->{objects}}, $self->compile_c($file); } } sub process_PL_files { my ($self) = @_; my $files = $self->find_PL_files; while (my ($file, $to) = each %$files) { unless ($self->up_to_date( $file, $to )) { $self->run_perl_script($file, [], [@$to]) or die "$file failed"; $self->add_to_cleanup(@$to); } } } sub process_xs_files { my $self = shift; my $files = $self->find_xs_files; while (my ($from, $to) = each %$files) { unless ($from eq $to) { $self->add_to_cleanup($to); $self->copy_if_modified( from => $from, to => $to ); } $self->process_xs($to); } } sub process_pod_files { shift()->process_files_by_extension(shift()) } sub process_pm_files { shift()->process_files_by_extension(shift()) } sub process_script_files { my $self = shift; my $files = $self->find_script_files; return unless keys %$files; my $script_dir = File::Spec->catdir($self->blib, 'script'); File::Path::mkpath( $script_dir ); foreach my $file (keys %$files) { my $result = $self->copy_if_modified($file, $script_dir, 'flatten') or next; $self->fix_shebang_line($result) unless $self->is_vmsish; $self->make_executable($result); } } sub find_PL_files { my $self = shift; if (my $files = $self->{properties}{PL_files}) { # 'PL_files' is given as a Unix file spec, so we localize_file_path(). if (UNIVERSAL::isa($files, 'ARRAY')) { return { map {$_, [/^(.*)\.PL$/]} map $self->localize_file_path($_), @$files }; } elsif (UNIVERSAL::isa($files, 'HASH')) { my %out; while (my ($file, $to) = each %$files) { $out{ $self->localize_file_path($file) } = [ map $self->localize_file_path($_), ref $to ? @$to : ($to) ]; } return \%out; } else { die "'PL_files' must be a hash reference or array reference"; } } return unless -d 'lib'; return { map {$_, [/^(.*)\.PL$/i ]} @{ $self->rscan_dir('lib', file_qr('\.PL$')) } }; } sub find_pm_files { shift->_find_file_by_type('pm', 'lib') } sub find_pod_files { shift->_find_file_by_type('pod', 'lib') } sub find_xs_files { shift->_find_file_by_type('xs', 'lib') } sub find_script_files { my $self = shift; if (my $files = $self->script_files) { # Always given as a Unix file spec. Values in the hash are # meaningless, but we preserve if present. return { map {$self->localize_file_path($_), $files->{$_}} keys %$files }; } # No default location for script files return {}; } sub find_test_files { my $self = shift; my $p = $self->{properties}; if (my $files = $p->{test_files}) { $files = [keys %$files] if UNIVERSAL::isa($files, 'HASH'); $files = [map { -d $_ ? $self->expand_test_dir($_) : $_ } map glob, $self->split_like_shell($files)]; # Always given as a Unix file spec. return [ map $self->localize_file_path($_), @$files ]; } else { # Find all possible tests in t/ or test.pl my @tests; push @tests, 'test.pl' if -e 'test.pl'; push @tests, $self->expand_test_dir('t') if -e 't' and -d _; return \@tests; } } sub _find_file_by_type { my ($self, $type, $dir) = @_; if (my $files = $self->{properties}{"${type}_files"}) { # Always given as a Unix file spec return { map $self->localize_file_path($_), %$files }; } return {} unless -d $dir; return { map {$_, $_} map $self->localize_file_path($_), grep !/\.\#/, @{ $self->rscan_dir($dir, file_qr("\\.$type\$")) } }; } sub localize_file_path { my ($self, $path) = @_; return File::Spec->catfile( split m{/}, $path ); } sub localize_dir_path { my ($self, $path) = @_; return File::Spec->catdir( split m{/}, $path ); } sub fix_shebang_line { # Adapted from fixin() in ExtUtils::MM_Unix 1.35 my ($self, @files) = @_; my $c = ref($self) ? $self->{config} : 'Module::Build::Config'; my ($does_shbang) = $c->get('sharpbang') =~ /^\s*\#\!/; for my $file (@files) { my $FIXIN = IO::File->new($file) or die "Can't process '$file': $!"; local $/ = "\n"; chomp(my $line = <$FIXIN>); next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file. my ($cmd, $arg) = (split(' ', $line, 2), ''); next unless $cmd =~ /perl/i; my $interpreter = $self->{properties}{perl}; $self->log_verbose("Changing sharpbang in $file to $interpreter"); my $shb = ''; $shb .= $c->get('sharpbang')."$interpreter $arg\n" if $does_shbang; # I'm not smart enough to know the ramifications of changing the # embedded newlines here to \n, so I leave 'em in. $shb .= qq{ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}' if 0; # not running under some shell } unless $self->is_windowsish; # this won't work on win32, so don't my $FIXOUT = IO::File->new(">$file.new") or die "Can't create new $file: $!\n"; # Print out the new #! line (or equivalent). local $\; undef $/; # Was localized above print $FIXOUT $shb, <$FIXIN>; close $FIXIN; close $FIXOUT; rename($file, "$file.bak") or die "Can't rename $file to $file.bak: $!"; rename("$file.new", $file) or die "Can't rename $file.new to $file: $!"; $self->delete_filetree("$file.bak") or $self->log_warn("Couldn't clean up $file.bak, leaving it there"); $self->do_system($c->get('eunicefix'), $file) if $c->get('eunicefix') ne ':'; } } sub ACTION_testpod { my $self = shift; $self->depends_on('docs'); eval q{use Test::Pod 0.95; 1} or die "The 'testpod' action requires Test::Pod version 0.95"; my @files = sort keys %{$self->_find_pods($self->libdoc_dirs)}, keys %{$self->_find_pods ($self->bindoc_dirs, exclude => [ file_qr('\.bat$') ])} or die "Couldn't find any POD files to test\n"; { package Module::Build::PodTester; # Don't want to pollute the main namespace Test::Pod->import( tests => scalar @files ); pod_file_ok($_) foreach @files; } } sub ACTION_testpodcoverage { my $self = shift; $self->depends_on('docs'); eval q{use Test::Pod::Coverage 1.00; 1} or die "The 'testpodcoverage' action requires ", "Test::Pod::Coverage version 1.00"; # TODO this needs test coverage! # XXX work-around a bug in Test::Pod::Coverage previous to v1.09 # Make sure we test the module in blib/ local @INC = @INC; my $p = $self->{properties}; unshift(@INC, # XXX any reason to include arch? File::Spec->catdir($p->{base_dir}, $self->blib, 'lib'), #File::Spec->catdir($p->{base_dir}, $self->blib, 'arch') ); all_pod_coverage_ok(); } sub ACTION_docs { my $self = shift; $self->depends_on('code'); $self->depends_on('manpages', 'html'); } # Given a file type, will return true if the file type would normally # be installed when neither install-base nor prefix has been set. # I.e. it will be true only if the path is set from Config.pm or # set explicitly by the user via install-path. sub _is_default_installable { my $self = shift; my $type = shift; return ( $self->install_destination($type) && ( $self->install_path($type) || $self->install_sets($self->installdirs)->{$type} ) ) ? 1 : 0; } sub ACTION_manpages { my $self = shift; return unless $self->_mb_feature('manpage_support'); $self->depends_on('code'); foreach my $type ( qw(bin lib) ) { my $files = $self->_find_pods( $self->{properties}{"${type}doc_dirs"}, exclude => [ file_qr('\.bat$') ] ); next unless %$files; my $sub = $self->can("manify_${type}_pods"); next unless defined( $sub ); if ( $self->invoked_action eq 'manpages' ) { $self->$sub(); } elsif ( $self->_is_default_installable("${type}doc") ) { $self->$sub(); } } } sub manify_bin_pods { my $self = shift; my $files = $self->_find_pods( $self->{properties}{bindoc_dirs}, exclude => [ file_qr('\.bat$') ] ); return unless keys %$files; my $mandir = File::Spec->catdir( $self->blib, 'bindoc' ); File::Path::mkpath( $mandir, 0, oct(777) ); require Pod::Man; foreach my $file (keys %$files) { # Pod::Simple based parsers only support one document per instance. # This is expected to change in a future version (Pod::Simple > 3.03). my $parser = Pod::Man->new( section => 1 ); # binaries go in section 1 my $manpage = $self->man1page_name( $file ) . '.' . $self->config( 'man1ext' ); my $outfile = File::Spec->catfile($mandir, $manpage); next if $self->up_to_date( $file, $outfile ); $self->log_info("Manifying $file -> $outfile\n"); $parser->parse_from_file( $file, $outfile ); $files->{$file} = $outfile; } } sub manify_lib_pods { my $self = shift; my $files = $self->_find_pods($self->{properties}{libdoc_dirs}); return unless keys %$files; my $mandir = File::Spec->catdir( $self->blib, 'libdoc' ); File::Path::mkpath( $mandir, 0, oct(777) ); require Pod::Man; while (my ($file, $relfile) = each %$files) { # Pod::Simple based parsers only support one document per instance. # This is expected to change in a future version (Pod::Simple > 3.03). my $parser = Pod::Man->new( section => 3 ); # libraries go in section 3 my $manpage = $self->man3page_name( $relfile ) . '.' . $self->config( 'man3ext' ); my $outfile = File::Spec->catfile( $mandir, $manpage); next if $self->up_to_date( $file, $outfile ); $self->log_info("Manifying $file -> $outfile\n"); $parser->parse_from_file( $file, $outfile ); $files->{$file} = $outfile; } } sub _find_pods { my ($self, $dirs, %args) = @_; my %files; foreach my $spec (@$dirs) { my $dir = $self->localize_dir_path($spec); next unless -e $dir; FILE: foreach my $file ( @{ $self->rscan_dir( $dir ) } ) { foreach my $regexp ( @{ $args{exclude} } ) { next FILE if $file =~ $regexp; } $files{$file} = File::Spec->abs2rel($file, $dir) if $self->contains_pod( $file ) } } return \%files; } sub contains_pod { my ($self, $file) = @_; return '' unless -T $file; # Only look at text files my $fh = IO::File->new( $file ) or die "Can't open $file: $!"; while (my $line = <$fh>) { return 1 if $line =~ /^\=(?:head|pod|item)/; } return ''; } sub ACTION_html { my $self = shift; return unless $self->_mb_feature('HTML_support'); $self->depends_on('code'); foreach my $type ( qw(bin lib) ) { my $files = $self->_find_pods( $self->{properties}{"${type}doc_dirs"}, exclude => [ file_qr('\.(?:bat|com|html)$') ] ); next unless %$files; if ( $self->invoked_action eq 'html' ) { $self->htmlify_pods( $type ); } elsif ( $self->_is_default_installable("${type}html") ) { $self->htmlify_pods( $type ); } } } # 1) If it's an ActiveState perl install, we need to run # ActivePerl::DocTools->UpdateTOC; # 2) Links to other modules are not being generated sub htmlify_pods { my $self = shift; my $type = shift; my $htmldir = shift || File::Spec->catdir($self->blib, "${type}html"); require Module::Build::PodParser; require Pod::Html; $self->add_to_cleanup('pod2htm*'); my $pods = $self->_find_pods( $self->{properties}{"${type}doc_dirs"}, exclude => [ file_qr('\.(?:bat|com|html)$') ] ); return unless %$pods; # nothing to do unless ( -d $htmldir ) { File::Path::mkpath($htmldir, 0, oct(755)) or die "Couldn't mkdir $htmldir: $!"; } my @rootdirs = ($type eq 'bin') ? qw(bin) : $self->installdirs eq 'core' ? qw(lib) : qw(site lib); my $podpath = join ':', map $_->[1], grep -e $_->[0], map [File::Spec->catdir($self->blib, $_), $_], qw( script lib ); foreach my $pod ( keys %$pods ) { my ($name, $path) = File::Basename::fileparse($pods->{$pod}, file_qr('\.(?:pm|plx?|pod)$')); my @dirs = File::Spec->splitdir( File::Spec->canonpath( $path ) ); pop( @dirs ) if $dirs[-1] eq File::Spec->curdir; my $fulldir = File::Spec->catfile($htmldir, @rootdirs, @dirs); my $outfile = File::Spec->catfile($fulldir, "${name}.html"); my $infile = File::Spec->abs2rel($pod); next if $self->up_to_date($infile, $outfile); unless ( -d $fulldir ){ File::Path::mkpath($fulldir, 0, oct(755)) or die "Couldn't mkdir $fulldir: $!"; } my $path2root = join( '/', ('..') x (@rootdirs+@dirs) ); my $htmlroot = join( '/', ($path2root, $self->installdirs eq 'core' ? () : qw(site) ) ); my $fh = IO::File->new($infile) or die "Can't read $infile: $!"; my $abstract = Module::Build::PodParser->new(fh => $fh)->get_abstract(); my $title = join( '::', (@dirs, $name) ); $title .= " - $abstract" if $abstract; my @opts = ( '--flush', "--title=$title", "--podpath=$podpath", "--infile=$infile", "--outfile=$outfile", '--podroot=' . $self->blib, "--htmlroot=$htmlroot", ); if ( eval{Pod::Html->VERSION(1.03)} ) { push( @opts, ('--header', '--backlink=Back to Top') ); push( @opts, "--css=$path2root/" . $self->html_css) if $self->html_css; } $self->log_info("HTMLifying $infile -> $outfile\n"); $self->log_verbose("pod2html @opts\n"); Pod::Html::pod2html(@opts); # or warn "pod2html @opts failed: $!"; } } # Adapted from ExtUtils::MM_Unix sub man1page_name { my $self = shift; return File::Basename::basename( shift ); } # Adapted from ExtUtils::MM_Unix and Pod::Man # Depending on M::B's dependency policy, it might make more sense to refactor # Pod::Man::begin_pod() to extract a name() methods, and use them... # -spurkis sub man3page_name { my $self = shift; my ($vol, $dirs, $file) = File::Spec->splitpath( shift ); my @dirs = File::Spec->splitdir( File::Spec->canonpath($dirs) ); # Remove known exts from the base name $file =~ s/\.p(?:od|m|l)\z//i; return join( $self->manpage_separator, @dirs, $file ); } sub manpage_separator { return '::'; } # For systems that don't have 'diff' executable, should use Algorithm::Diff sub ACTION_diff { my $self = shift; $self->depends_on('build'); my $local_lib = File::Spec->rel2abs('lib'); my @myINC = grep {$_ ne $local_lib} @INC; # The actual install destination might not be in @INC, so check there too. push @myINC, map $self->install_destination($_), qw(lib arch); my @flags = @{$self->{args}{ARGV}}; @flags = $self->split_like_shell($self->{args}{flags} || '') unless @flags; my $installmap = $self->install_map; delete $installmap->{read}; delete $installmap->{write}; my $text_suffix = file_qr('\.(pm|pod)$'); while (my $localdir = each %$installmap) { my @localparts = File::Spec->splitdir($localdir); my $files = $self->rscan_dir($localdir, sub {-f}); foreach my $file (@$files) { my @parts = File::Spec->splitdir($file); @parts = @parts[@localparts .. $#parts]; # Get rid of blib/lib or similar my $installed = Module::Build::ModuleInfo->find_module_by_name( join('::', @parts), \@myINC ); if (not $installed) { print "Only in lib: $file\n"; next; } my $status = File::Compare::compare($installed, $file); next if $status == 0; # Files are the same die "Can't compare $installed and $file: $!" if $status == -1; if ($file =~ $text_suffix) { $self->do_system('diff', @flags, $installed, $file); } else { print "Binary files $file and $installed differ\n"; } } } } sub ACTION_pure_install { shift()->depends_on('install'); } sub ACTION_install { my ($self) = @_; require ExtUtils::Install; $self->depends_on('build'); ExtUtils::Install::install($self->install_map, !$self->quiet, 0, $self->{args}{uninst}||0); } sub ACTION_fakeinstall { my ($self) = @_; require ExtUtils::Install; my $eui_version = ExtUtils::Install->VERSION; if ( $eui_version < 1.32 ) { $self->log_warn( "The 'fakeinstall' action requires Extutils::Install 1.32 or later.\n" . "(You only have version $eui_version)." ); return; } $self->depends_on('build'); ExtUtils::Install::install($self->install_map, !$self->quiet, 1, $self->{args}{uninst}||0); } sub ACTION_versioninstall { my ($self) = @_; die "You must have only.pm 0.25 or greater installed for this operation: $@\n" unless eval { require only; 'only'->VERSION(0.25); 1 }; $self->depends_on('build'); my %onlyargs = map {exists($self->{args}{$_}) ? ($_ => $self->{args}{$_}) : ()} qw(version versionlib); only::install::install(%onlyargs); } sub ACTION_clean { my ($self) = @_; foreach my $item (map glob($_), $self->cleanup) { $self->delete_filetree($item); } } sub ACTION_realclean { my ($self) = @_; $self->depends_on('clean'); $self->delete_filetree($self->config_dir, $self->build_script); } sub ACTION_ppd { my ($self) = @_; require Module::Build::PPMMaker; my $ppd = Module::Build::PPMMaker->new(); my $file = $ppd->make_ppd(%{$self->{args}}, build => $self); $self->add_to_cleanup($file); } sub ACTION_ppmdist { my ($self) = @_; $self->depends_on( 'build' ); my $ppm = $self->ppm_name; $self->delete_filetree( $ppm ); $self->log_info( "Creating $ppm\n" ); $self->add_to_cleanup( $ppm, "$ppm.tar.gz" ); my %types = ( # translate types/dirs to those expected by ppm lib => 'lib', arch => 'arch', bin => 'bin', script => 'script', bindoc => 'man1', libdoc => 'man3', binhtml => undef, libhtml => undef, ); foreach my $type ($self->install_types) { next if exists( $types{$type} ) && !defined( $types{$type} ); my $dir = File::Spec->catdir( $self->blib, $type ); next unless -e $dir; my $files = $self->rscan_dir( $dir ); foreach my $file ( @$files ) { next unless -f $file; my $rel_file = File::Spec->abs2rel( File::Spec->rel2abs( $file ), File::Spec->rel2abs( $dir ) ); my $to_file = File::Spec->catfile( $ppm, 'blib', exists( $types{$type} ) ? $types{$type} : $type, $rel_file ); $self->copy_if_modified( from => $file, to => $to_file ); } } foreach my $type ( qw(bin lib) ) { local $self->{properties}{html_css} = 'Active.css'; $self->htmlify_pods( $type, File::Spec->catdir($ppm, 'blib', 'html') ); } # create a tarball; # the directory tar'ed must be blib so we need to do a chdir first my $target = File::Spec->catfile( File::Spec->updir, $ppm ); $self->_do_in_dir( $ppm, sub { $self->make_tarball( 'blib', $target ) } ); $self->depends_on( 'ppd' ); $self->delete_filetree( $ppm ); } sub ACTION_pardist { my ($self) = @_; # Need PAR::Dist if ( not eval { require PAR::Dist; PAR::Dist->VERSION(0.17) } ) { $self->log_warn( "In order to create .par distributions, you need to\n" . "install PAR::Dist first." ); return(); } $self->depends_on( 'build' ); return PAR::Dist::blib_to_par( name => $self->dist_name, version => $self->dist_version, ); } sub ACTION_dist { my ($self) = @_; $self->depends_on('distdir'); my $dist_dir = $self->dist_dir; $self->make_tarball($dist_dir); $self->delete_filetree($dist_dir); } sub ACTION_distcheck { my ($self) = @_; require ExtUtils::Manifest; local $^W; # ExtUtils::Manifest is not warnings clean. my ($missing, $extra) = ExtUtils::Manifest::fullcheck(); return unless @$missing || @$extra; my $msg = "MANIFEST appears to be out of sync with the distribution\n"; if ( $self->invoked_action eq 'distcheck' ) { die $msg; } else { warn $msg; } } sub _add_to_manifest { my ($self, $manifest, $lines) = @_; $lines = [$lines] unless ref $lines; my $existing_files = $self->_read_manifest($manifest); return unless defined( $existing_files ); @$lines = grep {!exists $existing_files->{$_}} @$lines or return; my $mode = (stat $manifest)[2]; chmod($mode | oct(222), $manifest) or die "Can't make $manifest writable: $!"; my $fh = IO::File->new("< $manifest") or die "Can't read $manifest: $!"; my $last_line = (<$fh>)[-1] || "\n"; my $has_newline = $last_line =~ /\n$/; $fh->close; $fh = IO::File->new(">> $manifest") or die "Can't write to $manifest: $!"; print $fh "\n" unless $has_newline; print $fh map "$_\n", @$lines; close $fh; chmod($mode, $manifest); $self->log_info(map "Added to $manifest: $_\n", @$lines); } sub _sign_dir { my ($self, $dir) = @_; unless (eval { require Module::Signature; 1 }) { $self->log_warn("Couldn't load Module::Signature for 'distsign' action:\n $@\n"); return; } # Add SIGNATURE to the MANIFEST { my $manifest = File::Spec->catfile($dir, 'MANIFEST'); die "Signing a distribution requires a MANIFEST file" unless -e $manifest; $self->_add_to_manifest($manifest, "SIGNATURE Added here by Module::Build"); } # Would be nice if Module::Signature took a directory argument. $self->_do_in_dir($dir, sub {local $Module::Signature::Quiet = 1; Module::Signature::sign()}); } sub _do_in_dir { my ($self, $dir, $do) = @_; my $start_dir = $self->cwd; chdir $dir or die "Can't chdir() to $dir: $!"; eval {$do->()}; my @err = $@ ? ($@) : (); chdir $start_dir or push @err, "Can't chdir() back to $start_dir: $!"; die join "\n", @err if @err; } sub ACTION_distsign { my ($self) = @_; { local $self->{properties}{sign} = 0; # We'll sign it ourselves $self->depends_on('distdir') unless -d $self->dist_dir; } $self->_sign_dir($self->dist_dir); } sub ACTION_skipcheck { my ($self) = @_; require ExtUtils::Manifest; local $^W; # ExtUtils::Manifest is not warnings clean. ExtUtils::Manifest::skipcheck(); } sub ACTION_distclean { my ($self) = @_; $self->depends_on('realclean'); $self->depends_on('distcheck'); } sub do_create_makefile_pl { my $self = shift; require Module::Build::Compat; $self->log_info("Creating Makefile.PL\n"); Module::Build::Compat->create_makefile_pl($self->create_makefile_pl, $self, @_); $self->_add_to_manifest('MANIFEST', 'Makefile.PL'); } sub do_create_license { my $self = shift; $self->log_info("Creating LICENSE file"); my $l = $self->license or die "No license specified"; my $key = $self->valid_licenses->{$l} or die "'$l' isn't a license key we know about"; my $class = "Software::License::$key"; eval "use $class; 1" or die "Can't load Software::License to create LICENSE file: $@"; $self->delete_filetree('LICENSE'); my $author = join " & ", @{ $self->dist_author }; my $license = $class->new({holder => $author}); my $fh = IO::File->new('> LICENSE') or die "Can't write LICENSE file: $!"; print $fh $license->fulltext; close $fh; $self->_add_to_manifest('MANIFEST', 'LICENSE'); } sub do_create_readme { my $self = shift; $self->delete_filetree('README'); my $docfile = $self->_main_docfile; unless ( $docfile ) { $self->log_warn(<log_info("Creating README using Pod::Readme\n"); my $parser = Pod::Readme->new; $parser->parse_from_file($docfile, 'README', @_); } elsif ( eval {require Pod::Text; 1} ) { $self->log_info("Creating README using Pod::Text\n"); my $fh = IO::File->new('> README'); if ( defined($fh) ) { local $^W = 0; no strict "refs"; # work around bug in Pod::Text 3.01, which expects # Pod::Simple::parse_file to take input and output filehandles # when it actually only takes an input filehandle my $old_parse_file; $old_parse_file = \&{"Pod::Simple::parse_file"} and local *{"Pod::Simple::parse_file"} = sub { my $self = shift; $self->output_fh($_[1]) if $_[1]; $self->$old_parse_file($_[0]); } if $Pod::Text::VERSION == 3.01; # Split line to avoid evil version-finder Pod::Text::pod2text( $docfile, $fh ); $fh->close; } else { $self->log_warn( "Cannot create 'README' file: Can't open file for writing\n" ); return; } } else { $self->log_warn("Can't load Pod::Readme or Pod::Text to create README\n"); return; } $self->_add_to_manifest('MANIFEST', 'README'); } sub _main_docfile { my $self = shift; if ( my $pm_file = $self->dist_version_from ) { (my $pod_file = $pm_file) =~ s/.pm$/.pod/; return (-e $pod_file ? $pod_file : $pm_file); } else { return undef; } } sub ACTION_distdir { my ($self) = @_; $self->depends_on('distmeta'); my $dist_files = $self->_read_manifest('MANIFEST') or die "Can't create distdir without a MANIFEST file - run 'manifest' action first"; delete $dist_files->{SIGNATURE}; # Don't copy, create a fresh one die "No files found in MANIFEST - try running 'manifest' action?\n" unless ($dist_files and keys %$dist_files); my $metafile = $self->metafile; $self->log_warn("*** Did you forget to add $metafile to the MANIFEST?\n") unless exists $dist_files->{$metafile}; my $dist_dir = $self->dist_dir; $self->delete_filetree($dist_dir); $self->log_info("Creating $dist_dir\n"); $self->add_to_cleanup($dist_dir); foreach my $file (keys %$dist_files) { my $new = $self->copy_if_modified(from => $file, to_dir => $dist_dir, verbose => 0); } $self->_sign_dir($dist_dir) if $self->{properties}{sign}; } sub ACTION_disttest { my ($self) = @_; $self->depends_on('distdir'); $self->_do_in_dir ( $self->dist_dir, sub { # XXX could be different names for scripts $self->run_perl_script('Build.PL') # XXX Should this be run w/ --nouse-rcfile or die "Error executing 'Build.PL' in dist directory: $!"; $self->run_perl_script('Build') or die "Error executing 'Build' in dist directory: $!"; $self->run_perl_script('Build', [], ['test']) or die "Error executing 'Build test' in dist directory"; }); } sub _write_default_maniskip { my $self = shift; my $file = shift || 'MANIFEST.SKIP'; my $fh = IO::File->new("> $file") or die "Can't open $file: $!"; # This is derived from MakeMaker's default MANIFEST.SKIP file with # some new entries print $fh <<'EOF'; # Avoid version control files. \bRCS\b \bCVS\b ,v$ \B\.svn\b \B\.cvsignore$ # Avoid Makemaker generated and utility files. \bMakefile$ \bblib \bMakeMaker-\d \bpm_to_blib$ \bblibdirs$ ^MANIFEST\.SKIP$ # Avoid VMS specific Makmaker generated files \bDescrip.MMS$ \bDESCRIP.MMS$ \bdescrip.mms$ # Avoid Module::Build generated and utility files. \bBuild$ \bBuild.bat$ \b_build \bBuild.COM$ \bBUILD.COM$ \bbuild.com$ # Avoid Devel::Cover generated files \bcover_db # Avoid temp and backup files. ~$ \.tmp$ \.old$ \.bak$ \#$ \.# \.rej$ # Avoid OS-specific files/dirs # Mac OSX metadata \B\.DS_Store # Mac OSX SMB mount metadata files \B\._ # Avoid archives of this distribution EOF # Skip, for example, 'Module-Build-0.27.tar.gz' print $fh '\b'.$self->dist_name.'-[\d\.\_]+'."\n"; $fh->close(); } sub ACTION_manifest { my ($self) = @_; my $maniskip = 'MANIFEST.SKIP'; unless ( -e 'MANIFEST' || -e $maniskip ) { $self->log_warn("File '$maniskip' does not exist: Creating a default '$maniskip'\n"); $self->_write_default_maniskip($maniskip); } require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean. local ($^W, $ExtUtils::Manifest::Quiet) = (0,1); ExtUtils::Manifest::mkmanifest(); } # Case insenstive regex for files sub file_qr { return File::Spec->case_tolerant ? qr($_[0])i : qr($_[0]); } sub dist_dir { my ($self) = @_; return "$self->{properties}{dist_name}-$self->{properties}{dist_version}"; } sub ppm_name { my $self = shift; return 'PPM-' . $self->dist_dir; } sub _files_in { my ($self, $dir) = @_; return unless -d $dir; local *DH; opendir DH, $dir or die "Can't read directory $dir: $!"; my @files; while (defined (my $file = readdir DH)) { my $full_path = File::Spec->catfile($dir, $file); next if -d $full_path; push @files, $full_path; } return @files; } sub script_files { my $self = shift; for ($self->{properties}{script_files}) { $_ = shift if @_; next unless $_; # Always coerce into a hash return $_ if UNIVERSAL::isa($_, 'HASH'); return $_ = { map {$_,1} @$_ } if UNIVERSAL::isa($_, 'ARRAY'); die "'script_files' must be a hashref, arrayref, or string" if ref(); return $_ = { map {$_,1} $self->_files_in( $_ ) } if -d $_; return $_ = {$_ => 1}; } return $_ = { map {$_,1} $self->_files_in('bin') }; } BEGIN { *scripts = \&script_files; } { my %licenses = ( perl => 'Perl_5', apache => 'Apache_2_0', artistic => 'Artistic_1_0', artistic_2 => 'Artistic_2_0', lgpl => 'LGPL_2_1', lgpl2 => 'LGPL_2_1', lgpl3 => 'LGPL_3_0', bsd => 'BSD', gpl => 'GPL_1', gpl2 => 'GPL_2', gpl3 => 'GPL_3', mit => 'MIT', mozilla => 'Mozilla_1_1', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); # TODO - would be nice to not have these here, since they're more # properly stored only in Software::License my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub valid_licenses { return \%licenses; } sub _license_url { return $license_urls{$_[1]}; } } sub _hash_merge { my ($self, $h, $k, $v) = @_; if (ref $h->{$k} eq 'ARRAY') { push @{$h->{$k}}, ref $v ? @$v : $v; } elsif (ref $h->{$k} eq 'HASH') { $h->{$k}{$_} = $v->{$_} foreach keys %$v; } else { $h->{$k} = $v; } } sub ACTION_distmeta { my ($self) = @_; $self->do_create_makefile_pl if $self->create_makefile_pl; $self->do_create_readme if $self->create_readme; $self->do_create_license if $self->create_license; $self->do_create_metafile; } sub do_create_metafile { my $self = shift; return if $self->{wrote_metadata}; my $p = $self->{properties}; my $metafile = $self->metafile; unless ($p->{license}) { $self->log_warn("No license specified, setting license = 'unknown'\n"); $p->{license} = 'unknown'; } unless (exists $self->valid_licenses->{ $p->{license} }) { die "Unknown license type '$p->{license}'"; } # If we're in the distdir, the metafile may exist and be non-writable. $self->delete_filetree($metafile); $self->log_info("Creating $metafile\n"); # Since we're building ourself, we have to do some special stuff # here: the ConfigData module is found in blib/lib. local @INC = @INC; if (($self->module_name || '') eq 'Module::Build') { $self->depends_on('config_data'); push @INC, File::Spec->catdir($self->blib, 'lib'); } $self->write_metafile; } sub write_metafile { my $self = shift; my $metafile = $self->metafile; if ($self->_mb_feature('YAML_support')) { require YAML; require YAML::Node; # We use YAML::Node to get the order nice in the YAML file. $self->prepare_metadata( my $node = YAML::Node->new({}) ); # YAML API changed after version 0.30 my $yaml_sub = $YAML::VERSION le '0.30' ? \&YAML::StoreFile : \&YAML::DumpFile; $self->{wrote_metadata} = $yaml_sub->($metafile, $node ); } else { require Module::Build::YAML; my (%node, @order_keys); $self->prepare_metadata(\%node, \@order_keys); $node{_order} = \@order_keys; &Module::Build::YAML::DumpFile($metafile, \%node); $self->{wrote_metadata} = 1; } $self->_add_to_manifest('MANIFEST', $metafile); } sub prepare_metadata { my ($self, $node, $keys) = @_; my $p = $self->{properties}; # A little helper sub my $add_node = sub { my ($name, $val) = @_; $node->{$name} = $val; push @$keys, $name if $keys; }; foreach (qw(dist_name dist_version dist_author dist_abstract license)) { (my $name = $_) =~ s/^dist_//; $add_node->($name, $self->$_()); die "ERROR: Missing required field '$_' for META.yml\n" unless defined($node->{$name}) && length($node->{$name}); } $node->{version} = '' . $node->{version}; # Stringify version objects if (defined( my $l = $self->license )) { die "Unknown license string '$l'" unless exists $self->valid_licenses->{ $self->license }; if (my $key = $self->valid_licenses->{ $self->license }) { my $class = "Software::License::$key"; if (eval "use $class; 1") { # S::L requires a 'holder' key $node->{resources}{license} = $class->new({holder=>"nobody"})->url; } else { $node->{resources}{license} = $self->_license_url($key); } } } if (exists $p->{configure_requires}) { foreach my $spec (keys %{$p->{configure_requires}}) { warn ("Warning: $spec is listed in 'configure_requires', but ". "it is not found in any of the other prereq fields.\n") unless grep exists $p->{$_}{$spec}, grep !/conflicts$/, @{$self->prereq_action_types}; } } foreach ( 'configure_requires', @{$self->prereq_action_types} ) { if (exists $p->{$_} and keys %{ $p->{$_} }) { $add_node->($_, $p->{$_}); } } if (exists $p->{dynamic_config}) { $add_node->('dynamic_config', $p->{dynamic_config}); } my $pkgs = eval { $self->find_dist_packages }; if ($@) { $self->log_warn("$@\nWARNING: Possible missing or corrupt 'MANIFEST' file.\n" . "Nothing to enter for 'provides' field in META.yml\n"); } else { $node->{provides} = $pkgs if %$pkgs; } ; if (exists $p->{no_index}) { $add_node->('no_index', $p->{no_index}); } $add_node->('generated_by', "Module::Build version $Module::Build::VERSION"); $add_node->('meta-spec', {version => '1.2', url => 'http://module-build.sourceforge.net/META-spec-v1.2.html', }); while (my($k, $v) = each %{$self->meta_add}) { $add_node->($k, $v); } while (my($k, $v) = each %{$self->meta_merge}) { $self->_hash_merge($node, $k, $v); } return $node; } sub _read_manifest { my ($self, $file) = @_; return undef unless -e $file; require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean. local ($^W, $ExtUtils::Manifest::Quiet) = (0,1); return scalar ExtUtils::Manifest::maniread($file); } sub find_dist_packages { my $self = shift; # Only packages in .pm files are candidates for inclusion here. # Only include things in the MANIFEST, not things in developer's # private stock. my $manifest = $self->_read_manifest('MANIFEST') or die "Can't find dist packages without a MANIFEST file - run 'manifest' action first"; # Localize my %dist_files = map { $self->localize_file_path($_) => $_ } keys %$manifest; my @pm_files = grep {exists $dist_files{$_}} keys %{ $self->find_pm_files }; # First, we enumerate all packages & versions, # seperating into primary & alternative candidates my( %prime, %alt ); foreach my $file (@pm_files) { next if $dist_files{$file} =~ m{^t/}; # Skip things in t/ my @path = split( /\//, $dist_files{$file} ); (my $prime_package = join( '::', @path[1..$#path] )) =~ s/\.pm$//; my $pm_info = Module::Build::ModuleInfo->new_from_file( $file ); foreach my $package ( $pm_info->packages_inside ) { next if $package eq 'main'; # main can appear numerous times, ignore next if grep /^_/, split( /::/, $package ); # private package, ignore my $version = $pm_info->version( $package ); if ( $package eq $prime_package ) { if ( exists( $prime{$package} ) ) { # M::B::ModuleInfo will handle this conflict die "Unexpected conflict in '$package'; multiple versions found.\n"; } else { $prime{$package}{file} = $dist_files{$file}; $prime{$package}{version} = $version if defined( $version ); } } else { push( @{$alt{$package}}, { file => $dist_files{$file}, version => $version, } ); } } } # Then we iterate over all the packages found above, identifying conflicts # and selecting the "best" candidate for recording the file & version # for each package. foreach my $package ( keys( %alt ) ) { my $result = $self->_resolve_module_versions( $alt{$package} ); if ( exists( $prime{$package} ) ) { # primary package selected if ( $result->{err} ) { # Use the selected primary package, but there are conflicting # errors amoung multiple alternative packages that need to be # reported $self->log_warn( "Found conflicting versions for package '$package'\n" . " $prime{$package}{file} ($prime{$package}{version})\n" . $result->{err} ); } elsif ( defined( $result->{version} ) ) { # There is a primary package selected, and exactly one # alternative package if ( exists( $prime{$package}{version} ) && defined( $prime{$package}{version} ) ) { # Unless the version of the primary package agrees with the # version of the alternative package, report a conflict if ( $self->compare_versions( $prime{$package}{version}, '!=', $result->{version} ) ) { $self->log_warn( "Found conflicting versions for package '$package'\n" . " $prime{$package}{file} ($prime{$package}{version})\n" . " $result->{file} ($result->{version})\n" ); } } else { # The prime package selected has no version so, we choose to # use any alternative package that does have a version $prime{$package}{file} = $result->{file}; $prime{$package}{version} = $result->{version}; } } else { # no alt package found with a version, but we have a prime # package so we use it whether it has a version or not } } else { # No primary package was selected, use the best alternative if ( $result->{err} ) { $self->log_warn( "Found conflicting versions for package '$package'\n" . $result->{err} ); } # Despite possible conflicting versions, we choose to record # something rather than nothing $prime{$package}{file} = $result->{file}; $prime{$package}{version} = $result->{version} if defined( $result->{version} ); } } # Stringify versions. Can't use exists() here because of bug in YAML::Node. for (grep defined $_->{version}, values %prime) { $_->{version} = '' . $_->{version}; } return \%prime; } # seperate out some of the conflict resolution logic from # $self->find_dist_packages(), above, into a helper function. # sub _resolve_module_versions { my $self = shift; my $packages = shift; my( $file, $version ); my $err = ''; foreach my $p ( @$packages ) { if ( defined( $p->{version} ) ) { if ( defined( $version ) ) { if ( $self->compare_versions( $version, '!=', $p->{version} ) ) { $err .= " $p->{file} ($p->{version})\n"; } else { # same version declared multiple times, ignore } } else { $file = $p->{file}; $version = $p->{version}; } } $file ||= $p->{file} if defined( $p->{file} ); } if ( $err ) { $err = " $file ($version)\n" . $err; } my %result = ( file => $file, version => $version, err => $err ); return \%result; } sub make_tarball { my ($self, $dir, $file) = @_; $file ||= $dir; $self->log_info("Creating $file.tar.gz\n"); if ($self->{args}{tar}) { my $tar_flags = $self->verbose ? 'cvf' : 'cf'; $self->do_system($self->split_like_shell($self->{args}{tar}), $tar_flags, "$file.tar", $dir); $self->do_system($self->split_like_shell($self->{args}{gzip}), "$file.tar") if $self->{args}{gzip}; } else { require Archive::Tar; # Archive::Tar versions >= 1.09 use the following to enable a compatibility # hack so that the resulting archive is compatible with older clients. $Archive::Tar::DO_NOT_USE_PREFIX = 0; my $files = $self->rscan_dir($dir); my $tar = Archive::Tar->new; $tar->add_files(@$files); for my $f ($tar->get_files) { $f->mode($f->mode & ~022); # chmod go-w } $tar->write("$file.tar.gz", 1); } } sub install_path { my $self = shift; my( $type, $value ) = ( @_, '' ); Carp::croak( 'Type argument missing' ) unless defined( $type ); my $map = $self->{properties}{install_path}; return $map unless @_; # delete existing value if $value is literal undef() unless ( defined( $value ) ) { delete( $map->{$type} ); return undef; } # return existing value if no new $value is given if ( $value eq '' ) { return undef unless exists $map->{$type}; return $map->{$type}; } # set value if $value is a valid relative path return $map->{$type} = $value; } sub install_base_relpaths { # Usage: install_base_relpaths(), install_base_relpaths('lib'), # or install_base_relpaths('lib' => $value); my $self = shift; my $map = $self->{properties}{install_base_relpaths}; return $map unless @_; return $self->_relpaths($map, @_); } # Translated from ExtUtils::MM_Any::init_INSTALL_from_PREFIX sub prefix_relative { my ($self, $type) = @_; my $installdirs = $self->installdirs; my $relpath = $self->install_sets($installdirs)->{$type}; return $self->_prefixify($relpath, $self->original_prefix($installdirs), $type, ); } sub _relpaths { my $self = shift; my( $map, $type, $value ) = ( @_, '' ); Carp::croak( 'Type argument missing' ) unless defined( $type ); my @value = (); # delete existing value if $value is literal undef() unless ( defined( $value ) ) { delete( $map->{$type} ); return undef; } # return existing value if no new $value is given elsif ( $value eq '' ) { return undef unless exists $map->{$type}; @value = @{ $map->{$type} }; } # set value if $value is a valid relative path else { Carp::croak( "Value must be a relative path" ) if File::Spec::Unix->file_name_is_absolute($value); @value = split( /\//, $value ); $map->{$type} = \@value; } return File::Spec->catdir( @value ); } # Defaults to use in case the config install paths cannot be prefixified. sub prefix_relpaths { # Usage: prefix_relpaths('site'), prefix_relpaths('site', 'lib'), # or prefix_relpaths('site', 'lib' => $value); my $self = shift; my $installdirs = shift || $self->installdirs; my $map = $self->{properties}{prefix_relpaths}{$installdirs}; return $map unless @_; return $self->_relpaths($map, @_); } # Translated from ExtUtils::MM_Unix::prefixify() sub _prefixify { my($self, $path, $sprefix, $type) = @_; my $rprefix = $self->prefix; $rprefix .= '/' if $sprefix =~ m|/$|; $self->log_verbose(" prefixify $path from $sprefix to $rprefix\n") if defined( $path ) && length( $path ); if( !defined( $path ) || ( length( $path ) == 0 ) ) { $self->log_verbose(" no path to prefixify, falling back to default.\n"); return $self->_prefixify_default( $type, $rprefix ); } elsif( !File::Spec->file_name_is_absolute($path) ) { $self->log_verbose(" path is relative, not prefixifying.\n"); } elsif( $path !~ s{^\Q$sprefix\E\b}{}s ) { $self->log_verbose(" cannot prefixify, falling back to default.\n"); return $self->_prefixify_default( $type, $rprefix ); } $self->log_verbose(" now $path in $rprefix\n"); return $path; } sub _prefixify_default { my $self = shift; my $type = shift; my $rprefix = shift; my $default = $self->prefix_relpaths($self->installdirs, $type); if( !$default ) { $self->log_verbose(" no default install location for type '$type', using prefix '$rprefix'.\n"); return $rprefix; } else { return $default; } } sub install_destination { my ($self, $type) = @_; return $self->install_path($type) if $self->install_path($type); if ( $self->install_base ) { my $relpath = $self->install_base_relpaths($type); return $relpath ? File::Spec->catdir($self->install_base, $relpath) : undef; } if ( $self->prefix ) { my $relpath = $self->prefix_relative($type); return $relpath ? File::Spec->catdir($self->prefix, $relpath) : undef; } return $self->install_sets($self->installdirs)->{$type}; } sub install_types { my $self = shift; my %types; if ( $self->install_base ) { %types = %{$self->install_base_relpaths}; } elsif ( $self->prefix ) { %types = %{$self->prefix_relpaths}; } else { %types = %{$self->install_sets($self->installdirs)}; } %types = (%types, %{$self->install_path}); return sort keys %types; } sub install_map { my ($self, $blib) = @_; $blib ||= $self->blib; my( %map, @skipping ); foreach my $type ($self->install_types) { my $localdir = File::Spec->catdir( $blib, $type ); next unless -e $localdir; if (my $dest = $self->install_destination($type)) { $map{$localdir} = $dest; } else { push( @skipping, $type ); } } $self->log_warn( "WARNING: Can't figure out install path for types: @skipping\n" . "Files will not be installed.\n" ) if @skipping; # Write the packlist into the same place as ExtUtils::MakeMaker. if ($self->create_packlist and my $module_name = $self->module_name) { my $archdir = $self->install_destination('arch'); my @ext = split /::/, $module_name; $map{write} = File::Spec->catfile($archdir, 'auto', @ext, '.packlist'); } # Handle destdir if (length(my $destdir = $self->destdir || '')) { foreach (keys %map) { # Need to remove volume from $map{$_} using splitpath, or else # we'll create something crazy like C:\Foo\Bar\E:\Baz\Quux # VMS will always have the file separate than the path. my ($volume, $path, $file) = File::Spec->splitpath( $map{$_}, 1 ); # catdir needs a list of directories, or it will create something # crazy like volume:[Foo.Bar.volume.Baz.Quux] my @dirs = File::Spec->splitdir($path); # First merge the directories $path = File::Spec->catdir($destdir, @dirs); # Then put the file back on if there is one. if ($file ne '') { $map{$_} = File::Spec->catfile($path, $file) } else { $map{$_} = $path; } } } $map{read} = ''; # To keep ExtUtils::Install quiet return \%map; } sub depends_on { my $self = shift; foreach my $action (@_) { $self->_call_action($action); } } sub rscan_dir { my ($self, $dir, $pattern) = @_; my @result; local $_; # find() can overwrite $_, so protect ourselves my $subr = !$pattern ? sub {push @result, $File::Find::name} : !ref($pattern) || (ref $pattern eq 'Regexp') ? sub {push @result, $File::Find::name if /$pattern/} : ref($pattern) eq 'CODE' ? sub {push @result, $File::Find::name if $pattern->()} : die "Unknown pattern type"; File::Find::find({wanted => $subr, no_chdir => 1}, $dir); return \@result; } sub delete_filetree { my $self = shift; my $deleted = 0; foreach (@_) { next unless -e $_; $self->log_info("Deleting $_\n"); File::Path::rmtree($_, 0, 0); die "Couldn't remove '$_': $!\n" if -e $_; $deleted++; } return $deleted; } sub autosplit_file { my ($self, $file, $to) = @_; require AutoSplit; my $dir = File::Spec->catdir($to, 'lib', 'auto'); AutoSplit::autosplit($file, $dir); } sub cbuilder { # Returns a CBuilder object my $self = shift; my $p = $self->{properties}; return $p->{_cbuilder} if $p->{_cbuilder}; die "Module::Build is not configured with C_support" unless $self->_mb_feature('C_support'); require ExtUtils::CBuilder; return $p->{_cbuilder} = ExtUtils::CBuilder->new( config => $self->config, ($self->quiet ? (quiet => 1 ) : ()), ); } sub have_c_compiler { my ($self) = @_; my $p = $self->{properties}; return $p->{have_compiler} if defined $p->{have_compiler}; $self->log_verbose("Checking if compiler tools configured... "); my $b = eval { $self->cbuilder }; my $have = $b && $b->have_compiler; $self->log_verbose($have ? "ok.\n" : "failed.\n"); return $p->{have_compiler} = $have; } sub compile_c { my ($self, $file, %args) = @_; my $b = $self->cbuilder; my $obj_file = $b->object_file($file); $self->add_to_cleanup($obj_file); return $obj_file if $self->up_to_date($file, $obj_file); $b->compile(source => $file, defines => $args{defines}, object_file => $obj_file, include_dirs => $self->include_dirs, extra_compiler_flags => $self->extra_compiler_flags, ); return $obj_file; } sub link_c { my ($self, $to, $file_base) = @_; my $p = $self->{properties}; # For convenience my $spec = $self->_infer_xs_spec($file_base); $self->add_to_cleanup($spec->{lib_file}); my $objects = $p->{objects} || []; return $spec->{lib_file} if $self->up_to_date([$spec->{obj_file}, @$objects], $spec->{lib_file}); my $module_name = $self->module_name; $module_name ||= $spec->{module_name}; $self->cbuilder->link( module_name => $module_name, objects => [$spec->{obj_file}, @$objects], lib_file => $spec->{lib_file}, extra_linker_flags => $p->{extra_linker_flags} ); return $spec->{lib_file}; } sub compile_xs { my ($self, $file, %args) = @_; $self->log_info("$file -> $args{outfile}\n"); if (eval {require ExtUtils::ParseXS; 1}) { ExtUtils::ParseXS::process_file( filename => $file, prototypes => 0, output => $args{outfile}, ); } else { # Ok, I give up. Just use backticks. my $xsubpp = Module::Build::ModuleInfo->find_module_by_name('ExtUtils::xsubpp') or die "Can't find ExtUtils::xsubpp in INC (@INC)"; my @typemaps; push @typemaps, Module::Build::ModuleInfo->find_module_by_name( 'ExtUtils::typemap', \@INC ); my $lib_typemap = Module::Build::ModuleInfo->find_module_by_name( 'typemap', [File::Basename::dirname($file)] ); push @typemaps, $lib_typemap if $lib_typemap; @typemaps = map {+'-typemap', $_} @typemaps; my $cf = $self->{config}; my $perl = $self->{properties}{perl}; my @command = ($perl, "-I".$cf->get('installarchlib'), "-I".$cf->get('installprivlib'), $xsubpp, '-noprototypes', @typemaps, $file); $self->log_info("@command\n"); my $fh = IO::File->new("> $args{outfile}") or die "Couldn't write $args{outfile}: $!"; print {$fh} $self->_backticks(@command); close $fh; } } sub split_like_shell { my ($self, $string) = @_; return () unless defined($string); return @$string if UNIVERSAL::isa($string, 'ARRAY'); $string =~ s/^\s+|\s+$//g; return () unless length($string); return Text::ParseWords::shellwords($string); } sub oneliner { # Returns a string that the shell can evaluate as a perl command. # This should be avoided whenever possible, since "the shell" really # means zillions of shells on zillions of platforms and it's really # hard to get it right all the time. # Some of this code is stolen with permission from ExtUtils::MakeMaker. my($self, $cmd, $switches, $args) = @_; $switches = [] unless defined $switches; $args = [] unless defined $args; # Strip leading and trailing newlines $cmd =~ s{^\n+}{}; $cmd =~ s{\n+$}{}; my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter; return $self->_quote_args($perl, @$switches, '-e', $cmd, @$args); } sub run_perl_script { my ($self, $script, $preargs, $postargs) = @_; foreach ($preargs, $postargs) { $_ = [ $self->split_like_shell($_) ] unless ref(); } return $self->run_perl_command([@$preargs, $script, @$postargs]); } sub run_perl_command { # XXX Maybe we should accept @args instead of $args? Must resolve # this before documenting. my ($self, $args) = @_; $args = [ $self->split_like_shell($args) ] unless ref($args); my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter; # Make sure our local additions to @INC are propagated to the subprocess local $ENV{PERL5LIB} = join $self->config('path_sep'), $self->_added_to_INC; return $self->do_system($perl, @$args); } # Infer various data from the path of the input filename # that is needed to create output files. # The input filename is expected to be of the form: # lib/Module/Name.ext or Module/Name.ext sub _infer_xs_spec { my $self = shift; my $file = shift; my $cf = $self->{config}; my %spec; my( $v, $d, $f ) = File::Spec->splitpath( $file ); my @d = File::Spec->splitdir( $d ); (my $file_base = $f) =~ s/\.[^.]+$//i; $spec{base_name} = $file_base; $spec{src_dir} = File::Spec->catpath( $v, $d, '' ); # the module name shift( @d ) while @d && ($d[0] eq 'lib' || $d[0] eq ''); pop( @d ) while @d && $d[-1] eq ''; $spec{module_name} = join( '::', (@d, $file_base) ); $spec{archdir} = File::Spec->catdir($self->blib, 'arch', 'auto', @d, $file_base); $spec{bs_file} = File::Spec->catfile($spec{archdir}, "${file_base}.bs"); $spec{lib_file} = File::Spec->catfile($spec{archdir}, "${file_base}.".$cf->get('dlext')); $spec{c_file} = File::Spec->catfile( $spec{src_dir}, "${file_base}.c" ); $spec{obj_file} = File::Spec->catfile( $spec{src_dir}, "${file_base}".$cf->get('obj_ext') ); return \%spec; } sub process_xs { my ($self, $file) = @_; my $spec = $self->_infer_xs_spec($file); # File name, minus the suffix (my $file_base = $file) =~ s/\.[^.]+$//; # .xs -> .c $self->add_to_cleanup($spec->{c_file}); unless ($self->up_to_date($file, $spec->{c_file})) { $self->compile_xs($file, outfile => $spec->{c_file}); } # .c -> .o my $v = $self->dist_version; $self->compile_c($spec->{c_file}, defines => {VERSION => qq{"$v"}, XS_VERSION => qq{"$v"}}); # archdir File::Path::mkpath($spec->{archdir}, 0, oct(777)) unless -d $spec->{archdir}; # .xs -> .bs $self->add_to_cleanup($spec->{bs_file}); unless ($self->up_to_date($file, $spec->{bs_file})) { require ExtUtils::Mkbootstrap; $self->log_info("ExtUtils::Mkbootstrap::Mkbootstrap('$spec->{bs_file}')\n"); ExtUtils::Mkbootstrap::Mkbootstrap($spec->{bs_file}); # Original had $BSLOADLIBS - what's that? {my $fh = IO::File->new(">> $spec->{bs_file}")} # create utime((time)x2, $spec->{bs_file}); # touch } # .o -> .(a|bundle) $self->link_c($spec->{archdir}, $file_base); } sub do_system { my ($self, @cmd) = @_; $self->log_info("@cmd\n"); # Some systems proliferate huge PERL5LIBs, try to ameliorate: my %seen; my $sep = $self->config('path_sep'); local $ENV{PERL5LIB} = ( !exists($ENV{PERL5LIB}) ? '' : length($ENV{PERL5LIB}) < 500 ? $ENV{PERL5LIB} : join $sep, grep { ! $seen{$_}++ and -d $_ } split($sep, $ENV{PERL5LIB}) ); my $status = system(@cmd); if ($status and $! =~ /Argument list too long/i) { my $env_entries = ''; foreach (sort keys %ENV) { $env_entries .= "$_=>".length($ENV{$_})."; " } warn "'Argument list' was 'too long', env lengths are $env_entries"; } return !$status; } sub copy_if_modified { my $self = shift; my %args = (@_ > 3 ? ( @_ ) : ( from => shift, to_dir => shift, flatten => shift ) ); $args{verbose} = !$self->quiet unless exists $args{verbose}; my $file = $args{from}; unless (defined $file and length $file) { die "No 'from' parameter given to copy_if_modified"; } # makes no sense to replicate an absolute path, so assume flatten $args{flatten} = 1 if File::Spec->file_name_is_absolute( $file ); my $to_path; if (defined $args{to} and length $args{to}) { $to_path = $args{to}; } elsif (defined $args{to_dir} and length $args{to_dir}) { $to_path = File::Spec->catfile( $args{to_dir}, $args{flatten} ? File::Basename::basename($file) : $file ); } else { die "No 'to' or 'to_dir' parameter given to copy_if_modified"; } return if $self->up_to_date($file, $to_path); # Already fresh { local $self->{properties}{quiet} = 1; $self->delete_filetree($to_path); # delete destination if exists } # Create parent directories File::Path::mkpath(File::Basename::dirname($to_path), 0, oct(777)); $self->log_info("Copying $file -> $to_path\n") if $args{verbose}; if ($^O eq 'os2') {# copy will not overwrite; 0x1 = overwrite chmod 0666, $to_path; File::Copy::syscopy($file, $to_path, 0x1) or die "Can't copy('$file', '$to_path'): $!"; } else { File::Copy::copy($file, $to_path) or die "Can't copy('$file', '$to_path'): $!"; } # mode is read-only + (executable if source is executable) my $mode = oct(444) | ( $self->is_executable($file) ? oct(111) : 0 ); chmod( $mode, $to_path ); return $to_path; } sub up_to_date { my ($self, $source, $derived) = @_; $source = [$source] unless ref $source; $derived = [$derived] unless ref $derived; return 0 if grep {not -e} @$derived; my $most_recent_source = time / (24*60*60); foreach my $file (@$source) { unless (-e $file) { $self->log_warn("Can't find source file $file for up-to-date check"); next; } $most_recent_source = -M _ if -M _ < $most_recent_source; } foreach my $derived (@$derived) { return 0 if -M $derived > $most_recent_source; } return 1; } sub dir_contains { my ($self, $first, $second) = @_; # File::Spec doesn't have an easy way to check whether one directory # is inside another, unfortunately. ($first, $second) = map File::Spec->canonpath($_), ($first, $second); my @first_dirs = File::Spec->splitdir($first); my @second_dirs = File::Spec->splitdir($second); return 0 if @second_dirs < @first_dirs; my $is_same = ( File::Spec->case_tolerant ? sub {lc(shift()) eq lc(shift())} : sub {shift() eq shift()} ); while (@first_dirs) { return 0 unless $is_same->(shift @first_dirs, shift @second_dirs); } return 1; } 1; __END__ =head1 NAME Module::Build::Base - Default methods for Module::Build =head1 SYNOPSIS Please see the Module::Build documentation. =head1 DESCRIPTION The C module defines the core functionality of C. Its methods may be overridden by any of the platform-dependent modules in the C namespace, but the intention here is to make this base module as platform-neutral as possible. Nicely enough, Perl has several core tools available in the C namespace for doing this, so the task isn't very difficult. Please see the C documentation for more details. =head1 AUTHOR Ken Williams =head1 COPYRIGHT Copyright (c) 2001-2006 Ken Williams. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO perl(1), Module::Build(3) =cut EekBoek-2.02.04/inc/Module/Build/Authoring.pod0000444000076500007650000002456412165465617016545 0ustar jvjv=head1 NAME Module::Build::Authoring - Authoring Module::Build modules =head1 DESCRIPTION When creating a C script for a module, something like the following code will typically be used: use Module::Build; my $build = Module::Build->new ( module_name => 'Foo::Bar', license => 'perl', requires => { 'perl' => '5.6.1', 'Some::Module' => '1.23', 'Other::Module' => '>= 1.2, != 1.5, < 2.0', }, ); $build->create_build_script; A simple module could get away with something as short as this for its C script: use Module::Build; Module::Build->new( module_name => 'Foo::Bar', license => 'perl', )->create_build_script; The model used by C is a lot like the C metaphor, with the following correspondences: In Module::Build In ExtUtils::MakeMaker --------------------------- ------------------------ Build.PL (initial script) Makefile.PL (initial script) Build (a short perl script) Makefile (a long Makefile) _build/ (saved state info) various config text in the Makefile Any customization can be done simply by subclassing C and adding a method called (for example) C, overriding the default 'test' action. You could also add a method called C, and then you could perform the action C. For information on providing compatibility with C, see L and L. =head1 STRUCTURE Module::Build creates a class hierarchy conducive to customization. Here is the parent-child class hierarchy in classy ASCII art: /--------------------\ | Your::Parent | (If you subclass Module::Build) \--------------------/ | | /--------------------\ (Doesn't define any functionality | Module::Build | of its own - just figures out what \--------------------/ other modules to load.) | | /-----------------------------------\ (Some values of $^O may | Module::Build::Platform::$^O | define specialized functionality. \-----------------------------------/ Otherwise it's ...::Default, a | pass-through class.) | /--------------------------\ | Module::Build::Base | (Most of the functionality of \--------------------------/ Module::Build is defined here.) =head1 SUBCLASSING Right now, there are two ways to subclass Module::Build. The first way is to create a regular module (in a C<.pm> file) that inherits from Module::Build, and use that module's class instead of using Module::Build directly: ------ in Build.PL: ---------- #!/usr/bin/perl use lib q(/nonstandard/library/path); use My::Builder; # Or whatever you want to call it my $build = My::Builder->new ( module_name => 'Foo::Bar', # All the regular args... license => 'perl', dist_author => 'A N Other ', requires => { Carp => 0 } ); $build->create_build_script; This is relatively straightforward, and is the best way to do things if your My::Builder class contains lots of code. The C method will ensure that the current value of C<@INC> (including the C) is propogated to the Build script, so that My::Builder can be found when running build actions. For very small additions, Module::Build provides a C method that lets you subclass Module::Build more conveniently, without creating a separate file for your module: ------ in Build.PL: ---------- #!/usr/bin/perl use Module::Build; my $class = Module::Build->subclass ( class => 'My::Builder', code => q{ sub ACTION_foo { print "I'm fooing to death!\n"; } }, ); my $build = $class->new ( module_name => 'Foo::Bar', # All the regular args... license => 'perl', dist_author => 'A N Other ', requires => { Carp => 0 } ); $build->create_build_script; Behind the scenes, this actually does create a C<.pm> file, since the code you provide must persist after Build.PL is run if it is to be very useful. See also the documentation for the L method. =head1 PREREQUISITES =head2 Types of prerequisites To specify what versions of other modules are used by this distribution, several types of prerequisites can be defined with the following parameters: =over 3 =item configure_requires Items that must be installed I configuring this distribution (i.e. before running the F script). This might be a specific minimum version of C or any other module the F needs in order to do its stuff. Clients like C or C will be expected to pick C out of the F file and install these items before running the C. *TODO* auto-add M::B? In what circumstances? =item build_requires Items that are necessary for building and testing this distribution, but aren't necessary after installation. This can help users who only want to install these items temporarily. It also helps reduce the size of the CPAN dependency graph if everything isn't smooshed into C. =item requires Items that are necessary for basic functioning. =item recommends Items that are recommended for enhanced functionality, but there are ways to use this distribution without having them installed. You might also think of this as "can use" or "is aware of" or "changes behavior in the presence of". =item conflicts Items that can cause problems with this distribution when installed. This is pretty rare. =back =head2 Format of prerequisites The prerequisites are given in a hash reference, where the keys are the module names and the values are version specifiers: requires => { Foo::Module => '2.4', Bar::Module => 0, Ken::Module => '>= 1.2, != 1.5, < 2.0', perl => '5.6.0' }, The above four version specifiers have different effects. The value C<'2.4'> means that B version 2.4 of C must be installed. The value C<0> means that B version of C is acceptable, even if C doesn't define a version. The more verbose value C<'E= 1.2, != 1.5, E 2.0'> means that C's version must be B 1.2, B 2.0, and B 1.5. The list of criteria is separated by commas, and all criteria must be satisfied. A special C entry lets you specify the versions of the Perl interpreter that are supported by your module. The same version dependency-checking semantics are available, except that we also understand perl's new double-dotted version numbers. =head2 XS Extensions Modules which need to compile XS code should list C as a C element. =head1 SAVING CONFIGURATION INFORMATION Module::Build provides a very convenient way to save configuration information that your installed modules (or your regression tests) can access. If your Build process calls the C or C methods, then a C module will automatically be created for you, where C is the C parameter as passed to C. This module provides access to the data saved by these methods, and a way to update the values. There is also a utility script called C distributed with Module::Build that provides a command line interface to this same functionality. See also the generated C documentation, and the C script's documentation, for more information. =head1 STARTING MODULE DEVELOPMENT When starting development on a new module, it's rarely worth your time to create a tree of all the files by hand. Some automatic module-creators are available: the oldest is C, which has shipped with perl itself for a long time. Its name reflects the fact that modules were originally conceived of as a way to wrap up a C library (thus the C part) into perl extensions (thus the C part). These days, C has largely been superseded by modules like C, and C. They have varying degrees of support for C. =head1 AUTOMATION One advantage of Module::Build is that since it's implemented as Perl methods, you can invoke these methods directly if you want to install a module non-interactively. For instance, the following Perl script will invoke the entire build/install procedure: my $build = Module::Build->new(module_name => 'MyModule'); $build->dispatch('build'); $build->dispatch('test'); $build->dispatch('install'); If any of these steps encounters an error, it will throw a fatal exception. You can also pass arguments as part of the build process: my $build = Module::Build->new(module_name => 'MyModule'); $build->dispatch('build'); $build->dispatch('test', verbose => 1); $build->dispatch('install', sitelib => '/my/secret/place/'); Building and installing modules in this way skips creating the C script. =head1 MIGRATION Note that if you want to provide both a F and a F for your distribution, you probably want to add the following to C in your F so that MakeMaker doesn't try to run your F as a normal F<.PL> file: PL_FILES => {}, You may also be interested in looking at the C module, which can automatically create various kinds of F compatibility layers. =head1 AUTHOR Ken Williams Development questions, bug reports, and patches should be sent to the Module-Build mailing list at . Bug reports are also welcome at . The latest development version is available from the Subversion repository at =head1 SEE ALSO perl(1), L(3), L(3), L(3), L(3), L(3) F Specification: L L L =cut EekBoek-2.02.04/inc/Module/Build/Version.pm0000444000076500007650000003232712165465617016060 0ustar jvjvpackage Module::Build::Version; use strict; use vars qw($VERSION); $VERSION = 0.74; eval "use version $VERSION"; if ($@) { # can't locate version files, use our own # Avoid redefined warnings if an old version.pm was available delete $version::{$_} foreach keys %version::; # first we get the stub version module my $version; while () { s/(\$VERSION)\s=\s\d+/\$VERSION = 0/; $version .= $_ if $_; last if /^1;$/; } # and now get the current version::vpp code my $vpp; while () { s/(\$VERSION)\s=\s\d+/\$VERSION = 0/; $vpp .= $_ if $_; last if /^1;$/; } # but we eval them in reverse order since version depends on # version::vpp to already exist eval $vpp; die $@ if $@; $INC{'version/vpp.pm'} = 'inside Module::Build::Version'; eval $version; die $@ if $@; $INC{'version.pm'} = 'inside Module::Build::Version'; } # now we can safely subclass version, installed or not use vars qw(@ISA); @ISA = qw(version); 1; __DATA__ # stub version module to make everything else happy package version; use 5.005_04; use strict; use vars qw(@ISA $VERSION $CLASS *qv); $VERSION = 0.000; $CLASS = 'version'; push @ISA, "version::vpp"; *version::qv = \&version::vpp::qv; # Preloaded methods go here. sub import { my ($class) = @_; my $callpkg = caller(); no strict 'refs'; *{$callpkg."::qv"} = sub {return bless version::qv(shift), $class } unless defined(&{"$callpkg\::qv"}); } 1; # replace everything from here to the end with the current version/vpp.pm package version::vpp; use strict; use locale; use vars qw ($VERSION @ISA @REGEXS); $VERSION = 0.76; push @REGEXS, qr/ ^v? # optional leading 'v' (\d*) # major revision not required \. # requires at least one decimal (?:(\d+)\.?){1,} /x; use overload ( '""' => \&stringify, '0+' => \&numify, 'cmp' => \&vcmp, '<=>' => \&vcmp, 'bool' => \&vbool, 'nomethod' => \&vnoop, ); my $VERSION_MAX = 0x7FFFFFFF; eval "use warnings"; if ($@) { eval ' package warnings; sub enabled {return $^W;} 1; '; } sub new { my ($class, $value) = @_; my $self = bless ({}, ref ($class) || $class); if ( ref($value) && eval("$value->isa('version')") ) { # Can copy the elements directly $self->{version} = [ @{$value->{version} } ]; $self->{qv} = 1 if $value->{qv}; $self->{alpha} = 1 if $value->{alpha}; $self->{original} = ''.$value->{original}; return $self; } require POSIX; my $currlocale = POSIX::setlocale(&POSIX::LC_ALL); my $radix_comma = ( POSIX::localeconv()->{decimal_point} eq ',' ); if ( not defined $value or $value =~ /^undef$/ ) { # RT #19517 - special case for undef comparison # or someone forgot to pass a value push @{$self->{version}}, 0; $self->{original} = "0"; return ($self); } if ( $#_ == 2 ) { # must be CVS-style $value = 'v'.$_[2]; } $value = _un_vstring($value); # exponential notation if ( $value =~ /\d+.?\d*e-?\d+/ ) { $value = sprintf("%.9f",$value); $value =~ s/(0+)$//; } # if the original locale used commas for decimal points, we # just replace commas with decimal places, rather than changing # locales if ( $radix_comma ) { $value =~ tr/,/./; } # This is not very efficient, but it is morally equivalent # to the XS code (as that is the reference implementation). # See vutil/vutil.c for details my $qv = 0; my $alpha = 0; my $width = 3; my $saw_period = 0; my $vinf = 0; my ($start, $last, $pos, $s); $s = 0; while ( substr($value,$s,1) =~ /\s/ ) { # leading whitespace is OK $s++; } if (substr($value,$s,1) eq 'v') { $s++; # get past 'v' $qv = 1; # force quoted version processing } $start = $last = $pos = $s; # pre-scan the input string to check for decimals/underbars while ( substr($value,$pos,1) =~ /[._\d]/ ) { if ( substr($value,$pos,1) eq '.' ) { if ($alpha) { Carp::croak("Invalid version format ". "(underscores before decimal)"); } $saw_period++; $last = $pos; } elsif ( substr($value,$pos,1) eq '_' ) { if ($alpha) { require Carp; Carp::croak("Invalid version format ". "(multiple underscores)"); } $alpha = 1; $width = $pos - $last - 1; # natural width of sub-version } $pos++; } if ( $alpha && !$saw_period ) { require Carp; Carp::croak("Invalid version format ". "(alpha without decimal)"); } if ( $alpha && $saw_period && $width == 0 ) { require Carp; Carp::croak("Invalid version format ". "(misplaced _ in number)"); } if ( $saw_period > 1 ) { $qv = 1; # force quoted version processing } $last = $pos; $pos = $s; if ( $qv ) { $self->{qv} = 1; } if ( $alpha ) { $self->{alpha} = 1; } if ( !$qv && $width < 3 ) { $self->{width} = $width; } while ( substr($value,$pos,1) =~ /\d/ ) { $pos++; } if ( substr($value,$pos,1) !~ /[a-z]/ ) { ### FIX THIS ### my $rev; while (1) { $rev = 0; { # this is atoi() that delimits on underscores my $end = $pos; my $mult = 1; my $orev; # the following if() will only be true after the decimal # point of a version originally created with a bare # floating point number, i.e. not quoted in any way if ( !$qv && $s > $start && $saw_period == 1 ) { $mult *= 100; while ( $s < $end ) { $orev = $rev; $rev += substr($value,$s,1) * $mult; $mult /= 10; if ( abs($orev) > abs($rev) || abs($rev) > abs($VERSION_MAX) ) { if ( warnings::enabled("overflow") ) { require Carp; Carp::carp("Integer overflow in version"); } $s = $end - 1; $rev = $VERSION_MAX; } $s++; if ( substr($value,$s,1) eq '_' ) { $s++; } } } else { while (--$end >= $s) { $orev = $rev; $rev += substr($value,$end,1) * $mult; $mult *= 10; if ( abs($orev) > abs($rev) || abs($rev) > abs($VERSION_MAX) ) { if ( warnings::enabled("overflow") ) { require Carp; Carp::carp("Integer overflow in version"); } $end = $s - 1; $rev = $VERSION_MAX; } } } } # Append revision push @{$self->{version}}, $rev; if ( substr($value,$pos,1) eq '.' && substr($value,$pos+1,1) =~ /\d/ ) { $s = ++$pos; } elsif ( substr($value,$pos,1) eq '_' && substr($value,$pos+1,1) =~ /\d/ ) { $s = ++$pos; } elsif ( substr($value,$pos,1) =~ /\d/ ) { $s = $pos; } else { $s = $pos; last; } if ( $qv ) { while ( substr($value,$pos,1) =~ /\d/ ) { $pos++; } } else { my $digits = 0; while (substr($value,$pos,1) =~ /[\d_]/ && $digits < 3) { if ( substr($value,$pos,1) ne '_' ) { $digits++; } $pos++; } } } } if ( $qv ) { # quoted versions always get at least three terms my $len = scalar @{$self->{version}}; $len = 3 - $len; while ($len-- > 0) { push @{$self->{version}}, 0; } } if ( substr($value,$pos) ) { # any remaining text if ( warnings::enabled("misc") ) { require Carp; Carp::carp("Version string '$value' contains invalid data; ". "ignoring: '".substr($value,$pos)."'"); } } # cache the original value for use when stringification if ( $vinf ) { $self->{vinf} = 1; $self->{original} = 'v.Inf'; } else { $self->{original} = substr($value,0,$pos); } return ($self); } sub numify { my ($self) = @_; unless (_verify($self)) { require Carp; Carp::croak("Invalid version object"); } my $width = $self->{width} || 3; my $alpha = $self->{alpha} || ""; my $len = $#{$self->{version}}; my $digit = $self->{version}[0]; my $string = sprintf("%d.", $digit ); for ( my $i = 1 ; $i < $len ; $i++ ) { $digit = $self->{version}[$i]; if ( $width < 3 ) { my $denom = 10**(3-$width); my $quot = int($digit/$denom); my $rem = $digit - ($quot * $denom); $string .= sprintf("%0".$width."d_%d", $quot, $rem); } else { $string .= sprintf("%03d", $digit); } } if ( $len > 0 ) { $digit = $self->{version}[$len]; if ( $alpha && $width == 3 ) { $string .= "_"; } $string .= sprintf("%0".$width."d", $digit); } else # $len = 0 { $string .= sprintf("000"); } return $string; } sub normal { my ($self) = @_; unless (_verify($self)) { require Carp; Carp::croak("Invalid version object"); } my $alpha = $self->{alpha} || ""; my $len = $#{$self->{version}}; my $digit = $self->{version}[0]; my $string = sprintf("v%d", $digit ); for ( my $i = 1 ; $i < $len ; $i++ ) { $digit = $self->{version}[$i]; $string .= sprintf(".%d", $digit); } if ( $len > 0 ) { $digit = $self->{version}[$len]; if ( $alpha ) { $string .= sprintf("_%0d", $digit); } else { $string .= sprintf(".%0d", $digit); } } if ( $len <= 2 ) { for ( $len = 2 - $len; $len != 0; $len-- ) { $string .= sprintf(".%0d", 0); } } return $string; } sub stringify { my ($self) = @_; unless (_verify($self)) { require Carp; Carp::croak("Invalid version object"); } return exists $self->{original} ? $self->{original} : exists $self->{qv} ? $self->normal : $self->numify; } sub vcmp { require UNIVERSAL; my ($left,$right,$swap) = @_; my $class = ref($left); unless ( UNIVERSAL::isa($right, $class) ) { $right = $class->new($right); } if ( $swap ) { ($left, $right) = ($right, $left); } unless (_verify($left)) { require Carp; Carp::croak("Invalid version object"); } unless (_verify($right)) { require Carp; Carp::croak("Invalid version object"); } my $l = $#{$left->{version}}; my $r = $#{$right->{version}}; my $m = $l < $r ? $l : $r; my $lalpha = $left->is_alpha; my $ralpha = $right->is_alpha; my $retval = 0; my $i = 0; while ( $i <= $m && $retval == 0 ) { $retval = $left->{version}[$i] <=> $right->{version}[$i]; $i++; } # tiebreaker for alpha with identical terms if ( $retval == 0 && $l == $r && $left->{version}[$m] == $right->{version}[$m] && ( $lalpha || $ralpha ) ) { if ( $lalpha && !$ralpha ) { $retval = -1; } elsif ( $ralpha && !$lalpha) { $retval = +1; } } # possible match except for trailing 0's if ( $retval == 0 && $l != $r ) { if ( $l < $r ) { while ( $i <= $r && $retval == 0 ) { if ( $right->{version}[$i] != 0 ) { $retval = -1; # not a match after all } $i++; } } else { while ( $i <= $l && $retval == 0 ) { if ( $left->{version}[$i] != 0 ) { $retval = +1; # not a match after all } $i++; } } } return $retval; } sub vbool { my ($self) = @_; return vcmp($self,$self->new("0"),1); } sub vnoop { require Carp; Carp::croak("operation not supported with version object"); } sub is_alpha { my ($self) = @_; return (exists $self->{alpha}); } sub qv { my ($value) = @_; $value = _un_vstring($value); $value = 'v'.$value unless $value =~ /(^v|\d+\.\d+\.\d)/; my $version = version->new($value); # always use base class return $version; } sub is_qv { my ($self) = @_; return (exists $self->{qv}); } sub _verify { my ($self) = @_; if ( ref($self) && eval { exists $self->{version} } && ref($self->{version}) eq 'ARRAY' ) { return 1; } else { return 0; } } sub _un_vstring { my $value = shift; # may be a v-string if ( $] >= 5.006_000 && length($value) >= 3 && $value !~ /[._]/ ) { my $tvalue = sprintf("v%vd",$value); if ( $tvalue =~ /^v\d+\.\d+\.\d+$/ ) { # must be a v-string $value = $tvalue; } } return $value; } # Thanks to Yitzchak Scott-Thoennes for this mode of operation { local $^W; *UNIVERSAL::VERSION # Module::Build::ModuleInfo doesn't see this now = sub { my ($obj, $req) = @_; my $class = ref($obj) || $obj; no strict 'refs'; eval "require $class" unless %{"$class\::"}; # already existing return undef if $@ =~ /Can't locate/ and not defined $req; if ( not %{"$class\::"} and $] >= 5.008) { # file but no package require Carp; Carp::croak( "$class defines neither package nor VERSION" ."--version check failed"); } my $version = eval "\$$class\::VERSION"; if ( defined $version ) { local $^W if $] <= 5.008; $version = version::vpp->new($version); } if ( defined $req ) { unless ( defined $version ) { require Carp; my $msg = $] < 5.006 ? "$class version $req required--this is only version " : "$class does not define \$$class\::VERSION" ."--version check failed"; if ( $ENV{VERSION_DEBUG} ) { Carp::confess($msg); } else { Carp::croak($msg); } } $req = version::vpp->new($req); if ( $req > $version ) { require Carp; if ( $req->is_qv ) { Carp::croak( sprintf ("%s version %s required--". "this is only version %s", $class, $req->normal, $version->normal) ); } else { Carp::croak( sprintf ("%s version %s required--". "this is only version %s", $class, $req->stringify, $version->stringify) ); } } } return defined $version ? $version->stringify : undef; }; } 1; #this line is important and will help the module return a true value EekBoek-2.02.04/inc/Module/Build/Dumper.pm0000444000076500007650000000067412165465617015667 0ustar jvjvpackage Module::Build::Dumper; use strict; use vars qw($VERSION); $VERSION = '0.32'; # This is just a split-out of a wrapper function to do Data::Dumper # stuff "the right way". See: # http://groups.google.com/group/perl.module.build/browse_thread/thread/c8065052b2e0d741 use Data::Dumper; sub _data_dump { my ($self, $data) = @_; return ("do{ my " . Data::Dumper->new([$data],['x'])->Purity(1)->Terse(0)->Dump() . '$x; }') } 1; EekBoek-2.02.04/inc/Module/Build/API.pod0000444000076500007650000017007312165465617015213 0ustar jvjv=head1 NAME Module::Build::API - API Reference for Module Authors =head1 DESCRIPTION I list here some of the most important methods in C. Normally you won't need to deal with these methods unless you want to subclass C. But since one of the reasons I created this module in the first place was so that subclassing is possible (and easy), I will certainly write more docs as the interface stabilizes. =head2 CONSTRUCTORS =over 4 =item current() [version 0.20] This method returns a reasonable facsimile of the currently-executing C object representing the current build. You can use this object to query its L method, inquire about installed modules, and so on. This is a great way to share information between different parts of your build process. For instance, you can ask the user a question during C, then use their answer during a regression test: # In Build.PL: my $color = $build->prompt("What is your favorite color?"); $build->notes(color => $color); # In t/colortest.t: use Module::Build; my $build = Module::Build->current; my $color = $build->notes('color'); ... The way the C method is currently implemented, there may be slight differences between the C<$build> object in Build.PL and the one in C. It is our goal to minimize these differences in future releases of Module::Build, so please report any anomalies you find. One important caveat: in its current implementation, C will B work correctly if you have changed out of the directory that C was invoked from. =item new() [version 0.03] Creates a new Module::Build object. Arguments to the new() method are listed below. Most arguments are optional, but you must provide either the L argument, or L and one of L or L. In other words, you must provide enough information to determine both a distribution name and version. =over 4 =item add_to_cleanup [version 0.19] An array reference of files to be cleaned up when the C action is performed. See also the L method. =item auto_features [version 0.26] This parameter supports the setting of features (see L) automatically based on a set of prerequisites. For instance, for a module that could optionally use either MySQL or PostgreSQL databases, you might use C like this: my $build = Module::Build->new ( ...other stuff here... auto_features => { pg_support => { description => "Interface with Postgres databases", requires => { 'DBD::Pg' => 23.3, 'DateTime::Format::Pg' => 0 }, }, mysql_support => { description => "Interface with MySQL databases", requires => { 'DBD::mysql' => 17.9, 'DateTime::Format::MySQL' => 0 }, }, } ); For each feature named, the required prerequisites will be checked, and if there are no failures, the feature will be enabled (set to C<1>). Otherwise the failures will be displayed to the user and the feature will be disabled (set to C<0>). See the documentation for L for the details of how requirements can be specified. =item autosplit [version 0.04] An optional C argument specifies a file which should be run through the L function. If multiple files should be split, the argument may be given as an array of the files to split. In general I don't consider autosplitting a great idea, because it's not always clear that autosplitting achieves its intended performance benefits. It may even harm performance in environments like mod_perl, where as much as possible of a module's code should be loaded during startup. =item build_class [version 0.28] The Module::Build class or subclass to use in the build script. Defaults to "Module::Build" or the class name passed to or created by a call to L. This property is useful if you're writing a custom Module::Build subclass and have a bootstrapping problem--that is, your subclass requires modules that may not be installed when C is executed, but you've listed in L so that they should be available when C<./Build> is executed. =item build_requires [version 0.07] Modules listed in this section are necessary to build and install the given module, but are not necessary for regular usage of it. This is actually an important distinction - it allows for tighter control over the body of installed modules, and facilitates correct dependency checking on binary/packaged distributions of the module. See the documentation for L for the details of how requirements can be specified. =item create_packlist [version 0.28] If true, this parameter tells Module::Build to create a F<.packlist> file during the C action, just like ExtUtils::MakeMaker does. The file is created in a subdirectory of the C installation location. It is used by some other tools (CPAN, CPANPLUS, etc.) for determining what files are part of an install. The default value is true. This parameter was introduced in Module::Build version 0.2609; previously no packlists were ever created by Module::Build. =item c_source [version 0.04] An optional C argument specifies a directory which contains C source files that the rest of the build may depend on. Any C<.c> files in the directory will be compiled to object files. The directory will be added to the search path during the compilation and linking phases of any C or XS files. =item conflicts [version 0.07] Modules listed in this section conflict in some serious way with the given module. C (or some higher-level tool) will refuse to install the given module if the given module/version is also installed. See the documentation for L for the details of how requirements can be specified. =item create_makefile_pl [version 0.19] This parameter lets you use Module::Build::Compat during the C (or C) action to automatically create a Makefile.PL for compatibility with ExtUtils::MakeMaker. The parameter's value should be one of the styles named in the L documentation. =item create_readme [version 0.22] This parameter tells Module::Build to automatically create a F file at the top level of your distribution. Currently it will simply use C (or C if it's installed) on the file indicated by C and put the result in the F file. This is by no means the only recommended style for writing a README, but it seems to be one common one used on the CPAN. If you generate a F in this way, it's probably a good idea to create a separate F file if that information isn't in the generated F. =item dist_abstract [version 0.20] This should be a short description of the distribution. This is used when generating metadata for F and PPD files. If it is not given then C looks in the POD of the module from which it gets the distribution's version. If it finds a POD section marked "=head1 NAME", then it looks for the first line matching C<\s+-\s+(.+)>, and uses the captured text as the abstract. =item dist_author [version 0.20] This should be something like "John Doe ", or if there are multiple authors, an anonymous array of strings may be specified. This is used when generating metadata for F and PPD files. If this is not specified, then C looks at the module from which it gets the distribution's version. If it finds a POD section marked "=head1 AUTHOR", then it uses the contents of this section. =item dist_name [version 0.11] Specifies the name for this distribution. Most authors won't need to set this directly, they can use C to set C to a reasonable default. However, some agglomerative distributions like C or C have names that don't correspond directly to a module name, so C can be set independently. =item dist_version [version 0.11] Specifies a version number for the distribution. See L or L for ways to have this set automatically from a C<$VERSION> variable in a module. One way or another, a version number needs to be set. =item dist_version_from [version 0.11] Specifies a file to look for the distribution version in. Most authors won't need to set this directly, they can use L to set it to a reasonable default. The version is extracted from the specified file according to the same rules as L and C. It involves finding the first line that matches the regular expression /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/ eval()-ing that line, then checking the value of the C<$VERSION> variable. Quite ugly, really, but all the modules on CPAN depend on this process, so there's no real opportunity to change to something better. If the target file of L contains more than one package declaration, the version returned will be the one matching the configured L. =item dynamic_config [version 0.07] A boolean flag indicating whether the F file must be executed, or whether this module can be built, tested and installed solely from consulting its metadata file. The main reason to set this to a true value is that your module performs some dynamic configuration as part of its build/install process. If the flag is omitted, the F spec says that installation tools should treat it as 1 (true), because this is a safer way to behave. Currently C doesn't actually do anything with this flag - it's up to higher-level tools like C to do something useful with it. It can potentially bring lots of security, packaging, and convenience improvements. =item extra_compiler_flags =item extra_linker_flags [version 0.19] These parameters can contain array references (or strings, in which case they will be split into arrays) to pass through to the compiler and linker phases when compiling/linking C code. For example, to tell the compiler that your code is C++, you might do: my $build = Module::Build->new ( module_name => 'Foo::Bar', extra_compiler_flags => ['-x', 'c++'], ); To link your XS code against glib you might write something like: my $build = Module::Build->new ( module_name => 'Foo::Bar', dynamic_config => 1, extra_compiler_flags => scalar `glib-config --cflags`, extra_linker_flags => scalar `glib-config --libs`, ); =item get_options [version 0.26] You can pass arbitrary command line options to F or F, and they will be stored in the Module::Build object and can be accessed via the L method. However, sometimes you want more flexibility out of your argument processing than this allows. In such cases, use the C parameter to pass in a hash reference of argument specifications, and the list of arguments to F or F will be processed according to those specifications before they're passed on to C's own argument processing. The supported option specification hash keys are: =over 4 =item type The type of option. The types are those supported by Getopt::Long; consult its documentation for a complete list. Typical types are C<=s> for strings, C<+> for additive options, and C for negatable options. If the type is not specified, it will be considered a boolean, i.e. no argument is taken and a value of 1 will be assigned when the option is encountered. =item store A reference to a scalar in which to store the value passed to the option. If not specified, the value will be stored under the option name in the hash returned by the C method. =item default A default value for the option. If no default value is specified and no option is passed, then the option key will not exist in the hash returned by C. =back You can combine references to your own variables or subroutines with unreferenced specifications, for which the result will also be stored in the hash returned by C. For example: my $loud = 0; my $build = Module::Build->new ( module_name => 'Foo::Bar', get_options => { loud => { store => \$loud }, dbd => { type => '=s' }, quantity => { type => '+' }, } ); print STDERR "HEY, ARE YOU LISTENING??\n" if $loud; print "We'll use the ", $build->args('dbd'), " DBI driver\n"; print "Are you sure you want that many?\n" if $build->args('quantity') > 2; The arguments for such a specification can be called like so: perl Build.PL --loud --dbd=DBD::pg --quantity --quantity --quantity B Any option specifications that conflict with Module::Build's own options (defined by its properties) will throw an exception. Consult the Getopt::Long documentation for details on its usage. =item include_dirs [version 0.24] Specifies any additional directories in which to search for C header files. May be given as a string indicating a single directory, or as a list reference indicating multiple directories. =item install_path [version 0.19] You can set paths for individual installable elements by using the C parameter: my $build = Module::Build->new ( ...other stuff here... install_path => { lib => '/foo/lib', arch => '/foo/lib/arch', } ); =item installdirs [version 0.19] Determines where files are installed within the normal perl hierarchy as determined by F. Valid values are: C, C, C. The default is C. See L =item license [version 0.07] Specifies the licensing terms of your distribution. Valid options include: =over 4 =item apache The distribution is licensed under the Apache Software License (L). =item artistic The distribution is licensed under the Artistic License, as specified by the F file in the standard Perl distribution. =item artistic_2 The distribution is licensed under the Artistic 2.0 License (L.) =item bsd The distribution is licensed under the BSD License (L). =item gpl The distribution is licensed under the terms of the GNU General Public License (L). =item lgpl The distribution is licensed under the terms of the GNU Lesser General Public License (L). =item mit The distribution is licensed under the MIT License (L). =item mozilla The distribution is licensed under the Mozilla Public License. (L or L) =item open_source The distribution is licensed under some other Open Source Initiative-approved license listed at L. =item perl The distribution may be copied and redistributed under the same terms as Perl itself (this is by far the most common licensing option for modules on CPAN). This is a dual license, in which the user may choose between either the GPL or the Artistic license. =item restrictive The distribution may not be redistributed without special permission from the author and/or copyright holder. =item unrestricted The distribution is licensed under a license that is B approved by www.opensource.org but that allows distribution without restrictions. =back Note that you must still include the terms of your license in your documentation - this field only lets automated tools figure out your licensing restrictions. Humans still need something to read. If you choose to provide this field, you should make sure that you keep it in sync with your written documentation if you ever change your licensing terms. You may also use a license type of C if you don't wish to specify your terms in the metadata. It is a fatal error to use a license other than the ones mentioned above. This is not because I wish to impose licensing terms on you - please let me know if you would like another license option to be added to the list. I just started out with a small set of licenses to keep things simple, figuring I'd let people with actual working knowledge in this area tell me what to do. So if that's you, drop me a line. =item meta_add [version 0.28] A hash of key/value pairs that should be added to the F file during the C action. Any existing entries with the same names will be overridden. See the L section for details. =item meta_merge [version 0.28] A hash of key/value pairs that should be merged into the F file during the C action. Any existing entries with the same names will be overridden. The only difference between C and C is their behavior on hash-valued and array-valued entries: C will completely blow away the existing hash or array value, but C will merge the supplied data into the existing hash or array value. See the L section for details. =item module_name [version 0.03] The C is a shortcut for setting default values of C and C, reflecting the fact that the majority of CPAN distributions are centered around one "main" module. For instance, if you set C to C, then C will default to C and C will default to C. C will in turn be used to set C. Setting C won't override a C parameter you specify explicitly. =item PL_files [version 0.06] An optional parameter specifying a set of C<.PL> files in your distribution. These will be run as Perl scripts prior to processing the rest of the files in your distribution. They are usually used as templates for creating other files dynamically, so that a file like C might create the file C. The files are specified with the C<.PL> files as hash keys, and the file(s) they generate as hash values, like so: my $build = Module::Build->new ( module_name => 'Foo::Bar', ... PL_files => { 'lib/Foo/Bar.pm.PL' => 'lib/Foo/Bar.pm' }, ); Note that the path specifications are I given in Unix-like format, not in the style of the local system. If your C<.PL> scripts don't create any files, or if they create files with unexpected names, or even if they create multiple files, you can indicate that so that Module::Build can properly handle these created files: PL_files => { 'lib/Foo/Bar.pm.PL' => 'lib/Foo/Bar.pm', 'lib/something.PL' => ['/lib/something', '/lib/else'], 'lib/funny.PL' => [], } =item pm_files [version 0.19] An optional parameter specifying the set of C<.pm> files in this distribution, specified as a hash reference whose keys are the files' locations in the distributions, and whose values are their logical locations based on their package name, i.e. where they would be found in a "normal" Module::Build-style distribution. This parameter is mainly intended to support alternative layouts of files. For instance, if you have an old-style MakeMaker distribution for a module called C and a F file at the top level of the distribution, you could specify your layout in your C like this: my $build = Module::Build->new ( module_name => 'Foo::Bar', ... pm_files => { 'Bar.pm' => 'lib/Foo/Bar.pm' }, ); Note that the values should include C, because this is where they would be found in a "normal" Module::Build-style distribution. Note also that the path specifications are I given in Unix-like format, not in the style of the local system. =item pod_files [version 0.19] Just like C, but used for specifying the set of C<.pod> files in your distribution. =item recommends [version 0.08] This is just like the L argument, except that modules listed in this section aren't essential, just a good idea. We'll just print a friendly warning if one of these modules aren't found, but we'll continue running. If a module is recommended but not required, all tests should still pass if the module isn't installed. This may mean that some tests may be skipped if recommended dependencies aren't present. Automated tools like CPAN.pm should inform the user when recommended modules aren't installed, and it should offer to install them if it wants to be helpful. See the documentation for L for the details of how requirements can be specified. =item recursive_test_files [version 0.28] Normally, C does not search subdirectories when looking for tests to run. When this options is set it will search recursively in all subdirectories of the standard 't' test directory. =item requires [version 0.07] An optional C argument specifies any module prerequisites that the current module depends on. One note: currently C doesn't actually I the user to have dependencies installed, it just strongly urges. In the future we may require it. There's also a L section for things that aren't absolutely required. Automated tools like CPAN.pm should refuse to install a module if one of its dependencies isn't satisfied, unless a "force" command is given by the user. If the tools are helpful, they should also offer to install the dependencies. A synonym for C is C, to help succour people transitioning from C. The C term is preferred, but the C term will remain valid in future distributions. See the documentation for L for the details of how requirements can be specified. =item script_files [version 0.18] An optional parameter specifying a set of files that should be installed as executable Perl scripts when the module is installed. May be given as an array reference of the files, as a hash reference whose keys are the files (and whose values will currently be ignored), as a string giving the name of a directory in which to find scripts, or as a string giving the name of a single script file. The default is to install any scripts found in a F directory at the top level of the distribution. For backward compatibility, you may use the parameter C instead of C. Please consider this usage deprecated, though it will continue to exist for several version releases. =item sign [version 0.16] If a true value is specified for this parameter, L will be used (via the 'distsign' action) to create a SIGNATURE file for your distribution during the 'distdir' action, and to add the SIGNATURE file to the MANIFEST (therefore, don't add it yourself). The default value is false. In the future, the default may change to true if you have C installed on your system. =item test_files [version 0.23] An optional parameter specifying a set of files that should be used as C-style regression tests to be run during the C action. May be given as an array reference of the files, or as a hash reference whose keys are the files (and whose values will currently be ignored). If the argument is given as a single string (not in an array reference), that string will be treated as a C pattern specifying the files to use. The default is to look for a F script in the top-level directory of the distribution, and any files matching the glob pattern C<*.t> in the F subdirectory. If the C property is true, then the C directory will be scanned recursively for C<*.t> files. =item use_tap_harness [version 0.2808_03] An optional parameter indicating whether or not to use TAP::Harness for testing rather than Test::Harness. Defaults to false. If set to true, you must therefore be sure to add TAP::Harness as a requirement for your module in L. Implicitly set to a true value if C is specified. =item tap_harness_args [version 0.2808_03] An optional parameter specifying parameters to be passed to TAP::Harness when running tests. Must be given as a hash reference of parameters; see the L documentation for details. Note that specifying this parameter will implicitly set C to a true value. You must therefore be sure to add TAP::Harness as a requirement for your module in L. =item xs_files [version 0.19] Just like C, but used for specifying the set of C<.xs> files in your distribution. =back =item new_from_context(%args) [version 0.28] When called from a directory containing a F script and a F file (in other words, the base directory of a distribution), this method will run the F and return the resulting C object to the caller. Any key-value arguments given to C are essentially like command line arguments given to the F script, so for example you could pass C<< verbose => 1 >> to this method to turn on verbosity. =item resume() [version 0.03] You'll probably never call this method directly, it's only called from the auto-generated C script. The C method is only called once, when the user runs C. Thereafter, when the user runs C or another action, the C object is created using the C method to re-instantiate with the settings given earlier to C. =item subclass() [version 0.06] This creates a new C subclass on the fly, as described in the L section. The caller must provide either a C or C parameter, or both. The C parameter indicates the name to use for the new subclass, and defaults to C. The C parameter specifies Perl code to use as the body of the subclass. =item add_property [version 0.31] package 'My::Build'; use base 'Module::Build'; __PACKAGE__->add_property( 'pedantic' ); __PACKAGE__->add_property( answer => 42 ); __PACKAGE__->add_property( 'epoch', default => sub { time }, check => sub { return 1 if /^\d+$/; shift->property_error( "'$_' is not an epoch time" ); return 0; }, ); Adds a property to a Module::Build class. Properties are those attributes of a Module::Build object which can be passed to the constructor and which have accessors to get and set them. All of the core properties, such as C and C, are defined using this class method. The first argument to C is always the name of the property. The second argument can be either a default value for the property, or a list of key/value pairs. The supported keys are: =over =item C The default value. May optionally be specified as a code reference, in which case the return value from the execution of the code reference will be used. If you need the default to be a code reference, just use a code reference to return it, e.g.: default => sub { sub { ... } }, =item C A code reference that checks that a value specified for the property is valid. During the execution of the code reference, the new value will be included in the C<$_> variable. If the value is correct, the C code reference should return true. If the value is not correct, it sends an error message to C and returns false. =back When this method is called, a new property will be installed in the Module::Build class, and an accessor will be built to allow the property to be get or set on the build object. print $build->pedantic, $/; $build->pedantic(0); If the default value is a hash reference, this generetes a special-case accessor method, wherein individual key/value pairs may be set or fetched: print "stuff{foo} is: ", $build->stuff( 'foo' ), $/; $build->stuff( foo => 'bar' ); print $build->stuff( 'foo' ), $/; # Outputs "bar" Of course, you can still set the entire hash reference at once, as well: $build->stuff( { foo => 'bar', baz => 'yo' } ); In either case, if a C has been specified for the property, it will be applied to the entire hash. So the check code reference should look something like: check => sub { return 1 if defined $_ && exists $_->{foo}; shift->property_error(qq{Property "stuff" needs "foo"}); return 0; }, =item property_error [version 0.31] =back =head2 METHODS =over 4 =item add_build_element($type) [version 0.26] Adds a new type of entry to the build process. Accepts a single string specifying its type-name. There must also be a method defined to process things of that type, e.g. if you add a build element called C<'foo'>, then you must also define a method called C. See also L. =item add_to_cleanup(@files) [version 0.03] You may call C<< $self->add_to_cleanup(@patterns) >> to tell C that certain files should be removed when the user performs the C action. The arguments to the method are patterns suitable for passing to Perl's C function, specified in either Unix format or the current machine's native format. It's usually convenient to use Unix format when you hard-code the filenames (e.g. in F) and the native format when the names are programmatically generated (e.g. in a testing script). I decided to provide a dynamic method of the C<$build> object, rather than just use a static list of files named in the F, because these static lists can get difficult to manage. I usually prefer to keep the responsibility for registering temporary files close to the code that creates them. =item args() [version 0.26] my $args_href = $build->args; my %args = $build->args; my $arg_value = $build->args($key); $build->args($key, $value); This method is the preferred interface for retrieving the arguments passed via command line options to F or F, minus the Module-Build specific options. When called in in a scalar context with no arguments, this method returns a reference to the hash storing all of the arguments; in an array context, it returns the hash itself. When passed a single argument, it returns the value stored in the args hash for that option key. When called with two arguments, the second argument is assigned to the args hash under the key passed as the first argument. =item autosplit_file($from, $to) [version 0.28] Invokes the L module on the C<$from> file, sending the output to the C directory inside C<$to>. C<$to> is typically the C directory. =item base_dir() [version 0.14] Returns a string containing the root-level directory of this build, i.e. where the C script and the C directory can be found. This is usually the same as the current working directory, because the C script will C into this directory as soon as it begins execution. =item build_requires() [version 0.21] Returns a hash reference indicating the C prerequisites that were passed to the C method. =item cbuilder() [version 0.2809] Returns the internal ExtUtils::CBuilder object that can be used for compiling & linking C code. If no such object is available (e.g. if the system has no compiler installed) an exception will be thrown. =item check_installed_status($module, $version) [version 0.11] This method returns a hash reference indicating whether a version dependency on a certain module is satisfied. The C<$module> argument is given as a string like C<"Data::Dumper"> or C<"perl">, and the C<$version> argument can take any of the forms described in L above. This allows very fine-grained version checking. The returned hash reference has the following structure: { ok => $whether_the_dependency_is_satisfied, have => $version_already_installed, need => $version_requested, # Same as incoming $version argument message => $informative_error_message, } If no version of C<$module> is currently installed, the C value will be the string C<< "" >>. Otherwise the C value will simply be the version of the installed module. Note that this means that if C<$module> is installed but doesn't define a version number, the C value will be C - this is why we don't use C for the case when C<$module> isn't installed at all. This method may be called either as an object method (C<< $build->check_installed_status($module, $version) >>) or as a class method (C<< Module::Build->check_installed_status($module, $version) >>). =item check_installed_version($module, $version) [version 0.05] Like L, but simply returns true or false depending on whether module C<$module> satisfies the dependency C<$version>. If the check succeeds, the return value is the actual version of C<$module> installed on the system. This allows you to do the following: my $installed = $build->check_installed_version('DBI', '1.15'); if ($installed) { print "Congratulations, version $installed of DBI is installed.\n"; } else { die "Sorry, you must install DBI.\n"; } If the check fails, we return false and set C<$@> to an informative error message. If C<$version> is any non-true value (notably zero) and any version of C<$module> is installed, we return true. In this case, if C<$module> doesn't define a version, or if its version is zero, we return the special value "0 but true", which is numerically zero, but logically true. In general you might prefer to use C if you need detailed information, or this method if you just need a yes/no answer. =item compare_versions($v1, $op, $v2) [version 0.28] Compares two module versions C<$v1> and C<$v2> using the operator C<$op>, which should be one of Perl's numeric operators like C or C<< >= >> or the like. We do at least a halfway-decent job of handling versions that aren't strictly numeric, like C<0.27_02>, but exotic stuff will likely cause problems. In the future, the guts of this method might be replaced with a call out to C. =item config($key) =item config($key, $value) =item config() [deprecated] [version 0.22] With a single argument C<$key>, returns the value associated with that key in the C hash, including any changes the author or user has specified. With C<$key> and C<$value> arguments, sets the value for future callers of C. With no arguments, returns a hash reference containing all such key-value pairs. This usage is deprecated, though, because it's a resource hog and violates encapsulation. =item config_data($name) =item config_data($name => $value) [version 0.26] With a single argument, returns the value of the configuration variable C<$name>. With two arguments, sets the given configuration variable to the given value. The value may be any Perl scalar that's serializable with C. For instance, if you write a module that can use a MySQL or PostgreSQL back-end, you might create configuration variables called C and C, and set each to an array of connection parameters for C<< DBI->connect() >>. Configuration values set in this way using the Module::Build object will be available for querying during the build/test process and after installation via the generated C<...::ConfigData> module, as C<< ...::ConfigData->config($name) >>. The L and C methods represent Module::Build's main support for configuration of installed modules. See also L. =item conflicts() [version 0.21] Returns a hash reference indicating the C prerequisites that were passed to the C method. =item contains_pod($file) [version 0.20] [Deprecated] Please see L instead. Returns true if the given file appears to contain POD documentation. Currently this checks whether the file has a line beginning with '=pod', '=head', or '=item', but the exact semantics may change in the future. =item copy_if_modified(%parameters) [version 0.19] Takes the file in the C parameter and copies it to the file in the C parameter, or the directory in the C parameter, if the file has changed since it was last copied (or if it doesn't exist in the new location). By default the entire directory structure of C will be copied into C; an optional C parameter will copy into C without doing so. Returns the path to the destination file, or C if nothing needed to be copied. Any directories that need to be created in order to perform the copying will be automatically created. The destination file is set to read-only. If the source file has the executable bit set, then the destination file will be made executable. =item create_build_script() [version 0.05] Creates an executable script called C in the current directory that will be used to execute further user actions. This script is roughly analogous (in function, not in form) to the Makefile created by C. This method also creates some temporary data in a directory called C<_build/>. Both of these will be removed when the C action is performed. Among the files created in C<_build/> is a F<_build/prereqs> file containing the set of prerequisites for this distribution, as a hash of hashes. This file may be C-ed to obtain the authoritative set of prereqs, which might be different from the contents of F (because F might have set them dynamically). But fancy developers take heed: do not put any fancy custom runtime code in the F<_build/prereqs> file, leave it as a static declaration containing only strings and numbers. Similarly, do not alter the structure of the internal C<< $self->{properties}{requires} >> (etc.) data members, because that's where this data comes from. =item current_action() [version 0.28] Returns the name of the currently-running action, such as "build" or "test". This action is not necessarily the action that was originally invoked by the user. For example, if the user invoked the "test" action, current_action() would initially return "test". However, action "test" depends on action "code", so current_action() will return "code" while that dependency is being executed. Once that action has completed, current_action() will again return "test". If you need to know the name of the original action invoked by the user, see L below. =item depends_on(@actions) [version 0.28] Invokes the named action or list of actions in sequence. Using this method is preferred to calling the action explicitly because it performs some internal record-keeping, and it ensures that the same action is not invoked multiple times (note: in future versions of Module::Build it's conceivable that this run-only-once mechanism will be changed to something more intelligent). Note that the name of this method is something of a misnomer; it should really be called something like C or something, but for better or worse (perhaps better!) we were still thinking in C-like dependency terms when we created this method. See also L. The main distinction between the two is that C is meant to call an action from inside another action, whereas C is meant to set the very top action in motion. =item dir_contains($first_dir, $second_dir) [version 0.28] Returns true if the first directory logically contains the second directory. This is just a convenience function because C doesn't really provide an easy way to figure this out (but C does...). =item dispatch($action, %args) [version 0.03] Invokes the build action C<$action>. Optionally, a list of options and their values can be passed in. This is equivalent to invoking an action at the command line, passing in a list of options. Custom options that have not been registered must be passed in as a hash reference in a key named "args": $build->dispatch('foo', verbose => 1, args => { my_option => 'value' }); This method is intended to be used to programmatically invoke build actions, e.g. by applications controlling Module::Build-based builds rather than by subclasses. See also L. The main distinction between the two is that C is meant to call an action from inside another action, whereas C is meant to set the very top action in motion. =item dist_dir() [version 0.28] Returns the name of the directory that will be created during the C action. The name is derived from the C and C properties. =item dist_name() [version 0.21] Returns the name of the current distribution, as passed to the C method in a C or modified C parameter. =item dist_version() [version 0.21] Returns the version of the current distribution, as determined by the C method from a C, C, or C parameter. =item do_system($cmd, @args) [version 0.21] This is a fairly simple wrapper around Perl's C built-in command. Given a command and an array of optional arguments, this method will print the command to C, and then execute it using Perl's C. It returns true or false to indicate success or failure (the opposite of how C works, but more intuitive). Note that if you supply a single argument to C, it will/may be processed by the systems's shell, and any special characters will do their special things. If you supply multiple arguments, no shell will get involved and the command will be executed directly. =item feature($name) =item feature($name => $value) [version 0.26] With a single argument, returns true if the given feature is set. With two arguments, sets the given feature to the given boolean value. In this context, a "feature" is any optional functionality of an installed module. For instance, if you write a module that could optionally support a MySQL or PostgreSQL backend, you might create features called C and C, and set them to true/false depending on whether the user has the proper databases installed and configured. Features set in this way using the Module::Build object will be available for querying during the build/test process and after installation via the generated C<...::ConfigData> module, as C<< ...::ConfigData->feature($name) >>. The C and C methods represent Module::Build's main support for configuration of installed modules. See also L. =item fix_shebang_line(@files) [version 0.??] Modify any "shebang" line in the specified files to use the path to the perl executable being used for the current build. Files are modified in-place. The existing shebang line must have a command that contains "C"; arguments to the command do not count. In particular, this means that the use of C<#!/usr/bin/env perl> will not be changed. For an explanation of shebang lines, see L. =item have_c_compiler() [version 0.21] Returns true if the current system seems to have a working C compiler. We currently determine this by attempting to compile a simple C source file and reporting whether the attempt was successful. =item install_base_relpaths() =item install_base_relpaths($type) =item install_base_relpaths($type => $path) [version 0.28] Set or retrieve the relative paths that are appended to C for any installable element. This is useful if you want to set the relative install path for custom build elements. With no argument, it returns a reference to a hash containing all elements and their respective values. This hash should not be modified directly; use the multi-argument below form to change values. The single argument form returns the value associated with the element C<$type>. The multi-argument form allows you to set the paths for element types. C<$value> must be a relative path using unix-like paths. (A series of directories seperated by slashes. Eg 'foo/bar'.) The return value is a localized path based on C<$value>. Assigning the value C to an element causes it to be removed. =item install_destination($type) [version 0.28] Returns the directory in which items of type C<$type> (e.g. C, C, C, or anything else returned by the L method) will be installed during the C action. Any settings for C, C, and C are taken into account when determining the return value. =item install_path() =item install_path($type) =item install_path($type => $path) [version 0.28] Set or retrieve paths for specific installable elements. This is useful when you want to examine any explicit install paths specified by the user on the command line, or if you want to set the install path for a specific installable element based on another attribute like C. With no argument, it returns a reference to a hash containing all elements and their respective values. This hash should not be modified directly; use the multi-argument below form to change values. The single argument form returns the value associated with the element C<$type>. The multi-argument form allows you to set the paths for element types. The supplied C<$path> should be an absolute path to install elements of C<$type>. The return value is C<$path>. Assigning the value C to an element causes it to be removed. =item install_types() [version 0.28] Returns a list of installable types that this build knows about. These types each correspond to the name of a directory in F, and the list usually includes items such as C, C, C, C