Merge branch 'btp' of https://git.host.jeyerp.az/ali/taxes_az into btp
This commit is contained in:
commit
61bd10a371
|
|
@ -0,0 +1,361 @@
|
||||||
|
// Copyright (c) 2024, Your Company and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
frappe.query_reports["Tax Articles Revenue Report"] = {
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
"fieldname": "company",
|
||||||
|
"label": __("Company"),
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Company",
|
||||||
|
"default": frappe.defaults.get_user_default("Company"),
|
||||||
|
"reqd": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "from_date",
|
||||||
|
"label": __("From Date"),
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"default": frappe.datetime.add_months(frappe.datetime.get_today(), -1),
|
||||||
|
"reqd": 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "to_date",
|
||||||
|
"label": __("To Date"),
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"default": frappe.datetime.get_today(),
|
||||||
|
"reqd": 1,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"formatter": function (value, row, column, data, default_formatter) {
|
||||||
|
value = default_formatter(value, row, column, data);
|
||||||
|
|
||||||
|
// Подсветка колонок с суммами налоговых статей
|
||||||
|
if (column.fieldname && column.fieldname.startsWith("vm_")) {
|
||||||
|
if (value && parseFloat(value) > 0) {
|
||||||
|
let color = get_tax_article_color(column.fieldname);
|
||||||
|
let icon = get_tax_article_icon(column.fieldname);
|
||||||
|
|
||||||
|
value = `<span style="color: ${color}; font-weight: bold; background-color: ${color}15; padding: 2px 6px; border-radius: 3px; border-left: 2px solid ${color};">${icon} ${value}</span>`;
|
||||||
|
} else if (value == 0 || !value) {
|
||||||
|
value = `<span style="color: #ccc;">0.00</span>`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Подсветка Sales Invoice колонки
|
||||||
|
if (column.fieldname == "sales_invoice" && value) {
|
||||||
|
value = `<span style="color: #495057; font-weight: bold;">📄 ${value}</span>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Подсветка Date колонки
|
||||||
|
if (column.fieldname == "posting_date" && value) {
|
||||||
|
value = `<span style="color: #6c757d; font-weight: 500;">📅 ${value}</span>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
|
||||||
|
"onload": function(report) {
|
||||||
|
// Добавляем кастомные кнопки
|
||||||
|
report.page.add_inner_button(__("Export Tax Articles Summary"), function() {
|
||||||
|
export_tax_articles_summary(report);
|
||||||
|
});
|
||||||
|
|
||||||
|
report.page.add_inner_button(__("Show Article Categories"), function() {
|
||||||
|
show_tax_article_categories();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Добавляем информационное сообщение
|
||||||
|
report.page.add_inner_button(__("About Tax Articles"), function() {
|
||||||
|
show_tax_articles_info();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
"after_datatable_render": function(datatable_obj) {
|
||||||
|
// Добавляем итоговую статистику
|
||||||
|
setTimeout(() => {
|
||||||
|
add_tax_articles_statistics(datatable_obj);
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Функция определения цвета для налоговой статьи
|
||||||
|
function get_tax_article_color(fieldname) {
|
||||||
|
if (fieldname.includes("165_1")) {
|
||||||
|
// 165.1.x статьи - льготы (зеленая гамма)
|
||||||
|
return "#198754";
|
||||||
|
} else if (fieldname.includes("164_1_1")) {
|
||||||
|
// 164.1.1-164.1.10 - государственные операции (синяя гамма)
|
||||||
|
return "#0d6efd";
|
||||||
|
} else if (fieldname.includes("164_1_2") || fieldname.includes("164_1_3")) {
|
||||||
|
// Финансовые операции (фиолетовая гамма)
|
||||||
|
return "#6610f2";
|
||||||
|
} else if (fieldname.includes("164_1_4") || fieldname.includes("164_1_5") || fieldname.includes("164_1_6")) {
|
||||||
|
// Специальные операции (индиго гамма)
|
||||||
|
return "#6f42c1";
|
||||||
|
} else if (fieldname.includes("164_1_7") || fieldname.includes("164_1_8")) {
|
||||||
|
// Медиа и образование (голубая гамма)
|
||||||
|
return "#0dcaf0";
|
||||||
|
} else if (fieldname.includes("164_1_18") || fieldname.match(/164_1_2[7-9]/) || fieldname.match(/164_1_3[0-7]/)) {
|
||||||
|
// Сельское хозяйство (зеленая гамма)
|
||||||
|
return "#20c997";
|
||||||
|
} else if (fieldname.includes("164_1_41")) {
|
||||||
|
// Автомобили (оранжевая гамма)
|
||||||
|
return "#fd7e14";
|
||||||
|
} else if (fieldname.match(/164_1_4[2-9]/) || fieldname.match(/164_1_5[0-9]/)) {
|
||||||
|
// Социальные и специальные услуги (розовая гамма)
|
||||||
|
return "#d63384";
|
||||||
|
} else {
|
||||||
|
// Остальные статьи (серая гамма)
|
||||||
|
return "#6c757d";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция определения иконки для налоговой статьи
|
||||||
|
function get_tax_article_icon(fieldname) {
|
||||||
|
if (fieldname.includes("165_1")) {
|
||||||
|
return "✅"; // Льготы
|
||||||
|
} else if (fieldname.includes("164_1_1")) {
|
||||||
|
return "🏛️"; // Государственные
|
||||||
|
} else if (fieldname.includes("164_1_2") || fieldname.includes("164_1_3")) {
|
||||||
|
return "💰"; // Финансовые
|
||||||
|
} else if (fieldname.includes("164_1_7") || fieldname.includes("164_1_8")) {
|
||||||
|
return "📚"; // Медиа и образование
|
||||||
|
} else if (fieldname.includes("164_1_18") || fieldname.match(/164_1_2[7-9]/) || fieldname.match(/164_1_3[0-7]/)) {
|
||||||
|
return "🌾"; // Сельское хозяйство
|
||||||
|
} else if (fieldname.includes("164_1_41")) {
|
||||||
|
return "🚗"; // Автомобили
|
||||||
|
} else if (fieldname.match(/164_1_4[2-9]/) || fieldname.match(/164_1_5[0-9]/)) {
|
||||||
|
return "🏥"; // Социальные услуги
|
||||||
|
} else {
|
||||||
|
return "📋"; // Остальные
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция показа информации о налоговых статьях
|
||||||
|
function show_tax_articles_info() {
|
||||||
|
let info_html = '<div class="tax-articles-info">';
|
||||||
|
info_html += '<h4 style="color: #495057; margin-bottom: 15px;">📋 Vergi Məcəlləsi Maddələri</h4>';
|
||||||
|
|
||||||
|
info_html += '<div class="row">';
|
||||||
|
info_html += '<div class="col-md-6">';
|
||||||
|
info_html += '<h5 style="color: #198754; margin-bottom: 10px;">✅ 165.1.x Maddələri (Azadolmalar)</h5>';
|
||||||
|
info_html += '<ul style="font-size: 12px; color: #6c757d;">';
|
||||||
|
info_html += '<li>165.1.1 - Əsas azadolmalar</li>';
|
||||||
|
info_html += '<li>165.1.2 - Xüsusi azadolmalar</li>';
|
||||||
|
info_html += '<li>165.1.3 - İxrac əməliyyatları</li>';
|
||||||
|
info_html += '<li>165.1.4, 165.1.5 - Digər azadolmalar</li>';
|
||||||
|
info_html += '<li>165.1.9-165.1.11 - Əlavə azadolmalar</li>';
|
||||||
|
info_html += '</ul>';
|
||||||
|
info_html += '</div>';
|
||||||
|
|
||||||
|
info_html += '<div class="col-md-6">';
|
||||||
|
info_html += '<h5 style="color: #0d6efd; margin-bottom: 10px;">🏛️ 164.1.x Maddələri (Dövlət)</h5>';
|
||||||
|
info_html += '<ul style="font-size: 12px; color: #6c757d;">';
|
||||||
|
info_html += '<li>164.1.1-164.1.10 - Dövlət əməliyyatları</li>';
|
||||||
|
info_html += '<li>164.1.18-164.1.37 - Kənd təsərrüfatı</li>';
|
||||||
|
info_html += '<li>164.1.41 seriyası - Avtomobillər</li>';
|
||||||
|
info_html += '<li>164.1.42-164.1.59 - Sosial xidmətlər</li>';
|
||||||
|
info_html += '</ul>';
|
||||||
|
info_html += '</div>';
|
||||||
|
info_html += '</div>';
|
||||||
|
|
||||||
|
info_html += '<hr>';
|
||||||
|
info_html += '<p style="color: #6c757d; font-size: 13px; text-align: center;">';
|
||||||
|
info_html += 'Bu hesabat Sales Invoice Items-də tax_article sahəsinə əsasən gəlirləri bölüşdürür';
|
||||||
|
info_html += '</p>';
|
||||||
|
|
||||||
|
info_html += '</div>';
|
||||||
|
|
||||||
|
frappe.msgprint({
|
||||||
|
title: __("Tax Articles Information"),
|
||||||
|
message: info_html,
|
||||||
|
wide: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция показа категорий налоговых статей
|
||||||
|
function show_tax_article_categories() {
|
||||||
|
let categories_html = '<div class="tax-article-categories">';
|
||||||
|
categories_html += '<h4>🎯 Vergi Məcəlləsi Kateqoriyaları:</h4>';
|
||||||
|
categories_html += '<div class="row">';
|
||||||
|
|
||||||
|
const categories = [
|
||||||
|
{name: "✅ Azadolmalar", color: "#198754", articles: ["165.1.1", "165.1.2", "165.1.3", "165.1.4", "165.1.5"]},
|
||||||
|
{name: "🏛️ Dövlət Əməliyyatları", color: "#0d6efd", articles: ["164.1.1", "164.1.10", "164.1.11", "164.1.12", "164.1.48"]},
|
||||||
|
{name: "💰 Maliyyə", color: "#6610f2", articles: ["164.1.2", "164.1.3", "164.1.36", "164.1.55"]},
|
||||||
|
{name: "📚 Təhsil və Media", color: "#0dcaf0", articles: ["164.1.7", "164.1.8", "164.1.13"]},
|
||||||
|
{name: "🌾 Kənd Təsərrüfatı", color: "#20c997", articles: ["164.1.18", "164.1.27", "164.1.29-37"]},
|
||||||
|
{name: "🚗 Avtomobillər", color: "#fd7e14", articles: ["164.1.41", "164.1.41-1", "164.1.41-2", "164.1.41-3"]},
|
||||||
|
{name: "🏥 Sosial Xidmətlər", color: "#d63384", articles: ["164.1.51", "164.1.58", "164.1.42"]}
|
||||||
|
];
|
||||||
|
|
||||||
|
categories.forEach((category, index) => {
|
||||||
|
if (index % 2 === 0 && index > 0) {
|
||||||
|
categories_html += '</div><div class="row">';
|
||||||
|
}
|
||||||
|
|
||||||
|
categories_html += '<div class="col-md-6" style="margin-bottom: 15px;">';
|
||||||
|
categories_html += `<div style="padding: 15px; border: 2px solid ${category.color}; border-radius: 8px; background: ${category.color}10;">`;
|
||||||
|
categories_html += `<h5 style="color: ${category.color};">${category.name}</h5>`;
|
||||||
|
categories_html += '<div style="font-size: 12px; color: #6c757d;">';
|
||||||
|
category.articles.forEach(article => {
|
||||||
|
categories_html += `<span style="margin-right: 8px; background: white; padding: 2px 6px; border-radius: 3px; border: 1px solid ${category.color};">VM ${article}</span>`;
|
||||||
|
});
|
||||||
|
categories_html += '</div>';
|
||||||
|
categories_html += '</div>';
|
||||||
|
categories_html += '</div>';
|
||||||
|
});
|
||||||
|
|
||||||
|
categories_html += '</div>';
|
||||||
|
categories_html += '</div>';
|
||||||
|
|
||||||
|
frappe.msgprint({
|
||||||
|
title: __("Article Categories"),
|
||||||
|
message: categories_html,
|
||||||
|
wide: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция экспорта сводки по налоговым статьям
|
||||||
|
function export_tax_articles_summary(report) {
|
||||||
|
let data = report.data;
|
||||||
|
let summary = calculate_tax_articles_totals(data);
|
||||||
|
|
||||||
|
// Создаем CSV с итогами
|
||||||
|
let csv_content = "Tax Article,Revenue,Documents Count\n";
|
||||||
|
|
||||||
|
summary.forEach(item => {
|
||||||
|
if (item.total > 0) {
|
||||||
|
csv_content += `"${item.article}",${item.total},${item.count}\n`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Добавляем общие итоги
|
||||||
|
let grand_total = summary.reduce((acc, item) => acc + item.total, 0);
|
||||||
|
let total_docs = data.length;
|
||||||
|
|
||||||
|
csv_content += `\n"CƏMİ","${grand_total}","${total_docs}"\n`;
|
||||||
|
|
||||||
|
// Скачиваем файл
|
||||||
|
let blob = new Blob([csv_content], { type: 'text/csv;charset=utf-8' });
|
||||||
|
let url = window.URL.createObjectURL(blob);
|
||||||
|
let a = document.createElement('a');
|
||||||
|
a.href = url;
|
||||||
|
a.download = 'tax_articles_revenue_summary_' + frappe.datetime.get_today() + '.csv';
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
document.body.removeChild(a);
|
||||||
|
window.URL.revokeObjectURL(url);
|
||||||
|
|
||||||
|
frappe.show_alert({message: __("Tax articles summary exported successfully"), indicator: "green"});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция расчета итогов по налоговым статьям
|
||||||
|
function calculate_tax_articles_totals(data) {
|
||||||
|
let summary = [];
|
||||||
|
let article_totals = {};
|
||||||
|
|
||||||
|
// Получаем все возможные статьи из колонок
|
||||||
|
data.forEach(row => {
|
||||||
|
Object.keys(row).forEach(key => {
|
||||||
|
if (key.startsWith('vm_') && row[key] > 0) {
|
||||||
|
if (!article_totals[key]) {
|
||||||
|
article_totals[key] = {total: 0, count: 0};
|
||||||
|
}
|
||||||
|
article_totals[key].total += row[key];
|
||||||
|
article_totals[key].count++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Конвертируем в массив
|
||||||
|
Object.keys(article_totals).forEach(key => {
|
||||||
|
summary.push({
|
||||||
|
article: convert_field_key_to_display_name(key),
|
||||||
|
total: article_totals[key].total,
|
||||||
|
count: article_totals[key].count
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Сортируем по общей сумме
|
||||||
|
summary.sort((a, b) => b.total - a.total);
|
||||||
|
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция конвертации ключа поля в отображаемое название
|
||||||
|
function convert_field_key_to_display_name(fieldKey) {
|
||||||
|
const mapping = {
|
||||||
|
'vm_165_1_1': 'VM 165.1.1',
|
||||||
|
'vm_165_1_2': 'VM 165.1.2',
|
||||||
|
'vm_165_1_3': 'VM 165.1.3',
|
||||||
|
'vm_165_1_3_export': 'VM 165.1.3 (İxrac)',
|
||||||
|
'vm_165_1_3_services': 'VM 165.1.3 (Xidmət)',
|
||||||
|
'vm_164_1_1': 'VM 164.1.1',
|
||||||
|
'vm_164_1_2': 'VM 164.1.2',
|
||||||
|
'vm_164_1_18': 'VM 164.1.18',
|
||||||
|
'vm_164_1_27': 'VM 164.1.27',
|
||||||
|
'vm_164_1_41': 'VM 164.1.41'
|
||||||
|
// Можно добавить больше маппингов по мере необходимости
|
||||||
|
};
|
||||||
|
|
||||||
|
return mapping[fieldKey] || fieldKey.replace(/_/g, '.').replace('vm.', 'VM ');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Функция добавления статистики под таблицу
|
||||||
|
function add_tax_articles_statistics(datatable_obj) {
|
||||||
|
if (datatable_obj && datatable_obj.data) {
|
||||||
|
let summary = calculate_tax_articles_totals(datatable_obj.data);
|
||||||
|
let topArticles = summary.slice(0, 10); // Топ 10 статей
|
||||||
|
|
||||||
|
let stats_html = '<div class="tax-articles-statistics" style="margin-top: 20px; padding: 20px; background: linear-gradient(135deg, #f8f9ff 0%, #fff 100%); border-radius: 8px; border: 2px solid #6610f2; box-shadow: 0 2px 8px rgba(102,16,242,0.1);">';
|
||||||
|
stats_html += '<h4 style="margin-bottom: 15px; color: #6610f2; display: flex; align-items: center;"><span style="margin-right: 8px;">📊</span> Vergi Maddələri üzrə Statistika:</h4>';
|
||||||
|
|
||||||
|
// Топ статьи
|
||||||
|
if (topArticles.length > 0) {
|
||||||
|
stats_html += '<h5 style="color: #495057; margin-bottom: 15px;">🏆 Ən Yüksək Gəlirli Maddələr:</h5>';
|
||||||
|
stats_html += '<div class="row">';
|
||||||
|
|
||||||
|
topArticles.slice(0, 6).forEach((article, index) => {
|
||||||
|
if (index % 3 === 0 && index > 0) {
|
||||||
|
stats_html += '</div><div class="row">';
|
||||||
|
}
|
||||||
|
|
||||||
|
let color = get_tax_article_color(Object.keys(datatable_obj.data[0]).find(k => convert_field_key_to_display_name(k) === article.article) || 'vm_other');
|
||||||
|
|
||||||
|
stats_html += '<div class="col-md-4" style="margin-bottom: 10px;">';
|
||||||
|
stats_html += `<div style="padding: 10px; border: 2px solid ${color}; border-radius: 6px; background: white; text-align: center;">`;
|
||||||
|
stats_html += `<strong style="color: ${color}; font-size: 12px;">${article.article}</strong><br>`;
|
||||||
|
stats_html += `<span style="font-size: 16px; font-weight: bold; color: ${color};">${article.total.toFixed(2)}</span><br>`;
|
||||||
|
stats_html += `<small style="color: #6c757d;">${article.count} sənəd</small>`;
|
||||||
|
stats_html += '</div>';
|
||||||
|
stats_html += '</div>';
|
||||||
|
});
|
||||||
|
|
||||||
|
stats_html += '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Общие итоги
|
||||||
|
let grand_total = summary.reduce((acc, item) => acc + item.total, 0);
|
||||||
|
let total_articles = summary.length;
|
||||||
|
let total_docs = datatable_obj.data.length;
|
||||||
|
|
||||||
|
stats_html += '<div style="margin-top: 20px; padding: 15px; border-top: 3px solid #6610f2; background: linear-gradient(135deg, #6610f210 0%, #fff 100%);">';
|
||||||
|
stats_html += '<div class="row text-center">';
|
||||||
|
stats_html += `<div class="col-md-3"><span style="color: #6610f2; font-size: 14px; font-weight: bold;">📋 Aktiv Maddələr<br><span style="font-size: 18px;">${total_articles}</span></span></div>`;
|
||||||
|
stats_html += `<div class="col-md-3"><span style="color: #198754; font-size: 14px; font-weight: bold;">💰 Ümumi Gəlir<br><span style="font-size: 18px;">${grand_total.toFixed(2)}</span></span></div>`;
|
||||||
|
stats_html += `<div class="col-md-3"><span style="color: #fd7e14; font-size: 14px; font-weight: bold;">📄 Cəmi Sənəd<br><span style="font-size: 18px;">${total_docs}</span></span></div>`;
|
||||||
|
stats_html += `<div class="col-md-3"><span style="color: #d63384; font-size: 14px; font-weight: bold;">📈 Orta Gəlir<br><span style="font-size: 18px;">${total_docs > 0 ? (grand_total / total_docs).toFixed(2) : '0.00'}</span></span></div>`;
|
||||||
|
stats_html += '</div>';
|
||||||
|
stats_html += '</div>';
|
||||||
|
|
||||||
|
stats_html += '</div>';
|
||||||
|
|
||||||
|
// Удаляем предыдущую статистику если есть
|
||||||
|
$('.tax-articles-statistics').remove();
|
||||||
|
|
||||||
|
// Добавляем новую статистику
|
||||||
|
$(stats_html).insertAfter('.datatable');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"add_total_row": 0,
|
||||||
|
"columns": [],
|
||||||
|
"creation": "2025-09-19 16:54:18.288522",
|
||||||
|
"disabled": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Report",
|
||||||
|
"filters": [],
|
||||||
|
"idx": 0,
|
||||||
|
"is_standard": "Yes",
|
||||||
|
"letterhead": null,
|
||||||
|
"modified": "2025-09-19 16:54:18.288522",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Taxes Az",
|
||||||
|
"name": "Tax Articles Revenue Report",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"prepared_report": 0,
|
||||||
|
"ref_doctype": "Sales Invoice",
|
||||||
|
"report_name": "Tax Articles Revenue Report",
|
||||||
|
"report_type": "Script Report",
|
||||||
|
"roles": [
|
||||||
|
{
|
||||||
|
"role": "Accounts User"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Accounts Manager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Employee Self Service"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"timeout": 0
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,470 @@
|
||||||
|
# Copyright (c) 2024, Your Company and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
from frappe.utils import flt, formatdate
|
||||||
|
|
||||||
|
|
||||||
|
def execute(filters=None):
|
||||||
|
columns, data = get_columns(), get_data(filters)
|
||||||
|
return columns, data
|
||||||
|
|
||||||
|
|
||||||
|
def get_data(filters):
|
||||||
|
"""Получаем данные по Sales Invoice с распределением по налоговым статьям"""
|
||||||
|
|
||||||
|
# Получаем список всех налоговых статей
|
||||||
|
tax_articles = get_tax_articles_list()
|
||||||
|
|
||||||
|
# Получаем Sales Invoice Items с учетом фильтров
|
||||||
|
invoice_items = get_sales_invoice_items(filters, tax_articles)
|
||||||
|
|
||||||
|
if not invoice_items:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Группируем данные по Sales Invoice
|
||||||
|
invoices_data = {}
|
||||||
|
|
||||||
|
for item in invoice_items:
|
||||||
|
invoice_name = item['parent']
|
||||||
|
|
||||||
|
if invoice_name not in invoices_data:
|
||||||
|
invoices_data[invoice_name] = {
|
||||||
|
'sales_invoice': invoice_name,
|
||||||
|
'posting_date': item['posting_date'],
|
||||||
|
'company': item['company']
|
||||||
|
}
|
||||||
|
|
||||||
|
# Инициализируем все колонки налоговых статей нулями
|
||||||
|
for article in tax_articles:
|
||||||
|
article_key = get_article_field_key(article)
|
||||||
|
invoices_data[invoice_name][article_key] = 0
|
||||||
|
|
||||||
|
# Добавляем сумму в соответствующую колонку
|
||||||
|
if item['tax_article']:
|
||||||
|
article_key = get_article_field_key(item['tax_article'])
|
||||||
|
invoices_data[invoice_name][article_key] += flt(item['amount'])
|
||||||
|
|
||||||
|
# Конвертируем в список
|
||||||
|
data = list(invoices_data.values())
|
||||||
|
|
||||||
|
# Сортируем по дате и имени инвойса
|
||||||
|
data.sort(key=lambda x: (x['posting_date'], x['sales_invoice']), reverse=True)
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def get_tax_articles_list():
|
||||||
|
"""Возвращает список всех налоговых статей"""
|
||||||
|
return [
|
||||||
|
"Vergi Məcəlləsinin 165.1.1-ci maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.2-ci maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən malların ixracı üzrə aparılmış əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.3-cü maddəsinə əsasən bu Məcəllənin 168.1.5-ci maddəsində göstərilmiş xidmətlərin ixracı üzrə aparılmış əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.4-cü maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.5-ci maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.9-cu maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.10-cu maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"Vergi Məcəlləsinin 165.1.11-ci maddəsinə əsasən aparılan əməliyyatlar",
|
||||||
|
"VM-nin 164.1.1-ci maddəsinə əsasən özəlləşdirilmə qaydasında dövlət müəssisəsindən satın alınan əmlakın dəyəri, habelə dövlət əmlakının icarəyə verilməsindən alınan icarə haqqının büdcəyə ödənilməli olan hissəsi",
|
||||||
|
"VM-nin 164.1.2-ci maddəsinə əsasən maliyyə xidmətlərinin göstərilməsi, o cümlədən maliyyə lizinqi əməliyyatları üzrə ödənilən faizlər",
|
||||||
|
"VM-nin 164.1.3-cü maddəsinə əsasən milli və ya xarici valyutanın (numizmatika məqsədlərindən başqa), həmçinin qiymətli kağızların göndərilməsi",
|
||||||
|
"VM-nin 164.1.5-ci maddəsinə əsasən idxal olunan əmlak istisna olmaqla müəssisənin nizamnamə fonduna (kapitalına) pay şəklində hər hansı əmlakın (əsas vəsaitlər istisna olmaqla) qoyulması (əmlakın pay şəklində qoyuluşu, onun müqabilində bilavasitə digər əmlakın əldə edilməsi ilə əlaqədar olmadıqda)",
|
||||||
|
"VM-nin 164.1.6-cı maddəsinə əsasən tutulan məbləğlər hədlərində dövlət hakimiyyəti, maliyyə bazarlarına nəzarət, yerli özünüidarəetmə və digər səlahiyyətli orqanların tutduğu dövlət rüsumu, icazə haqları, yığımlar, xüsusi notariusların aldığı haqlar (notariat hərəkətlərinin aparılmasına və notariat hərəkətləri ilə əlaqədar göstərilən xidmətə görə) və onların tutulması müqabilində göstərdiyi xidmətlər",
|
||||||
|
"VM-nin 164.1.7-ci maddəsinə əsasən siyahısı Azərbaycan Respublikasının Nazirlər Kabineti tərəfindən təsdiq edilən media məhsullarının və kitabların (elektron kitablar istisna olmaqla), habelə dərslik komplektlərinin idxalı və satışı, həmin malların (məhsulların) istehsalı (nəşri) ilə bağlı rulon və ya vərəqə şəklində kağızın idxalı və satışı",
|
||||||
|
"VM-nin 164.1.8-ci maddəsinə əsasən amətbu media məhsullarının və kitabların (o cümlədən elektron kitabların), habelə dərslik komplektlərinin istehsalı ilə bağlı redaksiya, nəşriyyat və poliqrafiya fəaliyyəti (reklam xidmətləri istisna olmaqla)",
|
||||||
|
"VM-nin 164.1.9-cu maddəsinə əsasən dəfn və qəbiristanlığın mərasim xidmətləri",
|
||||||
|
"VM-nin 164.1.10-cu maddəsinə əsasən Azərbaycan Respublikasının Dövlət Neft Fondunun qanunvericiliklə nəzərdə tutulmuş vəzifələrinin yerinə yetirilməsi ilə bağlı mal idxalı, iş görülməsi və xidmət göstərilməsi",
|
||||||
|
"VM-nin 164.1.11-ci maddəsinə əsasən Azərbaycan Respublikasına, o cümlədən onu təmsil edən hüquqi şəxslərə neft-qaz ehtiyatlarının kəşfiyyatı, işlənməsi və hasilatın pay bölgüsü, ixrac boru kəmərləri haqqında və bu qəbildən olan digər sazişlərə uyğun olaraq verilməsi nəzərdə tutulan əsas fondların, daşınan əmlakın və digər aktivlərin Azərbaycan Respublikası Dövlət Neft Fonduna və ya Azərbaycan Respublikasını təmsil edən tərəfə hər hansı şəkildə təqdim edilməsi",
|
||||||
|
"VM-nin 164.1.12-ci maddəsinə əsasən metropolitenlə sərnişindaşıma xidmətləri",
|
||||||
|
"VM-nin 164.1.13-cü maddəsinə əsasən ödənişli təhsil xidmətlərinin göstərilməsi (digər fəaliyyətləri ilə bağlı xidmətlərin göstərilməsi istisna olmaqla)",
|
||||||
|
"VM-nin 164.1.14-cü maddəsinə əsasən Vergi Məcəllənin 106.1.9-106.1.11-ci maddələri ilə müəyyən olunan aktivlərin dəyəri və onların hər hansı şəkildə təqdim olunması üzrə əməliyyatlar",
|
||||||
|
"VM-nin 164.1.17-ci maddəsinə əsasən hüquqi şəxsin iştirak paylarının və ya səhmlərinin təqdim edilməsi",
|
||||||
|
"VM-nin 164.1.18-ci maddəsinə əsasən kənd təsərrüfatı məhsullarının istehsalçıları (o cümlədən, sənaye üsulu ilə) tərəfindən özlərinin istehsal etdikləri kənd təsərrüfatı məhsullarının satışı üzrə dövriyyələr",
|
||||||
|
"VM-nin 164.1.27-ci maddəsinə əsasən buğdanın satışı, buğda ununun və çörəyin istehsalı və satışı",
|
||||||
|
"VM-nin 164.1.29-cu maddəsinə əsasən damazlıq heyvanların satışı",
|
||||||
|
"VM-nin 164.1.30-cu maddəsinə əsasən toxum və tinglərin satışı",
|
||||||
|
"VM-nin 164.1.31-ci maddəsinə əsasən siyahısı müvafiq icra hakimiyyəti orqanının müəyyən etdiyi orqan (qurum) tərəfindən təsdiq edilən mineral gübrələrin, pestisidlərin idxalı və satışı",
|
||||||
|
"VM-nin 164.1.32-ci maddəsinə əsasən toxumların yetişdirilməsi, quşçuluq və arıçılıq üçün avadanlıqların, o cümlədən laboratoriya avadanlıqlarının, toxum, taxıl və quru paxlalı bitkilərin təmizlənməsi, çeşidlənməsi və ya kalibrlənməsi üçün maşınların satışı",
|
||||||
|
"VM-nin 164.1.34-cü maddəsinə əsasən siyahısı Azərbaycan Respublikasının Nazirlər Kabineti tərəfindən təsdiq olunmuş bilavasitə kənd təsərrüfatı təyinatlı suvarma və digər qurğuların, maşınların, avadanlıqların və texnikaların, habelə kənd təsərrüfatı texnikasının ehtiyat hissələrinin istehsalı, idxalı və satışı",
|
||||||
|
"VM-nin 164.1.36-cı maddəsinə əsasən ödəmə qabiliyyətini itirmiş bankların rezolyusiyası və sağlamlaşdırma tədbirləri çərçivəsində Azərbaycan Respublikasının Prezidentinin müəyyən etdiyi qaydada qeyri-işlək (toksik) aktivlərin təqdim edilməsi, habelə bankın iflas proseduru çərçivəsində aktivlərinin təqdim edilməsi",
|
||||||
|
"VM-nin 164.1.37-ci maddəsinə əsasən heyvan və quş ətinin satışı",
|
||||||
|
"VM-nin 164.1.42-ci maddəsinə əsasən \"Məşğulluq haqqında\" Azərbaycan Respublikasının Qanununa uyğun olaraq müvafiq icra hakimiyyəti orqanının müəyyən etdiyi orqan (qurum) tərəfindən haqqı ödənilən ictimai işlərin təşkili ilə əlaqədar işçi qüvvəsinin təqdim edilməsi üzrə əməliyyatlar",
|
||||||
|
"VM-nin 164.1.43-cü maddəsinə əsasən kəpəyin istehsalı və satışı",
|
||||||
|
"VM-nin 164.1.46-cı maddəsinə əsasən heyvandarlıq və quşçuluq təsərrüfatlarında istifadə edilən siyahısı Azərbaycan Respublikasının Nazirlər Kabineti tərəfindən təsdiq edilən yem və yem əlavələrinin satışı üzrə dövriyyələr",
|
||||||
|
"VM-nin 164.1.47-ci maddəsinə əsasən bina tikintisi fəaliyyəti ilə məşğul olan şəxslər tərəfindən tikilən binanın yaşayış sahəsinin dövlətə ayrılan hissəsi üzrə dövriyyələr",
|
||||||
|
"VM-nin 164.1.48-ci maddəsinə əsasən siyahısı müvafiq icra hakimiyyəti orqanının müəyyən etdiyi orqan (qurum) (Prezident) tərəfindən təsdiq edilən dövlət adından yaradılan publik hüquqi şəxslər tərəfindən nizamnaməsində nəzərdə tutulan və ona həvalə edilən vəzifələrin yerinə yetirilməsi üçün büdcə qanunvericiliyinə uyğun olaraq dövlət büdcəsindən ayrılmış vəsait hesabına Maliyyə Nazirliyi ilə bağlanılmış müqavilə əsasında işlərin və xidmətlərin göstərilməsi",
|
||||||
|
"VM-nin 164.1.49-cu maddəsinə əsasən Azərbaycan Respublikasında keçirilən Formula 1 və Formula 2 yarışları ilə bağlı Gənclər və İdman Nazirliyi ilə bağlanılmış müqavilə əsasında mal, iş və xidmətin təqdim edilməsi",
|
||||||
|
"VM-nin 164.1.50-ci maddəsinə əsasən Azərbaycan Respublikasında daimi nümayəndəlik yaratmayan qeyri-rezident şəxslərin mülki aviasiya fəaliyyəti çərçivəsində hava gəmilərinin və hava gəmilərinin mühərriklərinin rezident hüquqi şəxslərə icarəyə və ya lizinqə verilməsi",
|
||||||
|
"VM-nin 164.1.51-ci maddəsinə əsasən \"Tibbi sığorta haqqında\" Azərbaycan Respublikasının Qanununa uyğun olaraq icbari tibbi sığorta fondunun, habelə siyahısı müvafiq icra hakimiyyəti orqanının müəyyən etdiyi orqan (qurum) tərəfindən təsdiq edilən ictimai və sosial məqsədlər üçün yaradılmış fondların vəsaiti hesabına tibbi xidmətlərin göstərilməsi",
|
||||||
|
"VM-nin 164.1.55-ci maddəsinə əsasən külçə, sikkə və ya qranul şəklində qızılın və gümüşün satışı",
|
||||||
|
"VM-nin 164.1.34-1-ci maddəsinə əsasən kənd təsərrüfatı texnikalarının mülkiyyət hüququnun keçməməsi şərtilə kənd təsərrüfatı istehsalçılarına lizinqə (icarəyə) verilməsi",
|
||||||
|
"VM-nin 164.1.34-2-ci maddəsinə əsasən kənd təsərrüfatı məhsullarının istehsalçılarına aqrotexniki xidmətlərin göstərilməsi",
|
||||||
|
"VM-nin 164.1.41-ci maddəsinə əsasən yalnız elektrik mühərriki ilə işləyən avtomobillərin satışı",
|
||||||
|
"VM-nin 164.1.41-1-ci maddəsinə əsasən istehsal tarixi 3 ildən və mühərrikinin həcmi 2500 kubsantimetrdən çox olmayan hibrid avtomobillərin satışı",
|
||||||
|
"VM-nin 164.1.41-2-ci maddəsinə əsasən Elektrik mühərriki ilə işləyən avtomobillər üçün ikinci və üçüncü səviyyə elektrik enerji doldurucularının satışı",
|
||||||
|
"VM-nin 164.1.41-3-cü maddəsinə əsasən Azərbaycan Respublikasının ərazisində istehsal olunan minik avtomobillərinin satışı",
|
||||||
|
"VM-nin 164.1.41-4-ci maddəsinə əsasən Azərbaycan Respublikasının ərazisində istehsal olunan avtobusların satışı",
|
||||||
|
"VM-nin 164.1.57-ci maddəsinə əsasən lotereya biletlərinin satıcısı ilə bağlanmış müqavilə əsasında və ya onun tapşırığı əsasında lotereya biletlərinin bütün mərhələlərdə agent qaydasında satışının həyata keçirilməsi üzrə xidmətlərin göstərilməsi",
|
||||||
|
"VM-nin 164.1.10-1-ci maddəsinə əsasən yaşayış sahələrini satmaq öhdəliyi ilə kirayəyə vermə sahəsində fəaliyyət göstərən müvafiq icra hakimiyyəti orqanının müəyyən etdiyi orqan (qurum) tərəfindən yaşayış sahələrinin kirayəçilərə təqdim edilməsi",
|
||||||
|
"VM-nin 164.1.58-ci maddəsinə əsasən özəl baytarlıq xidmətlərinin göstərilməsi",
|
||||||
|
"VM-nin 164.1.59-cu maddəsinə əsasən vəkillər və vəkil qurumları tərəfindən order markasının əldə edilməsi ilə bağlı Azərbaycan Respublikasının Vəkillər Kollegiyasına edilən ödənişlər",
|
||||||
|
"VM-nin 164.1.8-1-ci maddəsinə əsasən media subyektləri (audiovizual media subyektləri istisna olmaqla) tərəfindən istehsal olunan media məhsullarının təqdim edilməsi, habelə Azərbaycan Respublikasında daimi nümayəndəlik yaratmayan qeyri-rezident şəxslər tərəfindən media subyektlərinə (audiovizual media subyektləri istisna olmaqla) media fəaliyyəti ilə bilavasitə bağlı olan işlərin görülməsi və xidmətlərin göstərilməsi",
|
||||||
|
"VM-nin 164.1.56-1-ci maddəsinə əsasən Azərbaycan Respublikasının Minatəmizləmə Agentliyinin təsdiqedici sənədi əsasında Azərbaycan Respublikasının işğaldan azad edilmiş ərazilərinin, habelə müharibə və hərbi əməliyyatların təsirinə məruz qalmış digər ərazilərin minalardan və partlamamış hərbi sursatdan, tərkibində partlayıcı olan qurğulardan və digər partlayıcı qalıqlardan təmizlənməsi çərçivəsində bütün növ texnikanın, avadanlıqların, texniki vasitələrin və qurğuların, onların ehtiyat hissələrinin, fərdi zirehli qoruyucu geyimlərin, alətlərin, partlayıcı və pirotexniki vasitələrin istehsalı və satışı",
|
||||||
|
"VM-nin 164.1.19-cu maddəsinə əsasən müdafiə təyinatlı məmulatların yaradılması və istehsalı fəaliyyətini həyata keçirən şəxslər tərəfindən bu məqsədlə Azərbaycan Respublikasının Müdafiə Sənayesi Nazirliyinin təsdiqedici sənədi əsasında texnologiyaların, avadanlıqların, dəstləşdirici hissələrin və xammalın idxalı və həmin şəxslər tərəfindən istehsal edilmiş müdafiə təyinatlı məmulatların satışı",
|
||||||
|
"VM-nin 164.1.19-1-ci maddəsinə əsasən müvafiq icra hakimiyyəti orqanının müəyyən etdiyi orqan (qurum) tərəfindən verilmiş təsdiqedici sənəd əsasında müdafiə və dövlət təhlükəsizliyi məqsədləri üçün istifadə olunan bütün növ texnika və texniki vasitələrin, onların ehtiyat hissələrinin, xüsusi proqram təminatlarının və silah-sursatın idxalı və satışı",
|
||||||
|
"VM-nin 164.1.2-1-ci maddəsinə əsasən ƏDV-dən azad olunan, yaxud ƏDV-yə cəlb edilməyən əməliyyatlar çərçivəsində əldə edilmiş aktivlərin (əsas vəsaitlərin) maliyyə lizinqi müqaviləsi üzrə təqdim edilməsi",
|
||||||
|
"VM-nin 164.1.9-1-ci maddəsinə əsasən müvafiq icra hakimiyyəti orqanının müəyyən etdiyi orqan (qurum) tərəfindən verilmiş təsdiqedici sənəd əsasında müdafiə və dövlət təhlükəsizliyi məqsədləri üçün istifadə olunan bütün növ texnika və texniki vasitələrin, onların ehtiyat hissələrinin, xüsusi proqram təminatlarının və silah-sursatın idxalı və satışı",
|
||||||
|
"VM-nin 164.1.51-1-ci maddəsinə əsasən tədris bazası kimi fəaliyyət göstərən tibb müəssisələrində tibbi xidmətlərin göstərilməsi"
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def get_article_field_key(tax_article):
|
||||||
|
"""Создает ключ поля и короткое название на основе налоговой статьи"""
|
||||||
|
if not tax_article:
|
||||||
|
return "unknown"
|
||||||
|
|
||||||
|
# Извлекаем номер статьи
|
||||||
|
if "165.1.1" in tax_article:
|
||||||
|
return "vm_165_1_1"
|
||||||
|
elif "165.1.2" in tax_article:
|
||||||
|
return "vm_165_1_2"
|
||||||
|
elif "165.1.3" in tax_article and "malların ixracı" in tax_article:
|
||||||
|
return "vm_165_1_3_export"
|
||||||
|
elif "165.1.3" in tax_article and "xidmətlərin ixracı" in tax_article:
|
||||||
|
return "vm_165_1_3_services"
|
||||||
|
elif "165.1.3" in tax_article:
|
||||||
|
return "vm_165_1_3"
|
||||||
|
elif "165.1.4" in tax_article:
|
||||||
|
return "vm_165_1_4"
|
||||||
|
elif "165.1.5" in tax_article:
|
||||||
|
return "vm_165_1_5"
|
||||||
|
elif "165.1.9" in tax_article:
|
||||||
|
return "vm_165_1_9"
|
||||||
|
elif "165.1.10" in tax_article:
|
||||||
|
return "vm_165_1_10"
|
||||||
|
elif "165.1.11" in tax_article:
|
||||||
|
return "vm_165_1_11"
|
||||||
|
elif "164.1.1" in tax_article:
|
||||||
|
return "vm_164_1_1"
|
||||||
|
elif "164.1.2-1" in tax_article:
|
||||||
|
return "vm_164_1_2_1"
|
||||||
|
elif "164.1.2" in tax_article:
|
||||||
|
return "vm_164_1_2"
|
||||||
|
elif "164.1.3" in tax_article:
|
||||||
|
return "vm_164_1_3"
|
||||||
|
elif "164.1.5" in tax_article:
|
||||||
|
return "vm_164_1_5"
|
||||||
|
elif "164.1.6" in tax_article:
|
||||||
|
return "vm_164_1_6"
|
||||||
|
elif "164.1.7" in tax_article:
|
||||||
|
return "vm_164_1_7"
|
||||||
|
elif "164.1.8-1" in tax_article:
|
||||||
|
return "vm_164_1_8_1"
|
||||||
|
elif "164.1.8" in tax_article:
|
||||||
|
return "vm_164_1_8"
|
||||||
|
elif "164.1.9-1" in tax_article:
|
||||||
|
return "vm_164_1_9_1"
|
||||||
|
elif "164.1.9" in tax_article:
|
||||||
|
return "vm_164_1_9"
|
||||||
|
elif "164.1.10-1" in tax_article:
|
||||||
|
return "vm_164_1_10_1"
|
||||||
|
elif "164.1.10" in tax_article:
|
||||||
|
return "vm_164_1_10"
|
||||||
|
elif "164.1.11" in tax_article:
|
||||||
|
return "vm_164_1_11"
|
||||||
|
elif "164.1.12" in tax_article:
|
||||||
|
return "vm_164_1_12"
|
||||||
|
elif "164.1.13" in tax_article:
|
||||||
|
return "vm_164_1_13"
|
||||||
|
elif "164.1.14" in tax_article:
|
||||||
|
return "vm_164_1_14"
|
||||||
|
elif "164.1.17" in tax_article:
|
||||||
|
return "vm_164_1_17"
|
||||||
|
elif "164.1.18" in tax_article:
|
||||||
|
return "vm_164_1_18"
|
||||||
|
elif "164.1.19-1" in tax_article:
|
||||||
|
return "vm_164_1_19_1"
|
||||||
|
elif "164.1.19" in tax_article:
|
||||||
|
return "vm_164_1_19"
|
||||||
|
elif "164.1.27" in tax_article:
|
||||||
|
return "vm_164_1_27"
|
||||||
|
elif "164.1.29" in tax_article:
|
||||||
|
return "vm_164_1_29"
|
||||||
|
elif "164.1.30" in tax_article:
|
||||||
|
return "vm_164_1_30"
|
||||||
|
elif "164.1.31" in tax_article:
|
||||||
|
return "vm_164_1_31"
|
||||||
|
elif "164.1.32" in tax_article:
|
||||||
|
return "vm_164_1_32"
|
||||||
|
elif "164.1.34-1" in tax_article:
|
||||||
|
return "vm_164_1_34_1"
|
||||||
|
elif "164.1.34-2" in tax_article:
|
||||||
|
return "vm_164_1_34_2"
|
||||||
|
elif "164.1.34" in tax_article:
|
||||||
|
return "vm_164_1_34"
|
||||||
|
elif "164.1.36" in tax_article:
|
||||||
|
return "vm_164_1_36"
|
||||||
|
elif "164.1.37" in tax_article:
|
||||||
|
return "vm_164_1_37"
|
||||||
|
elif "164.1.41-1" in tax_article:
|
||||||
|
return "vm_164_1_41_1"
|
||||||
|
elif "164.1.41-2" in tax_article:
|
||||||
|
return "vm_164_1_41_2"
|
||||||
|
elif "164.1.41-3" in tax_article:
|
||||||
|
return "vm_164_1_41_3"
|
||||||
|
elif "164.1.41-4" in tax_article:
|
||||||
|
return "vm_164_1_41_4"
|
||||||
|
elif "164.1.41" in tax_article:
|
||||||
|
return "vm_164_1_41"
|
||||||
|
elif "164.1.42" in tax_article:
|
||||||
|
return "vm_164_1_42"
|
||||||
|
elif "164.1.43" in tax_article:
|
||||||
|
return "vm_164_1_43"
|
||||||
|
elif "164.1.46" in tax_article:
|
||||||
|
return "vm_164_1_46"
|
||||||
|
elif "164.1.47" in tax_article:
|
||||||
|
return "vm_164_1_47"
|
||||||
|
elif "164.1.48" in tax_article:
|
||||||
|
return "vm_164_1_48"
|
||||||
|
elif "164.1.49" in tax_article:
|
||||||
|
return "vm_164_1_49"
|
||||||
|
elif "164.1.50" in tax_article:
|
||||||
|
return "vm_164_1_50"
|
||||||
|
elif "164.1.51-1" in tax_article:
|
||||||
|
return "vm_164_1_51_1"
|
||||||
|
elif "164.1.51" in tax_article:
|
||||||
|
return "vm_164_1_51"
|
||||||
|
elif "164.1.55" in tax_article:
|
||||||
|
return "vm_164_1_55"
|
||||||
|
elif "164.1.56-1" in tax_article:
|
||||||
|
return "vm_164_1_56_1"
|
||||||
|
elif "164.1.57" in tax_article:
|
||||||
|
return "vm_164_1_57"
|
||||||
|
elif "164.1.58" in tax_article:
|
||||||
|
return "vm_164_1_58"
|
||||||
|
elif "164.1.59" in tax_article:
|
||||||
|
return "vm_164_1_59"
|
||||||
|
else:
|
||||||
|
return "vm_other"
|
||||||
|
|
||||||
|
|
||||||
|
def get_short_article_name(tax_article):
|
||||||
|
"""Создает короткое название для заголовка колонки"""
|
||||||
|
if not tax_article:
|
||||||
|
return "Digər"
|
||||||
|
|
||||||
|
# Извлекаем номер статьи и создаем короткое название
|
||||||
|
if "165.1.1" in tax_article:
|
||||||
|
return "VM 165.1.1"
|
||||||
|
elif "165.1.2" in tax_article:
|
||||||
|
return "VM 165.1.2"
|
||||||
|
elif "165.1.3" in tax_article and "malların ixracı" in tax_article:
|
||||||
|
return "VM 165.1.3 (İxrac)"
|
||||||
|
elif "165.1.3" in tax_article and "xidmətlərin ixracı" in tax_article:
|
||||||
|
return "VM 165.1.3 (Xidmət)"
|
||||||
|
elif "165.1.3" in tax_article:
|
||||||
|
return "VM 165.1.3"
|
||||||
|
elif "165.1.4" in tax_article:
|
||||||
|
return "VM 165.1.4"
|
||||||
|
elif "165.1.5" in tax_article:
|
||||||
|
return "VM 165.1.5"
|
||||||
|
elif "165.1.9" in tax_article:
|
||||||
|
return "VM 165.1.9"
|
||||||
|
elif "165.1.10" in tax_article:
|
||||||
|
return "VM 165.1.10"
|
||||||
|
elif "165.1.11" in tax_article:
|
||||||
|
return "VM 165.1.11"
|
||||||
|
elif "164.1.1" in tax_article:
|
||||||
|
return "VM 164.1.1"
|
||||||
|
elif "164.1.2-1" in tax_article:
|
||||||
|
return "VM 164.1.2-1"
|
||||||
|
elif "164.1.2" in tax_article:
|
||||||
|
return "VM 164.1.2"
|
||||||
|
elif "164.1.3" in tax_article:
|
||||||
|
return "VM 164.1.3"
|
||||||
|
elif "164.1.5" in tax_article:
|
||||||
|
return "VM 164.1.5"
|
||||||
|
elif "164.1.6" in tax_article:
|
||||||
|
return "VM 164.1.6"
|
||||||
|
elif "164.1.7" in tax_article:
|
||||||
|
return "VM 164.1.7"
|
||||||
|
elif "164.1.8-1" in tax_article:
|
||||||
|
return "VM 164.1.8-1"
|
||||||
|
elif "164.1.8" in tax_article:
|
||||||
|
return "VM 164.1.8"
|
||||||
|
elif "164.1.9-1" in tax_article:
|
||||||
|
return "VM 164.1.9-1"
|
||||||
|
elif "164.1.9" in tax_article:
|
||||||
|
return "VM 164.1.9"
|
||||||
|
elif "164.1.10-1" in tax_article:
|
||||||
|
return "VM 164.1.10-1"
|
||||||
|
elif "164.1.10" in tax_article:
|
||||||
|
return "VM 164.1.10"
|
||||||
|
elif "164.1.11" in tax_article:
|
||||||
|
return "VM 164.1.11"
|
||||||
|
elif "164.1.12" in tax_article:
|
||||||
|
return "VM 164.1.12"
|
||||||
|
elif "164.1.13" in tax_article:
|
||||||
|
return "VM 164.1.13"
|
||||||
|
elif "164.1.14" in tax_article:
|
||||||
|
return "VM 164.1.14"
|
||||||
|
elif "164.1.17" in tax_article:
|
||||||
|
return "VM 164.1.17"
|
||||||
|
elif "164.1.18" in tax_article:
|
||||||
|
return "VM 164.1.18"
|
||||||
|
elif "164.1.19-1" in tax_article:
|
||||||
|
return "VM 164.1.19-1"
|
||||||
|
elif "164.1.19" in tax_article:
|
||||||
|
return "VM 164.1.19"
|
||||||
|
elif "164.1.27" in tax_article:
|
||||||
|
return "VM 164.1.27"
|
||||||
|
elif "164.1.29" in tax_article:
|
||||||
|
return "VM 164.1.29"
|
||||||
|
elif "164.1.30" in tax_article:
|
||||||
|
return "VM 164.1.30"
|
||||||
|
elif "164.1.31" in tax_article:
|
||||||
|
return "VM 164.1.31"
|
||||||
|
elif "164.1.32" in tax_article:
|
||||||
|
return "VM 164.1.32"
|
||||||
|
elif "164.1.34-1" in tax_article:
|
||||||
|
return "VM 164.1.34-1"
|
||||||
|
elif "164.1.34-2" in tax_article:
|
||||||
|
return "VM 164.1.34-2"
|
||||||
|
elif "164.1.34" in tax_article:
|
||||||
|
return "VM 164.1.34"
|
||||||
|
elif "164.1.36" in tax_article:
|
||||||
|
return "VM 164.1.36"
|
||||||
|
elif "164.1.37" in tax_article:
|
||||||
|
return "VM 164.1.37"
|
||||||
|
elif "164.1.41-1" in tax_article:
|
||||||
|
return "VM 164.1.41-1"
|
||||||
|
elif "164.1.41-2" in tax_article:
|
||||||
|
return "VM 164.1.41-2"
|
||||||
|
elif "164.1.41-3" in tax_article:
|
||||||
|
return "VM 164.1.41-3"
|
||||||
|
elif "164.1.41-4" in tax_article:
|
||||||
|
return "VM 164.1.41-4"
|
||||||
|
elif "164.1.41" in tax_article:
|
||||||
|
return "VM 164.1.41"
|
||||||
|
elif "164.1.42" in tax_article:
|
||||||
|
return "VM 164.1.42"
|
||||||
|
elif "164.1.43" in tax_article:
|
||||||
|
return "VM 164.1.43"
|
||||||
|
elif "164.1.46" in tax_article:
|
||||||
|
return "VM 164.1.46"
|
||||||
|
elif "164.1.47" in tax_article:
|
||||||
|
return "VM 164.1.47"
|
||||||
|
elif "164.1.48" in tax_article:
|
||||||
|
return "VM 164.1.48"
|
||||||
|
elif "164.1.49" in tax_article:
|
||||||
|
return "VM 164.1.49"
|
||||||
|
elif "164.1.50" in tax_article:
|
||||||
|
return "VM 164.1.50"
|
||||||
|
elif "164.1.51-1" in tax_article:
|
||||||
|
return "VM 164.1.51-1"
|
||||||
|
elif "164.1.51" in tax_article:
|
||||||
|
return "VM 164.1.51"
|
||||||
|
elif "164.1.55" in tax_article:
|
||||||
|
return "VM 164.1.55"
|
||||||
|
elif "164.1.56-1" in tax_article:
|
||||||
|
return "VM 164.1.56-1"
|
||||||
|
elif "164.1.57" in tax_article:
|
||||||
|
return "VM 164.1.57"
|
||||||
|
elif "164.1.58" in tax_article:
|
||||||
|
return "VM 164.1.58"
|
||||||
|
elif "164.1.59" in tax_article:
|
||||||
|
return "VM 164.1.59"
|
||||||
|
else:
|
||||||
|
return "VM Digər"
|
||||||
|
|
||||||
|
|
||||||
|
def get_sales_invoice_items(filters, tax_articles):
|
||||||
|
"""Получает Sales Invoice Items с учетом фильтров"""
|
||||||
|
|
||||||
|
conditions = []
|
||||||
|
values = []
|
||||||
|
|
||||||
|
# Фильтр по компании
|
||||||
|
if filters.get("company"):
|
||||||
|
conditions.append("si.company = %s")
|
||||||
|
values.append(filters.get("company"))
|
||||||
|
|
||||||
|
# Фильтр по датам
|
||||||
|
if filters.get("from_date"):
|
||||||
|
conditions.append("si.posting_date >= %s")
|
||||||
|
values.append(filters.get("from_date"))
|
||||||
|
|
||||||
|
if filters.get("to_date"):
|
||||||
|
conditions.append("si.posting_date <= %s")
|
||||||
|
values.append(filters.get("to_date"))
|
||||||
|
|
||||||
|
# Только подтвержденные документы
|
||||||
|
conditions.append("si.docstatus = 1")
|
||||||
|
|
||||||
|
# Только items с налоговыми статьями из списка
|
||||||
|
article_placeholders = ", ".join(["%s"] * len(tax_articles))
|
||||||
|
conditions.append(f"sii.tax_article IN ({article_placeholders})")
|
||||||
|
values.extend(tax_articles)
|
||||||
|
|
||||||
|
where_clause = ""
|
||||||
|
if conditions:
|
||||||
|
where_clause = "WHERE " + " AND ".join(conditions)
|
||||||
|
|
||||||
|
query = f"""
|
||||||
|
SELECT
|
||||||
|
si.name as parent,
|
||||||
|
si.posting_date,
|
||||||
|
si.company,
|
||||||
|
sii.tax_article,
|
||||||
|
sii.amount
|
||||||
|
FROM
|
||||||
|
`tabSales Invoice Item` sii
|
||||||
|
JOIN
|
||||||
|
`tabSales Invoice` si ON sii.parent = si.name
|
||||||
|
{where_clause}
|
||||||
|
ORDER BY
|
||||||
|
si.posting_date DESC, si.name
|
||||||
|
"""
|
||||||
|
|
||||||
|
return frappe.db.sql(query, values, as_dict=True)
|
||||||
|
|
||||||
|
|
||||||
|
def get_columns():
|
||||||
|
"""Создает колонки отчета"""
|
||||||
|
columns = []
|
||||||
|
|
||||||
|
# Основные колонки
|
||||||
|
columns.extend([
|
||||||
|
{
|
||||||
|
"label": "Sales Invoice",
|
||||||
|
"fieldname": "sales_invoice",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Sales Invoice",
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Tarix",
|
||||||
|
"fieldname": "posting_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"width": 100
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
# Создаем колонки для каждой налоговой статьи
|
||||||
|
tax_articles = get_tax_articles_list()
|
||||||
|
|
||||||
|
for article in tax_articles:
|
||||||
|
article_key = get_article_field_key(article)
|
||||||
|
short_name = get_short_article_name(article)
|
||||||
|
|
||||||
|
columns.append({
|
||||||
|
"label": short_name,
|
||||||
|
"fieldname": article_key,
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"width": 120
|
||||||
|
})
|
||||||
|
|
||||||
|
return columns
|
||||||
Loading…
Reference in New Issue