diff options
Diffstat (limited to 'LedgerSMB/DBObject')
-rw-r--r-- | LedgerSMB/DBObject/Admin.pm | 3 | ||||
-rw-r--r-- | LedgerSMB/DBObject/Reconciliation.pm | 249 |
2 files changed, 251 insertions, 1 deletions
diff --git a/LedgerSMB/DBObject/Admin.pm b/LedgerSMB/DBObject/Admin.pm index fae330a8..67218005 100644 --- a/LedgerSMB/DBObject/Admin.pm +++ b/LedgerSMB/DBObject/Admin.pm @@ -112,9 +112,10 @@ sub save_roles { # These roles are were ALL checked on the page, so they're the active ones. - if ($active_roles{$role} && $self->{$role}) { + if ( $active_roles{$role} && $self->{$role} ) { # do nothing. + ; } elsif ($active_roles{$role} && !($self->{$role} )) { diff --git a/LedgerSMB/DBObject/Reconciliation.pm b/LedgerSMB/DBObject/Reconciliation.pm new file mode 100644 index 00000000..7a7ba313 --- /dev/null +++ b/LedgerSMB/DBObject/Reconciliation.pm @@ -0,0 +1,249 @@ + +=pod + +=head1 NAME + +LedgerSMB::DBObject::Reconciliation - LedgerSMB class defining the core +database interaction logic for Reconciliation. + +=head1 SYOPSIS + +This module creates object instances based on LedgerSMB's in-database ORM. + +=head1 METHODS + +=over + +=item new ($class, base => $LedgerSMB::hash) + +This is the base constructor for all child classes. It must be used with base +argument because this is necessary for database connectivity and the like. + +Of course the base object can be any object that inherits LedgerSMB, so you can +use any subclass of that. The per-session dbh is passed between the objects +this way as is any information that is needed. + +=item reconcile($self, $total, $month, $entries) + +Accepts the total balance, as well as a list of all entries from the bank +statement as an array reference, and generates the pending report from +this list. +The first entry is always the total balance of the general ledger as +compared to the balance held by the bank. + +Month is taken to be the date that the statement as represented by Entries +is applicable to. + +Returns the new report ID. || An arrayref of entries. + +=item approve($self,$reportid) + +Approves the pending report $reportid. +Checks for error codes in the pending report, and approves the report if none +are found. + +Limitations: The creating user may not approve the report. + +Returns 1 on success. + +=item correct_entry($self, $report_id, $source_control_number, $new_balance) + +If the given entry $source_control_number in the report $report_id has an error +code, the entry will be updated with $new_balance, and the error code +recomputed. + +Returns the error code assigned to this entry. + + 0 for success + 1 for found in general ledger, but does not match $new_balance + 2 $source_control_number cannot be found in the general ledger + +=item get_report($self, $report_id) + +Collects all the rows from the database in the given report. Returns an +arrayref of entries in the table for the given report_id. + +Returns undef in the event of no records found. + +=item get_corrections($self, $report_id, $entry_id) + +Returns the corrections made for the selected report and entry. +Returns undef in the event of no corrections found. + +=item entry ($self,$report_id,$entry_id) + +Returns a single entry from the pending reports table, either cleared or +uncleared. + +=back + +=head1 Copyright (C) 2007, The LedgerSMB core team. + +This file is licensed under the Gnu General Public License version 2, or at your +option any later version. A copy of the license should have been included with +your software. + +=cut + +package LedgerSMB::DBObject::Reconciliation; + +use base qw(LedgerSMB::DBObject); +use LedgerSMB::DBObject; +use LedgerSMB::Reconciliation::CSV; + +# don't need new + +sub import_file { + + my $self = shift @_; + + # We need to know what the format is, for the text file. We should have a set of formats + # for the given file, listed in the DB, or based on modules available. + # + # Probably based on modules. + + # my $module = 'LedgerSMB/Reconciliaton/CSV/'.$self->{file_format}; + # require $module."pm"; + # my $obj_name = $module; + # $obj_name =~ s/\//::/g; + # my $parser = $obj_name::new(base=>$self); + + # $self->filename is currently a lie. There's no facility in the LSMB + # design to accomadate an uploaded file. + my $csv = LedgerSMB::Reconciliation::CSV->new(base=>$self); + $csv->process(); + + return $self->{entries}; +} + +sub approve { + + my $self = shift @_; + # the user should be embedded into the $self object. + my $report_id = shift @_; + + my $code = $self->exec_method(funcname=>'report_approve', args=>[$report_id]); # user + + if ($code == 0) { # no problem. + return $code; + } + # this is destined to change as we figure out the Error system. + elsif ($code == 99) { + + $self->error("User $self->{user}->{name} cannot approve report, must be a different user."); + } +} + +sub new_report { + + my $self = shift @_; + my $total = shift @_; + my $month = shift @_; + my $entries = shift @_; # expects an arrayref. + + # Total is in here somewhere, too + + # gives us a report ID to insert with. + my $report_id = $self->exec_method(funcname=>'reconciliation__new_report_id'); + + # Now that we have this, we need to create the internal report representation. + # Ideally, we OUGHT to not return anything here, save the report number. + unshift @{$entries}, { + scn => -1, + balance=> $total, + old_balance=> $self->exec_method(funcname=>'reconciliation__current_balance'), + date=>$month + }; + for my $entry ( @{$entries} ) { + + # Codes: + # 0 is success + # 1 is found, but mismatch + # 2 is not found + $code = $self->exec_method( + funcname=>'reconciliation__add_entry', + args=>[ + $report_id, + ] + ); + $entry{report_id} = $report_id; + $entry{code} = $self->add_entry( $entry ); + + } + + $self->exec_method(funcname=>'reconciliation__pending_transactions', args=>[$report_id, $date]); + + return ($report_id, $entries); # returns the report ID. +} + +sub correct_entry { + + my $self = shift @_; + my $report_id = $self->{report_id}; # shift @_; + my $scn = $self->{id}; #shift @_; + my $new_amount = $self->{new_amount}; #shift @_; + + # correct should return the new code value - whether or not it actually "matches" + my $code = $self->exec_method( + funcname=>'reconciliation__correct', + args=>[$report_id, $scn, $new_amount] + ); + return $code[0]->{'correct'}; +} + +sub get_report { + + my $self = shift @_; + + return $self->exec_method(funcname=>'reconciliation__report', args=>[$self->{report_id}]); +} + +sub get_corrections { + + my $self = shift @_; + + return $self->exec_method( + funcname=>'reconciliation__corrections', + args=>[$self->{report_id}, $self->{entry_id}] + ); +} + +sub entry { + + my $self = shift @_; + + return $self->exec_method( + funcname=>'reconciliation__single_entry', + args=>[$self->{report_id}, $self->{entry_id}] + ); +} + +sub search { + + my $self = shift @_; + + return $self->exec_method( + funcname=>'reconciliation__search', + args=>[$self->{date_begin}, $self->{date_end}, $self->{account}, $self->{status}] + ); +} + +sub get_pending { + + my $self = shift @_; + return $self->exec_method( + funcname=>'reconciliation__pending', + args=>[$self->{month}] + ); +} + +sub get_report_list { + + my $self = shift @_; + + return $self->exec_method( + funcname=>'reconciliation__report_list', + args=>[$self->{account},$self->{report}] + ); +} +1;
\ No newline at end of file |