diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index aa7daf49cd0c70dc0b91b97e5b216d89ebc74e12..a79fbc36c3f301bab70c2b433f87b10619ac8696 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -145,7 +145,7 @@ build-web-release:
     - mkdir -p ~/.ssh
     - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
     - ssh-keyscan -t rsa "$prod_ip" >> ~/.ssh/known_hosts
-    - scp -r "$username_prod@$prod_ip":~/web build/web
+    - scp -r build/web "$username_prod@$prod_ip":~/
     - ssh "$username_prod@$prod_ip" 'sudo bash /var/www/sites/siaga-wabah/deployment.sh'
   only:
     - release
\ No newline at end of file
diff --git a/functions/src/index.ts b/functions/src/index.ts
index cf85d9bf266af61875b5f3da7bb88ab23f502f1a..ac71938014f48eae6cf8a6e61c16f8b1d1293057 100644
--- a/functions/src/index.ts
+++ b/functions/src/index.ts
@@ -12,6 +12,14 @@ function getNotifikasiId(time : Date, path : String) {
     return `${time.toISOString()}-${newPath}`;
 }
 
+function getKetersediaanId(type : String, providerId : number, barangId : number) {
+    return `${type}-${providerId}-barang-${barangId}`;
+}
+
+function getAgregasiId(itemId : number) {
+    return `item-${itemId}`;
+}
+
 export const notifyNewInstitusi = functions.firestore
     .document('waspada/covid19/institusi/{id}')
     .onCreate((snapshot, context) => {
@@ -143,3 +151,83 @@ export const notifyNewBarangHomeIndustry = functions.firestore
 
         return handler(snapshot, context);
     });
+
+export const createKetersediaanFromSupplierBarang = functions.firestore
+    .document('/waspada/covid19/supplier/{supplierId}/barang/{barangId}')
+    .onCreate((snapshot, context) => {
+        const handler = async (_snapshot : firestore.DocumentSnapshot, _context : functions.EventContext) => {
+            const barang = _snapshot.data();
+            const item = (await barang?.item.get()).data();
+            const supplier = (await _snapshot.ref.parent.parent?.get())?.data();
+
+            const supplierId = _context.params.supplierId;
+            const barangId = _context.params.barangId;
+            const ketersediaanId = getKetersediaanId('supplier', supplierId, barangId);
+
+            return firestore().doc(FIRESTORE_PREFIX + 'agregrasi-ketersediaan/' + ketersediaanId).set({
+                barang: _snapshot.ref,
+                harga: barang?.harga,
+                nama_item: item.nama,
+                nama_supplier: supplier?.nama,
+                stok: barang?.stok,
+                supplier: _snapshot.ref.parent.parent,
+                lastUpdated: _snapshot.updateTime
+            });
+        }
+
+        return handler(snapshot, context);
+    });
+
+export const updateKetersediaanFromSupplierBarang = functions.firestore
+    .document('/waspada/covid19/supplier/{supplierId}/barang/{barangId}')
+    .onUpdate((snapshot, context) => {
+        const handler = async (_snapshot : functions.Change<firestore.DocumentSnapshot>, _context : functions.EventContext) => {
+            const barang = _snapshot.after.data();
+            const item = (await barang?.item.get()).data();
+            const supplier = (await _snapshot.after.ref.parent.parent?.get())?.data();
+
+            const supplierId = _context.params.supplierId;
+            const barangId = _context.params.barangId;
+            const ketersediaanId = getKetersediaanId('supplier', supplierId, barangId);
+
+            return firestore().doc(FIRESTORE_PREFIX + 'agregrasi-ketersediaan/' + ketersediaanId).set({
+                barang: _snapshot.after.ref,
+                harga: barang?.harga,
+                nama_item: item.nama,
+                nama_supplier: supplier?.nama,
+                stok: barang?.stok,
+                supplier: _snapshot.after.ref.parent.parent,
+                lastUpdated: _snapshot.after.updateTime
+            });
+        }
+
+        return handler(snapshot, context);
+    });
+
+export const deleteKetersediaanFromSupplierBarang = functions.firestore
+    .document('/waspada/covid19/supplier/{supplierId}/barang/{barangId}')
+    .onDelete((snapshot, context) => {
+        const supplierId = context.params.supplierId;
+        const barangId = context.params.barangId;
+        const ketersediaanId = getKetersediaanId('supplier', supplierId, barangId);
+
+        return firestore().doc(FIRESTORE_PREFIX + 'agregrasi-ketersediaan/' + ketersediaanId).delete();
+    });
+
+export const aggregateKebutuhanInstitusi = functions.firestore
+    .document('/waspada/covid19/institusi/{institusiId}/kebutuhan/{kebutuhanId}')
+    .onWrite((snapshot, context) => {
+        const handler = async (kebutuhan : firestore.DocumentData | undefined, increment : boolean) => {
+            if (kebutuhan?.item) {
+                return firestore().doc(FIRESTORE_PREFIX + 'agregasi/' + getAgregasiId(kebutuhan.item.id)).set({
+                    item: kebutuhan.item,
+                    kebutuhan: firestore.FieldValue.increment((increment ? 1 : -1) * kebutuhan.kebutuhan),
+                    terpenuhi: firestore.FieldValue.increment((increment ? 1 : -1) * kebutuhan.terpenuhi)
+                }, {merge: true});
+            }
+
+            return null;
+        };
+
+        return handler(snapshot.before.data(), false).then(() => handler(snapshot.after.data(), true));
+    });
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 14e514fa31ab80ec07e4d63bd92c8a1aa956090a..cedf6f51e3e777287cb763f07843878a5edcddc2 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -315,7 +315,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.example.mobileApps;
+				PRODUCT_BUNDLE_IDENTIFIER = id.ac.ui.cs.sigap;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_VERSION = 5.0;
@@ -453,7 +453,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.example.mobileApps;
+				PRODUCT_BUNDLE_IDENTIFIER = id.ac.ui.cs.sigap;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -483,9 +483,10 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
 				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.example.mobileApps;
