- #!/usr/bin/perl
- # This file is copyright (C) 2007the LedgerSMB core team and licensed under
- # the GNU General Public License. For more information please see the included
- # LICENSE and COPYRIGHT files
- # THIS FILE NEEDS POD
- package LedgerSMB::Scripts::vouchers;
- our $VERSION = '0.1';
- $menufile = "menu.ini";
- use LedgerSMB::Batch;
- use LedgerSMB::Voucher;
- use LedgerSMB::Template;
- use strict;
- # custom_batch_types hash provides hooks for handling additional batch types
- # beyond the default types. Entries can be added in a custom file.
- # Each entry is a hash, keyed by name, with the following keys:
- # * map_to int (maps to another type, not needed for new types in batch_class
- # table)
- # * select_method (maps to the selection stored proc)
- #
- # for example:
- # $custom_batch_types->{ap_sample} =
- # {map_to => 1,
- # select_method => 'custom_sample_ap_select'};
- #
- # --CT
- our $custom_batch_types = {};
- eval { do "scripts/custom/vouchers.pl"};
- sub create_batch {
- my ($request) = @_;
- $request->{hidden} = [
- {name => "batch_type", value => $request->{batch_type}},
- ];
- my $batch = LedgerSMB::Batch->new({base => $request});
- $batch->{class_id} = $batch->get_class_id($batch->{batch_type});
- $batch->get_search_results({mini => 1});
- my $template = LedgerSMB::Template->new(
- user =>$request->{_user},
- locale => $request->{_locale},
- path => 'UI',
- template => 'create_batch',
- format => 'HTML'
- );
- $template->render($batch);
- }
- sub create_vouchers {
- my ($request) = shift @_;
- my $batch = LedgerSMB::Batch->new({base => $request});
- $batch->{batch_class} = $request->{batch_type};
- $batch->create;
- add_vouchers($batch);
- }
- sub add_vouchers {
- # This function is not safe for caching as long as the scripts are in bin.
- # This is because these scripts import all functions into the *current*
- # namespace. People using fastcgi and modperl should *not* cache this
- # module at the moment. -- CT
- # Also-- request is in 'our' scope here due to the redirect logic.
- our ($request) = shift @_;
- use LedgerSMB::Form;
- my $batch = LedgerSMB::Batch->new({base => $request});
- our $vouchers_dispatch =
- {
- ap => {script => 'bin/ap.pl', function => sub {add()}},
- ar => {script => 'bin/ar.pl', function => sub {add()}},
- gl => {script => 'bin/gl.pl', function => sub {add()}},
- receipt => {script => 'scripts/payment.pl',
- function => sub {
- my ($request) = @_;
- $request->{account_class} = 2;
- LedgerSMB::Scripts::payment::payments($request);
- }},
- payment => {script => 'scripts/payment.pl',
- function => sub {
- my ($request) = @_;
- $request->{account_class} = 1;
- LedgerSMB::Scripts::payment::payments($request);
- }},
- payment_reversal => {
- script => 'scripts/payment.pl',
- function => sub {
- my ($request) = @_;
- $request->{account_class} = 1;
- LedgerSMB::Scripts::payment::get_search_criteria($request, $custom_batch_types);
- }},
- receipt_reversal => {
- script => 'scripts/payment.pl',
- function => sub {
- my ($request) = @_;
- $request->{account_class} = 2;
- LedgerSMB::Scripts::payment::get_search_criteria($request, $custom_batch_types);
- }},
-
-
- };
- our $form = new Form;
- our %myconfig = ();
- %myconfig = %{$request->{_user}};
- our $locale = $request->{_locale};
- for (keys %$request){
- $form->{$_} = $request->{$_};
- }
- $form->{batch_id} = $batch->{id};
- $form->{approved} = 0;
- $form->{transdate} = $request->{batch_date};
- $request->{batch_id} = $batch->{id};
- $request->{approved} = 0;
- $request->{transdate} = $request->{batch_date};
- my $script = $vouchers_dispatch->{$request->{batch_type}}{script};
- $form->{script} = $script;
- $form->{script} =~ s|.*/||;
- delete $form->{id};
- delete $request->{id};
- if ($script =~ /^bin/){
- # Note that the line below is generally considered incredibly bad form.
- # However, the code we are including is going to require it for now.
- # -- CT
- { no strict; no warnings 'redefine'; do $script; }
- } elsif ($script =~ /scripts/) {
- # Maybe we should move this to a require statement? --CT
- { do $script }
- }
- $vouchers_dispatch->{$request->{batch_type}}{function}($request);
- }
- sub search_batch {
- my ($request) = @_;
- my $batch_request = LedgerSMB::Batch->new(base => $request);
- $batch_request->get_search_criteria($custom_batch_types);
- my $template = LedgerSMB::Template->new(
- user => $request->{_user},
- locale => $request->{_locale},
- path => 'UI/batch',
- template => 'filter',
- format => 'HTML',
- );
- $template->render($batch_request);
- }
- sub list_batches {
- my ($request) = @_;
- my $batch = LedgerSMB::Batch->new(base => $request);
- my @search_results = $batch->get_search_results({custom_types => $custom_batch_types});
- $batch->{script} = "vouchers.pl";
- my @columns =
- qw(select id control_code description transaction_total payment_total);
- my $base_href = "vouchers.pl";
- my $search_href = "$base_href?action=list_batches";
- my $batch_href = "$base_href?action=get_batch";
- for my $key (
- qw(class_id approved created_by description amount_gt amount_lt)
- ){
- $search_href .= "&$key=$batch->{key}";
- }
- my %column_heading = (
- 'select' => $batch->{_locale}->text('Select'),
- transaction_total => {
- text => $batch->{_locale}->text('AR/AP/GL Total'),
- href => "$search_href&order_by=transaction_total"
- },
- payment_total => {
- text => $batch->{_locale}->text('Paid/Received Total'),
- href => "$search_href&order_by=payment_total"
- },
- description => {
- text => $batch->{_locale}->text('Description'),
- href => "$search_href&order_by=description"
- },
- control_code => {
- text => $batch->{_locale}->text('Batch Number'),
- href => "$search_href&order_by=control_code"
- },
- id => {
- text => $batch->{_locale}->text('ID'),
- href => "$search_href&order_by=control_code"
- },
- );
- my $count = 0;
- my @rows;
- for my $result (@search_results){
- ++$count;
- $batch->{"row_$count"} = $result->{id};
- push @rows, {
- 'select' => {
- input => {
- type => 'checkbox',
- value => 1,
- name => "batch_$result->{id}"
- }
- },
- transaction_total => $batch->format_amount(
- amount => $result->{transaction_total}
- ),
- payment_total => $batch->format_amount (
- amount => $result->{payment_total}
- ),
- description => $result->{description},
- control_code => {
- text => $result->{control_code},
- href => "$batch_href&batch_id=$result->{id}",
- },
- id => $result->{id},
- };
- }
- $batch->{rowcount} = $count;
- my $template = LedgerSMB::Template->new(
- user => $request->{_user},
- locale => $request->{_locale},
- path => 'UI',
- template => 'form-dynatable',
- format => ($batch->{format}) ? $batch->{format} : 'HTML',
- );
- my $hiddens = $batch->take_top_level();
- $batch->{rowcount} = "$count";
- delete $batch->{search_results};
- $template->render({
- form => $batch,
- columns => \@columns,
- heading => \%column_heading,
- rows => \@rows,
- hiddens => $hiddens,
- buttons => [{
- name => 'action',
- type => 'submit',
- text => $request->{_locale}->text('Post'),
- value => 'batch_approve',
- class => 'submit',
- },{
- name => 'action',
- type => 'submit',
- text => $request->{_locale}->text('Delete'),
- value => 'batch_delete',
- class => 'submit',
- }]
- });
-
- }
- sub get_batch {
- my ($request) = @_;
- my $batch = LedgerSMB::Batch->new(base => $request);
- $batch->{script} = 'vouchers.pl';
- my $rows = [];
- $batch->{id} ||= $batch->{batch_id};
- # $batch->get;
- my @vouchers = $batch->list_vouchers;
- my $base_href = "vouchers.pl?action=get_batch&batch_id=$batch->{batch_id}";
- my @columns = qw(selected id description batch_class reference amount date);
- my $heading = {
- selected => $request->{_locale}->text('Selected'),
- id => {
- text => $request->{_locale}->text('ID'),
- href => "$base_href&order_by=id"
- },
- description => {
- href => "$base_href&order_by=description",
- text => $request->{_locale}->text('Description'),
- },
- batch_class => {
- text => $request->{_locale}->text('Class'),
- href => "$base_href&order_by=class"
- },
- amount => {
- text => $request->{_locale}->text('Amount'),
- href => "$base_href&order_by=amount"
- },
- reference => {
- text => $request->{_locale}->text('Source/Reference'),
- href => "$base_href&order_by=reference"
- },
- date => {
- text => $request->{_locale}->text('Date'),
- href => "$base_href&order_by=date"
- }
- };
- my $classcount;
- my $count = 1;
- for my $row (@vouchers) {
- $classcount = ($classcount + 1) % 2;
- $classcount ||= 0;
- push @$rows, {
- description => $row->{description},
- id => $row->{id},
- batch_class => $row->{batch_class},
- amount => $batch->format_amount(amount => $row->{amount}),
- date => $row->{transaction_date},
- reference => $row->{reference},
- i => "$classcount",
- selected => {
- input => {
- type => 'checkbox',
- name => "voucher_$row->{id}",
- value => "1"
- }
- }
- };
- $batch->{"row_$count"} = $row->{id};
- ++$count;
- }
- $batch->{rowcount} = $count;
- $batch->{title} = "Batch ID: $batch->{batch_id}";
- my $template = LedgerSMB::Template->new(
- user => $request->{_user},
- locale => $request->{_locale},
- path => 'UI',
- template => 'form-dynatable',
- format => ($batch->{format}) ? $batch->{format} : 'HTML',
- );
- my $hiddens = $batch->take_top_level();
- $template->render({
- form => $batch,
- columns => \@columns,
- heading => $heading,
- rows => $rows,
- hiddens => $hiddens,
- buttons => [{
- name => 'action',
- type => 'submit',
- text => $request->{_locale}->text('Post Batch'),
- value => 'batch_approve',
- class => 'submit',
- },{
- name => 'action',
- type => 'submit',
- text => $request->{_locale}->text('Delete Batch'),
- value => 'batch_delete',
- class => 'submit',
- },{
- name => 'action',
- type => 'submit',
- text => $request->{_locale}->text('Delete Vouchers'),
- value => 'voucher_delete',
- class => 'submit',
- }]
- });
-
-
- }
- sub list_batches_batch_delete {
- batch_delete(@_);
- }
- sub list_batches_batch_approve {
- batch_approve(@_);
- }
- sub get_batch__batch_approve {
- batch_approve(@_);
- }
- sub get_batch_voucher_delete {
- my ($request) = @_;
- my $batch = LedgerSMB::Batch->new(base => $request);
- for my $count (1 .. $batch->{rowcount}){
- my $voucher_id = $batch->{"row_$count"};
- next unless $batch->{"voucher_$voucher_id"};
- $batch->delete_voucher($voucher_id);
- }
- search_batch($request);
- }
- sub batch_approve {
- my ($request) = @_;
- my $batch = LedgerSMB::Batch->new(base => $request);
- for my $count (1 .. $batch->{rowcount}){
- next unless $batch->{"batch_" . $batch->{"row_$count"}};
- $batch->{batch_id} = $batch->{"row_$count"};
- $batch->post;
- }
- search_batch($request);
- }
- sub batch_delete {
- my ($request) = @_;
- my $batch = LedgerSMB::Batch->new(base => $request);
- for my $count (1 .. $batch->{rowcount}){
- next unless $batch->{"batch_" . $batch->{"row_$count"}};
- $batch->{batch_id} = $batch->{"row_$count"};
- $batch->delete;
- }
- search_batch($request);
- }
- eval { do "scripts/custom/vouchers.pl"};
- 1;
|