Line # Revision Author
1 198 ahitrov package webshop::Order;
2
3 use base "Contenido::Document";
4 270 ahitrov use Contenido::Globals;
5
6 198 ahitrov sub extra_properties
7 {
8 return (
9 504 ahitrov { 'attr' => 'name', 'type' => 'string', postedit => 1, faciledit => 1 },
10 198 ahitrov { 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус заказа', facilshow => 1, postshow => 1,
11 'cases' => [
12 [0, 'открыт'],
13 [1, 'обрабатывается'],
14 [2, 'комплектуется'],
15 [3, 'в доставке'],
16 [4, 'доставлен'],
17 [5, 'отклонен'],
18 545 ahitrov [6, 'ожидание оплаты'],
19 [7, 'товар в резерве'],
20 [8, 'не дозвонились'],
21 198 ahitrov ],
22 },
23 { 'attr' => 'delivery', 'type' => 'lookup', 'rusname' => 'Тип доставки', facilshow => 1, postshow => 1,
24 'lookup_opts' => {
25 'class' => 'webshop::Delivery',
26 },
27 },
28 413 ahitrov { 'attr' => 'pay_by', 'type' => 'lookup', 'rusname' => 'Тип оплаты', facilshow => 1, postshow => 1,
29 'lookup_opts' => {
30 'class' => 'webshop::Payment',
31 },
32 },
33 434 ahitrov { 'attr' => 'pay_alias', 'type' => 'string', 'rusname' => 'Название метода оплаты', shortname => 'Оплата',
34 postshow => 1, facilshow => 1 },
35 553 ahitrov { 'attr' => 'pay_amount', 'type' => 'string', 'rusname' => 'Оплаченная сумма',
36 postshow => 1, facilshow => 1 },
37 198 ahitrov { 'attr' => 'btime', 'type' => 'datetime', 'rusname' => 'Заказ отдан на комплектацию',
38 postshow => 1, facilshow => 1 },
39 { 'attr' => 'ftime', 'type' => 'datetime', 'rusname' => 'Заказ передан в доставку',
40 manager_hidden => 1, postshow => 1, faciledit => 1 },
41 { 'attr' => 'etime', 'type' => 'datetime', 'rusname' => 'Заказ доставлен',
42 manager_hidden => 1, postedit => 1, facilshow => 1 },
43 { 'attr' => 'num', 'type' => 'integer', 'rusname' => 'Количество позиций',
44 297 ahitrov manager_hidden => 1, manshow => 1, postshow => 1, facilshow => 1 },
45 422 ahitrov { 'attr' => 'sum', 'type' => 'string', 'rusname' => 'Сумма (gross)', shortname => 'Сумма',
46 297 ahitrov manager_hidden => 1, column => 5, postshow => 1, facilshow => 1 },
47 270 ahitrov { 'attr' => 'sum_discount', 'type' => 'string', 'rusname' => 'Сумма скидки', shortname => 'Скидка',
48 297 ahitrov manager_hidden => 1, column => 6, postshow => 1, facilshow => 1 },
49 198 ahitrov { 'attr' => 'sum_delivery', 'type' => 'string', 'rusname' => 'Стоимость доставки', shortname => 'Доставка',
50 297 ahitrov manager_hidden => 1, column => 7, postshow => 1, facilshow => 1 },
51 270 ahitrov { 'attr' => 'sum_total', 'type' => 'string', 'rusname' => 'Сумма общая', shortname => 'Total',
52 297 ahitrov manager_hidden => 1, column => 8, virtual => 1, postshow => 1, facilshow => 1 },
53 198 ahitrov { 'attr' => 'contact', 'type' => 'string', 'rusname' => 'Контактное лицо', facilshow => 1 },
54 { 'attr' => 'email', 'type' => 'string', 'rusname' => 'E-mail для связи', shortname => 'E-mail',
55 259 ahitrov column => 3, postshow => 1, facilshow => 1, mandatory => 1, },
56 198 ahitrov { 'attr' => 'phone', 'type' => 'string', 'rusname' => 'Телефон для связи', shortname => 'Тел.',
57 259 ahitrov column => 4, postshow => 1, facilshow => 1,
58 mandatory => 1, rel => 'Не указан телефон' },
59 297 ahitrov { 'attr' => 'address', 'type' => 'text', 'rusname' => 'Адрес доставки', rows => 5, postedit => 1, facilshow => 1,
60 298 ahitrov mandatory => 1, rel => 'Не заполнен адрес доставки' },
61 259 ahitrov { 'attr' => 'zipcode', 'type' => 'string', 'rusname' => 'Почтовый индекс', postshow => 1,
62 mandatory => 1, rel => 'Не указан почтовый индекс' },
63 { 'attr' => 'area', 'type' => 'lookup', 'rusname' => 'Регион',
64 lookup_opts => { class => 'webshop::Area', order_by => 'name' },
65 allow_null => 1, mandatory => 1, rel => 'Не выбран регион'
66 },
67 { 'attr' => 'town_id', 'type' => 'lookup', 'rusname' => 'Город',
68 lookup_opts => { class => 'webshop::Town', order_by => 'name' },
69 allow_null => 1, mandatory => 1, rel => 'Не выбран город'
70 },
71 { 'attr' => 'town', 'type' => 'string', 'rusname' => 'Город', postshow => 1, facilshow => 1,
72 mandatory => 1, rel => 'Не указан город' },
73 544 ahitrov { 'attr' => 'carrier', 'type' => 'string', 'rusname' => 'Транспортная компания', postshow => 1 },
74 297 ahitrov { 'attr' => 'metro', 'type' => 'string', 'rusname' => 'Ближайшее метро', manager_hidden => 1, postshow => 1 },
75 259 ahitrov { 'attr' => 'timeline', 'type' => 'string', 'rusname' => 'Предпочтительное время', postshow => 1, },
76 304 ahitrov { 'attr' => 'description', 'type' => 'text', 'rusname' => 'Описание для курьера', rows => 5, postshow => 1, faciledit => 1 },
77 504 ahitrov { 'attr' => 'manager_comment', 'type' => 'text', 'rusname' => 'Комментарий менеджера', rows => 5, postedit => 1, faciledit => 1 },
78 297 ahitrov { 'attr' => 'facility_comment', 'type' => 'text', 'rusname' => 'Описание проблем с комплектацией', rows => 5, manager_hidden => 1, faciledit => 1 },
79 { 'attr' => 'delivery_comment', 'type' => 'text', 'rusname' => 'Описание проблем с доставкой', rows => 5, manager_hidden => 1, postedit => 1 },
80 198 ahitrov )
81 }
82
83 270 ahitrov
84 sub sum_total {
85 my $self = shift;
86
87 return ($self->sum || 0) - ($self->sum_discount || 0) + ($self->sum_delivery || 0);
88 }
89
90
91 198 ahitrov sub sum_formatted {
92 my $self = shift;
93
94 426 ahitrov my $price = $self->sum;
95 198 ahitrov $price = reverse $price;
96 $price =~ s/(\d{3})/$1\ /g;
97 $price = reverse $price;
98
99 return $price;
100 }
101
102 sub total_formatted {
103 my $self = shift;
104
105 270 ahitrov my $price = $self->sum_total;
106 return $keeper->{webshop}->price_format( $price );
107 198 ahitrov }
108
109
110 sub reject {
111 my $self = shift;
112
113 297 ahitrov # my $query = $self->{keeper}->SQL->prepare("delete from basket where order_id = ? and uid = ?");
114 # $query->execute( $self->id, $self->uid );
115 565 ahitrov
116 297 ahitrov $self->status(5);
117 $self->store;
118 198 ahitrov }
119
120
121 sub class_name
122 {
123 return 'Заказ';
124 }
125
126 sub class_description
127 {
128 return 'Заказ';
129 }
130
131 sub class_table
132 {
133 return 'webshop::SQL::Order';
134 }
135
136 356 ahitrov sub table_links
137 {
138 return [
139 { name => 'Корзина', class => 'webshop::Basket', filter => 'order_id', field => 'order_id' },
140 ];
141 }
142 198 ahitrov
143 572 ahitrov sub post_store
144 565 ahitrov {
145 my $self = shift;
146 356 ahitrov
147 565 ahitrov if ( grep { $_ eq 'payments' } split /\s+/, $state->plugins ) {
148 my $action;
149 my ($lastop) = $keeper->get_documents( class => 'payments::Operation', order_id => $self->id, order_by => 'id desc', limit => 1 );
150 if ( ref $lastop ) {
151 if ( $self->status == 1 || $self->status == 2 || $self->status == 6 ) {
152 if ( $lastop->name eq 'suspend' || $lastop->name eq 'cancel' || $lastop->name eq 'close' ) {
153 $action = 'resume';
154 }
155 } elsif ( $self->status == 7 ) {
156 if ( $lastop->name ne 'suspend' ) {
157 $action = 'suspend';
158 }
159 } elsif ( $self->status == 4 ) {
160 if ( $lastop->name ne 'close' ) {
161 $action = 'close';
162 }
163 } elsif ( $self->status == 5 ) {
164 if ( $lastop->name ne 'cancel' ) {
165 $action = 'cancel';
166 }
167 }
168 } else {
169 if ( $self->status == 1 || $self->status == 2 || $self->status == 6 ) {
170 $action = 'create';
171 } elsif ( $self->status == 7 ) {
172 $action = 'suspend';
173 } elsif ( $self->status == 4 ) {
174 $action = 'close';
175 } elsif ( $self->status == 5 ) {
176 $action = 'cancel';
177 }
178 }
179 if ( $action ) {
180 my $op = payments::Operation->new( $keeper );
181 $op->name( $action );
182 $op->order_id( $self->id );
183 $op->uid( $self->uid );
184 if ( ref $user ) {
185 $op->uuid( $user->id );
186 }
187 $op->sum( $self->sum_total );
188 $op->store;
189 }
190 }
191 return 1;
192 }
193
194
195 198 ahitrov sub post_delete
196 {
197 my $self = shift;
198 my @items = $self->keeper->get_documents(
199 class => 'webshop::Basket',
200 order_id => $self->id,
201 );
202 foreach my $item ( @items ) {
203 $item->delete( attachments => 1 );
204 }
205 270 ahitrov my $sql = $self->keeper->SQL->prepare('DELETE FROM webshop_order_coupons where source_id = ?');
206 $sql->execute( $self->id );
207
208 198 ahitrov 1;
209 }
210
211 1;