1 |
327 |
ahitrov |
package monetaru::Keeper; |
2 |
|
|
|
3 |
|
|
use strict; |
4 |
|
|
use warnings 'all'; |
5 |
|
|
use base qw(Contenido::Keeper); |
6 |
|
|
|
7 |
|
|
use Contenido::Globals; |
8 |
|
|
use Digest::MD5; |
9 |
328 |
ahitrov |
use Data::Dumper; |
10 |
327 |
ahitrov |
|
11 |
|
|
sub get_form { |
12 |
|
|
my $self = shift; |
13 |
|
|
my (%opts) = @_; |
14 |
|
|
my $id = delete $opts{id}; |
15 |
|
|
return unless $id; |
16 |
|
|
my $sum = delete $opts{sum}; |
17 |
|
|
return unless $sum; |
18 |
|
|
|
19 |
|
|
$sum = $sum =~ /\d+\.\d{2}/ ? $sum : sprintf( "%.2f", $sum ); |
20 |
|
|
|
21 |
|
|
my %fields = ( |
22 |
|
|
'method' => 'post', |
23 |
|
|
'action' => 'https://www.moneta.ru/assistant.htm', |
24 |
|
|
'visible' => [ |
25 |
|
|
{ type => 'submit', value => $opts{submit} || 'Оплатить' }, |
26 |
|
|
], |
27 |
|
|
'hidden' => [ |
28 |
|
|
{ name => 'MNT_ID', value => $self->state->{moneta_app_id} }, |
29 |
|
|
{ name => 'MNT_TRANSACTION_ID', value => $id }, |
30 |
|
|
{ name => 'MNT_CURRENCY_CODE', value => $self->state->{moneta_currency_code} }, |
31 |
|
|
{ name => 'MNT_AMOUNT', value => $sum }, |
32 |
|
|
], |
33 |
|
|
); |
34 |
|
|
if ( $self->state->{moneta_test_mode} ) { |
35 |
|
|
push @{$fields{hidden}}, { name => 'MNT_TEST_MODE', value => 1 } |
36 |
|
|
} |
37 |
|
|
if ( $opts{success} ) { |
38 |
|
|
push @{$fields{hidden}}, { name => 'MNT_SUCCESS_URL', value => $opts{success} } |
39 |
|
|
} |
40 |
|
|
if ( $opts{fail} ) { |
41 |
|
|
push @{$fields{hidden}}, { name => 'MNT_FAIL_URL', value => $opts{fail} } |
42 |
|
|
} |
43 |
|
|
if ( $self->state->{moneta_sig_code} ) { |
44 |
328 |
ahitrov |
my $str = $self->state->{moneta_app_id}.$id.$sum.$self->state->{moneta_currency_code}.$self->state->{moneta_test_mode}.$self->state->{moneta_sig_code}; |
45 |
|
|
my $md5 = Digest::MD5::md5_hex ( $str ); |
46 |
327 |
ahitrov |
push @{$fields{hidden}}, { name => 'MNT_SIGNATURE', value => $md5 } |
47 |
|
|
} |
48 |
|
|
|
49 |
|
|
if ( exists $opts{custom1} ) { |
50 |
|
|
push @{$fields{hidden}}, { name => 'MNT_CUSTOM1', value => $opts{custom1} } |
51 |
|
|
} |
52 |
|
|
if ( exists $opts{custom2} ) { |
53 |
|
|
push @{$fields{hidden}}, { name => 'MNT_CUSTOM2', value => $opts{custom2} } |
54 |
|
|
} |
55 |
|
|
if ( exists $opts{custom3} ) { |
56 |
|
|
push @{$fields{hidden}}, { name => 'MNT_CUSTOM3', value => $opts{custom3} } |
57 |
|
|
} |
58 |
|
|
|
59 |
|
|
return \%fields; |
60 |
|
|
} |
61 |
|
|
|
62 |
|
|
|
63 |
349 |
ahitrov |
sub add { |
64 |
|
|
my $self = shift; |
65 |
|
|
my (%opts) = @_; |
66 |
|
|
|
67 |
352 |
ahitrov |
return undef unless $opts{type} && ( $opts{order} && ref $opts{order} || $opts{uid} && $opts{order} && $opts{sum}); |
68 |
350 |
ahitrov |
return undef unless $opts{type} =~ /^(create|suspend|cancel|reform)$/; |
69 |
349 |
ahitrov |
|
70 |
|
|
my $op = monetaru::Operation->new( $keeper ); |
71 |
|
|
$op->status(1); |
72 |
|
|
$op->name( $opts{type} ); |
73 |
350 |
ahitrov |
if ( ref $opts{order} ) { |
74 |
|
|
$op->uid( $opts{order}->uid ); |
75 |
|
|
$op->order_id( $opts{order}->id ); |
76 |
|
|
$op->sum( $opts{order}->sum_total ); |
77 |
|
|
} else { |
78 |
|
|
$op->uid( $opts{uid} ); |
79 |
|
|
$op->order_id( $opts{order} ); |
80 |
|
|
$op->sum( $opts{sum} ); |
81 |
|
|
} |
82 |
349 |
ahitrov |
$op->store; |
83 |
|
|
|
84 |
|
|
return $op; |
85 |
|
|
} |
86 |
|
|
|
87 |
|
|
|
88 |
|
|
sub check { |
89 |
|
|
my $self = shift; |
90 |
|
|
my $order_id = shift; |
91 |
350 |
ahitrov |
return undef unless $order_id; |
92 |
349 |
ahitrov |
|
93 |
|
|
my $ops = $keeper->get_documents( |
94 |
|
|
class => 'monetaru::Operation', |
95 |
|
|
order_id => $order_id, |
96 |
|
|
order_by => 'ctime', |
97 |
|
|
return_mode => 'array_ref', |
98 |
|
|
); |
99 |
350 |
ahitrov |
if ( ref $ops eq 'ARRAY' && @$ops ) { |
100 |
|
|
return $ops->[-1]; |
101 |
349 |
ahitrov |
} |
102 |
350 |
ahitrov |
return undef; |
103 |
349 |
ahitrov |
} |
104 |
|
|
|
105 |
327 |
ahitrov |
1; |