Revision 350

Date:
2013/05/22 17:41:46
Author:
ahitrov
Revision Log:
New table with webshop operations
XML-based protocol for server-server conversation
Files:

Legend:

 
Added
 
Removed
 
Modified
  • utf8/plugins/monetaru/comps/www/monetaru/check.xml

     
    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <MNT_RESPONSE>
    3 <MNT_ID><% $MNT_ID %></MNT_ID>
    4 <MNT_TRANSACTION_ID><% $MNT_TRANSACTION_ID %></MNT_TRANSACTION_ID>
    5 <MNT_RESULT_CODE><% $reply_code %></MNT_RESULT_CODE>
    6 % if ( ref $last ) {
    7 <MNT_DESCRIPTION><% $last->name %></MNT_DESCRIPTION>
    8 % }
    9 <MNT_AMOUNT><% $MNT_AMOUNT %></MNT_AMOUNT>
    10 <MNT_SIGNATURE><% $reply_md5 %></MNT_SIGNATURE>
    11 <%doc>
    12 <MNT_ATTRIBUTES>
    13 <ATTRIBUTE>
    14 <KEY></KEY>
    15 <VALUE></VALUE>
    16 </ATTRIBUTE>
    17 </MNT_ATTRIBUTES>
    18 </%doc>
    19 </MNT_RESPONSE>
    20 <%once>
    21
    22 use Digest::MD5;
    23
    24 </%once>
    25 <%args>
    26
    27 $MNT_COMMAND => ''
    28 $MNT_ID => undef
    29 $MNT_TRANSACTION_ID => undef
    30 $MNT_OPERATION_ID => ''
    31 $MNT_AMOUNT => ''
    32 $MNT_CURRENCY_CODE => undef
    33 $MNT_TEST_MODE => 0
    34 $MNT_SIGNATURE => undef
    35 $MNT_USER => undef
    36 $MNT_CORRACCOUNT => undef
    37 $MNT_CUSTOM1 => undef
    38 $MNT_CUSTOM2 => undef
    39 $MNT_CUSTOM3 => undef
    40
    41 </%args>
    42 <%init>
    43
    44 warn Dumper \%ARGS if $DEBUG;
    45 unless ( $MNT_ID && $MNT_TRANSACTION_ID && $MNT_OPERATION_ID && $MNT_AMOUNT && $MNT_CURRENCY_CODE ) {
    46 $m->out('FAIL');
    47 return;
    48 }
    49
    50 my $str = $MNT_COMMAND . $MNT_ID . $MNT_TRANSACTION_ID . $MNT_OPERATION_ID . $MNT_AMOUNT . $MNT_CURRENCY_CODE . $MNT_TEST_MODE . $state->{monetaru}->{moneta_sig_code};
    51 my $md5 = Digest::MD5::md5_hex ( $str );
    52 unless ( $MNT_SIGNATURE eq $md5 ) {
    53 $m->out('FAIL');
    54 return;
    55 }
    56
    57 my $reply_code;
    58 my $last = $keeper->{monetaru}->check( $MNT_TRANSACTION_ID );
    59 if ( ref $last ) {
    60 my $sum = sprintf("%.2f", $last->sum);
    61 if ( $last->name eq 'cancel' ) {
    62 $reply_code = 500;
    63 } elsif ( !$MNT_AMOUNT && $last->name =~ /(create|reform)/ ) {
    64 $MNT_AMOUNT = $last->sum;
    65 $reply_code = 100;
    66 } elsif ( $last->name =~ /(create|reform)/ && $sum ne $MNT_AMOUNT ) {
    67 $MNT_AMOUNT = $last->sum;
    68 $reply_code = 100;
    69 } elsif ( $last->name eq 'suspend' ) {
    70 $reply_code = 302;
    71 }
    72 } else {
    73 $reply_code = 500;
    74 }
    75
    76 unless ( $reply_code ) {
    77 my ($obj) = $keeper->get_documents(
    78 class => 'monetaru::Transaction',
    79 operation_id => $MNT_OPERATION_ID,
    80 order_id => $MNT_TRANSACTION_ID,
    81 limit => 1,
    82 );
    83 if ( ref $obj ) {
    84 $reply_code = 200;
    85 } else {
    86 $reply_code = 402;
    87 }
    88 }
    89 warn "CHECK_URL: Reply code = [$reply_code]\n" if $DEBUG;
    90
    91 $str = $reply_code . $MNT_ID . $MNT_TRANSACTION_ID . $state->{monetaru}->{moneta_sig_code};
    92 my $reply_md5 = Digest::MD5::md5_hex ( $str );
    93
    94 </%init>
  • utf8/plugins/monetaru/comps/www/monetaru/pay.txt

     
    1 SUCCESS
    2 <%once>
    3
    4 use Digest::MD5;
    5
    6 </%once>
    7 <%args>
    8
    9 $MNT_ID => undef
    10 $MNT_TRANSACTION_ID => undef
    11 $MNT_OPERATION_ID => undef
    12 $MNT_AMOUNT => 0
    13 $MNT_CURRENCY_CODE => undef
    14 $MNT_TEST_MODE => 0
    15 $MNT_SIGNATURE => undef
    16 $MNT_USER => undef
    17 $MNT_CORRACCOUNT => undef
    18 $MNT_CUSTOM1 => undef
    19 $MNT_CUSTOM2 => undef
    20 $MNT_CUSTOM3 => undef
    21
    22 </%args>
    23 <%init>
    24
    25 warn Dumper \%ARGS if $DEBUG;
    26 unless ( $MNT_ID && $MNT_TRANSACTION_ID && $MNT_OPERATION_ID && $MNT_AMOUNT && $MNT_CURRENCY_CODE ) {
    27 $m->out('FAIL');
    28 return;
    29 }
    30
    31 my ($obj) = $keeper->get_documents(
    32 class => 'monetaru::Transaction',
    33 operation_id => $MNT_OPERATION_ID,
    34 order_id => $MNT_TRANSACTION_ID,
    35 limit => 1,
    36 );
    37 my $str = $MNT_ID . $MNT_TRANSACTION_ID . $MNT_OPERATION_ID . $MNT_AMOUNT . $MNT_CURRENCY_CODE . $MNT_TEST_MODE . $state->{monetaru}->{moneta_sig_code};
    38 my $md5 = Digest::MD5::md5_hex ( $str );
    39 unless ( $MNT_SIGNATURE eq $md5 ) {
    40 $m->out('FAIL');
    41 return;
    42 }
    43
    44 unless ( $obj ) {
    45 $obj = monetaru::Transaction->new( $keeper );
    46 $obj->status( $MNT_TEST_MODE || 0 );
    47 $obj->account_id( $MNT_ID );
    48 $obj->order_id( $MNT_TRANSACTION_ID );
    49 $obj->operation_id( $MNT_OPERATION_ID );
    50 $obj->sum( $MNT_AMOUNT );
    51 $obj->currency_code( $MNT_CURRENCY_CODE );
    52 $obj->account_user( $MNT_USER );
    53 $obj->account_corr( $MNT_CORRACCOUNT );
    54 $obj->payment_system( $ARGS{'paymentSystem.unitId'} );
    55 $obj->name( $MNT_CUSTOM1 );
    56 $obj->custom1( $MNT_CUSTOM1 );
    57 $obj->custom2( $MNT_CUSTOM2 );
    58 $obj->custom3( $MNT_CUSTOM3 );
    59 $obj->store;
    60 }
    61
    62 </%init>
  • utf8/plugins/monetaru/comps/www/monetaru/pay.xml

     
    1 SUCCESS
    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <MNT_RESPONSE>
    3 <MNT_ID><% $MNT_ID %></MNT_ID>
    4 <MNT_TRANSACTION_ID><% $MNT_TRANSACTION_ID %></MNT_TRANSACTION_ID>
    5 <MNT_RESULT_CODE><% $reply_code %></MNT_RESULT_CODE>
    6 <MNT_SIGNATURE><% $reply_md5 %></MNT_SIGNATURE>
    7 <%doc>
    8 <MNT_ATTRIBUTES>
    9 <ATTRIBUTE>
    10 <KEY></KEY>
    11 <VALUE></VALUE>
    12 </ATTRIBUTE>
    13 </MNT_ATTRIBUTES>
    14 </%doc>
    15 </MNT_RESPONSE>
    2 16 <%once>
    3 17
    4 18 use Digest::MD5;
     
    9 23 $MNT_ID => undef
    10 24 $MNT_TRANSACTION_ID => undef
    11 25 $MNT_OPERATION_ID => undef
    12 $MNT_AMOUNT => 0
    26 $MNT_AMOUNT => ''
    13 27 $MNT_CURRENCY_CODE => undef
    14 28 $MNT_TEST_MODE => 0
    15 29 $MNT_SIGNATURE => undef
     
    28 42 return;
    29 43 }
    30 44
    31 my ($obj) = $keeper->get_documents(
    32 class => 'monetaru::Transaction',
    33 operation_id => $MNT_OPERATION_ID,
    34 order_id => $MNT_TRANSACTION_ID,
    35 limit => 1,
    36 );
    37 45 my $str = $MNT_ID . $MNT_TRANSACTION_ID . $MNT_OPERATION_ID . $MNT_AMOUNT . $MNT_CURRENCY_CODE . $MNT_TEST_MODE . $state->{monetaru}->{moneta_sig_code};
    38 46 my $md5 = Digest::MD5::md5_hex ( $str );
    39 47 unless ( $MNT_SIGNATURE eq $md5 ) {
     
    41 49 return;
    42 50 }
    43 51
    44 unless ( $obj ) {
    45 $obj = monetaru::Transaction->new( $keeper );
    46 $obj->status( $MNT_TEST_MODE || 0 );
    47 $obj->account_id( $MNT_ID );
    48 $obj->order_id( $MNT_TRANSACTION_ID );
    49 $obj->operation_id( $MNT_OPERATION_ID );
    50 $obj->sum( $MNT_AMOUNT );
    51 $obj->currency_code( $MNT_CURRENCY_CODE );
    52 $obj->account_user( $MNT_USER );
    53 $obj->account_corr( $MNT_CORRACCOUNT );
    54 $obj->payment_system( $ARGS{'paymentSystem.unitId'} );
    55 $obj->name( $MNT_CUSTOM1 );
    56 $obj->custom1( $MNT_CUSTOM1 );
    57 $obj->custom2( $MNT_CUSTOM2 );
    58 $obj->custom3( $MNT_CUSTOM3 );
    59 $obj->store;
    52 my $reply_code;
    53 my $last = $keeper->{monetaru}->check( $MNT_TRANSACTION_ID );
    54 if ( ref $last ) {
    55 my $sum = sprintf("%.2f", $last->sum);
    56 if ( $last->name eq 'cancel' ) {
    57 $reply_code = 500;
    58 } elsif ( $last->name eq 'suspend' ) {
    59 $reply_code = 500;
    60 }
    61 } else {
    62 $reply_code = 500;
    60 63 }
    61 64
    65 unless ( $reply_code ) {
    66 my ($obj) = $keeper->get_documents(
    67 class => 'monetaru::Transaction',
    68 operation_id => $MNT_OPERATION_ID,
    69 order_id => $MNT_TRANSACTION_ID,
    70 limit => 1,
    71 );
    72
    73 unless ( $obj ) {
    74 $obj = monetaru::Transaction->new( $keeper );
    75 $obj->status( $MNT_TEST_MODE || 0 );
    76 $obj->account_id( $MNT_ID );
    77 $obj->order_id( $MNT_TRANSACTION_ID );
    78 $obj->operation_id( $MNT_OPERATION_ID );
    79 $obj->sum( $MNT_AMOUNT );
    80 $obj->currency_code( $MNT_CURRENCY_CODE );
    81 $obj->account_user( $MNT_USER );
    82 $obj->account_corr( $MNT_CORRACCOUNT );
    83 $obj->payment_system( $ARGS{'paymentSystem.unitId'} );
    84 $obj->name( $MNT_CUSTOM1 );
    85 $obj->custom1( $MNT_CUSTOM1 );
    86 $obj->custom2( $MNT_CUSTOM2 );
    87 $obj->custom3( $MNT_CUSTOM3 );
    88 $obj->store;
    89 }
    90 if ( $obj->id ) {
    91 $reply_code = 200;
    92 } else {
    93 $reply_code = 100;
    94 }
    95 }
    96
    97 $str = $reply_code . $MNT_ID . $MNT_TRANSACTION_ID . $state->{monetaru}->{moneta_sig_code};
    98 my $reply_md5 = Digest::MD5::md5_hex ( $str );
    99
    62 100 </%init>
  • utf8/plugins/monetaru/lib/monetaru/Init.pm

     
    15 15 monetaru::SQL::TransactionsTable
    16 16 monetaru::Transaction
    17 17
    18 monetaru::SQL::OperationsTable
    19 monetaru::Operation
    20
    18 21 monetaru::TransactionSection
    19 22 ));
    20 23
    21 24 sub init {
    22 push @{ $state->{'available_documents'} }, qw( monetaru::Transaction );
    25 push @{ $state->{'available_documents'} }, qw( monetaru::Transaction monetaru::Operation );
    23 26 push @{ $state->{'available_sections'} }, qw( monetaru::TransactionSection );
    24 27 0;
    25 28 }
  • utf8/plugins/monetaru/lib/monetaru/Keeper.pm

     
    64 64 my $self = shift;
    65 65 my (%opts) = @_;
    66 66
    67 return undef unless $opts{type} && $opts{uid} && $opts{order};
    68 return undef unless $opts{type} =~ /^(create|suspend|cancel)$/;
    67 return undef unless $opts{type} && ( $opts{order} && ref $opts{order} eq 'webshop::Order' || $opts{uid} && $opts{order} && $opts{sum});
    68 return undef unless $opts{type} =~ /^(create|suspend|cancel|reform)$/;
    69 69
    70 70 my $op = monetaru::Operation->new( $keeper );
    71 71 $op->status(1);
    72 72 $op->name( $opts{type} );
    73 $op->uid( $opts{uid} );
    74 $op->order_id( $opts{order} );
    73 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 }
    75 82 $op->store;
    76 83
    77 84 return $op;
     
    81 88 sub check {
    82 89 my $self = shift;
    83 90 my $order_id = shift;
    91 return undef unless $order_id;
    84 92
    85 return undef unless $order_id;
    86 93 my $ops = $keeper->get_documents(
    87 94 class => 'monetaru::Operation',
    88 95 order_id => $order_id,
    89 96 order_by => 'ctime',
    90 97 return_mode => 'array_ref',
    91 98 );
    92 if ( ref $ops eq 'ARRAY' && @$ops && $ops->[-1]->name =~ /^(create)$/ ) {
    93 return 1;
    94 } else {
    95 return 0;
    99 if ( ref $ops eq 'ARRAY' && @$ops ) {
    100 return $ops->[-1];
    96 101 }
    102 return undef;
    97 103 }
    98 104
    99 105 1;
  • utf8/plugins/monetaru/lib/monetaru/Operation.pm

     
    7 7 { 'attr' => 'name', 'type' => 'status', 'rusname' => 'Тип операции',
    8 8 'cases' => [
    9 9 ['create', 'Заказ создан'],
    10 ['suspend', 'Оплата отложена'],
    10 ['suspend', 'Заказ заморожен'],
    11 ['reform', 'Заказ изменен'],
    11 12 ['cancel', 'Заказ отменен'],
    12 13 ],
    13 14 },
     
    16 17
    17 18 sub class_name
    18 19 {
    19 return 'Moneta.ru: операция';
    20 return 'Moneta.ru: операция с заказом';
    20 21 }
    21 22
    22 23 sub class_description
    23 24 {
    24 return 'Moneta.ru: внутренняя операция в магазине';
    25 return 'Moneta.ru: операция с заказом';
    25 26 }
    26 27
    27 28 sub class_table
  • utf8/plugins/monetaru/lib/monetaru/SQL/OperationsTable.pm

     
    66 66 'db_type' => 'integer',
    67 67 'db_opts' => "not null",
    68 68 },
    69 {
    70 'attr' => 'sum',
    71 'type' => 'string',
    72 'rusname' => 'Сумма',
    73 'db_field' => 'sum',
    74 'db_type' => 'float',
    75 },
    69 76 );
    70 77 }
    71 78
  • utf8/plugins/monetaru/sql/TOAST/operations.sql

     
    8 8 name text,
    9 9 order_id integer not null,
    10 10 uid integer not null,
    11 sum float,
    11 12 data text
    12 13 );
    13 14 CREATE INDEX monetaru_operations_order ON monetaru_operations USING btree (order_id);

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.