Revision 350 (by ahitrov, 2013/05/22 17:41:46) New table with webshop operations
XML-based protocol for server-server conversation
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;