※ソース内は適時変更、翻訳してご利用ください。
1) 商品情報を編集します
管理の在庫メニューからメンテナンスの製品を選択し、それぞれの製品毎に下記の設定を行います。
厨房側のプリンターで印刷したい商品のプロパティに、
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "https://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="printkb">Kitchen</entry>
<entry key="sendstatus">No</entry>
</properties>
ドリンク側のプリンターで印刷したい商品のプロパティに、
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "https://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="printkb">Bar</entry>
<entry key="sendstatus">No</entry>
</properties>
と記載します。
2) Ticket.Buttons のリソースを追加します
管理のメンテナンスからPOSのリソースを選択し、Ticket.Buttonsを選択します。
<configuration>~</configuration>の中のどこでもいいので、下記を追加します。
<button key="button.sendorder" name="button.sendorder" code="Script.SendOrder"/>
<event key="ticket.addline" code="event.addline"/>
<event key="ticket.removeline" code="event.removeline"/>
<event key="ticket.setline" code="event.setline"/>
<event key="ticket.total" code="event.total"/>
3) Ticket.Line のリソースを追加します
管理のメンテナンスからPOSのリソースを選択し、Ticket.Lineを選択します。
</line>の前の行辺りに下記を追加します。
<column name="label.sendorder" width="5" align="left" value="${ticketline.getProperty('printkb','??')}"/>
<column name="label.sendstatus" width="5" align="left" value="${ticketline.getProperty('sendstatus','??')}"/>
4) ボタンの名前と、カラムの名前を追加します
pcposをインストールしたフォルダ(windowsではProgram Filesの中だったりします) の中より locales フォルダを探し、その中の pos_messages_ja.properties が編集対象ファイルです。
下記を追加します。
button.sendorder=オーダー印刷
label.sendorder=状態
label.sendstatus=オーダー印刷
尚、このファイルはUTF-16ですので、UTF-16にエンコードしてください。
上記の通りであれば、下記のようになります。
button.sendorder=u30aau30fcu30c0u30fcu5370u5237
label.sendorder=u72b6u614b
label.sendstatus=u30aau30fcu30c0u30fcu5370u5237
NetBeansなどでは、編集すると、自動的にUTF-16にエンコードされますので、その後コンパイルしなおして、インストールしなおしてください。
5) 送信ボタンに権限を与えます
管理のメンテナンスからPOSのロールを選択し、送信ボタンを押してもいい権限を与えるグループに下記を追加します。
追加する場所は、<permissions>~</permissions>の間であれば、どこでも問題ありません。
<class name="button.sendorder"/>
6) オーダー印刷のスクリプトを追加します
管理のメンテナンスからPOSのリソースにて、新規作成ボタン(上部のボタンのうち右から三つ目のボタンを押し、Script.SendOrder と入力して、 下の大きな空白に下記のソースを貼り付けます。
// Print an order ticket to the Kitchen & BarDessert
boolean kitchen = false;
boolean bar = false;
boolean change_kitchen = false;
boolean change_bar = false;
for(int i= 0; i < ticket.getLinesCount(); i++){
line = ticket.getLine(i);
// Set Discount(printkb=NULL) to N/A so it does not error on next section.
if (line.getProperty("printkb") == null){
line.setProperty("printkb", "N/A");
}
if (line.getProperty("sendstatus") == null){
line.setProperty("sendstatus", "No");
}
if((line.getProperty("printkb").equals("Kitchen")) && (line.getProperty("sendstatus").equals("No"))){
kitchen = true; //There is something to print to kitchen
}else if ((line.getProperty("printkb").equals("Bar")) && (line.getProperty("sendstatus").equals("No"))){
bar = true; //There is something to print to bar
}else if ((line.getProperty("printkb").equals("Kitchen")) && (line.getProperty("sendstatus").equals("Cancel"))){
change_kitchen = true; //There is something to change for kitchen
}else if ((line.getProperty("printkb").equals("Bar")) && (line.getProperty("sendstatus").equals("Cancel"))){
change_bar = true; //There is something to change for bar
}
}
if ((change_kitchen && kitchen) || (change_kitchen && !kitchen)) {
sales.printTicket("Printer.TicketChange_Kitchen"); //Print changed kitchen items to kitchen printer
}
if ((change_bar && bar) || (change_bar && !bar)) {
sales.printTicket("Printer.TicketChange_Bar"); //Print changed bar items to bar printer
}
if (kitchen && !change_kitchen) {
sales.printTicket("Printer.TicketKitchen"); //Print kitchen items to kitchen printer
}
if (bar && !change_bar) {
sales.printTicket("Printer.TicketBar"); //Print bar items to bar printer
}
//Show a nice message for confirmation
if (kitchen && bar){
javax.swing.JOptionPane.showMessageDialog(null, "Your order has been sent to the Kitchen & Bar.");
} else if (kitchen && !bar){
javax.swing.JOptionPane.showMessageDialog(null, "Your order has been sent to the Kitchen only.");
} else if (!kitchen && bar){
javax.swing.JOptionPane.showMessageDialog(null, "Your order has been sent to the Bar only.");
} else if (change_kitchen || change_bar){
javax.swing.JOptionPane.showMessageDialog(null, "Your cancelled items have been sent.");
} else {
javax.swing.JOptionPane.showMessageDialog(null, "There is nothing new to send.", "Print Warning", JOptionPane.WARNING_MESSAGE);
}
//Set printkb property of item to Yes so it is not printed again
for(int i = ticket.getLinesCount()-1; i>= 0 ; i--){
line = ticket.getLine(i);
String a = line.getProperty("sendstatus");
String b = "Cancel";
if(((line.getProperty("printkb").equals("Kitchen")) || (line.getProperty("printkb").equals("Bar"))) && (line.getProperty("sendstatus").equals("No"))){
line.setProperty("sendstatus", "Yes");
}
//Remove cancelled lines
if (a.equals(b)) {
ticket.removeLine(i);
}
}
7) event.addline のリソースを追加します
管理のメンテナンスからPOSのリソースにて、新規作成ボタン(上部のボタンのうち右から三つ目のボタンを押し、event.addline と入力して、 下の大きな空白に下記のソースを貼り付けます。
//Remove nulls for unknown products
if (line.getProperty("printkb") == null){
line.setProperty("printkb", "N/A");
}
//No need to send unknown products anywhere
if (line.getProperty("sendstatus") == null){
line.setProperty("sendstatus", "Yes");
}
8) event.removeline のリソースを追加します
管理のメンテナンスからPOSのリソースにて、新規作成ボタン(上部のボタンのうち右から三つ目のボタンを押し、event.removeline と入力して、 下の大きな空白に下記のソースを貼り付けます。
// Set SendStatus and print removals
line = ticket.getLine(index);
//Remove nulls for unknown products
if (line.getProperty("printkb") == null){
line.setProperty("printkb", "N/A");
}
//No need to send unknown products anywhere
if (line.getProperty("sendstatus") == null){
line.setProperty("sendstatus", "No");
}
String a = line.getProperty("sendstatus");
String b = "Yes";
String c = "No";
Integer myCount = 0;
//get count of auxiliar after the main product
for (i = index+1; i < ticket.getLinesCount(); i++) {
if (ticket.getLine(i).isProductCom()){
myCount = myCount + 1;
}else{
break;
}
}
//Set SendStatus of sent items to Cancel
if (a.equals(b) && !line.isProductCom()) {
for (i = index + myCount; i>= index ; i--) {
if (ticket.getLine(i).isProductCom() && ticket.getLine(i).getProperty("sendstatus").equals("Yes")){
ticket.getLine(i).setProperty("sendstatus", "Cancel");
}else if (ticket.getLine(i).isProductCom() && ticket.getLine(i).getProperty("sendstatus").equals("No")){
ticket.removeLine(i);
}else{
break;
}
}
line.setProperty("sendstatus", "Cancel");
}
//Removelines of NOT sent items
if (a.equals(c) && !line.isProductCom()) {
for (i = index + myCount; i>= index ; i--) {
if (ticket.getLine(i).isProductCom()){
ticket.removeLine(i);
}else{
break;
}
}
ticket.removeLine(index);
}else if (a.equals(c) && line.isProductCom()) {
ticket.removeLine(index);
}
//Cancel event
removeLine.cancel=true;
9) event.setline のリソースを追加します
管理のメンテナンスからPOSのリソースにて、新規作成ボタン(上部のボタンのうち右から三つ目のボタンを押し、event.setline と入力して、 下の大きな空白に下記のソースを貼り付けます。
// Set Discount(printkb=NULL) to N/A so it does not error on next section.
if (line.getProperty("printkb") == null){
line.setProperty("printkb", "N/A");
}
if (line.getProperty("sendstatus") == null){
line.setProperty("sendstatus", "No");
}
//Stop the line modification of sent products
if (!line.getProperty("sendstatus").equals("No")){
JOptionPane.showMessageDialog(null,
"You cannot modify a sent item.",
"Error",
JOptionPane.ERROR_MESSAGE);
}else{
ticket.setLine(index, line);
}
cancel=true;
10) event.total のリソースを追加します
管理のメンテナンスからPOSのリソースにて、新規作成ボタン(上部のボタンのうち右から三つ目のボタンを押し、event.total と入力して、 下の大きな空白に下記のソースを貼り付けます。
//Stop payment when all items not sent
for(int i= 0; i < ticket.getLinesCount(); i++){
line = ticket.getLine(i);
// Set Discount(printkb=NULL) to N/A so it does not error on next section.
if (line.getProperty("printkb") == null){
line.setProperty("printkb", "N/A");
}
if (line.getProperty("sendstatus") == null){
line.setProperty("sendstatus", "No");
}
if(line.getProperty("sendstatus").equals("No") || line.getProperty("sendstatus").equals("Cancel")){
mySent = "No";
}
}
if (mySent == "No"){
javax.swing.JOptionPane.showMessageDialog(null, "You must Send all items to Kitchen and/or bar before payment", "Send Warning", JOptionPane.WARNING_MESSAGE);
return "Cancel";
}else{
return null;
}
11) 厨房用とドリンク用のチケットを作成します
管理のメンテナンスからPOSのリソースにて、新規作成ボタン(上部のボタンのうち右から三つ目のボタンを押し、Printer.TicketKitchen と入力して、 下の大きな空白に下記のソースを貼り付けます。
同様にPrinter.TicketBarも、Kitchen と記載してあるところを、Bar に変更し、作成します。
<?xml version="1.0" encoding="UTF-8"?>
<!--
Openbravo POS is a point of sales application designed for touch screens.
Copyright (C) 2008 Openbravo, S.L.U.
https://sourceforge.net/projects/openbravopos
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-->
<output>
<display>
<line>
<text align="left" length="10">Order sent to Kitchen</text>
<text align="right" length="10">${ticket.printTotal()}</text>
</line>
<line>
<text align="center" length="20">Thank you.</text>
</line>
</display>
<ticket printer = "2">
<line></line>
<line></line>
<line>
<text align="center" length="42">Kitchen Order</text>
</line>
<line></line>
<line>
<text align="left" length="15">Receipt:</text>
<text>${ticket.printId()}</text>
</line>
<line>
<text align="left" length="15">Date:</text>
<text>${ticket.printDate()}</text>
</line>
#if ($ticket.getCustomer())
<line>
<text align="left" length="15">Customer:</text>
<text>${ticket.getCustomer().getName()}</text>
</line>
<line>
<text align="left" length="15"></text>
<text>${ticket.getCustomer().getTaxid()}</text>
</line>
#end
#if ($place != "")
<line>
<text align="left" length="15">Table:</text>
<text>${place}</text>
</line>
#end
<line></line>
<line>
<text align ="left" length="17">Item</text>
<text align ="right" length="5"></text>
</line>
<line>
<text>------------------------------------------</text>
</line>
#foreach ($ticketline in $ticket.getLines())
#if (($ticketline.getProperty("printkb").equals("Kitchen")) && ($ticketline.getProperty("sendstatus").equals("No")))
<line>
<text align ="left" length="5" bold="true">${ticketline.printMultiply()}x</text>
#if ($ticketline.isProductCom())
<text align ="left" length="37">--${ticketline.printName()}</text>
#else
<text align ="left" length="37" bold="true">${ticketline.printName()}</text>
#end
</line>
#end
<!-- Add the following lines only for 2.30 Attributes -->
#if ($ticketline.productAttSetInstId)
<line>
<text align ="left" length="42">
${ticketline.productAttSetInstDesc}</text>
</line>
#end
<!-- Add the previous lines only for 2.30 Attributes -->
#end
<line>
<text>------------------------------------------</text>
</line>
<line>
<text align="left" length="15">Cashier:</text>
<text>${ticket.printUser()}</text>
</line>
</ticket>
</output>
上記同様に Printer.TicketChange_Kitchen と Printer.TicketChange_Bar を作成します。Kitchen と Bar は入れ替えて作成してください。
<?xml version="1.0" encoding="UTF-8"?>
<!--
Openbravo POS is a point of sales application designed for touch screens.
Copyright (C) 2008 Openbravo, S.L.U.
https://sourceforge.net/projects/openbravopos
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Ticket for changing a Sent Kitchen Order
-->
<output>
<display>
<line>
<text align="left" length="10">Change Sent</text>
<text align="right" length="10">${ticket.printTotal()}</text>
</line>
<line>
<text align="center" length="20">Thank you.</text>
</line>
</display>
<ticket printer = "2">
<line></line>
<line></line>
<line size="1">
<text align="center" length="42" bold="true">Changed Kitchen Items</text>
</line>
<line></line>
<line>
<text align="left" length="15">Receipt:</text>
<text>${ticket.printId()}</text>
</line>
<line>
<text align="left" length="15">Date:</text>
<text>${ticket.printDate()}</text>
</line>
#if ($ticket.getCustomer())
<line>
<text align="left" length="15">Customer:</text>
<text>${ticket.getCustomer().getName()}</text>
</line>
<line>
<text align="left" length="15"></text>
<text>${ticket.getCustomer().getTaxid()}</text>
</line>
#end
#if ($place != "")
<line>
<text align="left" length="15">Table:</text>
<text>${place}</text>
</line>
#end
<line></line>
<line>
<text align ="left" length="17">Item</text>
<text align ="right" length="5"></text>
</line>
<line>
<text>------------------------------------------</text>
</line>
#foreach ($ticketline in $ticket.getLines())
#if (($ticketline.getProperty("printkb").equals("Kitchen") && $ticketline.getProperty("sendstatus").equals("Cancel"))||($ticketline.getProperty("printkb").equals("Kitchen") && $ticketline.getProperty("sendstatus").equals("No")))
<line> #if ($ticketline.getProperty("sendstatus").equals("No"))
<text align ="left" length="7" bold="true">Add</text>
#else
<text align ="left" length="7" bold="true">${ticketline.getProperty("sendstatus")}</text>
#end
<text align ="left" length="5" bold="true">${ticketline.printMultiply()}x</text>
#if ($ticketline.isProductCom())
<text align ="left" length="30">--${ticketline.printName()}</text>
#else
<text align ="left" length="30" bold="true">${ticketline.printName()}</text>
#end
</line>
<!-- Add the following lines only for 2.30 Attributes -->
#if ($ticketline.productAttSetInstId)
<line>
<text align ="left" length="42">
${ticketline.productAttSetInstDesc}</text>
</line>
#end
<!-- Add the previous lines only for 2.30 Attributes -->
#end
#end
<line>
<text>------------------------------------------</text>
</line>
</ticket>
</output>
厨房用にプリンター2が設定されていて、ドリンクにプリンター3が設定されている場合などは、<ticket printer = "2">の部分を適時、<ticket printer = "3">と変えてください。
逆の場合も同様に変更してください。
レジにレシートプリンターが1台、厨房に1台、ドリンクに1台あると、別々に印刷することが可能です。