2631 lines
98 KiB
JavaScript
2631 lines
98 KiB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
||
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
||
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
||
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
||
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
||
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
||
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
||
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
||
function _regenerator() { var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
||
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
||
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
||
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
||
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
||
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
||
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
||
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
||
var _React = React,
|
||
useState = _React.useState,
|
||
useEffect = _React.useEffect,
|
||
useCallback = _React.useCallback,
|
||
useRef = _React.useRef;
|
||
var fmt = function fmt(n) {
|
||
return Number(n).toLocaleString("fr-CA", {
|
||
minimumFractionDigits: 2,
|
||
maximumFractionDigits: 2
|
||
});
|
||
};
|
||
var today = function today() {
|
||
return new Date().toISOString().slice(0, 10);
|
||
};
|
||
var api = function api(url, method, body) {
|
||
return fetch(url, {
|
||
method: method,
|
||
headers: {
|
||
"Content-Type": "application/json"
|
||
},
|
||
body: body ? JSON.stringify(body) : undefined
|
||
}).then(function (r) {
|
||
return r.ok ? r.json() : r.json().then(function (e) {
|
||
return Promise.reject(e);
|
||
});
|
||
});
|
||
};
|
||
var PIECE_FIELDS = [{
|
||
label: "Nom / désignation",
|
||
path: "name"
|
||
}, {
|
||
label: "Numéro de série",
|
||
path: "view_admin.serial_number"
|
||
}, {
|
||
label: "Étiquette d'inventaire",
|
||
path: "view_admin.inventory_tag"
|
||
}, {
|
||
label: "Fabricant",
|
||
path: "view_admin.manufacturer"
|
||
}, {
|
||
label: "Modèle",
|
||
path: "view_admin.model"
|
||
}, {
|
||
label: "Format",
|
||
path: "view_admin.form_factor"
|
||
}, {
|
||
label: "Statut",
|
||
path: "view_admin.operational_status"
|
||
}, {
|
||
label: "Coût (CAD)",
|
||
path: "view_cpa.capitalizable_base_cad",
|
||
num: true
|
||
}, {
|
||
label: "Coût de remplacement (CAD)",
|
||
path: "view_admin.replacement_cost_cad",
|
||
num: true
|
||
}, {
|
||
label: "Date d'acquisition",
|
||
path: "view_cpa.acquisition_date",
|
||
type: "date"
|
||
}, {
|
||
label: "Date de mise en service",
|
||
path: "view_cpa.in_service_date",
|
||
type: "date"
|
||
}, {
|
||
label: "Durée de vie utile (ans)",
|
||
path: "view_admin.useful_life_years",
|
||
num: true
|
||
}, {
|
||
label: "Fournisseur",
|
||
path: "view_auditor.supplier"
|
||
}, {
|
||
label: "N° de facture",
|
||
path: "view_auditor.invoice_number"
|
||
}];
|
||
var PARENT_FIELDS = [{
|
||
label: "Nom / désignation",
|
||
path: "name"
|
||
}, {
|
||
label: "Assembleur",
|
||
path: "view_admin.assembler"
|
||
}, {
|
||
label: "Statut",
|
||
path: "view_admin.operational_status"
|
||
}, {
|
||
label: "Catégorie DPA",
|
||
path: "view_cpa.cca_class.id",
|
||
num: true,
|
||
select: "cca"
|
||
}, {
|
||
label: "Date de mise en service",
|
||
path: "view_cpa.in_service_date",
|
||
type: "date"
|
||
}];
|
||
function getPath(obj, dotted) {
|
||
return dotted.split(".").reduce(function (o, k) {
|
||
return o == null ? o : o[k];
|
||
}, obj);
|
||
}
|
||
var NOTE_CPA = "Ces calculs sont structurellement corrects mais indicatifs. DPA, FNACC, perte finale et récupération doivent être validés par un CPA avant toute déclaration fiscale. Aucun taux d'accélération n'est câblé en dur.";
|
||
function App() {
|
||
var _byId, _selected$view_cpa$nb, _accounting$entries, _selected$view_cpa$nb3;
|
||
var _useState = useState([]),
|
||
_useState2 = _slicedToArray(_useState, 2),
|
||
assets = _useState2[0],
|
||
setAssets = _useState2[1];
|
||
var _useState3 = useState(null),
|
||
_useState4 = _slicedToArray(_useState3, 2),
|
||
currentParent = _useState4[0],
|
||
setCurrentParent = _useState4[1];
|
||
var _useState5 = useState(null),
|
||
_useState6 = _slicedToArray(_useState5, 2),
|
||
selectedId = _useState6[0],
|
||
setSelectedId = _useState6[1];
|
||
var _useState7 = useState("owner"),
|
||
_useState8 = _slicedToArray(_useState7, 2),
|
||
view = _useState8[0],
|
||
setView = _useState8[1];
|
||
var _useState9 = useState(null),
|
||
_useState0 = _slicedToArray(_useState9, 2),
|
||
accounting = _useState0[0],
|
||
setAccounting = _useState0[1];
|
||
var _useState1 = useState(null),
|
||
_useState10 = _slicedToArray(_useState1, 2),
|
||
scrapCatId = _useState10[0],
|
||
setScrapCatId = _useState10[1];
|
||
var _useState11 = useState(null),
|
||
_useState12 = _slicedToArray(_useState11, 2),
|
||
modal = _useState12[0],
|
||
setModal = _useState12[1];
|
||
var _useState13 = useState(false),
|
||
_useState14 = _slicedToArray(_useState13, 2),
|
||
fabOpen = _useState14[0],
|
||
setFabOpen = _useState14[1];
|
||
var _useState15 = useState(null),
|
||
_useState16 = _slicedToArray(_useState15, 2),
|
||
toolSheet = _useState16[0],
|
||
setToolSheet = _useState16[1];
|
||
var _useState17 = useState(function () {
|
||
return localStorage.getItem("immos_welcome_v1") !== "1";
|
||
}),
|
||
_useState18 = _slicedToArray(_useState17, 2),
|
||
showWelcome = _useState18[0],
|
||
setShowWelcome = _useState18[1];
|
||
var load = useCallback(function () {
|
||
return api("/api/assets", "GET").then(setAssets);
|
||
}, []);
|
||
useEffect(function () {
|
||
load();
|
||
}, [load]);
|
||
var byId = function byId(id) {
|
||
return assets.find(function (a) {
|
||
return a.id === id;
|
||
}) || null;
|
||
};
|
||
var selected = byId(selectedId);
|
||
var parents = assets.filter(function (a) {
|
||
return a.type === "parent";
|
||
});
|
||
var childrenCount = function childrenCount(id) {
|
||
return assets.filter(function (a) {
|
||
return a.parent_id === id;
|
||
}).length;
|
||
};
|
||
var levelItems,
|
||
freePieces = [];
|
||
if (currentParent === null) {
|
||
levelItems = parents;
|
||
freePieces = assets.filter(function (a) {
|
||
return a.type === "piece" && a.parent_id === null;
|
||
});
|
||
} else {
|
||
levelItems = assets.filter(function (a) {
|
||
return a.parent_id === currentParent;
|
||
});
|
||
}
|
||
var crumbs = [];
|
||
var p = currentParent;
|
||
while (p != null) {
|
||
var n = byId(p);
|
||
if (!n) break;
|
||
crumbs.unshift(n);
|
||
p = n.parent_id;
|
||
}
|
||
var goRoot = function goRoot() {
|
||
setCurrentParent(null);
|
||
setSelectedId(null);
|
||
setAccounting(null);
|
||
setScrapCatId(null);
|
||
setToolSheet(null);
|
||
setFabOpen(false);
|
||
};
|
||
var pick = function pick(n) {
|
||
setSelectedId(n.id);
|
||
setView("owner");
|
||
setAccounting(null);
|
||
setScrapCatId(null);
|
||
setFabOpen(false);
|
||
setToolSheet(null);
|
||
};
|
||
var drill = function drill(n) {
|
||
if (n.type === "parent") {
|
||
setCurrentParent(n.id);
|
||
setSelectedId(null);
|
||
setAccounting(null);
|
||
setFabOpen(false);
|
||
}
|
||
};
|
||
var closeSheet = function closeSheet() {
|
||
setSelectedId(null);
|
||
setAccounting(null);
|
||
setScrapCatId(null);
|
||
};
|
||
var refresh = function refresh(data) {
|
||
return setAssets(data.assets);
|
||
};
|
||
var detach = function detach(disp) {
|
||
var _selected$view_cpa;
|
||
if (!selected) return;
|
||
var catIdNow = ((_selected$view_cpa = selected.view_cpa) === null || _selected$view_cpa === void 0 || (_selected$view_cpa = _selected$view_cpa.cca_class) === null || _selected$view_cpa === void 0 ? void 0 : _selected$view_cpa.id) || 50;
|
||
api("/api/assets/".concat(selected.id, "/detach"), "POST", {
|
||
disposition: disp,
|
||
detachment_date: today()
|
||
}).then(function (d) {
|
||
setAccounting(d.accounting);
|
||
setAssets(d.assets);
|
||
if (d.accounting === null) setSelectedId(null);
|
||
if (disp === "scrap") setScrapCatId(catIdNow);
|
||
}).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || "inconnue"));
|
||
});
|
||
};
|
||
var attach = function attach(pid) {
|
||
if (!selected || !pid) return;
|
||
api("/api/assets/".concat(selected.id, "/attach"), "POST", {
|
||
parent_id: Number(pid)
|
||
}).then(function (d) {
|
||
refresh(d);
|
||
setSelectedId(null);
|
||
}).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || "inconnue"));
|
||
});
|
||
};
|
||
var remove = function remove() {
|
||
if (!selected) return;
|
||
if (!confirm("Supprimer \xAB ".concat(selected.name, " \xBB ? ").concat(selected.type === "parent" ? "Ses pièces deviendront libres." : ""))) return;
|
||
api("/api/assets/".concat(selected.id), "DELETE").then(function (d) {
|
||
refresh(d);
|
||
setSelectedId(null);
|
||
}).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || "inconnue"));
|
||
});
|
||
};
|
||
var setTagBearer = function setTagBearer(pieceId) {
|
||
api("/api/assets/".concat(pieceId, "/set-tag-bearer"), "POST").then(function (d) {
|
||
return refresh(d);
|
||
}).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || "inconnue"));
|
||
});
|
||
};
|
||
var swipeStartY = useRef(0);
|
||
var onTouchStart = function onTouchStart(e) {
|
||
swipeStartY.current = e.touches[0].clientY;
|
||
};
|
||
var onTouchEnd = function onTouchEnd(e) {
|
||
if (e.changedTouches[0].clientY - swipeStartY.current > 72) closeSheet();
|
||
};
|
||
var openModal = function openModal(m) {
|
||
setModal(m);
|
||
setToolSheet(null);
|
||
setFabOpen(false);
|
||
};
|
||
return React.createElement(React.Fragment, null, selected && React.createElement("div", {
|
||
className: "sheet-backdrop",
|
||
onClick: closeSheet
|
||
}), toolSheet && React.createElement("div", {
|
||
className: "sheet-backdrop",
|
||
style: {
|
||
zIndex: 45
|
||
},
|
||
onClick: function onClick() {
|
||
return setToolSheet(null);
|
||
}
|
||
}), fabOpen && React.createElement("div", {
|
||
className: "sheet-backdrop",
|
||
style: {
|
||
zIndex: 50,
|
||
background: "rgba(0,0,0,.35)"
|
||
},
|
||
onClick: function onClick() {
|
||
return setFabOpen(false);
|
||
}
|
||
}), React.createElement("div", {
|
||
className: "main"
|
||
}, React.createElement("div", {
|
||
className: "topbar"
|
||
}, React.createElement("span", {
|
||
className: "crumb" + (currentParent === null ? " current" : ""),
|
||
onClick: goRoot
|
||
}, "Immobilisations"), crumbs.map(function (c) {
|
||
return React.createElement(React.Fragment, {
|
||
key: c.id
|
||
}, React.createElement("span", {
|
||
className: "crumb-sep"
|
||
}, "\u203A"), React.createElement("span", {
|
||
className: "crumb current"
|
||
}, c.name));
|
||
}), React.createElement("div", {
|
||
className: "spacer"
|
||
}), React.createElement("div", {
|
||
className: "desktop-btns"
|
||
}, React.createElement("button", {
|
||
className: "bar btn-export",
|
||
onClick: function onClick() {
|
||
return openModal("rapport");
|
||
}
|
||
}, "Rapport fiscal"), React.createElement("button", {
|
||
className: "bar btn-export",
|
||
onClick: function onClick() {
|
||
return openModal("annexe8");
|
||
}
|
||
}, "Annexe 8"), React.createElement("button", {
|
||
className: "bar btn-export",
|
||
onClick: function onClick() {
|
||
return openModal("registry");
|
||
}
|
||
}, "Registre pool"), React.createElement("button", {
|
||
className: "bar btn-export",
|
||
onClick: function onClick() {
|
||
return openModal("export");
|
||
}
|
||
}, "Export immos"), React.createElement("button", {
|
||
className: "bar btn-new",
|
||
onClick: function onClick() {
|
||
return openModal("create_parent");
|
||
}
|
||
}, "+ Immobilisation"), React.createElement("button", {
|
||
className: "bar btn-new",
|
||
onClick: function onClick() {
|
||
return openModal("create_piece");
|
||
}
|
||
}, "+ Pi\xE8ce"), React.createElement("a", {
|
||
className: "bar btn-ghost",
|
||
href: "/static/aide.html",
|
||
target: "_blank",
|
||
style: {
|
||
textDecoration: "none"
|
||
}
|
||
}, "? Aide"), React.createElement("button", {
|
||
className: "bar btn-ghost",
|
||
onClick: function onClick() {
|
||
return openModal("backup");
|
||
}
|
||
}, "Sauvegardes"), React.createElement("button", {
|
||
className: "bar btn-ghost",
|
||
onClick: function onClick() {
|
||
return api("/api/seed-demo", "POST").then(refresh);
|
||
}
|
||
}, "Donn\xE9es d\xE9mo"), React.createElement("button", {
|
||
className: "bar btn-ghost",
|
||
onClick: function onClick() {
|
||
if (confirm("Vider toute la base ?")) api("/api/reset", "POST").then(function (d) {
|
||
refresh(d);
|
||
setSelectedId(null);
|
||
});
|
||
}
|
||
}, "R\xE9initialiser"))), React.createElement("div", {
|
||
className: "grid-wrap"
|
||
}, currentParent === null ? React.createElement(React.Fragment, null, React.createElement("p", {
|
||
className: "section-title"
|
||
}, "Immobilisations fiscales (", parents.length, ")"), parents.length === 0 && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune immobilisation. Cr\xE9e-en une, ou charge les donn\xE9es d\xE9mo."), React.createElement(Grid, {
|
||
items: levelItems,
|
||
selectedId: selectedId,
|
||
childrenCount: childrenCount,
|
||
onPick: pick,
|
||
onDrill: drill
|
||
}), React.createElement("p", {
|
||
className: "section-title"
|
||
}, "Pi\xE8ces libres (", freePieces.length, ")"), freePieces.length === 0 && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune pi\xE8ce libre."), React.createElement(Grid, {
|
||
items: freePieces,
|
||
selectedId: selectedId,
|
||
childrenCount: childrenCount,
|
||
onPick: pick,
|
||
onDrill: function onDrill() {},
|
||
freeZone: true
|
||
})) : React.createElement(React.Fragment, null, React.createElement("p", {
|
||
className: "section-title"
|
||
}, "Pi\xE8ces de ce parent (", levelItems.length, ")"), levelItems.length === 0 && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune pi\xE8ce rattach\xE9e."), React.createElement(Grid, {
|
||
items: levelItems,
|
||
selectedId: selectedId,
|
||
childrenCount: childrenCount,
|
||
onPick: pick,
|
||
onDrill: function onDrill() {}
|
||
})))), React.createElement("div", {
|
||
className: "panel" + (selected ? " open" : ""),
|
||
onTouchStart: onTouchStart,
|
||
onTouchEnd: onTouchEnd
|
||
}, React.createElement("div", {
|
||
className: "sheet-handle"
|
||
}), !selected && React.createElement("div", {
|
||
className: "panel-body",
|
||
style: {
|
||
color: "#64748b"
|
||
}
|
||
}, "S\xE9lectionne une immobilisation ou une pi\xE8ce pour voir et \xE9diter ses informations."), selected && React.createElement(React.Fragment, null, React.createElement("div", {
|
||
className: "panel-head"
|
||
}, React.createElement("div", null, React.createElement("h3", null, selected.name), React.createElement("div", {
|
||
className: "sub"
|
||
}, selected.type === "parent" ? "Immobilisation fiscale" : "Pièce d'inventaire", " \xB7 ", selected.view_admin.inventory_tag || "sans étiquette")), React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
gap: 6,
|
||
flexDirection: "column"
|
||
}
|
||
}, React.createElement("button", {
|
||
className: "icon-btn",
|
||
onClick: function onClick() {
|
||
return openModal("edit");
|
||
}
|
||
}, "Modifier"), React.createElement("button", {
|
||
className: "icon-btn",
|
||
onClick: remove,
|
||
style: {
|
||
borderColor: "#991b1b"
|
||
}
|
||
}, "Supprimer"))), React.createElement("div", {
|
||
className: "tabs"
|
||
}, [["owner", "Propriétaire"], ["cpa", "CPA"], ["auditor", "Auditeur"]].map(function (_ref) {
|
||
var _ref2 = _slicedToArray(_ref, 2),
|
||
k = _ref2[0],
|
||
l = _ref2[1];
|
||
return React.createElement("div", {
|
||
key: k,
|
||
className: "tab" + (view === k ? " active" : ""),
|
||
onClick: function onClick() {
|
||
return setView(k);
|
||
}
|
||
}, l);
|
||
})), React.createElement("div", {
|
||
className: "panel-body"
|
||
}, selected.type === "piece" && view === "owner" && React.createElement("div", null, React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
gap: 8,
|
||
marginBottom: 12,
|
||
flexWrap: "wrap",
|
||
alignItems: "center"
|
||
}
|
||
}, React.createElement("span", {
|
||
style: {
|
||
fontSize: 11,
|
||
padding: "2px 8px",
|
||
borderRadius: 999,
|
||
background: selected.view_admin.operational_status === "Actif" ? "#15803d" : selected.view_admin.operational_status === "Rebut" ? "#7f1d1d" : "#44403c",
|
||
color: "#e2e8f0"
|
||
}
|
||
}, selected.view_admin.operational_status), React.createElement("span", {
|
||
style: {
|
||
fontSize: 12,
|
||
color: "#94a3b8"
|
||
}
|
||
}, selected.parent_id ? ((_byId = byId(selected.parent_id)) === null || _byId === void 0 ? void 0 : _byId.name) || "—" : "Pièce libre")), React.createElement(Field, {
|
||
label: "Fabricant \xB7 Mod\xE8le",
|
||
value: "".concat(selected.view_admin.manufacturer || "—", " ").concat(selected.view_admin.model || "").trim()
|
||
}), React.createElement(Field, {
|
||
label: "Format",
|
||
value: selected.view_admin.form_factor || "—"
|
||
}), selected.parent_id !== null ? React.createElement(React.Fragment, null, React.createElement("div", {
|
||
className: "field"
|
||
}, React.createElement("b", null, selected.view_admin.is_tag_bearer ? "Étiquette d'assemblage (porteur ⭐)" : "Étiquette d'assemblage (héritée)"), selected.view_admin.inventory_tag || React.createElement("span", {
|
||
style: {
|
||
color: "#64748b"
|
||
}
|
||
}, "aucune")), selected.view_admin.is_tag_bearer ? React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
color: "#4ade80",
|
||
borderLeft: "2px solid #4ade80",
|
||
paddingLeft: 6,
|
||
marginBottom: 8
|
||
}
|
||
}, "Cette pi\xE8ce porte l'\xE9tiquette de l'assemblage.") : React.createElement("button", {
|
||
className: "act btn-attach",
|
||
style: {
|
||
marginBottom: 10,
|
||
width: "100%"
|
||
},
|
||
onClick: function onClick() {
|
||
return setTagBearer(selected.id);
|
||
}
|
||
}, "\u2B50 D\xE9signer comme porteur d'\xE9tiquette")) : React.createElement(React.Fragment, null, React.createElement(Field, {
|
||
label: "\xC9tiquette d'inventaire",
|
||
value: selected.view_admin.inventory_tag || "—"
|
||
})), React.createElement("div", {
|
||
className: "kpi"
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.capitalizable_base_cad), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "Co\xFBt d'acquisition")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt((_selected$view_cpa$nb = selected.view_cpa.nbv_linear_cad) !== null && _selected$view_cpa$nb !== void 0 ? _selected$view_cpa$nb : selected.view_cpa.capitalizable_base_cad), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "VNC lin\xE9aire"))), function (_selected$view_cpa$nb2, _selected$view_cpa$re) {
|
||
var cost = selected.view_cpa.capitalizable_base_cad;
|
||
var nbvL = (_selected$view_cpa$nb2 = selected.view_cpa.nbv_linear_cad) !== null && _selected$view_cpa$nb2 !== void 0 ? _selected$view_cpa$nb2 : cost;
|
||
var pct = cost > 0 ? Math.min(100, Math.round((1 - nbvL / cost) * 100)) : 100;
|
||
var col = pct > 80 ? "#ef4444" : pct > 50 ? "#f59e0b" : "#4ade80";
|
||
return React.createElement("div", {
|
||
style: {
|
||
marginBottom: 12
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
justifyContent: "space-between",
|
||
fontSize: 11,
|
||
color: "#94a3b8",
|
||
marginBottom: 4
|
||
}
|
||
}, React.createElement("span", null, "Amortissement lin\xE9aire indicatif"), React.createElement("span", {
|
||
style: {
|
||
color: col
|
||
}
|
||
}, pct, "% amorti")), React.createElement("div", {
|
||
style: {
|
||
background: "#334155",
|
||
height: 6,
|
||
borderRadius: 3
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
background: col,
|
||
height: "100%",
|
||
borderRadius: 3,
|
||
width: "".concat(pct, "%"),
|
||
transition: "width .4s"
|
||
}
|
||
})), React.createElement("div", {
|
||
style: {
|
||
fontSize: 11,
|
||
color: "#64748b",
|
||
marginTop: 4
|
||
}
|
||
}, "Dur\xE9e utile : ", selected.view_admin.useful_life_years, " ans \xB7 R\xE9siduelle : ", (_selected$view_cpa$re = selected.view_cpa.remaining_useful_life_years) === null || _selected$view_cpa$re === void 0 ? void 0 : _selected$view_cpa$re.toFixed(1), " ans"));
|
||
}(), React.createElement(Field, {
|
||
label: "Co\xFBt de remplacement",
|
||
value: fmt(selected.view_admin.replacement_cost_cad) + " $"
|
||
}), selected.parent_id === null && React.createElement(React.Fragment, null, React.createElement("div", {
|
||
className: "section-title",
|
||
style: {
|
||
marginTop: 10
|
||
}
|
||
}, "Rattacher \xE0 une immobilisation"), React.createElement(AttachControl, {
|
||
parents: parents,
|
||
onAttach: attach
|
||
})), selected.parent_id !== null && selected.view_admin.operational_status !== "Rebut" && React.createElement(React.Fragment, null, React.createElement("div", {
|
||
className: "section-title",
|
||
style: {
|
||
marginTop: 10
|
||
}
|
||
}, "D\xE9tacher"), React.createElement("div", {
|
||
className: "actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-free",
|
||
onClick: function onClick() {
|
||
return detach("free");
|
||
}
|
||
}, "Libre"), React.createElement("button", {
|
||
className: "act btn-stock",
|
||
onClick: function onClick() {
|
||
return detach("stock");
|
||
}
|
||
}, "Stock"), React.createElement("button", {
|
||
className: "act btn-scrap",
|
||
onClick: function onClick() {
|
||
return detach("scrap");
|
||
}
|
||
}, "Rebut"))), accounting && React.createElement("div", {
|
||
className: "journal"
|
||
}, React.createElement("div", {
|
||
style: {
|
||
fontWeight: 600,
|
||
marginBottom: 8,
|
||
fontSize: 13
|
||
}
|
||
}, "\xC9criture comptable \u2014 ", accounting.disposition_type), React.createElement("table", null, React.createElement("tbody", null, (_accounting$entries = accounting.entries) === null || _accounting$entries === void 0 ? void 0 : _accounting$entries.map(function (e, i) {
|
||
return React.createElement("tr", {
|
||
key: i
|
||
}, React.createElement("td", null, e.account), React.createElement("td", {
|
||
className: "num"
|
||
}, e.debit ? fmt(e.debit) : ""), React.createElement("td", {
|
||
className: "num"
|
||
}, e.credit ? fmt(e.credit) : ""));
|
||
})))), accounting && scrapCatId && React.createElement(DispForm, {
|
||
accounting: accounting,
|
||
catId: scrapCatId
|
||
})), selected.type === "piece" && view === "cpa" && React.createElement("div", null, React.createElement("div", {
|
||
className: "kpi"
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, selected.view_cpa.cca_class.dpa_rate * 100, "%"), React.createElement("div", {
|
||
className: "l"
|
||
}, "DPA \xB7 Cat. ", selected.view_cpa.cca_class.id)), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.capitalizable_base_cad), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "Base capitalisable"))), React.createElement("div", {
|
||
className: "kpi"
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.net_book_value_cad || 0), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "FNACC indicative")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, selected.view_cpa.reference_year), React.createElement("div", {
|
||
className: "l"
|
||
}, "Exercice de r\xE9f\xE9rence"))), React.createElement(Field, {
|
||
label: "Cat\xE9gorie DPA",
|
||
value: "Cat. ".concat(selected.view_cpa.cca_class.id, " \u2014 ").concat(selected.view_cpa.cca_class.description)
|
||
}), React.createElement(Field, {
|
||
label: "Date d'acquisition",
|
||
value: selected.view_cpa.acquisition_date || "—"
|
||
}), React.createElement(Field, {
|
||
label: "Date de mise en service",
|
||
value: selected.view_cpa.in_service_date || "—"
|
||
}), React.createElement(Field, {
|
||
label: "R\xE8gle de la demi-ann\xE9e",
|
||
value: selected.view_cpa.half_year_rule_applies ? "Applicable" : "Non"
|
||
}), React.createElement("div", {
|
||
style: {
|
||
background: "#1e293b",
|
||
border: "1px solid #334155",
|
||
borderRadius: 8,
|
||
padding: 12,
|
||
marginTop: 8
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
fontSize: 11,
|
||
color: "#94a3b8",
|
||
textTransform: "uppercase",
|
||
marginBottom: 8
|
||
}
|
||
}, "Amortissement lin\xE9aire indicatif"), React.createElement("div", {
|
||
className: "kpi",
|
||
style: {
|
||
marginBottom: 0
|
||
}
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.accum_deprec_linear_cad || 0), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "Cumul\xE9")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt((_selected$view_cpa$nb3 = selected.view_cpa.nbv_linear_cad) !== null && _selected$view_cpa$nb3 !== void 0 ? _selected$view_cpa$nb3 : selected.view_cpa.capitalizable_base_cad), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "VNC")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, (selected.view_cpa.remaining_useful_life_years || 0).toFixed(1)), React.createElement("div", {
|
||
className: "l"
|
||
}, "Ans restants")))), React.createElement("div", {
|
||
className: "note cpa"
|
||
}, NOTE_CPA)), selected.type === "piece" && view === "auditor" && React.createElement("div", null, React.createElement(Field, {
|
||
label: "Num\xE9ro de s\xE9rie",
|
||
value: selected.view_admin.serial_number || "—"
|
||
}), React.createElement(Field, {
|
||
label: "\xC9tiquette d'inventaire",
|
||
value: selected.view_admin.inventory_tag || "—"
|
||
}), React.createElement(Field, {
|
||
label: "Fournisseur",
|
||
value: selected.view_auditor.supplier || "—"
|
||
}), React.createElement(Field, {
|
||
label: "N\xB0 de facture",
|
||
value: selected.view_auditor.invoice_number || "—"
|
||
}), React.createElement(InvoiceAttachment, {
|
||
asset: selected,
|
||
onRefresh: refresh
|
||
}), React.createElement("div", {
|
||
className: "section-title",
|
||
style: {
|
||
marginTop: 12
|
||
}
|
||
}, "Piste d'audit"), (selected.view_auditor.audit_trail || []).slice().reverse().map(function (e, i) {
|
||
return React.createElement("div", {
|
||
key: i,
|
||
className: "audit-item"
|
||
}, React.createElement("div", {
|
||
style: {
|
||
color: "#facc15"
|
||
}
|
||
}, e.action), React.createElement("div", null, e.description), React.createElement("div", {
|
||
style: {
|
||
color: "#64748b"
|
||
}
|
||
}, e.timestamp));
|
||
})), selected.type === "parent" && view === "owner" && React.createElement("div", null, React.createElement("div", {
|
||
className: "kpi"
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.nbv_linear_total_cad || 0), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "VNC lin\xE9aire totale")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_admin.total_replacement_cost_cad || 0), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "Co\xFBt remplacement"))), React.createElement("div", {
|
||
className: "kpi"
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.capitalizable_base_cad), " $"), React.createElement("div", {
|
||
className: "l"
|
||
}, "Co\xFBt d'acquisition")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, selected.view_admin.pieces_count || 0), React.createElement("div", {
|
||
className: "l"
|
||
}, "Pi\xE8ces rattach\xE9es"))), React.createElement(Field, {
|
||
label: "Statut",
|
||
value: selected.view_admin.operational_status || "—"
|
||
}), React.createElement(Field, {
|
||
label: "Assembleur",
|
||
value: selected.view_admin.assembler || "—"
|
||
}), React.createElement(Field, {
|
||
label: "Date de mise en service",
|
||
value: selected.view_cpa.in_service_date || "—"
|
||
}), function (_pieces$find) {
|
||
var pieces = assets.filter(function (a) {
|
||
return a.parent_id === selected.id;
|
||
});
|
||
var bearerTag = (_pieces$find = pieces.find(function (pc) {
|
||
return pc.view_admin.is_tag_bearer;
|
||
})) === null || _pieces$find === void 0 || (_pieces$find = _pieces$find.view_admin) === null || _pieces$find === void 0 ? void 0 : _pieces$find.inventory_tag;
|
||
return React.createElement(React.Fragment, null, bearerTag ? React.createElement("div", {
|
||
style: {
|
||
marginBottom: 10,
|
||
fontSize: 12,
|
||
color: "#94a3b8"
|
||
}
|
||
}, "\xC9tiquette : ", React.createElement("b", {
|
||
style: {
|
||
color: "#e2e8f0"
|
||
}
|
||
}, bearerTag)) : React.createElement("div", {
|
||
style: {
|
||
marginBottom: 10,
|
||
fontSize: 12,
|
||
color: "#64748b"
|
||
}
|
||
}, "Aucun porteur d'\xE9tiquette d\xE9sign\xE9."), React.createElement("div", {
|
||
className: "section-title",
|
||
style: {
|
||
marginBottom: 8
|
||
}
|
||
}, "Composition"), pieces.length === 0 && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune pi\xE8ce rattach\xE9e."), pieces.map(function (pc) {
|
||
var _pc$view_cpa$nbv_line;
|
||
var cost = pc.view_cpa.capitalizable_base_cad;
|
||
var nbvL = (_pc$view_cpa$nbv_line = pc.view_cpa.nbv_linear_cad) !== null && _pc$view_cpa$nbv_line !== void 0 ? _pc$view_cpa$nbv_line : cost;
|
||
var pct = cost > 0 ? Math.min(100, Math.round((1 - nbvL / cost) * 100)) : 100;
|
||
var col = pct > 80 ? "#ef4444" : pct > 50 ? "#f59e0b" : "#4ade80";
|
||
return React.createElement("div", {
|
||
key: pc.id,
|
||
className: "audit-item",
|
||
style: {
|
||
borderLeftColor: pc.view_admin.is_tag_bearer ? "#facc15" : "#15803d"
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
justifyContent: "space-between",
|
||
cursor: "pointer"
|
||
},
|
||
onClick: function onClick() {
|
||
return pick(pc);
|
||
}
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
alignItems: "center",
|
||
gap: 6
|
||
}
|
||
}, pc.view_admin.is_tag_bearer && React.createElement("span", {
|
||
style: {
|
||
fontSize: 10,
|
||
background: "#713f12",
|
||
color: "#facc15",
|
||
padding: "1px 6px",
|
||
borderRadius: 999
|
||
}
|
||
}, "PORTEUR \u2B50"), React.createElement("span", null, pc.name)), React.createElement("div", {
|
||
style: {
|
||
color: "#64748b",
|
||
fontSize: 11
|
||
}
|
||
}, pc.view_admin.manufacturer, " ", pc.view_admin.model)), React.createElement("div", {
|
||
style: {
|
||
textAlign: "right",
|
||
whiteSpace: "nowrap",
|
||
fontSize: 12
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
color: col
|
||
}
|
||
}, fmt(nbvL), " $"), React.createElement("div", {
|
||
style: {
|
||
color: "#64748b"
|
||
}
|
||
}, pct, "% amorti"))), React.createElement("div", {
|
||
style: {
|
||
background: "#334155",
|
||
height: 4,
|
||
borderRadius: 2,
|
||
marginTop: 4
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
background: col,
|
||
height: "100%",
|
||
borderRadius: 2,
|
||
width: "".concat(pct, "%")
|
||
}
|
||
})), !pc.view_admin.is_tag_bearer && React.createElement("button", {
|
||
style: {
|
||
marginTop: 4,
|
||
fontSize: 11,
|
||
padding: "2px 8px",
|
||
background: "#1e3a5f",
|
||
border: "1px solid #2563eb",
|
||
color: "#93c5fd",
|
||
borderRadius: 4,
|
||
cursor: "pointer"
|
||
},
|
||
onClick: function onClick(e) {
|
||
e.stopPropagation();
|
||
setTagBearer(pc.id);
|
||
}
|
||
}, "\u2B50 D\xE9signer porteur"));
|
||
}), React.createElement("div", {
|
||
className: "kpi",
|
||
style: {
|
||
marginTop: 12
|
||
}
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.capitalizable_base_cad)), React.createElement("div", {
|
||
className: "l"
|
||
}, "Co\xFBt total (\u03A3)")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.nbv_linear_total_cad || 0)), React.createElement("div", {
|
||
className: "l"
|
||
}, "VNC lin\xE9aire (\u03A3)"))));
|
||
}(), React.createElement("button", {
|
||
className: "act btn-attach",
|
||
style: {
|
||
width: "100%",
|
||
marginTop: 8
|
||
},
|
||
onClick: function onClick() {
|
||
return drill(selected);
|
||
}
|
||
}, "Voir les pi\xE8ces de cette immobilisation \u2192")), selected.type === "parent" && view === "cpa" && React.createElement("div", null, React.createElement("div", {
|
||
className: "kpi"
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, selected.view_cpa.cca_class.dpa_rate * 100, "%"), React.createElement("div", {
|
||
className: "l"
|
||
}, "DPA \xB7 Cat. ", selected.view_cpa.cca_class.id)), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.capitalizable_base_cad)), React.createElement("div", {
|
||
className: "l"
|
||
}, "Base fiscale (\u03A3 co\xFBts)"))), React.createElement("div", {
|
||
className: "kpi"
|
||
}, React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_cpa.net_book_value_cad || 0)), React.createElement("div", {
|
||
className: "l"
|
||
}, "FNACC indicative (\u03A3 pi\xE8ces)")), React.createElement("div", null, React.createElement("div", {
|
||
className: "v"
|
||
}, fmt(selected.view_admin.total_replacement_cost_cad || 0)), React.createElement("div", {
|
||
className: "l"
|
||
}, "Co\xFBt remplacement total"))), React.createElement(Field, {
|
||
label: "Cat\xE9gorie DPA",
|
||
value: "Cat. ".concat(selected.view_cpa.cca_class.id, " \u2014 ").concat(selected.view_cpa.cca_class.description)
|
||
}), React.createElement(Field, {
|
||
label: "Date de mise en service",
|
||
value: selected.view_cpa.in_service_date || "—"
|
||
}), React.createElement(Field, {
|
||
label: "R\xE8gle de la demi-ann\xE9e",
|
||
value: selected.view_cpa.half_year_rule_applies ? "Applicable" : "Non"
|
||
}), React.createElement("div", {
|
||
className: "note cpa"
|
||
}, NOTE_CPA)), selected.type === "parent" && view === "auditor" && React.createElement("div", null, React.createElement(Field, {
|
||
label: "Assembleur",
|
||
value: selected.view_admin.assembler || "—"
|
||
}), React.createElement("div", {
|
||
className: "section-title",
|
||
style: {
|
||
marginTop: 8
|
||
}
|
||
}, "Pi\xE8ces composantes"), assets.filter(function (a) {
|
||
return a.parent_id === selected.id;
|
||
}).map(function (pc) {
|
||
var _pc$view_auditor, _pc$view_auditor2;
|
||
return React.createElement("div", {
|
||
key: pc.id,
|
||
className: "audit-item",
|
||
style: {
|
||
marginBottom: 8
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
fontWeight: 600
|
||
}
|
||
}, pc.name), React.createElement("div", {
|
||
style: {
|
||
color: "#64748b",
|
||
fontSize: 11
|
||
}
|
||
}, "S/N : ", pc.view_admin.serial_number || "—", " \xB7 ", ((_pc$view_auditor = pc.view_auditor) === null || _pc$view_auditor === void 0 ? void 0 : _pc$view_auditor.supplier) || "—", " \xB7 ", ((_pc$view_auditor2 = pc.view_auditor) === null || _pc$view_auditor2 === void 0 ? void 0 : _pc$view_auditor2.invoice_number) || "—"));
|
||
}), React.createElement("div", {
|
||
className: "section-title",
|
||
style: {
|
||
marginTop: 12
|
||
}
|
||
}, "Piste d'audit"), (selected.view_auditor.audit_trail || []).slice().reverse().map(function (e, i) {
|
||
return React.createElement("div", {
|
||
key: i,
|
||
className: "audit-item"
|
||
}, React.createElement("div", {
|
||
style: {
|
||
color: "#facc15"
|
||
}
|
||
}, e.action), React.createElement("div", null, e.description), React.createElement("div", {
|
||
style: {
|
||
color: "#64748b"
|
||
}
|
||
}, e.timestamp));
|
||
}))))), fabOpen && React.createElement("div", {
|
||
className: "fab-menu"
|
||
}, React.createElement("button", {
|
||
className: "fab-opt",
|
||
onClick: function onClick() {
|
||
setFabOpen(false);
|
||
openModal("create_piece");
|
||
}
|
||
}, React.createElement("span", null, "\uD83D\uDD29"), " Pi\xE8ce d'inventaire"), React.createElement("button", {
|
||
className: "fab-opt",
|
||
onClick: function onClick() {
|
||
setFabOpen(false);
|
||
openModal("create_parent");
|
||
}
|
||
}, React.createElement("span", null, "\uD83D\uDDA5\uFE0F"), " Immobilisation fiscale")), React.createElement("button", {
|
||
className: "fab" + (fabOpen ? " fab-open" : ""),
|
||
onClick: function onClick() {
|
||
return setFabOpen(!fabOpen);
|
||
},
|
||
style: {
|
||
fontSize: fabOpen ? "28px" : "30px",
|
||
letterSpacing: 0
|
||
}
|
||
}, fabOpen ? "×" : "+"), toolSheet === "fiscal" && React.createElement("div", {
|
||
className: "tool-sheet"
|
||
}, React.createElement("div", {
|
||
className: "tool-sheet-handle"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
onClick: function onClick() {
|
||
return openModal("rapport");
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\uD83D\uDCCA"), "Rapport fiscal"), React.createElement("div", {
|
||
className: "tool-sep"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
onClick: function onClick() {
|
||
return openModal("annexe8");
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\uD83D\uDCCB"), "Annexe 8 / Schedule 8"), React.createElement("div", {
|
||
className: "tool-sep"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
onClick: function onClick() {
|
||
return openModal("registry");
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\uD83D\uDDC2\uFE0F"), "Registre pool DPA"), React.createElement("div", {
|
||
className: "tool-sep"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
onClick: function onClick() {
|
||
return openModal("export");
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\uD83D\uDCE4"), "Export immobilisations")), toolSheet === "plus" && React.createElement("div", {
|
||
className: "tool-sheet"
|
||
}, React.createElement("div", {
|
||
className: "tool-sheet-handle"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
onClick: function onClick() {
|
||
return openModal("backup");
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\uD83D\uDCBE"), "Sauvegardes"), React.createElement("div", {
|
||
className: "tool-sep"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
onClick: function onClick() {
|
||
setToolSheet(null);
|
||
window.open('/static/aide.html', '_blank');
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\u2753"), "Guide d'utilisation"), React.createElement("div", {
|
||
className: "tool-sep"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
onClick: function onClick() {
|
||
setToolSheet(null);
|
||
api("/api/seed-demo", "POST").then(refresh);
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\uD83C\uDFB2"), "Donn\xE9es d\xE9mo"), React.createElement("div", {
|
||
className: "tool-sep"
|
||
}), React.createElement("button", {
|
||
className: "tool-opt",
|
||
style: {
|
||
color: "#f87171"
|
||
},
|
||
onClick: function onClick() {
|
||
setToolSheet(null);
|
||
if (confirm("Vider toute la base ?")) api("/api/reset", "POST").then(function (d) {
|
||
refresh(d);
|
||
setSelectedId(null);
|
||
});
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "tool-icon"
|
||
}, "\uD83D\uDDD1\uFE0F"), "R\xE9initialiser la base")), React.createElement("nav", {
|
||
className: "bottom-nav"
|
||
}, React.createElement("div", {
|
||
className: "nav-item" + (currentParent === null && !toolSheet ? " active" : ""),
|
||
onClick: goRoot
|
||
}, React.createElement("span", {
|
||
className: "nav-icon"
|
||
}, "\uD83C\uDFE0"), React.createElement("span", null, "Accueil")), React.createElement("div", {
|
||
className: "nav-item" + (toolSheet === "fiscal" ? " active" : ""),
|
||
onClick: function onClick() {
|
||
setToolSheet(function (t) {
|
||
return t === "fiscal" ? null : "fiscal";
|
||
});
|
||
setFabOpen(false);
|
||
closeSheet();
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "nav-icon"
|
||
}, "\uD83D\uDCCA"), React.createElement("span", null, "Fiscal")), React.createElement("div", {
|
||
className: "nav-spacer"
|
||
}), React.createElement("div", {
|
||
className: "nav-item" + (toolSheet === "plus" ? " active" : ""),
|
||
onClick: function onClick() {
|
||
setToolSheet(function (t) {
|
||
return t === "plus" ? null : "plus";
|
||
});
|
||
setFabOpen(false);
|
||
closeSheet();
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "nav-icon"
|
||
}, "\u2699\uFE0F"), React.createElement("span", null, "Plus")), React.createElement("div", {
|
||
className: "nav-item",
|
||
onClick: function onClick() {
|
||
return window.open('/static/aide.html', '_blank');
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "nav-icon"
|
||
}, "\u2753"), React.createElement("span", null, "Aide"))), modal === "create_parent" && React.createElement(CreateModal, {
|
||
fixedType: "parent",
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
},
|
||
onCreated: function onCreated(d) {
|
||
refresh(d);
|
||
setModal(null);
|
||
}
|
||
}), modal === "create_piece" && React.createElement(CreateModal, {
|
||
fixedType: "piece",
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
},
|
||
onCreated: function onCreated(d) {
|
||
refresh(d);
|
||
setModal(null);
|
||
}
|
||
}), modal === "edit" && selected && React.createElement(EditModal, {
|
||
asset: selected,
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
},
|
||
onSaved: function onSaved(d) {
|
||
refresh(d);
|
||
setModal(null);
|
||
}
|
||
}), modal === "export" && React.createElement(ExportModal, {
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
}
|
||
}), modal === "rapport" && React.createElement(RapportModal, {
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
}
|
||
}), modal === "registry" && React.createElement(RegistryModal, {
|
||
assets: assets,
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
}
|
||
}), modal === "annexe8" && React.createElement(Annexe8Modal, {
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
}
|
||
}), modal === "backup" && React.createElement(BackupModal, {
|
||
onClose: function onClose() {
|
||
return setModal(null);
|
||
},
|
||
onRestore: function onRestore() {
|
||
load();
|
||
setSelectedId(null);
|
||
setModal(null);
|
||
}
|
||
}), showWelcome && React.createElement(WelcomeModal, {
|
||
onClose: function onClose() {
|
||
return setShowWelcome(false);
|
||
}
|
||
}));
|
||
}
|
||
function Grid(_ref3) {
|
||
var items = _ref3.items,
|
||
selectedId = _ref3.selectedId,
|
||
childrenCount = _ref3.childrenCount,
|
||
onPick = _ref3.onPick,
|
||
onDrill = _ref3.onDrill,
|
||
freeZone = _ref3.freeZone;
|
||
return React.createElement("div", {
|
||
className: "grid"
|
||
}, items.map(function (node) {
|
||
var isParent = node.type === "parent";
|
||
var kids = childrenCount(node.id);
|
||
var cls = isParent ? "t-parent" : freeZone ? "t-piece-free" : "t-piece";
|
||
var lbl = isParent ? "Immo fiscale" : freeZone ? "Pièce libre" : "Pièce";
|
||
return React.createElement("div", {
|
||
key: node.id,
|
||
className: "card" + (selectedId === node.id ? " selected" : ""),
|
||
onClick: function onClick() {
|
||
return onPick(node);
|
||
}
|
||
}, React.createElement("span", {
|
||
className: "card-type " + cls
|
||
}, lbl), React.createElement("div", {
|
||
className: "card-name"
|
||
}, node.name), React.createElement("div", {
|
||
className: "card-sub"
|
||
}, node.view_admin.manufacturer, " ", node.view_admin.model), React.createElement("div", {
|
||
className: "card-foot"
|
||
}, React.createElement("span", {
|
||
className: "badge-status"
|
||
}, node.view_admin.operational_status), React.createElement("span", null, fmt(node.view_cpa.capitalizable_base_cad), " $")), isParent && kids > 0 && React.createElement("div", {
|
||
className: "drill",
|
||
onClick: function onClick(e) {
|
||
e.stopPropagation();
|
||
onDrill(node);
|
||
}
|
||
}, kids, " pi\xE8ce", kids > 1 ? "s" : "", " \u203A"));
|
||
}));
|
||
}
|
||
function AttachControl(_ref4) {
|
||
var parents = _ref4.parents,
|
||
onAttach = _ref4.onAttach;
|
||
var _useState19 = useState(""),
|
||
_useState20 = _slicedToArray(_useState19, 2),
|
||
sel = _useState20[0],
|
||
setSel = _useState20[1];
|
||
return React.createElement("div", null, React.createElement("select", {
|
||
value: sel,
|
||
onChange: function onChange(e) {
|
||
return setSel(e.target.value);
|
||
}
|
||
}, React.createElement("option", {
|
||
value: ""
|
||
}, "\u2014 Choisir un parent \u2014"), parents.map(function (p) {
|
||
return React.createElement("option", {
|
||
key: p.id,
|
||
value: p.id
|
||
}, p.name);
|
||
})), React.createElement("button", {
|
||
className: "act btn-attach",
|
||
onClick: function onClick() {
|
||
return onAttach(sel);
|
||
},
|
||
disabled: !sel
|
||
}, "Rattacher"));
|
||
}
|
||
function InvoiceAttachment(_ref5) {
|
||
var _asset$view_auditor;
|
||
var asset = _ref5.asset,
|
||
onRefresh = _ref5.onRefresh;
|
||
var fileId = ((_asset$view_auditor = asset.view_auditor) === null || _asset$view_auditor === void 0 ? void 0 : _asset$view_auditor.invoice_pdf_file_id) || "";
|
||
var _useState21 = useState(false),
|
||
_useState22 = _slicedToArray(_useState21, 2),
|
||
uploading = _useState22[0],
|
||
setUploading = _useState22[1];
|
||
var saveFileId = function saveFileId(newId) {
|
||
return api("/api/assets/".concat(asset.id), "PATCH", {
|
||
changes: {
|
||
"view_auditor.invoice_pdf_file_id": newId
|
||
}
|
||
}).then(function (d) {
|
||
return onRefresh(d);
|
||
});
|
||
};
|
||
var upload = function () {
|
||
var _upload = _asyncToGenerator(_regenerator().m(function _callee(e) {
|
||
var file, fd, r, d, _t;
|
||
return _regenerator().w(function (_context) {
|
||
while (1) switch (_context.p = _context.n) {
|
||
case 0:
|
||
file = e.target.files[0];
|
||
if (file) {
|
||
_context.n = 1;
|
||
break;
|
||
}
|
||
return _context.a(2);
|
||
case 1:
|
||
e.target.value = "";
|
||
setUploading(true);
|
||
fd = new FormData();
|
||
fd.append("file", file);
|
||
_context.p = 2;
|
||
_context.n = 3;
|
||
return fetch("/api/invoices", {
|
||
method: "POST",
|
||
body: fd
|
||
});
|
||
case 3:
|
||
r = _context.v;
|
||
_context.n = 4;
|
||
return r.json();
|
||
case 4:
|
||
d = _context.v;
|
||
if (r.ok) {
|
||
_context.n = 5;
|
||
break;
|
||
}
|
||
alert("Erreur : " + (d.detail || "upload échoué"));
|
||
return _context.a(2);
|
||
case 5:
|
||
if (!fileId) {
|
||
_context.n = 6;
|
||
break;
|
||
}
|
||
_context.n = 6;
|
||
return fetch("/api/invoices/".concat(fileId), {
|
||
method: "DELETE"
|
||
});
|
||
case 6:
|
||
_context.n = 7;
|
||
return saveFileId(d.file_id);
|
||
case 7:
|
||
_context.n = 9;
|
||
break;
|
||
case 8:
|
||
_context.p = 8;
|
||
_t = _context.v;
|
||
alert("Erreur lors de l'envoi.");
|
||
case 9:
|
||
_context.p = 9;
|
||
setUploading(false);
|
||
return _context.f(9);
|
||
case 10:
|
||
return _context.a(2);
|
||
}
|
||
}, _callee, null, [[2, 8, 9, 10]]);
|
||
}));
|
||
function upload(_x) {
|
||
return _upload.apply(this, arguments);
|
||
}
|
||
return upload;
|
||
}();
|
||
var remove = function () {
|
||
var _remove = _asyncToGenerator(_regenerator().m(function _callee2() {
|
||
return _regenerator().w(function (_context2) {
|
||
while (1) switch (_context2.n) {
|
||
case 0:
|
||
if (confirm("Retirer la facture jointe ?")) {
|
||
_context2.n = 1;
|
||
break;
|
||
}
|
||
return _context2.a(2);
|
||
case 1:
|
||
_context2.n = 2;
|
||
return fetch("/api/invoices/".concat(fileId), {
|
||
method: "DELETE"
|
||
});
|
||
case 2:
|
||
_context2.n = 3;
|
||
return saveFileId("");
|
||
case 3:
|
||
return _context2.a(2);
|
||
}
|
||
}, _callee2);
|
||
}));
|
||
function remove() {
|
||
return _remove.apply(this, arguments);
|
||
}
|
||
return remove;
|
||
}();
|
||
var ext = fileId.split(".").pop().toLowerCase();
|
||
var isImage = ["jpg", "jpeg", "png"].includes(ext);
|
||
return React.createElement("div", {
|
||
className: "field"
|
||
}, React.createElement("b", null, "Facture jointe"), fileId ? React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
gap: 6,
|
||
marginTop: 6,
|
||
flexWrap: "wrap"
|
||
}
|
||
}, React.createElement("a", {
|
||
href: "/api/invoices/".concat(fileId),
|
||
target: "_blank",
|
||
rel: "noreferrer",
|
||
className: "icon-btn"
|
||
}, isImage ? "🖼 Voir image" : "📄 Ouvrir PDF"), React.createElement("label", {
|
||
className: "icon-btn",
|
||
style: {
|
||
cursor: "pointer"
|
||
}
|
||
}, uploading ? "Envoi…" : "↩ Remplacer", React.createElement("input", {
|
||
type: "file",
|
||
accept: ".pdf,.jpg,.jpeg,.png",
|
||
style: {
|
||
display: "none"
|
||
},
|
||
onChange: upload,
|
||
disabled: uploading
|
||
})), React.createElement("button", {
|
||
className: "icon-btn",
|
||
style: {
|
||
borderColor: "#dc2626",
|
||
color: "#f87171"
|
||
},
|
||
onClick: remove
|
||
}, "\u2715 Retirer")) : React.createElement("div", {
|
||
style: {
|
||
marginTop: 6
|
||
}
|
||
}, React.createElement("label", {
|
||
className: "icon-btn",
|
||
style: {
|
||
cursor: "pointer",
|
||
display: "inline-block"
|
||
}
|
||
}, uploading ? "Envoi en cours…" : "📎 Joindre (PDF · JPG · PNG)", React.createElement("input", {
|
||
type: "file",
|
||
accept: ".pdf,.jpg,.jpeg,.png",
|
||
style: {
|
||
display: "none"
|
||
},
|
||
onChange: upload,
|
||
disabled: uploading
|
||
}))));
|
||
}
|
||
function CreateModal(_ref6) {
|
||
var fixedType = _ref6.fixedType,
|
||
onClose = _ref6.onClose,
|
||
onCreated = _ref6.onCreated;
|
||
var isParent = fixedType === "parent";
|
||
var _useState23 = useState([]),
|
||
_useState24 = _slicedToArray(_useState23, 2),
|
||
cats = _useState24[0],
|
||
setCats = _useState24[1];
|
||
var t = today();
|
||
var _useState25 = useState({
|
||
type: fixedType,
|
||
name: "",
|
||
cost_cad: "",
|
||
replacement_cost_cad: "",
|
||
manufacturer: "",
|
||
model: "",
|
||
form_factor: "",
|
||
serial_number: "",
|
||
inventory_tag: "",
|
||
acquisition_date: t,
|
||
in_service_date: isParent ? t : "",
|
||
cca_class_id: 50,
|
||
assembler: "Chezlepro Inc.",
|
||
supplier: "",
|
||
invoice_number: ""
|
||
}),
|
||
_useState26 = _slicedToArray(_useState25, 2),
|
||
f = _useState26[0],
|
||
setF = _useState26[1];
|
||
var up = function up(k, v) {
|
||
return setF(function (s) {
|
||
return _objectSpread(_objectSpread({}, s), {}, _defineProperty({}, k, v));
|
||
});
|
||
};
|
||
useEffect(function () {
|
||
api("/api/cca-categories", "GET").then(setCats);
|
||
}, []);
|
||
var submit = function submit() {
|
||
if (!f.name.trim()) {
|
||
alert("Nom requis.");
|
||
return;
|
||
}
|
||
api("/api/assets", "POST", _objectSpread(_objectSpread({}, f), {}, {
|
||
cost_cad: Number(f.cost_cad) || 0,
|
||
replacement_cost_cad: Number(f.replacement_cost_cad) || 0
|
||
})).then(onCreated).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || "inconnue"));
|
||
});
|
||
};
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
onClick: onClose
|
||
}, React.createElement("div", {
|
||
className: "modal",
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("h3", null, "Nouvelle ", isParent ? "immobilisation fiscale" : "pièce d'inventaire"), React.createElement("label", {
|
||
className: "fl"
|
||
}, "Nom / d\xE9signation *"), React.createElement("input", {
|
||
value: f.name,
|
||
onChange: function onChange(e) {
|
||
return up("name", e.target.value);
|
||
},
|
||
autoFocus: true
|
||
}), isParent ? React.createElement(React.Fragment, null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Assembleur"), React.createElement("input", {
|
||
value: f.assembler,
|
||
onChange: function onChange(e) {
|
||
return up("assembler", e.target.value);
|
||
}
|
||
}), React.createElement("label", {
|
||
className: "fl"
|
||
}, "Cat\xE9gorie DPA"), React.createElement("select", {
|
||
value: f.cca_class_id,
|
||
onChange: function onChange(e) {
|
||
return up("cca_class_id", Number(e.target.value));
|
||
}
|
||
}, cats.map(function (c) {
|
||
return React.createElement("option", {
|
||
key: c.id,
|
||
value: c.id
|
||
}, "Cat. ", c.id, " \u2014 ", c.description, " (", Math.round(c.dpa_rate * 100), "%)");
|
||
})), React.createElement("label", {
|
||
className: "fl"
|
||
}, "Date de mise en service"), React.createElement("input", {
|
||
type: "date",
|
||
value: f.in_service_date,
|
||
onChange: function onChange(e) {
|
||
return up("in_service_date", e.target.value);
|
||
}
|
||
}), React.createElement("div", {
|
||
className: "note fmt"
|
||
}, "L'immobilisation est cr\xE9\xE9e vide. Sa valeur = somme des pi\xE8ces que tu y rattacheras.")) : React.createElement(React.Fragment, null, React.createElement("div", {
|
||
style: {
|
||
display: "grid",
|
||
gridTemplateColumns: "1fr 1fr",
|
||
gap: "0 14px"
|
||
}
|
||
}, React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Co\xFBt (CAD)"), React.createElement("input", {
|
||
type: "number",
|
||
value: f.cost_cad,
|
||
onChange: function onChange(e) {
|
||
return up("cost_cad", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Co\xFBt remplacement (CAD)"), React.createElement("input", {
|
||
type: "number",
|
||
value: f.replacement_cost_cad,
|
||
onChange: function onChange(e) {
|
||
return up("replacement_cost_cad", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Num\xE9ro de s\xE9rie"), React.createElement("input", {
|
||
value: f.serial_number,
|
||
onChange: function onChange(e) {
|
||
return up("serial_number", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "\xC9tiquette d'inventaire"), React.createElement("input", {
|
||
value: f.inventory_tag,
|
||
onChange: function onChange(e) {
|
||
return up("inventory_tag", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Fabricant"), React.createElement("input", {
|
||
value: f.manufacturer,
|
||
onChange: function onChange(e) {
|
||
return up("manufacturer", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Mod\xE8le"), React.createElement("input", {
|
||
value: f.model,
|
||
onChange: function onChange(e) {
|
||
return up("model", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Format"), React.createElement("input", {
|
||
value: f.form_factor,
|
||
onChange: function onChange(e) {
|
||
return up("form_factor", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Date d'acquisition"), React.createElement("input", {
|
||
type: "date",
|
||
value: f.acquisition_date,
|
||
onChange: function onChange(e) {
|
||
return up("acquisition_date", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Fournisseur"), React.createElement("input", {
|
||
value: f.supplier,
|
||
onChange: function onChange(e) {
|
||
return up("supplier", e.target.value);
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "N\xB0 de facture"), React.createElement("input", {
|
||
value: f.invoice_number,
|
||
onChange: function onChange(e) {
|
||
return up("invoice_number", e.target.value);
|
||
}
|
||
}))), React.createElement("div", {
|
||
className: "note fmt"
|
||
}, "Cr\xE9\xE9e libre. La date de mise en service sera pos\xE9e au rattachement.")), React.createElement("div", {
|
||
className: "modal-actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
onClick: onClose
|
||
}, "Annuler"), React.createElement("button", {
|
||
className: "act btn-save",
|
||
onClick: submit
|
||
}, "Cr\xE9er"))));
|
||
}
|
||
function EditModal(_ref7) {
|
||
var asset = _ref7.asset,
|
||
onClose = _ref7.onClose,
|
||
onSaved = _ref7.onSaved;
|
||
var fields = asset.type === "parent" ? PARENT_FIELDS : PIECE_FIELDS;
|
||
var _useState27 = useState([]),
|
||
_useState28 = _slicedToArray(_useState27, 2),
|
||
cats = _useState28[0],
|
||
setCats = _useState28[1];
|
||
var initial = {};
|
||
fields.forEach(function (fd) {
|
||
initial[fd.path] = fd.path === "name" ? asset.name : getPath(asset, fd.path);
|
||
});
|
||
var _useState29 = useState(initial),
|
||
_useState30 = _slicedToArray(_useState29, 2),
|
||
vals = _useState30[0],
|
||
setVals = _useState30[1];
|
||
var up = function up(path, v) {
|
||
return setVals(function (s) {
|
||
return _objectSpread(_objectSpread({}, s), {}, _defineProperty({}, path, v));
|
||
});
|
||
};
|
||
useEffect(function () {
|
||
api("/api/cca-categories", "GET").then(setCats);
|
||
}, []);
|
||
var submit = function submit() {
|
||
var changes = {};
|
||
fields.forEach(function (fd) {
|
||
var v = vals[fd.path];
|
||
if (fd.num) v = Number(v);
|
||
var orig = fd.path === "name" ? asset.name : getPath(asset, fd.path);
|
||
if (v !== orig && v !== undefined && v !== "") changes[fd.path] = v;
|
||
});
|
||
if (Object.keys(changes).length === 0) {
|
||
onClose();
|
||
return;
|
||
}
|
||
api("/api/assets/".concat(asset.id), "PATCH", {
|
||
changes: changes
|
||
}).then(onSaved).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || "inconnue"));
|
||
});
|
||
};
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
onClick: onClose
|
||
}, React.createElement("div", {
|
||
className: "modal",
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("h3", null, "Modifier \u2014 ", asset.name), asset.type === "parent" && React.createElement("div", {
|
||
className: "locked",
|
||
style: {
|
||
marginBottom: 10
|
||
}
|
||
}, "La base amortissable (", fmt(asset.view_cpa.capitalizable_base_cad), " $) est calcul\xE9e \xE0 partir des pi\xE8ces."), React.createElement("div", {
|
||
style: {
|
||
display: "grid",
|
||
gridTemplateColumns: "1fr 1fr",
|
||
gap: "0 14px"
|
||
}
|
||
}, fields.map(function (fd) {
|
||
var _vals$fd$path, _vals$fd$path2;
|
||
return React.createElement("div", {
|
||
key: fd.path
|
||
}, React.createElement("label", {
|
||
className: "fl"
|
||
}, fd.label), fd.select === "cca" ? React.createElement("select", {
|
||
value: (_vals$fd$path = vals[fd.path]) !== null && _vals$fd$path !== void 0 ? _vals$fd$path : "",
|
||
onChange: function onChange(e) {
|
||
return up(fd.path, Number(e.target.value));
|
||
}
|
||
}, cats.map(function (c) {
|
||
return React.createElement("option", {
|
||
key: c.id,
|
||
value: c.id
|
||
}, "Cat. ", c.id, " \u2014 ", c.description, " (", Math.round(c.dpa_rate * 100), "%)");
|
||
})) : React.createElement("input", {
|
||
type: fd.type || (fd.num ? "number" : "text"),
|
||
step: fd.num ? "0.01" : undefined,
|
||
value: (_vals$fd$path2 = vals[fd.path]) !== null && _vals$fd$path2 !== void 0 ? _vals$fd$path2 : "",
|
||
onChange: function onChange(e) {
|
||
return up(fd.path, e.target.value);
|
||
}
|
||
}));
|
||
})), asset.type === "piece" && React.createElement("div", {
|
||
className: "note fmt"
|
||
}, "Modifier le co\xFBt recalcule automatiquement la base de l'immobilisation parente."), asset.type === "parent" && React.createElement("div", {
|
||
className: "note"
|
||
}, "Chaque modification est journalis\xE9e dans la piste d'audit."), React.createElement("div", {
|
||
className: "modal-actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
onClick: onClose
|
||
}, "Annuler"), React.createElement("button", {
|
||
className: "act btn-save",
|
||
onClick: submit
|
||
}, "Enregistrer"))));
|
||
}
|
||
function ExportModal(_ref8) {
|
||
var onClose = _ref8.onClose;
|
||
var _useState31 = useState(null),
|
||
_useState32 = _slicedToArray(_useState31, 2),
|
||
data = _useState32[0],
|
||
setData = _useState32[1];
|
||
useEffect(function () {
|
||
api("/api/fiscal-export", "GET").then(setData);
|
||
}, []);
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
onClick: onClose
|
||
}, React.createElement("div", {
|
||
className: "modal",
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("h3", null, "Export fiscal \u2014 immobilisations par cat\xE9gorie"), React.createElement("div", {
|
||
className: "note cpa",
|
||
style: {
|
||
marginBottom: 12
|
||
}
|
||
}, NOTE_CPA), !data && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Chargement\u2026"), data && data.classes.length === 0 && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune immobilisation \xE0 exporter."), data && data.classes.map(function (cls) {
|
||
return React.createElement("div", {
|
||
key: cls.cca_class_id,
|
||
style: {
|
||
marginBottom: 20
|
||
}
|
||
}, React.createElement("div", {
|
||
className: "section-title"
|
||
}, "Cat\xE9gorie ", cls.cca_class_id, " \u2014 ", cls.description, " \xB7 DPA ", Math.round(cls.dpa_rate * 100), "%"), React.createElement("table", {
|
||
className: "export"
|
||
}, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null, "Immobilisation"), React.createElement("th", null, "\xC9tiquette"), React.createElement("th", {
|
||
className: "num"
|
||
}, "Base CAD"), React.createElement("th", null, "Mise en service"), React.createElement("th", null, "\xBD an"), React.createElement("th", {
|
||
className: "num"
|
||
}, "Pi\xE8ces"))), React.createElement("tbody", null, cls.items.map(function (it) {
|
||
return React.createElement("tr", {
|
||
key: it.id
|
||
}, React.createElement("td", null, it.name), React.createElement("td", null, it.inventory_tag || "—"), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(it.base_cad)), React.createElement("td", null, it.in_service_date), React.createElement("td", null, it.half_year_rule ? "Oui" : "Non"), React.createElement("td", {
|
||
className: "num"
|
||
}, it.pieces_count));
|
||
}), React.createElement("tr", {
|
||
className: "total"
|
||
}, React.createElement("td", {
|
||
colSpan: "2"
|
||
}, "TOTAL Cat. ", cls.cca_class_id), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(cls.total_base_cad)), React.createElement("td", {
|
||
colSpan: "3"
|
||
})))));
|
||
}), React.createElement("div", {
|
||
className: "modal-actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
onClick: onClose
|
||
}, "Fermer"), React.createElement("a", {
|
||
className: "act btn-save",
|
||
style: {
|
||
textAlign: "center",
|
||
textDecoration: "none",
|
||
lineHeight: "20px"
|
||
},
|
||
href: "/api/fiscal-export.csv"
|
||
}, "T\xE9l\xE9charger CSV"))));
|
||
}
|
||
function RegistryModal(_ref9) {
|
||
var assets = _ref9.assets,
|
||
onClose = _ref9.onClose;
|
||
var _useState33 = useState([]),
|
||
_useState34 = _slicedToArray(_useState33, 2),
|
||
allCats = _useState34[0],
|
||
setAllCats = _useState34[1];
|
||
var _useState35 = useState(null),
|
||
_useState36 = _slicedToArray(_useState35, 2),
|
||
catId = _useState36[0],
|
||
setCatId = _useState36[1];
|
||
var _useState37 = useState(null),
|
||
_useState38 = _slicedToArray(_useState37, 2),
|
||
data = _useState38[0],
|
||
setData = _useState38[1];
|
||
var activeCatIds = _toConsumableArray(new Set(assets.filter(function (a) {
|
||
return a.type === "parent";
|
||
}).map(function (a) {
|
||
return a.view_cpa.cca_class.id;
|
||
}))).sort(function (a, b) {
|
||
return a - b;
|
||
});
|
||
useEffect(function () {
|
||
api("/api/cca-categories", "GET").then(function (cats) {
|
||
var _activeCatIds$;
|
||
setAllCats(cats);
|
||
var first = (_activeCatIds$ = activeCatIds[0]) !== null && _activeCatIds$ !== void 0 ? _activeCatIds$ : 50;
|
||
setCatId(first);
|
||
});
|
||
}, []);
|
||
useEffect(function () {
|
||
if (catId !== null) api("/api/cca-registry?cca_class_id=".concat(catId), "GET").then(setData);
|
||
}, [catId]);
|
||
var saveYear = function saveYear(y, patch) {
|
||
var base = {
|
||
year: y.year,
|
||
cca_class_id: catId,
|
||
dispositions: Number(y.dispositions),
|
||
adjustment_coeff: Number(y.adjustment_coeff),
|
||
pool_physically_empty: y.pool_physically_empty === "1" || y.pool_physically_empty === true,
|
||
additions_override: y.additions_override === "" || y.additions_override == null ? null : Number(y.additions_override)
|
||
};
|
||
api("/api/cca-registry/year", "POST", _objectSpread(_objectSpread({}, base), patch)).then(setData).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || ""));
|
||
});
|
||
};
|
||
var activeCats = allCats.filter(function (c) {
|
||
return activeCatIds.includes(c.id);
|
||
});
|
||
var catInfo = allCats.find(function (c) {
|
||
return c.id === catId;
|
||
});
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
onClick: onClose
|
||
}, React.createElement("div", {
|
||
className: "modal",
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("h3", null, "Registre fiscal \u2014 pool DPA par cat\xE9gorie"), React.createElement("div", {
|
||
className: "note cpa",
|
||
style: {
|
||
marginBottom: 10
|
||
}
|
||
}, NOTE_CPA), activeCats.length > 1 && React.createElement("div", {
|
||
style: {
|
||
marginBottom: 12
|
||
}
|
||
}, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Cat\xE9gorie active"), React.createElement("select", {
|
||
value: catId !== null && catId !== void 0 ? catId : "",
|
||
onChange: function onChange(e) {
|
||
setCatId(Number(e.target.value));
|
||
setData(null);
|
||
}
|
||
}, activeCats.map(function (c) {
|
||
return React.createElement("option", {
|
||
key: c.id,
|
||
value: c.id
|
||
}, "Cat. ", c.id, " \u2014 ", c.description, " (", Math.round(c.dpa_rate * 100), "%)");
|
||
}))), !data && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Chargement\u2026"), data && React.createElement(React.Fragment, null, React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
marginBottom: 10
|
||
}
|
||
}, React.createElement("b", null, "Cat. ", catId, " \u2014 ", catInfo === null || catInfo === void 0 ? void 0 : catInfo.description, " (", Math.round(((catInfo === null || catInfo === void 0 ? void 0 : catInfo.dpa_rate) || 0) * 100), "%)"), " \xB7 Actifs physiques : ", React.createElement("b", null, data.physical_count), ".", " ", "Coeff 0,5 = demi-ann\xE9e standard."), data.years.length === 0 && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune ann\xE9e. Ajoute des acquisitions dat\xE9es, ou cr\xE9e une ann\xE9e ci-dessous."), React.createElement("table", {
|
||
className: "export"
|
||
}, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null, "Ann\xE9e"), React.createElement("th", {
|
||
className: "num"
|
||
}, "FNACC ouv."), React.createElement("th", {
|
||
className: "num"
|
||
}, "Ajouts"), React.createElement("th", {
|
||
className: "num"
|
||
}, "Dispo."), React.createElement("th", {
|
||
className: "num"
|
||
}, "Coeff"), React.createElement("th", {
|
||
className: "num"
|
||
}, "DPA"), React.createElement("th", {
|
||
className: "num"
|
||
}, "FNACC cl\xF4t."), React.createElement("th", null, "Vid\xE9?"))), React.createElement("tbody", null, data.years.map(function (y) {
|
||
return React.createElement("tr", {
|
||
key: y.year
|
||
}, React.createElement("td", null, y.year), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.opening_ucc)), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.additions)), React.createElement("td", {
|
||
className: "num"
|
||
}, React.createElement("input", {
|
||
style: {
|
||
width: 80,
|
||
margin: 0,
|
||
padding: 4
|
||
},
|
||
type: "number",
|
||
defaultValue: y.dispositions,
|
||
onBlur: function onBlur(e) {
|
||
return saveYear(_objectSpread(_objectSpread({}, y), {}, {
|
||
dispositions: e.target.value
|
||
}));
|
||
}
|
||
})), React.createElement("td", {
|
||
className: "num"
|
||
}, React.createElement("input", {
|
||
style: {
|
||
width: 60,
|
||
margin: 0,
|
||
padding: 4
|
||
},
|
||
type: "number",
|
||
step: "0.1",
|
||
min: "0",
|
||
max: "1",
|
||
defaultValue: y.adjustment_coeff,
|
||
onBlur: function onBlur(e) {
|
||
return saveYear(_objectSpread(_objectSpread({}, y), {}, {
|
||
adjustment_coeff: e.target.value
|
||
}));
|
||
}
|
||
})), React.createElement("td", {
|
||
className: "num",
|
||
style: {
|
||
color: Number(y.terminal_loss) > 0 ? "#f87171" : Number(y.recapture) > 0 ? "#facc15" : "#e2e8f0"
|
||
}
|
||
}, Number(y.terminal_loss) > 0 ? "PF " + fmt(y.terminal_loss) : Number(y.recapture) > 0 ? "Réc " + fmt(y.recapture) : fmt(y.cca_claimed)), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.closing_ucc)), React.createElement("td", null, React.createElement("input", {
|
||
type: "checkbox",
|
||
defaultChecked: false,
|
||
onChange: function onChange(e) {
|
||
return saveYear(_objectSpread(_objectSpread({}, y), {}, {
|
||
pool_physically_empty: e.target.checked
|
||
}));
|
||
},
|
||
title: "Cat\xE9gorie vid\xE9e \u2192 perte finale"
|
||
})));
|
||
}))), React.createElement("div", {
|
||
className: "note"
|
||
}, "PF = perte finale (d\xE9ductible 100 %) \xB7 R\xE9c = r\xE9cup\xE9ration (revenu imposable)."), React.createElement(AddYearRow, {
|
||
onAdd: function onAdd(yr) {
|
||
return saveYear({
|
||
year: yr,
|
||
dispositions: 0,
|
||
adjustment_coeff: 0.5,
|
||
pool_physically_empty: false,
|
||
additions_override: null
|
||
});
|
||
}
|
||
})), React.createElement("div", {
|
||
className: "modal-actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
onClick: onClose
|
||
}, "Fermer"), catId && React.createElement("a", {
|
||
className: "act btn-save",
|
||
style: {
|
||
textAlign: "center",
|
||
textDecoration: "none",
|
||
lineHeight: "20px"
|
||
},
|
||
href: "/api/cca-registry.csv?cca_class_id=".concat(catId)
|
||
}, "T\xE9l\xE9charger CSV"))));
|
||
}
|
||
function AddYearRow(_ref0) {
|
||
var onAdd = _ref0.onAdd;
|
||
var _useState39 = useState(new Date().getFullYear()),
|
||
_useState40 = _slicedToArray(_useState39, 2),
|
||
yr = _useState40[0],
|
||
setYr = _useState40[1];
|
||
return React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
gap: 8,
|
||
alignItems: "flex-end",
|
||
marginTop: 12
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
flex: "0 0 140px"
|
||
}
|
||
}, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Ajouter une ann\xE9e"), React.createElement("input", {
|
||
type: "number",
|
||
value: yr,
|
||
onChange: function onChange(e) {
|
||
return setYr(e.target.value);
|
||
},
|
||
style: {
|
||
margin: 0
|
||
}
|
||
})), React.createElement("button", {
|
||
className: "act btn-attach",
|
||
style: {
|
||
flex: "0 0 120px"
|
||
},
|
||
onClick: function onClick() {
|
||
return onAdd(Number(yr));
|
||
}
|
||
}, "Ajouter"));
|
||
}
|
||
function Field(_ref1) {
|
||
var label = _ref1.label,
|
||
value = _ref1.value;
|
||
return React.createElement("div", {
|
||
className: "field"
|
||
}, React.createElement("b", null, label), String(value));
|
||
}
|
||
function DispForm(_ref10) {
|
||
var accounting = _ref10.accounting,
|
||
catId = _ref10.catId;
|
||
var detachYear = accounting.detachment_date ? Number(accounting.detachment_date.slice(0, 4)) : new Date().getFullYear();
|
||
var _useState41 = useState(detachYear),
|
||
_useState42 = _slicedToArray(_useState41, 2),
|
||
year = _useState42[0],
|
||
setYear = _useState42[1];
|
||
var _useState43 = useState(0),
|
||
_useState44 = _slicedToArray(_useState43, 2),
|
||
amount = _useState44[0],
|
||
setAmount = _useState44[1];
|
||
var _useState45 = useState(false),
|
||
_useState46 = _slicedToArray(_useState45, 2),
|
||
done = _useState46[0],
|
||
setDone = _useState46[1];
|
||
var _useState47 = useState(null),
|
||
_useState48 = _slicedToArray(_useState47, 2),
|
||
err = _useState48[0],
|
||
setErr = _useState48[1];
|
||
if (done) return React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
color: "#4ade80",
|
||
marginTop: 10,
|
||
borderLeft: "2px solid #4ade80",
|
||
paddingLeft: 6
|
||
}
|
||
}, "Disposition inscrite au pool Cat. ", catId, " \u2014 exercice ", year, " (", fmt(amount), " $).");
|
||
return React.createElement("div", {
|
||
style: {
|
||
marginTop: 12,
|
||
background: "#1e293b",
|
||
border: "1px solid #475569",
|
||
borderRadius: 8,
|
||
padding: 12
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
fontWeight: 600,
|
||
marginBottom: 8,
|
||
fontSize: 13
|
||
}
|
||
}, "Inscrire la disposition au pool fiscal \xB7 Cat. ", catId), React.createElement("div", {
|
||
style: {
|
||
display: "grid",
|
||
gridTemplateColumns: "1fr 1fr",
|
||
gap: "0 12px"
|
||
}
|
||
}, React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Exercice fiscal"), React.createElement("input", {
|
||
type: "number",
|
||
value: year,
|
||
onChange: function onChange(e) {
|
||
return setYear(Number(e.target.value));
|
||
},
|
||
style: {
|
||
margin: 0
|
||
}
|
||
})), React.createElement("div", null, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Produit de disposition (CAD)"), React.createElement("input", {
|
||
type: "number",
|
||
step: "0.01",
|
||
value: amount,
|
||
onChange: function onChange(e) {
|
||
return setAmount(e.target.value);
|
||
},
|
||
style: {
|
||
margin: 0
|
||
}
|
||
}))), React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
marginTop: 6,
|
||
marginBottom: 8
|
||
}
|
||
}, "Chezlepro ne revend pas de pi\xE8ces usag\xE9es \u2192 produit = ", React.createElement("b", null, "0 $"), ". N'inscrire un montant que si un produit r\xE9el a \xE9t\xE9 encaiss\xE9."), err && React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
color: "#f87171"
|
||
}
|
||
}, err), React.createElement("button", {
|
||
className: "act btn-save",
|
||
style: {
|
||
width: "100%",
|
||
marginTop: 4
|
||
},
|
||
onClick: function onClick() {
|
||
api("/api/cca-registry/year/add-disposition", "POST", {
|
||
year: Number(year),
|
||
cca_class_id: catId,
|
||
amount: Number(amount)
|
||
}).then(function () {
|
||
return setDone(true);
|
||
}).catch(function (e) {
|
||
return setErr("Erreur : " + (e.detail || "inconnue"));
|
||
});
|
||
}
|
||
}, "Confirmer (", Number(amount) === 0 ? "aucun produit, pool inchangé" : "".concat(fmt(amount), " $ inscrits"), ")"));
|
||
}
|
||
function Annexe8Modal(_ref11) {
|
||
var onClose = _ref11.onClose;
|
||
var _useState49 = useState(new Date().getFullYear() - 1),
|
||
_useState50 = _slicedToArray(_useState49, 2),
|
||
year = _useState50[0],
|
||
setYear = _useState50[1];
|
||
var _useState51 = useState(null),
|
||
_useState52 = _slicedToArray(_useState51, 2),
|
||
data = _useState52[0],
|
||
setData = _useState52[1];
|
||
var loadData = function loadData(y) {
|
||
return api("/api/annexe8?year=".concat(y), "GET").then(setData).catch(function () {
|
||
return setData(null);
|
||
});
|
||
};
|
||
useEffect(function () {
|
||
loadData(year);
|
||
}, [year]);
|
||
var totalDpa = data ? data.classes.reduce(function (s, c) {
|
||
return s + (c.year_data ? Number(c.year_data.cca_claimed) : 0);
|
||
}, 0) : 0;
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
onClick: onClose
|
||
}, React.createElement("div", {
|
||
className: "modal",
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("h3", null, "Annexe 8 \u2014 D\xE9duction pour amortissement (DPA)"), React.createElement("div", {
|
||
className: "note cpa",
|
||
style: {
|
||
marginBottom: 12
|
||
}
|
||
}, NOTE_CPA), React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
gap: 10,
|
||
alignItems: "flex-end",
|
||
marginBottom: 16
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
flex: "0 0 180px"
|
||
}
|
||
}, React.createElement("label", {
|
||
className: "fl"
|
||
}, "Exercice fiscal"), React.createElement("input", {
|
||
type: "number",
|
||
value: year,
|
||
onChange: function onChange(e) {
|
||
return setYear(Number(e.target.value));
|
||
},
|
||
style: {
|
||
margin: 0
|
||
}
|
||
})), React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
alignSelf: "center"
|
||
}
|
||
}, "Chezlepro Inc. \u2014 toutes cat\xE9gories actives")), !data && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Chargement\u2026"), data && data.classes.length === 0 && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune cat\xE9gorie active."), data && data.classes.length > 0 && React.createElement(React.Fragment, null, React.createElement("table", {
|
||
className: "export"
|
||
}, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null, "Cat\xE9gorie"), React.createElement("th", {
|
||
className: "num"
|
||
}, "FNACC ouv."), React.createElement("th", {
|
||
className: "num"
|
||
}, "Ajouts"), React.createElement("th", {
|
||
className: "num"
|
||
}, "Dispos."), React.createElement("th", {
|
||
className: "num"
|
||
}, "Ajust."), React.createElement("th", {
|
||
className: "num"
|
||
}, "Base DPA"), React.createElement("th", {
|
||
className: "num"
|
||
}, "DPA"), React.createElement("th", {
|
||
className: "num"
|
||
}, "FNACC cl\xF4t."))), React.createElement("tbody", null, data.classes.map(function (cls) {
|
||
var y = cls.year_data;
|
||
return React.createElement("tr", {
|
||
key: cls.cca_class_id
|
||
}, React.createElement("td", null, "Cat. ", cls.cca_class_id, React.createElement("br", null), React.createElement("span", {
|
||
style: {
|
||
color: "#64748b",
|
||
fontSize: 10
|
||
}
|
||
}, cls.description, " \xB7 ", Math.round(cls.dpa_rate * 100), "%")), y ? React.createElement(React.Fragment, null, React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.opening_ucc)), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.additions)), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.dispositions)), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.adjustment)), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.base_for_cca)), React.createElement("td", {
|
||
className: "num",
|
||
style: {
|
||
color: Number(y.terminal_loss) > 0 ? "#f87171" : Number(y.recapture) > 0 ? "#facc15" : "#e2e8f0"
|
||
}
|
||
}, Number(y.terminal_loss) > 0 ? "PF " + fmt(y.terminal_loss) : Number(y.recapture) > 0 ? "Réc " + fmt(y.recapture) : fmt(y.cca_claimed)), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(y.closing_ucc))) : React.createElement("td", {
|
||
colSpan: "7",
|
||
style: {
|
||
color: "#64748b"
|
||
}
|
||
}, "\u2014 Aucune donn\xE9e pour ", year, " \u2014"));
|
||
}), React.createElement("tr", {
|
||
className: "total"
|
||
}, React.createElement("td", null, "TOTAL DPA r\xE9clam\xE9e"), React.createElement("td", {
|
||
colSpan: "5"
|
||
}), React.createElement("td", {
|
||
className: "num"
|
||
}, fmt(totalDpa)), React.createElement("td", null)))), React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
marginTop: 8
|
||
}
|
||
}, "PF = perte finale \xB7 R\xE9c = r\xE9cup\xE9ration \xB7 G\xE9n\xE9r\xE9 le ", data.generated_at)), React.createElement("div", {
|
||
className: "modal-actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
onClick: onClose
|
||
}, "Fermer"), React.createElement("a", {
|
||
className: "act btn-save",
|
||
style: {
|
||
textAlign: "center",
|
||
textDecoration: "none",
|
||
lineHeight: "20px"
|
||
},
|
||
href: "/api/annexe8.csv?year=".concat(year)
|
||
}, "T\xE9l\xE9charger CSV"))));
|
||
}
|
||
function RapportModal(_ref12) {
|
||
var onClose = _ref12.onClose;
|
||
var thisYear = new Date().getFullYear();
|
||
var _useState53 = useState(thisYear - 1),
|
||
_useState54 = _slicedToArray(_useState53, 2),
|
||
year = _useState54[0],
|
||
setYear = _useState54[1];
|
||
var _useState55 = useState(null),
|
||
_useState56 = _slicedToArray(_useState55, 2),
|
||
data = _useState56[0],
|
||
setData = _useState56[1];
|
||
var _useState57 = useState(false),
|
||
_useState58 = _slicedToArray(_useState57, 2),
|
||
busy = _useState58[0],
|
||
setBusy = _useState58[1];
|
||
var loadData = function loadData(y) {
|
||
setBusy(true);
|
||
api("/api/rapport-fiscal?year=".concat(y), "GET").then(function (d) {
|
||
setData(d);
|
||
setBusy(false);
|
||
}).catch(function () {
|
||
return setBusy(false);
|
||
});
|
||
};
|
||
useEffect(function () {
|
||
loadData(year);
|
||
}, [year]);
|
||
var s1 = data === null || data === void 0 ? void 0 : data.schedule1;
|
||
var net = s1 ? s1.book_deprec_cad + s1.recapture_cad - s1.cca_claimed_cad - s1.terminal_loss_cad : 0;
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
onClick: onClose
|
||
}, React.createElement("div", {
|
||
className: "modal",
|
||
style: {
|
||
width: 820
|
||
},
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
justifyContent: "space-between",
|
||
alignItems: "center",
|
||
marginBottom: 16
|
||
}
|
||
}, React.createElement("h3", {
|
||
style: {
|
||
margin: 0
|
||
}
|
||
}, "Rapport fiscal"), React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
gap: 8,
|
||
alignItems: "center"
|
||
}
|
||
}, React.createElement("label", {
|
||
style: {
|
||
fontSize: 12,
|
||
color: "#94a3b8"
|
||
}
|
||
}, "Exercice"), React.createElement("select", {
|
||
style: {
|
||
width: 90
|
||
},
|
||
value: year,
|
||
onChange: function onChange(e) {
|
||
return setYear(Number(e.target.value));
|
||
}
|
||
}, _toConsumableArray(Array(6)).map(function (_, i) {
|
||
var y = thisYear - 1 - i;
|
||
return React.createElement("option", {
|
||
key: y,
|
||
value: y
|
||
}, y);
|
||
})), React.createElement("a", {
|
||
href: "/api/rapport-fiscal.html?year=".concat(year),
|
||
target: "_blank",
|
||
className: "bar btn-export",
|
||
style: {
|
||
textDecoration: "none",
|
||
padding: "9px 13px",
|
||
fontSize: 13
|
||
}
|
||
}, "Ouvrir rapport imprimable"))), busy && React.createElement("div", {
|
||
className: "empty"
|
||
}, "Calcul en cours\u2026"), !busy && s1 && React.createElement(React.Fragment, null, React.createElement("p", {
|
||
style: {
|
||
fontSize: 12,
|
||
color: "#94a3b8",
|
||
margin: "0 0 14px"
|
||
}
|
||
}, "Ajustements \xE0 inscrire dans l'", React.createElement("b", null, "Annexe 1 / Schedule 1"), " de ton T2 et CO-17."), React.createElement("table", {
|
||
className: "export"
|
||
}, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null, "Ajustement"), React.createElement("th", null, "Ligne T2 Sch.\xA01"), React.createElement("th", null, "Ligne CO-17 Ann.\xA01"), React.createElement("th", {
|
||
style: {
|
||
textAlign: "right"
|
||
}
|
||
}, "Montant"), React.createElement("th", null, "Effet"))), React.createElement("tbody", null, React.createElement("tr", null, React.createElement("td", null, "Amortissement comptable (add-back)", React.createElement("div", {
|
||
style: {
|
||
fontSize: 10,
|
||
color: "#64748b"
|
||
}
|
||
}, "estim\xE9 selon dur\xE9es de vie utiles")), React.createElement("td", null, "104"), React.createElement("td", null, "130"), React.createElement("td", {
|
||
className: "num fmt"
|
||
}, fmt(s1.book_deprec_cad), " $"), React.createElement("td", {
|
||
style: {
|
||
color: "#f87171"
|
||
}
|
||
}, "+ revenu")), React.createElement("tr", null, React.createElement("td", null, "R\xE9cup\xE9ration d'amortissement"), React.createElement("td", null, "107"), React.createElement("td", null, "135"), React.createElement("td", {
|
||
className: "num fmt"
|
||
}, s1.recapture_cad ? fmt(s1.recapture_cad) + " $" : "—"), React.createElement("td", {
|
||
style: {
|
||
color: "#f87171"
|
||
}
|
||
}, "+ revenu")), React.createElement("tr", {
|
||
style: {
|
||
background: "#1e3a5f"
|
||
}
|
||
}, React.createElement("td", null, React.createElement("b", null, "DPA r\xE9clam\xE9e \u2014 toutes cat\xE9gories")), React.createElement("td", null, React.createElement("b", null, "410")), React.createElement("td", null, React.createElement("b", null, "150")), React.createElement("td", {
|
||
className: "num fmt",
|
||
style: {
|
||
color: "#4ade80"
|
||
}
|
||
}, React.createElement("b", null, fmt(s1.cca_claimed_cad), " $")), React.createElement("td", {
|
||
style: {
|
||
color: "#4ade80"
|
||
}
|
||
}, "\u2212 revenu")), React.createElement("tr", null, React.createElement("td", null, "Perte finale"), React.createElement("td", null, "414"), React.createElement("td", null, "155"), React.createElement("td", {
|
||
className: "num fmt"
|
||
}, s1.terminal_loss_cad ? fmt(s1.terminal_loss_cad) + " $" : "—"), React.createElement("td", {
|
||
style: {
|
||
color: "#4ade80"
|
||
}
|
||
}, "\u2212 revenu")), React.createElement("tr", {
|
||
style: {
|
||
background: "#1e293b",
|
||
borderTop: "2px solid #334155"
|
||
}
|
||
}, React.createElement("td", {
|
||
colSpan: 3
|
||
}, React.createElement("b", null, net > 0 ? "Augmentation nette du revenu imposable" : "Réduction nette du revenu imposable")), React.createElement("td", {
|
||
className: "num fmt"
|
||
}, React.createElement("b", {
|
||
style: {
|
||
color: net > 0 ? "#f87171" : "#4ade80"
|
||
}
|
||
}, fmt(Math.abs(net)), " $")), React.createElement("td", {
|
||
style: {
|
||
color: net > 0 ? "#f87171" : "#4ade80"
|
||
}
|
||
}, React.createElement("b", null, net > 0 ? "+" : "−"))))), React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
marginTop: 12
|
||
}
|
||
}, "Num\xE9ros de lignes pour l'exercice ", year, ". V\xE9rifier avec les formulaires officiels de l'ann\xE9e de production.")), React.createElement("div", {
|
||
className: "modal-actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
onClick: onClose
|
||
}, "Fermer"))));
|
||
}
|
||
function BackupModal(_ref13) {
|
||
var onClose = _ref13.onClose,
|
||
onRestore = _ref13.onRestore;
|
||
var _useState59 = useState([]),
|
||
_useState60 = _slicedToArray(_useState59, 2),
|
||
backups = _useState60[0],
|
||
setBackups = _useState60[1];
|
||
var _useState61 = useState(false),
|
||
_useState62 = _slicedToArray(_useState61, 2),
|
||
busy = _useState62[0],
|
||
setBusy = _useState62[1];
|
||
var loadBackups = function loadBackups() {
|
||
return api("/api/backups", "GET").then(setBackups);
|
||
};
|
||
useEffect(function () {
|
||
loadBackups();
|
||
}, []);
|
||
var createBackup = function createBackup() {
|
||
setBusy(true);
|
||
api("/api/backup", "POST").then(function (d) {
|
||
return setBackups(d.backups);
|
||
}).catch(function (e) {
|
||
return alert("Erreur : " + (e.detail || "inconnue"));
|
||
}).finally(function () {
|
||
return setBusy(false);
|
||
});
|
||
};
|
||
var restore = function restore(filename) {
|
||
if (!confirm("Restaurer \xAB ".concat(filename, " \xBB ?\n\nToutes les donn\xE9es actuelles seront remplac\xE9es."))) return;
|
||
setBusy(true);
|
||
api("/api/restore", "POST", {
|
||
filename: filename
|
||
}).then(function () {
|
||
return onRestore();
|
||
}).catch(function (e) {
|
||
alert("Erreur : " + (e.detail || "inconnue"));
|
||
setBusy(false);
|
||
});
|
||
};
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
onClick: onClose
|
||
}, React.createElement("div", {
|
||
className: "modal",
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("h3", null, "Sauvegardes"), React.createElement("button", {
|
||
onClick: createBackup,
|
||
disabled: busy,
|
||
className: "bar btn-new",
|
||
style: {
|
||
marginBottom: 16
|
||
}
|
||
}, busy ? "En cours…" : "Créer une sauvegarde maintenant"), backups.length === 0 ? React.createElement("div", {
|
||
className: "empty"
|
||
}, "Aucune sauvegarde. Cr\xE9e-en une ci-dessus.") : React.createElement("table", {
|
||
className: "export"
|
||
}, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null, "Fichier"), React.createElement("th", null, "Date"), React.createElement("th", {
|
||
className: "num"
|
||
}, "Taille"), React.createElement("th", null))), React.createElement("tbody", null, backups.map(function (b) {
|
||
return React.createElement("tr", {
|
||
key: b.filename
|
||
}, React.createElement("td", {
|
||
style: {
|
||
fontFamily: "monospace",
|
||
fontSize: 12
|
||
}
|
||
}, b.filename), React.createElement("td", null, b.created_at), React.createElement("td", {
|
||
className: "num"
|
||
}, b.size_kb, " ko"), React.createElement("td", null, React.createElement("button", {
|
||
onClick: function onClick() {
|
||
return restore(b.filename);
|
||
},
|
||
disabled: busy,
|
||
className: "icon-btn",
|
||
style: {
|
||
borderColor: "#dc2626",
|
||
color: "#f87171"
|
||
}
|
||
}, "Restaurer")));
|
||
}))), React.createElement("div", {
|
||
className: "note",
|
||
style: {
|
||
marginTop: 12
|
||
}
|
||
}, "Sauvegardes stock\xE9es dans ", React.createElement("code", null, "data/backups/"), "."), React.createElement("div", {
|
||
className: "modal-actions"
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
onClick: onClose
|
||
}, "Fermer"))));
|
||
}
|
||
function WelcomeModal(_ref14) {
|
||
var onClose = _ref14.onClose;
|
||
var _useState63 = useState(false),
|
||
_useState64 = _slicedToArray(_useState63, 2),
|
||
nePlus = _useState64[0],
|
||
setNePlus = _useState64[1];
|
||
var fermer = function fermer() {
|
||
if (nePlus) localStorage.setItem("immos_welcome_v1", "1");
|
||
onClose();
|
||
};
|
||
return React.createElement("div", {
|
||
className: "modal-bg",
|
||
style: {
|
||
zIndex: 70
|
||
}
|
||
}, React.createElement("div", {
|
||
className: "modal welcome-modal",
|
||
onClick: function onClick(e) {
|
||
return e.stopPropagation();
|
||
}
|
||
}, React.createElement("div", {
|
||
className: "welcome-logo"
|
||
}, "\uD83D\uDCCA"), React.createElement("div", {
|
||
className: "welcome-title"
|
||
}, "Mon Registraire"), React.createElement("div", {
|
||
className: "welcome-sub"
|
||
}, "Registre DPA \xB7 Annexe 8 \xB7 Piste d'audit \u2014 pour PME canadiennes"), React.createElement("div", {
|
||
className: "welcome-section"
|
||
}, React.createElement("h4", null, "Trois personnes. Un seul registre."), React.createElement("div", {
|
||
style: {
|
||
display: "grid",
|
||
gridTemplateColumns: "repeat(auto-fit,minmax(150px,1fr))",
|
||
gap: 10,
|
||
marginTop: 8
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
background: "#1e293b",
|
||
borderRadius: 8,
|
||
padding: "12px 14px",
|
||
borderTop: "2px solid #2563eb"
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
fontWeight: 700,
|
||
fontSize: 13,
|
||
marginBottom: 4
|
||
}
|
||
}, "Le dirigeant"), React.createElement("div", {
|
||
style: {
|
||
fontSize: 12,
|
||
color: "#94a3b8",
|
||
lineHeight: 1.5
|
||
}
|
||
}, "Voit la valeur nette, l'\xE9tat du parc et le co\xFBt de remplacement \u2014 sans jargon comptable.")), React.createElement("div", {
|
||
style: {
|
||
background: "#1e293b",
|
||
borderRadius: 8,
|
||
padding: "12px 14px",
|
||
borderTop: "2px solid #16a34a"
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
fontWeight: 700,
|
||
fontSize: 13,
|
||
marginBottom: 4
|
||
}
|
||
}, "Le CPA conseil"), React.createElement("div", {
|
||
style: {
|
||
fontSize: 12,
|
||
color: "#94a3b8",
|
||
lineHeight: 1.5
|
||
}
|
||
}, "Obtient la FNACC, les pools DPA par cat\xE9gorie et l'Annexe 8 CSV pr\xEAte \xE0 signer.")), React.createElement("div", {
|
||
style: {
|
||
background: "#1e293b",
|
||
borderRadius: 8,
|
||
padding: "12px 14px",
|
||
borderTop: "2px solid #7c3aed"
|
||
}
|
||
}, React.createElement("div", {
|
||
style: {
|
||
fontWeight: 700,
|
||
fontSize: 13,
|
||
marginBottom: 4
|
||
}
|
||
}, "L'auditeur"), React.createElement("div", {
|
||
style: {
|
||
fontSize: 12,
|
||
color: "#94a3b8",
|
||
lineHeight: 1.5
|
||
}
|
||
}, "Trouve les num\xE9ros de s\xE9rie, les factures jointes et la piste horodat\xE9e de chaque mouvement.")))), React.createElement("div", {
|
||
className: "welcome-section"
|
||
}, React.createElement("h4", null, "Ce que \xE7a produit"), React.createElement("ul", null, React.createElement("li", null, "Registre pool DPA multi-cat\xE9gories, multi-exercices (Cat. 8, 10, 12, 46, 50\u2026)"), React.createElement("li", null, "DPA, FNACC, perte finale et r\xE9cup\xE9ration \u2014 r\xE8gle de la demi-ann\xE9e incluse"), React.createElement("li", null, "Annexe 8 / Schedule 8 avec export CSV, rapport fiscal T2 / CO-17"), React.createElement("li", null, "Inventaire \xE0 deux niveaux : immobilisation fiscale \u2192 pi\xE8ces composantes"), React.createElement("li", null, "Factures jointes, sauvegardes horodat\xE9es, piste d'audit compl\xE8te"))), React.createElement("div", {
|
||
className: "welcome-section"
|
||
}, React.createElement("h4", null, "\xC0 savoir avant de commencer"), React.createElement("div", {
|
||
className: "welcome-warn"
|
||
}, React.createElement("ul", null, React.createElement("li", null, "Les calculs sont structurellement corrects mais ", React.createElement("strong", null, "indicatifs"), " \u2014 validation CPA obligatoire avant toute d\xE9claration."), React.createElement("li", null, "Non certifi\xE9 par l'ARC ni Revenu Qu\xE9bec. Aucun taux d'acc\xE9l\xE9ration temporaire automatique."), React.createElement("li", null, "Con\xE7u pour une seule entit\xE9 juridique \u2014 pas de consolidation multi-entit\xE9s.")))), React.createElement("div", {
|
||
className: "welcome-footer"
|
||
}, React.createElement("label", {
|
||
className: "welcome-check"
|
||
}, React.createElement("input", {
|
||
type: "checkbox",
|
||
checked: nePlus,
|
||
onChange: function onChange(e) {
|
||
return setNePlus(e.target.checked);
|
||
}
|
||
}), "Ne plus afficher cette page"), React.createElement("div", {
|
||
style: {
|
||
display: "flex",
|
||
gap: 8
|
||
}
|
||
}, React.createElement("a", {
|
||
href: "/static/apropos.html",
|
||
target: "_blank",
|
||
rel: "noopener",
|
||
style: {
|
||
textDecoration: "none"
|
||
}
|
||
}, React.createElement("button", {
|
||
className: "act btn-cancel",
|
||
style: {
|
||
minWidth: 130
|
||
},
|
||
type: "button"
|
||
}, "En savoir plus \u2192")), React.createElement("button", {
|
||
className: "act btn-save",
|
||
style: {
|
||
minWidth: 120
|
||
},
|
||
onClick: fermer
|
||
}, "Commencer")))));
|
||
}
|
||
ReactDOM.createRoot(document.getElementById("root")).render(React.createElement(App, null));
|