Commit af2930c1 authored by Faizol's avatar Faizol

phase 2 done (point check balance mode)

parent 52f12f5e
......@@ -6,7 +6,8 @@ A new Flutter project Self Service.
This project is a starting point for a Flutter application.
## Version App Change Log 1.6.10
## Version App Change Log SS.23.1.WWW.SB
## Version Code 16
** Added mode by config topup dan check balance ✅
** Added wording title following the selected mode ✅
......@@ -19,6 +20,9 @@ This project is a starting point for a Flutter application.
** Adjust Ui check balance ✅
** Added function print card history
** Added Ui print card history
** Update mifare mdd lib to version version: 0.1.42 ✅
** Disable print history ✅
** Update version ✅
** Update mifare mdd lib to version version: 0.1.36 ✅
** Added isCheckHistory to getcardinfo ✅
## Version App Change Log SS.23.2.WWW.SB.PC
## Version Code 17
......@@ -13,12 +13,12 @@ if (flutterRoot == null) {
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
flutterVersionCode = '17'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
flutterVersionName = 'SS.23.2.WWW.SB.PC'
}
apply plugin: 'com.android.application'
......@@ -96,7 +96,7 @@ dependencies {
// library mdd
// change 11
implementation(group: 'com.mdd.topup', name: 'mifare_mdd_lib', version: '0.1.24', ext: 'aar')
implementation(group: 'com.mdd.topup', name: 'mifare_mdd_lib', version: '0.1.42', ext: 'aar')
implementation(group: 'com.mdd.payment', name: 'aar-deviceid-release', version: '2.0.6', ext: 'aar')
implementation(group: 'com.mdd.library', name: 'android-escpos-receipt', version: '1.0.1', ext: 'aar')
implementation(group: 'com.mdd.payment', name: 'nativecripto-release', version: '2.0.1', ext: 'aar')
......
......@@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "SS.23.1.WWW.SB",
"versionCode": 17,
"versionName": "SS.23.2.WWW.SB.PC",
"outputFile": "app-debug.apk"
}
],
......
......@@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "SS.23.1.WWW.SB",
"versionCode": 17,
"versionName": "SS.23.2.WWW.SB.PC",
"outputFile": "app-profile.apk"
}
],
......
......@@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 16,
"versionName": "SS.23.1.WWW.SB",
"versionCode": 17,
"versionName": "SS.23.2.WWW.SB.PC",
"outputFile": "app-release.apk"
}
],
......
......@@ -25,6 +25,11 @@ public final class GeneratedPluginRegistrant {
} catch (Exception e) {
Log.e(TAG, "Error registering plugin device_info_plus, dev.fluttercommunity.plus.device_info.DeviceInfoPlusPlugin", e);
}
try {
flutterEngine.getPlugins().add(new io.github.ponnamkarthik.toast.fluttertoast.FlutterToastPlugin());
} catch (Exception e) {
Log.e(TAG, "Error registering plugin fluttertoast, io.github.ponnamkarthik.toast.fluttertoast.FlutterToastPlugin", e);
}
try {
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin());
} catch (Exception e) {
......
......@@ -8,8 +8,10 @@ import android.graphics.drawable.Drawable
import android.os.Build
import android.util.DisplayMetrics
import android.util.Log
import androidx.annotation.RequiresApi
import com.github.danielfelgar.drawreceiptlib.ReceiptBuilder
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import id.mdd.mifare_mdd_lib.*
import id.mdd.mifare_mdd_lib.model.Ticket
import io.flutter.embedding.android.FlutterActivity
......@@ -19,18 +21,23 @@ import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.text.NumberFormat
import java.text.SimpleDateFormat
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.*
import kotlin.concurrent.thread
class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareTicketingCallback {
val gson = Gson()
private var _mifareTicketing: MifareTicketingPresenter? = null
private lateinit var mifareTicketingV3: MifareTicketingV3
private lateinit var lastCardUI: Ticket
private var result: MethodChannel.Result? = null
private val coroutineScope = CoroutineScope(Dispatchers.IO)
@RequiresApi(Build.VERSION_CODES.O)
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when (call.method) {
......@@ -50,9 +57,6 @@ class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareT
}
}.start()
}
// "activation_key" -> {
// _mifareTicketing?.activateKey()
// }
"print_topup" -> {
this.result = result
val ticketJson = call.argument<String>("ticket_json")
......@@ -81,6 +85,28 @@ class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareT
status!!
)
}
"print_history" -> {
this.result = result
val jsonbalance = call.argument<String>("json_balance")
val name = call.argument<String>("name")
val cardNumber = call.argument<String>("card_number")
val cardExpirity = call.argument<String>("card_expirity")
val cardType = call.argument<String>("card_type")
val deposit = call.argument<String>("deposit")
val balance = call.argument<String>("balance")
generateReceiptHistory(
jsonbalance!!,
name!!,
cardNumber!!,
cardExpirity!!,
cardType!!,
deposit!!,
balance!!,
)
}
"init_mifare_lib" -> {
this.result = result
call.argument<String>("debug_response")
......@@ -169,7 +195,7 @@ class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareT
isSync = true,
isCheckValidation = false,
isCheckMin = true,
isCheckListHistory = true
isCheckListHistory = false,
)
}
}
......@@ -283,6 +309,151 @@ class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareT
result?.success(Gson().toJson(ticket))
}
fun formatDeciToPrice(value: Double): String? {
val formatter: NumberFormat = DecimalFormat("#,###")
return "Rp" + formatter.format(value)
}
@RequiresApi(Build.VERSION_CODES.O)
fun generateReceiptHistory(
jsonbalance: String,
name : String,
cardNumber : String,
cardExpirity : String,
cardType : String,
deposit : String,
balance : String
){
data class DataModel(
val card_uid: String,
val card_number: String,
val reg_db: String,
val terminal: String,
val ticket: String,
val type: String,
val reff_no: String,
val amount: Int,
val prev_balance: Int,
val last_balance: Int,
val datetime: String
)
val listTypeBalance = object : TypeToken<List<DataModel>>() {}.type
// Parse the JSON into a list of Transaction objects
val modelBalance: List<DataModel> = gson.fromJson(jsonbalance, listTypeBalance)
val currentDateTime = LocalDateTime.now()
val outputFormatter = DateTimeFormatter.ofPattern("yyyy/dd/MM HH:mm")
val formattedCurrentDateTime = currentDateTime.format(outputFormatter)
var bitmapIcon: Drawable? = this.getResources()?.getDrawableForDensity(
R.drawable.wahoo_print,
DisplayMetrics.DENSITY_LOW, getTheme()
)
print("model ${Build.MODEL}")
var receiptLayoutHistory = ReceiptBuilder(570)
.setMarginTop(30)
.setMarginLeft(30)
.setMarginLeft(30)
val resizedBitmap = Bitmap.createScaledBitmap(
(bitmapIcon as BitmapDrawable).bitmap,
300,
150,
false
)
receiptLayoutHistory = receiptLayoutHistory
.setAlign(Paint.Align.CENTER)
.setColor(Color.BLACK)
.setTextSize(50F)
.addText("HISTORI SALDO")
.setTextSize(25F)
.addText("history balance")
.addBlankSpace(15)
.setAlign(Paint.Align.CENTER)
.setTextSize(20F)
.addLine()
.setAlign(Paint.Align.LEFT)
.addText("Nama", false)
.setAlign(Paint.Align.CENTER)
.addText(":", false)
.setAlign(Paint.Align.RIGHT)
.addText(name, true)
.setAlign(Paint.Align.LEFT)
.addText("Wristband", false)
.setAlign(Paint.Align.CENTER)
.addText(":",false)
.setAlign(Paint.Align.RIGHT)
.addText(cardNumber,true)
.setAlign(Paint.Align.LEFT)
.addText("Tanngal Cetak",false)
.setAlign(Paint.Align.CENTER)
.addText(":",false)
.setAlign(Paint.Align.RIGHT)
.addText(formattedCurrentDateTime,true)
.setAlign(Paint.Align.LEFT)
.addText("Rincian Transaksi",false)
.setAlign(Paint.Align.CENTER)
.addText(":",false)
.setAlign(Paint.Align.RIGHT)
.addText("",true)
.addLine(10)
.addBlankSpace(10)
.setAlign(Paint.Align.LEFT)
.setColor(Color.BLACK)
.setAlign(Paint.Align.LEFT)
.addLine()
.addText("TIPE TGL TID JUMLAH", false)
.setAlign(Paint.Align.RIGHT)
.addText("SALDO", true)
.addLine()
for (dataBalance in modelBalance){
val inputDateStr = dataBalance.datetime
val amount = dataBalance.amount
val lastBalance = dataBalance.last_balance
val decimalFormatSymbols = DecimalFormatSymbols()
decimalFormatSymbols.groupingSeparator = '.'
val decimalFormat = DecimalFormat("#,###.##", decimalFormatSymbols)
val inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
val outputFormatter = DateTimeFormatter.ofPattern("yyyy/dd/MM HH:mm")
val inputDate = LocalDateTime.parse(inputDateStr, inputFormatter)
val formattedDate = inputDate.format(outputFormatter)
val terminalId = dataBalance.terminal.takeLast(4).replace(",".toRegex()," ")
val formattedTerminalId = String.format("%04d", terminalId.toInt())
val space = StringBuilder()
for (x in 0 until 20 - lastBalance.toString().length) {
space.append(" ")
}
receiptLayoutHistory = receiptLayoutHistory
.setTextSize(20F)
.setAlign(Paint.Align.LEFT)
.addText("${dataBalance.type.substring(0,3)} $formattedDate ${(formattedTerminalId)} ${decimalFormat.format(amount)}",false)
.setAlign(Paint.Align.RIGHT)
.addText( "${space.append(decimalFormat.format(lastBalance))}",true)
}
receiptLayoutHistory = receiptLayoutHistory
.addLine()
.addBlankSpace(10)
.setAlign(Paint.Align.LEFT)
.addText("** TOP : TOPUP")
.addText("** REF : REFUND")
.addText("** PUR : PURCHASE")
.addBlankSpace(10)
.setAlign(Paint.Align.CENTER)
.setTextSize(20F)
.addText("Terima kasih atas kunjungan Anda", true)
.addText("powered by dolanapp.com", true)
.addText("v-" + BuildConfig.VERSION_NAME)
val finalReceiptLayoutHistory: ReceiptBuilder = receiptLayoutHistory
_mifareTicketing?.generateReceiptTopup(finalReceiptLayoutHistory, "", null, paperWidth = 570F, isBluetooth = false)
}
fun generateReceipt(
ticketJson: String,
companyName: String,
......@@ -305,6 +476,7 @@ class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareT
R.drawable.wahoo_print,
DisplayMetrics.DENSITY_LOW, getTheme()
)
print("model ${Build.MODEL}")
// if (Build.MODEL == "T2s" || Build.MODEL == "T2Mini" || Build.MODEL == "T2mini") {
var receiptLayout = ReceiptBuilder(570)
......
sdk.dir=/Users/macbookpro/Library/Android/sdk
flutter.sdk=/Users/macbookpro/Developer/flutter
sdk.dir=C:\\Users\\MDD HP\\AndroidSDK
flutter.sdk=C:\\Users\\MDD HP\\flutter
flutter.buildMode=debug
flutter.versionName=SS.23.1.WWW.SB
flutter.versionCode=16
\ No newline at end of file
flutter.versionName=SS.23.2.WWW.SB.PC
flutter.versionCode=17
\ No newline at end of file
......@@ -18,6 +18,12 @@
@import device_info_plus;
#endif
#if __has_include(<fluttertoast/FluttertoastPlugin.h>)
#import <fluttertoast/FluttertoastPlugin.h>
#else
@import fluttertoast;
#endif
#if __has_include(<package_info_plus/FLTPackageInfoPlusPlugin.h>)
#import <package_info_plus/FLTPackageInfoPlusPlugin.h>
#else
......@@ -59,6 +65,7 @@
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
[ConnectivityPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"ConnectivityPlusPlugin"]];
[FLTDeviceInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTDeviceInfoPlusPlugin"]];
[FluttertoastPlugin registerWithRegistrar:[registry registrarForPlugin:@"FluttertoastPlugin"]];
[FLTPackageInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPackageInfoPlusPlugin"]];
[PathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"PathProviderPlugin"]];
[PermissionHandlerPlugin registerWithRegistrar:[registry registrarForPlugin:@"PermissionHandlerPlugin"]];
......
// ignore_for_file: prefer_typing_uninitialized_variables, avoid_print
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:self_service_3/shared/preference_constant.dart';
......@@ -47,6 +48,32 @@ class StartService {
return result;
}
static Future<String> printHistory(
String jsonbalance,
String name,
String cardNumber,
String cardExpirity,
String cardType,
String deposit,
String balance
)async{
var result;
try{
result = await platform.invokeMethod("print_history", <String, dynamic>{
"json_balance" : jsonbalance,
"name" : name,
"card_number" : cardNumber,
"card_expirity": cardExpirity,
"card_type" : cardType,
"deposit" : deposit,
"balance" : balance
});
}catch(e){
result = e.toString();
}
return result;
}
static Future<String> print(
String ticketJson,
// String bitmapLogo,
......
This diff is collapsed.
......@@ -429,6 +429,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
fluttertoast:
dependency: "direct main"
description:
name: fluttertoast
sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c"
url: "https://pub.dev"
source: hosted
version: "8.2.2"
frontend_server_client:
dependency: transitive
description:
......
......@@ -68,6 +68,7 @@ dependencies:
transparent_image: ^2.0.0
permission_handler: ^10.2.0
package_info_plus: ^3.0.3
fluttertoast: ^8.0.8
otp_text_field: ^1.1.3
timer_builder: ^2.0.0
sentry_flutter: ^7.10.1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment