1 # @tag: convert_drafts_to_record_templates
2 # @description: Umwandlung von existierenden Entwürfen in Buchungsvorlagen für die Finanzbuchhaltung
3 # @depends: create_record_template_tables
4 package SL::DBUpgrade2::convert_drafts_to_record_templates;
11 use parent qw(SL::DBUpgrade2::Base);
15 sub prepare_statements {
18 $self->{q_draft} = qq|
19 SELECT description, form
24 $self->{q_template} = qq|
25 INSERT INTO record_templates (
26 template_name, template_type, customer_id, vendor_id,
27 currency_id, department_id, project_id, employee_id,
28 taxincluded, direct_debit, ob_transaction, cb_transaction,
29 reference, description, ordnumber, notes,
42 INSERT INTO record_template_items (
44 chart_id, tax_id, project_id,
45 amount1, amount2, source, memo
53 $self->{h_draft} = $self->dbh->prepare($self->{q_draft}) || die;
54 $self->{h_template} = $self->dbh->prepare($self->{q_template}) || die;
55 $self->{h_item} = $self->dbh->prepare($self->{q_item}) || die;
58 sub fetch_auxilliary_data {
61 $self->{default_currency_id} = selectfirst_hashref_query($::form, $self->dbh, qq|SELECT currency_id FROM defaults|)->{currency_id};
62 $self->{chart_ids_by_accno} = { selectall_as_map($::form, $self->dbh, qq|SELECT id, accno FROM chart|, 'accno', 'id') };
63 $self->{currency_ids_by_name} = { selectall_as_map($::form, $self->dbh, qq|SELECT id, name FROM currencies|, 'name', 'id') };
66 sub finish_statements {
69 $self->{h_item}->finish;
70 $self->{h_template}->finish;
71 $self->{h_draft}->finish;
74 sub migrate_ar_drafts {
77 $self->{h_draft}->execute('ar') || die $self->{h_draft}->errstr;
79 while (my $draft_record = $self->{h_draft}->fetchrow_hashref) {
80 my $draft = YAML::Load($draft_record->{form});
81 my $currency_id = $self->{currency_ids_by_name}->{$draft->{currency}};
82 my ($employee_id) = $draft->{employee_id} || (split m{--}, $draft->{employee})[1] || undef;
84 next unless $currency_id;
87 # template_name, template_type, customer_id, vendor_id,
88 $draft_record->{description} // $::locale->text('unnamed record template'),
90 $draft->{customer_id} || undef,
93 # currency_id, department_id, project_id, employee_id,
95 $draft->{department_id} || undef,
96 $draft->{globalproject_id} || undef,
99 # taxincluded, direct_debit, ob_transaction, cb_transaction,
100 $draft->{taxincluded} ? 1 : 0,
101 $draft->{direct_debit} ? 1 : 0,
105 # reference, description, ordnumber, notes,
112 $self->{chart_ids_by_accno}->{$draft->{ARselected}},
115 $self->{h_template}->execute(@values) || die $self->{h_template}->errstr;
116 my ($template_id) = $self->{h_template}->fetchrow_array;
118 foreach my $row (1..$draft->{rowcount}) {
119 my ($chart_accno) = split m{--}, $draft->{"AR_amount_${row}"};
120 my ($tax_id) = split m{--}, $draft->{"taxchart_${row}"};
121 my $chart_id = $self->{chart_ids_by_accno}->{$chart_accno // ''};
122 my $amount = $::form->parse_amount($self->{format}, $draft->{"amount_${row}"});
124 # $tax_id may be 0 as there's an entry in tax with id = 0.
125 # $chart_id must not be 0 as there's no entry in chart with id = 0.
126 # No $amount means empty row.
127 next unless $amount && $chart_id && (($tax_id // '') ne '');
130 # record_template_id,
133 # chart_id, tax_id, project_id,
136 $draft->{"project_id_${row}"} || undef,
138 # amount1, amount2, source, memo
145 $self->{h_item}->execute(@values) || die $self->{h_item}->errstr;
150 sub migrate_ap_drafts {
153 $self->{h_draft}->execute('ap') || die $self->{h_draft}->errstr;
155 while (my $draft_record = $self->{h_draft}->fetchrow_hashref) {
156 my $draft = YAML::Load($draft_record->{form});
157 my $currency_id = $self->{currency_ids_by_name}->{$draft->{currency}};
159 next unless $currency_id;
162 # template_name, template_type, customer_id, vendor_id,
163 $draft_record->{description} // $::locale->text('unnamed record template'),
166 $draft->{vendor_id} || undef,
168 # currency_id, department_id, project_id, employee_id,
170 $draft->{department_id} || undef,
171 $draft->{globalproject_id} || undef,
174 # taxincluded, direct_debit, ob_transaction, cb_transaction,
175 $draft->{taxincluded} ? 1 : 0,
176 $draft->{direct_credit} ? 1 : 0,
180 # reference, description, ordnumber, notes,
187 $self->{chart_ids_by_accno}->{$draft->{APselected}},
190 $self->{h_template}->execute(@values) || die $self->{h_template}->errstr;
191 my ($template_id) = $self->{h_template}->fetchrow_array;
193 foreach my $row (1..$draft->{rowcount}) {
194 my ($chart_accno) = split m{--}, $draft->{"AP_amount_${row}"};
195 my ($tax_id) = split m{--}, $draft->{"taxchart_${row}"};
196 my $chart_id = $self->{chart_ids_by_accno}->{$chart_accno // ''};
197 my $amount = $::form->parse_amount($self->{format}, $draft->{"amount_${row}"});
199 # $tax_id may be 0 as there's an entry in tax with id = 0.
200 # $chart_id must not be 0 as there's no entry in chart with id = 0.
201 # No $amount means empty row.
202 next unless $amount && $chart_id && (($tax_id // '') ne '');
205 # record_template_id,
208 # chart_id, tax_id, project_id,
211 $draft->{"project_id_${row}"} || undef,
213 # amount1, amount2, source, memo
220 $self->{h_item}->execute(@values) || die $self->{h_item}->errstr;
225 sub migrate_gl_drafts {
228 $self->{h_draft}->execute('gl') || die $self->{h_draft}->errstr;
230 while (my $draft_record = $self->{h_draft}->fetchrow_hashref) {
231 my $draft = YAML::Load($draft_record->{form});
234 # template_name, template_type, customer_id, vendor_id,
235 $draft_record->{description} // $::locale->text('unnamed record template'),
240 # currency_id, department_id, project_id, employee_id,
241 $self->{default_currency_id},
242 $draft->{department_id} || undef,
246 # taxincluded, direct_debit, ob_transaction, cb_transaction,
247 $draft->{taxincluded} ? 1 : 0,
249 $draft->{ob_transaction} ? 1 : 0,
250 $draft->{cb_transaction} ? 1 : 0,
252 # reference, description, ordnumber, notes,
254 $draft->{description},
262 $self->{h_template}->execute(@values) || die $self->{h_template}->errstr;
263 my ($template_id) = $self->{h_template}->fetchrow_array;
265 foreach my $row (1..$draft->{rowcount}) {
266 my ($chart_accno) = split m{--}, $draft->{"accno_${row}"};
267 my ($tax_id) = split m{--}, $draft->{"taxchart_${row}"};
268 my $chart_id = $self->{chart_ids_by_accno}->{$chart_accno // ''};
269 my $debit = $::form->parse_amount($self->{format}, $draft->{"debit_${row}"});
270 my $credit = $::form->parse_amount($self->{format}, $draft->{"credit_${row}"});
272 # $tax_id may be 0 as there's an entry in tax with id = 0.
273 # $chart_id must not be 0 as there's no entry in chart with id = 0.
274 # No $debit and no $credit means empty row.
275 next unless ($debit || $credit) && $chart_id && (($tax_id // '') ne '');
278 # record_template_id,
281 # chart_id, tax_id, project_id,
284 $draft->{"project_id_${row}"} || undef,
286 # amount1, amount2, source, memo
289 $draft->{"source_${row}"},
290 $draft->{"memo_${row}"},
293 $self->{h_item}->execute(@values) || die $self->{h_item}->errstr;
301 $self->db_query(qq|DELETE FROM drafts WHERE module IN ('ar', 'ap', 'gl')|);
307 # A dummy for %::myconfig used for parsing numbers. The existing
308 # drafts have a fundamental flaw: they store numbers & dates in the
309 # database still formatted to the user's preferences. Determining
310 # the correct format is not possible. Therefore this script simply
311 # assumes that the installation is used by people with German
312 # preferences regarding both settings.
314 numberformat => '1000,00',
315 dateformat => 'dd.mm.yy',
318 $self->prepare_statements;
319 $self->fetch_auxilliary_data;
320 $self->migrate_ar_drafts;
321 $self->migrate_ap_drafts;
322 $self->migrate_gl_drafts;
323 # $self->clean_drafts;
324 $self->finish_statements;