spinner for payments, API actions

This commit is contained in:
merelendor 2021-11-28 13:41:59 +01:00
parent fa0af100bc
commit 6e54585c9c
11 changed files with 238 additions and 122 deletions

View File

@ -6,6 +6,8 @@ import moment from 'moment';
import * as actionTypes from '../constants/actionTypes';
import * as currentState from '../reducers/initialState';
import { getCompanyInfo } from './companyActions';
if(process.browser)
{
FormData.prototype.appendObject = function(obj, namespace)
@ -37,15 +39,20 @@ export const sendLoginFormEmail = ({ email, password, dispatch }) =>
const cookies = new Cookies();
cookies.set('jwt', response.data.token, new Date(moment().add(7, 'day').toDate()));
console.log("try to actionTypes.COMPANY", actionTypes.COMPANY);
console.log("response.data.company", response.data.company);
getCompanyInfo({ dispatch })
.then(() =>
{
dispatch({ type: actionTypes.AUTH, data: { logged: true } });
dispatch({ type: actionTypes.USER, data: response.data.user });
dispatch({ type: actionTypes.AUTH, data: { logged: true } });
dispatch({ type: actionTypes.USER, data: response.data.user });
dispatch({ type: actionTypes.COMPANY, data: response.data.company });
resolve();
Router.push('/');
resolve();
Router.push('/');
})
.catch(() =>
{
reject();
});
//dispatch({ type: actionTypes.COMPANY, data: response.data.company });
}
else
{

47
actions/companyActions.js Normal file
View File

@ -0,0 +1,47 @@
import axios from 'axios';
import { Cookies } from 'react-cookie';
import Router from 'next/router';
import moment from 'moment';
import * as actionTypes from '../constants/actionTypes';
if(process.browser)
{
FormData.prototype.appendObject = function(obj, namespace)
{
let keyName;
for (var key in obj)
{
if (obj.hasOwnProperty(key))
{
keyName = [namespace, '[', key, ']'].join('');
this.append(keyName, obj[key]);
}
}
};
}
export const getCompanyInfo = ({ dispatch }) =>
{
console.log("getCompanyInfo");
return new Promise((resolve, reject) =>
{
axios.post(`${ process.env.NEXT_PUBLIC_SELF_API_HOST }/api/company`, {}, {
withCredentials: true,
})
.then((response) =>
{
console.log("getCompanyInfo", "response", response.data);
dispatch({ type: actionTypes.COMPANY, data: response.data });
resolve();
})
.catch((error) =>
{
console.log("error");
console.error(error);
reject();
});
});
}

View File

@ -1,4 +1,5 @@
export * from './authActions';
export * from './contractsActions';
export * from './contractActions';
export * from './calendarActions';
export * from './calendarActions';
export * from './companyActions';

View File

@ -4,7 +4,7 @@ const withLess = require("next-with-less");
module.exports = withImages(withFonts(withLess({
images: {
domains: [ 'evo-lk.quickcode.ru', 'wow.evoleasing.ru', 'www.evoleasing.ru', 'lk.evoleasing.ru', 'evoleasing.ru', 'localhost', 'localhost:3000'],
domains: [ 'lk-evo.quickcode.ru', 'wow.evoleasing.ru', 'www.evoleasing.ru', 'lk.evoleasing.ru', 'evoleasing.ru', 'localhost', 'localhost:3000'],
},
reactStrictMode: true,
/*

View File

@ -29,7 +29,8 @@
"react-redux": "^7.2.6",
"react-widgets": "^5.5.1",
"redux": "^4.1.2",
"redux-persist": "^6.0.0"
"redux-persist": "^6.0.0",
"spinners-react": "^1.0.6"
},
"devDependencies": {
"eslint": "^8.3.0",

View File

@ -16,18 +16,9 @@ export default async function handler(req, res)
if(cookies.jwt !== undefined && cookies.jwt !== null)
{
console.log("cookies.jwt");
console.log(cookies.jwt);
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
var crm_jwt = jwt.sign(client_jwt_decoded, process.env.JWT_SECRET_CRM, { noTimestamp: true });
console.log("client_jwt_decoded", client_jwt_decoded);
console.log("crm_jwt", crm_jwt);
console.log(`URL`);
console.log(`${ process.env.CRM_API_HOST }/lk/Account/GetPaymentCalendar/`);
try
{
axios.get(`${ process.env.CRM_API_HOST }/lk/Account/GetPaymentCalendar/`, {
@ -38,8 +29,6 @@ export default async function handler(req, res)
})
.then((crm_response) =>
{
console.log("crm_response");
console.log(crm_response);
res.status(200).json(crm_response.data);
})
.catch((error) =>

51
pages/api/company.js Normal file
View File

@ -0,0 +1,51 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import axios from 'axios';
import { Cookies } from 'react-cookie';
import cookie from 'cookie';
import moment from 'moment';
import jwt from 'jsonwebtoken';
import { cors } from '../../lib/cors';
export default async function handler(req, res)
{
await cors(req, res);
if(req.headers.cookie !== undefined)
{
const cookies = cookie.parse(req.headers?.cookie ? req.headers?.cookie : "");
if(cookies.jwt !== undefined && cookies.jwt !== null)
{
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
var crm_jwt = jwt.sign(client_jwt_decoded, process.env.JWT_SECRET_CRM, { noTimestamp: true });
try
{
axios.get(`${ process.env.CRM_API_HOST }/lk/Account/GetCompanyInfo/`, {
params: client_jwt_decoded,
headers: {
"Authorization": `Bearer ${ crm_jwt }`,
}
})
.then((crm_response) =>
{
res.status(200).json(crm_response.data);
})
.catch((error) =>
{
console.error(error);
res.status(500);
});
}
catch(e)
{
console.error(e);
res.status(500);
}
}
else
{
res.status(403);
}
}
}

View File

@ -18,28 +18,33 @@ export default async function handler(req, res)
var client_jwt_decoded = jwt.verify(cookies.jwt, process.env.JWT_SECRET_CLIENT);
var crm_jwt = jwt.sign(client_jwt_decoded, process.env.JWT_SECRET_CRM, { noTimestamp: true });
try
const result = {
upd: null,
fines: null,
};
await Promise.all([
new Promise((resolve) => {
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetUPDListByContract`, {
params: { ...client_jwt_decoded, contract_number: req.body.number },
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
})
.then((crm_response) => { result.upd = crm_response.data; resolve(); })
.catch((error) => { console.error(error); resolve(); });
}),
new Promise((resolve) => {
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetFineGIBDDList`, {
params: { ...client_jwt_decoded, contract_number: req.body.number },
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
})
.then((crm_response) => { result.fines = crm_response.data; resolve(); })
.catch((error) => { console.error(error); resolve(); });
}),
])
.then(() =>
{
await axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetUPDListByContract`, {
params: { ...client_jwt_decoded, contract_number: req.body.number },
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
withCredentials: true,
})
.then((crm_response) =>
{
res.status(200).json(crm_response.data);
})
.catch((error) =>
{
console.error(error);
res.status(500);
});
}
catch(e)
{
console.error(e);
res.status(500);
}
res.status(200).json(result);
});
}
else
{

View File

@ -39,26 +39,26 @@ export default async function handler(req, res)
await Promise.all([
new Promise((resolve) => {
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetOsago`, {
params: client_jwt_decoded,
params: { ...client_jwt_decoded, contract_number: req.body.number },
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
})
.then((crm_response) => { result.osago = crm_response; resolve(); })
.then((crm_response) => { result.osago = crm_response.data; resolve(); })
.catch((error) => { console.error(error); resolve(); });
}),
new Promise((resolve) => {
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetKasko`, {
params: client_jwt_decoded,
params: { ...client_jwt_decoded, contract_number: req.body.number },
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
})
.then((crm_response) => { result.kasko = crm_response; resolve(); })
.then((crm_response) => { result.kasko = crm_response.data; resolve(); })
.catch((error) => { console.error(error); resolve(); });
}),
new Promise((resolve) => {
axios.get(`${ process.env.CRM_API_HOST }/lk/Contract/GetNsib`, {
params: client_jwt_decoded,
params: { ...client_jwt_decoded, contract_number: req.body.number },
headers: { "Authorization": `Bearer ${ crm_jwt }`, },
})
.then((crm_response) => { result.nsib = crm_response; resolve(); })
.then((crm_response) => { result.nsib = crm_response.data; resolve(); })
.catch((error) => { console.error(error); resolve(); });
}),
])

View File

@ -3,6 +3,8 @@ import Head from 'next/head';
import Image from 'next/image';
import { connect } from "react-redux";
import { withRouter } from 'next/router';
import { SpinnerCircular } from 'spinners-react';
import { reduxWrapper } from '../../store';
import Header from '../components/Header';
@ -75,7 +77,7 @@ class ContractSchedulePage extends React.Component
render()
{
const { payments, contract_date, full, opened } = this.state;
const { payments, contract_date, full, opened, loading } = this.state;
const { number } = this.props;
console.log("RENDER", "payments");
@ -121,83 +123,91 @@ class ContractSchedulePage extends React.Component
<div className="table_cell">Статус платежа</div>
<div className="table_cell">Платежное поручение</div>
</div>
{ !full && (
<button className="show_more primary" onClick={ this._handle_onSetFull }>Показать прошедшие платежи</button>
) }
{ payments !== null && Object.values(payments).map((payment, index) =>
{
let pd = moment(payment.date, "DD-MM-YYYY");
if(!full && today > pd) { return null; }
{ loading ? (
<div className="table_row table_header" style={{ minHeight: 300, display: "flex", justifyContent: "center", alignItems: "center" }}>
<SpinnerCircular size={90} thickness={51} speed={100} color="rgba(28, 1, 169, 1)" secondaryColor="rgba(236, 239, 244, 1)" />
</div>
) : (
<>
{ !full && (
<button className="show_more primary" onClick={ this._handle_onSetFull }>Показать прошедшие платежи</button>
) }
{ payments !== null && Object.values(payments).map((payment, index) =>
{
let pd = moment(payment.date, "DD-MM-YYYY");
if(!full && today > pd) { return null; }
return (
<div className={ `table_row ${ opened.indexOf(payment.number) > -1 ? "opened" : "" }` } data-status={ payment.status === "NotPaid" && pd < today ? "notpaid" : statuses[payment.status] } key={ index }>
<div className="table_cell" data-title="Платеж №">{ payment.number }</div>
<div className="table_cell" data-title="от">{ moment(payment.date, "DD-MM-YYYY").format("DD.MM.YYYY") }</div>
<div className="table_cell" data-title="На сумму">{ numeral(payment.total_amount).format('') }</div>
<div className="table_cell" data-title="НДС, 20% ₽">{ numeral(payment.vat_amount).format('') }</div>
<div className="table_cell">
{ payment.status === "Paid" && "Оплачено" }
{ payment.status === "NotPaid" && "Не оплачено" }
{ payment.status === "HalfPaid" && "Частично оплачено" }
{ payment.status === "OverPaid" && (
<div className="table_cell"><span>Переплата</span> <span>{ numeral(payment.total_amount).format('') } </span></div>
) }
</div>
<div className="table_cell">
{ payment.invoices.map((invoice, invoice_index) =>
(
<React.Fragment key={invoice_index}>
<p style={{ paddingBottom: "15px", lineHeight: "18px" }}>{ invoice.number } от { moment(invoice.date, "DD-MM-YYYY").format("DD.MM.YYYY") } на сумму { numeral(invoice.total_amount).format('') } </p>
</React.Fragment>
)) }
</div>
<button className="toggle_cell" onClick={ () => this._handle_onSetOpen(payment.number) }></button>
return (
<div className={ `table_row ${ opened.indexOf(payment.number) > -1 ? "opened" : "" }` } data-status={ payment.status === "NotPaid" && pd < today ? "notpaid" : statuses[payment.status] } key={ index }>
<div className="table_cell" data-title="Платеж №">{ payment.number }</div>
<div className="table_cell" data-title="от">{ moment(payment.date, "DD-MM-YYYY").format("DD.MM.YYYY") }</div>
<div className="table_cell" data-title="На сумму">{ numeral(payment.total_amount).format('') }</div>
<div className="table_cell" data-title="НДС, 20% ₽">{ numeral(payment.vat_amount).format('') }</div>
<div className="table_cell">
{ payment.status === "Paid" && "Оплачено" }
{ payment.status === "NotPaid" && "Не оплачено" }
{ payment.status === "HalfPaid" && "Частично оплачено" }
{ payment.status === "OverPaid" && (
<div className="table_cell"><span>Переплата</span> <span>{ numeral(payment.total_amount).format('') } </span></div>
) }
</div>
<div className="table_cell">
{ payment.invoices.map((invoice, invoice_index) =>
(
<React.Fragment key={invoice_index}>
<p style={{ paddingBottom: "15px", lineHeight: "18px" }}>{ invoice.number } от { moment(invoice.date, "DD-MM-YYYY").format("DD.MM.YYYY") } на сумму { numeral(invoice.total_amount).format('') } </p>
</React.Fragment>
)) }
</div>
<button className="toggle_cell" onClick={ () => this._handle_onSetOpen(payment.number) }></button>
</div>
)
}) }
{/*}
<div className="table_row" data-status="overpayment-2">
<div className="table_cell" data-title="Платеж №">11</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell"><span>Переплата</span> <span>15 000,00 </span></div>
<div className="table_cell">18432 от 20/01/2021 на сумму 255 000,00 </div>
<button className="toggle_cell"></button>
</div>
)
}) }
{/*}
<div className="table_row" data-status="overpayment-2">
<div className="table_cell" data-title="Платеж №">11</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell"><span>Переплата</span> <span>15 000,00 </span></div>
<div className="table_cell">18432 от 20/01/2021 на сумму 255 000,00 </div>
<div className="table_row opened" data-status="overpayment-1">
<div className="table_cell" data-title="Платеж №">12</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell">Переплата 10 000,00 </div>
<div className="table_cell">34223 от 21/02/2021 на сумму 229 724,05 </div>
<button className="toggle_cell"></button>
</div>
<div className="table_row opened" data-status="overpayment-1">
<div className="table_cell" data-title="Платеж №">12</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell">Переплата 10 000,00 </div>
<div className="table_cell">34223 от 21/02/2021 на сумму 229 724,05 </div>
<button className="toggle_cell"></button>
</div>
<div className="table_row" data-status="paid">
<div className="table_cell" data-title="Платеж №">13</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell">Оплачено </div>
<div className="table_cell">44911 от 10/03/2021 на сумму 100 000,00
49877 от 21/03/2021 на сумму 139 724,05 </div>
<button className="toggle_cell"></button>
</div>
<div className="table_row" data-status="paid">
<div className="table_cell" data-title="Платеж №">13</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell">Оплачено </div>
<div className="table_cell">44911 от 10/03/2021 на сумму 100 000,00
49877 от 21/03/2021 на сумму 139 724,05 </div>
<button className="toggle_cell"></button>
</div>
<div className="table_row">
<div className="table_cell" data-title="Платеж №">14</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell">Не оплачено </div>
<div className="table_cell">-</div>
<button className="toggle_cell"></button>
</div>
<div className="table_row">
<div className="table_cell" data-title="Платеж №">14</div>
<div className="table_cell" data-title="от">21.02.2021</div>
<div className="table_cell" data-title="На сумму">239 724,05</div>
<div className="table_cell" data-title="НДС, 20% ₽">43 079,18</div>
<div className="table_cell">Не оплачено </div>
<div className="table_cell">-</div>
<button className="toggle_cell"></button>
</div>
{*/}
<button className="toggle_cell"></button>
</div>
{*/}
</>
) }
</div>
</article>
</div>

View File

@ -3173,6 +3173,11 @@ source-map@^0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
spinners-react@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/spinners-react/-/spinners-react-1.0.6.tgz#b7e43d6097fa30107718df718108f3586d50088f"
integrity sha512-5J3sPZ9xogVA3CbLjFD3vTWhcuHb+mKFSBBEm5c8+8JSdPGweLQ6sPU+SD51FwZ2lqHks8DpiLk/lyLUa70oJA==
stacktrace-parser@0.1.10:
version "0.1.10"
resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a"