complete first version of main proccess

This commit is contained in:
aminhashemi92 2025-08-27 07:11:26 +03:30
parent 6ff4740d04
commit f2fc2362a7
61 changed files with 3280 additions and 28 deletions

View file

@ -1,6 +1,6 @@
from django.contrib import admin
from accounts.models import Role, Profile
from accounts.models import Role, Profile, Company
# Register your models here.
@ -30,3 +30,12 @@ class ProfileAdmin(admin.ModelAdmin):
date_hierarchy = 'created'
ordering = ['-created']
readonly_fields = ['created', 'updated']
@admin.register(Company)
class CompanyAdmin(admin.ModelAdmin):
list_display = ['name', 'logo', 'signature', 'address', 'phone']
prepopulated_fields = {'slug': ('name',)}
search_fields = ['name', 'address', 'phone']
list_filter = ['is_active']
date_hierarchy = 'created'
ordering = ['-created']

View file

@ -29,7 +29,7 @@ class CustomerForm(forms.ModelForm):
model = Profile
fields = [
'phone_number_1', 'phone_number_2', 'national_code',
'address', 'card_number', 'account_number'
'address', 'card_number', 'account_number', 'bank_name'
]
widgets = {
'phone_number_1': forms.TextInput(attrs={
@ -61,6 +61,10 @@ class CustomerForm(forms.ModelForm):
'placeholder': 'شماره حساب بانکی',
'maxlength': '20'
}),
'bank_name': forms.Select(attrs={
'class': 'form-control',
'placeholder': 'نام بانک',
}),
}
labels = {
'phone_number_1': 'تلفن ۱',
@ -69,6 +73,7 @@ class CustomerForm(forms.ModelForm):
'address': 'آدرس',
'card_number': 'شماره کارت',
'account_number': 'شماره حساب',
'bank_name': 'نام بانک',
}
def clean_national_code(self):

View file

@ -0,0 +1,34 @@
# Generated by Django 5.2.4 on 2025-08-21 06:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Company',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ایجاد')),
('updated', models.DateTimeField(auto_now=True, verbose_name='تاریخ بروزرسانی')),
('is_active', models.BooleanField(default=True, verbose_name='فعال')),
('is_deleted', models.BooleanField(default=False, verbose_name='حذف شده')),
('deleted_at', models.DateTimeField(blank=True, null=True, verbose_name='تاریخ حذف')),
('slug', models.SlugField(max_length=100, unique=True, verbose_name='اسلاگ')),
('name', models.CharField(max_length=100, verbose_name='نام')),
('logo', models.ImageField(blank=True, null=True, upload_to='companies/logos', verbose_name='لوگوی شرکت')),
('signature', models.ImageField(blank=True, null=True, upload_to='companies/signatures', verbose_name='امضای شرکت')),
('address', models.TextField(blank=True, null=True, verbose_name='آدرس')),
('phone', models.CharField(blank=True, max_length=11, null=True, verbose_name='شماره تماس')),
],
options={
'verbose_name': 'شرکت',
'verbose_name_plural': 'شرکت\u200cها',
},
),
]

View file

@ -0,0 +1,23 @@
# Generated by Django 5.2.4 on 2025-08-21 07:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0002_company'),
]
operations = [
migrations.AddField(
model_name='historicalprofile',
name='bank_name',
field=models.CharField(blank=True, choices=[('mellat', 'بانک ملت'), ('saman', 'بانک سامان'), ('parsian', 'بانک پارسیان'), ('sina', 'بانک سینا'), ('tejarat', 'بانک تجارت'), ('tosee', 'بانک توسعه'), ('iran_zamin', 'بانک ایران زمین'), ('meli', 'بانک ملی'), ('saderat', 'بانک توسعه صادرات'), ('iran_zamin', 'بانک ایران زمین'), ('refah', 'بانک رفاه'), ('eghtesad_novin', 'بانک اقتصاد نوین'), ('pasargad', 'بانک پاسارگاد'), ('other', 'سایر')], max_length=255, null=True, verbose_name='نام بانک'),
),
migrations.AddField(
model_name='profile',
name='bank_name',
field=models.CharField(blank=True, choices=[('mellat', 'بانک ملت'), ('saman', 'بانک سامان'), ('parsian', 'بانک پارسیان'), ('sina', 'بانک سینا'), ('tejarat', 'بانک تجارت'), ('tosee', 'بانک توسعه'), ('iran_zamin', 'بانک ایران زمین'), ('meli', 'بانک ملی'), ('saderat', 'بانک توسعه صادرات'), ('iran_zamin', 'بانک ایران زمین'), ('refah', 'بانک رفاه'), ('eghtesad_novin', 'بانک اقتصاد نوین'), ('pasargad', 'بانک پاسارگاد'), ('other', 'سایر')], max_length=255, null=True, verbose_name='نام بانک'),
),
]

