1 |
198 |
ahitrov |
package webshop::Delivery; |
2 |
|
|
|
3 |
|
|
use base "Contenido::Document"; |
4 |
205 |
ahitrov |
use JSON::XS; |
5 |
|
|
our $json = JSON::XS->new->utf8; |
6 |
|
|
|
7 |
198 |
ahitrov |
sub extra_properties |
8 |
|
|
{ |
9 |
|
|
return ( |
10 |
|
|
{ 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус', |
11 |
|
|
'cases' => [ |
12 |
|
|
[0, 'Не активна'], |
13 |
|
|
[1, 'Действует'], |
14 |
|
|
], |
15 |
259 |
ahitrov |
}, |
16 |
726 |
ahitrov |
{ 'attr' => 'alias', 'type' => 'string', 'rusname' => 'Код (alias) поставщика' }, |
17 |
413 |
ahitrov |
{ 'attr' => 'dtime', 'hidden' => 1, column => undef }, |
18 |
|
|
{ 'attr' => 'price', 'type' => 'string', 'rusname' => 'Стоимость доставки (число)', default => 0, column => 4 }, |
19 |
205 |
ahitrov |
{ 'attr' => 'price_modify', 'type' => 'cost_level', 'rusname' => 'Стоимость доставки с учетом стоимости заказа' }, |
20 |
259 |
ahitrov |
{ 'attr' => 'price_region', 'type' => 'cost_region', 'rusname' => 'Стоимость доставки с учетом региона' }, |
21 |
198 |
ahitrov |
{ 'attr' => 'abstr', 'type' => 'text', 'rusname' => 'Краткое описание' }, |
22 |
781 |
ahitrov |
{ 'attr' => 'notification', 'type' => 'string', 'rusname' => 'E-mail для уведомления о заказе', |
23 |
|
|
rem => 'В случае отсутствия в данном поле информации уведомление будет отправлено на e-mail по умолчанию', |
24 |
|
|
}, |
25 |
198 |
ahitrov |
{ 'attr' => 'fields', 'type' => 'status_multi', 'rusname' => 'Поля, необходимые к заполнению', |
26 |
|
|
'cases' => [ |
27 |
|
|
['timeline','Время заказа'], |
28 |
|
|
['zipcode','Почтовый индекс'], |
29 |
259 |
ahitrov |
['country','Страна'], |
30 |
|
|
['area','Регион из списка'], |
31 |
|
|
['town_id','Город из списка'], |
32 |
198 |
ahitrov |
['town','Город'], |
33 |
|
|
['address','Адрес'], |
34 |
|
|
['metro','Ближайшее метро'], |
35 |
543 |
ahitrov |
['carrier','Название логистической компании'], |
36 |
726 |
ahitrov |
['axiomus','Аксиомус Виджет'], |
37 |
198 |
ahitrov |
], |
38 |
|
|
}, |
39 |
|
|
) |
40 |
|
|
} |
41 |
|
|
|
42 |
205 |
ahitrov |
sub price_actual |
43 |
|
|
{ |
44 |
|
|
my $self = shift; |
45 |
259 |
ahitrov |
my (%opts) = @_; |
46 |
|
|
|
47 |
|
|
my $sum = delete $opts{sum}; |
48 |
|
|
my $region_id = exists $opts{region} && ref $opts{region} ? $opts{region}->id : exists $opts{region_id} ? $opts{region_id} : undef; |
49 |
205 |
ahitrov |
my $price = $self->price; |
50 |
259 |
ahitrov |
$price = defined $price && $price =~ /^\d+$/ ? $price : 'не определена'; |
51 |
205 |
ahitrov |
|
52 |
259 |
ahitrov |
if ( $region_id ) { |
53 |
|
|
if ( $self->price_region ) { |
54 |
|
|
my $region_price = $json->decode( $self->price_region ); |
55 |
|
|
if ( ref $region_price eq 'HASH' && exists $region_price->{$region_id} ) { |
56 |
|
|
$price = $region_price->{$region_id}; |
57 |
|
|
} |
58 |
|
|
} |
59 |
|
|
} elsif ( $sum ) { |
60 |
205 |
ahitrov |
if ( $self->price_modify ) { |
61 |
259 |
ahitrov |
my $price_modify = $json->decode( $self->price_modify ); |
62 |
|
|
if ( ref $price_modify eq 'ARRAY' && @$price_modify ) { |
63 |
|
|
foreach my $mod ( @$price_modify ) { |
64 |
205 |
ahitrov |
if ( $mod->{level} <= $sum ) { |
65 |
262 |
ahitrov |
if ( $mod->{cost} =~ /(\d+)%/ ) { |
66 |
|
|
my $mod = $1; |
67 |
|
|
$price = sprintf("%.2f", ($self->price * $mod) / 100); |
68 |
|
|
} else { |
69 |
|
|
$price = $mod->{cost}; |
70 |
|
|
} |
71 |
205 |
ahitrov |
} |
72 |
|
|
} |
73 |
|
|
} |
74 |
|
|
} |
75 |
|
|
} |
76 |
259 |
ahitrov |
return $price; |
77 |
205 |
ahitrov |
} |
78 |
|
|
|
79 |
259 |
ahitrov |
sub get_fields |
80 |
|
|
{ |
81 |
|
|
my $self = shift; |
82 |
|
|
my $fields = $self->fields; |
83 |
|
|
my @fields = @$fields if $fields && ref $fields eq 'ARRAY'; |
84 |
|
|
|
85 |
|
|
return @fields; |
86 |
|
|
} |
87 |
|
|
|
88 |
|
|
sub check_field |
89 |
|
|
{ |
90 |
|
|
my $self = shift; |
91 |
|
|
my $field = shift; |
92 |
|
|
return unless $field; |
93 |
|
|
my $fields = $self->fields; |
94 |
|
|
my %fields = map { $_ => 1 } @$fields if ref $fields eq 'ARRAY' && @$fields; |
95 |
|
|
|
96 |
|
|
return exists $fields{$field} ? 1 : 0; |
97 |
|
|
} |
98 |
|
|
|
99 |
198 |
ahitrov |
sub class_name |
100 |
|
|
{ |
101 |
|
|
return 'Способ доставки'; |
102 |
|
|
} |
103 |
|
|
|
104 |
|
|
sub class_description |
105 |
|
|
{ |
106 |
|
|
return 'Способ доставки'; |
107 |
|
|
} |
108 |
|
|
|
109 |
727 |
ahitrov |
sub class_table |
110 |
|
|
{ |
111 |
|
|
return 'webshop::SQL::DeliveryTable'; |
112 |
|
|
} |
113 |
|
|
|
114 |
198 |
ahitrov |
sub pre_store |
115 |
|
|
{ |
116 |
|
|
my $self = shift; |
117 |
|
|
|
118 |
|
|
my $default_section = $project->s_alias->{delivery} if ref $project->s_alias eq 'HASH'; |
119 |
|
|
my $sections = $self->{sections}; |
120 |
|
|
if ( $default_section ) { |
121 |
|
|
if ( ref $sections eq 'ARRAY' && scalar @$sections ) { |
122 |
|
|
my @new_sects = grep { $_ != $default_section } @$sections; |
123 |
|
|
push @new_sects, $default_section; |
124 |
|
|
$self->sections(@new_sects); |
125 |
|
|
} elsif ( $sections && !ref $sections && $sections != $default_section ) { |
126 |
|
|
my @new_sects = ($default_section, $sections); |
127 |
|
|
$self->sections(@new_sects); |
128 |
|
|
} else { |
129 |
|
|
$self->sections($default_section); |
130 |
|
|
} |
131 |
|
|
} |
132 |
|
|
|
133 |
|
|
return 1; |
134 |
|
|
} |
135 |
|
|
|
136 |
|
|
1; |