Загрузка ERP Капитал...

ERP Капитал

Требуется авторизация

{{ loginError }}

или
Войти через Cormod SSO
ERP Капитал
{{ (platformUsername||'?').slice(0,2).toUpperCase() }} {{ platformUsername }}
📁
📁 Выберите проект
📭
Нет доступных проектов
Обратитесь к администратору платформы
Cormod
ERP Капитал
{{ menuIcons[activeTab] || '📄' }} {{ currentTabName || 'Рабочий стол' }}

Общий баланс счетов

{{ formatCurrency(dashboard.total_balance_rub) }} ₽

Тело ваших кредитов

{{ formatCurrency(dashboard.upcoming_payments_to_others) }} ₽

Объем плана по графикам

{{ formatCurrency(dashboard.total_calendar_sum) }} ₽

{{ dashboardPeriodLabel }}
{{ day.dayName }} {{ day.dayNum }}
{{ pay.debtData?.contractor_name || pay.creditor_name.split(' | ')[0] }}
{{ pay.debtData ? (pay.debtData.actual_creditor_name || 'Не указано') + ' → ' + (pay.debtData.actual_borrower_name || 'Не указано') : pay.creditor_name.split(' | ')[0] }}
{{ pay.debtData?.obligation_name || (pay.creditor_name.includes(' | ') ? pay.creditor_name.split(' | ')[1] : '') }}
{{ formatCurrency(pay.cellData.amount !== undefined ? pay.cellData.amount : pay.regular_payment) }} ₽
План чист
Пн
Вт
Ср
Чт
Пт
Сб
Вс
{{ day.dayNum }}
{{ pay.debtData?.contractor_name || pay.creditor_name.split(' | ')[0] }} ({{ formatCurrency(pay.cellData.amount !== undefined ? pay.cellData.amount : pay.regular_payment) }} ₽) {{ pay.debtData ? (pay.debtData.actual_creditor_name || 'Не указано') + ' → ' + (pay.debtData.actual_borrower_name || 'Не указано') : pay.creditor_name.split(' | ')[0] }} ({{ formatCurrency(pay.cellData.amount !== undefined ? pay.cellData.amount : pay.regular_payment) }} ₽)

История и график платежей

{{ monthNamesFull[pay.month - 1] }} {{ pay.year }} {{ getPaymentStatusLabel(pay.status) }}
{{ formatCurrency(pay.amount !== undefined ? pay.amount : debt.regular_payment) }} ₽
{{ pay.paid_info }}

Остаток долга (тело)

{{ formatCurrency(totalDebtsRemaining) }} ₽

по всем обязательствам

К оплате в этом месяце

{{ formatCurrency(totalDebtsCurrentMonthDue) }} ₽

{{ monthNamesShort[new Date().getMonth()] }} {{ new Date().getFullYear() }}

Остаток по графику

{{ formatCurrency(totalDebtsCalculated) }} ₽

с учётом всех платежей

Общая просрочка

{{ formatCurrency(totalDebtsArrears) }} ₽

накопленных задолженностей

Пн
Вт
Ср
Чт
Пт
Сб
Вс
{{ day.dayNum }}
{{ pay.debtData?.obligation_name || pay.creditor_name.split(' | ')[1] || pay.creditor_name.split(' | ')[0] }} — {{ formatCurrency(pay.cellData.amount !== undefined ? pay.cellData.amount : pay.regular_payment) }} ₽
Сортировка:
Нет обязательств
{{ group.name }} {{ group.debts.length }} {{ group.debts.length === 1 ? 'договор' : group.debts.length < 5 ? 'договора' : 'договоров' }} Просрочка
Остаток
{{ formatCurrency(group.remaining) }} ₽
Разовый Рассрочка Только % На паузе Кредит {{ debt.obligation_name || '—' }}
{{ debt.actual_creditor_name || '—' }} {{ debt.actual_borrower_name || '—' }}
{{ assets.find(a=>a.id===debt.asset_id)?.name }}
Пл: {{ formatCurrency(debt.regular_payment) }} ₽ {{ getDay(debt.first_payment_date) }} числа
{{ formatCurrency(cell.amount !== undefined ? cell.amount : debt.regular_payment) }}
{{ monthNamesFull[selectedMonth] }} {{ formatCurrency(debt.full_schedule[selectedYear][selectedMonth].amount !== undefined ? debt.full_schedule[selectedYear][selectedMonth].amount : debt.regular_payment) }} ₽
Изначально:{{ formatCurrency(debt.total_amount) }} ₽
Остаток тела:{{ formatCurrency(debt.remaining_balance) }} ₽
Ставка:{{ debt.annual_rate }}% год.
Предмет:{{ assets.find(a=>a.id===debt.asset_id)?.name }}
Комментарий

{{ debt.comments || '—' }}

