X-Git-Url: https://git.infodrom.org/?p=infodrom%2Fdtaus;a=blobdiff_plain;f=dtaus.c;h=69177f841588c66ef67d14b04a4d68f288887087;hp=e79f31b6a05297839dd8a83004a256f4cbd027d2;hb=eab76c4e4acff9dfaa51a1640f9d25b3d5065d6d;hpb=185967934658309fe29d2d5ca5ed5b24716d90ff diff --git a/dtaus.c b/dtaus.c index e79f31b..69177f8 100644 --- a/dtaus.c +++ b/dtaus.c @@ -1,6 +1,6 @@ /* - dtaus.c - Datenträgeraustausch mit einer Bank - Copyright (c) 1996 Martin Schulze + dtaus.c - Belegloser Datenträgeraustausch mit einer Bank + Copyright (c) 1996,8,2001-4 Martin Schulze This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. $Id$ */ @@ -22,10 +22,19 @@ #include "dtaus.h" #include "bigint.h" #include +#include #include #include #include #include +#include "latex.h" + +#define DEFAULT_EURO +#ifndef DEFAULT_EURO +int use_euro = 0; +#else +int use_euro = 1; +#endif /* * First: Some control structures @@ -54,6 +63,10 @@ dtaus_record recA[] = { {"BLZ", 7, 8, REQ}, {"Referenz", 70, 10, OPT}, {"Datum", 50, 6, IGN}, + {"Ausfuehrung", 95, 8, OPT}, + {"Currency", 127, 1, OPT}, + {"Euro", 127, 1, OPT}, + {"DM", 127, 1, OPT}, {NULL, 0, 0} }; @@ -63,20 +76,35 @@ dtaus_record recA[] = { #define A_BLZ 3 #define A_REF 4 #define A_DATE 5 -#define A_LEN 6 +#define A_TODO 6 +#define A_CURR 7 +#define A_EURO 8 +#define A_DM 9 +#define A_LEN 10 +#define A_LOOP 7 dtaus_record recC[] = { {"Name", 93, 27, REQ}, {"Konto", 21, 10, REQ}, {"BLZ", 13, 8, REQ}, {"Transaktion", 44, 5, REQ}, +#ifndef DEFAULT_EURO {"Betrag", 50, 11, REQ}, +#else + {"Betrag", 79, 11, REQ}, +#endif {"Zweck", 155, 27, REQ}, {"myName", 128, 27, OPT}, {"myKonto", 69, 10, OPT}, {"myBLZ", 61, 8, OPT}, {"Text", 187, 29, OPT}, {"Extension", 216, 29, OPT}, + {"Currency", 182, 1, IGN}, +#ifndef DEFAULT_EURO + {"Betrag-Euro", 79, 11, IGN}, +#else + {"Betrag-DM", 50, 11, IGN}, +#endif {NULL, 0, 0} }; @@ -89,15 +117,33 @@ dtaus_record recC[] = { #define C_MYNAM 6 #define C_MYKTO 7 #define C_MYBLZ 8 -#define C_TEXT 9 +#define C_TEXT 9 #define C_EXT 10 -#define C_LEN 11 +#define C_EURO 11 +#ifndef DEFAULT_EURO +#define C_EUR 12 +#else +#define C_DM 12 +#endif +#define C_LEN 13 +#define C_LOOP 11 + +#define MAX_TEXT 14 dtaus_record recE[] = { {"Anzahl", 10, 7, IGN}, +#ifndef DEFAULT_EURO {"Summe", 17, 13, IGN}, +#else + {"Summe", 64, 13, IGN}, +#endif {"Kontos", 30, 17, IGN}, {"BLZs", 47, 17, IGN}, +#ifndef DEFAULT_EURO + {"Summe-Euro", 64, 13, IGN}, +#else + {"Summe-DM", 17, 13, IGN}, +#endif {NULL, 0, 0} }; @@ -105,7 +151,12 @@ dtaus_record recE[] = { #define E_VAL 1 #define E_KTO 2 #define E_BLZ 3 -#define E_LEN 0 +#ifndef DEFAULT_EURO +#define E_EUR 4 +#else +#define E_DM 4 +#endif +#define E_LEN 5 /* * Second: Some low level routines @@ -113,7 +164,7 @@ dtaus_record recE[] = { size_t dtaus_nextrec (void **buf, FILE *f) { - bzero (buf, 128); + memset (buf, 0, 128); return fread(buf, 128, 1, f); } @@ -139,6 +190,10 @@ char *upcase(char *s) case 'ß': *(xp++) = 'S'; *xp='S'; break; } } else + /* + * Filter out all other characters since credit institutes won't + * accept the file otherwise. + */ *xp = ' '; } *xp = '\0'; @@ -151,7 +206,8 @@ char *downcase(char *s) static char x[100]; char *cp; - strcpy (x, s); + memset (x, 0, sizeof (x)); + strncpy (x, s, 99); for (cp=x;*cp;cp++) if (isupper(*cp)) @@ -178,10 +234,23 @@ char *strip_zeros (char *s) return p; } -char dtaus_char(void *buf, unsigned int pos) +char *strip_nondigits (char *s) +{ + char *p; + char *x; + + for (x=s,p=s;*x;x++) + if (isdigit (*x)) + *(p++) = *x; + *(p++) = '\0'; + + return s; +} + +char dtaus_char (void *buf, unsigned int pos) { static char res; - char *bufp = buf; + char *bufp = (char *)buf; bufp+=pos; memcpy(&res, bufp, 1); @@ -205,15 +274,57 @@ char *real2string(char *s) { static char res[20]; char *cp; + char *xp; /* only to avoid a GCC warning */ - strcpy(res, s); + strncpy(res, s, sizeof(res)-1); + res[sizeof(res)-1] = 0; for (cp=res; *cp&&!(*cp == ',')&&!(*cp == '.');cp++); - *(cp++) = *(cp+1); - *(cp++) = *(cp+1); + + if ((cp-res) >= (sizeof(res)-3)) { + /* Bail out, since the number is too large, shouldn't be possible though. */ + fprintf (stderr, "Value %s too large.\n", res); + exit (1); + } + + if (*cp == '.' || *cp == ',') { + if (*(cp+1)) { + /* 1st decimal place */ + xp = cp+1; + if (*xp && isdigit(*xp)) + *(cp++) = *xp; + else + *(cp++) = '0'; + /* 2nd decimal place */ + xp = cp+1; + if (*xp && isdigit(*xp)) + *(cp++) = *xp; + else + *(cp++) = '0'; + } else { + *(cp++) = '0'; + *(cp++) = '0'; + } + } else { + *(cp++) = '0'; + *(cp++) = '0'; + } *cp = '\0'; return res; } +/* + * Return the last digit of the year as character + */ +char get_date_lastdigit() +{ + time_t timer; + struct tm *loctime; + + timer = time ( NULL ); + loctime = localtime(&timer); + return loctime->tm_year % 10 + '0'; +} + char *string2trans (char *s) { static char res[30]; @@ -232,7 +343,7 @@ char *string2trans (char *s) else if (!strcmp(s, "53000")) sprintf (res, "Lohn"); else if (!strncmp(s, "5400", 4)) - sprintf (res, "Vermögen"); + sprintf (res, "Vermögen %c",s[4]); /* else if (!strcmp(s, "56000")) sprintf (res, ""); / * Überweisung öffentlicher Kassen */ return res; @@ -241,6 +352,7 @@ char *string2trans (char *s) char *trans2string (char *s) { static char res[30]; + char *cp; res[0] = '\0'; if (!strcmp(s, "Abbuchung")) @@ -255,8 +367,34 @@ char *trans2string (char *s) sprintf (res, "51000"); else if (!strcmp(s, "Lohn")) sprintf (res, "53000"); - else if (!strncmp(s, "Vermögen", 4)) - sprintf (res, "5400"); + else { + cp = NULL; + if (!strncmp(s, "Vermögen", 8)) + cp = s+8; + if (!strncmp(s, "Vermoegen", 9)) + cp = s+9; + + if (!cp) { + fprintf (stderr, "Unbekannte Transaktion `%s'\n", res); + exit (1); + } + + /* + Vermögen --> 5400 + Vermögen 8 -> 5400<8> + Vermögen 2003 -> 5400<3> + */ + + if (*cp) while (!isspace(*cp)) cp++; + while (isspace(*cp)) cp++; + + if (!*cp || !isdigit(*cp)) + sprintf (res, "5400%c",get_date_lastdigit()); + else { + while (isdigit(*cp)) cp++; + sprintf (res, "5400%c",*(cp-1)); + } + } /* else if (!strcmp(s, "")) sprintf (res, "56000"); / * Überweisung öffentlicher Kassen */ return res; @@ -268,7 +406,7 @@ char *string2ext (char *s) res[0] = '\0'; if (!strcmp(s, "01")) - sprintf (res, "Klient"); + sprintf (res, "Kunde"); else if (!strcmp(s, "02")) sprintf (res, "Text"); else if (!strcmp(s, "03")) @@ -281,7 +419,7 @@ char *ext2string (char *s) static char res[3]; res[0] = '\0'; - if (!strcmp(s, "Klient")) + if (!strcmp(s, "Kunde")) sprintf (res, "01"); else if (!strcmp(s, "Text")) sprintf (res, "02"); @@ -293,7 +431,7 @@ char *ext2string (char *s) unsigned long int dtaus_int(void *buf, unsigned int pos, unsigned int len) { char tmp[30]; - char *bufp = buf; + char *bufp = (char *)buf; static unsigned long int res; bufp+=pos; @@ -313,8 +451,8 @@ char *extract_ident (char *line) static char word[30]; if (strlen(line) > 0) { - x = index (line, ' '); - y = index (line, '\t'); + x = strchr (line, ' '); + y = strchr (line, '\t'); if (!x && !y) { strncpy(word, line, 29); @@ -339,6 +477,28 @@ char *extract_ident (char *line) return line; } +/* + * Pads a string with zero's on the left side. + */ +char *padzeroclip (char *s, int len) +{ + char *p, *q; + + if (strlen(s) == len) return s; + if (strlen(s) > len) { + q=s+len; + *(q--) = '\0'; + return s; + } + + q=s+len; + *(q--) = '\0'; + for (p=s+strlen(s)-1;p>=s;p--) + *(q--)=*p; + for (;q>=s;) *(q--)='0'; + return s; +} + int rec_index(char *ident, int type) { int i; @@ -365,8 +525,8 @@ size_t control_nextline (void **buf, int len, FILE *f) char *cp; int i; - bzero (line, sizeof(line)); - bzero (buf, len); + memset (line, 0, sizeof(line)); + memset (buf, 0, len); cp = line; while (!strlen(line) && (cp = fgets(line, 100, f))) { @@ -377,7 +537,7 @@ size_t control_nextline (void **buf, int len, FILE *f) while (tmp[strlen(tmp)-1] != '\n' && (cp = fgets(tmp, 100, f))); } else line[strlen(line)-1] = '\0'; - if (line[strlen(line)-1] == ' ') + if (line[strlen(line)-1] == '\r') line[strlen(line)-1] = '\0'; for (i=strlen(line);(line[i-1] == ' '||line[i-1] == '\t')&&i>0; i--) line[i-1] = '\0'; @@ -396,6 +556,9 @@ size_t control_nextline (void **buf, int len, FILE *f) return 0; } +/* + * Return the current date nicely formatted + */ char *get_date() { static char res[10]; @@ -404,18 +567,22 @@ char *get_date() timer = time ( NULL ); loctime = localtime(&timer); - sprintf(res, "%02d.%02d.%02d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year); + sprintf(res, "%02d.%02d.%02d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year % 100); return res; } -void dtaus_prepareA(char *buf) +/* + * Prepare a record A according to the specs. + * See dtaus.txt for explanation + */ +void dtaus_prepareA (char *buf) { int i; time_t timer; struct tm *loctime; char tmp[10]; - bzero (buf, 129); + memset (buf, 0, 129); timer = time ( NULL ); loctime = localtime(&timer); @@ -424,48 +591,81 @@ void dtaus_prepareA(char *buf) buf[2] = '2'; buf[3] = '8'; buf[4] = 'A'; - for (i=15;i<15+8; i++) buf[i] = '0'; - sprintf(tmp, "%02d%02d%2d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year); - for (i=0; i<6; i++) buf[50+i] = tmp[i]; - for (i=56;i<56+4; i++) buf[i] = ' '; - for (i=70;i<70+10; i++) buf[i] = '0'; - for (i=80;i<80+48; i++) buf[i] = ' '; + for (i=15;i<15+8; i++) buf[i] = '0'; /* A5 */ + sprintf(tmp, "%02d%02d%02d", loctime->tm_mday, loctime->tm_mon+1, loctime->tm_year % 100); + for (i=0; i<6; i++) buf[50+i] = tmp[i]; /* A7 (Date) */ + for (i=56;i<56+4; i++) buf[i] = ' '; /* A8 */ + for (i=70;i<70+10; i++) buf[i] = '0'; /* A10 */ + for (i=80;i<80+48; i++) buf[i] = ' '; /* A11 */ + if (use_euro) + buf[recA[A_CURR].pos] = '1'; /* A12 (Currency) */ + else + buf[recA[A_CURR].pos] = ' '; /* A12 (Currency) */ } -void dtaus_prepareC(char *buf) +/* + * Prepare a record C according to the specs. + * See dtaus.txt for explanation + */ +void dtaus_prepareC (char *buf, int normaltext, int maxtext) { int i; + int appendix = 0; - bzero (buf, 257); - buf[0] = '0'; - buf[1] = '2'; - buf[2] = '1'; - buf[3] = '6'; + memset (buf, 0, 257); + + if (normaltext) + appendix = 1; + appendix += maxtext; + i = 187 + (appendix * 29); + + /* Bail out if the number is too large, shouldn't be possible though */ + if (i >= 1000) + exit (1); + + buf[0] = (i/1000)+48;i-=(i/1000)*100; + buf[1] = (i/100)+48;i-=(i/100)*100; + buf[2] = (i/10)+48;i-=(i/10)*10; + buf[3] = i+48; buf[4] = 'C'; - for (i=31;i<31+13; i++) buf[i] = '0'; - buf[49] = ' '; - for (i=79;i<79+11; i++) buf[i] = '0'; - for (i=90;i<90+3; i++) buf[i] = ' '; - for (i=120;i<120+8; i++) buf[i] = ' '; - for (i=182;i<182+3; i++) buf[i] = ' '; - for (i=185;i<185+2; i++) buf[i] = '0'; - for (i=187;i<187+(29*2); i++) buf[i] = ' '; - for (i=245;i<245+11; i++) buf[i] = ' '; + + for (i=31;i<31+13; i++) buf[i] = '0'; /* C6 */ + buf[49] = ' '; /* C8 */ + for (i=50;i<50+11; i++) buf[i] = '0'; /* C9 (Betrag) */ + for (i=79;i<79+11; i++) buf[i] = '0'; /* C12 (Betrag Euro) */ + for (i=90;i<90+3; i++) buf[i] = ' '; /* C13 */ + for (i=93;i<90+27; i++) buf[i] = ' '; /* C14a (Kunde) */ + for (i=120;i<120+8; i++) buf[i] = ' '; /* C14b */ + if (use_euro) + buf[recC[C_EURO].pos] = '1'; /* C17a (Currency) */ + else + buf[recC[C_EURO].pos] = ' '; /* C17a (Currency) */ + for (i=183;i<183+2; i++) buf[i] = ' '; /* C17b */ + for (i=187;i<187+(29*2); i++) buf[i] = ' '; /* C19-C22 (misc text) */ + for (i=245;i<245+11; i++) buf[i] = ' '; /* C23 */ + + buf[185+0] = (appendix/10)+48;appendix-=(appendix/10)*10; + buf[185+1] = appendix+48; } -void dtaus_prepareE(char *buf) +/* + * Prepare a record E according to the specs. + * See dtaus.txt for explanation + */ +void dtaus_prepareE (char *buf) { int i; - bzero (buf, 129); + memset (buf, 0, 129); buf[0] = '0'; buf[1] = '1'; buf[2] = '2'; buf[3] = '8'; buf[4] = 'E'; - for (i=5;i<5+5; i++) buf[i] = ' '; - for (i=64;i<64+13; i++) buf[i] = '0'; - for (i=77;i<77+51; i++) buf[i] = ' '; + for (i=5;i<5+5; i++) buf[i] = ' '; /* E3 */ + for (i=17;i<17+13; i++) buf[i] = '0'; /* E8 (Check Betrag) */ + for (i=64;i<64+13; i++) buf[i] = '0'; /* E8 (Check Euro) */ + for (i=77;i<77+51; i++) buf[i] = ' '; /* E9 */ } int dtaus_writeA(FILE *f, char **values) @@ -481,35 +681,48 @@ int dtaus_writeA(FILE *f, char **values) } if (!(((values[A_TRANS][0] == 'L')||(values[A_TRANS][0] == 'G')) &&((values[A_TRANS][1] == 'B')||(values[A_TRANS][1] == 'K')))) { - fprintf (stderr, "Ungueltiger Typ, nur LK, GK, LB oder GB erlaubt.\n"); + fprintf (stderr, "Ungültiger Typ, nur LK, GK, LB oder GB erlaubt.\n"); return 0; } + i=A_NAME;if (values[i] && strlen(values[i]) > recA[i].len) + values[i][recA[i].len] = '\0'; + dtaus_prepareA(buf); buf[5] = values[A_TRANS][0]; buf[6] = values[A_TRANS][1]; - sprintf (tmp, "%08s", values[A_BLZ]); - for (i=0; i<8; i++) buf[recA[A_BLZ].pos+i] = tmp[i]; - sprintf (tmp, "%-27s", upcase(values[A_NAME])); + sprintf (tmp, "%s", padzeroclip (strip_nondigits (values[A_BLZ]),recA[A_BLZ].len)); + for (i=0; i recC[i].len) + values[i][recC[i].len-2] = '\0'; + i=C_ZWECK;if (values[i] && strlen(values[i]) > recC[i].len) + values[i][recC[i].len] = '\0'; + i=C_MYNAM;if (values[i] && strlen(values[i]) > recC[i].len) + values[i][recC[i].len] = '\0'; + i=C_TEXT;if (values[i] && strlen(values[i]) > recC[i].len) + values[i][recC[i].len] = '\0'; + + dtaus_prepareC (buf, values[C_TEXT] != NULL, maxtext); for (i=0; i<5; i++) buf[recC[C_TRANS].pos+i] = tmp[i]; if (values[C_MYBLZ]) - sprintf (tmp, "%08s", values[C_MYBLZ]); + sprintf (tmp, "%s", padzeroclip (strip_nondigits (values[C_MYBLZ]),8)); else - sprintf (tmp, "%08s", valuesA[A_BLZ]); + sprintf (tmp, "%s", padzeroclip (strip_nondigits (valuesA[A_BLZ]),8)); for (i=0; i 1) { + fieldnr=1; + while (fieldnr0?1:0; - /* FIXME: Erweiterungsfelder werden ignoriert */ - - fprintf(fcontrol, "}\n"); - } else { - fprintf (stderr, "Der zweite Teil der Transaktion ist kaputt.\n"); - return; + /* Number of extension records for this C record */ + extC = dtaus_int(buf, 185, 2); + extC -= 2; + if (extC > 0) { + res = div (extC, 4); + extC = res.quot; + if (res.rem) extC++; + } + } + if (dtaus_nextrec((void *)buf, fdtaus) != 1) + memset (buf, 0, sizeof(buf)); + + /* + * Are there extension records that we have to check? + * + * 2nd half of the AND is wrong, but since dtaus < 0.5 wrote 01 + * instead of 00 we should let it in so it can read its own + * old files... *sigh* + */ + while (extC > 0 && dtaus_char(buf,4) != 'C' && dtaus_char(buf,4) != 'E') { + for (index=0; index < 4; index++) { + if ((dtaus_char(buf,index*29) != ' ')) { + bufp = buf + index*29; + memcpy(x, bufp, 2); tmp[2] = '\0'; bufp+=2; + memcpy(tmp, bufp, recC[C_TEXT].len-2); tmp[recC[C_TEXT].len-2] = '\0'; + printctln(fcontrol, string2ext(x), strip_spaces(tmp)); + } + } + if (dtaus_nextrec((void *)buf, fdtaus) != 1) + memset (buf, 0, sizeof(buf)); + extC--; } - if (dtaus_nextrec(buf, fdtaus) != 1) - bzero (buf, sizeof(buf)); + fprintf(fcontrol, "}\n"); } } @@ -700,15 +1076,35 @@ void dtaus2control (char *cdtaus, char *ccontrol) */ if (dtaus_char(buf,4) == 'E') { if (dtaus_char(buf,4) == 'E') { - fprintf(fcontrol, "END {\n"); + fprintf(fcontrol, "\nEND {\n"); for (index=E_COUNT; index <= E_BLZ; index++) { +#ifndef DEFAULT_EURO + if (use_euro && index == E_VAL) + index = E_EUR; +#else + if (!use_euro && index == E_VAL) + index = E_DM; +#endif + bufp = buf + recE[index].pos; memcpy(tmp, bufp, recE[index].len); tmp[recE[index].len] = '\0'; - if (index == E_VAL) - fprintf(fcontrol, " %s\t%s\n", recE[index].name, strip_zeros(string2real(tmp))); + +#ifndef DEFAULT_EURO + if (index == E_VAL || index == E_EUR) +#else + if (index == E_VAL || index == E_DM) +#endif + printctln(fcontrol, recE[E_VAL].name, strip_zeros(string2real(tmp))); else - fprintf(fcontrol, " %s\t%s\n", recE[index].name, strip_zeros(tmp)); + printctln(fcontrol, recE[index].name, strip_zeros(tmp)); +#ifndef DEFAULT_EURO + if (use_euro && index == E_EUR) + index = E_VAL; +#else + if (!use_euro && index == E_DM) + index = E_VAL; +#endif } fprintf(fcontrol, "}\n"); @@ -724,37 +1120,53 @@ void dtaus2control (char *cdtaus, char *ccontrol) fclose(fdtaus); } -int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) +int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck, char *latex) { FILE *fdtaus, *fcontrol, *fbeleg, *fcheck; void *buf; char *ident; int recindex; - char tmp[30]; char line[100]; char *valA[A_LEN], *valC[C_LEN]; int count; bigint sum_val, sum_blz, sum_kto, bi; - - if (!cdtaus) + char **text = NULL; + char *cp; + int textindex = 0; + int len, i; + char *type = NULL; + char *currency = NULL; + char date_todo[11]; + char ssum_val[30], ssum_kto[30], ssum_blz[30]; + + if (!cdtaus) { if (!(fdtaus = fopen("dtaus0.txt", "w"))) return 0; - if (cdtaus) - if (!(fdtaus = fopen(cdtaus, "w"))) - return 0; - if (!ccontrol) + } else { + if (!strcmp (cdtaus, "-")) + fdtaus = stdout; + else + if (!(fdtaus = fopen(cdtaus, "w"))) + return 0; + } + if (!ccontrol) { if (!(fcontrol = fopen("dtaus0.ctl", "r"))) if (!(fcontrol = fopen("DTAUS0.CTL", "r"))) return 0; - if (ccontrol) - if (!(fcontrol = fopen(ccontrol, "r"))) - return 0; - if (!cbeleg) + } else { + if (!strcmp (ccontrol, "-")) + fcontrol = stdin; + else + if (!(fcontrol = fopen(ccontrol, "r"))) + return 0; + } + if (!cbeleg) { if (!(fbeleg = fopen("dtaus0.doc", "w"))) return 0; - if (cbeleg) + } else { if (!(fbeleg = fopen(cbeleg, "w"))) return 0; + } if (!ccheck) fcheck = stdout; else @@ -768,34 +1180,72 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) /* * Record A lesen */ - bzero(valA, sizeof(valA)); + memset (valA, 0, sizeof(valA)); control_nextline ((void *)line, 100, fcontrol); ident = extract_ident(line); if (!strcmp(ident, "begin") && (line[0] == '{')) { - fprintf(fbeleg, "\n\n"); - fprintf(fbeleg, "\n Begleitzettel\n\n"); - fprintf(fbeleg, "\n Belegloser Datentraegeraustausch\n\n"); - fprintf(fbeleg, "\n Sammeleinziehungsauftrag\n\n"); - fprintf(fbeleg, "\n VOL ........................:\n"); - fprintf(fbeleg, "\n Erstellungsdatum ...........: %s\n", get_date()); - control_nextline ((void *)line, 100, fcontrol); while (strlen(line) && line[0] != '}') { ident = extract_ident(line); if ((recindex = rec_index(ident, REC_A)) != -1) + { if (recA[recindex].type != IGN) if ((valA[recindex] = (char *)malloc (strlen(line)+1))) strcpy(valA[recindex], line); + } else { + if (! strcasecmp (ident, "euro")) + use_euro = 1; + if (! strcasecmp (ident, "dm")) + use_euro = 0; + } control_nextline ((void *)line, 100, fcontrol); } + if (((recindex = rec_index("art", REC_A)) != -1) && valA[recindex] && strlen(valA[recindex])) { + if (valA[recindex][0] == 'L') + type = strdup ("Sammeleinziehungsauftrag"); + else if (valA[recindex][0] == 'G') + type = strdup ("Sammelueberweisungsauftrag"); + else + type = strdup ("Sammelauftrag"); + + if (use_euro) + currency = strdup ("Euro"); + else + currency = strdup ("DM"); + + if (valA[A_TODO]) + sprintf (date_todo, valA[A_TODO]); + else + memset (date_todo, 0, sizeof (date_todo)); + + fprintf(fbeleg, "\n\n"); + fprintf(fbeleg, "\n Begleitzettel\n\n"); + fprintf(fbeleg, "\n Belegloser Datentraegeraustausch\n\n"); + fprintf(fbeleg, "\n %s\n\n", type); + fprintf(fbeleg, "\n VOL ........................:\n"); + fprintf(fbeleg, "\n Erstellungsdatum ...........: %s\n", get_date()); + if (date_todo) { + fprintf(fbeleg, "\n Ausfuehrungsdatum ..........: %s\n", date_todo); + } + fprintf(fbeleg, "\n Waehrung ...................: %s\n", currency); + } if (!dtaus_writeA(fdtaus, valA)) { fprintf (stderr, "Konnte den Anfangsdatensatz nicht schreiben.\n"); return 0; } fprintf (fcheck, "\n\n\n"); - fprintf (fcheck, " Sammeleinzeiehungsauftrag\n\n"); - fprintf (fcheck, " Erstellungsdatum : %s\n\n\n", get_date()); + if (valA[recindex][0] == 'L') + fprintf (fcheck, " Sammeleinziehungsauftrag\n\n"); + else if (valA[recindex][0] == 'G') + fprintf (fcheck, " Sammelueberweisungsauftrag\n\n"); + else + fprintf (fcheck, " Sammelauftrag\n\n"); + fprintf (fcheck, " Erstellungsdatum : %s\n\n", get_date()); + if (use_euro) + fprintf (fcheck, " Waehrung : Euro\n\n\n"); + else + fprintf (fcheck, " Waehrung : DM\n\n\n"); fprintf (fcheck, " %-10s %-8s %-30s %12s\n", "Kontonr.", "BLZ", "Name", "Betrag"); fprintf (fcheck, " --------------------------------------------------------------------\n"); } else { @@ -810,20 +1260,71 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) sum_val = bigint_int(0); sum_blz = bigint_int(0); sum_kto = bigint_int(0); - bzero(valC, sizeof(valC)); + memset (valC, 0, sizeof(valC)); control_nextline ((void *)line, 100, fcontrol); if (line[0] == '{') { while (strlen(line) && line[0] == '{') { control_nextline ((void *)line, 100, fcontrol); + if (text) { + for (textindex=0; textindex < MAX_TEXT && text[textindex]; textindex++) + free (text[textindex]); + free (text); + text = NULL; + } while (strlen(line) && line[0] != '}') { ident = extract_ident(line); if ((recindex = rec_index(ident, REC_C)) != -1) - if (recC[recindex].type != IGN) - if ((valC[recindex] = (char *)malloc (strlen(line)+1))) - strcpy(valC[recindex], line); + if (recC[recindex].type != IGN) { + /* + * Special exception to support multiple Text fields + */ + if (recindex == C_TEXT && valC[recindex]) { + if (!text) { + if ((text = (char **)malloc ((MAX_TEXT+1) * sizeof (char *))) == NULL) + return 0; + else { + textindex = 0; + memset (text, 0, (MAX_TEXT+1) * sizeof (char *)); + } + } + if (textindex < MAX_TEXT) { + if ((cp = (char *)malloc (strlen (line) + 1))) { + strcpy (cp, line); + cp[strlen (line)] = '\0'; + text[textindex++] = cp; + } + } + } else { + len = strlen(line); + if (recindex == C_VAL) { + /* Convert commast to dots for later processing */ + for (i=0; line[i]; i++) if (line[i] == ',') line[i] = '.'; + + if ((cp = index (line, '.')) == NULL) { + if (!(valC[recindex] = (char *)malloc (strlen(line)+4))) + return 0; + sprintf (valC[recindex], "%s.00", line); + } else if ( ((len = cp - line + 3)) < strlen (line)) { + if (!(valC[recindex] = (char *)malloc (len+1))) + return 0; + strncpy (valC[recindex], line, len); + valC[recindex][len] = '\0'; + } else { + if (!(valC[recindex] = (char *)malloc (strlen(line)+1))) + return 0; + strcpy(valC[recindex], line); + } + } else { + if ((valC[recindex] = (char *)malloc (strlen(line)+1))) + strcpy(valC[recindex], line); + else + return 0; + } + } + } control_nextline ((void *)line, 100, fcontrol); } - if (!dtaus_writeC(fdtaus, valA, valC)) { + if (!dtaus_writeC(fdtaus, valA, valC, text)) { fprintf (stderr, "Konnte den regulären Datensatz nicht schreiben.\n"); return 0; } @@ -836,7 +1337,7 @@ int control2dtaus (char *ccontrol, char *cdtaus, char *cbeleg, char *ccheck) for (recindex=0; recindex