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

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::Expense::ExpenseList;
use RPS::Expense::ExpenseTypeList;
use RPS::LabelList;
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{albumContractID};
	my $expenseID = $args{expenseID};
	my $parentType = RPS::DB::Item::Expense::kParentAlbumContract();

	# one or the other
	#
    # Here's the funny thing: We don't really want to _edit_ the AlbumContractExpense 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::kParentAlbumContract());
	}


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

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

    $self->{Album} = RPS::Catalog::AlbumSimple->new
    (
        albumID => $self->{AlbumContract}->AlbumID(),
        loadSubs => 0,
        readOnly => 1,
    );

	$self->{LabelList} = RPS::LabelList->new();

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

	$self->{RoyaltyRunStatus} = new RPS::RoyaltyRun::RoyaltyRunStatusList( 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;#
###