Реквизиты{{ debt.payment_details || '—' }}
Нет обязательств
{{ debtTypeLabel[group.type] || group.type }} {{ group.debts.length }} шт. Просрочка
Остаток
{{ formatCurrency(group.remaining) }} ₽
{{ debt.obligation_name || '—' }}
{{ debt.actual_creditor_name || '—' }} → {{ debt.actual_borrower_name || '—' }}
Пл: {{ formatCurrency(debt.regular_payment) }} ₽ {{ debt.annual_rate }}%
{{ formatCurrency(cell.amount !== undefined ? cell.amount : debt.regular_payment) }}
{{ monthNamesFull[selectedMonth] }} {{ formatCurrency(debt.full_schedule[selectedYear][selectedMonth].amount ?? debt.regular_payment) }} ₽
Сортировка:
Разовый Рассрочка Только % На паузе Кредит {{ debt.obligation_name || '—' }}
{{ debt.actual_creditor_name || 'Не указано' }} {{ debt.actual_borrower_name || 'Не указано' }}
{{ assets.find(a => a.id === debt.asset_id)?.name || '' }}
Пл: {{ formatCurrency(debt.regular_payment) }} ₽ {{ getDay(['one_time_credit', 'one_time_loan'].includes(debt.debt_type) ? debt.last_payment_date : debt.first_payment_date) }} числа
{{ formatCurrency(cell.amount !== undefined ? cell.amount : debt.regular_payment) }}
{{ monthNamesFull[selectedMonth] }} {{ formatCurrency(debt.full_schedule[selectedYear][selectedMonth].amount !== undefined ? debt.full_schedule[selectedYear][selectedMonth].amount : debt.regular_payment) }} ₽
Кредитор:{{ debt.actual_creditor_name || '—' }}
Заемщик:{{ debt.actual_borrower_name || '—' }}
Изначально:{{ formatCurrency(debt.total_amount) }} ₽
Остаток тела:{{ formatCurrency(debt.remaining_balance) }} ₽
Ставка:{{ debt.annual_rate }} % год.
Просрочка:{{ formatCurrency(debt.current_arrears) }} ₽
Предмет:{{ assets.find(a => a.id === debt.asset_id)?.name || '—' }}
Комментарий

{{ debt.comments || '—' }}

Реквизиты{{ debt.payment_details || '—' }}

Прикрепленные документы / Расписки

@ Счёт списания / зачисления
Ничего не найдено
{{ a.name }}{{ formatCurrency(a.balance) }} ₽
# Тип операции
{{ cat }}
* Статья / источник
Нет статей для этого типа
{{ s }}
! Обязательство
Нет обязательств
{{ d.obligation_name }}
{{ d.actual_creditor_name }} → {{ d.actual_borrower_name }}
& Имущество
Нет имущества
{{ a.name }}
> Счёт получателя
Нет других счетов
{{ a.name }}{{ formatCurrency(a.balance) }} ₽
/
Общий баланс активов
{{ formatCurrency(dashboard.total_balance_rub) }} ₽
Фильтр:
с по
Дата
{{ acc.name }}
{{ acc.account_type }}
{{ formatCurrency(acc.balance) }} ₽
{{ formatDateLedger(row.date) }}
{{ tx.amount > 0 ? '+' : '' }}{{ formatCurrency(tx.amount) }} {{ tx.category }}
⚠ Ждет руководителя
→ {{ tx.sub_category }}
{{ tx.description }}
Без счёта

📋 Системный журнал действий (Аудит)

[{{ formatLogTime(log.timestamp) }}] {{ log.user_name }} {{ log.description }}

Остаток долга нам (тело)

{{ formatCurrency(totalDebtorsRemaining) }} ₽

по всем займам

Ожидаем в этом месяце

{{ formatCurrency(totalDebtorsCurrentMonthDue) }} ₽

{{ monthNamesShort[new Date().getMonth()] }} {{ new Date().getFullYear() }}

Остаток по графику

{{ formatCurrency(totalDebtorsCalculated) }} ₽

с учётом всех платежей

Просрочено нам

{{ formatCurrency(totalDebtorsArrears) }} ₽

накопленных задолженностей

Пн
Вт
Ср
Чт
Пт
Сб
Вс
{{ day.dayNum }}
{{ pay.debtData?.obligation_name || pay.creditor_name.split(' | ')[1] || pay.creditor_name.split(' | ')[0] }} — {{ formatCurrency(pay.cellData.amount !== undefined ? pay.cellData.amount : pay.regular_payment) }} ₽
Сортировка:
Нет должников
{{ group.name }} {{ group.debts.length }} {{ group.debts.length === 1 ? 'договор' : group.debts.length < 5 ? 'договора' : 'договоров' }} Просрочка
Остаток
{{ formatCurrency(group.remaining) }} ₽
Только % Рассрочка На паузе Разовый Займ {{ debt.obligation_name || '—' }}
{{ debt.actual_creditor_name || '—' }} {{ debt.actual_borrower_name || '—' }}
{{ assets.find(a=>a.id===debt.asset_id)?.name }}
Пл: {{ formatCurrency(debt.regular_payment) }} ₽ {{ getDay(debt.first_payment_date) }} числа
{{ formatCurrency(cell.amount !== undefined ? cell.amount : debt.regular_payment) }}
{{ monthNamesFull[selectedMonth] }} {{ formatCurrency(debt.full_schedule[selectedYear][selectedMonth].amount !== undefined ? debt.full_schedule[selectedYear][selectedMonth].amount : debt.regular_payment) }} ₽
Изначально:{{ formatCurrency(debt.total_amount) }} ₽
Остаток долга:{{ formatCurrency(debt.remaining_balance) }} ₽
Ставка:{{ debt.annual_rate }}% год.
Комментарий

{{ debt.comments || '—' }}

