Merge pull request 'Permissions' (#106) from frontend into main

Reviewed-on: #106
This commit is contained in:
ismail 2025-07-03 15:56:08 +03:00
commit 37661aa50e
74 changed files with 2369 additions and 155 deletions

1
.gitignore vendored
View File

@ -116,6 +116,7 @@ celerybeat-schedule.*
.venv .venv
env/ env/
venv/ venv/
dev_venv/
ENV/ ENV/
env.bak/ env.bak/
venv.bak/ venv.bak/

View File

@ -0,0 +1,46 @@
# Generated by Django 5.1.7 on 2025-07-01 10:33
import django.db.models.deletion
import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='ChatLog',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user_message', models.TextField()),
('chatbot_response', models.TextField()),
('timestamp', models.DateTimeField(auto_now_add=True, db_index=True)),
],
options={
'ordering': ['-timestamp'],
},
),
migrations.CreateModel(
name='AnalysisCache',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('prompt_hash', models.CharField(db_index=True, max_length=64)),
('dealer_id', models.IntegerField(blank=True, db_index=True, null=True)),
('created_at', models.DateTimeField(default=django.utils.timezone.now)),
('updated_at', models.DateTimeField(auto_now=True)),
('expires_at', models.DateTimeField(db_index=True)),
('result', models.JSONField()),
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name_plural': 'Analysis caches',
},
),
]

View File

@ -0,0 +1,34 @@
# Generated by Django 5.1.7 on 2025-07-01 10:33
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('haikalbot', '0001_initial'),
('inventory', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='chatlog',
name='dealer',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chatlogs', to='inventory.dealer'),
),
migrations.AddIndex(
model_name='analysiscache',
index=models.Index(fields=['prompt_hash', 'dealer_id'], name='haikalbot_a_prompt__b98e1e_idx'),
),
migrations.AddIndex(
model_name='analysiscache',
index=models.Index(fields=['expires_at'], name='haikalbot_a_expires_e790cd_idx'),
),
migrations.AddIndex(
model_name='chatlog',
index=models.Index(fields=['dealer', 'timestamp'], name='haikalbot_c_dealer__6f8d63_idx'),
),
]

View File

@ -43,8 +43,8 @@ class Command(BaseCommand):
) )
# Assign quotas to plans # Assign quotas to plans
PlanQuota.objects.create(plan=basic_plan, quota=users_quota, value=3) PlanQuota.objects.create(plan=basic_plan, quota=users_quota, value=4)
PlanQuota.objects.create(plan=basic_plan, quota=cars_quota, value=3) PlanQuota.objects.create(plan=basic_plan, quota=cars_quota, value=4)
PlanQuota.objects.create(plan=pro_plan, quota=users_quota, value=5) PlanQuota.objects.create(plan=pro_plan, quota=users_quota, value=5)
PlanQuota.objects.create(plan=pro_plan, quota=cars_quota, value=5) PlanQuota.objects.create(plan=pro_plan, quota=cars_quota, value=5)

View File

@ -0,0 +1,883 @@
# Generated by Django 5.1.7 on 2025-07-01 10:33
import datetime
import django.core.validators
import django.db.models.deletion
import django.utils.timezone
import inventory.mixins
import inventory.models
import phonenumber_field.modelfields
import uuid
from decimal import Decimal
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('appointment', '0001_initial'),
('auth', '0012_alter_user_first_name_max_length'),
('contenttypes', '0002_remove_content_type_name'),
('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='CarEquipment',
fields=[
('id_car_equipment', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(blank=True, max_length=255, null=True)),
('arabic_name', models.CharField(blank=True, max_length=255, null=True)),
('year_begin', models.IntegerField(blank=True, null=True)),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
],
options={
'verbose_name': 'Equipment',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='CarMake',
fields=[
('id_car_make', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(blank=True, max_length=255, null=True)),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
('arabic_name', models.CharField(blank=True, max_length=255, null=True)),
('logo', models.ImageField(blank=True, null=True, upload_to='car_make', verbose_name='logo')),
('is_sa_import', models.BooleanField(default=False)),
('car_type', models.SmallIntegerField(blank=True, choices=[(1, 'Car'), (2, 'Light Commercial'), (3, 'Heavy-Duty Tractors'), (4, 'Trailers'), (5, 'Medium Trucks'), (6, 'Buses'), (20, 'Motorcycles'), (21, 'Buggy'), (22, 'Moto ATV'), (23, 'Scooters'), (24, 'Karting'), (25, 'ATV'), (26, 'Snowmobiles')], null=True)),
],
options={
'verbose_name': 'Make',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='ExteriorColors',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')),
],
options={
'verbose_name': 'Exterior Colors',
'verbose_name_plural': 'Exterior Colors',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='InteriorColors',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')),
],
options={
'verbose_name': 'Interior Colors',
'verbose_name_plural': 'Interior Colors',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='Payment',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')),
('payment_method', models.CharField(choices=[('cash', 'cash'), ('credit', 'credit'), ('transfer', 'transfer'), ('debit', 'debit'), ('sadad', 'SADAD')], max_length=50, verbose_name='method')),
('reference_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='reference number')),
('payment_date', models.DateField(auto_now_add=True, verbose_name='date')),
],
options={
'verbose_name': 'payment',
'verbose_name_plural': 'payments',
},
),
migrations.CreateModel(
name='VatRate',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rate', models.DecimalField(decimal_places=2, default=Decimal('0.15'), max_digits=5)),
('is_active', models.BooleanField(default=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='AdditionalServices',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('description', models.TextField(verbose_name='Description')),
('price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Price')),
('taxable', models.BooleanField(default=False, verbose_name='taxable')),
('uom', models.CharField(choices=[('EA', 'Each'), ('PR', 'Pair'), ('SET', 'Set'), ('GAL', 'Gallon'), ('L', 'Liter'), ('M', 'Meter'), ('KG', 'Kilogram'), ('HR', 'Hour'), ('BX', 'Box'), ('RL', 'Roll'), ('PKG', 'Package'), ('DZ', 'Dozen'), ('SQ_M', 'Square Meter'), ('PC', 'Piece'), ('BDL', 'Bundle')], max_length=10, verbose_name='Unit of Measurement')),
('item', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='django_ledger.itemmodel', verbose_name='Item')),
],
options={
'verbose_name': 'Additional Services',
'verbose_name_plural': 'Additional Services',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='Car',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True, verbose_name='Primary Key')),
('slug', models.SlugField(blank=True, help_text='Slug for the object. If not provided, it will be generated automatically.', null=True, unique=True, verbose_name='Slug')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
('vin', models.CharField(max_length=17, unique=True, verbose_name='VIN')),
('year', models.IntegerField(verbose_name='Year')),
('status', models.CharField(choices=[('available', 'Available'), ('sold', 'Sold'), ('hold', 'Hold'), ('damaged', 'Damaged'), ('reserved', 'Reserved'), ('transfer', 'Transfer')], default='available', max_length=10, verbose_name='Status')),
('stock_type', models.CharField(choices=[('new', 'New'), ('used', 'Used')], default='new', max_length=10, verbose_name='Stock Type')),
('remarks', models.TextField(blank=True, null=True, verbose_name='Remarks')),
('mileage', models.IntegerField(blank=True, null=True, verbose_name='Mileage')),
('receiving_date', models.DateTimeField(verbose_name='Receiving Date')),
('hash', models.CharField(blank=True, max_length=64, null=True, verbose_name='Hash')),
('item_model', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='django_ledger.itemmodel', verbose_name='Item Model')),
('id_car_make', models.ForeignKey(blank=True, db_column='id_car_make', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make')),
],
options={
'verbose_name': 'Car',
'verbose_name_plural': 'Cars',
},
),
migrations.CreateModel(
name='CarFinance',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('cost_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Cost Price')),
('selling_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Selling Price')),
('discount_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Discount Amount')),
('is_sold', models.BooleanField(default=False)),
('additional_services', models.ManyToManyField(blank=True, related_name='additional_finances', to='inventory.additionalservices')),
('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='finances', to='inventory.car')),
],
options={
'verbose_name': 'Car Financial Details',
'verbose_name_plural': 'Car Financial Details',
},
),
migrations.CreateModel(
name='CarModel',
fields=[
('id_car_model', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(blank=True, max_length=255, null=True)),
('arabic_name', models.CharField(blank=True, max_length=255, null=True)),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
('id_car_make', models.ForeignKey(db_column='id_car_make', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake')),
],
options={
'verbose_name': 'Model',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.AddField(
model_name='car',
name='id_car_model',
field=models.ForeignKey(blank=True, db_column='id_car_model', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model'),
),
migrations.CreateModel(
name='CarOption',
fields=[
('id_car_option', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(blank=True, max_length=255, null=True)),
('arabic_name', models.CharField(blank=True, max_length=255, null=True)),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
('id_parent', models.ForeignKey(blank=True, db_column='id_parent', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.caroption')),
],
options={
'verbose_name': 'Option',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='CarOptionValue',
fields=[
('id_car_option_value', models.AutoField(primary_key=True, serialize=False)),
('value', models.CharField(max_length=500)),
('unit', models.CharField(blank=True, max_length=255, null=True)),
('is_base', models.IntegerField()),
('id_car_equipment', models.ForeignKey(db_column='id_car_equipment', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carequipment')),
('id_car_option', models.ForeignKey(db_column='id_car_option', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.caroption')),
],
options={
'verbose_name': 'Option Value',
},
),
migrations.CreateModel(
name='CarRegistration',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('plate_number', models.IntegerField(verbose_name='Plate Number')),
('text1', models.CharField(max_length=1, verbose_name='Text 1')),
('text2', models.CharField(blank=True, max_length=1, null=True, verbose_name='Text 2')),
('text3', models.CharField(blank=True, max_length=1, null=True, verbose_name='Text 3')),
('registration_date', models.DateTimeField(verbose_name='Registration Date')),
('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='inventory.car', verbose_name='Car')),
],
options={
'verbose_name': 'Registration',
'verbose_name_plural': 'Registrations',
},
),
migrations.CreateModel(
name='CarSerie',
fields=[
('id_car_serie', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(blank=True, max_length=255, null=True)),
('arabic_name', models.CharField(blank=True, max_length=255, null=True)),
('year_begin', models.IntegerField(blank=True, null=True)),
('year_end', models.IntegerField(blank=True, null=True)),
('generation_name', models.CharField(blank=True, max_length=255, null=True)),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
('id_car_model', models.ForeignKey(db_column='id_car_model', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel')),
],
options={
'verbose_name': 'Series',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.AddField(
model_name='car',
name='id_car_serie',
field=models.ForeignKey(blank=True, db_column='id_car_serie', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carserie', verbose_name='Series'),
),
migrations.CreateModel(
name='CarSpecification',
fields=[
('id_car_specification', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=255)),
('arabic_name', models.CharField(max_length=255)),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
('id_parent', models.ForeignKey(blank=True, db_column='id_parent', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carspecification')),
],
options={
'verbose_name': 'Specification',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='CarTrim',
fields=[
('id_car_trim', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(blank=True, max_length=255, null=True)),
('arabic_name', models.CharField(blank=True, max_length=255, null=True)),
('start_production_year', models.IntegerField(blank=True, null=True)),
('end_production_year', models.IntegerField(blank=True, null=True)),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
('id_car_serie', models.ForeignKey(db_column='id_car_serie', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carserie')),
],
options={
'verbose_name': 'Trim',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='CarSpecificationValue',
fields=[
('id_car_specification_value', models.AutoField(primary_key=True, serialize=False)),
('value', models.CharField(max_length=500)),
('unit', models.CharField(blank=True, max_length=255, null=True)),
('id_car_specification', models.ForeignKey(db_column='id_car_specification', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carspecification')),
('id_car_trim', models.ForeignKey(db_column='id_car_trim', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim')),
],
options={
'verbose_name': 'Specification Value',
},
),
migrations.AddField(
model_name='carequipment',
name='id_car_trim',
field=models.ForeignKey(db_column='id_car_trim', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim'),
),
migrations.AddField(
model_name='car',
name='id_car_trim',
field=models.ForeignKey(blank=True, db_column='id_car_trim', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.cartrim', verbose_name='Trim'),
),
migrations.CreateModel(
name='CustomCard',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('custom_number', models.CharField(max_length=255, verbose_name='Custom Number')),
('custom_date', models.DateField(verbose_name='Custom Date')),
('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='custom_cards', to='inventory.car', verbose_name='Car')),
],
options={
'verbose_name': 'Custom Card',
'verbose_name_plural': 'Custom Cards',
},
),
migrations.CreateModel(
name='Dealer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('crn', models.CharField(blank=True, max_length=10, null=True, verbose_name='Commercial Registration Number')),
('vrn', models.CharField(blank=True, max_length=15, null=True, verbose_name='VAT Registration Number')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('name', models.CharField(max_length=255, verbose_name='English Name')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')),
('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')),
('logo', models.ImageField(blank=True, null=True, upload_to='logos/users', verbose_name='Logo')),
('joined_at', models.DateTimeField(auto_now_add=True, verbose_name='Joined At')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)),
('entity', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.entitymodel')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='dealer', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Dealer',
'verbose_name_plural': 'Dealers',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
managers=[
('objects', inventory.models.DealerUserManager()),
],
),
migrations.CreateModel(
name='CustomGroup',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='auth.group', verbose_name='Group')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='groups', to='inventory.dealer')),
],
),
migrations.CreateModel(
name='Customer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(choices=[('mr', 'Mr'), ('mrs', 'Mrs'), ('ms', 'Ms'), ('miss', 'Miss'), ('dr', 'Dr'), ('prof', 'Prof'), ('prince', 'Prince'), ('princess', 'Princess'), ('company', 'Company'), ('na', 'N/A')], default='na', max_length=10, verbose_name='Title')),
('first_name', models.CharField(max_length=50, verbose_name='First Name')),
('last_name', models.CharField(max_length=50, verbose_name='Last Name')),
('gender', models.CharField(choices=[('m', 'Male'), ('f', 'Female')], max_length=1, verbose_name='Gender')),
('dob', models.DateField(blank=True, null=True, verbose_name='Date of Birth')),
('email', models.EmailField(max_length=254, unique=True, verbose_name='Email')),
('national_id', models.CharField(blank=True, max_length=10, null=True, unique=True, verbose_name='National ID')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', unique=True, verbose_name='Phone Number')),
('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')),
('active', models.BooleanField(default=True, verbose_name='Active')),
('image', models.ImageField(blank=True, null=True, upload_to='customers/', verbose_name='Image')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('slug', models.SlugField(blank=True, editable=False, max_length=255, null=True, unique=True)),
('customer_model', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.customermodel')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='customer_profile', to=settings.AUTH_USER_MODEL)),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customers', to='inventory.dealer')),
],
options={
'verbose_name': 'Customer',
'verbose_name_plural': 'Customers',
},
),
migrations.CreateModel(
name='CarTransfer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('transfer_date', models.DateTimeField(auto_now_add=True, verbose_name='Transfer Date')),
('quantity', models.IntegerField(default=1, verbose_name='Quantity')),
('remarks', models.TextField(blank=True, null=True, verbose_name='Remarks')),
('status', models.CharField(default='draft', max_length=10, verbose_name=[('draft', 'Draft'), ('approved', 'Approved'), ('pending', 'Pending'), ('accepted', 'Accepted'), ('success', 'Success'), ('reject', 'Reject'), ('cancelled', 'Cancelled')])),
('is_approved', models.BooleanField(default=False)),
('active', models.BooleanField(default=True)),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')),
('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfer_logs', to='inventory.car', verbose_name='Car')),
('from_dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_out', to='inventory.dealer', verbose_name='From Dealer')),
('to_dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transfers_in', to='inventory.dealer', verbose_name='To Dealer')),
],
options={
'verbose_name': 'Car Transfer Log',
'verbose_name_plural': 'Car Transfer Logs',
},
),
migrations.CreateModel(
name='CarLocation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('description', models.TextField(blank=True, help_text='Optional description about the showroom placement.', null=True, verbose_name='Description')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Last Updated')),
('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='location', to='inventory.car', verbose_name='Car')),
('owner', models.ForeignKey(help_text='Dealer who owns the car.', on_delete=django.db.models.deletion.CASCADE, related_name='owned_cars', to='inventory.dealer', verbose_name='Owner')),
('showroom', models.ForeignKey(help_text='Dealer where the car is displayed (can be the owner).', on_delete=django.db.models.deletion.CASCADE, related_name='showroom_cars', to='inventory.dealer', verbose_name='Showroom')),
],
options={
'verbose_name': 'Car Location',
'verbose_name_plural': 'Car Locations',
},
),
migrations.AddField(
model_name='car',
name='dealer',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.dealer', verbose_name='Dealer'),
),
migrations.AddField(
model_name='additionalservices',
name='dealer',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer', verbose_name='Dealer'),
),
migrations.CreateModel(
name='Activity',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('object_id', models.PositiveIntegerField()),
('activity_type', models.CharField(choices=[('call', 'Call'), ('sms', 'SMS'), ('email', 'Email'), ('meeting', 'Meeting'), ('whatsapp', 'WhatsApp'), ('visit', 'Visit'), ('negotiation', 'Negotiation'), ('follow_up', 'Follow Up'), ('won', 'Won'), ('lost', 'Lost'), ('closed', 'Closed'), ('converted', 'Converted'), ('transfer', 'Transfer'), ('add_car', 'Add Car'), ('sale_car', 'Sale Car'), ('reserve_car', 'Reserve Car'), ('transfer_car', 'Transfer Car'), ('remove_car', 'Remove Car'), ('create_quotation', 'Create Quotation'), ('cancel_quotation', 'Cancel Quotation'), ('create_order', 'Create Order'), ('cancel_order', 'Cancel Order'), ('create_invoice', 'Create Invoice'), ('cancel_invoice', 'Cancel Invoice')], max_length=50, verbose_name='Activity Type')),
('notes', models.TextField(blank=True, null=True, verbose_name='Notes')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='contenttypes.contenttype')),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='activities_created_by', to=settings.AUTH_USER_MODEL)),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='inventory.dealer')),
],
options={
'verbose_name': 'Activity',
'verbose_name_plural': 'Activities',
},
),
migrations.CreateModel(
name='DealerSettings',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('additional_info', models.JSONField(blank=True, default=dict, null=True)),
('bill_cash_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_cash', to='django_ledger.accountmodel')),
('bill_prepaid_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_prepaid', to='django_ledger.accountmodel')),
('bill_unearned_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bill_unearned', to='django_ledger.accountmodel')),
('dealer', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='settings', to='inventory.dealer')),
('invoice_cash_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoice_cash', to='django_ledger.accountmodel')),
('invoice_prepaid_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoice_prepaid', to='django_ledger.accountmodel')),
('invoice_unearned_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoice_unearned', to='django_ledger.accountmodel')),
],
),
migrations.CreateModel(
name='Email',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('object_id', models.UUIDField()),
('from_email', models.TextField(blank=True, null=True, verbose_name='From Email')),
('to_email', models.TextField(blank=True, null=True, verbose_name='To Email')),
('subject', models.TextField(blank=True, null=True, verbose_name='Subject')),
('message', models.TextField(blank=True, null=True, verbose_name='Message')),
('status', models.CharField(choices=[('SENT', 'Sent'), ('FAILED', 'Failed'), ('DELIVERED', 'Delivered'), ('OPEN', 'Open'), ('DRAFT', 'Draft')], default='OPEN', max_length=20, verbose_name='Status')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='emails_created', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Email',
'verbose_name_plural': 'Emails',
},
),
migrations.CreateModel(
name='Lead',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=50, verbose_name='First Name')),
('last_name', models.CharField(max_length=50, verbose_name='Last Name')),
('email', models.EmailField(max_length=254, verbose_name='Email')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')),
('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')),
('lead_type', models.CharField(choices=[('customer', 'Customer'), ('organization', 'Organization')], default='customer', max_length=50, verbose_name='Lead Type')),
('source', models.CharField(choices=[('referrals', 'Referrals'), ('whatsapp', 'WhatsApp'), ('showroom', 'Showroom'), ('tiktok', 'TikTok'), ('instagram', 'Instagram'), ('x', 'X'), ('facebook', 'Facebook'), ('motory', 'Motory'), ('influencers', 'Influencers'), ('youtube', 'Youtube'), ('campaign', 'Campaign')], max_length=50, verbose_name='Source')),
('channel', models.CharField(choices=[('walk_in', 'Walk In'), ('toll_free', 'Toll Free'), ('website', 'Website'), ('email', 'Email'), ('form', 'Form')], max_length=50, verbose_name='Channel')),
('status', models.CharField(choices=[('new', 'New'), ('contacted', 'Contacted'), ('qualified', 'Qualified'), ('unqualified', 'Unqualified'), ('converted', 'Converted')], db_index=True, default='new', max_length=50, verbose_name='Status')),
('next_action', models.CharField(blank=True, max_length=255, null=True, verbose_name='Next Action')),
('next_action_date', models.DateTimeField(blank=True, null=True, verbose_name='Next Action Date')),
('is_converted', models.BooleanField(default=False)),
('converted_at', models.DateTimeField(blank=True, null=True)),
('created', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('slug', models.SlugField(blank=True, null=True, unique=True)),
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer_leads', to='inventory.customer')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='leads', to='inventory.dealer')),
('id_car_make', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make')),
('id_car_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model')),
],
options={
'verbose_name': 'Lead',
'verbose_name_plural': 'Leads',
},
),
migrations.CreateModel(
name='Notes',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('object_id', models.UUIDField()),
('note', models.TextField(verbose_name='Note')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='notes_created', to=settings.AUTH_USER_MODEL)),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='inventory.dealer')),
],
options={
'verbose_name': 'Note',
'verbose_name_plural': 'Notes',
},
),
migrations.CreateModel(
name='Notification',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('message', models.CharField(max_length=255, verbose_name='Message')),
('is_read', models.BooleanField(default=False, verbose_name='Is Read')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Notification',
'verbose_name_plural': 'Notifications',
'ordering': ['-created'],
},
),
migrations.CreateModel(
name='Organization',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('crn', models.CharField(max_length=15, verbose_name='Commercial Registration Number')),
('vrn', models.CharField(max_length=15, verbose_name='VAT Registration Number')),
('email', models.EmailField(max_length=254, verbose_name='Email')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')),
('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')),
('logo', models.ImageField(blank=True, null=True, upload_to='logos', verbose_name='Logo')),
('active', models.BooleanField(default=True, verbose_name='Active')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('slug', models.SlugField(blank=True, editable=False, max_length=255, null=True, unique=True)),
('customer_model', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.customermodel')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='organizations', to='inventory.dealer')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='organization_profile', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Organization',
'verbose_name_plural': 'Organizations',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='Opportunity',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('crn', models.CharField(blank=True, max_length=20, null=True, verbose_name='CRN')),
('vrn', models.CharField(blank=True, max_length=20, null=True, verbose_name='VRN')),
('salary', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Salary')),
('priority', models.CharField(choices=[('high', 'High'), ('medium', 'Medium'), ('low', 'Low')], default='medium', max_length=20, verbose_name='Priority')),
('stage', models.CharField(choices=[('qualification', 'Qualification'), ('test_drive', 'Test Drive'), ('quotation', 'Quotation'), ('negotiation', 'Negotiation'), ('financing', 'Financing'), ('closed_won', 'Closed Won'), ('closed_lost', 'Closed Lost'), ('on_hold', 'On Hold')], max_length=20, verbose_name='Stage')),
('probability', models.PositiveIntegerField(validators=[inventory.models.validate_probability])),
('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Amount')),
('expected_revenue', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Expected Revenue')),
('vehicle_of_interest_make', models.CharField(blank=True, max_length=50, null=True)),
('vehicle_of_interest_model', models.CharField(blank=True, max_length=100, null=True)),
('expected_close_date', models.DateField(blank=True, null=True)),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('slug', models.SlugField(blank=True, help_text='Unique slug for the opportunity.', null=True, unique=True, verbose_name='Slug')),
('loss_reason', models.CharField(blank=True, max_length=255, null=True)),
('car', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.car', verbose_name='Car')),
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='inventory.customer')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opportunities', to='inventory.dealer')),
('estimate', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='opportunity', to='django_ledger.estimatemodel')),
('lead', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opportunity', to='inventory.lead')),
('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.organization', verbose_name='Organization')),
],
options={
'verbose_name': 'Opportunity',
'verbose_name_plural': 'Opportunities',
},
),
migrations.AddField(
model_name='lead',
name='organization',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='organization_leads', to='inventory.organization'),
),
migrations.CreateModel(
name='PoItemsUploaded',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('status', models.CharField(blank=True, max_length=100, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('dealer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer')),
('item', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='po_items', to='django_ledger.itemtransactionmodel')),
('po', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='items', to='django_ledger.purchaseordermodel')),
],
),
migrations.CreateModel(
name='Refund',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='amount')),
('reason', models.TextField(blank=True, verbose_name='reason')),
('refund_date', models.DateField(auto_now_add=True, verbose_name='refund date')),
('payment', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='refund', to='inventory.payment')),
],
options={
'verbose_name': 'refund',
'verbose_name_plural': 'refunds',
},
),
migrations.CreateModel(
name='Representative',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('id_number', models.CharField(max_length=10, unique=True, verbose_name='ID Number')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')),
('email', models.EmailField(max_length=255, verbose_name='Email Address')),
('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='representatives', to='inventory.dealer')),
('organization', models.ManyToManyField(related_name='representatives', to='inventory.organization')),
],
options={
'verbose_name': 'Representative',
'verbose_name_plural': 'Representatives',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.CreateModel(
name='SaleOrder',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('comments', models.TextField(blank=True, null=True)),
('formatted_order_id', models.CharField(editable=False, max_length=10, unique=True)),
('status', models.CharField(choices=[('PENDING_APPROVAL', 'Pending Approval'), ('APPROVED', 'Approved'), ('IN_FINANCING', 'In Financing'), ('PARTIALLY_PAID', 'Partially Paid'), ('FULLY_PAID', 'Fully Paid'), ('PENDING_DELIVERY', 'Pending Delivery'), ('DELIVERED', 'Delivered'), ('CANCELLED', 'Cancelled')], default='PENDING_APPROVAL', help_text='Current status of the sales order.', max_length=20)),
('order_date', models.DateTimeField(default=django.utils.timezone.now, help_text='The date and time the sales order was created.')),
('expected_delivery_date', models.DateField(blank=True, help_text='The planned date for vehicle delivery.', null=True)),
('actual_delivery_date', models.DateTimeField(blank=True, help_text='The actual date and time the vehicle was delivered.', null=True)),
('cancelled_date', models.DateTimeField(blank=True, help_text='The date and time the order was cancelled, if applicable.', null=True)),
('cancellation_reason', models.TextField(blank=True, help_text='Reason for cancellation, if applicable.', null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('created_by', models.ForeignKey(blank=True, help_text='The user who created this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_sales_orders', to=settings.AUTH_USER_MODEL)),
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.customer', verbose_name='Customer')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.dealer')),
('estimate', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.estimatemodel', verbose_name='Estimate')),
('invoice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.invoicemodel', verbose_name='Invoice')),
('last_modified_by', models.ForeignKey(blank=True, help_text='The user who last modified this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_sales_orders', to=settings.AUTH_USER_MODEL)),
('opportunity', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.opportunity', verbose_name='Opportunity')),
],
options={
'verbose_name': 'Sales Order',
'verbose_name_plural': 'Sales Orders',
'ordering': ['-order_date'],
},
),
migrations.CreateModel(
name='Schedule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('purpose', models.CharField(choices=[('product_demo', 'Product Demo'), ('follow_up_call', 'Follow-Up Call'), ('contract_discussion', 'Contract Discussion'), ('sales_meeting', 'Sales Meeting'), ('support_call', 'Support Call'), ('other', 'Other')], max_length=200)),
('scheduled_at', models.DateTimeField()),
('scheduled_type', models.CharField(choices=[('call', 'Call'), ('meeting', 'Meeting'), ('email', 'Email')], default='Call', max_length=200)),
('duration', models.DurationField(default=datetime.timedelta(seconds=300))),
('notes', models.TextField(blank=True, null=True)),
('status', models.CharField(choices=[('scheduled', 'Scheduled'), ('completed', 'Completed'), ('canceled', 'Canceled')], default='Scheduled', max_length=200)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to='django_ledger.customermodel')),
('lead', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schedules', to='inventory.lead')),
('scheduled_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ['-scheduled_at'],
},
),
migrations.CreateModel(
name='Staff',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Name')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')),
('staff_type', models.CharField(choices=[('inventory', 'Inventory'), ('accountant', 'Accountant'), ('sales', 'Sales')], max_length=255, verbose_name='Staff Type')),
('active', models.BooleanField(default=True, verbose_name='Active')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('slug', models.SlugField(blank=True, editable=False, max_length=255, null=True, unique=True)),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='inventory.dealer')),
('staff_member', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='staff', to='appointment.staffmember')),
],
options={
'verbose_name': 'Staff',
'verbose_name_plural': 'Staff',
'permissions': [],
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
managers=[
('objects', inventory.models.StaffUserManager()),
],
),
migrations.AddField(
model_name='opportunity',
name='staff',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='owner', to='inventory.staff', verbose_name='Owner'),
),
migrations.CreateModel(
name='LeadStatusHistory',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('old_status', models.CharField(choices=[('new', 'New'), ('contacted', 'Contacted'), ('qualified', 'Qualified'), ('unqualified', 'Unqualified'), ('converted', 'Converted')], max_length=50, verbose_name='Old Status')),
('new_status', models.CharField(choices=[('new', 'New'), ('contacted', 'Contacted'), ('qualified', 'Qualified'), ('unqualified', 'Unqualified'), ('converted', 'Converted')], max_length=50, verbose_name='New Status')),
('changed_at', models.DateTimeField(auto_now_add=True, verbose_name='Changed At')),
('lead', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='status_history', to='inventory.lead')),
('changed_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='status_changes', to='inventory.staff')),
],
options={
'verbose_name': 'Lead Status History',
'verbose_name_plural': 'Lead Status Histories',
},
),
migrations.AddField(
model_name='lead',
name='staff',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned', to='inventory.staff', verbose_name='Assigned'),
),
migrations.CreateModel(
name='Tasks',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('object_id', models.UUIDField()),
('title', models.CharField(max_length=255, verbose_name='Title')),
('description', models.TextField(blank=True, null=True, verbose_name='Description')),
('due_date', models.DateField(verbose_name='Due Date')),
('completed', models.BooleanField(default=False, verbose_name='Completed')),
('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')),
('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')),
('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='tasks_assigned', to=settings.AUTH_USER_MODEL)),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='tasks_created', to=settings.AUTH_USER_MODEL)),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='inventory.dealer')),
],
options={
'verbose_name': 'Task',
'verbose_name_plural': 'Tasks',
},
),
migrations.CreateModel(
name='UserActivityLog',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('action', models.TextField()),
('timestamp', models.DateTimeField(auto_now_add=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'User Activity Log',
'verbose_name_plural': 'User Activity Logs',
'ordering': ['-timestamp'],
},
),
migrations.CreateModel(
name='Vendor',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('crn', models.CharField(max_length=10, unique=True, verbose_name='Commercial Registration Number')),
('vrn', models.CharField(max_length=15, unique=True, verbose_name='VAT Registration Number')),
('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')),
('name', models.CharField(max_length=255, verbose_name='English Name')),
('contact_person', models.CharField(max_length=100, verbose_name='Contact Person')),
('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')),
('email', models.EmailField(max_length=255, verbose_name='Email Address')),
('address', models.CharField(max_length=200, verbose_name='Address')),
('logo', models.ImageField(blank=True, null=True, upload_to='logos/vendors', verbose_name='Logo')),
('active', models.BooleanField(default=True, verbose_name='Active')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True, verbose_name='Slug')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vendors', to='inventory.dealer')),
('vendor_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='django_ledger.vendormodel', verbose_name='Vendor Model')),
],
options={
'verbose_name': 'Vendor',
'verbose_name_plural': 'Vendors',
},
bases=(models.Model, inventory.mixins.LocalizedNameMixin),
),
migrations.AddField(
model_name='car',
name='vendor',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.vendor', verbose_name='Vendor'),
),
migrations.CreateModel(
name='CarReservation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('reserved_at', models.DateTimeField(auto_now_add=True, verbose_name='Reserved At')),
('reserved_until', models.DateTimeField(verbose_name='Reserved Until')),
('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='inventory.car', verbose_name='Car')),
('reserved_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to=settings.AUTH_USER_MODEL, verbose_name='Reserved By')),
],
options={
'verbose_name': 'Car Reservation',
'verbose_name_plural': 'Car Reservations',
'ordering': ['-reserved_at'],
'unique_together': {('car', 'reserved_until')},
},
),
migrations.CreateModel(
name='DealersMake',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('added_at', models.DateTimeField(auto_now_add=True)),
('car_make', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='car_dealers', to='inventory.carmake')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dealer_makes', to='inventory.dealer')),
],
options={
'unique_together': {('dealer', 'car_make')},
},
),
migrations.CreateModel(
name='CarColors',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.car')),
('exterior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.exteriorcolors')),
('interior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.interiorcolors')),
],
options={
'verbose_name': 'Color',
'verbose_name_plural': 'Colors',
'unique_together': {('car', 'exterior', 'interior')},
},
),
migrations.CreateModel(
name='PaymentHistory',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user_data', models.JSONField(blank=True, null=True)),
('amount', models.DecimalField(decimal_places=2, max_digits=10, validators=[django.core.validators.MinValueValidator(0.01)])),
('currency', models.CharField(default='SAR', max_length=3)),
('payment_date', models.DateTimeField(default=django.utils.timezone.now)),
('status', models.CharField(choices=[('initiated', 'initiated'), ('pending', 'Pending'), ('completed', 'Completed'), ('paid', 'Paid'), ('failed', 'Failed'), ('refunded', 'Refunded'), ('cancelled', 'Cancelled')], default='pending', max_length=10)),
('payment_method', models.CharField(choices=[('credit_card', 'Credit Card'), ('debit_card', 'Debit Card'), ('paypal', 'PayPal'), ('bank_transfer', 'Bank Transfer'), ('crypto', 'Cryptocurrency'), ('other', 'Other')], max_length=20)),
('transaction_id', models.CharField(blank=True, max_length=100, null=True, unique=True)),
('invoice_number', models.CharField(blank=True, max_length=50, null=True)),
('order_reference', models.CharField(blank=True, max_length=100, null=True)),
('gateway_response', models.JSONField(blank=True, null=True)),
('gateway_name', models.CharField(blank=True, max_length=50, null=True)),
('description', models.TextField(blank=True, null=True)),
('is_recurring', models.BooleanField(default=False)),
('billing_email', models.EmailField(blank=True, max_length=254, null=True)),
('billing_address', models.TextField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Payment History',
'verbose_name_plural': 'Payment Histories',
'ordering': ['-payment_date'],
'indexes': [models.Index(fields=['transaction_id'], name='inventory_p_transac_9469f3_idx'), models.Index(fields=['user'], name='inventory_p_user_id_c31626_idx'), models.Index(fields=['status'], name='inventory_p_status_abcb77_idx'), models.Index(fields=['payment_date'], name='inventory_p_payment_b3068c_idx')],
},
),
]

