edi4r 0.9.4.1 → 0.9.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|