2012年10月4日カテゴリー:

EC-CUBE2.12:帳票の種類に、見積書、お届け先一覧表を追加する

■納品書サンプル  ■お届け先一覧表サンプル  ■見積書サンプル

このカスタマイズは有料版となっております。
納品書とお届け先一覧表についてはコードを紹介しています。
見積書も同じような内容ですので、紹介コードを参考にすれば作成は可能です。
さらに、このカスタマイズを機能させるには、テンプレートpdf(nouhin1.pdf address1.pdf mitumori1.pdf)が不可欠です。
テンプレートpdfは提供しておりません。
下記よりテンプレートpdfが添付された有料版をご購入いただけます。
http://www.kaiplus.com/download/products/detail38.html

ご購入された方は、データベース作成後、下記ファイルを上書き、追加してください。
既存ファイルは、カスタマイズされていないことが前提です。

(1)■data/class/pages/admin/order/LC_Page_Admin_Oder_Pdf.php
(2)■data/Smarty/templates/admin/order/pdf_input.tpl
(3)■data/class/SC_Fpdf.php(納品書)
本サイトの「のし」カスタマイズを行っている方は、そのままコピーしても問題ありませんが、「のし」カスタマイズをされていない方は、■のし①/②の行と、■のし②/②の行の、2行を削除してください。
なお、ダウンロードファイルには2つのファイルが用意されています。
また、「注文番号(日付+連番)」に関するカスタマイズの記述もありますが、これはカスタマイズの有無に関係なく動作しますので問題ありません。
(4)■data/class/SC_Fpdfadd.php(お届け先の一覧)
(5)■data/class/SC_Fpdfmitu.php(見積書)
(6)■data/class_extends/SC_Fpdf_Ex.php(納品書)
(7)■data/class_extends/SC_Fpdfadd_Ex.php(お届け先の一覧)
(8)■data/class_extends/SC_Fpdfmitu_Ex.php(見積書)
(9)■data/Smarty/templates/admin/pdf/
nouhin1.pdf address1.pdf mitumori1.pdf
logo.png stamp.png

1 データベースに追加します。(マスターテーブルに追加される)

帳票のタイトル変更を可能にするための作業です。
(1)
【MySQL・PostgreSQL】

[php]
CREATE TABLE mtb_fpdf (
id smallint,
name text,
rank smallint NOT NULL DEFAULT 0,
PRIMARY KEY (id)
);
[/php]

(2)「システム設定>マスターデータ管理」でデータを登録します。
mtb_fpdfを選択
データを入力(スペースも必要です)

[php]
ID:0 値:選択してください
ID:1 値:お買上げ明細書(納品書)
ID:2 値: お届け先の一覧表
ID:3 値:  見  積  書
[/php]

2 ここからの記述は、カスタマイズ内容と新規作成したファイルのコードです。

(1)■data/class/pages/admin/order/LC_Page_Admin_Oder_Pdf.php

[php]
// {{{ requires
require_once CLASS_EX_REALDIR . ‘page_extends/admin/LC_Page_Admin_Ex.php’;

