XH_Digital_Management/templates/form_partial.html

638 lines
32 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% load tags %}
<form id="addEditForm" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% if form.instance.pk %}
<input type="hidden" name="id" value="{{ form.instance.pk }}">
{% endif %}
<div class="card-body">
<div class="row">
<div class="col-md-6">
{% for field in form %}
{% if forloop.counter0|divisibleby:2 %}
<div class="mb-3">
<label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
{% if field.field.widget.input_type == "text" %}
<input type="text" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'' }}"
placeholder="{{ field.field.widget.attrs.placeholder|default:field.label }}">
{% elif field.field.widget.input_type == "number" %}
<input type="number" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'' }}"
placeholder="{{ field.label }}">
{% elif field.field.widget.input_type == "select" %}
<select class="form-control" id="{{ field.id_for_label }}" name="{{ field.name }}">
{% for choice in field.field.choices %}
<option value="{{ choice.0 }}"
{% if choice.0 == field.value %}selected{% endif %}>{{ choice.1 }}</option>
{% endfor %}
</select>
{% elif field|is_input_type:"textarea" %}
<textarea class="form-control" id="{{ field.id_for_label }}" name="{{ field.name }}"
rows="3"
placeholder="{{ field.field.widget.attrs.placeholder|default:'请输入内容' }}">{{ field.value|default_if_none:'' }}</textarea>
{% elif field.field.widget.input_type == "date" %}
<input type="date" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|date:"Y-m-d" }}">
{% elif field.field.widget.input_type == "datetime-local" %}
<input type="datetime-local" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|date:"Y-m-d\TH:i" }}">
{% elif field.field.widget.input_type == "email" %}
<input type="email" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'' }}"
placeholder="{{ field.label }}">
{% elif field.field.widget.input_type == "month" %}
<input type="month" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|date:"Y-m" }}">
{% elif field.field.widget.input_type == "password" %}
<input type="password" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" placeholder="{{ field.label }}">
{% elif field.field.widget.input_type == "year" %}
<input type="text" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'选择年份' }}">
{% elif field.field.widget.input_type == "checkbox" %}
<div class="form-check">
<input type="checkbox" class="form-check-input" id="{{ field.id_for_label }}"
name="{{ field.name }}" {% if field.value %}checked{% endif %}>
<label class="form-check-label"
for="{{ field.id_for_label }}">{{ field.label }}</label>
</div>
{% else %}
{{ field }}
{% endif %}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text }}</small>
{% endif %}
{% for error in field.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
</div>
{% endif %}
{% endfor %}
</div>
<div class="col-md-6">
{% for field in form %}
{% if not forloop.counter0|divisibleby:2 %}
<div class="mb-3">
<label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
{% if field.field.widget.input_type == "text" %}
<input type="text" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'' }}"
placeholder="{{ field.field.widget.attrs.placeholder|default:field.label }}">
{% elif field.field.widget.input_type == "number" %}
<input type="number" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'' }}"
placeholder="{{ field.label }}">
{% elif field.field.widget.input_type == "select" %}
<select class="form-control" id="{{ field.id_for_label }}" name="{{ field.name }}">
{% for choice in field.field.choices %}
<option value="{{ choice.0 }}"
{% if choice.0 == field.value %}selected{% endif %}>{{ choice.1 }}</option>
{% endfor %}
</select>
{% elif field|is_input_type:"textarea" %}
<textarea class="form-control" id="{{ field.id_for_label }}" name="{{ field.name }}"
rows="3"
placeholder="{{ field.field.widget.attrs.placeholder|default:'请输入内容' }}">{{ field.value|default_if_none:'' }}</textarea>
{% elif field.field.widget.input_type == "date" %}
<input type="date" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|date:"Y-m-d" }}">
{% elif field.field.widget.input_type == "datetime-local" %}
<input type="datetime-local" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|date:"Y-m-d\TH:i" }}">
{% elif field.field.widget.input_type == "month" %}
<input type="month" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|date:"Y-m" }}">
{% elif field.field.widget.input_type == "year" %}
<input type="text" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'选择年份' }}">
{% elif field.field.widget.input_type == "email" %}
<input type="email" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" value="{{ field.value|default_if_none:'' }}"
placeholder="{{ field.label }}">
{% elif field.field.widget.input_type == "password" %}
<input type="password" class="form-control" id="{{ field.id_for_label }}"
name="{{ field.name }}" placeholder="{{ field.label }}">
{% elif field.field.widget.input_type == "checkbox" %}
<div class="form-check">
<input type="checkbox" class="form-check-input" id="{{ field.id_for_label }}"
name="{{ field.name }}" {% if field.value %}checked{% endif %}>
<label class="form-check-label"
for="{{ field.id_for_label }}">{{ field.label }}</label>
</div>
{% else %}
{{ field }}
{% endif %}
{% if field.help_text %}
<small class="form-text text-muted">{{ field.help_text }}</small>
{% endif %}
{% for error in field.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
<div class="modal-footer" style="padding: 10px 5px 5px 5px;">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="submit" class="btn btn-primary" id="submitForm">保存</button>
</div>
</form>
<script type="text/javascript">
$(document).ready(function () {
function toggleSelect2() {
var actionUrl = $('#hiddenActionLink').attr('href');
// 假设如果URL中包含某特定关键字则使用select2
if (actionUrl.includes('proj_ledger')) {
if ($('#id_project_name').data('select2')) {
$('#id_project_name').select2('destroy');
}
// 确保使用原生input
$('#id_project_name').attr('type', 'text');
function initSelectors() {
var initialProvince = $('#id_province').val();
var initialCity = $('#id_city').val();
var initialDistrict = $('#id_district').val();
// 替换 input 元素为 select 元素
$('#id_province').replaceWith('<select id="id_province" name="province" class="form-control"></select>');
$('#id_city').replaceWith('<select id="id_city" name="city" class="form-control"></select>');
$('#id_district').replaceWith('<select id="id_district" name="district" class="form-control"></select>');
var provinceSelect = $('#id_province');
var citySelect = $('#id_city');
var districtSelect = $('#id_district');
// 初始化省份选择框
provinceSelect.empty().append($('<option>', {value: "", text: "---请选择省份---"}));
province.forEach(function (prov) {
provinceSelect.append($('<option>', {
value: prov.name,
text: prov.name
}));
});
// 当省份选择变化时更新城市选择框
provinceSelect.change(function () {
var selectedProvince = $(this).val();
citySelect.empty().append($('<option>', {value: "", text: "---请选择市---"}));
districtSelect.empty().append($('<option>', {value: "", text: "---请选择区县---"}));
if (selectedProvince) {
var cities = province.find(p => p.name === selectedProvince).city;
cities.forEach(function (city) {
citySelect.append($('<option>', {
value: city.name,
text: city.name
}));
});
}
});
// 当城市选择变化时更新区县选择框
citySelect.change(function () {
var selectedCity = $(this).val();
districtSelect.empty().append($('<option>', {value: "", text: "---请选择区县---"}));
if (selectedCity) {
var selectedProvince = province.find(p => p.name === provinceSelect.val());
var selectedCityObject = selectedProvince.city.find(c => c.name === selectedCity);
selectedCityObject.districtAndCounty.forEach(function (district) {
districtSelect.append($('<option>', {
value: district,
text: district
}));
});
}
});
// 设置初始值
if (initialProvince) {
provinceSelect.val(initialProvince).trigger('change');
if (initialCity) {
citySelect.val(initialCity).trigger('change');
if (initialDistrict) {
districtSelect.val(initialDistrict);
}
}
}
}
// 调用初始化函数
initSelectors();
} else {
// 实现项目名称关键字查询和下拉框选择
$('#id_project_name').select2({
placeholder: "选择或搜索项目名称",
allowClear: true,
dropdownParent: $('#addEditModal'),
width: '100%'
});
}
}
$('#id_invoice').select2({
placeholder: "选择或搜索发票号码",
allowClear: true,
dropdownParent: $('#addEditModal'),
width: '100%'
})
toggleSelect2();
// 当选择改变时触发的事件
$('#id_project_name').on('select2:select', function (e) {
var projectName = e.params.data.id; // 获取选择的项目名称
if (projectName) {
$.ajax({
url: '/basic_data/pjm/project_detail/',
method: 'GET', // 明确指定使用 GET 请求
data: {
'project_name': projectName
},
success: function (data) {
if (data.error) {
alert(data.error);
} else {
$('#id_primary_department').val(data.primary_department);
$('#id_project_manager').val(data.project_leader);
$('#id_nature').val(data.project_nature);
$('#id_revenue').val(data.revenue);
}
},
error: function (xhr, status, error) {
alert('An error occurred: ' + xhr.responseText);
}
});
}
});
// 一二级部门联动
function updateSecondaryDepartments(primaryDepartment, selectedSecondaryDepartment = null) {
var url = "{% url 'load_secondary_departments' %}";
$.ajax({
url: url,
data: {
'primary_department': primaryDepartment
},
success: function (html) {
$('#id_secondary_department').html(html);
if (selectedSecondaryDepartment) {
$('#id_secondary_department').val(selectedSecondaryDepartment);
}
}
});
}
// 监听一级部门变化
$('#id_primary_department').change(function () {
var primaryDepartment = $(this).val();
if (primaryDepartment) {
updateSecondaryDepartments(primaryDepartment);
} else {
$('#id_secondary_department').html('<option value="">---------</option>');
}
});
// 如果在页面加载时已选择一级部门,则加载相应的二级部门
var initialPrimaryDepartment = $('#id_primary_department').val();
var initialSecondaryDepartment = $('#id_secondary_department').val();
if (initialPrimaryDepartment) {
updateSecondaryDepartments(initialPrimaryDepartment, initialSecondaryDepartment);
}
// 动态生成id_seal_type的select选项
var sealTypeOptions = [
{value: '公章', text: '公章'},
{value: '法人章', text: '法人章'},
{value: '合同章', text: '合同章'},
{value: '财务章', text: '财务章'},
{value: '其他', text: '其他'}
];
var $sealTypeSelect = $('<select>', {
class: 'form-control',
id: 'id_seal_type',
name: 'seal_type'
});
$.each(sealTypeOptions, function (index, option) {
$sealTypeSelect.append($('<option>', {
value: option.value,
text: option.text
}));
});
// 替换现有的#id_seal_type元素
$('#id_seal_type').replaceWith($sealTypeSelect);
// 使用年相关组件
$('#id_year').datepicker({
format: "yyyy",
viewMode: "years",
minViewMode: "years",
autoclose: true
});
// 监听项目类型实现级联选择项目明细
$(document).on('change', '#id_expense_type', function () {
var expenseType = $(this).find("option:selected").text();
var expenseDetailSelect = document.getElementById('id_expense_detail');
expenseDetailSelect.innerHTML = '<option value="">请选择</option>'; // 清空之前的选项
if (expenseType) {
fetch(`/basic_data/fm/get_expense_details?expense_type=${expenseType}`)
.then(response => response.json())
.then(data => {
data.forEach(function (detail) {
var option = document.createElement('option');
option.value = detail.detail_id;
option.textContent = detail.expense_detail;
expenseDetailSelect.appendChild(option);
});
})
.catch(error => console.error('Error fetching expense details:', error));
}
});
// 纳税记录表-根据纳税频率动态更新纳税所属期
function updateTaxPeriodOptions(taxFrequency, selectedTaxPeriod = null) {
var taxPeriodSelect = document.getElementById('id_tax_period');
taxPeriodSelect.innerHTML = '<option value="">---------</option>'; // 清空之前的选项
if (taxFrequency === '月度') {
for (var i = 1; i <= 12; i++) {
var option = document.createElement('option');
option.value = i + '月';
option.textContent = i + '月';
taxPeriodSelect.appendChild(option);
}
} else if (taxFrequency === '季度') {
var quarters = ['一季度', '二季度', '三季度', '四季度'];
quarters.forEach(function (quarter) {
var option = document.createElement('option');
option.value = quarter;
option.textContent = quarter;
taxPeriodSelect.appendChild(option);
});
} else if (taxFrequency === '半年度') {
var quarters = ['上半年', '下半年'];
quarters.forEach(function (quarter) {
var option = document.createElement('option');
option.value = quarter;
option.textContent = quarter;
taxPeriodSelect.appendChild(option);
});
}
if (selectedTaxPeriod) {
taxPeriodSelect.value = selectedTaxPeriod;
}
}
// 监听纳税频率
$(document).on('change', '#id_tax_frequency', function () {
var taxFrequency = this.value;
updateTaxPeriodOptions(taxFrequency);
});
// 如果在页面加载时已选择纳税频率和纳税所属期,则初始化它们
var initialTaxFrequency = $('#id_tax_frequency').val();
var initialTaxPeriod = "{{ form.tax_period.value }}";
if (initialTaxFrequency) {
updateTaxPeriodOptions(initialTaxFrequency, initialTaxPeriod);
}
// 账号运营管理记录-监听所属平台-获取该平台下所有的账号名称
$('#id_platform').change(function () {
var platform = $(this).val();
$.ajax({
url: '{% url "get_account_names" %}',
data: {
'platform': platform
},
success: function (data) {
var $accountName = $('#id_account_name');
$accountName.empty();
$accountName.append('<option value="">---------</option>');
$.each(data.account_names, function (key, value) {
$accountName.append('<option value="' + value + '">' + value + '</option>');
});
}
});
});
// 合同管理台账-监听合同类别-如为业务类-项目名称可以下拉选择
var $contractType = $('#id_contract_type');
var $projectName = $('#id_project_name');
var $projectNameSelect = $('<select id="id_project_name_select" name="project_name" class="form-control"></select>');
var $primaryDepartment = $('#id_primary_department');
var $projectLeader = $('#id_project_leader');
// 初始隐藏项目名称下拉框
$projectNameSelect.hide();
$projectName.after($projectNameSelect);
$contractType.change(function () {
if ($(this).val() === '业务类') {
$projectName.hide();
$projectNameSelect.show();
loadProjects();
} else {
$projectName.show();
$projectNameSelect.hide();
}
});
// 初始化项目名称下拉框
function loadProjects() {
$.ajax({
url: '{% url "get_project_details" %}',
success: function (data) {
$projectNameSelect.empty();
$projectNameSelect.append('<option value="">---------</option>');
$.each(data, function (index, project) {
$projectNameSelect.append('<option value="' + project.project_name + '">' + project.project_name + '</option>');
});
}
});
}
// 监听项目名称的变化-并且通过项目名称为一级部门和项目负责人赋值
$projectNameSelect.change(function () {
var selectedProject = $(this).val();
if (selectedProject) {
$.ajax({
url: '{% url "get_project_details" %}',
data: {
'project_name': selectedProject
},
success: function (data) {
$projectName.val(selectedProject);
$primaryDepartment.val(data.primary_department);
$projectLeader.val(data.project_leader);
}
});
}
});
// 初始化时执行一次
$contractType.trigger('change');
// 客户表-根据是否录入项目信息判断合作项目能否编辑
var $cooperation = $('#id_cooperation');
var $project = $('#id_project');
function updateProjectField() {
if ($cooperation.val() === '是') {
$project.prop('disabled', false);
$project.attr('placeholder', '请输入合作项目');
} else {
$project.prop('disabled', true);
$project.val(''); // 清空输入
$project.attr('placeholder', '项目不可编辑');
}
}
// 初始化时设置项目字段状态
updateProjectField();
// 监听 cooperation 字段的变化
$cooperation.change(updateProjectField);
// 固定资产清单-监听入账日期、折旧月份、折旧方法、资产原值、残值、折旧年限、账面价值
var $recordedDate = $('#id_recorded_date');
var $depreciationMonths = $('#id_depreciation_months');
var $depreciationMethod = $('#id_depreciation_method');
var $originalValue = $('#id_original_value');
var $residualValue = $('#id_residual_value');
var $depreciationYears = $('#id_depreciation_years');
var $bookValue = $('#id_book_value');
$depreciationMonths.prop('readonly', true);
// 根据入账日期计算折旧月数
function calculateDepreciationMonths() {
var recordedDate = new Date($recordedDate.val());
var currentDate = new Date();
var months = (currentDate.getFullYear() - recordedDate.getFullYear()) * 12;
months -= recordedDate.getMonth();
months += currentDate.getMonth();
$depreciationMonths.val(months);
}
// 计算账面价值=资产原值-(资产原值-残值)*折旧月数/(折旧年限*12
function calculateBookValue() {
var method = $depreciationMethod.val();
if (method === '年限平均法') {
var originalValue = parseFloat($originalValue.val()) || 0;
var residualValue = parseFloat($residualValue.val()) || 0;
var depreciationMonths = parseInt($depreciationMonths.val()) || 0;
var depreciationYears = parseInt($depreciationYears.val()) || 0;
var bookValue = originalValue - (originalValue - residualValue) * depreciationMonths / (depreciationYears * 12);
$bookValue.val(bookValue.toFixed(2));
$bookValue.prop('readonly', true);
} else {
$bookValue.val('');
$bookValue.prop('readonly', false);
}
}
$recordedDate.change(function () {
calculateDepreciationMonths();
calculateBookValue();
});
$depreciationMethod.change(calculateBookValue);
// 当其他相关字段改变时,也重新计算账面价值
$originalValue.change(calculateBookValue);
$residualValue.change(calculateBookValue);
$depreciationYears.change(calculateBookValue);
$depreciationMonths.change(calculateBookValue);
// 项目进度
var departmentSelect = document.getElementById('id_department');
var projectTypeSelect = document.getElementById('id_project_type');
var options = {
"天信": ['cbc', '债拍', '其他'],
'混改': ['cbc', '债拍', '其他'],
'艾力芬特': ['承销', '贸易', '其他'],
'星河': ['咨询', '科技', '新媒体', '其他'],
'星海': ['非标', '贸易', '其他']
};
function updateProjectTypeOptions() {
var department = departmentSelect.options[departmentSelect.selectedIndex].text;
// 获取当前选中的项目类型
var selectedProjectType = projectTypeSelect.getAttribute('data-selected') || '{{ selected_project_type }}';
// 清空现有选项
projectTypeSelect.innerHTML = '<option value="">---------</option>';
if (department in options) {
options[department].forEach(function (option) {
var newOption = document.createElement('option');
newOption.value = option;
newOption.textContent = option;
if (option === selectedProjectType) {
newOption.selected = true;
}
projectTypeSelect.appendChild(newOption);
});
}
}
// 监听部门选择变化
departmentSelect.addEventListener('change', function() {
projectTypeSelect.setAttribute('data-selected', ''); // 清除之前的选择
updateProjectTypeOptions();
});
// 初始加载时调用一次以确保正确显示默认值
updateProjectTypeOptions();
// 计算税金和总金额:价税合计金额 = 不含税金额 / 税率; 税额 = 价税合计金额 - 不含税金额
$('#id_amount_excluding_tax, #id_tax_rate').on('input', function () {
var amountExcludingTaxElement = document.getElementById('id_amount_excluding_tax');
var taxRateElement = document.getElementById('id_tax_rate');
var taxAmountElement = document.getElementById('id_tax_amount');
var totalAmountElement = document.getElementById('id_total_amount');
var amountExcludingTax = parseFloat(amountExcludingTaxElement.value) || 0;
var taxRate = parseFloat(taxRateElement.value) || 0;
var taxAmount = amountExcludingTax * (taxRate / 100);
var totalAmount = amountExcludingTax + taxAmount;
taxAmountElement.value = taxAmount.toFixed(2); // 保留两位小数
totalAmountElement.value = totalAmount.toFixed(2); // 保留两位小数
});
// 根据费用类型获取费用明细
document.getElementById('expense_type').addEventListener('change', function () {
var expenseType = this.value;
var expenseDetailSelect = document.getElementById('expense_detail');
expenseDetailSelect.innerHTML = '<option value="">请选择</option>'; // 清空之前的选项
if (expenseType) {
fetch(`/basic_data/fm/get_expense_details?expense_type=${expenseType}`)
.then(response => response.json())
.then(data => {
data.forEach(function (detail) {
var option = document.createElement('option');
option.value = detail.expense_detail;
option.textContent = detail.expense_detail;
expenseDetailSelect.appendChild(option);
});
})
.catch(error => console.error('Error fetching expense details:', error));
}
});
});
</script>