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 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;