/**
* 帳票出力 のページクラス.
*
* @package Page
* @author LOCKON CO.,LTD.
* @version $Id: LC_Page_Admin_Order_Pdf.php 21867 2012-05-30 07:37:01Z nakanishi $
*/
class LC_Page_Admin_Order_Pdf extends LC_Page_Admin_Ex {

// }}}
// {{{ functions

/**
* Page を初期化する.
*
* @return void
*/
function init() {
parent::init();
$this->tpl_mainpage = ‘order/pdf_input.tpl’;
$this->tpl_mainno = ‘order’;
$this->tpl_subno = ‘pdf’;
$this->tpl_maintitle = ‘受注管理’;
$this->tpl_subtitle = ‘帳票出力’;

$this->SHORTTEXT_MAX = STEXT_LEN;
$this->MIDDLETEXT_MAX = MTEXT_LEN;
$this->LONGTEXT_MAX = LTEXT_LEN;

$this->arrType[0]  = “納品書”;
$this->arrType[1]  = “お届け先一覧”;
$this->arrType[2]  = “見積書”;

$this->arrDownload[0] = “ブラウザに開く”;
$this->arrDownload[1] = “ファイルに保存”;

$masterData = new SC_DB_MasterData_Ex();
$this->arrTitle = $masterData->getMasterData(‘mtb_fpdf’);
}

/**
* Page のプロセス.
*
* @return void
*/
function process() {
$this->action();
$this->sendResponse();
}

/**
* Page のアクション.
*
* @return void
*/
function action() {

$objDb = new SC_Helper_DB_Ex();
$objDate = new SC_Date_Ex(1901);
$objDate->setStartYear(RELEASE_YEAR);
$this->arrYear = $objDate->getYear();
$this->arrMonth = $objDate->getMonth();
$this->arrDay = $objDate->getDay();

// パラメーター管理クラス
$this->objFormParam = new SC_FormParam_Ex();
// パラメーター情報の初期化
$this->lfInitParam($this->objFormParam);
$this->objFormParam->setParam($_POST);
// 入力値の変換
$this->objFormParam->convParam();

// どんな状態の時に isset($arrRet) == trueになるんだ? これ以前に$arrRet無いが、、、、
if (!isset($arrRet)) $arrRet = array();
switch ($this->getMode()) {
case ‘confirm’:

$status = $this->createPdf($this->objFormParam);
if ($status === true) {
SC_Response_Ex::actionExit();
} else {
$this->arrErr = $status;
}
break;
default:
$this->arrForm = $this->createFromValues($_GET[‘order_id’],$_POST[‘pdf_order_id’]);
break;
}
$this->setTemplate($this->tpl_mainpage);

}

/**
*
* PDF作成フォームのデフォルト値の生成
*/
function createFromValues($order_id,$pdf_order_id) {
// ここが$arrFormの初登場ということを明示するため宣言する。
$arrForm = array();
// タイトルをセット
// $arrForm[‘title’] = ‘お買上げ明細書(納品書)’;

// 今日の日付をセット
$arrForm[‘year’]  = date(‘Y’);
$arrForm[‘month’] = date(‘m’);
$arrForm[‘day’]   = date(‘d’);

// メッセージ
$arrForm[‘msg1’] = ‘このたびはお買上げいただきありがとうございます。’;
$arrForm[‘msg2’] = ‘下記の内容にて納品させていただきます。’;
$arrForm[‘msg3’] = ‘ご確認くださいますよう、お願いいたします。’;
$arrForm[‘msg4’] = ‘下記の通り御見積申し上げます。’;
$arrForm[‘msg5’] = ”;
$arrForm[‘msg6’] = ”;
$arrForm[‘msg7’] = ”;
$arrForm[‘msg8’] = ”;
$arrForm[‘msg9’] = ”;

// 注文番号があったら、セットする
if (SC_Utils_Ex::sfIsInt($order_id)) {
$arrForm[‘order_id’][0] = $order_id;
} elseif (is_array($pdf_order_id)) {
sort($pdf_order_id);
foreach ($pdf_order_id AS $key=>$val) {
$arrForm[‘order_id’][] = $val;
}
}

return $arrForm;
}

/**
*
* PDFの作成
* @param SC_FormParam $objFormParam
*/
function createPdf(&$objFormParam) {

$arrErr = $this->lfCheckError($objFormParam);
$arrRet = $objFormParam->getHashArray();

$this->arrForm = $arrRet;
// エラー入力なし
if (count($arrErr) == 0) {
//納品書の発行
if($arrRet[‘type’] == 0) {
$objFpdf = new SC_Fpdf_Ex($arrRet[‘download’], $arrRet[‘title’]);
foreach ($arrRet[‘order_id’] AS $key => $val) {
$arrPdfData = $arrRet;
$arrPdfData[‘order_id’] = $val;
$objFpdf->setData($arrPdfData);
}
$objFpdf->createPdf();
return true;
}

//お届け先一覧
elseif($arrRet[‘type’] == 1) {
$objFpdf = new SC_Fpdfadd_Ex($arrRet[‘download’], $arrRet[‘title’]);
foreach ($arrRet[‘order_id’] AS $key => $val) {
$arrPdfData = $arrRet;
$arrPdfData[‘order_id’] = $val;
$objFpdf->setData($arrPdfData);
}
$objFpdf->createPdf();
return true;
}

//見積書の発行
elseif($arrRet[‘type’] == 2) {
$objFpdf = new SC_Fpdfmitu_Ex($arrRet[‘download’], $arrRet[‘title’]);
foreach ($arrRet[‘order_id’] AS $key => $val) {
$arrPdfData = $arrRet;
$arrPdfData[‘order_id’] = $val;
$objFpdf->setData($arrPdfData);
}
$objFpdf->createPdf();
return true;
}

} else {
return $arrErr;
}
}

/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}

/**
*  パラメーター情報の初期化
*  @param SC_FormParam
*/
function lfInitParam(&$objFormParam) {
$objFormParam->addParam(‘注文番号’, ‘order_id’, INT_LEN, ‘n’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’, ‘NUM_CHECK’));
$objFormParam->addParam(‘注文番号’, ‘pdf_order_id’, INT_LEN, ‘n’, array(‘MAX_LENGTH_CHECK’, ‘NUM_CHECK’));
$objFormParam->addParam(‘発行日’, ‘year’, INT_LEN, ‘n’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’, ‘NUM_CHECK’));
$objFormParam->addParam(‘発行日’, ‘month’, INT_LEN, ‘n’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’, ‘NUM_CHECK’));
$objFormParam->addParam(‘発行日’, ‘day’, INT_LEN, ‘n’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’, ‘NUM_CHECK’));
$objFormParam->addParam(‘帳票の種類’, ‘type’, INT_LEN, ‘n’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’, ‘NUM_CHECK’));
$objFormParam->addParam(‘ダウンロード方法’, ‘download’, INT_LEN, ‘n’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’, ‘NUM_CHECK’));
$objFormParam->addParam(‘帳票タイトル’, ‘title’, STEXT_LEN, ‘KVa’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘帳票メッセージ1行目’, ‘msg1’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘帳票メッセージ2行目’, ‘msg2’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘帳票メッセージ3行目’, ‘msg3’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘見積もり1行目’, ‘msg4’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘件名’, ‘msg5’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘納入期限’, ‘msg6’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘納入場所’, ‘msg7’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘取引方法’, ‘msg8’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘有効期限’, ‘msg9’, STEXT_LEN*3/5, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘備考1行目’, ‘etc1’, STEXT_LEN, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘備考2行目’, ‘etc2’, STEXT_LEN, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘備考3行目’, ‘etc3’, STEXT_LEN, ‘KVa’, array(‘MAX_LENGTH_CHECK’));
$objFormParam->addParam(‘ポイント表記’, ‘disp_point’, INT_LEN, ‘n’, array(‘EXIST_CHECK’, ‘MAX_LENGTH_CHECK’));
}

/**
*  入力内容のチェック
*  @var SC_FormParam
*/