View file

@ -3,14 +3,15 @@ from django.db import models
from django.utils.html import format_html
from django.core.validators import RegexValidator
from simple_history.models import HistoricalRecords
from common.models import TagModel, BaseModel
from common.consts import UserRoles
from common.models import TagModel, BaseModel, NameSlugModel
from common.consts import UserRoles, BANK_CHOICES
from locations.models import Affairs, Broker, County
# Create your models here.
class Role(TagModel):
class Meta:
verbose_name = "نقش"
verbose_name_plural = "نقش‌ها"
@ -68,6 +69,13 @@ class Profile(BaseModel):
)
]
)
bank_name = models.CharField(
max_length=255,
choices=BANK_CHOICES,
null=True,
verbose_name="نام بانک",
blank=True
)
phone_number_1 = models.CharField(
max_length=11,
null=True,
@ -170,3 +178,17 @@ class Profile(BaseModel):
return format_html(f"<img style='width:30px;' src='{self.pic.url}'>")
pic_tag.short_description = "تصویر"
class Company(NameSlugModel):
logo = models.ImageField(upload_to='companies/logos', null=True, blank=True, verbose_name='لوگوی شرکت')
signature = models.ImageField(upload_to='companies/signatures', null=True, blank=True, verbose_name='امضای شرکت')
address = models.TextField(null=True, blank=True, verbose_name='آدرس')
phone = models.CharField(max_length=11, null=True, blank=True, verbose_name='شماره تماس')
class Meta:
verbose_name = 'شرکت'
verbose_name_plural = 'شرکت‌ها'
def __str__(self):
return self.name

View file

@ -64,6 +64,7 @@
<th>کد ملی</th>
<th>تلفن</th>
<th>آدرس</th>
<th>بانک</th>
<th>وضعیت</th>
<th>عملیات</th>
</tr>
@ -122,6 +123,17 @@
<span class="text-muted">آدرس ثبت نشده</span>
{% endif %}
</td>
<td>
<div class="d-flex flex-column">
{% if customer.bank_name %}
<span class="fw-medium">{{ customer.get_bank_name_display }}</span>
<span class="text-muted">{{ customer.card_number }}</span>
<span class="text-muted">{{ customer.account_number }}</span>
{% else %}
<span class="text-muted">بانک ثبت نشده</span>
{% endif %}
</div>
</td>
<td>
{% if customer.is_completed %}
<span class="badge bg-label-success">تکمیل شده</span>
@ -241,6 +253,17 @@
<div class="invalid-feedback d-block">{{ form.national_code.errors.0 }}</div>
{% endif %}
</div>
<div class="col-sm-12">
<label class="form-label fw-bold" for="{{ form.bank_name.id_for_label }}">{{ form.bank_name.label }}</label>
<div class="input-group input-group-merge">
<span class="input-group-text"><i class="bx bx-credit-card"></i></span>
{{ form.bank_name }}
</div>
{% if form.bank_name.errors %}
<div class="invalid-feedback d-block">{{ form.bank_name.errors.0 }}</div>
{% endif %}
</div>
<div class="col-sm-12">
<label class="form-label fw-bold" for="{{ form.card_number.id_for_label }}">{{ form.card_number.label }}</label>

View file

@ -144,6 +144,7 @@ def get_customer_data(request, customer_id):
'card_number': str(form['card_number']),
'account_number': str(form['account_number']),
'address': str(form['address']),
'bank_name': str(form['bank_name']),
}
return JsonResponse({
@ -157,7 +158,8 @@ def get_customer_data(request, customer_id):
'national_code': customer.national_code or '',
'card_number': customer.card_number or '',
'account_number': customer.account_number or '',
'address': customer.address or ''
'address': customer.address or '',
'bank_name': customer.bank_name or '',
},
'form_html': form_html
})