Vn.Shelves = new Class ({ Extends: Vn.Module ,activate: function () { this.$('report-title').value = 'Anthuriums'; this.$('warehouse').value = 44; this.$('date').value = new Date (); this.$('shelf').value = 1; this.$('reign').value = 1; this.$('family').value = 2; this.$('filter').value = 'Ant %'; this.$('max-amount').value = 50; } ,onPreviewClick: function () { var report = new Vn.ShelvesReport ({conn: this.conn}); report.setParams ( this.$('report-title').value, this.$('warehouse').value, this.$('date').value, this.$('family').value, this.$('filter').value, this.$('max-amount').value, this.$('shelf').value ); report.open (); } }); Vn.ShelvesReport = new Class ({ Extends: Vn.Report ,nItem: -1 ,nColors: 4 ,setParams: function (title, warehouse, date, type, filter, maxAmount, shelf) { this.title = title; this.maxAmount = maxAmount; var batch = new Sql.Batch (); batch.addValue ('shelf', shelf); batch.addValue ('wh', warehouse); batch.addValue ('date', date); batch.addValue ('type', type); batch.addValue ('filter', filter); this.batch = batch; } ,open: function () { var query = 'SELECT id, name, width, height, max_height, tray_height, '+ 'first_tray_elevation, tray_density, vspacing, hspacing '+ 'FROM vn2008.shelf WHERE id = #shelf; '+ 'CALL item_organizer (#wh, #date, #type, #filter)'; this.conn.execQuery (query, this.onQueryExec.bind (this), this.batch); } ,onQueryExec: function (resultSet) { // Fetch query data var res = resultSet.fetchResult (); res.next (); var scale = 0.065; var shelf = this.shelf = { width: res.get ('width') * scale ,height: res.get ('height') * scale ,maxHeight: res.get ('max_height') * scale ,trayHeight: res.get ('tray_height') * scale ,firstTrayElevation: res.get ('first_tray_elevation') * scale ,trayDensity: res.get ('tray_density') * scale ,vspacing: res.get ('vspacing') * scale ,hspacing: res.get ('hspacing') * scale }; var items = []; var res = resultSet.fetchResult (); while (res.next ()) items.push ({ name: res.get ('Article') +' x'+ res.get ('Medida') ,boxHeight: res.get ('z') * 10 * scale ,boxWidth: res.get ('x') * 10 * scale ,amount: res.get ('etiquetas') }); // Intializes the allocator alloc = new Vn.Allocator (); alloc.items = items; alloc.maxAmount = this.maxAmount; alloc.shelfFunc = this.drawShelf.bind (this); alloc.boxFunc = this.drawBox.bind (this); alloc.nTrays = Math.ceil ( (shelf.height - shelf.firstTrayElevation) / (shelf.trayHeight + shelf.trayDensity) ); alloc.trayWidth = shelf.width - shelf.hspacing * 2; alloc.trayHeight = shelf.trayHeight - shelf.vspacing; alloc.topTrayHeight = shelf.maxHeight - shelf.vspacing - shelf.firstTrayElevation - (alloc.nTrays - 1) * shelf.trayHeight; // Opens the report this.createWindow ('shelves'); alloc.run (); } ,drawShelf: function (allocator) { var shelf = this.shelf; var sheet = this.doc.createElement ('div'); sheet.className = 'sheet'; /* sheet.style.top = (allocator.currentShelf * 297) +'mm'; */ this.doc.body.appendChild (sheet); // Draws the title var title = this.doc.createElement ('h1'); title.className = 'title'; title.appendChild (this.doc.createTextNode (this.title)); sheet.appendChild (title); var pageNumber = this.doc.createElement ('h1'); pageNumber.className = 'page-number'; pageNumber.appendChild (this.doc.createTextNode (allocator.currentShelf + 1)); sheet.appendChild (pageNumber); // Draws the shelf var shelfDiv = this.shelfDiv = this.doc.createElement ('div'); shelfDiv.className = 'shelf'; shelfDiv.style.width = this.shelf.width +'mm'; shelfDiv.style.height = this.shelf.maxHeight +'mm'; sheet.appendChild (shelfDiv); this.drawEdge ().style.left = 0; this.drawEdge ().style.right = 0; // Draws trays var lastTrayY = shelf.firstTrayElevation; if (shelf.trayHeight > 0) while (lastTrayY + shelf.trayDensity < shelf.height) { var tray = this.doc.createElement ('div'); tray.className = 'tray'; tray.style.width = this.shelf.width +'mm'; tray.style.height = '1mm'; tray.style.bottom = lastTrayY +'mm'; shelfDiv.appendChild (tray); lastTrayY += shelf.trayHeight + shelf.trayDensity; } } ,drawEdge: function (shelfDiv) { var edge = this.doc.createElement ('div'); edge.className = 'edge'; edge.style.width = '1mm'; edge.style.height = this.shelf.height +'mm'; edge.style.bottom = 0; this.shelfDiv.appendChild (edge); return edge; } ,drawBox: function (allocator, item, amount) { if (item.boxWidth == 0 || item.boxHeight == 0) return; var shelf = this.shelf; var x = allocator.trayX + shelf.hspacing; var y = allocator.trayY + shelf.firstTrayElevation + shelf.trayDensity + allocator.currentTray * (shelf.trayHeight + shelf.trayDensity); var box = this.doc.createElement ('div'); box.className = 'box'; this.shelfDiv.appendChild (box); box.style.left = x +'mm'; box.style.bottom = y +'mm'; box.style.width = item.boxWidth +'mm'; box.style.height = item.boxHeight +'mm'; if (amount == 0) this.nItem++; var nColor = this.nItem % this.nColors; Vn.Node.addClass (box, 'color'+ nColor); if (amount == 0 || allocator.firstShelfBox) { var boxLabel = this.doc.createElement ('span'); box.appendChild (boxLabel); var text = this.doc.createTextNode (item.name); boxLabel.appendChild (text); } } }); Vn.Allocator = new Class ({ addShelf: function () { this.currentShelf++; this.firstShelfBox = true; if (this.shelfFunc) this.shelfFunc (this); } ,addTray: function () { if (this.currentTray <= 0) { this.addShelf (); this.currentTray = this.nTrays - 1; } else this.currentTray--; this.trayX = 0; } ,addColumn: function (width) { if (this.trayX + this.columnWidth + width > this.trayWidth || this.currentTray == -1) this.addTray (); else this.trayX += this.columnWidth; this.trayY = 0; this.columnWidth = width; this.lastBoxWidth = width; } ,addBox: function (item, amount) { var trayHeight = this.trayHeight; if (this.currentTray == this.nTrays - 1) trayHeight = this.topTrayHeight; if (this.trayY + item.boxHeight > trayHeight || item.boxWidth > this.lastBoxWidth) this.addColumn (item.boxWidth); if (this.boxFunc) this.boxFunc (this, item, amount); this.trayY += item.boxHeight; if (item.boxWidth < this.lastBoxWidth) this.lastBoxWidth = item.boxWidth; } ,run: function () { this.firstShelfBox = false; this.currentShelf = -1; this.currentTray = -1; this.columnWidth = 0; this.lastBoxWidth = 0; this.trayX = 0; this.trayY = 0; for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; for (var amount = 0; amount < item.amount; amount++) { if (amount == 0 && this.maxAmount > 0 && item.amount > this.maxAmount) break; this.addBox (item, amount); this.firstShelfBox = false; } } return this.currentShelf + 1; } });