Commit 64c42cd9 authored by Sai Srinivas's avatar Sai Srinivas
Browse files

17-05-2025 By Sai Srinivas

Finance Module payment, receipt list and details
parent 94df616d
class addDirectPaymentResponse {
List<DirectAccounts>? accounts;
List<DirectPaymentAccounts>? paymentAccounts;
List<DirectPaymentModes>? paymentModes;
String? error;
String? message;
addDirectPaymentResponse(
{this.accounts,
this.paymentAccounts,
this.paymentModes,
this.error,
this.message});
addDirectPaymentResponse.fromJson(Map<String, dynamic> json) {
if (json['accounts'] != null) {
accounts = <DirectAccounts>[];
json['accounts'].forEach((v) {
accounts!.add(new DirectAccounts.fromJson(v));
});
}
if (json['payment_accounts'] != null) {
paymentAccounts = <DirectPaymentAccounts>[];
json['payment_accounts'].forEach((v) {
paymentAccounts!.add(new DirectPaymentAccounts.fromJson(v));
});
}
if (json['payment_modes'] != null) {
paymentModes = <DirectPaymentModes>[];
json['payment_modes'].forEach((v) {
paymentModes!.add(new DirectPaymentModes.fromJson(v));
});
}
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.accounts != null) {
data['accounts'] = this.accounts!.map((v) => v.toJson()).toList();
}
if (this.paymentAccounts != null) {
data['payment_accounts'] =
this.paymentAccounts!.map((v) => v.toJson()).toList();
}
if (this.paymentModes != null) {
data['payment_modes'] =
this.paymentModes!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class DirectAccounts {
String? id;
String? name;
DirectAccounts({this.id, this.name});
DirectAccounts.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
return data;
}
}
class DirectPaymentAccounts {
String? id;
String? name;
DirectPaymentAccounts({this.id, this.name});
DirectPaymentAccounts.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
return data;
}
}
class DirectPaymentModes {
String? id;
String? name;
DirectPaymentModes({this.id, this.name});
DirectPaymentModes.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
return data;
}
}
\ No newline at end of file
...@@ -57,32 +57,44 @@ class RequestDetails { ...@@ -57,32 +57,44 @@ class RequestDetails {
String? updatedDatetime; String? updatedDatetime;
String? proposedAccount; String? proposedAccount;
String? proposedAccountId; String? proposedAccountId;
String? bankName;
String? bankBranchname;
String? bankIfscCode;
String? bankAccountHolderName;
String? bankAccountNumber;
String? bankUpiId;
RequestDetails( RequestDetails({this.id,
{this.id, this.isProcessedPaymentRequest,
this.isProcessedPaymentRequest, this.accountId,
this.accountId, this.accountName,
this.accountName, this.branch,
this.branch, this.requestingPurpose,
this.requestingPurpose, this.transDis,
this.transDis, this.description,
this.description, this.amount,
this.amount, this.requestedAmount,
this.requestedAmount, this.requestMode,
this.requestMode, this.status,
this.status, this.createdEmployee,
this.createdEmployee, this.level1Employee,
this.level1Employee, this.level2Employee,
this.level2Employee, this.level1ApprovalRemarks,
this.level1ApprovalRemarks, this.level2ApprovalRemarks,
this.level2ApprovalRemarks, this.attachmentViewFileName,
this.attachmentViewFileName, this.attachmentDirFilePath,
this.attachmentDirFilePath, this.date,
this.date, this.createdDatetime,
this.createdDatetime, this.updatedDatetime,
this.updatedDatetime, this.proposedAccount,
this.proposedAccount, this.proposedAccountId,
this.proposedAccountId}); this.bankName,
this.bankBranchname,
this.bankIfscCode,
this.bankAccountHolderName,
this.bankAccountNumber,
this.bankUpiId,
});
RequestDetails.fromJson(Map<String, dynamic> json) { RequestDetails.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
...@@ -109,6 +121,12 @@ class RequestDetails { ...@@ -109,6 +121,12 @@ class RequestDetails {
updatedDatetime = json['updated_datetime']; updatedDatetime = json['updated_datetime'];
proposedAccount = json['proposed_account']; proposedAccount = json['proposed_account'];
proposedAccountId = json['proposed_account_id']; proposedAccountId = json['proposed_account_id'];
bankName = json['bank_name'];
bankBranchname = json['bank_branch_name'];
bankIfscCode = json['bank_ifsc_code'];
bankAccountHolderName = json['bank_account_holder_name'];
bankAccountNumber = json['bank_account_number'];
bankUpiId = json['bank_upi_id'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
...@@ -137,6 +155,12 @@ class RequestDetails { ...@@ -137,6 +155,12 @@ class RequestDetails {
data['updated_datetime'] = this.updatedDatetime; data['updated_datetime'] = this.updatedDatetime;
data['proposed_account'] = this.proposedAccount; data['proposed_account'] = this.proposedAccount;
data['proposed_account_id'] = this.proposedAccountId; data['proposed_account_id'] = this.proposedAccountId;
data['bank_name'] = this.bankName;
data['bank_branch_name'] = this.bankBranchname;
data['bank_ifsc_code'] = this.bankIfscCode;
data['bank_account_holder_name'] = this.bankAccountHolderName;
data['bank_account_number'] = this.bankAccountNumber;
data['bank_upi_id'] = this.bankUpiId;
return data; return data;
} }
} }
...@@ -170,34 +194,33 @@ class PaymentDetails { ...@@ -170,34 +194,33 @@ class PaymentDetails {
String? paymentEmployeeName; String? paymentEmployeeName;
String? mode; String? mode;
PaymentDetails( PaymentDetails({this.id,
{this.id, this.refType,
this.refType, this.refId,
this.refId, this.paymentAccountId,
this.paymentAccountId, this.accountId,
this.accountId, this.paymentModeId,
this.paymentModeId, this.amount,
this.amount, this.bankName,
this.bankName, this.bankBranchName,
this.bankBranchName, this.bankIfscCode,
this.bankIfscCode, this.bankAccountHolderName,
this.bankAccountHolderName, this.bankAccountNumber,
this.bankAccountNumber, this.bankUpiId,
this.bankUpiId, this.attachmentDirFilePath,
this.attachmentDirFilePath, this.attachmentViewFileName,
this.attachmentViewFileName, this.description,
this.description, this.paymentReferenceNumber,
this.paymentReferenceNumber, this.createdEmployeeId,
this.createdEmployeeId, this.paymentDate,
this.paymentDate, this.paymentRemarks,
this.paymentRemarks, this.isExists,
this.isExists, this.createdDatetime,
this.createdDatetime, this.updatedDatetime,
this.updatedDatetime, this.accountName,
this.accountName, this.paymentAccountName,
this.paymentAccountName, this.paymentEmployeeName,
this.paymentEmployeeName, this.mode});
this.mode});
PaymentDetails.fromJson(Map<String, dynamic> json) { PaymentDetails.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
......
class paymentRequisitionPaymentsDetailsResponse {
PaymentDetails? paymentDetails;
String? error;
String? message;
paymentRequisitionPaymentsDetailsResponse(
{this.paymentDetails, this.error, this.message});
paymentRequisitionPaymentsDetailsResponse.fromJson(
Map<String, dynamic> json) {
paymentDetails = json['payment_details'] != null
? new PaymentDetails.fromJson(json['payment_details'])
: null;
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.paymentDetails != null) {
data['payment_details'] = this.paymentDetails!.toJson();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class PaymentDetails {
String? id;
String? refType;
String? refId;
String? paymentAccountId;
String? accountId;
String? paymentModeId;
String? amount;
String? bankName;
String? bankBranchName;
String? bankIfscCode;
String? bankAccountHolderName;
String? bankAccountNumber;
String? bankUpiId;
String? attachmentDirFilePath;
String? attachmentViewFileName;
String? description;
String? paymentReferenceNumber;
String? createdEmployeeId;
String? paymentDate;
String? paymentRemarks;
String? isExists;
String? createdDatetime;
String? updatedDatetime;
String? accountName;
String? paymentAccountName;
String? paymentEmployeeName;
String? mode;
PaymentDetails(
{this.id,
this.refType,
this.refId,
this.paymentAccountId,
this.accountId,
this.paymentModeId,
this.amount,
this.bankName,
this.bankBranchName,
this.bankIfscCode,
this.bankAccountHolderName,
this.bankAccountNumber,
this.bankUpiId,
this.attachmentDirFilePath,
this.attachmentViewFileName,
this.description,
this.paymentReferenceNumber,
this.createdEmployeeId,
this.paymentDate,
this.paymentRemarks,
this.isExists,
this.createdDatetime,
this.updatedDatetime,
this.accountName,
this.paymentAccountName,
this.paymentEmployeeName,
this.mode});
PaymentDetails.fromJson(Map<String, dynamic> json) {
id = json['id'];
refType = json['ref_type'];
refId = json['ref_id'];
paymentAccountId = json['payment_account_id'];
accountId = json['account_id'];
paymentModeId = json['payment_mode_id'];
amount = json['amount'];
bankName = json['bank_name'];
bankBranchName = json['bank_branch_name'];
bankIfscCode = json['bank_ifsc_code'];
bankAccountHolderName = json['bank_account_holder_name'];
bankAccountNumber = json['bank_account_number'];
bankUpiId = json['bank_upi_id'];
attachmentDirFilePath = json['attachment_dir_file_path'];
attachmentViewFileName = json['attachment_view_file_name'];
description = json['description'];
paymentReferenceNumber = json['payment_reference_number'];
createdEmployeeId = json['created_employee_id'];
paymentDate = json['payment_date'];
paymentRemarks = json['payment_remarks'];
isExists = json['is_exists'];
createdDatetime = json['created_datetime'];
updatedDatetime = json['updated_datetime'];
accountName = json['account_name'];
paymentAccountName = json['payment_account_name'];
paymentEmployeeName = json['payment_employee_name'];
mode = json['mode'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['ref_type'] = this.refType;
data['ref_id'] = this.refId;
data['payment_account_id'] = this.paymentAccountId;
data['account_id'] = this.accountId;
data['payment_mode_id'] = this.paymentModeId;
data['amount'] = this.amount;
data['bank_name'] = this.bankName;
data['bank_branch_name'] = this.bankBranchName;
data['bank_ifsc_code'] = this.bankIfscCode;
data['bank_account_holder_name'] = this.bankAccountHolderName;
data['bank_account_number'] = this.bankAccountNumber;
data['bank_upi_id'] = this.bankUpiId;
data['attachment_dir_file_path'] = this.attachmentDirFilePath;
data['attachment_view_file_name'] = this.attachmentViewFileName;
data['description'] = this.description;
data['payment_reference_number'] = this.paymentReferenceNumber;
data['created_employee_id'] = this.createdEmployeeId;
data['payment_date'] = this.paymentDate;
data['payment_remarks'] = this.paymentRemarks;
data['is_exists'] = this.isExists;
data['created_datetime'] = this.createdDatetime;
data['updated_datetime'] = this.updatedDatetime;
data['account_name'] = this.accountName;
data['payment_account_name'] = this.paymentAccountName;
data['payment_employee_name'] = this.paymentEmployeeName;
data['mode'] = this.mode;
return data;
}
}
class paymentRequisitionPaymentsListResponse {
List<PaymentsList>? paymentsList;
String? error;
String? message;
paymentRequisitionPaymentsListResponse(
{this.paymentsList, this.error, this.message});
paymentRequisitionPaymentsListResponse.fromJson(Map<String, dynamic> json) {
if (json['payments_list'] != null) {
paymentsList = <PaymentsList>[];
json['payments_list'].forEach((v) {
paymentsList!.add(new PaymentsList.fromJson(v));
});
}
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.paymentsList != null) {
data['payments_list'] =
this.paymentsList!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class PaymentsList {
String? id;
String? refType;
String? amount;
String? bankName;
String? bankBranchName;
String? bankIfscCode;
String? bankAccountHolderName;
String? bankAccountNumber;
String? bankUpiId;
String? attachmentDirFilePath;
String? attachmentViewFileName;
String? description;
String? paymentReferenceNumber;
String? paymentDate;
String? receipientAccount;
String? payAccount;
String? requestMode;
String? createdEmployee;
String? createdDatetime;
String? accountId;
String? paymentAccountId;
PaymentsList(
{this.id,
this.refType,
this.amount,
this.bankName,
this.bankBranchName,
this.bankIfscCode,
this.bankAccountHolderName,
this.bankAccountNumber,
this.bankUpiId,
this.attachmentDirFilePath,
this.attachmentViewFileName,
this.description,
this.paymentReferenceNumber,
this.paymentDate,
this.receipientAccount,
this.payAccount,
this.requestMode,
this.createdEmployee,
this.createdDatetime,
this.accountId,
this.paymentAccountId});
PaymentsList.fromJson(Map<String, dynamic> json) {
id = json['id'];
refType = json['ref_type'];
amount = json['amount'];
bankName = json['bank_name'];
bankBranchName = json['bank_branch_name'];
bankIfscCode = json['bank_ifsc_code'];
bankAccountHolderName = json['bank_account_holder_name'];
bankAccountNumber = json['bank_account_number'];
bankUpiId = json['bank_upi_id'];
attachmentDirFilePath = json['attachment_dir_file_path'];
attachmentViewFileName = json['attachment_view_file_name'];
description = json['description'];
paymentReferenceNumber = json['payment_reference_number'];
paymentDate = json['payment_date'];
receipientAccount = json['receipient_account'];
payAccount = json['pay_account'];
requestMode = json['request_mode'];
createdEmployee = json['created_employee'];
createdDatetime = json['created_datetime'];
accountId = json['account_id'];
paymentAccountId = json['payment_account_id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['ref_type'] = this.refType;
data['amount'] = this.amount;
data['bank_name'] = this.bankName;
data['bank_branch_name'] = this.bankBranchName;
data['bank_ifsc_code'] = this.bankIfscCode;
data['bank_account_holder_name'] = this.bankAccountHolderName;
data['bank_account_number'] = this.bankAccountNumber;
data['bank_upi_id'] = this.bankUpiId;
data['attachment_dir_file_path'] = this.attachmentDirFilePath;
data['attachment_view_file_name'] = this.attachmentViewFileName;
data['description'] = this.description;
data['payment_reference_number'] = this.paymentReferenceNumber;
data['payment_date'] = this.paymentDate;
data['receipient_account'] = this.receipientAccount;
data['pay_account'] = this.payAccount;
data['request_mode'] = this.requestMode;
data['created_employee'] = this.createdEmployee;
data['created_datetime'] = this.createdDatetime;
data['account_id'] = this.accountId;
data['payment_account_id'] = this.paymentAccountId;
return data;
}
}
class paymentRequisitionPaymentsReceiptsDetailsResponse {
ReceiptDetails? receiptDetails;
String? error;
String? message;
paymentRequisitionPaymentsReceiptsDetailsResponse(
{this.receiptDetails, this.error, this.message});
paymentRequisitionPaymentsReceiptsDetailsResponse.fromJson(
Map<String, dynamic> json) {
receiptDetails = json['receipt_details'] != null
? new ReceiptDetails.fromJson(json['receipt_details'])
: null;
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.receiptDetails != null) {
data['receipt_details'] = this.receiptDetails!.toJson();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class ReceiptDetails {
String? id;
String? amount;
String? bankName;
String? bankBranchName;
String? bankIfscCode;
String? bankAccountHolderName;
String? bankAccountNumber;
String? attachmentDirFilePath;
String? attachmentViewFileName;
String? accountId;
String? description;
String? paymentReferenceNumber;
String? receiptDate;
String? receipientAccount;
String? payAccount;
String? requestMode;
String? createdEmployee;
String? createdDatetime;
String? updatedDatetime;
String? receiptAccountId;
String? bankUpiId;
ReceiptDetails(
{this.id,
this.amount,
this.bankName,
this.bankBranchName,
this.bankIfscCode,
this.bankAccountHolderName,
this.bankAccountNumber,
this.attachmentDirFilePath,
this.attachmentViewFileName,
this.accountId,
this.description,
this.paymentReferenceNumber,
this.receiptDate,
this.receipientAccount,
this.payAccount,
this.requestMode,
this.createdEmployee,
this.createdDatetime,
this.updatedDatetime,
this.receiptAccountId,
this.bankUpiId});
ReceiptDetails.fromJson(Map<String, dynamic> json) {
id = json['id'];
amount = json['amount'];
bankName = json['bank_name'];
bankBranchName = json['bank_branch_name'];
bankIfscCode = json['bank_ifsc_code'];
bankAccountHolderName = json['bank_account_holder_name'];
bankAccountNumber = json['bank_account_number'];
attachmentDirFilePath = json['attachment_dir_file_path'];
attachmentViewFileName = json['attachment_view_file_name'];
accountId = json['account_id'];
description = json['description'];
paymentReferenceNumber = json['payment_reference_number'];
receiptDate = json['receipt_date'];
receipientAccount = json['receipient_account'];
payAccount = json['pay_account'];
requestMode = json['request_mode'];
createdEmployee = json['created_employee'];
createdDatetime = json['created_datetime'];
updatedDatetime = json['updated_datetime'];
receiptAccountId = json['receipt_account_id'];
bankUpiId = json['bank_upi_id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['amount'] = this.amount;
data['bank_name'] = this.bankName;
data['bank_branch_name'] = this.bankBranchName;
data['bank_ifsc_code'] = this.bankIfscCode;
data['bank_account_holder_name'] = this.bankAccountHolderName;
data['bank_account_number'] = this.bankAccountNumber;
data['attachment_dir_file_path'] = this.attachmentDirFilePath;
data['attachment_view_file_name'] = this.attachmentViewFileName;
data['account_id'] = this.accountId;
data['description'] = this.description;
data['payment_reference_number'] = this.paymentReferenceNumber;
data['receipt_date'] = this.receiptDate;
data['receipient_account'] = this.receipientAccount;
data['pay_account'] = this.payAccount;
data['request_mode'] = this.requestMode;
data['created_employee'] = this.createdEmployee;
data['created_datetime'] = this.createdDatetime;
data['updated_datetime'] = this.updatedDatetime;
data['receipt_account_id'] = this.receiptAccountId;
data['bank_upi_id'] =this.bankUpiId;
return data;
}
}
class paymentRequisitionPaymentsReceiptsListResponse {
List<ReceiptsList>? receiptsList;
String? error;
String? message;
paymentRequisitionPaymentsReceiptsListResponse(
{this.receiptsList, this.error, this.message});
paymentRequisitionPaymentsReceiptsListResponse.fromJson(
Map<String, dynamic> json) {
if (json['receipts_list'] != null) {
receiptsList = <ReceiptsList>[];
json['receipts_list'].forEach((v) {
receiptsList!.add(new ReceiptsList.fromJson(v));
});
}
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.receiptsList != null) {
data['receipts_list'] =
this.receiptsList!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class ReceiptsList {
String? id;
String? amount;
String? bankName;
String? bankBranchName;
String? bankIfscCode;
String? bankAccountHolderName;
String? bankAccountNumber;
String? attachmentDirFilePath;
String? attachmentViewFileName;
String? accountId;
String? description;
String? paymentReferenceNumber;
String? receiptDate;
String? receipientAccount;
String? payAccount;
String? requestMode;
String? createdEmployee;
String? createdDatetime;
String? updatedDatetime;
String? receiptAccountId;
ReceiptsList(
{this.id,
this.amount,
this.bankName,
this.bankBranchName,
this.bankIfscCode,
this.bankAccountHolderName,
this.bankAccountNumber,
this.attachmentDirFilePath,
this.attachmentViewFileName,
this.accountId,
this.description,
this.paymentReferenceNumber,
this.receiptDate,
this.receipientAccount,
this.payAccount,
this.requestMode,
this.createdEmployee,
this.createdDatetime,
this.updatedDatetime,
this.receiptAccountId});
ReceiptsList.fromJson(Map<String, dynamic> json) {
id = json['id'];
amount = json['amount'];
bankName = json['bank_name'];
bankBranchName = json['bank_branch_name'];
bankIfscCode = json['bank_ifsc_code'];
bankAccountHolderName = json['bank_account_holder_name'];
bankAccountNumber = json['bank_account_number'];
attachmentDirFilePath = json['attachment_dir_file_path'];
attachmentViewFileName = json['attachment_view_file_name'];
accountId = json['account_id'];
description = json['description'];
paymentReferenceNumber = json['payment_reference_number'];
receiptDate = json['receipt_date'];
receipientAccount = json['receipient_account'];
payAccount = json['pay_account'];
requestMode = json['request_mode'];
createdEmployee = json['created_employee'];
createdDatetime = json['created_datetime'];
updatedDatetime = json['updated_datetime'];
receiptAccountId = json['receipt_account_id'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['amount'] = this.amount;
data['bank_name'] = this.bankName;
data['bank_branch_name'] = this.bankBranchName;
data['bank_ifsc_code'] = this.bankIfscCode;
data['bank_account_holder_name'] = this.bankAccountHolderName;
data['bank_account_number'] = this.bankAccountNumber;
data['attachment_dir_file_path'] = this.attachmentDirFilePath;
data['attachment_view_file_name'] = this.attachmentViewFileName;
data['account_id'] = this.accountId;
data['description'] = this.description;
data['payment_reference_number'] = this.paymentReferenceNumber;
data['receipt_date'] = this.receiptDate;
data['receipient_account'] = this.receipientAccount;
data['pay_account'] = this.payAccount;
data['request_mode'] = this.requestMode;
data['created_employee'] = this.createdEmployee;
data['created_datetime'] = this.createdDatetime;
data['updated_datetime'] = this.updatedDatetime;
data['receipt_account_id'] = this.receiptAccountId;
return data;
}
}
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:generp/Models/financeModels/paymentRequisitionDetailsResponse.dart'; import 'package:generp/Models/financeModels/paymentRequisitionDetailsResponse.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart'; import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Utils/commonServices.dart';
import 'package:generp/services/api_calling.dart'; import 'package:generp/services/api_calling.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'approveRejectPaymentRequestResponse.dart'; import 'approveRejectPaymentRequestResponse.dart';
class Requesitionlidtdetailsprovider extends ChangeNotifier{ class Requesitionlidtdetailsprovider extends ChangeNotifier {
PaymentDetails _paymentDetails = PaymentDetails();
RequestDetails _requestDetails = RequestDetails();
PaymentDetails get paymentsDetails => _paymentDetails; TextEditingController requestedAmount = TextEditingController();
RequestDetails get requestsDetails => _requestDetails; TextEditingController proposedPaymentAccount = TextEditingController();
TextEditingController accountName = TextEditingController();
TextEditingController branch = TextEditingController();
TextEditingController requestingPurpose = TextEditingController();
TextEditingController description = TextEditingController();
TextEditingController amount = TextEditingController();
TextEditingController paymentMode = TextEditingController();
TextEditingController bankUpiID = TextEditingController();
TextEditingController bankName = TextEditingController();
TextEditingController bankBranchName = TextEditingController();
TextEditingController bankAccountNumber = TextEditingController();
TextEditingController bankIfscCode = TextEditingController();
TextEditingController bankHolderName = TextEditingController();
List<PaymentAccounts> _paymentAccounts = []; PaymentDetails _paymentDetails = PaymentDetails();
RequestDetails _requestDetails = RequestDetails();
PaymentRequestDetails _paymentRequestDetails = PaymentRequestDetails(); PaymentRequestDetails _paymentRequestDetails = PaymentRequestDetails();
PaymentAccounts? _selectedPaymentAccounts;
List<PaymentModes> _paymentModes = []; List<PaymentModes> _paymentModes = [];
List<PaymentAccounts> _paymentAccounts = [];
PaymentAccounts? _selectedPaymentAccounts; var _selectedValue;
var _selectedID;
List<String> _headings = [];
List<String> _subHeadings = [];
String? FileError;
var _image_picked = 0;
final ImagePicker _picker = ImagePicker();
File? _image;
get image_picked => _image_picked;
File? get imagePath => _image;
PaymentDetails get paymentsDetails => _paymentDetails;
RequestDetails get requestsDetails => _requestDetails;
List<PaymentAccounts> get paymentsAccounts => _paymentAccounts; List<PaymentAccounts> get paymentsAccounts => _paymentAccounts;
List<PaymentModes> get paymentsModes => _paymentModes; List<PaymentModes> get paymentsModes => _paymentModes;
PaymentRequestDetails get paymentsReqDetails => _paymentRequestDetails; PaymentRequestDetails get paymentsReqDetails => _paymentRequestDetails;
PaymentAccounts? get selectedPaymentAccounts => _selectedPaymentAccounts; PaymentAccounts? get selectedPaymentAccounts => _selectedPaymentAccounts;
var _selectedValue;
var _selectedID;
get selectedValue => _selectedValue; get selectedValue => _selectedValue;
get selectedID => _selectedID; get selectedID => _selectedID;
List<String> _headings = [
];
List<String> _subHeadings =[];
List<String> get subHeadings => _subHeadings; List<String> get subHeadings => _subHeadings;
List<String> get Headings => _headings;
set subHeadings(List<String> value){
_subHeadings = value;
notifyListeners();
}
set selectedPaymentAccounts(PaymentAccounts? value){ List<String> get Headings => _headings;
set selectedPaymentAccounts(PaymentAccounts? value) {
_selectedPaymentAccounts = value; _selectedPaymentAccounts = value;
_selectedValue = value!.name!; _selectedValue = value!.name!;
_selectedID = value!.id; _selectedID = value!.id;
notifyListeners(); notifyListeners();
} }
set selectedValue(value){ set selectedValue(value) {
_selectedValue = value; _selectedValue = value;
notifyListeners(); notifyListeners();
} }
set selectedID(value){ set selectedID(value) {
_selectedID = value; _selectedID = value;
notifyListeners(); notifyListeners();
} }
Future<void> paymentRequesitionDetails(context,payment_request_id) async { imgFromCamera(context) async {
try{ // Capture a photo
var provider = Provider.of<HomescreenNotifier>(context,listen: false); try {
final data = await ApiCalling.paymentRequestionDetailsAPI(provider.empId, provider.session, payment_request_id); final XFile? galleryImage = await _picker.pickImage(
if(data!=null){ source: ImageSource.camera,
if(data.error=="0"){ imageQuality: 50,
);
debugPrint("added");
_image = File(galleryImage!.path);
_image_picked = 1;
FileError = null;
notifyListeners();
} catch (e) {
debugPrint("mmmm: ${e.toString()}");
}
}
imgFromGallery(context) async {
// Pick an image
try {
final XFile? galleryImage = await _picker.pickImage(
source: ImageSource.gallery,
);
final bytes = (await galleryImage?.readAsBytes())?.lengthInBytes;
final kb = bytes! / 1024;
final mb = kb / 1024;
debugPrint("Jenny: bytes:$bytes, kb:$kb, mb: $mb");
_image = File(galleryImage!.path);
_image_picked = 1;
FileError = null;
notifyListeners();
// var file = FlutterImageCompress.compressWithFile(galleryImage!.path);
} catch (e) {
debugPrint("mmmm: ${e.toString()}");
}
}
Future<void> paymentRequesitionDetails(context, payment_request_id) async {
try {
var provider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.paymentRequestionDetailsAPI(
provider.empId,
provider.session,
payment_request_id,
);
if (data != null) {
if (data.error == "0") {
_headings = [ _headings = [
"Requested Account", "Requested Account",
"Proposed Account Name", "Proposed Account Name",
...@@ -79,123 +163,195 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier{ ...@@ -79,123 +163,195 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier{
"Created Date/Time", "Created Date/Time",
"Updated Date/Time", "Updated Date/Time",
]; ];
_paymentDetails = data.paymentDetails??PaymentDetails( _paymentDetails =
accountId: "", data.paymentDetails ??
accountName: "", PaymentDetails(
amount: "", accountId: "",
attachmentDirFilePath: "", accountName: "",
attachmentViewFileName: "", amount: "",
bankAccountHolderName: "", attachmentDirFilePath: "",
bankAccountNumber: "", attachmentViewFileName: "",
bankBranchName: "", bankAccountHolderName: "",
bankIfscCode: "", bankAccountNumber: "",
bankName: "", bankBranchName: "",
bankUpiId: "", bankIfscCode: "",
createdDatetime: "", bankName: "",
createdEmployeeId: "", bankUpiId: "",
description: "", createdDatetime: "",
id: "", createdEmployeeId: "",
isExists: "", description: "",
mode: "", id: "",
paymentAccountId: "", isExists: "",
paymentAccountName: "", mode: "",
paymentDate: "", paymentAccountId: "",
paymentEmployeeName: "", paymentAccountName: "",
paymentModeId: "", paymentDate: "",
paymentReferenceNumber: "", paymentEmployeeName: "",
paymentRemarks: "", paymentModeId: "",
refId: "", paymentReferenceNumber: "",
refType: "", paymentRemarks: "",
updatedDatetime: "" refId: "",
); refType: "",
_requestDetails = data.requestDetails??RequestDetails( updatedDatetime: "",
updatedDatetime: "", );
id: "",
description: "", _requestDetails =
createdDatetime: "", data.requestDetails ??
attachmentViewFileName: "", RequestDetails(
attachmentDirFilePath: "", updatedDatetime: "",
amount: "", id: "",
accountName: "", description: "",
accountId: "", createdDatetime: "",
branch: "", attachmentViewFileName: "",
createdEmployee: "", attachmentDirFilePath: "",
date: "", amount: "",
isProcessedPaymentRequest: "", accountName: "",
level1ApprovalRemarks: "", accountId: "",
level1Employee: "", branch: "",
level2ApprovalRemarks: "", createdEmployee: "",
level2Employee: "", date: "",
proposedAccount: "", isProcessedPaymentRequest: "",
proposedAccountId: "", level1ApprovalRemarks: "",
requestedAmount: "", level1Employee: "",
requestingPurpose: "", level2ApprovalRemarks: "",
requestMode: "", level2Employee: "",
status: "", proposedAccount: "",
transDis: "" proposedAccountId: "",
); requestedAmount: "",
_subHeadings = [ requestingPurpose: "",
_requestDetails.accountName??"-", requestMode: "",
_requestDetails.proposedAccount??"-", status: "",
_requestDetails.branch??"-", transDis: "",
_requestDetails.requestingPurpose??"-", );
_requestDetails.requestMode??"-",
_requestDetails.createdEmployee??"-", print("here 2121");
_requestDetails.attachmentViewFileName??"-", preValues();
_requestDetails.date??"-", notifyListeners();
_requestDetails.description??"-",
_requestDetails.level1ApprovalRemarks??"-",
_requestDetails.level1Employee??"-",
_requestDetails.level2ApprovalRemarks??"-",
_requestDetails.level2Employee??"-",
_requestDetails.createdDatetime??"-",
_requestDetails.updatedDatetime??"-"
];
notifyListeners();
} }
} }
}catch (e,s){} } catch (e, s) {}
} }
Future<void> approveRejectPaymentRequestAPIFunction(context,payment_request_id) async { preValues(){
try{ print("here 212ssass1");
var provider = Provider.of<HomescreenNotifier>(context,listen: false); requestedAmount.text = _requestDetails.requestedAmount??"-";
final data = await ApiCalling.approveRejectPaymentRequestAPI(provider.empId, provider.session, payment_request_id); proposedPaymentAccount.text = _requestDetails.proposedAccount??"-";
if(data!=null){ accountName.text = _requestDetails.accountName??"-";
if(data.error=="0"){ branch.text = _requestDetails.branch??"-";
requestingPurpose.text = _requestDetails.requestingPurpose??"-";
description.text = _requestDetails.description??"-";
amount.text = _requestDetails.amount??"-";
paymentMode.text = _requestDetails.requestMode??"-";
bankUpiID.text = _requestDetails.bankUpiId??"-";
bankName.text = _requestDetails.bankName??"-";
bankBranchName.text = _requestDetails.bankBranchname??"-";
bankAccountNumber.text = _requestDetails.bankAccountNumber??"-";
bankIfscCode.text = _requestDetails.bankIfscCode??"-";
bankHolderName.text = _requestDetails.bankAccountHolderName??"-";
notifyListeners();
}
Future<void> approveRejectPaymentRequestAPIFunction(
context,
payment_request_id,
) async {
try {
var provider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.approveRejectPaymentRequestAPI(
provider.empId,
provider.session,
payment_request_id,
);
if (data != null) {
if (data.error == "0") {
_paymentModes = data.paymentModes!; _paymentModes = data.paymentModes!;
_paymentAccounts = data.paymentAccounts!; _paymentAccounts = data.paymentAccounts!;
_paymentRequestDetails= data.paymentRequestDetails!; _paymentRequestDetails = data.paymentRequestDetails!;
notifyListeners();
notifyListeners();
} }
} }
}catch (e,s){} } catch (e, s) {}
} }
Future<void> paymentrequisitionRejectSubmitAPIFunction(
Future<void> paymentrequisitionRejectSubmitAPIFunction(context, mode, payment_request_id, approve_remarks) async { context,
try{ mode,
var provider = Provider.of<HomescreenNotifier>(context,listen: false); payment_request_id,
final data = await ApiCalling.RejectPaymentRequestSubmitAPI(provider.empId, provider.session, mode, payment_request_id, approve_remarks); approve_remarks,
}catch (e,s){ ) async {
try {
} var provider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.RejectPaymentRequestSubmitAPI(
provider.empId,
provider.session,
mode,
payment_request_id,
approve_remarks,
);
if(data!=null){
if(data.error=="0"){
toast(context, data.message);
Navigator.pop(context);
}
}
} catch (e, s) {}
} }
Future<void> paymentrequisitionApproveSubmitAPIFunction(context, mode, payment_request_id,approved_amount, approve_remarks,proposed_payment_account_id) async { Future<void> paymentrequisitionApproveSubmitAPIFunction(
try{ context,
var provider = Provider.of<HomescreenNotifier>(context,listen: false); mode,
final data = await ApiCalling.ApprovePaymentRequestSubmitAPI(provider.empId, provider.session, mode, payment_request_id, approved_amount, approve_remarks, proposed_payment_account_id); payment_request_id,
}catch (e,s){ approved_amount,
approve_remarks,
} proposed_payment_account_id,
) async {
try {
var provider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.ApprovePaymentRequestSubmitAPI(
provider.empId,
provider.session,
mode,
payment_request_id,
approved_amount,
approve_remarks,
proposed_payment_account_id,
);
if(data!=null){
if(data.error=="0"){
toast(context, data.message);
Navigator.pop(context);
}
}
} catch (e, s) {}
} }
Future<void> paymentrequisitionProcessSubmitAPIFunction(context, mode, payment_request_id,approved_amount, approve_remarks,proposed_payment_account_id,payment_account_id,processing_remarks,attachment) async {
try{
var provider = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.processApproveRejectPaymentRequestSubmitAPI(provider.empId, provider.session, mode, payment_request_id, approved_amount, approve_remarks, proposed_payment_account_id, payment_account_id, processing_remarks, attachment);
}catch (e,s){
} Future<void> paymentrequisitionProcessSubmitAPIFunction(
context,
mode,
payment_request_id,
payment_account_id,
processing_remarks,
attachment,
) async {
try {
var provider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.processApproveRejectPaymentRequestSubmitAPI(
provider.empId,
provider.session,
mode,
payment_request_id,
payment_account_id,
processing_remarks,
attachment,
);
if(data!=null){
if(data.error=="0"){
toast(context, data.message);
Navigator.pop(context);
}
}
} catch (e, s) {}
} }
} }
\ No newline at end of file
...@@ -6,10 +6,12 @@ import 'package:flutter/foundation.dart'; ...@@ -6,10 +6,12 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:generp/Models/financeModels/addDirectPaymentResponse.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart'; import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Utils/commonServices.dart'; import 'package:generp/Utils/commonServices.dart';
import 'package:generp/services/api_calling.dart'; import 'package:generp/services/api_calling.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
...@@ -24,8 +26,6 @@ import 'package:pdf/widgets.dart' as pw; ...@@ -24,8 +26,6 @@ import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart'; import 'package:printing/printing.dart';
class Requestionlistprovider extends ChangeNotifier { class Requestionlistprovider extends ChangeNotifier {
TextEditingController reqPurposeController = TextEditingController(); TextEditingController reqPurposeController = TextEditingController();
TextEditingController descController = TextEditingController(); TextEditingController descController = TextEditingController();
TextEditingController amountController = TextEditingController(); TextEditingController amountController = TextEditingController();
...@@ -35,11 +35,116 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -35,11 +35,116 @@ class Requestionlistprovider extends ChangeNotifier {
TextEditingController bankIfscController = TextEditingController(); TextEditingController bankIfscController = TextEditingController();
TextEditingController bankAcHolderController = TextEditingController(); TextEditingController bankAcHolderController = TextEditingController();
TextEditingController bankUpiController = TextEditingController(); TextEditingController bankUpiController = TextEditingController();
TextEditingController paymentReferenceController = TextEditingController();
// Date picker state
DateTime? _date;
String? _formattedDate;
List<Accounts> _accounts = []; List<Accounts> _accounts = [];
List<PaymentModes> _paymentModes = []; List<PaymentModes> _paymentModes = [];
List<String> _requestingPurposes = []; List<String> _requestingPurposes = [];
List<RequistionList> _requisitionList = []; List<RequistionList> _requisitionList = [];
List<DirectAccounts> _directAccounts = [];
List<DirectPaymentAccounts> _directPaymentAccounts = [];
List<DirectPaymentModes> _directPaymentModes = [];
DirectAccounts? _selectedDirectAccounts;
DirectPaymentAccounts? _selectDirectPaymentAccounts;
DirectPaymentModes? _selectDirectPaymentModes;
String _directAccountID = "";
String _directAccountValue = "";
String _directPaymentAccountsID = "";
String _directPaymentAccountsValue = "";
String _directPaymentModesID = "";
String _directPaymentModesValues = "";
List<DirectAccounts> get directAccounts => _directAccounts;
List<DirectPaymentAccounts> get directPaymentAccounts =>
_directPaymentAccounts;
List<DirectPaymentModes> get directPaymentModes => _directPaymentModes;
DirectAccounts? get selectDirectAccounts => _selectedDirectAccounts;
DirectPaymentAccounts? get selectDirectPaymentAccounts =>
_selectDirectPaymentAccounts;
DirectPaymentModes? get selectDirectPaymentModes => _selectDirectPaymentModes;
String get directAccountId => _directAccountID;
String get directAccountValue => _directAccountValue;
String get directPaymentAccountsID => _directPaymentAccountsID;
String get directPaymentAccountsValue => _directPaymentAccountsValue;
String get directPaymentModesID => _directPaymentModesID;
String get directPaymentModesValues => _directPaymentModesValues;
// Date picker methods
void setDate(DateTime newDate) {
_date = newDate;
_formattedDate = DateFormat('yyyy-MM-dd').format(newDate);
notifyListeners();
}
set selectDirectAccounts(DirectAccounts? value) {
_selectedDirectAccounts = value;
_directAccountID = value!.id!;
_directAccountValue = value!.name!;
notifyListeners();
}
set selectDirectPaymentAccounts(DirectPaymentAccounts? value) {
_selectDirectPaymentAccounts = value;
_directPaymentAccountsID = value!.id!;
_directPaymentAccountsValue = value!.name!;
notifyListeners();
}
set selectDirectPaymentModes(DirectPaymentModes? value) {
_selectDirectPaymentModes = value;
_directPaymentModesID = value!.id!;
_directPaymentModesValues = value!.name!;
notifyListeners();
}
set directAccountId(String value) {
_directAccountID = value;
notifyListeners();
}
set directAccountValue(String value) {
_directAccountValue = value;
notifyListeners();
}
set directPaymentAccountsID(String value) {
_directPaymentAccountsID = value;
notifyListeners();
}
set directPaymentAccountsValue(String value) {
_directPaymentAccountsValue = value;
notifyListeners();
}
set directPaymentModesID(String value) {
_directPaymentModesID = value;
notifyListeners();
}
set directPaymentModesValues(String value) {
_directPaymentModesValues = value;
notifyListeners();
}
Accounts? _selectedAccounts; Accounts? _selectedAccounts;
PaymentModes? _selectedPayment; PaymentModes? _selectedPayment;
String? _selectReqPurpose; String? _selectReqPurpose;
...@@ -96,6 +201,7 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -96,6 +201,7 @@ class Requestionlistprovider extends ChangeNotifier {
List<String> get requestingPurposes => _requestingPurposes; List<String> get requestingPurposes => _requestingPurposes;
List<RequistionList> get requisitionList => _requisitionList; List<RequistionList> get requisitionList => _requisitionList;
String? get formattedDate => _formattedDate;
// bool get submitClicked => _submitClicked; // bool get submitClicked => _submitClicked;
// set submitClicked(bool value){ // set submitClicked(bool value){
...@@ -232,29 +338,115 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -232,29 +338,115 @@ class Requestionlistprovider extends ChangeNotifier {
listen: false, listen: false,
); );
final data = await ApiCalling.addPaymentRequestionSubmitAPI( final data = await ApiCalling.addPaymentRequestionSubmitAPI(
homeProvider.empId,
homeProvider.session,
mode,
_accountId,
["self", "admin"].contains(mode)
? _selectReqPurpose
: reqPurposeController.text,
descController.text,
amountController.text,
_paymentModeId,
bankNameController.text,
bankBranchController.text,
bankAccNumberController.text,
bankIfscController.text,
bankAcHolderController.text,
bankUpiController.text,
_image,
);
if (data != null) {
if (data['error'] == "0") {
print(data['error'] == "0");
toast(context, "Added Successfully");
resetForm();
Navigator.pop(context, true);
notifyListeners();
} else {}
}
} catch (e, s) {}
}
Future<void> addDirectPaymentRequestionViewAPI(context) async {
try {
var homeProvider = Provider.of<HomescreenNotifier>(
context,
listen: false,
);
final data = await ApiCalling.addDirectPaymentRequestionViewAPI(
homeProvider.empId,
homeProvider.session,
);
if (data != null) {
if (data.error == "0") {
_directPaymentAccounts = data.paymentAccounts!;
_directPaymentModes = data.paymentModes!;
_directAccounts = data.accounts!;
if (_selectedDirectAccounts != null &&
!_directAccounts.contains(_selectedDirectAccounts)) {
_selectedDirectAccounts = null;
_directAccountID = "";
_directAccountValue = "";
}
if (_selectDirectPaymentModes != null &&
!_directPaymentModes.contains(_selectDirectPaymentModes)) {
_selectDirectPaymentModes = null;
_directPaymentModesID = "";
_directPaymentModesValues = "";
}
if (_selectDirectPaymentAccounts != null &&
!_directPaymentAccounts.contains(_selectDirectPaymentAccounts)) {
_selectDirectPaymentAccounts = null;
_directPaymentAccountsID = "";
_directPaymentAccountsValue = "";
}
notifyListeners();
} else {}
}
} catch (e, s) {}
}
Future<void> addDirectPaymentRequestionSubmitAPI(context,payment_date) async {
try {
// _submitClicked = true;
if (!validateDirectForm(context)) {
// _submitClicked = false;
return;
}
var homeProvider = Provider.of<HomescreenNotifier>(
context,
listen: false,
);
final data = await ApiCalling.addDirectPaymentRequestionSubmitAPI(
homeProvider.empId, homeProvider.empId,
homeProvider.session, homeProvider.session,
mode, _directAccountID,
_accountId, _directPaymentAccountsID,
["self","admin"].contains(mode) ?_selectReqPurpose:reqPurposeController.text,
descController.text, descController.text,
_directPaymentModesID,
amountController.text, amountController.text,
_paymentModeId, payment_date,
paymentReferenceController.text,
bankNameController.text, bankNameController.text,
bankBranchController.text, bankBranchController.text,
bankAccNumberController.text, bankAccNumberController.text,
bankIfscController.text, bankIfscController.text,
bankAcHolderController.text, bankAcHolderController.text,
bankUpiController.text, bankUpiController.text,
_image _image);
);
if (data != null) { if (data != null) {
if (data['error'] == "0") { if (data['error'] == "0") {
print(data['error']=="0"); print(data['error'] == "0");
toast(context, "Added Successfully"); toast(context, "Added Successfully");
resetForm(); resetForm();
Navigator.pop(context,true); Navigator.pop(context, true);
notifyListeners(); notifyListeners();
} else {} } else {}
} }
...@@ -280,7 +472,68 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -280,7 +472,68 @@ class Requestionlistprovider extends ChangeNotifier {
} }
} catch (e, s) {} } catch (e, s) {}
} }
void showDatePickerDialog(BuildContext context) {
showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) => Container(
height: 216,
padding: const EdgeInsets.only(top: 6.0),
margin: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
color: CupertinoColors.systemBackground.resolveFrom(context),
child: SafeArea(
top: false,
child: Column(
children: [
Expanded(
flex: 1,
child: SizedBox(
height: 40,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
CupertinoButton(
child: Text(
'Cancel',
style: TextStyle(fontFamily: "JakartaMedium"),
),
onPressed: () {
Navigator.pop(context);
},
),
CupertinoButton(
child: Text(
'Done',
style: TextStyle(fontFamily: "JakartaMedium"),
),
onPressed: () {
Navigator.pop(context);
},
),
],
),
),
),
Expanded(
flex: 3,
child: CupertinoDatePicker(
minimumDate:_date ?? DateTime.now(),
initialDateTime: _date ?? DateTime.now(),
mode: CupertinoDatePickerMode.date,
use24hFormat: true,
showDayOfWeek: true,
onDateTimeChanged: (DateTime newDate) {
setDate(newDate);
},
),
),
],
),
),
),
);
}
List<List<String>> prepareExportData() { List<List<String>> prepareExportData() {
final headers = [ final headers = [
'ID', 'ID',
...@@ -294,26 +547,33 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -294,26 +547,33 @@ class Requestionlistprovider extends ChangeNotifier {
'Date', 'Date',
]; ];
final rows = requisitionList.map((item) => [ final rows =
item.id ?? '', requisitionList
item.accountName ?? '', .map(
item.branch ?? '', (item) =>
item.requestingPurpose ?? '', [
item.description ?? '', item.id ?? '',
item.amount ?? '', item.accountName ?? '',
item.requestMode ?? '', item.branch ?? '',
item.status ?? '', item.requestingPurpose ?? '',
item.date ?? '', item.description ?? '',
]).toList(); item.amount ?? '',
item.requestMode ?? '',
item.status ?? '',
item.date ?? '',
],
)
.toList();
return [headers, ...rows]; return [headers, ...rows];
} }
void copyToClipboard(BuildContext context) async { void copyToClipboard(BuildContext context) async {
try { try {
if (requisitionList.isEmpty) { if (requisitionList.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(
SnackBar(content: Text("No data to copy")), context,
); ).showSnackBar(SnackBar(content: Text("No data to copy")));
return; return;
} }
final data = prepareExportData(); final data = prepareExportData();
...@@ -331,8 +591,12 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -331,8 +591,12 @@ class Requestionlistprovider extends ChangeNotifier {
try { try {
if (Platform.isAndroid) { if (Platform.isAndroid) {
// Request storage permission for Android // Request storage permission for Android
if (await Permission.storage.request().isGranted || if (await Permission.storage
await Permission.manageExternalStorage.request().isGranted) { .request()
.isGranted ||
await Permission.manageExternalStorage
.request()
.isGranted) {
final dir = await getApplicationDocumentsDirectory(); final dir = await getApplicationDocumentsDirectory();
if (dir != null) { if (dir != null) {
print('Using Downloads directory: ${dir.path}'); print('Using Downloads directory: ${dir.path}');
...@@ -368,9 +632,9 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -368,9 +632,9 @@ class Requestionlistprovider extends ChangeNotifier {
Future<void> downloadCSV(BuildContext context) async { Future<void> downloadCSV(BuildContext context) async {
try { try {
if (requisitionList.isEmpty) { if (requisitionList.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(
SnackBar(content: Text("No data to export")), context,
); ).showSnackBar(SnackBar(content: Text("No data to export")));
return; return;
} }
final data = prepareExportData(); final data = prepareExportData();
...@@ -386,7 +650,6 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -386,7 +650,6 @@ class Requestionlistprovider extends ChangeNotifier {
toast(context, "CSV Downloaded"); toast(context, "CSV Downloaded");
} catch (e) { } catch (e) {
print('Error downloading CSV: $e'); print('Error downloading CSV: $e');
} }
} }
...@@ -412,10 +675,9 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -412,10 +675,9 @@ class Requestionlistprovider extends ChangeNotifier {
print('File exists: $exists'); print('File exists: $exists');
// await OpenFile.open(file.path); // Open the file // await OpenFile.open(file.path); // Open the file
// await Share.share([file.path], text: 'Requisition Data XLSX'); // Share the file // await Share.share([file.path], text: 'Requisition Data XLSX'); // Share the file
toast(context, ("XLSX Downloaded and opened")); toast(context, ("XLSX Downloaded and opened"));
} catch (e) { } catch (e) {
print('Error downloading XLSX: $e'); print('Error downloading XLSX: $e');
} }
} }
...@@ -428,9 +690,7 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -428,9 +690,7 @@ class Requestionlistprovider extends ChangeNotifier {
final data = prepareExportData(); final data = prepareExportData();
final pdf = pw.Document(); final pdf = pw.Document();
pdf.addPage( pdf.addPage(
pw.Page( pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
build: (context) => pw.Table.fromTextArray(data: data),
),
); );
final dirPath = await getSaveDirectory(); final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.pdf'); final file = File('$dirPath/requisition_data.pdf');
...@@ -441,7 +701,6 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -441,7 +701,6 @@ class Requestionlistprovider extends ChangeNotifier {
// await OpenFile.open(file.path); // Open the file // await OpenFile.open(file.path); // Open the file
// await Share.shareXFiles([file.path], text: 'Requisition Data PDF'); // Share the file // await Share.shareXFiles([file.path], text: 'Requisition Data PDF'); // Share the file
toast(context, "PDF Downloaded "); toast(context, "PDF Downloaded ");
} catch (e) { } catch (e) {
print('Error downloading PDF: $e'); print('Error downloading PDF: $e');
} }
...@@ -456,9 +715,7 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -456,9 +715,7 @@ class Requestionlistprovider extends ChangeNotifier {
final data = prepareExportData(); final data = prepareExportData();
final pdf = pw.Document(); final pdf = pw.Document();
pdf.addPage( pdf.addPage(
pw.Page( pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
build: (context) => pw.Table.fromTextArray(data: data),
),
); );
await Printing.layoutPdf( await Printing.layoutPdf(
onLayout: (PdfPageFormat format) async => pdf.save(), onLayout: (PdfPageFormat format) async => pdf.save(),
...@@ -568,7 +825,6 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -568,7 +825,6 @@ class Requestionlistprovider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
bool validateForm(BuildContext context, String mode) { bool validateForm(BuildContext context, String mode) {
// Reset all errors // Reset all errors
selectAccountError = null; selectAccountError = null;
...@@ -597,18 +853,24 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -597,18 +853,24 @@ class Requestionlistprovider extends ChangeNotifier {
isValid = false; isValid = false;
} }
} else { } else {
if (reqPurposeController.text.trim().isEmpty) { if (reqPurposeController.text
.trim()
.isEmpty) {
reqPurposeError = "Please enter a requisition purpose"; reqPurposeError = "Please enter a requisition purpose";
isValid = false; isValid = false;
} }
} }
if (descController.text.trim().isEmpty) { if (descController.text
.trim()
.isEmpty) {
descriptionError = "Please enter a description"; descriptionError = "Please enter a description";
isValid = false; isValid = false;
} }
if (amountController.text.trim().isEmpty) { if (amountController.text
.trim()
.isEmpty) {
amountError = "Please enter an amount"; amountError = "Please enter an amount";
isValid = false; isValid = false;
} }
...@@ -619,30 +881,42 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -619,30 +881,42 @@ class Requestionlistprovider extends ChangeNotifier {
} }
if (["Cheque", "RTGS", "IMPS", "NEFT"].contains(_paymentModeValue)) { if (["Cheque", "RTGS", "IMPS", "NEFT"].contains(_paymentModeValue)) {
if (bankNameController.text.trim().isEmpty) { if (bankNameController.text
.trim()
.isEmpty) {
bankNameError = "Please enter bank name"; bankNameError = "Please enter bank name";
isValid = false; isValid = false;
} }
if (bankBranchController.text.trim().isEmpty) { if (bankBranchController.text
.trim()
.isEmpty) {
bankBranchError = "Please enter bank branch"; bankBranchError = "Please enter bank branch";
isValid = false; isValid = false;
} }
if (bankAccNumberController.text.trim().isEmpty) { if (bankAccNumberController.text
.trim()
.isEmpty) {
bankNumberError = "Please enter account number"; bankNumberError = "Please enter account number";
isValid = false; isValid = false;
} }
if (bankIfscController.text.trim().isEmpty) { if (bankIfscController.text
.trim()
.isEmpty) {
bankIFSCError = "Please enter IFSC code"; bankIFSCError = "Please enter IFSC code";
isValid = false; isValid = false;
} }
if (bankAcHolderController.text.trim().isEmpty) { if (bankAcHolderController.text
.trim()
.isEmpty) {
bankHolderError = "Please enter account holder name"; bankHolderError = "Please enter account holder name";
isValid = false; isValid = false;
} }
} }
if (_paymentModeValue == "UPI") { if (_paymentModeValue == "UPI") {
if (bankUpiController.text.trim().isEmpty) { if (bankUpiController.text
.trim()
.isEmpty) {
UPIError = "Please enter UPI ID"; UPIError = "Please enter UPI ID";
isValid = false; isValid = false;
} }
...@@ -657,6 +931,15 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -657,6 +931,15 @@ class Requestionlistprovider extends ChangeNotifier {
return isValid; return isValid;
} }
bool validateDirectForm(BuildContext context) {
bool isValid = true;
notifyListeners();
return isValid;
}
void updateReqPupose(String value) { void updateReqPupose(String value) {
reqPurposeError = null; reqPurposeError = null;
notifyListeners(); notifyListeners();
...@@ -666,33 +949,39 @@ class Requestionlistprovider extends ChangeNotifier { ...@@ -666,33 +949,39 @@ class Requestionlistprovider extends ChangeNotifier {
descriptionError = null; descriptionError = null;
notifyListeners(); notifyListeners();
} }
void updateAmount(String value) { void updateAmount(String value) {
amountError = null; amountError = null;
notifyListeners(); notifyListeners();
} }
void updateBankName(String value) { void updateBankName(String value) {
bankNameError = null; bankNameError = null;
notifyListeners(); notifyListeners();
} }
void updateBankBranch(String value) { void updateBankBranch(String value) {
bankBranchError = null; bankBranchError = null;
notifyListeners(); notifyListeners();
} }
void updateNumber(String value) { void updateNumber(String value) {
bankNumberError = null; bankNumberError = null;
notifyListeners(); notifyListeners();
} }
void updateIFSC(String value) { void updateIFSC(String value) {
bankIFSCError = null; bankIFSCError = null;
notifyListeners(); notifyListeners();
} }
void updateHolder(String value) { void updateHolder(String value) {
bankHolderError = null; bankHolderError = null;
notifyListeners(); notifyListeners();
} }
void updateUPI(String value) { void updateUPI(String value) {
UPIError = null; UPIError = null;
notifyListeners(); notifyListeners();
} }
} }
import 'package:flutter/foundation.dart';
import 'dart:io';
import 'package:csv/csv.dart';
import 'package:excel/excel.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/services/api_calling.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:permission_handler/permission_handler.dart';
import 'package:printing/printing.dart';
import 'package:provider/provider.dart';
import '../../Models/financeModels/paymentRequisitionPaymentsReceiptsDetailsResponse.dart';
import '../../Models/financeModels/paymentRequisitionPaymentsReceiptsListResponse.dart';
import '../../Utils/commonServices.dart';
class Paymentreceiptsprovider extends ChangeNotifier{
List<ReceiptsList> _receiptsList = [];
ReceiptDetails _receiptDetails = ReceiptDetails();
List<String> _headings = [];
List<String> _subHeadings = [];
List<ReceiptsList> get receiptsList => _receiptsList;
ReceiptDetails get receiptDetails => _receiptDetails;
List<String> get Headings => _headings;
List<String> get subHeadings => _subHeadings;
Future<void> paymentsListAPI(context) async {
try{
var prov = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.paymentRequisitionPaymentReceiptListAPI(prov.empId, prov.session);
if(data!=null){
if(data.error=="0"){
_receiptsList = data.receiptsList!;
notifyListeners();
}
}
}catch(e,s){
}
}
Future<void> paymentsListDetailsAPI(context,paymentId) async {
try{
var prov = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.paymentRequisitionPaymentReceiptDetailsAPI(prov.empId, prov.session,paymentId);
if(data!=null){
if(data.error=="0"){
_receiptDetails = data.receiptDetails!;
_headings = [
"Payment Mode",
"Created Employee",
"Attachment",
"Receipt Date",
"Note",
"Bank Name",
"Bank Branch Name",
"Bank IFSC Code",
"Bank Holder Name",
"Bank Account Number",
"Bank UPI ID",
"Payment Reference Number",
"Created Date Time",
"Updated Date Time"
];
_subHeadings = [
_receiptDetails.requestMode??"-",
_receiptDetails.createdEmployee??"-",
_receiptDetails.attachmentDirFilePath??"-",
_receiptDetails.receiptDate??"-",
_receiptDetails.description??"-",
_receiptDetails.bankName??"-",
_receiptDetails.bankBranchName??"-",
_receiptDetails.bankIfscCode??"-",
_receiptDetails.bankAccountHolderName??"-",
_receiptDetails.bankAccountNumber??"-",
_receiptDetails.bankUpiId??"-",
_receiptDetails.paymentReferenceNumber??"-",
_receiptDetails.createdDatetime??"-",
_receiptDetails.updatedDatetime??"-"
];
notifyListeners();
}
}
}catch(e,s){
}
}
List<List<String>> prepareExportData() {
final headers = [
'ID',
'Payment Account',
'Amount',
'Branch',
'Account Number',
'Description',
'Mode',
'Payment Reference Number',
'Created Employee',
'Date',
];
final rows =
receiptsList
.map(
(item) =>
[
item.id ?? '',
item.payAccount ?? '',
item.amount ?? '',
item.bankName??"",
item.bankBranchName ?? '',
item.bankAccountNumber ?? '',
item.description ?? '',
item.requestMode ?? '',
item.paymentReferenceNumber ?? '',
item.createdEmployee ?? '',
item.createdDatetime ?? '',
],
)
.toList();
return [headers, ...rows];
}
void copyToClipboard(BuildContext context) async {
try {
if (receiptsList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("No data to copy")));
return;
}
final data = prepareExportData();
String raw = data.map((row) => row.join('\t')).join('\n');
print('Clipboard data: $raw');
await Clipboard.setData(ClipboardData(text: raw));
toast(context, "Copied to Clipboard");
} catch (e) {
print('Error copying to clipboard: $e');
}
}
Future<String> getSaveDirectory() async {
// Try Downloads directory first
try {
if (Platform.isAndroid) {
// Request storage permission for Android
if (await Permission.storage
.request()
.isGranted ||
await Permission.manageExternalStorage
.request()
.isGranted) {
final dir = await getApplicationDocumentsDirectory();
if (dir != null) {
print('Using Downloads directory: ${dir.path}');
return dir.path;
}
}
}
} catch (e) {
print('Error accessing Downloads directory: $e');
}
// Fallback to shared Documents directory
try {
final dir = await getDownloadsDirectory();
if (dir != null) {
final customDir = Directory('${dir.path}/RequisitionData');
if (!await customDir.exists()) {
await customDir.create(recursive: true);
}
print('Using custom Documents directory: ${customDir.path}');
return customDir.path;
}
} catch (e) {
print('Error accessing Documents directory: $e');
}
// Final fallback to app's Documents directory
final dir = await getApplicationDocumentsDirectory();
print('Using app Documents directory: ${dir.path}');
return dir.path;
}
Future<void> downloadCSV(BuildContext context) async {
try {
if (receiptsList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("No data to export")));
return;
}
final data = prepareExportData();
final csvData = const ListToCsvConverter().convert(data);
final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.csv');
await file.writeAsString(csvData);
print('CSV saved at: ${file.path}');
bool exists = await file.exists();
print('File exists: $exists');
// await OpenFile.open(file.path); // Open the file
// await Share.share(file.path); // Share the file
toast(context, "CSV Downloaded");
} catch (e) {
print('Error downloading CSV: $e');
}
}
Future<void> downloadXLS(BuildContext context) async {
try {
if (receiptsList.isEmpty) {
toast(context, "No Data to export");
return;
}
final data = prepareExportData();
var excel = Excel.createExcel();
Sheet sheet = excel['Sheet1'];
for (var row in data) {
sheet.appendRow(row.map((cell) => TextCellValue(cell)).toList());
}
final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.xlsx');
final bytes = excel.encode();
if (bytes == null) throw Exception("Excel encoding failed");
await file.writeAsBytes(bytes);
print('XLSX saved at: ${file.path}');
bool exists = await file.exists();
print('File exists: $exists');
// await OpenFile.open(file.path); // Open the file
// await Share.share([file.path], text: 'Requisition Data XLSX'); // Share the file
toast(context, ("XLSX Downloaded and opened"));
} catch (e) {
print('Error downloading XLSX: $e');
}
}
Future<void> downloadPDF(BuildContext context) async {
try {
if (receiptsList.isEmpty) {
toast(context, "No Data to export");
return;
}
final data = prepareExportData();
final pdf = pw.Document();
pdf.addPage(
pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
);
final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.pdf');
await file.writeAsBytes(await pdf.save());
print('PDF saved at: ${file.path}');
bool exists = await file.exists();
print('File exists: $exists');
// await OpenFile.open(file.path); // Open the file
// await Share.shareXFiles([file.path], text: 'Requisition Data PDF'); // Share the file
toast(context, "PDF Downloaded ");
} catch (e) {
print('Error downloading PDF: $e');
}
}
Future<void> printData(BuildContext context) async {
try {
if (receiptsList.isEmpty) {
toast(context, "No Data to Print");
return;
}
final data = prepareExportData();
final pdf = pw.Document();
pdf.addPage(
pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
);
await Printing.layoutPdf(
onLayout: (PdfPageFormat format) async => pdf.save(),
);
} catch (e) {
print('Error printing data: $e');
}
}
}
\ No newline at end of file
import 'dart:io';
import 'package:csv/csv.dart';
import 'package:excel/excel.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:generp/Models/financeModels/paymentRequisitionPaymentsDetailsResponse.dart';
import 'package:generp/Models/financeModels/paymentRequisitionPaymentsListResponse.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/services/api_calling.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:permission_handler/permission_handler.dart';
import 'package:printing/printing.dart';
import 'package:provider/provider.dart';
import '../../Utils/commonServices.dart';
class Paymentrequisitionpaymentslistprovider extends ChangeNotifier{
List<PaymentsList> _paymentsList = [];
PaymentDetails _paymentDetails = PaymentDetails();
List<String> _headings = [];
List<String> _subHeadings = [];
List<PaymentsList> get paymentsList => _paymentsList;
PaymentDetails get paymentDetails => _paymentDetails;
List<String> get Headings => _headings;
List<String> get subHeadings => _subHeadings;
Future<void> paymentsListAPI(context) async {
try{
var prov = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.paymentRequisitionPaymentListAPI(prov.empId, prov.session);
if(data!=null){
if(data.error=="0"){
_paymentsList = data.paymentsList!;
notifyListeners();
}
}
}catch(e,s){
}
}
Future<void> paymentsListDetailsAPI(context,paymentId) async {
try{
var prov = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.paymentRequisitionPaymentDetailsAPI(prov.empId, prov.session,paymentId);
if(data!=null){
if(data.error=="0"){
_paymentDetails = data.paymentDetails!;
_headings = [
"From Account",
"Payment Mode",
"Created Employee",
"Attachment",
"Payment Date",
"Note",
"Bank Name",
"Bank Branch Name",
"Bank IFSC Code",
"Bank Holder Name",
"Bank Account Number",
"Bank UPI ID",
"Payment Reference Number",
"Created Date Time",
"Updated Date Time"
];
_subHeadings = [
_paymentDetails.paymentAccountName??"-",
_paymentDetails.mode??"-",
_paymentDetails.paymentEmployeeName??"-",
_paymentDetails.attachmentDirFilePath??"-",
_paymentDetails.paymentDate??"-",
_paymentDetails.paymentRemarks??"-",
_paymentDetails.bankName??"-",
_paymentDetails.bankBranchName??"-",
_paymentDetails.bankIfscCode??"-",
_paymentDetails.bankAccountHolderName??"-",
_paymentDetails.bankAccountNumber??"-",
_paymentDetails.bankUpiId??"-",
_paymentDetails.paymentReferenceNumber??"-",
_paymentDetails.createdDatetime??"-",
_paymentDetails.updatedDatetime??"-"
];
notifyListeners();
}
}
}catch(e,s){
}
}
List<List<String>> prepareExportData() {
final headers = [
'ID',
'Payment Account',
'Amount',
'Branch',
'Account Number',
'Description',
'Mode',
'Payment Reference Number',
'Created Employee',
'Date',
];
final rows =
paymentsList
.map(
(item) =>
[
item.id ?? '',
item.payAccount ?? '',
item.amount ?? '',
item.bankName??"",
item.bankBranchName ?? '',
item.bankAccountNumber ?? '',
item.description ?? '',
item.requestMode ?? '',
item.paymentReferenceNumber ?? '',
item.createdEmployee ?? '',
item.createdDatetime ?? '',
],
)
.toList();
return [headers, ...rows];
}
void copyToClipboard(BuildContext context) async {
try {
if (paymentsList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("No data to copy")));
return;
}
final data = prepareExportData();
String raw = data.map((row) => row.join('\t')).join('\n');
print('Clipboard data: $raw');
await Clipboard.setData(ClipboardData(text: raw));
toast(context, "Copied to Clipboard");
} catch (e) {
print('Error copying to clipboard: $e');
}
}
Future<String> getSaveDirectory() async {
// Try Downloads directory first
try {
if (Platform.isAndroid) {
// Request storage permission for Android
if (await Permission.storage
.request()
.isGranted ||
await Permission.manageExternalStorage
.request()
.isGranted) {
final dir = await getApplicationDocumentsDirectory();
if (dir != null) {
print('Using Downloads directory: ${dir.path}');
return dir.path;
}
}
}
} catch (e) {
print('Error accessing Downloads directory: $e');
}
// Fallback to shared Documents directory
try {
final dir = await getDownloadsDirectory();
if (dir != null) {
final customDir = Directory('${dir.path}/RequisitionData');
if (!await customDir.exists()) {
await customDir.create(recursive: true);
}
print('Using custom Documents directory: ${customDir.path}');
return customDir.path;
}
} catch (e) {
print('Error accessing Documents directory: $e');
}
// Final fallback to app's Documents directory
final dir = await getApplicationDocumentsDirectory();
print('Using app Documents directory: ${dir.path}');
return dir.path;
}
Future<void> downloadCSV(BuildContext context) async {
try {
if (paymentsList.isEmpty) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("No data to export")));
return;
}
final data = prepareExportData();
final csvData = const ListToCsvConverter().convert(data);
final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.csv');
await file.writeAsString(csvData);
print('CSV saved at: ${file.path}');
bool exists = await file.exists();
print('File exists: $exists');
// await OpenFile.open(file.path); // Open the file
// await Share.share(file.path); // Share the file
toast(context, "CSV Downloaded");
} catch (e) {
print('Error downloading CSV: $e');
}
}
Future<void> downloadXLS(BuildContext context) async {
try {
if (paymentsList.isEmpty) {
toast(context, "No Data to export");
return;
}
final data = prepareExportData();
var excel = Excel.createExcel();
Sheet sheet = excel['Sheet1'];
for (var row in data) {
sheet.appendRow(row.map((cell) => TextCellValue(cell)).toList());
}
final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.xlsx');
final bytes = excel.encode();
if (bytes == null) throw Exception("Excel encoding failed");
await file.writeAsBytes(bytes);
print('XLSX saved at: ${file.path}');
bool exists = await file.exists();
print('File exists: $exists');
// await OpenFile.open(file.path); // Open the file
// await Share.share([file.path], text: 'Requisition Data XLSX'); // Share the file
toast(context, ("XLSX Downloaded and opened"));
} catch (e) {
print('Error downloading XLSX: $e');
}
}
Future<void> downloadPDF(BuildContext context) async {
try {
if (paymentsList.isEmpty) {
toast(context, "No Data to export");
return;
}
final data = prepareExportData();
final pdf = pw.Document();
pdf.addPage(
pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
);
final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.pdf');
await file.writeAsBytes(await pdf.save());
print('PDF saved at: ${file.path}');
bool exists = await file.exists();
print('File exists: $exists');
// await OpenFile.open(file.path); // Open the file
// await Share.shareXFiles([file.path], text: 'Requisition Data PDF'); // Share the file
toast(context, "PDF Downloaded ");
} catch (e) {
print('Error downloading PDF: $e');
}
}
Future<void> printData(BuildContext context) async {
try {
if (paymentsList.isEmpty) {
toast(context, "No Data to Print");
return;
}
final data = prepareExportData();
final pdf = pw.Document();
pdf.addPage(
pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
);
await Printing.layoutPdf(
onLayout: (PdfPageFormat format) async => pdf.save(),
);
} catch (e) {
print('Error printing data: $e');
}
}
}
\ No newline at end of file
...@@ -51,15 +51,20 @@ PreferredSizeWidget appbar2(BuildContext context, title,widget) { ...@@ -51,15 +51,20 @@ PreferredSizeWidget appbar2(BuildContext context, title,widget) {
onTap: () => Navigator.pop(context, true), onTap: () => Navigator.pop(context, true),
child: SvgPicture.asset("assets/svg/app_bar_back.svg", height: 25), child: SvgPicture.asset("assets/svg/app_bar_back.svg", height: 25),
), ),
InkResponse( Expanded(
onTap: () => Navigator.pop(context, true), flex:4,
child: Text( child: InkResponse(
title, onTap: () => Navigator.pop(context, true),
style: TextStyle( child: Text(
fontSize: 16, title,
height: 1.1, overflow: TextOverflow.ellipsis,
fontFamily: "JakartaSemiBold", maxLines: 1,
color: AppColors.semi_black, style: TextStyle(
fontSize: 16,
height: 1.1,
fontFamily: "JakartaSemiBold",
color: AppColors.semi_black,
),
), ),
), ),
), ),
......
...@@ -25,6 +25,8 @@ import 'package:generp/Notifiers/UpdatePasswordProvider.dart'; ...@@ -25,6 +25,8 @@ import 'package:generp/Notifiers/UpdatePasswordProvider.dart';
import 'package:generp/Notifiers/VisitDetailsProvider.dart'; import 'package:generp/Notifiers/VisitDetailsProvider.dart';
import 'package:generp/Notifiers/financeProvider/DashboardProvider.dart'; import 'package:generp/Notifiers/financeProvider/DashboardProvider.dart';
import 'package:generp/Notifiers/financeProvider/RequestionListProvider.dart'; import 'package:generp/Notifiers/financeProvider/RequestionListProvider.dart';
import 'package:generp/Notifiers/financeProvider/paymentReceiptsProvider.dart';
import 'package:generp/Notifiers/financeProvider/paymentRequisitionPaymentsListProvider.dart';
import 'package:generp/Notifiers/loginNotifier.dart'; import 'package:generp/Notifiers/loginNotifier.dart';
import 'package:generp/Notifiers/scanLoginProvider.dart'; import 'package:generp/Notifiers/scanLoginProvider.dart';
import 'package:generp/Notifiers/splashVersionNotifier.dart'; import 'package:generp/Notifiers/splashVersionNotifier.dart';
...@@ -212,6 +214,8 @@ class MyApp extends StatelessWidget { ...@@ -212,6 +214,8 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => Dashboardprovider(),), ChangeNotifierProvider(create: (_) => Dashboardprovider(),),
ChangeNotifierProvider(create: (_) => Requestionlistprovider(),), ChangeNotifierProvider(create: (_) => Requestionlistprovider(),),
ChangeNotifierProvider(create: (_) => Requesitionlidtdetailsprovider(),), ChangeNotifierProvider(create: (_) => Requesitionlidtdetailsprovider(),),
ChangeNotifierProvider(create: (_) => Paymentrequisitionpaymentslistprovider(),),
ChangeNotifierProvider(create: (_) => Paymentreceiptsprovider(),),
], ],
child: Builder( child: Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
......
...@@ -5,6 +5,8 @@ import 'package:generp/Utils/app_colors.dart'; ...@@ -5,6 +5,8 @@ import 'package:generp/Utils/app_colors.dart';
import 'package:generp/Utils/commonWidgets.dart'; import 'package:generp/Utils/commonWidgets.dart';
import 'package:generp/screens/finance/AllPaymentRequesitionListsByModes.dart'; import 'package:generp/screens/finance/AllPaymentRequesitionListsByModes.dart';
import 'package:generp/screens/finance/directPaymentRequesitionList.dart'; import 'package:generp/screens/finance/directPaymentRequesitionList.dart';
import 'package:generp/screens/finance/paymentListPaymentRequisition.dart';
import 'package:generp/screens/finance/paymentreceiptList.dart';
import 'package:generp/screens/finance/submitPaymentRequestionListsByMode.dart'; import 'package:generp/screens/finance/submitPaymentRequestionListsByMode.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
...@@ -65,10 +67,38 @@ class _FinancedashboardState extends State<Financedashboard> { ...@@ -65,10 +67,38 @@ class _FinancedashboardState extends State<Financedashboard> {
} }
return InkResponse( return InkResponse(
onTap: () async { onTap: () async {
await Navigator.push(context, MaterialPageRoute( var navigate;
builder: (context) => if (provider.accessiblePagesList[index].pageName ==
Allpaymentrequesitionlistsbymodes(mode: provider.accessiblePagesList[index].mode!, "Payments List") {
pageTitleName: provider.accessiblePagesList[index].pageName!),)); navigate = Paymentlistpaymentrequisition(
pageTitleName:
provider
.accessiblePagesList[index]
.pageName!,
);
} else if (provider
.accessiblePagesList[index]
.pageName ==
"Payment Receipts List") {
navigate = Paymentreceiptlist(
pageTitleName:
provider
.accessiblePagesList[index]
.pageName!,
);
} else {
navigate = Allpaymentrequesitionlistsbymodes(
mode: provider.accessiblePagesList[index].mode!,
pageTitleName:
provider
.accessiblePagesList[index]
.pageName!,
);
}
await Navigator.push(
context,
MaterialPageRoute(builder: (context) => navigate),
);
}, },
child: Container( child: Container(
margin: EdgeInsets.symmetric( margin: EdgeInsets.symmetric(
...@@ -89,8 +119,7 @@ class _FinancedashboardState extends State<Financedashboard> { ...@@ -89,8 +119,7 @@ class _FinancedashboardState extends State<Financedashboard> {
Expanded( Expanded(
flex: 5, flex: 5,
child: Text( child: Text(
"${provider.accessiblePagesList[index] "${provider.accessiblePagesList[index].pageName}",
.pageName}",
), ),
), ),
Expanded( Expanded(
...@@ -110,7 +139,7 @@ class _FinancedashboardState extends State<Financedashboard> { ...@@ -110,7 +139,7 @@ class _FinancedashboardState extends State<Financedashboard> {
), ),
), ),
floatingActionButtonLocation: floatingActionButtonLocation:
FloatingActionButtonLocation.centerFloat, FloatingActionButtonLocation.centerFloat,
floatingActionButton: InkResponse( floatingActionButton: InkResponse(
onTap: () { onTap: () {
_showPaymentOptionsSheet(context); _showPaymentOptionsSheet(context);
...@@ -169,8 +198,9 @@ class _FinancedashboardState extends State<Financedashboard> { ...@@ -169,8 +198,9 @@ class _FinancedashboardState extends State<Financedashboard> {
children: [ children: [
SizedBox(height: 15), SizedBox(height: 15),
...List.generate( ...List.generate(provider.accessiblePagesList2.length, (
provider.accessiblePagesList2.length, (index) { index,
) {
print(provider.accessiblePagesList2[index].mode); print(provider.accessiblePagesList2[index].mode);
List<String> mode_lst = [ List<String> mode_lst = [
"self", "self",
...@@ -190,24 +220,36 @@ class _FinancedashboardState extends State<Financedashboard> { ...@@ -190,24 +220,36 @@ class _FinancedashboardState extends State<Financedashboard> {
onTap: () async { onTap: () async {
Navigator.pop(context); Navigator.pop(context);
var res; var res;
if (provider.accessiblePagesList2[index] if (provider
.pageName == "Add Direct Payment") { .accessiblePagesList2[index]
res = await Navigator.push(context, .pageName ==
MaterialPageRoute(builder: (context) => "Add Direct Payment") {
Directpaymentrequesitionlist(),)); res = await Navigator.push(
context,
MaterialPageRoute(
builder:
(
context,
) => Directpaymentrequesitionlist(
pageTitleName:
provider
.accessiblePagesList2[index]
.pageName!,
),
),
);
} else { } else {
res = await Navigator.push( res = await Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: builder:
(context) => (
Submitpaymentrequestionlistsbymode( context,
mode: "${provider ) => Submitpaymentrequestionlistsbymode(
.accessiblePagesList2[index] mode:
.mode}", "${provider.accessiblePagesList2[index].mode}",
pageTitleName: "${provider pageTitleName:
.accessiblePagesList2[index] "${provider.accessiblePagesList2[index].pageName}",
.pageName}",
), ),
), ),
); );
...@@ -217,8 +259,7 @@ class _FinancedashboardState extends State<Financedashboard> { ...@@ -217,8 +259,7 @@ class _FinancedashboardState extends State<Financedashboard> {
"assets/svg/fin_ic.svg", "assets/svg/fin_ic.svg",
), ),
title: Text( title: Text(
"${provider.accessiblePagesList2[index] "${provider.accessiblePagesList2[index].pageName}",
.pageName}",
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
......
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:generp/Notifiers/financeProvider/RequesitionLidtDetailsProvider.dart';
import 'package:generp/Notifiers/financeProvider/approveRejectPaymentRequestResponse.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:generp/Utils/commonWidgets.dart';
import 'package:provider/provider.dart';
import '../../Notifiers/financeProvider/paymentRequisitionPaymentsListProvider.dart';
import 'FileViewer.dart';
class Paymentdetailspaymentrequisition extends StatefulWidget {
final paymentRequestId;
final pageName;
const Paymentdetailspaymentrequisition({
super.key,
required this.paymentRequestId,
required this.pageName,
});
@override
State<Paymentdetailspaymentrequisition> createState() =>
_PaymentdetailspaymentrequisitionState();
}
class _PaymentdetailspaymentrequisitionState
extends State<Paymentdetailspaymentrequisition> {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
var provider = Provider.of<Paymentrequisitionpaymentslistprovider>(
context,
listen: false,
);
provider.paymentsListDetailsAPI(context, widget.paymentRequestId);
});
}
@override
Widget build(BuildContext context) {
return Consumer<Paymentrequisitionpaymentslistprovider>(
builder: (context, provider, child) {
var payment_det = provider.paymentDetails;
return WillPopScope(
child: Scaffold(
appBar: appbar(context, widget.pageName),
backgroundColor: AppColors.scaffold_bg_color,
body: Container(
child: SingleChildScrollView(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
margin: EdgeInsets.symmetric(vertical: 10, horizontal: 10),
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 10),
child: Column(
children: [
Row(
children: [
Expanded(
flex: 1,
child: Container(
height: 50,
width: 35,
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Color(0xFFFFF3CE),
borderRadius: BorderRadius.circular(8),
),
child: SvgPicture.asset("assets/svg/fin_ic.svg"),
),
),
SizedBox(width: 10),
Expanded(
flex: 4,
child: SizedBox(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
payment_det.accountName ?? "-",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.semi_black,
),
),
Text(
"₹${payment_det.amount}",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.app_blue,
),
),
],
),
),
),
Expanded(
flex: 2,
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5,
vertical: 10,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFE3FFE0),
),
child: Center(
child: Text(
payment_det.refType??"-",
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: Color(0xFF0D9C00),
),
),
),
),
),
],
),
Divider(thickness: 0.5, color: Color(0xFFD7D7D7)),
...List.generate(provider.subHeadings.length, (j) {
return Container(
padding: EdgeInsets.symmetric(vertical: 7),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
provider.Headings[j],
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.semi_black,
),
),
),
Expanded(
child: InkResponse(
onTap: () {
if (provider.Headings[j] == "Attachment") {
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) => Fileviewer(
fileName:
payment_det
.attachmentViewFileName!,
fileUrl:
payment_det
.attachmentDirFilePath!,
),
),
);
}
},
child: Text(
provider.Headings[j] == "Attachment"
? "View"
: "${provider.subHeadings[j]}",
style: TextStyle(
fontSize: 14,
color:
provider.Headings[j] == "Attachment"
? AppColors.app_blue
: Color(0xFF818181),
decoration:
provider.Headings[j] == "Attachment"
? TextDecoration.underline
: TextDecoration.none,
decorationColor:
provider.Headings[j] == "Attachment"
? AppColors.app_blue
: AppColors.white,
),
),
),
),
],
),
);
}),
],
),
),
),
),
),
onWillPop: () {
return onBackPressed(context);
},
);
},
);
}
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:generp/screens/finance/paymentDetailsPaymentRequisition.dart';
import 'package:provider/provider.dart';
import '../../Notifiers/financeProvider/paymentRequisitionPaymentsListProvider.dart';
import '../../Utils/app_colors.dart';
import '../../Utils/commonWidgets.dart';
import 'FileViewer.dart';
class Paymentlistpaymentrequisition extends StatefulWidget {
final String pageTitleName;
const Paymentlistpaymentrequisition({super.key, required this.pageTitleName});
@override
State<Paymentlistpaymentrequisition> createState() => _PaymentlistpaymentrequisitionState();
}
class _PaymentlistpaymentrequisitionState extends State<Paymentlistpaymentrequisition> {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
var provider = Provider.of<Paymentrequisitionpaymentslistprovider>(
context,
listen: false,
);
provider.paymentsListAPI(context);
});
}
@override
Widget build(BuildContext context) {
return Consumer<Paymentrequisitionpaymentslistprovider>(
builder: (context, provider, child) {
final requestLists = provider.paymentsList;
return WillPopScope(
onWillPop: () {
return onBackPressed(context);
},
child: Scaffold(
appBar: appbar2(
context,
widget.pageTitleName,
Row(
children: [
InkResponse(
onTap: () {
_showOptionsSheet(context);
},
child: Icon(CupertinoIcons.down_arrow),
),
],
),
),
backgroundColor: AppColors.scaffold_bg_color,
body: Container(
child: SingleChildScrollView(
child: Column(
children: [
ListView.builder(
itemCount: requestLists.length,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return Container(
padding: EdgeInsets.symmetric(
horizontal: 10,
vertical: 10,
),
margin: EdgeInsets.symmetric(
horizontal: 10,
vertical: 10,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: [
Row(
children: [
Expanded(
flex: 1,
child: Container(
height: 50,
width: 35,
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Color(0xFFFFF3CE),
borderRadius: BorderRadius.circular(8),
),
child: SvgPicture.asset(
"assets/svg/fin_ic.svg",
),
),
),
SizedBox(width: 10),
Expanded(
flex: 4,
child: SizedBox(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
requestLists[index].receipientAccount!,
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.semi_black,
),
),
Text(
"₹${requestLists[index].amount}",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.app_blue,
),
),
],
),
),
),
Expanded(
flex: 2,
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5,
vertical: 10,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFE3FFE0),
),
child: Center(
child: Text(
requestLists[index].refType!,
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: Color(0xFF0D9C00),
),
),
),
),
),
],
),
Divider(thickness: 0.5, color: Color(0xFFD7D7D7)),
...List.generate(4, (j) {
final headings = [
"Request Mode",
"Attachment",
"Payment Date",
"Note",
];
final subHeadings = [
requestLists[index].requestMode,
"View",
// requestLists[index].attachmentDirFilePath
requestLists[index].paymentDate,
requestLists[index].description,
];
return Container(
padding: EdgeInsets.symmetric(vertical: 5),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
headings[j],
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.semi_black,
),
),
),
Expanded(
child: InkResponse(
onTap:
j != 1
? null
: () {
Navigator.push(
context,
MaterialPageRoute(
builder:
(
context,
) => Fileviewer(
fileName:
requestLists[index]
.attachmentViewFileName!,
fileUrl:
requestLists[index]
.attachmentDirFilePath!,
),
),
);
},
child: Text(
subHeadings[j]!,
style: TextStyle(
fontSize: 14,
color:
j == 1
? AppColors.app_blue
: Color(0xFF818181),
decoration:
j == 1
? TextDecoration.underline
: TextDecoration.none,
decorationColor:
j == 1
? AppColors.app_blue
: AppColors.white,
),
),
),
),
],
),
);
}),
InkResponse(
onTap: () async {
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) =>
Paymentdetailspaymentrequisition(
pageName: widget.pageTitleName,
paymentRequestId:
requestLists[index].id,
),
),
);
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 5),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
"View Details",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.app_blue,
),
),
SizedBox(width: 5),
SvgPicture.asset(
"assets/svg/next_button.svg",
),
],
),
),
),
],
),
);
},
),
],
),
),
),
),
);
},
);
}
Future<void> _showOptionsSheet(BuildContext context) {
return showModalBottomSheet(
useSafeArea: true,
isDismissible: true,
isScrollControlled: true,
showDragHandle: true,
backgroundColor: Colors.white,
enableDrag: true,
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return SafeArea(
child: Consumer<Paymentrequisitionpaymentslistprovider>(
builder: (context, provider, child) {
return Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 10,
),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(height: 15),
...List.generate(5, (index) {
final assetnames = [
"se_locate_customer",
"se_locate_customer",
"se_update_complaint",
"se_payment_details",
"se_payment_details",
];
final Headingnames = [
"Copy to Clipboard",
"Download CSV",
"Download XLSX",
"Download PDF",
"Print Data",
];
return ListTile(
onTap: () {
switch (index) {
case 0:
provider.copyToClipboard(context);
break;
case 1:
provider.downloadCSV(context);
break;
case 2:
provider.downloadXLS(context);
break;
case 3:
provider.downloadPDF(context);
break;
case 4:
provider.printData(context);
break;
}
},
leading: SvgPicture.asset(
"assets/svg/${assetnames[index]}.svg",
),
title: Text(
Headingnames[index],
style: TextStyle(fontFamily: "JakartaMedium"),
),
trailing: SvgPicture.asset(
"assets/svg/arrow_right_new.svg",
),
);
}),
],
),
),
);
},
),
);
},
);
},
);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment