This is the last bundle before we'll come out with POSper 2.0
For installation instructions please refer to the readme file supplied in the bundle.
The following paragraphs describe all changes made since the last bundle which was revision 852.
If you have an existing POSper database scroll down to the last paragraph for upgrade instructions.
Rev 1021 fixes a problem that had prevented installing with creating a new database.
Enjoy
Your POSper Team
h1. Change history
The following paragraphs list the changes made to POSper since revision 852 which was the latest bundle.
Changes are grouped by subject. The full list of changes can still be found in the [[Changelog]].
The last paragraph lists all changes that have to be made to an existing database conforming to revision 852.
h2. GUI and operation
* Replaced button texts by icons
* Different background color for order button panel
* Split button removed for 'simple' mode
* Removed 'Table' button from split panel when in 'standard' mode
* New option 'Price Entry In Cents' causes POSper to interpret price values in the sales panel
as 100ths of the currency unit. The dot key is replaced by a 00 key.
* Price Entry In Cents is now also active in the payment dialogs for cash, check, ticket, and paper.
* Payment must not present 'Return' when total is zero.
* Limit for tendered amount. If the tendered amount exceeds 5000 a warning appears (this
can happen when an item is moved over the scanner while the payment dialog is open
causing a big tendered amount and committing the payment)
* Trying to re-login using the left hand user button instead of the user button in the bottom panel
indicating that a user is logged in now issues a message.
* deactivate buttons _Add to category_ and _Remove from category_ in CategoryEditor
* added membercard support to restaurant table view: swiping the card opens the place assigned to the customer.
* Opening 'Close Cash' automatically opens the cash drawer if the count cash option is active.
If the count cash option is not active a button 'Open Drawer' is shown in the close cash view.
* Products editor: moved tax entry field up to preceed the sell price entry fields
* In products edit the start category is set as the default category for a new product
(the last entered value is remembered), the buy price defaults to 0 (issue #97).
h2. Customer Display
* Added timer for customer display to output to be replaced
by the startup message after a given time after closing a transaction
* Revised behaviour for empty or missing lines in "Printer.Start"
When line1 or line2 is empty, the line will not be displayed.
When line1 or line2 are missing, the existing line will be displayed as line1 while
line2 will show a clock.
When both lines are missing or the template can otherwise not be parsed successfully, the standard
output will be displayed - standard output is the text defined in the maessage file for the key "Visor.Title"
in line1 and the clock in line2.
* Customer formatter now returns NULL instead of empty strings to facilitate existence checks in Velocity (issue #87)
* In Restaurant mode and Enjoy mode, 'Show Display On Close Of Transaction' will show
the customer display in an own dialog. 'OK' returns to the restaurant map.
h2. Modifiers
* added support for selling units by scanning one item and touching a unit function key
* product modifiers will be activated only once (when the product is added)
* new modifier function discountX(int rateInPercent). This function works like discount(rate) but takes the price to
apply the discount to from the ticketlines priceSell rather than from the associated products priceSell. There are some
ramifications to consider when this function is used:
If the line was modified before by another discount modifier the result is a stacked discount.
If the line will be modified afterwards by another modifier, the latter will define the result depending
on its type: if its a simple discount() the price will again be taken from the products price.
I.e, the order in which modifiers are evaluated is essential. You can define the evaluation order by rearranging
the order in which modifiers are defined in "Ticket.Modifiers". While id's must still start with 0 and the numbering
must be gapless (and the mask must be the id to the power of two) the order in which the modifier definition
lines appear in the template is arbitrary and defines the order of evaluation.
* The Modifier template can now have missing indexes and an arbitrary line order.
Modifier#getNames() no longer returns Null when indexes are missing
Modifies#getModifierIndices is now independent from the modifier id
* Modifiers are now evaluated in all sales scenarios for customers
* Added modifier support for customer groups (issue #15):
a customer group mask will be evaluated only if the cusomer mask is 0, i.e. a customer modifier
mask takes always precedence. The precedence is not checked for single modifiers, only for the mask.
* Modifiers fo customers and customer groups can now be set in the respective editors (issues #89, #90)
* Modifier function addComProducts() can be called with the string "FROM_PRODUCT"
as an argument. When a product is added with an active modifier calling
addComProducts("FROM_PRODUCT"), POSper looks for the code string defing the
com products to be added in the field posper_product.unitType. The syntax for the
code string is
barcode[,number_of_items][; ...]
* Modifiers discount(), discountX(), and priceShift() can take a second parameter
with string representing a unix-like cron expression. The modifier is only activated
when the curent date and time satisfies the cron expression.
* new modifier functions discount(double rate, int cent) and discountX(double rate, int cent)
which rounds the ticketline total to the nearest cent value.
* Changed concept of time controlled modifiers: instead of modifier functions defining a time
controlled constraint a modifier can now define an attribute cron="<cron-expressions>".
"cron-expressions" can either be a series of semicolon-separated cron-expressions or a
reference to a timer resource. A timer resource can be defined as a text resource with the
name "Timer.<name>". The timer resource must contain a single line with semoicolon-separated
cron expressions.
The modifier functions priceShift(price, timer-expression), etc. have been removed.
* added specialPrice() modifier function
* added buy price modification to modifier function specialPrice() (#149)
* The modifier function specialPrice() now checks date_from and date_to rather than
the timer entry (solves #311)
* new modifier functions buyNgetOnefree and buyNmodifyNext, see [[Modifier_Functions]]
h2. Assign customers to tickets
* Added customer drop down list to JPanelTicket, i.e. customer selection is now available
in all sales situations.
* Added customer selection button to JPanelTicket to allow selecting a customer using filters
or a card reader.
* Customer assignment can be reset to 'no customer' by choosing 'Cancel'
* Added card support to customer filter
h2. Split and move
* splitting from Retail and moving the split part to a table is now possible
* Modifications and additions in rights management:
* Ticket split now always moves the whole line if the amount is not an integer, also when
only moving a unit was requested. This makes more sense because a non integer amount indicates
either a scale product or a multiplier for a generich product with price 1.0.
* Ticket split now supports com product lines:
">>" shifts a complete line with all associated com products. Equal products will not be
consolidated.
">" shifts one item. Com items must be shifted separately. The new line can be incremented as
long as it is the last line in the list.
* Revised split
* fixed another split problem; handling of com lines is now as described in the WIki (however,
moving one item of a line with respective com lines is not yet possible)
* FIxed another ticket split problem where subsequent products having the same com product caused the
com products of different products to be consolidated.
* Com products are not allowed to be moved as stand-alone items in a split. I.e. if a com product
is selected and the other ticket is still empty nothing happens (solves #308)
* Revised split algorithm
set SPLIT flag in a transaction with lock for update
wrap the rest of the operation in one transaction
warning when split has failed
* Revised move algorithm
new method joinTicket() in PlaceContainer
* Ticket status NORMAL, SPLIT (introduce status field for ticket)
* mark other hosts tickets with split flag yellow
* renamed PlaceContainerMulti to PlaceContainerEnjoy. PlaceContainer has been
redesigned to allow multiple tickets.
introduced loadTickets() (former getTickets in PlaceContainerMulti)
revised setTicket()
indicate locked tickets
set place properties: show number of ticket and total, mark yellow if in split
h2. User permissions
* added Menu.TicketPerms (Ticket Permissions) visible in Roles
* changed key for Delete Ticketline from Perm.TicketDelete to Perm.LineDelete
* added permissions for F1 to F5 (keys Perm.F1 - Perm.F5)
* added permission to filter customers (key Perm.FilterCustomer)
* added permission to use plus and minus (keys Perm.Plus, Perm.Minus)
* added permission to edit ticketline (key Perm.EditTicketline)
* added permission to delete Ticket (key Perm.TicketDelete)
h2. Ticket editing
* Free price entry with category name can now use a multiplier (issue #54), e.g. 3 * 2 . 4 <Diverse> results in
3 times the amount of 2.40 with a description 'Diverse' when <Diverse> is a category button. The option
"Free price entry with category name" must be set for this to work
* Retail tickets can be moved to a table in coffeeshop mode.
h2. Configuration and devices
* Added the option to define a speed other than 9600 for serial and rxtx communication. To set a diiferent speed
append &<speed> to the port parameter in the device options, e.g. "/dev/ttyS0&115200". Note that despite the drop
down list this field can still be edited manually.
* Added a customer display entry "epsoncomp" which works like "epson" but uses a software timer to display
a clock. Also "8034" and "8035" can now both use the software timer.
* new scale driver ScaleKernRPB to support balances of type Kern series RPB
* new printer driver "seiko" for SEIKO LTPDx47 or CAPDx47 series printers
* added 'standard-rs232' to scanner options in config
* standard-rs232 is functional in JPanelTicket but must still be tested with proper HW (RXTX delivers garbled
input when using a BigTec USB to serial adapter to connect a Symbol LS1203. Port parameters are:
9600, 8N1, no flow control; can be adapted on request.
* New config property clearInputFields to keep current values when a new record is inserted
(can be set/unset in the respective dialogs, currently products and places).
* displayOrder=0 for a product prevents the product from being displayed in the catalog.
* Added displayOrder to Category (made editable). Null values are shown last.
'0' hides the category.
* Place editor now sets defaults for table width, height, x position, and y position when a field is left empty
* Reinitialize printers on login
* Finally fixed scale port problem. Explicitely close port on parse errors (i.e. scale could be switched
off), issue a warning, and try to re-open.
* Choosing 'serial' or 'rxtx' now make a difference in the use of the underlying library. PrinterWritterComm will use javax.comm instead of the rxtx library gnu.io.
This applies to printers and customer displays. Please refer to the readme file for details if you want to use 'serial' instead of rxtx. Note, that the comm-3.0-u1.jar is necessary but not yet included in the current libs. Drop me a note if you need it.
* Barcode Scanner can now be attached via RS232 (choose scanner rs232 standard, for
port parameters see below)
* Printer and display mode 'rxtx' can set flow control. Flow control can only be set in
conjunction with the speed parameter using the following syntax in 'port':
@portname&speed&flow_control@ where @flow control@ is meaningfully composed of
the follwing values (default is NONE):
<pre>
NONE = 0;
RTSCTS_IN = 1;
RTSCTS_OUT = 2;
XONXOFF_IN = 4;
XONXOFF_OUT = 8;
</pre>
Example:
@/dev/ttyUSB0&9600&3@ defines port /dev/ttyUSB0 with 9600 baud and HW flow control for in and out transfer.
The port parameter of a rs232-standard barcode scanner can also be defined that way.
* added tare feature: A list of tare weights can be maintained and tare weights can be assigned to products.
When the product is weighed the tare value will be automatically subtracted. A tare button allows
to reassign the tare value when e.g. the customer has chosen the wrong dish to collect his or her salad.
* log levels WARNDIALOG, DEBUG, and ALL activate warning dialogs on BasicExceptions
* Product displayOrder: fixed SQL to sort nulls last
("order by isnull(displayOrder), displayOrder") is the easy solution
* Categories are not checked for active products any more. It must be manually
configured if a category shall be displayed.
* introduced the option 'Print Audit Ticket' to activate printing a ticket on
audited changes. This now works in all modes.
h2. Cancelled tickets
* assign cancelled tickets and payments to cahs register "CANCELLED_TICKETS_<host>" rather
than delete them.
* added isCancelled() to TicketFormatter
* isCancelled() is checked and reported in Printer.TicketCopy.
* exclude deleted tickets from closed products report
* Edit sales issues a warning when a cancelled ticket is shown and editing is deactivated. To print
a 'cancelled' remark on the ticket copy the boolean TicketFormatter function isCancelled() may be used.
For existing templates: to see in Edit Sales if a ticket has been cancelled you can insert the following into Printer.TicketCopy
<pre>
#if ($ticket.isCancelled())
<line>
<text align="center" length="42">CANCELLED</text>
</line>
#end
</pre>
h2. New fields
* introduced priceSell_1 and priceSell_2 in class Products
* ProductEan is a new entity providing a list of codes which is associated to one Product.
This allows to associate multiple barcodes to a single product. There is no maintenance
interface in POSper (handled in POSper Backoffice).
An option 'Allow Multiple codes for one product' activates the feature.
* Added a new property "priceSell" to StockDiary to enable extended sales statistics (solves #251)
Important: There is a change in concept. While the "price" had been used for both the priceBuy
and the priceSell depending on the stock movement reason it is now always used for priceBuy.
"priceSell" and "price" (i.e. priceBuy) are both populated on any sales and refund transaction.
* added table posper_specialprice
* added property @active@ to Customer to allow disabling customer entries. If a customer is inactive the entry will not be shown in the tickets drop down list and in the customer filter. Swiping the card of an inactive customer will produce an error message.
* new field prep_time (SMALLINT) in posper_product and posper_category
* new table posper_course to allow named meal course assignments in restaurant mode
* new field course (TINYINT) in table posper_product
* new fields status (TINYINT), course (TINYINT), user_id (VARCHAR), created_at (DATETIME),
updated_at (DATETIME) in posper_ticketline
h2. Templates and formatters
* new method getCompanyData(String element) added to TicketFormatter.
This function can be used in any ticket templates where the
$ticket variable is available. It retrieves the element values as defined in
CompanyData.xml. The default templates must still be adapted to make use of
this function.
* TicketFormatter#getModifiers(line) now returns the names of the modifiers like set in the
current ticket line (as opposed to the currently active modifiers)
* added 'getCompanyData()' to German templates
* Default template fixes to suppress output when certain amounts are null (#285)
* Resources are now automatically reloaded from the default template folders when they
have been deleted from the database. This allows to easily reset the templates in
a working condition if there are xml parsing errors after changes have been made
(solves #261)
* Adapted default templates to make use of getCompanyData().
* New methods in TicketFormatter: printsSubTotal, printSubTotalByTax, printTotalByTax,
printsTotalByTax
* New methods in PaymentFormatter: getAmount, printAmount, printsAmount, getComment, getSerial.
* getCompanyData included in PaymentsModel to be used in the Printer.CloseCash template
* Improved default templates (more space for totals, subtotals by tax) and revised the printout of
payment information (solves #302)
* Templates now correctly load with UTF-8 (e.g. German Umlaute) alo under windows
(posper.exe must be exchanged, #332)
* New function TicketFormatter#printDateClose to replace the now deprecated function printReceiptClose.
printDateClose can take a SimpleDateFormat pattern and up to three String parameters to define the
desired Locale like in new Locale(language, country, variant). Called without parameters the default
DateTime format like in printReceiptClose is used (solves #350)
* New methods in CustomerFormatter to access all customer fields (#373)
* added CODE128 support for printing barcodes (type="CODE128" attribute is recognized
for ESC/POS printers and screen)
* added German account numbers (DATEV-Kontenrahmen) to template Payment.Types
* XML meta charcters can now be used in CompanyData when they are properly escaped.
* Templates defining table layouts (like e.g. Ticket.Line) can now use plain names for the column name. If the
column name string is not found in the i18n properties file the string itself is used.
* added setStatusPreparing to TicketLineFormatter
* added setStatusServing to TicketlineFormatter
* TicketFormatter#printHost() returns the hostname string like defined in config
* printHost() added to TicketFormatter
* Swiss money file for cash count added
* New format options for ticket printing allow adapting of the output to
e.g. an A4 printer (see #372).
* new class DateFormatter
* added printPlace and printpdatedAt to TicketLineFormatter
h2. Barcode recognition
* Items with an EAN press code are recognized for German press items. Two products must be
defined: one with code=419 and the tax rate 0.07 and one with code=414 and the tax rate 0.19
(current tax rates). The priceSell must be 0.0. The real price is parsed from the ean code.
* Added warning message when a scanned product cannot be found in the databse.
* Improved barcode scanning performance
* ignore scan codes starting with '290')
* disable keyboard when 'Article not found' to avoid that scanning the next article triggers 'OK'
which leads to ignoring the next article when the OK button has not been pressed on the monitor
(solves #555)
h2. Stock management
* StockDiaryEditor can now handle multiple EANs (see option use multiple eans).
StockManagement can now handle multiple EANs (see option use multiple eans).
StockDiaryEditor issues a warning if a search by reference finds more than one record.
A message is issued if no product is found by code (ean) in StockManagement
A message is issued if no product is found by code (ean) or by reference in StockDiaryEditor
(solves #179)
* Modifiers will also be saved in the stockdiary records to allow for better statistical evaluation.
Reports
* Built in reports now also pass the time in the DATESTART and DATEEND parameters. The
reports have been adapted accordingly
* added gross values to product sales report, fixed rounding procedure
* french translations for reports
h2. Performance improvements
* Performance improvements in searching for empty categories. It's not necessary to show empty categories
any more even with a big number of products (solves #313)
* Performance improvements in showing the products list in the products editor (setter methods
are obviously sensitive to additional coding, solves #313)
* Performance improvements by way of cleaning up ItemButton.java (solves #313)
* a print job using the Printer.OpenDrawer template is created as soon as a ticket has been closed. Tickets
with a large number of lines could delay opening the drawer due to stock processing etc.
* changed calculation of ordered products for the kitchen view to a more performant method.
Instead of querying the DB the sum is calculated from the displayed table lines and set as
a transient value for each line before redisplaying them.
h2. Kitchen view
* Kitchen View implemented as described in the manual section kitchen view (available when officially released)
** JPanelKitchen: the Kitchen View panel
** KitchenPrinter to print one single line based on the KitchenLineFormatter
** Printer.TicketKitchen template for KitchenPrinter
** Printer.TicketVoucher template to print food and beverage orders from the sales view directing food orders
to the Kitchen View
** TicketLinesOrdered and TicketLinesSelected template to define the layout of the kitchen view.
** JKitchenLines panel to present tables like incoming and selected orders based on the respective templates.
** JPanelPrinter: fixed an unsupported operation exception
** KitchenTableModel: table model for JKitchenLines
** KitchenLineFormatter: extends TicketLineFormatter with getCourse, getPlace, and getTotalPerProductOrdered
** TicketFomatter: new methods getKitchenLines and getPlace (for convenience)
** TicketLineFomatter: new methods printCreatedAt, setStatusOrdered, printStatus, and hasAccountingLevels
* Kitchen View warning levels configuration in Ticket.LinesOrdered.xml.
* The kitchen view can be configured to show a warning when incoming orders are not processed in a certain time.
Two warning levels exist to show the date field with yellow background (level 1) or red background (level 2).
* Edit timer to automatically deactivate the Kitchen View Edit button
* I18n of kitchen view messages
h2. Operation mode _enjoy_
* Added operation mode enjoy
* Enjoy mode has new PlaceContainerMulti to allow more than one ticket per place.
* A ticket list opens when a place with more than one tickets assigned is opened and a ticket can be selected.
* Move and split are not allowed in Enjoy mode
* Check ticketlines for status before invoking payment select (enjoy mode)
* always return to restaurant map after closing a sale (enjoy mode)
* ask if a new ticket shall be created when opening an empty place (enjoy mode)
* invoice payment is deactivated for anonymous customers.
h2. Notification view
* Notification view to indicate alert messages like missing heartbeat signals.
h2. Print server
* removed print server from web services (this is now available as a stand-alone service).
The now removed implementation had a serious problem with Hibernate sessions being not thread safe.
h2. Close transaction dialog improvements
* New payment method 'Invoice' creates a payment record with method 'invoice'. This allows
to register sales for which an invoice will be issued at a later point of time. It is the
responsibility of the user to create the invoice. Creating invoices will be possible
with POSper Backoffice.
'Invoice can only be selected if a customer has been assigned to the ticket.
* The payment method 'Ticket' (coupons) used to register the amount typed in as tendered. This
went well as long as the amount was even or less than the required total (a lesser amount
being completed with cash). If the tendered amount is greater than the total we have a difference
between the registered revenue and the intake of money. This happens when coupons are issued
which shall always be registered with the full amount even if the sales value is less (leaving
the remaining amount void). To solve the problem a second payment record is created
with method 'ticketremain' to register this difference.
* Which payment methods are shown in the close transaction dialog is now dependent of user rights.
h2. Payment view improvements
* Opening 'Payments' view now triggers opening the cash drawer.
* The 'Payments' view now has a button 'Print Receipt' to create a receipt with the list of
newly added payments using the template Printer.Payments'. This template can use the
variables $payments and $comapny.
$payments yields a list of payment formatters.
$company yields the methods printElement(element_name), printHost(), and printDate(sdf_pattern).
h2. Database changes
To upgrade an existing database from POSper Rev 852 to work with Rev xxx the following database
changes must be performed.
POSper Backoffice always provides migration procedures to updatethe database.
If you can't use the migration provided by POSper Backoffice, statements listed below have been
created for and tested with MySQL.
h3. Add fields units and unitType
The fields @units@ and @unitType@ must be added to posper_product
<pre>
ALTER TABLE `posper_product` ADD COLUMN `units` DOUBLE NULL DEFAULT 0 AFTER `tax_id` , ADD COLUMN `unitType` VARCHAR(255) NULL AFTER `units` ;
UPDATE `posper_product` SET UNITS=0;
</pre>
h3. Add permissions
<pre>
# insert new permissions
insert into posper_permission set name='Menu.TicketPerms', parent_name='Menu.Root';
insert into posper_permission set name='Perm.F1', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.F2', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.F3', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.F4', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.F5', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.EditTicketline', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.FilterCustomer', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.LineDelete', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.Minus', parent_name='Menu.TicketPerms';
insert into posper_permission set name='Perm.Plus', parent_name='Menu.TicketPerms';
# Perm.TicketDelete is now in group Perms.TicketPerms and is now correcly for ticket instead of ticketline
# rename permission Perm.TicketDelete in role_permission
update posper_role_permission set permissions_name='Perm.LineDelete' where permissions_name='Perm.TicketDelete';
update posper_permission set parent_name='Menu.TicketPerms' where name='Perm.TicketDelete';
# update the schema version
update posper_property set value='856' where property_key='posper.schema';
</pre>
Don't confuse the order of the first two blocks of statements to avoid hurting constraints.
h3. Add the fields priceSell_1 and priceSell_2 to posper_product
Type is DOUBLE (MySQL) or float.
h3. posper_productean
you must create a new table posper_productean with the followng fields:
<pre>
id (varchar 255, primary)
version (int, not null)
ean (varchar 255)
product_id (varchar 255, not null)
</pre>
Add a foreign key on product_id referencing id in posper_product
Add an index on ean.
To move existing barcodes from posper_product to the new table you can use the (mysql) statement
@insert into posper_productean select uuid(), 0, code, id from posper_product;@
h3. Insert the column priceSell, Double into posper_stockdiary
e.g. in MySQL:
@ALTER TABLE posper_stockdiary ADD COLUMN priceSell DOUBLE NULL;@
h3. Create the table posper_specialprice
The CREATE statement in MySQL is:
<pre>
CREATE TABLE `posper_specialprice` (
`id` varchar(255) NOT NULL,
`version` int(11) NOT NULL DEFAULT '0',
`product_id` varchar(255) NOT NULL,
`priceSell` double DEFAULT NULL,
`priceBuy` double DEFAULT NULL,
`timer` varchar(255) DEFAULT NULL,
`date_from` datetime DEFAULT NULL,
`date_to` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK_special_price_product` (`product_id`),
CONSTRAINT `FK_special_price_product` FOREIGN KEY (`product_id`) REFERENCES `posper_product` (`id`)
)
</pre>
h3. Add the column 'modifiers', type 'Integer' to posper_stockdiary
E.g. in MySQL with
@ALTER TABLE posper_stockdiary ADD COLUMN modifiers INTEGER(11) NULL;@
h3. Remove trigger snum from posper_product
This trigger increments CashRegister.serialnr by host. The trigger is now obsolete because POSper increments the serial number.
h3. Add a boolean column 'active' to posper_customer
E.g. in MySQL perform
<pre>
ALTER TABLE posper_customer ADD COLUMN active TINYINT(1) NULL DEFAULT 1;
</pre>
h3. Add a string column 'tare_id' to posper_product
and create a new table posper_tare. Also, a permission must be created to maintain the tare values.
E.g. in MySQL perform:
<pre>
ALTER TABLE `posper_product` ADD `tare_id` varchar(255);
CREATE TABLE posper_tare (
`id` VARCHAR(255) NOT NULL ,
`version` INT NOT NULL ,
`visibleId` INT NULL ,
`tare` INT NOT NULL ,
`name` VARCHAR(255) NOT NULL ,
PRIMARY KEY (`id`) );
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES ('Menu.Tare', 'Menu.Maintenance');
INSERT INTO `posper_role_permission` (`Role_name`, `permissions_name`) VALUES ('admin', 'Menu.Tare');
</pre>
h3. Add course and related fields
Perform the following SQL statements (tested with MySQL):
<pre>
ALTER TABLE `posper_product` ADD `course` tinyint
ALTER TABLE `posper_ticketline` ADD `course` tinyint
CREATE TABLE `posper_course` (`id` varchar(255) NOT NULL PRIMARY KEY, `version` int(11), `course_id` tinyint, `course_name` varchar(255)) ENGINE=InnoDB
ALTER TABLE `posper_product` ADD `prep_time` smallint
ALTER TABLE `posper_category` ADD `prep_time` smallint
ALTER TABLE `posper_ticketline` ADD `status` tinyint, ADD `user_id` varchar(255), ADD `created_at` datetime, ADD `updated_at` datetime
</pre>
h3. Add payment permissions
Perform the following SQL statements (tested with MySQL):
<pre>
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Menu.PaymentPerms', 'Menu.Root')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.Cash', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.Cheque', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.Invoice', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.PaperIn', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.Coupon', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.Magcard', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.Membercard', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.Free', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.CashRefund', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.ChequeRefund', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.PaperOut', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.MagcardRefund', 'Menu.PaymentPerms')
INSERT INTO `posper_permission` (`name`, `parent_name`) VALUES('Perm.MembercardRefund', 'Menu.PaymentPerms')
After upgrading the database you must assign the payment rights to your user groups according
to your needs. Otherwise tickets cannot be closed.
h3. Remove unique constraints
POSper does not set the following constraints anymore.
A unique name constraint on posper_customer is not useful because this is not hte reality. To remove this constraint perform
@ALTERT TABLE `posper_customer` DROP INDEX `name`;@
Constraints on the reference can be implemented in the DB or in Backoffice if needed. The constraint has been removed because in some cases reference is e.g. only unique within the scope of a supplier. Since POSper does not support suppliers we cannot create a compound key in POsper.
h3. Add status to ticketline
Perform the following SQL statements (tested with MySQL):
<pre>
ALTER TABLE `posper_ticketline` ADD `status` tinyint
</pre>