Explorar o código

Add SSL certificates and refactor price formatting

Added new SSL certificate files for simgetgo_vn. Refactored price and money formatting in checkout, home, order detail, order history, and product detail views to use the shared formatNumber utility instead of manual toLocaleString calls.
hieubt hai 3 semanas
pai
achega
cb37069497

BIN=BIN
EsimLao/docs/ssl/simgetgo_vn.zip


+ 34 - 0
EsimLao/docs/ssl/simgetgo_vn/simgetgo_vn_RootCA.crt

@@ -0,0 +1,34 @@
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----

+ 36 - 0
EsimLao/docs/ssl/simgetgo_vn/simgetgo_vn_cert.crt

@@ -0,0 +1,36 @@
+-----BEGIN CERTIFICATE-----
+MIIGQTCCBSmgAwIBAgIRAIvdsEK54uwrvAo7oE5Y4QUwDQYJKoZIhvcNAQELBQAw
+gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE
+AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
+QTAeFw0yNjAxMDcwMDAwMDBaFw0yNzAyMDcyMzU5NTlaMBYxFDASBgNVBAMTC3Np
+bWdldGdvLnZuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsEUz7+Ln
+9DGHd33SHgDZT3Gq0STM/p3gBInHfk5EEGLc/iRsqoCJYIR4ihZwOlRErE1di+tY
+UCekzUfnsqPVSi2FbaTYXHsKOmqMQ+Dr+OW/rIZeY7b5/QJhec88u4vcYEUFScjE
+DjDOEYPe7OZLgcvfQsuITZdwUyTGjWiVX8A71wqXNblm8dftpqLnLOIRYx6D1H+m
+3rT/IvaeGl2b47MvvI9cQgLWVkLYkrcfherfZEdfugfU2NbZyaJ/sYLEuff3ryRz
+Lc7XN3ga/aZbRwfyMM/Q4KFE6lgQeZIK4cOKcid4DWBpswAFywe/VLTan4twk7b7
+V8n2SDzLq90q0QIDAQABo4IDDjCCAwowHwYDVR0jBBgwFoAUjYxexFStiuF36Zv5
+mwXhuAGNYeEwHQYDVR0OBBYEFHVNyTXZQzoMfn+Dad8oGpc73OsSMA4GA1UdDwEB
+/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEWF2h0
+dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEEeDB2
+ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FE
+b21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzABhhdo
+dHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAnBgNVHREEIDAeggtzaW1nZXRnby52boIP
+d3d3LnNpbWdldGdvLnZuMIIBjgYKKwYBBAHWeQIEAgSCAX4EggF6AXgAdwBgTJqv
+en93XwHUBvySDciZ6wscffjJUhv6+hd3O5eLyQAAAZuWG4M7AAAEAwBIMEYCIQD2
+Gm7YRVPTrA0OeRPzjlqfBrqomqi+gt55ex0ssmL8VAIhAMeVacY7Nj2qkPoKAz91
+GfyZaVVaCwrrVJe051xx/B6/AH0AjspHC6zeavOiBrCkeoS3Rv4fxr+VPiXmm07k
+AkjzxugAAAGblhuDegAIAAAFAAEkK3wEAwBGMEQCIGlO8q0wKV/6XWXqSfoKl/c9
+NnZGXRS65mLvs4ndvauoAiAK1/WSLuYl5MOh+xzHlQqaag4M/niVv5tmrEoQM5hl
+QgB+AFlubDOGlLJZcqJWyKDo3ZBKdugIPdqHOwEIOCgUPO5ZAAABm5YbhIIACAAA
+BQAACQ3qBAMARzBFAiBpdXIYgu+u7Ln7UCAgiwvIWkr9UF+0d6FdFsTu9bfURgIh
+ALBcLH/hrBg+He3mNN/mP0lst/Xj8bA8RQR4cmTYvu5LMA0GCSqGSIb3DQEBCwUA
+A4IBAQAgT24oAce5mYKk3U/x8e8QeZwfcuTu/id4O2DPM2jNCrMODYlvh8uKi9c/
+oI+Gjn0WPVywKmuinXRYViSM2cpaV4lWS7YSIC6kl/2YOscfPSIetXGf1QsZUSmz
+RBsR9yLZA91almf/4MN7GsbAC2LsXKAaUvnce1A+S21HWOw3BjAWkzJ+iRGzhLEa
+V1vcEs45tdFqqzep98S4MrcAAEDglcYNftds5N2WoZN69DEUZH+XnFyRJuFvQ4uj
+BwVKN0pbAqTfdgaQdg1LnCdLAYPeW39+pU/Np2kNfnvu+uk8RwlLgBmG+AjrYiCx
+LQ97Eeu1g7PateuPeV9n+aesiwST
+-----END CERTIFICATE-----