View File

@ -1187,6 +1187,9 @@ class Staff(models.Model, LocalizedNameMixin):
return self.staff_member.user return self.staff_member.user
@property @property
def groups(self):
return [x.customgroup for x in self.user.groups.all()]
@property
def groups(self): def groups(self):
return [x.customgroup for x in self.user.groups.all()] return [x.customgroup for x in self.user.groups.all()]

View File

@ -661,4 +661,7 @@ def count_checked(permissions, group_permission_ids):
# @register.filter # @register.filter
# def count_checked(permissions, group_permission_ids): # def count_checked(permissions, group_permission_ids):
# """Count how many permissions are checked from the allowed list""" # """Count how many permissions are checked from the allowed list"""
# return sum(1 for perm in permissions if perm.id in group_permission_ids) # return sum(1 for perm in permissions if perm.id in group_permission_ids)

View File

@ -1165,7 +1165,7 @@ def inventory_stats_view(request, dealer_slug):
"inventory/inventory_stats.html" template. "inventory/inventory_stats.html" template.
:rtype: HttpResponse :rtype: HttpResponse
""" """
# Base queryset for cars belonging to the dealer # Base queryset for cars belonging to the dealer
cars = models.Car.objects.filter(dealer=request.dealer) cars = models.Car.objects.filter(dealer=request.dealer)
@ -2306,6 +2306,7 @@ class CustomerCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView
model = models.Customer model = models.Customer
form_class = forms.CustomerForm form_class = forms.CustomerForm
permission_required = ["inventory.add_customer"] permission_required = ["inventory.add_customer"]
permission_required = ["inventory.add_customer"]
template_name = "customers/customer_form.html" template_name = "customers/customer_form.html"
success_url = reverse_lazy("customer_list") success_url = reverse_lazy("customer_list")
success_message = "Customer created successfully" success_message = "Customer created successfully"
@ -2373,6 +2374,7 @@ class CustomerUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView
model = models.Customer model = models.Customer
form_class = forms.CustomerForm form_class = forms.CustomerForm
permission_required = ["inventory.change_customer"] permission_required = ["inventory.change_customer"]
permission_required = ["inventory.change_customer"]
template_name = "customers/customer_form.html" template_name = "customers/customer_form.html"
success_url = reverse_lazy("customer_list") success_url = reverse_lazy("customer_list")
success_message = "Customer updated successfully" success_message = "Customer updated successfully"
@ -2384,6 +2386,7 @@ class CustomerUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView
def get_success_url(self): def get_success_url(self):
return reverse_lazy("customer_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]}) return reverse_lazy("customer_list", kwargs={"dealer_slug": self.kwargs["dealer_slug"]})
@permission_required('inventory.delete_customer',raise_exception=True)
@login_required @login_required
def delete_customer(request, dealer_slug ,slug): def delete_customer(request, dealer_slug ,slug):
""" """
@ -2450,6 +2453,7 @@ class VendorListView(LoginRequiredMixin,PermissionRequiredMixin, ListView):
@login_required @login_required
@permission_required('django_ledger.view_vendormodel',raise_exception=True)
def vendorDetailView(request, dealer_slug,slug): def vendorDetailView(request, dealer_slug,slug):
""" """
Fetches and renders the detail view for a specific vendor. Fetches and renders the detail view for a specific vendor.
@ -4897,7 +4901,7 @@ class DraftInvoiceModelUpdateFormView(
form_class = DraftInvoiceModelUpdateForm form_class = DraftInvoiceModelUpdateForm
template_name = "sales/invoices/draft_invoice_update.html" template_name = "sales/invoices/draft_invoice_update.html"
success_url = reverse_lazy("invoice_list") success_url = reverse_lazy("invoice_list")
permission_required = ["django_ledger.view_invoicemodel"] permission_required = ["django_ledger.change_invoicemodel"]
def get_form_kwargs(self): def get_form_kwargs(self):
kwargs = super().get_form_kwargs() kwargs = super().get_form_kwargs()
@ -4939,7 +4943,7 @@ class ApprovedInvoiceModelUpdateFormView(
form_class = ApprovedInvoiceModelUpdateForm form_class = ApprovedInvoiceModelUpdateForm
template_name = "sales/invoices/approved_invoice_update.html" template_name = "sales/invoices/approved_invoice_update.html"
success_url = reverse_lazy("invoice_list") success_url = reverse_lazy("invoice_list")
permission_required = ["django_ledger.view_invoicemodel"] permission_required = ["django_ledger.change_invoicemodel"]
def get_form_kwargs(self): def get_form_kwargs(self):
kwargs = super().get_form_kwargs() kwargs = super().get_form_kwargs()
@ -4987,7 +4991,7 @@ class PaidInvoiceModelUpdateFormView(
form_class = PaidInvoiceModelUpdateForm form_class = PaidInvoiceModelUpdateForm
template_name = "sales/invoices/paid_invoice_update.html" template_name = "sales/invoices/paid_invoice_update.html"
success_url = reverse_lazy("invoice_list") success_url = reverse_lazy("invoice_list")
permission_required = ["django_ledger.view_invoicemodel"] permission_required = ["django_ledger.change_invoicemodel"]
def get_form_kwargs(self): def get_form_kwargs(self):
kwargs = super().get_form_kwargs() kwargs = super().get_form_kwargs()
@ -5169,7 +5173,7 @@ class InvoicePreviewView(LoginRequiredMixin, PermissionRequiredMixin, DetailView
@login_required @login_required
@permission_required("django_ledger.add_journalentrymodel", raise_exception=True) @permission_required("inventory.add_payment", raise_exception=True)
def PaymentCreateView(request, dealer_slug, pk): def PaymentCreateView(request, dealer_slug, pk):
""" """
Handles the creation of a payment entry associated with an invoice or bill. Validates Handles the creation of a payment entry associated with an invoice or bill. Validates
@ -5244,7 +5248,7 @@ def PaymentCreateView(request, dealer_slug, pk):
@login_required @login_required
@permission_required("django_ledger.view_journalentrymodel", raise_exception=True) @permission_required("inventory.view_payment", raise_exception=True)
def PaymentListView(request, dealer_slug): def PaymentListView(request, dealer_slug):
""" """
Handles the view for listing payment information associated with the journals of a specific Handles the view for listing payment information associated with the journals of a specific
@ -5274,7 +5278,7 @@ def PaymentListView(request, dealer_slug):
@login_required @login_required
@permission_required("django_ledger.view_journalentrymodel", raise_exception=True) @permission_required("inventory.view_payment", raise_exception=True)
def PaymentDetailView(request, dealer_slug, pk): def PaymentDetailView(request, dealer_slug, pk):
""" """
This function handles the detail view for a payment by fetching a journal entry This function handles the detail view for a payment by fetching a journal entry
@ -5304,7 +5308,7 @@ def PaymentDetailView(request, dealer_slug, pk):
@login_required @login_required
@permission_required("django_ledger.change_journalentrymodel", raise_exception=True) @permission_required("inventory.change_payment", raise_exception=True)
def payment_mark_as_paid(request, dealer_slug, pk): def payment_mark_as_paid(request, dealer_slug, pk):
""" """
Marks an invoice as paid if it meets the conditions of being fully paid and eligible Marks an invoice as paid if it meets the conditions of being fully paid and eligible
@ -5596,8 +5600,10 @@ def lead_create(request,dealer_slug):
if hasattr(request.user.staffmember, "staff"): if hasattr(request.user.staffmember, "staff"):
form.initial["staff"] = request.user.staffmember.staff staff = request.user.staffmember.staff
form.fields["staff"].widget = HiddenInput() form.initial["staff"] = staff
form.fields["staff"].widget.attrs.update({"readonly":"true","required":"true"})
form.fields["staff"].queryset = models.Staff.objects.filter(dealer=dealer,pk=staff.pk)
form.fields["id_car_make"].queryset = qs form.fields["id_car_make"].queryset = qs
form.fields["id_car_make"].choices = [ form.fields["id_car_make"].choices = [
(obj.id_car_make, obj.get_local_name()) for obj in qs (obj.id_car_make, obj.get_local_name()) for obj in qs
@ -6175,13 +6181,6 @@ class OpportunityCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateVie
initial["stage"] = models.Stage.QUALIFICATION initial["stage"] = models.Stage.QUALIFICATION
return initial return initial
def get_form(self, form_class=None):
form = super().get_form(form_class)
dealer = get_object_or_404(models.Dealer,slug=self.kwargs.get("dealer_slug"))
form.fields['car'].queryset = models.Car.objects.filter(dealer=dealer)
form.fields['lead'].queryset = models.Lead.objects.filter(dealer=dealer)
return form
def form_valid(self, form): def form_valid(self, form):
dealer = get_object_or_404(models.Dealer,slug=self.kwargs.get("dealer_slug")) dealer = get_object_or_404(models.Dealer,slug=self.kwargs.get("dealer_slug"))
instance = form.save(commit=False) instance = form.save(commit=False)
@ -6317,6 +6316,7 @@ class OpportunityListView(LoginRequiredMixin,PermissionRequiredMixin, ListView):
context_object_name = "opportunities" context_object_name = "opportunities"
paginate_by = 30 paginate_by = 30
permission_required = ["inventory.view_opportunity"] permission_required = ["inventory.view_opportunity"]
permission_required = ["inventory.view_opportunity"]
def get_queryset(self): def get_queryset(self):
dealer = get_user_type(self.request) dealer = get_user_type(self.request)
@ -6529,7 +6529,7 @@ class ItemServiceCreateView(
template_name = "items/service/service_create.html" template_name = "items/service/service_create.html"
success_message = _("Service created successfully") success_message = _("Service created successfully")
context_object_name = "service" context_object_name = "service"
permission_required = ["django_ledger.add_itemmodel"] permission_required = ["inventory.add_additionalservices"]
def form_valid(self, form): def form_valid(self, form):
vat = models.VatRate.objects.get(is_active=True) vat = models.VatRate.objects.get(is_active=True)
@ -6575,7 +6575,8 @@ class ItemServiceUpdateView(
template_name = "items/service/service_create.html" template_name = "items/service/service_create.html"
success_message = _("Service updated successfully") success_message = _("Service updated successfully")
context_object_name = "service" context_object_name = "service"
permission_required = ["django_ledger.change_itemmodel"] permission_required = ["inventory.change_additionalservices"]
def form_valid(self, form): def form_valid(self, form):
vat = models.VatRate.objects.get(is_active=True) vat = models.VatRate.objects.get(is_active=True)
@ -6613,7 +6614,8 @@ class ItemServiceListView(LoginRequiredMixin, PermissionRequiredMixin, ListView)
template_name = "items/service/service_list.html" template_name = "items/service/service_list.html"
context_object_name = "services" context_object_name = "services"
paginate_by = 30 paginate_by = 30
permission_required = ["django_ledger.view_itemmodel"] permission_required = ["inventory.view_additionalservices"]
def get_queryset(self): def get_queryset(self):
dealer = get_user_type(self.request) dealer = get_user_type(self.request)
@ -6778,6 +6780,7 @@ class BillListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
class BillModelCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateView): class BillModelCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateView):
template_name = "bill/bill_create.html" template_name = "bill/bill_create.html"
PAGE_TITLE = _("Create Bill") PAGE_TITLE = _("Create Bill")
permission_required = ["django_ledger.add_billmodel"]
extra_context = { extra_context = {
"page_title": PAGE_TITLE, "page_title": PAGE_TITLE,
"header_title": PAGE_TITLE, "header_title": PAGE_TITLE,
@ -6961,6 +6964,7 @@ class BillModelCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateView)
class BillModelDetailViewView(BillModelDetailView): class BillModelDetailViewView(BillModelDetailView):
template_name = "bill/bill_detail.html" template_name = "bill/bill_detail.html"
permission_required = ["django_ledger.view_billmodel"]
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(BillModelDetailViewView, self).get_context_data(**kwargs) context = super(BillModelDetailViewView, self).get_context_data(**kwargs)
@ -6970,6 +6974,8 @@ class BillModelDetailViewView(BillModelDetailView):
class BillModelUpdateViewView(BillModelUpdateView): class BillModelUpdateViewView(BillModelUpdateView):
template_name = "bill/bill_update.html" template_name = "bill/bill_update.html"
permission_required = ["django_ledger.change_billmodel"]
def post(self, request, dealer_slug, entity_slug, bill_pk, *args, **kwargs): def post(self, request, dealer_slug, entity_slug, bill_pk, *args, **kwargs):
if self.action_update_items: if self.action_update_items:
@ -7240,7 +7246,7 @@ class OrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
# email # email
@login_required @login_required
@permission_required("django_ledger.view_estimatemodel", raise_exception=True) @permission_required("django_ledger.change_estimatemodel", raise_exception=True)
def send_email_view(request, dealer_slug, pk): def send_email_view(request, dealer_slug, pk):
""" """
View function to send an email for an estimate. This function allows authenticated and View function to send an email for an estimate. This function allows authenticated and
@ -8327,6 +8333,7 @@ class LedgerModelListView(LoginRequiredMixin,PermissionRequiredMixin, ListView,
model = LedgerModel model = LedgerModel
context_object_name = "ledgers" context_object_name = "ledgers"
template_name = "ledger/ledger/ledger_list.html" template_name = "ledger/ledger/ledger_list.html"
permission_required = ["django_ledger.view_ledgermodel"]
date_field = "created" date_field = "created"
ordering = "-created" ordering = "-created"
show_all = False show_all = False
@ -8397,6 +8404,7 @@ class LedgerModelCreateView(LedgerModelCreateViewBase):
""" """
template_name = "ledger/ledger/ledger_form.html" template_name = "ledger/ledger/ledger_form.html"
permission_required = ["django_ledger.add_ledgermodel"]
def get_form(self, form_class=None): def get_form(self, form_class=None):
dealer = get_user_type(self.request) dealer = get_user_type(self.request)
@ -8452,6 +8460,7 @@ class LedgerModelDeleteView(LedgerModelDeleteViewBase, SuccessMessageMixin):
template_name = "ledger/ledger/ledger_delete.html" template_name = "ledger/ledger/ledger_delete.html"
success_message = "Ledger deleted" success_message = "Ledger deleted"
permission_required = ["django_ledger.delete_ledgermodel"]
def get_success_url(self): def get_success_url(self):
return reverse("ledger_list", args=[self.kwargs["dealer_slug"]]) return reverse("ledger_list", args=[self.kwargs["dealer_slug"]])
@ -8500,6 +8509,7 @@ class JournalEntryListView(LoginRequiredMixin,PermissionRequiredMixin, ListView)
model = JournalEntryModel model = JournalEntryModel
context_object_name = "journal_entries" context_object_name = "journal_entries"
template_name = "ledger/journal_entry/journal_entry_list.html" template_name = "ledger/journal_entry/journal_entry_list.html"
permission_required = ["django_ledger.view_journalentrymodel"]
ordering = ["-timestamp"] ordering = ["-timestamp"]
permission_required = "ledger.view_ledger" permission_required = "ledger.view_ledger"
@ -8538,6 +8548,7 @@ class JournalEntryCreateView(LoginRequiredMixin, PermissionRequiredMixin,Success
model = JournalEntryModel model = JournalEntryModel
template_name = "ledger/journal_entry/journal_entry_form.html" template_name = "ledger/journal_entry/journal_entry_form.html"
permission_required = ["django_ledger.add_journalentrymodel"]
form_class = forms.JournalEntryModelCreateForm form_class = forms.JournalEntryModelCreateForm
ledger_model = None ledger_model = None
success_message = _("Journal Entry created") success_message = _("Journal Entry created")
@ -9253,6 +9264,7 @@ def permenant_delete_account(request,dealer_slug, content_type, slug):
def PurchaseOrderCreateView(request, dealer_slug,entity_slug): def PurchaseOrderCreateView(request, dealer_slug,entity_slug):
dealer = get_object_or_404(models.Dealer, slug=dealer_slug) dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
entity = dealer.entity entity = dealer.entity
if request.method == "POST": if request.method == "POST":
try: try:
po = entity.create_purchase_order(po_title=request.POST.get("po_title")) po = entity.create_purchase_order(po_title=request.POST.get("po_title"))

View File

@ -108,3 +108,4 @@ html[dir="rtl"] .form-icon-container .form-control {
padding-right: 35px; padding-right: 35px;
padding-left: 10px; padding-left: 10px;
} }

View File

@ -0,0 +1,125 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2655 2513 c-225 -28 -366 -68 -545 -158 -69 -34 -131 -60 -138 -58
-7 3 -30 -11 -51 -30 -86 -77 -166 -107 -346 -127 -290 -31 -427 -92 -557
-247 -98 -118 -99 -118 -92 -194 5 -50 3 -73 -10 -97 -34 -65 -10 -95 92 -113
84 -16 91 -24 30 -38 -67 -15 -83 -24 -74 -46 6 -17 8 -17 26 0 11 10 41 23
67 30 48 12 84 8 208 -27 l40 -11 -70 -13 c-38 -7 -94 -16 -123 -20 -29 -4
-55 -10 -57 -14 -3 -5 26 -17 63 -29 303 -92 725 -112 1187 -56 148 18 204 34
269 78 44 30 88 44 321 100 380 92 698 156 838 167 173 14 257 41 257 80 0 11
-6 20 -13 20 -11 0 -10 10 3 51 14 40 25 55 48 64 69 29 88 184 37 310 -70
178 -83 191 -212 206 -61 7 -111 21 -163 44 -140 62 -316 106 -500 125 -89 9
-469 11 -535 3z m585 -27 c185 -25 335 -68 456 -129 l47 -24 -38 -7 c-22 -4
-51 -14 -65 -21 -14 -7 -117 -38 -230 -70 -502 -140 -543 -152 -537 -168 2 -7
30 -23 63 -36 l59 -23 105 22 c58 12 138 30 178 41 40 11 81 19 90 17 9 -2
-28 -14 -83 -27 -55 -12 -181 -43 -280 -68 -99 -25 -191 -46 -205 -47 -14 -1
-27 -3 -30 -6 -3 -3 -33 -17 -68 -32 l-63 -27 -47 49 c-87 90 -157 88 -288 -6
l-77 -55 35 47 c71 96 193 143 286 111 50 -18 53 -14 10 13 -22 13 -51 20 -84
20 -100 0 -180 -45 -306 -171 -72 -73 -82 -79 -160 -104 -86 -27 -286 -65
-343 -65 -19 0 -36 -4 -39 -9 -10 -16 243 13 383 45 35 8 66 13 68 10 9 -8
-65 -45 -132 -66 -93 -29 -114 -40 -121 -62 -4 -14 -9 -16 -24 -8 -11 6 -114
10 -247 10 -245 0 -394 15 -503 49 -110 34 -131 61 -89 111 19 22 22 23 30 7
13 -22 29 -22 29 1 0 9 20 38 43 63 23 26 59 67 80 93 47 57 112 91 231 121
89 22 226 42 226 32 0 -2 -47 -21 -105 -42 -98 -35 -287 -124 -310 -147 -5 -5
46 18 115 51 120 57 322 138 412 164 33 10 105 11 318 4 151 -4 325 -5 387 -2
l112 7 53 64 c29 35 86 91 127 126 70 59 72 62 50 71 -13 5 -121 10 -241 11
l-216 1 61 17 c97 28 247 40 394 32 73 -4 130 -10 127 -15 -2 -5 12 -1 32 7
85 35 168 40 324 20z m706 -184 c35 -20 -8 -22 -96 -5 -51 9 -84 20 -75 23 22
8 149 -6 171 -18z m-64 -24 c35 -10 143 -93 159 -122 4 -6 1 -32 -6 -58 -6
-26 -8 -53 -4 -60 5 -8 10 -3 14 15 9 36 21 34 29 -4 14 -71 -7 -154 -46 -187
-14 -11 -16 -5 -16 62 -1 82 -15 121 -65 173 -89 94 -184 16 -237 -194 -6 -24
-15 -43 -20 -43 -5 0 -7 -8 -3 -17 6 -17 5 -17 -14 0 -12 10 -48 29 -80 43
-32 13 -49 24 -37 24 11 0 43 -11 70 -25 27 -14 50 -25 51 -25 1 0 6 22 12 49
25 117 99 229 167 251 41 14 69 6 108 -29 l30 -26 -15 25 c-9 14 -31 33 -50
42 -50 25 -94 10 -171 -60 l-64 -58 -104 -18 c-136 -23 -598 -120 -717 -150
-63 -16 -93 -20 -94 -12 0 7 -2 7 -6 -1 -2 -7 -23 -18 -45 -23 -38 -11 -40
-13 -34 -43 4 -18 9 -71 13 -119 3 -49 7 -88 9 -88 2 0 21 6 41 14 21 8 92 29
158 46 112 29 259 75 433 135 83 28 104 30 147 11 l30 -13 -70 -20 c-38 -12
-164 -49 -280 -83 -281 -82 -476 -150 -468 -163 4 -6 0 -8 -10 -4 -9 3 -18 1
-20 -6 -12 -33 -15 7 -6 78 11 82 7 146 -14 222 -6 23 -8 45 -5 48 23 23 359
112 698 185 289 62 363 88 434 151 67 58 20 74 -128 43 -84 -17 -115 -15 -76
6 70 37 224 52 302 28z m-2027 -98 c-3 -5 -14 -10 -23 -10 -15 0 -15 2 -2 10
20 13 33 13 25 0z m393 -17 c-15 -2 -42 -2 -60 0 -18 2 -6 4 27 4 33 0 48 -2
33 -4z m1440 -148 c-6 -14 -19 -25 -30 -25 -25 0 -23 14 5 33 32 23 38 21 25
-8z m228 -7 l19 -21 -28 18 c-15 10 -38 15 -52 13 -13 -3 -22 -1 -19 3 10 17
61 9 80 -13z m-59 -50 c-2 -13 -4 -5 -4 17 -1 22 1 32 4 23 2 -10 2 -28 0 -40z
m-2707 39 c0 -2 -15 -16 -32 -33 l-33 -29 29 33 c28 30 36 37 36 29z m2801
-56 c6 -21 10 -71 8 -112 -4 -62 -9 -81 -34 -119 -44 -65 -96 -68 -134 -6 -24
39 -27 52 -7 34 8 -7 13 -17 13 -21 -1 -5 11 -18 26 -30 26 -20 30 -20 54 -7
15 9 36 30 46 48 l19 32 -43 41 -44 41 41 -31 c23 -17 45 -31 48 -31 8 0 1
164 -8 179 -5 8 -19 -3 -42 -34 -19 -25 -37 -45 -41 -45 -4 0 16 31 60 88 16
20 26 14 38 -27z m-136 -2 c9 -17 14 -33 11 -36 -3 -3 -10 7 -16 22 -6 15 -13
32 -16 36 -3 5 -3 9 0 9 3 0 13 -14 21 -31z m-11 -51 c6 -4 18 -5 26 -2 11 4
12 2 4 -6 -20 -20 -54 6 -53 38 2 27 2 27 6 2 3 -14 10 -28 17 -32z m-1549
-69 c-44 -83 -62 -157 -70 -289 -3 -57 -7 -106 -9 -108 -13 -13 -165 -22 -371
-22 -216 0 -243 2 -270 19 -35 21 -151 149 -143 157 14 13 65 -14 131 -68 l72
-60 115 5 c103 5 171 17 193 36 4 4 -8 27 -25 52 l-33 44 37 -31 c20 -18 50
-40 67 -50 39 -23 39 -29 1 -43 -16 -5 -30 -12 -30 -15 0 -8 94 5 104 15 5 4
-18 45 -54 94 -34 48 -58 90 -54 95 5 4 44 22 87 40 44 18 86 43 97 58 19 23
72 62 85 62 3 0 -2 -14 -10 -31 -21 -39 -55 -173 -55 -213 0 -52 17 -16 44 92
25 101 58 174 98 214 32 32 30 16 -7 -53z m263 47 c15 -8 36 -29 46 -48 l20
-33 -35 37 c-36 38 -70 52 -110 46 -26 -3 -26 -3 -14 -123 9 -98 -6 -74 -20
31 -10 75 -9 86 4 94 24 14 79 12 109 -4z m-288 -9 c0 -2 -10 -12 -22 -23
l-23 -19 19 23 c18 21 26 27 26 19z m1590 -64 c-11 -17 -11 -17 -6 0 3 10 6
24 7 30 0 9 2 9 5 0 3 -7 0 -20 -6 -30z m-1334 -49 c-29 -63 -46 -70 -20 -8 9
21 21 50 26 64 6 14 12 20 15 13 3 -7 -7 -38 -21 -69z m1251 44 c-3 -7 -5 -2
-5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m30 -20 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m90 -45 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2
-26 0 -35z m-1260 15 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m-228 -42 c42 -44 21 -48 -28 -6 -26 22 -37 26 -43 17 -10 -15 -11 4 -2 27 8
20 27 10 73 -38z m239 -33 c-2 -57 -2 -57 -5 -10 -2 26 -7 47 -11 47 -4 0 -25
-12 -47 -25 -22 -14 -49 -25 -60 -25 -22 1 90 70 113 70 8 0 11 -17 10 -57z
m-321 -20 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m1333 27
c-8 -5 -24 -10 -35 -10 -17 0 -17 2 -5 10 8 5 24 10 35 10 17 0 17 -2 5 -10z
m-2646 -79 c5 -7 15 -10 24 -6 10 3 4 -7 -13 -25 l-29 -30 -20 20 c-20 19 -20
21 -3 49 9 16 17 37 18 48 1 10 4 4 8 -13 4 -17 11 -36 15 -43z m1484 35 c-2
-13 -10 -21 -23 -21 -23 0 -33 34 -14 45 20 13 40 -1 37 -24z m-1337 -36 c42
-19 95 -33 154 -41 109 -14 115 -15 115 -30 0 -8 -23 -10 -82 -5 -108 10 -160
21 -231 53 -46 21 -55 28 -46 39 15 19 17 18 90 -16z m1255 22 c-3 -5 -23 -17
-46 -27 -46 -21 -48 -32 -19 -95 l21 -45 33 65 c40 76 44 70 13 -19 l-22 -63
23 -19 c13 -10 18 -19 12 -19 -22 0 -87 76 -99 116 -20 68 -17 78 31 96 51 19
60 21 53 10z m165 -39 c27 -16 49 -31 49 -35 0 -14 -14 -8 -70 27 -65 41 -49
47 21 8z m56 -5 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-127
-24 c0 -3 -4 -3 -9 1 -5 3 -11 -29 -13 -74 l-3 -79 26 13 c35 18 52 41 43 57
-5 10 -4 10 6 1 11 -10 10 -16 -6 -34 -24 -26 -67 -49 -91 -48 -10 0 -13 3 -5
6 8 3 12 32 12 94 0 87 1 89 20 79 11 -6 20 -13 20 -16z m-1440 -13 c0 -10
-25 -21 -48 -21 -12 1 -10 5 8 15 29 17 40 18 40 6z m1295 -158 c76 -43 162
-24 228 50 20 22 25 25 17 10 -15 -33 -97 -92 -137 -99 -72 -14 -162 47 -198
133 -26 62 -16 57 18 -8 24 -47 43 -69 72 -86z m266 94 c-10 -9 -11 -8 -5 6 3
10 9 15 12 12 3 -3 0 -11 -7 -18z"/>
<path d="M3015 2457 c-114 -30 -189 -89 -276 -218 l-60 -89 61 0 c65 0 80 -13
28 -24 -18 -3 -136 -15 -263 -26 -388 -34 -717 -111 -929 -217 l-68 -34 -127
16 c-69 9 -157 23 -194 31 -72 17 -101 13 -45 -5 29 -9 266 -49 308 -52 28 -1
-124 -69 -156 -69 -42 0 -193 29 -216 41 -14 7 -18 6 -18 -5 0 -20 79 -43 195
-56 50 -5 97 -10 105 -10 9 0 45 21 80 47 117 85 385 180 674 239 190 38 229
43 439 46 178 3 198 5 194 20 -7 24 58 30 80 6 20 -22 36 -13 29 17 -7 27 0
30 79 41 28 3 68 14 90 24 22 10 87 28 145 40 155 32 324 79 359 101 45 27 39
46 -22 75 -134 61 -376 91 -492 61z m-37 -244 c-10 -2 -28 -2 -40 0 -13 2 -5
4 17 4 22 1 32 -1 23 -4z"/>
<path d="M2726 2328 c-45 -46 -100 -104 -122 -130 l-41 -48 46 0 c44 0 47 2
70 45 13 24 54 83 92 130 90 112 63 114 -45 3z"/>
<path d="M2697 2037 c-41 -13 -57 -23 -55 -34 4 -23 32 -37 54 -28 17 7 15 9
-11 15 -30 8 -30 8 7 9 20 0 43 4 51 7 10 3 17 -2 20 -13 3 -10 5 -1 6 19 0
20 -2 38 -6 41 -5 2 -34 -5 -66 -16z"/>
<path d="M2600 1982 c0 -5 11 -19 25 -32 28 -26 33 -16 9 18 -15 22 -34 30
-34 14z"/>
<path d="M1936 1934 c-100 -20 -197 -54 -190 -66 4 -7 2 -8 -5 -4 -11 7 -136
-62 -128 -71 3 -2 22 1 44 7 21 6 85 13 143 17 112 6 133 13 195 68 46 40 40
42 -70 19 -42 -9 -78 -14 -81 -11 -7 7 161 39 189 35 27 -3 25 -5 -40 -60
l-67 -58 -76 0 c-41 -1 -110 -7 -153 -15 -44 -7 -84 -12 -91 -9 -7 3 -23 -7
-36 -22 l-25 -27 110 7 c156 9 232 23 291 51 55 27 159 128 149 145 -8 13 -75
11 -159 -6z m-109 -50 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m55 -29 c3 -14 1 -25 -3 -25 -5 0 -9 11 -9 25 0 14 2 25 4 25 2 0 6 -11 8 -25z"/>
<path d="M1215 1829 c-12 -19 5 -23 22 -6 16 16 16 17 1 17 -9 0 -20 -5 -23
-11z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

@ -0,0 +1,994 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M53 5046 l-53 -75 0 -296 0 -296 70 103 c102 151 96 145 118 125 25
-22 25 -22 46 18 23 42 29 43 44 10 15 -32 15 -35 0 -35 -23 -1 -53 -34 -97
-110 -25 -41 -71 -115 -103 -165 -49 -75 -58 -95 -54 -122 3 -22 1 -32 -7 -30
-7 1 -13 -10 -15 -24 -2 -19 4 -31 22 -43 33 -21 33 -50 0 -93 -20 -26 -24
-42 -22 -76 l3 -44 130 19 c161 23 230 42 254 71 49 58 298 397 266 362 -19
-22 -59 -70 -88 -107 -33 -44 -59 -68 -72 -68 -14 0 -16 -3 -8 -8 9 -6 -4 -30
-47 -88 -52 -67 -65 -79 -88 -77 -23 2 -24 1 -7 -6 19 -8 18 -10 -9 -20 -34
-14 -306 -55 -313 -47 -10 9 119 196 131 189 6 -3 8 -2 3 2 -13 15 66 117 253
330 130 148 520 555 597 624 l57 51 -100 0 -100 0 -105 -127 c-211 -256 -564
-715 -596 -776 l-15 -30 -21 22 -22 22 69 132 c138 265 217 382 408 601 57 65
109 127 117 137 13 19 6 19 -290 19 l-304 0 -52 -74z m51 -852 c19 -7 21 -30
4 -37 -7 -2 -21 0 -31 5 -15 7 -16 12 -6 24 13 16 12 16 33 8z"/>
<path d="M1680 5088 c-380 -266 -722 -564 -983 -857 l-74 -84 19 -34 c13 -21
19 -45 16 -67 -2 -19 0 -32 4 -30 21 13 3 -19 -42 -78 l-50 -65 -183 -6 c-100
-4 -225 -13 -277 -22 -52 -8 -98 -15 -102 -15 -11 0 -10 -50 1 -50 4 0 66 9
137 21 146 23 440 35 524 22 l55 -9 -33 -21 c-42 -26 -222 -85 -484 -158 -115
-32 -208 -63 -208 -68 0 -5 7 -6 16 -3 9 4 96 29 193 57 97 28 254 76 349 106
181 59 201 61 188 10 -3 -13 -24 -46 -48 -73 l-42 -49 43 40 c67 63 94 130 65
160 -16 15 -12 21 48 83 35 37 89 97 118 134 43 55 60 69 89 74 54 9 60 12 21
13 l-34 1 64 66 c215 219 568 454 1199 796 l244 133 -148 3 -147 3 -117 -62
c-64 -34 -126 -69 -138 -77 -13 -8 -23 -10 -23 -5 0 6 57 40 128 76 l127 66
-235 0 -235 0 -45 -31z m145 -177 c3 -5 2 -12 -3 -15 -5 -3 -9 1 -9 9 0 17 3
19 12 6z m-1114 -925 c-18 -25 -43 -69 -56 -98 -14 -29 -25 -47 -25 -40 0 6
-9 12 -20 12 -11 0 -20 3 -20 7 0 13 34 43 49 43 14 0 14 2 1 10 -13 9 -7 14
13 11 4 0 6 3 5 8 -4 11 72 104 79 97 3 -2 -9 -25 -26 -50z"/>
<path d="M3289 5107 c16 -21 63 -47 83 -47 7 1 -3 8 -22 16 -19 8 -43 23 -55
32 -19 16 -19 16 -6 -1z"/>
<path d="M4134 5103 c-29 -47 -345 -438 -453 -563 -123 -140 -228 -244 -266
-262 -16 -7 -39 3 -120 58 -169 113 -357 192 -552 231 -126 25 -407 25 -523
-1 -197 -42 -384 -118 -530 -213 -148 -97 -366 -286 -353 -306 3 -5 1 -7 -5
-3 -6 3 -13 2 -16 -3 -6 -9 -46 -3 -46 7 0 3 17 24 37 47 23 23 15 18 -17 -12
-61 -58 -103 -74 -54 -20 17 17 36 41 44 52 l15 20 -24 -20 c-13 -11 -44 -47
-69 -80 -25 -33 -35 -50 -21 -38 13 12 41 25 62 28 34 7 45 3 91 -29 65 -44
100 -88 83 -105 -6 -6 -36 -62 -67 -124 l-55 -112 -104 -55 c-135 -71 -200
-131 -247 -223 -19 -40 -32 -61 -28 -47 15 58 70 144 119 185 28 24 96 68 150
97 l100 53 57 115 c37 74 56 123 53 137 -3 12 -26 37 -52 54 l-47 32 -38 -44
c-98 -111 -202 -263 -278 -407 -30 -56 -103 -132 -116 -120 -8 9 25 98 71 190
46 93 134 234 193 308 l36 45 -35 -33 c-20 -18 -39 -29 -43 -25 -4 5 -6 3 -4
-2 3 -11 -210 -214 -355 -338 -111 -95 -235 -179 -249 -170 -7 3 -8 1 -4 -5 4
-7 2 -12 -3 -12 -20 0 -26 -3 -38 -19 -7 -9 -13 -12 -13 -7 0 6 -7 1 -16 -10
-8 -10 -13 -12 -9 -4 4 8 -1 6 -9 -4 -9 -11 -16 -16 -16 -11 0 5 -7 0 -15 -11
-8 -10 -15 -16 -15 -12 0 4 -12 -4 -26 -17 -31 -29 -210 -119 -272 -136 -42
-12 -43 -13 -40 -52 3 -40 3 -41 58 -52 84 -17 123 -41 198 -119 93 -98 193
-251 259 -397 30 -66 53 -123 51 -125 -2 -1 -15 -8 -28 -13 -23 -9 -22 -10 10
-8 l35 2 51 -152 c51 -154 84 -281 105 -408 19 -115 -3 -443 -35 -520 -13 -29
-26 -35 -282 -120 -148 -49 -274 -91 -280 -93 -6 -2 -14 17 -17 43 -6 44 -84
290 -111 350 -12 26 -14 -9 -15 -264 l-2 -294 67 -241 c37 -132 67 -261 67
-286 0 -31 3 -38 8 -25 4 11 8 18 8 15 1 -3 32 -82 70 -175 l69 -170 166 -3
c91 -1 166 -1 166 1 0 2 -21 39 -46 83 -43 74 -45 82 -40 134 4 44 -2 84 -35
206 -23 83 -44 157 -48 163 -5 7 -17 8 -39 2 -17 -5 -34 -6 -36 -2 -9 13 -54
206 -60 251 -4 33 0 26 12 -25 10 -38 20 -64 23 -58 2 7 57 28 121 47 65 19
122 37 127 40 9 6 0 63 -12 83 -4 6 -19 9 -34 7 -28 -4 -28 -4 2 6 24 8 32 7
41 -5 13 -17 69 -223 63 -228 -13 -11 -253 -87 -258 -82 -3 3 -15 32 -28 63
-12 31 -22 52 -22 45 -1 -15 37 -115 48 -126 4 -4 65 13 135 39 70 25 129 44
131 42 8 -9 76 -328 73 -344 -2 -12 -31 -30 -87 -54 -69 -29 -87 -41 -97 -65
-16 -39 -10 -65 39 -153 l41 -72 335 0 335 0 -30 32 c-17 18 -68 76 -113 128
-75 86 -72 83 40 -33 l124 -127 301 -3 302 -2 -171 178 c-93 98 -174 180 -178
183 -12 7 -11 2 6 -39 8 -20 15 -49 15 -64 l0 -27 -41 39 c-93 90 -252 270
-368 420 -79 102 -191 227 -309 346 -101 103 -180 189 -175 192 4 3 71 26 148
52 77 26 141 48 142 49 1 1 -11 22 -27 46 -17 25 -30 48 -30 53 0 11 48 9 55
-3 3 -5 11 -10 18 -10 6 0 -20 33 -59 72 -128 131 -171 212 -209 393 -49 236
-166 549 -375 1004 -64 138 -72 185 -38 221 74 78 417 336 513 385 43 23 46
23 25 5 -14 -12 -75 -57 -137 -100 -185 -129 -380 -296 -388 -330 -8 -38 -9
-34 102 -299 118 -281 109 -265 141 -257 15 3 55 12 89 20 l61 13 12 -78 c33
-228 118 -478 256 -749 77 -152 117 -210 168 -241 19 -12 25 -19 15 -19 -9 0
-19 -8 -22 -19 -2 -10 -22 -26 -43 -35 l-39 -17 80 -87 c152 -166 301 -304
469 -435 175 -136 382 -314 451 -388 l40 -42 -65 45 c-36 25 -130 89 -210 143
-161 108 -223 155 -385 290 -142 118 -235 188 -235 178 0 -4 17 -19 36 -33 61
-43 72 -58 69 -97 -4 -33 -15 -60 -15 -34 0 7 -5 9 -10 6 -5 -3 -10 1 -10 10
0 8 -6 18 -14 21 -8 3 -16 14 -19 24 -4 16 -12 18 -58 14 -63 -6 -122 3 -114
17 4 5 4 9 1 9 -3 0 -14 -18 -25 -40 l-19 -40 36 -44 37 -45 25 24 c14 13 41
28 60 33 19 6 28 11 20 11 -13 1 -13 2 0 11 8 5 17 6 20 1 3 -4 19 -16 35 -28
23 -16 35 -19 50 -11 19 9 19 8 3 -5 -17 -13 -17 -15 0 -31 10 -9 21 -14 24
-11 3 3 13 -5 24 -17 10 -12 13 -18 7 -14 -31 18 -7 -8 65 -71 43 -37 190
-169 327 -293 136 -124 269 -244 296 -268 l48 -43 208 104 c592 293 1081 445
1318 408 70 -10 194 -63 199 -84 2 -7 8 -34 15 -62 6 -27 38 -105 71 -172 53
-109 57 -124 42 -132 -9 -4 -75 -28 -147 -51 -139 -46 -365 -132 -455 -174
l-55 -25 79 0 c74 -1 87 2 205 53 181 77 401 158 415 153 7 -3 41 -51 76 -106
35 -56 67 -101 73 -101 14 0 6 16 -75 140 -139 216 -245 437 -220 462 9 9 17
7 32 -7 11 -10 17 -22 14 -27 -17 -27 19 -96 163 -311 85 -127 160 -238 167
-245 9 -9 65 -12 236 -10 l223 3 -204 191 c-268 252 -297 276 -469 399 -245
176 -273 202 -320 298 -22 46 -40 88 -40 93 1 5 18 -27 40 -71 43 -90 73 -123
180 -204 89 -68 128 -92 217 -135 59 -29 103 -68 342 -305 151 -149 279 -271
284 -271 6 0 -77 89 -184 198 -281 285 -341 361 -440 553 -92 180 -126 232
-74 115 19 -44 34 -81 32 -82 -2 -2 -38 66 -81 151 -42 85 -79 155 -82 155 -3
0 -2 -5 2 -12 4 -7 3 -8 -5 -4 -6 4 -9 11 -6 16 3 5 -6 33 -21 62 -24 49 -25
56 -12 87 l14 34 37 -52 c28 -39 43 -51 55 -46 44 17 164 46 175 42 7 -2 -4
-7 -23 -11 -19 -4 -65 -16 -102 -27 -74 -21 -80 -31 -56 -86 20 -45 69 -114
77 -108 5 2 49 -42 97 -100 49 -58 97 -107 106 -110 9 -3 33 1 53 10 43 18 55
19 55 5 0 -5 -17 -18 -39 -29 -62 -32 -101 -70 -101 -98 0 -54 230 -244 331
-274 35 -11 44 -9 91 15 93 49 198 118 198 131 0 21 -236 232 -247 221 -3 -3
10 -18 28 -33 91 -76 199 -176 199 -184 0 -10 -107 -82 -183 -122 -42 -22 -53
-24 -80 -14 -123 42 -340 230 -322 278 7 18 113 84 122 76 11 -12 -7 -37 -47
-62 -22 -14 -40 -32 -40 -40 0 -37 186 -195 230 -195 35 0 180 71 180 87 0 22
-19 55 -55 93 -25 27 -35 52 -48 114 -9 43 -18 81 -20 83 -2 2 -25 -6 -50 -17
l-47 -21 -45 31 c-36 25 -45 36 -44 58 2 27 2 27 6 2 3 -15 19 -34 39 -47 l34
-22 0 112 c0 171 -19 214 -127 283 -60 38 -72 42 -52 17 7 -10 1 -7 -13 6 -15
13 -25 27 -23 31 3 4 -13 20 -35 35 -45 31 -63 30 -219 -6 -46 -11 -86 -17
-89 -14 -3 3 -23 -30 -44 -72 -68 -139 -166 -219 -438 -358 -84 -43 -154 -84
-157 -91 -13 -34 -160 -94 -230 -94 -17 0 -69 14 -115 31 -46 17 -135 39 -198
50 -476 81 -952 324 -1254 639 -99 105 -111 114 -141 111 -18 -1 -36 3 -41 10
-4 8 -3 10 4 5 6 -4 21 -2 32 4 20 11 19 13 -20 57 -101 115 -204 295 -309
540 -117 274 -147 421 -138 673 7 188 21 250 91 395 63 131 123 212 206 280
34 28 81 71 105 96 30 32 47 44 57 38 10 -7 11 -9 0 -9 -7 0 -25 -14 -40 -31
-14 -17 -53 -54 -86 -81 -89 -73 -147 -147 -209 -267 -89 -173 -92 -186 -92
-416 1 -282 31 -431 140 -682 90 -208 207 -402 317 -528 21 -23 34 -46 30 -50
-4 -4 0 -6 8 -3 8 2 29 23 46 45 l30 40 29 -56 c44 -84 196 -231 340 -327 147
-98 271 -165 435 -237 154 -67 324 -123 247 -81 -16 9 -27 17 -25 19 2 2 32
-3 68 -10 36 -8 79 -15 95 -15 l30 -2 -27 -10 c-16 -5 -28 -13 -28 -17 0 -5
34 -13 76 -19 46 -6 84 -17 97 -29 l21 -18 -21 30 c-28 40 -77 85 -136 125
-86 57 -119 91 -106 107 9 10 9 20 0 39 -16 35 -118 170 -216 284 -238 279
-265 333 -215 429 10 21 16 41 13 45 -4 3 -4 6 0 6 3 0 78 -96 166 -212 88
-117 184 -243 214 -279 35 -43 82 -124 134 -230 67 -136 90 -172 131 -212 49
-45 70 -53 124 -49 11 1 20 -7 23 -21 3 -12 10 -44 16 -72 19 -92 60 -111 179
-83 l52 12 -4 48 -3 48 85 36 c113 49 446 270 499 332 39 44 164 274 181 331
16 53 11 -15 -10 -121 -22 -115 -23 -118 -12 -101 4 6 60 20 125 31 143 24
168 19 226 -43 l42 -45 39 20 c22 11 59 23 82 26 36 5 50 1 88 -24 25 -15 59
-48 75 -72 26 -38 30 -52 29 -107 0 -35 3 -63 8 -63 5 0 55 -40 111 -89 56
-49 167 -141 247 -204 l145 -116 3 257 c2 236 1 258 -15 270 -10 7 -69 40
-132 73 -62 33 -153 85 -202 115 -184 114 -192 129 -195 344 l-2 155 7 -135
c10 -167 22 -213 69 -260 45 -44 186 -132 350 -218 l122 -64 0 114 -1 113
-112 68 c-62 38 -124 78 -137 89 l-25 20 35 -20 c19 -11 81 -47 138 -81 95
-56 102 -59 102 -37 0 17 -19 37 -72 77 -74 56 -122 123 -131 184 -2 17 -2 25
0 19 6 -16 43 -5 43 12 0 20 5 18 70 -26 81 -55 90 -58 90 -27 0 21 -11 32
-61 59 -36 18 -70 45 -80 63 -29 46 -23 50 20 13 22 -18 58 -43 80 -56 l41
-23 0 95 0 94 -47 23 c-123 59 -197 177 -172 271 12 45 66 95 115 104 59 11
23 26 -52 22 l-69 -3 17 51 c41 121 47 269 13 320 -8 13 -14 24 -12 24 3 0 47
-16 98 -35 52 -19 97 -35 102 -35 4 0 7 40 7 89 0 69 -3 90 -15 95 -8 3 -64
13 -125 23 l-110 18 0 43 c0 23 -13 77 -29 120 -16 42 -31 102 -34 132 -8 75
-67 248 -108 311 -23 37 -53 64 -103 96 -39 25 -96 69 -127 98 -67 64 -127 95
-255 133 -99 30 -340 80 -401 84 -18 1 -33 8 -33 14 0 7 -44 58 -97 114 l-97
102 45 -6 c24 -4 179 -22 344 -41 363 -43 290 -31 751 -121 210 -41 384 -74
388 -74 3 0 6 6 6 14 0 10 -42 21 -147 41 -273 50 -283 61 -20 20 87 -14 161
-25 163 -25 2 0 4 9 4 20 0 11 -6 20 -13 20 -7 0 -147 18 -311 40 -163 22
-299 40 -301 40 -1 0 -24 18 -51 40 -47 39 -104 112 -104 134 0 6 10 -7 23
-29 12 -22 33 -45 45 -51 12 -6 98 -16 190 -23 92 -7 237 -19 322 -27 193 -17
200 -17 200 0 0 18 -15 20 -360 46 -151 12 -290 23 -308 26 -38 6 -60 27 -96
95 l-28 50 16 102 c21 129 48 184 133 272 37 39 68 73 68 77 0 3 4 10 9 15 5
5 6 3 2 -4 -8 -15 10 -18 19 -3 10 16 228 143 390 227 119 62 151 83 153 101
l3 22 -413 0 c-452 -1 -438 2 -328 -55 69 -35 147 -55 216 -55 62 0 215 35
288 65 45 19 51 17 30 -13 -36 -51 -139 -81 -295 -85 l-96 -2 -39 -54 c-22
-30 -75 -87 -119 -127 -44 -41 -183 -185 -310 -321 -126 -136 -251 -268 -276
-295 l-46 -48 -76 0 c-71 0 -81 3 -129 35 -66 43 -127 94 -112 95 18 0 135
107 228 208 128 140 516 625 516 645 0 13 -15 7 -26 -10z m366 -371 c-99 -78
-407 -334 -485 -405 -49 -44 -70 -59 -45 -33 44 47 91 87 324 282 127 105 228
184 236 183 3 0 -11 -12 -30 -27z m-1670 -205 c52 -14 111 -33 130 -42 35 -16
35 -16 5 -11 -16 3 -84 17 -150 31 -190 42 -390 45 -600 10 -29 -5 -29 -5 -5
5 58 26 197 39 360 36 137 -3 181 -8 260 -29z m-763 -57 c-65 -22 -156 -57
-202 -79 -47 -22 -85 -37 -85 -35 0 19 347 154 390 153 8 0 -38 -18 -103 -39z
m346 33 c-13 -2 -35 -2 -50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m185 0 c-10
-2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m-301 -9 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m380 0 c-3 -3 -12 -4 -19 -1 -8 3 -5
6 6 6 11 1 17 -2 13 -5z m1660 -26 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2
-19 0 -25z m-1600 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m120 -30 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m1470 -61 c-3
-10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-1739 16 c53 -6 147 -23
207 -39 105 -27 280 -93 290 -110 3 -4 -36 10 -87 32 -121 52 -291 95 -434
109 -189 20 -421 -14 -603 -85 -36 -14 -66 -24 -68 -22 -7 7 150 63 237 85
161 39 295 48 458 30z m493 -43 c60 -30 147 -81 194 -112 78 -52 277 -222 315
-269 14 -17 14 -18 -7 -7 -12 7 -28 20 -35 31 -28 39 -180 170 -268 230 -50
35 -144 90 -208 122 -65 32 -113 59 -108 59 5 0 58 -24 117 -54z m-356 -37
c122 -25 255 -68 332 -109 l58 -30 -98 3 c-63 2 -91 0 -81 -6 9 -5 56 -9 105
-8 70 1 96 -2 126 -18 44 -22 126 -85 204 -155 l54 -49 -65 7 c-122 13 -204
38 -322 97 -123 62 -189 79 -305 79 -59 0 -78 -10 -51 -26 7 -5 8 -3 3 5 -22
36 112 -58 211 -147 l59 -54 247 -1 c170 -2 251 -6 258 -13 9 -9 -56 -11 -256
-9 -248 2 -266 1 -248 -14 10 -9 29 -37 42 -62 33 -65 107 -156 144 -176 29
-16 58 -17 264 -14 l231 3 47 -77 c27 -42 47 -77 45 -78 -2 -1 -108 0 -236 3
-230 5 -232 5 -258 30 -15 14 -34 37 -43 53 -16 26 -32 36 -32 18 0 -4 19 -30
43 -57 40 -46 40 -47 9 -26 -17 13 -58 51 -90 84 -31 34 -75 79 -98 102 -23
23 -76 83 -118 134 -43 50 -80 92 -84 92 -4 0 -29 20 -55 44 -160 147 -519
245 -847 232 l-135 -5 68 35 c120 62 343 123 497 138 85 7 275 -5 375 -25z
m1589 -70 c-4 -52 -9 -88 -12 -81 -5 17 8 185 14 179 3 -3 2 -47 -2 -98z
m-2544 86 c0 -2 -10 -9 -22 -15 -22 -11 -22 -10 -4 4 21 17 26 19 26 11z m-50
-28 c0 -2 -19 -18 -42 -36 l-43 -32 39 35 c37 34 46 40 46 33z m140 -41 c0 -2
-7 -7 -16 -10 -8 -3 -12 -2 -9 4 6 10 25 14 25 6z m-53 -29 c-11 -7 -48 -31
-84 -54 -36 -23 -59 -36 -52 -27 12 15 139 94 149 93 3 0 -3 -6 -13 -12z
m1353 -33 c0 -2 -9 0 -20 6 -11 6 -20 13 -20 16 0 2 9 0 20 -6 11 -6 20 -13
20 -16z m754 -6 c-9 -17 -22 -50 -29 -72 -7 -23 -13 -32 -14 -21 -1 21 44 125
54 125 3 0 -2 -14 -11 -32z m-671 -47 c7 -8 -7 -2 -30 14 -24 15 -43 30 -43
32 0 7 61 -31 73 -46z m407 -122 c13 -23 13 -59 1 -59 -6 0 -37 25 -70 56 -52
48 -61 61 -61 91 l0 35 60 -52 c34 -29 65 -61 70 -71z m-2000 108 c0 -2 -12
-14 -27 -28 l-28 -24 24 28 c23 25 31 32 31 24z m268 -4 c-16 -2 -40 -2 -55 0
-16 2 -3 4 27 4 30 0 43 -2 28 -4z m225 0 c-18 -2 -48 -2 -65 0 -18 2 -4 4 32
4 36 0 50 -2 33 -4z m-674 -6 c-2 -2 -24 -18 -49 -36 l-45 -33 40 36 c22 20
44 36 49 36 5 0 7 -1 5 -3z m324 -4 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0
19 -2 13 -5z m430 0 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z
m-496 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m556 -1 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m54 -9 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m988 -14 c10 -11 16 -20 13 -20 -3 0 -13
9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z m-920 0 c25 -11 -1 -11 -35
0 -20 6 -21 8 -5 8 11 0 29 -3 40 -8z m65 -20 c18 -12 2 -12 -25 0 -13 6 -15
9 -5 9 8 0 22 -4 30 -9z m50 -20 c8 -5 11 -10 5 -10 -5 0 -17 5 -25 10 -8 5
-10 10 -5 10 6 0 17 -5 25 -10z m-970 -14 c0 -2 -8 -10 -17 -17 -16 -13 -17
-12 -4 4 13 16 21 21 21 13z m1068 -30 c37 -19 81 -47 97 -61 l30 -27 -35 24
c-19 13 -66 40 -105 60 -38 21 -67 38 -62 38 4 0 38 -15 75 -34z m1949 -2 c-3
-3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-750 -191 c26 -46 41 -58
23 -20 -11 21 -11 21 5 2 8 -11 13 -25 10 -33 -2 -7 0 -10 5 -7 10 6 55 -74
46 -83 -3 -3 -6 -1 -6 4 0 6 -7 19 -15 30 -14 16 -14 14 0 -14 13 -26 19 -31
30 -22 8 7 46 10 102 7 l88 -3 -91 -2 c-73 -2 -93 -5 -98 -18 -4 -10 -2 -13 6
-8 8 5 9 2 5 -10 -6 -16 9 -17 226 -13 255 5 302 0 390 -45 77 -38 128 -86
160 -151 35 -69 98 -273 90 -292 -12 -32 -68 -45 -347 -80 -158 -19 -295 -35
-306 -35 -10 0 -21 8 -24 18 -2 9 -3 -10 -1 -43 l4 -60 -10 65 c-6 36 -22 112
-37 170 -14 58 -27 108 -27 112 0 3 -3 9 -7 13 -4 4 -4 13 -1 21 3 8 0 14 -6
14 -6 0 -11 6 -11 12 0 27 -54 152 -86 200 -19 27 -34 52 -34 55 0 6 -48 64
-79 98 -11 11 -34 45 -53 75 -19 30 -49 78 -67 107 l-33 51 -46 -29 c-25 -16
-51 -29 -58 -29 -6 0 22 -35 63 -77 41 -43 79 -77 84 -75 6 1 8 -2 4 -8 -4 -6
11 -32 33 -58 133 -159 259 -455 303 -710 30 -180 25 -544 -12 -755 -20 -110
-21 -70 -4 89 10 85 14 184 11 229 -3 53 -2 70 4 50 9 -31 5 126 -7 305 -5 72
-8 88 -14 65 -5 -21 -7 -13 -3 25 2 33 1 47 -4 36 -6 -13 -8 -4 -9 30 0 54
-47 206 -100 329 -72 164 -148 275 -301 439 -40 43 -71 80 -68 83 3 3 -13 19
-34 34 -51 37 -51 45 0 19 21 -11 47 -20 57 -20 28 0 82 37 101 69 l16 29 54
-72 c29 -39 65 -90 79 -113z m810 181 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11
1 17 -2 13 -5z m50 -10 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m66 -11 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m-2526 -48
c221 -32 355 -80 437 -155 42 -39 183 -232 158 -216 -7 4 -31 35 -54 69 -54
80 -143 169 -195 196 -64 32 -201 69 -330 87 -128 19 -443 25 -638 12 -146
-10 -100 8 55 21 150 13 431 6 567 -14z m558 -25 c10 -11 16 -20 13 -20 -3 0
-13 9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z m-997 -37 c-16 -2 -40
-2 -55 0 -16 2 -3 4 27 4 30 0 43 -2 28 -4z m110 0 c-16 -2 -40 -2 -55 0 -16
2 -3 4 27 4 30 0 43 -2 28 -4z m299 0 c-20 -2 -52 -2 -70 0 -17 2 0 4 38 4 39
0 53 -2 32 -4z m1010 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m831 -39 c146 -31 291 -77 347 -110 42 -25 116 -95 99 -95 -33 0 -94 27 -137
62 -93 73 -169 103 -366 143 -145 29 -155 30 -147 10 8 -22 0 -18 -17 8 l-15
23 57 -7 c31 -5 112 -20 179 -34z m-2475 28 c-18 -2 -48 -2 -65 0 -18 2 -4 4
32 4 36 0 50 -2 33 -4z m745 0 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27
-2 18 -5z m1140 0 c-21 -2 -57 -2 -80 0 -24 2 -7 4 37 4 44 0 63 -2 43 -4z
m-1075 -10 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m54 -9 c-3
-3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m40 -10 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m643 -69 c43 -41 88 -77 101 -80 13 -3
108 -5 211 -3 169 3 187 1 197 -14 10 -17 -1 -18 -176 -20 -287 -2 -293 -1
-355 71 -43 50 -83 121 -68 121 6 0 46 -34 90 -75z m-1407 48 c-40 -2 -107 -2
-150 0 -43 1 -10 3 72 3 83 0 118 -2 78 -3z m-255 -10 c-10 -2 -26 -2 -35 0
-10 3 -2 5 17 5 19 0 27 -2 18 -5z m2530 -20 c-10 -2 -26 -2 -35 0 -10 3 -2 5
17 5 19 0 27 -2 18 -5z m-1820 -85 c3 -37 2 -38 -30 -38 -18 0 -50 3 -70 6
-35 6 -38 9 -38 41 l0 34 68 -3 67 -3 3 -37z m-191 -3 c2 -14 -1 -25 -6 -25
-15 0 -21 14 -14 39 7 26 16 20 20 -14z m458 -2 c63 -22 116 -58 170 -114 l50
-53 -51 45 c-78 68 -165 111 -238 116 -56 5 -65 3 -94 -22 -17 -14 -40 -40
-49 -56 l-17 -29 -131 0 c-225 0 -549 -27 -672 -56 -22 -5 -25 -4 -17 6 26 27
373 61 642 63 l163 1 35 49 c55 76 102 88 209 50z m-675 7 c0 -5 -4 -10 -10
-10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z m47 4 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-329 -29 c1 -14 -3 -25 -9 -25 -5 0
-8 4 -5 9 4 5 -2 7 -12 4 -12 -3 -19 1 -19 10 0 9 6 13 14 10 7 -3 13 0 13 6
0 22 16 10 18 -14z m119 5 c-1 -11 -5 -20 -9 -20 -4 0 -8 9 -8 20 0 11 4 20 9
20 6 0 9 -9 8 -20z m133 16 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11
10 11 6 0 10 -2 10 -4z m210 -17 c0 -5 -4 -9 -10 -9 -5 0 -10 7 -10 16 0 8 5
12 10 9 6 -3 10 -10 10 -16z m2247 5 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1
17 -2 13 -5z m-2407 -14 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10
10 6 0 10 -4 10 -10z m569 -33 c6 -8 8 -17 5 -20 -9 -8 -44 11 -44 23 0 15 26
12 39 -3z m-267 -4 c-40 -2 -103 -2 -140 0 -37 2 -4 3 73 3 77 0 107 -2 67 -3z
m-253 -7 c-2 -2 -76 -6 -164 -8 -88 -3 -131 -2 -95 2 72 7 266 12 259 6z
m-371 -23 c-16 -2 -40 -2 -55 0 -16 2 -3 4 27 4 30 0 43 -2 28 -4z m1006 -24
c125 -79 246 -246 246 -339 0 -47 -18 -58 -85 -53 l-60 5 -2 53 c-1 66 -41
153 -90 196 -58 50 -115 71 -225 79 -55 4 -101 10 -104 12 -2 3 31 12 74 22
42 9 95 25 117 35 56 27 74 25 129 -10z m215 -8 c88 -45 161 -59 336 -66 88
-4 175 -11 192 -17 47 -14 97 -78 128 -164 49 -134 43 -204 -20 -220 -14 -3
-23 -10 -20 -14 6 -10 -227 -20 -238 -10 -4 4 32 10 80 14 116 9 177 37 181
84 4 36 -18 120 -50 195 -31 71 -49 77 -262 87 -188 9 -231 18 -311 64 -39 23
-96 76 -81 76 3 0 33 -13 65 -29z m-582 -68 c-35 -47 -36 -48 -107 -57 -71 -8
-72 -8 -103 22 -42 39 -69 52 -107 52 -49 0 -103 -34 -148 -93 -49 -62 -55
-81 -13 -40 59 59 151 68 236 23 42 -22 61 -27 70 -20 10 9 18 -2 35 -47 26
-67 35 -136 26 -188 -8 -42 -60 -105 -87 -105 -16 0 -15 6 13 45 43 60 51 151
20 212 -42 82 -126 131 -206 119 -92 -14 -140 -71 -140 -166 1 -57 36 -146 54
-135 5 3 12 0 16 -6 5 -8 3 -9 -6 -4 -8 5 -11 3 -9 -4 3 -7 8 -11 11 -9 4 2
23 -12 42 -31 31 -30 44 -35 97 -39 38 -3 56 -8 48 -13 -18 -11 -85 -1 -124
18 -40 20 -103 80 -122 118 -9 17 -19 57 -23 90 l-7 60 -2 -75 c-1 -82 -14
-139 -33 -153 -9 -6 -5 -7 11 -3 18 4 21 2 12 -7 -6 -6 -46 -13 -89 -17 -84
-6 -80 -1 -69 -78 4 -29 2 -25 -10 16 -9 28 -22 52 -29 52 -8 0 -11 6 -8 15 7
18 6 18 -37 3 l-34 -12 30 -6 c26 -6 23 -7 -25 -14 -173 -22 -190 -27 -190
-49 0 -21 3 -22 107 -19 59 2 106 1 103 -1 -7 -7 -300 -19 -300 -13 0 3 25 24
55 46 42 31 57 49 65 81 15 54 -1 100 -47 138 l-35 29 28 52 c16 29 44 70 64
92 32 36 45 42 143 67 l107 28 64 -58 c35 -33 68 -59 73 -59 4 1 -23 29 -61
64 l-69 63 64 12 c61 11 282 37 379 44 25 2 103 4 173 5 l129 2 -35 -47z
m-739 1 c-3 -3 -28 -11 -54 -18 -27 -7 -60 -16 -74 -20 -23 -6 -24 -6 -5 5 27
17 146 47 133 33z m881 -37 c-44 -29 -97 -129 -108 -204 -7 -50 -9 -53 -9 -18
-1 22 7 65 18 95 21 61 20 72 -2 38 -50 -77 -59 -168 -25 -237 8 -17 12 -31 7
-31 -16 0 -40 70 -40 119 0 89 53 184 129 233 53 33 79 38 30 5z m1171 -15
c-32 -10 -50 -36 -50 -71 l-1 -36 -24 47 c-14 26 -30 50 -37 54 -9 6 -6 10 10
14 28 6 123 -1 102 -8z m-2555 -13 c-2 -12 -18 -80 -34 -153 -17 -72 -36 -176
-42 -231 -7 -55 -15 -104 -19 -108 -13 -14 -230 45 -230 63 0 12 -2 12 -9 2
-19 -31 -91 16 -91 61 0 20 73 102 132 149 l38 29 -16 -36 c-8 -21 -13 -39
-11 -42 3 -2 9 10 15 26 19 54 69 116 139 173 54 44 114 84 130 88 1 0 0 -10
-2 -21z m2898 14 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z
m-894 -47 c146 -30 190 -64 199 -157 4 -46 2 -53 -29 -85 -38 -40 -41 -40
-145 -15 -44 10 -95 22 -115 25 l-35 6 10 50 c8 42 7 61 -11 118 -11 37 -24
75 -28 84 -7 17 -4 17 31 4 22 -7 77 -21 123 -30z m-1909 19 c0 -2 -20 -53
-44 -113 -96 -239 -139 -504 -118 -728 15 -150 34 -225 73 -279 19 -26 51
-103 80 -191 27 -81 83 -217 125 -302 67 -138 83 -163 145 -225 38 -38 68 -71
67 -72 -2 -1 -31 10 -65 26 -79 35 -110 78 -199 269 -126 272 -209 524 -233
703 -22 163 -10 336 45 622 47 249 71 313 109 299 8 -4 15 -7 15 -9z m2275
-15 c24 -23 85 -186 85 -229 0 -39 -72 -71 -159 -71 l-44 0 47 38 c25 20 46
45 46 55 0 9 -2 17 -4 17 -2 0 -11 3 -20 6 -10 4 -22 -8 -40 -43 -13 -26 -34
-54 -46 -61 l-21 -13 21 29 c32 43 36 100 12 154 -25 56 -75 96 -161 125 l-66
22 162 -2 c156 -3 164 -4 188 -27z m549 14 c9 -8 16 -18 16 -21 0 -3 -78 -2
-173 2 -140 6 -175 4 -184 -7 -8 -10 1 -43 38 -137 28 -68 48 -125 46 -128 -2
-2 -22 -1 -44 3 -39 6 -41 7 -53 62 -7 30 -21 80 -31 110 -23 68 -24 90 -2
114 14 16 34 18 194 18 148 0 180 -3 193 -16z m-1384 -16 c59 -31 101 -106 99
-182 l-2 -51 -7 60 c-10 91 -49 150 -113 174 -41 16 -68 14 -112 -9 -49 -25
-54 -25 -24 -1 49 38 96 40 159 9z m-402 -25 c-4 -22 -22 -20 -26 1 -2 10 3
16 13 16 10 0 15 -7 13 -17z m-318 -6 c0 -2 -10 -12 -22 -23 l-23 -19 19 23
c18 21 26 27 26 19z m525 -22 c-1 -14 -5 -28 -8 -31 -3 -4 -4 7 -2 22 4 35 4
34 9 34 2 0 3 -11 1 -25z m-451 -15 c-39 -17 -53 -37 -68 -95 -3 -11 -3 -3 -1
19 4 41 27 73 60 87 40 16 49 7 9 -11z m1804 13 c-15 -2 -42 -2 -60 0 -18 2
-6 4 27 4 33 0 48 -2 33 -4z m-1726 -15 c22 -19 48 -60 48 -78 -1 -8 -7 -1
-14 16 -8 17 -26 40 -41 52 -15 12 -23 22 -18 22 5 0 16 -6 25 -12z m1920 5
l-73 -4 20 -33 c12 -18 18 -36 15 -39 -3 -3 4 -10 15 -16 25 -14 85 -100 76
-109 -4 -4 -19 8 -34 27 -14 18 -45 56 -68 84 -41 48 -51 75 -36 90 3 4 40 6
82 5 l76 -2 -73 -3z m-1420 -40 c-12 -2 -20 -9 -16 -14 3 -5 10 -7 15 -4 5 4
9 2 9 -2 0 -16 -24 -33 -44 -33 -21 1 -21 1 -2 15 29 22 13 29 -23 10 -19 -9
-31 -23 -31 -36 0 -11 -4 -18 -10 -14 -27 17 54 84 100 83 23 -1 24 -1 2 -5z
m1519 -28 c10 -16 20 -43 24 -60 5 -29 5 -29 -5 -5 -6 14 -28 42 -48 63 -35
37 -36 39 -13 35 15 -2 32 -15 42 -33z m-2914 3 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m2671 15 c-21 -2 -55 -2 -75 0 -21 2 -4 4 37 4 41 0
58 -2 38 -4z m-1811 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m-45 -17 c-6 -6 -12 -28 -15 -47 l-4 -35 -1 36 c-1 19 3 40 10 47 16 16 23 15
10 -1z m98 -47 c0 -19 -36 -70 -50 -70 -5 0 2 11 15 25 29 28 31 51 9 85 l-16
25 21 -24 c12 -13 21 -31 21 -41z m-923 18 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13
3 -3 4 -12 1 -19z m700 -10 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0
-25z m833 2 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4
10 -10z m1167 3 c-20 -2 -52 -2 -70 0 -17 2 0 4 38 4 39 0 53 -2 32 -4z m191
0 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2 18 -5z m-2901 -55 c-3 -7
-5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m993 16 c0 -2 -7 -4 -15 -4 -8
0 -15 4 -15 10 0 5 7 7 15 4 8 -4 15 -8 15 -10z m269 -32 c1 -7 -3 -10 -9 -7
-5 3 -10 18 -9 33 0 24 1 25 9 7 5 -11 9 -26 9 -33z m-420 -4 c8 2 11 0 7 -6
-3 -6 9 -15 29 -22 26 -9 35 -17 34 -33 l0 -22 -9 23 c-12 28 -40 30 -33 2 3
-11 0 -20 -6 -20 -6 0 -11 11 -11 23 0 15 -9 28 -24 35 -14 6 -30 21 -37 34
l-12 23 24 -21 c13 -12 30 -19 38 -16z m388 10 c-3 -8 -6 -5 -6 6 -1 11 2 17
5 13 3 -3 4 -12 1 -19z m1531 15 c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1
32 -1 23 -4z m-908 -28 c125 -19 201 -46 266 -95 210 -159 256 -546 100 -845
-41 -80 -42 -82 -21 -65 34 26 -21 -45 -58 -76 -41 -35 -137 -78 -205 -93 -86
-18 -211 -14 -288 10 -60 19 -77 30 -135 88 -77 79 -193 248 -248 364 -41 84
-81 222 -81 276 0 36 -29 56 -66 47 -25 -7 -25 -7 -23 67 2 40 -1 78 -5 85
-16 27 73 131 144 167 40 20 221 66 305 78 71 10 227 6 315 -8z m1163 -57
c-42 -72 -127 -97 -201 -59 -23 12 -42 23 -42 25 0 2 20 -1 44 -6 34 -7 51 -6
73 6 33 17 67 48 89 81 15 24 15 24 35 4 20 -20 20 -21 2 -51z m-3026 15 c-3
-10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m2867 0 c34 -37 26 -40 -21
-9 -30 21 -49 26 -93 25 -51 -1 -53 -1 -25 -11 32 -11 58 -28 52 -34 -2 -2
-21 5 -42 16 -22 11 -46 20 -55 21 -10 0 -9 3 5 9 11 5 50 9 87 9 61 1 70 -2
92 -26z m-2197 -5 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m1835
-3 c5 -24 3 -25 -46 -24 -47 1 -49 1 -20 10 17 5 37 16 44 24 16 20 17 19 22
-10z m83 -2 c11 -7 36 -13 57 -13 20 0 40 -5 44 -12 5 -8 2 -9 -10 -5 -10 4
-48 8 -84 8 -37 1 -59 3 -49 6 18 5 18 6 1 24 -17 19 -17 20 2 13 10 -4 28
-13 39 -21z m1354 -50 c15 -30 26 -74 29 -115 l5 -67 -44 -11 c-147 -37 -321
-113 -408 -178 -48 -36 -68 -90 -86 -237 -26 -216 -59 -336 -103 -378 -15 -14
-47 -33 -71 -42 -65 -23 -73 -17 -14 10 64 29 93 85 117 225 25 152 19 170
-60 170 -47 0 -55 3 -50 16 3 9 6 19 6 24 0 5 29 12 65 15 l65 7 0 36 0 35
-60 -6 -60 -7 0 30 c0 28 3 30 38 30 56 0 87 20 87 55 0 30 -1 30 -62 33 -58
3 -63 5 -63 26 0 21 6 24 59 30 74 8 91 21 102 77 18 97 3 144 -44 135 -12 -3
-48 -8 -79 -11 -54 -6 -58 -5 -58 14 0 12 4 21 9 21 47 0 576 82 602 94 50 21
53 20 78 -31z m-1151 -29 c101 -50 170 -104 224 -176 40 -53 66 -105 56 -113
-2 -1 -19 -5 -38 -8 -36 -5 -36 -5 -54 46 -24 69 -70 140 -109 170 -76 58 -89
60 -287 62 -178 2 -180 2 -55 -5 116 -6 107 -7 -80 -6 -115 1 -187 -1 -160 -4
l50 -6 -45 -5 c-41 -4 -47 -1 -77 31 l-32 35 37 6 c20 3 141 7 268 8 l231 1
71 -36z m-1657 12 c-6 -7 -30 -16 -54 -20 -23 -3 -150 -28 -282 -55 -132 -27
-280 -57 -330 -66 -49 -9 -109 -25 -132 -36 -31 -15 -58 -19 -109 -17 -60 3
-69 6 -87 30 -11 15 -18 30 -15 33 13 14 136 25 273 25 162 0 199 5 191 26 -3
7 -7 30 -10 51 -4 32 -3 30 12 -15 l17 -54 40 7 c22 3 112 22 200 42 88 20
189 42 225 48 36 7 67 13 69 14 2 0 -2 -5 -8 -13z m1876 -1 c0 -8 -2 -13 -5
-10 -2 2 -11 -2 -19 -10 -8 -8 -22 -15 -31 -15 -13 1 -9 7 13 25 35 29 42 30
42 10z m-2640 -31 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-74
-11 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m746 -43 c-25 -29
-51 -50 -63 -51 -21 0 -21 -1 -1 -9 11 -5 17 -9 12 -9 -4 -1 -77 -15 -162 -31
-84 -17 -157 -29 -162 -28 -18 5 -90 -26 -124 -53 l-37 -28 -6 25 c-8 30 4 54
43 87 37 31 89 48 246 82 106 23 285 62 293 64 2 1 -16 -21 -39 -49z m-812 34
c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m2569 -13 c46 -21 100
-82 138 -158 33 -67 33 -91 0 -103 -32 -12 -57 -12 -26 0 12 5 22 15 22 21 0
23 -63 139 -96 178 -46 54 -83 64 -207 57 -87 -4 -93 -4 -42 4 33 6 64 12 70
14 26 11 104 4 141 -13z m-450 -24 c38 3 67 3 64 1 -3 -3 -37 -8 -76 -12 -62
-6 -72 -5 -78 10 -5 13 -4 14 7 6 9 -8 38 -9 83 -5z m157 6 c-13 -2 -35 -2
-50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m251 -29 c8 -21 8 -24 -3 -24 -5 0
-11 9 -14 20 -6 24 8 27 17 4z m495 -73 c1 -74 -5 -61 -11 24 -3 40 -2 61 3
50 4 -11 8 -44 8 -74z m-607 64 c4 -5 8 -14 8 -20 0 -5 -5 -3 -10 5 -8 12 -10
12 -10 -5 0 -17 -2 -17 -10 -5 -20 32 0 55 22 25z m768 -21 c0 -35 -17 -64
-38 -64 -16 1 -16 1 1 11 10 6 17 22 17 40 0 28 -2 30 -27 25 -79 -14 -103
-16 -103 -8 0 10 128 31 143 24 4 -2 7 -14 7 -28z m-3550 15 c11 -8 8 -9 -15
-5 -37 7 -76 -11 -92 -44 -10 -19 -13 -21 -13 -7 0 46 80 84 120 56z m2553 4
c3 -5 8 -22 11 -39 6 -24 4 -31 -9 -31 -13 0 -16 7 -11 27 2 15 0 32 -7 39 -8
8 -8 11 0 11 7 0 14 -3 16 -7z m191 -9 c8 -22 8 -24 -8 -24 -9 0 -14 9 -13 20
2 24 13 26 21 4z m-2540 -11 c4 -5 13 -8 19 -8 5 0 12 -6 15 -14 3 -9 0 -11
-9 -6 -8 5 -11 4 -6 -1 5 -5 12 -9 16 -9 5 0 28 -21 52 -47 24 -26 55 -50 69
-54 23 -6 22 -5 -8 21 -40 33 -36 43 9 20 52 -27 135 -16 206 29 38 24 51 36
38 37 -12 0 -4 6 19 15 22 8 41 12 44 10 2 -3 -14 -24 -37 -48 -22 -24 -45
-57 -51 -72 l-10 -28 -91 4 c-65 3 -84 1 -68 -5 13 -6 32 -9 42 -8 9 1 17 -3
17 -8 0 -14 -26 -14 -49 1 -13 8 -29 8 -60 1 -29 -8 -39 -8 -34 0 4 7 0 8 -12
4 -9 -4 -23 -3 -30 3 -8 7 -12 5 -12 -5 0 -8 4 -15 9 -15 4 0 8 -5 8 -11 0 -5
-4 -7 -10 -4 -5 3 -10 2 -10 -2 0 -5 12 -15 26 -24 22 -14 24 -17 10 -22 -12
-5 -15 -3 -10 5 5 8 1 9 -12 4 -10 -4 -15 -4 -11 0 4 4 2 13 -5 21 -6 7 -8 16
-5 20 4 3 -1 12 -11 20 -16 12 -15 13 3 6 18 -5 17 -3 -5 23 -15 17 -17 23 -6
14 11 -8 17 -10 15 -5 -18 40 -33 65 -41 65 -12 0 -10 -14 4 -28 9 -9 9 -12 0
-12 -7 0 -9 -7 -5 -17 6 -15 5 -16 -9 -3 -9 8 -12 16 -8 18 5 2 6 10 3 18 -3
8 0 21 7 29 9 11 8 19 -4 37 -9 12 -16 17 -16 11 0 -7 5 -15 10 -18 14 -9 12
-22 -3 -22 -7 0 -13 14 -13 34 0 33 5 40 20 26z m496 3 c0 -3 -4 -8 -10 -11
-5 -3 -10 -1 -10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z m540 -16 c0 -5 -2 -10 -4
-10 -3 0 -8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m1587 -22 c6 -7 13
-25 17 -40 10 -41 -15 -58 -84 -58 -65 0 -80 12 -80 64 0 22 4 26 28 25 23 -2
24 -2 5 -6 -23 -4 -29 -25 -17 -57 4 -12 20 -16 54 -16 27 0 55 3 64 6 21 8
21 58 0 78 -8 9 -11 16 -6 16 5 0 14 -6 19 -12z m-2827 -17 c0 -40 -13 -80
-27 -86 -23 -8 -43 14 -44 49 -1 18 -3 23 -6 13 -8 -33 7 -66 37 -82 32 -16
40 -35 16 -35 -25 0 -66 43 -72 76 -4 23 0 37 18 57 28 32 78 38 78 8z m500 9
c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m2283 3
c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m-130 -20 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m312 -13 c-3 -5 -13 -6 -21 -3 -12
4 -13 8 -3 14 15 9 32 2 24 -11z m332 -17 c-3 -10 -5 -4 -5 12 0 17 2 24 5 18
2 -7 2 -21 0 -30z m-714 20 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13
-5z m172 -10 c-2 -10 -4 -22 -5 -28 -1 -5 -5 -1 -9 10 -9 21 -5 35 9 35 4 0 7
-8 5 -17z m710 7 c-16 -4 -39 -8 -50 -8 -16 0 -15 2 5 8 14 4 36 8 50 8 22 0
22 -1 -5 -8z m-2368 -8 c15 -10 43 -75 43 -99 -1 -10 -9 5 -18 32 l-17 50 -62
3 c-55 3 -61 1 -58 -15 24 -116 45 -256 40 -261 -3 -3 -14 -1 -23 4 -30 20
-68 264 -40 264 6 0 9 2 6 5 -7 7 -228 -24 -249 -36 -29 -15 -39 -72 -29 -160
11 -99 22 -119 60 -119 17 0 112 9 211 20 100 12 183 19 185 17 4 -4 -345 -53
-452 -63 -41 -4 -64 -3 -68 5 -5 7 -1 9 10 4 14 -5 15 -3 4 17 -9 16 -11 51
-8 109 6 93 29 156 67 178 24 15 121 31 256 42 55 5 107 9 115 9 8 1 20 -2 27
-6z m1420 2 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m463 -24
c0 -5 -9 -10 -20 -10 -11 0 -20 5 -20 10 0 6 9 10 20 10 11 0 20 -4 20 -10z
m-412 -33 c4 -29 -12 -37 -22 -11 -10 26 -7 46 7 42 6 -3 13 -17 15 -31z m895
16 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-2441 -35 c-9 -9
-12 -7 -12 12 0 19 3 21 12 12 9 -9 9 -15 0 -24z m1445 10 c-3 -8 -6 -5 -6 6
-1 11 2 17 5 13 3 -3 4 -12 1 -19z m530 6 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6
11 1 17 -2 13 -5z m-54 -11 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2
18 -5z m-118 -19 c-38 -7 -81 -13 -95 -12 -37 0 89 25 130 26 22 0 9 -5 -35
-14z m1303 -9 c17 -36 15 -70 -8 -151 -29 -106 -82 -215 -149 -307 -56 -78
-151 -180 -151 -163 0 4 -7 1 -15 -7 -21 -22 -168 -69 -191 -61 -13 4 -15 3
-6 -4 9 -6 -16 -17 -85 -37 -54 -16 -107 -29 -118 -31 -11 -1 -20 -3 -20 -4 0
-1 -15 -4 -32 -6 -24 -4 -33 -1 -33 9 0 25 25 43 80 60 31 9 65 25 76 34 11
10 26 19 34 21 44 9 349 172 383 205 22 20 38 39 36 42 -3 2 -84 -22 -179 -55
-96 -33 -181 -60 -189 -60 -10 0 -12 8 -6 33 4 17 17 99 29 181 19 124 26 152
44 166 50 41 385 159 453 160 29 0 38 -5 47 -25z m-875 -66 c-15 -10 -50 -23
-78 -28 -313 -60 -428 -83 -440 -87 -11 -5 -15 1 -15 25 0 26 -4 31 -25 31
-51 0 -133 -40 -171 -83 -20 -23 -33 -34 -30 -24 3 10 6 30 6 43 0 42 30 60
131 78 262 48 566 109 579 117 10 5 23 -1 43 -23 l28 -31 -28 -18z m-2433 60
c0 -5 -4 -7 -10 -4 -5 3 -10 -2 -10 -12 0 -15 -2 -16 -10 -3 -15 23 -12 30 10
30 11 0 20 -5 20 -11z m17 -14 c-4 -8 -11 -15 -17 -15 -6 0 -6 7 2 20 14 22
24 19 15 -5z m1640 -7 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z
m-2170 0 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m133 12 c13 -8
13 -10 -2 -10 -9 0 -20 5 -23 10 -8 13 5 13 25 0z m150 -57 c-10 -16 -11 -15
-6 7 3 14 6 34 7 45 1 13 3 11 6 -7 2 -15 -1 -35 -7 -45z m2093 60 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m177 -14 c0 -6 -4 -7 -10 -4 -5 3
-10 11 -10 16 0 6 5 7 10 4 6 -3 10 -11 10 -16z m-232 4 c-10 -2 -26 -2 -35 0
-10 3 -2 5 17 5 19 0 27 -2 18 -5z m389 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6
11 1 17 -2 13 -5z m-2653 -16 c-2 -3 2 -8 8 -10 7 -3 1 -7 -14 -10 -15 -3 -25
-1 -22 3 3 5 0 9 -5 9 -6 0 -11 3 -11 8 0 4 11 7 24 7 13 0 22 -3 20 -7z m696
-4 c0 -2 -9 -4 -21 -4 -11 0 -18 4 -14 10 5 8 35 3 35 -6z m43 9 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m44 -15 c-3 -8 -6 -5 -6 6 -1 11 2
17 5 13 3 -3 4 -12 1 -19z m1411 15 c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22
1 32 -1 23 -4z m409 1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z
m506 -8 c6 -15 -12 -26 -44 -26 -12 0 -19 7 -19 20 0 15 7 20 29 20 16 0 31
-6 34 -14z m45 2 c-6 -18 -25 -20 -31 -3 -5 10 0 15 14 15 12 0 19 -5 17 -12z
m-3095 -15 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m2064 -115
c-2 -24 -4 -7 -4 37 0 44 2 63 4 43 2 -21 2 -57 0 -80z m-1674 95 c-7 -2 -21
-2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z m344 -15 c-3 -8 -6 -5 -6 6 -1 11
2 17 5 13 3 -3 4 -12 1 -19z m1610 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11
1 17 -2 13 -5z m-2943 -20 c3 -8 2 -12 -4 -9 -6 3 -10 10 -10 16 0 14 7 11 14
-7z m1263 -6 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-284 5
c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m1844 1 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-2697 -29 c-65 -17 -107 -19 -115 -6
-3 6 8 8 27 5 18 -3 47 0 63 5 17 5 41 9 55 9 14 0 0 -6 -30 -13z m640 -15 c0
-16 -4 -30 -10 -30 -5 0 -10 14 -10 30 0 17 5 30 10 30 6 0 10 -13 10 -30z
m577 8 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m1370 16 c-3 -3
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-1670 -38 c-1 -29 -4 -33 -24
-32 -18 1 -23 7 -23 28 0 24 8 31 42 37 3 0 6 -14 5 -33z m1839 -52 c-3 -8
-11 -14 -18 -13 -10 0 -10 2 0 6 6 2 13 21 13 41 2 32 3 33 6 9 3 -16 2 -35
-1 -43z m-1529 24 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m2070
-20 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-2682 3 c3 -5 1
-12 -5 -16 -5 -3 -10 1 -10 9 0 18 6 21 15 7z m2288 2 c-7 -2 -19 -2 -25 0 -7
3 -2 5 12 5 14 0 19 -2 13 -5z m-1643 -72 c-1 -13 -29 45 -29 59 0 8 6 0 14
-19 8 -18 15 -36 15 -40z m-593 37 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4
-12 1 -19z m2467 0 c9 -12 16 -30 16 -40 0 -15 -6 -14 -50 9 -28 14 -53 23
-56 20 -3 -3 11 -13 31 -22 20 -10 42 -30 51 -46 l14 -28 -35 1 c-21 1 -35 6
-35 14 0 34 -30 44 -128 44 -146 0 -234 -10 -222 -25 8 -9 4 -11 -16 -7 -19 3
-22 7 -12 13 7 5 9 9 3 9 -5 0 14 14 44 31 60 34 125 45 288 48 84 1 93 -1
107 -21z m160 -248 c-36 -164 -112 -359 -134 -345 -6 4 1 21 16 40 29 38 84
200 108 317 9 42 17 117 18 165 l2 88 4 -95 c2 -63 -3 -120 -14 -170z m-631
240 c-25 -10 -29 -20 -13 -36 6 -6 -11 -24 -53 -51 -69 -46 -82 -40 -50 25 14
28 29 41 63 54 46 17 94 24 53 8z m-1490 -15 l32 5 -29 -10 c-32 -10 -46 -6
-45 13 0 9 2 9 5 0 3 -8 18 -10 37 -8z m-565 -92 c14 -12 14 -13 -5 -13 -28 0
-32 8 -25 50 l7 35 3 -30 c2 -16 11 -36 20 -42z m212 47 c0 -5 -4 -10 -10 -10
-5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z m110 -2 c0 -5 -9 -8 -19
-8 -11 0 -22 3 -24 8 -3 4 6 7 19 7 13 0 24 -3 24 -7z m2608 -10 c19 -19 14
-73 -9 -102 -16 -20 -28 -26 -57 -25 l-37 2 40 6 c31 5 43 12 54 35 19 41 5
79 -34 87 l-30 7 31 1 c16 0 35 -4 42 -11z m-2262 -20 c19 -23 19 -23 -1 -6
-13 10 -43 18 -80 21 l-60 3 61 2 c52 2 64 -1 80 -20z m1748 4 c2 -4 0 -14 -5
-22 -8 -13 -10 -13 -18 0 -10 15 -6 30 9 30 5 0 11 -4 14 -8z m453 2 c-3 -3
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-2322 -16 c14 -6 25 -14 25
-17 0 -4 13 -21 28 -38 l29 -31 -96 -6 c-165 -11 -623 -26 -632 -20 -16 10 -9
53 10 64 11 5 43 10 71 10 28 0 133 9 233 20 173 18 234 25 284 28 12 1 34 -3
48 -10z m1545 -33 c18 0 24 5 22 17 -1 9 2 20 9 23 7 5 10 -1 7 -15 -7 -52
-71 -51 -75 1 -2 24 -2 24 5 -1 6 -18 15 -25 32 -25z m-1952 28 c-10 -2 -26
-2 -35 0 -10 3 -2 5 17 5 19 0 27 -2 18 -5z m2374 -20 c26 -30 30 -60 14 -120
-21 -85 -76 -223 -96 -243 -11 -11 -63 -24 -156 -39 -76 -12 -149 -25 -161
-28 -20 -4 -21 -3 -12 34 5 21 8 98 7 171 -1 74 2 136 8 142 5 5 80 18 165 28
86 11 162 22 168 26 6 4 11 16 11 27 0 24 31 25 52 2z m298 -19 c0 -14 -4 -23
-9 -20 -5 3 -7 15 -4 26 7 28 13 25 13 -6z m80 11 c0 -8 -5 -17 -12 -21 -7 -4
-8 -3 -4 4 4 7 1 12 -8 12 -23 0 -19 15 4 17 11 1 20 -4 20 -12z m-477 -2 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-1713 -28 c0 -8 -4 -15
-10 -15 -5 0 -7 7 -4 15 4 8 8 15 10 15 2 0 4 -7 4 -15z m1275 5 c3 -5 -1 -10
-9 -10 -9 0 -16 5 -16 10 0 6 4 10 9 10 6 0 13 -4 16 -10z m801 -173 c-25
-122 -65 -259 -85 -295 -17 -28 -13 -7 23 111 31 102 52 191 72 302 4 22 9 33
11 24 2 -9 -7 -73 -21 -142z m-2170 97 c46 -22 98 -83 158 -185 57 -96 124
-193 159 -229 37 -38 60 -78 51 -91 -4 -8 -3 -9 4 -5 7 4 18 -7 28 -26 9 -18
44 -73 77 -121 87 -128 157 -180 265 -197 l57 -9 -66 2 c-112 4 -135 25 -338
294 -139 185 -178 230 -190 223 -12 -7 -30 13 -83 95 -76 116 -111 149 -171
166 -74 20 -433 -9 -532 -44 -21 -7 -47 -25 -57 -38 -16 -21 -17 -29 -7 -59
12 -36 116 -188 187 -274 23 -27 38 -54 35 -60 -3 -6 -2 -8 2 -3 5 4 60 -44
124 -106 253 -246 556 -429 823 -496 62 -15 87 -28 156 -82 44 -35 77 -66 71
-67 -5 -2 -55 6 -111 18 -326 70 -745 297 -979 530 -72 72 -125 166 -107 188
8 9 7 11 -3 7 -26 -10 -180 190 -242 313 -45 92 -59 178 -37 232 l12 29 122 4
c390 10 558 7 592 -9z m1224 -33 c-28 -56 -35 -52 -8 4 12 24 23 43 26 41 2
-2 -6 -22 -18 -45z m1051 29 c24 0 29 -4 29 -23 0 -23 -2 -23 -45 -13 -34 8
-45 15 -45 29 0 13 5 17 16 13 9 -3 29 -6 45 -6z m-851 -31 c-14 -5 -33 -20
-42 -32 -10 -12 -18 -17 -18 -10 0 16 49 53 69 52 9 0 6 -4 -9 -10z m-2223
-61 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m25 -18 c0 -16 3
-32 8 -35 5 -3 7 -12 3 -20 -3 -8 0 -15 7 -15 6 0 8 -5 4 -11 -3 -6 -1 -15 6
-19 8 -5 9 -10 1 -14 -6 -4 -16 12 -25 41 -8 26 -15 39 -16 28 l-1 -20 -9 20
c-12 27 -12 43 0 25 7 -11 10 -5 10 24 0 22 3 36 7 33 3 -4 6 -20 5 -37z
m2224 -14 c17 5 18 5 2 -6 -20 -12 -58 2 -58 22 0 6 8 4 19 -6 10 -9 26 -14
37 -10z m-1647 11 c-2 -1 -15 -11 -29 -22 l-25 -20 19 23 c11 12 24 22 29 22
6 0 8 -1 6 -3z m63 -14 c8 -10 47 -73 86 -140 40 -67 84 -136 99 -155 15 -18
21 -28 12 -21 -11 9 -31 10 -68 4 -58 -9 -112 -1 -138 21 -25 19 -87 88 -97
107 -5 9 10 -5 32 -30 23 -26 57 -54 76 -63 37 -18 141 -22 151 -6 3 5 -5 25
-18 42 -14 18 -50 78 -82 133 -31 55 -64 106 -73 113 -9 6 -11 12 -5 12 5 0
16 -8 25 -17z m1391 -338 c8 -44 18 -109 22 -145 6 -62 5 -67 -20 -93 -41 -40
-117 -73 -250 -107 -65 -17 -121 -33 -123 -35 -3 -2 9 -26 26 -52 17 -26 47
-84 67 -128 25 -56 53 -97 92 -136 l55 -56 -29 -6 c-15 -3 -28 -5 -28 -4 0 1
-11 22 -24 47 -13 25 -50 97 -82 160 -32 63 -66 127 -76 142 -11 18 -14 31 -7
38 5 5 54 21 109 35 208 52 221 71 194 287 -9 75 -8 91 5 110 19 26 24 214 6
203 -6 -4 0 15 12 40 l23 47 6 -133 c4 -74 14 -170 22 -214z m-1686 273 c-3
-8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-359 -18 c-7 -10 -14 -17
-17 -15 -4 4 18 35 25 35 2 0 -1 -9 -8 -20z m460 -149 c19 -17 49 -33 65 -37
15 -3 26 -8 23 -11 -2 -3 -20 0 -40 7 -41 13 -109 84 -131 136 -26 63 -17 60
16 -4 17 -34 47 -75 67 -91z m-457 112 c-12 -20 -14 -14 -5 12 4 9 9 14 11 11
3 -2 0 -13 -6 -23z m579 7 c0 -4 7 -11 16 -14 12 -4 15 -2 10 9 -8 21 1 19 13
-3 15 -28 -22 -25 -50 4 -18 19 -19 23 -6 18 9 -3 17 -10 17 -14z m585 0 c10
-11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0 13 -9 23 -20z
m-1112 -7 c-4 -10 -2 -14 4 -10 12 7 39 -50 35 -72 -2 -7 1 -10 7 -6 7 4 8 0
5 -10 -4 -10 -2 -15 6 -13 7 2 15 -3 17 -10 8 -20 -21 -9 -34 13 -10 18 -11
18 -10 -7 1 -14 6 -24 11 -20 5 3 6 -3 3 -14 -6 -16 -5 -17 6 -4 20 25 35 21
59 -13 13 -17 24 -35 24 -39 1 -5 2 -13 3 -19 0 -5 5 -8 10 -5 10 6 111 -109
111 -126 0 -5 -9 -12 -21 -15 -11 -3 -18 -11 -15 -19 3 -7 0 -16 -7 -20 -7 -4
-9 -3 -4 1 4 5 -1 18 -12 29 -33 37 -55 77 -39 71 8 -3 22 -19 31 -35 12 -19
23 -27 33 -23 11 4 12 9 4 17 -6 6 -15 11 -21 11 -5 0 -23 20 -39 45 -16 25
-30 40 -30 35 0 -6 5 -16 11 -22 7 -7 6 -12 -5 -16 -10 -4 -13 -1 -9 9 3 10 0
12 -10 8 -8 -3 -18 -1 -22 5 -3 6 0 9 8 5 8 -3 17 2 21 11 7 19 -10 55 -25 55
-6 0 -7 5 -4 10 3 6 1 10 -5 10 -6 0 -9 4 -5 9 9 16 -13 23 -34 11 -17 -9 -22
-6 -34 17 -8 16 -12 34 -9 42 3 9 0 11 -8 6 -9 -5 -11 -4 -6 4 4 6 12 8 18 5
8 -5 9 -1 3 12 -4 10 -7 28 -7 39 1 18 -1 18 -19 -5 -17 -21 -19 -22 -10 -3
16 31 13 41 -4 19 -20 -27 -19 -11 1 19 19 29 26 32 17 8z m1897 -53 c-7 -52
-7 -53 -9 -13 -1 36 7 80 14 71 1 -2 -1 -28 -5 -58z m-80 45 c0 -2 -10 -10
-22 -16 -21 -11 -22 -11 -9 4 13 16 31 23 31 12z m-50 -30 c0 -6 -56 -35 -67
-35 -4 1 8 9 27 20 39 22 40 22 40 15z m-514 -43 c-5 -4 -66 26 -66 33 0 3 16
-3 35 -12 19 -9 33 -18 31 -21z m1107 -153 l-177 -191 -12 65 c-15 81 -25 100
-80 158 l-44 45 160 33 c88 18 195 43 237 56 43 12 82 23 86 24 4 1 -72 -85
-170 -190z m-1205 103 c48 -81 157 -186 221 -215 39 -17 59 -19 145 -14 126 7
194 27 242 72 20 19 38 35 39 35 1 0 20 -39 41 -86 42 -96 41 -107 -17 -136
-60 -30 -191 -59 -290 -65 l-95 -6 -37 44 c-142 168 -322 439 -293 439 2 0 22
-31 44 -68z m502 43 c-19 -7 -46 -13 -60 -13 -16 0 -10 4 20 12 60 18 84 18
40 1z m-345 -5 c13 -5 14 -9 5 -9 -8 0 -24 4 -35 9 -13 5 -14 9 -5 9 8 0 24
-4 35 -9z m492 -12 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m1610 -25 c-3 -10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m-2009 20
c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m145 0 c-13 -2 -35
-2 -50 0 -16 2 -5 4 22 4 28 0 40 -2 28 -4z m174 -86 c24 -61 25 -69 11 -83
-13 -14 -18 -6 -47 72 -24 67 -29 89 -19 95 15 10 21 1 55 -84z m1066 52 c26
-32 18 -62 -47 -194 -58 -117 -174 -298 -260 -405 -51 -63 -52 -66 -40 -96
l13 -31 -77 -49 c-42 -28 -93 -60 -113 -72 l-37 -22 10 42 c5 24 8 84 6 135
-3 82 -2 89 11 70 27 -42 65 -77 82 -77 27 0 188 176 265 290 87 129 135 216
164 297 21 59 22 64 6 88 -20 31 -37 31 -138 3 -82 -22 -97 -34 -152 -121 -17
-27 -17 -28 1 -18 10 6 28 18 41 27 12 9 22 12 22 6 0 -6 -35 -39 -77 -75
-142 -118 -226 -195 -246 -227 -19 -31 -19 -33 -2 -153 18 -124 13 -218 -15
-291 -10 -27 -61 -57 -149 -87 -73 -26 -79 -25 -90 19 -16 55 -15 58 30 71 71
21 79 37 79 150 0 89 -44 488 -71 649 -6 35 -9 66 -6 69 9 8 117 -97 133 -130
8 -15 24 -83 35 -150 11 -67 23 -125 27 -128 4 -4 58 39 121 94 89 80 125 120
163 182 58 95 74 110 126 119 22 3 50 15 63 26 32 27 96 21 122 -11z m516 -85
c-11 -117 -6 -187 18 -274 29 -107 82 -165 231 -254 34 -21 62 -40 62 -43 0
-6 -80 40 -150 88 -76 51 -114 94 -147 164 -24 52 -28 75 -31 177 -4 100 12
267 24 255 2 -2 -1 -53 -7 -113z m-1482 54 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13
3 -3 4 -12 1 -19z m-1741 4 c-3 -5 4 -23 15 -41 11 -18 18 -36 15 -39 -4 -3
-6 0 -6 7 0 7 -5 9 -12 5 -7 -5 -8 -3 -3 6 6 10 4 12 -8 7 -19 -7 -29 16 -14
33 10 10 8 12 -7 6 -16 -5 -17 -4 -6 9 13 15 35 21 26 7z m451 2 c-3 -3 -12
-4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m3228 -54 c3 -6 -1 -7 -9 -4 -18 7
-21 14 -7 14 6 0 13 -4 16 -10z m-2565 -40 c6 -11 8 -20 6 -20 -3 0 -10 9 -16
20 -6 11 -8 20 -6 20 3 0 10 -9 16 -20z m678 -90 c0 -8 -6 1 -13 20 -7 19 -13
42 -13 50 0 8 6 -1 13 -20 7 -19 13 -42 13 -50z m-1121 -6 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-82 -19 c-27 -7 -59 -13 -70 -13 -11 0 3
6 30 13 28 7 59 13 70 13 11 0 -2 -6 -30 -13z m-98 -21 c-3 -3 -12 -4 -19 -1
-8 3 -5 6 6 6 11 1 17 -2 13 -5z m754 -61 c13 -16 12 -17 -3 -4 -10 7 -18 15
-18 17 0 8 8 3 21 -13z m681 -30 c-17 -30 -60 -66 -72 -58 -7 4 1 16 22 31 18
13 36 31 41 40 5 9 11 13 14 11 2 -3 0 -14 -5 -24z m-30 -76 c-6 -6 -12 -28
-15 -47 l-4 -35 -1 36 c-1 19 3 40 10 47 16 16 23 15 10 -1z m-218 -24 c2 -10
10 -44 16 -77 7 -32 21 -83 31 -114 32 -91 21 -117 -26 -66 -24 26 -29 49 -39
202 -4 66 6 97 18 55z m-2870 -113 c23 -69 36 -127 35 -157 l-1 -48 -8 45 c-7
44 -54 223 -66 255 -4 8 -4 15 -1 15 3 0 22 -49 41 -110z m2681 -50 c25 -49
43 -90 40 -90 -3 0 -25 41 -50 90 -25 50 -43 90 -40 90 3 0 25 -40 50 -90z
m402 58 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -50 c-3 -7
-5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5 12 0
14 2 19 5 13 2 -7 2 -19 0 -25z m1798 -91 c6 -6 -26 9 -70 32 -44 23 -84 47
-90 53 -12 13 146 -71 160 -85z m-1788 31 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13
2 -7 2 -19 0 -25z m694 15 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3
21 -13z m408 -9 c15 -15 14 -16 -6 -9 -26 7 -181 -20 -231 -41 l-34 -14 22
-35 c12 -20 20 -38 17 -41 -3 -3 -17 15 -32 41 -27 44 -27 46 -9 60 11 8 21
15 24 15 3 0 41 12 85 25 86 27 138 26 164 -1z m-1455 -43 c14 -26 39 -60 56
-75 17 -14 26 -26 20 -26 -19 0 -57 45 -84 99 -15 28 -24 51 -21 51 2 0 16
-22 29 -49z m-292 -13 c-17 -17 -25 -3 -17 29 l7 28 11 -23 c7 -16 7 -26 -1
-34z m614 -3 c28 -13 54 -27 57 -32 5 -8 -36 9 -133 55 l-25 12 25 -6 c14 -4
48 -17 76 -29z m41 3 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m1038 -2 c-49 -12 -101 -26 -115 -30 -14 -5 -22 -5 -18 -1 11 11 167 53 198
54 14 0 -15 -10 -65 -23z m861 -44 c-5 -4 -66 26 -66 33 0 3 16 -3 35 -12 19
-9 33 -18 31 -21z m-1999 -52 c7 -8 13 -19 13 -24 0 -4 -9 2 -19 15 -15 18
-28 23 -57 22 l-39 -2 30 13 c31 15 44 10 72 -24z m-2582 -10 c-11 -5 -27 -9
-35 -9 -9 0 -8 4 5 9 11 5 27 9 35 9 9 0 8 -4 -5 -9z m2619 -100 c5 -24 4 -30
-3 -20 -5 8 -12 33 -15 55 -8 48 8 19 18 -35z m-31 7 c5 -16 7 -31 4 -33 -7
-8 -136 -29 -140 -23 -2 2 -7 18 -10 36 -6 31 -5 32 36 42 70 16 99 10 110
-22z m-2116 -19 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -70
c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5
12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -60 c-3 -7 -5 -2 -5 12 0 14 2 19 5
13 2 -7 2 -19 0 -25z m3438 -74 c17 -16 21 -20 8 -10 -27 23 -30 15 -7 -19 10
-15 21 -22 31 -18 11 4 14 2 9 -5 -13 -22 -36 -12 -57 23 -23 38 -45 49 -83
39 -31 -7 -34 6 -6 31 11 10 20 25 20 34 0 11 9 6 28 -15 15 -18 41 -45 57
-60z m92 39 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-3520
-15 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m10 -55 c-3 -10 -5
-4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m3613 17 c0 -5 -2 -10 -4 -10 -3 0
-8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m-104 -42 l29 -33 -32 29 c-31
28 -38 36 -30 36 2 0 16 -15 33 -32z m101 16 c-3 -3 -12 -4 -19 -1 -8 3 -5 6
6 6 11 1 17 -2 13 -5z m-3600 -46 c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2
-19 0 -25z m3118 -91 c110 -82 107 -93 -7 -32 -59 31 -119 58 -133 59 -26 3
-75 57 -75 83 0 18 139 -53 215 -110z m-3108 41 c-3 -7 -5 -2 -5 12 0 14 2 19
5 13 2 -7 2 -19 0 -25z m3123 -14 c0 -7 -58 25 -65 36 -3 5 10 1 29 -11 20
-12 36 -23 36 -25z m-2019 19 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8
3 21 -13z m-1094 -45 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m-32 -238 c10 -11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0
13 -9 23 -20z"/>
<path d="M2205 4269 c395 -19 544 -32 650 -53 29 -6 29 -6 5 4 -60 27 -492 62
-715 59 -88 -2 -81 -3 60 -10z"/>
<path d="M3019 4147 c5 -5 24 -7 42 -5 33 3 33 4 -8 8 -23 3 -39 2 -34 -3z"/>
<path d="M2700 4106 c0 -3 21 -19 48 -37 26 -17 77 -61 114 -97 37 -36 70 -63
73 -60 8 8 -107 112 -176 158 -32 23 -59 39 -59 36z"/>
<path d="M3960 3599 c0 -12 224 -18 308 -8 132 15 239 -21 289 -97 9 -14 40
-89 70 -167 30 -78 61 -152 69 -164 17 -26 42 -29 70 -9 18 14 18 15 1 22 -13
5 -15 9 -7 14 15 9 -41 187 -70 222 -16 20 -22 22 -48 12 -29 -11 -30 -11 -52
42 -23 57 -62 97 -120 123 -29 13 -76 16 -272 16 -131 0 -238 -3 -238 -6z"/>
<path d="M4041 3370 c15 -47 36 -126 46 -177 10 -50 21 -89 24 -87 4 2 5 -4 2
-15 -4 -15 0 -18 19 -15 12 2 90 13 173 24 93 12 155 25 164 34 12 13 11 24
-9 88 -31 99 -67 181 -86 194 -10 8 -67 11 -177 9 -130 -2 -142 -1 -62 4 84 6
91 8 40 10 -33 1 -83 6 -111 10 l-51 7 28 -86z m375 -102 c19 -59 33 -112 29
-118 -3 -5 -21 -9 -38 -9 -32 2 -32 2 -4 6 27 4 28 7 23 38 -4 19 -20 74 -36
122 -16 48 -30 90 -30 93 0 18 25 -41 56 -132z m-178 95 c-15 -2 -42 -2 -60 0
-18 2 -6 4 27 4 33 0 48 -2 33 -4z m70 -50 c-16 -2 -40 -2 -55 0 -16 2 -3 4
27 4 30 0 43 -2 28 -4z m-120 -10 c-15 -2 -42 -2 -60 0 -18 2 -6 4 27 4 33 0
48 -2 33 -4z m155 -40 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z
m-153 -13 c11 -7 2 -10 -32 -10 -27 0 -48 5 -48 10 0 13 60 13 80 0z m83 3
c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m15 -60 c-10 -2 -28 -2
-40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m-90 -10 c-10 -2 -28 -2 -40 0 -13 2
-5 4 17 4 22 1 32 -1 23 -4z m155 -50 c-13 -2 -33 -2 -45 0 -13 2 -3 4 22 4
25 0 35 -2 23 -4z m-85 -10 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2
18 -5z m-75 -10 c-13 -2 -33 -2 -45 0 -13 2 -3 4 22 4 25 0 35 -2 23 -4z"/>
<path d="M4542 3340 c10 -30 28 -50 28 -31 0 20 -20 61 -29 61 -6 0 -6 -11 1
-30z"/>
<path d="M4582 3210 c0 -14 2 -19 5 -12 2 6 2 18 0 25 -3 6 -5 1 -5 -13z"/>
<path d="M1950 3510 c0 -5 18 -10 40 -10 22 0 40 5 40 10 0 6 -18 10 -40 10
-22 0 -40 -4 -40 -10z"/>
<path d="M1530 3470 c0 -5 16 -10 35 -10 19 0 35 5 35 10 0 6 -16 10 -35 10
-19 0 -35 -4 -35 -10z"/>
<path d="M1451 3451 c-10 -6 -9 -10 3 -14 8 -3 18 -2 21 3 8 13 -9 20 -24 11z"/>
<path d="M1216 3405 c-22 -22 -20 -42 5 -55 27 -15 51 5 47 39 -4 31 -29 38
-52 16z"/>
<path d="M1556 3335 c-9 -26 -7 -32 5 -12 6 10 9 21 6 23 -2 3 -7 -2 -11 -11z"/>
<path d="M1423 3263 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M1353 3253 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M1278 3243 c12 -2 30 -2 40 0 9 3 -1 5 -23 4 -22 0 -30 -2 -17 -4z"/>
<path d="M1210 3231 c0 -5 9 -7 20 -4 11 3 20 7 20 9 0 2 -9 4 -20 4 -11 0
-20 -4 -20 -9z"/>
<path d="M1233 3203 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M1300 3200 c0 -13 30 -13 50 0 11 7 7 10 -17 10 -18 0 -33 -4 -33
-10z"/>
<path d="M1180 3134 c-6 -14 -10 -30 -10 -35 0 -15 47 -59 62 -59 21 1 50 48
43 70 -17 53 -78 69 -95 24z"/>
<path d="M1297 3114 c-8 -8 1 -24 14 -24 5 0 9 7 9 15 0 15 -12 20 -23 9z"/>
<path d="M531 3114 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M511 3044 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M2780 3370 c0 -6 7 -10 15 -10 8 0 15 2 15 4 0 2 -7 6 -15 10 -8 3
-15 1 -15 -4z"/>
<path d="M2835 3290 l-30 -8 35 0 c19 0 49 4 65 8 l30 8 -35 0 c-19 0 -48 -4
-65 -8z"/>
<path d="M2778 3283 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M2776 3253 c-12 -12 -5 -23 14 -23 11 0 20 4 20 9 0 11 -26 22 -34
14z"/>
<path d="M2972 3229 c2 -7 10 -15 17 -17 8 -3 12 1 9 9 -2 7 -10 15 -17 17 -8
3 -12 -1 -9 -9z"/>
<path d="M2915 3220 c-3 -6 1 -7 9 -4 18 7 21 14 7 14 -6 0 -13 -4 -16 -10z"/>
<path d="M2600 3069 c-110 -22 -231 -114 -280 -214 -22 -43 -25 -64 -24 -145
0 -90 9 -129 49 -225 8 -18 7 -18 -8 -7 -24 20 -57 117 -64 189 -3 36 -9 59
-13 53 -5 -8 -18 -1 -41 19 -18 17 -39 31 -46 31 -6 0 -16 6 -20 13 -4 8 -18
16 -30 19 -21 6 -23 2 -25 -35 -1 -37 -2 -35 -9 18 -5 48 -6 43 -3 -30 4 -111
31 -210 88 -324 106 -210 256 -392 351 -425 106 -37 268 -31 391 15 55 21 154
91 154 110 0 6 -19 -6 -43 -25 -46 -37 -131 -80 -182 -91 -22 -5 -26 -4 -16 3
12 9 9 16 -17 40 -18 17 -32 34 -32 39 0 4 5 1 10 -7 8 -12 10 -11 10 8 0 14
-6 22 -17 22 -13 0 -15 2 -5 8 21 14 -16 82 -44 82 -6 0 -37 24 -69 54 l-58
54 54 -19 c30 -10 71 -18 91 -19 87 0 206 71 258 155 35 57 80 195 80 247 0
56 -30 153 -65 208 -90 143 -255 212 -425 179z m164 -14 c37 -8 88 -26 112
-40 54 -32 117 -93 108 -106 -3 -5 0 -8 7 -7 18 4 68 -98 80 -166 11 -59 5
-131 -12 -142 -5 -3 -9 -14 -9 -25 0 -35 -56 -143 -95 -183 -21 -21 -63 -50
-93 -64 -73 -33 -177 -29 -245 11 -63 37 -142 127 -166 190 -11 28 -20 43 -20
32 -1 -29 34 -101 70 -146 27 -34 29 -53 4 -31 -11 10 -105 46 -120 47 -5 0
-10 7 -11 15 0 8 -10 36 -22 61 -34 73 -55 176 -48 242 15 149 137 278 296
313 73 16 83 16 164 -1z m-203 -702 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17
0 8 8 3 21 -13z"/>
<path d="M2693 2919 c157 -23 267 -152 267 -312 0 -67 -31 -149 -66 -177 -18
-14 -18 -14 -4 5 14 19 14 19 -2 6 -10 -7 -16 -17 -13 -21 10 -16 -79 -52
-125 -52 -49 1 -130 28 -130 43 0 5 -7 9 -16 9 -8 0 -13 4 -10 8 5 9 -23 37
-39 38 -5 0 -23 22 -40 49 -23 38 -30 62 -33 115 -5 86 10 132 60 186 58 63
120 77 215 49 68 -20 133 -84 161 -156 12 -30 21 -46 21 -36 2 35 -42 108 -89
150 -54 49 -103 67 -179 67 -121 0 -211 -101 -211 -238 0 -81 24 -143 77 -202
104 -116 249 -139 358 -56 87 66 117 234 63 349 -15 32 -32 56 -38 52 -5 -3
-7 0 -4 9 8 21 -87 93 -148 111 -29 8 -70 14 -92 14 -37 -1 -35 -2 17 -10z"/>
<path d="M2549 2889 l-24 -20 30 17 c39 24 40 24 28 24 -6 0 -21 -9 -34 -21z"/>
<path d="M2990 2881 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/>
<path d="M3011 2847 c-1 -5 4 -17 9 -27 6 -10 17 -43 25 -72 12 -41 14 -44 11
-16 -4 33 -43 133 -45 115z"/>
<path d="M2668 2803 c-44 -7 -78 -56 -78 -113 0 -41 5 -55 31 -85 56 -63 111
-80 169 -50 39 20 60 53 60 93 0 98 -84 169 -182 155z m99 -33 c37 -22 49 -41
61 -98 8 -33 6 -46 -9 -71 -20 -33 -69 -48 -111 -36 -30 9 -108 85 -108 105 0
29 21 89 36 105 22 21 92 19 131 -5z"/>
<path d="M2642 2758 c-7 -7 -12 -27 -12 -45 0 -28 3 -33 23 -32 16 1 18 2 5 6
-10 2 -18 13 -18 23 0 35 12 50 41 50 l28 0 -14 -40 c-8 -22 -10 -40 -6 -40 5
0 12 16 15 35 4 19 9 35 12 35 29 0 82 -68 66 -85 -4 -4 0 -6 8 -3 17 6 16 44
-3 66 -29 36 -121 54 -145 30z"/>
<path d="M2643 2658 c2 -7 9 -12 15 -11 6 2 9 -3 6 -11 -6 -15 32 -46 56 -46
9 0 26 7 39 16 18 13 20 18 10 25 -9 6 -1 7 21 3 26 -4 31 -3 19 5 -14 9 -124
31 -157 31 -8 0 -12 -6 -9 -12z"/>
<path d="M2777 2595 c-15 -14 -24 -25 -19 -25 5 0 19 11 32 25 30 32 23 32
-13 0z"/>
<path d="M2423 2640 c0 -30 2 -43 4 -27 2 15 2 39 0 55 -2 15 -4 2 -4 -28z"/>
<path d="M2943 2610 c0 -25 2 -35 4 -22 2 12 2 32 0 45 -2 12 -4 2 -4 -23z"/>
<path d="M2928 2540 c-3 -14 -9 -34 -12 -45 -4 -11 0 -7 9 8 9 16 15 36 13 45
-3 12 -6 10 -10 -8z"/>
<path d="M2092 2885 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M2810 2112 c0 -26 6 -30 35 -24 18 3 25 11 25 26 -1 19 -2 19 -11 4
-12 -22 -29 -23 -29 -3 0 8 -4 15 -10 15 -5 0 -10 -8 -10 -18z"/>
<path d="M1788 2883 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M1738 2873 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M1688 2863 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1638 2853 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1598 2843 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1005 2793 c14 -29 30 -55 35 -58 12 -7 -36 85 -51 100 -6 6 1 -13
16 -42z"/>
<path d="M1059 2751 c13 -12 28 -21 34 -21 12 0 11 0 -28 24 l-30 17 24 -20z"/>
<path d="M4615 2575 c-202 -63 -195 -60 -195 -94 0 -15 -7 -61 -16 -100 -9
-40 -14 -74 -11 -77 3 -3 83 23 177 58 196 72 196 71 206 187 6 57 4 71 -7 71
-8 -1 -77 -21 -154 -45z m142 -7 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4
-12 1 -19z m3 -27 c0 -5 -8 -17 -17 -27 -17 -17 -18 -17 -21 1 -2 9 2 21 10
26 17 11 28 11 28 0z m-80 -40 c0 -20 -103 -76 -121 -66 -19 13 -7 27 44 50
56 26 77 31 77 16z m45 -31 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10 0 6 2 10 4
10 3 0 8 -4 11 -10z m-221 -37 c4 -9 2 -21 -4 -27 -7 -7 -10 -3 -10 11 0 12
-6 24 -12 26 -8 4 -7 6 3 6 9 1 20 -7 23 -16z"/>
<path d="M3768 2283 c-27 -4 -28 -7 -28 -64 l0 -59 -32 1 c-24 1 -27 3 -10 6
20 4 22 10 22 59 0 36 -4 54 -12 54 -7 0 -74 -9 -148 -20 -74 -11 -136 -20
-137 -20 -8 0 -1 -230 6 -235 9 -5 266 38 299 50 7 2 12 22 12 47 1 24 7 70
13 103 12 55 15 60 39 60 17 -1 24 4 21 12 -3 7 -8 12 -12 12 -3 -1 -18 -4
-33 -6z m-78 -58 c0 -21 -5 -25 -29 -25 -17 0 -33 5 -36 10 -13 21 4 40 35 40
25 0 30 -4 30 -25z m-32 -72 c-10 -2 -26 -2 -35 0 -10 3 -2 5 17 5 19 0 27 -2
18 -5z m42 -52 c0 -19 -35 -39 -47 -27 -4 3 1 6 10 6 22 0 30 17 11 24 -8 3
-12 2 -9 -4 3 -6 -1 -10 -9 -10 -9 0 -16 7 -16 15 0 10 10 15 30 15 23 0 30
-5 30 -19z"/>
<path d="M1335 1733 c34 -53 45 -67 45 -60 0 10 -51 87 -57 87 -3 0 3 -12 12
-27z"/>
<path d="M3303 1580 c0 -25 2 -35 4 -22 2 12 2 32 0 45 -2 12 -4 2 -4 -23z"/>
<path d="M3313 1465 c-1 -27 2 -88 6 -135 8 -83 8 -83 8 -20 0 36 -3 97 -7
135 -6 61 -7 64 -7 20z"/>
<path d="M3332 1215 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M4226 5085 c-9 -26 -7 -32 5 -12 6 10 9 21 6 23 -2 3 -7 -2 -11 -11z"/>
<path d="M3395 5055 c6 -2 78 -15 161 -29 83 -14 166 -29 185 -32 19 -4 32 -4
29 -1 -3 3 -68 17 -145 31 -139 25 -249 40 -230 31z"/>
<path d="M4185 5000 c-9 -16 -13 -30 -11 -30 3 0 12 14 21 30 9 17 13 30 11
30 -3 0 -12 -13 -21 -30z"/>
<path d="M3788 4983 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3838 4973 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3898 4963 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4140 4920 c-6 -11 -8 -20 -6 -20 3 0 10 9 16 20 6 11 8 20 6 20 -3
0 -10 -9 -16 -20z"/>
<path d="M4069 4813 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z"/>
<path d="M3979 4693 c-13 -16 -12 -17 4 -4 16 13 21 21 13 21 -2 0 -10 -8 -17
-17z"/>
<path d="M4523 4623 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4603 4613 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4673 4603 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4753 4593 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M4833 4583 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M4898 4573 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M5055 4500 c-3 -5 -11 -7 -18 -4 -12 4 -527 -103 -536 -112 -6 -6
-12 -6 200 20 107 14 245 28 307 32 l112 7 0 27 c0 20 -6 29 -22 34 -31 8 -36
8 -43 -4z"/>
<path d="M4468 4373 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4418 4363 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4813 4323 c32 -2 81 -2 110 0 29 2 3 3 -58 3 -60 0 -84 -1 -52 -3z"/>
<path d="M4523 4313 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M120 4230 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0
-10 -4 -10 -10z"/>
<path d="M4655 4224 c-88 -8 -177 -12 -197 -9 -42 6 -48 1 -18 -15 13 -7 87
-4 257 10 131 11 270 21 308 23 39 2 12 3 -60 4 -71 0 -202 -6 -290 -13z"/>
<path d="M4947 4203 c18 -2 50 -2 70 0 21 2 7 4 -32 4 -38 0 -55 -2 -38 -4z"/>
<path d="M4720 4190 c-25 -4 1 -5 60 -2 58 2 107 6 109 8 7 7 -121 1 -169 -6z"/>
<path d="M4613 4173 c9 -2 25 -2 35 0 9 3 1 5 -18 5 -19 0 -27 -2 -17 -5z"/>
<path d="M398 4153 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M363 4093 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M268 4083 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M248 3983 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M158 3973 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M934 3808 l-19 -23 23 19 c21 18 27 26 19 26 -2 0 -12 -10 -23 -22z"/>
<path d="M849 3733 l-24 -28 28 24 c25 23 32 31 24 31 -2 0 -14 -12 -28 -27z"/>
<path d="M318 3603 l-318 -105 0 -75 0 -75 43 6 42 5 -42 -11 c-35 -9 -43 -15
-43 -34 0 -13 2 -24 4 -24 17 0 194 69 247 96 37 19 91 43 120 54 l54 19 -70
2 -70 2 75 9 c41 5 84 11 96 13 40 8 214 184 214 217 0 16 -36 5 -352 -99z
m161 -67 c-5 -5 -176 -46 -191 -46 -49 0 114 47 171 49 13 1 22 -1 20 -3z
m-292 -68 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-13 -71 c-6
-16 -71 -43 -80 -34 -3 3 9 8 26 12 17 4 36 15 43 25 13 22 20 20 11 -3z"/>
<path d="M799 3693 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z"/>
<path d="M735 3649 c-59 -45 -67 -57 -12 -18 42 29 65 50 55 49 -2 0 -21 -14
-43 -31z"/>
<path d="M635 3574 l-30 -26 33 22 c17 12 32 23 32 26 0 7 -4 5 -35 -22z"/>
<path d="M4722 3544 c-24 -16 -28 -40 -11 -64 8 -12 9 -10 4 7 -7 24 26 53 60
53 15 -1 11 -4 -12 -15 -22 -9 -33 -21 -33 -34 0 -12 22 -81 50 -153 62 -166
71 -176 205 -207 55 -12 108 -25 118 -28 15 -4 17 3 17 50 0 35 -5 57 -12 60
-10 4 -10 6 0 6 6 1 12 12 12 26 0 19 -7 26 -32 33 -18 4 -34 15 -36 24 -3 14
3 15 32 8 35 -8 36 -7 36 20 0 16 -7 30 -16 34 -24 9 -62 7 -69 -4 -13 -21
-43 -10 -48 18 -3 15 -4 29 -2 30 4 4 91 -13 118 -23 13 -5 17 -2 17 13 0 11
-6 23 -12 25 -10 4 -10 6 0 6 10 1 19 51 9 51 -2 0 -74 18 -162 40 -177 44
-201 47 -233 24z m175 -70 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13
-5z m49 -110 c5 -26 9 -32 16 -22 6 9 7 5 3 -11 -5 -17 -4 -21 5 -16 7 4 10 2
9 -6 -1 -8 3 -27 9 -42 14 -34 15 -47 3 -47 -9 0 -71 159 -71 181 0 24 20 -5
26 -37z m104 -174 c0 -13 -30 -13 -50 0 -11 7 -7 10 18 10 17 0 32 -4 32 -10z
m-33 -36 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m46 -11 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m44 -9 c-3 -3 -12 -4 -19
-1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z"/>
<path d="M545 3519 c-27 -17 -54 -36 -60 -42 -11 -11 58 28 96 55 40 28 17 20
-36 -13z"/>
<path d="M436 3458 c3 -4 -10 -15 -28 -24 -42 -21 -190 -114 -203 -127 -11
-11 16 4 155 88 111 67 116 71 91 71 -11 0 -17 -4 -15 -8z"/>
<path d="M140 3275 c-25 -13 -41 -24 -37 -25 11 0 87 39 87 45 0 7 0 7 -50
-20z"/>
<path d="M40 3230 c-8 -5 -10 -10 -5 -10 6 0 17 5 25 10 8 5 11 10 5 10 -5 0
-17 -5 -25 -10z"/>
<path d="M4859 3072 c13 -10 77 -33 142 -49 96 -25 119 -28 119 -17 0 17 7 14
-140 49 -63 15 -122 29 -130 32 -8 2 -4 -4 9 -15z"/>
<path d="M0 2940 c0 -17 8 -20 68 -23 l67 -3 -67 -2 -68 -2 1 -85 c0 -47 2
-85 4 -85 1 0 40 7 85 16 45 8 86 14 92 12 6 -2 -33 -12 -86 -22 -94 -18 -96
-19 -96 -46 0 -19 6 -30 18 -33 16 -4 16 -5 0 -6 -12 -1 -18 -9 -18 -26 0 -30
15 -31 88 -10 41 12 52 20 52 36 0 24 23 21 28 -4 6 -28 -33 -54 -102 -67
l-66 -14 0 -59 c0 -51 2 -58 18 -53 59 17 295 66 299 63 4 -5 -59 -21 -245
-62 l-72 -17 0 -38 0 -39 32 10 c18 5 40 9 48 8 8 -1 -5 -6 -29 -13 -25 -6
-46 -17 -49 -24 -5 -17 -3 -17 220 38 214 52 234 62 223 110 -21 87 -162 324
-237 398 -48 46 -88 62 -160 62 -41 0 -48 -3 -48 -20z m188 -55 c43 -36 208
-285 189 -285 -2 0 -25 35 -49 78 -61 104 -134 199 -167 217 -14 8 -21 14 -14
15 6 0 25 -11 41 -25z m-63 -54 c-11 -5 -40 -11 -65 -14 l-45 -6 50 14 c56 15
91 18 60 6z m108 -148 c-7 -2 -21 -2 -30 0 -10 3 -4 5 12 5 17 0 24 -2 18 -5z
m-166 -9 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m223 -63 c-8
-5 -37 -12 -65 -15 l-50 -6 50 14 c28 8 57 14 65 15 13 0 13 -1 0 -8z m120
-76 c0 -5 -5 -3 -10 5 -5 8 -10 20 -10 25 0 6 5 3 10 -5 5 -8 10 -19 10 -25z
m2 -67 c-6 -6 -7 0 -4 19 5 21 7 23 10 9 2 -10 0 -22 -6 -28z m-152 -44 c-74
-18 -142 -33 -150 -33 -20 2 240 67 265 67 11 0 -41 -15 -115 -34z"/>
<path d="M4987 2593 c3 -10 12 -27 20 -38 7 -11 13 -27 13 -36 0 -10 18 -26
43 -38 54 -26 57 -26 57 2 0 17 -12 28 -52 47 -89 43 -95 88 -7 56 28 -9 53
-15 55 -13 8 8 -75 37 -106 37 -24 0 -28 -3 -23 -17z m98 -88 c39 -17 21 -18
-25 0 -19 7 -28 14 -20 14 8 0 29 -6 45 -14z"/>
<path d="M478 2383 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M388 2363 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M208 2323 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M158 2313 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M425 2313 c-44 -10 -333 -74 -377 -84 -46 -10 -48 -12 -48 -45 0 -19
3 -34 8 -34 4 0 88 18 187 39 190 41 273 56 265 48 -3 -2 -107 -26 -232 -53
-151 -32 -228 -53 -228 -61 0 -7 4 -13 8 -13 5 0 9 -7 9 -15 0 -8 -4 -12 -9
-9 -4 3 -8 -34 -8 -81 0 -78 2 -86 18 -81 9 3 156 37 327 76 171 40 313 75
318 79 8 8 -30 126 -57 178 -24 47 -53 63 -111 62 -27 -1 -59 -3 -70 -6z m117
-120 c10 -9 18 -25 18 -35 0 -26 -18 -58 -33 -58 -8 0 -9 3 -1 8 6 4 14 21 17
39 7 33 -3 47 -38 56 -19 4 -19 5 -1 6 11 0 28 -6 38 -16z m-74 -13 c-7 -10
-14 -17 -17 -15 -4 4 18 35 25 35 2 0 -1 -9 -8 -20z m49 -7 c-13 -3 -17 -11
-14 -24 3 -10 1 -17 -4 -13 -5 3 -9 14 -9 25 0 13 6 19 23 18 18 -1 19 -2 4
-6z m-124 -26 c3 -8 -1 -14 -9 -14 -7 0 -11 4 -8 9 3 4 0 8 -7 8 -6 0 -9 -8
-6 -20 5 -21 -7 -28 -18 -10 -8 13 13 40 30 40 7 0 15 -6 18 -13z m-218 -64
c8 -24 10 -43 6 -43 -9 0 -32 78 -30 102 1 14 1 13 24 -59z m315 23 c0 -6 -7
-1 -15 10 -8 10 -15 23 -15 28 0 6 7 1 15 -10 8 -10 15 -23 15 -28z m-207 -16
c3 -11 1 -18 -4 -14 -5 3 -9 12 -9 20 0 20 7 17 13 -6z m-40 -37 c-7 -2 -19
-2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-113 -22 c-18 -10 -97 -25 -89
-17 5 5 73 23 94 25 6 0 3 -3 -5 -8z"/>
<path d="M68 2293 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M5025 2293 c-124 -30 -152 -134 -68 -255 14 -21 30 -38 35 -38 5 0 6
5 3 10 -3 6 21 -4 54 -22 33 -18 56 -34 51 -36 -5 -2 -27 9 -50 23 -23 15 -44
24 -47 21 -6 -6 63 -50 93 -60 20 -6 21 -3 23 62 2 58 -1 71 -20 88 -28 25
-49 67 -49 99 0 29 0 29 35 13 28 -13 32 -25 10 -30 -13 -2 -12 -6 5 -16 19
-12 20 -10 20 62 0 68 -2 74 -22 80 -25 6 -43 6 -73 -1z"/>
<path d="M18 2283 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M340 1984 c-173 -41 -321 -76 -327 -79 -8 -2 -13 -22 -13 -46 0 -40
1 -41 28 -34 210 55 441 107 494 112 81 7 154 -10 170 -41 20 -37 22 -212 4
-306 -31 -155 -43 -186 -79 -208 -26 -16 -209 -87 -362 -140 -26 -9 -27 -11
-7 -11 25 -1 344 113 379 135 40 25 53 58 79 205 19 109 24 163 20 224 -6 100
-44 265 -59 264 -7 -1 -154 -34 -327 -75z"/>
<path d="M305 1800 c-250 -65 -240 -61 -243 -97 -4 -42 13 -73 41 -73 37 0
379 97 393 112 11 11 11 18 0 40 -8 15 -12 28 -10 31 2 2 -11 2 -29 1 -17 -2
-23 -1 -12 2 26 8 44 24 25 24 -8 -1 -82 -18 -165 -40z m112 4 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-40 -10 c-3 -3 -12 -4 -19 -1 -8 3
-5 6 6 6 11 1 17 -2 13 -5z m-52 -14 c-11 -5 -27 -9 -35 -9 -9 0 -8 4 5 9 11
5 27 9 35 9 9 0 8 -4 -5 -9z m135 -21 c0 -4 -16 -10 -36 -13 -19 -4 -42 -10
-50 -13 -8 -3 -14 0 -14 7 0 6 5 8 10 5 6 -3 10 -1 10 5 0 6 5 8 10 5 17 -10
50 5 50 23 0 15 2 15 10 2 5 -8 10 -18 10 -21z m-193 5 c-3 -3 -12 -4 -19 -1
-8 3 -5 6 6 6 11 1 17 -2 13 -5z m-37 -14 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11
10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z m-42 -7 c-1 -5 2 -20 6 -34 6 -21 12
-25 34 -22 23 3 24 2 7 -5 -11 -5 -33 -12 -50 -16 -28 -7 -28 -6 -11 7 18 13
18 16 3 45 -13 27 -13 32 -1 32 8 0 13 -3 12 -7z m120 -27 c36 4 36 4 7 -6
-34 -11 -55 -7 -54 12 0 9 2 10 5 1 3 -7 19 -10 42 -7z m-162 -14 c2 -8 0 -8
-3 -1 -4 8 -7 8 -13 -1 -5 -8 -9 -7 -14 5 -4 12 -1 16 11 13 9 -2 18 -9 19
-16z m-16 -45 c17 -4 14 -5 -9 -4 -26 2 -36 7 -43 27 l-8 25 17 -22 c10 -12
29 -24 43 -26z"/>
<path d="M455 1684 c-44 -14 -142 -42 -218 -63 -76 -22 -141 -42 -145 -45 -6
-7 42 -164 64 -208 8 -15 27 -34 43 -43 26 -13 35 -13 83 1 97 29 304 114 325
133 21 20 19 44 -12 219 -7 40 -27 41 -140 6z m126 -74 c9 -30 19 -73 22 -95
l6 -40 -14 33 c-8 17 -19 32 -23 32 -5 0 -21 23 -36 51 -16 28 -34 53 -41 55
-12 5 -252 -60 -263 -71 -3 -3 2 -32 11 -65 23 -81 20 -99 -3 -25 -23 69 -24
91 -9 101 27 16 277 83 304 81 26 -2 31 -7 46 -57z m-446 -40 c-3 -5 -12 -10
-18 -10 -7 0 -6 4 3 10 19 12 23 12 15 0z m299 -8 c2 -4 -5 -9 -17 -9 -17 -2
-19 0 -7 7 18 12 18 12 24 2z m-279 -32 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10
0 6 2 10 4 10 3 0 8 -4 11 -10z m265 -2 c-14 -6 -37 -17 -52 -24 -15 -7 -30
-9 -33 -4 -3 5 16 15 42 23 57 18 78 20 43 5z m165 -47 c-2 -5 -30 -16 -62
-26 -32 -10 -98 -33 -146 -52 -49 -18 -93 -31 -97 -28 -5 3 -11 1 -15 -5 -3
-5 -14 -10 -23 -9 -12 0 -10 3 7 10 14 6 21 15 18 23 -8 20 165 77 211 69 34
-6 92 13 92 29 0 5 5 6 10 3 6 -4 8 -10 5 -14z m-380 -119 c-3 -3 -11 0 -18 7
-9 10 -8 11 6 5 10 -3 15 -9 12 -12z"/>
<path d="M5040 1602 c0 -4 18 -26 40 -47 35 -34 40 -36 40 -18 0 13 -15 30
-40 47 -22 14 -40 23 -40 18z"/>
<path d="M1100 1245 c19 -19 36 -35 39 -35 3 0 -10 16 -29 35 -19 19 -36 35
-39 35 -3 0 10 -16 29 -35z"/>
<path d="M4373 1268 c-13 -6 -23 -14 -23 -17 0 -4 19 -25 43 -46 l42 -40 -39
42 -40 42 35 15 c19 9 27 15 19 15 -8 0 -25 -5 -37 -11z"/>
<path d="M4470 1276 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4537 1213 c48 -62 48 -60 -14 -91 l-57 -29 3 -89 c1 -49 5 -91 7
-93 2 -2 24 4 48 13 42 16 45 20 55 67 6 28 11 68 11 89 l0 39 -55 -25 c-62
-27 -65 -28 -65 -16 0 5 27 21 60 37 33 16 60 32 60 35 0 9 -69 100 -76 100
-3 0 7 -17 23 -37z"/>
<path d="M880 1186 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M940 1116 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M1000 1046 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4581 926 c-13 -74 -8 -163 9 -137 11 19 32 5 168 -104 64 -52 120
-91 124 -89 4 3 8 1 8 -5 0 -5 28 -29 63 -53 34 -24 86 -61 115 -82 l53 -39
-2 72 c-1 39 -4 69 -7 67 -2 -3 -15 8 -29 25 -24 28 -51 41 -37 17 5 -9 2 -9
-9 1 -20 16 -23 25 -4 15 6 -4 3 2 -7 14 -23 26 -45 30 -25 5 13 -16 12 -17
-3 -4 -10 7 -16 17 -13 21 3 5 -32 39 -77 76 -71 58 -191 163 -289 251 l-25
23 -13 -74z m149 -73 c0 -8 -9 0 -50 45 l-45 47 48 -45 c26 -24 47 -45 47 -47z
m56 -45 l29 -33 -32 29 c-31 28 -38 36 -30 36 2 0 16 -15 33 -32z m64 -53 c13
-14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z
m55 -45 c10 -11 16 -20 13 -20 -3 0 -13 9 -23 20 -10 11 -16 20 -13 20 3 0 13
-9 23 -20z m176 -137 c13 -16 12 -17 -3 -4 -17 13 -22 21 -14 21 2 0 10 -8 17
-17z"/>
<path d="M4050 966 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21
13z"/>
<path d="M4530 903 c-14 -7 -32 -11 -42 -9 -12 3 -17 -5 -20 -31 -4 -32 -3
-34 21 -28 34 9 51 23 62 53 12 31 10 32 -21 15z"/>
<path d="M4107 890 c30 -47 106 -140 114 -140 6 0 -8 21 -30 48 -57 68 -95
109 -84 92z"/>
<path d="M478 844 c-113 -36 -125 -47 -95 -88 12 -17 18 -16 118 14 57 18 107
35 112 39 11 10 -3 71 -17 70 -6 0 -59 -16 -118 -35z"/>
<path d="M555 690 c-65 -22 -79 -31 -77 -46 6 -40 84 -274 93 -280 11 -6 107
23 128 39 9 8 11 24 7 57 -9 62 -54 242 -63 251 -5 3 -44 -6 -88 -21z"/>
<path d="M1 313 l-1 -263 46 0 c33 0 45 4 41 13 -61 137 -61 136 -63 297 -2
85 -8 169 -13 185 -6 21 -10 -51 -10 -232z"/>
<path d="M1531 566 c2 -2 76 -61 164 -131 88 -71 205 -166 260 -213 68 -58 85
-70 55 -38 -71 75 -453 386 -475 386 -4 0 -6 -2 -4 -4z"/>
<path d="M4820 459 c-117 -70 -119 -73 -90 -104 29 -31 32 -31 83 4 23 15 60
37 82 48 38 20 41 20 71 4 l32 -17 -80 -48 c-77 -46 -80 -47 -105 -31 -42 28
-36 10 9 -27 55 -44 74 -54 123 -61 24 -4 32 -3 20 2 -18 7 -17 8 6 14 37 9
149 84 149 100 0 12 -112 101 -185 147 l-31 19 -84 -50z m121 4 c21 -16 39
-32 39 -37 0 -5 -10 0 -22 11 -13 11 -34 27 -48 36 -13 10 -21 17 -16 17 4 0
25 -12 47 -27z"/>
<path d="M4623 383 c-30 -12 -6 -43 95 -122 131 -102 189 -133 256 -139 40 -3
61 2 95 20 25 13 47 30 49 38 4 12 1 11 -19 -1 -77 -50 -131 -44 -220 26 -60
47 -81 57 -58 28 13 -16 12 -17 -3 -4 -10 7 -16 17 -13 21 4 7 -159 142 -168
139 -1 0 -8 -3 -14 -6z"/>
<path d="M141 349 c-2 -32 38 -166 69 -237 37 -82 61 -99 28 -19 -12 28 -38
102 -59 162 -21 61 -38 103 -38 94z"/>
<path d="M5089 294 c-7 -8 -33 -26 -58 -39 -25 -13 -41 -24 -36 -24 13 -1 112
56 120 69 10 16 -11 12 -26 -6z"/>
<path d="M5082 108 c-35 -22 -39 -28 -19 -28 16 1 63 37 57 44 -3 3 -20 -4
-38 -16z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 864 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 873 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 875 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 KiB

View File

@ -89,10 +89,14 @@
<!-- JavaScripts--> <!-- JavaScripts-->
<!-- ===============================================--> <!-- ===============================================-->
<script src="{% static 'vendors/popper/popper.min.js' %}"></script> <script src="{% static 'vendors/popper/popper.min.js' %}"></script>
<!--1-->
<script src="{% static 'vendors/bootstrap/bootstrap.min.js' %}"></script> <script src="{% static 'vendors/bootstrap/bootstrap.min.js' %}"></script>
<script src="{% static 'vendors/anchorjs/anchor.min.js' %}"></script> <script src="{% static 'vendors/anchorjs/anchor.min.js' %}"></script>
<script src="{% static 'vendors/is/is.min.js' %}"></script> <script src="{% static 'vendors/is/is.min.js' %}"></script>
<!--2-->
<script src="{% static 'vendors/fontawesome/all.min.js' %}"></script> <script src="{% static 'vendors/fontawesome/all.min.js' %}"></script>
<script src="{% static 'vendors/lodash/lodash.min.js' %}"></script> <script src="{% static 'vendors/lodash/lodash.min.js' %}"></script>
<script src="{% static 'vendors/list.js/list.min.js' %}"></script> <script src="{% static 'vendors/list.js/list.min.js' %}"></script>
<script src="{% static 'vendors/feather-icons/feather.min.js' %}"></script> <script src="{% static 'vendors/feather-icons/feather.min.js' %}"></script>

View File

@ -172,6 +172,7 @@
<li class="nav-item text-nowrap me-2" role="presentation"><a class="nav-link" id="notes-tab" data-bs-toggle="tab" href="#tab-notes" role="tab" aria-controls="tab-notes" aria-selected="false" tabindex="-1"> <span class="fa-solid fa-clipboard me-2 tab-icon-color fs-8"></span>{{ _("Notes") }}</a></li> <li class="nav-item text-nowrap me-2" role="presentation"><a class="nav-link" id="notes-tab" data-bs-toggle="tab" href="#tab-notes" role="tab" aria-controls="tab-notes" aria-selected="false" tabindex="-1"> <span class="fa-solid fa-clipboard me-2 tab-icon-color fs-8"></span>{{ _("Notes") }}</a></li>
<li class="nav-item text-nowrap me-2" role="presentation"><a class="nav-link" id="emails-tab" data-bs-toggle="tab" href="#tab-emails" role="tab" aria-controls="tab-emails" aria-selected="true"> <span class="fa-solid fa-envelope me-2 tab-icon-color fs-8"></span>{{ _("Emails") }}</a></li> <li class="nav-item text-nowrap me-2" role="presentation"><a class="nav-link" id="emails-tab" data-bs-toggle="tab" href="#tab-emails" role="tab" aria-controls="tab-emails" aria-selected="true"> <span class="fa-solid fa-envelope me-2 tab-icon-color fs-8"></span>{{ _("Emails") }}</a></li>
<li class="nav-item text-nowrap me-2" role="presentation"><a class="nav-link" id="tasks-tab" data-bs-toggle="tab" href="#tab-tasks" role="tab" aria-controls="tab-tasks" aria-selected="true"> <span class="fa-solid fa-envelope me-2 tab-icon-color fs-8"></span>{{ _("Tasks") }}</a></li> <li class="nav-item text-nowrap me-2" role="presentation"><a class="nav-link" id="tasks-tab" data-bs-toggle="tab" href="#tab-tasks" role="tab" aria-controls="tab-tasks" aria-selected="true"> <span class="fa-solid fa-envelope me-2 tab-icon-color fs-8"></span>{{ _("Tasks") }}</a></li>
{% if perms.inventory.change_lead%}
<li class="nav-item text-nowrap ml-auto" role="presentation"> <li class="nav-item text-nowrap ml-auto" role="presentation">
<button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#exampleModal"> <i class="fa-solid fa-user-plus me-2"></i> Reassign Lead</button> <button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#exampleModal"> <i class="fa-solid fa-user-plus me-2"></i> Reassign Lead</button>
<button class="btn btn-phoenix-primary btn-sm" onclick="openActionModal('{{ lead.id }}', '{{ lead.action }}', '{{ lead.next_action }}', '{{ lead.next_action_date|date:"Y-m-d\TH:i" }}')"> <button class="btn btn-phoenix-primary btn-sm" onclick="openActionModal('{{ lead.id }}', '{{ lead.action }}', '{{ lead.next_action }}', '{{ lead.next_action_date|date:"Y-m-d\TH:i" }}')">
@ -199,12 +200,15 @@
</div> </div>
</div> </div>
</li> </li>
{% endif %}
</ul> </ul>
<div class="tab-content" id="myTabContent"> <div class="tab-content" id="myTabContent">
<div class="tab-pane fade" id="tab-activity" role="tabpanel" aria-labelledby="activity-tab"> <div class="tab-pane fade" id="tab-activity" role="tabpanel" aria-labelledby="activity-tab">
<div class="mb-1 d-flex justify-content-between align-items-center"> <div class="mb-1 d-flex justify-content-between align-items-center">
<h3 class="mb-4" id="s crollspyTask">{{ _("Activities") }} <span class="fw-light fs-7">({{ activities.count}})</span></h3> <h3 class="mb-4" id="s crollspyTask">{{ _("Activities") }} <span class="fw-light fs-7">({{ activities.count}})</span></h3>
{% if perms.inventory.change_lead%}
<button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#activityModal"><span class="fas fa-plus me-1"></span>{{ _("Add Activity") }}</button> <button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#activityModal"><span class="fas fa-plus me-1"></span>{{ _("Add Activity") }}</button>
{% endif %}
</div> </div>
<div class="row justify-content-between align-items-md-center hover-actions-trigger btn-reveal-trigger border-translucent py-3 gx-0 border-top"> <div class="row justify-content-between align-items-md-center hover-actions-trigger btn-reveal-trigger border-translucent py-3 gx-0 border-top">
<div class="col-12 col-lg-auto"> <div class="col-12 col-lg-auto">
@ -252,7 +256,9 @@
<div class="tab-pane fade active show" id="tab-opportunity" role="tabpanel" aria-labelledby="opportunity-tab"> <div class="tab-pane fade active show" id="tab-opportunity" role="tabpanel" aria-labelledby="opportunity-tab">
<div class="mb-1 d-flex justify-content-between align-items-center"> <div class="mb-1 d-flex justify-content-between align-items-center">
<h3 class="mb-4" id="scrollspyTask">{{ _("Opportunities") }} <span class="fw-light fs-7">({{ lead.get_opportunities.count}})</span></h3> <h3 class="mb-4" id="scrollspyTask">{{ _("Opportunities") }} <span class="fw-light fs-7">({{ lead.get_opportunities.count}})</span></h3>
{% if perms.inventory.add_opportunity%}
<a href="{% url 'lead_opportunity_create' request.dealer.slug lead.slug %}" class="btn btn-phoenix-primary btn-sm" type="button"> <i class="fa-solid fa-plus me-2"></i>{{ _("Add Opportunity") }}</a> <a href="{% url 'lead_opportunity_create' request.dealer.slug lead.slug %}" class="btn btn-phoenix-primary btn-sm" type="button"> <i class="fa-solid fa-plus me-2"></i>{{ _("Add Opportunity") }}</a>
{% endif%}
</div> </div>
<div class="border-top border-bottom border-translucent" id="leadDetailsTable"> <div class="border-top border-bottom border-translucent" id="leadDetailsTable">
@ -284,7 +290,9 @@
<div class="tab-pane fade" id="tab-notes" role="tabpanel" aria-labelledby="notes-tab"> <div class="tab-pane fade" id="tab-notes" role="tabpanel" aria-labelledby="notes-tab">
<div class="mb-1 d-flex align-items-center justify-content-between"> <div class="mb-1 d-flex align-items-center justify-content-between">
<h3 class="mb-4" id="scrollspyNotes">{{ _("Notes") }}</h3> <h3 class="mb-4" id="scrollspyNotes">{{ _("Notes") }}</h3>
{% if perms.inventory.change_lead%}
<button class="btn btn-phoenix-primary btn-sm" type="button" onclick="reset_form()" data-bs-toggle="modal" data-bs-target="#noteModal"><span class="fas fa-plus me-1"></span>{{ _("Add Note") }}</button> <button class="btn btn-phoenix-primary btn-sm" type="button" onclick="reset_form()" data-bs-toggle="modal" data-bs-target="#noteModal"><span class="fas fa-plus me-1"></span>{{ _("Add Note") }}</button>
{% endif %}
</div> </div>
<div class="border-top border-bottom border-translucent" id="leadDetailsTable"> <div class="border-top border-bottom border-translucent" id="leadDetailsTable">
@ -340,12 +348,14 @@
<div class="tab-pane fade" id="tab-emails" role="tabpanel" aria-labelledby="emails-tab"> <div class="tab-pane fade" id="tab-emails" role="tabpanel" aria-labelledby="emails-tab">
<div class="mb-1 d-flex justify-content-between align-items-center"> <div class="mb-1 d-flex justify-content-between align-items-center">
<h3 class="mb-0" id="scrollspyEmails">{{ _("Emails") }}</h3> <h3 class="mb-0" id="scrollspyEmails">{{ _("Emails") }}</h3>
{% if perms.inventory.change_lead%}
<a href="{% url 'send_lead_email' request.dealer.slug lead.slug %}"> <a href="{% url 'send_lead_email' request.dealer.slug lead.slug %}">
<button type="button" class="btn btn-sm btn-phoenix-primary"> <button type="button" class="btn btn-sm btn-phoenix-primary">
<span class="fas fa-plus me-1"></span> <span class="fas fa-plus me-1"></span>
{% trans 'Send Email' %} {% trans 'Send Email' %}
</button> </button>
</a> </a>
{% endif %}
</div> </div>
<div> <div>
<div class="scrollbar"> <div class="scrollbar">
@ -462,7 +472,9 @@
<div class="tab-pane fade" id="tab-tasks" role="tabpanel" aria-labelledby="tasks-tab"> <div class="tab-pane fade" id="tab-tasks" role="tabpanel" aria-labelledby="tasks-tab">
<div class="mb-1 d-flex justify-content-between align-items-center"> <div class="mb-1 d-flex justify-content-between align-items-center">
<h3 class="mb-0" id="scrollspyEmails">{{ _("Tasks") }}</h3> <h3 class="mb-0" id="scrollspyEmails">{{ _("Tasks") }}</h3>
{% if perms.inventory.change_lead%}
<button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#taskModal"><span class="fas fa-plus me-1"></span>{{ _("Add Task") }}</button> <button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#taskModal"><span class="fas fa-plus me-1"></span>{{ _("Add Task") }}</button>
{% endif %}
</div> </div>
<div> <div>

View File

@ -212,18 +212,23 @@
{% if perms.inventory.change_lead %} {% if perms.inventory.change_lead %}
<a href="{% url 'lead_update' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Edit" %}</a> <a href="{% url 'lead_update' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Edit" %}</a>
{% endif %} {% endif %}
{% if perms.inventory.change_lead%}
<button class="dropdown-item text-primary" onclick="openActionModal('{{ lead.pk }}', '{{ lead.action }}', '{{ lead.next_action }}', '{{ lead.next_action_date|date:"Y-m-d\TH:i" }}')"> <button class="dropdown-item text-primary" onclick="openActionModal('{{ lead.pk }}', '{{ lead.action }}', '{{ lead.next_action }}', '{{ lead.next_action_date|date:"Y-m-d\TH:i" }}')">
{% trans "Update Actions" %} {% trans "Update Actions" %}
</button> </button>
<a href="{% url 'send_lead_email' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Send Email" %}</a> <a href="{% url 'send_lead_email' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Send Email" %}</a>
<a href="{% url 'schedule_lead' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Schedule Event" %}</a> <a href="{% url 'schedule_lead' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Schedule Event" %}</a>
{% endif %}
{% if not lead.opportunity %} {% if not lead.opportunity %}
{% if perms.inventory.add_opportunity%}
<a href="{% url 'lead_opportunity_create' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Convert to Opportunity" %}</a> <a href="{% url 'lead_opportunity_create' request.dealer.slug lead.slug %}" class="dropdown-item text-success-dark">{% trans "Convert to Opportunity" %}</a>
{% endif %}
{% endif %} {% endif %}
<div class="dropdown-divider"></div>
{% if perms.inventory.delete_lead %} {% if perms.inventory.delete_lead %}
<div class="dropdown-divider"></div>
<button class="dropdown-item text-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">{% trans "Delete" %}</button> <button class="dropdown-item text-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">{% trans "Delete" %}</button>
{% endif %} {%endif%}
</div> </div>
</div> </div>
{% endif %} {% endif %}

View File

@ -13,14 +13,22 @@
<ul class="dropdown-menu dropdown-menu-end p-0" style="z-index: 9999;"> <ul class="dropdown-menu dropdown-menu-end p-0" style="z-index: 9999;">
<li> <li>
{% if opportunity.estimate %} {% if opportunity.estimate %}
{% if perms.django_ledger.view_estimatemodel%}
<a class="dropdown-item" href="{% url 'estimate_detail' request.dealer.slug opportunity.estimate.pk %}">{{ _("View Quotation")}}</a> <a class="dropdown-item" href="{% url 'estimate_detail' request.dealer.slug opportunity.estimate.pk %}">{{ _("View Quotation")}}</a>
{% endif %}
{% else %} {% else %}
{%if perms.django_ledger.add_estimatemodel%}
<a class="dropdown-item" href="{% url 'estimate_create_from_opportunity' request.dealer.slug opportunity.slug %}">{{ _("Create Quotation")}}</a> <a class="dropdown-item" href="{% url 'estimate_create_from_opportunity' request.dealer.slug opportunity.slug %}">{{ _("Create Quotation")}}</a>
{% endif %}
{% endif %} {% endif %}
</li> </li>
{% if perms.inventory.change_opportunity%}
<li><a class="dropdown-item" href="{% url 'update_opportunity' request.dealer.slug opportunity.slug %}">Update Opportunity</a></li> <li><a class="dropdown-item" href="{% url 'update_opportunity' request.dealer.slug opportunity.slug %}">Update Opportunity</a></li>
<li><a class="dropdown-item" href="{% url 'update_opportunity' request.dealer.slug opportunity.slug %}">Update Stage</a></li> <li><a class="dropdown-item" href="{% url 'update_opportunity' request.dealer.slug opportunity.slug %}">Update Stage</a></li>
{% endif %}
{% if perms.inventory.delete_opportunity%}
<li><a class="dropdown-item text-danger" href="">Delete Opportunity</a></li> <li><a class="dropdown-item text-danger" href="">Delete Opportunity</a></li>
{% endif %}
</ul> </ul>
</div> </div>
</div> </div>
@ -348,9 +356,11 @@
</form> </form>
</div> </div>
</div> </div>
{%if perms.inventory.change_opportunity%}
<div class="col-auto"> <div class="col-auto">
<button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#activityModal"><span class="fas fa-plus me-1"></span>{{ _("Add Activity") }}</button> <button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#activityModal"><span class="fas fa-plus me-1"></span>{{ _("Add Activity") }}</button>
</div> </div>
{% endif %}
</div> </div>
{% for activity in opportunity.get_activities %} {% for activity in opportunity.get_activities %}
<div class="border-bottom border-translucent py-4"> <div class="border-bottom border-translucent py-4">
@ -392,11 +402,13 @@
</div> </div>
<div class="tab-pane fade" id="tab-notes" role="tabpanel" aria-labelledby="notes-tab"> <div class="tab-pane fade" id="tab-notes" role="tabpanel" aria-labelledby="notes-tab">
<h2 class="mb-4">Notes</h2> <h2 class="mb-4">Notes</h2>
{%if perms.inventory.change_opportunity%}
<form action="{% url 'add_note_to_opportunity' request.dealer.slug opportunity.slug %}" method="post"> <form action="{% url 'add_note_to_opportunity' request.dealer.slug opportunity.slug %}" method="post">
{% csrf_token %} {% csrf_token %}
<textarea class="form-control mb-3" id="notes" rows="4" name="notes" required> </textarea> <textarea class="form-control mb-3" id="notes" rows="4" name="notes" required> </textarea>
<button type="submit" class="btn btn-phoenix-primary mb-3">Add Note</button> <button type="submit" class="btn btn-phoenix-primary mb-3">Add Note</button>
</form> </form>
{% endif %}
<div class="row gy-4 note-list"> <div class="row gy-4 note-list">
<div class="col-12 col-xl-auto flex-1"> <div class="col-12 col-xl-auto flex-1">
{% for note in opportunity.get_notes %} {% for note in opportunity.get_notes %}
@ -427,9 +439,11 @@
<p class="mb-0 fs-9 text-body-tertiary fw-bold"><span class="fas fa-filter me-1 fw-extra-bold fs-10"></span>23 tasks</p> <p class="mb-0 fs-9 text-body-tertiary fw-bold"><span class="fas fa-filter me-1 fw-extra-bold fs-10"></span>23 tasks</p>
<button class="btn btn-link p-0 ms-3 fs-9 text-primary fw-bold text-decoration-none"><span class="fas fa-sort me-1 fw-extra-bold fs-10"></span>Sorting</button> <button class="btn btn-link p-0 ms-3 fs-9 text-primary fw-bold text-decoration-none"><span class="fas fa-sort me-1 fw-extra-bold fs-10"></span>Sorting</button>
</div> </div>
{% if perms.inventory.change_opportunity%}
<div class="col-auto"> <div class="col-auto">
<a href="{% url 'schedule_lead' request.dealer.slug opportunity.lead.slug %}" class="btn btn-phoenix-primary"><span class="fa-solid fa-plus me-2"></span>Add Meeting </a> <a href="{% url 'schedule_lead' request.dealer.slug opportunity.lead.slug %}" class="btn btn-phoenix-primary"><span class="fa-solid fa-plus me-2"></span>Add Meeting </a>
</div> </div>
{% endif %}
</div> </div>
<div class="row g-3"> <div class="row g-3">
{% for metting in opportunity.lead.get_meetings %} {% for metting in opportunity.lead.get_meetings %}
@ -454,10 +468,12 @@
<div class="col-auto d-flex flex-1"> <div class="col-auto d-flex flex-1">
<h2 class="mb-0">Call</h2> <h2 class="mb-0">Call</h2>
</div> </div>
{% if perms.inventory.change_opportunity%}
<div class="col-auto"> <div class="col-auto">
<a href="{% url 'schedule_lead' request.dealer.slug opportunity.lead.slug %}" class="btn btn-phoenix-primary"><span class="fa-solid fa-plus me-2"></span>Add Call</a> <a href="{% url 'schedule_lead' request.dealer.slug opportunity.lead.slug %}" class="btn btn-phoenix-primary"><span class="fa-solid fa-plus me-2"></span>Add Call</a>
</div> </div>
{% endif %}
</div> </div>
<pre>{{opportunity.get_all_notes}}</pre> <pre>{{opportunity.get_all_notes}}</pre>
<div class="border-top border-bottom border-translucent" id="leadDetailsTable" data-list='{"valueNames":["name","description","create_date","create_by","last_activity"],"page":5,"pagination":true}'> <div class="border-top border-bottom border-translucent" id="leadDetailsTable" data-list='{"valueNames":["name","description","create_date","create_by","last_activity"],"page":5,"pagination":true}'>
@ -503,6 +519,7 @@
</div> </div>
<div class="tab-pane fade" id="tab-emails" role="tabpanel" aria-labelledby="emails-tab"> <div class="tab-pane fade" id="tab-emails" role="tabpanel" aria-labelledby="emails-tab">
<h2 class="mb-4">Emails</h2> <h2 class="mb-4">Emails</h2>
{% if perms.inventory.change_opportunity%}
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<a href="{% url 'send_lead_email' request.dealer.slug opportunity.lead.slug %}"> <a href="{% url 'send_lead_email' request.dealer.slug opportunity.lead.slug %}">
<button type="button" class="btn btn-sm btn-phoenix-primary"> <button type="button" class="btn btn-sm btn-phoenix-primary">
@ -511,6 +528,7 @@
</button> </button>
</a> </a>
</div> </div>
{% endif %}
<div> <div>
<div class="scrollbar"> <div class="scrollbar">
<ul class="nav nav-underline fs-9 flex-nowrap mb-1" id="emailTab" role="tablist"> <ul class="nav nav-underline fs-9 flex-nowrap mb-1" id="emailTab" role="tablist">
@ -580,7 +598,9 @@
<div class="tab-pane fade" id="tab-tasks" role="tabpanel" aria-labelledby="tasks-tab"> <div class="tab-pane fade" id="tab-tasks" role="tabpanel" aria-labelledby="tasks-tab">
<div class="mb-1 d-flex justify-content-between align-items-center"> <div class="mb-1 d-flex justify-content-between align-items-center">
<h3 class="mb-0" id="scrollspyEmails">{{ _("Tasks") }}</h3> <h3 class="mb-0" id="scrollspyEmails">{{ _("Tasks") }}</h3>
{% if perms.inventory.change_opportunity%}
<button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#taskModal"><span class="fas fa-plus me-1"></span>{{ _("Add Task") }}</button> <button class="btn btn-phoenix-primary btn-sm" type="button" data-bs-toggle="modal" data-bs-target="#taskModal"><span class="fas fa-plus me-1"></span>{{ _("Add Task") }}</button>
{% endif %}
</div> </div>
<div> <div>

View File

@ -77,12 +77,13 @@
</div> </div>
</div> </div>
</div> </div>
{% if perms.inventory.add_opportunity %}
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<a class="btn btn-phoenix-primary btn-sm" href="{% url 'opportunity_create' request.dealer.slug %}"> <a class="btn btn-phoenix-primary btn-sm" href="{% url 'opportunity_create' request.dealer.slug %}">
<span class="fas fa-plus me-2"></span>{{ _("Add Opportunity") }} <span class="fas fa-plus me-2"></span>{{ _("Add Opportunity") }}
</a> </a>
</div> </div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -119,12 +119,16 @@
</div> </div>
<div class="d-flex gap-2"> <div class="d-flex gap-2">
{% if perms.inventory.view_opportunity%}
<a class="btn btn-sm btn-phoenix-primary" href="{% url 'opportunity_detail' request.dealer.slug opportunity.slug %}"> <a class="btn btn-sm btn-phoenix-primary" href="{% url 'opportunity_detail' request.dealer.slug opportunity.slug %}">
<i class="fa-solid fa-eye ms-2"></i>{{ _("View") }} <i class="fa-solid fa-eye ms-2"></i>{{ _("View") }}
</a> </a>
{% endif %}
{%if perms.inventory.change_opportunity%}
<a class="btn btn-sm btn-phoenix-success" href="{% url 'update_opportunity' request.dealer.slug opportunity.slug %}"> <a class="btn btn-sm btn-phoenix-success" href="{% url 'update_opportunity' request.dealer.slug opportunity.slug %}">
<i class="fa-solid fa-pen ms-2"></i> {{ _("Update") }} <i class="fa-solid fa-pen ms-2"></i> {{ _("Update") }}
</a> </a>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -10,7 +10,7 @@
<div class="row g-3 justify-content-between mb-4"> <div class="row g-3 justify-content-between mb-4">
<div class="col-auto"> <div class="col-auto">
<div class="d-md-flex justify-content-between"> <div class="d-md-flex justify-content-between">
{% if perms.django_ledger.add_customermodel %} {% if perms.inventory.add_customer %}
<div> <div>
<a href="{% url 'customer_create' request.dealer.slug %}" class="btn btn-sm btn-phoenix-primary me-4"><span class="fas fa-plus me-2"></span>{{ _("Add Customer") }}</a> <a href="{% url 'customer_create' request.dealer.slug %}" class="btn btn-sm btn-phoenix-primary me-4"><span class="fas fa-plus me-2"></span>{{ _("Add Customer") }}</a>
</div> </div>
@ -68,6 +68,7 @@
<td> <td>
</td> </td>
{% if perms.inventory.view_customer%}
<td class="name align-middle white-space-nowrap ps-0"> <td class="name align-middle white-space-nowrap ps-0">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div><a class="fs-8 fw-bold" href="{% url 'customer_detail' request.dealer.slug customer.slug %}">{{ customer.full_name }}</a> <div><a class="fs-8 fw-bold" href="{% url 'customer_detail' request.dealer.slug customer.slug %}">{{ customer.full_name }}</a>
@ -76,6 +77,7 @@
</div> </div>
</div> </div>
</td> </td>
{% endif %}
<td class="email align-middle white-space-nowrap fw-semibold ps-4 border-end border-translucent"><a class="text-body-highlight" href="">{{ customer.email }}</a></td> <td class="email align-middle white-space-nowrap fw-semibold ps-4 border-end border-translucent"><a class="text-body-highlight" href="">{{ customer.email }}</a></td>
<td class="phone align-middle white-space-nowrap fw-semibold ps-4 border-end border-translucent"><a class="text-body-highlight" href="tel:{{ customer.phone }}">{{ customer.phone_number }}</a></td> <td class="phone align-middle white-space-nowrap fw-semibold ps-4 border-end border-translucent"><a class="text-body-highlight" href="tel:{{ customer.phone }}">{{ customer.phone_number }}</a></td>
<td class="contact align-middle white-space-nowrap ps-4 border-end border-translucent fw-semibold text-body-highlight">{{ customer.national_id }}</td> <td class="contact align-middle white-space-nowrap ps-4 border-end border-translucent fw-semibold text-body-highlight">{{ customer.national_id }}</td>
@ -90,12 +92,12 @@
</td> </td>
<td class="date align-middle white-space-nowrap text-body-tertiary text-opacity-85 ps-4 text-body-tertiary">{{ customer.created|date }}</td> <td class="date align-middle white-space-nowrap text-body-tertiary text-opacity-85 ps-4 text-body-tertiary">{{ customer.created|date }}</td>
<td class="align-middle white-space-nowrap text-end pe-0 ps-4"> <td class="align-middle white-space-nowrap text-end pe-0 ps-4">
{% if perms.django_ledger.change_customermodel %} {% if perms.inventory.change_customer %}
<a href="{% url 'customer_update' request.dealer.slug customer.slug %}" class="btn btn-sm btn-phoenix-primary me-2" data-url="{% url 'customer_update' request.dealer.slug customer.slug %}"> <a href="{% url 'customer_update' request.dealer.slug customer.slug %}" class="btn btn-sm btn-phoenix-primary me-2" data-url="{% url 'customer_update' request.dealer.slug customer.slug %}">
<i class="fas fa-pen"></i> <i class="fas fa-pen"></i>
</a> </a>
{% endif %} {% endif %}
{% if perms.django_ledger.delete_customermodel %} {% if perms.inventory.delete_customer %}
<button class="btn btn-phoenix-danger btn-sm delete-btn" <button class="btn btn-phoenix-danger btn-sm delete-btn"
data-url="{% url 'customer_delete' request.dealer.slug customer.slug %}" data-url="{% url 'customer_delete' request.dealer.slug customer.slug %}"
data-message="{{ _("Are you sure you want to delete this customer")}}" data-message="{{ _("Are you sure you want to delete this customer")}}"

View File

@ -14,22 +14,25 @@
</div> </div>
<div class="col-auto"> <div class="col-auto">
<div class="row g-3"> <div class="row g-3">
<div class="col-auto">
{% if perms.inventory.change_customer %}
<a href="{% url 'customer_update' request.dealer.slug customer.slug %}" class="btn btn-sm btn-phoenix-primary"><span class="fa-solid fa-pen-to-square me-2"></span>{{_("Update")}}</a>
{% endif %}
</div>
{% if perms.inventory.delete_customer%}
<div class="col-auto"> <div class="col-auto">
{% if perms.django_ledger.delete_customermodel %}
<button class="btn btn-phoenix-danger btn-sm delete-btn" <button class="btn btn-phoenix-danger btn-sm delete-btn"
data-url="{% url 'customer_delete' request.dealer.slug customer.slug %}" data-url="{% url 'customer_delete' request.dealer.slug customer.slug %}"
data-message="Are you sure you want to delete this customer?" data-message="Are you sure you want to delete this customer?"
data-bs-toggle="modal" data-bs-target="#deleteModal"> data-bs-toggle="modal" data-bs-target="#deleteModal">
<i class="fas fa-trash me-1"> </i>{{ _("Delete") }} <i class="fas fa-trash me-1"> </i>{{ _("Delete") }}
</button> </button>
{% endif %}
</div> </div>
{% endif %}
<div class="col-auto">
{% if perms.django_ledger.change_customermodel %}
<a href="{% url 'customer_update' request.dealer.slug customer.slug %}" class="btn btn-sm btn-phoenix-primary"><span class="fa-solid fa-pen-to-square me-2"></span>{{_("Update")}}</a>
{% endif %}
</div>
</div> </div>
</div> </div>
</div> </div>
@ -84,16 +87,14 @@
<div class="col-12"> <div class="col-12">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
{% if perms.inventory.change_customer%}
<div class="d-flex align-items-center justify-content-end"> <div class="d-flex align-items-center justify-content-end">
<a id="addBtn" href="#" class="btn btn-sm btn-phoenix-primary mb-3" data-url="{% url 'add_note_to_customer' request.dealer.slug customer.slug %}" data-bs-toggle="modal" data-bs-target="#noteModal" data-note-title="{{ _("Add") }}<i class='fa fa-plus-circle text-success ms-2'></i>"> <a id="addBtn" href="#" class="btn btn-sm btn-phoenix-primary mb-3" data-url="{% url 'add_note_to_customer' request.dealer.slug customer.slug %}" data-bs-toggle="modal" data-bs-target="#noteModal" data-note-title="{{ _("Add") }}<i class='fa fa-plus-circle text-success ms-2'></i>">
<span class="fas fa-plus me-1"></span> <span class="fas fa-plus me-1"></span>
{% trans 'Add Note' %} {% trans 'Add Note' %}
</a> </a>
{% comment %} <a id="addBtn" class="btn btn-sm btn-phoenix-primary mb-3" hx-get="{% url 'add_note_to_customer' request.dealer.slug customer.slug %}" hx-target=".modal-body" hx-swap="innerHTML" hx-push-url="false" data-bs-toggle="modal" data-bs-target="#noteModal">
<span class="fas fa-plus me-1"></span>
{% trans 'Add Note' %}
</a> {% endcomment %}
</div> </div>
{% endif %}
<table class="table fs-9 mb-0 table-responsive"> <table class="table fs-9 mb-0 table-responsive">
<tr> <tr>
<th class="align-middle pe-6 text-start" scope="col">{{ _("Note") }}</th> <th class="align-middle pe-6 text-start" scope="col">{{ _("Note") }}</th>

View File

@ -1,5 +1,6 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load custom_filters %}
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% block title %}{% trans "Groups" %}{% endblock title %} {% block title %}{% trans "Groups" %}{% endblock title %}
@ -32,7 +33,7 @@
{% for group in groups %} {% for group in groups %}
<tr> <tr>
<td class="align-middle white-space-nowrap ps-1">{{ group.name }}</td> <td class="align-middle white-space-nowrap ps-1">{{ group.name }}</td>
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-users me-1"></i> {{ group.users.count }}</td> <td class="align-middle white-space-nowrap"><i class="fa-solid fa-users me-1"></i> {{ group.users.count}}</td>
<td class="align-middle white-space-nowrap"><i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}</td> <td class="align-middle white-space-nowrap"><i class="fa-solid fa-unlock me-1"></i> {{ group.permissions.count }}</td>
<td class="align-middle white-space-nowrap"> <td class="align-middle white-space-nowrap">
<a class="btn btn-phoenix-success" <a class="btn btn-phoenix-success"

