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 |
803 |
ahitrov |
['boxberry','Boxberry Виджет'], |
37 |
726 |
ahitrov |
['axiomus','Аксиомус Виджет'], |
38 |
198 |
ahitrov |
], |
39 |
|
|
}, |
40 |
783 |
ahitrov |
{ 'attr' => 'payment_available', 'type' => 'status_multi', 'rusname' => 'Доступные методы оплаты', |
41 |
|
|
'lookup_opts' => { |
42 |
|
|
class => 'webshop::Payment', |
43 |
|
|
} |
44 |
|
|
}, |
45 |
198 |
ahitrov |
) |
46 |
|
|
} |
47 |
|
|
|
48 |
205 |
ahitrov |
sub price_actual |
49 |
|
|
{ |
50 |
|
|
my $self = shift; |
51 |
259 |
ahitrov |
my (%opts) = @_; |
52 |
|
|
|
53 |
|
|
my $sum = delete $opts{sum}; |
54 |
|
|
my $region_id = exists $opts{region} && ref $opts{region} ? $opts{region}->id : exists $opts{region_id} ? $opts{region_id} : undef; |
55 |
205 |
ahitrov |
my $price = $self->price; |
56 |
259 |
ahitrov |
$price = defined $price && $price =~ /^\d+$/ ? $price : 'не определена'; |
57 |
205 |
ahitrov |
|
58 |
259 |
ahitrov |
if ( $region_id ) { |
59 |
|
|
if ( $self->price_region ) { |
60 |
|
|
my $region_price = $json->decode( $self->price_region ); |
61 |
|
|
if ( ref $region_price eq 'HASH' && exists $region_price->{$region_id} ) { |
62 |
|
|
$price = $region_price->{$region_id}; |
63 |
|
|
} |
64 |
|
|
} |
65 |
|
|
} elsif ( $sum ) { |
66 |
205 |
ahitrov |
if ( $self->price_modify ) { |
67 |
259 |
ahitrov |
my $price_modify = $json->decode( $self->price_modify ); |
68 |
|
|
if ( ref $price_modify eq 'ARRAY' && @$price_modify ) { |
69 |
|
|
foreach my $mod ( @$price_modify ) { |
70 |
205 |
ahitrov |
if ( $mod->{level} <= $sum ) { |
71 |
262 |
ahitrov |
if ( $mod->{cost} =~ /(\d+)%/ ) { |
72 |
|
|
my $mod = $1; |
73 |
|
|
$price = sprintf("%.2f", ($self->price * $mod) / 100); |
74 |
|
|
} else { |
75 |
|
|
$price = $mod->{cost}; |
76 |
|
|
} |
77 |
205 |
ahitrov |
} |
78 |
|
|
} |
79 |
|
|
} |
80 |
|
|
} |
81 |
|
|
} |
82 |
259 |
ahitrov |
return $price; |
83 |
205 |
ahitrov |
} |
84 |
|
|
|
85 |
259 |
ahitrov |
sub get_fields |
86 |
|
|
{ |
87 |
|
|
my $self = shift; |
88 |
|
|
my $fields = $self->fields; |
89 |
|
|
my @fields = @$fields if $fields && ref $fields eq 'ARRAY'; |
90 |
|
|
|
91 |
|
|
return @fields; |
92 |
|
|
} |
93 |
|
|
|
94 |
|
|
sub check_field |
95 |
|
|
{ |
96 |
|
|
my $self = shift; |
97 |
|
|
my $field = shift; |
98 |
|
|
return unless $field; |
99 |
|
|
my $fields = $self->fields; |
100 |
|
|
my %fields = map { $_ => 1 } @$fields if ref $fields eq 'ARRAY' && @$fields; |
101 |
|
|
|
102 |
|
|
return exists $fields{$field} ? 1 : 0; |
103 |
|
|
} |
104 |
|
|
|
105 |
198 |
ahitrov |
sub class_name |
106 |
|
|
{ |
107 |
|
|
return 'Способ доставки'; |
108 |
|
|
} |
109 |
|
|
|
110 |
|
|
sub class_description |
111 |
|
|
{ |
112 |
|
|
return 'Способ доставки'; |
113 |
|
|
} |
114 |
|
|
|
115 |
727 |
ahitrov |
sub class_table |
116 |
|
|
{ |
117 |
|
|
return 'webshop::SQL::DeliveryTable'; |
118 |
|
|
} |
119 |
|
|
|
120 |
198 |
ahitrov |
sub pre_store |
121 |
|
|
{ |
122 |
|
|
my $self = shift; |
123 |
|
|
|
124 |
|
|
my $default_section = $project->s_alias->{delivery} if ref $project->s_alias eq 'HASH'; |
125 |
|
|
my $sections = $self->{sections}; |
126 |
|
|
if ( $default_section ) { |
127 |
|
|
if ( ref $sections eq 'ARRAY' && scalar @$sections ) { |
128 |
|
|
my @new_sects = grep { $_ != $default_section } @$sections; |
129 |
|
|
push @new_sects, $default_section; |
130 |
|
|
$self->sections(@new_sects); |
131 |
|
|
} elsif ( $sections && !ref $sections && $sections != $default_section ) { |
132 |
|
|
my @new_sects = ($default_section, $sections); |
133 |
|
|
$self->sections(@new_sects); |
134 |
|
|
} else { |
135 |
|
|
$self->sections($default_section); |
136 |
|
|
} |
137 |
|
|
} |
138 |
|
|
|
139 |
|
|
return 1; |
140 |
|
|
} |
141 |
|
|
|
142 |
|
|
1; |