+ 105 - 0
EsimLao/docs/ssl/simgetgo_vn/simgetgo_vn_cert_inter_root.crt

@@ -0,0 +1,105 @@
+-----BEGIN CERTIFICATE-----
+MIIGQTCCBSmgAwIBAgIRAIvdsEK54uwrvAo7oE5Y4QUwDQYJKoZIhvcNAQELBQAw
+gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE
+AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
+QTAeFw0yNjAxMDcwMDAwMDBaFw0yNzAyMDcyMzU5NTlaMBYxFDASBgNVBAMTC3Np
+bWdldGdvLnZuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsEUz7+Ln
+9DGHd33SHgDZT3Gq0STM/p3gBInHfk5EEGLc/iRsqoCJYIR4ihZwOlRErE1di+tY
+UCekzUfnsqPVSi2FbaTYXHsKOmqMQ+Dr+OW/rIZeY7b5/QJhec88u4vcYEUFScjE
+DjDOEYPe7OZLgcvfQsuITZdwUyTGjWiVX8A71wqXNblm8dftpqLnLOIRYx6D1H+m
+3rT/IvaeGl2b47MvvI9cQgLWVkLYkrcfherfZEdfugfU2NbZyaJ/sYLEuff3ryRz
+Lc7XN3ga/aZbRwfyMM/Q4KFE6lgQeZIK4cOKcid4DWBpswAFywe/VLTan4twk7b7
+V8n2SDzLq90q0QIDAQABo4IDDjCCAwowHwYDVR0jBBgwFoAUjYxexFStiuF36Zv5
+mwXhuAGNYeEwHQYDVR0OBBYEFHVNyTXZQzoMfn+Dad8oGpc73OsSMA4GA1UdDwEB
+/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEWF2h0
+dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEEeDB2
+ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FE
+b21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzABhhdo
+dHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAnBgNVHREEIDAeggtzaW1nZXRnby52boIP
+d3d3LnNpbWdldGdvLnZuMIIBjgYKKwYBBAHWeQIEAgSCAX4EggF6AXgAdwBgTJqv
+en93XwHUBvySDciZ6wscffjJUhv6+hd3O5eLyQAAAZuWG4M7AAAEAwBIMEYCIQD2
+Gm7YRVPTrA0OeRPzjlqfBrqomqi+gt55ex0ssmL8VAIhAMeVacY7Nj2qkPoKAz91
+GfyZaVVaCwrrVJe051xx/B6/AH0AjspHC6zeavOiBrCkeoS3Rv4fxr+VPiXmm07k
+AkjzxugAAAGblhuDegAIAAAFAAEkK3wEAwBGMEQCIGlO8q0wKV/6XWXqSfoKl/c9
+NnZGXRS65mLvs4ndvauoAiAK1/WSLuYl5MOh+xzHlQqaag4M/niVv5tmrEoQM5hl
+QgB+AFlubDOGlLJZcqJWyKDo3ZBKdugIPdqHOwEIOCgUPO5ZAAABm5YbhIIACAAA
+BQAACQ3qBAMARzBFAiBpdXIYgu+u7Ln7UCAgiwvIWkr9UF+0d6FdFsTu9bfURgIh
+ALBcLH/hrBg+He3mNN/mP0lst/Xj8bA8RQR4cmTYvu5LMA0GCSqGSIb3DQEBCwUA
+A4IBAQAgT24oAce5mYKk3U/x8e8QeZwfcuTu/id4O2DPM2jNCrMODYlvh8uKi9c/
+oI+Gjn0WPVywKmuinXRYViSM2cpaV4lWS7YSIC6kl/2YOscfPSIetXGf1QsZUSmz
+RBsR9yLZA91almf/4MN7GsbAC2LsXKAaUvnce1A+S21HWOw3BjAWkzJ+iRGzhLEa
+V1vcEs45tdFqqzep98S4MrcAAEDglcYNftds5N2WoZN69DEUZH+XnFyRJuFvQ4uj
+BwVKN0pbAqTfdgaQdg1LnCdLAYPeW39+pU/Np2kNfnvu+uk8RwlLgBmG+AjrYiCx
+LQ97Eeu1g7PateuPeV9n+aesiwST
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
+MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
+BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
+ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
+VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
+TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
+eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
+oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
+Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
+uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
+BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
++ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
+A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
+CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
+LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
+BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
+bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
+L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
+ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
+7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
+H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
+RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
+xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
+sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
+l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
+6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
+LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
+yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
+00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
+iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
+cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
+BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
+MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
+BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
+AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
+3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
+tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
+Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
+VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
+79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
+c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
+Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
+c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
+UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
+Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
+Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
+VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
+ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
+8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
+iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
+Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
+XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
+qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
+VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
+L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
+jjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----

