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;