edi4r 0.9.4.1 → 0.9.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/AuthorCopyright +3 -3
- data/{ChangeLog → Changelog} +60 -0
- data/README +15 -10
- data/Tutorial +2 -3
- data/VERSION +1 -1
- data/bin/edi2xml.rb +12 -16
- data/bin/editool.rb +9 -5
- data/bin/sedas2eancom02.rb +1385 -0
- data/bin/xml2edi.rb +7 -12
- data/data/edifact/iso9735/SDCD.20000.csv +1 -0
- data/data/edifact/iso9735/SDCD.3for2.csv +1 -0
- data/data/edifact/iso9735/SDED.20000.csv +6 -0
- data/data/edifact/iso9735/SDED.30000.csv +43 -43
- data/data/edifact/iso9735/SDED.3for2.csv +6 -0
- data/data/edifact/iso9735/SDED.40000.csv +129 -129
- data/data/edifact/iso9735/SDED.40100.csv +130 -130
- data/data/edifact/iso9735/SDMD.20000.csv +6 -0
- data/data/edifact/iso9735/SDMD.30000.csv +6 -6
- data/data/edifact/iso9735/SDMD.3for2.csv +6 -0
- data/data/edifact/iso9735/SDMD.40000.csv +17 -17
- data/data/edifact/iso9735/SDMD.40100.csv +17 -17
- data/data/edifact/iso9735/SDSD.20000.csv +5 -0
- data/data/edifact/iso9735/SDSD.3for2.csv +5 -0
- data/data/edifact/untdid/EDMD.d01b.csv +1 -1
- data/data/sedas/EDCD..csv +0 -0
- data/data/sedas/EDED..csv +859 -0
- data/data/sedas/EDMD..csv +16 -0
- data/data/sedas/EDSD..csv +44 -0
- data/lib/edi4r.rb +147 -67
- data/lib/edi4r/ansi_x12-rexml.rb +91 -0
- data/lib/edi4r/ansi_x12.rb +1684 -0
- data/lib/edi4r/diagrams.rb +75 -14
- data/lib/edi4r/edifact-rexml.rb +4 -3
- data/lib/edi4r/edifact.rb +505 -202
- data/lib/edi4r/rexml.rb +13 -7
- data/lib/edi4r/sedas.rb +854 -0
- data/lib/edi4r/standards.rb +150 -33
- data/test/damaged_file.edi +1 -0
- data/test/eancom2webedi.rb +1 -0
- data/test/groups.edi +1 -1
- data/test/test_basics.rb +16 -9
- data/test/test_edi_split.rb +30 -0
- data/test/test_loopback.rb +7 -2
- data/test/test_rexml.rb +34 -2
- data/test/test_service_messages.rb +190 -0
- data/test/test_streaming.rb +167 -0
- data/test/test_tut_examples.rb +3 -1
- data/test/webedi2eancom.rb +1 -0
- metadata +121 -77
@@ -0,0 +1,16 @@
|
|
1
|
+
12:::::;SEDAS-Liefernachweis Strecke;1200;M;1;1201;C;1;1208;C;10;SG1;M;9999;SG2;M;3
|
2
|
+
12:::::SG1;SG01;1300;M;1;1302;C;1;1308;C;10
|
3
|
+
12:::::SG2;SG02;1400;M;1;1408;C;10
|
4
|
+
15:::::;SEDAS-Rechnung Strecke;1500;M;1;1501;C;1;1508;C;10;SG1;M;9999;SG2;M;3
|
5
|
+
15:::::SG1;SG01;1600;M;1;1602;C;1;1604;C;10;1606;C;1;1608;C;10
|
6
|
+
15:::::SG2;SG02;1700;M;1;1708;C;10
|
7
|
+
22:::::;SEDAS-Liefernachweis Lager;2200;M;1;2201;C;1;2208;C;10;SG1;M;9999;SG2;M;3
|
8
|
+
22:::::SG1;SG01;2300;M;1;2302;C;1;2308;C;10
|
9
|
+
22:::::SG2;SG02;2400;M;1;2408;C;10
|
10
|
+
25:::::;SEDAS-Rechnung Lager;2500;M;1;2501;C;1;2508;C;10;SG1;M;9999;SG2;M;3
|
11
|
+
25:::::SG1;SG01;2600;M;1;2602;C;1;2604;C;10;2606;C;1;2608;C;10
|
12
|
+
25:::::SG2;SG02;2700;M;1;2708;C;10
|
13
|
+
29:::::;SEDAS-Rechnungsliste;SG1;M;3
|
14
|
+
29:::::SG1;SG01;2900;M;1;2901;C;1;2902;C;1
|
15
|
+
50:::::;SEDAS-Stammdaten;SG1;M;9999;51;C;9999
|
16
|
+
50:::::SG1;SG01;5000;M;1;5018;C;10
|
@@ -0,0 +1,44 @@
|
|
1
|
+
00;Physischer-Datei-Vorsatz;010;satzart;M;1;020;bbn_absender_dt;M;1;030;bbn_empfaenger_dt;M;1;040;datum_erstellung;M;1;050;dateistatus;M;1;060;frei1;C;1;070;sedas1;C;1;080;datei_archiv_nr;M;1;090;lfd_nr_dt_empfaenger;M;1;100;frei2;C;1;110;dateianzahl;M;1;120;frei3;C;1;130;positions_nr;M;1;990;frei4;C;1
|
2
|
+
01;Logischer-Datei-Vorsatz;010;satzart;M;1;020;bbn_absender;M;1;030;bbn_empfaenger;M;1;040;datum_erstellung;M;1;050;abrechnung_von;M;1;060;abrechnung_bis;M;1;070;sedas1;C;1;080;frei1;C;1;090;log_nr;M;1;100;rel_nr;M;1;110;frei2;C;1;120;waehrungs_kz;M;1;130;verschluesselungs_kz;M;1;140;sortier_kz;M;1;150;satzanzahl;M;1;160;frei3;C;1;170;positions_nr;C;1;990;frei4;C;1
|
3
|
+
1200;Liefernachweiskopfsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ls_auftrag_kz;M;1;070;ls_auftrag_nr;M;1;080;auftrags_nr_besteller;C;1;090;lieferdatum;M;1;100;frei1;C;1;110;warenempfaenger_kz;M;1;120;bbn_warenempfaenger;M;1;130;interne_nr;M;1;140;s_rechnung_kz;M;1;150;s_rechnung_nr;C;1;160;datum_s_beleg;C;1;170;frei2;C;1;180;datum_liefernachweis;M;1;190;ls_auftrag_kz_1;M;1;200;ls_auftrag_nr_1;C;1;210;ls_auftrag_kz_2;M;1;220;ls_auftrag_nr_2;C;1;230;ls_auftrag_kz_3;M;1;240;ls_auftrag_nr_3;C;1;250;ls_auftrag_kz_4;M;1;260;ls_auftrag_nr_4;C;1;270;ls_auftrag_kz_5;M;1;280;ls_auftrag_nr_5;C;1;290;positions_nr;M;1;300;b_vereinbarung_kz_1;M;1;310;b_vereinbarung_1;C;1;320;b_vereinbarung_kz_2;M;1;330;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
4
|
+
1201;Weitere Angaben auf Belegebene;010;satzart;M;1;020;frei1;C;1;030;bbn_rechnungsempfaenger;C;1;040;bbn_warenlieferant;C;1;050;ls_auftrag_kz;M;1;060;ls_auftrag_nr_1;C;1;070;ls_auftrag_nr_2;C;1;080;ust_ident_nr_lieferant;C;1;090;ust_ident_nr_erwerber;C;1;100;frei2;C;1;110;positions_nr;M;1;120;steuer_nr;M;1;990;folgesatz_kz;M;1
|
5
|
+
1208;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
6
|
+
1300;Liefernachweisartikelsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ean;M;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;M;1;100;preisschluessel;M;1;110;komma_kz_p;M;1;120;grundpreis;C;1;130;frei1;C;1;140;artikelrabatt_gesamt;C;1;150;warenwert;C;1;160;umsatzsteuer_kz;M;1;170;kondition;C;1;180;frei2;C;1;190;datum_liefernachweis;M;1;200;rabatt_kz_1;M;1;210;artikelrabatt_1;C;1;220;rabatt_kz_2;M;1;230;artikelrabatt_2;C;1;240;rabatt_kz_3;M;1;250;artikelrabatt_3;C;1;260;rabatt_kz_4;M;1;270;artikelrabatt_4;C;1;280;positions_nr;M;1;290;schluessel_kz;M;1;300;komma_kz;C;1;310;sondereintrag;C;1;320;b_vereinbarung_kz_2;M;1;330;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
7
|
+
1302;Weitere Angaben auf Positionsebene;010;satzart;M;1;020;frei1;C;1;030;ust_prozentsatz;C;1;040;preisschluessel;M;1;050;komma_kz_p;M;1;060;grundpreis;C;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;C;1;100;frei2;C;1;110;positions_nr;M;1;120;frei3;C;1;990;folgesatz_kz;M;1
|
8
|
+
1308;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
9
|
+
1400;Liefernachweisfusssatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ust_kz;M;1;070;warenwert_kz;M;1;080;komma_kz;C;1;090;warenbetrag_menge;M;1;100;frei1;C;1;110;nachweisrabatt_gesamt;C;1;120;fracht_verpackung_kz;M;1;130;fracht_verpackung;C;1;140;skonto;C;1;150;nachweis_endbetrag;C;1;160;frei2;C;1;170;datum_liefernachweis;M;1;180;rabatt_kz_1;M;1;190;nachweisrabatt_1;C;1;200;rabatt_kz_2;M;1;210;nachweisrabatt_2;C;1;220;rabatt_kz_3;M;1;230;nachweisrabatt_3;C;1;240;rabatt_kz_4;M;1;250;nachweisrabatt_4;C;1;260;positions_nr;M;1;270;b_vereinbarung_kz_1;M;1;280;b_vereinbarung_1;M;1;290;b_vereinbarung_kz_2;M;1;300;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
10
|
+
1408;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
11
|
+
1500;Rechnungskopfsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ls_auftrag_kz;M;1;070;ls_auftrag_nr;C;1;080;auftrags_nr_besteller;C;1;090;lieferdatum;C;1;100;valutadatum;C;1;110;warenempfaenger_kz;M;1;120;bbn_warenempfaenger;M;1;130;interne_nr;M;1;140;reli_zahlungsempfaenger_kz;M;1;150;rz_eintrag_1;M;1;160;rz_eintrag_2;M;1;170;datum_rechnung;M;1;180;ls_auftrag_kz_1;M;1;190;ls_auftrag_nr_1;C;1;200;ls_auftrag_kz_2;M;1;210;ls_auftrag_nr_2;C;1;220;ls_auftrag_kz_3;M;1;230;ls_auftrag_nr_3;C;1;240;ls_auftrag_kz_4;M;1;250;ls_auftrag_nr_4;C;1;260;ls_auftrag_kz_5;M;1;270;ls_auftrag_nr_5;C;1;280;positions_nr;M;1;290;b_vereinbarung_kz_1;M;1;300;b_vereinbarung_1;C;1;310;b_vereinbarung_kz_2;M;1;320;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
12
|
+
1501;Weitere Angaben auf Belegebene;010;satzart;M;1;020;frei1;C;1;030;bbn_rechnungsempfaenger;C;1;040;bbn_warenlieferant;C;1;050;ls_auftrag_kz;M;1;060;ls_auftrag_nr_1;C;1;070;ls_auftrag_nr_2;C;1;080;ust_ident_nr_lieferant;C;1;090;ust_ident_nr_erwerber;C;1;100;frei2;C;1;110;positions_nr;M;1;120;steuer_nr;M;1;990;folgesatz_kz;M;1
|
13
|
+
1508;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
14
|
+
1600;Rechnungsartikelsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ean;M;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;M;1;100;preisschluessel;M;1;110;komma_kz_p;M;1;120;grundpreis;M;1;130;vkz;M;1;140;artikelrabatt_gesamt;C;1;150;warenwert;M;1;160;umsatzsteuer_kz;M;1;170;frei1;C;1;180;datum_rechnung;M;1;190;rabatt_kz_1;M;1;200;artikelrabatt_1;C;1;210;rabatt_kz_2;M;1;220;artikelrabatt_2;C;1;230;rabatt_kz_3;M;1;240;artikelrabatt_3;C;1;250;rabatt_kz_4;M;1;260;artikelrabatt_4;C;1;270;positions_nr;M;1;280;schluessel_kz;M;1;290;komma_kz;C;1;300;sondereintrag;C;1;310;b_vereinbarung_kz_2;M;1;320;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
15
|
+
1602;Weitere Angaben auf Positionsebene;010;satzart;M;1;020;frei1;C;1;030;ust_prozentsatz;C;1;040;preisschluessel;M;1;050;komma_kz_p;M;1;060;grundpreis;C;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;C;1;100;frei2;C;1;110;positions_nr;M;1;120;frei3;C;1;990;folgesatz_kz;M;1
|
16
|
+
1604;Rabattaufteilungssatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ean;M;1;070;artikelgruppen_nr_1;M;1;080;rabatt_kz_1;M;1;090;rabatt_1;M;1;100;artikelgruppen_nr_2;M;1;110;rabatt_kz_2;C;1;120;rabatt_2;M;1;130;artikelgruppen_nr_3;M;1;140;rabatt_kz_3;C;1;150;rabatt_3;M;1;160;artikelgruppen_nr_4;M;1;170;rabatt_kz_4;C;1;180;rabatt_4;M;1;190;artikelgruppen_nr_5;M;1;200;rabatt_kz_5;C;1;210;rabatt_5;M;1;220;artikelgruppen_nr_6;M;1;230;rabatt_kz_6;C;1;240;rabatt_6;M;1;250;artikelgruppen_nr_7;M;1;260;rabatt_kz_7;C;1;270;rabatt_7;M;1;280;frei1;C;1;290;positions_nr;M;1;980;frei2;C;1;990;folgesatz_kz;M;1
|
17
|
+
1606;Satz fuer Zu/Abschlaege;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;basiswert_1;M;1;070;zu_abschlag_kz_1;M;1;080;zu_abschlag_1;M;1;090;schluessel_1;C;1;100;basiswert_2;M;1;110;zu_abschlag_kz_2;M;1;120;zu_abschlag_2;M;1;130;schluessel_2;C;1;140;basiswert_3;M;1;150;zu_abschlag_kz_3;M;1;160;zu_abschlag_3;M;1;170;schluessel_3;C;1;180;basiswert_4;M;1;190;zu_abschlag_kz_4;M;1;200;zu_abschlag_4;M;1;210;schluessel_4;C;1;220;frei1;C;1;230;positions_nr;M;1;240;frei2;C;1;990;folgesatz_kz;M;1
|
18
|
+
1608;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
19
|
+
1700;Rechnungsfusssatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ust_kz;M;1;070;warenbetrag;M;1;080;frei1;C;1;090;rechnungsrabatt_gesamt;C;1;100;fracht_verpackung_kz;M;1;110;frachtbelastung;C;1;120;skonto;C;1;130;umsatzsteuer;M;1;140;endbetrag;M;1;150;frei2;C;1;160;datum_rechnung;M;1;170;rabatt_kz_1;C;1;180;rechnungsrabatt_1;C;1;190;rabatt_kz_2;C;1;200;rechnungsrabatt_2;C;1;210;rabatt_kz_3;C;1;220;rechnungsrabatt_3;C;1;230;rabatt_kz_4;C;1;240;rechnungsrabatt_4;C;1;250;positions_nr;M;1;260;b_vereinbarung_kz_1;M;1;270;b_vereinbarung_1;M;1;280;b_vereinbarung_kz_2;M;1;290;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
20
|
+
1708;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
21
|
+
2200;Liefernachweiskopfsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ls_auftrag_kz;M;1;070;ls_auftrag_nr;M;1;080;auftrags_nr_besteller;C;1;090;lieferdatum;M;1;100;frei1;C;1;110;warenempfaenger_kz;M;1;120;bbn_warenempfaenger;M;1;130;interne_nr;M;1;140;s_rechnung_kz;M;1;150;s_rechnung_nr;C;1;160;datum_s_beleg;C;1;170;frei2;C;1;180;datum_liefernachweis;M;1;190;ls_auftrag_kz_1;M;1;200;ls_auftrag_nr_1;C;1;210;ls_auftrag_kz_2;M;1;220;ls_auftrag_nr_2;C;1;230;ls_auftrag_kz_3;M;1;240;ls_auftrag_nr_3;C;1;250;ls_auftrag_kz_4;M;1;260;ls_auftrag_nr_4;C;1;270;ls_auftrag_kz_5;M;1;280;ls_auftrag_nr_5;C;1;290;positions_nr;M;1;300;b_vereinbarung_kz_1;M;1;310;b_vereinbarung_1;C;1;320;b_vereinbarung_kz_2;M;1;330;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
22
|
+
2201;Weitere Angaben auf Belegebene;010;satzart;M;1;020;frei1;C;1;030;bbn_rechnungsempfaenger;C;1;040;bbn_warenlieferant;C;1;050;ls_auftrag_kz;M;1;060;ls_auftrag_nr_1;C;1;070;ls_auftrag_nr_2;C;1;080;ust_ident_nr_lieferant;C;1;090;ust_ident_nr_erwerber;C;1;100;frei2;C;1;110;positions_nr;M;1;120;steuer_nr;M;1;990;folgesatz_kz;M;1
|
23
|
+
2208;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
24
|
+
2300;Liefernachweisartikelsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ean;M;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;M;1;100;preisschluessel;M;1;110;komma_kz_p;M;1;120;grundpreis;C;1;130;frei1;C;1;140;artikelrabatt_gesamt;C;1;150;warenwert;C;1;160;umsatzsteuer_kz;M;1;170;kondition;C;1;180;frei2;C;1;190;datum_liefernachweis;M;1;200;rabatt_kz_1;M;1;210;artikelrabatt_1;C;1;220;rabatt_kz_2;M;1;230;artikelrabatt_2;C;1;240;rabatt_kz_3;M;1;250;artikelrabatt_3;C;1;260;rabatt_kz_4;M;1;270;artikelrabatt_4;C;1;280;positions_nr;M;1;290;schluessel_kz;M;1;300;komma_kz;C;1;310;sondereintrag;C;1;320;b_vereinbarung_kz_2;M;1;330;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
25
|
+
2302;Weitere Angaben auf Positionsebene;010;satzart;M;1;020;frei1;C;1;030;ust_prozentsatz;C;1;040;preisschluessel;M;1;050;komma_kz_p;M;1;060;grundpreis;C;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;C;1;100;frei2;C;1;110;positions_nr;M;1;120;frei3;C;1;990;folgesatz_kz;M;1
|
26
|
+
2308;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
27
|
+
2400;Liefernachweisfusssatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ust_kz;M;1;070;warenwert_kz;M;1;080;komma_kz;C;1;090;warenbetrag_menge;M;1;100;frei1;C;1;110;nachweisrabatt_gesamt;C;1;120;fracht_verpackung_kz;M;1;130;fracht_verpackung;C;1;140;skonto;C;1;150;nachweis_endbetrag;C;1;160;frei2;C;1;170;datum_liefernachweis;M;1;180;rabatt_kz_1;M;1;190;nachweisrabatt_1;C;1;200;rabatt_kz_2;M;1;210;nachweisrabatt_2;C;1;220;rabatt_kz_3;M;1;230;nachweisrabatt_3;C;1;240;rabatt_kz_4;M;1;250;nachweisrabatt_4;C;1;260;positions_nr;M;1;270;b_vereinbarung_kz_1;M;1;280;b_vereinbarung_1;M;1;290;b_vereinbarung_kz_2;M;1;300;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
28
|
+
2408;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
29
|
+
2500;Rechnungskopfsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ls_auftrag_kz;M;1;070;ls_auftrag_nr;C;1;080;auftrags_nr_besteller;C;1;090;lieferdatum;C;1;100;valutadatum;C;1;110;warenempfaenger_kz;M;1;120;bbn_warenempfaenger;M;1;130;interne_nr;M;1;140;reli_zahlungsempfaenger_kz;M;1;150;rz_eintrag_1;M;1;160;rz_eintrag_2;M;1;170;datum_rechnung;M;1;180;ls_auftrag_kz_1;M;1;190;ls_auftrag_nr_1;C;1;200;ls_auftrag_kz_2;M;1;210;ls_auftrag_nr_2;C;1;220;ls_auftrag_kz_3;M;1;230;ls_auftrag_nr_3;C;1;240;ls_auftrag_kz_4;M;1;250;ls_auftrag_nr_4;C;1;260;ls_auftrag_kz_5;M;1;270;ls_auftrag_nr_5;C;1;280;positions_nr;M;1;290;b_vereinbarung_kz_1;M;1;300;b_vereinbarung_1;C;1;310;b_vereinbarung_kz_2;M;1;320;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
30
|
+
2501;Weitere Angaben auf Belegebene;010;satzart;M;1;020;frei1;C;1;030;bbn_rechnungsempfaenger;C;1;040;bbn_warenlieferant;C;1;050;ls_auftrag_kz;M;1;060;ls_auftrag_nr_1;C;1;070;ls_auftrag_nr_2;C;1;080;ust_ident_nr_lieferant;C;1;090;ust_ident_nr_erwerber;C;1;100;frei2;C;1;110;positions_nr;M;1;120;steuer_nr;M;1;990;folgesatz_kz;M;1
|
31
|
+
2508;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
32
|
+
2600;Rechnungsartikelsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ean;M;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;M;1;100;preisschluessel;M;1;110;komma_kz_p;M;1;120;grundpreis;M;1;130;vkz;M;1;140;artikelrabatt_gesamt;C;1;150;warenwert;M;1;160;umsatzsteuer_kz;M;1;170;frei1;C;1;180;datum_rechnung;M;1;190;rabatt_kz_1;M;1;200;artikelrabatt_1;C;1;210;rabatt_kz_2;M;1;220;artikelrabatt_2;C;1;230;rabatt_kz_3;M;1;240;artikelrabatt_3;C;1;250;rabatt_kz_4;M;1;260;artikelrabatt_4;C;1;270;positions_nr;M;1;280;schluessel_kz;M;1;290;komma_kz;C;1;300;sondereintrag;C;1;310;b_vereinbarung_kz_2;M;1;320;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
33
|
+
2602;Weitere Angaben auf Positionsebene;010;satzart;M;1;020;frei1;C;1;030;ust_prozentsatz;C;1;040;preisschluessel;M;1;050;komma_kz_p;M;1;060;grundpreis;C;1;070;mengenschluessel;M;1;080;komma_kz_m;M;1;090;menge;C;1;100;frei2;C;1;110;positions_nr;M;1;120;frei3;C;1;990;folgesatz_kz;M;1
|
34
|
+
2604;Rabattaufteilungssatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ean;M;1;070;artikelgruppen_nr_1;M;1;080;rabatt_kz_1;M;1;090;rabatt_1;M;1;100;artikelgruppen_nr_2;M;1;110;rabatt_kz_2;C;1;120;rabatt_2;M;1;130;artikelgruppen_nr_3;M;1;140;rabatt_kz_3;C;1;150;rabatt_3;M;1;160;artikelgruppen_nr_4;M;1;170;rabatt_kz_4;C;1;180;rabatt_4;M;1;190;artikelgruppen_nr_5;M;1;200;rabatt_kz_5;C;1;210;rabatt_5;M;1;220;artikelgruppen_nr_6;M;1;230;rabatt_kz_6;C;1;240;rabatt_6;M;1;250;artikelgruppen_nr_7;M;1;260;rabatt_kz_7;C;1;270;rabatt_7;M;1;280;frei1;C;1;290;positions_nr;M;1;980;frei2;C;1;990;folgesatz_kz;M;1
|
35
|
+
2606;Satz fuer Zu/Abschlaege;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;basiswert_1;M;1;070;zu_abschlag_kz_1;M;1;080;zu_abschlag_1;M;1;090;schluessel_1;C;1;100;basiswert_2;M;1;110;zu_abschlag_kz_2;M;1;120;zu_abschlag_2;M;1;130;schluessel_2;C;1;140;basiswert_3;M;1;150;zu_abschlag_kz_3;M;1;160;zu_abschlag_3;M;1;170;schluessel_3;C;1;180;basiswert_4;M;1;190;zu_abschlag_kz_4;M;1;200;zu_abschlag_4;M;1;210;schluessel_4;C;1;220;frei1;C;1;230;positions_nr;M;1;240;frei2;C;1;990;folgesatz_kz;M;1
|
36
|
+
2608;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
37
|
+
2700;Rechnungsfusssatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;ust_kz;M;1;070;warenbetrag;M;1;080;frei1;C;1;090;rechnungsrabatt_gesamt;C;1;100;fracht_verpackung_kz;M;1;110;frachtbelastung;C;1;120;skonto;C;1;130;umsatzsteuer;M;1;140;endbetrag;M;1;150;frei2;C;1;160;datum_rechnung;M;1;170;rabatt_kz_1;C;1;180;rechnungsrabatt_1;C;1;190;rabatt_kz_2;C;1;200;rechnungsrabatt_2;C;1;210;rabatt_kz_3;C;1;220;rechnungsrabatt_3;C;1;230;rabatt_kz_4;C;1;240;rechnungsrabatt_4;C;1;250;positions_nr;M;1;260;b_vereinbarung_kz_1;M;1;270;b_vereinbarung_1;M;1;280;b_vereinbarung_kz_2;M;1;290;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
38
|
+
2708;Allgemeiner Textsatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungsempfaenger;M;1;040;beleg_kz;M;1;050;beleg_nr;M;1;060;freitext;M;1;070;positions_nr;M;1;980;frei1;C;1;990;folgesatz_kz;M;1
|
39
|
+
2900;Rechnungslistensatz;010;satzart;M;1;020;bbn_lieferant;M;1;030;bbn_rechnungslistenempfaenger;M;1;040;bbn_zahlungsempfaenger;M;1;050;bbn_zahlungsleistender;M;1;060;reli_kz;M;1;070;nummer;C;1;080;valutadatum;C;1;090;ust_kz;M;1;100;konditionsbasis;C;1;110;umsatzsteuer;M;1;120;endbetrag;M;1;130;frei1;C;1;140;datum_reli;C;1;150;abkommen_nr;C;1;160;vertragsverguetung;C;1;170;ust_vv_kz_1;C;1;180;ust_vv_1;C;1;190;zahlbetrag;M;1;200;frei2;C;1;210;ust_vv_kz_2;M;1;220;ust_vv_2;C;1;230;positions_nr;M;1;240;b_vereinbarung_kz_1;M;1;250;b_vereinbarung_1;C;1;260;b_vereinbarung_kz_2;M;1;270;b_vereinbarung_2;C;1;990;folgesatz_kz;M;1
|
40
|
+
5000;Artikelsatz;010;satzart;M;1;020;bbn_absender;M;1;030;bbn_empfaenger;M;1;040;artikel_nr;C;1;050;grundpreis;C;1;060;menge_ean;M;1;070;verpackungsart;C;1;080;ust_kz;C;1;090;einheit_vke;C;1;100;preisbasis;C;1;110;ean;M;1;120;pruefziffer;M;1;130;klassifikation;M;1;140;schluessel_kz;M;1;150;komma_kz;C;1;160;sondereintrag;C;1;170;frei1;C;1;180;datum;M;1;190;kurztext;C;1;200;langtext;M;1;210;positions_nr;M;1;220;kleinste_ean;M;1;230;pruefziffer_kleinste_ean;M;1;980;frei2;C;1;990;folgesatz_kz;M;1
|
41
|
+
5018;Stammdaten-Textsatz;010;satzart;M;1;020;bbn_absender;M;1;030;bbn_empfaenger;M;1;040;frei1;C;1;050;ean;M;1;060;ean_pz;C;1;070;freitext;M;1;080;positions_nr;M;1;980;frei2;C;1;990;folgesatz_kz;M;1
|
42
|
+
51;Informationssatz;010;satzart;M;1;020;bbn_absender;M;1;030;bbn_empfaenger;M;1;040;refpos_nr;M;1;050;rechnung_nr;M;1;060;liefernachweis_nr;M;1;070;bbs_kz;M;1;080;bbn_warenempfaenger;M;1;090;interne_nr;M;1;100;name_warenempfaenger;M;1;110;datum_erstellung;M;1;120;plz_1;C;1;130;ort;M;1;140;laender_kz;C;1;150;plz_2;C;1;160;frei1;C;1;170;positions_nr;M;1;180;strasse_postfach;C;1
|
43
|
+
98;Logischer-Datei-Nachsatz;010;satzart;M;1;020;bbn_absender;M;1;030;bbn_empfaenger;M;1;040;datum_erstellung;M;1;050;abrechnung_von;M;1;060;abrechnung_bis;M;1;070;sedas1;C;1;080;frei1;C;1;090;log_nr;M;1;100;rel_nr;M;1;110;frei2;C;1;120;waehrungs_kz;M;1;130;verschluesselungs_kz;M;1;140;sortier_kz;M;1;150;satzanzahl;M;1;160;frei3;C;1;170;positions_nr;M;1;990;frei4;C;1
|
44
|
+
99;Physischer-Datei-Nachsatz;010;satzart;M;1;020;bbn_absender_dt;M;1;030;bbn_empfaenger_dt;M;1;040;datum_erstellung;M;1;050;dateistatus;M;1;060;frei1;C;1;070;sedas1;C;1;080;datei_archiv_nr;M;1;090;lfd_nr_dt_empfaenger;M;1;100;frei2;C;1;110;dateianzahl;M;1;120;frei3;C;1;130;positions_nr;M;1;990;frei4;C;1
|
data/lib/edi4r.rb
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# -*- encoding: iso-8859-1 -*-
|
2
|
+
|
3
|
+
require 'enumerator'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
BEGIN {
|
7
|
+
require 'pathname'
|
8
|
+
# 'realpath' fails on Windows platforms!
|
9
|
+
# ENV['EDI_NDB_PATH'] = Pathname.new(__FILE__).dirname.parent.realpath + 'data'
|
10
|
+
pdir = Pathname.new(__FILE__).dirname.parent
|
11
|
+
ENV['EDI_NDB_PATH'] = File.expand_path(pdir) + File::Separator + 'data'
|
12
|
+
}
|
13
|
+
|
14
|
+
require "edi4r/standards"
|
15
|
+
require "edi4r/diagrams"
|
16
|
+
|
1
17
|
=begin rdoc
|
2
18
|
:main:README
|
3
19
|
:title:edi4r
|
@@ -8,7 +24,7 @@ An API to parse and create UN/EDIFACT and other EDI data
|
|
8
24
|
* Abstract classes are maintained in this file.
|
9
25
|
* See other files in edi4r/ for specific EDI syntax standards.
|
10
26
|
|
11
|
-
$Id: edi4r.rb,v 1.6 2006/08/01 11:12:39 werntges Exp $
|
27
|
+
$Id: edi4r.rb,v 1.6 2006/08/01 11:12:39 werntges Exp werntges $
|
12
28
|
|
13
29
|
:include: ../AuthorCopyright
|
14
30
|
|
@@ -99,22 +115,12 @@ Collection_S:: Segment, CDE
|
|
99
115
|
# NDB - support codelists
|
100
116
|
# (much more, including general cleanup & tuning ...)
|
101
117
|
|
102
|
-
require 'enumerator'
|
103
|
-
|
104
|
-
BEGIN {
|
105
|
-
require 'pathname'
|
106
|
-
# 'realpath' fails on Windows platforms!
|
107
|
-
# ENV['EDI_NDB_PATH'] = Pathname.new(__FILE__).dirname.parent.realpath + 'data'
|
108
|
-
pdir = Pathname.new(__FILE__).dirname.parent
|
109
|
-
ENV['EDI_NDB_PATH'] = File.expand_path(pdir) + File::Separator + 'data'
|
110
|
-
}
|
111
|
-
|
112
|
-
require "edi4r/standards"
|
113
|
-
require "edi4r/diagrams"
|
114
|
-
|
115
|
-
|
116
118
|
module EDI
|
117
119
|
|
120
|
+
@logger = Logger.new(STDERR) # Default logger
|
121
|
+
attr_accessor :logger
|
122
|
+
module_function :logger, :logger=
|
123
|
+
|
118
124
|
#########################################################################
|
119
125
|
#
|
120
126
|
# Basic (abstract) class: Makes sure that all derived
|
@@ -137,6 +143,34 @@ module EDI
|
|
137
143
|
end
|
138
144
|
|
139
145
|
|
146
|
+
#########################################################################
|
147
|
+
#
|
148
|
+
# Here we extend class Time by some methods that help us maximize
|
149
|
+
# its use in some contexts like UN/EDIFACT.
|
150
|
+
#
|
151
|
+
# Basic idea (UN/EDIFACT example):
|
152
|
+
# * Use the EDIFACT qualifiers of DE 2379 in DTM directly
|
153
|
+
# to parse dates and to create them upon output.
|
154
|
+
# * Use augmented Time objects as values of DE 2380 instead of strings
|
155
|
+
#
|
156
|
+
|
157
|
+
class EDI::Time < ::Time
|
158
|
+
attr_accessor :format
|
159
|
+
@@to_s_callbacks = []
|
160
|
+
|
161
|
+
alias to_s_orig to_s
|
162
|
+
|
163
|
+
def to_s
|
164
|
+
return to_s_orig unless @format
|
165
|
+
str = nil
|
166
|
+
@@to_s_callbacks.each do |sym|
|
167
|
+
return str if (str=self.send(sym)) # Found if not nil
|
168
|
+
end
|
169
|
+
raise "EDI::Time: Format '#{format}' not supported"
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
|
140
174
|
#########################################################################
|
141
175
|
#
|
142
176
|
# A simple utility class that fills a need not covered by "zlib".
|
@@ -158,6 +192,10 @@ module EDI
|
|
158
192
|
len==0 ? @pipe.read : @pipe.read( len )
|
159
193
|
end
|
160
194
|
|
195
|
+
def getc
|
196
|
+
@pipe.getc # @pipe.read( 1 )
|
197
|
+
end
|
198
|
+
|
161
199
|
def rewind
|
162
200
|
@pipe.close
|
163
201
|
@pipe = IO.popen("bzcat #@path",'r' )
|
@@ -188,6 +226,16 @@ module EDI
|
|
188
226
|
each {|obj| obj.root = rt }
|
189
227
|
end
|
190
228
|
|
229
|
+
# TO-DO: Experimental add-on
|
230
|
+
# Inefficient, brute-force implementation - use sparingly
|
231
|
+
def deep_clone
|
232
|
+
Marshal.restore(Marshal.dump(self)) # TO DO: Make more efficient
|
233
|
+
# c = Marshal.restore(Marshal.dump(self)) # TO DO: Make more efficient
|
234
|
+
# c.each {|obj| obj.parent = c }
|
235
|
+
# c.root = c if c.is_a? EDI::Interchange
|
236
|
+
# c
|
237
|
+
end
|
238
|
+
|
191
239
|
|
192
240
|
# Similar to Array#push(), but automatically setting obj's
|
193
241
|
# parent and root to self and self's root. Returns obj.
|
@@ -209,6 +257,7 @@ module EDI
|
|
209
257
|
# index, each, find_all, length, size, first, last
|
210
258
|
def index(obj); @a.index(obj); end
|
211
259
|
def each(&b); @a.each(&b); end
|
260
|
+
def find(&b); @a.find(&b); end
|
212
261
|
def find_all(&b); @a.find_all(&b); end
|
213
262
|
def size; @a.size; end
|
214
263
|
def length; @a.length; end
|
@@ -217,6 +266,7 @@ module EDI
|
|
217
266
|
|
218
267
|
# The element reference operator [] supports two access modes:
|
219
268
|
# Array-like:: Return indexed element when passing an integer
|
269
|
+
# By regexp:: Return array of element(s) whose name(s) match given regexp
|
220
270
|
# By name:: Return array of element(s) whose name(s) match given string
|
221
271
|
def [](i)
|
222
272
|
lookup(i)
|
@@ -224,7 +274,7 @@ module EDI
|
|
224
274
|
|
225
275
|
|
226
276
|
# This implementation of +inspect()+ is very verbose in that it
|
227
|
-
# inspects
|
277
|
+
# inspects all contained objects in a recursive manner.
|
228
278
|
#
|
229
279
|
# indent:: String offset to use for indentation / pretty-printing
|
230
280
|
# symlist:: Array of getter names (passed as symbols) whose values are
|
@@ -234,9 +284,13 @@ module EDI
|
|
234
284
|
headline = indent + self.name+': ' + symlist.map do |sym|
|
235
285
|
"#{sym} = #{(s=send(sym)).nil? ? 'nil' : s.to_s}"
|
236
286
|
end.join(', ') + "\n"
|
237
|
-
|
238
|
-
|
239
|
-
|
287
|
+
if self.is_a? Collection_HT
|
288
|
+
headline << @header.inspect(indent+' ') if @header
|
289
|
+
str = @a.inject( headline ){|s,obj| s << obj.inspect(indent+' ')}
|
290
|
+
@trailer ? str << @trailer.inspect(indent+' ') : str
|
291
|
+
else
|
292
|
+
@a.inject( headline ){|s,obj| s << obj.inspect(indent+' ')}
|
293
|
+
end
|
240
294
|
end
|
241
295
|
|
242
296
|
|
@@ -277,6 +331,8 @@ module EDI
|
|
277
331
|
def lookup(i)
|
278
332
|
if i.is_a?(Integer)
|
279
333
|
@a[i]
|
334
|
+
elsif i.is_a?(Regexp)
|
335
|
+
@a.find_all {|x| x.name =~ i}
|
280
336
|
else
|
281
337
|
@a.find_all {|x| x.name == i}
|
282
338
|
end
|
@@ -288,10 +344,14 @@ module EDI
|
|
288
344
|
#
|
289
345
|
# UN/EDIFACT examples:
|
290
346
|
# d3055, d1004=(value), cC105, a7174[1].value
|
347
|
+
#
|
348
|
+
# ANSI X.12 examples:
|
349
|
+
# d305 = "C" # in segment BPR
|
350
|
+
# r01 = "C" # equivalent expression, 01 indicating the first DE
|
291
351
|
|
292
352
|
def method_missing(sym, *par)
|
293
|
-
if sym.id2name =~ /^([
|
294
|
-
rc = lookup($2)
|
353
|
+
if sym.id2name =~ /^([acdrs])(\w+)(=)?/
|
354
|
+
rc = $1=='r' ? lookup($2.to_i - 1) : lookup($2)
|
295
355
|
if rc.is_a? Array
|
296
356
|
if rc.size==1
|
297
357
|
rc = rc.first
|
@@ -302,12 +362,12 @@ module EDI
|
|
302
362
|
if $3
|
303
363
|
# Setter
|
304
364
|
raise TypeError, "Can't assign to array #$2" if rc.is_a? Array
|
305
|
-
raise TypeError, "Can only assign to a DE value" if $1 != 'd'
|
365
|
+
raise TypeError, "Can only assign to a DE value" unless rc.respond_to?(:value) # if $1 != 'd'
|
306
366
|
rc.value = par[0]
|
307
367
|
else
|
308
368
|
# Getter
|
309
|
-
return rc.value if rc.is_a? DE and $1 == 'd'
|
310
|
-
return rc if rc.is_a? CDE and $1 == 'c'
|
369
|
+
return rc.value if rc.is_a? DE and ($1 == 'd' || $1 == 'r')
|
370
|
+
return rc if rc.is_a? CDE and ($1 == 'c' || $1 == 'r')
|
311
371
|
return rc if rc.is_a? Segment and $1 == 's'
|
312
372
|
err_msg = "Method prefix '#$1' not matching result '#{rc.class}'!"
|
313
373
|
raise TypeError, err_msg unless rc.is_a? Array
|
@@ -356,7 +416,7 @@ module EDI
|
|
356
416
|
|
357
417
|
|
358
418
|
def to_s( postfix='' )
|
359
|
-
s = @header ? @header.to_s+postfix : ''
|
419
|
+
s = @header ? @header.to_s + postfix : ''
|
360
420
|
each {|obj| s << (obj.is_a?(Segment) ? obj.to_s+postfix : obj.to_s)}
|
361
421
|
s << @trailer.to_s+postfix if @trailer
|
362
422
|
s
|
@@ -383,12 +443,12 @@ module EDI
|
|
383
443
|
location = "#{parent.name} - #{@name}"
|
384
444
|
if empty?
|
385
445
|
if required?
|
386
|
-
warn "#{location}: Empty though mandatory!"
|
446
|
+
EDI::logger.warn "#{location}: Empty though mandatory!"
|
387
447
|
err_count += 1
|
388
448
|
end
|
389
449
|
else
|
390
450
|
if rep && maxrep && rep > maxrep
|
391
|
-
warn "#{location}: Too often repeated: #{rep} > #{maxrep}!"
|
451
|
+
EDI::logger.warn "#{location}: Too often repeated: #{rep} > #{maxrep}!"
|
392
452
|
err_count += 1
|
393
453
|
end
|
394
454
|
each {|obj| err_count += obj.validate}
|
@@ -439,14 +499,16 @@ module EDI
|
|
439
499
|
class Interchange < Collection_HT
|
440
500
|
|
441
501
|
attr_accessor :output_mode
|
442
|
-
attr_reader :syntax, :version
|
502
|
+
attr_reader :syntax, :version
|
503
|
+
attr_reader :illegal_charset_pattern
|
443
504
|
|
444
505
|
# Abstract class - don't instantiate directly
|
445
506
|
#
|
446
507
|
def initialize( user_par=nil )
|
447
508
|
super( nil, self, 'Interchange' )
|
448
509
|
@illegal_charset_pattern = /^$/ # Default: Never match a non-empty string
|
449
|
-
@content = nil # nil if empty, :messages, or :groups
|
510
|
+
@content = nil # nil if empty, else :messages, or :groups
|
511
|
+
EDI::logger = user_par[:logger] if user_par[:logger].is_a? Logger
|
450
512
|
end
|
451
513
|
|
452
514
|
# Auto-detect file content, optionally decompress, return an
|
@@ -465,12 +527,16 @@ module EDI
|
|
465
527
|
|
466
528
|
def Interchange.parse( hnd, auto_validate=true )
|
467
529
|
case rc=Interchange.detect( hnd )
|
468
|
-
when 'BZ'
|
469
|
-
when 'GZ'
|
470
|
-
when '
|
471
|
-
when '
|
472
|
-
when '
|
473
|
-
when '
|
530
|
+
when 'BZ' then Interchange.parse( EDI::Bzip2Reader.new( hnd ) ) # see "peek"
|
531
|
+
when 'GZ' then Interchange.parse( Zlib::GzipReader.new( hnd ) )
|
532
|
+
when 'A' then EDI::A::Interchange.parse( hnd, auto_validate )
|
533
|
+
when 'E' then EDI::E::Interchange.parse( hnd, auto_validate )
|
534
|
+
when 'I' then EDI::I::Interchange.parse( hnd, auto_validate )
|
535
|
+
when 'S' then EDI::S::Interchange.parse( hnd, auto_validate )
|
536
|
+
when 'XA' then EDI::A::Interchange.parse_xml( REXML::Document.new(hnd) )
|
537
|
+
when 'XE' then EDI::E::Interchange.parse_xml( REXML::Document.new(hnd) )
|
538
|
+
when 'XI' then EDI::I::Interchange.parse_xml( REXML::Document.new(hnd) )
|
539
|
+
when 'XS' then EDI::S::Interchange.parse_xml( REXML::Document.new(hnd) )
|
474
540
|
else raise "#{rc}: Unsupported format key - don\'t know how to proceed!"
|
475
541
|
end
|
476
542
|
end
|
@@ -484,18 +550,22 @@ module EDI
|
|
484
550
|
#
|
485
551
|
# NOTES: See Interchange.parse
|
486
552
|
|
487
|
-
def Interchange.peek( hnd=$stdin)
|
553
|
+
def Interchange.peek( hnd=$stdin, params={})
|
488
554
|
case rc=Interchange.detect( hnd )
|
489
555
|
# Does not exist yet!
|
490
556
|
# when 'BZ': Interchange.peek( Zlib::Bzip2Reader.new( hnd ) )
|
491
557
|
# Temporary substitute, Unix/Linux only, low performance:
|
492
|
-
when 'BZ'
|
493
|
-
|
494
|
-
when 'GZ'
|
495
|
-
when '
|
496
|
-
when '
|
497
|
-
when '
|
498
|
-
when '
|
558
|
+
when 'BZ' then Interchange.peek( EDI::Bzip2Reader.new( hnd ), params )
|
559
|
+
|
560
|
+
when 'GZ' then Interchange.peek( Zlib::GzipReader.new( hnd ), params )
|
561
|
+
when 'A' then EDI::A::Interchange.peek( hnd, params )
|
562
|
+
when 'E' then EDI::E::Interchange.peek( hnd, params )
|
563
|
+
when 'I' then EDI::I::Interchange.peek( hnd )
|
564
|
+
when 'S' then EDI::S::Interchange.peek( hnd )
|
565
|
+
when 'XA' then EDI::A::Interchange.peek_xml( REXML::Document.new(hnd) )
|
566
|
+
when 'XE' then EDI::E::Interchange.peek_xml( REXML::Document.new(hnd) )
|
567
|
+
when 'XI' then EDI::I::Interchange.peek_xml( REXML::Document.new(hnd) )
|
568
|
+
when 'XS' then EDI::S::Interchange.peek_xml( REXML::Document.new(hnd) )
|
499
569
|
else raise "#{rc}: Unsupported format key - don\'t know how to proceed!"
|
500
570
|
end
|
501
571
|
end
|
@@ -511,17 +581,19 @@ module EDI
|
|
511
581
|
# If you really need to read from $stdin, call Interchange::E::parse()
|
512
582
|
# and Interchange::E::peek() etc. directly to bypass auto-detection
|
513
583
|
hnd.rewind
|
514
|
-
|
584
|
+
|
515
585
|
re = /(<\?xml.*?)?DOCTYPE\s+Interchange.*?\<Interchange\s+.*?standard\_key\s*=\s*(['"])(.)\2/m
|
516
586
|
case buf
|
517
|
-
when /^(UNA......)?\r?\n?U[IN]B.UNO[A-Z].[1-4]
|
518
|
-
when /^
|
519
|
-
when
|
520
|
-
when
|
521
|
-
when
|
522
|
-
when /^\037\
|
523
|
-
when
|
524
|
-
|
587
|
+
when /^(UNA......)?\r?\n?U[IN]B.UNO[A-Z].[1-4]/ then 'E' # UN/EDIFACT
|
588
|
+
when /^ISA.{67}\d{6}.\d{4}/ then 'A' # ANSI X.12
|
589
|
+
when /^EDI_DC/ then 'I' # SAP IDoc
|
590
|
+
when /^00/ then 'S' # SEDAS
|
591
|
+
when re then 'X'+$3 # XML, Doctype = Interchange, syntax standard key (E, I, ...) postfix
|
592
|
+
when /^\037\213/ then 'GZ' # gzip
|
593
|
+
when /^\037\235/ then 'Z' # compress
|
594
|
+
when /^\037\036/ then 'z' # pack
|
595
|
+
when /^BZh[0-\377]/ then 'BZ' # bzip2
|
596
|
+
else raise "?? (stream starts with: #{buf[0..15]})"
|
525
597
|
end
|
526
598
|
end
|
527
599
|
|
@@ -758,6 +830,7 @@ module EDI
|
|
758
830
|
loop do
|
759
831
|
index += 1
|
760
832
|
seg = msg[index]
|
833
|
+
break if seg.nil?
|
761
834
|
next if child_mode and seg.level > level+1 # other descendants
|
762
835
|
break if seg.level <= level
|
763
836
|
results << seg
|
@@ -805,8 +878,11 @@ module EDI
|
|
805
878
|
|
806
879
|
def initialize( p, name, status, fmt )
|
807
880
|
@parent, @root, @name, @format, @status = p, p.root, name, fmt, status
|
808
|
-
|
809
|
-
|
881
|
+
if fmt.nil? || status.nil?
|
882
|
+
location = "DE #{parent.name}/#{@name}"
|
883
|
+
raise "#{location}: 'nil' is not an allowed format." if fmt.nil?
|
884
|
+
raise "#{location}: 'nil' is not an allowed status." if status.nil?
|
885
|
+
end
|
810
886
|
@value = nil
|
811
887
|
end
|
812
888
|
|
@@ -816,6 +892,7 @@ module EDI
|
|
816
892
|
return str if str.is_a? String
|
817
893
|
str = str.to_s; len = str.length
|
818
894
|
return str unless format =~ /n(\d+)/ && len != (fixlen=$1.to_i)
|
895
|
+
location = "DE #{parent.name}/#{@name}"
|
819
896
|
raise "#{location}: Too long (#{l}) for fmt #{format}" if len > fixlen
|
820
897
|
'0' * (fixlen - len) + str
|
821
898
|
end
|
@@ -835,11 +912,11 @@ module EDI
|
|
835
912
|
# - character set limitations violated?
|
836
913
|
# - various format restrictions violated?
|
837
914
|
|
838
|
-
def validate( err_count=0 )
|
915
|
+
def validate( err_count=0, fmt=@format )
|
839
916
|
location = "DE #{parent.name}/#{@name}"
|
840
917
|
if empty?
|
841
918
|
if required?
|
842
|
-
warn "#{location}: Empty though mandatory!"
|
919
|
+
EDI::logger.warn "#{location}: Empty though mandatory!"
|
843
920
|
err_count += 1
|
844
921
|
end
|
845
922
|
else
|
@@ -847,13 +924,13 @@ module EDI
|
|
847
924
|
# Charset check
|
848
925
|
#
|
849
926
|
if (pos = (value =~ root.illegal_charset_pattern))# != nil
|
850
|
-
warn "#{location}: Illegal character: #{value[pos].chr}"
|
927
|
+
EDI::logger.warn "#{location}: Illegal character: #{value[pos].chr} (#{value[pos]})"
|
851
928
|
err_count += 1
|
852
929
|
end
|
853
930
|
#
|
854
931
|
# Format check, raise error if not consistent!
|
855
932
|
#
|
856
|
-
if
|
933
|
+
if fmt =~ /^(a|n|an)(..)?(\d+)$/
|
857
934
|
_a_n_an, _upto, _size = $1, $2, $3
|
858
935
|
case _a_n_an
|
859
936
|
|
@@ -862,8 +939,8 @@ module EDI
|
|
862
939
|
re = Regexp.new('^(-)?(\d+)([.,]\d+)?$')
|
863
940
|
md = re.match strval
|
864
941
|
if md.nil?
|
865
|
-
raise "#{location}: '#{strval}' - not matching format
|
866
|
-
# warn "#{strval} - not matching format
|
942
|
+
raise "#{location}: '#{strval}' - not matching format #{fmt}"
|
943
|
+
# warn "#{strval} - not matching format #{fmt}"
|
867
944
|
# err_count += 1
|
868
945
|
end
|
869
946
|
|
@@ -873,28 +950,31 @@ module EDI
|
|
873
950
|
# Decimal char does not go into length count:
|
874
951
|
len -= 1 if not md[3].nil?
|
875
952
|
# len -= 1 if (md[1]=='-' and md[3]) || (md[1] != '' and not md[3])
|
876
|
-
|
953
|
+
|
954
|
+
# break if not required? and len == 0
|
955
|
+
if required? or len != 0
|
877
956
|
if len > _size.to_i
|
878
957
|
# if _upto.nil? and len != _size.to_i or len > _size.to_i
|
879
|
-
warn "Context in #{location}: #{_a_n_an}, #{_upto}, #{_size}; #{md[1]}, #{md[2]}, #{md[3]}"
|
880
|
-
warn "Length # mismatch in #{location}: #{len} vs. #{_size}"
|
958
|
+
EDI::logger.warn "Context in #{location}: #{_a_n_an}, #{_upto}, #{_size}; #{md[1]}, #{md[2]}, #{md[3]}"
|
959
|
+
EDI::logger.warn "Length # mismatch in #{location}: #{len} vs. #{_size}"
|
881
960
|
err_count += 1
|
882
961
|
# warn " (strval was: '#{strval}')"
|
883
962
|
end
|
884
963
|
if md[1] =~/^0+/
|
885
|
-
warn "#{strval} contains leading zeroes"
|
964
|
+
EDI::logger.warn "#{strval} contains leading zeroes"
|
886
965
|
err_count += 1
|
887
966
|
end
|
888
967
|
if md[3] and md[3]=~ /.0+$/
|
889
|
-
warn "#{strval} contains trailing decimal sign/zeroes"
|
968
|
+
EDI::logger.warn "#{strval} contains trailing decimal sign/zeroes"
|
890
969
|
err_count += 1
|
891
970
|
end
|
971
|
+
end
|
892
972
|
|
893
973
|
when 'a', 'an'
|
894
974
|
# len = value.is_a?(Numeric) ? value.to_s.length : value.length
|
895
975
|
len = value.to_s.length
|
896
976
|
if _upto.nil? and len != $3.to_i or len > $3.to_i
|
897
|
-
warn "Length mismatch in #{location}: #{len} vs. #{_size}"
|
977
|
+
EDI::logger.warn "Length mismatch in #{location}: #{len} vs. #{_size}"
|
898
978
|
err_count += 1
|
899
979
|
end
|
900
980
|
else
|
@@ -903,7 +983,7 @@ module EDI
|
|
903
983
|
end
|
904
984
|
|
905
985
|
else
|
906
|
-
warn "#{location}: Illegal format: #{
|
986
|
+
EDI::logger.warn "#{location}: Illegal format: #{fmt}!"
|
907
987
|
err_count += 1
|
908
988
|
end
|
909
989
|
end
|