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;