#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::Catalog::AlbumContractAdvance;

use Carp;
use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::AlbumContractAdvance;
use RPS::DB::Item::AlbumContract;
use RPS::Catalog::AlbumSimple;

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{albumContractAdvanceID})
    {
        $self->_propertiesFromDB(\%properties, $args{albumContractAdvanceID});
    }
    elsif ($args{albumContractID})
    {
        $self->_propertiesFromDefaults(\%properties, $args{albumContractID});
    }
	else
    {
		# oops!
		assert(0);
    }

    $self->_initProperties(\%properties);
    $self->_initSubs(\%properties);

    return $self;
}


sub _propertiesFromDB
{
    my ($self, $hrProperties, $albumContractAdvanceID) = @_;

    my $dbItem = RPS::DB::Item::AlbumContractAdvance->Lookup(album_contract_advance_id => $albumContractAdvanceID);

    $self->_propertiesFromDBItem($hrProperties, $dbItem);
}


sub _propertiesFromDBItem
{
	my ($self, $hrProperties, $dbItem) = @_;

    $hrProperties->{album_contract_advance_id}  = $dbItem->album_contract_advance_id;
    $hrProperties->{album_contract_id}  = $dbItem->album_contract_id;
    $hrProperties->{advance_account_id} = $dbItem->advance_account_id;
    $hrProperties->{cross_collateralized}= $dbItem->cross_collateralized;
}


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

    $hrProperties->{album_contract_id} = $albumContractID;
}


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

    $self->{AlbumContractAdvanceID}	= Common::FormObject::Scalar->new(value => $props->{album_contract_advance_id}, readOnly => 1);
    $self->{AlbumContractID}		= Common::FormObject::Scalar->new(value => $props->{album_contract_id}, readOnly => 1);
    $self->{AdvanceAccountID}		= Common::FormObject::Scalar->new(value => $props->{advance_account_id}, required => 1);
    $self->{CrossCollateralized}	= Common::FormObject::Scalar::Boolean->new(value => $props->{cross_collateralized});
}


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

	if($self->loadSubs())
	{
		if($props->{advance_account_id})
		{
        	$self->{AdvanceAccount} = RPS::Finance::Account->new(accountID => $props->{advance_account_id}, readOnly => 1);
		}
        else
        {
        	$self->{AdvanceAccount} = RPS::Finance::Account->new(readOnly => 1);
        }
	}
}


sub addAdvance
{
    my ($self, $amount, $memo) = @_;


	my $dbItem;
	my $accountID;
	if ($self->AlbumContractAdvanceID())
	{
		$dbItem = RPS::DB::Item::AlbumContractAdvance->Lookup(album_contract_advance_id => $self->AlbumContractAdvanceID());
		$accountID = $dbItem->advance_account_id;
	}
	else
	{
		$dbItem = RPS::DB::Item::AlbumContractAdvance->Create();

	}


	if (! $accountID)
	{
		# create a new account
		#
		my $account = RPS::DB::Item::FinanceAccount->Create
		(
			description => "advance account for album contract",
			type_code => RPS::DB::Item::FinanceAccount::kAccountTypeAdvance(),
		);
		$account->save();
		$accountID = $account->finance_account_id;


        # Remember the new account id
        #
		$dbItem->advance_account_id($accountID);
	}


	# Create a transaction
	#
	if ($amount)
	{
		if(!$memo)
		{
			$memo = "album contract advance account transaction";
		}

		my $transaction = RPS::DB::Item::FinanceTransaction->Create
		(
			finance_account_id => $accountID,
			amount => $amount,
			type_code => RPS::DB::Item::FinanceTransaction::kTypeAdjustment(),
			memo => $memo,
		);
		$transaction->save();
	}


    $self->save($dbItem);
}

sub save
{
	my ($self, $dbItem) = @_;

	# -------------------------------
	# Save myself (AlbumContractAdvance)
	# -------------------------------
	#
    if (! $dbItem)
    {
	    if ($self->AlbumContractAdvanceID())
	    {
		    $dbItem = RPS::DB::Item::AlbumContractAdvance->Lookup(album_contract_advance_id => $self->AlbumContractAdvanceID());
	    }
	    else
	    {
	    	$dbItem = RPS::DB::Item::AlbumContractAdvance->Create();
	    }
    }

    $dbItem->album_contract_id($self->AlbumContractID());
	$dbItem->cross_collateralized($self->CrossCollateralized());


	$dbItem->save();

	# reload object state
	#
	$self->_init(_dbItem => $dbItem);
}


###
1;#
###


