// import 'package:dart_eval/dart_eval.dart'; import 'dart:io'; import 'dart:isolate'; import 'package:fikoyt_mesaici/apps/mesaici/model/model_hareketler.dart'; import 'package:fikoyt_mesaici/apps/mesaici/servisler/fikoyt.mesaici.service.dart'; import 'package:fikoyt_mesaici/core/fikoyt.service.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:isar/isar.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:fikoyt_mesaici/core/Extensions/fiko_tarih.dart'; import 'package:path_provider/path_provider.dart'; import '../ayarlar/model_ayarlar.dart' hide GunTuru; /// This allows the `User` class to access private members in /// the generated file. The value for this is *.g.dart, where /// the star denotes the source file name. part 'calisma_kayit.g.dart'; enum GunTuru { CALISMA_GUNU, DINLENME_GUNU, HAFTA_TATILI } /// An annotation for the code generator to know that this class needs the /// JSON serialization logic to be generated. @collection @JsonSerializable() class CalismaKayit { CalismaKayit({this.id = 0}); CalismaKayit.kartEkle({this.id = 0, bool gunAyarlariniAktar = false}) { // FikoYTMesaiciService FikoYTService.servisMesaici = Get.put(FikoYTMesaiciService()); tarih = DateTime.now(); maas = FikoYTService.servisMesaici.ayarlarModel?.value.maasParametreleri.toListe()[DateTime.now().month - 1]; aktifVardiya = FikoYTService.servisMesaici.ayarlarModel?.value.calismaSuresiAyarlari.vardiyalar[FikoYTService.servisMesaici.ayarlarModel?.value.calismaSuresiAyarlari.aktifVardiya ?? 0]; if (gunAyarlariniAktar) { calismaSuresi = bugununAyari.calismaSuresi; ekOdemeler = bugununAyari.ekOdemeler?.copy(); kesintiler = bugununAyari.kesintiler?.copy(); vergiler = bugununAyari.vergiler?.copy(); gunTuru = bugununAyari.turu; gecerliMesaiOraniAl(); gecerliMolalariAl(); } } CalismaKayit.fromEmbedded({this.id = 0, required CalismaKayitEmbedded aktifKart}) { tarih = aktifKart.tarih; aktifVardiya = aktifKart.aktifVardiya; gunTuru = aktifKart.gunTuru; giris = aktifKart.giris; cikis = aktifKart.cikis; molalar = aktifKart.molalar?.copy(); molalar?.forEach( (ml) async { ml.girisSaati = ml.girisSaati?.ayarlaTarih(tarih!); ml.cikisSaati = ml.cikisSaati?.ayarlaTarih(tarih!); }, ); maas = aktifKart.maas; calismaSuresi = aktifKart.calismaSuresi; mesaiOrani = aktifKart.mesaiOrani; servisGecikmesi = aktifKart.servisGecikmesi; resmiTatil = aktifKart.resmiTatil; raporlu = aktifKart.raporlu; gunlukIzinli = aktifKart.gunlukIzinli; yillikIzinli = aktifKart.yillikIzinli; yolParasiVar = aktifKart.yolParasiVar; yemekParasiVar = aktifKart.yemekParasiVar; ekOdemeler = aktifKart.ekOdemeler?.copy(); kesintiler = aktifKart.kesintiler?.copy(); vergiler = aktifKart.vergiler?.copy(); } kartEkle({bool gunAyarlariniAktar = false, DateTime? kartTarih}) { FikoYTMesaiciService FikoYTService.servisMesaici = Get.put(FikoYTMesaiciService()); tarih = kartTarih ?? DateTime.now(); maas = FikoYTService.servisMesaici.ayarlarModel?.value.maasParametreleri.toListe()[DateTime.now().month - 1]; aktifVardiya = FikoYTService.servisMesaici.ayarlarModel?.value.calismaSuresiAyarlari.vardiyalar[FikoYTService.servisMesaici.ayarlarModel?.value.calismaSuresiAyarlari.aktifVardiya ?? 0]; if (gunAyarlariniAktar) { calismaSuresi = bugununAyari.calismaSuresi; ekOdemeler = bugununAyari.ekOdemeler?.copy(); kesintiler = bugununAyari.kesintiler?.copy(); vergiler = bugununAyari.vergiler?.copy(); gunTuru = bugununAyari.turu; gecerliMesaiOraniAl(); gecerliMolalariAl(); } } Id id; DateTime? tarih; Vardiya? aktifVardiya; @enumerated GunTuru gunTuru = GunTuru.CALISMA_GUNU; DateTime? giris; DateTime? cikis; List? molalar; Maas? maas; int? calismaSuresiInSeconds; @ignore Duration? get calismaSuresi => calismaSuresiInSeconds != null ? Duration(microseconds: calismaSuresiInSeconds!) : null; set calismaSuresi(Duration? value) => calismaSuresiInSeconds = value?.inMicroseconds; double? mesaiOraniNum = 0.0; @ignore num? get mesaiOrani => mesaiOraniNum; set mesaiOrani(num? value) => mesaiOraniNum = value?.toDouble(); bool servisGecikmesi = false; bool resmiTatil = false; bool raporlu = false; bool gunlukIzinli = false; bool yillikIzinli = false; bool yolParasiVar = false; bool yemekParasiVar = false; // List? ekOdemeler = List.empty(growable: true); List? ekOdemeler = List.empty(growable: true); List? kesintiler = List.empty(growable: true); List? vergiler = List.empty(growable: true); @JsonKey(ignore: true) @ignore RxBool? ekSatirlar = false.obs; /** * */ @ignore double get mesaiCarpani { double carpan = (mesaiOrani?.toDouble() ?? 1.0); carpan = (carpan / 100.0) + 1; if (carpan <= 0) carpan = 1.0; return carpan; } @ignore double get brutNormal { return (normalMesai?.inSeconds ?? 0.0) * (maas?.saniyelikMaas ?? 0.0); } @ignore double get brutFazlaMesai { return ((fazlaMesai?.inSeconds ?? 0.0) * (maas?.saniyelikMaas ?? 0.0)) * mesaiCarpani; } @ignore double get brutToplam { return brutNormal + brutFazlaMesai + (ekOdemeler?.toplam() ?? 0.0); } @ignore double get gelirVergisiMatrahi { return brutToplam - (kesintiler?.hesapla(ucret: brutToplam, guncelBrutMaas: guncelBrutMaas, guncelBrut: brutToplam) ?? 0.0); } @ignore double get kesintiToplam { return kesintiler?.hesapla(ucret: brutToplam, guncelBrutMaas: guncelBrutMaas, guncelBrut: brutToplam) ?? 0.0; } @ignore double get kesintiFazlaMesai { return kesintiler?.hesapla(ucret: brutFazlaMesai, guncelBrutMaas: guncelBrutMaas, guncelBrut: brutToplam) ?? 0.0; } @ignore double get kesintiEkOdeme { return kesintiler?.hesapla(ucret: ekOdemeler?.toplam() ?? 0.0, guncelBrutMaas: guncelBrutMaas, guncelBrut: brutToplam) ?? 0.0; } @ignore double get vergilerToplam { return vergiler?.hesapla(ucret: gelirVergisiMatrahi, kumulatifMatrah: kumulatifMatrah, guncelBrutMaas: guncelBrutMaas, guncelBrut: brutToplam) ?? 0.0; } @ignore double get vergiFazlaMesai { return vergiler?.hesapla(ucret: brutFazlaMesai - kesintiFazlaMesai, kumulatifMatrah: kumulatifMatrah, guncelBrutMaas: guncelBrutMaas, guncelBrut: brutToplam) ?? 0.0; } @ignore double get vergiEkOdeme { return vergiler?.hesapla(ucret: (ekOdemeler?.toplam() ?? 0.0) - kesintiEkOdeme, kumulatifMatrah: kumulatifMatrah, guncelBrutMaas: guncelBrutMaas, guncelBrut: brutToplam) ?? 0.0; } @ignore double get netFazlaMesai { return brutFazlaMesai - kesintiFazlaMesai - vergiFazlaMesai; } @ignore double get netEkUcretler { return (ekOdemeler?.toplam() ?? 0.0) - kesintiEkOdeme - vergiEkOdeme; } @ignore double get odenecekUcret { return brutToplam - (kesintiToplam + vergilerToplam + 0); } double guncelBrutMaas = 0.0; // @ignore // double get guncelBrutMaas { // final FikoYTMesaiciService FikoYTService.servisMesaici = Get.put(FikoYTMesaiciService()); // /** */ // List liste = FikoYTService.servisMesaici.isar?.modelHareketlers.where().filter().turuEqualTo(KartTuru.CALISMA_KARTI).calismaKarti((q) => q.tarihBetween(tarih?.ayinIlkGunu().ilkSaatler(), tarih?.sonSaatler())).calismaKartiProperty().findAllSync(); // /** */ // double sonuc = 0; // for (var i = 0; i < liste.length; i++) { // CalismaKayitEmbedded? item = liste[i]; // if (item != null) { // // await item.hesaplamalar.hesapla(); // sonuc += item.brutToplam; // } // } // // sonuc += odenecekUcret; // return sonuc; // } // @ignore double kumulatifMatrah = 0.0; // Future kumulatifMatrahGuncelle() async { // kumulatifMatrah = await kumulatifMatrahHesapla(); // return kumulatifMatrah; // } double kumulatifMatrahGuncelleSync() { // final FikoYTMesaiciService FikoYTService.servisMesaici = Get.put(FikoYTMesaiciService()); /** */ List liste = FikoYTService.servisMesaici.isar!.modelHareketlers.where().filter().turuEqualTo(KartTuru.CALISMA_KARTI).calismaKarti((q) => q.tarihBetween(tarih?.yilinIlkGunu(), tarih?.sonSaatler())).calismaKartiProperty().findAllSync(); /** */ double sonucGelirVergisiMatrahi = 0; guncelBrutMaas = 0; for (var i = 0; i < liste.length; i++) { CalismaKayitEmbedded? item = liste[i]; if (item != null) { // await item.hesaplamalar.hesapla(); sonucGelirVergisiMatrahi += item.gelirVergisiMatrahi; if (tarih!.ayinIlkGunu().ilkSaatler().isBefore(item.tarih!)) { if (item.tarih!.isBefore(tarih!.sonSaatler())) { guncelBrutMaas += item.gelirVergisiMatrahi; } } } } // guncelMaas += odenecekUcret; kumulatifMatrah = sonucGelirVergisiMatrahi; return sonucGelirVergisiMatrahi; } /** * */ bool kartKaydedilebilir() { if (giris == null && ((gunTuru == GunTuru.HAFTA_TATILI || gunTuru == GunTuru.DINLENME_GUNU) || resmiTatil || gunlukIzinli || raporlu || yillikIzinli)) { return true; } if ((giris != null && cikis == null) && (gunlukIzinli || raporlu || yillikIzinli)) { return true; } if (giris != null && cikis == null && ((gunTuru == GunTuru.HAFTA_TATILI || gunTuru == GunTuru.DINLENME_GUNU) || resmiTatil)) { return false; } if (giris == null && cikis == null) { return false; } if ((giris != null && cikis != null)) { return true; } return false; } girisYap() { // DateTime sonuc = DateTime.now(); // final program = r''' // class Cat { // Cat(this.name); // final String name; // String speak() => "I'm $name!"; // } // String main() { // final cat = Cat('Fluffy'); // return cat.name; // } // '''; // print(eval(program, function: 'main')); Duration girisToleransi = bugununAyari.girisToleransi ?? Duration.zero; if (girisToleransi == Duration.zero) { giris = DateTime.now(); return; } DateTime? girisSaati = bugununAyari.girisSaati; if (girisSaati == null) { giris = DateTime.now(); return; } if (tarih == null) { giris = DateTime.now(); return; } DateTime maksZaman = tarih!.ayarlaGununSaati(girisSaati.add(girisToleransi).gununSaati()); DateTime minZaman = tarih!.ayarlaGununSaati(girisSaati.subtract(girisToleransi).gununSaati()); if (DateTime.now().miArasinda(minZaman, maksZaman) == true) { giris = tarih?.ayarlaGununSaati(girisSaati.gununSaati()); } else { giris = DateTime.now(); } } normalGirisiYap() { DateTime? girisSaati = bugununAyari.girisSaati; if (girisSaati == null) { giris = DateTime.now(); return; } giris = tarih?.ayarlaGununSaati(girisSaati.gununSaati()); } cikisYap() { Duration cikisToleransi = bugununAyari.cikisToleransi ?? Duration.zero; if (cikisToleransi == Duration.zero) { cikis = DateTime.now(); return; } DateTime? cikisSaati = bugununAyari.cikisSaati; if (cikisSaati == null) { cikis = DateTime.now(); return; } if (tarih == null) { cikis = DateTime.now(); return; } DateTime maksZaman = tarih!.ayarlaGununSaati(cikisSaati.add(cikisToleransi).gununSaati()); DateTime minZaman = tarih!.ayarlaGununSaati(cikisSaati.subtract(cikisToleransi).gununSaati()); if (DateTime.now().miArasinda(minZaman, maksZaman) == true) { cikis = tarih?.ayarlaGununSaati(cikisSaati.gununSaati()); } else { cikis = DateTime.now(); } } normalCikisiYap() { DateTime? cikisSaati = bugununAyari.cikisSaati; if (cikisSaati == null) { cikis = DateTime.now(); return; } cikis = tarih?.ayarlaGununSaati(cikisSaati.gununSaati()); } sil() { tarih = null; } sifirla() { tarih = null; aktifVardiya = null; gunTuru = GunTuru.CALISMA_GUNU; giris = null; cikis = null; molalar = []; maas = null; calismaSuresi = null; mesaiOrani = null; servisGecikmesi = false; resmiTatil = false; raporlu = false; gunlukIzinli = false; yillikIzinli = false; yolParasiVar = false; yemekParasiVar = false; ekOdemeler = []; kesintiler = []; vergiler = []; ekSatirlar?.value = true; } gecerliMolalariAl() { molalar = bugununAyari.molalar?.copy(); molalar?.forEach( (ml) async { ml.girisSaati = ml.girisSaati?.ayarlaTarih(tarih!); ml.cikisSaati = ml.cikisSaati?.ayarlaTarih(tarih!); }, ); } gecerliMesaiOraniAl() { mesaiOrani = bugununAyari.mesaiOrani; } /** * Background Kümülatif Matrah */ static void IsolateFonkKumulatifMatrah(dynamic Params) async { if (Params[0] == null || Params[1] == null || Params[2] == null || Params[3] == null) { Isolate.current.kill(priority: Isolate.immediate); } /** Parametreler */ RootIsolateToken rootToken = Params[0]; SendPort sendPort = Params[1]; DateTime ilkTarih = Params[2]; DateTime sonTarih = Params[3]; /** */ BackgroundIsolateBinaryMessenger.ensureInitialized(rootToken); Future getCustomDirectoryAndroid(String subDirectoryName) async { // Uygulamanın belgeler dizinini al final directory = await getApplicationDocumentsDirectory(); // Alt klasörün yolunu oluştur final customDirectory = Directory('${directory.path}${Platform.pathSeparator}$subDirectoryName'); // Eğer alt klasör mevcut değilse oluştur if (!await customDirectory.exists()) { await customDirectory.create(recursive: true); } return customDirectory; } Future getCustomDirectoryWindows(String subDirectoryName) async { String executablePath; int lastSeparatorIndex; String executableDir; executablePath = Platform.resolvedExecutable; lastSeparatorIndex = executablePath.lastIndexOf(Platform.pathSeparator); executableDir = executablePath.substring(0, lastSeparatorIndex); // Uygulamanın belgeler dizinini al final directory = executableDir; // Alt klasörün yolunu oluştur final customDirectory = Directory('$directory${Platform.pathSeparator}$subDirectoryName'); // Eğer alt klasör mevcut değilse oluştur if (!await customDirectory.exists()) { await customDirectory.create(recursive: true); } return customDirectory; } /** */ String executableDir; if (Platform.isWindows) { executableDir = (await getCustomDirectoryWindows("databases")).path; } else if (Platform.isAndroid) { executableDir = (await getCustomDirectoryAndroid("databases")).path; } else { executableDir = (await getCustomDirectoryAndroid("databases")).path; } Isar isar = Isar.getInstance("FikoYT.db") ?? await Isar.open([CalismaKayitSchema, ModelAyarlarSchema, ModelHareketlerSchema], directory: executableDir, name: "FikoYT.db", inspector: false); /** */ List liste = await isar.modelHareketlers.where().filter().turuEqualTo(KartTuru.CALISMA_KARTI).calismaKarti((q) => q.tarihBetween(ilkTarih, sonTarih)).calismaKartiProperty().findAll(); /** */ double sonuc = 0; for (var i = 0; i < liste.length; i++) { CalismaKayitEmbedded? item = liste[i]; if (item != null) { // await item.hesaplamalar.hesapla(); sonuc += item.gelirVergisiMatrahi; } } // İşlem bitince sonucu geri gönderiyoruz sendPort.send(sonuc); /** */ /** */ Isolate.current.kill(priority: Isolate.immediate); } Future kumulatifMatrahHesapla() async { // FikoYTMesaiciService FikoYTService.servisMesaici = Get.put(FikoYTMesaiciService()); //---> final receivePort = ReceivePort(); var rootToken = RootIsolateToken.instance!; await Isolate.spawn(IsolateFonkKumulatifMatrah, [rootToken, receivePort.sendPort, FikoYTService.servisMesaici.aktifAy.value.yilinIlkGunu(), tarih?.sonSaatler()]); kumulatifMatrah = await receivePort.first; return kumulatifMatrah; } /** * Toplam Çalışma Süresi Hesapla Fazla Mesai İçin Ayrı yapıcam Büyük İhtimal */ @ignore GunAyari get bugununAyari { GunAyari bugun = aktifVardiya!.gunAyarlari.toListe()[tarih != null ? tarih!.weekday - 1 : DateTime.now().weekday - 1]; return GunAyari(ismi: bugun.ismi, turu: bugun.turu).fromOther(gun: bugun, tumu: true); } /** * Toplam Çalışma Süresi Hesapla Fazla Mesai İçin Ayrı yapıcam Büyük İhtimal */ @ignore Duration? get calisilanSure { /// Yıllık İzili İse if (yillikIzinli) return calismaSuresi; if (gunlukIzinli) return Duration.zero; if (raporlu) return Duration.zero; /// Giriş Çıkış Seçilmemiş İse ve Dinlenme Veya Hafta Tatili İse if (giris == null && cikis == null && (gunTuru == GunTuru.DINLENME_GUNU || gunTuru == GunTuru.HAFTA_TATILI)) return calismaSuresi; /// if (giris == null && cikis == null && resmiTatil) return calismaSuresi; /// if (gunlukIzinli && raporlu) return Duration.zero; /// if (giris == null && cikis == null && (gunTuru != GunTuru.DINLENME_GUNU || gunTuru != GunTuru.HAFTA_TATILI)) return Duration.zero; /// if (gunTuru == GunTuru.DINLENME_GUNU || gunTuru == GunTuru.HAFTA_TATILI || resmiTatil) return (calismaSuresi ?? Duration.zero) + ((cikis ?? DateTime.now()).difference((giris ?? DateTime.now())) - (yasananMolaSuresi)); return ((cikis ?? DateTime.now()).difference((giris ?? DateTime.now())) - (yasananMolaSuresi)); } /** * Günlük Normal Mesainiz */ @ignore Duration? get normalMesai { return ((calisilanSure ?? Duration.zero) <= (calismaSuresi ?? Duration.zero)) ? calisilanSure : calismaSuresi; } /** * Günlük Fazla Mesainiz */ @ignore Duration? get fazlaMesai { return ((calisilanSure ?? Duration.zero) > (calismaSuresi ?? Duration.zero)) ? (calisilanSure ?? Duration.zero) - (calismaSuresi ?? Duration.zero) : Duration.zero; } /** * Hesaplamalar */ // @ignore // CalismaKayitHesaplamalar? _hesaplamalar; // @ignore // CalismaKayitHesaplamalar get hesaplamalar { // _hesaplamalar ??= CalismaKayitHesaplamalar(aktifCalisma: this); // return _hesaplamalar!; // } CalismaKayitEmbedded toEmbedded() { return CalismaKayitEmbedded.fromAktifKart(aktifKart: this); } ModelHareketler toModelHareket() { ModelHareketler rslt = ModelHareketler(); rslt.tarih = DateTime.now(); rslt.turu = KartTuru.CALISMA_KARTI; rslt.calismaKarti = CalismaKayitEmbedded.fromAktifKart(aktifKart: this); return rslt; } @ignore Duration get yasananMolaSuresi { if (tarih == null) return Duration.zero; if (giris == null) return Duration.zero; if (giris != null && cikis != null) return molalar?.toplamMola ?? Duration.zero; int sonuc = 0; molalar?.forEach((element) { sonuc += element.yasananMola().inMicroseconds; }); return Duration(microseconds: sonuc); } /// A necessary factory constructor for creating a new User instance /// from a map. Pass the map to the generated `_$UserFromJson()` constructor. /// The constructor is named after the source class, in this case, User. factory CalismaKayit.fromJson(Map json) => _$CalismaKayitFromJson(json); /// `toJson` is the convention for a class to declare support for serialization /// to JSON. The implementation simply calls the private, generated /// helper method `_$UserToJson`. Map toJson() => _$CalismaKayitToJson(this); }