Skip to content

Commit

Permalink
view 50% done
Browse files Browse the repository at this point in the history
  • Loading branch information
Sandaru-IT21001352 committed Oct 29, 2023
1 parent 1072f1b commit 032b57d
Show file tree
Hide file tree
Showing 21 changed files with 444 additions and 200 deletions.
4 changes: 3 additions & 1 deletion backend/src/__tests__/order-for-site-manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,9 @@ describe("order for site manager", () => {
describe("get all orders for site manager", () => {
describe("given the user is not logged in", () => {
it("should return a 403", async () => {
const { statusCode } = await supertest(app).get("/api/orders");
const { statusCode } = await supertest(app).get(
"/api/orders/site-manager"
);

expect(statusCode).toBe(403);
});
Expand Down
14 changes: 14 additions & 0 deletions backend/src/controller/deliveries-for-site-manager.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,20 @@ export async function markDeliveryAsReceivedHandler(
}
delivery.status = "received";
const updatedDelivery = await delivery.save();

//find all the deliveries with the order id
const deliveries = await getDeliveryList({
order: delivery.order,
lean: false,
});
//if all the deliveries are received, then change the order status to received
if (
deliveries.every((delivery) => delivery.status === "received") &&
delivery.order.status !== "received"
) {
delivery.order.status = "received";
await delivery.order.save();
}
return res.send(updatedDelivery);
} catch (error: any) {
logger.error(error);
Expand Down
1 change: 1 addition & 0 deletions backend/src/service/deliver.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export async function getDeliveryList(
return GoodsReceiptModel.find(query, {}, options)
.populate("items.item")
.populate("order")
.populate("supplier")
.exec();
}

Expand Down
37 changes: 37 additions & 0 deletions flutter_client/lib/blocs/goodReceipts/goods_receipt_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_client/models/goods_receipt.dart';
import 'package:flutter_client/repositiories/goods_receipt/base_goods_receipt_repository.dart';
import 'package:meta/meta.dart';

part 'goods_receipt_event.dart';
part 'goods_receipt_state.dart';

class GoodsReceiptBloc extends Bloc<GoodsReceiptEvent, GoodsReceiptState> {
final GoodsReceiptRepository _goodsReceiptRepository =
GoodsReceiptRepository();

GoodsReceiptBloc() : super(GoodsReceiptInitial()) {
on<GetGoodsReceiptsEvent>(_getGoodsReceiptsHandler);
}

// Load products
void _getGoodsReceiptsHandler(
GetGoodsReceiptsEvent event, Emitter<GoodsReceiptState> emit) async {
emit(
GoodsReceiptLoading(),
);

await _goodsReceiptRepository.getGoodsReceipts().then(
(goodsReceipts) {
emit(GoodsReceiptsLoaded(goodsReceipts: goodsReceipts));
},
).catchError(
(error) {
emit(
const GoodsReceiptError(
message: "Error loading goods receipts. Please try again."),
);
},
);
}
}
10 changes: 10 additions & 0 deletions flutter_client/lib/blocs/goodReceipts/goods_receipt_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
part of 'goods_receipt_bloc.dart';

@immutable
abstract class GoodsReceiptEvent {
const GoodsReceiptEvent();
}

class GetGoodsReceiptsEvent extends GoodsReceiptEvent {
const GetGoodsReceiptsEvent();
}
26 changes: 26 additions & 0 deletions flutter_client/lib/blocs/goodReceipts/goods_receipt_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
part of 'goods_receipt_bloc.dart';

@immutable
sealed class GoodsReceiptState {
const GoodsReceiptState();
}

final class GoodsReceiptInitial extends GoodsReceiptState {}

final class GoodsReceiptLoading extends GoodsReceiptState {}

final class GoodsReceiptError extends GoodsReceiptState {
final String message;

const GoodsReceiptError({
required this.message,
});
}

final class GoodsReceiptsLoaded extends GoodsReceiptState {
final List<GoodsReceipt> goodsReceipts;

const GoodsReceiptsLoaded({
required this.goodsReceipts,
});
}
11 changes: 5 additions & 6 deletions flutter_client/lib/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,15 @@ const Color kSurfaceColor = Color(0xFFF4F4F4);

//order status colors

const Color viewPending = Color(0xFFFFD700);
const Color kViewPendingColor = Color(0xFFFFD700);

const Color approvedAndOrderCompleted = Color(0xFF36CD1D);
const Color kApprovedAndOrderCompletedColor = Color(0xFF36CD1D);

const Color declined = Color(0xFFFF0000);
const Color kDeclined = Color(0xFFFF0000);

const Color placed = Color(0xFF0000FF);

const Color partialyDelivered = Color(0xFFFFA500);
const Color kPlaced = Color(0xFF0000FF);

const Color kPartiallyDelivered = Color(0xFFFFA500);

const String kLoginScreenTitle = 'Sign In';

Expand Down
4 changes: 4 additions & 0 deletions flutter_client/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_client/blocs/auth/auth_bloc.dart';
import 'package:flutter_client/blocs/cart/cart_bloc.dart';
import 'package:flutter_client/blocs/goodReceipts/goods_receipt_bloc.dart';
import 'package:flutter_client/blocs/order/order_bloc.dart';
import 'package:flutter_client/blocs/products/products_bloc.dart';
import 'package:flutter_client/blocs/site/site_bloc.dart';
Expand Down Expand Up @@ -30,6 +31,9 @@ void main() {
),
RepositoryProvider(
create: (context) => OrderBloc(),
),
RepositoryProvider(
create: (contest) => GoodsReceiptBloc(),
)
],
child: const ProcumentMobileApp(),
Expand Down
57 changes: 57 additions & 0 deletions flutter_client/lib/models/goods_receipt.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import 'package:flutter_client/models/product_model.dart';

enum GoodsReceiptStatus { pendingShipping, received }

class GoodsReceiptItem {
final Product item;
final int quantity;

GoodsReceiptItem({
required this.item,
required this.quantity,
});
}

class GoodsReceipt {
final String id;
final String supplier;
final String site;
final String siteManager;
final String goodsReceiptId;
final GoodsReceiptStatus status;
final List<GoodsReceiptItem> items;
final DateTime createdAt;

GoodsReceipt({
required this.id,
required this.supplier,
required this.site,
required this.siteManager,
required this.goodsReceiptId,
required this.status,
required this.items,
required this.createdAt,
});

factory GoodsReceipt.fromJson(Map<String, dynamic> json) {
return GoodsReceipt(
id: json['_id'],
supplier: json['supplier'],
site: json['site'],
siteManager: json['siteManager'],
goodsReceiptId: json['goodReceiptId'],
status: json['status'] == 'shipped'
? GoodsReceiptStatus.received
: GoodsReceiptStatus.pendingShipping,
items: json['items']
.map<GoodsReceiptItem>(
(item) => GoodsReceiptItem(
item: Product.fromJson(item['item']),
quantity: item['quantity'],
),
)
.toList(),
createdAt: DateTime.parse(json['createdAt']),
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import 'dart:convert';
import 'dart:developer' as developer;
import 'package:flutter_client/repositiories/paths.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';

import 'package:flutter_client/models/goods_receipt.dart';
import 'package:flutter_client/repositiories/goods_receipt/goods_receipt_repository.dart';

class GoodsReceiptRepository extends BaseGoodsReceiptRepository {
@override
Future<List<GoodsReceipt>> getGoodsReceipts() async {
final List<GoodsReceipt> goodsReceiptList = [];
final Uri goodsReceiptURL = Uri.https(hostName, getGoodsReceiptPath);

final sharedPreferences = await SharedPreferences.getInstance();
final token = sharedPreferences.getString('jwt');

final headers = <String, String>{
'Authorization': 'Bearer $token',
};

// send request to get all GOODS RECEIPTS
final responseBody = await http
.get(goodsReceiptURL, headers: headers)
.then((response) => response.body)
.catchError((error) {
developer.log(error);
throw Exception(error);
});
final decodedBody = jsonDecode(responseBody);

// get all GOODS RECEIPTS and add to list
try {
for (var goodsReceiptJson in decodedBody) {
final goodsReceipt = GoodsReceipt.fromJson(goodsReceiptJson);
goodsReceiptList.add(goodsReceipt);
}
} on TypeError catch (e) {
developer.log('Error decoding json', stackTrace: e.stackTrace, error: e);
throw Exception(e);
} on Exception catch (e) {
developer.log(e.toString());
throw Exception(e);
} catch (e) {
developer.log(e.toString());
throw Exception(e);
}

return goodsReceiptList;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'package:flutter_client/models/goods_receipt.dart';

abstract class BaseGoodsReceiptRepository {
Future<List<GoodsReceipt>> getGoodsReceipts();
}
1 change: 1 addition & 0 deletions flutter_client/lib/repositiories/paths.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ const String supplierPath = 'api/suppliers';
const String orderPath = 'api/orders';
const String authPath = 'api/login';
const String sitePath = 'api/sites';
const String getGoodsReceiptPath = '/api/site-manager/deliveries';
Loading

0 comments on commit 032b57d

Please sign in to comment.