Line # Revision Author
1 296 ahitrov package promosuite::SQL::Company;
2
3 use base 'SQL::ProtoTable';
4
5 sub db_table
6 {
7 return 'companies';
8 }
9
10 sub available_filters {
11 my @available_filters = qw(
12 _class_filter
13 _status_filter
14 _in_id_filter
15 _id_filter
16 _name_filter
17 _s_filter
18 _class_excludes_filter
19
20 _excludes_filter
21 _country_filter
22 );
23 return \@available_filters;
24 }
25
26 # ----------------------------------------------------------------------------
27 # Свойства храним в массивах, потому что порядок важен!
28 # Это общие свойства - одинаковые для всех документов.
29 #
30 # attr - обязательный параметр, название атрибута;
31 # type - тип аттрибута, требуется для отображдения;
32 # rusname - русское название, опять же требуется для отображения;
33 # hidden - равен 1, когда
34 # readonly - инициализации при записи только без изменения в дальнейшем
35 # db_field - поле в таблице
36 # default - значение по умолчанию (поле всегда имеет это значение)
37 # ----------------------------------------------------------------------------
38 sub required_properties
39 {
40 return (
41 { # Идентификатор документа, сквозной по всем типам...
42 'attr' => 'id',
43 'type' => 'integer',
44 'rusname' => 'Идентификатор документа',
45 'hidden' => 1,
46 'auto' => 1,
47 'readonly' => 1,
48 'db_field' => 'id',
49 'db_type' => 'integer',
50 'db_opts' => "not null default nextval('public.documents_id_seq'::text)",
51 },
52 { # Класс документа...
53 'attr' => 'class',
54 'type' => 'string',
55 'rusname' => 'Класс документа',
56 'hidden' => 1,
57 'readonly' => 1,
58 'column' => 4,
59 'db_field' => 'class',
60 'db_type' => 'varchar(48)',
61 'db_opts' => 'not null',
62 },
63 { # Город
64 'attr' => 'country',
65 'type' => 'string',
66 'rusname' => 'Страна',
67 'column' => 1,
68 'db_field' => 'country',
69 'db_type' => 'text',
70 },
71 { # Город
72 'attr' => 'city',
73 'type' => 'string',
74 'rusname' => 'Город',
75 'column' => 2,
76 'db_field' => 'city',
77 'db_type' => 'text',
78 },
79 { # Название
80 'attr' => 'name',
81 'type' => 'string',
82 'rusname' => 'Название',
83 'column' => 3,
84 'db_field' => 'name',
85 'db_type' => 'text',
86 },
87 { # Статус
88 'attr' => 'status',
89 'type' => 'status',
90 'rusname' => 'Статус',
91 'db_field' => 'status',
92 'db_type' => 'smallint',
93 },
94 { # Время создания документа
95 'attr' => 'ctime',
96 'type' => 'datetime',
97 'rusname' => 'Дата/время создания',
98 'readonly' => 1,
99 'auto' => 1,
100 'hidden' => 1,
101 'db_field' => 'ctime',
102 'db_type' => 'timestamp',
103 'db_opts' => 'not null default now()',
104 'default' => 'CURRENT_TIMESTAMP',
105 },
106 { # Время изменения документа
107 'attr' => 'mtime',
108 'type' => 'datetime',
109 'rusname' => 'Дата/время изменения',
110 'auto' => 1,
111 'hidden' => 1,
112 'db_field' => 'mtime',
113 'db_type' => 'timestamp',
114 'db_opts' => 'not null default now()',
115 'default' => 'CURRENT_TIMESTAMP',
116 },
117 { # Время документа
118 'attr' => 'dtime',
119 'type' => 'datetime',
120 'rusname' => 'Дата/время',
121 'hidden' => 1,
122 'db_field' => 'dtime',
123 'db_type' => 'timestamp',
124 'db_opts' => 'not null default now()',
125 'default' => 'CURRENT_TIMESTAMP',
126 },
127 { # Сервисный центр
128 'attr' => 'service',
129 'type' => 'checkbox',
130 'rusname' => 'Сервисный центр',
131 'hidden' => 1,
132 'db_field' => 'service',
133 'db_type' => 'integer',
134 },
135 { # Рейтинг
136 'attr' => 'rate',
137 'type' => 'integer',
138 'rusname' => 'Рейтинг',
139 'hidden' => 1,
140 'db_field' => 'rate',
141 'db_type' => 'integer',
142 },
143 { # Массив секций
144 'attr' => 'sections',
145 'type' => 'sections_list',
146 'rusname' => 'Секции',
147 'hidden' => 1,
148 'db_field' => 'sections',
149 'db_type' => 'integer[]',
150 },
151 );
152 }
153
154
155 ########### FILTERS DESCRIPTION ####################################################################################
156 sub _excludes_filter {
157 my ($self,%opts)=@_;
158 if (exists $opts{excludes}) {
159 # - исключение из отбора
160 my @eids = ();
161 if (ref($opts{excludes}) eq 'ARRAY') {
162 @eids = @{ $opts{excludes} };
163 } elsif ($opts{excludes} =~ /[^\d\,]/) {
164 warn "Contenido Warning: В списке идентификаторов для исключения встречаются нечисловые элементы. Параметр excludes игнорируется (".$opts{excludes}.").\n";
165 } else {
166 @eids = split(',', $opts{excludes});
167 }
168
169 my $excludes = join(',', @eids);
170
171 # Меняется логика запроса, если это join-запрос.
172 # Потому что в этом случае гораздо лучше ограничить выборку по таблице links,
173 # чем производить полную склейку таблиц.
174 if (@eids) {
175 if (exists($opts{ldest}) || exists($opts{lsource})) {
176 if (exists($opts{ldest})) {
177 return " (l.source_id not in ($excludes)) ";
178 } elsif (exists($opts{lsource})) {
179 return " (l.dest_id not in ($excludes)) ";
180 }
181 } else {
182 return " (d.id not in ($excludes)) ";
183 }
184 }
185 }
186 return undef;
187 }
188
189
190 sub _get_orders {
191 my ($self, %opts) = @_;
192
193 if ($opts{order_by}) {
194 return ' order by '.$opts{order_by};
195 } else {
196 return ' order by city, name';
197 }
198 return undef;
199 }
200
201 sub _country_filter {
202 my ($self,%opts)=@_;
203 return undef unless ( exists $opts{country} );
204 return &SQL::Common::_generic_name_filter('d.country', $opts{country}, undef, \%opts);
205 }
206
207 1;