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