durianpay

package module
v0.1.0-beta Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 21, 2023 License: MIT Imports: 2 Imported by: 0

README

DurianPay SDK for Go

Test Status

Table of Contents

Overview

🚧 The SDK is currently undergoing heavy development with frequent changes, because of this the current major version is zero (v0.x.x) 🚧

Durianpay is a payments platform and aggregator which helps business to connect with different payment service providers (PSPs) and gateways.

Durianpay provides SDKs in several programming languages but not Go. Because of this, this SDK was created.

For more information, visit the DurianPay API Official documentation.

Installation

Make sure you are using go version 1.18 or later

go get github.com/abmid/dpay-sdk-go

Documentation

package main

import (
	"context"

	durianpay "github.com/abmid/dpay-sdk-go"
	"github.com/abmid/dpay-sdk-go/client"
)

func main() {
	// Init client to access all difference resources
	c := client.NewClient(client.Options{
		ServerKey: "XXX-XXX",
	})

	//----------------------------------------------
	// Example Validate Disbursement
	//----------------------------------------------
	payload := durianpay.DisbursementValidatePayload{
		XIdempotencyKey: "1",
		AccountNumber:   "12345678",
		BankCode:        "bca",
	}

	res, err := c.Disbursement.Validate(context.Background(), payload)
	if err != nil {
		// Handle error
	}
}

For more examples, please check directory example.

API Supports

  • ORDERS
    • Create Order
    • Fetch Orders
    • Fetch By ID
    • Create Payment Link
  • PAYMENTS
    • Charge Payment
    • Fetch Payments
    • Fetch Payment By ID
    • Check Payment Status
    • Verify Payment
    • Cancel Payment
    • MDR Fees Calculation
  • PROMOS
    • Create Promo
    • Fetch Promos
    • Fetch Promo By ID
    • Delete Promo
    • Update Promo
  • DISBURSEMENTS
    • Submit Disbursement
    • Approve Disbursment
    • Validate Disbursement (Tested)
    • Fetch Bank List
    • Topup Amount
    • Fetch Topup Detail By ID
    • Fetch Balance
    • Fetch Disbursement Items By ID
    • Fetch Disbursement By ID
    • Delete Disbusement By ID
  • SETTLEMENTS
    • Fetch Settlements
    • Detail Settlement By ID
    • Status Settlement By ID
    • Fetch Settlement By ID
  • REFUNDS
    • Create Refund
    • Fetch Refunds
    • Fetch Refund By ID
  • E-WALLET Account
    • Link E-Wallet Account
    • Unlink E-Wallet Account
    • Detail E-Wallet Account
  • VIRTUAL ACCOUNTS
    • Create VA
    • Fetch VAs
    • Fetch VA By ID
    • Patch VA By ID
    • Simulate VA Payment
  • INVOINCES
    • Create Invoince
    • Generate Checkout URL
    • Fetch Invoice By ID
    • Fetch Invoices / List Invoices
    • Update Invoice
    • Pay Invoice
    • Manual Payment Invoice
    • Delete Invoice

Contributing

We are open and grateful for any contribution. If you want to contribute please do PR and follow the code guide.

License

Copyright (c) 2023-present Abdul Hamid and Contributors. This SDK is free and open-source software licensed under the MIT License.

Documentation

Overview

* File Created: Friday, 28th July 2023 5:33:23 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Friday, 28th July 2023 5:26:55 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Friday, 28th July 2023 6:23:33 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Saturday, 2nd September 2023 1:53:00 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Monday, 18th September 2023 11:34:44 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Wednesday, 23rd August 2023 11:54:14 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Monday, 4th September 2023 4:44:39 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Sunday, 3rd September 2023 10:43:37 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Wednesday, 30th August 2023 11:47:06 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Saturday, 2nd September 2023 3:27:26 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

* File Created: Tuesday, 29th August 2023 2:47:43 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

Index

Constants

