You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			247 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			247 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Dart
		
	
import 'dart:io';
 | 
						|
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:provider/provider.dart';
 | 
						|
import 'package:test_sa/controllers/providers/api/parts_provider.dart';
 | 
						|
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
 | 
						|
import 'package:test_sa/controllers/providers/api/user_provider.dart';
 | 
						|
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
 | 
						|
import 'package:test_sa/extensions/context_extension.dart';
 | 
						|
import 'package:test_sa/extensions/int_extensions.dart';
 | 
						|
import 'package:test_sa/extensions/text_extensions.dart';
 | 
						|
import 'package:test_sa/extensions/widget_extensions.dart';
 | 
						|
import 'package:test_sa/models/device/asset.dart';
 | 
						|
import 'package:test_sa/models/service_request/service_report.dart';
 | 
						|
import 'package:test_sa/new_views/app_style/app_color.dart';
 | 
						|
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
 | 
						|
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
 | 
						|
import 'package:test_sa/providers/loading_list_notifier.dart';
 | 
						|
import 'package:test_sa/providers/work_order/reason_provider.dart';
 | 
						|
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
 | 
						|
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
 | 
						|
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
 | 
						|
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
 | 
						|
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
 | 
						|
import '../../../../../models/lookup.dart';
 | 
						|
import '../../../../../models/service_request/spare_parts.dart';
 | 
						|
import '../../../../../new_views/common_widgets/app_text_form_field.dart';
 | 
						|
import '../../../../../new_views/common_widgets/default_app_bar.dart';
 | 
						|
import '../../../controllers/validator/validator.dart';
 | 
						|
 | 
						|
class SparePartRequest extends StatefulWidget {
 | 
						|
  static const String id = "/verify-assets-detail";
 | 
						|
 | 
						|
  const SparePartRequest({Key key}) : super(key: key);
 | 
						|
 | 
						|
  @override
 | 
						|
  _SparePartRequestState createState() => _SparePartRequestState();
 | 
						|
}
 | 
						|
 | 
						|
