top of page
ค้นหา
รูปภาพนักเขียนSathit Jittanupat

Send an E-Tax Invoice by Email using JavaScript

ในที่สุดคุณสามารถพัฒนาโปรแกรมเปิดบิลสร้างไฟล์ PDF ที่มี XML อยู่ข้างในด้วยตัวเองได้แล้ว ด่านต่อไปของ E-Tax Invoice คือการหาวิธีส่งไฟล์ทางอีเมลเพื่อประทับรับรองเวลา และส่งมอบให้ลูกค้า


เงื่อนไขหนึ่งของการเปิดใช้ E-Tax Invoice by Email ผู้ประกอบการต้องยื่นคำร้องพร้อมทั้งแจ้งอีเมลที่ใช้ส่งใบกำกับภาษี ซึ่งอีเมลนั้นต้องมาจากโดเมนที่น่าเชื่อถือเท่านั้น โดยการทดลองส่งเมลไปตรวจสอบกับ domain-check@tools.teda.th



หมายเหตุด้านล่างบอกว่าสามารถใช้ Free email ได้แก่ gmail, hotmail, outlook และ yahoo ได้โดยไม่ต้องตรวจสอบ


ขั้นตอนการทำงานแบบพื้นฐาน หลังจากสร้างไฟล์ PDF ได้แล้ว ก็อาจเปิดโปรแกรมส่งอีเมลของผู้ให้บริการ free email เหล่านั้นขึ้นมา แล้วแนบไฟล์ไปพร้อมกับระบุข้อความตามเงื่อนไขที่กำหนด


  • to: ให้ระบุอีเมลของผู้ซื้อ

  • cc: ให้ระบุ csemail@etax.teda.th 

  • subject: ต้องมีข้อความตามรูปแบบที่กำหนดเท่านั้น - [วันเดือนปี][INV][เลขที่] สำหรับ ใบกำกับภาษี - [วันเดือนปี][DBN][เลขที่][อ้างถึง] สำหรับ ใบเพิ่มหนี้ - [วันเดือนปี][CRN][เลขที่][อ้างถึง] สำหรับ ใบลดหนี้



แต่ข้อความที่กำหนดนั้นสำหรับผู้ใช้ทั่วไปเป็นอะไรที่ต้องตั้งสติพอสมควร เช่น วันเดือนปี ต้องเป็นเลขติดกัน 8 ตัว อ่านยาก ทำให้ตรวจทานยาก (เข้าใจว่าต้องใช้เป็นปี พ.ศ. ด้วย) คิดถึงความผิดพลาดที่มีโอกาสเกิดขึ้นทุกครั้งที่ต้องส่งอีเมล แล้วจำเป็นระบุข้อความตามรูปแบบนั้นเป๊ะ ๆ เป็นเรื่องไม่สบายเนื้อสบายตัวสำหรับผู้ใช้เอาเสียเลย


หากข้อความในอีเมลถูกเขียนขึ้นอัตโนมัติโดยโปรแกรม ก็จะช่วยลดความผิดพลาดโดยไม่จำเป็น จึงเป็นที่มาของการหาทางอำนวยความสะดวกส่งเมลจากโปรแกรม


Mailto & Gmail

การออกแบบระบบส่งอีเมลทำได้หลายกระบวนท่า หลังจากที่หารือกับ Bancha Kiatruangchai ที่ช่วยกันหาทางทำ E-Tax Invoice ที่เป็น PDF มาตั้งแต่ต้น ก็ยังไม่สามารถตัดสินใจเลือกคำตอบสุดท้ายได้


ส่วนตัวผมคิดว่าไหน ๆ สร้างไฟล์ PDF ได้ด้วยตัวเองแล้ว ก็อยากเสนอทางเลือกวิธีเขียนโค้ด JavaScript เพื่ออำนวยความสะดวกมากที่สุด สำหรับการส่งอีเมลด้วยตนเองดังนี้


  • เตรียมข้อความสำคัญให้อัตโนมัติ โดยสร้างเป็น mailto url หรือ gmail url

  • ผ่านข้อความนั้นให้กับ mail client

  • แนบไฟล์ PDF ที่บันทึกไว้ แล้วส่ง


