import 'dart:math'; import 'package:fikoyt_mesaici/apps/mesaici/model/calisma_kayit/calisma_kayit.dart'; import 'package:fikoyt_mesaici/core/Extensions/fiko_tarih.dart'; import 'package:flutter/material.dart'; import 'package:isar/isar.dart'; import 'package:json_annotation/json_annotation.dart'; part 'model_ayarlar.g.dart'; @collection @JsonSerializable() class ModelAyarlar { ModelAyarlar(); Id id = Isar.autoIncrement; String? ismi; int? yil = DateTime.now().year; UygulamaAyarlari uygulamaAyarlari = UygulamaAyarlari(); BildirimAyarlari bildirimAyarlari = BildirimAyarlari(); HesapAyarlari hesapAyarlari = HesapAyarlari(); CalismaSuresiAyarlari calismaSuresiAyarlari = CalismaSuresiAyarlari(); List resmiTatiller = []; // ResmiTatilFazlaMesaiOranlari resmiTatilFazlaMesaiOranlari = ResmiTatilFazlaMesaiOranlari(); MaasParametreleri maasParametreleri = MaasParametreleri(); // VergiAyarlari vergiAyarlari = VergiAyarlari(); // PrimAyarlari primAyarlari = PrimAyarlari(); factory ModelAyarlar.fromJson(Map json) => _$ModelAyarlarFromJson(json); Map toJson() => _$ModelAyarlarToJson(this); } @embedded @JsonSerializable() class UygulamaAyarlari { UygulamaAyarlari(); bool otomatikBaslat = false; bool baslangictaCalistir = false; bool servisCalisiyor = false; bool ilkEkranAcilistaGoster = true; bool ilkEkraniHerZamanGoster = false; factory UygulamaAyarlari.fromJson(Map json) => _$UygulamaAyarlariFromJson(json); Map toJson() => _$UygulamaAyarlariToJson(this); } @embedded @JsonSerializable() class HesapAyarlari { HesapAyarlari(); String adSoyad = ""; String sirket = ""; String? slogan = "FikoYT İle Gelecek Bugünde"; String? goreviniz = ""; DateTime? iseGirisTarihi; factory HesapAyarlari.fromJson(Map json) => _$HesapAyarlariFromJson(json); Map toJson() => _$HesapAyarlariToJson(this); } @embedded @JsonSerializable() class BildirimAyarlari { BildirimAyarlari(); bool genelBildirimler = true; bool iseBaslamaBildirimleri = true; bool isiBitirmeBildirimleri = true; bool molaBaslangicBildirimleri = true; bool molaBitisBildirimleri = true; tumunuAc() { genelBildirimler = true; iseBaslamaBildirimleri = true; isiBitirmeBildirimleri = true; molaBaslangicBildirimleri = true; molaBitisBildirimleri = true; } tumunuKapat() { genelBildirimler = false; iseBaslamaBildirimleri = false; isiBitirmeBildirimleri = false; molaBaslangicBildirimleri = false; molaBitisBildirimleri = false; } factory BildirimAyarlari.fromJson(Map json) => _$BildirimAyarlariFromJson(json); Map toJson() => _$BildirimAyarlariToJson(this); } @embedded @JsonSerializable() class CalismaSuresiAyarlari { CalismaSuresiAyarlari(); int? aylikMaasGunu = 30; int? aylikCalismaSaatiInMilliseconds = const Duration(hours: 270).inMilliseconds; @ignore Duration? get aylikCalismaSaati => aylikCalismaSaatiInMilliseconds != null ? Duration(milliseconds: aylikCalismaSaatiInMilliseconds!) : null; set aylikCalismaSaati(Duration? value) => aylikCalismaSaatiInMilliseconds = value?.inMilliseconds; int? aktifVardiya = 0; List vardiyalar = [Vardiya(ismi: "Sürekli Gündüz", aciklama: "Sadece Gündüz Çalışma.")]; factory CalismaSuresiAyarlari.fromJson(Map json) => _$CalismaSuresiAyarlariFromJson(json); Map toJson() => _$CalismaSuresiAyarlariToJson(this); } @embedded @JsonSerializable() class Vardiya { Vardiya({this.ismi, this.aciklama}); String? ismi; String? aciklama; Gunler gunAyarlari = Gunler(); factory Vardiya.fromJson(Map json) => _$VardiyaFromJson(json); Map toJson() => _$VardiyaToJson(this); } @embedded @JsonSerializable() class Gunler { Gunler(); GunAyari pazartesi = GunAyari(ismi: "Pazartesi", turu: GunTuru.CALISMA_GUNU); GunAyari sali = GunAyari(ismi: "Salı", turu: GunTuru.CALISMA_GUNU); GunAyari carsamba = GunAyari(ismi: "Çarşamba", turu: GunTuru.CALISMA_GUNU); GunAyari persembe = GunAyari(ismi: "Perşembe", turu: GunTuru.CALISMA_GUNU); GunAyari cuma = GunAyari(ismi: "Cuma", turu: GunTuru.CALISMA_GUNU); GunAyari cumartesi = GunAyari(ismi: "Cumartesi", turu: GunTuru.DINLENME_GUNU); GunAyari pazar = GunAyari(ismi: "Pazar", turu: GunTuru.HAFTA_TATILI); List toListe() { return [pazartesi, sali, carsamba, persembe, cuma, cumartesi, pazar]; } fromOther({required Gunler gun}) { pazartesi.fromOther(gun: gun.pazartesi); sali.fromOther(gun: gun.sali); carsamba.fromOther(gun: gun.carsamba); persembe.fromOther(gun: gun.persembe); cuma.fromOther(gun: gun.cuma); cumartesi.fromOther(gun: gun.cumartesi); pazar.fromOther(gun: gun.pazar); } factory Gunler.fromJson(Map json) => _$GunlerFromJson(json); Map toJson() => _$GunlerToJson(this); } // enum GunTuru { CALISMA_GUNU, DINLENME_GUNU, HAFTA_TATILI } @embedded @JsonSerializable() class GunAyari { GunAyari({this.ismi = "", this.turu = GunTuru.CALISMA_GUNU}); String ismi = ""; @enumerated GunTuru turu = GunTuru.CALISMA_GUNU; DateTime? girisSaati; // @ignore // TimeOfDay? get girisSaati => _stringToTimeOfDay(_girisSaati); // set girisSaati(TimeOfDay? value) => _girisSaati = _timeOfDayToString(value); DateTime? cikisSaati; // @ignore // TimeOfDay? get cikisSaati => _stringToTimeOfDay(_cikisSaati); // set cikisSaati(TimeOfDay? value) => _cikisSaati = _timeOfDayToString(value); int? girisToleransiInMicroSeconds; @ignore Duration? get girisToleransi => girisToleransiInMicroSeconds != null ? Duration(microseconds: girisToleransiInMicroSeconds!) : null; set girisToleransi(Duration? value) => girisToleransiInMicroSeconds = value?.inMicroseconds; int? cikisToleransiInMicroSeconds; @ignore Duration? get cikisToleransi => cikisToleransiInMicroSeconds != null ? Duration(microseconds: cikisToleransiInMicroSeconds!) : null; set cikisToleransi(Duration? value) => cikisToleransiInMicroSeconds = value?.inMicroseconds; int? calismaSuresiInMicroSeconds; @ignore Duration? get calismaSuresi => calismaSuresiInMicroSeconds != null ? Duration(microseconds: calismaSuresiInMicroSeconds!) : null; set calismaSuresi(Duration? value) => calismaSuresiInMicroSeconds = value?.inMicroseconds; List? molalar = List.empty(growable: true); @JsonKey(ignore: true) @ignore ScrollController? molalarScrollController; double mesaiOrani = 50.0; List? ekOdemeler = List.empty(growable: true); List? kesintiler = List.empty(growable: true); List? vergiler = List.empty(growable: true); fromOther({required GunAyari gun, bool tumu = false}) { if (tumu) { ismi = gun.ismi; turu = gun.turu; } // turu = gun.turu; girisSaati = gun.girisSaati; cikisSaati = gun.cikisSaati; girisToleransi = gun.girisToleransi; cikisToleransi = gun.cikisToleransi; calismaSuresi = gun.calismaSuresi; molalar = gun.molalar?.copy(); mesaiOrani = gun.mesaiOrani; ekOdemeler = gun.ekOdemeler?.copy(); kesintiler = gun.kesintiler?.copy(); vergiler = gun.vergiler?.copy(); return this; } factory GunAyari.fromJson(Map json) => _$GunAyariFromJson(json); Map toJson() => _$GunAyariToJson(this); } extension Molalar on List { @ignore Duration get toplamMola { int sonuc = 0; forEach((element) { sonuc += element.farkHesapla().inMicroseconds; }); return Duration(microseconds: sonuc); } Duration yasananMola({required DateTime tarih}) { int sonuc = 0; forEach((element) { sonuc += element.yasananMola().inMicroseconds; }); return Duration(microseconds: sonuc); } List copy() { List rslt = []; forEach((element) { Mola mola = Mola(); mola.ismi = element.ismi; mola.aciklama = element.aciklama; mola.girisSaati = element.girisSaati; mola.cikisSaati = element.cikisSaati; mola.bildirimGoster = element.bildirimGoster; mola.otomatikGir = element.otomatikGir; mola.saattenDus = element.saattenDus; rslt.add(mola); }); return rslt; } } enum MolaDurumu { BILINMIYOR, BEKLENIYOR, YASANIYOR, YASANDI; } @embedded @JsonSerializable() class Mola { Mola({this.ismi, this.aciklama, this.bildirimGoster, this.otomatikGir, this.saattenDus}); String? ismi; String? aciklama; DateTime? girisSaati = DateTime(0, 0, 0, 0, 0, 0); DateTime? cikisSaati = DateTime(0, 0, 0, 0, 0, 0); bool? bildirimGoster; bool? otomatikGir; bool? saattenDus; Duration farkHesapla() { return cikisSaati?.difference(girisSaati!) ?? Duration.zero; } @ignore MolaDurumu get molaDurumu { DateTime simdi = DateTime.now(); if (girisSaati == null) return MolaDurumu.BILINMIYOR; if (girisSaati?.isAfter(simdi) ?? false) return MolaDurumu.BEKLENIYOR; if (cikisSaati?.isBefore(simdi) ?? false) return MolaDurumu.YASANDI; if (yasananMola() > Duration.zero && simdi.isBefore(cikisSaati!)) return MolaDurumu.YASANIYOR; return MolaDurumu.BILINMIYOR; } Duration yasananMola() { DateTime molaGiris = girisSaati!; DateTime molaCikis = cikisSaati!; DateTime molaSimdi = DateTime.now(); if (molaSimdi.isBeforeOrEqualTo(molaGiris)) return Duration.zero; if (molaSimdi.isAfterOrEqualTo(molaCikis)) return farkHesapla(); return molaSimdi.difference(molaGiris); } factory Mola.fromJson(Map json) => _$MolaFromJson(json); Map toJson() => _$MolaToJson(this); } @embedded @JsonSerializable() class ResmiTatil { ResmiTatil({this.ismi, this.aciklama}); DateTime? tarihi; String? ismi; String? aciklama; double mesaiOrani = 100.0; double dinlenmeGunuMesaiOrani = 100.0; double haftaTatiliMesaiOrani = 150.0; bool herSeneTekrarlar = false; bool telafiSayilabilir = false; factory ResmiTatil.fromJson(Map json) => _$ResmiTatilFromJson(json); Map toJson() => _$ResmiTatilToJson(this); } // @embedded // @JsonSerializable() // class ResmiTatilFazlaMesaiOranlari { // ResmiTatilFazlaMesaiOranlari(); // double? calismaGunuFazlaMesaiOrani = 50.0; // double? dinlenmeGunuFazlaMesaiOrani = 50.0; // double? haftaTatiliFazlaMesaiOrani = 100.0; // factory ResmiTatilFazlaMesaiOranlari.fromJson(Map json) => _$ResmiTatilFazlaMesaiOranlariFromJson(json); // Map toJson() => _$ResmiTatilFazlaMesaiOranlariToJson(this); // } @embedded @JsonSerializable() class MaasParametreleri { MaasParametreleri(); int? ikramiyeSayisi = 0; Maas ocak = Maas(ismi: "Ocak"); Maas subat = Maas(ismi: "Şubat"); Maas mart = Maas(ismi: "Mart"); Maas nisan = Maas(ismi: "Nisan"); Maas mayis = Maas(ismi: "Mayıs"); Maas haziran = Maas(ismi: "Haziran"); Maas temmuz = Maas(ismi: "Temmuz"); Maas agustos = Maas(ismi: "Ağustos"); Maas eylul = Maas(ismi: "Eylül"); Maas ekim = Maas(ismi: "Ekim"); Maas kasim = Maas(ismi: "Kasım"); Maas aralik = Maas(ismi: "Aralık"); List toListe() { return [ocak, subat, mart, nisan, mayis, haziran, temmuz, agustos, eylul, ekim, kasim, aralik]; } Maas buAy() { return toListe()[DateTime.now().month - 1]; } factory MaasParametreleri.fromJson(Map json) => _$MaasParametreleriFromJson(json); Map toJson() => _$MaasParametreleriToJson(this); } @embedded @JsonSerializable() class Maas { Maas({this.ismi = ""}); String? ismi; double? asgariUcret = 0.0; double? brutMaas = 0.0; double? netMaas = 0.0; List? ekOdemeler = List.empty(growable: true); List? kesintiler = List.empty(growable: true); List? vergiler = List.empty(growable: true); int? aylikMaasGunu = 30; int? aylikCalismaSaatiInMilliseconds = const Duration(hours: 270).inMilliseconds; @ignore Duration? get aylikCalismaSaati => aylikCalismaSaatiInMilliseconds != null ? Duration(milliseconds: aylikCalismaSaatiInMilliseconds!) : null; set aylikCalismaSaati(Duration? value) => aylikCalismaSaatiInMilliseconds = value?.inMilliseconds; fromOther({required Maas maas}) { // turu = gun.turu; asgariUcret = maas.asgariUcret; brutMaas = maas.brutMaas; netMaas = maas.netMaas; ekOdemeler = maas.ekOdemeler?.copy(); kesintiler = maas.kesintiler?.copy(); vergiler = maas.vergiler?.copy(); aylikMaasGunu = maas.aylikMaasGunu; aylikCalismaSaati = maas.aylikCalismaSaati; } @ignore double get saniyelikMaas { return (brutMaas ?? 0.0) / (aylikCalismaSaati?.inSeconds ?? 0.0); } factory Maas.fromJson(Map json) => _$MaasFromJson(json); Map toJson() => _$MaasToJson(this); } /** */ enum VergiTuru { DUZORAN(0, "Düz Oran", "🕹️"), KUMULATIF(1, "Kümülatif", "🍕"); // DIGER(-1, "Diğer", "❓"); const VergiTuru(this.value, this.ismi, this.simge); final int value; final String ismi; final String simge; // List tumu() => [EkOdemeTuru.IKRAMIYE, EkOdemeTuru.PRIM, EkOdemeTuru.YOL, EkOdemeTuru.YEMEK, EkOdemeTuru.SEYYANEN, EkOdemeTuru.DIGER]; } List get VergiTuruTumu => [VergiTuru.DUZORAN, VergiTuru.KUMULATIF]; /** */ enum VergiSekli { YUZDELIK(0, "Yüzdelik", "💯"), SABIT(1, "Sabit", "📌"), DIGER(-1, "Diğer", "❓"); const VergiSekli(this.value, this.ismi, this.simge); final int value; final String ismi; final String simge; } List get VergiSekliTumu => [VergiSekli.YUZDELIK, VergiSekli.SABIT, VergiSekli.DIGER]; extension VergilerEx on List { List copy() { List rslt = []; forEach((vrg) { Vergi yeniVrg = Vergi(); yeniVrg.turu = vrg.turu; yeniVrg.ismi = vrg.ismi; yeniVrg.aciklama = vrg.aciklama; yeniVrg.vergiSekli = vrg.vergiSekli; yeniVrg.istisna = vrg.istisna; yeniVrg.miktar = vrg.miktar; yeniVrg.kumulatifAltSinir = vrg.kumulatifAltSinir; yeniVrg.kumulatifUstSinir = vrg.kumulatifUstSinir; yeniVrg.oran = vrg.oran; rslt.add(yeniVrg); }); return rslt; } double hesaplaDuzOran({required double ucret}) { double snc = 0.0; for (var itm in this) { snc += itm.hesaplaDuzOran(ucret: ucret); } return snc; } double hesaplakumulatif({required double ucret, required double kumulatifMatrah}) { double snc = 0.0; for (var itm in this) { snc += itm.hesaplaKumulatif(ucret: ucret, kumulatifMatrah: kumulatifMatrah); } return snc; } double hesapla({required double ucret, required double kumulatifMatrah, required double guncelBrutMaas, required double guncelBrut}) { double snc = 0.0; double sncKumulatif = 0.0; for (var itm in this) { // if ((itm.istisna ?? 0.0) > (guncelBrutMaas + guncelBrut)) return 0.0; if (itm.turu == VergiTuru.DUZORAN) { itm.hesaplanan = max(0, itm.hesaplaDuzOran(ucret: guncelBrut) - (itm.istisna ?? 0.0)); snc += itm.hesaplanan ?? 0.0; } else { // itm.hesaplanan = max(0, itm.hesaplaKumulatif(ucret: ucret, kumulatifMatrah: kumulatifMatrah - ucret) - (itm.istisna ?? 0.0)); // print("${itm.ismi} ${itm.hesaplaKumulatif(ucret: ucret, kumulatifMatrah: kumulatifMatrah) - (itm.istisna ?? 0.0)} ${itm.hesaplanan}"); // sncKumulatif += itm.hesaplanan ?? 0.0; } } sncKumulatif = hesaplaKumulatif(ucret: ucret, kumulatifMatrah: kumulatifMatrah - ucret); return snc + sncKumulatif; } double hesaplaKumulatif({required double ucret, required double kumulatifMatrah}) { double sonuc = 0.0; double toplamVergi = 0.0; double toplamGelir = ucret + kumulatifMatrah; // Bu ayki gelir ve kümülatif gelir toplamı double oncekiVergi = 0.0; double oncekiMatrah = kumulatifMatrah; for (var itm in this) { if (itm.turu == VergiTuru.KUMULATIF) { double altSinir = itm.kumulatifAltSinir ?? 0.0; double ustSinir = itm.kumulatifUstSinir ?? double.infinity; // Yeni gelir üzerinden vergi hesapla if (toplamGelir > altSinir) { double vergilendirilebilirTutar = (toplamGelir > ustSinir ? ustSinir : toplamGelir) - altSinir; toplamVergi += vergilendirilebilirTutar * ((itm.oran ?? 0.0) / 100); } // Önceki matrah üzerinden vergi hesapla if (oncekiMatrah > altSinir) { double vergilendirilebilirTutar = (oncekiMatrah > ustSinir ? ustSinir : oncekiMatrah) - altSinir; oncekiVergi += vergilendirilebilirTutar * ((itm.oran ?? 0.0) / 100); } } } sonuc = toplamVergi - oncekiVergi; if (sonuc < 0) { sonuc = 0; } return sonuc; } double hesaplaKumulatif1({required double ucret, required double kumulatifMatrah}) { double sonuc = 0.0; /** */ double toplamVergi = 0.0; double toplamGelir = ucret + kumulatifMatrah; // Bu ayki gelir ve kümülatif gelir toplamı // print(toplamGelir); double oncekiVergi = 0.0; double oncekiMatrah = kumulatifMatrah; /** */ for (var itm in this) { if (itm.turu == VergiTuru.KUMULATIF) { print("$kumulatifMatrah | $toplamGelir"); double altSinir = itm.kumulatifAltSinir ?? 0.0; double ustSinir = itm.kumulatifUstSinir ?? double.infinity; // Yeni gelir üzerinden vergi hesapla if (toplamGelir > (itm.kumulatifAltSinir ?? 0.0)) { // Vergilendirilebilir kısmı hesapla double vergilendirilebilirTutar = (toplamGelir > ustSinir ? ustSinir : toplamGelir) - altSinir; toplamVergi += (itm.miktar ?? 0.0) + vergilendirilebilirTutar * ((itm.oran ?? 0.0) / 100); } // Önceki matrah üzerinden vergi hesapla if (oncekiMatrah > (itm.kumulatifAltSinir ?? 0.0)) { double altSinir = itm.kumulatifAltSinir ?? 0.0; double ustSinir = itm.kumulatifUstSinir ?? double.infinity; double vergilendirilebilirTutar = (oncekiMatrah > ustSinir ? ustSinir : oncekiMatrah) - altSinir; print("vergilendirilebilirTutar $vergilendirilebilirTutar"); oncekiVergi += ((itm.miktar ?? 0.0) + vergilendirilebilirTutar * (itm.oran ?? 0.0)) / 100; } } } sonuc = toplamVergi - oncekiVergi; if (sonuc < 0) { sonuc = 0; } return sonuc; } } // =MAK(0;MAK((O7-$F$22)*0,05;0)+MAK((O7-$F$21)*0,08;0)+MAK((O7-$F$20)*0,07;0)+MAK((O7-$F$19)*0,05;0)+O7*0,15-(MAK((O6-$F$22)*0,05;0)+MAK((O6-$F$21)*0,08;0)+MAK((O6-$F$20)*0,07;0)+MAK((O6-$F$19)*0,05;0)+O6*0,15)-D7) /** */ @embedded @JsonSerializable() class Vergi { Vergi(); @enumerated VergiTuru turu = VergiTuru.DUZORAN; String? ismi; String? aciklama; @enumerated VergiSekli vergiSekli = VergiSekli.YUZDELIK; double? istisna; double? miktar; double? kumulatifAltSinir; double? kumulatifUstSinir; double? oran; @ignore double? hesaplanan; double hesaplaDuzOran({required double ucret}) { double sonuc = 0.0; double hsp = 0.0; if (turu == VergiTuru.DUZORAN) { double sabit = 0.0; double yuzde = 0.0; yuzde = (vergiSekli == VergiSekli.YUZDELIK || vergiSekli == VergiSekli.DIGER) ? (oran ?? 0.0).toDouble() : 0.0; sabit = (vergiSekli == VergiSekli.SABIT || vergiSekli == VergiSekli.DIGER) ? (miktar ?? 0.0).toDouble() : 0.0; hsp = ucret - (/*(istisna ?? 0.0) +*/ sabit); sonuc += (hsp * (yuzde / 100)); } return sonuc; } double hesaplaKumulatif({required double ucret, required double kumulatifMatrah}) { double sonuc = 0.0; /** */ double toplamVergi = 0.0; double toplamGelir = ucret + kumulatifMatrah; // Bu ayki gelir ve kümülatif gelir toplamı // print(toplamGelir); double oncekiVergi = 0.0; double oncekiMatrah = kumulatifMatrah; /** */ if (turu == VergiTuru.KUMULATIF) { print("$kumulatifMatrah | $toplamGelir"); // Yeni gelir üzerinden vergi hesapla if (toplamGelir > (kumulatifAltSinir ?? 0.0)) { double altSinir = kumulatifAltSinir ?? 0.0; double ustSinir = kumulatifUstSinir ?? double.infinity; // Vergilendirilebilir kısmı hesapla double vergilendirilebilirTutar = (toplamGelir > ustSinir ? ustSinir : toplamGelir) - altSinir; toplamVergi += (miktar ?? 0.0) + vergilendirilebilirTutar * ((oran ?? 0.0) / 100); } // Önceki matrah üzerinden vergi hesapla if (oncekiMatrah > (kumulatifAltSinir ?? 0.0)) { double altSinir = kumulatifAltSinir ?? 0.0; double ustSinir = kumulatifUstSinir ?? double.infinity; double vergilendirilebilirTutar = (oncekiMatrah > ustSinir ? ustSinir - altSinir : oncekiMatrah - altSinir); print("vergilendirilebilirTutar $vergilendirilebilirTutar"); oncekiVergi += ((miktar ?? 0.0) + vergilendirilebilirTutar * (oran ?? 0.0)) / 100; } } sonuc = toplamVergi - oncekiVergi; if (sonuc < 0) { sonuc = 0; } return sonuc; } factory Vergi.fromJson(Map json) => _$VergiFromJson(json); Map toJson() => _$VergiToJson(this); } /** */ enum KesintiTuru { SGK(0, "SGK", "🩺"), ISSIZLIK(1, "İşsizlik", "🚶🏻"), DIGER(-1, "Diğer", "❓"); const KesintiTuru(this.value, this.ismi, this.simge); final int value; final String ismi; final String simge; // List tumu() => [EkOdemeTuru.IKRAMIYE, EkOdemeTuru.PRIM, EkOdemeTuru.YOL, EkOdemeTuru.YEMEK, EkOdemeTuru.SEYYANEN, EkOdemeTuru.DIGER]; } List get KesintiTuruTumu => [KesintiTuru.SGK, KesintiTuru.ISSIZLIK, KesintiTuru.DIGER]; /** */ enum KesintiSekli { YUZDELIK(0, "Yüzdelik", "💯"), SABIT(1, "Sabit", "📌"), DIGER(-1, "Diğer", "❓"); const KesintiSekli(this.value, this.ismi, this.simge); final int value; final String ismi; final String simge; } List get KesintiSekliTumu => [KesintiSekli.YUZDELIK, KesintiSekli.SABIT, KesintiSekli.DIGER]; extension KesintiEx on List { List copy() { List rslt = []; forEach((ksnt) { Kesinti ynekKsnt = Kesinti(); ynekKsnt.turu = ksnt.turu; ynekKsnt.ismi = ksnt.ismi; ynekKsnt.aciklama = ksnt.aciklama; ynekKsnt.kesintiSekli = ksnt.kesintiSekli; ynekKsnt.istisna = ksnt.istisna; ynekKsnt.miktar = ksnt.miktar; ynekKsnt.oran = ksnt.oran; ynekKsnt.GVMatrahindanDus = ksnt.GVMatrahindanDus; rslt.add(ynekKsnt); }); return rslt; } double hesapla({required double ucret, required double guncelBrutMaas, required double guncelBrut}) { double snc = 0.0; for (var itm in this) { snc += itm.hesapla(ucret: ucret, guncelBrutMaas: guncelBrutMaas, guncelBrut: guncelBrut); } return snc; } } /** */ @embedded @JsonSerializable() class Kesinti { Kesinti(); @enumerated KesintiTuru turu = KesintiTuru.DIGER; String? ismi; String? aciklama; @enumerated KesintiSekli kesintiSekli = KesintiSekli.YUZDELIK; double? istisna; double? miktar; double? oran; bool? GVMatrahindanDus = true; @ignore double? hesaplanan; double hesapla({required double ucret, required double guncelBrutMaas, required double guncelBrut}) { // print("Güncel Brüt Maaş + Ücret:${guncelBrutMaas + guncelBrut} - İstisna:$istisna"); // if ((istisna ?? 0.0) > (guncelBrutMaas + guncelBrut)) return 0.0; double sonuc = 0.0; double hsp = 0.0; if (GVMatrahindanDus ?? true) { double kesintiSabit = 0.0; double kesintiYuzde = 0.0; kesintiYuzde = (kesintiSekli == KesintiSekli.YUZDELIK || kesintiSekli == KesintiSekli.DIGER) ? (oran ?? 0.0).toDouble() : 0.0; kesintiSabit = (kesintiSekli == KesintiSekli.SABIT || kesintiSekli == KesintiSekli.DIGER) ? (miktar ?? 0.0).toDouble() : 0.0; hsp = ucret - (/*(istisna ?? 0.0) +*/ kesintiSabit); sonuc += (hsp * (kesintiYuzde / 100)); } hesaplanan = max(0, sonuc - (istisna ?? 0.0)); return hesaplanan ?? 0.0; } factory Kesinti.fromJson(Map json) => _$KesintiFromJson(json); Map toJson() => _$KesintiToJson(this); } /** */ enum EkOdemeTuru { IKRAMIYE(0, "İkramiye", "➕"), PRIM(1, "Prim", "💎"), YOL(2, "Yol", "🚕"), YEMEK(3, "Yemek", "🍽️"), SEYYANEN(4, "Seyyanen", "🖇️"), YIPRANMA(5, "Yıpranma", "☣️"), DIGER(-1, "Diğer", "❓"); const EkOdemeTuru(this.value, this.ismi, this.simge); final int value; final String ismi; final String simge; // List tumu() => [EkOdemeTuru.IKRAMIYE, EkOdemeTuru.PRIM, EkOdemeTuru.YOL, EkOdemeTuru.YEMEK, EkOdemeTuru.SEYYANEN, EkOdemeTuru.DIGER]; } List get EkOdemeTuruTumu => [EkOdemeTuru.IKRAMIYE, EkOdemeTuru.PRIM, EkOdemeTuru.YOL, EkOdemeTuru.YEMEK, EkOdemeTuru.SEYYANEN, EkOdemeTuru.YIPRANMA, EkOdemeTuru.DIGER]; /** */ @embedded @JsonSerializable() class EkOdeme { EkOdeme(); @enumerated EkOdemeTuru turu = EkOdemeTuru.DIGER; String? ismi; String? aciklama; double? miktar; bool? bruteEkle = true; factory EkOdeme.fromJson(Map json) => _$EkOdemeFromJson(json); Map toJson() => _$EkOdemeToJson(this); } extension EkOdemeEx on List { List copy() { List rslt = []; forEach((ekodm) { EkOdeme ynekOdm = EkOdeme(); ynekOdm.turu = ekodm.turu; ynekOdm.ismi = ekodm.ismi; ynekOdm.aciklama = ekodm.aciklama; ynekOdm.miktar = ekodm.miktar; ynekOdm.bruteEkle = ekodm.bruteEkle; rslt.add(ynekOdm); }); return rslt; } double toplam() { return fold(0, (sum, item) => (item.bruteEkle ?? true) == true ? (sum + (item.miktar ?? 0.0)) : sum); } }