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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/AuthorCopyright +3 -3
  3. data/{ChangeLog → Changelog} +60 -0
  4. data/README +15 -10
  5. data/Tutorial +2 -3
  6. data/VERSION +1 -1
  7. data/bin/edi2xml.rb +12 -16
  8. data/bin/editool.rb +9 -5
  9. data/bin/sedas2eancom02.rb +1385 -0
  10. data/bin/xml2edi.rb +7 -12
  11. data/data/edifact/iso9735/SDCD.20000.csv +1 -0
  12. data/data/edifact/iso9735/SDCD.3for2.csv +1 -0
  13. data/data/edifact/iso9735/SDED.20000.csv +6 -0
  14. data/data/edifact/iso9735/SDED.30000.csv +43 -43
  15. data/data/edifact/iso9735/SDED.3for2.csv +6 -0
  16. data/data/edifact/iso9735/SDED.40000.csv +129 -129
  17. data/data/edifact/iso9735/SDED.40100.csv +130 -130
  18. data/data/edifact/iso9735/SDMD.20000.csv +6 -0
  19. data/data/edifact/iso9735/SDMD.30000.csv +6 -6
  20. data/data/edifact/iso9735/SDMD.3for2.csv +6 -0
  21. data/data/edifact/iso9735/SDMD.40000.csv +17 -17
  22. data/data/edifact/iso9735/SDMD.40100.csv +17 -17
  23. data/data/edifact/iso9735/SDSD.20000.csv +5 -0
  24. data/data/edifact/iso9735/SDSD.3for2.csv +5 -0
  25. data/data/edifact/untdid/EDMD.d01b.csv +1 -1
  26. data/data/sedas/EDCD..csv +0 -0
  27. data/data/sedas/EDED..csv +859 -0
  28. data/data/sedas/EDMD..csv +16 -0
  29. data/data/sedas/EDSD..csv +44 -0
  30. data/lib/edi4r.rb +147 -67
  31. data/lib/edi4r/ansi_x12-rexml.rb +91 -0
  32. data/lib/edi4r/ansi_x12.rb +1684 -0
  33. data/lib/edi4r/diagrams.rb +75 -14
  34. data/lib/edi4r/edifact-rexml.rb +4 -3
  35. data/lib/edi4r/edifact.rb +505 -202
  36. data/lib/edi4r/rexml.rb +13 -7
  37. data/lib/edi4r/sedas.rb +854 -0
  38. data/lib/edi4r/standards.rb +150 -33
  39. data/test/damaged_file.edi +1 -0
  40. data/test/eancom2webedi.rb +1 -0
  41. data/test/groups.edi +1 -1
  42. data/test/test_basics.rb +16 -9
  43. data/test/test_edi_split.rb +30 -0
  44. data/test/test_loopback.rb +7 -2
  45. data/test/test_rexml.rb +34 -2
  46. data/test/test_service_messages.rb +190 -0
  47. data/test/test_streaming.rb +167 -0
  48. data/test/test_tut_examples.rb +3 -1
  49. data/test/webedi2eancom.rb +1 -0
  50. 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
@@ -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 also all contained objects in a recursive manner.
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
- headline << @header.inspect(indent+' ') if @header
238
- s = @a.inject( headline ){|s,obj| s << obj.inspect(indent+' ')}
239
- @trailer ? s << @trailer.inspect(indent+' ') : s
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 =~ /^([acds])(\w+)(=)?/
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, :output_mode, :illegal_charset_pattern
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': Interchange.parse( EDI::Bzip2Reader.new( hnd ) ) # see "peek"
469
- when 'GZ': Interchange.parse( Zlib::GzipReader.new( hnd ) )
470
- when 'E': EDI::E::Interchange.parse( hnd, auto_validate )
471
- when 'I': EDI::I::Interchange.parse( hnd, auto_validate )
472
- when 'XE': EDI::E::Interchange.parse_xml( REXML::Document.new(hnd) )
473
- when 'XI': EDI::I::Interchange.parse_xml( REXML::Document.new(hnd) )
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': Interchange.peek( EDI::Bzip2Reader.new( hnd ) )
493
-
494
- when 'GZ': Interchange.peek( Zlib::GzipReader.new( hnd ) )
495
- when 'E': EDI::E::Interchange.peek( hnd )
496
- when 'I': EDI::I::Interchange.peek( hnd )
497
- when 'XE': EDI::E::Interchange.peek_xml( REXML::Document.new(hnd) )
498
- when 'XI': EDI::I::Interchange.peek_xml( REXML::Document.new(hnd) )
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]/: 'E' # UN/EDIFACT
518
- when /^EDI_DC/: 'I' # SAP IDoc
519
- when re : 'X'+$3 # XML, Doctype = Interchange, syntax standard key (E, I, ...) postfix
520
- when /^\037\213/: 'GZ' # gzip
521
- when /^\037\235/: 'Z' # compress
522
- when /^\037\036/: 'z' # pack
523
- when /^BZh[0-\377]/: 'BZ' # bzip2
524
- else; "?? (stream starts with: #{buf[0..15]})"
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
- raise "#{location}: 'nil' is not an allowed format." if fmt.nil?
809
- raise "#{location}: 'nil' is not an allowed status." if status.nil?
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 @format =~ /^(a|n|an)(..)?(\d+)$/
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 #@format"
866
- # warn "#{strval} - not matching format #@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
- break if not required? and len == 0
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: #{@format}!"
986
+ EDI::logger.warn "#{location}: Illegal format: #{fmt}!"
907
987
  err_count += 1
908
988
  end
909
989
  end