ตัวอย่าง mailto url


ตัวอย่าง gmail url

https://mail.google.com/mail/?cc=csemail@etax.teda.th&su=[04022567][INV][EIV67020021]&to=buyer@site.com&view=cm


ขณะที่ mailto จะเรียกโปรแกรม mail client ที่อยู่ในเครื่อง ซึ่งอาจจะแตกต่างกันขึ้นอยู่กับเครื่องคอมพิวเตอร์ที่ใช้งาน แต่ gmail จะเปิด browser ขึ้นมา ใช้งานเหมือนกันทุกเครื่อง


นอกจากนี้ ยังสามารถสร้าง url ที่ระบุอีเมลผู้ส่งโดยระบุ u/me@gmail.com/ เพิ่มได้อีกด้วย


note: การระบุอีเมลผู้ส่งที่ไม่ใช่ account ที่ใช้งานอยู่ อาจใช้ไม่ได้ เด้งไปที่ default login โดยไม่แจ้งเตือน (เครื่องที่มี multiple account ดูรายละเอียดการสร้าง url ให้ผ่าน login ที่ต้องการก่อน)


https://mail.google.com/mail/u/me@gmail.com/?cc=csemail@etax.teda.th&su=[04022567][INV][EIV67020021]&to=buyer@site.com&view=cm



ตัวอย่างโค้ด JavaScript

const composeGmail = (xdata, to, from) => {
  const cc = 'csemail@etax.teda.th'
  const docno = xdata.docno
  const doctype = ({
       "80": "DBN",
       "81": "CRN",
       })[xdata.doctype] || 'INV';

  const doctitle = ({
      "80": "ใบเพิ่มหนี้",
      "81": "ใบลดหนี้",
      "380": "ใบแจ้งหนี้",
      "388": "ใบกำกับภาษี",
      "T01": "ใบรับ",
      "T02": "ใบแจ้งหนี้/ใบกำกับภาษี",
      "T03": "ใบเสร็จรับเงิน/ใบกำกับภาษี",
      "T04": "ใบส่งของ/ใบกำกับภาษี",
      "T05": "ใบกำกับภาษีอย่างย่อ",
      "T06": "ใบเสร็จรับเงิน/ใบกำกับภาษีอย่างย่อ",
      "T07": "ใบแจ้งยกเลิก",
      })[xdata.doctype] || 'ใบกำกับภาษี';

  const y = (543 + xdata.docdate.slice(0, 4)) // convert year to BE
  const m = xdata.docdate.slice(5, 7)
  const d = xdata.docdate.slice(8, 10)
  const docdate = d + m + y

  let subject = `[${docdate}][${doctype}][${docno}]`

  if (etax.doctype in ['80','81', 'T07']) {
    const ref = xdata.refno

    subject += `[${ref}]`
  }

  const mparms = {
    view: 'cm',
    to,
    cc,
    su: subject,
    body: [
    doctitle,
    docno,
    [d, m, y].join('/'),
    xdata.buyer.name,
    '----'
    ].join('\n')
  }

  // calculate popup dimension
  let w = 0|(window.screen.availWidth * 0.4);
  let h = 0|(window.screen.availHeight * 0.4);

  if (w < 360)
    w = 0|(window.screen.availWidth * 0.7);

  if (h < 360)
    h = 0|(window.screen.availHeight * 0.7);

  if (w > 800)
    w = 800;

  if (h > 600)
    h = 600;

  const l = 0|((window.screen.availWidth - w) * 0.7);
  const t = 0|((window.screen.availHeight - h) * 0.7);

  const option = 'height=' + h + ',width=' + w + ',top=' + t + ',left=' + l
  const authuser = from? `u/${from}/` : '';

  // serialize query
  const qry = Object.entries(mparms)
    .map(kv => encodeURIComponent(kv[0]) + '=' + encodeURIComponent(kv[1]) 
    .join('&');

  const url = `https://mail.google.com/mail/${authuser}?${qry}`

  window.open(url ,'_blank', option)
}

อ้างอิง






ดู 10 ครั้ง0 ความคิดเห็น

โพสต์ล่าสุด

ดูทั้งหมด

Comments


Post: Blog2_Post
bottom of page