#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::DB::Item::CAMechanicalStatementAdjustmentItem;
use strict;
use warnings;
use lib '/app/tools/common/lib';
use Common::Assert;
use Common::DB::Item;
use base 'Common::DB::Item';

use constant kTable => 'ca_mechanical_statement_adjustment_item';
use constant kDB    => Common::DB::Item::kClientDB();

use constant kAdjustmentTypeCCompNewLicense => 1;
#
# This code is used for adjustments triggered by a new license
# being added to a product, causing previously unallocated
# funds to be adjusted.

sub GetLastStatementAdjustment {
    my ( $class, $statementItemID ) = @_;

    # JPK - We apparently cannot rely on 'previous_ca_mechanical_statement_adjustment_item_id' anymore.
    # Going to re-write this query to sort by run id instead to find the last adjustment.
    #
    #    my $sql = "select * from ca_mechanical_statement_adjustment_item where original_ca_mechanical_statement_item_id=$statementItemID "
    #            . " and ca_mechanical_statement_adjustment_item_id NOT IN "
    #            . " ("
    #            . "  select previous_ca_mechanical_statement_adjustment_item_id from ca_mechanical_statement_adjustment_item "
    #            . "  where original_ca_mechanical_statement_item_id=$statementItemID"
    #            . " )";
    my $sql =
" select ca_mechanical_statement_adjustment_item.*, ca_mechanical_run.ca_mechanical_run_id from ca_mechanical_statement_adjustment_item"
      . " join ca_mechanical_statement using (ca_mechanical_statement_id)"
      . " join ca_mechanical_run using (ca_mechanical_run_id)"
      . "where original_ca_mechanical_statement_item_id=$statementItemID"
      . " and ca_mechanical_run.status in (0,2,5)"
      . " order by ca_mechanical_run.ca_mechanical_run_id desc";

    my $collection = $class->GetAll($sql);

    return undef unless $collection->hasNext();

    # JPK - Don't need this assertion anymore.
    #    assert($collection->size == 1);

    my $item = $collection->next;
    return $item;
}

sub GetByMechanicalStatementID {
    my ( $class, $statementID ) = @_;

    my $sql = "SELECT * FROM ca_mechanical_statement_adjustment_item WHERE ca_mechanical_statement_id=$statementID";
    return $class->GetAll($sql);
}

sub GetByMechanicalStatementIDPublisherID {
    my ( $class, $statementID, $publisherID ) = @_;

    my $sql = "SELECT * FROM ca_mechanical_statement_adjustment_item WHERE ca_mechanical_statement_id=$statementID"
      . " AND ca_track_license_id in (select ca_track_license_id from ca_track_license where ca_publisher_id=$publisherID)";
    return $class->GetAll($sql);
}

sub GetByMechanicalStatementIDTrackLicenseID {
    my ( $class, $statementID, $trackLicenseID ) = @_;

    my $sql =
        "SELECT * FROM ca_mechanical_statement_adjustment_item"
      . " WHERE ca_mechanical_statement_id=$statementID"
      . " AND ca_track_license_id=$trackLicenseID";

    return $class->GetAll($sql);
}

sub DeleteByMechanicalStatementID {
    my ( $class, $id ) = @_;

    my $sql = "DELETE from ca_mechanical_statement_adjustment_item WHERE ca_mechanical_statement_id=$id";
    my $dbo = Common::RSApp::GetClientDB();
    $dbo->DoCmd($sql);
}

1;
