buhanka-finance-app 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.html +10 -7
  2. package/package.json +1 -1
package/index.html CHANGED
@@ -235,7 +235,7 @@ tr.subtotal>td:first-child{color:var(--accent);box-shadow:inset 3px 0 0 var(--ac
235
235
 
236
236
  <script>
237
237
  /* ============================================================ БУХАНКА · Финансы v2 ============================================================ */
238
- const APP_VERSION='3.9';
238
+ const APP_VERSION='4.0';
239
239
  const SCHEMA=3; /* версия структуры данных; растёт при доработках */
240
240
  const STORE_KEY='buhanka_finance_v9';/* НЕ МЕНЯТЬ НИКОГДА — иначе данные «слетят» при обновлении файла */
241
241
  const LEGACY_KEYS=['buhanka_finance_v8','buhanka_finance_v7','buhanka_finance_v6','buhanka_finance_v5'];
@@ -573,6 +573,9 @@ function opChannel(o){
573
573
  }
574
574
  const FIN_BASE=['Получение займа','Возврат займа','Дивиденды','Прочее (фин)'];
575
575
  const INV_BASE=['Покупка оборудования','Ремонт','Обеспечительные платежи','Прочее (инвест)'];
576
+ /* в CF статья называется «Закупки», в PnL остаётся «Себестоимость» */
577
+ const CF_LABEL={'Себестоимость':'Закупки'};
578
+ const cfLabel=c=>CF_LABEL[c]||c;
576
579
  /* ── группировка статей по разделам CF ── */
577
580
  function cfGroup(cat){
578
581
  if(FIN_BASE.includes(cat)) return 'fin';
@@ -1282,18 +1285,18 @@ function renderCF(C){
1282
1285
  html+=row('sub','Поступления',M.days.map(d=>cell(num(d.inSum))).join(''),`<b>${num(sumOf(x=>x.inSum))}</b>`);
1283
1286
  CHANNELS.forEach(([k,n])=>{ html+=row('val',n,M.days.map(d=>planCell(d,'ch:'+k,num(d.inc[k]||0))).join(''),num(sumOf(x=>x.inc[k]||0))); });
1284
1287
  html+=row('sub','Расходы',M.days.map(d=>cell(neg(d.exSum),'neg')).join(''),`<b class="neg">${neg(sumOf(x=>x.exSum))}</b>`);
1285
- M.cats.op.forEach(c=>{ html+=row('val',esc(c),M.days.map(d=>planCell(d,'ex:'+c,neg(d.exp[c]||0))).join(''),neg(sumOf(x=>x.exp[c]||0))); });
1288
+ M.cats.op.forEach(c=>{ html+=row('val',esc(cfLabel(c)),M.days.map(d=>planCell(d,'ex:'+c,neg(d.exp[c]||0))).join(''),neg(sumOf(x=>x.exp[c]||0))); });
1286
1289
 
1287
1290
  if(M.cats.fin.length){
1288
1291
  html+=row('sec','Финансовая деятельность',M.days.map(d=>cell(d.finSum>=0?num(d.finSum):neg(d.finSum),d.finSum>=0?'pos':'neg')).join(''),
1289
1292
  (()=>{const t=sumOf(x=>x.finSum);return `<b class="${t>=0?'pos':'neg'}">${t>=0?num(t):neg(t)}</b>`;})());
1290
- M.cats.fin.forEach(c=>{ html+=row('val',esc(c),M.days.map(d=>planCell(d,'fi:'+c,(d.fin[c]||0)>=0?num(d.fin[c]||0):neg(d.fin[c]||0))).join(''),
1293
+ M.cats.fin.forEach(c=>{ html+=row('val',esc(cfLabel(c)),M.days.map(d=>planCell(d,'fi:'+c,(d.fin[c]||0)>=0?num(d.fin[c]||0):neg(d.fin[c]||0))).join(''),
1291
1294
  (()=>{const t=sumOf(x=>x.fin[c]||0);return t>=0?num(t):neg(t);})()); });
1292
1295
  }
1293
1296
  if(M.cats.inv.length){
1294
1297
  html+=row('sec','Инвестиционная деятельность',M.days.map(d=>cell(d.invSum>=0?num(d.invSum):neg(d.invSum),d.invSum>=0?'pos':'neg')).join(''),
1295
1298
  (()=>{const t=sumOf(x=>x.invSum);return `<b class="${t>=0?'pos':'neg'}">${t>=0?num(t):neg(t)}</b>`;})());
1296
- M.cats.inv.forEach(c=>{ html+=row('val',esc(c),M.days.map(d=>planCell(d,'in:'+c,(d.inv[c]||0)>=0?num(d.inv[c]||0):neg(d.inv[c]||0))).join(''),
1299
+ M.cats.inv.forEach(c=>{ html+=row('val',esc(cfLabel(c)),M.days.map(d=>planCell(d,'in:'+c,(d.inv[c]||0)>=0?num(d.inv[c]||0):neg(d.inv[c]||0))).join(''),
1297
1300
  (()=>{const t=sumOf(x=>x.inv[c]||0);return t>=0?num(t):neg(t);})()); });
1298
1301
  }
1299
1302
 
@@ -1334,11 +1337,11 @@ function renderCF(C){
1334
1337
  html+=rowM('sub','Поступления',x=>x.inSum);
1335
1338
  CHANNELS.forEach(([k,n])=>{ html+=rowM('val',n,x=>x.inc[k]||0); });
1336
1339
  html+=rowM('sub','Расходы',x=>x.exSum,'neg');
1337
- catsY.op.forEach(c=>{ html+=rowM('val',esc(c),x=>x.exp[c]||0,'neg'); });
1340
+ catsY.op.forEach(c=>{ html+=rowM('val',esc(cfLabel(c)),x=>x.exp[c]||0,'neg'); });
1338
1341
  html+=rowM('sec','Финансовая деятельность',x=>x.finSum,'sgn');
1339
- catsY.fin.forEach(c=>{ html+=rowM('val',esc(c),x=>x.fin[c]||0,'sgn'); });
1342
+ catsY.fin.forEach(c=>{ html+=rowM('val',esc(cfLabel(c)),x=>x.fin[c]||0,'sgn'); });
1340
1343
  html+=rowM('sec','Инвестиционная деятельность',x=>x.invSum,'sgn');
1341
- catsY.inv.forEach(c=>{ html+=rowM('val',esc(c),x=>x.inv[c]||0,'sgn'); });
1344
+ catsY.inv.forEach(c=>{ html+=rowM('val',esc(cfLabel(c)),x=>x.inv[c]||0,'sgn'); });
1342
1345
  {
1343
1346
  let cells='',first=null,last=null;
1344
1347
  MM.forEach(M=>{ if(!M){ cells+='<td></td>'; return; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "buhanka-finance-app",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "description": "Buhanka bakery finance dashboard — single-file web app",
5
5
  "license": "MIT",
6
6
  "files": [