各店舗から本社へFAX送信、FAX情報を自動的にまとめる

  • このエントリーをはてなブックマークに追加
  • 人気ブログランキング

ColdFusionを使ったシステムを考えました。
Web関係のシステムであれば、比較的簡単に作成できます。

 

まだまだFAXは利用されているところがあると思いますが、
送信する側は楽でも、受信する側は、紙を準備したりとか、
なにかと面倒なもの。

 

最近では、FAX内容が添付ファイルとして、

メール受信できるサービスもでてきました。

 

今回は一般的にありそうな事例を元に考えてみたいと思います。

現状

  1. 現在10店舗存在し、今後も店舗が増える予定
  2. 夜、各店舗から本社宛にFAXで売上の報告
  3. FAXの受信側は、メールに変換され、添付ファイルがFAX情報である。添付ファイルはPDF形式。
  4. 担当者の毎日の作業
    1. FAX情報が各店舗からきているか確認
    2. FAX情報がきていない場合は店舗に連絡
    3. FAX情報がそろったら店舗名順にFAX情報を並び替える。ただし、FAX情報は添付ファイルなので印刷しなければならない。
    4. 印刷したものを再度PDFにしてまとめる。
    5. まとめたPDFを社長宛にメール送信

改善案

今後店舗が増えるにつれて担当者の作業が多くなるので、自動化したい

前提条件

  1. FAXが受信されると、FAX内容は添付ファイルとして、メールで送信するサービスを利用。添付ファイルはPDF形式。
  2. FAX受信のメールの件名に、送信者のFAX番号が記述されている
    1. 例「FAX 発信元:0312345678」
  3. 20時から23時まで10分おきにチェック
    1. 送信していない店舗の責任者宛に連絡メールを送信
  4. 23時以降も10分おきにチェック
    1. 送信していない店舗の責任者宛に連絡メールを送信
    2. すべての店舗が受信された場合
      1. 添付ファイルを店舗名順に並び替え、マージする
      2. マージしたファイルを社長宛のメールに添付し、送信

※店舗から複数回の送信があった場合、最新のものを有効とする

ポイント

プログラムのスケジューリング

  1. ColdFusionのタスクスケジュールにて、プログラムを10分おきに実行する
    1. 一つのプログラムファイル内で、20時から23時、23時以降と処理を分けることで、1日の流れがわかりやすいと考えた。
    2. 実際は、プログラムファイル内に複数の関数を記述している。

プログラムのテストのことも考える

時間帯によって処理内容が違うので、それと同等の処理を、

パラメータ付で実行・検証できるようにする。

店舗名順に並び替え

件数が10件なので、データベースは使わず、XMLで対応
  1. ID
  2. 店舗名
  3. 店舗名(よみがな)
  4. FAX番号
  5. 責任者メールアドレス

今回のテストデータとして、以下のようなデータにしました。
※test@hoge.comは適当です。

 

<datas>
	<data id="1">
		<tenpo>札幌</tenpo>
		<tenpo_kana>さっぽろ</tenpo_kana>
		<fax>0000000001</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="2">
		<tenpo>那覇</tenpo>
		<tenpo_kana>なは</tenpo_kana>
		<fax>0000000002</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="3">
		<tenpo>青森</tenpo>
		<tenpo_kana>あおもり</tenpo_kana>
		<fax>0000000003</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="4">
		<tenpo>鹿児島</tenpo>
		<tenpo_kana>かごしま</tenpo_kana>
		<fax>0000000004</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="5">
		<tenpo>盛岡</tenpo>
		<tenpo_kana>もりおか</tenpo_kana>
		<fax>0000000005</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="6">
		<tenpo>宮崎</tenpo>
		<tenpo_kana>みやざき</tenpo_kana>
		<fax>0000000006</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="7">
		<tenpo>仙台</tenpo>
		<tenpo_kana>せんだい</tenpo_kana>
		<fax>0000000007</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="8">
		<tenpo>大分</tenpo>
		<tenpo_kana>おおいた</tenpo_kana>
		<fax>0000000008</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="9">
		<tenpo>秋田</tenpo>
		<tenpo_kana>あきた</tenpo_kana>
		<fax>0000000009</fax>
		<mail>test@hoge.com</mail>
	</data>
	<data id="10">
		<tenpo>熊本</tenpo>
		<tenpo_kana>くまもと</tenpo_kana>
		<fax>0000000010</fax>
		<mail>test@hoge.com</mail>
	</data>
</datas>
XMLデータを取得し、クエリデータに変換

クエリデータに変換すると、

データベースのように並び替えできたりするので便利です。

 

実際に使うプログラムとテスト用のプログラムの両方で使用できるように、

別ファイルに関数を作成しました。

 

