Friday, December 2, 2016

Analisa Sejarah Protokol EDIINT AS2 (RFC 4130)

Hari ini tanggal 2 Desember 2016, soedah seboelan lebih sedikit sedjak saja menjataken pengen menoelis artikel tentang Protokol EDIINT AS2 ataoe S/MIME melaloei HTTP ini, tepatnja tanggal 28 oktober 2016 silam.

kapand-kapand pengen nulis artikel tentang tanda tangan & enkripsi di jersey-client dan dikirim ke php...

Dikirim oleh Dawud Tan pada 28 Oktober 2016

Banyak hal yang membuat penulis tertarik untuk mengupas protokol jaringan ini dengan perangkat "pisau" yang ala kadarnya. Penulis sendiri mengakui pemahaman penulis tentang protokol ini sementara masih belum lengkap, masih perlu cek dan ricek untuk mengkonfirmasi kebenaran dari setiap fakta yang penulis himpun, perlu berinteraksi dengan pihak yang sekiranya penulis ketahui lebih paham dan berpengalaman, salah satunya penulis sudah mengusahakan untuk bertanya langsung dengan Pak Dale Moberg yang membuat protokol RFC 4130 tersebut, A Conversation with Dale Moberg about RFC 4130, serta bertanya kepada Pak Philip Helger yang punya projek github as2-server ini:

Apa menariknya protokol ini? karena protokol ini dipakai oleh domain "web" ini http://as2.amazonsedi.com, http://as2-eu.amazonsedi.com, http://as2-cn.amazonsedi.com, dan http://gem.wal-mart.com:5080 sejak diumumkan oleh CIOnya walmart tanggal 9 september 2002, dimana domain "web" tersebut penulis dapatkan dari sap.com, padahal menurut IETF protokol ini baru disahkan tahun 2005, kok bisa ya?

Pernah diisukan di JIRA-nya Spring dengan kode tiket INT-523 oleh Josh Long, sang mastah Spring Boot, untuk didukung di Spring Integration tapi sebelumnya beliau membahas protokol tersebut pada forum web spring tanggal 13 Desember 2008 berikut ini secure B2B/financial services adapters: SFTP/FTPS/AS2/SSH, penulis juga sudah mencoba menanyakan kabar bagaimana kelanjutan dukungan as2 di isu INT-523 tersebut namun belum ada tanggapan hingga detik ini. Beliau ingin membuat versi open source yang terinspirasi dari Sun ONE Integration Server B2B Edition 3.6.2, yang aslinya bernama ECXpert untuk versi 3.6.1 adalah produk dari Actra Corp, perusahaan gabungan General Electric Information Services dan Netscape pada april 1996, GEIS kini telah menjadi bagian dari GXS, dan GXS kini telah diakuisisi oleh OpenText. Tapi karena ECXpert ditulis dengan bahasa C, tahun 2005 Sun membeli SeeBeyond yang ditulis dari 0 dengan bahasa Java, dalam rangka menyederhanakan produk untuk dukungan AS2-nya. Produk milik SeeBeyond oleh Sun diubah namanya menjadi Java Caps. Menariknya lagi, Java API for XML Messaging (JSR 67) juga mencatut protokol ini (JSR 67: JavaTM APIs for XML Messaging 1.0), sepertinya JAXM merupakan pesaing BizTalk dan juga ingin membunuh EDI & bisnis VAN milik IBM, sama seperti EDIINT AS1 yang diusulkan GEIS & Netscape april 1996 silam, tapi fakta yang ada sekarang, raksasa ritel Walmart dan Amazon memilih EDIINT AS2, bukan ebXML dengan JAXM usulan Sun Microsystem maupun BizTalk Document dengan Biztalk Server usulan Microsoft, lihat blog berikut Microsoft Biztalk telah mendapatkan sertifikat pengakuan kompatible dengan EDIINT AS2  https://blogs.msdn.microsoft.com/biztalkb2b/2006/11/27/drummond-certification-for-as2-processing/,  dan Sun pun juga sudah mendapat sertifikat resmi dari drummond group tahun 2003 silam berikut https://www.drummondgroup.com/b2b-certified-products/certified-products/as2/126-b2b/b2b-products/b2b-certified-products/151-as2-archive-2003.

Selain itu, seperti yang dikabarkan Pak Daniel Tumiwa, Ketua Umum Asosiasi E-commerce Indonesia (idEA) kepada KONTAN, Kamis 16 Juni 2016, Amazon bersiap mengguncang e-commerce tanah air, penulis jadi pengen untuk mengupas bagaimana cara Amazon mendapat pasokan barang dagangannya, sejauh penulis menggali ada dua sistem, satu Seller Central dan satunya Vendor Central, menurut deskripsi singkat yang ada, Seller Central diperuntukkan untuk pemasok yang menjual barangnya sendiri artinya barang tidak dimiliki oleh amazon, sedangkan Vendor Central untuk pemasok yang menjual barang ke amazon, artinya amazon membeli barang penjual dan membayar ketika jatuh tempo dengan segala aturan akuntansi persediaan, hho, perlu ditanyaken lagi kepada yang pinter akuntansi, nah bagian Vendor Central ini yang melibatkan protokol EDIINT AS2 (RFC 4130) ini menurut Seller Cloud berikut Sell on Amazon Vendor Central, dan perangkat lunak beken yang sudah mendukung EDIINT AS2 antara lain SAP B2B Add-On, Microsoft Biztalk Server, tapi kalau artikel penulis ini cuman sekedar bisa mengupas kulitnya saja mungkin, heuheu, kalau buatan Indonesia sendiri mungkin punya PT. EDI Indonesia ini, eXtreme eXchange (x2), dan hasil kepo di google, perusahaan integrator sistem di Indonesia yang melayani sap, ibm apa microsoft antara lain Teknocal, Quadra Solution, Metrasys, dan CIC Integration

Bagi yang pengen ngoprek seperti apa wujud protokol AS2 silahkan di github saya https://github.com/dawud-tan/SpongyCastleSmimeTestApp dan juga ini https://github.com/dawud-tan/Slim-smime-skeleton, projeknya ada dua, satunya android untuk mengirim pesan as2, satunya slim php framework untuk nerima pesan as2 dari android, memakai protokol as2 di android tentu saja lemot tapi cuman sekedar ingin berbagi, lha itu protokol membuat waktu respon jadi lama, udah keburu ditinggal pelanggan anda, gak jadi repeat order deh.

Tampilan Aplikasi


Anda dapat mencoba aplikasinya dengan langsung mengunduh dari tautan Google Play berikut
Temukan di Google Play
Temukan di Google Play

Oya sekedar info tambahan, saya menemukan pustaka SpongyCastle ketika melihat laman appbrain berikut milik Amazon Shopping berikut Amazon Shopping - Android app on AppBrain

  1. Channel9.msdn.com. (2007). Tony Bernard on BizTalk. [online] Available at: https://channel9.msdn.com/Blogs/Rory/Tony-Bernard-on-BizTalk [Accessed 2 Dec. 2016].
  2. Michelle, "Supply chain management practices in Wal mart and Ikea", S.E., UNIVERSITAS INDONESIA, 2014.

Wednesday, October 5, 2016

RESTful EDIFACT dengan Spring Boot Web Reactive dan PHP cURL

