Perl-Upgrade-Files: Nach Exception Rollback & bei Erfolg immer 1 zurückgeben
[kivitendo-erp.git] / sql / Pg-upgrade2 / SKR04-3804-addition.pl
1 # @tag: SKR04-3804-addition
2 # @description: Konto 3804 zu SKR04 hinzufügen: Umsatzsteuer 19% für Steuerschlüssel 13 (Umsatzsteuer aus EG-Erwerb)
3 # @depends:
4 package SL::DBUpgrade2::SKR04_3804_addition;
5
6 use utf8;
7 use strict;
8
9 use parent qw(SL::DBUpgrade2::Base);
10
11 sub run {
12   my ($self) = @_;
13
14   # 1. Überprüfen ob Kontenrahmen SKR04 ist, wenn nicht alles überspringen
15   my ($kontenrahmen) = $self->dbh->selectrow_array("select coa from defaults");
16
17   unless ( $kontenrahmen eq 'Germany-DATEV-SKR04EU' ) {
18     print "Kontenrahmen ist nicht SKR04, &uuml;berspringen<br>";
19     return 1;
20   };
21
22   # Mandant hat SKR04, erst prüfen wir, ob in der Vergangenheit Buchungen mit
23   # taxkey 13 erfolgt sind (Fall "EU ohne USt. ID), diese sind wahrscheinlich
24   # mit der falschen MwSt (16%) gebucht worden, wenn dies nicht manuell
25   # geändert worden ist
26
27   my ($anzahl_buchungen) = $self->dbh->selectrow_array("select count (*) from acc_trans where taxkey=13 and transdate >= '2007-01-01';");
28   if ( $anzahl_buchungen > 0 ) {
29     if ($::form->{bookings_exist} ) {
30       # Benutzer hat Meldung bestätigt
31       print "Buchungen nach dem 01.01.2007 existierten, Upgrade &uuml;berspringen";
32       return 1;
33     }
34
35     # Meldung anzeigen und auf Rückgabe warten
36     print_past_booking_warning();
37     return 2;
38   }
39
40   # es gibt keine Buchungen mit taxkey 13 nach 01.01.2007
41
42   # prüfen ob Konto 3804 schon existiert
43   my ($konto_existiert) = $self->dbh->selectrow_array("select count (*) from chart where accno = '3804'");
44   if ( $konto_existiert ) {
45     # 3804 existiert, wir gehen davon aus, daß der Benutzer das Konto schon selber angelegt hat und
46     # ordnungsgemäß benutzt
47
48     if ($::form->{account_exists} ) {
49       # Benutzer hat Meldung bestätigt
50       print "Konto existiert, Upgrade &uuml;berspringen\n";
51       return 1;
52     }
53
54     # Meldung anzeigen und auf Rückgabe warten
55     print_3804_already_exists();
56     return 2;
57   }
58
59     # noch keine Buchungen mit taxkey 13 und Konto 3804 existiert noch nicht,
60     # also legen wir es an und machen noch die nötigen Einstellungen in tax und
61     # taxkeys
62
63   my $insert_chart = <<SQL;
64 INSERT INTO chart (
65   accno, description,
66   charttype,   category,  link,
67   taxkey_id, pos_eur
68   )
69 SELECT
70   '3804','Umsatzsteuer aus EG-Erwerb 19%',
71   'A','I','AR_tax:IC_taxpart:IC_taxservice',
72   0, (select pos_eur from chart where accno = '3803')
73 WHERE EXISTS ( -- update only for SKR04, aber eigentlich schon überprüft
74     SELECT coa FROM defaults
75     WHERE defaults.coa='Germany-DATEV-SKR04EU'
76 );
77 SQL
78
79   $self->db_query($insert_chart);
80
81   my $konto_anlegen = $self->dbh->prepare($insert_chart) || $self->db_error($insert_chart);
82
83   # 13-1 (16%) korrigieren:
84   my $edit_taxkey_13 = qq|UPDATE tax SET taxdescription = 'Steuerpflichtige EG-Lieferung zum vollen Steuersatz', rate = '0.16', chart_id = (select id FROM chart where accno = '3803'), taxnumber = 3803 WHERE taxkey = '13'|;
85   $self->db_query($edit_taxkey_13);
86
87   # Sicherstellen, daß 3803 die richtige Bezeichnung hat
88   my $update_3803 = qq|update chart set description = 'Umsatzsteuer aus EG-Erwerb 16%' where accno = '3803'|;
89   $self->db_query($update_3803);
90
91   # Zweiter  Eintrag für taxkey 13 in key: 19%
92   my $insert_taxkey_13_2 = qq|INSERT INTO tax ( taxkey, taxdescription, rate, chart_id, taxnumber ) VALUES ('13', 'Steuerpflichtige EG-Lieferung zum vollen Steuersatz', '0.19', (select id from chart where accno = '3804'), '3804')|;
93
94   $self->db_query($insert_taxkey_13_2);
95
96   # alle Konten finden, bei denen 3803 das Steuerautomatikkonto ist,
97   # und dort den zweiten Eintrag ab 1.1.2007 für 19% einstellen
98   my $sth_query  = $self->dbh->prepare(qq|select c.id from chart c join taxkeys t on (c.id = t.chart_id) where tax_id = (select id from tax where taxnumber = '3803')|);
99   my $sth_insert = $self->dbh->prepare(<<SQL);
100     INSERT INTO taxkeys ( taxkey_id, chart_id, tax_id, pos_ustva, startdate )
101     VALUES              ( 13, ?, (select id from tax where taxkey = 13 and rate = '0.19'),
102                           (SELECT pos_ustva FROM taxkeys WHERE tax_id = (SELECT id FROM tax WHERE taxnumber = '3803') AND pos_ustva > 0 LIMIT 1),
103                          '01.01.2007' )
104 SQL
105   $sth_query->execute;
106
107   while (my $ref = $sth_query->fetchrow_hashref) {
108     $sth_insert->execute($ref->{id});
109   }
110   $sth_query->finish;
111   $sth_insert->finish;
112
113   return 1;
114 } # end run
115
116 sub print_past_booking_warning {
117   print $::form->parse_html_template("dbupgrade/SKR04_3804_update");
118 }
119
120 sub print_3804_already_exists {
121   print $::form->parse_html_template("dbupgrade/SKR04_3804_already_exists");
122 }
123
124 1;