You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

455 regels
14 KiB

  1. import 'dart:io';
  2. import 'package:path_provider/path_provider.dart';
  3. import 'package:dio/dio.dart';
  4. import 'package:file_picker/file_picker.dart';
  5. import 'package:qadirneyriz/config/config.dart';
  6. import 'package:qadirneyriz/models/private_meeting/one_private_meeting_model.dart';
  7. import 'package:qadirneyriz/models/private_meeting/private_meetings_model.dart';
  8. import 'package:qadirneyriz/setting/setting.dart';
  9. import 'package:qadirneyriz/utils/result/result.dart';
  10. class PrivateMeetingsApi {
  11. // get all
  12. Future<PrivateMeetingsModel> getPrivateMeetings({
  13. required int count,
  14. required int page,
  15. String? fromDate,
  16. String? toDate,
  17. int? location,
  18. int? subject,
  19. int? meetingManager,
  20. int? status,
  21. }) async {
  22. Map<String, String> headers = {
  23. 'Accept': 'application/json',
  24. };
  25. String dataToken = setting.userLocalDb.getUser().token!;
  26. if (dataToken != '') {
  27. headers['Authorization'] = "Bearer $dataToken";
  28. }
  29. final String link =
  30. "${config.network.baseUrl}private_meetings?lang=${setting.userLocalDb.getUser().language}";
  31. // print(
  32. // 'Parameters: count: $count, page: $page, fromDate: $fromDate, toDate: $toDate, location: $location, subject: $subject, meetingManager: $meetingManager, status: $status');
  33. final response = await Dio().get(link,
  34. options: Options(
  35. headers: headers,
  36. ),
  37. queryParameters: {
  38. 'count': count,
  39. 'page': page,
  40. 'date_meeting_az': fromDate,
  41. 'date_meeting_ta': toDate,
  42. 'location': location,
  43. 'subject': subject,
  44. 'meeting_manager': meetingManager,
  45. 'status': status,
  46. });
  47. final PrivateMeetingsModel privateMeetingsList =
  48. PrivateMeetingsModel.fromJson(response.data);
  49. return privateMeetingsList;
  50. }
  51. // add private meeting
  52. Future<Result> addPrivateMeetingApi({
  53. int? locationId,
  54. int? subjectId,
  55. int? managerId,
  56. required String fromHour,
  57. required String toHour,
  58. required String dateMeeting,
  59. required String visitorName,
  60. required String visitorMobile,
  61. required String visitorRole,
  62. required String visitorCompany,
  63. }) async {
  64. try {
  65. Map<String, String> headers = {"Accept": "application/json"};
  66. String dataToken = setting.userLocalDb.getUser().token!;
  67. if (dataToken != '') {
  68. headers['Authorization'] = "Bearer $dataToken";
  69. }
  70. FormData? formData;
  71. if (managerId != null) {
  72. formData = FormData.fromMap({
  73. 'locations_id': locationId,
  74. 'subject_id': subjectId,
  75. 'manager_id': managerId,
  76. 'az_hour': fromHour,
  77. 'ta_hour': toHour,
  78. 'date_meeting': dateMeeting,
  79. 'visit_name': visitorName,
  80. 'visit_mobile': visitorMobile,
  81. 'visit_role': visitorRole,
  82. 'visit_company': visitorCompany
  83. });
  84. } else {
  85. formData = FormData.fromMap({
  86. 'locations_id': locationId,
  87. 'subject_id': subjectId,
  88. 'az_hour': fromHour,
  89. 'ta_hour': toHour,
  90. 'date_meeting': dateMeeting,
  91. 'visit_name': visitorName,
  92. 'visit_mobile': visitorMobile,
  93. 'visit_role': visitorRole,
  94. 'visit_company': visitorCompany
  95. });
  96. }
  97. final res = await Dio().post(
  98. "${config.network.baseUrl}admin/add-private-meeting",
  99. data: formData,
  100. options: Options(headers: headers));
  101. if (res.statusCode == 200 || res.statusCode == 201) {
  102. return Result(isOk: true, message: res.data['message']);
  103. }
  104. } on DioException catch (e) {
  105. return Result(
  106. isOk: false,
  107. errors: e.response!.data['errors'],
  108. message: e.response!.data['message']);
  109. }
  110. return const Result(isOk: false);
  111. }
  112. // cancel private meeting
  113. Future<Result> cancelPrivateMeetingApi({
  114. required int id,
  115. }) async {
  116. try {
  117. Map<String, String> headers = {"Accept": "application/json"};
  118. String dataToken = setting.userLocalDb.getUser().token!;
  119. if (dataToken != '') {
  120. headers['Authorization'] = "Bearer $dataToken";
  121. }
  122. FormData? formData;
  123. formData = FormData.fromMap({
  124. 'meeting_id': id,
  125. });
  126. final res = await Dio().post(
  127. "${config.network.baseUrl}cancel-private-meeting",
  128. data: formData,
  129. options: Options(headers: headers));
  130. if (res.statusCode == 200 || res.statusCode == 201) {
  131. return Result(isOk: true, message: res.data['message']);
  132. }
  133. } on DioException catch (e) {
  134. return Result(
  135. isOk: false,
  136. errors: e.response!.data['errors'],
  137. message: e.response!.data['message']);
  138. }
  139. return const Result(isOk: false);
  140. }
  141. // delete private meeting
  142. Future<Result> deletePrivateMeetingApi({
  143. required int id,
  144. }) async {
  145. try {
  146. Map<String, String> headers = {"Accept": "application/json"};
  147. String dataToken = setting.userLocalDb.getUser().token!;
  148. if (dataToken != '') {
  149. headers['Authorization'] = "Bearer $dataToken";
  150. }
  151. final res = await Dio().post(
  152. "${config.network.baseUrl}admin/delete-private-meeting/${id}",
  153. options: Options(headers: headers));
  154. if (res.statusCode == 200 || res.statusCode == 201) {
  155. return Result(isOk: true, message: res.data['message']);
  156. }
  157. } on DioException catch (e) {
  158. return Result(
  159. isOk: false,
  160. errors: e.response!.data['errors'],
  161. message: e.response!.data['message']);
  162. }
  163. return const Result(isOk: false);
  164. }
  165. // accept private meeting
  166. Future<Result> acceptPrivateMeetingApi({
  167. required int id,
  168. }) async {
  169. try {
  170. Map<String, String> headers = {"Accept": "application/json"};
  171. String dataToken = setting.userLocalDb.getUser().token!;
  172. if (dataToken != '') {
  173. headers['Authorization'] = "Bearer $dataToken";
  174. }
  175. FormData? formData;
  176. formData = FormData.fromMap({
  177. 'meeting_id': id,
  178. });
  179. final res = await Dio().post(
  180. "${config.network.baseUrl}accept-private-meeting",
  181. data: formData,
  182. options: Options(headers: headers));
  183. if (res.statusCode == 200 || res.statusCode == 201) {
  184. return Result(isOk: true, message: res.data['message']);
  185. }
  186. } on DioException catch (e) {
  187. return Result(
  188. isOk: false,
  189. errors: e.response!.data['errors'],
  190. message: e.response!.data['message']);
  191. }
  192. return const Result(isOk: false);
  193. }
  194. // get one private meeting
  195. Future<OnePrivateMeetingModel> getOnePrivateMeeting(
  196. {required final int id}) async {
  197. Map<String, String> headers = {
  198. 'Accept': 'application/json',
  199. };
  200. String dataToken = setting.userLocalDb.getUser().token!;
  201. if (dataToken != '') {
  202. headers['Authorization'] = "Bearer $dataToken";
  203. }
  204. final String link =
  205. "${config.network.baseUrl}private-meeting/$id?lang=${setting.userLocalDb.getUser().language}";
  206. final response = await Dio().get(
  207. link,
  208. options: Options(
  209. headers: headers,
  210. ),
  211. );
  212. final OnePrivateMeetingModel onePrivateMeet =
  213. OnePrivateMeetingModel.fromJson(response.data);
  214. return onePrivateMeet;
  215. }
  216. // edit private meeting
  217. Future<Result> editPrivateMeetingApi({
  218. required int id,
  219. required int locationId,
  220. required int subjectId,
  221. required int managerId,
  222. required String fromHour,
  223. required String toHour,
  224. required String dateMeeting,
  225. required String visitorName,
  226. required String visitorMobile,
  227. required String visitorRole,
  228. required String visitorCompany,
  229. }) async {
  230. try {
  231. Map<String, String> headers = {"Accept": "application/json"};
  232. String dataToken = setting.userLocalDb.getUser().token!;
  233. if (dataToken != '') {
  234. headers['Authorization'] = "Bearer $dataToken";
  235. }
  236. FormData? formData;
  237. formData = FormData.fromMap({
  238. 'id': id,
  239. 'locations_id': locationId,
  240. 'subject_id': subjectId,
  241. 'manager_id': managerId,
  242. 'az_hour': fromHour,
  243. 'ta_hour': toHour,
  244. 'date_meeting': dateMeeting,
  245. 'visit_name': visitorName,
  246. 'visit_mobile': visitorMobile,
  247. 'visit_role': visitorRole,
  248. 'visit_company': visitorCompany
  249. });
  250. final res = await Dio().post(
  251. "${config.network.baseUrl}admin/edit-private-meeting",
  252. data: formData,
  253. options: Options(headers: headers));
  254. if (res.statusCode == 200 || res.statusCode == 201) {
  255. return Result(isOk: true, message: res.data['message']);
  256. }
  257. } on DioException catch (e) {
  258. return Result(
  259. isOk: false,
  260. errors: e.response!.data['errors'],
  261. message: e.response!.data['message']);
  262. }
  263. return const Result(isOk: false);
  264. }
  265. // add private meeting minutes
  266. Future<Result> addMeetingMinuteApi({
  267. required int id,
  268. required String description,
  269. required List<PlatformFile> meetingFiles, // List of PlatformFile
  270. }) async {
  271. try {
  272. Map<String, String> headers = {"Accept": "application/json"};
  273. String dataToken = setting.userLocalDb.getUser().token!;
  274. if (dataToken.isNotEmpty) {
  275. headers['Authorization'] = "Bearer $dataToken";
  276. }
  277. // Create FormData
  278. FormData formData = FormData();
  279. // Add id and description fields
  280. formData.fields.add(MapEntry('id', id.toString()));
  281. formData.fields.add(MapEntry('description', description));
  282. // Check if meetingFiles is not empty and add files to FormData
  283. if (meetingFiles.isNotEmpty) {
  284. for (var file in meetingFiles) {
  285. if (file.path != null) {
  286. // Ensure that the file path is not null
  287. formData.files.add(
  288. MapEntry(
  289. 'meeting_files[]', await MultipartFile.fromFile(file.path!)),
  290. );
  291. }
  292. }
  293. }
  294. // Send request
  295. final res = await Dio().post(
  296. "${config.network.baseUrl}admin/add-private-meeting-minutes",
  297. data: formData,
  298. options: Options(headers: headers),
  299. );
  300. // Check response status
  301. if (res.statusCode == 200 || res.statusCode == 201) {
  302. return Result(isOk: true, message: res.data['message']);
  303. }
  304. } on DioException catch (e) {
  305. return Result(
  306. isOk: false,
  307. errors: e.response?.data['errors'],
  308. message: e.response?.data['message'],
  309. );
  310. }
  311. return const Result(isOk: false);
  312. }
  313. // download meeting summary
  314. Future<Result?> downloadSummary(
  315. {required int id, String? format = 'zip'}) async {
  316. try {
  317. final Map<String, String> headers = {"Accept": "application/json"};
  318. String dataToken = setting.userLocalDb.getUser().token!;
  319. if (dataToken != '') {
  320. headers['Authorization'] = "Bearer $dataToken";
  321. }
  322. final Directory tempDir = await getApplicationDocumentsDirectory();
  323. final String tempPath = tempDir.path;
  324. final String savePath = '$tempPath/sammary_$id.$format';
  325. final res = await Dio().download(
  326. '${config.network.baseUrl}private-download-minutes/$id',
  327. savePath,
  328. options: Options(headers: headers),
  329. );
  330. if (res.statusCode == 200 || res.statusCode == 201) {
  331. return Result(isOk: true, message: savePath);
  332. } else {
  333. return Result(
  334. isOk: false, message: 'Failed with status code: ${res.statusCode}');
  335. }
  336. } on DioException catch (e) {
  337. return Result(
  338. isOk: false,
  339. errors: e.response?.data['errors'],
  340. message:
  341. e.response?.data['message'] ?? 'An error occurred during download.',
  342. );
  343. }
  344. }
  345. // get String file of summary
  346. Future<List<String>> getListStringFils({required int id}) async {
  347. Map<String, String> headers = {
  348. 'Accept': 'application/json',
  349. };
  350. String dataToken = setting.userLocalDb.getUser().token!;
  351. if (dataToken.isNotEmpty) {
  352. headers['Authorization'] = "Bearer $dataToken";
  353. }
  354. // ساخت لینک API
  355. final String link =
  356. "${config.network.baseUrl}admin/all-private-meeting-minutes/$id";
  357. // فراخوانی API
  358. final response = await Dio().get(
  359. link,
  360. options: Options(
  361. headers: headers,
  362. ),
  363. );
  364. print('${response.data} response.data');
  365. // بررسی ساختار پاسخ و تبدیل داده‌ها
  366. if (response.data is List) {
  367. return List<String>.from(response.data);
  368. } else {
  369. return [];
  370. }
  371. }
  372. // delete file of summary
  373. Future<Result> deleteFileSummary({
  374. required int id,
  375. required String text,
  376. }) async {
  377. try {
  378. Map<String, String> headers = {"Accept": "application/json"};
  379. String dataToken = setting.userLocalDb.getUser().token!;
  380. if (dataToken.isNotEmpty) {
  381. headers['Authorization'] = "Bearer $dataToken";
  382. }
  383. // Create FormData
  384. FormData formData = FormData();
  385. // Send request
  386. final link =
  387. "${config.network.baseUrl}admin/delete-private-meeting-minutes/$id/$text";
  388. print('${link}');
  389. final res = await Dio().get(
  390. link,
  391. data: formData,
  392. options: Options(headers: headers),
  393. );
  394. // Check response status
  395. if (res.statusCode == 200 || res.statusCode == 201) {
  396. return Result(isOk: true, message: res.data['message']);
  397. }
  398. } on DioException catch (e) {
  399. print(e);
  400. return Result(
  401. isOk: false,
  402. errors: e.response?.data['errors'],
  403. message: e.response?.data['message'],
  404. );
  405. }
  406. return const Result(isOk: false);
  407. }
  408. }