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 {
String? updatedDatetime;
String? proposedAccount;
String? proposedAccountId;
String? bankName;
String? bankBranchname;
String? bankIfscCode;
String? bankAccountHolderName;
String? bankAccountNumber;
String? bankUpiId;
RequestDetails(
{this.id,
this.isProcessedPaymentRequest,
this.accountId,
this.accountName,
this.branch,
this.requestingPurpose,
this.transDis,
this.description,
this.amount,
this.requestedAmount,
this.requestMode,
this.status,
this.createdEmployee,
this.level1Employee,
this.level2Employee,
this.level1ApprovalRemarks,
this.level2ApprovalRemarks,
this.attachmentViewFileName,
this.attachmentDirFilePath,
this.date,
this.createdDatetime,
this.updatedDatetime,
this.proposedAccount,
this.proposedAccountId});
RequestDetails({this.id,
this.isProcessedPaymentRequest,
this.accountId,
this.accountName,
this.branch,
this.requestingPurpose,
this.transDis,
this.description,
this.amount,
this.requestedAmount,
this.requestMode,
this.status,
this.createdEmployee,
this.level1Employee,
this.level2Employee,
this.level1ApprovalRemarks,
this.level2ApprovalRemarks,
this.attachmentViewFileName,
this.attachmentDirFilePath,
this.date,
this.createdDatetime,
this.updatedDatetime,
this.proposedAccount,
this.proposedAccountId,
this.bankName,
this.bankBranchname,
this.bankIfscCode,
this.bankAccountHolderName,
this.bankAccountNumber,
this.bankUpiId,
});
RequestDetails.fromJson(Map<String, dynamic> json) {
id = json['id'];
......@@ -109,6 +121,12 @@ class RequestDetails {
updatedDatetime = json['updated_datetime'];
proposedAccount = json['proposed_account'];
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() {
......@@ -137,6 +155,12 @@ class RequestDetails {
data['updated_datetime'] = this.updatedDatetime;
data['proposed_account'] = this.proposedAccount;
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;
}
}
......@@ -170,34 +194,33 @@ class PaymentDetails {
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({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'];
......
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/material.dart';
import 'package:generp/Models/financeModels/paymentRequisitionDetailsResponse.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Utils/commonServices.dart';
import 'package:generp/services/api_calling.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
import 'approveRejectPaymentRequestResponse.dart';
class Requesitionlidtdetailsprovider extends ChangeNotifier{
class Requesitionlidtdetailsprovider extends ChangeNotifier {
PaymentDetails _paymentDetails = PaymentDetails();
RequestDetails _requestDetails = RequestDetails();
PaymentDetails get paymentsDetails => _paymentDetails;
RequestDetails get requestsDetails => _requestDetails;
TextEditingController requestedAmount = TextEditingController();
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();
PaymentAccounts? _selectedPaymentAccounts;
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<PaymentModes> get paymentsModes => _paymentModes;
PaymentRequestDetails get paymentsReqDetails => _paymentRequestDetails;
PaymentAccounts? get selectedPaymentAccounts => _selectedPaymentAccounts;
var _selectedValue;
var _selectedID;
get selectedValue => _selectedValue;
get selectedID => _selectedID;
List<String> _headings = [
];
List<String> _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;
_selectedValue = value!.name!;
_selectedID = value!.id;
notifyListeners();
}
set selectedValue(value){
set selectedValue(value) {
_selectedValue = value;
notifyListeners();
}
set selectedID(value){
set selectedID(value) {
_selectedID = value;
notifyListeners();
}
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"){
imgFromCamera(context) async {
// Capture a photo
try {
final XFile? galleryImage = await _picker.pickImage(
source: ImageSource.camera,
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 = [
"Requested Account",
"Proposed Account Name",
......@@ -79,123 +163,195 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier{
"Created Date/Time",
"Updated Date/Time",
];
_paymentDetails = data.paymentDetails??PaymentDetails(
accountId: "",
accountName: "",
amount: "",
attachmentDirFilePath: "",
attachmentViewFileName: "",
bankAccountHolderName: "",
bankAccountNumber: "",
bankBranchName: "",
bankIfscCode: "",
bankName: "",
bankUpiId: "",
createdDatetime: "",
createdEmployeeId: "",
description: "",
id: "",
isExists: "",
mode: "",
paymentAccountId: "",
paymentAccountName: "",
paymentDate: "",
paymentEmployeeName: "",
paymentModeId: "",
paymentReferenceNumber: "",
paymentRemarks: "",
refId: "",
refType: "",
updatedDatetime: ""
);
_requestDetails = data.requestDetails??RequestDetails(
updatedDatetime: "",
id: "",
description: "",
createdDatetime: "",
attachmentViewFileName: "",
attachmentDirFilePath: "",
amount: "",
accountName: "",
accountId: "",
branch: "",
createdEmployee: "",
date: "",
isProcessedPaymentRequest: "",
level1ApprovalRemarks: "",
level1Employee: "",
level2ApprovalRemarks: "",
level2Employee: "",
proposedAccount: "",
proposedAccountId: "",
requestedAmount: "",
requestingPurpose: "",
requestMode: "",
status: "",
transDis: ""
);
_subHeadings = [
_requestDetails.accountName??"-",
_requestDetails.proposedAccount??"-",
_requestDetails.branch??"-",
_requestDetails.requestingPurpose??"-",
_requestDetails.requestMode??"-",
_requestDetails.createdEmployee??"-",
_requestDetails.attachmentViewFileName??"-",
_requestDetails.date??"-",
_requestDetails.description??"-",
_requestDetails.level1ApprovalRemarks??"-",
_requestDetails.level1Employee??"-",
_requestDetails.level2ApprovalRemarks??"-",
_requestDetails.level2Employee??"-",
_requestDetails.createdDatetime??"-",
_requestDetails.updatedDatetime??"-"
];
notifyListeners();
_paymentDetails =
data.paymentDetails ??
PaymentDetails(
accountId: "",
accountName: "",
amount: "",
attachmentDirFilePath: "",
attachmentViewFileName: "",
bankAccountHolderName: "",
bankAccountNumber: "",
bankBranchName: "",
bankIfscCode: "",
bankName: "",
bankUpiId: "",
createdDatetime: "",
createdEmployeeId: "",
description: "",
id: "",
isExists: "",
mode: "",
paymentAccountId: "",
paymentAccountName: "",
paymentDate: "",
paymentEmployeeName: "",
paymentModeId: "",
paymentReferenceNumber: "",
paymentRemarks: "",
refId: "",
refType: "",
updatedDatetime: "",
);
_requestDetails =
data.requestDetails ??
RequestDetails(
updatedDatetime: "",
id: "",
description: "",
createdDatetime: "",
attachmentViewFileName: "",
attachmentDirFilePath: "",
amount: "",
accountName: "",
accountId: "",
branch: "",
createdEmployee: "",
date: "",
isProcessedPaymentRequest: "",
level1ApprovalRemarks: "",
level1Employee: "",
level2ApprovalRemarks: "",
level2Employee: "",
proposedAccount: "",
proposedAccountId: "",
requestedAmount: "",
requestingPurpose: "",
requestMode: "",
status: "",
transDis: "",
);
print("here 2121");
preValues();
notifyListeners();
}
}
}catch (e,s){}
} catch (e, s) {}
}
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"){
preValues(){
print("here 212ssass1");
requestedAmount.text = _requestDetails.requestedAmount??"-";
proposedPaymentAccount.text = _requestDetails.proposedAccount??"-";
accountName.text = _requestDetails.accountName??"-";
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!;
_paymentAccounts = data.paymentAccounts!;
_paymentRequestDetails= data.paymentRequestDetails!;
notifyListeners();
_paymentRequestDetails = data.paymentRequestDetails!;
notifyListeners();
}
}
}catch (e,s){}
} catch (e, s) {}
}
Future<void> paymentrequisitionRejectSubmitAPIFunction(context, mode, payment_request_id, approve_remarks) 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);
}catch (e,s){
}
Future<void> paymentrequisitionRejectSubmitAPIFunction(
context,
mode,
payment_request_id,
approve_remarks,
) 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 {
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);
}catch (e,s){
}
Future<void> paymentrequisitionApproveSubmitAPIFunction(
context,
mode,
payment_request_id,
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';
import 'package:flutter/material.dart';
import 'package:flutter/services.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/Utils/commonServices.dart';
import 'package:generp/services/api_calling.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:share_plus/share_plus.dart';
......@@ -24,8 +26,6 @@ import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart';
class Requestionlistprovider extends ChangeNotifier {
TextEditingController reqPurposeController = TextEditingController();
TextEditingController descController = TextEditingController();
TextEditingController amountController = TextEditingController();
......@@ -35,11 +35,116 @@ class Requestionlistprovider extends ChangeNotifier {
TextEditingController bankIfscController = TextEditingController();
TextEditingController bankAcHolderController = TextEditingController();
TextEditingController bankUpiController = TextEditingController();
TextEditingController paymentReferenceController = TextEditingController();
// Date picker state
DateTime? _date;
String? _formattedDate;
List<Accounts> _accounts = [];
List<PaymentModes> _paymentModes = [];
List<String> _requestingPurposes = [];
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;
PaymentModes? _selectedPayment;
String? _selectReqPurpose;
......@@ -96,6 +201,7 @@ class Requestionlistprovider extends ChangeNotifier {
List<String> get requestingPurposes => _requestingPurposes;
List<RequistionList> get requisitionList => _requisitionList;
String? get formattedDate => _formattedDate;
// bool get submitClicked => _submitClicked;
// set submitClicked(bool value){
......@@ -232,29 +338,115 @@ class Requestionlistprovider extends ChangeNotifier {
listen: false,
);
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.session,
mode,
_accountId,
["self","admin"].contains(mode) ?_selectReqPurpose:reqPurposeController.text,
_directAccountID,
_directPaymentAccountsID,
descController.text,
_directPaymentModesID,
amountController.text,
_paymentModeId,
payment_date,
paymentReferenceController.text,
bankNameController.text,
bankBranchController.text,
bankAccNumberController.text,
bankIfscController.text,
bankAcHolderController.text,
bankUpiController.text,
_image
);
_image);
if (data != null) {
if (data['error'] == "0") {
print(data['error']=="0");
print(data['error'] == "0");
toast(context, "Added Successfully");
resetForm();
Navigator.pop(context,true);
Navigator.pop(context, true);
notifyListeners();
} else {}
}
......@@ -280,7 +472,68 @@ class Requestionlistprovider extends ChangeNotifier {
}
} 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() {
final headers = [
'ID',
......@@ -294,26 +547,33 @@ class Requestionlistprovider extends ChangeNotifier {
'Date',
];
final rows = requisitionList.map((item) => [
item.id ?? '',
item.accountName ?? '',
item.branch ?? '',
item.requestingPurpose ?? '',
item.description ?? '',
item.amount ?? '',
item.requestMode ?? '',
item.status ?? '',
item.date ?? '',
]).toList();
final rows =
requisitionList
.map(
(item) =>
[
item.id ?? '',
item.accountName ?? '',
item.branch ?? '',
item.requestingPurpose ?? '',
item.description ?? '',
item.amount ?? '',
item.requestMode ?? '',
item.status ?? '',
item.date ?? '',
],
)
.toList();
return [headers, ...rows];
}
void copyToClipboard(BuildContext context) async {
try {
if (requisitionList.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("No data to copy")),
);
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("No data to copy")));
return;
}
final data = prepareExportData();
......@@ -331,8 +591,12 @@ class Requestionlistprovider extends ChangeNotifier {
try {
if (Platform.isAndroid) {
// Request storage permission for Android
if (await Permission.storage.request().isGranted ||
await Permission.manageExternalStorage.request().isGranted) {
if (await Permission.storage
.request()
.isGranted ||
await Permission.manageExternalStorage
.request()
.isGranted) {
final dir = await getApplicationDocumentsDirectory();
if (dir != null) {
print('Using Downloads directory: ${dir.path}');
......@@ -368,9 +632,9 @@ class Requestionlistprovider extends ChangeNotifier {
Future<void> downloadCSV(BuildContext context) async {
try {
if (requisitionList.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("No data to export")),
);
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("No data to export")));
return;
}
final data = prepareExportData();
......@@ -386,7 +650,6 @@ class Requestionlistprovider extends ChangeNotifier {
toast(context, "CSV Downloaded");
} catch (e) {
print('Error downloading CSV: $e');
}
}
......@@ -412,10 +675,9 @@ class Requestionlistprovider extends ChangeNotifier {
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"));
toast(context, ("XLSX Downloaded and opened"));
} catch (e) {
print('Error downloading XLSX: $e');
}
}
......@@ -428,9 +690,7 @@ class Requestionlistprovider extends ChangeNotifier {
final data = prepareExportData();
final pdf = pw.Document();
pdf.addPage(
pw.Page(
build: (context) => pw.Table.fromTextArray(data: data),
),
pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
);
final dirPath = await getSaveDirectory();
final file = File('$dirPath/requisition_data.pdf');
......@@ -441,7 +701,6 @@ class Requestionlistprovider extends ChangeNotifier {
// 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');
}
......@@ -456,9 +715,7 @@ class Requestionlistprovider extends ChangeNotifier {
final data = prepareExportData();
final pdf = pw.Document();
pdf.addPage(
pw.Page(
build: (context) => pw.Table.fromTextArray(data: data),
),
pw.Page(build: (context) => pw.Table.fromTextArray(data: data)),
);
await Printing.layoutPdf(
onLayout: (PdfPageFormat format) async => pdf.save(),
......@@ -568,7 +825,6 @@ class Requestionlistprovider extends ChangeNotifier {
notifyListeners();
}
bool validateForm(BuildContext context, String mode) {
// Reset all errors
selectAccountError = null;
......@@ -597,18 +853,24 @@ class Requestionlistprovider extends ChangeNotifier {
isValid = false;
}
} else {
if (reqPurposeController.text.trim().isEmpty) {
if (reqPurposeController.text
.trim()
.isEmpty) {
reqPurposeError = "Please enter a requisition purpose";
isValid = false;
}
}
if (descController.text.trim().isEmpty) {
if (descController.text
.trim()
.isEmpty) {
descriptionError = "Please enter a description";
isValid = false;
}
if (amountController.text.trim().isEmpty) {
if (amountController.text
.trim()
.isEmpty) {
amountError = "Please enter an amount";
isValid = false;
}
......@@ -619,30 +881,42 @@ class Requestionlistprovider extends ChangeNotifier {
}
if (["Cheque", "RTGS", "IMPS", "NEFT"].contains(_paymentModeValue)) {
if (bankNameController.text.trim().isEmpty) {
if (bankNameController.text
.trim()
.isEmpty) {
bankNameError = "Please enter bank name";
isValid = false;
}
if (bankBranchController.text.trim().isEmpty) {
if (bankBranchController.text
.trim()
.isEmpty) {
bankBranchError = "Please enter bank branch";
isValid = false;
}
if (bankAccNumberController.text.trim().isEmpty) {
if (bankAccNumberController.text
.trim()
.isEmpty) {
bankNumberError = "Please enter account number";
isValid = false;
}
if (bankIfscController.text.trim().isEmpty) {
if (bankIfscController.text
.trim()
.isEmpty) {
bankIFSCError = "Please enter IFSC code";
isValid = false;
}
if (bankAcHolderController.text.trim().isEmpty) {
if (bankAcHolderController.text
.trim()
.isEmpty) {
bankHolderError = "Please enter account holder name";
isValid = false;
}
}
if (_paymentModeValue == "UPI") {
if (bankUpiController.text.trim().isEmpty) {
if (bankUpiController.text
.trim()
.isEmpty) {
UPIError = "Please enter UPI ID";
isValid = false;
}
......@@ -657,6 +931,15 @@ class Requestionlistprovider extends ChangeNotifier {
return isValid;
}
bool validateDirectForm(BuildContext context) {
bool isValid = true;
notifyListeners();
return isValid;
}
void updateReqPupose(String value) {
reqPurposeError = null;
notifyListeners();
......@@ -666,33 +949,39 @@ class Requestionlistprovider extends ChangeNotifier {
descriptionError = null;
notifyListeners();
}
void updateAmount(String value) {
amountError = null;
notifyListeners();
}
void updateBankName(String value) {
bankNameError = null;
notifyListeners();
}
void updateBankBranch(String value) {
bankBranchError = null;
notifyListeners();
}
void updateNumber(String value) {
bankNumberError = null;
notifyListeners();
}
void updateIFSC(String value) {
bankIFSCError = null;
notifyListeners();
}
void updateHolder(String value) {
bankHolderError = null;
notifyListeners();
}
void updateUPI(String value) {
UPIError = null;
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) {
onTap: () => Navigator.pop(context, true),
child: SvgPicture.asset("assets/svg/app_bar_back.svg", height: 25),
),
InkResponse(
onTap: () => Navigator.pop(context, true),
child: Text(
title,
style: TextStyle(
fontSize: 16,
height: 1.1,
fontFamily: "JakartaSemiBold",
color: AppColors.semi_black,
Expanded(
flex:4,
child: InkResponse(
onTap: () => Navigator.pop(context, true),
child: Text(
title,
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(
fontSize: 16,
height: 1.1,
fontFamily: "JakartaSemiBold",
color: AppColors.semi_black,
),
),
),
),
......
......@@ -25,6 +25,8 @@ import 'package:generp/Notifiers/UpdatePasswordProvider.dart';
import 'package:generp/Notifiers/VisitDetailsProvider.dart';
import 'package:generp/Notifiers/financeProvider/DashboardProvider.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/scanLoginProvider.dart';
import 'package:generp/Notifiers/splashVersionNotifier.dart';
......@@ -212,6 +214,8 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => Dashboardprovider(),),
ChangeNotifierProvider(create: (_) => Requestionlistprovider(),),
ChangeNotifierProvider(create: (_) => Requesitionlidtdetailsprovider(),),
ChangeNotifierProvider(create: (_) => Paymentrequisitionpaymentslistprovider(),),
ChangeNotifierProvider(create: (_) => Paymentreceiptsprovider(),),
],
child: Builder(
builder: (BuildContext context) {
......
......@@ -28,13 +28,26 @@ class Paymentrequestionlistdetails extends StatefulWidget {
class _PaymentrequestionlistdetailsState
extends State<Paymentrequestionlistdetails> {
TextEditingController requestedAmount = TextEditingController();
TextEditingController approvedAmount = TextEditingController();
TextEditingController remarks = TextEditingController();
FocusNode request = FocusNode();
FocusNode approve = FocusNode();
TextEditingController paymentReferenceNumber = TextEditingController();
FocusNode requestNode = FocusNode();
FocusNode approveNode = FocusNode();
FocusNode remarkNode = FocusNode();
FocusNode proposedPaymentAmountNode = FocusNode();
FocusNode paymentReferenceNumberNode = FocusNode();
FocusNode accountNameNode = FocusNode();
FocusNode branchNode = FocusNode();
FocusNode requestingPurposeNode = FocusNode();
FocusNode descriptionNode = FocusNode();
FocusNode amountNode = FocusNode();
FocusNode paymentModeNode = FocusNode();
FocusNode bankUpiIDNode = FocusNode();
@override
void initState() {
......@@ -55,6 +68,26 @@ class _PaymentrequestionlistdetailsState
builder: (context, provider, child) {
var payment_det = provider.paymentsDetails;
var req_det = provider.requestsDetails;
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
provider.subHeadings = [
req_det.accountName ?? "-",
req_det.proposedAccount ?? "-",
req_det.branch ?? "-",
req_det.requestingPurpose ?? "-",
req_det.requestMode ?? "-",
req_det.createdEmployee ?? "-",
req_det.attachmentViewFileName ?? "-",
req_det.date ?? "-",
req_det.description ?? "-",
req_det.level1ApprovalRemarks ?? "-",
req_det.level1Employee ?? "-",
req_det.level2ApprovalRemarks ?? "-",
req_det.level2Employee ?? "-",
req_det.createdDatetime ?? "-",
req_det.updatedDatetime ?? "-",
];
},);
return WillPopScope(
child: Scaffold(
appBar: appbar(context, widget.pageName),
......@@ -93,7 +126,7 @@ class _PaymentrequestionlistdetailsState
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
req_det.accountName!,
req_det.accountName ?? "-",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
......@@ -101,8 +134,7 @@ class _PaymentrequestionlistdetailsState
),
),
Text(
"₹"
"${req_det.amount}",
"₹${req_det.amount}",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
......@@ -126,7 +158,8 @@ class _PaymentrequestionlistdetailsState
),
child: Center(
child: Text(
req_det.status!,
req_det.status??"-",
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
......@@ -163,14 +196,13 @@ class _PaymentrequestionlistdetailsState
context,
MaterialPageRoute(
builder:
(context) =>
Fileviewer(
(context) => Fileviewer(
fileName:
req_det
.attachmentViewFileName!,
req_det
.attachmentViewFileName!,
fileUrl:
req_det
.attachmentDirFilePath!,
req_det
.attachmentDirFilePath!,
),
),
);
......@@ -183,17 +215,17 @@ class _PaymentrequestionlistdetailsState
style: TextStyle(
fontSize: 14,
color:
provider.Headings[j] == "Attachment"
? AppColors.app_blue
: Color(0xFF818181),
provider.Headings[j] == "Attachment"
? AppColors.app_blue
: Color(0xFF818181),
decoration:
provider.Headings[j] == "Attachment"
? TextDecoration.underline
: TextDecoration.none,
provider.Headings[j] == "Attachment"
? TextDecoration.underline
: TextDecoration.none,
decorationColor:
provider.Headings[j] == "Attachment"
? AppColors.app_blue
: AppColors.white,
provider.Headings[j] == "Attachment"
? AppColors.app_blue
: AppColors.white,
),
),
),
......@@ -208,101 +240,115 @@ class _PaymentrequestionlistdetailsState
),
),
bottomNavigationBar:
(["admin", "self"].contains(widget.mode))
? Container(height: 0)
: Container(
margin: EdgeInsets.symmetric(horizontal: 10),
alignment: Alignment.bottomCenter,
height: 60,
child: Container(
margin: EdgeInsets.only(bottom: 10),
alignment: Alignment.center,
height: 45,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: InkResponse(
onTap: () {
_showLevelRejectionSheet(context);
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFFFEFEF),
border: Border.all(
color: Color(0xFFED3424),
width: 0.5,
),
),
child: Center(
child: Text(
"Reject",
style: TextStyle(color: Color(0xFFED3424)),
),
),
),
),
),
SizedBox(width: 10),
if ([
"apr_lvl1",
"apr_lvl2",
].contains(widget.mode)) ...[
Expanded(
child: InkResponse(
onTap: () {
provider.approveRejectPaymentRequestAPIFunction(
context, provider.requestsDetails.id);
_showLevelApprovalSheet(context);
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFE7FFE5),
border: Border.all(
color: Color(0xFF0D9C00),
width: 0.5,
),
),
child: Center(
child: Text(
"Approve",
style: TextStyle(
color: Color(0xFF0D9C00),
(["admin", "self"].contains(widget.mode))
? Container(height: 0)
: Container(
margin: EdgeInsets.symmetric(horizontal: 10),
alignment: Alignment.bottomCenter,
height: 60,
child: Container(
margin: EdgeInsets.only(bottom: 10),
alignment: Alignment.center,
height: 45,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: InkResponse(
onTap: () {
_showLevelRejectionSheet(context);
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFFFEFEF),
border: Border.all(
color: Color(0xFFED3424),
width: 0.5,
),
),
child: Center(
child: Text(
"Reject",
style: TextStyle(
color: Color(0xFFED3424),
),
),
),
),
),
),
),
),
),
] else
if (widget.mode == "process") ...[
Expanded(
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFE7FFE5),
border: Border.all(
color: Color(0xFF0D9C00),
width: 0.5,
SizedBox(width: 10),
if ([
"apr_lvl1",
"apr_lvl2",
].contains(widget.mode)) ...[
Expanded(
child: InkResponse(
onTap: () {
provider
.approveRejectPaymentRequestAPIFunction(
context,
provider.requestsDetails.id,
);
_showLevelApprovalSheet(context);
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFE7FFE5),
border: Border.all(
color: Color(0xFF0D9C00),
width: 0.5,
),
),
child: Center(
child: Text(
"Approve",
style: TextStyle(
color: Color(0xFF0D9C00),
),
),
),
),
),
),
),
child: Center(
child: Text(
"Add Payment",
style: TextStyle(
color: Color(0xFF0D9C00),
] else if (widget.mode == "process") ...[
Expanded(
child: InkResponse(
onTap: () {
provider
.approveRejectPaymentRequestAPIFunction(
context,
provider.requestsDetails.id,
);
_showAddPaymentSheet(context);
},
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Color(0xFFE7FFE5),
border: Border.all(
color: Color(0xFF0D9C00),
width: 0.5,
),
),
child: Center(
child: Text(
"Add Payment",
style: TextStyle(
color: Color(0xFF0D9C00),
),
),
),
),
),
),
),
),
],
],
),
],
],
),
),
),
),
),
),
onWillPop: () {
return onBackPressed(context);
......@@ -327,6 +373,7 @@ class _PaymentrequestionlistdetailsState
return SafeArea(
child: Consumer<Requesitionlidtdetailsprovider>(
builder: (context, provider, child) {
return Container(
margin: EdgeInsets.only(
bottom: 15,
......@@ -344,29 +391,29 @@ class _PaymentrequestionlistdetailsState
child: Text(
"Level 1 Approval",
style: TextStyle(
color: AppColors.app_blue,
fontSize: 16
color: AppColors.app_blue,
fontSize: 16,
),
),
),
textControllerWidget(
textControllerReadonlyWidget(
context,
requestedAmount,
provider.requestedAmount,
"Enter Requested Amount",
(p0) {},
(p0) {},
),
textControllerWidget(
context,
approvedAmount,
"Enter Approved Amount",
(p0) {},
(p0) {},
),
textControllerWidget(
context,
remarks,
"Enter Remarks",
(p0) {},
(p0) {},
),
TextWidget(context, "Proposed Payment Account"),
DropdownButtonHideUnderline(
......@@ -381,31 +428,33 @@ class _PaymentrequestionlistdetailsState
overflow: TextOverflow.ellipsis,
),
items:
provider.paymentsAccounts
.map(
(paymenents) =>
DropdownMenuItem<PaymentAccounts>(
value: paymenents,
child: Text(
paymenents.name ?? '',
style: const TextStyle(
fontSize: 14,
provider.paymentsAccounts
.map(
(paymenents) => DropdownMenuItem<
PaymentAccounts
>(
value: paymenents,
child: Text(
paymenents.name ?? '',
style: const TextStyle(
fontSize: 14,
),
overflow:
TextOverflow.ellipsis,
),
),
overflow: TextOverflow.ellipsis,
),
),
)
.toList(),
)
.toList(),
value: provider.selectedPaymentAccounts,
onChanged: (PaymentAccounts? value) {
if (value != null) {
if (provider.paymentsAccounts
if (provider
.paymentsAccounts
.isNotEmpty) {
provider.selectedPaymentAccounts =
value;
print(
"Selected Complaint Type: ${value
.name}, ID: ${value.id}",
"Selected Complaint Type: ${value.name}, ID: ${value.id}",
);
provider.selectedID = value.id!;
provider.selectedValue = value.name!;
......@@ -442,18 +491,22 @@ class _PaymentrequestionlistdetailsState
),
scrollbarTheme: ScrollbarThemeData(
radius: const Radius.circular(15),
thickness: MaterialStateProperty.all<
double>(
6,
),
thickness:
MaterialStateProperty.all<double>(
6,
),
thumbVisibility:
MaterialStateProperty.all<bool>(true),
MaterialStateProperty.all<bool>(
true,
),
),
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
padding: EdgeInsets.only(
left: 14, right: 14),
left: 14,
right: 14,
),
),
),
),
......@@ -464,10 +517,13 @@ class _PaymentrequestionlistdetailsState
onTap: () {
provider
.paymentrequisitionApproveSubmitAPIFunction(
context, widget.mode,
provider.paymentsReqDetails.id,
approvedAmount.text, remarks.text,
provider.selectedID);
context,
widget.mode,
provider.paymentsReqDetails.id,
approvedAmount.text,
remarks.text,
provider.selectedID,
);
},
child: Container(
alignment: Alignment.center,
......@@ -480,7 +536,7 @@ class _PaymentrequestionlistdetailsState
),
decoration: BoxDecoration(
color: AppColors.app_blue, //1487C9
borderRadius: BorderRadius.circular(30.0),
borderRadius: BorderRadius.circular(14.0),
),
child: Center(
child: Text(
......@@ -536,31 +592,344 @@ class _PaymentrequestionlistdetailsState
child: Text(
"Level 1 Rejection",
style: TextStyle(
color: AppColors.app_blue,
fontSize: 16
color: AppColors.app_blue,
fontSize: 16,
),
),
),
textControllerWidget(
textControllerReadonlyWidget(
context,
requestedAmount,
provider.requestedAmount,
"Enter Requested Amount",
(p0) {},
(p0) {},
),
textControllerWidget(
context,
remarks,
"Enter Remarks",
(p0) {},
(p0) {},
),
InkWell(
onTap: () {
provider
.paymentrequisitionRejectSubmitAPIFunction(
context, widget.mode,
provider.paymentsReqDetails.id, remarks.text);
context,
widget.mode,
provider.paymentsReqDetails.id,
remarks.text,
);
},
child: Container(
alignment: Alignment.center,
height: 45,
margin: EdgeInsets.only(
left: 5.0,
right: 5.0,
top: 5.0,
bottom: 5.0,
),
decoration: BoxDecoration(
color: AppColors.app_blue, //1487C9
borderRadius: BorderRadius.circular(14.0),
),
child: Center(
child: Text(
"Submit",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white),
),
),
),
),
],
),
),
);
},
),
);
},
);
},
);
}
Future<void> _showAddPaymentSheet(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<Requesitionlidtdetailsprovider>(
builder: (context, provider, child) {
return Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 10,
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Align(
alignment: Alignment.topLeft,
child: Text(
"Add Approval",
style: TextStyle(
color: AppColors.app_blue,
fontSize: 16,
),
),
),
textControllerReadonlyWidget(
context,
provider.proposedPaymentAccount,
"Enter Proposed Payment Account",
(p0) {},
),
TextWidget(context, "Payment Account"),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<PaymentAccounts>(
isExpanded: true,
hint: Text(
'Select Account',
style: TextStyle(fontSize: 14),
overflow: TextOverflow.ellipsis,
),
items:
provider.paymentsAccounts
.map(
(paymenents) => DropdownMenuItem<
PaymentAccounts
>(
value: paymenents,
child: Text(
paymenents.name ?? '',
style: const TextStyle(
fontSize: 14,
),
overflow:
TextOverflow.ellipsis,
),
),
)
.toList(),
value: provider.selectedPaymentAccounts,
onChanged: (PaymentAccounts? value) {
if (value != null) {
if (provider
.paymentsAccounts
.isNotEmpty) {
provider.selectedPaymentAccounts =
value;
print(
"Selected Complaint Type: ${value.name}, ID: ${value.id}",
);
provider.selectedID = value.id!;
provider.selectedValue = value.name!;
print(
"hfjkshfg" +
provider.selectedID.toString(),
);
}
}
},
buttonStyleData: ButtonStyleData(
height: 50,
width: 160,
padding: const EdgeInsets.only(
left: 14,
right: 14,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
),
iconStyleData: const IconStyleData(
icon: Icon(Icons.keyboard_arrow_down),
iconSize: 12,
iconEnabledColor: Color(0xFF2D2D2D),
iconDisabledColor: Colors.grey,
),
dropdownStyleData: DropdownStyleData(
maxHeight: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
scrollbarTheme: ScrollbarThemeData(
radius: const Radius.circular(15),
thickness:
MaterialStateProperty.all<double>(
6,
),
thumbVisibility:
MaterialStateProperty.all<bool>(
true,
),
),
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
padding: EdgeInsets.only(
left: 14,
right: 14,
),
),
),
),
],
),
),
textControllerWidget(
context,
paymentReferenceNumber,
"Enter Payment Reference Number",
(p0) {},
),
textControllerWidget(
context,
remarks,
"Enter Remarks",
(p0) {},
),
InkResponse(
onTap: () {
_showAttachmentSheet(context);
},
child: Container(
margin: EdgeInsets.symmetric(vertical: 10),
height: 45,
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
color: Color(0xFFE6F6FF),
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: AppColors.app_blue,
width: 0.5,
),
),
child: Center(
child: Text(
"Add Attachment",
style: TextStyle(
fontFamily: "JakartaMedium",
color: AppColors.app_blue,
),
),
),
),
),
textControllerReadonlyWidget(
context,
provider.accountName,
"Enter Account Name",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.branch,
"Enter Branch Name",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.requestingPurpose,
"Enter Requesting Purpose",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.description,
"Enter Description",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.amount,
"Enter Amount",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.paymentMode,
"Enter Payment Mode",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.bankHolderName,
"Bank Account Holder Name",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.bankAccountNumber,
"Bank Account Number",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.bankName,
"Bank Name",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.bankBranchName,
"Bank Branch Name",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.bankIfscCode,
"Bank IFSC Code",
(p0) {},
),
textControllerReadonlyWidget(
context,
provider.bankUpiID,
"Bank UPI ID",
(p0) {},
),
InkWell(
onTap: () {
provider.paymentrequisitionProcessSubmitAPIFunction(
context, widget.mode, provider.paymentsReqDetails.id,
paymentReferenceNumber.text,
remarks.text,
provider.imagePath);
},
child: Container(
alignment: Alignment.center,
......@@ -573,7 +942,7 @@ class _PaymentrequestionlistdetailsState
),
decoration: BoxDecoration(
color: AppColors.app_blue, //1487C9
borderRadius: BorderRadius.circular(30.0),
borderRadius: BorderRadius.circular(14.0),
),
child: Center(
child: Text(
......@@ -597,6 +966,86 @@ class _PaymentrequestionlistdetailsState
);
}
Future<void> _showAttachmentSheet(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<Requesitionlidtdetailsprovider>(
builder: (context, provider, child) {
return Padding(
padding: EdgeInsets.only(
bottom:
MediaQuery.of(
context,
).viewInsets.bottom, // This handles keyboard
),
child: Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 10,
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Align(
alignment: Alignment.center,
child: Text(
"Select Source",
style: TextStyle(
color: AppColors.app_blue,
fontSize: 16,
),
),
),
SizedBox(height: 15),
InkWell(
onTap: () {
Navigator.of(context).pop(false);
provider.imgFromGallery(context);
},
child: Container(
height: 35,
child: Text("Select photo from gallery"),
),
),
SizedBox(height: 10),
InkWell(
onTap: () {
Navigator.of(context).pop(false);
provider.imgFromCamera(context);
},
child: Container(
height: 35,
child: Text("Capture photo from camera"),
),
),
],
),
),
),
);
},
),
);
},
);
},
);
}
Widget TextWidget(context, text) {
return Padding(
......@@ -612,10 +1061,12 @@ class _PaymentrequestionlistdetailsState
return SizedBox(height: 10);
}
Widget textControllerWidget(context,
controller,
hintText,
Function(String)? onChanged,) {
Widget textControllerWidget(
context,
controller,
hintText,
Function(String)? onChanged,
) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
......@@ -624,7 +1075,7 @@ class _PaymentrequestionlistdetailsState
child: Text(hintText),
),
Container(
height: hintText == "Enter Description" ? 150 : 50,
height: hintText == "Enter Description"||hintText=="Enter Remarks" ? 150 : 50,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColors.text_field_color,
......@@ -635,9 +1086,60 @@ class _PaymentrequestionlistdetailsState
child: TextFormField(
controller: controller,
keyboardType: TextInputType.text,
maxLines: hintText == "Enter Description"||hintText=="Enter Remarks" ? 60 : 1,
onChanged: onChanged,
decoration: InputDecoration(
hintText: hintText,
hintStyle: TextStyle(
fontWeight: FontWeight.w400,
color: Color(0xFFB4BEC0),
fontSize: 14,
),
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
),
),
),
),
],
);
}
Widget textControllerReadonlyWidget(
context,
controller,
hintText,
Function(String)? onChanged,
) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 5.0, top: 8.0),
child: Text(hintText),
),
Container(
height: hintText == "Enter Description" ? 150 : 50,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Color(0xFFE9E9E9),
borderRadius: BorderRadius.circular(14),
),
child: Padding(
padding: const EdgeInsets.fromLTRB(10.0, 0.0, 10, 0),
child: TextFormField(
controller: controller,
readOnly: true,
keyboardType: TextInputType.text,
maxLines: hintText == "Enter Description" ? 60 : 1,
onChanged: onChanged,
style: TextStyle(
color: Color(0xFF818181),
fontSize: 14,
),
decoration: InputDecoration(
hintText: hintText,
hintStyle: TextStyle(
fontWeight: FontWeight.w400,
......
import 'package:flutter/material.dart';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:generp/Notifiers/financeProvider/RequestionListProvider.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:generp/Utils/commonWidgets.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
class Directpaymentrequesitionlist extends StatefulWidget {
const Directpaymentrequesitionlist({super.key});
import '../../Models/financeModels/addDirectPaymentResponse.dart';
@override
State<Directpaymentrequesitionlist> createState() => _DirectpaymentrequesitionlistState();
}
class Directpaymentrequesitionlist extends StatefulWidget {
final String pageTitleName;
class _DirectpaymentrequesitionlistState extends State<Directpaymentrequesitionlist> {
@override
Widget build(BuildContext context) {
return const Placeholder();
const Directpaymentrequesitionlist({super.key, required this.pageTitleName});
@override
State<Directpaymentrequesitionlist> createState() =>
_DirectpaymentrequesitionlistState();
}
class _DirectpaymentrequesitionlistState
extends State<Directpaymentrequesitionlist> {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
var provider = Provider.of<Requestionlistprovider>(
context,
listen: false,
);
provider.addDirectPaymentRequestionViewAPI(context);
});
}
@override
void dispose() {
super.dispose();
}
Future<bool> _onBackPressed(BuildContext context) async {
Navigator.pop(context, true);
return true;
}
@override
Widget build(BuildContext context) {
return Consumer<Requestionlistprovider>(
builder: (context, provider, child) {
return WillPopScope(
child: Scaffold(
backgroundColor: AppColors.white,
appBar: appbar(context, "${widget.pageTitleName}"),
body: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextWidget(context, "Account"),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<DirectAccounts>(
isExpanded: true,
hint: Text(
'Select Account Type',
style: TextStyle(fontSize: 14),
overflow: TextOverflow.ellipsis,
),
items:
provider.directAccounts
.map(
(accs) =>
DropdownMenuItem<DirectAccounts>(
value: accs,
child: Text(
accs.name ?? '',
style: const TextStyle(
fontSize: 14,
),
overflow: TextOverflow.ellipsis,
),
),
)
.toList(),
value: provider.selectDirectAccounts,
onChanged: (DirectAccounts? value) {
if (value != null) {
if (provider.directAccounts.isNotEmpty) {
provider.selectDirectAccounts = value;
print(
"Selected Complaint Type: ${value.name}, ID: ${value.id}",
);
provider.directAccountId = value.id!;
provider.directAccountValue = value.name!;
print(
"hfjkshfg" +
provider.directAccountId.toString(),
);
}
}
},
buttonStyleData: ButtonStyleData(
height: 50,
width: 160,
padding: const EdgeInsets.only(
left: 14,
right: 14,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
),
iconStyleData: const IconStyleData(
icon: Icon(Icons.keyboard_arrow_down),
iconSize: 12,
iconEnabledColor: Color(0xFF2D2D2D),
iconDisabledColor: Colors.grey,
),
dropdownStyleData: DropdownStyleData(
maxHeight: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
scrollbarTheme: ScrollbarThemeData(
radius: const Radius.circular(15),
thickness: MaterialStateProperty.all<double>(
6,
),
thumbVisibility:
MaterialStateProperty.all<bool>(true),
),
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
padding: EdgeInsets.only(left: 14, right: 14),
),
),
),
],
),
),
TextWidget(context, "Payment Account"),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<DirectPaymentAccounts>(
isExpanded: true,
hint: Text(
'Select Account Type',
style: TextStyle(fontSize: 14),
overflow: TextOverflow.ellipsis,
),
items:
provider.directPaymentAccounts
.map(
(accs) => DropdownMenuItem<
DirectPaymentAccounts
>(
value: accs,
child: Text(
accs.name ?? '',
style: const TextStyle(
fontSize: 14,
),
overflow: TextOverflow.ellipsis,
),
),
)
.toList(),
value: provider.selectDirectPaymentAccounts,
onChanged: (DirectPaymentAccounts? value) {
if (value != null) {
if (provider
.directPaymentAccounts
.isNotEmpty) {
provider.selectDirectPaymentAccounts =
value;
print(
"Selected Complaint Type: ${value.name}, ID: ${value.id}",
);
provider.directPaymentAccountsID =
value.id!;
provider.directPaymentAccountsValue =
value.name!;
print(
"hfjkshfg" +
provider.directPaymentAccountsID
.toString(),
);
}
}
},
buttonStyleData: ButtonStyleData(
height: 50,
width: 160,
padding: const EdgeInsets.only(
left: 14,
right: 14,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
),
iconStyleData: const IconStyleData(
icon: Icon(Icons.keyboard_arrow_down),
iconSize: 12,
iconEnabledColor: Color(0xFF2D2D2D),
iconDisabledColor: Colors.grey,
),
dropdownStyleData: DropdownStyleData(
maxHeight: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
scrollbarTheme: ScrollbarThemeData(
radius: const Radius.circular(15),
thickness: MaterialStateProperty.all<double>(
6,
),
thumbVisibility:
MaterialStateProperty.all<bool>(true),
),
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
padding: EdgeInsets.only(left: 14, right: 14),
),
),
),
],
),
),
textControllerWidget(
context,
provider.amountController,
"Enter Amount",
provider.updateAmount,
),
///payment date toBE
TextWidget(context, "Enter Date"),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: InkResponse(
onTap: () async {
provider.showDatePickerDialog(context);
},
child: Container(
padding: EdgeInsets.only(left: 10),
height:48,
alignment: Alignment.centerLeft,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color
),
child: Text(
'${provider.formattedDate ?? 'Select Date'}',
style: TextStyle(
fontSize: 14,
fontFamily:
"JakartaMedium",
color: AppColors.semi_black,
),
),
),
),
),
],
),
TextWidget(context, "Select Payment Mode"),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<DirectPaymentModes>(
isExpanded: true,
hint: Text(
'Select Payment mode',
style: TextStyle(fontSize: 14),
overflow: TextOverflow.ellipsis,
),
items:
provider.directPaymentModes
.map(
(paymenents) => DropdownMenuItem<
DirectPaymentModes
>(
value: paymenents,
child: Text(
paymenents.name ?? '',
style: const TextStyle(
fontSize: 14,
),
overflow: TextOverflow.ellipsis,
),
),
)
.toList(),
value: provider.selectDirectPaymentModes,
onChanged: (DirectPaymentModes? value) {
if (value != null) {
if (provider.directPaymentModes.isNotEmpty) {
provider.selectDirectPaymentModes = value;
print(
"Selected Complaint Type: ${value.name}, ID: ${value.id}",
);
provider.directPaymentModesID = value.id!;
provider.directPaymentModesValues =
value.name!;
print(
"hfjkshfg" +
provider.directPaymentModesID
.toString(),
);
}
}
},
buttonStyleData: ButtonStyleData(
height: 50,
width: 160,
padding: const EdgeInsets.only(
left: 14,
right: 14,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
),
iconStyleData: const IconStyleData(
icon: Icon(Icons.keyboard_arrow_down),
iconSize: 12,
iconEnabledColor: Color(0xFF2D2D2D),
iconDisabledColor: Colors.grey,
),
dropdownStyleData: DropdownStyleData(
maxHeight: 200,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
color: AppColors.text_field_color,
),
scrollbarTheme: ScrollbarThemeData(
radius: const Radius.circular(15),
thickness: MaterialStateProperty.all<double>(
6,
),
thumbVisibility:
MaterialStateProperty.all<bool>(true),
),
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
padding: EdgeInsets.only(left: 14, right: 14),
),
),
),
],
),
),
if ([
"Cheque",
"RTGS",
"IMPS",
"NEFT",
].contains(provider.paymentModeValue)) ...
[
textControllerWidget(
context,
provider.bankNameController,
"Enter Bank Name",
provider.updateBankName,
),
textControllerWidget(
context,
provider.bankBranchController,
"Enter Bank Branch",
provider.updateBankBranch,
),
textControllerWidget(
context,
provider.bankAccNumberController,
"Enter Account Number",
provider.updateNumber,
),
textControllerWidget(
context,
provider.bankIfscController,
"Enter Bank IFSC",
provider.updateIFSC,
),
textControllerWidget(
context,
provider.bankAcHolderController,
"Enter Bank Account Holder Name",
provider.updateHolder,
),
] else if (provider.paymentModeValue == "UPI") ...
[
textControllerWidget(
context,
provider.amountController,
"Enter UPI ID",
provider.updateUPI,
),
],
textControllerWidget(
context,
provider.paymentReferenceController,
"Enter Payment Reference Number",
provider.updateDescription,
),
textControllerWidget(
context,
provider.descController,
"Enter Description",
provider.updateDescription,
),
InkResponse(
onTap: () {
_showAttachmentSheet(context);
},
child: Container(
margin: EdgeInsets.symmetric(vertical: 10),
height: 45,
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
color: Color(0xFFE6F6FF),
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: AppColors.app_blue,
width: 0.5,
),
),
child: Center(
child: Text(
"File Attachment",
style: TextStyle(
fontFamily: "JakartaMedium",
color: AppColors.app_blue,
),
),
),
),
),
],
),
),
),
floatingActionButtonLocation:
FloatingActionButtonLocation.centerFloat,
bottomNavigationBar: InkResponse(
onTap: () {
// provider.submitClicked = true;
provider.addDirectPaymentRequestionSubmitAPI(context, provider.formattedDate);
},
child: Container(
height: 45,
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: 10),
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
decoration: BoxDecoration(
color: AppColors.app_blue,
borderRadius: BorderRadius.circular(15),
),
child: Text(
"Submit",
style: TextStyle(
fontSize: 15,
fontFamily: "JakartaMedium",
color: Colors.white,
),
),
),
),
),
onWillPop: () {
provider.resetForm();
return onBackPressed(context);
},
);
},
);
}
void _showDialog(Widget child) {
showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) => Container(
height: 216,
padding: const EdgeInsets.only(top: 6.0),
// The Bottom margin is provided to align the popup above the system
// navigation bar.
margin: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
// Provide a background color for the popup.
color: CupertinoColors.systemBackground.resolveFrom(context),
// Use a SafeArea widget to avoid system overlaps.
child: SafeArea(
top: false,
child: Column(
children: [
Expanded(
flex: 1,
child: SizedBox(
height: 40,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// Add a Cancel button (optional)
CupertinoButton(
child: Text(
'Cancel',
style: TextStyle(fontFamily: "JakartaMedium"),
),
onPressed: () {
Navigator.pop(context);
},
),
// Add a Done button
CupertinoButton(
child: Text('Done',
style: TextStyle(fontFamily: "JakartaMedium")),
onPressed: () {
Navigator.pop(context); // Dismiss the dialog
},
),
],
),
),
),
Expanded(flex: 3, child: child),
],
),
),
),
);
}
Widget TextWidget(context, text) {
return Padding(
padding: const EdgeInsets.only(bottom: 5.0, top: 8.0),
child: Text(text),
);
}
Widget ErrorWidget(context, text) {
if (text != null)
return Text(text!, style: TextStyle(color: Colors.red, fontSize: 12));
else
return SizedBox(height: 10);
}
Widget textControllerWidget(
context,
controller,
hintText,
Function(String)? onChanged,
) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 5.0, top: 8.0),
child: Text(hintText),
),
Container(
height: hintText == "Enter Description" ? 150 : 50,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColors.text_field_color,
borderRadius: BorderRadius.circular(14),
),
child: Padding(
padding: const EdgeInsets.fromLTRB(10.0, 0.0, 10, 0),
child: TextFormField(
controller: controller,
keyboardType: TextInputType.text,
maxLines: hintText == "Enter Description" ? 60 : 1,
onChanged: onChanged,
decoration: InputDecoration(
hintText: hintText,
hintStyle: TextStyle(
fontWeight: FontWeight.w400,
color: Color(0xFFB4BEC0),
fontSize: 14,
),
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
),
),
),
),
],
);
}
Future<void> _showAttachmentSheet(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<Requestionlistprovider>(
builder: (context, provider, child) {
return Padding(
padding: EdgeInsets.only(
bottom:
MediaQuery.of(
context,
).viewInsets.bottom, // This handles keyboard
),
child: Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 10,
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Align(
alignment: Alignment.center,
child: Text(
"Select Source",
style: TextStyle(
color: AppColors.app_blue,
fontFamily: "JakrtaMedium",
fontSize: 16,
),
),
),
SizedBox(height: 15),
InkWell(
onTap: () {
Navigator.of(context).pop(false);
provider.imgFromGallery(context);
},
child: Container(
height: 35,
child: Text("Select photo from gallery"),
),
),
SizedBox(height: 10),
InkWell(
onTap: () {
Navigator.of(context).pop(false);
provider.imgFromCamera(context);
},
child: Container(
height: 35,
child: Text("Capture photo from camera"),
),
),
],
),
),
),
);
},
),
);
},
);
},
);
}
}
}
......@@ -5,6 +5,8 @@ import 'package:generp/Utils/app_colors.dart';
import 'package:generp/Utils/commonWidgets.dart';
import 'package:generp/screens/finance/AllPaymentRequesitionListsByModes.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:provider/provider.dart';
......@@ -65,10 +67,38 @@ class _FinancedashboardState extends State<Financedashboard> {
}
return InkResponse(
onTap: () async {
await Navigator.push(context, MaterialPageRoute(
builder: (context) =>
Allpaymentrequesitionlistsbymodes(mode: provider.accessiblePagesList[index].mode!,
pageTitleName: provider.accessiblePagesList[index].pageName!),));
var navigate;
if (provider.accessiblePagesList[index].pageName ==
"Payments List") {
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(
margin: EdgeInsets.symmetric(
......@@ -89,8 +119,7 @@ class _FinancedashboardState extends State<Financedashboard> {
Expanded(
flex: 5,
child: Text(
"${provider.accessiblePagesList[index]
.pageName}",
"${provider.accessiblePagesList[index].pageName}",
),
),
Expanded(
......@@ -110,7 +139,7 @@ class _FinancedashboardState extends State<Financedashboard> {
),
),
floatingActionButtonLocation:
FloatingActionButtonLocation.centerFloat,
FloatingActionButtonLocation.centerFloat,
floatingActionButton: InkResponse(
onTap: () {
_showPaymentOptionsSheet(context);
......@@ -169,8 +198,9 @@ class _FinancedashboardState extends State<Financedashboard> {
children: [
SizedBox(height: 15),
...List.generate(
provider.accessiblePagesList2.length, (index) {
...List.generate(provider.accessiblePagesList2.length, (
index,
) {
print(provider.accessiblePagesList2[index].mode);
List<String> mode_lst = [
"self",
......@@ -190,24 +220,36 @@ class _FinancedashboardState extends State<Financedashboard> {
onTap: () async {
Navigator.pop(context);
var res;
if (provider.accessiblePagesList2[index]
.pageName == "Add Direct Payment") {
res = await Navigator.push(context,
MaterialPageRoute(builder: (context) =>
Directpaymentrequesitionlist(),));
if (provider
.accessiblePagesList2[index]
.pageName ==
"Add Direct Payment") {
res = await Navigator.push(
context,
MaterialPageRoute(
builder:
(
context,
) => Directpaymentrequesitionlist(
pageTitleName:
provider
.accessiblePagesList2[index]
.pageName!,
),
),
);
} else {
res = await Navigator.push(
context,
MaterialPageRoute(
builder:
(context) =>
Submitpaymentrequestionlistsbymode(
mode: "${provider
.accessiblePagesList2[index]
.mode}",
pageTitleName: "${provider
.accessiblePagesList2[index]
.pageName}",
(
context,
) => Submitpaymentrequestionlistsbymode(
mode:
"${provider.accessiblePagesList2[index].mode}",
pageTitleName:
"${provider.accessiblePagesList2[index].pageName}",
),
),
);
......@@ -217,8 +259,7 @@ class _FinancedashboardState extends State<Financedashboard> {
"assets/svg/fin_ic.svg",
),
title: Text(
"${provider.accessiblePagesList2[index]
.pageName}",
"${provider.accessiblePagesList2[index].pageName}",
style: TextStyle(
fontSize: 14,
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",
),
);
}),
],
),
),
);
},
),
);
},
);
},
);
}
}
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/paymentReceiptsProvider.dart';
import '../../Notifiers/financeProvider/paymentRequisitionPaymentsListProvider.dart';
import 'FileViewer.dart';
class Paymentreceiptdetails extends StatefulWidget {
final paymentRequestId;
final pageName;
const Paymentreceiptdetails({
super.key,
required this.paymentRequestId,
required this.pageName,
});
@override
State<Paymentreceiptdetails> createState() =>
_PaymentreceiptdetailsState();
}
class _PaymentreceiptdetailsState
extends State<Paymentreceiptdetails> {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
var provider = Provider.of<Paymentreceiptsprovider>(
context,
listen: false,
);
provider.paymentsListDetailsAPI(context, widget.paymentRequestId);
});
}
@override
Widget build(BuildContext context) {
return Consumer<Paymentreceiptsprovider>(
builder: (context, provider, child) {
var payment_det = provider.receiptDetails;
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.receipientAccount ?? "-",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.semi_black,
),
),
Text(
"₹${payment_det.amount}",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.app_blue,
),
),
],
),
),
),
],
),
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:generp/screens/finance/paymentReceiptDetails.dart';
import 'package:provider/provider.dart';
import '../../Notifiers/financeProvider/paymentReceiptsProvider.dart';
import '../../Notifiers/financeProvider/paymentRequisitionPaymentsListProvider.dart';
import '../../Utils/app_colors.dart';
import '../../Utils/commonWidgets.dart';
import 'FileViewer.dart';
class Paymentreceiptlist extends StatefulWidget {
final String pageTitleName;
const Paymentreceiptlist({super.key, required this.pageTitleName});
@override
State<Paymentreceiptlist> createState() => _PaymentreceiptlistState();
}
class _PaymentreceiptlistState extends State<Paymentreceiptlist> {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
var provider = Provider.of<Paymentreceiptsprovider>(
context,
listen: false,
);
provider.paymentsListAPI(context);
});
}
@override
Widget build(BuildContext context) {
return Consumer<Paymentreceiptsprovider>(
builder: (context, provider, child) {
final requestLists = provider.receiptsList;
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,
),
),
],
),
),
),
],
),
Divider(thickness: 0.5, color: Color(0xFFD7D7D7)),
...List.generate(4, (j) {
final headings = [
"Request Mode",
"Attachment",
"Receipt Date",
"Note",
];
final subHeadings = [
requestLists[index].requestMode,
"View",
// requestLists[index].attachmentDirFilePath
requestLists[index].receiptDate,
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) =>
Paymentreceiptdetails(
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",
),
);
}),
],
),
),
);
},
),
);
},
);
},
);
}
}
......@@ -2,6 +2,8 @@ import 'dart:convert';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:generp/Models/ViewVisitDetailsResponseNew.dart';
import 'package:generp/Models/financeModels/addDirectPaymentResponse.dart';
import 'package:generp/Models/financeModels/paymentRequisitionPaymentsListResponse.dart';
import 'package:generp/services/api_names.dart';
import 'package:generp/services/api_post_request.dart';
import 'package:path_provider/path_provider.dart';
......@@ -40,6 +42,9 @@ import '../Models/ViewVisitDetailsResponse.dart';
import '../Models/financeModels/addPaymentRequestionResponse.dart';
import '../Models/financeModels/paymentRequesitionListsResponse.dart';
import '../Models/financeModels/paymentRequisitionDetailsResponse.dart';
import '../Models/financeModels/paymentRequisitionPaymentsDetailsResponse.dart';
import '../Models/financeModels/paymentRequisitionPaymentsReceiptsDetailsResponse.dart';
import '../Models/financeModels/paymentRequisitionPaymentsReceiptsListResponse.dart';
import '../Models/generatorComplaintResponse.dart';
import '../Models/loadGeneratorDetailsResponse.dart';
import '../Models/financeModels/financeDashboardPagesResponse.dart';
......@@ -1180,6 +1185,32 @@ class ApiCalling {
}
}
static Future<addDirectPaymentResponse?> addDirectPaymentRequestionViewAPI(
empId,
session,
) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
};
final res = await post(data, addDirectPaymentRequestionViewUrl, {});
if (res != null) {
debugPrint(res.body);
return addDirectPaymentResponse.fromJson(jsonDecode(res.body));
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static addPaymentRequestionSubmitAPI(
emp_id,
session_id,
......@@ -1241,6 +1272,69 @@ class ApiCalling {
}
}
static addDirectPaymentRequestionSubmitAPI(
emp_id,
session_id,
from_account_id,
to_account_id,
description,
payment_mode_id,
amount,
payment_date,
payment_reference_number,
bank_name,
bank_branch_name,
bank_acc_number,
bank_ifsc_code,
acc_holder_name,
bank_upi_id,
attachment,
) async {
try {
Map<String, String> data = {
'emp_id': emp_id.toString(),
'session_id': session_id.toString(),
'from_account_id': from_account_id.toString(),
'to_account_id': to_account_id.toString(),
'description': description.toString(),
'payment_mode_id': payment_mode_id.toString(),
'amount': amount.toString(),
'payment_date': payment_date.toString(),
'payment_reference_number': payment_reference_number.toString(),
'bank_name': bank_name.toString(),
'bank_branch_name': bank_branch_name.toString(),
'bank_acc_number': bank_acc_number.toString(),
'bank_ifsc_code': bank_ifsc_code.toString(),
'acc_holder_name': acc_holder_name.toString(),
'bank_upi_id': bank_upi_id.toString(),
};
var res;
if (attachment != null) {
res = await postImageNew(
data,
{},
addDirectPaymentRequestionSubmitUrl,
attachment,
"attachment",
);
res = jsonDecode(res);
} else {
res = await post(data, addDirectPaymentRequestionSubmitUrl, {});
res = jsonDecode(res);
}
if (res != null) {
return res;
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static Future<paymentRequesitionListsResponse?> paymentRequestionListsAPI(
empId,
session,
......@@ -1269,7 +1363,7 @@ class ApiCalling {
static Future<paymentRequisitionDetailsResponse?> paymentRequestionDetailsAPI(
empId,
session,
payment_request_id,
payment_request_id,
) async {
try {
Map<String, String> data = {
......@@ -1291,11 +1385,8 @@ class ApiCalling {
}
}
static Future<approveRejectPaymentRequestResponse?> approveRejectPaymentRequestAPI(
empId,
session,
payment_request_id,
) async {
static Future<approveRejectPaymentRequestResponse?>
approveRejectPaymentRequestAPI(empId, session, payment_request_id) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
......@@ -1305,7 +1396,9 @@ class ApiCalling {
final res = await post(data, approveRejectPaymentRequestUrl, {});
if (res != null) {
debugPrint(res.body);
return approveRejectPaymentRequestResponse.fromJson(jsonDecode(res.body));
return approveRejectPaymentRequestResponse.fromJson(
jsonDecode(res.body),
);
} else {
debugPrint("Null Response");
return null;
......@@ -1316,99 +1409,94 @@ class ApiCalling {
}
}
static Future<approveRejectPaymentRequestResponse?> RejectPaymentRequestSubmitAPI(
empId,
session,
mode,
payment_request_id,
approve_remarks,
) async {
static Future<approveRejectPaymentRequestResponse?>
RejectPaymentRequestSubmitAPI(
empId,
session,
mode,
payment_request_id,
approve_remarks,
) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
'type':'reject',
'mode':mode.toString(),
'type': 'reject',
'mode': mode.toString(),
'payment_request_id': (payment_request_id).toString(),
'approve_remarks':approve_remarks,
'approve_remarks': approve_remarks,
};
final res = await post(data, approveRejectPaymentRequestSubmitUrl, {});
if (res != null) {
debugPrint(res.body);
return approveRejectPaymentRequestResponse.fromJson(jsonDecode(res.body));
return approveRejectPaymentRequestResponse.fromJson(
jsonDecode(res.body),
);
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static Future<approveRejectPaymentRequestResponse?> ApprovePaymentRequestSubmitAPI(
empId,
session,
mode,
payment_request_id,
approved_amount,
approve_remarks,
proposed_payment_account_id,
) async {
static Future<approveRejectPaymentRequestResponse?>
ApprovePaymentRequestSubmitAPI(
empId,
session,
mode,
payment_request_id,
approved_amount,
approve_remarks,
proposed_payment_account_id,
) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
'type':'approve',
'mode':mode.toString(),
'type': 'approve',
'mode': mode.toString(),
'payment_request_id': (payment_request_id).toString(),
'approve_remarks':approve_remarks,
'proposed_payment_account_id':proposed_payment_account_id,
'approve_remarks': approve_remarks,
'proposed_payment_account_id': proposed_payment_account_id,
};
final res = await post(data, approveRejectPaymentRequestSubmitUrl, {});
if (res != null) {
debugPrint(res.body);
return approveRejectPaymentRequestResponse.fromJson(jsonDecode(res.body));
return approveRejectPaymentRequestResponse.fromJson(
jsonDecode(res.body),
);
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static Future<approveRejectPaymentRequestResponse?> processApproveRejectPaymentRequestSubmitAPI(
static Future<approveRejectPaymentRequestResponse?>
processApproveRejectPaymentRequestSubmitAPI(
empId,
session,
mode,
payment_request_id,
approved_amount,
approve_remarks,
proposed_payment_account_id,
payment_account_id,
processing_remarks,
attachment
mode,
payment_request_id,
payment_account_id,
processing_remarks,
attachment,
) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
'type':'approve',
'mode':mode.toString(),
'type': 'approve',
'mode': mode.toString(),
'payment_request_id': (payment_request_id).toString(),
'approved_amount':approved_amount,
'approve_remarks':approve_remarks,
'proposed_payment_account_id':proposed_payment_account_id,
'payment_account_id':payment_account_id,
'processing_remarks':processing_remarks,
'payment_account_id': payment_account_id,
'processing_remarks': processing_remarks,
};
var res;
if (attachment != null) {
......@@ -1429,4 +1517,94 @@ class ApiCalling {
return null;
}
}
static Future<paymentRequisitionPaymentsListResponse?> paymentRequisitionPaymentListAPI(empId,session,) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
};
final res = await post(data, paymentRequesitionPaymentsListUrl, {});
if (res != null) {
debugPrint(res.body);
return paymentRequisitionPaymentsListResponse.fromJson(
jsonDecode(res.body),
);
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static Future<paymentRequisitionPaymentsReceiptsListResponse?> paymentRequisitionPaymentReceiptListAPI(empId,session,) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
};
final res = await post(data, paymentRequesitionPaymentsReceiptsListUrl, {});
if (res != null) {
debugPrint(res.body);
return paymentRequisitionPaymentsReceiptsListResponse.fromJson(
jsonDecode(res.body),
);
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static Future<paymentRequisitionPaymentsDetailsResponse?> paymentRequisitionPaymentDetailsAPI(empId,session,payment_id) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
'payment_id': (payment_id).toString(),
};
final res = await post(data, paymentRequesitionPaymentsDetailsUrl, {});
if (res != null) {
debugPrint(res.body);
return paymentRequisitionPaymentsDetailsResponse.fromJson(
jsonDecode(res.body),
);
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static Future<paymentRequisitionPaymentsReceiptsDetailsResponse?> paymentRequisitionPaymentReceiptDetailsAPI(empId,session,payment_id) async {
try {
Map<String, String> data = {
'emp_id': (empId).toString(),
'session_id': (session).toString(),
'payment_receipt_id': (payment_id).toString(),
};
final res = await post(data, paymentRequesitionPaymentsReceiptsDetailsUrl, {});
if (res != null) {
debugPrint(res.body);
return paymentRequisitionPaymentsReceiptsDetailsResponse.fromJson(
jsonDecode(res.body),
);
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
}
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