326 lines
9.5 KiB
Dart
326 lines
9.5 KiB
Dart
import 'package:bijoy_helper/bijoy_helper.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:pdf/widgets.dart' as pw;
|
|
|
|
import 'generated/l10n.dart' as lang;
|
|
|
|
const kMainColor = Color(0xffC52127);
|
|
const kMainColor100 = Color(0xffFDE7F2);
|
|
const kMainColor50 = Color(0xffFEF0F1);
|
|
const kMainColor2 = Color(0xffFEF0F1);
|
|
const kGreyTextColor = Color(0xFF828282);
|
|
const kGrey6 = Color(0xff666666);
|
|
const kBackgroundColor = Color(0xffF5F3F3);
|
|
const kBorderColorTextField = Color(0xFFC2C2C2);
|
|
const kDarkWhite = Color(0xFFF1F7F7);
|
|
const kWhite = Color(0xFFffffff);
|
|
const kBottomBorder = Color(0xffE6E6E6);
|
|
const kBorderColor = Color(0xffD8D8D8);
|
|
const kPeraColor = Color(0xff4B5563);
|
|
const kPeragrapColor = Color(0xff656565);
|
|
const kTextColor = Color(0xff121535);
|
|
const kLineColor = Color(0xffE6E6E9);
|
|
const kSubPeraColor = Color(0xff999999);
|
|
const kSuccessColor = Colors.green;
|
|
const kPremiumPlanColor = Color(0xFF8752EE);
|
|
const kPremiumPlanColor2 = Color(0xFFFF5F00);
|
|
const kSecondayColor = Color(0xffF68A3D);
|
|
const kTitleColor = Color(0xFF000000);
|
|
const kStoreColor = Color(0xffFF5D32);
|
|
const kNeutral800 = Color(0xff4B5563);
|
|
const kNeutralColor = Color(0xFF4D4D4D);
|
|
const kDueColor = Color(0xffFF5F00);
|
|
const kAdvanceColor = Color(0xff29CE00);
|
|
const kBorder = Color(0xFF999999);
|
|
const updateBorderColor = Color(0xffD8D8D8);
|
|
bool isPrintEnable = false;
|
|
String noProductImageUrl = 'images/no_product_image.png';
|
|
|
|
///_______Purchase_Code________________________________________
|
|
//String purchaseCode = 'IVIP56510558';
|
|
|
|
///---------update information---------------
|
|
|
|
const String splashLogo = 'images/splashLogo.png';
|
|
const String onboard1 = 'images/onbord1.png';
|
|
const String onboard2 = 'images/onbord2.png';
|
|
const String onboard3 = 'images/onbord3.png';
|
|
const String logo = 'images/logo.png';
|
|
const String appsName = 'POSpro';
|
|
const String companyWebsite = 'https://acnoo.com';
|
|
const String companyName = 'Acnoo';
|
|
|
|
bool connected = false;
|
|
|
|
const kButtonDecoration = BoxDecoration(
|
|
borderRadius: BorderRadius.all(
|
|
Radius.circular(5),
|
|
),
|
|
);
|
|
|
|
const kInputDecoration = InputDecoration(
|
|
hintStyle: TextStyle(color: kGreyTextColor),
|
|
floatingLabelBehavior: FloatingLabelBehavior.always,
|
|
enabledBorder: OutlineInputBorder(
|
|
borderRadius: BorderRadius.all(Radius.circular(8.0)),
|
|
borderSide: BorderSide(color: kBorderColor, width: 1),
|
|
),
|
|
focusedBorder: OutlineInputBorder(
|
|
borderRadius: BorderRadius.all(Radius.circular(6.0)),
|
|
borderSide: BorderSide(color: kBorderColor, width: 1),
|
|
),
|
|
);
|
|
OutlineInputBorder outlineInputBorder() {
|
|
return OutlineInputBorder(
|
|
borderRadius: BorderRadius.circular(1.0),
|
|
borderSide: const BorderSide(color: kBorderColorTextField),
|
|
);
|
|
}
|
|
|
|
final otpInputDecoration = InputDecoration(
|
|
contentPadding: const EdgeInsets.symmetric(vertical: 5.0),
|
|
border: outlineInputBorder(),
|
|
focusedBorder: outlineInputBorder(),
|
|
enabledBorder: outlineInputBorder(),
|
|
);
|
|
|
|
//----------Days List--------
|
|
List<String> durationList = [
|
|
'Days',
|
|
'Month',
|
|
'Year',
|
|
];
|
|
|
|
List<String> guaranteeList = [
|
|
'Days',
|
|
'Month',
|
|
'Year',
|
|
];
|
|
|
|
//----------------Class Party-------------
|
|
|
|
class PartyType {
|
|
static const customer = 'customer';
|
|
static const supplier = 'supplier';
|
|
static const dealer = 'dealer';
|
|
static const wholesaler = 'wholesaler';
|
|
}
|
|
|
|
String getPartyTypeLabel(BuildContext context, String value) {
|
|
switch (value) {
|
|
case PartyType.customer:
|
|
return lang.S.of(context).customer;
|
|
case PartyType.supplier:
|
|
return lang.S.of(context).supplier;
|
|
case PartyType.dealer:
|
|
return lang.S.of(context).dealer;
|
|
case PartyType.wholesaler:
|
|
return lang.S.of(context).wholesaler;
|
|
default:
|
|
return '';
|
|
}
|
|
}
|
|
|
|
///__________Language________________________________
|
|
Map<String, String> languageMap = {
|
|
'English': 'en',
|
|
'Afrikaans': 'af',
|
|
'Amharic': 'am', //not suppored pdf
|
|
'Arabic': 'ar',
|
|
'Assamese': 'as',
|
|
'Azerbaijani': 'az',
|
|
'Belarusian': 'be',
|
|
'Bulgarian': 'bg',
|
|
'Bengali': 'bn',
|
|
'Bosnian': 'bs',
|
|
'Catalan Valencian': 'ca',
|
|
'Czech': 'cs',
|
|
'Welsh': 'cy',
|
|
'Danish': 'da',
|
|
'German': 'de',
|
|
'Modern Greek': 'el',
|
|
'Spanish Castilian': 'es',
|
|
'Estonian': 'et',
|
|
'Basque': 'eu',
|
|
'Persian': 'fa',
|
|
'Finnish': 'fi',
|
|
'Filipino Pilipino': 'fil',
|
|
'French': 'fr',
|
|
'Galician': 'gl',
|
|
'Swiss German Alemannic Alsatian': 'gsw',
|
|
'Gujarati': 'gu', //not supported pdf
|
|
'Hebrew': 'he', //not supported pdf
|
|
'Hindi': 'hi',
|
|
'Croatian': 'hr',
|
|
'Hungarian': 'hu',
|
|
'Armenian': 'hy', //not supported pdf
|
|
'Indonesian': 'id',
|
|
'Icelandic': 'is',
|
|
'Italian': 'it',
|
|
'Japanese': 'ja',
|
|
'Georgian': 'ka', //not supported pdf
|
|
'Kazakh': 'kk',
|
|
'Khmer Central Khmer': 'km', //not supported pdf
|
|
'Kannada': 'kn', // not supported pdf
|
|
'Korean': 'ko', // not supported pdf
|
|
'Kirghiz Kyrgyz': 'ky',
|
|
'Lao': 'lo', //not supported pdf
|
|
'Lithuanian': 'lt',
|
|
'Latvian': 'lv',
|
|
'Macedonian': 'mk',
|
|
'Malayalam': 'ml', //not supported pdf
|
|
'Mongolian': 'mn',
|
|
'Marathi': 'mr',
|
|
'Malay': 'ms',
|
|
'Burmese': 'my', //not supported pdf
|
|
'Norwegian Bokmål': 'nb',
|
|
'Nepali': 'ne',
|
|
'Dutch Flemish': 'nl',
|
|
'Norwegian': 'no',
|
|
'Oriya': 'or', //not supported pdf
|
|
'Panjabi Punjabi': 'pa', //not supported pdf
|
|
'Polish': 'pl',
|
|
'Pushto Pashto': 'ps',
|
|
'Portuguese': 'pt',
|
|
'Romanian Moldavian Moldovan': 'ro',
|
|
'Russian': 'ru',
|
|
'Sinhala Sinhalese': 'si', //not supported pdf
|
|
'Slovak': 'sk',
|
|
'Slovenian': 'sl',
|
|
'Albanian': 'sq',
|
|
'Serbian': 'sr',
|
|
'Swedish': 'sv',
|
|
'Swahili': 'sw',
|
|
'Tamil': 'ta', //not supported pdf
|
|
'Telugu': 'te', //not supported pdf
|
|
'Thai': 'th', //not supported pdf
|
|
'Turkish': 'tr',
|
|
'Ukrainian': 'uk',
|
|
'Urdu': 'ur',
|
|
'Vietnamese': 'vi',
|
|
'Chinese': 'zh',
|
|
};
|
|
|
|
String formatPointNumber(num value, {bool addComma = false}) {
|
|
String formatted;
|
|
|
|
if (value % 1 == 0) {
|
|
formatted = value.toInt().toString();
|
|
} else {
|
|
formatted = value.toStringAsFixed(2);
|
|
}
|
|
|
|
if (addComma) {
|
|
// NumberFormat from intl package is used here
|
|
final formatter = NumberFormat.decimalPattern();
|
|
formatted = formatter.format(num.parse(formatted));
|
|
}
|
|
|
|
return formatted;
|
|
}
|
|
// String formatPointNumber(num value) {
|
|
// if (value % 1 == 0) {
|
|
// return value.toInt().toString();
|
|
// } else {
|
|
// return value.toStringAsFixed(2);
|
|
// }
|
|
// }
|
|
|
|
String? selectedLanguage = languageMap['English'];
|
|
|
|
extension ColorExt on Color {
|
|
Color withValues({required double alpha}) {
|
|
return Color.fromARGB((alpha * 255).toInt(), red, green, blue);
|
|
}
|
|
}
|
|
|
|
pw.Widget getLocalizedPdfText(String text, pw.TextStyle textStyle, {pw.TextAlign? textAlignment}) {
|
|
print('Current Language: $selectedLanguage, Text: $text');
|
|
return pw.Text(
|
|
selectedLanguage == "bn" ? unicodeToBijoy(text) : text,
|
|
textAlign: textAlignment,
|
|
style: textStyle,
|
|
);
|
|
}
|
|
|
|
pw.Widget getLocalizedPdfTextWithLanguage(String text, pw.TextStyle textStyle, {pw.TextAlign? textAlignment}) {
|
|
print('Current Language: $selectedLanguage, Text: $text');
|
|
String detectedLanguage = detectLanguageEnhanced(text);
|
|
return pw.Text(
|
|
detectedLanguage == "bn" ? unicodeToBijoy(text) : text,
|
|
textAlign: textAlignment,
|
|
style: textStyle,
|
|
);
|
|
}
|
|
|
|
String detectLanguageEnhanced(String text, {double threshold = 0.7}) {
|
|
final cleanedText = text.replaceAll(RegExp(r'[^\p{L}]', unicode: true), '');
|
|
if (cleanedText.isEmpty) return 'en';
|
|
|
|
// Count matches for each script
|
|
final Map<String, int> counts = {
|
|
'bn': RegExp(r'[\u0980-\u09FF]').allMatches(cleanedText).length,
|
|
'hi': RegExp(r'[\u0900-\u097F]').allMatches(cleanedText).length,
|
|
'ar': RegExp(r'[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF]').allMatches(cleanedText).length,
|
|
'fr': RegExp(r'[a-zA-Zéèêëàâîïôùûç]').allMatches(cleanedText).length,
|
|
};
|
|
|
|
// Calculate ratios
|
|
final total = cleanedText.length;
|
|
final ratios = counts.map((lang, count) => MapEntry(lang, count / total));
|
|
|
|
// Determine dominant language
|
|
for (final entry in ratios.entries) {
|
|
if (entry.value >= threshold) return entry.key;
|
|
}
|
|
|
|
return 'en';
|
|
}
|
|
|
|
String formatAmount(String value, {bool isCurrency = false, String currencySymbol = ''}) {
|
|
final number = double.tryParse(value) ?? 0;
|
|
return formatNumber(number, isCurrency: isCurrency, currencySymbol: currencySymbol);
|
|
}
|
|
|
|
String formatNumber(double number, {int decimals = 2, bool isCurrency = false, String currencySymbol = '\$'}) {
|
|
String removeTrailingZeros(double num, int dec) {
|
|
String fixed = num.toStringAsFixed(dec);
|
|
return fixed.contains('.') ? fixed.replaceAll(RegExp(r'0+$'), '').replaceAll(RegExp(r'\.$'), '') : fixed;
|
|
}
|
|
|
|
String formatted;
|
|
if (number >= 1e9) {
|
|
formatted = '${removeTrailingZeros(number / 1e9, decimals)}B';
|
|
} else if (number >= 1e6) {
|
|
formatted = '${removeTrailingZeros(number / 1e6, decimals)}M';
|
|
} else if (number >= 1e3) {
|
|
formatted = '${removeTrailingZeros(number / 1e3, decimals)}K';
|
|
} else {
|
|
formatted = removeTrailingZeros(number, decimals);
|
|
}
|
|
|
|
return isCurrency ? '$currencySymbol$formatted' : formatted;
|
|
}
|
|
|
|
Widget getFieldLabelText({required String label, required BuildContext context}) {
|
|
final theme = Theme.of(context);
|
|
return label.contains('*')
|
|
? RichText(
|
|
text: TextSpan(text: label.replaceAll('*', ''), style: theme.textTheme.bodyLarge, children: [
|
|
TextSpan(
|
|
text: '*',
|
|
style: theme.textTheme.bodyLarge?.copyWith(
|
|
color: Color(0xffF68A3D),
|
|
))
|
|
]))
|
|
: Text(label);
|
|
}
|
|
|
|
double fontSizeForPrinter(String? printerSize) {
|
|
if (printerSize == null) return 17;
|
|
if (printerSize == "3_inch_80mm") return 16;
|
|
if (printerSize != "3_inch_80mm") return 17;
|
|
return 17;
|
|
}
|