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

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::Expense::ExpenseList;
use RPS::Expense::ExpenseTypeList;
use RPS::LabelList;
use RPS::DB::Item::Expense;

use RPS::Track::TrackSimple;
use RPS::Catalog::AlbumSimple;
use RPS::RoyaltyRun::RoyaltyRunStatusList;
use RPS::DB::Item::NewArtistContractTerm;

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

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

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

	my $parentID = $args{trackContractID};
	my $expenseID = $args{expenseID};
	my $parentType = RPS::DB::Item::Expense::kParentTrackContract;

	# one or the other
	#
    # Here's the funny thing: We don't really want to _edit_ the TrackContractExpense object directly.
    # So, there's no good reason to make it editable.
    #
	if($expenseID)
	{
		$self->{Expense} = RPS::Expense::Expense->new(expenseID => $expenseID);
	}
	else
	{
		# this means just display the lists
		$self->{Expense} = RPS::Expense::Expense->new(parentID => $parentID, parentType => RPS::DB::Item::Expense::kParentTrackContract);
	}


    # jpk - TrackContractExpense will not contain TrackContract anymore.
    # Instead, I'll just instantiate one of those as a peer, here in the form.
    #
    $self->{TrackContract} = RPS::Track::TrackContract->new
    (
        trackContractID => $parentID,
        loadSubs => 0,
        readOnly => 1,
    );

	$self->{_contractID} = $self->{TrackContract}->ContractID();

    $self->{Track} = RPS::Track::TrackSimple->new
    (
        trackID => $self->{TrackContract}->TrackID(),
        loadSubs => 0,
        readOnly => 1,
    );

    $self->{Track} = RPS::Track::TrackSimple->new(trackID => $self->{TrackContract}->TrackID(), readOnly => 1);
    $self->{Album} = RPS::Catalog::AlbumSimple->new(albumID => $self->{Track}->AlbumID(), loadSubs => 0, readOnly => 1);

    # Put some placeholders in here for editing purposes
    #
    $self->{ExpenseList} = RPS::Expense::ExpenseList->new(parentID => $parentID, parentType => RPS::DB::Item::Expense::kParentTrackContract);
    $self->{ExpenseTypeList} = RPS::Expense::ExpenseTypeList->new(artistContractID => $self->{_contractID});

	$self->{RoyaltyRunStatus} = RPS::RoyaltyRun::RoyaltyRunStatusList->new( artist => 1 );

    #
    # Check for missing or invalid (inactive or zero rate) default term
    # which would cause problems with net revenue deductions during an
    # artist royalty run.
    #
    my $invalidDefaultTerm = $self->_invalidDefaultTerm();
    if ( $invalidDefaultTerm )
    {
        $self->{DefaultTerm} = Common::FormObject::Scalar::Integer->new( value => $invalidDefaultTerm );
    }

	return $self;
}

# _invalidDefaultTerm - check if the contract is missing a default term
# or if the existing default term is valid.  Returns 0 if valid, or a
# status code indicating the problem (the status code is used in the
# expense xsl).
sub _invalidDefaultTerm
{
    my ($self) = @_;

    my $invalid = 0;

    my $default = RPS::DB::Item::NewArtistContractTerm->GetDefault( $self->contractID() );

    if ( !$default )
    {
        $invalid = 1; # Missing default term
    }
    else
    {
        if( $default->rate == 0 )
        {
            $invalid = 3; # Zero-rate default term
        }

    }

    return $invalid;
}


sub validate
{
	my ($self) = @_;

	$self->{Expense}->validate();
}


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

	$self->{Expense}->save();
}


sub contractID
{
	my ($self) = @_;
	return $self->{_contractID};
}

###
1;#
###
