Revision 712 (by ahitrov, 2018/08/17 20:16:53) $keeper->{payments}->add operation not dumb now

package payments::Keeper;

use strict;
use warnings 'all';
use base qw(Contenido::Keeper);


use Contenido::Globals;

sub add {
    my $self = shift;
    my (%opts) = @_;

    return undef	unless $opts{type} && ( $opts{order} && ref $opts{order} || $opts{uid} && $opts{order} && $opts{sum});
    return undef	unless $opts{type} =~ /^(create|suspend|cancel|append|refund|close)$/;

    my $status = exists $opts{status} ? $opts{status} : $state->development;
    my $ops = $keeper->get_documents(
		class		=> 'payments::Operation',
		status		=> $status,
		order_id	=> ref $opts{order} ? $opts{order}->id : $opts{order},
		order_by	=> 'ctime',
		return_mode	=> 'array_ref',
	);
    my $new = 0;
    my $op;
    if ( ref $ops eq 'ARRAY' && @$ops ) {
	my $last = $ops->[-1];
	if ( $opts{type} eq 'create' && ($last->name eq 'suspend' || $last->name eq 'cancel' || $last->name eq 'close') ) {
		warn "PAYMENTS[add-op]: Заказ закрыт, отменен или заморожен. Оплата по нему невозможна\n";
		return undef;
	} elsif ( $opts{type} eq 'refund' && ($last->name eq 'suspend' || $last->name eq 'close') ) {
		warn "PAYMENTS[add-op]: Заказ закрыт или заморожен. Возврат средств по нему невозможен\n";
		return undef;
	} elsif ( $last->name eq $opts{type} ) {
		$op = $last;
	}
    } elsif ( $opts{type} eq 'create' ) {
	$new = 1;
    } else {
	warn "PAYMENTS[add-op]: Попытка создать операцию ['.$opts{type}.'] без регистрации типа [create]\n";
	return undef;
    }
    if ( $new ) {
	$op = payments::Operation->new( $keeper );
	$op->status( $status );
	$op->name( $opts{type} );
	if ( ref $opts{order} ) {
		$op->uid( $opts{order}->uid );
		$op->order_id( $opts{order}->id );
		$op->sum( $opts{order}->sum_total );
	} else {
		$op->uid( $opts{uid} );
		$op->order_id( $opts{order} );
		$op->sum( $opts{sum} );
	}
	$op->store;
    }
    return $op;
}


sub check {
    my $self = shift;
    my $order_id = shift;
    return undef	unless $order_id;

    my $ops = $keeper->get_documents(
		class   => 'payments::Operation',
		order_id        => $order_id,
		order_by        => 'ctime',
		return_mode     => 'array_ref',
	);
    if ( ref $ops eq 'ARRAY' && @$ops ) {
	return $ops->[-1];
    }
    return undef;
}

sub get_order {
    my $self = shift;
    my $order_id = shift;
    return undef	unless $order_id;

    if ( grep { $_ eq 'webshop' } split(/\s+/, $state->plugins) ) {
	return $keeper->{webshop}->get_orders( id => $order_id, list => 1 );
    }
}

1;