ผลพลอยได้ของระบบในองค์กรที่ใช้งานบนคลาวด์ คือการจัดเก็บและแชร์ไฟล์ที่เกี่ยวข้องผ่านคลาวด์ด้วย
โปรแกรมรุ่นใหม่นอกจากเก็บข้อมูลในดาต้าเบสแล้ว มักจะมึความสามารถเก็บไฟล์ที่ใช้อ้างอิง เช่น ไฟล์ใบสั่งซื้อของลูกค้าที่ได้รับมาเป็น pdf แนบไว้กับข้อมูลยืนยันขาย หรือเก็บสำเนาภาพถ่ายทะเบียนภาษีมูลค่าเพิ่ม (ภพ.20) แนบไว้กับข้อมูลลูกค้า
แทนที่จะต้องตั้งเซิร์ฟเวอร์ลงทุนระบบเก็บไฟล์เอง เราสามารถออกแบบให้โปรแกรมใช้ Google Drive เป็นพื้นที่เก็บข้อมูลอเนกประสงค์ ผู้ใช้บุคคลทั่วไป (gmail) ได้รับพื้นที่เก็บฟรี 15 GB ซึ่งเพียงพอสำหรับกิจการขนาดเล็ก สำหรับองค์กรอาจใช้ Google Workspace ช่วยควบคุมสิทธิเข้าถึงของบุคคลากรที่อาจเปลี่ยนแปลง เพิ่มหรือลบบัญชีผู้ใช้ได้
ปกติแล้วเราสามารถสร้างแชร์โฟลเดอร์ต่างๆ ภายใน Google Drive ให้เป็นพื้นที่เก็บไฟล์ร่วมกันภายในองค์กร แล้วกำหนดให้โปรแกรมเชื่อมโยงข้อมูลกับไฟล์ที่เกี่ยวข้อง
ข้อแตกต่างสำคัญในทางเทคนิค การอ้างอิงถึงไฟล์ใน Google Drive ไม่ได้ใช้รูปแบบ file path ที่เป็นชื่อโฟลเดอร์และชื่อไฟล์ แต่ใช้ file id แทน
โปรแกรมสามารถเก็บเฉพาะ file id โดยไม่ต้องสนใจ path ว่าจัดเก็บอยู่ที่โฟลเดอร์ไหน ดังนั้นผู้ใช้มีอิสระที่จะเปลี่ยนชื่อ หรือโยกย้ายไฟล์ไปไว้โฟล์เดอร์อื่น เพราะ id ที่อ้างถึงไฟล์นั้นไม่เปลี่ยน
การดูแลสิทธิเข้าถึงไฟล์ ตลอดจนการจัดระเบียบที่เก็บไฟล์เพื่อให้ค้นหาง่าย สามารถทำผ่าน UI หรือ App ของ Google Drive ได้โดยตรง ไม่กระทบกับการอ้างถึง file id ที่ใช้อ้างอิงกับข้อมูลในโปรแกรม
โจทย์ที่ได้มาเป็นกรณีความสัมพันธ์ที่ซับซ้อนระหว่างสององค์กรซึ่งเก็บไฟล์ไว้ใน Google Drive ทั้งคู่ ต้องการแลกเปลี่ยนข้อมูลบางส่วนพร้อมไฟล์ที่อ้างอิงให้กัน ต่างฝ่ายก็มี Workspace ของตนเอง และต้องดูแลสิทธิของผู้ใช้ที่แตกต่างกัน
ผู้ประกอบการกับสำนักบัญชี
โปรแกรมคลาวด์สามารถทำงานที่ไหนก็ได้ ไม่จำเป็นต้องอยู่ในสำนักงาน ดังนั้นผู้ประกอบการจึงสามารถแชร์โปรแกรมให้สำนักบัญชีภายนอกให้เข้ามาทำงานร่วมกันได้ เช่น ตรวจสอบธุรกรรมซื้อหรือค่าใช้จ่ายต่างๆ เนื่องจากไฟล์เอกสารแนบอยู่กับข้อมูลอยู่แล้ว จึงสามารถเรียกดูหลักฐานได้ทันที ไม่ต้องเรียกหาเอกสารที่เป็นกระดาษ
รูปแบบความสัมพันธ์ข้างต้น สามารถทำได้โดยเพิ่มบัญชีผู้ใช้สำนักบัญชีให้เข้าใช้งานในระบบได้ และเพิ่มสิทธิ์เข้าถึง Google Drive ให้กับผู้ใช้ดังกล่าว
ข้อสังเกตที่อยากจะให้ผู้ประกอบการระมัดระวัง นอกจากความไว้เนื้อเชื่อใจ (trust) ที่มีต่อสำนักบัญชี ความจริงแล้วเราไม่ควรเชื่อมั่นว่าสำนักบัญชีจะกลั่นกรองหรือจำกัดให้เฉพาะพนักงานที่เกี่ยวข้องรู้รหัสผ่านของบัญชีดังกล่าวเท่านั้น
นอกจากการเปลี่ยนรหัสผ่านของบัญชีดังกล่าวตามรอบเวลา
อย่างน้อยที่สุด โปรแกรมที่ออกแบบมาเพื่อรองรับการทำงานร่วมกับสำนักบัญชี ควรมีกลไกบันทึกประวัติการเข้าใช้งานของผู้ใช้ เผื่อจำเป็นต้องตรวจสอบพฤติกรรมใช้งานที่ผิดปกติ
สำนักบัญชีกับฟรีแลนซ์
นอกจากสำนักบัญชีที่เป็นหน่วยงานภายนอกใช้ประโยชน์จากเทคโนโลยีคลาวด์แล้ว พนักงานชั่วคราวหรืองานบางตำแหน่งอาจใช้บุคคลภายนอกมาช่วยก็ได้
อย่าลืมว่าเมื่อเอกสารที่ใช้บันทึกบัญชีเป็นไฟล์อยู่บนคลาวด์ พนักงานของสำนักงานบัญชีก็สามารถทำงานที่ไหนก็ได้เช่นกัน รวมถึงเป็นบุคคลภายนอกด้วย
หากเป็นบุคคลภายนอกที่องค์กรเลือกมาเอง ก็ยังสามารถควบคุมเพิ่มหรือลบบัญชีดังกล่าวได้
แต่ถ้าเป็นบุคคลภายนอกที่องค์กรภายนอกจ้างมาอีกทอดหนึ่ง เช่น สำนักบัญชีจ้างฟรีแลนซ์มาช่วยทำบัญชีอีกที แน่นอนว่าความรับผิดชอบอยู่ที่สำนักบัญชี
การสร้างบ้านที่ผู้รับเหมาจ้างคนงานโดยเราไม่จำเป็นต้องรับรู้ แต่สำหรับระบบงานภายในหากความเสียหายคือดำเนินธุรกิจไม่ได้ เปิดบิลส่งของ แจ้งหนี้ เก็บเงินไม่ได้ หรือที่ยากกว่านั้นข้อมูลสำคัญรั่วไหลโดยไม่รู้ตัว บางทีผู้ประกอบการควรคิดถึงกรณีที่แย่ที่สุดเอาบ้าง
แยกวงสำนักบัญชี
โดยสรุปผมยังกังวลกับข้อเสนอที่สนับสนุนการทำงานร่วมกันของผู้ประกอบการกับสำนักบัญชีของระบบคลาวด์ในปัจจุบัน เห็นว่ามีช่องโหว่เรื่องความปลอดภัยและขอบเขตความรับผิดชอบที่คลุมเครือ
ทางออกที่ดีกว่าอาจเป็นการคิดแบบ zero trust ไม่ควรไว้ใจใคร แทนที่จะใช้ประโยชน์เรื่องการทำงานร่วมกัน ควรใช้ประโยชน์จากความสามารถในการทำสำเนาดิจิตัลที่สะดวกรวดเร็วแทน ซึ่งหมายถึงการผลักดันให้การบันทึกข้อมูลภายในระบบต้องอ้างถึงหลักฐานที่เป็นดิจิตัลด้วยจึงเกิดประโยชน์สูงสุด
กรณีตัวอย่างของสำนักบัญชีต้นแบบ
ฝั่งผู้ประกอบการเลือกส่งข้อมูลเฉพาะส่วนที่เกี่ยวข้องกับงานบัญชีพร้อมทั้ง file id ของ Google Drive อาจโดยวิธี export เป็นไฟล์ csv หรือ xls
ฝั่งสำนักบัญชีรับข้อมูลมา load เข้าฐานข้อมูลในระบบของตัวเอง แต่ส่วนที่เป็น file id ยังเป็นของฝั่งผู้ประกอบการ พนักงานของสำนักบัญชีอาจไม่สามารถดูได้
เราสามารถออกแบบให้มีบัญชีผู้ใช้เพียงผู้เดียวที่มีสิทธิเข้าถึง workspace ที่เก็บไฟล์ของทั้งสองฝ่าย และเป็นผู้รับผิดชอบนำเข้าข้อมูลดังกล่าว สามารถอ่านไฟล์จาก Google Drive ต้นทางมาใส่ปลายทางได้ เพื่อแชร์ให้กับพนักงานของอีกฝั่งใช้ทำงาน ซึ่งอาจหมายถึงพนักงานบัญชีที่เป็นฟรีแลนซ์
เราอาจจะเรียกวิธีนี้ว่าเป็นการถ่ายสำเนาทางดิจิตัล สะดวกรวดเร็วกว่าเมื่อเทียบกับการส่งเอกสารให้สำนักงานบัญชีแบบเดิมที่ต้องถ่ายสำเนาเอกสารเป็นกระดาษ แลกกับงานสแกนหรือถ่ายภาพเอกสารแนบไว้กับข้อมูลในระบบตั้งแต่ต้น
Google Drive API
ตามปกติเมื่อต้องการเก็บไฟล์ที่อยู่ในเครื่องคอมพิวเตอร์ (local) ไปเก็บใน Google Drive แล้วอ้างอิงกับในโปรแกรม สามารถทำหลายวิธี เช่น
โปรแกรมเรียก Google Picker API ให้ผู้ใช้เลือก upload ไฟล์ผ่าน dialog ของ Google Picker
โปรแกรมเรียก Google Drive API ส่ง content ของไฟล์ขึ้นไปโดยตรง
ใช้ UI หรือ App ของ Google Drive ส่งไฟล์เข้าไปเก็บไว้ก่อน แล้วค่อยเลือกไฟล์นั้นมาแนบใส่ข้อมูล วิธีนี้มีข้อเสียตรงที่บางครั้งผู้ใช้อาจเลือกโฟลเดอร์ที่เก็บไฟล์ไม่ถูกต้อง เช่น ไม่ได้อยู่ในแชร์โฟลเดอร์ที่กำหนดไว้
วิธีการส่ง file id จาก workspace หนึ่งไปให้อีก workspace หนึ่งเพื่อทำสำเนาผ่านโปรแกรม แทนที่จะอ่านไฟล์ content แล้วส่งไฟล์ขึ้นไปโดยตรง ซึ่งช้ากว่าหากไฟล์มีขนาดใหญ่หรือมีไฟล์จำนวนมาก เราสามารถเขียนโค้ดโดยใช้คำสั่งของ Google Drive API เพื่อทำสำเนาไปเก็บไว้ในโฟลเดอร์ที่ต้องการ ด้วย 2 ขั้นตอนต่อไปนี้
ใช้คำสั่ง copy (drive.files.copy) เพื่อให้สร้างสำเนาไฟล์ขึ้นมาใหม่ โปรแกรมจะได้ file id ใหม
ใช้คำสั่ง update (drive.files.update)เพื่อใส่ตั้งค่าโฟลเดอร์ให้ file id ใหม่ที่ได้จากขั้นตอนแรก ผ่าน parameter addParents
ตัวอย่างโค้ด javascript ที่ผมใช้ในโปรแกรม เพื่อดูเป็นไอเดีย เงื่อนไขที่สำคัญอยู่ตรงที่ใช้ OAuth 2 เพื่อ grant access สำหรับเข้าถึง Google Drive (เคยเขียนเล่าไว้เมื่อต้นปี) ผู้ที่สามารถ copy ได้ขึ้นอยู่กับสิทธิแชร์โฟลเดอร์สองฝั่งนั้นเอง
var self = this
this.fileUpdate = function(fileId, _params) {
var params = angular.extend({fileId: fileId}, _params)
var _execute = function () {
return googleApi.client.execute({
path: 'drive.files.update',
method: 'PUT',
params: params,
})
}
return self.grant().then(_execute)
}
this.fileCopy = function (fileId, _params) {
var params = angular.extend({fileId: fileId}, _params)
var _execute = function () {
return googleApi.client.execute({
path: 'drive.files.copy',
method: 'POST',
params: params,
})
}
return self.grant().then(_execute)
}
this.fileClone = function(fileId, folderId, _prefix) {
var pm = self.fileMeta(fileId, true)
return pm.then(function (src) {
var resource
if (_prefix)
resource = {title: _prefix + ' ' + src.title}
return self.fileCopy(fileId, {resource: resource}).then(function (clone) {
var cabinet = gapiCfg('cabinetUpload')
if (folderId == '@camera')
folderId = gapiCfg('cameraUpload') || cabinet
if (folderId == '@guest')
folderId = gapiCfg('guestUpload') || cabinet
if (folderId == '@upload')
folderId = cabinet
if (!folderId)
return clone
return self.fileUpdate(clone.id, {addParents: folderId})
})
})
}
อ้างอิง
file update (metadata) API
https://developers.google.com/drive/api/reference/rest/v3/files/update
Google Picker API
コメント