diff --git a/android/app/build.gradle b/android/app/build.gradle index 646f89e..915f0d4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -130,10 +130,10 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion compileSdkVersion rootProject.ext.compileSdkVersion - + // TODO: Switch from test to prod and vice versa defaultConfig { - // applicationId "com.test_city.douala3" - applicationId "com.test_city.douala3test" + applicationId "com.test_city.douala4" + // applicationId "com.test_city.douala4test" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion missingDimensionStrategy 'react-native-camera', 'general' diff --git a/android/app/src/main/java/com/test/ilinkcity_douala3/MainActivity.java b/android/app/src/main/java/com/test/ilinkcity_douala3/MainActivity.java index 3f9aa08..48c9598 100644 --- a/android/app/src/main/java/com/test/ilinkcity_douala3/MainActivity.java +++ b/android/app/src/main/java/com/test/ilinkcity_douala3/MainActivity.java @@ -13,7 +13,7 @@ public class MainActivity extends ReactActivity { */ @Override protected String getMainComponentName() { - return "ilinkcity_douala3"; + return "ilinkcity_douala4"; } @Override diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index ede7f3c..91ad80e 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 65386ca..01e58bf 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 06884cf..6360010 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index e9c09ae..5a4b104 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 619ec0c..15755c2 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index e95fb8e..2e7d018 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ - Test SIM_ba mobile CAD3 - + + + SIM_ba mobile CAD4 diff --git a/app.json b/app.json index 9d4c142..7e1f9e3 100644 --- a/app.json +++ b/app.json @@ -1,4 +1,4 @@ { - "name": "ilinkcity_douala3", - "displayName": "ilinkcity_douala3" + "name": "ilinkcity_douala4", + "displayName": "ilinkcity_douala4" } \ No newline at end of file diff --git a/app/assets/img/icon3.png b/app/assets/img/icon3.png index a0b3ca5..073734d 100644 Binary files a/app/assets/img/icon3.png and b/app/assets/img/icon3.png differ diff --git a/app/assets/img/logo.png b/app/assets/img/logo.png index 861148a..ebfe0a7 100644 Binary files a/app/assets/img/logo.png and b/app/assets/img/logo.png differ diff --git a/app/assets/img/png/wallet.png b/app/assets/img/png/wallet.png index cb1cb71..ebfe0a7 100644 Binary files a/app/assets/img/png/wallet.png and b/app/assets/img/png/wallet.png differ diff --git a/app/screens/account/AddNetwork.js b/app/screens/account/AddNetwork.js index a2b4b5a..f867bbb 100644 --- a/app/screens/account/AddNetwork.js +++ b/app/screens/account/AddNetwork.js @@ -19,6 +19,7 @@ import {ProgressDialog} from "react-native-simple-dialogs"; import axios from "axios"; import {uploadImage} from "../../webservice/IlinkConstants"; import Dialog from "react-native-dialog"; +import FilteredList from "../login/FilteredList "; let theme = require('./../../utils/theme.json'); @@ -115,7 +116,10 @@ export default class AddNetwork extends Component { displayImage: false, loadingUpload: false, item: this.props.navigation.getParam("item", null), - password: null + password: null, + neighborhood: null, + building_value: [], + built: [false] } } @@ -219,6 +223,14 @@ export default class AddNetwork extends Component { } renderTaxesDropdown = (index) => { + const selectedNeighbourhood = this.state.result && this.state.result.neighborhoods + ? this.state.result.neighborhoods.find(n => n.name === this.state.neighborhood) + : null; + const mercurialValue = selectedNeighbourhood + ? (this.state.built[index] + ? selectedNeighbourhood.mercur_built_value + : selectedNeighbourhood.mercur_unbuilt_value) + : null; return ( <> @@ -348,6 +360,65 @@ export default class AddNetwork extends Component { : null } + { + !isNil(this.state.taxes_selected[index]) && + this.state.taxes_selected[index].name?.toLowerCase() === 'taxe sur la propriété' && ( + <> + + + { + const built = [...this.state.built]; + built[index] = value === 'Oui'; + this.setState({built}); + }} + /> + + + {mercurialValue != null && ( + + {`${I18n.t('MERCURIAL_VALUE')}: ${mercurialValue}`} + + )} + {this.state.built[index] && ( + + { + const building_value = [...this.state.building_value]; + building_value[index] = value; + this.setState({building_value}); + }} + /> + + )} + + ) + } { !isNil(this.state.taxes_selected[index]) ? this.state.taxes_selected[index].billing_period === 'jour' && @@ -408,6 +479,9 @@ export default class AddNetwork extends Component { render() { + const hasPropertyTax = this.state.taxes_selected.some( + t => t && t.name?.toLowerCase() === 'taxe sur la propriété' + ); return ( : <> {this.renderTaxesDropdown(0)} + {hasPropertyTax && ( + + { + this.setState({neighborhood: selectedItem.name}); + }} + /> + + )} { this.state.tabTaxe.map((element, index) => ( index > 0 && @@ -517,26 +602,38 @@ export default class AddNetwork extends Component { for (let i = 0; i < this.state.tabTaxe.length; i++) { if (this.state.taxes_selected[i].hasOwnProperty("id")) { if (this.state.taxes_selected[i].has_image_capture === "1") { - taxes_to_send.push({ + let taxe = { has_image_capture: this.state.taxes_selected[i].has_image_capture, image: this.state.taxes_selected[i].image, id_network_tax: this.state.taxes_selected[i].id, + name: this.state.taxes_selected[i].name, tax_units_count: isNil(this.state.tax_units_count[i]) ? null : this.state.tax_units_count[i], units_per_tax_unit_count: isNil(this.state.units_per_tax_unit_count[i]) ? null : this.state.units_per_tax_unit_count[i], number_of_days: isNil(this.state.number_of_days[i]) ? null : this.state.number_of_days[i], - }); + }; + if (this.state.taxes_selected[i].name?.toLowerCase() === 'taxe sur la propriété') { + taxe.building_value = isNil(this.state.building_value[i]) ? null : this.state.building_value[i]; + taxe.built = this.state.built[i]; + } + taxes_to_send.push(taxe); } else { - taxes_to_send.push({ + let taxe = { has_image_capture: this.state.taxes_selected[i].has_image_capture, id_network_tax: this.state.taxes_selected[i].id, + name: this.state.taxes_selected[i].name, tax_units_count: isNil(this.state.tax_units_count[i]) ? null : this.state.tax_units_count[i], units_per_tax_unit_count: isNil(this.state.units_per_tax_unit_count[i]) ? null : this.state.units_per_tax_unit_count[i], number_of_days: isNil(this.state.number_of_days[i]) ? null : this.state.number_of_days[i], - }); + }; + if (this.state.taxes_selected[i].name?.toLowerCase() === 'taxe sur la propriété') { + taxe.building_value = isNil(this.state.building_value[i]) ? null : this.state.building_value[i]; + taxe.built = this.state.built[i]; + } + taxes_to_send.push(taxe); } } } - let res = await AssignAgentGeo(validateCode, enterPhone, taxes_to_send, item.id_agent, password, item.id); + let res = await AssignAgentGeo(validateCode, enterPhone, taxes_to_send, item.id_agent, password, item.id, this.state.neighborhood); this.setState({isLoading: false}); if (res) { if (res['success'] !== undefined) { @@ -600,8 +697,8 @@ const style = StyleSheet.create({ marginTop: 20, borderColor: 'transparent', backgroundColor: theme.primaryDarkAdvanced, - height: responsiveHeight(8) - + height: responsiveHeight(8), + marginBottom: responsiveHeight(8) // espace ajouté en bas }, appContainer: { flexDirection: 'row', diff --git a/app/screens/login/CreateUserStep.js b/app/screens/login/CreateUserStep.js index 59454e6..33c6b64 100644 --- a/app/screens/login/CreateUserStep.js +++ b/app/screens/login/CreateUserStep.js @@ -4,6 +4,7 @@ import Button from 'apsl-react-native-button'; import axios from 'axios'; import _ from 'lodash'; import isNil from 'lodash/isNil'; +import React from 'react'; import {Component} from 'react'; import { Alert, @@ -152,7 +153,7 @@ class CreateUserStep extends Component { technical_approval: null, municipality: 'Douala', neighborhood: null, - district: 'Douala 3eme', + district: 'Douala 4', id_patente: null, TVA: false, IRPP: false, diff --git a/app/screens/login/createAccount.js b/app/screens/login/createAccount.js index 37ce805..cb44bbc 100644 --- a/app/screens/login/createAccount.js +++ b/app/screens/login/createAccount.js @@ -17,7 +17,7 @@ import {responsiveHeight, responsiveWidth, responsiveFontSize} from 'react-nativ import {Fumi, Kaede} from 'react-native-textinput-effects' import * as Animatable from 'react-native-animatable' import Button from 'apsl-react-native-button' -import {categoryChild, getCodeInformation, getSupervisorInfoCode} from './../../webservice/AuthApi' +import {categoryChild, getCodeInformation, getSupervisorInfoCode, getSupervisorInfoCodeOffline} from './../../webservice/AuthApi' let theme = require('./../../utils/theme.json') let route = require('./../../route.json') @@ -515,8 +515,19 @@ export default class CreateAccount extends Component { } + // retreiveSupervisorInfosCode() { + // getSupervisorInfoCode().then((result) => { + // console.warn("SUPERVISOR INFOS CODE", JSON.stringify(result)); + // storeData(supervisorCode, JSON.stringify(result)).then(() => { + // this.setState({displayLoader: false}); + // }); + // }).catch(error => { + // //console.log(error); + // }) + // } + retreiveSupervisorInfosCode() { - getSupervisorInfoCode().then((result) => { + getSupervisorInfoCodeOffline().then((result) => { console.warn("SUPERVISOR INFOS CODE", JSON.stringify(result)); storeData(supervisorCode, JSON.stringify(result)).then(() => { this.setState({displayLoader: false}); @@ -614,7 +625,8 @@ export default class CreateAccount extends Component { } else { let codeSupervisorsData = JSON.parse(codeSupervisor); - let codeSupervisors = Object.keys(codeSupervisorsData); + let codeSupervisorsDataCodes = codeSupervisorsData.codes; + let codeSupervisors = Object.keys(codeSupervisorsData.codes); this.setState({codeSupervisorsData}); if (!codeSupervisors.includes(user.member)) { @@ -627,8 +639,17 @@ export default class CreateAccount extends Component { }], {cancelable: false}); } else { this.setState({isLoging: false}); - let resultInfosCode = codeSupervisorsData[user.member]; - this.setState({codeSupervisorData: resultInfosCode}); + let resultInfosCode = codeSupervisorsDataCodes[user.member]; + const completedResultInfosCode = { + ...resultInfosCode, + companies_types:codeSupervisorsData.globals.companies_types , + districts: codeSupervisorsData.globals.districts, + neighborhoods: codeSupervisorsData.globals.neighborhoods, + activities: codeSupervisorsData.globals.activities, + municipalities: codeSupervisorsData.globals.municipalities + }; + this.setState({codeSupervisorData: completedResultInfosCode}); + if (resultInfosCode.network.is_companies_network === "1" && resultInfosCode.child == "geolocated") { this.props.navigation.push(route.createUserStep, { diff --git a/app/screens/splashscreen/SplashScreen.js b/app/screens/splashscreen/SplashScreen.js index 18c554a..57d98fd 100644 --- a/app/screens/splashscreen/SplashScreen.js +++ b/app/screens/splashscreen/SplashScreen.js @@ -14,7 +14,8 @@ import { getPasObject, getPubActiveObject, getSupervisorInfoCode, - getAppVersion + getAppVersion, + getSupervisorInfoCodeOffline } from '../../webservice/AuthApi'; import {Bubbles, DoubleBounce, Bars, Pulse} from 'react-native-loader'; import Configuration from "../../webservice/persistences/Configuration"; @@ -58,7 +59,7 @@ export default class SplashScreen extends Component { // constructor(props) { super(props); - this.retreiveSupervisorInfosCode(); + // this.retreiveSupervisorInfosCode(); this.state = {} }; @@ -130,10 +131,29 @@ export default class SplashScreen extends Component { });*/ } + initializeOfflineMode = () => { + console.log("Initialisation du mode Hors Ligne..."); + getSupervisorInfoCodeOffline() + .then((result) => { + console.warn("SUPERVISOR INFOS CODE_", JSON.stringify(result)); + storeData(supervisorCode, JSON.stringify(result)) + .then(() => { + this.setState({ offlineInitialized: true, isLoading: false }); + }) + .catch(error => { + console.error("Erreur lors du stockage :", error); + this.setState({ isLoading: false }); + }); + }) + .catch(error => { + console.error("Erreur lors de la récupération des infos :", error); + }); + } componentDidMount() { console.log("ComponentDidMount===>>") - this.retreiveSupervisorInfosCode(); + this.initializeOfflineMode(); + // this.retreiveSupervisorInfosCode(); try { this.requestCameraPermission() } catch (e) { diff --git a/app/screens/wallet/regisseur/AvisImpositionDetail.js b/app/screens/wallet/regisseur/AvisImpositionDetail.js index 78a1eb0..c9719f4 100644 --- a/app/screens/wallet/regisseur/AvisImpositionDetail.js +++ b/app/screens/wallet/regisseur/AvisImpositionDetail.js @@ -394,7 +394,7 @@ class AvisImpositionDetail extends Component { marginLeft: 20 }} /> - {`${item.lastname} | ${item.email}`} + {`${item.lastname} | ${item.email}`} - {`${item.email} | ${item.phone}`} + {`${item.email} | ${item.phone}`} - {`${item.adresse}`} + {`${item.adresse}`} {/* {`${this.state.item.amount}`} + style={[styles.simpleuser,styles.multiLine]}>{`${this.state.item.amount}`} {`${I18n.t('CREATION_DATE')}: ${created_at.format(" Do MMMM YYYY à HH:mm")}`} + style={[styles.simpleuser,styles.multiLine]}>{`${I18n.t('CREATION_DATE')}: ${created_at.format(" Do MMMM YYYY à HH:mm")}`} {`${I18n.t('UPDATE_DATE')}: ${updated_at.format(" Do MMMM YYYY à HH:mm")}`} + style={[styles.simpleuser,styles.multiLine]}>{`${I18n.t('UPDATE_DATE')}: ${updated_at.format(" Do MMMM YYYY à HH:mm")}`} - - { - this.state.item.is_company === 0 && - - - - } - + + { + this.state.item.is_company === 0 && + + + + } + + @@ -667,11 +669,19 @@ const styles = StyleSheet.create({ fontSize: 16, color: '#3E3E3E' }, + multiLine: { + flexShrink: 1, + flexWrap: 'wrap', + }, textbtnstyle: { color: "white", fontWeight: "bold", fontSize: 18 }, + textbtnPadding: { + paddingHorizontal: 4, + textAlign: 'center', + }, input: { height: 60, marginTop: responsiveHeight(2), diff --git a/app/webservice/AuthApi.js b/app/webservice/AuthApi.js index 69d0d48..f765953 100644 --- a/app/webservice/AuthApi.js +++ b/app/webservice/AuthApi.js @@ -41,6 +41,7 @@ export const getCodeInformationForAddTaxe = (code, id_agent) => { var data = { "tag": 'member', "type": "agen_info_code", "code": code, "lang": I18n.currentLocale(), + "isRegistration": false, id_agent }; @@ -397,6 +398,9 @@ export const getTownInformationName = (town) => { export const getSupervisorInfoCode = () => { return queryData({"type": "all_supervisors_info_code", "tag": "member"}, memberActionUrl); } +export const getSupervisorInfoCodeOffline = () => { + return queryData({"type": "supervisors_infos_off_line", "tag": "member"}, memberActionUrl); +} export const generateAgentGeo = async (newPhone) => { const user = await readUser(); const items = await queryData({ @@ -408,7 +412,7 @@ export const generateAgentGeo = async (newPhone) => { }, memberActionUrl) return items; } -export const AssignAgentGeo = async (codeValidation, phone, taxes, id_agent, password, id_tax_notice) => { +export const AssignAgentGeo = async (codeValidation, phone, taxes, id_agent, password, id_tax_notice, neighborhood) => { const user = await readUser(); const items = await queryData({ "type": "assignNetworkAgentToGeo", @@ -420,7 +424,8 @@ export const AssignAgentGeo = async (codeValidation, phone, taxes, id_agent, pas "lang": I18n.currentLocale(), agentId: id_agent, password, - id_tax_notice + id_tax_notice, + neighborhood }, memberActionUrl) return items; } diff --git a/app/webservice/IlinkConstants.js b/app/webservice/IlinkConstants.js index 6527b10..04ea371 100644 --- a/app/webservice/IlinkConstants.js +++ b/app/webservice/IlinkConstants.js @@ -1,12 +1,14 @@ export const isDebugMode = false +// TODO: Switch from test to prod and vice versa + // PROD URL -// export const baseUrl = "https://city-douala3.ilink-app.com:8080/mobilebackend"; -// export const testBaseUrl= "https://city-douala3.ilink-app.com:8081"; +export const baseUrl = "https://city-douala4.ilink-app.com:8080/mobilebackend"; +export const testBaseUrl= "https://city-douala4.ilink-app.com:8081"; // TEST URL -export const baseUrl = "https://test-city-douala3.ilink-app.com:9080/mobilebackend"; -export const testBaseUrl= "https://test-city-douala3.ilink-app.com:9081"; +// export const baseUrl = "https://test-city-douala4.ilink-app.com:9080/mobilebackend"; +// export const testBaseUrl= "https://test-city-douala4.ilink-app.com:9081";