Line # Revision Author
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;