انتقل إلى المحتوى الرئيسي

سرفس الزبائن (CustomerService)

شنو تسوي هاي السرفس؟

CustomerService عبارة عن كلاس مسؤول عن إدارة عمليات الزبائن داخل النظام، مثل إضافة زبون جديد.


الحقول (Fields) المستخدمة

private readonly AppDbContext _context;
private readonly AccountsService _accountService;
المتغيّرشنو يسوي؟
_contextيمثل قاعدة البيانات (Entity Framework).
_accountServiceيتعامل ويا حسابات المالية الزبائن، مثل إنشاء حساب جديد.

الكونستركتر

public CustomerService(AppDbContext context, AccountsService accountService)
  • يحقن قاعدة البيانات وخدمة الحسابات حتى نستخدمهم داخل الكلاس.

الدالة Add(...)

public async Task<CustomerResponse> Add(string name, string? phoneNumber, string? address, CancellationToken ct)

هاي الدالة تضيف زبون جديد، وتتكون من الخطوات التالية:


1. التحقق إذا الزبون موجود مسبقًا

var customerExist = await _context.Customer
.IgnoreQueryFilters()
.Where(c => c.Name == name)
.FirstOrDefaultAsync(ct);
  • يبحث إذا أكو زبون بنفس الاسم، حتى لو كان محذوف.
  • يستخدم IgnoreQueryFilters حتى يشوف الزبائن المحذوفين مؤقتًا (soft delete).

2. التحقق من حالة الزبون

  • إذا الزبون موجود وممـحـذوف:
if (customerExist != null && customerExist.DeletedAt == null)
throw new ApiException("CustomerWithTheSameNameExist", "زبون بنفس الاسم موجود", 409);
  • إذا الزبون موجود لكن محذوف:
if (customerExist != null && customerExist.DeletedAt != null)
throw new ApiException("DeletedCustomerWithTheSameNameExist", "زبون بنفس الاسم موجود لكن محذوف. هل تريد استعادته؟", 409);

3. إنشاء حساب مالي للزبون

var account = await _accountService.NewAccount(name, CommonAccountOption.Customers, ct);
  • ينشئ حساب مالي مرتبط بالزبون تحت نوع Customers.

4. إنشاء الزبون وحفظه

var customer = new CustomerModel {
Id = Ulid.NewUlid(),
Name = name,
PhoneNumber = phoneNumber,
Location = address ?? "",
AccountId = account.Id
};
  • ينشئ كائن الزبون.
  • إذا العنوان ما موجود، يحط قيمة فارغة بدلًا عنه.

5. حفظ الحساب والزبون بقاعدة البيانات

await _accountService.SaveAccount(account, ct);
_context.Customer.Add(customer);
await _context.SaveChangesAsync(ct);

6. إرجاع الرد

return new CustomerResponse(customer);
  • يرجع نسخة من الزبون باستخدام كلاس CustomerResponse.

ملاحظات

  • النظام يستخدم Soft Delete (يعني الزبون ينحذف بس ما ينمسح من قاعدة البيانات).
  • يستخدم Ulid كـ ID للزبون (مميز وزمني).
  • يعتمد على خدمات أخرى مثل AccountsService.