+				PRODUCT_BUNDLE_IDENTIFIER = id.ac.ui.cs.sigap;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+				DEVELOPMENT_TEAM = 88Q75CKN7W;
 				SWIFT_VERSION = 5.0;
 				VERSIONING_SYSTEM = "apple-generic";
 			};
diff --git a/lib/src/components/progressbar/progressbar.dart b/lib/src/components/progressbar/progressbar.dart
index a1f426fa7f99778b235f6d712430120699bc9f10..fab09bbdb268d06b9c0e7de71248971981b102d5 100644
--- a/lib/src/components/progressbar/progressbar.dart
+++ b/lib/src/components/progressbar/progressbar.dart
@@ -43,5 +43,12 @@ class ProgressBar extends StatelessWidget {
 }
 
 double _getProgress({BuildContext context, int available, int total}) {
-  return MediaQuery.of(context).size.width * (available / total);
+  if (available == 0 && total == 0){
+    return MediaQuery.of(context).size.width * 0;
+  }else {
+    return MediaQuery
+        .of(context)
+        .size
+        .width * (available / total);
+  }
 }
diff --git a/lib/src/screens/home/home_screen.dart b/lib/src/screens/home/home_screen.dart
index d04992759b06b5a255c9159d8a8d8977c3532b4c..6634c05f6005b97ab7ea79afc045d1479b62f0dc 100644
--- a/lib/src/screens/home/home_screen.dart
+++ b/lib/src/screens/home/home_screen.dart
@@ -4,8 +4,7 @@ import 'package:flutter/widgets.dart';
 import 'package:mobile_apps/src/common/constants.dart';
 import 'package:mobile_apps/src/screens/home/home_industry/list_home_industry.dart';
 import 'package:mobile_apps/src/screens/home/institusi/list_institusi.dart';
