#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::Statement::Mechanical::BaseStatement;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::Client;
use Common::Assert;


use Common::FormObject;
use base 'Common::FormObject';


sub _init
{
    my ($self, %args) = @_;

    $self->SUPER::_init(%args);

    my %properties;
    if ($args{_dbItem})
    {
        $self->_propertiesFromDBItem(\%properties, $args{_dbItem});
    }
    elsif ($args{mechanicalStatementID})
    {
        $self->_propertiesFromDB(\%properties, $args{mechanicalStatementID});
    }
    else
    {
        $self->_propertiesFromDefaults(\%properties);
    }

    $self->_initProperties(\%properties);

    return $self;
}




sub _propertiesFromDB
{
    my ($self, $hrProperties, $id) = @_;
    assert(0, 'override this');
}


sub _propertiesFromDBItem
{
	my ($self, $hrProperties, $dbItem) = @_;
   assert(0, 'override this');
}

sub _getCurrencyCode
{
    assert(0, 'override this');
}

sub _getPublisher
{
    my ($self, $publisherID) = @_;
    assert(0, 'override this');
}


sub _initProperties
{
    my ($self, $props) = @_;

    # !!! Eventually we're going to want to use the Publisher's currency code, but for
    # !!! now we'll assume USD.
    #
    my $currencyCode = $self->_getCurrencyCode();

    $self->{MechanicalStatementID}  = Common::FormObject::Scalar->new(value => $props->{mechanical_statement_id}, readOnly => 1);
    $self->{MechanicalRunID}		= Common::FormObject::Scalar->new(value => $props->{mechanical_run_id}, readOnly => 1);
    $self->{PublisherID}            = Common::FormObject::Scalar->new(value => $props->{publisher_id});
    $self->{PayorID}                = Common::FormObject::Scalar->new(value => $props->{payor_id});
    $self->{StartDate}              = Common::FormObject::Scalar::Date->new(value => $props->{start_date}, readOnly => 1);
    $self->{EndDate}                = Common::FormObject::Scalar::Date->new(value => $props->{end_date}, readOnly => 1);
    $self->{Status}                 = Common::FormObject::Scalar->new(value => $props->{status});
    $self->{PreviousAdvanceBalance} = Common::FormObject::Scalar::Money->new(value => (-1 * $props->{previous_advance_balance}), precision => '.4', currencyCode => $currencyCode);
    $self->{PreviousBalance}        = Common::FormObject::Scalar::Money->new(value => $props->{previous_balance}, precision => '.4', currencyCode => $currencyCode);
    $self->{Subtotal}               = Common::FormObject::Scalar::Money->new(value => $props->{subtotal}, precision => '.4', currencyCode => $currencyCode);
    $self->{TransactionSubtotal}    = Common::FormObject::Scalar::Money->new(value => $props->{transaction_subtotal}, precision => '.4', currencyCode => $currencyCode);
    $self->{StatementTotal}         = Common::FormObject::Scalar::Money->new(value => $props->{statement_total}, precision => '.4', currencyCode => $currencyCode);
    $self->{AmountDue}              = Common::FormObject::Scalar::Money->new(value => $props->{amount_due}, precision => '.4', currencyCode => $currencyCode);
    $self->{AdvanceBalance}         = Common::FormObject::Scalar::Money->new(value => (-1 * $props->{advance_balance}), precision => '.4', currencyCode => $currencyCode);
    $self->{Balance}                = Common::FormObject::Scalar::Money->new(value => $props->{balance}, precision => '.4', currencyCode => $currencyCode);
    $self->{AppliedToAdvance}       = Common::FormObject::Scalar::Money->new(value => $props->{applied_to_advance}, precision => '.4', currencyCode => $currencyCode);
    $self->{AppliedToBalance}       = Common::FormObject::Scalar::Money->new(value => $props->{applied_to_balance}, precision => '.4', currencyCode => $currencyCode);
    $self->{DateCreated}            = Common::FormObject::Scalar::DateTime->new(value => $props->{date_created}, readOnly => 1);
    $self->{DateModified}           = Common::FormObject::Scalar::DateTime->new(value => $props->{date_modified}, readOnly => 1);
	$self->{CreatedBy}              = Common::FormObject::Scalar::UserName->new(value => $props->{created_by}, readOnly => 1);
	$self->{ModifiedBy}             = Common::FormObject::Scalar::UserName->new(value => $props->{modified_by}, readOnly => 1);

    $self->{PhysicalSubtotal}       = Common::FormObject::Scalar::Money->new(value => $props->{physical_subtotal}, precision => '.4', currencyCode => $currencyCode);
    $self->{DigitalSubtotal}        = Common::FormObject::Scalar::Money->new(value => $props->{digital_subtotal}, precision => '.4', currencyCode => $currencyCode);

    $self->{MinimumPayment}         = Common::FormObject::Scalar::Money->new(value => $props->{min_payment}, precision => '.4', currencyCode => $currencyCode);

    $self->{OnHold}                 = Common::FormObject::Scalar::Boolean->new(value => $props->{on_hold}, readOnly => 1);
    $self->{Version}                = Common::FormObject::Scalar->new(value => $props->{version}, readOnly => 1);


    # Have to fetch publisher info to finish these calculations...
    # !!! This can probably go away if we just capture all the pub data we need in the statement table...
    #
	$self->{Publisher}              = $self->_getPublisher($props->{publisher_id});

}


sub _propertiesFromDefaults
{
    my ($self, $hrProperties) = @_;
}

###
1;#
###
