Skip to content

Authorized email template #90

Open
@Tun95

Description

@Tun95

Hello, I'm seeking assistance in resolving some issues. Would you mind helping me with the following concerns?

SANDBOX:

QUESTIONS:

  1. how do i remove ======= ADDITIONAL INFORMATION ====== section
  2. how to edit ========= SECURITY STATEMENT ==========
  3. line items Description: 20" POQE CHOPZ 1z (SET) is in place of Name field, while Description field does not exist
  4. what is the setState for Customer ID :, Fax :, E-Mail : in ==== CUSTOMER BILLING INFORMATION === and do i remove Fax: field
  5. is the address verification here active: Address Verification : Street Address: Match -- First 5 Digits of Zip: Match

Here is Authorized email template structure

========= SECURITY STATEMENT ==========
It is not recommended that you ship product(s) or otherwise grant services relying solely upon this e-mail receipt.

========= GENERAL INFORMATION =========
Merchant : Tunji Akande (892376)
Date/Time : 25-May-2024 16:47:08 PDT

========= ORDER INFORMATION =========
Invoice : 66526e8435e29ba88ab6
Description : Product Description
Amount : 5.00 (USD)
Payment Method: MasterCard xxxx0015
Transaction Type: Authorization and Capture

============== Line Items ==============
Item: 6648d9dcee746c8f357abead
Description: 20" POQE CHOPZ 1z (SET)
Quantity: 1
Unit Price: $16500.00 (USD)
Item Total: $16500.00 (USD)

============== RESULTS ==============
Response : This transaction has been approved.
Auth Code : GFEV2D
Transaction ID : 80019050046
Address Verification : Street Address: Match -- First 5 Digits of Zip: Match

==== CUSTOMER BILLING INFORMATION ===
Customer ID :
First Name :
Last Name :
Company :
Address :
City :
State/Province :
Zip/Postal Code :
Country :
Phone :
Fax :
E-Mail :

==== CUSTOMER SHIPPING INFORMATION ===
First Name :
Last Name :
Company :
Address :
City :
State/Province :
Zip/Postal Code :
Country :

======= ADDITIONAL INFORMATION ======
Tax :
Duty :
Freight :
Tax Exempt :
PO Number :