pembaharuan: pertanyaan saya mengenai apakah AS2 dan SOAP Web Service fungsinya sama? terjawab dengan hasil surel dari Pak Dale Moberg penemu protokol AS2 RFC 4130 berikut: A Conversation with Dale Moberg about RFC 4130.
Hm.. kata pertama itu susah, tapi kali ini sedang ingin berkenalan dengan sintaks PDE (Pertukaran Data Elektronik) standar PBB untuk bertukar Purchase Order, Invoice, atau dokumen komersil lainnya, sudah lama sih standarnya, sudah sejak 1987, bagi yang belum pernah mendengar keberadaan EDIFACT yuk mampir ke tulisanku Pengantar Pertukaran Data Elektronik, tapi saya sendiri baru mendengar EDIFACT itu entah sekitar bulan agustus 2016 ini je, jadi kalau ada ketidak akurasian dengan isi tulisan mohon maaf yak..
yah, sudah 1987 kok masih dibahas, bukannya sudah jadul itu, pasti sudah ditinggalkan ya? iyah ditinggalkan oleh bisnis yang bermodal kecil, sebut saja Walmart [[5]http://lib.ui.ac.id/detail?id=20369097] yang harga pokok penjualannya 4800 triliun rupiah, berapa kali APBNnya Indonesia ya? terus Amazon (http://s.id/a6y, http://s.id/a6z) yang juga hampir mendekati 1000 triliun rupiah harga pokok penjualannya [marketwatch.com, 19 agustus 2016], Carrefour, Tesco, Target, Kmart, Sears, Metro dan silahkan cari sendiri dah..
Saya jadi tertarik ngoprek EDIFACT karena susah mencari penjelasan protokol AS2/RFC 4130 yang mudah dicerna, lha perangkat lunak AS2 yang bersumber terbuka saja bisa dihitung dengan jari keberadaanya, lha penemu AS2 sendiri yaitu Pak Rik Drummond nggak suka open saus http://s.id/9FL, lha gegara projek Oliot EPCIS (http://s.id/9Sw) punya mahasiswa PhD ilmu komputer kaist.ac.kr, Pak Jaewook Byun itu juga memberi pilihan opsional untuk mendukung AS2 atau tidak di pdf yang jadi acuan standarnya tapi beliau lebih pilih SOAP (JaewookByun commented on 16 Jul), ya makanya apa memang fungsinya sama kok dijadikan alternatif? lha sebelumnya ketika ingin mencoba membuat esai Kontribusiku Bagi Indonesia untuk mengikuti beasiswa LPDP (gagal maning son :'() malah menemukan komentarnya CEO Xterprise, Dean Frew berikut:
EPCIS was made up at MIT (Tesisnya James Luke Waldrop di http://s.id/9FU) with people that did not have a clue as to what systems customers already have and how they are not wanting to go on a wholesale enterprise system refresh.


Nah usut punya usut, semua menyusut pada pidatonya Bill Gates di tanggal 4 Maret 1999 inih http://s.id/9FM, dan mak kluthik biasanya kalau ada rilis fitur baru, kan kompetitor membuat tanggapan, dan sila cek tanggappannya IBM sehari setelah Microsoft mengumumlam kerja sama dengan SAP, MasterCard dan kawan-kawannya dalam membuat dokumen BizTalk. Mbuh, sampai hari ini saya tidak mengerti bagaimana politik dalam berbisnis itu, saya tidak paham, tapi tanggapan pihak IBM itu sebagai berikut:
Developing e-commerce systems is a services business that involves "Connecting computers from wide range of vendors" and making them robust enough to handle huge volumes of business. "these are not historical strength of Microsoft,"

Oke jadi, karena Bill Gates dan James Waldrop itu sama saja dikatakan "kemeruh" oleh yang merasa "pemain lama" diatas, saya juga pengen meneladani mereka, James Waldrop dan Bill Gates, boleh dong, #eeh  #eaa
Nyak oke, karena AS2 itu juga protokol http, saya mencoba bermain sembrono dengan memakai protokol http biasa toh juga nggak ada yang bakalan memakainya kan, saya mah apa atuh, bukan mahasiswa MIT apalagi CEO Microsoft gituh.
Oke ditulisan ini saya ingin mengirim Purchase Order kepada sistem ERP milik manufaktur yang diimplementasikan dengan framework Spring Boot, dan akan dipanggil dengan bahasa PHP yang seolah olah sebagai sistem milik ritel dengan dokumen Purchase Order yang saya ambil contoh dari sini Carrefour Moscow EDIFACT D01B Purchase Order GuideLine.
Berikut daftar dependensi gradle-nya, beruntung di java ada pustaka sumber terbuka Smooks
//berkas build.gradle
dependencies {
   compile 'org.milyn:milyn-smooks-edi:1.4'
   compile 'org.milyn.edi.unedifact:d01b-binding:1.4'
   compile 'io.projectreactor.ipc:reactor-netty:0.5.1.RELEASE'
   compile('org.springframework.boot.experimental:spring-boot-starter-web-reactive'){
       exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
   }
}
Sedangkan berikut merupakan kelas yang berisi anotasi @SpringBootApplication.
//berkas Application.java
package id.co.blogspot.datacomlink;

... //import dihilangkan supaya singkat

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
Disini saya membuat kelas EDIFACTDecoder yang mengimplementasikan kontrak antarmuka org.springframework.core.codec.Decoder<T> supaya fungsi yang memiliki predikat dengan request path /9999US_AS2_20150715190948 dengan tipe konten EDIFACT milik kelas JAXMServlet tinggal menerima amplop yang berwujud org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41, dan karena unmarshalling atau deserializing atau disassemble itu bukan tanggung jawabnya salah satu metode milik kelas JAXMServlet gituh.., ngomong-ngomong sebagai bahan pencarian di mbah Google, kelas org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41 itu tanggung jawabnya kok mirip yah dengan kelas com.sun.xml.messaging.ebxml.EbXMLMessageImpl, tannya kenapa?
//berkas EDIFACTDecoder.java
package org.springframework.http.codec.edifact;

... //import yang lain dihilangkan
import org.milyn.edi.unedifact.d01b.D01BInterchangeFactory;
...

public class EDIFACTDecoder implements Decoder<Object> {

    private D01BInterchangeFactory factory;

    public EDIFACTDecoder() {
        try {
            this.factory = D01BInterchangeFactory.getInstance();
        } catch (IOException | SAXException ex) {
        }
    }

    @Override
    public List<MimeType> getDecodableMimeTypes() {
        return Arrays.asList(new MimeType("application", "EDIFACT"));
    }

    @Override
    public boolean canDecode(ResolvableType elementType, MimeType mimeType) {
        return true;
    }

    @Override
    public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType,
            MimeType mimeType, Map<String, Object> hints) {
        throw new UnsupportedOperationException("Not supported yet");
    }

    @Override
    public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType,
            MimeType mimeType, Map<String, Object> hints) {
        return Mono.from(inputStream).map(dataBuffer -> {
            try {
                return factory.fromUNEdifact(dataBuffer.asInputStream());
            } catch (IOException ex) {
                return Mono.error(new CodecException("Error while reading the data", ex));
            } finally {
                DataBufferUtils.release(dataBuffer);
            }
        });
    }
}
Agar kelas EDIFACTDecoder yang baru saja dibuat bisa digunakan Spring untuk negosiasi konten, kelas tersebut perlu didaftarkan dengan membuat konfigurasi spring berbasis anotasi yang mewarisi kelas org.springframework.web.reactive.config.WebReactiveConfiguration
package id.co.blogspot.datacomlink;

... //import yang lain dihilangkan supaya singkat
import org.springframework.http.codec.edifact.EDIFACTDecoder;

@Configuration
public class WebConfig extends WebReactiveConfiguration {

    @Override
    protected void extendMessageReaders(List<HttpMessageReader<?>> messageReaders) {
        messageReaders.add(new DecoderHttpMessageReader<>(new EDIFACTDecoder()));
    }
}
Berikut ini merupakan kelas JAXMServlet yang ditandai dengan anotasi @RestController, seluruh permintaan HTTP dengan Request URI /9999US_AS2_20150715190948 akan ditangani oleh kelas JAXMServlet berikut. Request URI umumnya merupakan kesepakatan antara mitra dagang dan dipertukarkan di luar jaringan. Kelas ini hanya memanfaatkan satu metode HTTP POST saja, serta berdasarkan [1][2][3][4], untuk operasi asinkron cocoknya kode status HTTP yang digunakan adalah 202 atau Accepted, umumnya untuk RESTful Web Services menggunakan semua verb yang ada di HTTP, jadi bila merujuk Richardson Maturity Model, solusi yang saya paparkan masih level 0[4].
//berkas JAXMServlet.java
package id.co.blogspot.datacomlink;

import org.milyn.edi.unedifact.d01b.ORDERS.Orders;
import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41;
... //import yang lain dihilangkan supaya singkat

@RestController
public class JAXMServlet {//implements javax.xml.messaging.OnewayListener

    @ResponseStatus(HttpStatus.ACCEPTED)
    @PostMapping(value = "/9999US_AS2_20150715190948")
    public void onMessageReceived(@RequestBody Mono<UNEdifactInterchange41> request) {
        request.subscribeOn(Schedulers.single())
                .subscribe(amplop -> {
                    amplop.getMessages().stream().forEach(surat -> {
                        // Membaca surat...
                        System.out.println("\tNama topik: " + surat.getMessageHeader().getMessageIdentifier().getId());
                        Orders pesananPembelian = (Orders) surat.getMessage();
                        System.out.println("\tNama mitra " + pesananPembelian.getSegmentGroup2().get(0).getNameAndAddress().getPartyName().getPartyName1());
                        System.out.println("\tJumlah SKU " + pesananPembelian.getSegmentGroup28().size());
                        System.out.println("\tDeskripsi SKU " + pesananPembelian.getSegmentGroup28().get(0).getItemDescription().get(0).getItemDescription().getItemDescription1());
                        System.out.println("\tJumlah " + pesananPembelian.getSegmentGroup28().get(0).getQuantity().get(0).getQuantityDetails().getQuantity());
                    });
                });
    }
}
Dalam mencari pustaka php yang sudah matang untuk mengolah surat EDIFACT itu susahnya minta ampun, saya sendiri baru menemukan ini saja, jadinya ya saya hanya memakai String mentahan gituh ajah:
$ composer require sabas/edifact
$ composer require metroplex-systems/edifact
Berikut di bawah ini adalah kode untuk Client RESTful-nya:
//berkas jangan.php, iyah jangan diphpin yah >.<
<?php

$waktu_awal = microtime(true);
//http://webcache.googleusercontent.com/search?q=cache:4Kewrm27y9gJ:www.carrefour.net/tableau/pdf_migs/ORDERS_D01B_APEX_SUP_V13F.pdf+&cd=2&hl=jv&ct=clnk&client=firefox-b
$amplop = "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'";

//kirimkan amplop ini ke endpoint /9999US_AS2_20150715190948 milik pemasok kita
$ch = curl_init('http://localhost:8080/9999US_AS2_20150715190948');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $amplop);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/EDIFACT', //https://tools.ietf.org/html/rfc1767
    'Content-Length: '.strlen($amplop), )
);
curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
http_response_code($info['http_code']);
$waktu_akhir = microtime(true);
$jeda = $waktu_akhir - $waktu_awal;
if ($info['http_code'] == 200) {
    echo 'Kode Status: '.$info['http_code'].' Artinya Lamaranmu sedang dipertimbangkan, eh, Amplopmu diterima untuk diproses tapi belum komplit :v. Lamaranmu eh permintaan httpmu ditanggapi dalam waktu: '.$jeda.' mikro detik, cepet amat nyak nanggepi lamarannya, eh permintaan httpnya, yah lebih mending dari pada diphpin, eh.. :v';
}

