Skip to content
Snippets Groups Projects
TransactionList.js 3.53 KiB
Newer Older
  • Learn to ignore specific revisions
  • meskio's avatar
    meskio committed
    import React, { useState } from "react";
    import { Table, Form, Row, Col } from "react-bootstrap";
    import icon from "./icon";
    import TransactionTr from "./TransactionTr";
    import MemberPicker from "../member/MemberPicker";
    import Fetcher from "../Fetcher";
    
    import {
      date2string,
      daysAfterNow,
      printMoney,
      printDate,
      printTransactionID,
    } from "../util";
    
    meskio's avatar
    meskio committed
    
    const engType = {
      compra: "purchase",
      recarga: "topup",
      pedido: "order",
      devolucion: "refund",
    
    meskio's avatar
    meskio committed
      cuota: "dues",
    
    meskio's avatar
    meskio committed
    };
    
    function TransactionList() {
      const [transactions, setTransactions] = useState([]);
      const [startDate, setStartDate] = useState(date2string(daysAfterNow(-30)));
      const [endDate, setEndDate] = useState(date2string(new Date()));
      const [member, setMember] = useState(null);
      const [proxy, setProxy] = useState(null);
      const [types, setTypes] = useState([]);
    
      let query = "start-date=" + startDate + "&end-date=" + endDate;
      if (member) {
        query += "&member=" + member.num;
      }
      if (proxy) {
        query += "&proxy=" + proxy.num;
      }
    
    meskio's avatar
    meskio committed
      query += types.map((t) => "&type=" + engType[t]).join("");
    
    meskio's avatar
    meskio committed
    
      const onTypeChange = (e) => {
        const newTypes = Array.from(e.target.selectedOptions, (o) => o.value);
        setTypes(newTypes);
      };
    
      const entries = transactions.map((transaction) => {
    
        let memberStr = "";
        if (transaction.member) {
          memberStr = transaction.member.name + " (" + transaction.member.num + ")";
        }
    
    meskio's avatar
    meskio committed
        return (
    
    meskio's avatar
    meskio committed
          <TransactionTr key={transaction.ID} transaction={transaction}>
    
    meskio's avatar
    meskio committed
            <td>{icon(transaction)}</td>
    
    meskio's avatar
    meskio committed
            <td>{printTransactionID(transaction)}</td>
    
    meskio's avatar
    meskio committed
            <td>{printDate(transaction.date)}</td>
    
            <td>{memberStr}</td>
    
    meskio's avatar
    meskio committed
            <td>{transaction.proxy ? transaction.proxy.name : ""}</td>
            <td>{printMoney(transaction.total) + ""}</td>
          </TransactionTr>
        );
      });
    
      return (
        <div>
          <Form>
            <Row>
              <Form.Group as={Col}>
                <Form.Label>Desde:</Form.Label>
                <Form.Control
                  type="date"
                  value={startDate}
                  onChange={(e) => setStartDate(e.target.value)}
                  max={endDate}
                />
              </Form.Group>
              <Form.Group as={Col}>
                <Form.Label>Hasta:</Form.Label>
                <Form.Control
                  type="date"
                  value={endDate}
                  onChange={(e) => setEndDate(e.target.value)}
                  min={startDate}
                  max={Date.now()}
                />
              </Form.Group>
              <Form.Group as={Col}>
                <Form.Label>Typo:</Form.Label>
    
                <Form.Select value={types} onChange={onTypeChange} multiple>
    
    meskio's avatar
    meskio committed
                  <option>compra</option>
                  <option>recarga</option>
                  <option>pedido</option>
                  <option>devolucion</option>
    
    meskio's avatar
    meskio committed
                  <option>cuota</option>
    
                </Form.Select>
    
    meskio's avatar
    meskio committed
              </Form.Group>
            </Row>
    
            <MemberPicker member={member} onChange={setMember} allowDisabled />
            <MemberPicker
              member={proxy}
              onChange={setProxy}
              text="Por"
              allowDisabled
            />
    
    meskio's avatar
    meskio committed
          </Form>
          <br />
          <Fetcher url={"/api/transaction?" + query} onFetch={setTransactions}>
    
            <Table className="text-center" responsive>
    
    meskio's avatar
    meskio committed
              <thead>
                <tr>
                  <th></th>
                  <th>ID</th>
                  <th>Fecha</th>
                  <th>Socia</th>
                  <th>Por</th>
                  <th>Cantidad</th>
                </tr>
              </thead>
              <tbody>{entries}</tbody>
            </Table>
          </Fetcher>
        </div>
      );
    }
    
    export default TransactionList;