function lfCheckError(&$objFormParam) {
// 入力データを渡す。
$arrRet = $objFormParam->getHashArray();
$arrErr = $objFormParam->checkError();

$year = $objFormParam->getValue(‘year’);
if (!is_numeric($year)) {
$arrErr[‘year’] = ‘発行年は数値で入力してください。’;
}

$month = $objFormParam->getValue(‘month’);
if (!is_numeric($month)) {
$arrErr[‘month’] = ‘発行月は数値で入力してください。’;
} else if (0 >= $month && 12 < $month) { $arrErr['month'] = '発行月は1?12の間で入力してください。'; } $day = $objFormParam->getValue(‘day’);
if (!is_numeric($day)) {
$arrErr[‘day’] = ‘発行日は数値で入力してください。’;
} else if (0 >= $day && 31 < $day) { $arrErr['day'] = '発行日は1?31の間で入力してください。'; } return $arrErr; } } [/php]

(2)■data/Smarty/templates/admin/order/pdf_input.tpl

[php]



注文番号 発行日


日 帳票の種類
帳票タイトル
帳票メッセージ
(納品書)
1行目:
2行目:
3行目:
1行目  :
件  名 :
納入期限:
納入場所:
取引方法:
有効期限:(お届け一覧には表示されません) 1行目:
2行目:
3行目:※未入力時は表示されません。

ポイント表記 する しない
※「する」を選択されても、お客様が非会員の場合は表示されません。



ダウンロード方法
  • この内容で作成する


[/php]

(3)■data/class/SC_Fpdf.php(納品書)
【注意!】
本サイトの「のし」カスタマイズを行っている方は、そのままコピーしても問題ありませんが、
「のし」カスタマイズをされていない方は、■のし①/②の行と、■のし②/②の行の、2行を削除してください。
なお、ダウンロードファイルには2つのファイルが用意されています。
また、「注文番号(日付+連番)」に関するカスタマイズの記述もありますが、これはカスタマイズの有無に関係なく動作しますので問題ありません。

[php]
/**
* PDF 納品書を出力する
*
* TODO ページクラスとすべき要素を多々含んでいるように感じる。
*/

define(‘PDF_TEMPLATE_REALDIR’, TEMPLATE_ADMIN_REALDIR . ‘pdf/’);