Kalau skrip php di atas dipanggil dari peramban kesukaan anda, maka akan seketika menampilkan pesan berapa lama lamaranmu dijawab :v, karena ketika amplop EDIFACT terkirim saat fungsi curl_exec() tereksekusi, proses pengolahannya entah Purchase Order ataupun Invoice bisa berlangsung cepat karena metode onMessageReceived() di sisi server telah ditandai dengan penanda (annotation di dunia java, attribute di dunia .NET) @Async, penanda yang berfungsi untuk membuang kontrol eksekusi ke thread lain, berikut ini merupakan tampilan pesan-pesannya di peramban rubah api Netscape, eh Mozilla Firefox:
pesan jeda waktu pengolahan
Berikut merupakan hasil eksekusi program server-nya:
Sedangkan berikut ini merupakan contoh permintaan HTTP POST, menggunakan program curl

$ curl -i -X POST -H "Content-Type: application/EDIFACT" -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" http://localhost:8080/9999US_AS2_20150715190948
HTTP/1.1 200 OK
transfer-encoding: chunked
  • -i memastikan anda bisa melihat pesan tanggapan termasuk header HTTP.
  • -X POST metode POST digunakan untuk mengirim surat EDIFACT
  • -H "Content-Type: application/EDIFACT" mengatur content type sehingga aplikasi mengerti tubuh permintaan HTTP berisi surat EDIFACT
  • -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" adalah data yang akan dikirim
Kode Sumber

  1. Anda bisa mengunduh dan unzip repository untuk artikel ini, atau klon menggunakan Git: git clone https://github.com/dawud-tan/spring-boot-web-reactive.git
  2. cd ke dalam direktori spring-boot-web-reactive/
  3. langsung jalankan program dengan perintah $ gradlew bootRun

Daftar Pustaka:


  1. S. Allamaraju, "Using the Uniform Interface," in RESTful Web services cookbook, 1st ed. Sebastopol, CA: O'Reilly, 2010, ch. 1, sec. 10, pp. 19-22.
  2. G. Jansen, "Methods", Thoughts on RESTful API Design, 2012. [Online]. Available: http://restful-api-design.readthedocs.io/en/latest/methods.html#asynchronous-requests. [Accessed: 06- Sep- 2016].
  3. L. Richardson and S. Ruby, "REST and ROA Best Practices," in RESTful web services, 1st ed. Sebastopol, CA: O'Reilly, 2007, ch. 8, sec. 8, pp. 228-230.
  4. J. Thijssen, "Asynchronous operations - The RESTful cookbook", - The RESTful cookbook, 2012. [Online]. Available: http://restcookbook.com/Resources/asynchroneous-operations/. [Accessed: 06- Sep- 2016].
  5. Michelle, "Supply chain management practices in Wal mart and Ikea", S.E., UNIVERSITAS INDONESIA, 2014.


Tuesday, October 4, 2016

RESTful EDIFACT dengan Spring Functional Web Framework dan PHP cURL

pembaharuan: pertanyaan saya mengenai apakah AS2 dan SOAP Web Service fungsinya sama? terjawab dengan hasil surel dari Pak Dale Moberg penemu protokol AS2 RFC 4130 berikut: A Conversation with Dale Moberg about RFC 4130.
Hm.. kata pertama itu susah, tapi kali ini sedang ingin berkenalan dengan sintaks PDE (Pertukaran Data Elektronik) standar PBB untuk bertukar Purchase Order, Invoice, atau dokumen komersil lainnya, sudah lama sih standarnya, sudah sejak 1987, bagi yang belum pernah mendengar keberadaan EDIFACT yuk mampir ke tulisanku Pengantar Pertukaran Data Elektronik, tapi saya sendiri baru mendengar EDIFACT itu entah sekitar bulan agustus 2016 ini je, jadi kalau ada ketidak akurasian dengan isi tulisan mohon maaf yak..
yah, sudah 1987 kok masih dibahas, bukannya sudah jadul itu, pasti sudah ditinggalkan ya? iyah ditinggalkan oleh bisnis yang bermodal kecil, sebut saja Walmart [[5]http://lib.ui.ac.id/detail?id=20369097] yang harga pokok penjualannya 4800 triliun rupiah, berapa kali APBNnya Indonesia ya? terus Amazon (http://s.id/a6y, http://s.id/a6z) yang juga hampir mendekati 1000 triliun rupiah harga pokok penjualannya [marketwatch.com, 19 agustus 2016], Carrefour, Tesco, Target, Kmart, Sears, Metro dan silahkan cari sendiri dah..
Saya jadi tertarik ngoprek EDIFACT karena susah mencari penjelasan protokol AS2/RFC 4130 yang mudah dicerna, lha perangkat lunak AS2 yang bersumber terbuka saja bisa dihitung dengan jari keberadaanya, lha penemu AS2 sendiri yaitu Pak Rik Drummond nggak suka open saus http://s.id/9FL, lha gegara projek Oliot EPCIS (http://s.id/9Sw) punya mahasiswa PhD ilmu komputer kaist.ac.kr, Pak Jaewook Byun itu juga memberi pilihan opsional untuk mendukung AS2 atau tidak di pdf yang jadi acuan standarnya tapi beliau lebih pilih SOAP (JaewookByun commented on 16 Jul), ya makanya apa memang fungsinya sama kok dijadikan alternatif? lha sebelumnya ketika ingin mencoba membuat esai Kontribusiku Bagi Indonesia untuk mengikuti beasiswa LPDP (gagal maning son :'() malah menemukan komentarnya CEO Xterprise, Dean Frew berikut:
EPCIS was made up at MIT (Tesisnya James Luke Waldrop di http://s.id/9FU) with people that did not have a clue as to what systems customers already have and how they are not wanting to go on a wholesale enterprise system refresh.


Nah usut punya usut, semua menyusut pada pidatonya Bill Gates di tanggal 4 Maret 1999 inih http://s.id/9FM, dan mak kluthik biasanya kalau ada rilis fitur baru, kan kompetitor membuat tanggapan, dan sila cek tanggappannya IBM sehari setelah Microsoft mengumumlam kerja sama dengan SAP, MasterCard dan kawan-kawannya dalam membuat dokumen BizTalk. Mbuh, sampai hari ini saya tidak mengerti bagaimana politik dalam berbisnis itu, saya tidak paham, tapi tanggapan pihak IBM itu sebagai berikut:
Developing e-commerce systems is a services business that involves "Connecting computers from wide range of vendors" and making them robust enough to handle huge volumes of business. "these are not historical strength of Microsoft,"

Oke jadi, karena Bill Gates dan James Waldrop itu sama saja dikatakan "kemeruh" oleh yang merasa "pemain lama" diatas, saya juga pengen meneladani mereka, James Waldrop dan Bill Gates, boleh dong, #eeh  #eaa
Nyak oke, karena AS2 itu juga protokol http, saya mencoba bermain sembrono dengan memakai protokol http biasa toh juga nggak ada yang bakalan memakainya kan, saya mah apa atuh, bukan mahasiswa MIT apalagi CEO Microsoft gituh.
Oke ditulisan ini saya ingin mengirim Purchase Order kepada sistem ERP milik manufaktur yang diimplementasikan dengan framework Spring Boot, dan akan dipanggil dengan bahasa PHP yang seolah olah sebagai sistem milik ritel dengan dokumen Purchase Order yang saya ambil contoh dari sini Carrefour Moscow EDIFACT D01B Purchase Order GuideLine.
Berikut daftar dependensi gradle-nya, beruntung di java ada pustaka sumber terbuka Smooks
//berkas build.gradle
dependencies {
   compile 'io.projectreactor:reactor-core:3.0.2.RELEASE'
   compile 'io.projectreactor.ipc:reactor-netty:0.5.1.RELEASE'
   compile 'org.milyn:milyn-smooks-edi:1.4'
   compile 'org.milyn.edi.unedifact:d01b-binding:1.4'
   compile 'org.reactivestreams:reactive-streams:1.0.0'
   compile 'org.springframework:spring-web-reactive:5.0.0.M2'
}
Disini saya membuat kelas EDIFACTDecoder yang mengimplementasikan kontrak antarmuka org.springframework.core.codec.Decoder<T> supaya fungsi yang memiliki predikat dengan request path /9999US_AS2_20150715190948 dengan tipe konten EDIFACT milik kelas JAXMServlet tinggal menerima amplop yang berwujud org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41, dan karena unmarshalling atau deserializing atau disassemble itu bukan tanggung jawabnya salah satu metode milik kelas JAXMServlet gituh.., ngomong-ngomong sebagai bahan pencarian di mbah Google, kelas org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41 itu tanggung jawabnya kok mirip yah dengan kelas com.sun.xml.messaging.ebxml.EbXMLMessageImpl, tannya kenapa?
//berkas EDIFACTDecoder.java
package org.springframework.http.codec.edifact;

... //import yang lain dihilangkan
import org.milyn.edi.unedifact.d01b.D01BInterchangeFactory;
...

public class EDIFACTDecoder implements Decoder<Object> {

    private D01BInterchangeFactory factory;

    public EDIFACTDecoder() {
        try {
            this.factory = D01BInterchangeFactory.getInstance();
        } catch (IOException | SAXException ex) {
        }
    }

    @Override
    public List<MimeType> getDecodableMimeTypes() {
        return Arrays.asList(new MimeType("application", "EDIFACT"));
    }

    @Override
    public boolean canDecode(ResolvableType elementType, MimeType mimeType) {
        return true;
    }

    @Override
    public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType,
            MimeType mimeType, Map<String, Object> hints) {
        throw new UnsupportedOperationException("Not supported yet");
    }

    @Override
    public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType,
            MimeType mimeType, Map<String, Object> hints) {
        return Mono.from(inputStream).map(dataBuffer -> {
            try {
                return factory.fromUNEdifact(dataBuffer.asInputStream());
            } catch (IOException ex) {
                return Mono.error(new CodecException("Error while reading the data", ex));
            } finally {
                DataBufferUtils.release(dataBuffer);
            }
        });
    }
}
Agar kelas EDIFACTDecoder yang baru saja dibuat bisa digunakan Spring untuk negosiasi konten, kelas tersebut perlu didaftarkan dengan memanggil metode messageReader() milik kelas org.springframework.web.reactive.function.DefaultStrategiesSupplierBuilder
//berkas ExtendedStrategiesSupplierBuilder.java
package org.springframework.web.reactive.function;