+ 18 - 0
EsimLao/docs/ssl/simgetgo_vn/simgetgo_vn_csr.csr

@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIIC7zCCAdcCAQAwgakxCzAJBgNVBAYTAlZOMQ8wDQYDVQQIDAZIYSBOb2kxDzAN
+BgNVBAcMBkhhIE5vaTEvMC0GA1UECgwmQ09ORyBUWSBUTkhIIEdJQUkgUEhBUCBW
+SUVOIFRIT05HIFZJRVQxCzAJBgNVBAsMAklUMRQwEgYDVQQDDAtzaW1nZXRnby52
+bjEkMCIGCSqGSIb3DQEJARYVc3VwcG9ydEB2aWV0dGVjaC5hc2lhMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsEUz7+Ln9DGHd33SHgDZT3Gq0STM/p3g
+BInHfk5EEGLc/iRsqoCJYIR4ihZwOlRErE1di+tYUCekzUfnsqPVSi2FbaTYXHsK
+OmqMQ+Dr+OW/rIZeY7b5/QJhec88u4vcYEUFScjEDjDOEYPe7OZLgcvfQsuITZdw
+UyTGjWiVX8A71wqXNblm8dftpqLnLOIRYx6D1H+m3rT/IvaeGl2b47MvvI9cQgLW
+VkLYkrcfherfZEdfugfU2NbZyaJ/sYLEuff3ryRzLc7XN3ga/aZbRwfyMM/Q4KFE
+6lgQeZIK4cOKcid4DWBpswAFywe/VLTan4twk7b7V8n2SDzLq90q0QIDAQABoAAw
+DQYJKoZIhvcNAQELBQADggEBAJTDf9ostJcC+MefY4BHBkWBrQ8i1XEK8UHIzJiu
+caMVvgpLnSPeYXWf7fQ/HLuNjF8oMNrWpHGsMhnN0jdLcUHhUn/Jdu+7pwepuecv
+O+KzatTklsO2Rp819VWhE3o19BoQ0AVvssLogN2yKkqbrRM7deXegF9KVadlWmr8
+fgi0RDZhB+RavWa5E46U5bNAUIxEr5IbigZDZrVS3KQKDoMRN++y8FifnZKZoeY+
+1ChUr6+GnCPexGXFFKYYh4oY/V21r3P1e0vNjEIsdxIqPsBysKkC04pPAkn0F6/I
+LayQ8yDa2kGlM0tp0s1EwBvGNKIhs9orEj7R5z6ZZq60xiA=
+-----END CERTIFICATE REQUEST-----

+ 1 - 0
EsimLao/docs/ssl/simgetgo_vn/simgetgo_vn_passwordpfx.txt

@@ -0,0 +1 @@
+4XwYwOUOO5