View Source
const (
	ErrorCodeSDK                    = "SDK_ERROR"
	ErrorCodeDPAYInternalError      = "DPAY_INTERNAL_ERROR"
	ErrorCodeDPAYUnauthorizedAccess = "DPAY_UNAUTHORIZED_ACCESS"
	ErrorCodeDPAYInvalidRequest     = "DPAY_INVALID_REQUEST"
)
View Source
const (
	DurianpayURL = "https://api.durianpay.id"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Customer

type Customer struct {
	CustomerRefID string          `json:"customer_ref_id"`
	GivenName     string          `json:"given_name"`
	Email         string          `json:"email"`
	Mobile        string          `json:"mobile"`
	Address       CustomerAddress `json:"address"`
}

type CustomerAddress

type CustomerAddress struct {
	ReceiverName  string `json:"receiver_name"`
	ReceiverPhone string `json:"receiver_phone"`
	Label         string `json:"label"`
	AddressLine1  string `json:"address_line_1"`
	AddressLine2  string `json:"address_line_2"`
	City          string `json:"city"`
	Region        string `json:"Region"`
	Country       string `json:"country"`
	PostalCode    string `json:"postal_code"`
	Landmark      string `json:"landmark"`
}

CustomerAddress is part of Customer for attribute Address

type DisbursementApproveOption

type DisbursementApproveOption struct {
	IgnoreInvalid *bool `url:"ignore_invalid"`
}

DisbursementApproveOption is paramaeter for approve disbursement API

type DisbursementApprovePayload

type DisbursementApprovePayload struct {
	XIdempotencyKey string `json:"-"`
	ID              string `json:"id"` //Disbursement ID
}

DisbursementApprovePayload is payload for request approve disbursement API

type DisbursementFetchItemsOption

type DisbursementFetchItemsOption struct {
	Skip  uint16 `json:"skip"`
	Limit uint16 `json:"limit"`
}

DisbursementFetchItemsOption is parameter for Fetch Disbursement Items API

type DisbursementItemPayload

type DisbursementItemPayload struct {
	AccountOwnerName string `json:"account_owner_name" validate:"required"`
	BankCode         string `json:"bank_code" validate:"required"`
	Amount           string `json:"amount" validate:"required"`
	AccountNumber    string `json:"account_number" validate:"required"`
	EmailRecipient   string `json:"email_recipient"`
	PhoneNumber      string `json:"phone_number"`
	Notes            string `json:"notes"`
}

DisbursementItemPayload is part of DisbursementPayload for attribute items

type DisbursementOption

type DisbursementOption struct {
	ForceDisburse  *bool `url:"force_disburse"`
	SkipValidation *bool `url:"skip_validation"`
}

DisbursementOption is parameter for submit disbursement API

type DisbursementPayload

type DisbursementPayload struct {
	XIdempotencyKey string                    `json:"-" validate:"required"`
	IdempotencyKey  string                    `json:"-" validate:"required"`
	Name            string                    `json:"name"`
	Description     string                    `json:"description"`
	Items           []DisbursementItemPayload `json:"items"`
}

DisbursementPayload is payload for request disbursement API

type DisbursementTopupPayload

type DisbursementTopupPayload struct {
	XIdempotencyKey string `json:"-"`
	BankID          uint16 `json:"bank_id"`
	Amount          string `json:"amount"`
}

DisbursementTopupPayload is payload for request Topup Amount API

type DisbursementValidatePayload

type DisbursementValidatePayload struct {
	XIdempotencyKey string `json:"-"`
	AccountNumber   string `json:"account_number"`
	BankCode        string `json:"bank_code"`
}

DisbursementValidatePayload is payload for request validate disbursement API

type Error

type Error struct {
	StatusCode   int      // Response from http status code
	Error        string   `json:"error"`
	ErrorCode    string   `json:"error_code"`
	Errors       []Errors `json:"errors"`
	Message      string   `json:"message"`
	ResponseCode string   `json:"response_code"` // ResponseCode currenty only present for Invoice API
}

Error is commons response error DurianPay

func FromAPI

func FromAPI(statusCode int, responseBody []byte) *Error

func FromSDKError

func FromSDKError(err error) *Error

type Errors

type Errors struct {
	Field   string `json:"field"`
	Message string `json:"message"`
}

type EwalletAccountLinkPayload

type EwalletAccountLinkPayload struct {
	Mobile      string `json:"mobile"`
	WalletType  string `json:"wallet_type"`
	RedirectURL string `json:"redirect_url"`
}

EwalletAccountLinkPayload is payload for Link E-Wallet Account API.

type Invoice

type Invoice struct {
	ID                string `json:"id"`
	TransactionAmount string `json:"transaction_amount"`
}

Invoice is part of InvoicePay for attribute Invoices.

type InvoiceCreatePayload

type InvoiceCreatePayload struct {
	Amount                   string         `json:"amount"`
	RemainingAmount          string         `json:"remaining_amount"`
	Title                    string         `json:"title"`
	InvoiceRefID             string         `json:"invoice_ref_id"`
	Customer                 Customer       `json:"customer"`
	EnablePartialTransaction bool           `json:"enable_partial_transaction"`
	PartialTransactionConfig map[string]any `json:"partial_transaction_config"` // Key-Value pair that can be used to store configuration about partial transactions like minimum acceptable amount for a partial transaction
	StartDate                time.Time      `json:"start_date"`
	DueDate                  time.Time      `json:"due_date"`
}

InvoiceCreate represents payload for Create Invoice API.

type InvoiceFetchOption

type InvoiceFetchOption struct {
	From   string `json:"from"`
	To     string `json:"to"`
	Skip   uint32 `json:"skip"`
	Limit  uint16 `json:"limit"`
	Status string `json:"status"`
}

InvoiceFetchOption represents paramater for List Invoices API.

type InvoiceManualPayPayload

type InvoiceManualPayPayload struct {
	ID     string `json:"id"`
	Amount string `json:"amount"`
}

InvoiceManualPay represents payload for Manual Payment for Invoice API.

type InvoicePayPayload

type InvoicePayPayload struct {
	BankCode   string    `json:"bank_code"`
	Invoices   []Invoice `json:"invoices"`
	CustomerID string    `json:"customer_id"`
}

InvoicePay represents payload for Pay Invoice API.

type InvoiceUpdatePayload

type InvoiceUpdatePayload struct {
	InvoiceRefID             string         `json:"invoice_ref_id"`
	Title                    string         `json:"title"`
	StartDate                time.Time      `json:"start_date"`
	DueDate                  time.Time      `json:"due_date"`
	InvoiceURL               string         `json:"invoice_url"`
	EnablePartialTransaction bool           `json:"enable_partial_transaction"`
	PartialTransactionConfig map[string]any `json:"partial_transaction_config"` // Key-Value pair that can be used to store configuration about partial transactions like minimum acceptable amount for a partial transaction
	IsBlocked                bool           `json:"is_blocked"`
	RemainingAmount          string         `json:"remaining_amount"`
	Metadata                 map[string]any `json:"metadata"`
}

InvoiceUpdate represents payload for Update Invoice API.

type OrderFetchByIDOption

type OrderFetchByIDOption struct {
	Expand string `url:"expand"`
}

OrderFetchByIDOption is parameter for requests Order Fetch By ID API

type OrderFetchOption

type OrderFetchOption struct {
	From  string `url:"form"`
	To    string `url:"to"`
	Skip  uint16 `url:"skip"`
	Limit uint16 `url:"limit"`
}

OrderFetchOption is parameter for requests Orders Fetch API

type OrderItem

type OrderItem struct {
	Name  string `json:"name"`
	Qty   uint16 `json:"qty"`
	Price string `json:"price"`
}

OrderItem is part of CreatePayload for attribute Items

type OrderPayload

type OrderPayload struct {
	Amount        string         `json:"amount"`
	PaymentOption string         `json:"payment_option"`
	Currency      string         `json:"currency"`
	OrderRefID    string         `json:"order_ref_id"`
	Customer      Customer       `json:"customer"`
	Items         []OrderItem    `json:"items"`
	Metadata      map[string]any `json:"metadata"`
	ExpiryDate    time.Time      `json:"expiry_date"`
}

OrderPayload is payload for requests Create Orders API

type OrderPaymentLinkCustomer

type OrderPaymentLinkCustomer struct {
	Email string `json:"email"`
}

OrderPaymentLinkCustomer is part of OrderPaymentLinkPayload

type OrderPaymentLinkPayload

type OrderPaymentLinkPayload struct {
	Amount        string                   `json:"amount"`
	Currency      string                   `json:"currency"`
	OrderRefID    string                   `json:"order_ref_id"`
	IsPaymentLink bool                     `json:"is_payment_link"`
	Customer      OrderPaymentLinkCustomer `json:"customer"`
}

OrderPaymentLinkPayload is payload for requests Create Payment Link API

type PaymentCapturePayload

type PaymentCapturePayload struct {
	Amount string `json:"amount"`
}

PaymentCapturePayload is payload for Payment Capture API

type PaymentChargeBNPLPayload

type PaymentChargeBNPLPayload struct {
	OrderID               string                `json:"order_id"`
	Amount                string                `json:"amount"`
	PaymentRefID          string                `json:"payment_ref_id"`
	PaymentMethodUniqueID string                `json:"payment_method_unique_id"`
	CustomerInfo          PaymentCustomerInfo   `json:"customer_info"`
	SandboxOption         *PaymentSandboxOption `json:"-"` // If you want send request as Sandbox use this option
}

PaymentChargeBNPLPayload is requests payload for Payment Charge API. This requests for `BNPL`

type PaymentChargeCardPayload

type PaymentChargeCardPayload struct {
	OrderID      string              `json:"order_id"`
	Amount       string              `json:"amount"`
	PaymentRefID string              `json:"payment_ref_id"`
	CustomerInfo PaymentCustomerInfo `json:"customer_info"`
}

PaymentChargeCardPayload is requests payload for Payment Charge API. This requests for type `CARD`

type PaymentChargeEwalletPayload

type PaymentChargeEwalletPayload struct {
	OrderID       string                `json:"order_id"`
	Amount        string                `json:"amount"`
	Mobile        string                `json:"mobile"`
	WalletType    string                `json:"wallet_type"`
	SandboxOption *PaymentSandboxOption `json:"-"` // If you want send request as Sandbox use this option
}

PaymentChargeEwalletPayload is requests payload for Payment Charge API. This request for type E-WALLET

type PaymentChargeOnlineBankingPayload

type PaymentChargeOnlineBankingPayload struct {
	OrderID      string              `json:"order_id"`
	Type         string              `json:"type"`
	Name         string              `json:"name"`
	Amount       string              `json:"amount"`
	CustomerInfo PaymentCustomerInfo `json:"customer_info"`
	Mobile       string              `json:"mobile"`
}

PaymentChargeOnlineBankingPayload is requests payload for Payment Charge API. This requests for type `Online Banking`

type PaymentChargeQRISPayload

type PaymentChargeQRISPayload struct {
	OrderID string `json:"order_id"`
	Type    string `json:"type"`
	Amount  string `json:"amount"`
	Name    string `json:"name"`
}

PaymentChargeQRISPayload is requests payload for Payment Charge API. This requests for type `QRIS`

type PaymentChargeRetailStorePayload

type PaymentChargeRetailStorePayload struct {
	OrderID       string                `json:"order_id"`
	BankCode      string                `json:"bank_code"`
	Name          string                `json:"name"`
	Amount        string                `json:"amount"`
	PaymentRefID  string                `json:"payment_ref_id"`
	SandboxOption *PaymentSandboxOption `json:"-"` // If you want send request as Sandbox use this option
}

PaymentChargeRetailStorePayload is requests payload for Payment Charge API. This request for type `Retail Store`

type PaymentChargeVAPayload

type PaymentChargeVAPayload struct {
	OrderID       string                `json:"order_id"`
	BankCode      string                `json:"bank_code"`
	Name          string                `json:"name"`
	Amount        string                `json:"amount"`
	PaymentRefID  string                `json:"payment_ref_id"`
	SandboxOption *PaymentSandboxOption // If you want send request as Sandbox use this option
}

PaymentChargeVAPayload is requests payload for Payment Charge API. This request for type `VA`

type PaymentCustomerInfo

type PaymentCustomerInfo struct {
	Email     string `json:"email"`
	GivenName string `json:"given_name"`
	ID        string `json:"id"`
}

PaymentCustomerInfo is part of PaymentRequestOnlineBanking for attribute Customer Info

type PaymentFetchByIDOption

type PaymentFetchByIDOption struct {
	Expand string `url:"expand"` // customer or order
}

PaymentFetchByIDOption is parameter for Payment Fetch by ID API.

type PaymentFetchOption

type PaymentFetchOption struct {
	From  string `url:"from"`
	To    string `url:"to"`
	Skip  uint16 `url:"skip"`
	Limit uint16 `url:"limit"`
}

PaymentFetchOption is parameter for Payment Fetch API.

type PaymentMDRFeesOption

type PaymentMDRFeesOption struct {
	Amount        string `url:"amount"`
	PaymentMethod string `url:"payment_method"`
}

PaymentMDRFeesOption is parameter for MDR Fees Calculation API.

type PaymentSandboxOption

type PaymentSandboxOption struct {
	ForceFail bool `json:"force_fail"`
	DelayMS   int  `json:"delay_ms"`
}

PaymentSandboxOption is option for request payment charge as Sanbox Mode.

type PaymentVerifyPayload

type PaymentVerifyPayload struct {
	VerificationSignature string `json:"verification_signature"`
}

PaymentVerifyPayload is payload for Verify Payments API

type PromoDetails

type PromoDetails struct {
	BinList   []int    `json:"bin_list"`
	BankCodes []string `json:"bank_codes"`
}

PromoDetails is part of PromoPayload

type PromoPayload

type PromoPayload struct {
	Type               string       `json:"type"`
	Label              string       `json:"label"`
	Currency           string       `json:"currency"`
	PromoDetails       PromoDetails `json:"promo_details"`
	DiscountType       string       `json:"discount_type"`
	Discount           string       `json:"discount"`
	MinOrderAmount     string       `json:"min_order_amount"`
	MaxDiscountAmount  string       `json:"max_discount_amount"`
	StartsAt           time.Time    `json:"starts_at"`
	EndsAt             time.Time    `json:"ends_at"`
	PromoType          string       `json:"promo_type"`
	Description        string       `json:"description"`
	SubType            string       `json:"sub_type"`
	LimitType          string       `json:"limit_type"`
	LimitValue         string       `json:"limit_value"`
	PriceDeductionType string       `json:"price_deduction_type"`
	Code               string       `json:"code"`
}

PromoPayload use for Create & Update Promo API

type RefundFetchOption

type RefundFetchOption struct {
	From  string `url:"from"`
	To    string `url:"to"`
	Skip  uint16 `url:"skip"`
	Limit uint16 `url:"limit"`
}

RefundFetchOption is parameter for Refund Fetch API

type RefundPayload

type RefundPayload struct {
	RefID         string `json:"ref_id"`
	PaymentID     string `json:"payment_id"`
	Amount        string `json:"amount"`
	UseRefundLink bool   `json:"use_refund_link"`
	Notes         string `json:"notes"`
}

RefundPayload is struct for payload Create Refund API

type SettlementOption

type SettlementOption struct {
	From  string `url:"from"`
	To    string `url:"to"`
	Skip  uint16 `url:"skip"`
	Limit uint16 `url:"limit"`
}

SettlementOption is parameter for Fetch and Details API.

type VirtualAccountCustomer

type VirtualAccountCustomer struct {
	GivenName string `json:"given_name"`
	Mobile    string `json:"mobile"`
	Email     string `json:"email"`
}

VirtualAccountCustomer is part of VirtualAccountPayload for attribute Customer

type VirtualAccountFetchOption

type VirtualAccountFetchOption struct {
	From  string `url:"from"`
	To    string `url:"to"`
	Skip  uint16 `url:"skip"`
	Limit uint16 `url:"limit"`
}

VirtualAccountFetchOption is parameter for Virtual Account Fetch API

type VirtualAccountPatchPayload

type VirtualAccountPatchPayload struct {
	ExpiryMinutes uint32 `json:"expiry_minutes"`
	MinAmount     uint32 `json:"min_amount"`
	MaxAmount     uint32 `json:"max_amount"`
	Amount        uint32 `json:"amount"`
	IsDisabled    bool   `json:"is_disabled"`
	VaRefID       string `json:"va_ref_id"`
}

VirtualAccountPatchPayload is payload for Virtual Account Patch By ID API

type VirtualAccountPayload

type VirtualAccountPayload struct {
	BankCode                string                 `json:"bank_code"`
	Name                    string                 `json:"name"`
	IsClosed                bool                   `json:"is_closed"`
	Amount                  string                 `json:"amount"`
	Customer                VirtualAccountCustomer `json:"customer"`
	ExpiryMinutes           uint32                 `json:"expiry_minutes"`
	AccountSuffix           string                 `json:"account_suffix"`
	IsReusable              bool                   `json:"is_reusable"`
	VaRefID                 string                 `json:"va_ref_id"`
	MinAmount               uint32                 `json:"min_amount"`
	MaxAmount               uint32                 `json:"max_amount"`
	AutoDisableAfterPayment bool                   `json:"auto_disable_after_payment"`
}

VirtualAccountPayload is payload for Virtual Account Create API.

type VirtualAccountPaymentSimulatePayload

type VirtualAccountPaymentSimulatePayload struct {
	Amount        string `json:"amount"`
	AccountNumber string `json:"account_number""`
	ForceFail     bool   `json:"force_fail"`
}

VirtualAccountPaymentSimulatePayload is payload for Virtual Account Payment Simulate API

Directories

Path Synopsis
* File Created: Sunday, 30th July 2023 12:22:26 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Sunday, 30th July 2023 12:22:26 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Saturday, 29th July 2023 10:39:48 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Saturday, 29th July 2023 10:39:48 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Friday, 28th July 2023 6:42:39 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Friday, 28th July 2023 6:42:39 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Saturday, 2nd September 2023 2:00:00 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Saturday, 2nd September 2023 2:00:00 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Thursday, 21st September 2023 5:08:28 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Thursday, 21st September 2023 5:08:28 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
internal
tests
* File Created: Sunday, 30th July 2023 3:57:52 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Sunday, 30th July 2023 3:57:52 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
tests/mock
Package mock_common is a generated GoMock package.
Package mock_common is a generated GoMock package.
* File Created: Monday, 18th September 2023 11:33:54 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Monday, 18th September 2023 11:33:54 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Thursday, 24th August 2023 6:36:16 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Thursday, 24th August 2023 6:36:16 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Tuesday, 5th September 2023 11:13:19 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Tuesday, 5th September 2023 11:13:19 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Sunday, 3rd September 2023 10:52:35 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Sunday, 3rd September 2023 10:52:35 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Friday, 1st September 2023 11:29:06 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Friday, 1st September 2023 11:29:06 am * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Saturday, 2nd September 2023 3:34:42 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Saturday, 2nd September 2023 3:34:42 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Tuesday, 29th August 2023 10:51:07 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author
* File Created: Tuesday, 29th August 2023 10:51:07 pm * Author: Abdul Hamid (abdul.surel@gmail.com) * * Copyright (c) 2023 Author

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL