Skip to content

Commit f619879

Browse files
committed
7 Feb 2024
1) Movement - Trigger save after clicking on auto-suggested SKU. 2) Removed item name and unit from delivery items table. 3) Updating an item SKU/name/unit will also change the delivery items. 4) A warning is now displayed in the edit item page to highlight potential problems when changing SKU/name/unit. 5) DO - sortable items.
1 parent 9363edd commit f619879

File tree

8 files changed

+91
-45
lines changed

8 files changed

+91
-45
lines changed

TODO.txt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
STORAGE BOXX TO DO / WISH LIST
22
==============================
33
* Add PO
4-
* Print QR/NFC after import items
54
* Items > supplier > purchase
65
* Auto-create PO for items low on stock
76
* Home page widgets
87
* Settings - add company info - Use in PO/DO/Invoice/documents
98
* Directly email PO/DO
10-
* Add tutorial videos
11-
* Movement - Auto save after click on suggested SKU
12-
* item_mvt clean up - Remove item_left? Does not make much sense, not useful.
13-
* item_mvt add item_name and mvt_unit - Data integrity.
9+
* PO - sortable items.
1410
* More reports - delivery/sales, purchases.
15-
* DO/PO - sortable items.
11+
* Print QR/NFC after import items
12+
* Add tutorial videos

assets/PAGE-deliver.js

Lines changed: 64 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -97,61 +97,96 @@ var dlv = {
9797

9898
// (E2) ADD NEW ROW
9999
else {
100+
// (E2-1) ITEM ROW HTML
100101
let row = document.createElement("div");
101-
row.innerHTML = `<div class="iRow d-flex align-items-center border p-2">
102-
<i class="text-danger icon-cross p-3" onclick="dlv.delItem(this, '${sku}')"></i>
103-
<div class="flex-grow-1">
104-
<strong class="iSKU">${sku}</strong>
105-
<div class="iName">${name}</div>
106-
</div>
107-
<div class="form-floating">
108-
<input class="form-control mx-1 iQty" type="number" step="0.01" min="0.01" required value="${qty}">
109-
<label class="iUnit">${unit}</label>
110-
</div>
111-
<div class="form-floating">
112-
<input class="form-control iPrice" type="number" step="0.01" min="0" required value="${price}">
113-
<label>PRICE</label>
114-
</div>
102+
row.className = "iRow d-flex align-items-center border p-2";
103+
row.innerHTML =
104+
`<i class="text-danger icon-cross p-3" onclick="dlv.delItem(this, '${sku}')"></i>
105+
<div class="flex-grow-1">
106+
<strong class="iSKU">${sku}</strong>
107+
<div class="iName">${name}</div>
108+
</div>
109+
<div class="form-floating">
110+
<input class="form-control mx-1 iQty" type="number" step="0.01" min="0.01" required value="${qty}">
111+
<label class="iUnit">${unit}</label>
112+
</div>
113+
<div class="form-floating">
114+
<input class="form-control iPrice" type="number" step="0.01" min="0" required value="${price}">
115+
<label>PRICE</label>
115116
</div>`;
117+
118+
// (E2-2) SORTABLE
119+
row.draggable = true;
120+
row.ondragstart = () => dlv.ddfrom = row;
121+
row.ondragover = e => e.preventDefault();
122+
row.ondrop = dlv.isort;
123+
124+
// (E2-3) APPEND TO LIST
116125
document.getElementById("dlv-items").appendChild(row);
117126
dlv.iList[sku] = 1;
118127
}
119128
},
120129

121-
// (F) REMOVE ITEM ROW
130+
// (F) DRAG-N-DROP SORT ITEM
131+
ddfrom : null, // current item being dragged
132+
ddto : null, // dropped at this item
133+
ddget : r => r.classList.contains("iRow") ? r : dlv.ddget(r.parentElement), // get proper drop target
134+
isort : e => {
135+
// (F1) GET ELEMENTS
136+
e.preventDefault();
137+
let iList = document.getElementById("dlv-items"),
138+
iAll = iList.querySelectorAll(".iRow");
139+
dlv.ddto = dlv.ddget(e.target);
140+
141+
// (F2) REORDER ITEM
142+
if (iAll.length>1 && dlv.ddfrom!=dlv.ddto) {
143+
let currentpos = 0, droppedpos = 0;
144+
for (let i=0; i<iAll.length; i++) {
145+
if (dlv.ddfrom == iAll[i]) { currentpos = i; }
146+
if (dlv.ddto == iAll[i]) { droppedpos = i; }
147+
}
148+
if (currentpos < droppedpos) {
149+
iList.insertBefore(dlv.ddfrom, dlv.ddto.nextSibling);
150+
} else {
151+
iList.insertBefore(dlv.ddfrom, dlv.ddto);
152+
}
153+
}
154+
},
155+
156+
// (G) REMOVE ITEM ROW
122157
delItem : (row, sku) => {
123158
row.parentElement.remove();
124159
delete dlv.iList[sku];
125160
},
126161

127-
// (G) GET ITEM FROM SERVER & ADD TO LIST
162+
// (H) GET ITEM FROM SERVER & ADD TO LIST
128163
addGet : sku => cb.api({
129164
mod : "items", act : "get",
130165
data : { sku : sku },
131166
passmsg : false,
132167
onpass : res => {
133-
// (G1) INVALID SKU
168+
// (H1) INVALID SKU
134169
if (res.data==null) {
135170
cb.modal("Invalid Item", `${sku} is not found in the database.`);
136171
}
137172

138-
// (G2) OK - ADD ITEM
173+
// (H2) OK - ADD ITEM
139174
else {
140175
let i = res.data;
141176
dlv.addItem(i.item_sku, i.item_name, i.item_unit, i.item_price, 1);
142177
}
143178
}
144179
}),
145180

146-
// (H) ADD ITEM WITH QR CODE
181+
// (I) ADD ITEM WITH QR CODE
147182
addQR : () => {
148183
if (qrscan.scanner==null) { qrscan.init(dlv.addGet); }
149184
qrscan.show();
150185
},
151186

152-
// (I) SAVE DELIVERY
187+
// (J) SAVE DELIVERY
153188
save : () => {
154-
// (I1) GET DATA
189+
// (J1) GET DATA
155190
var data = {
156191
name : document.getElementById("d-name").value,
157192
tel : document.getElementById("d-tel").value,
@@ -166,26 +201,24 @@ var dlv = {
166201
data.stat = document.getElementById("d-stat").value;
167202
}
168203

169-
// (I2) GET ITEMS
204+
// (J2) GET ITEMS
170205
let items = document.querySelectorAll("#dlv-items .iRow");
171206
if (items.length==0) {
172207
cb.modal("No Items", "Please add at least one item.");
173208
return false;
174209
}
175210
data.items = [];
176-
// sku | name | unit | price | qty
211+
// sku | price | qty
177212
for (let i of items) {
178213
data.items.push([
179214
i.querySelector(".iSKU").innerHTML,
180-
i.querySelector(".iName").innerHTML,
181-
i.querySelector(".iUnit").innerHTML,
182215
i.querySelector(".iPrice").value,
183216
i.querySelector(".iQty").value
184217
]);
185218
}
186219
data.items = JSON.stringify(data.items);
187220

188-
// (I3) AJAX
221+
// (J3) AJAX
189222
cb.api({
190223
mod : "delivery", act : "save",
191224
data : data,
@@ -195,22 +228,22 @@ var dlv = {
195228
return false;
196229
},
197230

198-
// (J) PRINT DELIVERY ORDER
231+
// (K) PRINT DELIVERY ORDER
199232
print : id => {
200233
document.getElementById("dlv-print-id").value = id;
201234
document.getElementById("dlv-print").submit();
202235
}
203236
};
204237

205-
// (K) INIT MANAGE DELIVERIES
238+
// (L) INIT MANAGE DELIVERIES
206239
window.addEventListener("load", () => {
207-
// (K1) EXTRA STYLES FOR "ADD/EDIT ITEMS LIST"
240+
// (L1) EXTRA STYLES FOR "ADD/EDIT ITEMS LIST"
208241
document.head.appendChild(document.createElement("style")).innerHTML=".iQty,.iPrice{width:80px}";
209242

210-
// (K2) LIST DELIVERIES
243+
// (L2) LIST DELIVERIES
211244
dlv.list();
212245

213-
// (K3) ATTACH AUTOCOMPLETE
246+
// (L3) ATTACH AUTOCOMPLETE
214247
autocomplete.attach({
215248
target : document.getElementById("dlv-search"),
216249
mod : "autocomplete", act : "deliver",

assets/PAGE-move.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ var move = {
3030
// (B3) INIT AUTOCOMPLETE
3131
autocomplete.attach({
3232
target : document.getElementById("mvt-sku"),
33-
mod : "autocomplete", act : "sku"
33+
mod : "autocomplete", act : "sku",
34+
onpick : () => {
35+
if (move.hForm.checkValidity()) { move.save(); }
36+
else { move.hForm.reportValidity(); }
37+
}
3438
});
3539
},
3640

lib/LIB-Delivery.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ function save ($name, $tel, $email, $address, $date, $items, $notes=null, $stat=
4545
$sku[] = "\"$i[0]\"";
4646
}
4747
$this->DB->insert("deliveries_items",
48-
["d_id", "item_sku", "item_name", "item_unit", "item_price", "item_qty"],
48+
["d_id", "item_sku", "item_price", "item_qty"],
4949
$data
5050
);
5151

@@ -100,8 +100,10 @@ function get ($id) {
100100

101101
// (B2) ORDER ITEMS
102102
$this->DB->query(
103-
"SELECT `item_sku` s, `item_name` n, `item_unit` u, `item_price` p, `item_qty` q
104-
FROM `deliveries_items` WHERE `d_id`=?", [$id]
103+
"SELECT d.`item_sku` s, i.`item_name` n, i.`item_unit` u, d.`item_price` p, d.`item_qty` q
104+
FROM `deliveries_items` d
105+
LEFT JOIN `items` i USING (`item_sku`)
106+
WHERE `d_id`=?", [$id]
105107
);
106108
$d["items"] = [];
107109
while ($r = $this->DB->stmt->fetch(PDO::FETCH_NUM)) {

lib/LIB-Items.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ function save ($sku, $name, $unit, $price=0, $low=0, $desc=null, $osku=null) {
3838
if ($sku!=$osku) {
3939
$this->DB->update("item_mvt", ["item_sku"], "`item_sku`=?", [$sku, $osku]);
4040
$this->DB->update("suppliers_items", ["item_sku"], "`item_sku`=?", [$sku, $osku]);
41+
$this->DB->update("deliveries_items", ["item_sku"], "`item_sku`=?", [$sku, $osku]);
4142
}
4243
}
4344

lib/LIB-Report.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,11 @@ function getMonitor () {
176176
function deliver ($id) {
177177
$this->Settings->defineN("DELIVER_STAT", true);
178178
$order = $this->DB->fetch("SELECT * FROM `deliveries` WHERE `d_id`=?", [$id]);
179-
$items = $this->DB->fetchAll("SELECT * FROM `deliveries_items` WHERE `d_id`=?", [$id]);
179+
$items = $this->DB->fetchAll(
180+
"SELECT d.`item_sku`, d.`item_price`, d.`item_qty`, i.`item_unit`, i.`item_name`
181+
FROM `deliveries_items` d
182+
LEFT JOIN `items` i USING (`item_sku`)
183+
WHERE `d_id`=?", [$id]);
180184
$this->htop([
181185
["l", HOST_ASSETS."REPORT-deliver.css"]
182186
]);

lib/SQL-Storage-Boxx-0.sql

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,6 @@ ALTER TABLE `deliveries`
168168
CREATE TABLE `deliveries_items` (
169169
`d_id` bigint(20) NOT NULL,
170170
`item_sku` varchar(255) NOT NULL,
171-
`item_name` varchar(255) NOT NULL,
172-
`item_unit` varchar(255) NOT NULL,
173171
`item_price` decimal(12,2) NOT NULL DEFAULT 0.00,
174172
`item_qty` decimal(12,2) NOT NULL
175173
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

pages/PAGE-items-form.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44
if ($edit) { $item = $_CORE->autoCall("Items", "get"); }
55

66
// (B) ITEM FORM ?>
7-
<h3 class="mb-3"><?=$edit?"EDIT":"ADD"?> ITEM</h3>
7+
<h3 class="m-0"><?=$edit?"EDIT":"ADD"?> ITEM</h3>
8+
<div class="text-danger fw-bold mb-3">
9+
<?php if ($edit) { ?>
10+
* All movement history, suppier items, and orders will also be updated if you change the SKU/name/unit.
11+
This can potentially mess things up, do so with extra care.
12+
<?php } ?>
13+
</div>
14+
815
<form onsubmit="return item.save()">
916
<div class="bg-white border p-4 mb-3">
1017
<div class="form-floating mb-1">

0 commit comments

Comments
 (0)