forked from urdt/ussd
Merge remote-tracking branch 'refs/remotes/origin/wip-account-creation' into wip-account-creation
This commit is contained in:
commit
c556e88916
157
cmd/main.go
157
cmd/main.go
@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
@ -13,6 +14,7 @@ import (
|
|||||||
|
|
||||||
"git.defalsify.org/vise.git/cache"
|
"git.defalsify.org/vise.git/cache"
|
||||||
"git.defalsify.org/vise.git/engine"
|
"git.defalsify.org/vise.git/engine"
|
||||||
|
"git.defalsify.org/vise.git/lang"
|
||||||
"git.defalsify.org/vise.git/persist"
|
"git.defalsify.org/vise.git/persist"
|
||||||
"git.defalsify.org/vise.git/resource"
|
"git.defalsify.org/vise.git/resource"
|
||||||
"git.defalsify.org/vise.git/state"
|
"git.defalsify.org/vise.git/state"
|
||||||
@ -28,6 +30,11 @@ const (
|
|||||||
USERFLAG_INVALID_RECIPIENT_WITH_INVITE
|
USERFLAG_INVALID_RECIPIENT_WITH_INVITE
|
||||||
USERFLAG_INCORRECTPIN
|
USERFLAG_INCORRECTPIN
|
||||||
USERFLAG_UNLOCKFORUPDATE
|
USERFLAG_UNLOCKFORUPDATE
|
||||||
|
USERFLAG_INVALID_AMOUNT
|
||||||
|
USERFLAG_QUERYPIN
|
||||||
|
USERFLAG_VALIDPIN
|
||||||
|
USERFLAG_INVALIDPIN
|
||||||
|
USERFLAG_UNLOCKFORUPDATE
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -71,6 +78,16 @@ type fsData struct {
|
|||||||
st *state.State
|
st *state.State
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func codeFromCtx(ctx context.Context) string {
|
||||||
|
var code string
|
||||||
|
engine.Logg.DebugCtxf(ctx, "in msg", "ctx", ctx, "val", code)
|
||||||
|
if ctx.Value("Language") != nil {
|
||||||
|
lang := ctx.Value("Language").(lang.Language)
|
||||||
|
code = lang.Code
|
||||||
|
}
|
||||||
|
return code
|
||||||
|
}
|
||||||
|
|
||||||
func (fsd *fsData) saveFirstName(cxt context.Context, sym string, input []byte) (resource.Result, error) {
|
func (fsd *fsData) saveFirstName(cxt context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
res := resource.Result{}
|
res := resource.Result{}
|
||||||
fp := fsd.path + "_data"
|
fp := fsd.path + "_data"
|
||||||
@ -484,8 +501,12 @@ func checkAccountStatus(trackingId string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fsd *fsData) quit(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
func (fsd *fsData) quit(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
res := resource.Result{
|
res := resource.Result{}
|
||||||
Content: "Your account is being created",
|
switch codeFromCtx(ctx) {
|
||||||
|
case "swa":
|
||||||
|
res.Content = "Asante kwa kutumia huduma ya Sarafu. Kwaheri!"
|
||||||
|
default:
|
||||||
|
res.Content = "Thank you for using Sarafu. Goodbye!"
|
||||||
}
|
}
|
||||||
res.FlagReset = append(res.FlagReset, USERFLAG_ACCOUNT_UNLOCKED)
|
res.FlagReset = append(res.FlagReset, USERFLAG_ACCOUNT_UNLOCKED)
|
||||||
return res, nil
|
return res, nil
|
||||||
@ -606,6 +627,39 @@ func (fsd *fsData) transaction_reset(ctx context.Context, sym string, input []by
|
|||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fsd *fsData) reset_transaction_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
|
res := resource.Result{}
|
||||||
|
fp := fsd.path + "_data"
|
||||||
|
|
||||||
|
jsonData, err := os.ReadFile(fp)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var accountData map[string]string
|
||||||
|
err = json.Unmarshal(jsonData, &accountData)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset the amount
|
||||||
|
accountData["Amount"] = ""
|
||||||
|
|
||||||
|
updatedJsonData, err := json.Marshal(accountData)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.WriteFile(fp, updatedJsonData, 0644)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res.FlagReset = append(res.FlagReset, USERFLAG_INVALID_AMOUNT)
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (fsd *fsData) max_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
func (fsd *fsData) max_amount(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
res := resource.Result{}
|
res := resource.Result{}
|
||||||
|
|
||||||
@ -632,28 +686,32 @@ func (fsd *fsData) validate_amount(ctx context.Context, sym string, input []byte
|
|||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// mimic invalid amount check
|
if amount != "0" {
|
||||||
if amount == "0" {
|
// mimic invalid amount
|
||||||
// res.FlagSet = []uint32{invalidAmount}
|
if amount == "00" {
|
||||||
|
res.FlagSet = append(res.FlagSet, USERFLAG_INVALID_AMOUNT)
|
||||||
|
res.Content = amount
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
res.Content = amount
|
res.Content = amount
|
||||||
|
|
||||||
|
accountData["Amount"] = amount
|
||||||
|
|
||||||
|
updatedJsonData, err := json.Marshal(accountData)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.WriteFile(fp, updatedJsonData, 0644)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
res.Content = amount
|
|
||||||
|
|
||||||
accountData["Amount"] = amount
|
|
||||||
|
|
||||||
updatedJsonData, err := json.Marshal(accountData)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = os.WriteFile(fp, updatedJsonData, 0644)
|
|
||||||
if err != nil {
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,6 +820,62 @@ func (fsd *fsData) quitWithBalance(ctx context.Context, sym string, input []byte
|
|||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fsd *fsData) save_pin(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
|
res := resource.Result{}
|
||||||
|
accountPIN := string(input)
|
||||||
|
fp := fsd.path + "_data"
|
||||||
|
|
||||||
|
jsonData, err := os.ReadFile(fp)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var accountData map[string]string
|
||||||
|
err = json.Unmarshal(jsonData, &accountData)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountData["AccountPIN"] = accountPIN
|
||||||
|
|
||||||
|
updatedJsonData, err := json.Marshal(accountData)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.WriteFile(fp, updatedJsonData, 0644)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fsd *fsData) verify_pin(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||||
|
res := resource.Result{}
|
||||||
|
fp := fsd.path + "_data"
|
||||||
|
|
||||||
|
jsonData, err := os.ReadFile(fp)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var accountData map[string]string
|
||||||
|
err = json.Unmarshal(jsonData, &accountData)
|
||||||
|
if err != nil {
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if bytes.Equal(input, []byte(accountData["AccountPIN"])) {
|
||||||
|
res.FlagSet = []uint32{USERFLAG_VALIDPIN}
|
||||||
|
res.FlagReset = []uint32{USERFLAG_INVALIDPIN}
|
||||||
|
} else {
|
||||||
|
res.FlagSet = []uint32{USERFLAG_INVALIDPIN}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
scriptDir = path.Join("services", "registration")
|
scriptDir = path.Join("services", "registration")
|
||||||
)
|
)
|
||||||
@ -779,7 +893,7 @@ func main() {
|
|||||||
fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir)
|
fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir)
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
st := state.NewState(9)
|
st := state.NewState(15)
|
||||||
st.UseDebug()
|
st.UseDebug()
|
||||||
state.FlagDebugger.Register(USERFLAG_LANGUAGE_SET, "LANGUAGE_CHANGE")
|
state.FlagDebugger.Register(USERFLAG_LANGUAGE_SET, "LANGUAGE_CHANGE")
|
||||||
state.FlagDebugger.Register(USERFLAG_ACCOUNT_CREATED, "ACCOUNT_CREATED")
|
state.FlagDebugger.Register(USERFLAG_ACCOUNT_CREATED, "ACCOUNT_CREATED")
|
||||||
@ -823,6 +937,8 @@ func main() {
|
|||||||
}
|
}
|
||||||
rfs.AddLocalFunc("select_language", fs.SetLanguageSelected)
|
rfs.AddLocalFunc("select_language", fs.SetLanguageSelected)
|
||||||
rfs.AddLocalFunc("create_account", fs.create_account)
|
rfs.AddLocalFunc("create_account", fs.create_account)
|
||||||
|
rfs.AddLocalFunc("save_pin", fs.save_pin)
|
||||||
|
rfs.AddLocalFunc("verify_pin", fs.verify_pin)
|
||||||
rfs.AddLocalFunc("check_identifier", fs.checkIdentifier)
|
rfs.AddLocalFunc("check_identifier", fs.checkIdentifier)
|
||||||
rfs.AddLocalFunc("check_account_status", fs.check_account_status)
|
rfs.AddLocalFunc("check_account_status", fs.check_account_status)
|
||||||
rfs.AddLocalFunc("unlock_account", fs.unLock)
|
rfs.AddLocalFunc("unlock_account", fs.unLock)
|
||||||
@ -832,6 +948,7 @@ func main() {
|
|||||||
rfs.AddLocalFunc("transaction_reset", fs.transaction_reset)
|
rfs.AddLocalFunc("transaction_reset", fs.transaction_reset)
|
||||||
rfs.AddLocalFunc("max_amount", fs.max_amount)
|
rfs.AddLocalFunc("max_amount", fs.max_amount)
|
||||||
rfs.AddLocalFunc("validate_amount", fs.validate_amount)
|
rfs.AddLocalFunc("validate_amount", fs.validate_amount)
|
||||||
|
rfs.AddLocalFunc("reset_transaction_amount", fs.reset_transaction_amount)
|
||||||
rfs.AddLocalFunc("get_recipient", fs.get_recipient)
|
rfs.AddLocalFunc("get_recipient", fs.get_recipient)
|
||||||
rfs.AddLocalFunc("get_sender", fs.get_sender)
|
rfs.AddLocalFunc("get_sender", fs.get_sender)
|
||||||
rfs.AddLocalFunc("reset_incorrect", fs.ResetIncorrectPin)
|
rfs.AddLocalFunc("reset_incorrect", fs.ResetIncorrectPin)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
LOAD create_account 0
|
RELOAD verify_pin
|
||||||
|
CATCH create_pin_mismatch 20 1
|
||||||
LOAD quit 0
|
LOAD quit 0
|
||||||
HALT
|
HALT
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
LOAD reset_transaction_amount 0
|
||||||
RELOAD validate_recipient
|
RELOAD validate_recipient
|
||||||
CATCH invalid_recipient 13 1
|
CATCH invalid_recipient 13 1
|
||||||
LOAD max_amount 10
|
LOAD max_amount 10
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Kiwango cha juu: {{.max_amount}}
|
||||||
|
Weka kiwango:
|
1
services/registration/confirm_create_pin
Normal file
1
services/registration/confirm_create_pin
Normal file
@ -0,0 +1 @@
|
|||||||
|
Enter your four number PIN again:
|
4
services/registration/confirm_create_pin.vis
Normal file
4
services/registration/confirm_create_pin.vis
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
LOAD save_pin 0
|
||||||
|
HALT
|
||||||
|
LOAD verify_pin 8
|
||||||
|
INCMP account_creation *
|
1
services/registration/confirm_create_pin_swa
Normal file
1
services/registration/confirm_create_pin_swa
Normal file
@ -0,0 +1 @@
|
|||||||
|
Weka PIN yako tena:
|
1
services/registration/create_pin
Normal file
1
services/registration/create_pin
Normal file
@ -0,0 +1 @@
|
|||||||
|
Please enter a new four number PIN for your account:
|
5
services/registration/create_pin.vis
Normal file
5
services/registration/create_pin.vis
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
LOAD create_account 0
|
||||||
|
MOUT exit 0
|
||||||
|
HALT
|
||||||
|
LOAD save_pin 0
|
||||||
|
INCMP confirm_create_pin *
|
1
services/registration/create_pin_mismatch
Normal file
1
services/registration/create_pin_mismatch
Normal file
@ -0,0 +1 @@
|
|||||||
|
The PIN is not a match. Try again
|
5
services/registration/create_pin_mismatch.vis
Normal file
5
services/registration/create_pin_mismatch.vis
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
MOUT retry 1
|
||||||
|
MOUT quit 9
|
||||||
|
HALT
|
||||||
|
INCMP confirm_create_pin 1
|
||||||
|
INCMP quit 9
|
1
services/registration/create_pin_mismatch_swa
Normal file
1
services/registration/create_pin_mismatch_swa
Normal file
@ -0,0 +1 @@
|
|||||||
|
PIN uliyoweka haifanani. Jaribu tena
|
1
services/registration/create_pin_swa
Normal file
1
services/registration/create_pin_swa
Normal file
@ -0,0 +1 @@
|
|||||||
|
Tafadhali weka PIN mpya yenye nambari nne kwa akaunti yako:
|
1
services/registration/exit_menu
Normal file
1
services/registration/exit_menu
Normal file
@ -0,0 +1 @@
|
|||||||
|
Exit
|
1
services/registration/exit_menu_swa
Normal file
1
services/registration/exit_menu_swa
Normal file
@ -0,0 +1 @@
|
|||||||
|
Ondoka
|
1
services/registration/invalid_amount
Normal file
1
services/registration/invalid_amount
Normal file
@ -0,0 +1 @@
|
|||||||
|
Amount {{.validate_amount}} is invalid, please try again:
|
7
services/registration/invalid_amount.vis
Normal file
7
services/registration/invalid_amount.vis
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
MAP validate_amount
|
||||||
|
RELOAD reset_transaction_amount
|
||||||
|
MOUT retry 1
|
||||||
|
MOUT quit 9
|
||||||
|
HALT
|
||||||
|
INCMP amount 1
|
||||||
|
INCMP quit 9
|
1
services/registration/invalid_amount_swa
Normal file
1
services/registration/invalid_amount_swa
Normal file
@ -0,0 +1 @@
|
|||||||
|
Kiwango {{.validate_amount}} sio sahihi, tafadhali weka tena:
|
@ -3,5 +3,5 @@ RELOAD select_language
|
|||||||
MOUT yes 0
|
MOUT yes 0
|
||||||
MOUT no 1
|
MOUT no 1
|
||||||
HALT
|
HALT
|
||||||
INCMP account_creation 0
|
INCMP create_pin 0
|
||||||
INCMP _ *
|
INCMP _ *
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
RELOAD validate_amount
|
RELOAD validate_amount
|
||||||
MAP validate_amount
|
MAP validate_amount
|
||||||
|
CATCH invalid_amount 17 1
|
||||||
RELOAD get_recipient
|
RELOAD get_recipient
|
||||||
MAP get_recipient
|
MAP get_recipient
|
||||||
RELOAD get_sender
|
RELOAD get_sender
|
||||||
|
Loading…
Reference in New Issue
Block a user