Реквизиты{{ debt.payment_details || '—' }}
Нет займов
{{ debtTypeLabel[group.type] || group.type }} {{ group.debts.length }} шт. Просрочка
Остаток
{{ formatCurrency(group.remaining) }} ₽
{{ debt.obligation_name || '—' }}
{{ debt.actual_creditor_name || '—' }} → {{ debt.actual_borrower_name || '—' }}
Пл: {{ formatCurrency(debt.regular_payment) }} ₽ {{ debt.annual_rate }}%
{{ formatCurrency(cell.amount !== undefined ? cell.amount : debt.regular_payment) }}
{{ monthNamesFull[selectedMonth] }} {{ formatCurrency(debt.full_schedule[selectedYear][selectedMonth].amount ?? debt.regular_payment) }} ₽
Сортировка:
Только % Рассрочка На паузе Разовый Займ {{ debt.obligation_name || '—' }}
{{ debt.actual_creditor_name || 'Не указано' }} {{ debt.actual_borrower_name || 'Не указано' }}
{{ assets.find(a => a.id === debt.asset_id)?.name || '' }}
Пл: {{ formatCurrency(debt.regular_payment) }} ₽ {{ getDay(['one_time_credit', 'one_time_loan'].includes(debt.debt_type) ? debt.last_payment_date : debt.first_payment_date) }} числа
{{ formatCurrency(cell.amount !== undefined ? cell.amount : debt.regular_payment) }}
{{ monthNamesFull[selectedMonth] }} {{ formatCurrency(debt.full_schedule[selectedYear][selectedMonth].amount !== undefined ? debt.full_schedule[selectedYear][selectedMonth].amount : debt.regular_payment) }} ₽
Кредитор:{{ debt.actual_creditor_name || '—' }}
Заемщик:{{ debt.actual_borrower_name || '—' }}
Изначально:{{ formatCurrency(debt.total_amount) }} ₽
Остаток долга:{{ formatCurrency(debt.remaining_balance) }} ₽
Ставка:{{ debt.annual_rate }} % год.
Просрочка:{{ formatCurrency(debt.current_arrears) }} ₽
Предмет:{{ assets.find(a => a.id === debt.asset_id)?.name || '—' }}
Комментарий

{{ debt.comments || '—' }}

Реквизиты возврата{{ debt.payment_details || '—' }}

Прикрепленные документы / Расписки

🔍
Сортировка групп:
{{ group.name }} {{ group.items.length }} контрагентов
{{ c.name }} Сотрудник
{{ c.description || 'Нет описания' }}
Нам: {{ formatCurrency(getContractorMyDebtorsTotal(c.id)) }} ₽ Мы: {{ formatCurrency(getContractorMyCreditsTotal(c.id)) }} ₽ 🔴 {{ docTypeLabels[alert.doc_type] || alert.doc_type }}
Телефон:{{ c.phone }}
Адрес:{{ c.address }}
Дата рождения:{{ c.birth_date }}
Паспорт:{{ c.passport_series }} {{ c.passport_number }}
Кем выдан:{{ c.passport_issued_by }}
Дата выдачи:{{ c.passport_issue_date }}
Код подр.:{{ c.passport_division_code }}
Примечания:{{ c.comments }}
Личные данные не заполнены
Договоры
Нет договоров.
{{ d.obligation_name || 'Договор' }} {{ ['loan','loan_installment','loan_interest_only','loan_paused','one_time_loan'].includes(d.debt_type) ? 'Нам должны' : 'Мы должны' }}
Остаток: {{ formatCurrency(d.remaining_balance) }} ₽
Выплаты зарплаты
Итого: {{ formatCurrency(getContractorSalary(c.id).reduce((s,t) => s + Math.abs(t.amount), 0)) }} ₽
Выплат зарплаты нет.
{{ formatDateLedger(tx.transaction_date) }} {{ tx.description }}
{{ formatCurrency(Math.abs(tx.amount)) }} ₽
Операции по долгам
Долговых операций нет.
{{ formatDateLedger(tx.transaction_date) }} {{ tx.category }} {{ tx.description }}
{{ tx.amount > 0 ? '+' : '' }}{{ formatCurrency(tx.amount) }} ₽
Нет имущества.
{{ ast.real_estate_type === 'land' ? landName(ast) : ast.name }}
Оценка: {{ formatCurrency(ast.book_value) }} ₽
Загрузка...
Документы не загружены.
{{ doc.file_name.match(/\.pdf$/i) ? '📄' : doc.file_name.match(/\.(jpg|jpeg|png|gif|webp|heic)$/i) ? '🖼' : '📁' }}
{{ docTypeLabels[doc.doc_type] || doc.doc_type }} ПРОСРОЧЕН до {{ formatDocDate(doc.expiry_date) }}
{{ doc.file_name }} {{ doc.notes }}
{{ doc.upload_date }}
Нет контрагентов в этой категории.
Нет контрагентов. Добавьте первого!

Проекты

Проектов
{{ projects.length }}
Вложено (база)
{{ formatCurrency(projects.reduce((s,p) => s + (p.total_value||0), 0)) }} ₽
Потрачено всего
{{ formatCurrency(projects.reduce((s,p) => s + (p.total_spent||0), 0)) }} ₽
Доходы всего
{{ formatCurrency(projects.reduce((s,p) => s + (p.total_income||0), 0)) }} ₽
Влияет на стоимость
{{ formatCurrency(projects.reduce((s,p) => s + (p.balance_impact||0), 0)) }} ₽
Проект {{ p.name }} {{ p.contractor_name }}
{{ p.description || 'Нет описания' }}

Информация

Ответственный:{{ p.contractor_name }}
Базовая стоимость:{{ formatCurrency(p.total_value) }} ₽
Потрачено всего:{{ formatCurrency(p.total_spent) }} ₽
Доходы:{{ formatCurrency(p.total_income||0) }} ₽
Влияет на стоимость:{{ formatCurrency(p.balance_impact) }} ₽
Итог (база + влияющие):{{ formatCurrency((p.total_value||0) + (p.balance_impact||0)) }} ₽

Расходы

Расходов нет.
{{ formatDateLedger(tx.transaction_date) }} {{ tx.description }}
{{ formatCurrency(Math.abs(tx.amount)) }} ₽ В стоимость

Доходы

