Untitled
unknown
plain_text
3 years ago
144 kB
15
Indexable
/// data BASE
import 'dart:io';
import 'package:ceramic_quotation/app/model/account_model/account_model.dart';
import 'package:ceramic_quotation/app/model/quatation_model/quatation_model.dart';
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import '../model/product_model/product_model.dart';
class DatabaseService {
Database? db;
DatabaseService() {
init();
}
/// init() => database initialize
init() async {
try {
await open('products.db');
} catch (error) {
debugPrint('Error opening the database');
}
}
Future open(String path) async {
sqfliteFfiInit();
Directory documentDirectory = await getApplicationDocumentsDirectory();
String joinPath = join(documentDirectory.path, path);
/* db = await openDatabase(
join(documentDirectory.path, path),
version: 1,
onCreate: (Database dataBase, int version) async {
db = dataBase;
await createTables();
},
);*/
var databaseFactory = databaseFactoryFfi;
db = await databaseFactory.openDatabase(
joinPath,
options: OpenDatabaseOptions(
// join(documentDirectory.path, path),
version: 1,
onCreate: (Database dataBase, int version) async {
db = dataBase;
await createTables();
},
),
);
}
createTables() async {
if (db == null) {
await init();
}
try {
await db?.execute('''CREATE TABLE IF NOT EXISTS productData
(
_id TEXT PRIMARY KEY,
companay TEXT,
category TEXT,
skycode TEXT,
name TEXT,
hsn TEXT,
description TEXT,
mrp TEXT,
__v INTEGER,
img TEXT
)''');
} catch (error) {
debugPrint("promotions=====>$error");
}
try {
await db?.execute('''CREATE TABLE IF NOT EXISTS accountData
(
_id TEXT PRIMARY KEY,
name TEXT,
alias TEXT,
accounttype TEXT,
address TEXT,
city TEXT,
district TEXT,
mobile TEXT,
__v INTEGER,
email TEXT,
pin TEXT,
state TEXT
)''');
} catch (error) {
debugPrint("promotions=====>$error");
}
try {
await db?.execute('''CREATE TABLE IF NOT EXISTS quatationData
(
_id TEXT PRIMARY KEY,
jno TEXT,
party TEXT,
email TEXT,
contractor TEXT,
billqty TEXT,
salesman TEXT,
grossamt TEXT,
netamt TEXT,
overalldiscount TEXT,
quatationformate TEXT,
__v INTEGER
)''');
} catch (error) {
debugPrint("promotions=====>$error");
}
}
dynamic checkValue(val, {dynamic defaultValue}) {
if (val != null) {
return val;
}
return defaultValue;
}
/// saves all the promotions
/// @param promotions promotions from the server
Future<bool> saveProduct(List<ProductData> productData) async {
if (productData.isNotEmpty) {
for (var v in productData) {
try {
await db?.rawInsert(
'INSERT or IGNORE INTO productData (_id, companay, category, skycode, name, hsn, description, mrp, __v, img) VALUES (?,?,?,?,?,?,?,?,?,?)',
[
v.id,
checkValue(v.company),
checkValue(v.category),
checkValue(v.skycode),
checkValue(v.name),
checkValue(v.hsn),
checkValue(v.description),
checkValue(v.mrp),
checkValue(v.v),
checkValue(v.img, defaultValue: ''),
],
);
} catch (error) {
debugPrint('Error with database $error');
}
}
}
return true;
}
Future<bool> saveAccount(List<AccountData> accountData) async {
if (accountData.isNotEmpty) {
for (var v in accountData) {
try {
await db?.rawInsert(
'INSERT or IGNORE INTO accountData (_id, name, alias, accounttype, address, city, district, mobile, __v, email, pin, state) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)',
[
v.id,
checkValue(v.name),
checkValue(v.alias),
checkValue(v.accounttype),
checkValue(v.address),
checkValue(v.city),
checkValue(v.district),
checkValue(v.mobile),
checkValue(v.v),
checkValue(v.email),
checkValue(v.pin),
checkValue(v.state),
],
);
} catch (error) {
debugPrint('Error with database $error');
}
}
}
return true;
}
Future<bool> saveQuatationData(List<QuatationData> quatationData) async {
if (quatationData.isNotEmpty) {
for (var v in quatationData) {
try {
await db?.rawInsert(
'INSERT or IGNORE INTO quatationData (_id, jno, party, email, contractor, billqty, salesman, grossamt, netamt, overalldiscount, quatationformate, __v) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)',
[
v.id,
checkValue(v.jno),
checkValue(v.party),
checkValue(v.email),
checkValue(v.contractor),
checkValue(v.billqty),
checkValue(v.salesman),
checkValue(v.grossamt),
checkValue(v.netamt),
checkValue(v.overalldiscount),
checkValue(v.quatationformate),
checkValue(v.v),
],
);
} catch (error) {
debugPrint('Error with database $error');
}
}
}
return true;
}
Future<bool> accountUpdate(AccountData? accountData) async {
int? rows = 0;
if (accountData != null) {
final v = accountData;
print("is id ${v.id}");
try {
rows = await db?.rawUpdate(
'UPDATE accountData set name=?, alias=?, accounttype=?, address=?, city=?, district=?, mobile=?, email=?, pin=?, state=? WHERE _id=?',
[
checkValue(v.name),
checkValue(v.alias),
checkValue(v.accounttype),
checkValue(v.address),
checkValue(v.city),
checkValue(v.district),
checkValue(v.district),
checkValue(v.mobile),
checkValue(v.email),
checkValue(v.pin),
checkValue(v.state),
v.id,
],
);
print("Account data Update successfully =>>>>>>>>");
} catch (error) {
debugPrint("RawUpdate is successfully ******** ===========>${error}");
}
if (rows == 0) {
try {
await db?.rawInsert(
'INSERT INTO accountData (id, name, alias, accounttype, address, city, district, mobile, email, pin, state) VALUES (?,?,?,?,?,?,?,?,?,?,?)',
[
checkValue(v.name),
checkValue(v.alias),
checkValue(v.accounttype),
checkValue(v.address),
checkValue(v.city),
checkValue(v.district),
checkValue(v.mobile),
checkValue(v.email),
checkValue(v.pin),
checkValue(v.state),
v.id,
],
);
} catch (error) {
debugPrint("RowInsert===========>${error}");
}
}
}
return true;
}
Future<bool> clearAccountData(AccountData? accountData) async {
int? rows = 0;
if (accountData != null) {
final v = accountData;
print("is id ${v.id}");
try {
rows = await db?.delete(
'accountData',
where: '_id = ?',
whereArgs: [v.id],
);
print("Account data delete successfully =>>>>>>>>");
} catch (error) {
debugPrint("RawUpdate is successfully ******** ===========>${error}");
}
}
return true;
}
getAccountData() async {
try {
List<Map<String, dynamic>> data =
await db?.rawQuery('SELECT * FROM accountData ', []) ?? [];
List<AccountData> accountDataCategory = <AccountData>[];
for (int i = 0; i < data.length; i++) {
accountDataCategory.add(AccountData.fromJson(data[i]));
}
return accountDataCategory;
} catch (e) {
print("error ${e.toString()}");
}
}
getProductData() async {
List<Map<String, dynamic>> data =
await db?.rawQuery('SELECT * FROM productData ', []) ?? [];
List<ProductData> category = <ProductData>[];
for (int i = 0; i < data.length; i++) {
category.add(ProductData.fromJson(data[i]));
}
return category;
}
getQuatationData() async {
List<Map<String, dynamic>> data =
await db?.rawQuery('SELECT * FROM quatationData ', []) ?? [];
List<QuatationData> quatationData = <QuatationData>[];
for (int i = 0; i < data.length; i++) {
quatationData.add(QuatationData.fromJson(data[i]));
}
return quatationData;
}
/* Future<bool> accountUpdate(List<ProductData> productData) async {
int? rows = 0;
if (productData.isNotEmpty) {
for (var v in productData) {
try {
rows = await db?.rawUpdate(
'UPDATE employees set WHERE _id=?, firstName=?, lastName=?, email=?, mobile=?, home=?, userId=?, storeId=?, addressId=?, pin=?, hourlyRate=?, overtimeRate=?',
[
v.id,
checkValue(v.company),
checkValue(v.category),
checkValue(v.skycode),
checkValue(v.name),
checkValue(v.hsn),
checkValue(v.description),
checkValue(v.mrp),
checkValue(v.v),
checkValue(v.img, defaultValue: ''),
],
);
} catch (error) {
debugPrint("RawUpdate===========>${error}");
}
if (rows == 0) {
try {
await db?.rawInsert(
'INSERT INTO employees (id, code, firstName, lastName, email, mobile, home, userId, storeId, addressId, pin, hourlyRate, overtimeRate) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)',
[
v.id,
checkValue(v.code),
checkValue(v.firstName),
checkValue(v.lastName),
checkValue(v.email),
checkValue(v.mobile),
checkValue(v.home),
checkValue(v.userId),
checkValue(v.storeId),
checkValue(v.addressId),
checkValue(v.pin),
checkValue(v.hourlyRate),
checkValue(v.overtimeRate),
],
);
} catch (error) {
debugPrint("RowInsert===========>${error}");
}
}
}
}
return true;
}*/
/// get all the valid promotions available for that time
/// @param date date time of the order
/* Future<List<ProductData>> getPromotions(DateTime date) async {
int time = getTimeOfDay(date);
int now = getTimeOfDate(date);m
List<Map<String, dynamic>> data =
await db?.rawQuery('SELECT * FROM promotions ', []) ?? [];
List<ProductData> category = <ProductData>[];
for (int i = 0; i < data.length; i++) {
category.add(ProductData.fromJson(data[i]));
}
return category; */
/*db?.rawQuery(
'SELECT id, name, description, type, weekdays, startTime as startTimeValue, endTime as endTimeValue, validFrom as validFromValue, validTill as validTillValue, items, tickets ' +
' FROM promotions '
//+ ' WHERE weekdays > ? and (weekdays & ?) = ? '
+
' WHERE ((startTime is null) ' +
' or (startTime <= ? and endTime >= ? and startTime <= endTime) ' +0
' or ((startTime <= ? or endTime >= ?) and startTime >= endTime)) ' +
' and ((validFrom is null) ' +
' or (validFrom <= ? and validTill >= ?))',
[time, time, time, time, now, now]) as List<PromotionLite>;*/ /*
}*/
/// searchProducts(search, exact, isProduct) => search by
/// @param search in text
/// @param exact in true false
/// @param isProduct in true false
/* Future<List<ProductLite>> searchProducts(
String search, {
bool exact = false,
bool isProduct = true,
}) async {
List<ProductLite> productList = <ProductLite>[];
try {
if (exact) {
List<Map<String, dynamic>> data = await db?.rawQuery(
'SELECT * FROM products WHERE sku = ? OR upc = ? LIMIT 1',
[search, search]) ??
[];
for (int i = 0; i < data.length; i++) {
productList.add(ProductLite.fromJson(data[i]));
}
} else {
search = '%' + search + '%';
List<Map<String, dynamic>> productData = await db?.rawQuery(
'SELECT * FROM products WHERE (sku LIKE ? OR upc LIKE ? OR name LIKE ? OR name2 LIKE ? OR description LIKE ? OR description2 LIKE ? OR category LIKE ? OR department LIKE ?) AND type = ? order by name LIMIT 20',
[
search,
search,
search,
search,
search,
search,
search,
search,
(isProduct
? ProductType.product.value
: ProductType.service.value)
],
) ??
[];
for (int i = 0; i < productData.length; i++) {
productList.add(ProductLite.fromJson(productData[i]));
}
}
} catch (e, t) {
debugPrint('searchProducts($exact): $e \nData Trace....\n$t');
}
return productList;
}*/
/// getProducts() => get product list
/* Future<List<ProductLite>> getProducts() async {
return db?.rawQuery(
'SELECT id, categoryId, departmentId, sku, upc, name, name2, printerType, taxes, type, price, duration, durationType, durationDesc FROM products order by name')
as List<ProductLite>;
}
*/
/// cleanDatabase() => clean database
cleanDatabase() async {
try {
await db?.rawDelete('DROP TABLE IF EXISTS products');
await db?.rawDelete('DROP TABLE IF EXISTS categories');
await db?.rawDelete('DROP TABLE IF EXISTS taxes');
//await db?.rawDelete('DROP TABLE IF EXISTS notifications');
await db?.rawDelete('DROP TABLE IF EXISTS employees');
await db?.rawDelete('DROP TABLE IF EXISTS loyaltyRewards');
await db?.rawDelete('DROP TABLE IF EXISTS punchCardRewards');
await db?.rawDelete('DROP INDEX IF EXISTS promotion_search');
await db?.rawDelete('DROP TABLE IF EXISTS promotions');
await db?.rawDelete('DROP INDEX IF EXISTS promotion_applies');
await db?.rawDelete('DROP TABLE IF EXISTS promotionApplies');
await db?.rawDelete('DROP TABLE IF EXISTS employeeServices');
await db?.rawDelete('DROP TABLE IF EXISTS leasablesItem');
await createTables();
} catch (error) {
debugPrint('Error cleaning the $error');
}
}
/// saveProducts(products) => save products in local database
/// @param products in product array
/* Future<bool> saveProducts(List<ProductData> products) async {
if (products.isNotEmpty) {
for (var v in products) {
try {
int rows = await db!.rawUpdate(
'UPDATE products set sku=?, upc=?, name=?, name2=?, categoryId=?, category=?, departmentId=?, department=?, description=?, description2=?, notes=?, notes2=?, printerType=?, taxes=?, type=?, price=?, duration=?, durationType=?, durationDesc=? WHERE id=?',
[
checkValue(v.skycode, defaultValue: ''),
checkValue(v.upc, defaultValue: ''),
checkValue(v.name),
checkValue(v.name2, defaultValue: ''),
checkValue(v.categoryId),
checkValue(v.categoryName),
checkValue(v.departmentId),
checkValue(v.departmentName),
checkValue(v.description, defaultValue: ''),
checkValue(v.description2, defaultValue: ''),
checkValue(v.notes, defaultValue: ''),
checkValue(v.notes2, defaultValue: ''),
checkValue(v.printerType, defaultValue: 0),
v.taxes.toString(),
v.type == ProductType.rawGood
? ProductType.rawGood.value
: v.type == ProductType.product
? ProductType.product.value
: ProductType.service.value,
v.price,
v.duration ?? 0,
v.durationType == DurationType.minutes
? 0
: v.durationType == DurationType.hours
? 1
: v.durationType == DurationType.days
? 2
: v.durationType == DurationType.weeks
? 3
: v.durationType == DurationType.months
? 4
: v.durationType == DurationType.years
? 5
: 0,
v.durationDesc ?? '',
v.id
],
);
if (rows == 0) {
await db?.rawQuery(
'INSERT INTO products (id, sku, upc, name, name2, categoryId, category, departmentId, department, description, description2, notes, notes2, printerType, taxes, type, price, duration, durationType, durationDesc) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',
[
v.id,
checkValue(v.sku, defaultValue: ''),
checkValue(v.upc, defaultValue: ''),
checkValue(v.name),
checkValue(v.name2, defaultValue: ''),
checkValue(v.categoryId),
checkValue(v.categoryName),
checkValue(v.departmentId),
checkValue(v.departmentName),
checkValue(v.description, defaultValue: ''),
checkValue(v.description2, defaultValue: ''),
checkValue(v.notes, defaultValue: ''),
checkValue(v.notes2, defaultValue: ''),
checkValue(v.printerType, defaultValue: 0),
v.taxes.toString(),
v.type == ProductType.rawGood
? 1
: v.type == ProductType.product
? 2
: 3,
v.price,
v.duration ?? 0,
v.durationType == DurationType.minutes
? 0
: v.durationType == DurationType.hours
? 1
: v.durationType == DurationType.days
? 2
: v.durationType == DurationType.weeks
? 3
: v.durationType == DurationType.months
? 4
: v.durationType == DurationType.years
? 5
: 0,
v.durationDesc ?? ''
]);
}
} catch (error, t) {
debugPrint('Error with database $error : \nTrace:$t');
}
}
}
return true;
}*/
/// getCategories() => get all categories in local database
/*Future<List<Category>> getCategories() async {
List<Map<String, dynamic>> data =
await db?.rawQuery('SELECT * FROM categories ', []) ?? [];
List<Category> category = <Category>[];
for (int i = 0; i < data.length; i++) {
category.add(Category.fromJson(data[i]));
}
return category;
}*/
/// saveEmployees(emplopyees) => save employees in local database
/// @param employees in employee array
/* Future<bool> saveEmployees(List<Employee> employees) async {
int? rows = 0;
if (employees.isNotEmpty) {
for (var v in employees) {
try {
rows = await db?.rawUpdate(
'UPDATE employees set code=?, firstName=?, lastName=?, email=?, mobile=?, home=?, userId=?, storeId=?, addressId=?, pin=?, hourlyRate=?, overtimeRate=? WHERE id=?',
[
checkValue(v.code),
checkValue(v.firstName),
checkValue(v.lastName),
checkValue(v.email),
checkValue(v.mobile),
checkValue(v.home),
checkValue(v.userId),
checkValue(v.storeId),
checkValue(v.addressId),
checkValue(v.pin),
checkValue(v.hourlyRate),
checkValue(v.overtimeRate),
v.id
]);
} catch (error) {
debugPrint("RawUpdate===========>${error}");
}
if (rows == 0) {
try {
await db?.rawInsert(
'INSERT INTO employees (id, code, firstName, lastName, email, mobile, home, userId, storeId, addressId, pin, hourlyRate, overtimeRate) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)',
[
v.id,
checkValue(v.code),
checkValue(v.firstName),
checkValue(v.lastName),
checkValue(v.email),
checkValue(v.mobile),
checkValue(v.home),
checkValue(v.userId),
checkValue(v.storeId),
checkValue(v.addressId),
checkValue(v.pin),
checkValue(v.hourlyRate),
checkValue(v.overtimeRate),
]);
} catch (error) {
debugPrint("RowInsert===========>${error}");
}
}
}
}
return true;
}*/
/// getEmployees() => get all employee list in local database
/*Future<List<Employee>> getEmployees() async {
List<Map<String, dynamic>> data =
await db?.rawQuery('SELECT * FROM employees ', []) ?? [];
List<Employee> employeeList = <Employee>[];
for (int i = 0; i < data.length; i++) {
employeeList.add(Employee.fromJson(data[i]));
}
return employeeList;
}
*/
/// getEmployeeById(id) => get given employee id information from local database
/// @param id in employee id
/* Future<Employee?> getEmployeeById(int id) async {
List<Map<String, dynamic>>? data = await db?.query('employees',
columns: ['id, code, firstName, lastName, email, mobile, home'],
where: 'id = ?',
whereArgs: [id]);
if (data!.isNotEmpty) {
return Employee.fromJson(data[0]);
} else {
return null;
}
}*/
/// clearNotificationDatabase() => delete notification data in local database
/* clearNotificationDatabase() async {
try {
await db?.delete('notifications');
//await this.createTables();
} catch (error) {
// this.monitorService.logError(error);
debugPrint('Error notification cleaning the $error');
}
}*/
/// saveProducts(products) => save products in local database
/// @param products in product array
/* Future<bool> saveEmployeeServices(
List<EmployeeServices> employeeServices) async {
if (employeeServices.isNotEmpty) {
await db?.delete('employeeServices');
for (int i = 0; i < employeeServices.length; i++) {
EmployeeServices v = employeeServices[i];
try {
await db?.rawInsert(
'INSERT INTO employeeServices (id, employeeId, productId) VALUES (?,?,?)',
[(i + 1), v.employeeId, v.productId]);
} catch (error) {
// this.monitorService.logError(error);
debugPrint('Error with database $error');
}
}
}
return true;
}*/
}
//// Main Dart
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:ceramic_quotation/app/common/app_theme.dart';
import 'package:ceramic_quotation/app/database/database_service.dart';
import 'package:ceramic_quotation/app/utils/app_prefrence.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'app/common/progress_indicator.dart';
import 'app/routes/app_pages.dart';
import 'app/utils/utils.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await AppPreference.init();
await setup();
sqfliteFfiInit();
getIt.get<DatabaseService>().init();
var email = AppPreference.getString("token");
GetPlatform.isMacOS || GetPlatform.isWindows || GetPlatform.isLinux
? doWhenWindowReady(() {
const initialSize = Size(1200, 798);
appWindow.minSize = initialSize;
appWindow.size = initialSize;
appWindow.alignment = Alignment.center;
appWindow.show();
})
: null;
runApp(
Loading(
child: GetMaterialApp(
debugShowCheckedModeBanner: false,
title: "Application",
initialRoute: email == null ? AppPages.INITIAL : Routes.home,
getPages: AppPages.routes,
theme: AppTheme().themeData(),
),
),
);
}
///// Product_controller
import 'dart:async';
import 'dart:io';
import 'package:ceramic_quotation/app/constant/app_string.dart';
import 'package:ceramic_quotation/app/database/database_service.dart';
import 'package:ceramic_quotation/app/model/product_model/product_model.dart';
import 'package:ceramic_quotation/app/model/product_model/product_request_model.dart';
import 'package:ceramic_quotation/app/modules/product/product_service/product_service.dart';
import 'package:ceramic_quotation/app/utils/app_prefrence.dart';
import 'package:dio/dio.dart';
import 'package:file_picker/file_picker.dart';
import 'package:filesystem_picker/filesystem_picker.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart' hide FormData, MultipartFile;
import 'package:path_provider/path_provider.dart';
import '../../../model/sorting_model/product_sorting_model.dart';
import '../../../utils/utils.dart';
class ProductController extends GetxController {
final TextEditingController mrp = TextEditingController();
final TextEditingController skycode = TextEditingController();
final TextEditingController name = TextEditingController();
final DatabaseService databaseService = getIt.get<DatabaseService>();
Dio dio = Dio();
var dataList = [];
var createPath;
String? dirPath;
File? file;
double progress = 0;
int? sortColumnIndex;
bool sortAscending = true;
bool isSelected = false;
double qtyTotal = 0.0;
double gAmtTotal = 0.0;
double netTotal = 0.0;
List<bool>? checkBoxValues;
List<ProductData>? productData;
List<ProductModel> dataListValue = [];
List<ProductData> itemAddList = [];
List<ProductData> getProductList = [];
List<FileSystemEntity>? imageList;
ProductModel? productModel = ProductModel();
Directory? root = Platform.isMacOS
? Directory("/Users/imac/")
: Platform.isWindows
? Directory('C:\\Users\\')
: Directory("/storage/emulated/0/");
filterImage() async {
imageList =
Directory(AppPreference.getString("folder_path") ?? "").listSync(
recursive: true,
);
return imageList;
}
sum(double mrp, double qty, int index) {
var qAmt = mrp * qty;
itemAddList[index].qty = qty;
//itemAddList[index].gAmt = qAmt;
update();
return qAmt;
}
double? disc({
required double dis_per,
required int index,
}) {
itemAddList[index].dis = dis_per;
update();
}
startTimer() {
new Timer.periodic(
Duration(seconds: 2),
(Timer timer) {
if (progress == 1) {
timer.cancel();
Get.back();
getProduct();
} else {
progress += 0.2;
}
update();
},
);
}
Future<String> createFolders(String cow) async {
final dir = Directory((Platform.isMacOS
? await getApplicationSupportDirectory()
: Platform.isAndroid
? await getExternalStorageDirectory()
: await getApplicationSupportDirectory())!
.path +
'\\$cow');
print(AppString.createFolder + dir.path);
dirPath = dir.path;
AppPreference.set("folder_path\\", "${dir.path}\\");
if ((await dir.exists())) {
print(AppString.alreadyExist + dir.absolute.path);
return dir.path;
} else {
dir.create();
print(AppString.createFolder + dir.path);
return dir.path;
}
}
folderPicker(BuildContext context) async {
final path = await FilesystemPicker.open(
title: AppString.saveFolder,
context: context,
rootDirectory: root!,
fsType: FilesystemType.folder,
pickText: AppString.pickText,
);
if (path == null) return;
if (path != null) {
try {
dataList = Directory(path).listSync().map((e) => e.path).toList();
for (int i = 0; i < dataList.length; i++) {
var file = await moveFile(
File(dataList[i]),
"${dirPath!}\\${File(dataList[i]).path.split("\\").last}",
);
}
} catch (e) {}
}
print(path.length);
}
Future<File> moveFile(File sourceFile, String newPath) async {
try {
return await sourceFile.rename(newPath);
} catch (e) {
final newFile = await sourceFile.copy(newPath);
await sourceFile.delete();
return newFile;
}
}
void ExcelFileUpload() async {
final result = await FilePicker.platform.pickFiles(
allowMultiple: false,
type: FileType.any,
allowedExtensions: [
'xls',
'xlsx',
],
);
if (result == null) return;
if (result != null) {
file = File(result.files.first.path!);
ProductService().getUpload(file!);
}
}
getProduct() async {
final getData = await ProductService().getRequest();
getProductList = getData!.data ?? [];
if (getData.data != null && getData.data!.isNotEmpty) {
databaseService.saveProduct(getData.data ?? []);
}
update();
runFilter("");
return productModel;
}
getDataFromDatabase() async {
final data = await databaseService.getProductData();
getProductList = data;
productModel!.data = getProductList;
update();
}
void sorting<T>(
Comparable<T> Function(Dessert d) getField,
int columnIndex,
bool ascending,
) {
sortColumnIndex = columnIndex;
sortAscending = ascending;
update();
}
@override
onInit() async {
filterImage();
await getDataFromDatabase();
itemAddList.add(ProductData(
isSelected: true,
isactive: "",
id: "",
company: "",
category: "",
skycode: "",
name: "",
qty: null,
hsn: "",
description: "",
mrp: "",
v: 0,
dis: null,
));
super.onInit();
}
getDataUpdate(
ProductUpdateRequestModel? productUpdateRequestModel,
context,
) async {
productModel = await ProductService()
.productUpdate(productUpdateRequestModel, context);
update();
getProduct();
return productModel;
}
runFilter(String enteredKeyword) {
productData = enteredKeyword.isEmpty
? productModel!.data
: productModel!.data!
.where((element) => element.skycode!
.toLowerCase()
.contains(enteredKeyword.toLowerCase()))
.toList();
update();
}
selectAllValue(bool value) {
isSelected = value;
getProductList.forEach((element) {
if (isSelected) {
element.isSelected = isSelected;
} else {
element.isSelected = isSelected;
}
});
update();
}
}
////add Quatation
import 'dart:io';
import 'package:animated_custom_dropdown/custom_dropdown.dart';
import 'package:ceramic_quotation/app/common/app_scaffold.dart';
import 'package:ceramic_quotation/app/common/common_show_dialog.dart';
import 'package:ceramic_quotation/app/constant/image_path.dart';
import 'package:ceramic_quotation/app/model/product_model/product_model.dart';
import 'package:ceramic_quotation/app/modules/add_quatation/controller/add_quatation_controller.dart';
import 'package:ceramic_quotation/app/modules/company/view/Company_screen.dart';
import 'package:ceramic_quotation/app/modules/product/controller/product_controller.dart';
import 'package:ceramic_quotation/app/modules/quatation/controller/quatation_controller.dart';
import 'package:data_table_2/data_table_2.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/appbar.dart';
import '../../../common/custom_button.dart';
import '../../../common/tabal_screen.dart';
import '../../../common/text_filed.dart';
import '../../../constant/app_color.dart';
import '../../../constant/app_string.dart';
import '../../../pdf_pages/pdfpreview.dart';
import '../../account/view/account_view.dart';
import '../../home/views/home_view.dart';
import '../../product/view/Product_Screen.dart';
import '../../quatation/view/quatation_screen.dart';
class AddQuatationScreen extends GetView<AddQuatationController> {
AddQuatationScreen({super.key});
@override
Widget build(BuildContext context) {
return GetBuilder<AddQuatationController>(
init: AddQuatationController(),
builder: (addQuatationController) {
QuotationController quotationController =
Get.put(QuotationController());
return AppScaffold(
appBar: const PreferredSize(
preferredSize: Size.fromHeight(100),
child: CommonAppBar(),
),
body: addQuatationController.isAddQuatation == true
? GetBuilder<ProductController>(
init: ProductController(),
builder: (productController) {
return Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Card(
elevation: 2,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
Text(
AppString.partyQuation,
style: Get.textTheme.displayLarge,
),
SizedBox(
height: 36,
width: 300,
child: CustomDropdown.search(
borderRadius:
BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.black54,
),
hintText: AppString.selectParty,
controller: quotationController
.jobRoleSearchDropdownCtrl,
items:
quotationController.partyList,
),
),
],
),
const SizedBox(
height: 5,
),
Row(
children: [
Text(
AppString.reference,
style: Get.textTheme.displayLarge,
),
SizedBox(
height: 36,
width: 300,
child: CustomDropdown.search(
borderRadius:
BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.black54,
),
hintText:
AppString.SelectReference,
controller: quotationController
.referenceSearchDropdownCtrl,
items:
quotationController.partyList,
),
),
],
),
const SizedBox(
height: 5,
),
Row(
children: [
Text(
AppString.reMark,
style: Get.textTheme.displayLarge,
),
LoginTextField(
contentPadding: EdgeInsets.zero,
isdense: true,
fieldStyle:
Get.textTheme.displayLarge,
suffixIcon: SizedBox(),
),
],
),
const SizedBox(
height: 5,
),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Row(
children: [
Text(
AppString.vchDate,
style: Get.textTheme.displayLarge,
),
LoginTextField(
contentPadding: EdgeInsets.zero,
isdense: true,
textEditingController:
addQuatationController
.expDateController,
readOnly: true,
textInputAction:
TextInputAction.none,
onTap: () async {
await addQuatationController
.selectDate(context);
},
hintText: addQuatationController
.firstDates ??
addQuatationController
.dateFormat(
DateTime.now(),
),
suffixIcon: const Icon(
Icons.calendar_month,
),
),
],
),
const SizedBox(
height: 5,
),
Row(
children: [
Text(
AppString.vchNo,
style: Get.textTheme.displayLarge,
),
LoginTextField(
contentPadding: EdgeInsets.zero,
fieldStyle:
Get.textTheme.displayLarge,
isdense: true,
suffixIcon: SizedBox(),
),
],
),
],
),
],
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.only(
top: 5,
left: 20,
right: 10,
),
child: GetBuilder<ProductController>(
init: ProductController(),
builder: (productController) {
return productController.productData != null &&
productController.productData!.isEmpty
? Center(
child: CircularProgressIndicator(),
)
: TableScreen(
sortAscending: addQuatationController
.sortAscending,
sortColumnIndex: addQuatationController
.sortColumnIndex,
sortingTap: (index, ascending) {
addQuatationController.sorting(
(d) => d.name,
index,
ascending,
);
},
dataColumnOne: AppString.area,
dataColumnTwo: AppString.skuCode,
dataColumnThree: AppString.image,
dataColumnFour: AppString.description,
dataColumnFive: AppString.mrp,
dataColumnSix: AppString.qty,
dataColumnSeven: AppString.gamut,
dataColumnEight: AppString.disc,
dataColumnNine: AppString.netAmt,
dataColumnSizeSix: ColumnSize.S,
dataColumnSizeFour: ColumnSize.M,
dataColumnSizeSeven: ColumnSize.S,
dataColumnSizeNine: ColumnSize.S,
dataColumnSizeEight: ColumnSize.S,
rows: List.generate(
productController.itemAddList.length,
(index) {
productController
.itemAddList[index]
.mrpController
.text = productController
.itemAddList[index].mrp ??
0.toString();
if (productController
.itemAddList[index].qty ==
null) {
productController
.itemAddList[index]
.qtyController
.text = "";
}
productController
.itemAddList[index]
.qtyController
.text = productController
.itemAddList[index]
.qty ==
null
? ""
: productController
.itemAddList[index].qty
.toString();
productController
.itemAddList[index]
.discController
.text = productController
.itemAddList[index]
.dis ==
null
? ""
: productController
.itemAddList[index].dis
.toString();
return DataRow(
cells: [
///Area
DataCell(TextField(
controller:
TextEditingController(
text: productController
.itemAddList[index]
.areaController
.text,
),
onChanged: (val) {
productController
.itemAddList[index]
.areaController
.text = val;
},
style: Get.theme.textTheme
.displayLarge,
)),
///SKU code
DataCell(TextField(
readOnly: true,
onTap: () async {
List<ProductData>?
response =
await itemSelectList(
context,
);
if (response != null &&
response.isNotEmpty) {
productController
.itemAddList
.removeAt(
productController
.itemAddList
.length -
1,
);
productController
.itemAddList
.addAll(response);
productController
.itemAddList
.add(ProductData(
qty: null,
dis: null,
));
}
},
controller:
TextEditingController(
text: productController
.itemAddList[index]
.skycode,
),
style: Get.theme.textTheme
.displayLarge!
.copyWith(
color: Colors.red,
),
)),
///Images
DataCell(
SizedBox(
height: 120,
child: Image.file(
File(
productController
.itemAddList[
index]
.img ??
AppImagePath
.emtyImg,
),
height: 80,
width: 80,
),
),
),
///Description
DataCell(TextField(
readOnly: true,
controller:
TextEditingController(
text: productController
.itemAddList[index]
.category,
),
style: Get.theme.textTheme
.displayLarge,
)),
/// Mrp
DataCell(
TextField(
controller: productController
.itemAddList[
index]
.mrpController
.text ==
"0"
? TextEditingController()
: productController
.itemAddList[index]
.mrpController,
onChanged: (val) {
productController
.itemAddList[index]
.mrp = val;
},
style: Get.theme.textTheme
.displayLarge,
),
),
/// qty
DataCell(TextField(
onChanged: (value) {
productController
.itemAddList[index]
.qtyController
.text = value;
productController
.itemAddList[index]
.qtyController
.selection =
TextSelection
.fromPosition(
TextPosition(
offset:
productController
.itemAddList[
index]
.qtyController
.text
.length,
),
);
productController.sum(
double.parse(
productController
.itemAddList[index]
.mrpController
.text,
),
double.parse(value),
index,
);
},
controller: productController
.itemAddList[index]
.qtyController,
style: Get.theme.textTheme
.displayLarge,
)),
///GAmt
DataCell(TextField(
readOnly: true,
controller:
TextEditingController(
text: (productController
.itemAddList[
index]
.gAmt ??
productController
.itemAddList[
index]
.mrp ??
'')
.toString(),
),
style: Get.theme.textTheme
.displayLarge,
)),
/// Discount
DataCell(TextField(
onChanged: (value) {
productController.disc(
dis_per: double.parse(
value,
),
index: index,
);
productController
.itemAddList[index]
.discController
.text = value;
productController
.itemAddList[index]
.discController
.selection =
TextSelection
.fromPosition(
TextPosition(
offset:
productController
.itemAddList[
index]
.qtyController
.text
.length,
),
);
},
controller: productController
.itemAddList[index]
.discController,
style: Get.theme.textTheme
.displayLarge,
)),
///net Amount
DataCell(TextField(
readOnly: true,
controller:
TextEditingController(
text: (productController
.itemAddList[
index]
.nAmt ??
productController
.itemAddList[
index]
.mrp ??
'')
.toString(),
),
onChanged: (val) {
double.parse(val);
},
style: Get.theme.textTheme
.displayLarge,
)),
],
);
},
),
);
},
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
CustomButton(
title: AppString.save,
onTap: () {
showDialog(
barrierColor: AppColors.transparent,
context: context,
builder: (context) {
return AlertDialog(
title: Text(
AppString.voucherPrint,
style: Get
.theme.textTheme.displayLarge,
),
content: Row(
children: [
Container(
decoration: BoxDecoration(
color: AppColors.blue,
borderRadius:
BorderRadius.circular(
20,
),
),
child: const Icon(
Icons.question_mark,
),
),
const SizedBox(width: 5),
const Text(
AppString.voucherPrint,
),
],
),
actions: [
CustomButton(
width: 100,
title: AppString.exit,
onTap: () {
Get.back();
},
),
],
);
},
);
},
),
const SizedBox(
width: 20,
),
CustomButton(
title: AppString.print,
onTap: () {
printList(
context,
// productController: productController,
// quotationController:
// quotationController,
);
},
),
const SizedBox(
width: 20,
),
CustomButton(
title: AppString.exit,
onTap: () {
addQuatationController.isAddQuatation =
false;
Get.back();
},
),
],
),
),
),
),
],
);
},
)
: addQuatationController.selectedIndex == 0
? CompanyView()
: addQuatationController.selectedIndex == 1
? AccountView()
: addQuatationController.selectedIndex == 2
? ProductView()
: addQuatationController.selectedIndex == 3
? addQuatationController.isAddQuatation == true
? GetBuilder<ProductController>(
init: ProductController(),
builder: (productController) {
return Column(
children: [
Padding(
padding:
const EdgeInsets.all(8.0),
child: Card(
elevation: 2,
child: Padding(
padding:
const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Column(
crossAxisAlignment:
CrossAxisAlignment
.end,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceEvenly,
children: [
Text(
AppString
.partyQuation,
style: Get
.textTheme
.displayLarge,
),
SizedBox(
height: 36,
width: 300,
child:
CustomDropdown
.search(
borderRadius:
BorderRadius
.circular(
8,
),
borderSide:
BorderSide(
color: Colors
.black54,
),
hintText:
AppString
.selectParty,
controller:
quotationController
.jobRoleSearchDropdownCtrl,
items: quotationController
.partyList,
),
),
],
),
const SizedBox(
height: 5,
),
Row(
children: [
Text(
AppString
.reference,
style: Get
.textTheme
.displayLarge,
),
SizedBox(
height: 36,
width: 300,
child:
CustomDropdown
.search(
borderRadius:
BorderRadius
.circular(
8,
),
borderSide:
BorderSide(
color: Colors
.black54,
),
hintText:
AppString
.SelectReference,
controller:
quotationController
.referenceSearchDropdownCtrl,
items: quotationController
.partyList,
),
),
],
),
const SizedBox(
height: 5,
),
Row(
children: [
Text(
AppString
.reMark,
style: Get
.textTheme
.displayLarge,
),
LoginTextField(
contentPadding:
EdgeInsets
.zero,
isdense: true,
fieldStyle: Get
.textTheme
.displayLarge,
suffixIcon:
SizedBox(),
),
],
),
const SizedBox(
height: 5,
),
],
),
Column(
crossAxisAlignment:
CrossAxisAlignment
.end,
children: [
Row(
children: [
Text(
AppString
.vchDate,
style: Get
.textTheme
.displayLarge,
),
LoginTextField(
contentPadding:
EdgeInsets
.zero,
isdense: true,
textEditingController:
addQuatationController
.expDateController,
readOnly: true,
textInputAction:
TextInputAction
.none,
onTap:
() async {
await addQuatationController
.selectDate(
context,
);
},
hintText: addQuatationController
.firstDates ??
addQuatationController
.dateFormat(
DateTime
.now(),
),
suffixIcon:
const Icon(
Icons
.calendar_month,
),
),
],
),
const SizedBox(
height: 5,
),
Row(
children: [
Text(
AppString.vchNo,
style: Get
.textTheme
.displayLarge,
),
LoginTextField(
contentPadding:
EdgeInsets
.zero,
fieldStyle: Get
.textTheme
.displayLarge,
isdense: true,
suffixIcon:
SizedBox(),
),
],
),
],
),
],
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.only(
top: 5,
left: 20,
right: 10,
),
child: GetBuilder<
ProductController>(
init: ProductController(),
builder: (productController) {
return productController
.productData !=
null &&
productController
.productData!
.isEmpty
? Center(
child:
CircularProgressIndicator(),
)
: TableScreen(
sortAscending:
addQuatationController
.sortAscending,
sortColumnIndex:
addQuatationController
.sortColumnIndex,
sortingTap: (
index,
ascending,
) {
addQuatationController
.sorting(
(d) => d.name,
index,
ascending,
);
},
dataColumnOne:
AppString.area,
dataColumnTwo:
AppString
.skuCode,
dataColumnThree:
AppString.image,
dataColumnFour:
AppString
.description,
dataColumnFive:
AppString.mrp,
dataColumnSix:
AppString.qty,
dataColumnSeven:
AppString.gamut,
dataColumnEight:
AppString.disc,
dataColumnNine:
AppString
.netAmt,
dataColumnSizeSix:
ColumnSize.S,
dataColumnSizeFour:
ColumnSize.M,
dataColumnSizeSeven:
ColumnSize.S,
dataColumnSizeNine:
ColumnSize.S,
dataColumnSizeEight:
ColumnSize.S,
rows: List.generate(
productController
.itemAddList
.length,
(index) {
productController
.itemAddList[
index]
.mrpController
.text = productController
.itemAddList[
index]
.mrp ??
0.toString();
return DataRow(
cells: [
///Area
DataCell(
TextField(
controller:
TextEditingController(
text: productController
.itemAddList[index]
.areaController
.text,
),
onChanged:
(val) {
productController
.itemAddList[index]
.areaController
.text = val;
},
style: Get
.theme
.textTheme
.displayLarge,
),
),
///SKU code
DataCell(
TextField(
readOnly:
true,
onTap:
() async {
List<ProductData>?
response =
await itemSelectList(
context,
);
if (response != null &&
response.isNotEmpty) {
// if (!productController.isFirstCome) {
// productController.itemAddList.removeAt(
// productController.itemAddList.length - 1,
// );
// }
// productController.isFirstCome =
// true;
productController.itemAddList.addAll(response);
productController.update();
}
},
controller:
TextEditingController(
text: productController
.itemAddList[index]
.skycode,
),
style: Get
.theme
.textTheme
.displayLarge!
.copyWith(
color:
Colors.red,
),
),
),
///Images
DataCell(
SizedBox(
height:
120,
child: Image
.file(
File(
productController.itemAddList[index].img ??
AppImagePath.emtyImg,
),
height:
80,
width:
80,
),
),
),
///Description
DataCell(
TextField(
readOnly:
true,
controller:
TextEditingController(
text: productController
.itemAddList[index]
.category,
),
style: Get
.theme
.textTheme
.displayLarge,
),
),
/// Mrp
DataCell(
TextField(
controller: productController.itemAddList[index].mrpController.text ==
"0"
? TextEditingController()
: productController.itemAddList[index].mrpController,
onChanged:
(val) {
productController
.itemAddList[index]
.mrp = val;
},
style: Get
.theme
.textTheme
.displayLarge,
),
),
/// qty
DataCell(
TextField(
onChanged:
(value) {
productController
.itemAddList[index]
.qtyController
.text = value;
productController
.itemAddList[index]
.qtyController
.selection = TextSelection.fromPosition(
TextPosition(
offset: productController.itemAddList[index].qtyController.text.length,
),
);
productController
.sum(
double.parse(
productController.itemAddList[index].mrpController.text,
),
double.parse(
value,
),
index,
);
},
controller: productController
.itemAddList[index]
.qtyController,
style: Get
.theme
.textTheme
.displayLarge,
),
),
///GAmt
DataCell(
TextField(
readOnly:
true,
controller:
TextEditingController(
text:
(productController.itemAddList[index].gAmt).toString(),
),
style: Get
.theme
.textTheme
.displayLarge,
),
),
/// Discount
DataCell(
TextField(
onChanged:
(value) {
productController
.itemAddList[index]
.dis = double.parse(
value.toString(),
);
productController
.disc(
dis_per:
double.parse(
value,
),
index:
index,
);
},
controller: productController
.itemAddList[index]
.discController,
style: Get
.theme
.textTheme
.displayLarge,
),
),
///net Amount
DataCell(
TextField(
readOnly:
true,
controller:
TextEditingController(
text:
(productController.itemAddList[index].nAmt ?? productController.itemAddList[index].mrp ?? '').toString(),
),
onChanged:
(val) {},
style: Get
.theme
.textTheme
.displayLarge,
),
),
],
);
},
),
);
},
),
),
),
Padding(
padding:
const EdgeInsets.all(8.0),
child: Card(
child: Padding(
padding:
const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.end,
crossAxisAlignment:
CrossAxisAlignment.end,
children: [
CustomButton(
title: AppString.save,
onTap: () {
showDialog(
barrierColor:
AppColors
.transparent,
context: context,
builder: (context) {
return AlertDialog(
title: Text(
AppString
.voucherPrint,
style: Get
.theme
.textTheme
.displayLarge,
),
content: Row(
children: [
Container(
decoration:
BoxDecoration(
color: AppColors
.blue,
borderRadius:
BorderRadius.circular(
20,
),
),
child:
const Icon(
Icons
.question_mark,
),
),
const SizedBox(
width: 5,
),
const Text(
AppString
.voucherPrint,
),
],
),
actions: [
CustomButton(
width: 100,
title:
AppString
.exit,
onTap: () {
Get.back();
},
),
],
);
},
);
},
),
const SizedBox(
width: 20,
),
CustomButton(
title: AppString.print,
onTap: () {
printList(
context,
// productController:
// productController,
// quotationController:
// quotationController,
);
},
),
const SizedBox(
width: 20,
),
CustomButton(
title: AppString.exit,
onTap: () {
addQuatationController
.isAddQuatation =
false;
Get.back();
},
),
],
),
),
),
),
],
);
},
)
: QuationView()
: HomeView(),
indexCallBack: (index) {
if (addQuatationController.selectedIndex != 3) {
addQuatationController.getUpdateQuatationTo();
}
addQuatationController.changeTab(index: index);
},
selectedIndex: addQuatationController.selectedIndex,
);
},
);
}
}
itemSelectList(BuildContext context) {
ProductController productController = Get.put(ProductController());
productController.filterImage();
return commonShowDialog(
context: context,
content: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5),
child: SizedBox(
child: SingleChildScrollView(
child: GetBuilder<ProductController>(
init: ProductController(),
builder: (productController) => Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
AppString.itemMaster,
style: Get.theme.primaryTextTheme.titleMedium,
textAlign: TextAlign.end,
),
],
),
LoginTextField(
onChanged: (val) {
productController.runFilter(val);
},
width: MediaQuery.of(context).size.width / 2,
isdense: true,
hintText: AppString.search,
hintStyle: Get.theme.primaryTextTheme.titleLarge,
fieldStyle: Get.theme.primaryTextTheme.headlineMedium,
),
const SizedBox(height: 10),
Table(
columnWidths: {
0: FlexColumnWidth(5),
1: FlexColumnWidth(10),
2: FlexColumnWidth(30),
3: FlexColumnWidth(10),
4: FlexColumnWidth(20),
},
border: TableBorder.all(
width: 1,
color: Colors.black45,
),
children: [
TableRow(
children: [
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Checkbox(
value: productController.isSelected,
onChanged: (bool? value) {
productController
.selectAllValue(value ?? false);
},
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.skuCode,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.name,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.mrp,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.image,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
],
),
],
),
Table(
columnWidths: {
0: FlexColumnWidth(5),
1: FlexColumnWidth(10),
2: FlexColumnWidth(30),
3: FlexColumnWidth(10),
4: FlexColumnWidth(20),
},
defaultColumnWidth: const FixedColumnWidth(200.0),
border: TableBorder.all(width: 1, color: Colors.black45),
children: List<TableRow>.generate(
productController.getProductList.length,
(index) {
productController.getProductList.forEach((element) {
element.img = productController.imageList
?.firstWhereOrNull((el) =>
element.skycode ==
el.path.split("\\").last.split(".").first)
?.path;
});
return TableRow(children: [
TableCell(
child: Checkbox(
value: productController
.getProductList[index].isSelected,
onChanged: (bool? value) {
productController
.getProductList[index].isSelected = value!;
productController.update();
},
),
),
TableCell(
child: Padding(
padding: EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: TextField(
readOnly: true,
onTap: () {
Get.back(
result:
productController.getProductList[index],
);
},
decoration: InputDecoration(
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
),
controller: TextEditingController(
text: productController
.getProductList[index].skycode!,
),
style: Get.theme.textTheme.displayLarge,
),
),
),
TableCell(
child: Padding(
padding: EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: TextField(
readOnly: true,
onTap: () {
Get.back(
result:
productController.getProductList[index],
);
},
decoration: InputDecoration(
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
),
controller: TextEditingController(
text: productController
.getProductList[index].category!,
),
style: Get.theme.textTheme.displayLarge,
),
),
),
TableCell(
child: Padding(
padding: EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: TextField(
readOnly: true,
onTap: () {
Get.back(
result: productController
.getProductList[index].mrp,
);
},
decoration: InputDecoration(
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
),
controller: TextEditingController(
text: productController
.getProductList[index].mrp!,
),
style: Get.theme.textTheme.displayLarge,
),
),
),
TableCell(
child: Padding(
padding: EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Image.file(
File(
productController.getProductList[index].img ??
AppImagePath.light,
),
height: 80,
width: 80,
),
),
),
]);
},
),
),
],
),
),
),
),
),
actions: [
Padding(
padding: const EdgeInsets.only(bottom: 15, right: 15),
child: CustomButton(
width: 100,
title: AppString.addItem,
onTap: () {
List<ProductData> data = [];
for (int i = 0; i < productController.getProductList.length; i++) {
if (productController.getProductList[i].isSelected == true) {
data.add(productController.getProductList[i]);
}
}
productController.update();
Get.back(result: data);
productController.selectAllValue(false);
},
),
),
Padding(
padding: const EdgeInsets.only(bottom: 15, right: 15),
child: CustomButton(
width: 100,
title: AppString.item,
onTap: () {},
),
),
],
);
}
printList(
BuildContext context,
// ProductController? productController,
// QuotationController? quotationController,
// AddQuatationController? addQuatationController,
) {
ProductController productController = Get.put(ProductController());
QuotationController quotationController = Get.put(QuotationController());
AddQuatationController addQuatationController =
Get.put(AddQuatationController());
return commonShowDialog(
context: context,
title: AppString.voucherPrint,
content: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5),
child: SizedBox(
height: 180,
width: MediaQuery.of(context).size.width / 2,
child: SingleChildScrollView(
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
AppString.selectFormList,
style: Get.theme.primaryTextTheme.titleMedium,
textAlign: TextAlign.end,
),
],
),
const SizedBox(height: 5),
Table(
columnWidths: const {
0: FlexColumnWidth(1),
1: FlexColumnWidth(4),
2: FlexColumnWidth(2.50),
3: FlexColumnWidth(2.50),
},
border: TableBorder.all(width: 1, color: Colors.black45),
children: [
TableRow(
children: [
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
" ...",
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.reportName,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.report,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.original,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.duplicate,
overflow: TextOverflow.ellipsis,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 15,
left: 05,
bottom: 15,
),
child: Text(
AppString.triplicate,
overflow: TextOverflow.ellipsis,
style: Get.theme.primaryTextTheme.titleMedium,
),
),
),
],
),
],
),
Table(
columnWidths: const {
0: FlexColumnWidth(1),
1: FlexColumnWidth(4),
2: FlexColumnWidth(2.50),
3: FlexColumnWidth(2.50),
},
border: TableBorder.all(width: 1, color: Colors.black45),
children: List<TableRow>.generate(
1,
(index) => TableRow(children: [
TableCell(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Checkbox(
value: true,
onChanged: (val) {
//productController.isSelected = val!;
},
),
),
),
const TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 10,
left: 05,
bottom: 10,
),
child: Text(AppString.quatation),
),
),
const TableCell(
child: Padding(
padding: const EdgeInsets.only(
top: 10,
left: 05,
bottom: 10,
),
child: Text(AppString.qua),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Checkbox(value: true, onChanged: (val) {}),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Checkbox(value: false, onChanged: (val) {}),
),
),
TableCell(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Checkbox(value: false, onChanged: (val) {}),
),
),
]),
),
),
],
),
),
),
),
actions: [
CustomButton(
width: 100,
title: AppString.preview,
onTap: () {
Get.back();
},
),
CustomButton(
width: 100,
title: AppString.print,
onTap: () {
try {
double qtyTotal = 0.0;
double gAmtTotal = 0.0;
double netTotal = 0.0;
productController.itemAddList.forEach((element) {
qtyTotal += double.parse(element.qtyController.text);
gAmtTotal += double.parse(element.gAmt.toString());
netTotal += element.nAmt ?? 0.0;
});
} catch (e) {
print("--${e}");
}
/* productController.itemAddList.firstWhere((element) => element.areaController.isBlank ?? productController.itemAddList.removeLast());
productController.itemAddList.removeLast();
print(
"last data removed ====>> ${productController.itemAddList.removeLast()}");*/
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => PdfPreviewPage(
date: addQuatationController.firstDates,
partyName: quotationController.jobRoleSearchDropdownCtrl.text,
reMark: quotationController.referenceSearchDropdownCtrl.text,
qtyTotal: productController.qtyTotal,
gAmtTotal: productController.gAmtTotal,
netAmount: productController.netTotal,
productData: productController.itemAddList,
quatationData: quotationController.getQuatationList[0],
),
),
);
},
),
],
);
}
Editor is loading...