1 |
358 |
ahitrov |
package payments::Keeper; |
2 |
|
|
|
3 |
|
|
use strict; |
4 |
|
|
use warnings 'all'; |
5 |
|
|
use base qw(Contenido::Keeper); |
6 |
|
|
|
7 |
|
|
|
8 |
|
|
use Contenido::Globals; |
9 |
|
|
|
10 |
|
|
sub add { |
11 |
|
|
my $self = shift; |
12 |
|
|
my (%opts) = @_; |
13 |
|
|
|
14 |
|
|
return undef unless $opts{type} && ( $opts{order} && ref $opts{order} || $opts{uid} && $opts{order} && $opts{sum}); |
15 |
712 |
ahitrov |
return undef unless $opts{type} =~ /^(create|suspend|cancel|append|refund|close)$/; |
16 |
358 |
ahitrov |
|
17 |
712 |
ahitrov |
my $status = exists $opts{status} ? $opts{status} : $state->development; |
18 |
|
|
my $ops = $keeper->get_documents( |
19 |
|
|
class => 'payments::Operation', |
20 |
|
|
status => $status, |
21 |
|
|
order_id => ref $opts{order} ? $opts{order}->id : $opts{order}, |
22 |
|
|
order_by => 'ctime', |
23 |
|
|
return_mode => 'array_ref', |
24 |
|
|
); |
25 |
|
|
my $new = 0; |
26 |
|
|
my $op; |
27 |
|
|
if ( ref $ops eq 'ARRAY' && @$ops ) { |
28 |
|
|
my $last = $ops->[-1]; |
29 |
|
|
if ( $opts{type} eq 'create' && ($last->name eq 'suspend' || $last->name eq 'cancel' || $last->name eq 'close') ) { |
30 |
|
|
warn "PAYMENTS[add-op]: Заказ закрыт, отменен или заморожен. Оплата по нему невозможна\n"; |
31 |
|
|
return undef; |
32 |
|
|
} elsif ( $opts{type} eq 'refund' && ($last->name eq 'suspend' || $last->name eq 'close') ) { |
33 |
|
|
warn "PAYMENTS[add-op]: Заказ закрыт или заморожен. Возврат средств по нему невозможен\n"; |
34 |
|
|
return undef; |
35 |
|
|
} elsif ( $last->name eq $opts{type} ) { |
36 |
|
|
$op = $last; |
37 |
|
|
} |
38 |
|
|
} elsif ( $opts{type} eq 'create' ) { |
39 |
|
|
$new = 1; |
40 |
358 |
ahitrov |
} else { |
41 |
712 |
ahitrov |
warn "PAYMENTS[add-op]: Попытка создать операцию ['.$opts{type}.'] без регистрации типа [create]\n"; |
42 |
|
|
return undef; |
43 |
358 |
ahitrov |
} |
44 |
712 |
ahitrov |
if ( $new ) { |
45 |
|
|
$op = payments::Operation->new( $keeper ); |
46 |
|
|
$op->status( $status ); |
47 |
|
|
$op->name( $opts{type} ); |
48 |
|
|
if ( ref $opts{order} ) { |
49 |
|
|
$op->uid( $opts{order}->uid ); |
50 |
|
|
$op->order_id( $opts{order}->id ); |
51 |
|
|
$op->sum( $opts{order}->sum_total ); |
52 |
|
|
} else { |
53 |
|
|
$op->uid( $opts{uid} ); |
54 |
|
|
$op->order_id( $opts{order} ); |
55 |
|
|
$op->sum( $opts{sum} ); |
56 |
|
|
} |
57 |
|
|
$op->store; |
58 |
|
|
} |
59 |
358 |
ahitrov |
return $op; |
60 |
|
|
} |
61 |
|
|
|
62 |
|
|
|
63 |
|
|
sub check { |
64 |
|
|
my $self = shift; |
65 |
|
|
my $order_id = shift; |
66 |
|
|
return undef unless $order_id; |
67 |
|
|
|
68 |
|
|
my $ops = $keeper->get_documents( |
69 |
|
|
class => 'payments::Operation', |
70 |
|
|
order_id => $order_id, |
71 |
|
|
order_by => 'ctime', |
72 |
|
|
return_mode => 'array_ref', |
73 |
|
|
); |
74 |
|
|
if ( ref $ops eq 'ARRAY' && @$ops ) { |
75 |
|
|
return $ops->[-1]; |
76 |
|
|
} |
77 |
|
|
return undef; |
78 |
|
|
} |
79 |
|
|
|
80 |
563 |
ahitrov |
sub get_order { |
81 |
|
|
my $self = shift; |
82 |
|
|
my $order_id = shift; |
83 |
|
|
return undef unless $order_id; |
84 |
358 |
ahitrov |
|
85 |
563 |
ahitrov |
if ( grep { $_ eq 'webshop' } split(/\s+/, $state->plugins) ) { |
86 |
|
|
return $keeper->{webshop}->get_orders( id => $order_id, list => 1 ); |
87 |
|
|
} |
88 |
|
|
} |
89 |
|
|
|
90 |
358 |
ahitrov |
1; |