<cffunction name="getXmlToQry" returntype="query" output="false">
	<cfargument name="path" type="string" required="yes">

	<cfset var qData = QueryNew("id,tenpo,tenpo_kana,fax,mail","integer,varchar,varchar,varchar,varchar")>
	<cfset var sData = "">
	<cfset var xmlData = "">
	<cfset var idx = "">

	<!--- data.xmlの取得 --->
	<cffile action="read" file="#GetDirectoryFromPath(arguments.path)#data.xml" variable="sData" charset="utf-8">

	<!--- xmlに変換 --->
	<cfset xmlData = XmlParse(sData)>

	<cfloop index="idx" array="#xmlData.datas.XmlChildren#">
		<cfset QueryAddRow(qData)>
		<cfset QuerySetCell(qData, "id", idx.XmlAttributes.id)>
		<cfset QuerySetCell(qData, "tenpo", idx.tenpo.XmlText)>
		<cfset QuerySetCell(qData, "tenpo_kana",idx.tenpo_kana.XmlText)>
		<cfset QuerySetCell(qData, "fax", idx.fax.XmlText)>
		<cfset QuerySetCell(qData, "mail", idx.mail.XmlText)>
	</cfloop>

	<cfreturn qData>
</cffunction>

 

以下は取得したXMLデータをクエリにしてダンプしたものです。
ダンプはcfdumpタグで可能です。

 

xml_dump

PDFの結合

上記のダンプのデータに、「pdf」という項目を追加し、

メール受信のデータの添付ファイルの絶対パスをセットしたものを用意して、

店舗かな順にソートしてからPDFの結合をしたソースです。

 

request.work_dirは、添付ファイルを保管する場所、

request.mrg_pdfは結合するファイル名です。

 

<cfquery name="qData" dbtype="query">
select *
from qData
order by tenpo_kana
</cfquery>

<cfpdf action="merge" destination="#request.work_dir##request.mrg_pdf#" overwrite="yes"> 
	<cfloop query="qData">
		<cfpdfparam source="#qData.pdf#">
	</cfloop>
</cfpdf>

メール送信

社長宛のメール送信です。
requestがついている変数名は、事前に別ファイルでセットします。

 

<cfmail from="#request.mail_from#" to="#request.mail_to#" subject="【FAXシステム】売上:(社長)" port="#request.mail_port#" server="#request.mail_server#" username="#request.mail_username#" password="#request.mail_password#" useTLS="#request.mail_useTLS#" >
PDFは、店舗(かな)順になっています。

	<cfmailparam file="#request.work_dir##request.mrg_pdf#">
</cfmail>

メール受信

こちらも同様に、requestがついている変数名は、

事前に別ファイルでセットします。

 

generateUniqueFilenames="yes"を指定すると、

添付ファイル名が重複した場合は、自動的に重複しないようにします。

 

<cfpop server = "#request.mail_pop_server#" action = "getAll" attachmentPath="#request.work_dir#" generateUniqueFilenames="yes" name="qMail" username="#request.mail_pop_username#" password="#request.mail_pop_password#" >

受信メール削除

いったんメール受信して、MessageNumberを指定して削除します。
今回は複数のMessageNumberをリスト形式にして、

一気に削除しています。

 

<cfset listMessageNumber = ValueList(qMail.MessageNumber)>
<cfpop action="delete" server = "#request.mail_pop_server#" username="#request.mail_pop_username#" password="#request.mail_pop_password#" MessageNumber="#listMessageNumber#" >

プログラム作成に伴うテストデータなどの作成

  1. 受信用メールアドレスの用意
    1. メールボックス内をクリアするので、新規に取得
  2. 送信用メールアドレスの用意(FAX送信用)
    1. 今回は件名で判断するので、既存のものでよい
  3. 送信用メールアドレスの用意(責任者用)
    1. 通常は個別に必要だが、既存のメールアドレスを利用し、件名に店舗名を表記することで、区別する。
  4. 送信用メールアドレスの用意(社長用)
    1. こちらも既存のメールアドレスを利用し、件名で判断する
  5. 店舗からFAXしたものと同等のメール送信プログラムの作成
    1. 実行プログラム名を、test01.cfm?ID=1というように、10店舗分対応できるようにする。
    2. 実際に使用するXMLファイルを利用
    3. PDFの結合の確認のため、PDFの中身は、店舗名(かな)だけでよい
    4. PDFのファイル名は、[ID]_[yyyymmddHHmmss].pdfとする

実行・検証

時間帯によって処理が分岐されるか確認。

あとは、パラメータをつけて、それぞれの処理を実行し、検証。

無料レポートとソース

このページの内容をまとめた無料レポートを作成しました。

そして、ソースをまとめました。

 

「うたらぼプライム」に参加するとダウンロードできます。
ぜひ、ソースを確認していただいて、役立ててください。

  • このエントリーをはてなブックマークに追加
  • 人気ブログランキング
最近の投稿
カテゴリー
タグ
アーカイブ
プロフィール