+ 28 - 0
EsimLao/docs/ssl/simgetgo_vn/simgetgo_vn_private_key.key

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCwRTPv4uf0MYd3
+fdIeANlPcarRJMz+neAEicd+TkQQYtz+JGyqgIlghHiKFnA6VESsTV2L61hQJ6TN
+R+eyo9VKLYVtpNhcewo6aoxD4Ov45b+shl5jtvn9AmF5zzy7i9xgRQVJyMQOMM4R
+g97s5kuBy99Cy4hNl3BTJMaNaJVfwDvXCpc1uWbx1+2moucs4hFjHoPUf6betP8i
+9p4aXZvjsy+8j1xCAtZWQtiStx+F6t9kR1+6B9TY1tnJon+xgsS59/evJHMtztc3
+eBr9pltHB/Iwz9DgoUTqWBB5kgrhw4pyJ3gNYGmzAAXLB79UtNqfi3CTtvtXyfZI
+PMur3SrRAgMBAAECggEAbXW759Z3BdwP7HL0nO8YA05prdB1gBOXvhm1CUke2TIb
+W7JQzJxfMtFwbQe8D2yu7HRqh+3QfI3xuAxT5En6tEKKXekE9oDtfBMYITq2Lmy1
+VzRlvvQsTyJAV70KUMhsRFf4DbafkNRb0uKZ93CXKPXqIXd0oAJPnUH0DnIIeFlG
+i1HlEHg7GlZc7U/SBeYZ5GYauVexpK1gOpZ9WDqpfaex1ZR1hYG9S42zgY2gM0nl
+fFAz9g4W18lU8uDA5GkmijQA7jptZRUTggqJ/Hq0GQF+XV2Ysj+3d/EpHSd4QCKc
+Cvg9qAHGfemlr0r/DdT8DQADtMGuGrJdAv/i1ED+QQKBgQDcmozVnEx6jyEOYO2p
+ZX+1Qc6F4OH9QbPIAM2lo1F8gnslrYeBs0Xx3Ih74HfWWLZk4nAMNQaoRwDU1zzV
+jLr8M3q60r/TzxQfPnDCpybYxuqsPJH4CmY5TorF3/xU4VCxrJMrC/ISbIxEK0bj
+PMnyQ4OC8R/3WDsOZycFP+0m6QKBgQDMjaDSoAdOCLb9cWvmSZ6ivi6m8+V0cdCX
+W5Y3WHUHd854jDUk10u+AGr25BkERBHocWmewEDiQXtBx6fij6djWtL+aJDb4vz3
+HwqNkSoJ4lDyTI8Uqmv5SW59FA4WbF+sK1ZPtXpnGpHNQV45Z/mj9tStDzW97WBF
+SgwR8XPDqQKBgQCoWhGsWtFKnrwdWv9ETT8+tm/DX7FXMrLeqS5Hf/GJ0ZHlWR6W
+bpesUh6eWtlZbO4U43Ga/0SLW1RZGcFFP1bbbPX2aSsXm2rBxUcMZb+Ro4wn0Tmc
+T2NfzH6/L4ZDyIdqcEcHjOA6CzioNVatyBBdoARXA2jfvCelgDcZHIYBMQKBgEjT
+n899hDxHJAdl61mJGn6soWV1blsf7nkE9Z1s0/W9tPf8Syt7r47NDUgre7CmH44X
+WthXcIJdd+m6kM48AQeBnZ9QUUrILPI6zgILDeGI/vLVSRe9eUW+3CSSEFXxbbqZ
+j1g/r32n2wMt48MifqHezmdzA9pD+kOREm0M/v9JAoGBALNVBbDcV3DJ4VuK9XOm
+0H09+9mUI92Qs3tUShJVjhSzRv9VdH2+cn7cgqXhfipnjto56Y7KAnPJ0iax9VwS
++ffnVlMDNp2J0VqUpfibQ8rU+RfEuqIG2J1wlzMu9eKipN+RRdMjL5TD2tEsDthL
+LxMq89fXimIEf31yxhh03ed0
+-----END PRIVATE KEY-----

+ 7 - 22
EsimLao/esim-vite/src/pages/checkout/CheckoutView.tsx