class _SparePartRequestState extends State<SparePartRequest> with TickerProviderStateMixin {
 | 
						|
  UserProvider _userProvider;
 | 
						|
  SettingProvider _settingProvider;
 | 
						|
  ServiceRequestsProvider _serviceRequestsProvider;
 | 
						|
  ServiceStatusProvider _assetTypeProvider;
 | 
						|
  PartsProvider _partsProvider;
 | 
						|
  ServiceReport _serviceReport;
 | 
						|
  bool _isLoading = false;
 | 
						|
  List<SparePart> _spareParts = [];
 | 
						|
 | 
						|
  final List<File> _files = [];
 | 
						|
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
 | 
						|
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 | 
						|
  final TextEditingController _faultController = TextEditingController();
 | 
						|
  final TextEditingController _workPreformedController = TextEditingController();
 | 
						|
  final TextEditingController _partQtyController = TextEditingController();
 | 
						|
  final TextEditingController _oracleNoController = TextEditingController();
 | 
						|
 | 
						|
  @override
 | 
						|
  void initState() {
 | 
						|
    _serviceReport = ServiceReport(
 | 
						|
      // returnToService: DateTime.now(),
 | 
						|
      // //type: const Lookup(value: 2),
 | 
						|
      // device: widget.request.device,
 | 
						|
      sparePartsWorkOrders: [],
 | 
						|
    );
 | 
						|
    super.initState();
 | 
						|
    if (context.mounted) {
 | 
						|
      ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
 | 
						|
      Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
 | 
						|
      Provider.of<ReasonProvider>(context, listen: false).reset();
 | 
						|
      Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id;
 | 
						|
    }
 | 
						|
    // _isLoading = true;
 | 
						|
  }
 | 
						|
 | 
						|
  Asset loanAvailabilityAsset;
 | 
						|
 | 
						|
  @override
 | 
						|
  void dispose() {
 | 
						|
    _faultController.dispose();
 | 
						|
    _workPreformedController.dispose();
 | 
						|
    _partQtyController.dispose();
 | 
						|
    super.dispose();
 | 
						|
  }
 | 
						|
 | 
						|
  void getRequestForWorkOrder() async {
 | 
						|
    _isLoading = true;
 | 
						|
    setState(() {});
 | 
						|
    ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
 | 
						|
    _serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id);
 | 
						|
    await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
 | 
						|
    _serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
 | 
						|
    _serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
 | 
						|
    _serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
 | 
						|
    _spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest.deviceId);
 | 
						|
    _isLoading = false;
 | 
						|
    setState(() {});
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    _userProvider = Provider.of<UserProvider>(context);
 | 
						|
    _settingProvider = Provider.of<SettingProvider>(context);
 | 
						|
    _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
 | 
						|
    _assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
 | 
						|
    _partsProvider = Provider.of<PartsProvider>(context);
 | 
						|
    if (_serviceReport.callRequest == null) {
 | 
						|
      getRequestForWorkOrder();
 | 
						|
    }
 | 
						|
    _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
 | 
						|
      (element) => element.value == _serviceReport.callRequest?.assetType,
 | 
						|
      orElse: () => null,
 | 
						|
    );
 | 
						|
 | 
						|
    return Scaffold(
 | 
						|
      key: _scaffoldKey,
 | 
						|
      appBar: DefaultAppBar(title: context.translation.sparePartRequest),
 | 
						|
      body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
 | 
						|
        return SafeArea(
 | 
						|
          child: LoadingManager(
 | 
						|
            isLoading: _isLoading,
 | 
						|
            isFailedLoading: false,
 | 
						|
            stateCode: 200,
 | 
						|
            onRefresh: () async {},
 | 
						|
            child: Form(
 | 
						|
              key: _formKey,
 | 
						|
              child: Column(
 | 
						|
                children: [
 | 
						|
                  SingleChildScrollView(
 | 
						|
                    child: Column(
 | 
						|
                      crossAxisAlignment: CrossAxisAlignment.stretch,
 | 
						|
                      children: [
 | 
						|
                        Card(
 | 
						|
                          child: Column(
 | 
						|
                            crossAxisAlignment: CrossAxisAlignment.stretch,
 | 
						|
                            children: [
 | 
						|
                              context.translation.sparePartDetails.heading5(context),
 | 
						|
                              12.height,
 | 
						|
                              SingleItemDropDownMenu<SparePart, NullableLoadingProvider>(
 | 
						|
                                context: context,
 | 
						|
                                title: context.translation.partNo,
 | 
						|
                                staticData: _spareParts,
 | 
						|
                                height: 80.toScreenHeight,
 | 
						|
                                showShadow: false,
 | 
						|
                                initialValue: serviceRequestProvider.initialSelectedSparePart.sparePart,
 | 
						|
                                backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
 | 
						|
                                onSelect: (part) {
 | 
						|
                                  serviceRequestProvider.initialSelectedSparePart = SparePartsWorkOrders(id: 0, sparePart: part, qty: 0);
 | 
						|
                                },
 | 
						|
                              ),
 | 
						|
                              15.height,
 | 
						|
                              AppTextFormField(
 | 
						|
                                controller: _partQtyController,
 | 
						|
                                labelText: context.translation.quantity,
 | 
						|
                                textInputType: TextInputType.number,
 | 
						|
                                contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
 | 
						|
                                showWithoutDecoration: true,
 | 
						|
                                backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
 | 
						|
                                enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
 | 
						|
                                validator: (value) => value == null || value.isEmpty
 | 
						|
                                    ? context.translation.requiredField
 | 
						|
                                    : Validator.isNumeric(value)
 | 
						|
                                        ? null
 | 
						|
                                        : context.translation.onlyNumbers,
 | 
						|
                                onSaved: (text) {
 | 
						|
                                  serviceRequestProvider.initialSelectedSparePart.qty = num.tryParse(text ?? "");
 | 
						|
                                },
 | 
						|
                              ),
 | 
						|
                              15.height,
 | 
						|
                              AppTextFormField(
 | 
						|
                                controller: _oracleNoController,
 | 
						|
                                labelText: context.translation.oracleNo,
 | 
						|
                                textInputType: TextInputType.number,
 | 
						|
                                contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
 | 
						|
                                showWithoutDecoration: true,
 | 
						|
                                backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
 | 
						|
                                enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
 | 
						|
                                validator: (value) => value == null || value.isEmpty
 | 
						|
                                    ? context.translation.requiredField
 | 
						|
                                    : Validator.isNumeric(value)
 | 
						|
                                        ? null
 | 
						|
                                        : context.translation.onlyNumbers,
 | 
						|
                                onSaved: (text) {
 | 
						|
                                  //TODO set the values...
 | 
						|
                                  // serviceRequestProvider.initialSelectedSparePart. = num.tryParse(text ?? "");
 | 
						|
                                },
 | 
						|
                              ),
 | 
						|
                              15.height,
 | 
						|
                              AppTextFormField(
 | 
						|
                                initialValue: _serviceReport?.comment,
 | 
						|
                                backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
 | 
						|
                                labelText: context.translation.description,
 | 
						|
                                alignLabelWithHint: true,
 | 
						|
                                showWithoutDecoration: true,
 | 
						|
                                textInputType: TextInputType.multiline,
 | 
						|
                                onSaved: (value) {
 | 
						|
                                  _serviceReport.comment = value;
 | 
						|
                                },
 | 
						|
                              ),
 | 
						|
                              15.height,
 | 
						|
                              MultiFilesPicker(label: context.translation.attachQuotation, files: _files),
 | 
						|
                            ],
 | 
						|
                          ).paddingAll(16),
 | 
						|
                        ),
 | 
						|
                        8.height,
 | 
						|
                      ],
 | 
						|
                    ),
 | 
						|
                  ).expanded,
 | 
						|
                  AppFilledButton(
 | 
						|
                    label: context.translation.addSparePartActivity,
 | 
						|
                    buttonColor: AppColor.green70,
 | 
						|
                    onPressed: () async {
 | 
						|
                      ServiceRequestBottomSheet.actionBottomSheet(context: context, title: context.translation.addSparePartActionHeading);
 | 
						|
                      // bool shouldReloadData = (await showModalBottomSheet(
 | 
						|
                      //   context: context,
 | 
						|
                      //   useSafeArea: true,
 | 
						|
                      //   isScrollControlled: true,
 | 
						|
                      //   backgroundColor: Colors.transparent,
 | 
						|
                      //   builder: (context) => ActionBottomSheet(title: context.translation.addSparePartActionHeading),
 | 
						|
                      // )) as bool;
 | 
						|
                      // if (shouldReloadData ?? false) {}
 | 
						|
                      //TODO write add sparepart logic
 | 
						|
 | 
						|
                      // if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) {
 | 
						|
                      //   setState(() {});
 | 
						|
                      //   return;
 | 
						|
                      // }
 | 
						|
                      // _formKey.currentState.save();
 | 
						|
                      // _serviceReport.attachmentsWorkOrder ??= [];
 | 
						|
                      // if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = [];
 | 
						|
                      // for (var file in _files) {
 | 
						|
                      //   _serviceReport.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
 | 
						|
                      // }
 | 
						|
                      // final user = Provider.of<UserProvider>(context, listen: false).user;
 | 
						|
                      // await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user);
 | 
						|
                    },
 | 
						|
                  ),
 | 
						|
                ],
 | 
						|
              ).paddingAll(16),
 | 
						|
            ),
 | 
						|
          ),
 | 
						|
        );
 | 
						|
      }),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |