@porulle/plugin-pos-restaurant 0.64.0 → 0.65.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/schema.d.ts +1 -1
- package/dist/services/analytics-service.d.ts +1 -5
- package/dist/services/analytics-service.d.ts.map +1 -1
- package/dist/services/analytics-service.js +0 -16
- package/dist/services/checklist-service.d.ts +0 -1
- package/dist/services/checklist-service.d.ts.map +1 -1
- package/dist/services/checklist-service.js +0 -7
- package/dist/services/modifier-service.d.ts +0 -4
- package/dist/services/modifier-service.d.ts.map +1 -1
- package/dist/services/modifier-service.js +0 -20
- package/dist/services/recipe-service.d.ts +0 -1
- package/dist/services/recipe-service.d.ts.map +1 -1
- package/dist/services/recipe-service.js +1 -17
- package/package.json +14 -11
- package/src/services/analytics-service.ts +0 -27
- package/src/services/checklist-service.ts +0 -11
- package/src/services/modifier-service.ts +0 -30
- package/src/services/recipe-service.ts +0 -19
package/dist/schema.d.ts
CHANGED
|
@@ -1515,7 +1515,7 @@ export declare const kdsTicketItems: import("drizzle-orm/pg-core/table").PgTable
|
|
|
1515
1515
|
tableName: "kds_ticket_items";
|
|
1516
1516
|
dataType: "string";
|
|
1517
1517
|
columnType: "PgText";
|
|
1518
|
-
data: "pending" | "
|
|
1518
|
+
data: "pending" | "preparing" | "done";
|
|
1519
1519
|
driverParam: string;
|
|
1520
1520
|
notNull: true;
|
|
1521
1521
|
hasDefault: true;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* Our implementation: P&L CRUD + SQL-based report queries against core order tables.
|
|
13
13
|
*/
|
|
14
14
|
import type { PluginResult } from "@porulle/core";
|
|
15
|
-
import { posDailyPnl
|
|
15
|
+
import { posDailyPnl } from "../schema.js";
|
|
16
16
|
import type { Db } from "../types.js";
|
|
17
17
|
export declare class RestaurantAnalyticsService {
|
|
18
18
|
private db;
|
|
@@ -33,10 +33,6 @@ export declare class RestaurantAnalyticsService {
|
|
|
33
33
|
percentage?: number;
|
|
34
34
|
}>;
|
|
35
35
|
}): Promise<PluginResult<typeof posDailyPnl.$inferSelect>>;
|
|
36
|
-
getDailyPnl(orgId: string, date: Date): Promise<PluginResult<{
|
|
37
|
-
pnl: typeof posDailyPnl.$inferSelect;
|
|
38
|
-
expenses: Array<typeof posPnlExpenses.$inferSelect>;
|
|
39
|
-
}>>;
|
|
40
36
|
listDailyPnl(orgId: string, limit?: number): Promise<PluginResult<Array<typeof posDailyPnl.$inferSelect>>>;
|
|
41
37
|
getStationPerformance(orgId: string, stationId: string, dateFrom: Date, dateTo: Date): Promise<PluginResult<{
|
|
42
38
|
totalTickets: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics-service.d.ts","sourceRoot":"","sources":["../../src/services/analytics-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"analytics-service.d.ts","sourceRoot":"","sources":["../../src/services/analytics-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAA8C,MAAM,cAAc,CAAC;AACvF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,qBAAa,0BAA0B;IACzB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAIpB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QACzC,IAAI,EAAE,IAAI,CAAC;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChI,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC;IAqDpD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;IAc1G,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;QAChH,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3D,CAAC,CAAC;IA6BG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;QAClG,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC,CAAC;IA0CE,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;QACpG,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC,CAAC,CAAC;CA6BL"}
|
|
@@ -75,22 +75,6 @@ export class RestaurantAnalyticsService {
|
|
|
75
75
|
}
|
|
76
76
|
return Ok(pnl);
|
|
77
77
|
}
|
|
78
|
-
async getDailyPnl(orgId, date) {
|
|
79
|
-
const startOfDay = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
80
|
-
const endOfDay = new Date(startOfDay.getTime() + 24 * 60 * 60 * 1000);
|
|
81
|
-
const pnls = await this.db
|
|
82
|
-
.select()
|
|
83
|
-
.from(posDailyPnl)
|
|
84
|
-
.where(and(eq(posDailyPnl.organizationId, orgId), sql `${posDailyPnl.date} >= ${startOfDay}`, sql `${posDailyPnl.date} < ${endOfDay}`));
|
|
85
|
-
if (pnls.length === 0)
|
|
86
|
-
return Err("No P&L record for this date");
|
|
87
|
-
const pnl = pnls[0];
|
|
88
|
-
const expenses = await this.db
|
|
89
|
-
.select()
|
|
90
|
-
.from(posPnlExpenses)
|
|
91
|
-
.where(eq(posPnlExpenses.pnlId, pnl.id));
|
|
92
|
-
return Ok({ pnl, expenses });
|
|
93
|
-
}
|
|
94
78
|
async listDailyPnl(orgId, limit) {
|
|
95
79
|
const rows = await this.db
|
|
96
80
|
.select()
|
|
@@ -60,7 +60,6 @@ export declare class ChecklistService {
|
|
|
60
60
|
}): Promise<PluginResult<{
|
|
61
61
|
completed: boolean;
|
|
62
62
|
}>>;
|
|
63
|
-
isChecklistCompleted(checklistId: string, referenceType: string, referenceId: string): Promise<boolean>;
|
|
64
63
|
}
|
|
65
64
|
export {};
|
|
66
65
|
//# sourceMappingURL=checklist-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checklist-service.d.ts","sourceRoot":"","sources":["../../src/services/checklist-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,KAAK,aAAa,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,CAAC;AAElE,qBAAa,gBAAgB;IACf,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAEpB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,aAAa,CAAC;QACpB,KAAK,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACvD,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IA8B5G,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAahJ,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QACrF,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC,CAAC;IAoBG,iBAAiB,CAAC,KAAK,EAAE;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC;QACvC,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC5E,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"checklist-service.d.ts","sourceRoot":"","sources":["../../src/services/checklist-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,KAAK,aAAa,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,CAAC;AAElE,qBAAa,gBAAgB;IACf,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAEpB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,aAAa,CAAC;QACpB,KAAK,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACvD,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IA8B5G,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAahJ,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QACrF,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC,CAAC;IAoBG,iBAAiB,CAAC,KAAK,EAAE;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC;QACvC,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC5E,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CA0BlD"}
|
|
@@ -96,11 +96,4 @@ export class ChecklistService {
|
|
|
96
96
|
});
|
|
97
97
|
return Ok({ completed: true });
|
|
98
98
|
}
|
|
99
|
-
async isChecklistCompleted(checklistId, referenceType, referenceId) {
|
|
100
|
-
const rows = await this.db
|
|
101
|
-
.select()
|
|
102
|
-
.from(posChecklistCompletions)
|
|
103
|
-
.where(and(eq(posChecklistCompletions.checklistId, checklistId), eq(posChecklistCompletions.referenceType, referenceType), eq(posChecklistCompletions.referenceId, referenceId)));
|
|
104
|
-
return rows.length > 0;
|
|
105
|
-
}
|
|
106
99
|
}
|
|
@@ -66,9 +66,5 @@ export declare class ModifierService {
|
|
|
66
66
|
priceAdjustment: number;
|
|
67
67
|
}>;
|
|
68
68
|
}>>;
|
|
69
|
-
getModifiersForEntity(orgId: string, entityId: string): Promise<PluginResult<Array<{
|
|
70
|
-
group: ModifierGroup;
|
|
71
|
-
options: ModifierOption[];
|
|
72
|
-
}>>>;
|
|
73
69
|
}
|
|
74
70
|
//# sourceMappingURL=modifier-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modifier-service.d.ts","sourceRoot":"","sources":["../../src/services/modifier-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErE,qBAAa,eAAe;IACd,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAIpB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QACtC,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAsBlC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC;IAapF,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAC9E,KAAK,EAAE,aAAa,CAAC;QACrB,OAAO,EAAE,cAAc,EAAE,CAAC;KAC3B,CAAC,CAAC;IAiBG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;QACvD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAWlC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAYxF,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;QACtC,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAenC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAWnC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAa3E,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;QACzE,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"modifier-service.d.ts","sourceRoot":"","sources":["../../src/services/modifier-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAErE,qBAAa,eAAe;IACd,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAIpB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QACtC,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAsBlC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC;IAapF,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAC9E,KAAK,EAAE,aAAa,CAAC;QACrB,OAAO,EAAE,cAAc,EAAE,CAAC;KAC3B,CAAC,CAAC;IAiBG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;QACvD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;IAWlC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAYxF,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;QACtC,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAenC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;QAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAWnC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAa3E,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC;QACzE,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CAkD9H"}
|
|
@@ -157,24 +157,4 @@ export class ModifierService {
|
|
|
157
157
|
}
|
|
158
158
|
return Ok({ totalAdjustment, validatedModifiers });
|
|
159
159
|
}
|
|
160
|
-
// ─── Get Modifiers for Entity ──────────────────────────────────────
|
|
161
|
-
// Returns all modifier groups with their options for a given entity.
|
|
162
|
-
// Used by the POS frontend to render modifier selection UI.
|
|
163
|
-
async getModifiersForEntity(orgId, entityId) {
|
|
164
|
-
const groups = await this.db
|
|
165
|
-
.select()
|
|
166
|
-
.from(posModifierGroups)
|
|
167
|
-
.where(and(eq(posModifierGroups.organizationId, orgId), eq(posModifierGroups.entityId, entityId)))
|
|
168
|
-
.orderBy(posModifierGroups.sortOrder);
|
|
169
|
-
const result = [];
|
|
170
|
-
for (const group of groups) {
|
|
171
|
-
const options = await this.db
|
|
172
|
-
.select()
|
|
173
|
-
.from(posModifierOptions)
|
|
174
|
-
.where(eq(posModifierOptions.groupId, group.id))
|
|
175
|
-
.orderBy(posModifierOptions.sortOrder);
|
|
176
|
-
result.push({ group, options });
|
|
177
|
-
}
|
|
178
|
-
return Ok(result);
|
|
179
|
-
}
|
|
180
160
|
}
|
|
@@ -37,7 +37,6 @@ export declare class RecipeService {
|
|
|
37
37
|
totalCost: number;
|
|
38
38
|
costPerUnit: number;
|
|
39
39
|
}>>;
|
|
40
|
-
calculateCOGS(orgId: string, entityId: string, quantity: number): Promise<number>;
|
|
41
40
|
listRecipes(orgId: string): Promise<PluginResult<Array<typeof posRecipes.$inferSelect>>>;
|
|
42
41
|
}
|
|
43
42
|
//# sourceMappingURL=recipe-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe-service.d.ts","sourceRoot":"","sources":["../../src/services/recipe-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,qBAAa,aAAa;IACZ,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAEpB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QACvC,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,KAAK,CAAC;YACjB,cAAc,EAAE,MAAM,CAAC;YACvB,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC,CAAC;KACJ,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAkCtE,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QACrE,MAAM,EAAE,OAAO,UAAU,CAAC,YAAY,CAAC;QACvC,WAAW,EAAE,KAAK,CAAC,OAAO,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAC7D,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IAiBG,
|
|
1
|
+
{"version":3,"file":"recipe-service.d.ts","sourceRoot":"","sources":["../../src/services/recipe-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,qBAAa,aAAa;IACZ,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAEpB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QACvC,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,KAAK,CAAC;YACjB,cAAc,EAAE,MAAM,CAAC;YACvB,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC,CAAC;KACJ,GAAG,OAAO,CAAC,YAAY,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAkCtE,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QACrE,MAAM,EAAE,OAAO,UAAU,CAAC,YAAY,CAAC;QACvC,WAAW,EAAE,KAAK,CAAC,OAAO,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAC7D,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IAiBG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;CAO/F"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Our implementation: pos_recipes + pos_recipe_ingredients tables.
|
|
9
9
|
* COGS = sum(ingredient.quantity * ingredient.costPerUnit) / yieldQuantity.
|
|
10
10
|
*/
|
|
11
|
-
import { eq
|
|
11
|
+
import { eq } from "@porulle/core/drizzle";
|
|
12
12
|
import { Ok, Err } from "@porulle/core";
|
|
13
13
|
import { posRecipes, posRecipeIngredients } from "../schema.js";
|
|
14
14
|
export class RecipeService {
|
|
@@ -59,22 +59,6 @@ export class RecipeService {
|
|
|
59
59
|
const costPerUnit = Math.round(totalCost / recipe.yieldQuantity);
|
|
60
60
|
return Ok({ recipe, ingredients, totalCost, costPerUnit });
|
|
61
61
|
}
|
|
62
|
-
async calculateCOGS(orgId, entityId, quantity) {
|
|
63
|
-
const recipes = await this.db
|
|
64
|
-
.select()
|
|
65
|
-
.from(posRecipes)
|
|
66
|
-
.where(and(eq(posRecipes.organizationId, orgId), eq(posRecipes.entityId, entityId), eq(posRecipes.isActive, true)));
|
|
67
|
-
if (recipes.length === 0)
|
|
68
|
-
return 0;
|
|
69
|
-
const recipe = recipes[0];
|
|
70
|
-
const ingredients = await this.db
|
|
71
|
-
.select()
|
|
72
|
-
.from(posRecipeIngredients)
|
|
73
|
-
.where(eq(posRecipeIngredients.recipeId, recipe.id));
|
|
74
|
-
const costPerYield = ingredients.reduce((sum, i) => sum + i.quantity * i.costPerUnit, 0);
|
|
75
|
-
const costPerUnit = costPerYield / recipe.yieldQuantity;
|
|
76
|
-
return Math.round(costPerUnit * quantity);
|
|
77
|
-
}
|
|
78
62
|
async listRecipes(orgId) {
|
|
79
63
|
const rows = await this.db
|
|
80
64
|
.select()
|
package/package.json
CHANGED
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@porulle/plugin-pos-restaurant",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.65.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
8
|
+
"@porulle/source": "./src/index.ts",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
11
|
},
|
|
12
12
|
"./schema": {
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
"@porulle/source": "./src/schema.ts",
|
|
14
|
+
"types": "./dist/schema.d.ts",
|
|
15
|
+
"default": "./dist/schema.js"
|
|
16
|
+
},
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=20.19.0"
|
|
18
21
|
},
|
|
19
22
|
"dependencies": {
|
|
20
23
|
"@hono/zod-openapi": "^1.2.2",
|
|
21
24
|
"hono": "^4.12.5",
|
|
22
|
-
"@porulle/
|
|
23
|
-
"@porulle/
|
|
25
|
+
"@porulle/core": "0.65.1",
|
|
26
|
+
"@porulle/plugin-pos": "0.65.1"
|
|
24
27
|
},
|
|
25
28
|
"devDependencies": {
|
|
26
29
|
"@types/node": "^24.5.2",
|
|
@@ -86,33 +86,6 @@ export class RestaurantAnalyticsService {
|
|
|
86
86
|
return Ok(pnl);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
async getDailyPnl(orgId: string, date: Date): Promise<PluginResult<{
|
|
90
|
-
pnl: typeof posDailyPnl.$inferSelect;
|
|
91
|
-
expenses: Array<typeof posPnlExpenses.$inferSelect>;
|
|
92
|
-
}>> {
|
|
93
|
-
const startOfDay = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
94
|
-
const endOfDay = new Date(startOfDay.getTime() + 24 * 60 * 60 * 1000);
|
|
95
|
-
|
|
96
|
-
const pnls = await this.db
|
|
97
|
-
.select()
|
|
98
|
-
.from(posDailyPnl)
|
|
99
|
-
.where(and(
|
|
100
|
-
eq(posDailyPnl.organizationId, orgId),
|
|
101
|
-
sql`${posDailyPnl.date} >= ${startOfDay}`,
|
|
102
|
-
sql`${posDailyPnl.date} < ${endOfDay}`,
|
|
103
|
-
));
|
|
104
|
-
|
|
105
|
-
if (pnls.length === 0) return Err("No P&L record for this date");
|
|
106
|
-
const pnl = pnls[0]!;
|
|
107
|
-
|
|
108
|
-
const expenses = await this.db
|
|
109
|
-
.select()
|
|
110
|
-
.from(posPnlExpenses)
|
|
111
|
-
.where(eq(posPnlExpenses.pnlId, pnl.id));
|
|
112
|
-
|
|
113
|
-
return Ok({ pnl, expenses });
|
|
114
|
-
}
|
|
115
|
-
|
|
116
89
|
async listDailyPnl(orgId: string, limit?: number): Promise<PluginResult<Array<typeof posDailyPnl.$inferSelect>>> {
|
|
117
90
|
const rows = await this.db
|
|
118
91
|
.select()
|
|
@@ -125,15 +125,4 @@ export class ChecklistService {
|
|
|
125
125
|
return Ok({ completed: true });
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
async isChecklistCompleted(checklistId: string, referenceType: string, referenceId: string): Promise<boolean> {
|
|
129
|
-
const rows = await this.db
|
|
130
|
-
.select()
|
|
131
|
-
.from(posChecklistCompletions)
|
|
132
|
-
.where(and(
|
|
133
|
-
eq(posChecklistCompletions.checklistId, checklistId),
|
|
134
|
-
eq(posChecklistCompletions.referenceType, referenceType as "transaction" | "shift"),
|
|
135
|
-
eq(posChecklistCompletions.referenceId, referenceId),
|
|
136
|
-
));
|
|
137
|
-
return rows.length > 0;
|
|
138
|
-
}
|
|
139
128
|
}
|
|
@@ -218,34 +218,4 @@ export class ModifierService {
|
|
|
218
218
|
return Ok({ totalAdjustment, validatedModifiers });
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
// ─── Get Modifiers for Entity ──────────────────────────────────────
|
|
222
|
-
// Returns all modifier groups with their options for a given entity.
|
|
223
|
-
// Used by the POS frontend to render modifier selection UI.
|
|
224
|
-
|
|
225
|
-
async getModifiersForEntity(orgId: string, entityId: string): Promise<PluginResult<Array<{
|
|
226
|
-
group: ModifierGroup;
|
|
227
|
-
options: ModifierOption[];
|
|
228
|
-
}>>> {
|
|
229
|
-
const groups = await this.db
|
|
230
|
-
.select()
|
|
231
|
-
.from(posModifierGroups)
|
|
232
|
-
.where(and(
|
|
233
|
-
eq(posModifierGroups.organizationId, orgId),
|
|
234
|
-
eq(posModifierGroups.entityId, entityId),
|
|
235
|
-
))
|
|
236
|
-
.orderBy(posModifierGroups.sortOrder);
|
|
237
|
-
|
|
238
|
-
const result = [];
|
|
239
|
-
for (const group of groups) {
|
|
240
|
-
const options = await this.db
|
|
241
|
-
.select()
|
|
242
|
-
.from(posModifierOptions)
|
|
243
|
-
.where(eq(posModifierOptions.groupId, group.id))
|
|
244
|
-
.orderBy(posModifierOptions.sortOrder);
|
|
245
|
-
|
|
246
|
-
result.push({ group, options });
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return Ok(result);
|
|
250
|
-
}
|
|
251
221
|
}
|
|
@@ -86,25 +86,6 @@ export class RecipeService {
|
|
|
86
86
|
return Ok({ recipe, ingredients, totalCost, costPerUnit });
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
async calculateCOGS(orgId: string, entityId: string, quantity: number): Promise<number> {
|
|
90
|
-
const recipes = await this.db
|
|
91
|
-
.select()
|
|
92
|
-
.from(posRecipes)
|
|
93
|
-
.where(and(eq(posRecipes.organizationId, orgId), eq(posRecipes.entityId, entityId), eq(posRecipes.isActive, true)));
|
|
94
|
-
|
|
95
|
-
if (recipes.length === 0) return 0;
|
|
96
|
-
const recipe = recipes[0]!;
|
|
97
|
-
|
|
98
|
-
const ingredients = await this.db
|
|
99
|
-
.select()
|
|
100
|
-
.from(posRecipeIngredients)
|
|
101
|
-
.where(eq(posRecipeIngredients.recipeId, recipe.id));
|
|
102
|
-
|
|
103
|
-
const costPerYield = ingredients.reduce((sum, i) => sum + i.quantity * i.costPerUnit, 0);
|
|
104
|
-
const costPerUnit = costPerYield / recipe.yieldQuantity;
|
|
105
|
-
return Math.round(costPerUnit * quantity);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
89
|
async listRecipes(orgId: string): Promise<PluginResult<Array<typeof posRecipes.$inferSelect>>> {
|
|
109
90
|
const rows = await this.db
|
|
110
91
|
.select()
|