Line # Revision Author
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;