Доходов нет.
{{ formatDateLedger(tx.transaction_date) }} {{ tx.description }}
{{ formatCurrency(tx.amount) }} ₽
Проекты не добавлены.

Гос. номера

Государственные регистрационные знаки на хранении

Объектов

{{ licensePlates.length }}

Себестоимость

{{ licensePlates.some(p => p.purchase_price) ? formatCurrency(licensePlates.reduce((s,p) => s + (p.purchase_price||0), 0)) + ' ₽' : '—' }}

Цена продажи

{{ licensePlates.some(p => p.selling_price) ? formatCurrency(licensePlates.reduce((s,p) => s + (p.selling_price||0), 0)) + ' ₽' : '—' }}

🔢

Нет записей о гос. номерах

Гос. номер На хранение Контрагент Автомобиль Куплено Продажа Примечания
{{ lp.plate_number }} На продажу 🚗 На авто {{ lp.storage_date || '—' }} {{ contractors.find(c=>c.id===lp.contractor_id)?.name || '—' }} {{ assets.find(a=>a.id===lp.vehicle_asset_id)?.name || (lp.vehicle_asset_id ? '#'+lp.vehicle_asset_id : '—') }} {{ lp.purchase_price != null ? formatCurrency(lp.purchase_price) + ' ₽' : '—' }} {{ lp.selling_price != null ? formatCurrency(lp.selling_price) + ' ₽' : '—' }} {{ lp.notes || '' }}

{{ activeAssetTitle }}

{{ assetSubTab === 'real_estate' ? 'Квартиры, дома, участки, гаражи' : assetSubTab === 'vehicles' ? 'Автомобили, спецтехника, мотоциклы' : assetSubTab === 'other' ? 'Позиции без раздела' : assetSubTab === 'company' ? 'Имущество, принадлежащее фирме, из всех разделов' : assetSubTab === 'for_sale' ? 'Всё что выставлено на продажу из любых разделов' : 'Пользовательский раздел' }}

🔍
Тип
Город
Признак

Общая стоимость

{{ formatCurrency(filteredActiveAssets.reduce((s,a) => s + (a.book_value||0), 0)) }} ₽

{{ filteredActiveAssets.reduce((s,a)=>s+(a.quantity||1),0) }} шт всего
{{ row.model || row.name }} {{ row.name }}
{{ formatCurrency(row.purchase_price) }} ₽/шт {{ row.qty }} шт
Нет позиций
{{ loc.key === '__none__' ? '📦' : loc.isExternal ? '🏠' : '📍' }}{{ loc.label }} не наш {{ loc.total }} шт
{{ row.model || row.name }}
{{ formatCurrency(row.purchase_price) }} ₽/шт {{ row.qty }} шт
Нет позиций

{{ activeTab === 'real_estate' ? '🏠' : activeTab === 'vehicles' ? '🚗' : '📦' }}

Нет объектов в этом разделе

{{ assetSearch ? `Ничего не найдено по запросу «${assetSearch}»` : 'Ничего не найдено по выбранным фильтрам' }}

🔢 Гос. номера на продажу {{ licensePlates.filter(lp=>lp.for_sale).length }}
Гос. номер Контрагент Куплено Продажа
{{ lp.plate_number }} {{ contractors.find(c=>c.id===lp.contractor_id)?.name || '—' }} {{ lp.purchase_price != null ? formatCurrency(lp.purchase_price) + ' ₽' : '—' }} {{ lp.selling_price != null ? formatCurrency(lp.selling_price) + ' ₽' : '—' }}
Загрузка...
Действий не найдено
Создано Изменено Удалено

{{ entry.description }}

{{ entry.user_name }} · {{ formatAssetLogDate(entry.timestamp) }}

Сотрудников
{{ salaryEmployees.filter(e=>e.is_active).length }}
Фонд ЗП (оклады)
{{ formatCurrency(salaryEmployees.filter(e=>e.is_active).reduce((s,e)=>s+e.base_salary,0)) }} ₽
Ведомостей
{{ salaryStatements.length }} шт.
Выплачено всего
{{ formatCurrency(salaryStatements.reduce((s,st)=>s+st.total_amount,0)) }} ₽
✓ Ведомость №{{ currentStatement.id }} от {{ currentStatement.statement_date }} · {{ formatCurrency(currentStatement.total_amount) }} ₽
Ведомость не сформирована

Сотрудники

