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
         |