| 1 | import React, { useState, useEffect } from "react";
|
|---|
| 2 | import axios from "axios";
|
|---|
| 3 | import { Link, useNavigate } from "react-router-dom";
|
|---|
| 4 | import NavbarBlagajnik from "../../../components/NavbarBlagajnik/NavbarBlagajnik.jsx"
|
|---|
| 5 | import dayjs from "dayjs";
|
|---|
| 6 |
|
|---|
| 7 | const BlagajnikDashboard = ({ blagajnikId }) => {
|
|---|
| 8 | const navigate = useNavigate();
|
|---|
| 9 | const [
|
|---|
| 10 | showCreateSoopstenieZaPlakjanjeModal,
|
|---|
| 11 | setShowCreateSoopstenieZaPlakjanjeModal,
|
|---|
| 12 | ] = useState(false);
|
|---|
| 13 | const [error, setError] = useState("");
|
|---|
| 14 | const [loading, setLoading] = useState(true);
|
|---|
| 15 | const [soopstenijaZaPlakjanje, setSoopstenijaZaPlakjanje] = useState([]);
|
|---|
| 16 |
|
|---|
| 17 | const [formData, setFormData] = useState({
|
|---|
| 18 | naslov: "",
|
|---|
| 19 | sodrzina: "",
|
|---|
| 20 | iznos: "",
|
|---|
| 21 | valuta: "",
|
|---|
| 22 | rokZaPlakjanje: "",
|
|---|
| 23 | });
|
|---|
| 24 | const handleChange = (e) => {
|
|---|
| 25 | const { name, value } = e.target;
|
|---|
| 26 | setFormData((prev) => ({
|
|---|
| 27 | ...prev,
|
|---|
| 28 | [name]: value,
|
|---|
| 29 | }));
|
|---|
| 30 | };
|
|---|
| 31 | const handleSubmitSoopstenie = async (e) => {
|
|---|
| 32 | e.preventDefault();
|
|---|
| 33 | setError("");
|
|---|
| 34 | const SoopstenieZaPlakjanjeRequestDTO = {
|
|---|
| 35 | naslov: formData.naslov,
|
|---|
| 36 | sodrzina: formData.sodrzina,
|
|---|
| 37 | iznos: parseFloat(formData.iznos),
|
|---|
| 38 | valuta: formData.valuta,
|
|---|
| 39 | rokZaPlakjanje: formData.rokZaPlakjanje,
|
|---|
| 40 | sozdadenoOdBlagajnikId: blagajnikId,
|
|---|
| 41 | };
|
|---|
| 42 |
|
|---|
| 43 | try {
|
|---|
| 44 | const response = await axios.post(
|
|---|
| 45 | "http://localhost:8080/api/paymentsSoopstenija",
|
|---|
| 46 | SoopstenieZaPlakjanjeRequestDTO,
|
|---|
| 47 | {
|
|---|
| 48 | withCredentials: true,
|
|---|
| 49 | headers: { "Content-Type": "application/json" },
|
|---|
| 50 | }
|
|---|
| 51 | );
|
|---|
| 52 |
|
|---|
| 53 | if (response.status === 200 || response.status === 201) {
|
|---|
| 54 | alert("Соопштението за плаќање е успешно креирано!");
|
|---|
| 55 | navigate("/dashboard");
|
|---|
| 56 | }
|
|---|
| 57 | } catch (err) {
|
|---|
| 58 | console.error("Грешка при POST:", err.response?.data);
|
|---|
| 59 | const serverMsg =
|
|---|
| 60 | err.response?.data?.message ||
|
|---|
| 61 | "Грешка при валидација. Проверете ги сите полиња.";
|
|---|
| 62 | setError(serverMsg);
|
|---|
| 63 | }
|
|---|
| 64 | };
|
|---|
| 65 | useEffect(() => {
|
|---|
| 66 | const initializeDashboard = async () => {
|
|---|
| 67 | if (!blagajnikId) return;
|
|---|
| 68 | try {
|
|---|
| 69 | setLoading(true);
|
|---|
| 70 | const [resSoopstenija] = await Promise.all([
|
|---|
| 71 | axios.get(`http://localhost:8080/api/paymentsSoopstenija/blagajnik`, {
|
|---|
| 72 | withCredentials: true,
|
|---|
| 73 | }),
|
|---|
| 74 | ]);
|
|---|
| 75 | setSoopstenijaZaPlakjanje(resSoopstenija.data);
|
|---|
| 76 | } catch (err) {
|
|---|
| 77 | setError(err);
|
|---|
| 78 | console.log(err);
|
|---|
| 79 | } finally {
|
|---|
| 80 | setLoading(false);
|
|---|
| 81 | }
|
|---|
| 82 | };
|
|---|
| 83 | initializeDashboard();
|
|---|
| 84 | }, [blagajnikId]);
|
|---|
| 85 |
|
|---|
| 86 | const handleShowCreateSoopstenieModal = () => {
|
|---|
| 87 | setShowCreateSoopstenieZaPlakjanjeModal(true);
|
|---|
| 88 | };
|
|---|
| 89 | return (
|
|---|
| 90 | <>
|
|---|
| 91 | <div>
|
|---|
| 92 | {error && <div className="alert alert-danger">{error}</div>}
|
|---|
| 93 | <NavbarBlagajnik />
|
|---|
| 94 | <div className="container mt-5 mh-100">
|
|---|
| 95 | <div className="row">
|
|---|
| 96 | <div className="col-12">
|
|---|
| 97 | <nav
|
|---|
| 98 | className="container text-white h-5 d-flex text-start p-3"
|
|---|
| 99 | style={{ backgroundColor: "#147176" }}
|
|---|
| 100 | >
|
|---|
| 101 | <Link to={`/dashboard`} className="btn btn-secondary">
|
|---|
| 102 | Соопштенија за плаќање
|
|---|
| 103 | </Link>
|
|---|
| 104 | </nav>
|
|---|
| 105 | <div className="container">
|
|---|
| 106 | <button
|
|---|
| 107 | className="btn btn-primary float-end"
|
|---|
| 108 | data-bs-toggle="modal"
|
|---|
| 109 | data-bs-target="#createSoopstenieZaPlakjanje"
|
|---|
| 110 | >
|
|---|
| 111 | Креирај соопштение за плаќање
|
|---|
| 112 | </button>
|
|---|
| 113 | <div className="row">
|
|---|
| 114 | {soopstenijaZaPlakjanje.length > 0 ? (
|
|---|
| 115 | soopstenijaZaPlakjanje.map((pA) => (
|
|---|
| 116 | <div key={pA.id} className="col-4">
|
|---|
| 117 | <div className="card">
|
|---|
| 118 | <div className="card-body">
|
|---|
| 119 | <h5 className="card-title">{pA.naslov}</h5>
|
|---|
| 120 | <p className="card-text">STATUS: {pA.status}</p>
|
|---|
| 121 | <p>Рок за плаќање: {pA.rokZaPlakjanje}</p>
|
|---|
| 122 | <p className="card-text">{pA.sodrzina}</p>
|
|---|
| 123 | <p className="card-text">
|
|---|
| 124 | {pA.valuta} {Number(pA.iznos).toFixed(18)}
|
|---|
| 125 | </p>
|
|---|
| 126 | <p>
|
|---|
| 127 | Креирано на{" "}
|
|---|
| 128 | {dayjs(pA.createdAt).format("HH:mm DD.MM.YYYY")}
|
|---|
| 129 | </p>
|
|---|
| 130 | <Link to={`/blagajnikDashboard//${pA.id}/payments`}>
|
|---|
| 131 | Види плаќања
|
|---|
| 132 | </Link>
|
|---|
| 133 | </div>
|
|---|
| 134 | </div>
|
|---|
| 135 | </div>
|
|---|
| 136 | ))
|
|---|
| 137 | ) : (
|
|---|
| 138 | <div>Нема соопштенија</div>
|
|---|
| 139 | )}
|
|---|
| 140 | </div>
|
|---|
| 141 | </div>
|
|---|
| 142 | </div>
|
|---|
| 143 | </div>
|
|---|
| 144 | </div>
|
|---|
| 145 | </div>
|
|---|
| 146 |
|
|---|
| 147 | <div
|
|---|
| 148 | className="modal fade"
|
|---|
| 149 | tabIndex="-1"
|
|---|
| 150 | role="dialog"
|
|---|
| 151 | id="createSoopstenieZaPlakjanje"
|
|---|
| 152 | >
|
|---|
| 153 | <div className="modal-dialog modal-dialog-centered" role="document">
|
|---|
| 154 | <div className="modal-content">
|
|---|
| 155 | <div className="modal-header">
|
|---|
| 156 | <h5 className="modal-title" id="exampleModalLongTitle">
|
|---|
| 157 | Креирај соопштение за плаќање
|
|---|
| 158 | </h5>
|
|---|
| 159 | </div>
|
|---|
| 160 | <div className="modal-body">
|
|---|
| 161 | <form onSubmit={handleSubmitSoopstenie}>
|
|---|
| 162 | <div className="form-group">
|
|---|
| 163 | <label htmlFor="naslov">Наслов</label>
|
|---|
| 164 | <input
|
|---|
| 165 | type="text"
|
|---|
| 166 | name="naslov"
|
|---|
| 167 | id="naslov"
|
|---|
| 168 | placeholder="Наслов на соопштението"
|
|---|
| 169 | className="form-control"
|
|---|
| 170 | value={formData.naslov}
|
|---|
| 171 | onChange={handleChange}
|
|---|
| 172 | required
|
|---|
| 173 | />
|
|---|
| 174 | </div>
|
|---|
| 175 | <div className="form-group">
|
|---|
| 176 | <label htmlFor="sodrzina">Содржина</label>
|
|---|
| 177 | <textarea
|
|---|
| 178 | id="sodrzina"
|
|---|
| 179 | name="sodrzina"
|
|---|
| 180 | rows="4"
|
|---|
| 181 | cols="50"
|
|---|
| 182 | value={formData.sodrzina}
|
|---|
| 183 | className="form-control"
|
|---|
| 184 | onChange={handleChange}
|
|---|
| 185 | required
|
|---|
| 186 | placeholder="Содржина на соопштението"
|
|---|
| 187 | />
|
|---|
| 188 | </div>
|
|---|
| 189 | <div className="form-group">
|
|---|
| 190 | <label htmlFor="iznos">Износ</label>
|
|---|
| 191 | <input
|
|---|
| 192 | className="form-control"
|
|---|
| 193 | type="number"
|
|---|
| 194 | name="iznos"
|
|---|
| 195 | id="iznos"
|
|---|
| 196 | step="any"
|
|---|
| 197 | value={formData.iznos}
|
|---|
| 198 | min={0}
|
|---|
| 199 | required
|
|---|
| 200 | onChange={handleChange}
|
|---|
| 201 | placeholder="0.00"
|
|---|
| 202 | />
|
|---|
| 203 | </div>
|
|---|
| 204 | <div className="form-group">
|
|---|
| 205 | <label htmlFor="valuta">Валута</label>
|
|---|
| 206 | <input
|
|---|
| 207 | type="text"
|
|---|
| 208 | required
|
|---|
| 209 | name="valuta"
|
|---|
| 210 | className="form-control"
|
|---|
| 211 | onChange={handleChange}
|
|---|
| 212 | value={formData.valuta}
|
|---|
| 213 | placeholder="ETH, LTC, XRP"
|
|---|
| 214 | />
|
|---|
| 215 | </div>
|
|---|
| 216 | <div className="form-group">
|
|---|
| 217 | <label htmlFor="rokZaPlakjanje">Рок за плаќање</label>
|
|---|
| 218 | <input
|
|---|
| 219 | type="date"
|
|---|
| 220 | name="rokZaPlakjanje"
|
|---|
| 221 | className="form-control"
|
|---|
| 222 | value={formData.rokZaPlakjanje}
|
|---|
| 223 | required
|
|---|
| 224 | onChange={handleChange}
|
|---|
| 225 | />
|
|---|
| 226 | </div>
|
|---|
| 227 | <div className="modal-footer ">
|
|---|
| 228 | <button type="submit" className="btn btn-primary">
|
|---|
| 229 | Креирај соопштение
|
|---|
| 230 | </button>
|
|---|
| 231 | <button type="button" data-bs-dismiss="modal" className="btn">
|
|---|
| 232 | Затвори
|
|---|
| 233 | </button>
|
|---|
| 234 | </div>
|
|---|
| 235 | </form>
|
|---|
| 236 | </div>
|
|---|
| 237 | </div>
|
|---|
| 238 | </div>
|
|---|
| 239 | </div>
|
|---|
| 240 | </>
|
|---|
| 241 | );
|
|---|
| 242 | };
|
|---|
| 243 | export default BlagajnikDashboard;
|
|---|