class SC_Fpdf extends SC_Helper_FPDI {
function __construct($download, $title, $tpl_pdf = ‘nouhin1.pdf’) {
$this->FPDF();
// デフォルトの設定
$this->tpl_pdf = PDF_TEMPLATE_REALDIR . $tpl_pdf;  // テンプレートファイル
$this->pdf_download = $download;      // PDFのダウンロード形式(0:表示、1:ダウンロード)
// $this->tpl_title = $title; //帳票の種類読み込みのためコメントアウト
$this->tpl_dispmode = ‘real’;      // 表示モード
$masterData = new SC_DB_MasterData_Ex();
$this->arrPref = $masterData->getMasterData(‘mtb_pref’);
$this->arrTitle = $masterData->getMasterData(‘mtb_fpdf’); //帳票の種類読み込み
$this->arrGIFTPAPER = $masterData->getMasterData(‘mtb_gift_paper’); //■のし①/②
$this->width_cell = array(110.3,12,21.7,24.5);

$this->tpl_title = $this->arrTitle[$title]; //帳票の種類読み込み

$this->label_cell[] = ‘商品名 / 商品コード / [ 規格 ]’;
$this->label_cell[] = ‘数量’;
$this->label_cell[] = ‘単価’;
$this->label_cell[] = ‘金額(税込)’;

$this->arrMessage = array(
‘このたびはお買上げいただきありがとうございます。’,
‘下記の内容にて納品させていただきます。’,
‘ご確認くださいますよう、お願いいたします。’
);

// SJISフォント
$this->AddSJISFont();
$this->SetFont(‘SJIS’);

//ページ総数取得
$this->AliasNbPages();

// マージン設定
$this->SetMargins(15, 20);

// PDFを読み込んでページ数を取得
$this->pageno = $this->setSourceFile($this->tpl_pdf);
}

function setData($arrData) {
$this->arrData = $arrData;

// ページ番号よりIDを取得
$tplidx = $this->ImportPage(1);

// ページを追加(新規)
$this->AddPage();

//表示倍率(100%)
$this->SetDisplayMode($this->tpl_dispmode);

if (SC_Utils_Ex::sfIsInt($arrData[‘order_id’])) {
$this->disp_mode = true;
}

// テンプレート内容の位置、幅を調整 ※useTemplateに引数を与えなければ100%表示がデフォルト
$this->useTemplate($tplidx);

$this->setShopData();
$this->setMessageData();
$this->setOrderData();
$this->setEtcData();

}

function setShopData() {
// ショップ情報

$objDb = new SC_Helper_DB_Ex();
$arrInfo = $objDb->sfGetBasisData();

// ショップ名
$this->lfText(125, 48, $arrInfo[‘shop_name’], 8, ‘B’);
// URL
$this->lfText(125, 51, $arrInfo[‘law_url’], 8);
// 会社名
$this->lfText(125, 56, $arrInfo[‘law_company’], 8);
// 郵便番号
$text = ‘〒 ‘ . $arrInfo[‘law_zip01’] . ‘ – ‘ . $arrInfo[‘law_zip02’];
$this->lfText(125, 59, $text, 8);
// 都道府県+所在地
$text = $this->arrPref[$arrInfo[‘law_pref’]] . $arrInfo[‘law_addr01’];
$this->lfText(125, 62, $text, 8);
$this->lfText(125, 65, $arrInfo[‘law_addr02’], 8);

$text = ‘TEL: ‘.$arrInfo[‘law_tel01′].’-‘.$arrInfo[‘law_tel02′].’-‘.$arrInfo[‘law_tel03’];
//FAX番号が存在する場合、表示する
if (strlen($arrInfo[‘law_fax01’]) > 0) {
$text .= ‘ FAX: ‘.$arrInfo[‘law_fax01′].’-‘.$arrInfo[‘law_fax02′].’-‘.$arrInfo[‘law_fax03’];
}
$this->lfText(125, 68, $text, 8);  //TEL・FAX

if (strlen($arrInfo[‘law_email’]) > 0) {
$text = ‘Email: ‘.$arrInfo[‘law_email’];
$this->lfText(125, 71, $text, 8);      //Email
}

//ロゴ画像
$logo_file = PDF_TEMPLATE_REALDIR . ‘logo.png’;
$this->Image($logo_file, 124, 36, 40.0);

//担当者印
$logo_file = PDF_TEMPLATE_REALDIR . ‘stamp.png’;
$this->Image($logo_file, 155, 74, 35.0);
}

function setMessageData() {
// メッセージ
$this->lfText(27, 63, $this->arrData[‘msg1’], 8);  //メッセージ1
$this->lfText(27, 67, $this->arrData[‘msg2’], 8);  //メッセージ2
$this->lfText(27, 71, $this->arrData[‘msg3’], 8);  //メッセージ3
$text = ‘作成日: ‘.$this->arrData[‘year’].’年’.$this->arrData[‘month’].’月’.$this->arrData[‘day’].’日’;
$this->lfText(158, 288, $text, 8);  //作成日
}

function setOrderData() {
$arrOrder = array();
// DBから受注情報を読み込む
$this->lfGetOrderData($this->arrData[‘order_id’]);

// 購入者情報
$text = ‘〒 ‘.$this->arrDisp[‘order_zip01′].’ – ‘.$this->arrDisp[‘order_zip02’];
$this->lfText(23, 18, $text, 11); //購入者郵便番号
$text = $this->arrPref[$this->arrDisp[‘order_pref’]] . $this->arrDisp[‘order_addr01’];
$this->lfText(27, 22, $text, 11); //購入者都道府県+住所1
$this->lfText(27, 26, $this->arrDisp[‘order_addr02’], 10); //購入者住所2
$text = $this->arrDisp[‘order_name01′].’ ’.$this->arrDisp[‘order_name02′].’ 様’;
$this->lfText(27, 32, $text, 12); //購入者氏名

// お届け先の情報 <▼ここから>
$objShip = new SC_Helper_Purchase_Ex();
$this->arrShip = $objShip->getShippings($this->arrDisp[‘order_id’]);

$y = 104; // お届け先開始y軸位置

$count = count($this->arrShip);
$i = 0; // 配列のindex
$j = 0; // 届け先取り出し数

do {
if ($j == $count) {
break;
}
if ($this->arrShip[$i][‘shipping_id’] != ”) {
$y += $j * 4 * 3; // 届け先 * 高さ * 要素数

$y += 4;
$text = ‘〒’. $this->arrShip[$i][‘shipping_zip01’]. ‘-‘ . $this->arrShip[$i][‘shipping_zip02’];
$this->lfText(25, $y, $text, 9);

$y += 4;
$text = $this->arrPref[$this->arrShip[$i][‘shipping_pref’]].$this->arrShip[$i][‘shipping_addr01’].$this->arrShip[$i][‘shipping_addr02’];
$this->lfText(25, $y, $text, 9);

$y += 4;
$text = ‘TEL:’ . $this->arrShip[$i][‘shipping_tel01’]. ‘-‘ . $this->arrShip[$i][‘shipping_tel02’]. ‘-‘ . $this->arrShip[$i][‘shipping_tel03’];
$this->lfText(25, $y+1, $text, 9);

$y += 4;
$text = $this->arrShip[$i][‘shipping_name01’]. ‘ ’ .$this->arrShip[$i][‘shipping_name02’] . ‘ 様’;
$this->lfText(25, $y+2, $text, 9);

if ($this->arrShip[$i][‘shipping_date’] != ” && $this->arrShip[$i][‘shipping_time’] != ”) {
$y += 4;
$text = ‘お届け日/お届け時間:’.substr($this->arrShip[$i][‘shipping_date’],5,2) . ‘月’ . substr($this->arrShip[$i][‘shipping_date’],8,2). ‘日’. ‘ / ‘ .$this->arrShip[$i][‘shipping_time’];
$this->lfText(25, $y+3, $text, 9);
}elseif ($this->arrShip[$i][‘shipping_date’] == ” && $this->arrShip[$i][‘shipping_time’] != ”) {
$y += 4;
$text = ‘お届け日/お届け時間:希望なし / ‘ .$this->arrShip[$i][‘shipping_time’];
$this->lfText(25, $y+3, $text, 9);
}elseif ($this->arrShip[$i][‘shipping_date’] != ” && $this->arrShip[$i][‘shipping_time’] == ”) {
$y += 4;
$text = ‘お届け日/お届け時間:’.substr($this->arrShip[$i][‘shipping_date’],5,2) . ‘月’ . substr($this->arrShip[$i][‘shipping_date’],8,2). ‘日’. ‘ / 希望なし’;
$this->lfText(25, $y+3, $text, 9);
}else{
}

if ($count > 1) {
$y += 4;
$text = ‘上記のお届け先を含め、計’.$count.’件のお届け先へ配送’;
$this->lfText(25, $y+4, $text, 9);
}

$j += 1;
}

$i += 1;
} while (false);
// お届け先の情報 <▲ここまで>

// お届け先情報
$this->SetFont(‘SJIS’, ”, 10);
$this->lfText(145, 23, SC_Utils_Ex::sfDispDBDate($this->arrDisp[‘create_date’]), 10); //ご注文日

//注文番号(日付+連番)
if(ORDER_NUMBER_DATEPLUS == ‘true’){
$text = substr($this->arrDisp[‘create_date’],2,2).substr($this->arrDisp[‘create_date’],5,2).substr($this->arrDisp[‘create_date’],8,2). $this->arrDisp[‘order_id’];
$this->lfText(145, 29, $text, 10);
}else{
$this->lfText(145, 29, $this->arrDisp[‘order_id’], 10); //注文番号
}

//お支払い方法
$text = ‘お支払い方法:’.$this->arrDisp[‘payment_method’];
$this->lfText(125, 115, $text, 10);

$this->SetFont(‘Gothic’, ”, ”, 12);
$this->lfText(130, 14, $this->tpl_title, 12);  //文書タイトル(納品書・請求書)
$this->SetFont(‘SJIS’, ‘B’, 15);
$this->lfText(150, 104, number_format($this->arrDisp[‘payment_total’]).’ 円’, 15);

$this->Cell(0, 100, ”, 0, 2, ‘R’, 0, ”);
$this->Cell(5, 0, ”, 0, 0, ‘R’, 0, ”);
$this->Cell(0, 16, ”, 0, 2, ”, 0, ”);

$this->SetFont(‘SJIS’, ”, 8);

$monetary_unit = ‘円’;
$point_unit = ‘Pt’;

// 購入商品情報
for ($i = 0; $i < count($this->arrDisp[‘quantity’]); $i++) {

// 購入数量
$data[0] = $this->arrDisp[‘quantity’][$i];

// 税込金額(単価)
$data[1] = SC_Helper_DB_Ex::sfCalcIncTax($this->arrDisp[‘price’][$i]);

// 小計(商品毎)
$data[2] = $data[0] * $data[1];

$arrOrder[$i][0]  = $this->arrDisp[‘product_name’][$i].’ / ‘;
$arrOrder[$i][0] .= $this->arrDisp[‘product_code’][$i].’ / ‘;
if ($this->arrDisp[‘classcategory_name1’][$i]) {
$arrOrder[$i][0] .= ‘ [ ‘.$this->arrDisp[‘classcategory_name1’][$i];
if ($this->arrDisp[‘classcategory_name2’][$i] == ”) {
$arrOrder[$i][0] .= ‘ ]’;
} else {
$arrOrder[$i][0] .= ‘ * ‘.$this->arrDisp[‘classcategory_name2′][$i].’ ]’;
}
}
$arrOrder[$i][1]  = number_format($data[0]);
$arrOrder[$i][2]  = number_format($data[1]).$monetary_unit;
$arrOrder[$i][3]  = number_format($data[2]).$monetary_unit;

}

$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ”;
$arrOrder[$i][3] = ”;

$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ‘商品合計’;
$arrOrder[$i][3] = number_format($this->arrDisp[‘subtotal’]).$monetary_unit;

$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ‘送料’;
$arrOrder[$i][3] = number_format($this->arrDisp[‘deliv_fee’]).$monetary_unit;

$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ‘手数料’;
$arrOrder[$i][3] = number_format($this->arrDisp[‘charge’]).$monetary_unit;

$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ‘値引き’;
$arrOrder[$i][3] = ‘- ‘.number_format(($this->arrDisp[‘use_point’] * POINT_VALUE) + $this->arrDisp[‘discount’]).$monetary_unit;

$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ‘請求金額’;
$arrOrder[$i][3] = number_format($this->arrDisp[‘payment_total’]).$monetary_unit;

// ポイント表記
if ($this->arrData[‘disp_point’] && $this->arrDisp[‘customer_id’]) {
$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ”;
$arrOrder[$i][3] = ”;

$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ‘利用ポイント’;
$arrOrder[$i][3] = number_format($this->arrDisp[‘use_point’]).$point_unit;

$i++;
$arrOrder[$i][0] = ”;
$arrOrder[$i][1] = ”;
$arrOrder[$i][2] = ‘加算ポイント’;
$arrOrder[$i][3] = number_format($this->arrDisp[‘add_point’]).$point_unit;
}

$this->FancyTable($this->label_cell, $arrOrder, $this->width_cell);
}