//NODE.JS//
//ROUTE
//===================
// AUTHORIZED GATEWAY
//===================
orderRouter.post(
"/:id/authorize-net",
isAuth,
expressAsyncHandler(async (req, res) => {
try {
const { createTransactionRequest } = req.body;
const { transactionRequest } = createTransactionRequest;
const { amount, payment, description } = transactionRequest;
const { creditCard } = payment;
const { cardNumber, expirationDate, cardCode } = creditCard;

  const order = await Order.findById(req.params.id).populate("user");
  const { shippingAddress, user } = order;

  // Extract the customer ID from the user object
  const customerId = user.id.toString();

  const merchantAuthenticationType =
    new APIContracts.MerchantAuthenticationType();
  merchantAuthenticationType.setName(process.env.AUTHORIZE_NET_API_KEY);
  merchantAuthenticationType.setTransactionKey(
    process.env.AUTHORIZE_NET_API_SECRET
  );

  const creditCardType = new APIContracts.CreditCardType();
  creditCardType.setCardNumber(cardNumber);
  creditCardType.setExpirationDate(expirationDate);
  creditCardType.setCardCode(cardCode);

  const paymentType = new APIContracts.PaymentType();
  paymentType.setCreditCard(creditCardType);

  const orderDetails = new APIContracts.OrderType();
  const invoiceNumber = req.params.id.slice(0, 20);
  orderDetails.setInvoiceNumber(invoiceNumber);
  orderDetails.setDescription(description || "Product Description");

  const billTo = new APIContracts.CustomerAddressType();
  billTo.setCustomerID(customerId);
  billTo.setFirstName(shippingAddress.firstName);
  billTo.setLastName(shippingAddress.lastName);
  billTo.setCompany(shippingAddress.company);
  billTo.setAddress(shippingAddress.address);
  billTo.setCity(shippingAddress.city);
  billTo.setState(shippingAddress.cState);
  billTo.setZip(shippingAddress.zipCode);
  billTo.setCountry(shippingAddress.country);
  billTo.setPhoneNumber(shippingAddress.phone);

  const shipTo = new APIContracts.CustomerAddressType();
  shipTo.setFirstName(shippingAddress.firstName);
  shipTo.setLastName(shippingAddress.lastName);
  shipTo.setCompany(shippingAddress.company);
  shipTo.setAddress(shippingAddress.address);
  shipTo.setCity(shippingAddress.city);
  shipTo.setState(shippingAddress.cState);
  shipTo.setZip(shippingAddress.zipCode);
  shipTo.setCountry(shippingAddress.country);

  const transactionRequestType = new APIContracts.TransactionRequestType();
  transactionRequestType.setTransactionType(
    APIContracts.TransactionTypeEnum.AUTHCAPTURETRANSACTION
  );
  transactionRequestType.setPayment(paymentType);
  transactionRequestType.setAmount(amount);
  transactionRequestType.setOrder(orderDetails);
  transactionRequestType.setBillTo(billTo);
  transactionRequestType.setShipTo(shipTo);

  // Set orderItems as line items
  if (order.orderItems) {
    const apiLineItems = new APIContracts.ArrayOfLineItem();
    const lineItemArray = [];

    order.orderItems.forEach((orderItem) => {
      const apiLineItem = new APIContracts.LineItemType();
      apiLineItem.setItemId(orderItem._id.toString());
      apiLineItem.setName(orderItem.name);
      apiLineItem.setDescription(orderItem.description);
      apiLineItem.setQuantity(orderItem.quantity);
      apiLineItem.setUnitPrice(orderItem.price);
      lineItemArray.push(apiLineItem);
    });

    apiLineItems.setLineItem(lineItemArray);
    transactionRequestType.setLineItems(apiLineItems);
  }

  const createRequest = new APIContracts.CreateTransactionRequest();
  createRequest.setMerchantAuthentication(merchantAuthenticationType);
  createRequest.setTransactionRequest(transactionRequestType);

  const ctrl = new APIControllers.CreateTransactionController(
    createRequest.getJSON()
  );

  ctrl.execute(async function () {
    const apiResponse = ctrl.getResponse();
    const response = new APIContracts.CreateTransactionResponse(
      apiResponse
    );

    if (response != null) {
      if (
        response.getMessages().getResultCode() ===
        APIContracts.MessageTypeEnum.OK
      ) {
        const transactionResponse = response.getTransactionResponse();
        if (
          transactionResponse != null &&
          transactionResponse.getMessages() != null
        ) {
          order.isPaid = true;
          order.paidAt = Date.now();
          order.paymentResult = {
            id: transactionResponse.getTransId(),
            status:
              transactionResponse.getResponseCode() === "1"
                ? "approved"
                : "declined",
            authCode: transactionResponse.getAuthCode(),
            avsResultCode: transactionResponse.getAvsResultCode(),
            cvvResultCode: transactionResponse.getCvvResultCode(),
            accountNumber: transactionResponse.getAccountNumber(),
            accountType: transactionResponse.getAccountType(),
          };
          // order.paymentMethod = req.body.paymentMethod;
          // order.currencySign = req.body.currencySign;

          // for (const index in order.orderItems) {
          //   const item = order.orderItems[index];
          //   const product = await Product.findById(item.product);

          //   if (item.quantity > product.countInStock) {
          //     throw new Error(
          //       `Insufficient stock for product: ${product.name}`
          //     );
          //   }

          //   const currentDate = new Date();
          //   const formattedDate = `${currentDate.getFullYear()}-${(
          //     currentDate.getMonth() + 1
          //   )
          //     .toString()
          //     .padStart(2, "0")}-${currentDate
          //     .getDate()
          //     .toString()
          //     .padStart(2, "0")}`;

          //   const existingSoldEntryIndex = product.sold.findIndex(
          //     (entry) =>
          //       entry.date.toISOString().slice(0, 10) === formattedDate
          //   );

          //   if (existingSoldEntryIndex !== -1) {
          //     product.sold[existingSoldEntryIndex].value += item.quantity;
          //   } else {
          //     product.sold.push({
          //       value: item.quantity,
          //       date: new Date(formattedDate),
          //     });
          //   }

          //   product.countInStock -= item.quantity;
          //   product.numSales += item.quantity;
          //   await product.save();
          // }

          // const updatedOrder = await order.save();
          res.status(200).json({
            message: "Transaction successful",
            // response: updatedOrder,
          });
        } else {
          const errors = transactionResponse
            ? transactionResponse.getErrors()
            : null;
          res.status(400).json({
            message: "Failed transaction",
            errors: errors
              ? errors.getError()
              : "No error details available",
          });
        }
      } else {
        const transactionResponse = response.getTransactionResponse();
        const errors = transactionResponse
          ? transactionResponse.getErrors()
          : null;
        res.status(400).json({
          message: "Failed transaction",
          errors: errors
            ? errors.getError()
            : response.getMessages().getMessage(),
        });
      }
    } else {
      res.status(500).json({ message: "Null response" });
    }
  });
} catch (error) {
  console.error("Transaction processing error:", error);
  res.status(500).json({ message: "Transaction processing failed" });
}

})
);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions