Untitled

 avatar
unknown
javascript
2 years ago
11 kB
7
Indexable
import React, { useCallback, useMemo, useState } from "react";
import { Button, Input, Modal, Typography } from "antd";
import TextFormField from "../../../../components/TextFormField";
import CheckboxWithWidth from "../../../../components/CheckboxWithWidth";
import HeadingField from "../../../../components/HeadingField";
import TitleField from "../../../../components/TitleField";
import FlexTwo from "../../../../components/FlexTwo";
import { PlusOutlined } from "@ant-design/icons";
import ItemModal from "../../../../components/ItemModal";
import ItemServiceType from "../../../../components/ItemServiceType";
import { useEffect } from "react";
import VatGroup from "../../../../components/VatGroup";
import shortid from "shortid";
import format from "../../../../helper/format";

const { Text } = Typography;

const Contents = (props) => {
  const { data, vendor } = props;
  const [itemServiceData, setItemService] = useState([]);
  const [openItem, setOpenItem] = useState(false);
  const [Total, setTotal] = useState(0);
  const [downPayment, setDownPayment] = useState(100);

  useEffect(() => {
    if (data) {
      const lines = data?.DocumentLines?.map((e) => {
        // console.log(e?.ItemDescription)
        // console.log(lines)
        return {
          key: e?.ItemCode,
          ItemCode: e?.ItemCode,
          ItemDescription: e?.ItemDescription,
          UoMCode: e?.UoMCode,
          Quantity: e?.Quantity,
          UnitPrice: e?.Price,
          Discount: e?.DiscountPercent,
          VatGroup: e?.TaxCode,
          Total: e?.LineTotal,
        };
      });

      props?.onUpdateItem(lines);
      setItemService(lines);
    }
  }, []);

  const closeItemModal = useCallback(() => setOpenItem(false), []);
  const openItemModal = useCallback(() => {
    // if (!vendor?.AgreementNo) {
    //   Modal.warning({
    //     centered: true,
    //     content: "Please Vendor !",
    //   });
    //   return;
    // }
    setOpenItem(true);
  }, [vendor]);

  const onConfirmItemModal = useCallback(
    (records) => {
      setOpenItem(false);
      let items = itemServiceData ?? [];

      records?.forEach((e) => {
        let oldItem = items.filter((f) => f?.ItemCode === e?.ItemCode)?.[0];
        if (!oldItem) items.push(e);
      });

      setItemService(items);
      if (props?.onUpdateItem) {
        props?.onUpdateItem(items);
      }
    },
    [itemServiceData]
  );

  const onUpdateItem = useCallback(
    (record, field, value) => {
      let items = itemServiceData;
      const index = items.indexOf(record);

      if (
        field === "UnitPrice" ||
        field === "Discount" ||
        field === "Quantity"
      ) {
        items[index][field] = value.trim("") === "" ? 0 : value.trim("");
      } else {
        items[index][field] = value?.trim("");
      }

      let subTotal = record?.UnitPrice * record?.Quantity;
      let grantTotal = subTotal - (subTotal * items[index].Discount) / 100;
      items[index]["Total"] = grantTotal;
      setTotal(grantTotal);
      setItemService(items);
      props?.onUpdateItem(items);
    },
    [itemServiceData]
  );

  const onChangeDownPayment = useCallback((e) =>
    setDownPayment(parseInt(e.target.value))
  );

  const subTotal = () => {
    let amount = itemServiceData?.reduce(function (prev, current) {
      return prev + current.Total;
    }, 0);
    return format.formatCurrency(amount);
  };

  const subTotalAfterDiscount = () => {
    let amount = itemServiceData?.reduce(function (prev, current) {
      return prev + current.Total;
    }, 0);
    return format.formatCurrency((amount * downPayment) / 100);
  };

  const totalTax = () => {
    const total = itemServiceData?.reduce(function (prev, current) {
      let amount = prev + (current.Total * current.VatRate) / 100;
      return format.formatCurrency(
        downPayment === 100 ? amount : amount - (amount * downPayment) / 100
      );
    }, 0);

    return format.formatCurrency(total);
  };

  const totalSubTotal = () => {
    const total = itemServiceData?.reduce(function (prev, current) {
      let amount =
        prev +
        (current.Total * (current?.VatRate ?? 0)) / 100 +
        (current?.Total ?? 0);
      return downPayment === 100
        ? amount
        : amount - (amount * downPayment) / 100;
    }, 0);

    return format.formatCurrency(total);
  };

  const onDeleteItem = useCallback(
    (record) => {
      let newRecords = itemServiceData.filter(
        (e) => e?.ItemCode !== record?.ItemCode
      );
      setItemService(newRecords);
      props?.onUpdateItem(newRecords);
    },
    [itemServiceData]
  );

  const columns = [
    {
      title: "Item No.",

      width: 200,
    },
    {
      title: "Item Description",

      width: 300,
    },
    {
      title: "Quantity",
      width: 100,
    },
    {
      title: "UoM Code",

      width: 100,
    },
    {
      title: "Unit Price",
      width: 100,
    },
    {
      title: "Discount %",
      width: 100,
    },
    {
      title: "Tax Code",
      width: 100,
    },
    {
      title: "Total",
      width: 100,
    },
    // {
    //   title: "No. of Packages",
    //   width: 200,
    // },
  ];

  return (
    <>
      <HeadingField Title="CONTENTS" />
      <div>
        <TitleField label="Preferences" />
        <div className="w-full flex sm:flex-wrap lg:flex-wrap justify-between ">
          <div className="4xl:w-5/12 sm:w-full lg:w-full">
            <ItemServiceType label="Services / Items" />
          </div>
        </div>
        <div className="my-2"></div>
        <Button size="small" onClick={openItemModal}>
          <div className="-mt-[5px]">
            <PlusOutlined style={{ fontSize: "12px" }} />
          </div>
        </Button>
        <ItemModal
          open={openItem}
          vendor={vendor}
          onCancel={closeItemModal}
          onConfirm={onConfirmItemModal}
        />
        <div className="my-2 "></div>
        <div className="w-full overflow-x-auto">
          <table className="border w-full table-fixed text-sm">
            <thead>
              <tr>
                <td className="p-1 border " width={50}></td>
                {columns.map((e) => (
                  <td className="p-1 border" width={e?.width} key={e?.title}>
                    {e?.title}
                  </td>
                ))}
              </tr>
            </thead>
            <tbody>
              {itemServiceData?.length > 0 ? (
                itemServiceData?.map((e) => (
                  <tr key={shortid.generate()}>
                    <td className="p-1 border text-center">
                      <div
                        className="p-2 text-lg text-red-600 hover:cursor-pointer hover:bg-gray-100 rounded"
                        onClick={() => onDeleteItem(e)}
                      >
                        <svg
                          className="w-4 h-4"
                          fill="none"
                          stroke="currentColor"
                          viewBox="0 0 24 24"
                          xmlns="http://www.w3.org/2000/svg"
                        >
                          <path
                            strokeLinecap="round"
                            strokeLinejoin="round"
                            strokeWidth={2}
                            d="M20 12H4"
                          />
                        </svg>
                      </div>
                    </td>
                    <td className="p-1 border">{e?.ItemCode}</td>
                    <td className="p-1 border">{e?.ItemDescription}</td>
                    <td className="p-1 border">
                      <input
                        className="w-full p-1 px-3 border rounded"
                        defaultValue={e?.Quantity ?? 0}
                        onBlur={(event) =>
                          onUpdateItem(e, "Quantity", event.target.value)
                        }
                      />
                    </td>
                    <td className="p-1 border">{e?.UoMCode}</td>
                    <td className="p-1 border">
                      <input
                        className="w-full p-1 px-3 border rounded"
                        defaultValue={e?.UnitPrice ?? 0}
                        onBlur={(event) =>
                          onUpdateItem(e, "UnitPrice", event.target.value)
                        }
                      />
                    </td>
                    <td className="p-1 border">
                      <input
                        className="w-full p-1 px-3 border rounded"
                        defaultValue={e?.Discount ?? 0}
                        onBlur={(event) =>
                          onUpdateItem(e, "Discount", event.target.value)
                        }
                      />
                    </td>
                    <td className="p-1 border">
                      <VatGroup
                        defaultValue={e?.VatGroup}
                        onChange={(value) => onUpdateItem(e, "VatGroup", value)}
                      />
                    </td>
                    <td className="p-1 border">
                      <input
                        className="w-full p-1 px-3 border rounded"
                        value={e?.Total ?? 0}
                        onChange={(value) => {}}
                      />
                    </td>
                    {/* <td className="p-1 border">{e?.VatRate}</td> */}
                  </tr>
                ))
              ) : (
                <tr>
                  <td colSpan={columns.length} className="h-[6rem] text-center">
                    No Records
                  </td>
                </tr>
              )}
            </tbody>
          </table>
        </div>

        <FlexTwo>
          <div></div>
          <div>
            <TitleField label="Total Summary" />
            <TextFormField
              label="Total Before Discount :"
              addonAfter="$"
              value={subTotal()}
            />
            <div className="w-full flex">
              <div className="w-[35%] text-gray-500">
                DMP :
              </div>
              <div className="w-[65%] flex">
                <div className="w-4/12">
                  <TextFormField
                    prefix="%"
                    onChange={onChangeDownPayment}
                    value={downPayment}
                  />
                </div>
                <div className="w-8/12 pl-3">
                  <TextFormField
                    prefix="AUD"
                    value={subTotalAfterDiscount()}
                    readOnly
                  />
                </div>
              </div>
            </div>

            <CheckboxWithWidth label="Rounding:" />
            <TextFormField label="Tax:" value={totalTax()} />
            <TextFormField
              label="Total Payment Due :"
              value={totalSubTotal()}
            />
            <TextFormField label="Applied Amount :" readOnly />
            <TextFormField label="Balance Due :" value={totalSubTotal()} />
          </div>
        </FlexTwo>
      </div>
    </>
  );
};

export default Contents;
Editor is loading...