function setEtcData() {
$this->Cell(0, 10, ”, 0, 1, ‘C’, 0, ”);
$this->SetFont(‘Gothic’, ‘B’, 9);
$this->MultiCell(0, 6, ‘< 備 考 >’, ‘T’, 2, ‘L’, 0, ”);  //備考
$this->Ln();
$this->SetFont(‘SJIS’, ”, 8);
$this->MultiCell(0, 4, $this->arrData[‘etc1’].”\n”.$this->arrData[‘etc2’].”\n”.$this->arrData[‘etc3’], ”, 2, ‘L’, 0, ”);  //備考
}

function createPdf() {
// PDFをブラウザに送信
ob_clean();
if ($this->pdf_download == 1) {
if ($this->PageNo() == 1) {
$filename = ‘nouhin-No’.$this->arrData[‘order_id’].’.pdf’;
} else {
$filename = ‘nouhin.pdf’;
}
$this->Output($this->lfConvSjis($filename), ‘D’);
} else {
$this->Output();
}

// 入力してPDFファイルを閉じる
$this->Close();
}

// PDF_Japanese::Text へのパーサー
function lfText($x, $y, $text, $size = 0, $style = ”) {
// 退避
$bak_font_style = $this->FontStyle;
$bak_font_size = $this->FontSizePt;

$this->SetFont(”, $style, $size);
$this->Text($x, $y, $text);

// 復元
$this->SetFont(”, $bak_font_style, $bak_font_size);
}

