=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 # in_scn INT, #in_amount INT, #in_account INT, #in_user TEXT, #in_date TIMESTAMP $code = $self->exec_method( funcname=>'reconciliation__add_entry', args=>[ $report_id, $entry->{scn}, $entry->{amount}, # needs leading 0's trimmed. $entry->{account}, $self->{user}, $self->{date} ] ); $entry{report_id} = $report_id; } $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 @_; my $type = 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}] ); } sub get_accounts { my $self = shift @_; return $self->exec_method( funcname=>'reconciliation__account_list', ); } 1;