@@ -18,6 +18,7 @@ import {
 import { useAppDispatch, useAppSelector } from "../../hooks/useRedux";
 import { productApi } from "../../apis/productApi";
 import { openPopup } from "../../features/popup/popupSlice";
+import { formatNumber } from "../../logic/loigicUtils";
 
 const CheckoutView = () => {
   const navigate = useNavigate();
@@ -292,17 +293,11 @@ const CheckoutView = () => {
               </div>
               <div className="text-right">
                 <p className="text-xs text-slate-400 line-through font-bold">
-                  {state.checkoutDetails.paymentMoney.toLocaleString("vi-VN", {
-                    minimumFractionDigits: 2,
-                    maximumFractionDigits: 2,
-                  })}{" "}
+                  {formatNumber(state.checkoutDetails.paymentMoney)}{" "}
                   {state.checkoutDetails.curency}
                 </p>
                 <p className="text-[#0071e3] font-black text-xl">
-                  {state.checkoutDetails.totalMoney.toLocaleString("vi-VN", {
-                    minimumFractionDigits: 2,
-                    maximumFractionDigits: 2,
-                  })}{" "}
+                  {formatNumber(state.checkoutDetails.totalMoney)}{" "}
                   {state.checkoutDetails.curency}
                 </p>
               </div>
@@ -408,23 +403,16 @@ const CheckoutView = () => {
               <div className="flex justify-between text-slate-600 font-bold">
                 <span>Subtotal:</span>
                 <span>
-                  {(
+                  {formatNumber(
                     state.checkoutDetails.totalMoney * state.quantity
-                  ).toLocaleString("vi-VN", {
-                    minimumFractionDigits: 2,
-                    maximumFractionDigits: 2,
-                  })}{" "}
+                  )}{" "}
                   {state.checkoutDetails.curency}
                 </span>
               </div>
               <div className="flex justify-between text-green-600 font-bold">
                 <span>Discount:</span>
                 <span>
-                  -
-                  {(0 * state.quantity).toLocaleString("vi-VN", {
-                    minimumFractionDigits: 2,
-                    maximumFractionDigits: 2,
-                  })}{" "}
+                  -{formatNumber(0 * state.quantity)}{" "}
                   {state.checkoutDetails.curency}
                 </span>
               </div>
@@ -433,10 +421,7 @@ const CheckoutView = () => {
                   Total ({state.quantity}):
                 </span>
                 <span className="text-[#0071e3] font-black text-3xl">
-                  {state.checkoutDetails.paymentMoney.toLocaleString("vi-VN", {
-                    minimumFractionDigits: 2,
-                    maximumFractionDigits: 2,
-                  })}{" "}
+                  {formatNumber(state.checkoutDetails.paymentMoney)}{" "}
                   {state.checkoutDetails.curency}
                 </span>
               </div>

+ 2 - 6
EsimLao/esim-vite/src/pages/home/components/HomeProduct.tsx

@@ -10,6 +10,7 @@ import {
 } from "../../../features/loading/loadingSlice";
 import { DataCacheKey, staleTime } from "../../../global/constants";
 import { Area } from "../../../services/product/type";
+import { formatNumber } from "../../../logic/loigicUtils";
 
 const HomeProduct = () => {
   const [activeTab, setActiveTab] = useState<"country" | "region">("country");
@@ -127,12 +128,7 @@ const HomeProduct = () => {
                 {p.minSellPrice} {p.curency}
               </p>
               <p className="text-lg md:text-2xl font-black text-[#EE0434]">
-                From{" "}
-                {p.minDisplayPrice.toLocaleString("vi-VN", {
-                  minimumFractionDigits: 2,
-                  maximumFractionDigits: 2,
-                })}{" "}
-                {p.curency}
+                From {formatNumber(p.minDisplayPrice)} {p.curency}
               </p>
             </div>
           ))}

+ 3 - 9
EsimLao/esim-vite/src/pages/order-detail/OrderDetailView.tsx

@@ -10,6 +10,7 @@ import { useMutation } from "@tanstack/react-query";
 import React, { useState, useEffect } from "react";
 import { useLocation, useNavigate } from "react-router-dom";
 import { openQRModal } from "../../features/popup/popupSlice";
+import { formatNumber } from "../../logic/loigicUtils";
 
 const OrderDetailView = () => {
   const location = useLocation();
@@ -292,11 +293,7 @@ const OrderDetailView = () => {
             {/* Divider with Total */}
             <div className="relative flex items-center justify-center border-t border-slate-100 py-8">
               <span className="bg-white px-4 text-lg md:text-xl font-bold text-slate-800 absolute">
-                Total:{" "}
-                {state.orderHistory?.totalMoney.toLocaleString("vi-VN", {
-                  minimumFractionDigits: 2,
-                  maximumFractionDigits: 2,
-                })}{" "}
+                Total: {formatNumber(state.orderHistory?.totalMoney)}{" "}
                 <span className="text-slate-500 font-normal">
                   ({state.orderHistory?.curency})
                 </span>
@@ -478,10 +475,7 @@ const OrderDetailView = () => {
                       </button>
                       <div className="text-right">
                         <span className="text-xl font-bold text-slate-800">
-                          {pkg.paymentMoney.toLocaleString("vi-VN", {
-                            minimumFractionDigits: 2,
-                            maximumFractionDigits: 2,
-                          })}
+                          {formatNumber(pkg.paymentMoney)}{" "}
                         </span>
                         <span className="text-slate-500 font-medium ml-1 font-bold">
                           {" "}

+ 3 - 10
EsimLao/esim-vite/src/pages/order-history/OrderHistoryView.tsx

@@ -5,6 +5,7 @@ import { useAppDispatch } from "../../hooks/useRedux";
 import { OrderHistory } from "../../services/product/type";
 import { useMutation } from "@tanstack/react-query";
 import React, { useState, useEffect } from "react";
+import { formatNumber } from "../../logic/loigicUtils";
 
 const OrderHistoryView = () => {
   const [searchOrder, setSearchOrder] = useState("");
@@ -246,18 +247,10 @@ const OrderHistoryView = () => {
                   </div>
                   <div className="text-right">
                     <p className="text-xl font-black text-slate-900">
-                      {order.paymentMoney.toLocaleString("vi-VN", {
-                        minimumFractionDigits: 2,
-                        maximumFractionDigits: 2,
-                      })}{" "}
-                      ({order.curency})
+                      {formatNumber(order.paymentMoney)} ({order.curency})
                     </p>
                     <p className="text-sm font-bold text-slate-400">
-                      {order.totalMoney.toLocaleString("vi-VN", {
-                        minimumFractionDigits: 2,
-                        maximumFractionDigits: 2,
-                      })}{" "}
-                      ({order.curency})
+                      {formatNumber(order.totalMoney)} ({order.curency})
                     </p>
                   </div>
                 </div>

+ 3 - 10
EsimLao/esim-vite/src/pages/product-detail/ProductDetailView.tsx

@@ -9,6 +9,7 @@ import { startLoading, stopLoading } from "../../features/loading/loadingSlice";
 import { productApi } from "../../apis/productApi";
 import { openPopup } from "../../features/popup/popupSlice";
 import { get } from "http";
+import { formatNumber } from "../../logic/loigicUtils";
 
 const ProductDetailView: React.FC = () => {
   const location = useLocation();
@@ -413,19 +414,11 @@ const ProductDetailView: React.FC = () => {
                   -{prices.discountPercent}%
                 </span>
                 <span className="text-slate-300 font-bold text-xs line-through">
-                  {prices.original.toLocaleString("vi-VN", {
-                    minimumFractionDigits: 2,
-                    maximumFractionDigits: 2,
-                  })}{" "}
-                  {area.curency}
+                  {formatNumber(prices.original)} {area.curency}
                 </span>
               </div>
               <span className="text-[#EE0434] font-black text-2xl md:text-3xl">
-                {prices.final.toLocaleString("vi-VN", {
-                  minimumFractionDigits: 2,
-                  maximumFractionDigits: 2,
-                })}{" "}
-                {area.curency}
+                {formatNumber(prices.final)} {area.curency}
               </span>
             </div>
             <button