-/* TODO remove comment after Agregasi feature ready
-import 'package:mobile_apps/src/screens/home/inventories/inventories.dart'; */
+import 'package:mobile_apps/src/screens/home/inventories/inventories.dart';
 import 'package:mobile_apps/src/screens/home/kontak/kontak.dart';
 import 'package:mobile_apps/src/screens/supplier/list_supplier.dart';
 import 'package:mobile_apps/src/services/auth_service.dart';
@@ -27,12 +26,11 @@ class HomeScreen extends StatelessWidget {
               style: Theme.of(context).textTheme.subtitle1,
               textAlign: TextAlign.left,
             ),
-          /* TODO remove comment after Agregasi feature ready
           Container(
             padding: EdgeInsets.only(top: 31, left: 20, right: 20, bottom: 13),
             color: Colors.white,
             child: InventoriesWidget(),
-          ),*/
+          ),
           Container(
               padding: EdgeInsets.symmetric(
                   horizontal: MarginConstants.horizontalFromScreen,
diff --git a/lib/src/screens/homeindustry/product/product_home_industry.dart b/lib/src/screens/homeindustry/product/product_home_industry.dart
index c9110434e4bddbb5b4a193b5456d60ed404fb10d..9a24aba65570adf3461a7c29fb2f4a2761a622d2 100644
--- a/lib/src/screens/homeindustry/product/product_home_industry.dart
+++ b/lib/src/screens/homeindustry/product/product_home_industry.dart
@@ -46,7 +46,7 @@ class ProductHomeIndustryWidget extends StatelessWidget {
                     return Center(child: CircularProgressIndicator());
                   }
                   final item = itemRepository.item(snapshot);
-                  return _description('Jenis Produk', '${item.nama} buah');
+                  return _description('Jenis Produk', '${item.nama}');
                 }),
             _description('Kapasitas Produksi',
                 '${product.kapasitas} pcs/${product.durasi}'),
diff --git a/pubspec.lock b/pubspec.lock
index 860eebfa42437c31a8fbdb1df03fa3f2a3715b13..1e7a036a73ac1a4c4c9912ebc96063cbf0cafbdb 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -36,13 +36,6 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.4.0"
-  bloc:
-    dependency: transitive
-    description:
-      name: bloc
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "3.0.0"
   boolean_selector:
     dependency: transitive
     description:
@@ -307,13 +300,6 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
-  flutter_bloc:
-    dependency: "direct main"
-    description:
-      name: flutter_bloc
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "3.2.0"
   flutter_cache_manager:
     dependency: transitive
     description:
@@ -457,13 +443,6 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "3.2.5"
-  localstorage:
-    dependency: "direct main"
-    description:
-      name: localstorage
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "3.0.1+4"
   logging:
     dependency: transitive
     description:
@@ -625,13 +604,6 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.0.5"
-  rxdart:
-    dependency: transitive
-    description:
-      name: rxdart
-      url: "https://pub.dartlang.org"
-    source: hosted
-    version: "0.23.1"
   screenshot:
     dependency: "direct main"
     description:
@@ -673,7 +645,7 @@ packages:
     source: hosted
     version: "1.5.5"
   sqflite:
-    dependency: "direct main"
+    dependency: transitive
     description:
       name: sqflite
       url: "https://pub.dartlang.org"
diff --git a/pubspec.yaml b/pubspec.yaml
index 2be2573bbcdd3ec73844f3609dafb9be054a2e7b..ef481d9dd10c96fecb13d6f3f215f5ded89e77fc 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,7 +11,7 @@ description: A health care equipment marketplace to help COVID-19 situation.
 # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
 # Read more about iOS versioning at
 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
-version: 1.0.0+1
+version: 1.0.0+4
 
 environment:
   sdk: ">=2.7.0 <3.0.0"
diff --git a/scripts/package.json b/scripts/package.json
deleted file mode 100644
index c29d74920c10c23ab46c61879648c7bc3dd56a54..0000000000000000000000000000000000000000
--- a/scripts/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "dependencies": {
-    "firestore-export-import": "^0.4.0",
-    "node-firestore-import-export": "^0.14.1"
-  }
-}