View File

@ -23,10 +23,9 @@
</div> </div>
</div> </div>
<form method="post" novalidate> <form method="post" novalidate>
{% csrf_token %} {% csrf_token %}
<!-- Filter and Summary Section -->
<div class="row mb-4"> <div class="row mb-4">
<div class="col-md-6"> <div class="col-md-6">
<div class="input-group"> <div class="input-group">
@ -43,86 +42,83 @@
</div> </div>
</div> </div>
<!-- Permissions Grid --> <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4" id="permissionsGrid">
<!-- Permissions Grid --> {% for app_label, models in grouped_permissions.items %}
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4" id="permissionsGrid"> <div class="col"> {# This div opens for each app_label #}
{% for app_label, models in grouped_permissions.items %} <div class="card h-100 border-{% if app_label in group_permission_apps %}primary{% else %}light{% endif %}">
<div class="col"> <div class="card-header bg-{% if app_label in group_permission_apps %}primary text-white{% else %}light{% endif %}">
<div class="card h-100 border-{% if app_label in group_permission_apps %}primary{% else %}light{% endif %}"> <div class="d-flex justify-content-between align-items-center">
<div class="card-header bg-{% if app_label in group_permission_apps %}primary text-white{% else %}light{% endif %}"> <h5 class="card-title mb-0">
<div class="d-flex justify-content-between align-items-center"> <i class="fas fa-{% if app_label in group_permission_apps %}check-circle{% else %}cube{% endif %} me-2"></i>
<h5 class="card-title mb-0"> {{ app_label|capfirst }}
<i class="fas fa-{% if app_label in group_permission_apps %}check-circle{% else %}cube{% endif %} me-2"></i> </h5>
{{ app_label|capfirst }} <span class="badge bg-{% if app_label in group_permission_apps %}light text-primary{% else %}secondary{% endif %}">
</h5> {{ models|length }} {% trans "categories" %}
<span class="badge bg-{% if app_label in group_permission_apps %}light text-primary{% else %}secondary{% endif %}">
{{ models|length }} {% trans "categories" %}
</span>
</div>
</div>
<div class="card-body">
<div class="accordion" id="accordion-{{ app_label|slugify }}">
{% for model, perms in models.items %}
<div class="accordion-item border-0 mb-2">
<h6 class="accordion-header" id="heading-{{ app_label|slugify }}-{{ model|slugify }}">
<button class="accordion-button collapsed bg-white shadow-none py-2"
type="button"
data-bs-toggle="collapse"
data-bs-target="#collapse-{{ app_label|slugify }}-{{ model|slugify }}"
aria-expanded="false"
aria-controls="collapse-{{ app_label|slugify }}-{{ model|slugify }}">
<i class="fas fa-{% if model == 'Custom' %}star{% else %}table{% endif %} me-2"></i>
{{ model|capfirst }}
<span class="badge bg-{% if model in group_permission_models %}primary{% else %}secondary{% endif %} rounded-pill ms-2">
{{ perms|length }} / {{ perms|count_checked:group_permission_ids }}
</span> </span>
</button> </div>
</h6> </div>
<div id="collapse-{{ app_label|slugify }}-{{ model|slugify }}" <div class="card-body">
class="accordion-collapse collapse" <div class="accordion" id="accordion-{{ app_label|slugify }}">
aria-labelledby="heading-{{ app_label|slugify }}-{{ model|slugify }}" {% for model, perms in models.items %}
data-bs-parent="#accordion-{{ app_label|slugify }}"> <div class="accordion-item border-0 mb-2">
<div class="accordion-body pt-0 px-0"> <h6 class="accordion-header" id="heading-{{ app_label|slugify }}-{{ model|slugify }}">
<div class="list-group list-group-flush"> <button class="accordion-button collapsed bg-white shadow-none py-2"
{% for perm in perms %} type="button"
<label class="list-group-item d-flex gap-2 {% if perm.id in group_permission_ids %}bg-light-primary{% endif %}"> data-bs-toggle="collapse"
<input class="form-check-input flex-shrink-0 mt-0" data-bs-target="#collapse-{{ app_label|slugify }}-{{ model|slugify }}"
type="checkbox" aria-expanded="false"
name="permissions" aria-controls="collapse-{{ app_label|slugify }}-{{ model|slugify }}">
value="{{ perm.id }}" <i class="fas fa-{% if model == 'Custom' %}star{% else %}table{% endif %} me-2"></i>
id="perm_{{ perm.id }}" {{ model|capfirst }}
{% if perm.id in group_permission_ids %}checked{% endif %}> <span class="badge bg-{% if model in group_permission_models %}primary{% else %}secondary{% endif %} rounded-pill ms-2">
<span> {# This is where you might need the custom filter 'count_checked' #}
<span class="d-block fw-bold">{{ perm.name|capfirst }}</span> {{ perms|length }} / {{ perms|count_checked:group_permission_ids }}
<small class="d-block text-muted">{{ perm.codename }}</small>
{% if model == 'Custom' %}
<span class="badge bg-info mt-1">
<i class="fas fa-star me-1"></i>{% trans "Custom" %}
</span> </span>
{% elif perm.id in group_permission_ids %} </button>
<span class="badge bg-success mt-1"> </h6>
<i class="fas fa-check me-1"></i>{% trans "Assigned" %} <div id="collapse-{{ app_label|slugify }}-{{ model|slugify }}"
</span> class="accordion-collapse collapse"
{% endif %} aria-labelledby="heading-{{ app_label|slugify }}-{{ model|slugify }}"
</span> data-bs-parent="#accordion-{{ app_label|slugify }}">
</label> <div class="accordion-body pt-0 px-0">
{% endfor %} <div class="list-group list-group-flush">
{% for perm in perms %}
<label class="list-group-item d-flex gap-2 {% if perm.id in group_permission_ids %}bg-light-primary{% endif %}">
<input class="form-check-input flex-shrink-0 mt-0"
type="checkbox"
name="permissions"
value="{{ perm.id }}"
id="perm_{{ perm.id }}"
{% if perm.id in group_permission_ids %}checked{% endif %}>
<span>
<span class="d-block fw-bold">{{ perm.name|capfirst }}</span>
<small class="d-block text-muted">{{ perm.codename }}</small>
{% if model == 'Custom' %}
<span class="badge bg-info mt-1">
<i class="fas fa-star me-1"></i>{% trans "Custom" %}
</span>
{% elif perm.id in group_permission_ids %}
<span class="badge bg-success mt-1">
<i class="fas fa-check me-1"></i>{% trans "Assigned" %}
</span>
{% endif %}
</span>
</label>
{% endfor %}
</div>
</div>
</div>
</div> </div>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
{% endfor %} </div>
</div> {% endfor %}
</div> </div>
</div>
</div>
{% endfor %}
</div>
<!-- Footer section remains the same -->
</div>
<div class="row mt-4"> <div class="row mt-4 mb-4">
<div class="col"> <div class="col">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<div> <div>
@ -134,12 +130,9 @@
</span> </span>
</div> </div>
<div> <div>
<a href="{% url 'group_detail' request.dealer.slug group.pk %}"
class="btn btn-outline-secondary me-2"> <button type="submit" class="btn btn-primary me-2">
<i class="fas fa-ban me-2"></i>{% trans "Cancel" %} <i class="fas fa-save me-1"></i>{% trans "Save Changes" %}
</a>
<button type="submit" class="btn btn-primary">
<i class="fas fa-save me-2"></i>{% trans "Save Changes" %}
</button> </button>
</div> </div>
</div> </div>
@ -197,7 +190,7 @@ document.addEventListener('DOMContentLoaded', function() {
if (button) { if (button) {
const hasVisible = collapse.querySelector('.list-group-item[style=""]'); const hasVisible = collapse.querySelector('.list-group-item[style=""]');
const bsCollapse = bootstrap.Collapse.getInstance(collapse) || const bsCollapse = bootstrap.Collapse.getInstance(collapse) ||
new bootstrap.Collapse(collapse); new bootstrap.Collapse(collapse);
if (hasVisible) { if (hasVisible) {
bsCollapse.show(); bsCollapse.show();

View File

@ -17,7 +17,7 @@
<div class="dropdown-indicator-icon-wrapper"><span class="fas fa-caret-right dropdown-indicator-icon"></span></div> <div class="dropdown-indicator-icon-wrapper"><span class="fas fa-caret-right dropdown-indicator-icon"></span></div>
<span class="nav-link-icon"><span class="fas fa-warehouse"></span></span><span class="nav-link-text">{% trans "Inventory"|capfirst %}</span> <span class="nav-link-icon"><span class="fas fa-warehouse"></span></span><span class="nav-link-text">{% trans "Inventory"|capfirst %}</span>
</div> </div>
</a> </a>
<div class="parent-wrapper label-1"> <div class="parent-wrapper label-1">
<ul class="nav collapse parent" data-bs-parent="#navbarVerticalCollapse" id="nv-inventory"> <ul class="nav collapse parent" data-bs-parent="#navbarVerticalCollapse" id="nv-inventory">
<li class="collapsed-nav-item-title d-none">{% trans "Inventory"|capfirst %}</li> <li class="collapsed-nav-item-title d-none">{% trans "Inventory"|capfirst %}</li>
@ -31,8 +31,9 @@
</li> </li>
</li> </li>
{% endif %} {% endif %}
<li class="nav-item">
{% if perms.inventory.view_car%}
<li class="nav-item">
<a class="nav-link" href="{% url 'inventory_stats' request.dealer.slug %}"> <a class="nav-link" href="{% url 'inventory_stats' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-car-side"></span></span><span class="nav-link-text">{% trans 'Cars'|capfirst %}</span> <span class="nav-link-icon"><span class="fas fa-car-side"></span></span><span class="nav-link-text">{% trans 'Cars'|capfirst %}</span>
@ -46,6 +47,8 @@
</div> </div>
</a> </a>
</li> </li>
{% endif %}
{% if perms.inventory.add_car %} {% if perms.inventory.add_car %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'upload_cars' request.dealer.slug %}"> <a class="nav-link" href="{% url 'upload_cars' request.dealer.slug %}">
@ -89,7 +92,7 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{%if perms.inventory.view_saleorder%}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'sales_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'sales_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -97,6 +100,7 @@
</div> </div>
</a> </a>
</li> </li>
{% endif %}
{% if perms.django_ledger.view_invoicemodel %} {% if perms.django_ledger.view_invoicemodel %}
<li class="nav-item"> <li class="nav-item">
@ -107,7 +111,7 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if perms.django_ledger.view_journalentrymodel %} {% if perms.inventory.view_payment %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'payment_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'payment_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -148,6 +152,8 @@
</div> </div>
</a> </a>
</li> </li>
{% endif %}
{%if perms.inventory.view_opportunity %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'opportunity_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'opportunity_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -165,6 +171,7 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if perms.inventory.view_organization %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'organization_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'organization_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -173,6 +180,7 @@
</a> </a>
</li> </li>
{% endif %}
{% comment %} <li class="nav-item"> {% comment %} <li class="nav-item">
<a class="nav-link" href="{% url 'representative_list' %}"> <a class="nav-link" href="{% url 'representative_list' %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -217,11 +225,12 @@
<a class="nav-link" href="{% url 'bank_account_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'bank_account_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<span class="nav-link-icon"><span data-feather="credit-card"></span></span><span class="nav-link-text">{% trans 'Bank Accounts'|capfirst %}</span> <span class="nav-link-icon"><span data-feather="credit-card"></span></span><span class="nav-link-text">{% trans 'Bank Accounts'|capfirst %}</span>
</div> </div>
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if perms.django_ledger.view_itemmodel %}
{% if perms.django_ledger.view_journalentrymodel %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'ledger_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'ledger_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -230,6 +239,8 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if perms.inventory.view_additionalservices %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'item_service_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'item_service_list' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -237,6 +248,8 @@
</div> </div>
</a> </a>
</li> </li>
{% endif %}
{% if perms.django_ledger.view_itemmodel %} {% if perms.django_ledger.view_itemmodel %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'item_expense_list' request.dealer.slug %}"> <a class="nav-link" href="{% url 'item_expense_list' request.dealer.slug %}">
@ -265,7 +278,7 @@
</li> </li>
{% endif %} {% endif %}
{% if perms.django_ledger.view_purchaseorder %} {% if perms.django_ledger.view_purchaseordermodel %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}"> <a class="nav-link" href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
@ -340,13 +353,14 @@
</div> </div>
</div> </div>
{% endif %}
<div class="navbar-vertical-footer"> <div class="navbar-vertical-footer">
<button class="btn navbar-vertical-toggle border-0 fw-semibold w-100 white-space-nowrap d-flex align-items-center"> <button class="btn navbar-vertical-toggle border-0 fw-semibold w-100 white-space-nowrap d-flex align-items-center">
<span class="uil uil-left-arrow-to-left fs-8"></span><span class="uil uil-arrow-from-right fs-8"></span><span class="navbar-vertical-footer-text ms-2">Collapsed View</span> <span class="uil uil-left-arrow-to-left fs-8"></span><span class="uil uil-arrow-from-right fs-8"></span><span class="navbar-vertical-footer-text ms-2">Collapsed View</span>
</button> </button>
</div> </div>
</nav> </nav>
{% endif %}
<nav class="navbar navbar-top fixed-top navbar-expand" id="navbarDefault"> <nav class="navbar navbar-top fixed-top navbar-expand" id="navbarDefault">
<div class="collapse navbar-collapse justify-content-between"> <div class="collapse navbar-collapse justify-content-between">

View File

@ -75,6 +75,7 @@
</div> </div>
{% endif %} {% endif %}
<!-- Main row --> <!-- Main row -->
{% if perms.inventory.view_car %}
<div class="row-fluid {% if car.status == 'sold' %}disabled{% endif %}"> <div class="row-fluid {% if car.status == 'sold' %}disabled{% endif %}">
<div class="row g-3 justify-content-between"> <div class="row g-3 justify-content-between">
<div class="col-lg-12 col-xl-6"> <div class="col-lg-12 col-xl-6">
@ -242,7 +243,12 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-6 col-xl-6"> <div class="col-lg-6 col-xl-6">
{% if perms.inventory.view_carfinance%}
<div class="card rounded shadow d-flex align-content-center {% if car.get_transfer %}transfer{% endif %}"> <div class="card rounded shadow d-flex align-content-center {% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p> <p class="card-header rounded-top fw-bold">{% trans 'Financial Details' %}</p>
<div class="card-body"> <div class="card-body">
@ -283,27 +289,31 @@
<th>{% trans "Total"|capfirst %}</th> <th>{% trans "Total"|capfirst %}</th>
<td>{{ car.finances.total_vat|floatformat:2 }}</td> <td>{{ car.finances.total_vat|floatformat:2 }}</td>
</tr> </tr>
{% if perms.inventory.change_carfinance%}
<tr> <tr>
<td colspan="2"> <td colspan="2">
{% if not car.get_transfer %} {% if not car.get_transfer %}
<a href="{% url 'car_finance_update' request.dealer.slug car.finances.pk %}" <a href="{% url 'car_finance_update' request.dealer.slug car.finances.pk %}" class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
class="btn btn-phoenix-warning btn-sm mb-3">{% trans "Edit" %}</a>
{% else %} {% else %}
<span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span> <span class="badge bg-danger">{% trans "Cannot Edit, Car in Transfer." %}</span>
{% endif %} {% endif %}
</td>
</tr>
{% endif %}
{% else %} {% else %}
<p>{% trans "No finance details available." %}</p> <p>{% trans "No finance details available." %}</p>
{% if perms.inventory.add_carfinance %} {% if perms.inventory.add_carfinance %}
<a href="{% url 'car_finance_create' request.dealer.slug car.slug %}" <a href="{% url 'car_finance_create' request.dealer.slug car.slug %}"
class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a> class="btn btn-phoenix-success btn-sm mb-3">{% trans "Add" %}</a>
{% endif %} {% endif %}
</td>
</tr>
{% endif %} {% endif %}
</table> </table>
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% if perms.inventory.view_carcolors %}
<div class="card rounded shadow d-flex align-content-center mt-3 {% if car.get_transfer %}transfer{% endif %}"> <div class="card rounded shadow d-flex align-content-center mt-3 {% if car.get_transfer %}transfer{% endif %}">
<p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p> <p class="card-header rounded-top fw-bold">{% trans 'Colors Details' %}</p>
<div class="card-body"> <div class="card-body">
@ -332,7 +342,8 @@
style="background-color: rgb({{ car.colors.interior.rgb }})"></div> style="background-color: rgb({{ car.colors.interior.rgb }})"></div>
</td> </td>
</tr> </tr>
{% if perms.inventory.change_carcolors%}
<tr> <tr>
<td colspan="2"> <td colspan="2">
{% if not car.get_transfer %} {% if not car.get_transfer %}
@ -343,8 +354,9 @@
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% endif %}
{% else %} {% else %}
<tr> <tr>
<td colspan="2"> <td colspan="2">
<p>{% trans "No color details available." %}</p> <p>{% trans "No color details available." %}</p>
@ -352,7 +364,7 @@
<a class="btn btn-phoenix-success btn-sm mb-3" href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a> <a class="btn btn-phoenix-success btn-sm mb-3" href="{% url 'add_color' request.dealer.slug car.slug %}">{{ _("Add Color") }}</a>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% endif %} {% endif %}
<!--test--> <!--test-->
@ -360,7 +372,9 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% if car.status != 'transfer' %} {% if car.status != 'transfer' %}
{%if perms.inventory.view_carreservation%}
<div class="card rounded shadow d-flex align-content-center mt-3"> <div class="card rounded shadow d-flex align-content-center mt-3">
<p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p> <p class="card-header rounded-top fw-bold">{% trans 'Reservations Details' %}</p>
<div class="card-body"> <div class="card-body">
@ -379,6 +393,7 @@
<tr> <tr>
<td>{{ reservation.reserved_by.dealer }}</td> <td>{{ reservation.reserved_by.dealer }}</td>
<td>{{ reservation.reserved_until }}</td> <td>{{ reservation.reserved_until }}</td>
{% if perms.inventory.change_carreservation %}
<td> <td>
{% if reservation.is_active %} {% if reservation.is_active %}
<form method="post" action="{% url 'reservations' request.dealer.slug reservation.id %}"> <form method="post" action="{% url 'reservations' request.dealer.slug reservation.id %}">
@ -402,27 +417,30 @@
<span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span> <span class="badge badge-phoenix badge-phoenix-danger fs-10">{% trans "Expired" %}</span>
{% endif %} {% endif %}
</td> </td>
{% endif %}
</tr> </tr>
{% endfor %} {% endfor %}
{% else %} {% else %}
{% if perms.inventory.add_carreservation %}
<tr> <tr>
<td> <td>
{% if perms.inventory.change_carreservation %}
<button type="button" <button type="button"
class="btn btn-sm btn-phoenix-success" class="btn btn-sm btn-phoenix-success"
data-bs-toggle="modal" data-bs-toggle="modal"
data-bs-target="#reserveModal"> data-bs-target="#reserveModal">
{% trans 'Reserve' %} {% trans 'Reserve' %}
</button> </button>
{% endif %}
</td> </td>
</tr> </tr>
</tbody> {% endif %}
{% endif %}
</tbody>
{% endif %}
</table> </table>
</div> </div>
</div> </div>
</div> </div>
{% endif %}
{% endif %} {% endif %}
<!-- Transfer Table --> <!-- Transfer Table -->
{% if car.status == 'transfer' and car.get_transfer %} {% if car.status == 'transfer' and car.get_transfer %}
@ -483,6 +501,7 @@
alt=""> alt="">
{% endif %} {% endif %}
</div> </div>
<!-- Custom Card Modal --> <!-- Custom Card Modal -->
<div class="modal fade" <div class="modal fade"
id="customCardModal" id="customCardModal"
@ -583,6 +602,7 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
<script> <script>
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
const csrftoken = getCookie("csrftoken"); const csrftoken = getCookie("csrftoken");

View File

@ -272,9 +272,13 @@
</button> </button>
<div class="dropdown-menu dropdown-menu-end py-2"> <div class="dropdown-menu dropdown-menu-end py-2">
<a class="dropdown-item" href="{% url 'car_detail' request.dealer.slug car.slug %}"> <span class="fas fa-eye me-2"></span>{{ _("View") }} </a> <a class="dropdown-item" href="{% url 'car_detail' request.dealer.slug car.slug %}"> <span class="fas fa-eye me-2"></span>{{ _("View") }} </a>
{% if perms.inventory.change_car%}
<a class="dropdown-item" href="{% url 'car_update' request.dealer.slug car.slug %}"> <span class="fas fa-edit me-2"></span>{{ _("Edit") }} </a> <a class="dropdown-item" href="{% url 'car_update' request.dealer.slug car.slug %}"> <span class="fas fa-edit me-2"></span>{{ _("Edit") }} </a>
{% endif %}
{% if perms.inventory.delete_car%}
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="{% url 'car_delete' request.dealer.slug car.slug %}"> <span class="fas fa-trash me-2"></span>{{ _("Remove") }} </a> <a class="dropdown-item text-danger" href="{% url 'car_delete' request.dealer.slug car.slug %}"> <span class="fas fa-trash me-2"></span>{{ _("Remove") }} </a>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -11,13 +11,17 @@
<li class="list-group-item"><strong>{% trans "Address" %}:</strong> {{ organization.address }}</li> <li class="list-group-item"><strong>{% trans "Address" %}:</strong> {{ organization.address }}</li>
</ul> </ul>
<div class="d-flex"> <div class="d-flex">
{% if perms.inventory.change_organization%}
<a href="{% url 'organization_update' request.dealer.slug organization.slug %}" class="btn btn-sm btn-phoenix-primary me-2"><span class="fas fa-edit me-1"></span>{% trans "Edit" %}</a> <a href="{% url 'organization_update' request.dealer.slug organization.slug %}" class="btn btn-sm btn-phoenix-primary me-2"><span class="fas fa-edit me-1"></span>{% trans "Edit" %}</a>
{% endif %}
{% if perms.inventory.delete_organization%}
<button class="btn btn-phoenix-danger btn-sm delete-btn" <button class="btn btn-phoenix-danger btn-sm delete-btn"
data-url="{% url 'organization_delete' request.dealer.slug organization.slug %}" data-url="{% url 'organization_delete' request.dealer.slug organization.slug %}"
data-message="Are you sure you want to delete this organization?" data-message="Are you sure you want to delete this organization?"
data-bs-toggle="modal" data-bs-target="#deleteModal"> data-bs-toggle="modal" data-bs-target="#deleteModal">
<i class="fas fa-trash me-1"></i> {% trans 'Delete' %} <i class="fas fa-trash me-1"></i> {% trans 'Delete' %}
</button> </button>
{% endif %}
</div> </div>
</div> </div>
{% include 'modal/delete_modal.html' %} {% include 'modal/delete_modal.html' %}

View File

@ -16,7 +16,7 @@
<div class="row g-3 justify-content-between mb-4"> <div class="row g-3 justify-content-between mb-4">
<div class="col-auto"> <div class="col-auto">
<div class="d-md-flex justify-content-between"> <div class="d-md-flex justify-content-between">
{% if perms.django_ledger.add_customermodel %} {% if perms.inventory.add_organization%}
<div> <div>
<a href="{% url 'organization_create' request.dealer.slug %}" class="btn btn-sm btn-phoenix-primary"><span class="fas fa-plus me-2"></span>{% trans 'add organization'|capfirst %}</a> <a href="{% url 'organization_create' request.dealer.slug %}" class="btn btn-sm btn-phoenix-primary"><span class="fas fa-plus me-2"></span>{% trans 'add organization'|capfirst %}</a>
</div> </div>
@ -106,17 +106,20 @@
<td class="company align-middle white-space-nowrap text-body-tertiary text-opacity-85 ps-4 border-end border-translucent fw-semibold text-body-highlight">{{ org.address }}</td> <td class="company align-middle white-space-nowrap text-body-tertiary text-opacity-85 ps-4 border-end border-translucent fw-semibold text-body-highlight">{{ org.address }}</td>
<td class="date align-middle white-space-nowrap text-body-tertiary text-opacity-85 ps-4 text-body-tertiary">{{ org.created|date }}</td> <td class="date align-middle white-space-nowrap text-body-tertiary text-opacity-85 ps-4 text-body-tertiary">{{ org.created|date }}</td>
<td class="align-middle white-space-nowrap text-end pe-0 ps-4"> <td class="align-middle white-space-nowrap text-end pe-0 ps-4">
{% if perms.django_ledger.change_customermodel %} {% if perms.inventory.change_organization or perms.inventory.delete_organization%}
<div class="btn-reveal-trigger position-static"> <div class="btn-reveal-trigger position-static">
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button> <button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
<div class="dropdown-menu dropdown-menu-end py-2"> <div class="dropdown-menu dropdown-menu-end py-2">
{% if perms.inventory.change_organization %}
<a href="{% url 'organization_update' request.dealer.slug org.slug %}" class="dropdown-item text-success-dark">{% trans 'Edit' %}</a> <a href="{% url 'organization_update' request.dealer.slug org.slug %}" class="dropdown-item text-success-dark">{% trans 'Edit' %}</a>
{% if perms.django_ledger.delete_customermodel %} {% endif %}
{% if perms.inventory.delete_organization %}
<div class="dropdown-divider"></div><button class="dropdown-item text-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">{% trans 'Delete' %}</button> <div class="dropdown-divider"></div><button class="dropdown-item text-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">{% trans 'Delete' %}</button>
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -161,7 +161,9 @@
</div> </div>
<div class="card-footer bg-light"> <div class="card-footer bg-light">
{% if perms.django_ledger.change_purchaseordermodel%}
<div class="d-flex flex-wrap gap-2 justify-content-between"> <div class="d-flex flex-wrap gap-2 justify-content-between">
<a href="{% url 'purchase_order_update' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po_model.pk %}" <a href="{% url 'purchase_order_update' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po_model.pk %}"
class="btn btn-phoenix-primary"> class="btn btn-phoenix-primary">
<i class="fas fa-edit me-2"></i>{% trans 'Update' %} <i class="fas fa-edit me-2"></i>{% trans 'Update' %}
@ -200,10 +202,12 @@
{# Danger Action Buttons #} {# Danger Action Buttons #}
{% if po_model.can_delete %} {% if po_model.can_delete %}
{% if perms.django_ledger.delete_purchaseordermodel%}
<button class="btn btn-outline-danger" <button class="btn btn-outline-danger"
onclick="showPOModal('Delete PO', '{% url 'po-delete' request.dealer.slug entity_slug po_model.pk %}', 'Delete')"> onclick="showPOModal('Delete PO', '{% url 'po-delete' request.dealer.slug entity_slug po_model.pk %}', 'Delete')">
<i class="fas fa-ban me-2"></i>{% trans 'Delete' %} <i class="fas fa-ban me-2"></i>{% trans 'Delete' %}
</button> </button>
{% endif %}
{% endif %} {% endif %}
{% if po_model.can_void %} {% if po_model.can_void %}
@ -222,10 +226,12 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% endif %}
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% else %} {% else %}
{% if perms.django_ledger.add_purchaseordermodel%}
<div class="card border-0 shadow-sm text-center py-5"> <div class="card border-0 shadow-sm text-center py-5">
<div class="card-body"> <div class="card-body">
<a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}" class="text-decoration-none"> <a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}" class="text-decoration-none">
@ -234,4 +240,5 @@
</a> </a>
</div> </div>
</div> </div>
{% endif %}
{% endif %} {% endif %}

View File

@ -21,6 +21,7 @@
<th style="min-width: 600px;" class="d-flex justify-content-between align-items-center"> <th style="min-width: 600px;" class="d-flex justify-content-between align-items-center">
{% trans 'Item' %} {% trans 'Item' %}
{% if po_model.is_draft %} {% if po_model.is_draft %}
<button type="button" <button type="button"
class="btn btn-sm btn-phoenix-success" class="btn btn-sm btn-phoenix-success"
data-bs-toggle="modal" data-bs-toggle="modal"
@ -65,18 +66,23 @@
<span class="currency">{{CURRENCY}}</span>{{ f.instance.po_total_amount | currency_format }}</td> <span class="currency">{{CURRENCY}}</span>{{ f.instance.po_total_amount | currency_format }}</td>
<td>{{ f.po_item_status|add_class:"form-control" }}</td> <td>{{ f.po_item_status|add_class:"form-control" }}</td>
{% if itemtxs_formset.can_delete %} {% if itemtxs_formset.can_delete %}
<td class="text-center"> <td class="text-center">
{{ f.DELETE|add_class:"form-check-input" }} {{ f.DELETE|add_class:"form-check-input" }}
</td> </td>
{% endif %} {% endif %}
<td class="text-center"> <td class="text-center">
{% if f.instance.can_create_bill %} {% if f.instance.can_create_bill %}
{% if perms.djagno_ledger.add_billmodel%}
{{ f.create_bill|add_class:"form-check-input" }} {{ f.create_bill|add_class:"form-check-input" }}
{% endif %}
{% elif f.instance.bill_model %} {% elif f.instance.bill_model %}
{% if perms.djagno_ledger.view_billmodel%}
<a class="btn btn-sm btn-phoenix-secondary" <a class="btn btn-sm btn-phoenix-secondary"
href="{% url 'bill-detail' dealer_slug=dealer_slug entity_slug=entity_slug bill_pk=f.instance.bill_model_id %}"> href="{% url 'bill-detail' dealer_slug=dealer_slug entity_slug=entity_slug bill_pk=f.instance.bill_model_id %}">
{% trans 'View Bill' %} {% trans 'View Bill' %}
</a> </a>
{% endif %}
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">

View File

@ -18,12 +18,14 @@
<h3 class=""> <h3 class="">
{{ _("Purchase Orders") |capfirst }} {{ _("Purchase Orders") |capfirst }}
</h2> </h2>
{% if perms.django_ledger.add_purchaseordermodel%}
<div> <div>
{% if perms.django_ledger.add_purchaseordermodel %} {% if perms.django_ledger.add_purchaseordermodel %}
<a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}" <a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}"
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a> class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a>
{% endif %} {% endif %}
</div> </div>
{% endif %}
</div> </div>
{% include "partials/search_box.html" %} {% include "partials/search_box.html" %}
@ -71,7 +73,9 @@
<a href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Purchase Order Detail' %}</a> <a href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Purchase Order Detail' %}</a>
{% endif %} {% endif %}
{% if po.po_status == 'fulfilled' %} {% if po.po_status == 'fulfilled' %}
{% if perms.inventory.add_car %}
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'Add Inventory Items' %}</a> <a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'Add Inventory Items' %}</a>
{% endif %}
{% else %} {% else %}
<button class="dropdown-item text-warning-dark" disabled><span class="fas fa-exclamation-triangle me-1"></span> Fulfill the PO Before Viewing Inventory</button> <button class="dropdown-item text-warning-dark" disabled><span class="fas fa-exclamation-triangle me-1"></span> Fulfill the PO Before Viewing Inventory</button>
{% endif %} {% endif %}

