edi4r 0.9.4.1 → 0.9.6.2

Sign up to get free protection for your applications and to get access to all the features.
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