complete first version of main proccess
This commit is contained in:
parent
6ff4740d04
commit
f2fc2362a7
61 changed files with 3280 additions and 28 deletions
|
@ -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']
|
|
@ -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):
|
||||
|
|
34
accounts/migrations/0002_company.py
Normal file
34
accounts/migrations/0002_company.py
Normal 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ها',
|
||||
},
|
||||
),
|
||||
]
|
|
@ -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='نام بانک'),
|
||||
),
|
||||
]
|
|
@ -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
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue