panels-origin/api/expense_catalogs_http.ts
Cursor Agent caf40e29fb
feat: facturas, ajustes de nómina, finiquitos, dispersión e IMSS
Reutiliza el catálogo de proveedores y agrega carga de facturas, conceptos de la semana, préstamos editables, finiquitos, dispersión, historial de personal, reportes y jornal de cotización.

Co-authored-by: alberto.martinez <alberto.martinez@mrdev.mx>
2026-09-24 16:40:08 +00:00

68 lines
2.3 KiB
TypeScript

import type { Hono } from "hono";
import type { AuthUser } from "./auth.ts";
import { tenantScope } from "./auth.ts";
import { requireCoreAuth } from "./scope.ts";
import { requireAnyPermission } from "./permissions.ts";
import { callCoreFn } from "./rpc.ts";
import { respondRpc, routeLabel } from "./http_errors.ts";
type App = Hono<{ Variables: { user: AuthUser; db: Db } }>;
type Db = import("./db.ts").Db;
function tid(c: { get: (k: "user") => AuthUser }): number {
return tenantScope(c.get("user")) ?? 0;
}
export function registerExpenseCatalogRoutes(app: App) {
const view = [...requireCoreAuth, requireAnyPermission("expenses.view", "settings.view", "warehouse.view")] as const;
const write = [...requireCoreAuth, requireAnyPermission("expenses.create", "settings.update", "warehouse.update")] as const;
app.get("/v1/suppliers", ...view, async (c) => {
const db = c.get("db");
const env = await callCoreFn(db, "core.fn_supplier_list", {
tenant_id: tid(c),
status: c.req.query("status"),
q: c.req.query("q"),
}, { route: routeLabel(c) });
return respondRpc(c, env);
});
app.post("/v1/suppliers", ...write, async (c) => {
const body = await c.req.json<Record<string, unknown>>();
const db = c.get("db");
const env = await callCoreFn(db, "core.fn_supplier_create", {
...body,
tenant_id: tid(c),
}, { route: routeLabel(c) });
return respondRpc(c, env);
});
app.patch("/v1/suppliers/:id", ...write, async (c) => {
const body = await c.req.json<Record<string, unknown>>();
const db = c.get("db");
const env = await callCoreFn(db, "core.fn_supplier_update", {
...body,
id: Number(c.req.param("id")),
tenant_id: tid(c),
}, { route: routeLabel(c) });
return respondRpc(c, env);
});
app.get("/v1/measure-units", ...view, async (c) => {
const db = c.get("db");
const env = await callCoreFn(db, "core.fn_measure_unit_list", {
tenant_id: tid(c),
}, { route: routeLabel(c) });
return respondRpc(c, env);
});
app.post("/v1/measure-units", ...write, async (c) => {
const body = await c.req.json<Record<string, unknown>>();
const db = c.get("db");
const env = await callCoreFn(db, "core.fn_measure_unit_add", {
...body,
tenant_id: tid(c),
}, { route: routeLabel(c) });
return respondRpc(c, env);
});
}