// 受注データの取得
function lfGetOrderData($order_id) {
if (SC_Utils_Ex::sfIsInt($order_id)) {
// DBから受注情報を読み込む
$objQuery =& SC_Query_Ex::getSingletonInstance();
$where = ‘order_id = ?’;
$arrRet = $objQuery->select(‘*’, ‘dtb_order’, $where, array($order_id));
$this->arrDisp = $arrRet[0];
list($point) = SC_Helper_Customer_Ex::sfGetCustomerPoint($order_id, $arrRet[0][‘use_point’], $arrRet[0][‘add_point’]);
$this->arrDisp[‘point’] = $point;

// 受注詳細データの取得
$arrRet = $this->lfGetOrderDetail($order_id);
$arrRet = SC_Utils_Ex::sfSwapArray($arrRet);
$this->arrDisp = array_merge($this->arrDisp, $arrRet);

// その他支払い情報を表示
if ($this->arrDisp[‘memo02’] != ”) {
$this->arrDisp[‘payment_info’] = unserialize($this->arrDisp[‘memo02’]);
}
$this->arrDisp[‘payment_type’] = ‘お支払い’;

//■のし情報②/②
if ($this->arrDisp[‘gift_paper’] != 0) {
$text =’のしの種類:’. $this->arrGIFTPAPER[$this->arrDisp[‘gift_paper’]];
$this->lfText(125, 120, $text, 10);
}
}
}

// 受注詳細データの取得
function lfGetOrderDetail($order_id) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$col = ‘product_id, product_class_id, product_code, product_name, classcategory_name1, classcategory_name2, price, quantity, point_rate’;
$where = ‘order_id = ?’;
$objQuery->setOrder(‘order_detail_id’);
$arrRet = $objQuery->select($col, ‘dtb_order_detail’, $where, array($order_id));
return $arrRet;
}
}
[/php]

(4)■data/class/SC_Fpdfadd.php(お届け先の一覧)

[php]
/**
* PDF お届け先の一覧を出力する
*
* TODO ページクラスとすべき要素を多々含んでいるように感じる。
*/

define(‘PDF_TEMPLATE_REALDIR’, TEMPLATE_ADMIN_REALDIR . ‘pdf/’);

