Anzahlungs-Rg.: keine weitere Rückbuchung bei erneutem Buchen einer Schluss-Rg
[kivitendo-erp.git] / SL / DB / Helper / Mappings.pm
1 package SL::DB::Helper::Mappings;
2
3 use utf8;
4 use strict;
5
6 use SL::Util qw(camelify);
7
8 require Exporter;
9 our @ISA       = qw(Exporter);
10 our @EXPORT_OK = qw(get_table_for_package get_package_for_table get_package_names);
11
12 # these will not be managed as Rose::DB models, because they are not normalized,
13 # significant changes are needed to get them done, or they were done by CRM.
14 my @kivitendo_blacklist_permanent = qw(
15   leads
16 );
17
18 # these are not managed _yet_, but will hopefully at some point.
19 # if you are confident that one of these works, remove it here.
20 my @kivitendo_blacklist_temp = qw(
21 );
22
23 # tables created by crm module
24 my @crm_blacklist = qw(
25   blz_data
26   bundesland
27   contmasch
28   contract
29   crm
30   crmdefaults
31   crmemployee
32   custmsg
33   docfelder
34   documents
35   documenttotc
36   docvorlage
37   extra_felder
38   geodb_changelog
39   geodb_coordinates
40   geodb_floatdata
41   geodb_hierarchies
42   geodb_intdata
43   geodb_locations
44   geodb_textdata
45   geodb_type_names
46   grpusr
47   gruppenname
48   history
49   labels
50   labeltxt
51   mailvorlage
52   maschine
53   maschmat
54   opport_status
55   opportunity
56   postit
57   repauftrag
58   telcall
59   telcallhistory
60   telnr
61   tempcsvdata
62   termdate
63   termincat
64   termine
65   terminmember
66   timetrack
67   tt_event
68   tt_parts
69   wiedervorlage
70   wissencategorie
71   wissencontent
72 );
73
74 # tables created by cash register
75 my @cash_register_blacklist = qw(
76 ekartikel ekbon ekkunde ektext erptasten
77 );
78
79 my @kivitendo_blacklist = (@kivitendo_blacklist_permanent, @kivitendo_blacklist_temp, @crm_blacklist, @cash_register_blacklist);
80
81 # map table names to their models.
82 # unlike rails we have no singular<->plural magic.
83 # remeber: tables should be named as the plural of the model name.
84 my %kivitendo_package_names = (
85   # TABLE                           # MODEL (given in C style)
86   acc_trans                      => 'acc_transaction',
87   additional_billing_addresses   => 'additional_billing_address',
88   'auth.clients'                 => 'auth_client',
89   'auth.clients_users'           => 'auth_client_user',
90   'auth.clients_groups'          => 'auth_client_group',
91   'auth.group'                   => 'auth_group',
92   'auth.group_rights'            => 'auth_group_right',
93   'auth.master_rights'           => 'auth_master_right',
94   'auth.schema_info'             => 'auth_schema_info',
95   'auth.session'                 => 'auth_session',
96   'auth.session_content'         => 'auth_session_content',
97   'auth.user'                    => 'auth_user',
98   'auth.user_config'             => 'auth_user_config',
99   'auth.user_group'              => 'auth_user_group',
100   ar                             => 'invoice',
101   ap                             => 'purchase_invoice',
102   assembly                       => 'assembly',
103   assortment_items               => 'assortment_item',
104   background_jobs                => 'background_job',
105   background_job_histories       => 'background_job_history',
106   ap                             => 'purchase_invoice',
107   bank_accounts                  => 'bank_account',
108   bank_transactions              => 'bank_transaction',
109   bank_transaction_acc_trans     => 'bank_transaction_acc_trans',
110   buchungsgruppen                => 'buchungsgruppe',
111   bin                            => 'bin',
112   business                       => 'business',
113   chart                          => 'chart',
114   contact_departments            => 'contact_department',
115   contact_titles                 => 'contact_title',
116   contacts                       => 'contact',
117   customer                       => 'customer',
118   csv_import_profiles            => 'csv_import_profile',
119   csv_import_profile_settings    => 'csv_import_profile_setting',
120   csv_import_reports             => 'csv_import_report',
121   csv_import_report_rows         => 'csv_import_report_row',
122   csv_import_report_status       => 'csv_import_report_status',
123   currencies                     => 'currency',
124   custom_data_export_queries     => 'CustomDataExportQuery',
125   custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
126   custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
127   custom_variable_configs        => 'custom_variable_config',
128   custom_variables               => 'custom_variable',
129   custom_variables_validity      => 'custom_variable_validity',
130   datev                          => 'datev',
131   defaults                       => 'default',
132   delivery_orders                => 'delivery_order',
133   delivery_order_items           => 'delivery_order_item',
134   delivery_order_items_stock     => 'delivery_order_items_stock',
135   delivery_terms                 => 'delivery_term',
136   department                     => 'department',
137   drafts                         => 'draft',
138   dunning                        => 'dunning',
139   dunning_config                 => 'dunning_config',
140   email_journal                  => 'EmailJournal',
141   email_journal_attachments      => 'EmailJournalAttachment',
142   employee                       => 'employee',
143   employee_project_invoices      => 'EmployeeProjectInvoices',
144   exchangerate                   => 'exchangerate',
145   files                          => 'file',
146   finanzamt                      => 'finanzamt',
147   follow_up_access               => 'follow_up_access',
148   follow_up_links                => 'follow_up_link',
149   follow_ups                     => 'follow_up',
150   generic_translations           => 'generic_translation',
151   gl                             => 'GLTransaction',
152   greetings                      => 'greeting',
153   history_erp                    => 'history',
154   inventory                      => 'inventory',
155   invoice                        => 'invoice_item',
156   language                       => 'language',
157   letter                         => 'letter',
158   letter_draft                   => 'letter_draft',
159   makemodel                      => 'make_model',
160   notes                          => 'note',
161   orderitems                     => 'order_item',
162   oe                             => 'order',
163   parts                          => 'part',
164   partsgroup                     => 'parts_group',
165   part_classifications           => 'PartClassification',
166   part_customer_prices           => 'PartCustomerPrice',
167   parts_price_history            => 'PartsPriceHistory',
168   payment_terms                  => 'payment_term',
169   periodic_invoices              => 'periodic_invoice',
170   periodic_invoices_configs      => 'periodic_invoices_config',
171   prices                         => 'price',
172   price_factors                  => 'price_factor',
173   price_rules                    => 'price_rule',
174   price_rule_items               => 'price_rule_item',
175   pricegroup                     => 'pricegroup',
176   printers                       => 'printer',
177   project                        => 'project',
178   project_participants           => 'project_participant',
179   project_phase_participants     => 'project_phase_participant',
180   project_phases                 => 'project_phase',
181   project_roles                  => 'project_role',
182   project_statuses               => 'project_status',
183   project_types                  => 'project_type',
184   reconciliation_links           => 'reconciliation_link',
185   record_links                   => 'record_link',
186   record_templates               => 'record_template',
187   record_template_items          => 'record_template_item',
188   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
189   requirement_spec_complexities        => 'RequirementSpecComplexity',
190   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
191   requirement_spec_items               => 'RequirementSpecItem',
192   requirement_spec_orders              => 'RequirementSpecOrder',
193   requirement_spec_parts               => 'RequirementSpecPart',
194   requirement_spec_pictures            => 'RequirementSpecPicture',
195   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
196   requirement_spec_risks               => 'RequirementSpecRisk',
197   requirement_spec_statuses            => 'RequirementSpecStatus',
198   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
199   requirement_spec_types               => 'RequirementSpecType',
200   requirement_spec_versions            => 'RequirementSpecVersion',
201   requirement_specs                    => 'RequirementSpec',
202   sepa_export                    => 'sepa_export',
203   sepa_export_items              => 'sepa_export_item',
204   sepa_export_message_ids        => 'SepaExportMessageId',
205   schema_info                    => 'schema_info',
206   shipto                         => 'shipto',
207   shops                          => 'shop',
208   shop_images                    => 'shop_image',
209   shop_orders                    => 'shop_order',
210   shop_order_items               => 'shop_order_item',
211   shop_parts                     => 'shop_part',
212   status                         => 'status',
213   stocktakings                   => 'stocktaking',
214   tax                            => 'tax',
215   taxkeys                        => 'tax_key',
216   tax_zones                      => 'tax_zone',
217   taxzone_charts                 => 'taxzone_chart',
218   time_recording_articles        => 'time_recording_article',
219   time_recordings                => 'time_recording',
220   todo_user_config               => 'todo_user_config',
221   transfer_type                  => 'transfer_type',
222   translation                    => 'translation',
223   trigger_information            => 'trigger_information',
224   units                          => 'unit',
225   units_language                 => 'units_language',
226   user_preferences               => 'user_preference',
227   vendor                         => 'vendor',
228   warehouse                      => 'warehouse',
229 );
230
231 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
232
233 sub get_blacklist {
234   return KIVITENDO => \@kivitendo_blacklist;
235 }
236
237 sub get_package_names {
238   return KIVITENDO => \%kivitendo_package_names;
239 }
240
241 sub get_name_for_table {
242   return $kivitendo_package_names{ $_[0] };
243 }
244
245 sub get_package_for_table {
246   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
247     unless %kivitendo_tables_to_packages;
248
249   return $kivitendo_tables_to_packages{ $_[0] };
250 }
251
252 sub get_manager_package_for_table {
253   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
254     unless %kivitendo_tables_to_manager_packages;
255
256   return $kivitendo_tables_to_manager_packages{ $_[0] };
257 }
258
259 sub get_table_for_package {
260   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
261   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
262
263   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
264   return $kivitendo_packages_to_tables{ $package };
265 }
266
267 sub db {
268   my $string = $_[0];
269   my $lookup = $kivitendo_package_names{$_[0]} ||
270       plurify($kivitendo_package_names{singlify($_[0])});
271
272   for my $thing ($string, $lookup) {
273
274     # best guess? its already the name. like part. camelize it first
275     my $class = "SL::DB::" . camelify($thing);
276     return $class if defined *{ $class. '::' };
277
278     # next, someone wants a manager and pluralized.
279     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
280     return $manager if defined *{ $manager . '::' };
281   }
282
283   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
284 }
285
286 sub plurify {
287   my ($str) = @_;
288   $str . 's';
289 }
290
291 sub singlify {
292   my ($str) = @_;
293   local $/ = 's';
294   chomp $str;
295   $str;
296 }
297
298 1;
299
300 __END__
301
302 =encoding utf8
303
304 =head1 NAME
305
306 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
307
308 =head1 SYNOPSIS
309
310   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
311
312 =head1 DESCRIPTION
313
314 This modul stores table <-> model mappings used by the
315 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
316 custom mappings, add it here.
317
318 =head1 FUNCTIONS
319
320 =over 4
321
322 =item C<db $name>
323
324 A special function provided here is C<db>. Without it you'd have to write:
325
326   my $part = SL::DB::Part->new(id => 1234);
327   my @all_parts = SL::DB::Manager::Part->get_all;
328
329 with them it becomes:
330
331   my $part = db('part')->new(id => 123);
332   my @all_parts = db('parts')->get_all;
333
334 You don't have to care about add that SL::DB:: incantation anymore. Also, a
335 simple s at the end will get you the associated Manager class.
336
337 db is written to try to make sense of what you give it, but if all fails, it
338 will die with an error.
339
340 =item C<get_package_for_table $table_name>
341
342 Returns the package name for a table name:
343
344   SL::DB::Helper::Mappings::get_package_for_table('oe')
345   # SL::DB::Order
346
347 =item C<get_manager_package_for_table $table_name>
348
349 Returns the manager package name for a table name:
350
351   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
352   # SL::DB::Manager::Order
353
354 =item C<get_table_for_package $package_name>
355
356 Returns the table name for a package name:
357
358   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
359   # oe
360   SL::DB::Helper::Mappings::get_table_for_package('Order')
361   # oe
362
363 =back
364
365 =head1 BUGS
366
367 nothing yet
368
369 =head1 SEE ALSO
370
371 L<scripts/rose_auto_create_model.pl>
372
373 =head1 AUTHOR
374
375 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
376 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
377
378 =cut