View File

@ -83,26 +83,33 @@
{% if perms.django_ledger.can_approve_estimatemodel %} {% if perms.django_ledger.can_approve_estimatemodel %}
<button id="accept_estimate" onclick="setFormAction('approved')" class="btn btn-phoenix-secondary" data-bs-toggle="modal" data-bs-target="#confirmModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-check-double"></i> {% trans 'Mark As Approved' %}</span></button> <button id="accept_estimate" onclick="setFormAction('approved')" class="btn btn-phoenix-secondary" data-bs-toggle="modal" data-bs-target="#confirmModal"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-check-double"></i> {% trans 'Mark As Approved' %}</span></button>
{% endif %} {% endif %}
{% elif estimate.status == 'approved' %} {% elif estimate.status == 'approved' %}
<a href="{% url 'send_email' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary me-2"><span class="fa-regular fa-paper-plane me-sm-2"></span><span class="d-none d-sm-inline-block">{% trans 'Send Quotation' %}</span></a> {% if perms.django_ledger.change_estimatemodel %}
<a href="{% url 'send_email' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary me-2"><span class="fa-regular fa-paper-plane me-sm-2"></span><span class="d-none d-sm-inline-block">{% trans 'Send Quotation' %}</span></a>
{% endif %}
{% if estimate.sale_orders.first %} {% if estimate.sale_orders.first %}
<!--if sale order exist--> <!--if sale order exist-->
{% if perms.django_ledger.add_invoicemodel %} {% if perms.django_ledger.add_invoicemodel %}
<a href="{% url 'invoice_create' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-receipt"></i> {% trans 'Create Invoice' %}</span></a> <a href="{% url 'invoice_create' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-receipt"></i> {% trans 'Create Invoice' %}</span></a>
{% endif %} {% endif %}
{% if perms.inventory.view_saleorder%}
<a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a> <a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a>
{% endif %}
{% else %} {% else %}
{% if perms.inventory.add_saleorder%}
<a href="{% url 'create_sale_order' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-file-import"></i> {% trans 'Create Sale Order' %}</span></a> <a href="{% url 'create_sale_order' request.dealer.slug estimate.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block"><i class="fa-solid fa-file-import"></i> {% trans 'Create Sale Order' %}</span></a>
{% comment %} {% endcomment %} {% endif %}
{% endif %} {% endif %}
{% elif estimate.status == 'completed' %} {% elif estimate.status == 'completed' %}
{% if perms.inventory.view_saleorder%}
<a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a> <a href="{% url 'order_detail' request.dealer.slug estimate.sale_orders.first.pk %}" class="btn btn-phoenix-primary"><span class="d-none d-sm-inline-block">{{ _("Preview Sale Order") }}</span></a>
{% endif %}
{% if perms.django_ledger.view_invoicemodel %}
<a href="{% url 'invoice_detail' request.dealer.slug estimate.invoicemodel_set.first.pk %}" class="btn btn-phoenix-primary btn-sm" type="button"><i class="fa-solid fa-receipt"></i> <a href="{% url 'invoice_detail' request.dealer.slug estimate.invoicemodel_set.first.pk %}" class="btn btn-phoenix-primary btn-sm" type="button"><i class="fa-solid fa-receipt"></i>
{{ _("View Invoice")}}</a> {{ _("View Invoice")}}</a>
{% endif %}
{% endif %} {% endif %}
{% if estimate.can_cancel %} {% if estimate.can_cancel %}