class SC_Fpdfadd extends SC_Helper_FPDI {
function __construct($download, $title, $tpl_pdf = ‘address1.pdf’) {
$this->FPDF();
// デフォルトの設定
$this->tpl_pdf = PDF_TEMPLATE_REALDIR . $tpl_pdf;  // テンプレートファイル
$this->pdf_download = $download;      // PDFのダウンロード形式(0:表示、1:ダウンロード)
// $this->tpl_title = $title; //帳票の種類読み込みのためコメントアウト
$this->tpl_dispmode = ‘real’;      // 表示モード
$masterData = new SC_DB_MasterData_Ex();
$this->arrPref = $masterData->getMasterData(‘mtb_pref’);
$this->arrTitle = $masterData->getMasterData(‘mtb_fpdf’); //帳票の種類読み込み
$this->width_cell = array(110.3,12,21.7,24.5);

$this->tpl_title = $this->arrTitle[$title]; //帳票の種類読み込み

$this->label_cell[] = ‘商品名 / 商品コード / [ 規格 ]’;
$this->label_cell[] = ‘数量’;
$this->label_cell[] = ‘単価’;
$this->label_cell[] = ‘金額(税込)’;

$this->arrMessage = array(
‘このたびはお買上げいただきありがとうございます。’,
‘下記の内容にて納品させていただきます。’,
‘ご確認くださいますよう、お願いいたします。’
);

// SJISフォント
$this->AddSJISFont();
$this->SetFont(‘SJIS’);

//ページ総数取得
$this->AliasNbPages();

// マージン設定
$this->SetMargins(15, 20);

// PDFを読み込んでページ数を取得
$this->pageno = $this->setSourceFile($this->tpl_pdf);
}

function setData($arrData) {
$this->arrData = $arrData;

// ページ番号よりIDを取得
$tplidx = $this->ImportPage(1);

// ページを追加(新規)
$this->AddPage();

//表示倍率(100%)
$this->SetDisplayMode($this->tpl_dispmode);

if (SC_Utils_Ex::sfIsInt($arrData[‘order_id’])) {
$this->disp_mode = true;
}

// テンプレート内容の位置、幅を調整 ※useTemplateに引数を与えなければ100%表示がデフォルト
$this->useTemplate($tplidx);

$this->setShopData();
$this->setMessageData();
$this->setOrderData();
$this->setEtcData();

}

function setShopData() {
// ショップ情報

$objDb = new SC_Helper_DB_Ex();
$arrInfo = $objDb->sfGetBasisData();

// ショップ名
$this->lfText(125, 48, $arrInfo[‘shop_name’], 8, ‘B’);
// URL
$this->lfText(125, 51, $arrInfo[‘law_url’], 8);
// 会社名
$this->lfText(125, 56, $arrInfo[‘law_company’], 8);
// 郵便番号
$text = ‘〒 ‘ . $arrInfo[‘law_zip01’] . ‘ – ‘ . $arrInfo[‘law_zip02’];
$this->lfText(125, 59, $text, 8);
// 都道府県+所在地
$text = $this->arrPref[$arrInfo[‘law_pref’]] . $arrInfo[‘law_addr01’];
$this->lfText(125, 62, $text, 8);
$this->lfText(125, 65, $arrInfo[‘law_addr02’], 8);

$text = ‘TEL: ‘.$arrInfo[‘law_tel01′].’-‘.$arrInfo[‘law_tel02′].’-‘.$arrInfo[‘law_tel03’];
//FAX番号が存在する場合、表示する
if (strlen($arrInfo[‘law_fax01’]) > 0) {
$text .= ‘ FAX: ‘.$arrInfo[‘law_fax01′].’-‘.$arrInfo[‘law_fax02′].’-‘.$arrInfo[‘law_fax03’];
}
$this->lfText(125, 68, $text, 8);  //TEL・FAX

if (strlen($arrInfo[‘law_email’]) > 0) {
$text = ‘Email: ‘.$arrInfo[‘law_email’];
$this->lfText(125, 71, $text, 8);      //Email
}

//ロゴ画像
$logo_file = PDF_TEMPLATE_REALDIR . ‘logo.png’;
$this->Image($logo_file, 124, 36, 40.0);

}

function setMessageData() {
}

function setOrderData() {
$arrOrder = array();
// DBから受注情報を読み込む
$this->lfGetOrderData($this->arrData[‘order_id’]);

// 購入者情報
$text = ‘〒 ‘.$this->arrDisp[‘order_zip01′].’ – ‘.$this->arrDisp[‘order_zip02’];
$this->lfText(23, 18, $text, 11); //購入者郵便番号
$text = $this->arrPref[$this->arrDisp[‘order_pref’]] . $this->arrDisp[‘order_addr01’];
$this->lfText(27, 22, $text, 11); //購入者都道府県+住所1
$this->lfText(27, 26, $this->arrDisp[‘order_addr02’], 10); //購入者住所2
$text = $this->arrDisp[‘order_name01′].’ ’.$this->arrDisp[‘order_name02′].’ 様’;
$this->lfText(27, 32, $text, 12); //購入者氏名

// お届け先の情報 <▼ここから>
$objShip = new SC_Helper_Purchase_Ex();
$this->arrShip = $objShip->getShippings($this->arrDisp[‘order_id’]);

$y = 88; // お届け先開始y軸位置

$count = count($this->arrShip);
$i = 0; // 配列のindex
$j = 0; // 届け先取り出し数

do {
if ($j == $count) {
break;
}
if ($this->arrShip[$i][‘shipping_id’] != ”) {
$y += $j * 4 * 0; // 届け先 * 高さ * 要素数

$y += 4;
$text = ‘〒’. $this->arrShip[$i][‘shipping_zip01’]. ‘-‘ . $this->arrShip[$i][‘shipping_zip02’];
$this->lfText(25, $y, $text, 9);

$y += 4;
$text = $this->arrPref[$this->arrShip[$i][‘shipping_pref’]].$this->arrShip[$i][‘shipping_addr01’].$this->arrShip[$i][‘shipping_addr02’];
$this->lfText(25, $y, $text, 9);

$y += 4;
$text = ‘TEL:’ . $this->arrShip[$i][‘shipping_tel01’]. ‘-‘ . $this->arrShip[$i][‘shipping_tel02’]. ‘-‘ . $this->arrShip[$i][‘shipping_tel03’];
$this->lfText(25, $y+1, $text, 9);

$y += 4;
$text = $this->arrShip[$i][‘shipping_name01’]. ‘ ’ .$this->arrShip[$i][‘shipping_name02’] . ‘ 様’;
$this->lfText(25, $y+2, $text, 9);

if ($this->arrShip[$i][‘shipping_date’] != ” && $this->arrShip[$i][‘shipping_time’] != ”) {
$y += 4;
$text = ‘お届け日/お届け時間:’.substr($this->arrShip[$i][‘shipping_date’],5,2) . ‘月’ . substr($this->arrShip[$i][‘shipping_date’],8,2). ‘日’. ‘ / ‘ .$this->arrShip[$i][‘shipping_time’];
$this->lfText(25, $y+3, $text, 9);
}elseif ($this->arrShip[$i][‘shipping_date’] == ” && $this->arrShip[$i][‘shipping_time’] != ”) {
$y += 4;
$text = ‘お届け日/お届け時間:希望なし / ‘ .$this->arrShip[$i][‘shipping_time’];
$this->lfText(25, $y+3, $text, 9);
}elseif ($this->arrShip[$i][‘shipping_date’] != ” && $this->arrShip[$i][‘shipping_time’] == ”) {
$y += 4;
$text = ‘お届け日/お届け時間:’.substr($this->arrShip[$i][‘shipping_date’],5,2) . ‘月’ . substr($this->arrShip[$i][‘shipping_date’],8,2). ‘日’. ‘ / 希望なし’;
$this->lfText(25, $y+3, $text, 9);
}else{
}

$y += 10;
$text = ”;
$this->lfText(25, $y, $text, 9);

$j += 1;
}

$i += 1;
} while (true);
// お届け先の情報 <▲ここまで>

// お届け先情報
$this->SetFont(‘SJIS’, ”, 10);
$this->lfText(145, 23, SC_Utils_Ex::sfDispDBDate($this->arrDisp[‘create_date’]), 10); //ご注文日

//注文番号(日付+連番)
if(ORDER_NUMBER_DATEPLUS == ‘true’){
$text = substr($this->arrDisp[‘create_date’],2,2).substr($this->arrDisp[‘create_date’],5,2).substr($this->arrDisp[‘create_date’],8,2). $this->arrDisp[‘order_id’];
$this->lfText(145, 29, $text, 10);
}else{
$this->lfText(145, 29, $this->arrDisp[‘order_id’], 10); //注文番号
}

$this->SetFont(‘Gothic’, ”, ”, 12);
$this->lfText(130, 14, $this->tpl_title, 12);  //文書タイトル(納品書・請求書)

$this->Cell(0, 100, ”, 0, 2, ‘R’, 0, ”);
$this->Cell(5, 0, ”, 0, 0, ‘R’, 0, ”);
$this->Cell(0, 16, ”, 0, 2, ”, 0, ”);

$this->SetFont(‘SJIS’, ”, 8);

$monetary_unit = ‘円’;
$point_unit = ‘Pt’;

}

function setEtcData() {
}

function createPdf() {
// PDFをブラウザに送信
ob_clean();
if ($this->pdf_download == 1) {
if ($this->PageNo() == 1) {
$filename = ‘address-No’.$this->arrData[‘order_id’].’.pdf’;
} else {
$filename = ‘address.pdf’;
}
$this->Output($this->lfConvSjis($filename), ‘D’);
} else {
$this->Output();
}

// 入力してPDFファイルを閉じる
$this->Close();
}

// PDF_Japanese::Text へのパーサー
function lfText($x, $y, $text, $size = 0, $style = ”) {
// 退避
$bak_font_style = $this->FontStyle;
$bak_font_size = $this->FontSizePt;

$this->SetFont(”, $style, $size);
$this->Text($x, $y, $text);

// 復元
$this->SetFont(”, $bak_font_style, $bak_font_size);
}

// 受注データの取得
function lfGetOrderData($order_id) {
if (SC_Utils_Ex::sfIsInt($order_id)) {
// DBから受注情報を読み込む
$objQuery =& SC_Query_Ex::getSingletonInstance();
$where = ‘order_id = ?’;
$arrRet = $objQuery->select(‘*’, ‘dtb_order’, $where, array($order_id));
$this->arrDisp = $arrRet[0];
list($point) = SC_Helper_Customer_Ex::sfGetCustomerPoint($order_id, $arrRet[0][‘use_point’], $arrRet[0][‘add_point’]);
$this->arrDisp[‘point’] = $point;

// 受注詳細データの取得
$arrRet = $this->lfGetOrderDetail($order_id);
$arrRet = SC_Utils_Ex::sfSwapArray($arrRet);
$this->arrDisp = array_merge($this->arrDisp, $arrRet);

// その他支払い情報を表示
if ($this->arrDisp[‘memo02’] != ”) {
$this->arrDisp[‘payment_info’] = unserialize($this->arrDisp[‘memo02’]);
}
$this->arrDisp[‘payment_type’] = ‘お支払い’;

}
}

// 受注詳細データの取得
function lfGetOrderDetail($order_id) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$col = ‘product_id, product_class_id, product_code, product_name, classcategory_name1, classcategory_name2, price, quantity, point_rate’;
$where = ‘order_id = ?’;
$objQuery->setOrder(‘order_detail_id’);
$arrRet = $objQuery->select($col, ‘dtb_order_detail’, $where, array($order_id));
return $arrRet;
}
}
[/php]