Нет сотрудников. Нажмите «+ Сотрудник» чтобы добавить.
{{ emp.contractor_name.charAt(0) }}
{{ emp.contractor_name }} {{ emp.position }} {{ emp.employment_type==='full'?'Штатный':emp.employment_type==='part'?'Совместитель':'Договор ГПХ' }}
Смена: {{ formatCurrency(emp.base_salary) }} ₽ Смен ({{ salaryPeriod.half === 1 ? '1–15' : '16–31' }}): {{ halfStats(emp.id).daysWorked }} · начислено: {{ formatCurrency(halfStats(emp.id).gross + halfStats(emp.id).overtime) }} ₽
Табель — {{ ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'][salaryPeriod.month-1] }} {{ salaryPeriod.year }} · {{ salaryPeriod.half === 1 ? '1–15' : '16–31' }}
Смен: {{ halfStats(emp.id).daysWorked }} Часов: {{ halfStats(emp.id).totalHours }} По сменам: {{ formatCurrency(halfStats(emp.id).gross) }} ₽ + СУ: {{ formatCurrency(halfStats(emp.id).overtime) }} ₽ + Премия: {{ formatCurrency(empBonuses[emp.id]) }} ₽ = {{ formatCurrency(halfStats(emp.id).gross + halfStats(emp.id).overtime + (empBonuses[emp.id] || 0)) }} ₽
{{ selectedShiftDays.length }} дн.
{{ d }}
{{ day }}
✓ зарплата выплачена

Клик по дню — открыть карточку смены. Выходные (оранжевый/красный) тоже кликаются.

Зарплатные ведомости

{{ salaryStatements.length }} шт.
Ведомостей ещё не было
№{{ stmt.id }}
{{ stmt.period_label }}
от {{ stmt.statement_date || '—' }} · {{ stmt.account_name }}
{{ formatCurrency(stmt.total_amount) }} ₽
{{ stmt.payments ? stmt.payments.length : 0 }} сотрудников
{{ openStatementIds.includes(stmt.id) ? '▲' : '▼' }}
Сотрудник Начислено Премия Аванс К выплате Примечание
{{ salaryEmployees.find(e=>e.id===pay.employee_id)?.contractor_name || '—' }} {{ formatCurrency(pay.gross_amount) }} ₽ {{ pay.bonus ? formatCurrency(pay.bonus) + ' ₽' : '—' }} {{ pay.deduction ? formatCurrency(pay.deduction) + ' ₽' : '—' }} {{ formatCurrency(pay.net_amount) }} ₽ {{ pay.notes || '' }}
Итого к выплате: {{ formatCurrency(stmt.total_amount) }} ₽
Нет данных по сотрудникам

Авансы

Всего выдано: {{ formatCurrency(salaryAdvances.reduce((s,a)=>s+a.amount,0)) }} ₽
Авансов ещё не было
Сотрудник Период Сумма Дата Примечание
{{ adv.contractor_name }} {{ adv.period_label || '—' }} {{ formatCurrency(adv.amount) }} ₽ {{ adv.advance_date }} {{ adv.notes || '' }}

Плановые доходы и расходы

Ежемесячные статьи отображаются в любом месяце

{{ monthNamesFull[planViewMonth] }} {{ planViewYear }}
Плановые доходы
+ {{ formatCurrency(planIncome(planViewYear, planViewMonth)) }} ₽
{{ getPlansForMonth(planViewYear, planViewMonth).filter(p => p.plan_type === 'income' && !p.is_completed).length }} пунктов
Плановые расходы
− {{ formatCurrency(planExpense(planViewYear, planViewMonth)) }} ₽
{{ getPlansForMonth(planViewYear, planViewMonth).filter(p => p.plan_type === 'expense' && !p.is_completed).length }} пунктов
Баланс месяца
{{ planIncome(planViewYear, planViewMonth) - planExpense(planViewYear, planViewMonth) >= 0 ? '+' : '−' }} {{ formatCurrency(Math.abs(planIncome(planViewYear, planViewMonth) - planExpense(planViewYear, planViewMonth))) }} ₽

Доходы

Нет плановых доходов
{{ p.category }} Ежемес.
{{ p.description }}
{{ p.planned_date }}
+ {{ formatCurrency(p.amount) }} ₽
Итого доходов: + {{ formatCurrency(planIncome(planViewYear, planViewMonth)) }} ₽

Расходы

Нет плановых расходов
{{ p.category }} Ежемес.
{{ p.description }}
{{ p.planned_date }}
− {{ formatCurrency(p.amount) }} ₽
Итого расходов: − {{ formatCurrency(planExpense(planViewYear, planViewMonth)) }} ₽

📦 Снабжение

Заявки на закупку материалов и товаров

Новых
{{ supplyRequests.filter(r=>r.status==='new').length }}
Заказано
{{ supplyRequests.filter(r=>r.status==='ordered').length }}
Получено
{{ supplyRequests.filter(r=>r.status==='received').length }}
Срочных
{{ supplyRequests.filter(r=>r.priority==='urgent'&&r.status!=='received'&&r.status!=='cancelled').length }}

📦

Заявок пока нет

{{ req.title }} {{ req.status_label }} 🔥 Срочно ↑ Высокий
{{ req.quantity }} {{ req.unit }} {{ formatCurrency(req.estimated_price) }} ₽ Поставщик: {{ req.supplier }} 👤 Получатель: {{ req.recipient }}
{{ req.description }}
{{ req.created_at }} · {{ req.created_by }}
Заявки не найдены
{{ supplyModal.isEdit ? '✏️ Редактировать заявку' : '📦 Новая заявка на снабжение' }}

Кто должен получить товар после доставки

{{ memoModal.id ? 'Редактировать памятку' : 'Новая памятка' }}

Нажмите «+ Добавить пункт»

✓ Красная галочка = обязательный документ

Загрузить шаблон документа

{{ docTemplateModal.file.name }} · {{ formatFileSize(docTemplateModal.file.size) }}

🎨 Внешний вид и Персонализация

Увеличенный шрифт подходит для комфортной проверки больших реестров, уменьшенный — для одновременного охвата всех счетов на матрице баланса.

👥 Управление доступом пользователей

{{ u.username[0].toUpperCase() }}
{{ u.username }} SSO
{{ u.role }} Редактирование {{ editUntilLabel(u) }}
Полные права
Редактирование операций:

📋 Статьи доходов

Нет статей. Добавьте ниже.

🤖 Telegram-бот — управление доступом

Пользователь, написавший боту, появляется здесь как «ожидающий». Вы одобряете или отклоняете, и выбираете, что именно ему доступно. Команда /myid покажет пользователю его Telegram ID.

Ожидают одобрения {{ botUsers.filter(u=>u.status==='pending').length }}
Нет новых запросов.
🔔
{{ u.first_name || u.label || 'Без имени' }} {{ u.last_name || '' }} @{{ u.username }}
ID: {{ u.telegram_id }} · {{ u.created_at }}
Выберите разрешения:
Одобренные {{ botUsers.filter(u=>u.status==='approved').length }}
Нет одобренных пользователей.
{{ u.first_name || u.label || 'Без имени' }} {{ u.last_name || '' }} @{{ u.username }}
ID: {{ u.telegram_id }}
Все права {{ botPermissions.find(x=>x.key===p)?.label || p }} 🔔 Уведомления
Разрешения:
Отклонённые ({{ botUsers.filter(u=>u.status==='rejected').length }})
🚫
{{ u.first_name || u.label || 'Без имени' }} {{ u.last_name || '' }}
ID: {{ u.telegram_id }}

🔑 Администрирование проекта

{{ currentProjectName }}

➕ Добавить пользователя

👥 Пользователи проекта

{{ users.length }} пользов.
Нет пользователей в проекте.
{{ (u.username || '?')[0].toUpperCase() }}
{{ u.full_name || u.username }} {{ u.username }} SSO {{ u.role === 'admin' ? 'Администратор' : u.role === 'operator' ? 'Оператор' : u.role === 'viewer' ? 'Наблюдатель' : u.role }} Редактирование {{ editUntilLabel(u) }}
ID: {{ u.id }}
Разрешить редактирование:

🤖 Telegram-бот — управление доступом

Пользователь, написавший боту, появляется здесь как «ожидающий». Одобрите или отклоните запрос и выберите доступные разделы.

Ожидают одобрения {{ botUsers.filter(u=>u.status==='pending').length }}
Нет новых запросов.
🔔
{{ u.first_name || u.label || 'Без имени' }} {{ u.last_name || '' }} @{{ u.username }}
ID: {{ u.telegram_id }} · {{ u.created_at }}
Выберите разрешения:
Одобренные {{ botUsers.filter(u=>u.status==='approved').length }}
Нет одобренных пользователей.
{{ u.first_name || u.label || 'Без имени' }} {{ u.last_name || '' }} @{{ u.username }}
ID: {{ u.telegram_id }}
Все права {{ botPermissions.find(x=>x.key===p)?.label || p }}
Разрешения:

Кредитный калькулятор

Ежемесячный платеж

{{ calcResult.paymentText }}

Переплата (Проценты)

{{ formatCurrency(calcResult.overpayment) }} ₽

Итого к возврату

{{ formatCurrency(calcResult.totalPayout) }} ₽

Месяц Сумма платежа Основной долг Проценты Остаток долга
{{ row.month }} {{ formatCurrency(row.payment) }} {{ formatCurrency(row.principal) }} {{ formatCurrency(row.interest) }} {{ formatCurrency(row.balance) }}
🧮

Введите данные и нажмите "Рассчитать график"

👤 Мой профиль
avatar {{ (currentUser?.username||'?').slice(0,2).toUpperCase() }}
Нажмите на фото для замены (JPG/PNG, до 2 МБ)

{{ editingTxId ? 'Редактирование операции' : 'Проведение транзакции' }}

{{ c.name }}
Не найдено
{{ assetLabel(ast) }}({{ formatCurrency(ast.book_value) }} ₽)
Не найдено
Нет этапов — добавьте их в карточке объекта.
Нет подходящих обязательств.
Сохранить без изменения баланса — подтвердить позже
💡 Операция сохранится без изменения баланса. Когда средства появятся — нажмите ✔ Апрув в ячейке.
Создать обязательство необязательно — только если нужно вести учёт
Сумма займа
{{ txData.amount ? formatCurrency(parseNumber(txData.amount)) + ' ₽' : '—' }}
из поля суммы выше
Дата выдачи
{{ txData.date || '—' }}
из поля даты выше
{{ c.name }}
Не найдено

Внимание руководителя

Сумма операции:

{{ resolveTxData.amount > 0 ? '+' : '' }}{{ formatCurrency(resolveTxData.amount) }} ₽

{{ resolveTxData.description }}

Управление счетами

{{ isEditingAccount ? 'Редактирование счета' : 'Новый счет' }}

Текущий баланс: {{ formatCurrency(newAccount.balance) }} ₽
{{ a.name }}
{{ a.account_type }} {{ a.interest_rate }}% ({{ a.interest_period === 'daily' ? 'день' : 'мес.' }}) −∞ минус
{{ formatCurrency(a.balance) }} ₽

Оплата по графику

Платёж за {{ payAction.payment_date ? monthNamesFull[parseInt(payAction.payment_date.split('-')[1]) - 1] + ' ' + payAction.payment_date.split('-')[0] : '' }}

{{ paymentModalData.contractor_name || paymentModalData.creditor_name.split(' | ')[0] }}

{{ paymentModalData.actual_creditor_name || 'Не указано' }} → {{ paymentModalData.actual_borrower_name || 'Не указано' }}

{{ paymentModalData.obligation_name || (paymentModalData.creditor_name.includes(' | ') ? paymentModalData.creditor_name.split(' | ')[1] : '') }}

Остаток долга
{{ formatCurrency(paymentModalData.remaining_balance) }} ₽
Ставка
{{ paymentModalData.annual_rate }}%
Платёж
{{ formatCurrency(paymentModalData.regular_payment) }} ₽
Счёт не требуется
{{ infoModalTx?.is_partial ? '½' : '✓' }} {{ infoModalTitle }}
{{ infoModalTx.is_partial ? 'Частичная оплата' : 'Полная оплата' }} — операция в балансах
Дата: {{ infoModalTx.date }}
Оплачено: {{ formatCurrency(infoModalTx.amount) }} ₽
Счёт: {{ infoModalTx.account_name }}
{{ infoModalMessage }}

📋 История счёта

{{ accountHistoryModal.account?.name }} · текущий баланс: {{ formatCurrency(accountHistoryModal.account?.balance) }} ₽

Загрузка...
Операций нет
Дата Источник / Описание Сумма Тип
{{ tx.date ? tx.date.split('T')[0].split('-').reverse().join('.') : '—' }}
{{ tx.source }}
{{ tx.description }}
{{ tx.amount >= 0 ? '+' : '' }}{{ formatCurrency(tx.amount) }} ₽ Виртуал. Обяз. Операция
Детали обязательства

Контрагент: {{ inputsModalData.contractor_name || inputsModalData.creditor_name.split(' | ')[0] }}

Кредитор: {{ inputsModalData.actual_creditor_name || 'Не указано' }}

Заемщик: {{ inputsModalData.actual_borrower_name || 'Не указано' }}

Обязательство: {{ inputsModalData.obligation_name || (inputsModalData.creditor_name.includes(' | ') ? inputsModalData.creditor_name.split(' | ')[1] : '') }}

Тип: {{ inputsModalData.debt_type === 'loan' ? 'Займ (Мне должны, аннуитет)' : (inputsModalData.debt_type === 'loan_installment' ? 'Рассрочка (Мне должны, 0%)' : (inputsModalData.debt_type === 'loan_interest_only' ? 'Займ (Мне должны, только %)' : (inputsModalData.debt_type === 'loan_paused' ? 'Займ (Мне должны, на паузе)' : (inputsModalData.debt_type === 'one_time_loan' ? 'Разовый займ (Мне должны, 1 платеж)' : (inputsModalData.debt_type === 'installment' ? 'Рассрочка (Я должен, 0%)' : (inputsModalData.debt_type === 'interest_only' ? 'Кредит (Только %)' : (inputsModalData.debt_type === 'one_time_credit' ? 'Разовый займ (Я должен, 1 платеж)' : (inputsModalData.debt_type === 'credit_paused' ? 'Кредит (Я должен, на паузе)' : 'Кредит (с процентами)')))))))) }}

Тело (изначально): {{ formatCurrency(inputsModalData.total_amount) }} ₽

Остаток тела: {{ formatCurrency(inputsModalData.remaining_balance) }} ₽ Требует пересчета!

Регулярный платеж: {{ formatCurrency(inputsModalData.regular_payment) }} ₽

Период: с {{ inputsModalData.first_payment_date }} по {{ inputsModalData.last_payment_date }}

Просрочка: {{ formatCurrency(inputsModalData.current_arrears) }} ₽

Процентная ставка: {{ inputsModalData.annual_rate }}% годовых

Точный остаток (с %): {{ formatCurrency(inputsModalData.precise_balance_today) }} ₽

Сумма по графику (Итог)

{{ formatCurrency(inputsModalData.calculated_remaining_sum) }} ₽

Считается из кол-ва месяцев от первого до последнего платежа, умноженных на регулярный взнос.

Внимание: Сумма по графику меньше остатка тела! Вероятно, ошибка в дате окончания договора или размере взноса.

{{ isEditing ? 'Редактирование' : (currentFormType === 'loan' ? 'Новый займ' : 'Новое обязательство') }}

{{ currentFormType === 'loan' ? 'Мне должны вернуть деньги' : 'Я должен вернуть деньги' }}

Кредитор — кто даёт деньги *
{{ c.name }} Наша орг.
Не найдено
Заемщик — кто получает деньги *
{{ c.name }} Наша орг.
Не найдено
Сумма долга текущая *
Количество платежей (мес.)
Ежемесячный платёж
{{ ['one_time_credit','one_time_loan'].includes(newDebt.debt_type) ? 'Дата возврата' : 'Дата последнего платежа' }} *
{{ newDebt.num_months }} мес.
Текущая просрочка
мес. × {{ formatCurrency(parseNumber(newDebt.regular_payment) || 0) }} ₽ = {{ formatCurrency((parseInt(newDebt.arrears_months)||0) * (parseNumber(newDebt.regular_payment)||0)) }} ₽

{{ currentFormType === 'loan' ? 'Счёт списания (откуда выдали)' : 'Счёт зачисления (куда пришло)' }}

Транзакция по счёту не создаётся — только запись обязательства.

{{ a.name }} {{ a.asset_type === 'real_estate' ? 'Недвижимость' : a.asset_type === 'vehicle' ? 'Транспорт' : 'Прочее' }}
Не найдено
⌗ Кредитный калькулятор
Ежемесячный платёж:{{ formatCurrency(calcModal.result.payment) }} ₽
Сумма всех платежей:{{ formatCurrency(calcModal.result.total) }} ₽
Переплата:{{ formatCurrency(calcModal.result.overpay) }} ₽ ({{ calcModal.result.overpayPct }}%)
Прикрепить документ

{{ isEditingContractor ? 'Редактирование контрагента' : 'Новый контрагент' }}

Паспортные данные

Распознаю текст, подождите...

✓ Заполнено полей: {{ passportOcr.filledCount }} — проверьте и исправьте при необходимости ⚠ Текст распознан, но поля не заполнились автоматически — проверьте текст ниже и введите данные вручную
⚠️ {{ passportOcr.error }}
Распознанный текст (проверьте):
{{ passportOcr.rawText }}

Документы

Операция
{{ ctxMenu.tx?.amount > 0 ? '+' : '' }}{{ formatCurrency(ctxMenu.tx?.amount) }} ₽
{{ ctxMenu.tx?.category }} · {{ ctxMenu.tx?.description }}
Только % Рассрочка Разовый Займ
{{ debtCtxMenu.debt?.obligation_name || '—' }}
{{ debtCtxMenu.debt?.actual_creditor_name }} → {{ debtCtxMenu.debt?.actual_borrower_name }}
{{ formatCurrency(debtCtxMenu.debt?.remaining_balance) }} ₽ остаток

Привязать к обязательству

{{ linkDebtData.tx?.amount > 0 ? '+' : '' }}{{ linkDebtData.tx ? formatCurrency(linkDebtData.tx.amount) : '' }} ₽ · {{ linkDebtData.tx?.category }}

{{ loanWiz.direction === 'loan' ? 'Новый займ' : 'Новый кредит' }}

{{ loanWiz.direction === 'loan' ? 'Я выдаю деньги — мне будут должны' : 'Я получаю деньги — я буду должен' }}

{{ c.name }}
Не найдено

Калькулятор

«Платёж»: нужны сумма + ставка + мес. «Ставку %»: нужны сумма + платёж + мес.

Счёт {{ loanWiz.direction === 'loan' ? 'списания' : 'зачисления' }}

Транзакция по счёту не создаётся — только запись обязательства.

Для сложных случаев (аннуитет, просрочки, залог) используйте

{{ isEditingPlan ? 'Редактирование' : (newPlan.plan_type === 'income' ? 'Новый доход' : 'Новый расход') }}

{{ cEditData.id ? 'Редактировать категорию' : 'Новая категория' }}

{{ isEditingProject ? 'Редактирование проекта' : 'Новый проект' }}

{{ c.name }} Наша орг.
Не найдено

Расход по проекту

Доход по проекту

{{ isEditingAsset ? 'Редактирование имущества' : 'Добавление имущества' }}

{{ c.name }}
Не найдено
Новое
📷 Добавить

{{ salaryEmpModal.isEdit ? 'Редактировать сотрудника' : 'Добавить сотрудника' }}

{{ c.name }}Наша орг.
💰 Выдать аванс
Полумесяц: {{ new Date(advanceModal.advance_date).getDate() <= 15 ? '1–15 (первый)' : '16–31 (второй)' }} — определяется по дате выдачи
{{ dayModalTitle }}
{{ salaryEmployees.find(e=>e.id===dayModal.empId)?.contractor_name }}
⏱ Сверхурочные — {{ overtimeModal.dateStr }}

💸 Выплата зарплаты

{{ ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'][salaryPeriod.month-1] }} {{ salaryPeriod.year }} · {{ salaryPeriod.half === 1 ? '1–15' : '16–31' }}

Сотрудник Смены По сменам СУ Премия Аванс К выдаче
{{ it.name }}
{{ it.position }}
{{ it.days_worked || '—' }} {{ it.gross ? formatCurrency(it.gross) + ' ₽' : '—' }} {{ it.overtime ? formatCurrency(it.overtime) + ' ₽' : '—' }} {{ it.deduction ? '− ' + formatCurrency(it.deduction) + ' ₽' : '—' }} {{ formatCurrency(it.net) }} ₽
ИТОГО К ВЫПЛАТЕ: {{ formatCurrency(salaryPayModal.items.reduce((s,it)=>s+it.net,0)) }} ₽
💰 Продажа имущества

{{ sellModal.asset?.name }}

{{ c.name }}
Нет сотрудников
В балансах появится приходная операция «Продажа имущества» на выбранный счёт. Объект получит статус Продано и уйдёт из раздела «На продажу».

{{ stockModal.isEdit ? 'Редактировать позицию' : 'Новая позиция' }}

Новый вид «{{ srch.stockName }}»
Нет сохранённых видов
Нажмите Enter или продолжайте вводить «{{ srch.stockModel }}»
Нет сохранённых моделей
Адрес нам не принадлежит
{{ a.real_estate_type === 'house' ? '🏠' : a.real_estate_type === 'apartment' ? '🏢' : a.real_estate_type === 'land' ? '🌿' : a.real_estate_type === 'garage' ? '🅿️' : '🏗' }} {{ landName(a) }} ({{ a.real_estate_area }} кв.м)
Нет объектов недвижимости
Новая категория «{{ srch.stockCategory }}»
Нет сохранённых категорий
🏷 На продажу
Новое
📷 Добавить
Маржа: {{ formatCurrency(parseNumber(stockModal.selling_price) - parseNumber(stockModal.purchase_price)) }} ₽ ({{ Math.round((parseNumber(stockModal.selling_price) - parseNumber(stockModal.purchase_price)) / parseNumber(stockModal.purchase_price) * 100) }}%)
{{ assetSectionModal.isEdit ? 'Редактировать раздел' : 'Новый раздел имущества' }}

✨ Подходящие

Все иконки

{{ lpModal.isEdit ? 'Редактировать' : 'Добавить' }} гос. номер
{{ c.name }}
Не найдено
{{ a.name }} {{ a.vehicle_plate }}
Не найдено

🔐 Права доступа

Пользователь: {{ permsUser?.username }}

Доступ к разделам

{{ mod.icon }} {{ mod.name }}

Доступ к счетам (Балансы)

«Наследовать» = брать уровень из настройки модуля Балансы выше

{{ acc.name }}
Смена пароля

для пользователя {{ passwordChangeData.username }}

🗑 ⚠️ ℹ️

{{ confirmDialog.title }}

{{ confirmDialog.message }}

{{ notif.type === 'error' ? 'Системная ошибка' : 'Успешно' }} {{ notif.message }}
🚪
Выйти из системы?
Вы будете перенаправлены на страницу входа.
{{ photoViewer.index + 1 }} / {{ photoViewer.photos.length }}
⬇ Сохранить