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

use strict;
use warnings;
use Carp;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::ReserveLiquidation;

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{id} && $args{type} && $args{period})
    {
        $self->_propertiesFromDB(\%properties, $args{id}, $args{type}, $args{period});
    }
    else
    {
        $self->_propertiesFromDefaults(\%properties, $args{period}, $args{percent});
    }

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

    return $self;
}


sub _propertiesFromDB
{
    my ($self, $hrProperties, $id, $type, $period) = @_;

    my $dbItem = RPS::DB::Item::ReserveLiquidation->Lookup(id => $id,
														   type => $type,
														   period_id => $period);

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


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

	$self->{_inDB} = 1; # !!! Using an extra flag to denote that this was actually loaded from the db.

	$hrProperties->{id}			= $dbItem->id;
    $hrProperties->{type}		= $dbItem->type;
    $hrProperties->{period}		= $dbItem->period;
    $hrProperties->{percent}	= $dbItem->percent;

    $hrProperties->{date_created} = $dbItem->date_created;
    $hrProperties->{date_modified} = $dbItem->date_modified;
    $hrProperties->{created_by} = $dbItem->created_by;
    $hrProperties->{modified_by} = $dbItem->modified_by;
}


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

    # Set the fields from the finance_account db item.
    #
	  $self->{ID}			= Common::FormObject::Scalar->new(value => $props->{id});
    $self->{Type}		= Common::FormObject::Scalar->new(value => $props->{type});
    $self->{Period}		= Common::FormObject::Scalar->new(value => $props->{period});
    $self->{Percent}	= Common::FormObject::Scalar::Integer->new(value => $props->{percent}, maxLength => 3);

    $self->{CreatedDate}		= Common::FormObject::Scalar::DateTime->new(value => $props->{date_created}, readOnly => 1);
    $self->{ModifiedDate}		= 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);
}


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


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

    $hrProperties->{period} = $period;
    $hrProperties->{percent} = $percent;

	$self->{_inDB} = 0; # !!! Using an extra flag to denote that this was actually loaded from the db.
}


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

	return 1 if(! $self->Percent());

	my $valid = $self->SUPER::validate();

    return $valid if $ignoreRequiredFields;

	if(! $self->ID())
	{
		# print STDERR "validate: missing ID\n";
		# $self->{ID}->setError(Common::FormObject::kErrFieldBlank);
		# $valid = 0;
	}

	if(! $self->Type())
	{
		# print STDERR "validate: missing TYPE\n";
		# $self->{Type}->setError(Common::FormObject::kErrFieldBlank);
		# $valid = 0;
	}

	if(! $self->Period())
	{
		print STDERR "validate: missing Period\n";
		$self->{Period}->setError(Common::FormObject::kErrFieldBlank);
		$valid = 0;
	}

	if ($self->Percent() && $self->Percent() < 0 )
	{
		$self->{Period}->setError(Common::FormObject::kErrFieldInvalid);
		$valid = 0;
	}

	return $valid;
}


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

	# let's look for entries we need to delete
	#
	if (! $self->Percent())
	{
		# we don't save blank Percents, so try to delete
		#
		$self->delete();
		return;
	}

	# -------------------------------
	# Save myself (ReserveLiquidation)
	# -------------------------------
	#
	my $dbObj;
	if ($self->{_inDB})
	{
		# lookup existing
		#
		$dbObj = RPS::DB::Item::ReserveLiquidation->Lookup(id => $self->ID(),
														   type => $self->Type(),
														   period => $self->Period());
        $dbObj->modified_by($self->ModifiedBy());
        $dbObj->date_modified(Common::DB::Item::kDateTimeNow);

	}
	else
	{
		# create new entry
		#
		$dbObj = RPS::DB::Item::ReserveLiquidation->Create();
		$dbObj->id($self->ID());
		$dbObj->type($self->Type());
		$dbObj->period($self->Period());
        $dbObj->created_by($self->CreatedBy());
        $dbObj->date_created(Common::DB::Item::kDateTimeNow);

	}

	# this is really the only user inputted field
	#
	$dbObj->percent($self->Percent());

	$dbObj->save();
	$self->{_inDB} = 1;
}


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

	if($self->{_inDB})
	{
		my $dbObj = RPS::DB::Item::ReserveLiquidation->Lookup(id => $self->ID(),
															  type => $self->Type(),
															  period => $self->Period());
		$dbObj->delete();
		$self->{_inDB} = 0;
	}
}



###
1;#
###