import org.springframework.http.codec.DecoderHttpMessageReader;
import org.springframework.http.codec.edifact.EDIFACTDecoder;

public class ExtendedStrategiesSupplierBuilder {

    public StrategiesSupplier build() {
        DefaultStrategiesSupplierBuilder builder = new DefaultStrategiesSupplierBuilder();
        builder.defaultConfiguration();
        builder.messageReader(new DecoderHttpMessageReader<>(new EDIFACTDecoder()));
        return builder.build();
    }
}
Berikut ini merupakan kelas JAXMServlet yang ditandai dengan anotasi @RestController, seluruh permintaan HTTP dengan Request URI /9999US_AS2_20150715190948 akan ditangani oleh kelas JAXMServlet berikut. Request URI umumnya merupakan kesepakatan antara mitra dagang dan dipertukarkan di luar jaringan. Kelas ini hanya memanfaatkan satu metode HTTP POST saja, serta berdasarkan [1][2][3][4], untuk operasi asinkron cocoknya kode status HTTP yang digunakan adalah 202 atau Accepted, umumnya untuk RESTful Web Services menggunakan semua verb yang ada di HTTP, jadi bila merujuk Richardson Maturity Model, solusi yang saya paparkan masih level 0[4].
//berkas JAXMServlet.java
package id.co.blogspot.datacomlink;

import org.milyn.edi.unedifact.d01b.ORDERS.Orders;
import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41;
... //import yang lain dihilangkan supaya singkat

public class JAXMServlet {//implements javax.xml.messaging.OnewayListener

    public static void main(String[] args) throws Exception {
        RouterFunction<?> route = route(POST("/9999US_AS2_20150715190948").and(contentType(new MediaType("application", "EDIFACT"))),
                request -> {
                    request.body(toMono(UNEdifactInterchange41.class))
                            .subscribeOn(Schedulers.single())
                            .subscribe(amplop -> {
                                amplop.getMessages().stream().forEach(surat -> {
                                    // Membaca surat...
                                    System.out.println("\tNama topik: " + surat.getMessageHeader().getMessageIdentifier().getId());
                                    Orders pesananPembelian = (Orders) surat.getMessage();
                                    System.out.println("\tNama mitra " + pesananPembelian.getSegmentGroup2().get(0).getNameAndAddress().getPartyName().getPartyName1());
                                    System.out.println("\tJumlah SKU " + pesananPembelian.getSegmentGroup28().size());
                                    System.out.println("\tDeskripsi SKU " + pesananPembelian.getSegmentGroup28().get(0).getItemDescription().get(0).getItemDescription().getItemDescription1());
                                    System.out.println("\tJumlah " + pesananPembelian.getSegmentGroup28().get(0).getQuantity().get(0).getQuantityDetails().getQuantity());
                                });
                            });
                    return Response.accepted().build();
                }
        );
        ExtendedStrategiesSupplierBuilder builder = new ExtendedStrategiesSupplierBuilder();
        HttpServer.create("127.0.0.1", 5080)
                .startAndAwait(new ReactorHttpHandlerAdapter(toHttpHandler(route, builder.build())));
        System.in.read();
    }
}
Dalam mencari pustaka php yang sudah matang untuk mengolah surat EDIFACT itu susahnya minta ampun, saya sendiri baru menemukan ini saja, jadinya ya saya hanya memakai String mentahan gituh ajah:
$ composer require sabas/edifact
$ composer require metroplex-systems/edifact
Berikut di bawah ini adalah kode untuk Client RESTful-nya:
//berkas jangan.php, iyah jangan diphpin yah >.<
<?php

$waktu_awal = microtime(true);
//http://webcache.googleusercontent.com/search?q=cache:4Kewrm27y9gJ:www.carrefour.net/tableau/pdf_migs/ORDERS_D01B_APEX_SUP_V13F.pdf+&cd=2&hl=jv&ct=clnk&client=firefox-b
$amplop = "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'";

//kirimkan amplop ini ke endpoint /9999US_AS2_20150715190948 milik pemasok kita
$ch = curl_init('http://localhost:5080/9999US_AS2_20150715190948');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $amplop);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/EDIFACT', //https://tools.ietf.org/html/rfc1767
    'Content-Length: '.strlen($amplop), )
);
curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
http_response_code($info['http_code']);
$waktu_akhir = microtime(true);
$jeda = $waktu_akhir - $waktu_awal;
if ($info['http_code'] == 202) {
    echo 'Kode Status: '.$info['http_code'].' Artinya Lamaranmu sedang dipertimbangkan, eh, Amplopmu diterima untuk diproses tapi belum komplit :v. Lamaranmu eh permintaan httpmu ditanggapi dalam waktu: '.$jeda.' mikro detik, cepet amat nyak nanggepi lamarannya, eh permintaan httpnya, yah lebih mending dari pada diphpin, eh.. :v';
}

Kalau skrip php di atas dipanggil dari peramban kesukaan anda, maka akan seketika menampilkan pesan berapa lama lamaranmu dijawab :v, karena ketika amplop EDIFACT terkirim saat fungsi curl_exec() tereksekusi, proses pengolahannya entah Purchase Order ataupun Invoice bisa berlangsung cepat karena metode onMessageReceived() di sisi server telah ditandai dengan penanda (annotation di dunia java, attribute di dunia .NET) @Async, penanda yang berfungsi untuk membuang kontrol eksekusi ke thread lain, berikut ini merupakan tampilan pesan-pesannya di peramban rubah api Netscape, eh Mozilla Firefox:
pesan jeda waktu pengolahan
Berikut merupakan hasil eksekusi program server-nya:
Sedangkan berikut ini merupakan contoh permintaan HTTP POST, menggunakan program curl

$ curl -i -X POST -H "Content-Type: application/EDIFACT" -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" http://localhost:5080/9999US_AS2_20150715190948
HTTP/1.1 202
transfer-encoding: chunked
  • -i memastikan anda bisa melihat pesan tanggapan termasuk header HTTP.
  • -X POST metode POST digunakan untuk mengirim surat EDIFACT
  • -H "Content-Type: application/EDIFACT" mengatur content type sehingga aplikasi mengerti tubuh permintaan HTTP berisi surat EDIFACT
  • -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" adalah data yang akan dikirim
Kode Sumber

  1. Anda bisa mengunduh dan unzip repository untuk artikel ini, atau klon menggunakan Git: git clone https://github.com/dawud-tan/web-function-sample.git
  2. cd ke dalam direktori web-function-sample/
  3. langsung jalankan program dengan perintah $ gradlew run

Daftar Pustaka:


  1. S. Allamaraju, "Using the Uniform Interface," in RESTful Web services cookbook, 1st ed. Sebastopol, CA: O'Reilly, 2010, ch. 1, sec. 10, pp. 19-22.
  2. G. Jansen, "Methods", Thoughts on RESTful API Design, 2012. [Online]. Available: http://restful-api-design.readthedocs.io/en/latest/methods.html#asynchronous-requests. [Accessed: 06- Sep- 2016].
  3. L. Richardson and S. Ruby, "REST and ROA Best Practices," in RESTful web services, 1st ed. Sebastopol, CA: O'Reilly, 2007, ch. 8, sec. 8, pp. 228-230.
  4. J. Thijssen, "Asynchronous operations - The RESTful cookbook", - The RESTful cookbook, 2012. [Online]. Available: http://restcookbook.com/Resources/asynchroneous-operations/. [Accessed: 06- Sep- 2016].
  5. Michelle, "Supply chain management practices in Wal mart and Ikea", S.E., UNIVERSITAS INDONESIA, 2014.


Friday, September 30, 2016

RESTful EDIFACT dengan Vert.x dan PHP cURL

