Revision 693 (by ahitrov, 2018/08/13 11:24:32) Initial import

package money::Provider::Base;

use strict;
use warnings 'all';
use Contenido::Globals;
use payments::Keeper;


sub new {
    my ($proto, %params) = @_;
    my $class = ref($proto) || $proto;
    my $self = {};
    my $prefix = $class =~ /\:\:(\w+)$/ ? lc($1) : undef;
    return	unless $prefix;

    $self->{provider} =		$prefix;
    $self->{app_id} =		$state->{money}->{$prefix."_app_id"};
    $self->{secret} =		$state->{money}->{$prefix."_app_secret"};
    $self->{currency} =		$state->{money}->{$prefix."_currency_code"};
    $self->{test_mode} =	$state->{money}->{$prefix."_test_mode"};

    bless $self, $class;

    return $self;
}


sub id {
    my $self = shift;
    return $self->{app_id};
}

sub app_id {
    my $self = shift;
    return $self->{app_id};
}

sub secret {
    my $self = shift;
    return $self->{secret};
}

sub test_mode {
    my $self = shift;
    return $self->{test_mode};
}

sub currency {
    my $self = shift;
    return $self->{currency};
}

sub currency_code {
    my $self = shift;
    return $self->{currency};
}

sub provider {
    my $self = shift;
    return $self->{provider};
}

#################################
# Пытается зарегистрировать движение средств по order_id.
# В случае успеха возвращает объект money::Movement
# В случае неуспеха выставляет ошибку и возвращает undef.
# Сумма чека в копейках
##########################################################
sub money_movement_register {
    my $self = shift;
    my $opts = shift // {};
    unless ( $opts->{order_id} && $opts->{uid} && $opts->{sum} && $opts->{name} ) {
	$self->{result}{error} = 'Переданы не все обязательные параметры';
	return undef;
    }
    
    my $mm = $keeper->get_documents(
		class		=> 'money::Movement',
		status		=> $self->{test_mode},
		order_id	=> $opts->{order_id},
		order_by	=> 'ctime',
		return_mode	=> 'array_ref',
	);
    my $new = 0;
    if ( ref $mm eq 'ARRAY' && @$mm ) {
	my $last = $mm->[-1];
	if ( $opts->{name} eq 'payment' && $last->name eq 'payment' ) {
		return $last;
	} elsif ( $opts->{name} eq 'refund' && (grep { $_->name eq 'payment' } @$mm) ) {
		$new = 1;
	}
    } elsif ( $opts->{name} eq 'payment' ) {
	$new = 1;
    }
    if ( $new ) {
	$mm = money::Movement->new( $keeper );
	$mm->status( $self->{test_mode} );
	$mm->name( $opts->{name} );
	$mm->order_id( $opts->{order_id} );
	$mm->uid( $opts->{uid} );
	$mm->sum( sprintf("%.2f", $opts->{sum} / 100) );
	$mm->store;
    }
    return $mm;
}

sub get_mm_by_order_id {
    my $self = shift;
    my $order_id = shift;

    my ($mm) = $keeper->get_documents(
			class   => 'money::Movement',
			status  => $self->{test_mode},
			limit   => 1,
			order_id        => $order_id,
			order_by	=> 'ctime desc',
			provider        => $self->{provider},
		);

    return $mm;
}

1;