(5)■data/class/SC_Fpdfmitu.php(見積書)

[php]
(略)
[/php]

(6)■data/class_extends/SC_Fpdf_Ex.php(納品書)

[php]
require_once CLASS_REALDIR . ‘SC_Fpdf.php’;

class SC_Fpdf_Ex extends SC_Fpdf {
}
[/php]

(7)■data/class_extends/SC_Fpdfadd_Ex.php(お届け先の一覧)

[php]
require_once CLASS_REALDIR . ‘SC_Fpdfadd.php’;

class SC_Fpdfadd_Ex extends SC_Fpdfadd {
}
[/php]

(8)■data/class_extends/SC_Fpdfmitu_Ex.php(見積書)

[php]
(略)
[/php]

3 テンプレートpdfの作成

■data/Smarty/templates/admin/pdf

nouhin1.pdf address1.pdf mitumori1.pdf
(有料版には添付されています)

4 ロゴと印鑑枠を削除したいときは下記のいずれかで対応する。

(1)上記のphpファイルから、コードを削除するかコメントアウトする。

[php]
//ロゴ画像
$logo_file = PDF_TEMPLATE_REALDIR . ‘logo.png’;
$this->Image($logo_file, 124, 36, 40.0);

//担当者印
$logo_file = PDF_TEMPLATE_REALDIR . ‘stamp.png’;
$this->Image($logo_file, 155, 74, 35.0);
[/php]

(2)■data/Smarty/templates/admin/pdfフォルダにある画像を削除するか名前を変更する。
logo.png stamp.png

5 ロゴと印鑑枠を編集する場合

(1)logo.pngは、デフォルトのままで、サイズは286×38。右側に75pxほどの余白がある。

(2)stamp.pngのサイズは192×71で、下に1pxの余白がある。余白をとらないと線が表示されない。

(3)PDF上では、logo.pngの場合、「$this->Image($logo_file, 155, 74, 40.0);」とすることで実サイズの40%で表示している。
PDFを拡大・印刷したときの画質を考えてのことだと思う。
「40.0」というのは、「幅.高さ」を表し、高さを0とすることで縦横比を固定している。
画像サイズも含めて編集する場合は、パーセンテージも変更しながら調整する。

印鑑枠に、印鑑画像を付けるには「stamp.png」を編集する。

保存の際、PNGのファイル形式32(透過可能)で保存すると表示されない場合があるので、形式はPNG24以下で保存する。