package monetaru::Keeper; use strict; use warnings 'all'; use base qw(Contenido::Keeper); use Contenido::Globals; use Digest::MD5; use Data::Dumper; sub get_form { my $self = shift; my (%opts) = @_; my $id = delete $opts{id}; return unless $id; my $sum = delete $opts{sum}; return unless $sum; $sum = $sum =~ /\d+\.\d{2}/ ? $sum : sprintf( "%.2f", $sum ); my %fields = ( 'method' => 'post', 'action' => 'https://www.moneta.ru/assistant.htm', 'visible' => [ { type => 'submit', value => $opts{submit} || 'Оплатить' }, ], 'hidden' => [ { name => 'MNT_ID', value => $self->state->{moneta_app_id} }, { name => 'MNT_TRANSACTION_ID', value => $id }, { name => 'MNT_CURRENCY_CODE', value => $self->state->{moneta_currency_code} }, { name => 'MNT_AMOUNT', value => $sum }, ], ); if ( $self->state->{moneta_test_mode} ) { push @{$fields{hidden}}, { name => 'MNT_TEST_MODE', value => 1 } } if ( $opts{success} ) { push @{$fields{hidden}}, { name => 'MNT_SUCCESS_URL', value => $opts{success} } } if ( $opts{fail} ) { push @{$fields{hidden}}, { name => 'MNT_FAIL_URL', value => $opts{fail} } } if ( $self->state->{moneta_sig_code} ) { my $str = $self->state->{moneta_app_id}.$id.$sum.$self->state->{moneta_currency_code}.$self->state->{moneta_test_mode}.$self->state->{moneta_sig_code}; my $md5 = Digest::MD5::md5_hex ( $str ); push @{$fields{hidden}}, { name => 'MNT_SIGNATURE', value => $md5 } } if ( exists $opts{custom1} ) { push @{$fields{hidden}}, { name => 'MNT_CUSTOM1', value => $opts{custom1} } } if ( exists $opts{custom2} ) { push @{$fields{hidden}}, { name => 'MNT_CUSTOM2', value => $opts{custom2} } } if ( exists $opts{custom3} ) { push @{$fields{hidden}}, { name => 'MNT_CUSTOM3', value => $opts{custom3} } } return \%fields; } sub add { my $self = shift; my (%opts) = @_; return undef unless $opts{type} && ( $opts{order} && ref $opts{order} eq 'webshop::Order' || $opts{uid} && $opts{order} && $opts{sum}); return undef unless $opts{type} =~ /^(create|suspend|cancel|reform)$/; my $op = monetaru::Operation->new( $keeper ); $op->status(1); $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 => 'monetaru::Operation', order_id => $order_id, order_by => 'ctime', return_mode => 'array_ref', ); if ( ref $ops eq 'ARRAY' && @$ops ) { return $ops->[-1]; } return undef; } 1;