From e40533222083d5d6e097b7899cf321b8bea85867 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 11 Feb 2026 16:12:08 +0000 Subject: [PATCH] Autosave: 20260211-161207 --- assets/pasted-20260211-144653-0ba3e61f.png | Bin 0 -> 6194 bytes core/__pycache__/models.cpython-311.pyc | Bin 45921 -> 44989 bytes core/models.py | 24 ++++++++------------- 3 files changed, 9 insertions(+), 15 deletions(-) create mode 100644 assets/pasted-20260211-144653-0ba3e61f.png diff --git a/assets/pasted-20260211-144653-0ba3e61f.png b/assets/pasted-20260211-144653-0ba3e61f.png new file mode 100644 index 0000000000000000000000000000000000000000..5e63e71b9d61a08ba37b80af1c288ec6209f2f62 GIT binary patch literal 6194 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 Q-2neqKser*@cmTwUkJWhj{pDw delta 5062 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 Ay8r+H diff --git a/core/models.py b/core/models.py index eacc4a3..c9b2133 100644 --- a/core/models.py +++ b/core/models.py @@ -398,21 +398,15 @@ class SystemSetting(models.Model): favicon = models.FileField(_("Favicon"), upload_to="business_logos/", blank=True, null=True) vat_number = models.CharField(_("VAT Number"), max_length=50, blank=True) registration_number = models.CharField(_("Registration Number"), max_length=50, blank=True) - - # Financial Settings - allow_zero_stock_sales = models.BooleanField(_("Allow selling items with 0 stock"), default=False) - - # Loyalty Settings - loyalty_enabled = models.BooleanField(_("Enable Loyalty System"), default=False) - points_per_currency = models.DecimalField(_("Points Earned per Currency Unit"), max_digits=10, decimal_places=2, default=1.0) - currency_per_point = models.DecimalField(_("Currency Value per Point"), max_digits=10, decimal_places=3, default=0.010) - min_points_to_redeem = models.PositiveIntegerField(_("Minimum Points to Redeem"), default=100) - - # WhatsApp (Wablas) Settings - wablas_enabled = models.BooleanField(_("Enable WhatsApp Gateway"), default=False) - wablas_token = models.CharField(_("Wablas API Token"), max_length=255, blank=True) - wablas_server_url = models.URLField(_("Wablas Server URL"), blank=True, help_text="Example: https://console.wablas.com") - wablas_secret_key = models.CharField(_("Wablas Secret Key"), max_length=255, blank=True) + + class Meta: + permissions = [ + ("view_dashboard", "Can view dashboard"), + ("view_pos", "Can access POS"), + ("view_reports", "Can view reports"), + ("view_accounting", "Can view accounting"), + ("view_hr", "Can view HR"), + ] def __str__(self): return self.business_name