pembaharuan: pertanyaan saya mengenai apakah AS2 dan SOAP Web Service fungsinya sama? terjawab dengan hasil surel dari Pak Dale Moberg penemu protokol AS2 RFC 4130 berikut: A Conversation with Dale Moberg about RFC 4130.
Hm.. kata pertama itu susah, tapi kali ini sedang ingin berkenalan dengan sintaks PDE (Pertukaran Data Elektronik) standar PBB untuk bertukar Purchase Order, Invoice, atau dokumen komersil lainnya, sudah lama sih standarnya, sudah sejak 1987, bagi yang belum pernah mendengar keberadaan EDIFACT yuk mampir ke tulisanku Pengantar Pertukaran Data Elektronik, tapi saya sendiri baru mendengar EDIFACT itu entah sekitar bulan agustus 2016 ini je, jadi kalau ada ketidak akurasian dengan isi tulisan mohon maaf yak..
yah, sudah 1987 kok masih dibahas, bukannya sudah jadul itu, pasti sudah ditinggalkan ya? iyah ditinggalkan oleh bisnis yang bermodal kecil, sebut saja Walmart [http://lib.ui.ac.id/detail?id=20369097] yang harga pokok penjualannya 4800 triliun rupiah, berapa kali APBNnya Indonesia ya? terus Amazon (http://s.id/a6y, http://s.id/a6z) yang juga hampir mendekati 1000 triliun rupiah harga pokok penjualannya [marketwatch.com, 19 agustus 2016], Carrefour, Tesco, Target, Kmart, Sears, Metro dan silahkan cari sendiri dah..
Saya jadi tertarik ngoprek EDIFACT karena susah mencari penjelasan protokol AS2/RFC 4130 yang mudah dicerna, lha perangkat lunak AS2 yang bersumber terbuka saja bisa dihitung dengan jari keberadaanya, lha penemu AS2 sendiri yaitu Pak Rik Drummond nggak suka open saus http://s.id/9FL, lha gegara projek Oliot EPCIS (http://s.id/9Sw) punya mahasiswa PhD ilmu komputer kaist.ac.kr, Pak Jaewook Byun itu juga memberi pilihan opsional untuk mendukung AS2 atau tidak di pdf yang jadi acuan standarnya tapi beliau lebih pilih SOAP (JaewookByun commented on 16 Jul), ya makanya apa memang fungsinya sama kok dijadikan alternatif? lha sebelumnya ketika ingin mencoba membuat esai Kontribusiku Bagi Indonesia untuk mengikuti beasiswa LPDP (gagal maning son :'() malah menemukan komentarnya CEO Xterprise, Dean Frew berikut:
EPCIS was made up at MIT (Tesisnya James Luke Waldrop di http://s.id/9FU) with people that did not have a clue as to what systems customers already have and how they are not wanting to go on a wholesale enterprise system refresh.


Nah usut punya usut, semua menyusut pada pidatonya Bill Gates di tanggal 4 Maret 1999 inih http://s.id/9FM, dan mak kluthik biasanya kalau ada rilis fitur baru, kan kompetitor membuat tanggapan, dan sila cek tanggappannya IBM sehari setelah Microsoft mengumumlam kerja sama dengan SAP, MasterCard dan kawan-kawannya dalam membuat dokumen BizTalk. Mbuh, sampai hari ini saya tidak mengerti bagaimana politik dalam berbisnis itu, saya tidak paham, tapi tanggapan pihak IBM itu sebagai berikut:
Developing e-commerce systems is a services business that involves "Connecting computers from wide range of vendors" and making them robust enough to handle huge volumes of business. "these are not historical strength of Microsoft,"

Oke jadi, karena Bill Gates dan James Waldrop itu sama saja dikatakan "kemeruh" oleh yang merasa "pemain lama" diatas, saya juga pengen meneladani mereka, James Waldrop dan Bill Gates, boleh dong, #eeh  #eaa
Nyak oke, karena AS2 itu juga protokol http, saya mencoba bermain sembrono dengan memakai protokol http biasa toh juga nggak ada yang bakalan memakainya kan, saya mah apa atuh, bukan mahasiswa MIT apalagi CEO Microsoft gituh.
Oke ditulisan ini saya ingin mengirim Purchase Order kepada sistem ERP milik manufaktur yang diimplementasikan dengan pustaka Vert.x, dan akan dipanggil dengan bahasa PHP yang seolah olah sebagai sistem milik ritel dengan dokumen Purchase Order yang saya ambil contoh dari sini Carrefour Moscow EDIFACT D01B Purchase Order GuideLine.
Berikut daftar dependensi gradle-nya, beruntung di java ada pustaka sumber terbuka Smooks
//berkas build.gradle
dependencies {
   compile 'io.vertx:vertx-core:3.3.3'
   compile 'io.vertx:vertx-web:3.3.3'
   compile 'io.vertx:vertx-rx-java:3.3.3'
   compile 'org.milyn:milyn-smooks-edi:1.4'
   compile 'org.milyn.edi.unedifact:d01b-binding:1.4'
}
Sedangkan berikut merupakan kelas yang berisi Vertx, tapi saya menangani permintaan HTTP POST dengan blockingHandler yang akan membuang kontrol ke thread latar belakang (jadi teringat kelas abstrak android.os.AsyncTask di android kah?, atawa javax.swing.SwingWorker)
//berkas JAXMServlet.java
package id.co.blogspot.datacomlink;

import io.vertx.core.Handler;
import io.vertx.rxjava.core.Vertx;
import io.vertx.rxjava.core.http.HttpServerRequest;
import io.vertx.rxjava.ext.web.Router;
import io.vertx.rxjava.ext.web.RoutingContext;
import io.vertx.rxjava.ext.web.handler.BodyHandler;
import org.milyn.edi.unedifact.d01b.D01BInterchangeFactory;
import org.milyn.edi.unedifact.d01b.ORDERS.Orders;
import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41;
import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactMessage41;

import java.io.ByteArrayInputStream;

public class JAXMServlet  {
 public static void main(String args[])throws Exception{
        D01BInterchangeFactory factory = D01BInterchangeFactory.getInstance();
        Vertx vertx = Vertx.vertx();
        Router router = Router.router(vertx);
        router.route("/*").handler(BodyHandler.create());
        router.route().consumes("application/EDIFACT").blockingHandler(routingContext -> {
            try {
                String body = routingContext.getBodyAsString();
                routingContext.response().setStatusCode(202).end();
                UNEdifactInterchange41 amplop = (UNEdifactInterchange41) factory.fromUNEdifact(new ByteArrayInputStream(body.getBytes()));
                for (UNEdifactMessage41 surat : amplop.getMessages()) {
                    System.out.println("\tNama topik: " + surat.getMessageHeader().getMessageIdentifier().getId());
                    Orders pesananPembelian = (Orders) surat.getMessage();
                    System.out.println("\tNama mitra " + pesananPembelian.getSegmentGroup2().get(0).getNameAndAddress().getPartyName().getPartyName1());
                    System.out.println("\tJumlah SKU " + pesananPembelian.getSegmentGroup28().size());
                    System.out.println("\tDeskripsi SKU " + pesananPembelian.getSegmentGroup28().get(0).getItemDescription().get(0).getItemDescription().getItemDescription1());
                    System.out.println("\tJumlah " + pesananPembelian.getSegmentGroup28().get(0).getQuantity().get(0).getQuantityDetails().getQuantity());
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });
        vertx.createHttpServer()
                .requestHandler(router::accept)
                .listen(5080);
 }
}
Dalam mencari pustaka php yang sudah matang untuk mengolah surat EDIFACT itu susahnya minta ampun, saya sendiri baru menemukan ini saja, jadinya ya saya hanya memakai String mentahan gituh ajah:
$ composer require sabas/edifact
$ composer require metroplex-systems/edifact
Berikut di bawah ini adalah kode untuk Client RESTful-nya:
//berkas jangan.php, iyah jangan diphpin yah >.<
<?php

$waktu_awal = microtime(true);
//http://webcache.googleusercontent.com/search?q=cache:4Kewrm27y9gJ:www.carrefour.net/tableau/pdf_migs/ORDERS_D01B_APEX_SUP_V13F.pdf+&cd=2&hl=jv&ct=clnk&client=firefox-b
$amplop = "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'";

//kirimkan amplop ini ke endpoint /9999US_AS2_20150715190948 milik pemasok kita
$ch = curl_init('http://localhost:5080/9999US_AS2_20150715190948');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $amplop);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/EDIFACT', //https://tools.ietf.org/html/rfc1767
    'Content-Length: '.strlen($amplop), )
);
curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
http_response_code($info['http_code']);
$waktu_akhir = microtime(true);
$jeda = $waktu_akhir - $waktu_awal;
if ($info['http_code'] == 202) {
    echo 'Kode Status: '.$info['http_code'].' Artinya Lamaranmu sedang dipertimbangkan, eh, Amplopmu diterima untuk diproses tapi belum komplit :v. Lamaranmu eh permintaan httpmu ditanggapi dalam waktu: '.$jeda.' mikro detik, cepet amat nyak nanggepi lamarannya, eh permintaan httpnya, yah lebih mending dari pada diphpin, eh.. :v';
}
Kalau skrip php di atas dipanggil dari peramban kesukaan anda, maka akan seketika menampilkan pesan berapa lama lamaranmu dijawab :v, karena ketika amplop EDIFACT terkirim saat fungsi curl_exec() tereksekusi, proses pengolahannya entah Purchase Order ataupun Invoice bisa berlangsung cepat karena metode onMessageReceived() di sisi server telah ditandai dengan penanda (annotation di dunia java, attribute di dunia .NET) @Async, penanda yang berfungsi untuk membuang kontrol eksekusi ke thread lain, berikut ini merupakan tampilan pesan-pesannya di peramban rubah api Netscape, eh Mozilla Firefox:
pesan jeda waktu pengolahan
Berikut merupakan hasil eksekusi program server-nya:
pesan jeda waktu pengolahan
Sedangkan berikut ini merupakan contoh permintaan HTTP POST, menggunakan program curl

$ curl -i -X POST -H "Content-Type: application/EDIFACT" -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" http://localhost:5080/9999US_AS2_20150715190948
HTTP/1.1 202 Accepted
Content-Length: 0
  • -i memastikan anda bisa melihat pesan tanggapan termasuk header HTTP.
  • -X POST metode POST digunakan untuk mengirim surat EDIFACT
  • -H "Content-Type: application/EDIFACT" mengatur content type sehingga aplikasi mengerti tubuh permintaan HTTP berisi surat EDIFACT
  • -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" adalah data yang akan dikirim
Kode Sumber

  1. Anda bisa mengunduh dan unzip repository untuk artikel ini, atau klon menggunakan Git: git clone https://github.com/dawud-tan/vertx-erp-edifact.git
  2. cd ke dalam direktori vertx-erp-edifact/
  3. langsung jalankan program dengan perintah $ gradlew run

Daftar Pustaka:


  1. S. Allamaraju, "Using the Uniform Interface," in RESTful Web services cookbook, 1st ed. Sebastopol, CA: O'Reilly, 2010, ch. 1, sec. 10, pp. 19-22.
  2. G. Jansen, "Methods", Thoughts on RESTful API Design, 2012. [Online]. Available: http://restful-api-design.readthedocs.io/en/latest/methods.html#asynchronous-requests. [Accessed: 06- Sep- 2016].
  3. L. Richardson and S. Ruby, "REST and ROA Best Practices," in RESTful web services, 1st ed. Sebastopol, CA: O'Reilly, 2007, ch. 8, sec. 8, pp. 228-230.
  4. J. Thijssen, "Asynchronous operations - The RESTful cookbook", - The RESTful cookbook, 2012. [Online]. Available: http://restcookbook.com/Resources/asynchroneous-operations/. [Accessed: 06- Sep- 2016].
  5. Michelle, "Supply chain management practices in Wal mart and Ikea", S.E., UNIVERSITAS INDONESIA, 2014.


Wednesday, September 14, 2016

Menafsirkan Internet of Things

Saya bukanlah siapa-siapa di dunia TI, tapi cuman agak gimana gitu kalau menjelaskan istilah tapi penemu istilah itu sendiri tidak dikuliti habis-habisan. Sudah banyak artikel tentang Internet of Things berbahasa Indonesia yang berasal dari Negara Indonesia[4] tapi saya mencoba mengulas konteks lahirnya istilah Internet of Things. Ingat ya, KON-teks, KON-teks, kon-TEKS.
Nah yang akan saya gali itu seputar siapa penemu istilah Internet of Things, masalah apa yang sedang beliau hadapi kok bisa-bisanya punya ide Internet of Things, dan seperti apa wujud konkrit pertama dari solusi berupa Internet of Things itu, serta siapa saja pemangku kepentingan yang paling berperan.

Penemu Internet of Things itu Kevin Ashton, siapa beliau?

Beliau adalah Brand Manager lipstik Oil of Olay milik Procter & Gamble, alumni Studi Skandinavia di Universitas London [5]. Suatu hari sedang inspeksi mendadak (sidak) di Toserba Tesco lalu mendapati lipstiknya tidak berada di rak, beliau pun menghubungi divisi Supply Chain P&G tempat ia bekerja namun ternyata jumlah barang masih banyak [1].

Lalu Masalahnya apa?

Ketiadaan stok lipstik di rak Toserba Tesco tersebut dapat mengecewakan pelanggan. Nah bagaimana caranya, lipstik selalu ada di rak ketika pelanggan membeli? Inilah masalah pertama yang menginspirasi Kevin Ashton mempunyai ide Internet of Things [1][3][5][6].

Apa solusi yang terpikirkan Kevin Ashton?

Ganti UPC barcode dengan RFID [3]. Pasang RFID reader disetiap rak, kasir, gerbang gudang, gerbang truk [3]. Serta sistem yang secara proaktif menginformasikan pihak ritel dan manufaktur mengenai kejadian penyusutan dan persediaan habis [3].

Pemangku Kepentingan

Procter & Gamble, MIT Media Lab, AutoID Lab, Uniform Code Council, Gillette, EPCGlobal. 

Saatnya Gedabrus, Ngamen, bahasa jawanya "adol abab", bahasa inggrisnya "ado", bertele-tele, apalah namanya

Lah, ternyata seperti itu yah? gimana perasaan pembaca pas tahu sederet fakta diatas? Saya sendiri tak habis pikir, penemu istilah Internet of Things itu dulunya kuliah mendalami Studi Skandinavia, kerja sebagai Brand Manager untuk produk lipstik. Lha penulis sendiri alumni Teknik Informatika jadi rada-rada shock gimana gitu mengetahui latar belakang beliau, maap bukan sombong ya tapi memangnya beliau tahu apa itu non-blocking socket, port 80, bedanya client dan server, apalagi netty.io? Lha terus maksud judul Internet of Things di dalam presentasinya menghadapi petinggi P&G itu apa coba[1][3][5][6], ternyata oh ternyata, maksudnya Internet of Things sepemahaman beliau[5] itu seharusnya yang memasukkan data jumlah barang pas di kasir itu bukan manusia, seharusnya yang memasukkan data jumlah barang ketika penerimaan di gudang ritel itu bukan manusia, seharusnya yang memasukkan data jumlah barang ketika shipping dari pemasok itu bukan manusia, seharusnya yang memasukkan data jumlah barang ketika pengepakan itu bukan manusia. Lha Thing itu maksudnya barang-barang dalam hal ini lipstik itu bisa memberi tahu perusahaan berapa jumlah barang yang lalu-lalang tersebut. Itu saudara-saudara. Jadi, yang memasukkan data jumlah barang bukan manusia, lalu yang memasukkan data siapa? RFID reader semacam Alien ALR-9900+ yang akan meneruskan data jumlah barang tersebut ke server ALE (Application Level Event) seperti Savant.
Hayooh...
Kalau mau dianalisa lebih dalam, bidang yang menghadapi masalah Pak Kevin Ashton itu saling overlap, tumpang tindih dengan bidang akuntansi, Teknik Mesin, Teknik Industri, Ekonomi Manajemen, Matematika, serta Teknik Informatika, dan entah berapa lagi bidang yang overlap. Pak Kevin Ashton sampai bilang
"Everyone’s mind shuts off when you say supply chain."[1]
Di akuntansi ada bab tentang akuntansi persediaan, ada dua jenis sistem akuntansi persediaan yaitu Perpetual dan Periodik. Perbedaan inti di sistem Perpetual perusahaan dagang dan perusahaan industri/manufaktur bisa tahu saldo rekening Harga Pokok Penjualan dan jumlah barang setiap saat, sedangkan sistem Periodik hanya di akhir periode akuntansi saja. Pun juga di jurusan akuntansi ada kajian tentang teknik untuk menyemimbangkan trade-off antara Inventory Cost dan Stock Out Cost, serta antara Carrying Cost dan Order Cost.
Lah, kalau di teknik mesin, teknik industri, ekonomi manajamen, mereka semua mengkaji tentang fenomena bullwhip effect, kok Bullwhip Effect? tuh Prof Sanjay Sarma yang dipercayai Kevin Ashton untuk menyediakan solusi yang bilang[3]. Nah, Bullwhip effect itu sepahaman penulis yang memiliki kapasitas mikir yang terbatas ini, begini, kalau ritel pengen beli barang itu ada proses meramal permintaan (demand), kira-kira berapa ya kebutuhan yang akan terjadi selama pemesanan dipenuhi oleh pemasok, nah cari amannya pihak pembeli membesarkan nilai pesanan ke pemasok. Lalu pemasok perantara berikutnya juga begitu dan seterusnya sampai ke pemasok paling ujung. Lah cara meramal pun ada tekniknya, dan kesemua jurusan tadi juga mempelajari cara meramal permintaan, demand forecasting, sales forecasting, dan apalah namanya. Ada Holt Winter, dan kawan-kawan yang sempat saya tuliskan di postingan saya berikut Data Mining: Algoritma Forecast untuk Meramal Permintaan Pencukur Bulu di Toserba Waljinah (bag. 1).
Oke, ditunggu feedbacknya yah kawan-kawan pembaca yang budiman.
  1. J. Bainbridge, "Meet Kevin Ashton, the man behind the internet of things", Marketingmagazine.co.uk, 2014. [Online]. Available: http://www.marketingmagazine.co.uk/article/1291707/meet-kevin-ashton-man-behind-internet-things. [Accessed: 24- Mar- 2016].
  2. D. Fielding, "The Secret to Creativity is Collaboration", Profitguide.com, 2015. [Online]. Available: http://www.profitguide.com/manage-grow/innovation/the-secret-to-creativity-is-collaboration-75849. [Accessed: 24- Mar- 2016].
  3. S. Garfinkel, RFID: applications, security, and privacy. Upper Saddle River, NJ: Addison-Wesley, 2005, pp. 37-55.
  4. "Internet of Thing - Penelusuran Google", Google.co.id, 2016. [Online]. Available: https://www.google.co.id/search?as_q=Internet+of+Thing&lr=lang_id&cr=countryID&pws=0. [Accessed: 24- Mar- 2016].
  5. R. Journal, "That 'Internet of Things' Thing - RFID Journal", Rfidjournal.com, 2016. [Online]. Available: http://www.rfidjournal.com/articles/view?4986. [Accessed: 24- Mar- 2016].
  6. K. Maney, "Meet Kevin Ashton, Father of the Internet of Things", Newsweek, march, 2015. http://www.newsweek.com/2015/03/06/meet-kevin-ashton-father-internet-things-308763.html.

Pengantar Pertukaran Data Elektronik

Tulisan berikut merupakan pembelajaran ulang dari bagian pertama buku berikut R. Stultz, Demystifying EDI. Plano, Tex.: Wordware Pub., 2001.
Electronic Data Interchange atau terjemahan bahasa Indonesianya Pertukaran Data Elektronk, adalah alir informasi bisnis secara elektronik antar aplikasi, antar organisasi secara langsung yang terintegrasi dengan menggunakan standar UN/EDIFACT melalui jaringan komputer yang dikelola Provider (sumber: DIREKTORAT JENDERAL BEA DAN CUKAI). EDI pertama kali diciptakan oleh Edward Guilbert untuk menghubungkan Du Pont dan Chemical Leahman Tank Lines, Inc. di tahun 1960an, di sektor ritel dipelopori oleh Kmart dan Sears dengan berbagai pemasok pada awal 1970an, lalu akhirnya badan standarisasi membentuk standar pada tahun 1979 bernama ANSI ASC X12, lalu PBB membentuk standar EDIFACT pada tahun 1987.
Berikut Contoh-Contoh Surat EDI menurut standar dari PBB/EDIFACT:
Topik Pesan Penjelasan
ORDERS Sebuah dokumen yang menentukan detil dari barang atau jasa yang dipesan di bawah kondisi yang disepakati antara penjual dan pembeli.
INVOIC Sebuah dokumen yang mengklaim pembayaran atas barang atau jasa yang telah diberikan di bawah kondisi yang disepakati antara penjual dan pembeli.
DESADV Sebuah dokumen yang memberikan detil untuk barang yang telah dikirim atau siap untuk dikirim di bawah kondisi yang disepakati.
INVRPT Sebuah dokumen yang menspesifikasikan informasi terkait persediaan yang ada digudang. Dokumen laporan persediaan dimaksudkan untuk dibuat baik oleh penjual maupun pembeli.
SLSRPT Sebuah dokumen yang berisi aktivitas produk yang terkait dengan penjualan produk atau jasa, seperti lokasi kegiatan, tanggal, waktu atau periode, kuantitas, harga, jumlah moneter, sektor pasar, pihak yang terlibat dan data lainnya yang memungkinkan berbagai analisis penjualan. Informasi aktivitas tersebut memungkinkan pemasok untuk melakukan analisis statistik dan kuantitatif dalam mendukung produksi, perencanaan, pemasaran, pengisian, dan proses lainnya.
PRICAT Sebuah dokumen yang berisi informasi mengenai harga dan rincian katalog untuk barang dan jasa yang ditawarkan oleh penjual kepada pembeli.
ORDCHG Sebuah dokumen dari pembeli ke penjual yang menspesifikasikan detil permintaan pembeli untuk merubah pesanan pembelian yang terlanjur terkirim.
ORDRSP Sebuah dokumen yang dikirim penjual ke pembeli atas respon terhadap permintaan pesanan pembelian atau perubahan pesanan pembelian.
IFTSTA Sebuah dokumen untuk melaporkan status transportasi dan/atau perubahan status transportasi (misalnya kejadian) antara kedua belah pihak.
CUSDEC Pemberitahuan pabean yang berisi data PEB dan PKBE serta dokumen pelengkap pabean dengan standar UN/EDIFACT yang dikirim oleh eksportir/ kuasanya, konsolidator atau PJT ke Kantor Pabean.
CUSRES Respon dengan standar UN/EDIFACT yang dikirim oleh Kantor atas Cusdec yang telah diterima sebelumnya.
Menurut pendapat pribadi yang pernah utak-atik SQL, EDI itu rada-rada mirip, karena sama-sama dikirimkan ke sebuah nomor port tujuan yang disepakati pihak bisnis yang terlibat. Protokol untuk bertukar EDI bisa berupa SMTP, HTTP, FTP, ataupun turunan dari ketiga protokol tersebut yaitu AS1 (RFC 3335), AS2 (RFC 4130), AS3 (RFC 4832). Walmart [http://lib.ui.ac.id/detail?id=20369097] dan Amazon [http://s.id/a6y, http://s.id/a6z] memilih AS2 sebagai sarana bertukar surat EDI, AS2 untuk perusahaan masing-masing beralamat di http://gem.wal-mart.com:5080/ sedangkan amazon di http://as2.amazonsedi.com/. Menurut dokumen Walmart Getting Started with EDI Implementation Guide yang diterbitkan pada bulan april 2014, perusahaan anda pantas menggunakan AS2 jika perusahaan anda mengirim lebih dari 5500 invoice per tahun, jika kurang bisa menggunakan AS2 atau WebEDI. Sama seperti SQL, EDI juga ada badan yang mengatur standarisasinya, antara lain ANSI ASC X12, UN/EDIFACT, GS1 EANCOM, sedangkan format proprietary milik SAP sendiri yaitu iDoc, dan terakhir inovasi Microsoft bersama SAP bernama BizTalk Document tapi bentuknya berupa XML.

Berdagang cara lama sebelum 1970an di Kmart

Kmart adalah toserba dengan gudang yang tersebar di kota-kota besar di Amerika Serikat. SlimFast adalah salah satu pemasok penting untuk Kmart, atau mitra dagang. Tingkat inventaris Kmart telah mencapai titik pemesanan kembali (Reorder Point) untuk beberapa Stock-Keeping Unit (SKU) yang berbeda.
Pesanan Pembelian
Pegawai bagian pembelian Kmart yang bertanggung jawab untuk rekening SlimFast menjalankan laporan Reorder Point dan menemui bahwa tingkat persediaan untuk beberapa SKU pada posisi atau dibawah Reorder Point. Setiap SKU mempunyai nomer bagian SlimFast unik, deskripsi, harga satuan kotak karton, berat (yang penting untuk perhitungan ongkos kirim), dan diskon grosir. Dengan metode tradisional, bagian pembelian menyiapkan formulir Permintaan Pembelian (Purchase Requisition) berwujud kertas dan menyerahkan kepada bagian Pembelian yang bertanggung jawab menyiapkan dan mengirim Pesanan Pembelian (Purchase Order) kepada pemasok Kmart.
Setelah Purchase Requisition di setujui, informasinya termasuk nomer SKU, jumlah, deskripsi barang, dimasukkan ke sistem pembelian Kmart dan kertas Purchase Order dicetak pada kertas. Dikarenakan jumlah pesanan yang besar, dokumen diletakkan kedalam amplop dan dikirimkan kepada manufaktur menggunakan jasa kilat khusus, sedangkan faksimile lebih sering digunakan untuk pemesanan kecil.
Faktur Penjualan
Ketika surat pesanan pembelian Kmart tiba di SlimFast, lalu surat tersebut diberikan kepada bagian pengolahan pesanan. Operator entri data menghabiskan hampir seharian penuh mengetik informasi pesanan pembelian kedalam sistem pengolahan pesanan SlimFast. Faktur penjualan dan slip kemasan dicetak. Sistem juga mengkredit rekening persediaan, pastinya juga mendebit rekening harga pokok penjualan. Selain itu juga menentukan berat berdasarkan nomer bagian dan jumlah yang dimasukkan oleh bagian pengolahan pesanan.
Lead Time
Slip kemasan diberikan kepada bagian pengiriman dan faktur tagihan dikirimkan kepada Kmart. Seluruh siklus mulai dari pesanan pembelian hingga penerimaan faktur tagihan menghabiskan waktu lebih dari seminggu. Ketika barang dagangan yang dipesan datang, beberapa SKU sudah habis. Keterlambatan pengiriman memaksa beberapa pelanggan toserba Kmart mencari toserba alternatif untuk minuman diet. Kmart punya tanggung jawab terhadap pelanggan mereka, dan tidak ingin pelanggan mereka beralih ke toserba lain. Memelihara loyalitas pelanggan adalah hal vital dalam sebuah bisnis yang kompetitif. Oleh sebab itu, toserba alternatif dicari untuk minuman diet yang biasanya disediakan Kmart. Hal ini adalah masalah serius untuk Kmart dan SlimFast, karena kepercayaan terhadap Kmart dan SlimFast terkikis oleh pelayanan yang buruk dan ceroboh.
Kekeliruan
Ada masalah lain memperburuk situasi ini. Dikarenakan kekeliruan manusia sangat berpotensial terjadi yang dikarenakan oleh pengentrian manual informasi pembelian dan faktur penagihan, penanganan dokumen, salah alamat dan/atau pengiriman surat yang tertunda entah dengan berbagai kejadian yang tidak terduga, beberapa produk yang salah terlanjur diantarkan. Situasi out-of-stock di Kmart semakin memburuk, dan SilmFast harus membayar denda ongkos kirim untuk produk yang salah dikirim. Hal ini adalah lumrah adanya, dan tetap masih lumrah, untuk banyak perusahaan yang menggunakan transaksi berbasis kertas.
Pengaruh pada rekening piutang dan penagihan piutang yang jatuh tempo
Setiap perusahaan yang mutakhir memonitor syarat dan ketentuan penjualan, dokumen rekening piutang yang jatuh tempo, dan penagihan. Perusahaan yang dikelola dengan baik melakukan berbagai macam cara yang bisa dilakukan untuk menetapkan dan lalu mencapai target penjualannya. Dan karena waktu dan uang adalah satu-kesatuan, penagihan berupa peringatan jatuh tempo dan pemungutan piutang dengan mendatangi pelanggan harus diberi prioritas. Dengan kata lain, setelah pesanan pembelian pelanggan yang jatuh tempo ditagih, pemungutan harus dilakukan segera dalam rangka menegakkan syarat termin pembayaran yang telah disepakati bersama. Menggunakan dokumen pemesanan dan penagihan yang diproduksi secara manual bisa memolorkan siklus penagihan beberapa hari dan bahkan minggu. Kekeliruan bisa memperpanjang transaksi-transaksi lebih jauh. Hal ini berarti bahwa sebuah perusahaan melalaikan target penjualan yang berlaku dikarenakan faktur yang terlambat dan pemungutan yang tertunda. Sebuah perusahaan yang menggunakan kredit berjangka mungkin diharuskan untuk membuat tarikan tambahan untuk memenuhi kewajiban yang berlaku. Hal ini meningkatkan pembayaran utang perusahaan dan akhirnya menurunkan profitabilitas perusahaan.
Ada Lagi
Kekeliruan dan keterlambatan pengolahan dokumen yang dialami di pihak ritel-ke-manufaktur dari rantai pasok hanya mewakili bagian tambahan dari masalah. Isu-isu yang sama juga ada diantara bagian pembelian SlimFast dengan bagian pengelolaan pesanan pemasok bahan mentah yang digunakan dalam pengolahan bahan mentah.

Berdagang cara baru ala Kmart dengan menggunakan EDI

Pertukaran surat EDI
Sekarang perhatikan transaksi yang sama antara Kmart dan SlimFast menggunakan EDI. Pertama, Kmart menerima katalog elektronik berupa dokumen EDI PRICAT dari SlimFast untuk memastikan bahwa semua nomer bagian, harga, dan kode status persediaan masih berlaku dan akurat. Sebagai tambahan, kedua perusahaan mempunyai sambungan data antara sistem pengendalian persediaan, pembelian, dan EDI.
Sistem persediaan milik bagian pembelian Kmart secara otomatis memproduksi laporan permintaan pembelian, entah kalau sekarang pakai CRON Job atau apa. Laporan ini mengusulkan apa yang harus dipesan berdasarkan saldo rekening persediaan sekarang dan volume penjualan (atau perputaran persediaan). Bagian pembelian memeriksa pesanan dan membuat penyesuaian berdasarkan informasi tambahan yang mungkin memerlukan perubahan. Sebagai contoh, jika model baru yang akan diluncurkan menggantikan SKU yang ada, maka pihak pembeli mungkin ingin memesan item baru dan membatalkan pesanan untuk produk yang lama. Jika pelanggan ritel mempunyai indikasi untuk meningkatkan jumlah pesanan untuk SKU tertentu, maka bagian pembelian ritel harus meningkatkan jumlah pemesanan berdasarkan pengetahuan tersebut, adapun rumus-rumus untuk memprediksi tren atau musiman sebuah SKU antara lain diterangkan lebih lanjut di artikel Data Mining: Algoritma Forecast untuk Meramal Permintaan Pencukur Bulu di Toserba Waljinah (bag. 1). Oleh sebab itu, manusia berkuasa atas sistem, karena mereka mempunyai informasi yang tidak bisa diantisipasi oleh sistem.
Setelah pembeli mengeluarkan pesanannya, pesanan pembelian elektronik dihasilkan sebagai surat EDI dan dimasukkan kedalam kotak surat elektronik SlimFast. Ketika SlimFast memeriksa kotak masuk EDI mereka, mereka mengunduh surat EDI Kmart bersamaan dengan surat EDI lainnya yang mungkin juga ada. Surat digolongkan kedalam map yang berbeda yang biasanya digunakan untuk menyimpan surat dari setiap pelanggan atau pemasoknya SlimFast. Ketika surat EDI dari Kmart diolah, paling tidak delapan hal yang dihasilkan:
  1. Surat resi penerimaan (CONTRL)
  2. Surat faktur tagihan (INVOIC)
  3. Slip pengepakan untuk pelanggan (DESADV)
  4. Tiket pengambilan untuk bagian pengiriman
  5. Pendebitan rekening riil aktiva piutang dagang untuk Kmart
  6. Pengkreditan rekening nominal penjualan
  7. Pendebitan rekening nominal Harga Pokok Penjualan (Cost of Goods Sold)
  8. Pengkreditan rekening riil akiva persediaan

Seberapa lama waktu yang dibutuhkan
Dalam beberapa menit, SlimFast mengirim surat EDI CONTRL (balasan fungsional) yang mirip-mirip seperti proses jabat tangan di protokol TCP atau tanda terima resi dari Bapak POS dan surat EDI INVOIC (faktur tagihan) kepada Kmart dengan memasukkan dokumen tersebut kedalam kotak keluar milik pihak ketiga penyedia jasa VAN seperti IBM atau General Electric melalui modem 3270 BISYNC mereka.
Pihak penyedia jasa VAN secara otomatis menyampaikan surat EDI untuk Kmart kedalam kotak masuk milik Kmart, dimana kotak masuk tersebut menunggu (listen kalau dalam pemrograman socket) pengambilan surat. Seluruh transaksi, dari pesanan pembelian hingga faktur penagihan, dapat terjadi dalam hitungan menit tentu saja tergantung pada seberapa sering setiap mitra dagang memeriksa (pull kalau istilah di protokol POP3) kotak surat EDI. Langkah terakhir dalam proses adalah ketika Kmart mengambil dan mengolah surat EDI INVOIC dari SlimFast. Ketika hal ini selesai dilakukan, Kmart mengirimkan surat EDI CONTRL (balasan fungsional) kepada SlimFast untuk menotifikasi SlimFast bahwa faktur telah diterima dan selesai diolah.
Seberapa banyak kekeliruan yang terjadi
Hal ini tidaklah mungkin terjadi kekeliruan, sepanjang informasi orisinal sudah akurat. Ketika informasi yang dimasukkan adalah sampah dalam pertukaran EDI, (kok saya jadi teringat konsep cleaning didalam proses ETL ya?), hal ini hampir selalu tertangkap dalam transaksi awal. Jika data sampah berasal dari pesanan pembelian bagian pembelian perusahaan, kekeliruan akan ditandai karena data tidak cocok dengan data yang ada di basis data vendor. Hal ini benar jika sistem pembelian memasukkan data yang berasal dari katalog elektronik yang dihasilkan oleh manufaktur berupa dokumen EDI PRICAT. Katalog elektronik ini umumnya dihasilkan dari basis data persediaan manufaktur. Oleh karena itu, hal ini akan cocok secara akurat dengan informasi dari manufaktur. Lebih lanjut lagi, data hasil komputer terisolasi dari kekeliruan entri data manual, menjamin reliabilitas yang tinggi.
Berapa banyak BURUH yang terlibat?
Dalam hal surat EDI yang dihasilkan oleh sistem, satu buruh untuk setiap perusahaan mitra dagang umumnya mencukupi semua pertukaran surat tersebut (lihat lowongan dari perusahaan SlimFast berikut dari indeed.com Order Desk Analyst). Tentu saja, terkecuali gudang yang otomatis seperti Amazon.com dibawah berikut, bagian pengiriman dan penerimaan masih harus menggunakan tenaga buruh untuk memilih, memuat, mengirimkan, menerima, membongkar, dan menyimpan pesanan. Sistem otomasi yang tinggi tersebut melibatkan biaya tetap yang tinggi pula dan biasanya disebut teknologi padat modal (Capital Intensive)

Motif Pribadi
Motif saya itu hanya heran dengan CURRICULUM VITAE-nya Roy Thomas Fielding yang berada di dalam disertasinya, beliau itu merancang RESTful WEB API sudah Mei 1998 di Microsoft Research, Redmond, Washington, dengan judul presentasi Representational State Transfer: An Architectural Style for Distributed Hypermedia Interaction. Selain itu ada pula Dave Winer pada hari Jum'at, tanggal 27 Februari 1998, beliau itu membuat tulisan RPC over HTTP via XML, membahas mengenai XML-RPC yang juga digunakan oleh Matt Mullenweg penemu WordPress di CMS miliknya, Blogger yang dibeli Google itupun juga punya Blogger API yang memakai XML-RPC hasil pemikiran Dave Winer, dan sejak WordPress 4.4 sedang heboh RESTful, aneh gak?, pun Drupal 8 selesai diubah ke RESTful, selain itu ada pula Alex Hopmann pembuat XMLHttp di peramban Internet Explorer 1999 silam, berikut tulisannya The story of XMLHTTP, dan juga ada Don Box yang menulis A Brief History of SOAP, menceritakan kalau beliau mengembangkan SOAP bersama-sama Dave Winer, Bob Atkinson, dan Mohsen Al-Ghosein di awal 1998, tapi baru dipublikasikan ke publik melalui IETF pada tanggal 13 September 1999 berikut SOAP: Simple Object Access Protocol, tapi sayangnya draft tersebut tidak pernah menjadi RFC, lah terus objek XMLHTTP yang dibuat oleh Alex Hopmann tersebut di dalam buku XML and SOAP Programming for BizTalk™ Servers digunakan untuk memanggil SOAP server milik manufaktur guna mengantarkan Purchase Order yang berwujud BizTalk Document. Tapi buku itu terbit sudah 30 Agustus 2000, sedangkan Biztalk Server 2000 baru aja diluncurkan hari Selasa, 12 Desember 2000, tepat bersamaan waktunya dengan PBB bersama SUN Microsystem mengumumkan pencapaian bersama standar ebXML, Microsoft and Sun in new clash. Hm, tapi kalau bingung tentang ide paragraf saya ini, gambaran besar tentang interaksi SOAP Web Service, ERP, dan segalanya sudah dijelasken panjang lebar oleh tautan berikut Microsoft Commerce Server 2000: Commerce and BizTalk Server Integration, lha karena tulisan saya ini tulisan teknis, bagi yang ingin mencerna dengan bahasa CEO gituh ya silahkan baca sendiri pidatonya Bill Gates tanggal 4 Maret 1999 berikut ini Remarks by Bill Gates, Microsoft Corporation, Commerce Solutions Briefing, namun entah kenapa tautan http://microsoft.com/billgates/speeches/03-04csb.htm ketika langsung dibuka tanpa melalui web.archive.org, malah dialihkan ke transkrip pidatonya Bill Gates yang lain di tahun 2008, Bill Gates Keynote: Microsoft Tech•Ed 2008 — Developers.
Kapan-kapan
Kapan-kapan pengen belajar Kelas dan Metode berikut ah
Microsoft.CommerceServer.Runtime.Dictionary, Microsoft.CommerceServer.Interop.DictionaryXMLTransforms, Microsoft.Biztalk.BTSInterchange.submit()
com.sap.conn.idoc.IDocDocument, com.sap.conn.idoc.IDocXMLProcessor, com.sap.conn.idoc.jco.JCoIDoc.send()
com.sun.xml.messaging.jaxm.ebxml.EbXMLMessageImpl, javax.xml.messaging.ProviderConnection.send()
com.google.firebase.messaging.RemoteMessage, com.google.firebase.messaging.FirebaseMessaging.send()
metroplex-systems\Metroplex\Edifact\Message, AS2Client dari http://www.as2secure.com