From 9a25d344497ee2a9d238c3d20fd74c52d50d0fe4 Mon Sep 17 00:00:00 2001 From: TkymHrt <23.h.takayama.nutfes@gmail.com> Date: Tue, 6 Aug 2024 16:56:19 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[fix]=20index.tsx=E3=81=8B=E3=82=89?= =?UTF-8?q?=E5=80=A4=E3=82=92=E6=B8=A1=E3=81=99=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/next-project/src/pages/purchasereports/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/view/next-project/src/pages/purchasereports/index.tsx b/view/next-project/src/pages/purchasereports/index.tsx index 5a9caa5f..0ffa37c3 100644 --- a/view/next-project/src/pages/purchasereports/index.tsx +++ b/view/next-project/src/pages/purchasereports/index.tsx @@ -397,6 +397,8 @@ export default function PurchaseReports(props: Props) { ? purchaseReportViewItem.purchaseReport.id : 0 } + purchaseReportViewItem={purchaseReportViewItem} + expenses={props.expenses} isDisabled={isDisabled(purchaseReportViewItem)} /> From 7e42385c9a628aa25c6a221e47adeec92dbf7b3a Mon Sep 17 00:00:00 2001 From: TkymHrt <23.h.takayama.nutfes@gmail.com> Date: Tue, 6 Aug 2024 16:57:07 +0900 Subject: [PATCH 02/11] =?UTF-8?q?[fix]=20=E3=83=9C=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=83=A2=E3=83=BC=E3=83=80=E3=83=AB=E3=81=B8?= =?UTF-8?q?=E5=80=A4=E3=82=92=E6=B8=A1=E3=81=99=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/purchasereports/OpenEditModalButton.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/view/next-project/src/components/purchasereports/OpenEditModalButton.tsx b/view/next-project/src/components/purchasereports/OpenEditModalButton.tsx index 8349ebfd..a21eeca9 100644 --- a/view/next-project/src/components/purchasereports/OpenEditModalButton.tsx +++ b/view/next-project/src/components/purchasereports/OpenEditModalButton.tsx @@ -2,11 +2,14 @@ import * as React from 'react'; import { useState } from 'react'; import { DetailEditModal } from './DetailEditModal'; +import { Expense, PurchaseReportView } from '@/type/common'; import { CloseButton, EditButton, Modal, PrimaryButton } from '@components/common'; import EditModal from '@components/purchasereports/EditModal'; interface Props { children?: React.ReactNode; + purchaseReportViewItem: PurchaseReportView; + expenses: Expense[]; id: number; isDisabled: boolean; } @@ -47,6 +50,8 @@ const OpenEditModalButton: React.FC = (props) => { {step === 'editDetails' && ( Date: Tue, 6 Aug 2024 16:57:29 +0900 Subject: [PATCH 03/11] =?UTF-8?q?[fix]=20=E3=83=87=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=81=AE=E4=BB=95=E7=B5=84=E3=81=BF=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../purchasereports/DetailEditModal.tsx | 48 +++++-------------- 1 file changed, 11 insertions(+), 37 deletions(-) diff --git a/view/next-project/src/components/purchasereports/DetailEditModal.tsx b/view/next-project/src/components/purchasereports/DetailEditModal.tsx index aa3e1002..84dc90eb 100644 --- a/view/next-project/src/components/purchasereports/DetailEditModal.tsx +++ b/view/next-project/src/components/purchasereports/DetailEditModal.tsx @@ -1,8 +1,7 @@ import router from 'next/router'; -import { useEffect, useState } from 'react'; -import { Expense, PurchaseOrder, PurchaseReport } from '@/type/common'; +import { useState } from 'react'; +import { Expense, PurchaseOrder, PurchaseReportView } from '@/type/common'; import { put } from '@/utils/api/purchaseOrder'; -import { get } from '@api/api_methods'; import { CloseButton, Input, @@ -14,38 +13,13 @@ import { export const DetailEditModal: React.FC<{ purchaseReportId: number; + purchaseReportViewItem: PurchaseReportView; + expenses: Expense[]; isOpen: boolean; setIsOpen: () => void; onOpenInitial: () => void; -}> = ({ purchaseReportId, setIsOpen, onOpenInitial }) => { - const [expenses, setExpenses] = useState([]); - const [purchaseOrder, setPurchaseOrder] = useState({ - id: 0, - deadline: '', - userID: 0, - expenseID: 0, - financeCheck: false, - }); - - useEffect(() => { - const fetchData = async () => { - try { - const purchaseReportRes: PurchaseReport = await get( - `${process.env.CSR_API_URI}/purchasereports/${purchaseReportId}`, - ); - const purchaseOrderId = purchaseReportRes.purchaseOrderID; - const expensesRes: Expense[] = await get(`${process.env.CSR_API_URI}/expenses`); - const purchaseOrderRes: PurchaseOrder = await get( - `${process.env.CSR_API_URI}/purchaseorders/${purchaseOrderId}`, - ); - setExpenses(expensesRes); - setPurchaseOrder(purchaseOrderRes); - } catch (error) { - console.error('Failed to fetch data:', error); - } - }; - fetchData(); - }, [purchaseReportId]); +}> = ({ purchaseReportViewItem, expenses, setIsOpen, onOpenInitial }) => { + const [formData, setFormData] = useState(purchaseReportViewItem.purchaseOrder); const formatDate = (date: string) => { const d = new Date(date); @@ -57,15 +31,15 @@ export const DetailEditModal: React.FC<{ const submit = async () => { try { - const updatePurchaseOrderUrl = `${process.env.CSR_API_URI}/purchaseorders/${purchaseOrder.id}`; - await put(updatePurchaseOrderUrl, purchaseOrder); + const updatePurchaseOrderUrl = `${process.env.CSR_API_URI}/purchaseorders/${formData.id}`; + await put(updatePurchaseOrderUrl, formData); } finally { router.reload(); } }; const handleInputChange = (key: keyof PurchaseOrder, value: string | number) => { - setPurchaseOrder((prev) => ({ ...prev, [key]: value })); + setFormData((prev) => ({ ...prev, [key]: value })); }; return ( @@ -80,7 +54,7 @@ export const DetailEditModal: React.FC<{

購入した局

handleInputChange('deadline', e.target.value)} className='w-full' /> From ecc7ca48ac9a157544097673f5dd7b1a2bfbb9ff Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 11 Aug 2024 00:03:53 +0900 Subject: [PATCH 04/11] =?UTF-8?q?invoice=E5=9E=8B=E3=81=AE=E4=BD=9C?= =?UTF-8?q?=E6=88=90=E3=80=81=E8=AB=8B=E6=B1=82=E6=9B=B8=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC=E3=82=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sponsoractivities/AddPdfDetailModal.tsx | 71 ++++++++++---- view/next-project/src/type/common.ts | 17 ++++ .../createSponsorActivitiesInvoicesPDF.tsx | 98 +++++-------------- 3 files changed, 92 insertions(+), 94 deletions(-) diff --git a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx index 9ba2a913..cef81ba3 100644 --- a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx +++ b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx @@ -3,7 +3,12 @@ import React, { useState } from 'react'; import { createSponsorActivitiesPDF } from '@/utils/createSponsorActivitiesInvoicesPDF'; import { PreviewPDF } from '@/utils/createSponsorActivitiesInvoicesPDF'; import { CloseButton, Input, Modal, PrimaryButton } from '@components/common'; -import { SponsorActivityView } from '@type/common'; +import { + SponsorActivityView, + Invoice, + SponsorStyleDetail, + InvoiceSponsorStyle, +} from '@type/common'; interface ModalProps { setIsOpen: (isOpen: boolean) => void; @@ -17,6 +22,7 @@ interface FormDateFormat { } export default function AddPdfDetailModal(props: ModalProps) { + const { sponsorActivitiesViewItem } = props; const today = new Date(); const yyyy = String(today.getFullYear()); const mm = '08'; @@ -47,22 +53,47 @@ export default function AddPdfDetailModal(props: ModalProps) { ).padStart(2, '0')}`; }; + const sponsorStyleFormatted = () => { + return sponsorActivitiesViewItem.styleDetail.map((sponsorStyleDetail) => { + const sponsorStyle = sponsorStyleDetail.sponsorStyle; + return { + styleName: `${sponsorStyle.style}(${sponsorStyle.feature})`, + price: sponsorStyle.price, + }; + }); + }; + + const CalculateTotalPrice = () => { + return sponsorActivitiesViewItem.styleDetail.reduce( + (price: number, sponsorStyleDetail: SponsorStyleDetail): number => { + return price + sponsorStyleDetail.sponsorStyle.price; + }, + 0, + ); + }; + + const [invoiceData, setInvoiceDate] = useState({ + sponsorName: sponsorActivitiesViewItem.sponsor.name, + managerName: sponsorActivitiesViewItem.sponsor.representative, + totalPrice: CalculateTotalPrice(), + fesStuffName: sponsorActivitiesViewItem.user.name, + invoiceSponsorStyle: sponsorStyleFormatted(), + issuedDate: todayFormatted(), + deadline: ymd, + remark: '', + }); + const [formData, setFormData] = useState({ receivedAt: ymd, billIssuedAt: todayFormatted(), }); - const [remarks, setRemarks] = useState(''); const handler = (input: string) => (e: React.ChangeEvent | React.ChangeEvent) => { - setFormData({ ...formData, [input]: e.target.value }); + setInvoiceDate({ ...invoiceData, [input]: e.target.value }); }; - const handleRemarksChange = (e: React.ChangeEvent) => { - setRemarks(e.target.value); - }; - return (
@@ -80,22 +111,22 @@ export default function AddPdfDetailModal(props: ModalProps) {

請求書発行日

振込締め切り日

備考を入力

@@ -103,10 +134,9 @@ export default function AddPdfDetailModal(props: ModalProps) { { createSponsorActivitiesPDF( - props.sponsorActivitiesViewItem, - formatDate(formData.receivedAt), - formatDate(formData.billIssuedAt, false), - remarks, + invoiceData, + formatDate(invoiceData.deadline), + formatDate(invoiceData.issuedDate, false), ); props.setIsOpen(false); }} @@ -117,10 +147,9 @@ export default function AddPdfDetailModal(props: ModalProps) {
diff --git a/view/next-project/src/type/common.ts b/view/next-project/src/type/common.ts index f232297f..c5610553 100644 --- a/view/next-project/src/type/common.ts +++ b/view/next-project/src/type/common.ts @@ -286,3 +286,20 @@ export interface Receipt { fileType: string; remark: string; } + +//企業協賛用請求書用型 +export interface Invoice { + sponsorName: string; + managerName: string; + totalPrice: number; + fesStuffName: string; + invoiceSponsorStyle: InvoiceSponsorStyle[]; + issuedDate: string; + deadline: string; + remark: string; +} + +export interface InvoiceSponsorStyle { + styleName: string; + price: number; +} diff --git a/view/next-project/src/utils/createSponsorActivitiesInvoicesPDF.tsx b/view/next-project/src/utils/createSponsorActivitiesInvoicesPDF.tsx index 94db2dd1..ac7fd8ee 100644 --- a/view/next-project/src/utils/createSponsorActivitiesInvoicesPDF.tsx +++ b/view/next-project/src/utils/createSponsorActivitiesInvoicesPDF.tsx @@ -1,6 +1,6 @@ import { Document, Page, Text, Font, View, pdf, StyleSheet, PDFViewer } from '@react-pdf/renderer'; import React from 'react'; -import { SponsorActivityView } from '@type/common'; +import { Invoice } from '@type/common'; Font.register({ family: 'NotoSansJP', @@ -131,15 +131,12 @@ const styles = StyleSheet.create({ }); interface MyDocumentProps { - sponsorActivitiesViewItem: SponsorActivityView; - totalPrice: number; - date: string; + invoiceItem: Invoice; + deadline: string; issuedDate: string; - remarks: string; - formatDate: (date: string) => string; } -const MyDocument = (props: MyDocumentProps) => ( +const MyDocument = ({ invoiceItem, deadline, issuedDate }: MyDocumentProps) => ( @@ -149,12 +146,12 @@ const MyDocument = (props: MyDocumentProps) => ( - {props.sponsorActivitiesViewItem.sponsor.name} + {invoiceItem.sponsorName} {' '} 御中 - ご担当 : {props.sponsorActivitiesViewItem.sponsor.representative} 様 + ご担当 : {invoiceItem.managerName} 様 件名 : 技大祭企業協賛 @@ -165,13 +162,13 @@ const MyDocument = (props: MyDocumentProps) => ( - 合計金額 ¥ {props.totalPrice} + 合計金額 ¥ {invoiceItem.totalPrice} - 請求日 : {props.issuedDate} + 請求日 : {issuedDate} 技大祭実行委員会 @@ -180,7 +177,7 @@ const MyDocument = (props: MyDocumentProps) => ( 長岡技術科学大学 大学集会施設 E-Mail : nutfes_shogai_kyosan@googlegroups.com - 担当 : {props.sponsorActivitiesViewItem.user.name} + 担当 : {invoiceItem.fesStuffName} @@ -193,19 +190,13 @@ const MyDocument = (props: MyDocumentProps) => ( 単価 金額 - {props.sponsorActivitiesViewItem.styleDetail.map((styleDetail, index) => ( - + {invoiceItem.invoiceSponsorStyle.map((sponsorStyle, index) => ( + {index + 1} - - {styleDetail.sponsorStyle.style} ({styleDetail.sponsorStyle.feature}) - + {sponsorStyle.styleName} 1 - - ¥ {styleDetail.sponsorStyle.price} - - - ¥ {styleDetail.sponsorStyle.price} - + ¥ {sponsorStyle.price} + ¥ {sponsorStyle.price} ))} @@ -213,12 +204,14 @@ const MyDocument = (props: MyDocumentProps) => ( 合計 - ¥ {props.totalPrice} + + ¥ {invoiceItem.totalPrice} + - お手数でございますが、{props.date}までに下記口座へ振込くださいますようお願い申し上げます。 + お手数でございますが、{deadline}までに下記口座へ振込くださいますようお願い申し上げます。 <振込先> 銀 行 名 : 大光銀行(金融機関コード : 0532) @@ -235,7 +228,7 @@ const MyDocument = (props: MyDocumentProps) => ( 振込手数料は、御社負担にてお願いいたします。 - {(props.remarks.match(/.{1,40}/g) || []).map((chunk, index) => ( + {(invoiceItem.remark.match(/.{1,40}/g) || []).map((chunk, index) => ( {chunk} ))} @@ -246,65 +239,24 @@ const MyDocument = (props: MyDocumentProps) => ( ); -const CalculateTotalPrice = (sponsorActivitiesViewItem: SponsorActivityView): number => { - const totalPrice = sponsorActivitiesViewItem.styleDetail.reduce((totalPriceAccumulator, item) => { - return totalPriceAccumulator + item.sponsorStyle.price; - }, 0); - return totalPrice; -}; - -const formatDate = (datetime: string) => { - const datetime2 = datetime.substring(0, datetime.length - 10); - return datetime2; -}; - export const createSponsorActivitiesPDF = async ( - sponsorActivitiesViewItem: SponsorActivityView, - date: string, + invoiceItem: Invoice, + deadline: string, issuedDate: string, - remarks: string, ) => { const asPdf = pdf( - , + , ); const blob = await asPdf.toBlob(); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; - link.download = `${formatDate(sponsorActivitiesViewItem.sponsorActivity.createdAt || '')}-${ - sponsorActivitiesViewItem.sponsor.name - }-請求書.pdf`; + link.download = `${issuedDate || ''}-${invoiceItem.sponsorName}-請求書.pdf`; link.click(); }; -interface PreviewProps { - sponsorActivitiesViewItem: SponsorActivityView; - date: string; - issuedDate: string; - remarks: string; -} - -export const PreviewPDF: React.FC = ({ - sponsorActivitiesViewItem, - date, - issuedDate, - remarks, -}) => ( +export const PreviewPDF: React.FC = ({ invoiceItem, deadline, issuedDate }) => ( - + ); From 1fbbb2ec62aef85f79c6247f715f3e110a42140a Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 11 Aug 2024 00:07:40 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E5=89=8A=E9=99=A4=E3=80=81=E5=9E=8B=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/sponsoractivities/AddPdfDetailModal.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx index cef81ba3..56479df5 100644 --- a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx +++ b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx @@ -53,13 +53,14 @@ export default function AddPdfDetailModal(props: ModalProps) { ).padStart(2, '0')}`; }; - const sponsorStyleFormatted = () => { + const sponsorStyleFormatted = (): InvoiceSponsorStyle[] => { return sponsorActivitiesViewItem.styleDetail.map((sponsorStyleDetail) => { const sponsorStyle = sponsorStyleDetail.sponsorStyle; - return { + const res: InvoiceSponsorStyle = { styleName: `${sponsorStyle.style}(${sponsorStyle.feature})`, price: sponsorStyle.price, }; + return res; }); }; @@ -83,11 +84,6 @@ export default function AddPdfDetailModal(props: ModalProps) { remark: '', }); - const [formData, setFormData] = useState({ - receivedAt: ymd, - billIssuedAt: todayFormatted(), - }); - const handler = (input: string) => (e: React.ChangeEvent | React.ChangeEvent) => { From 2347c91c31ea469a12fb0df8588ec3118a77cf10 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 11 Aug 2024 02:35:35 +0900 Subject: [PATCH 06/11] =?UTF-8?q?=E4=BC=81=E6=A5=AD=E5=8D=94=E8=B3=9B?= =?UTF-8?q?=E8=AB=8B=E6=B1=82=E6=9B=B8=E3=81=AE=E7=B7=A8=E9=9B=86=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/EditButton.tsx | 22 ++- .../src/components/common/Input/Input.tsx | 2 +- .../sponsoractivities/AddPdfDetailModal.tsx | 6 +- .../sponsoractivities/EditInvoiceModal.tsx | 144 ++++++++++++++++++ .../OpenEditInvoiceModalButton.tsx | 30 ++++ .../src/components/sponsoractivities/index.ts | 2 + 6 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx create mode 100644 view/next-project/src/components/sponsoractivities/OpenEditInvoiceModalButton.tsx diff --git a/view/next-project/src/components/common/EditButton.tsx b/view/next-project/src/components/common/EditButton.tsx index ba8c1d37..a337116c 100644 --- a/view/next-project/src/components/common/EditButton.tsx +++ b/view/next-project/src/components/common/EditButton.tsx @@ -4,10 +4,11 @@ import { RiPencilFill } from 'react-icons/ri'; interface Props { onClick?: () => void; isDisabled?: boolean; + size?: 'S' | 'M' | 'L'; } const EditButton: React.FC = (props) => { - const { onClick, isDisabled = false } = props; + const { onClick, isDisabled = false, size } = props; const buttonClass = useMemo(() => { if (isDisabled) { @@ -17,17 +18,32 @@ const EditButton: React.FC = (props) => { } }, [isDisabled]); + const iconSize = (): { button: string; icon: string } => { + switch (size) { + case 'S': + return { button: '6', icon: '12' }; + case 'M': + return { button: '12', icon: '20' }; + case 'L': + return { button: '24', icon: '30' }; + default: + return { button: '6', icon: '12' }; + } + }; + return ( ); }; diff --git a/view/next-project/src/components/common/Input/Input.tsx b/view/next-project/src/components/common/Input/Input.tsx index c80dfad8..01efca8c 100644 --- a/view/next-project/src/components/common/Input/Input.tsx +++ b/view/next-project/src/components/common/Input/Input.tsx @@ -19,7 +19,7 @@ interface Props { function Input(props: Props): JSX.Element { const className = - 'rounded-full border border-primary-1 py-2 px-4' + + 'rounded-full border border-primary-1 py-2 px-4 w-full' + (props.className ? ` ${props.className}` : ''); return (
diff --git a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx index 56479df5..b003a779 100644 --- a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx +++ b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; +import { OpenEditInvoiceModalButton } from './index'; import { createSponsorActivitiesPDF } from '@/utils/createSponsorActivitiesInvoicesPDF'; import { PreviewPDF } from '@/utils/createSponsorActivitiesInvoicesPDF'; import { CloseButton, Input, Modal, PrimaryButton } from '@components/common'; @@ -101,7 +102,7 @@ export default function AddPdfDetailModal(props: ModalProps) { />

- 振込締め切り日・備考の入力 + 請求書の発行

請求書発行日

@@ -126,7 +127,7 @@ export default function AddPdfDetailModal(props: ModalProps) { className='mb-3 w-full' />
-
+
{ createSponsorActivitiesPDF( @@ -139,6 +140,7 @@ export default function AddPdfDetailModal(props: ModalProps) { > ダウンロード +
diff --git a/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx new file mode 100644 index 00000000..8cf584cf --- /dev/null +++ b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx @@ -0,0 +1,144 @@ +import clsx from 'clsx'; +import React, { useState } from 'react'; +import { PrimaryButton, OutlinePrimaryButton, CloseButton, Modal, Input } from '@components/common'; +import { Invoice, InvoiceSponsorStyle } from '@type/common'; + +interface ModalProps { + invoice: Invoice; + setInvoice: (invoce: Invoice) => void; + setIsOpen: (isOpen: boolean) => void; +} + +export default function EditInvoiceModal(props: ModalProps) { + const { invoice, setInvoice, setIsOpen } = props; + const [editInvoice, setEditInvoice] = useState(invoice); + + const handler = + (input: string) => + ( + e: + | React.ChangeEvent + | React.ChangeEvent + | React.ChangeEvent, + ) => { + setEditInvoice({ ...editInvoice, [input]: e.target.value }); + }; + + const onChangeSponsorStyle = (inputInvoiceSponsorStyle: InvoiceSponsorStyle, index: number) => { + const newInvoiceSponsorStyles = editInvoice.invoiceSponsorStyle.map( + (invoiceSponsorStyle, i) => { + if (i === index) { + return inputInvoiceSponsorStyle; + } else { + return invoiceSponsorStyle; + } + }, + ); + const totalPrice = newInvoiceSponsorStyles.reduce( + (price: number, invoiceSponsorStyle: InvoiceSponsorStyle): number => { + return price + invoiceSponsorStyle.price; + }, + 0, + ); + setEditInvoice({ + ...editInvoice, + invoiceSponsorStyle: newInvoiceSponsorStyles, + totalPrice: totalPrice, + }); + }; + + const handleRegister = () => { + setInvoice(editInvoice); + setIsOpen(false); + }; + + return ( + +
+
+ { + setIsOpen(false); + }} + /> +
+
+
請求書の修正
+
+
+

企業名

+
+ +
+

企業担当者名

+
+ +
+

実行委員担当者名

+
+ +
+
+
+ + + + + + + + + {editInvoice.invoiceSponsorStyle && + editInvoice.invoiceSponsorStyle.map((invoiceSponsorStyle, index) => ( + + + + + ))} + +
+
協賛内容(オプション)
+
+
値段
+
+ { + onChangeSponsorStyle( + { ...invoiceSponsorStyle, styleName: e.target.value }, + index, + ); + }} + > + + { + onChangeSponsorStyle( + { ...invoiceSponsorStyle, price: Number(e.target.value) }, + index, + ); + }} + > +
+
+
+ { + setIsOpen(false); + }} + > + 戻る + + 編集完了 +
+
+
+ ); +} diff --git a/view/next-project/src/components/sponsoractivities/OpenEditInvoiceModalButton.tsx b/view/next-project/src/components/sponsoractivities/OpenEditInvoiceModalButton.tsx new file mode 100644 index 00000000..e1613c68 --- /dev/null +++ b/view/next-project/src/components/sponsoractivities/OpenEditInvoiceModalButton.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; +import { useState } from 'react'; + +import { EditButton } from '../common'; +import EditInvoiceModal from './EditInvoiceModal'; +import { Invoice } from '@/type/common'; + +interface Props { + children?: React.ReactNode; + invoice: Invoice; + setInvoice: (invoice: Invoice) => void; +} + +const OpenEditInvoiceModalButton: React.FC = (props) => { + const { invoice, setInvoice } = props; + const [isOpen, setIsOpen] = useState(false); + const onOpen = () => { + setIsOpen(true); + }; + return ( + <> + + {isOpen && ( + + )} + + ); +}; + +export default OpenEditInvoiceModalButton; diff --git a/view/next-project/src/components/sponsoractivities/index.ts b/view/next-project/src/components/sponsoractivities/index.ts index aa890f8b..6f93df8a 100644 --- a/view/next-project/src/components/sponsoractivities/index.ts +++ b/view/next-project/src/components/sponsoractivities/index.ts @@ -13,3 +13,5 @@ export { default as OpenPaymentDayModalButton } from './OpenPaymentDayModalButto export { default as PaymentDayModal } from './PaymentDayModal'; export { default as SponsorActivitiesAddModal } from './SponsorActivitiesAddModal'; export { default as UploadFileModal } from './UploadFileModal'; +export { default as EditInvoiceModal } from './EditInvoiceModal'; +export { default as OpenEditInvoiceModalButton } from './OpenEditInvoiceModalButton'; From 88bbe17075b17c70559fbe5a02ac8d048bff8641 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 11 Aug 2024 13:38:52 +0900 Subject: [PATCH 07/11] =?UTF-8?q?=E3=83=AC=E3=82=B7=E3=83=BC=E3=83=88?= =?UTF-8?q?=E7=99=BB=E9=8C=B2=E6=99=82=E3=81=AB=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E5=90=8D=E3=82=92=E5=8B=95=E7=9A=84=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../purchasereports/UploadFileModal.tsx | 27 ++++++++++++++++--- view/next-project/src/pages/api/receipts.tsx | 4 ++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/view/next-project/src/components/purchasereports/UploadFileModal.tsx b/view/next-project/src/components/purchasereports/UploadFileModal.tsx index 0432ef6c..edb36d7f 100644 --- a/view/next-project/src/components/purchasereports/UploadFileModal.tsx +++ b/view/next-project/src/components/purchasereports/UploadFileModal.tsx @@ -54,6 +54,11 @@ const UplaodFileModal: FC = (props) => { }); }; + const generateRandomString = (charCount = 7): string => { + const str = Math.random().toString(36).substring(2).slice(-charCount); + return str.length < charCount ? str + 'a'.repeat(charCount - str.length) : str; + }; + const submit = async () => { if (!imageFile) { return; @@ -65,9 +70,23 @@ const UplaodFileModal: FC = (props) => { setIsLoading(true); const formData = new FormData(); + + //拡張子取得 + const uploadFileName = imageFile?.name || ''; + const Extension = uploadFileName.split('.').pop(); + + // 日付取得 + const date = new Date(); + const month = date.getMonth() < 10 ? '0' + date.getMonth() : date.getMonth(); + const day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); + const formattedDate = `${date.getFullYear()}${month}${day}`; + const randomStr = generateRandomString(); + + // ファイル名作成 + const fileName = `receipt_${formattedDate}_${randomStr}.${Extension}`; + formData.append('file', imageFile); - const fileName = imageFile?.name || ''; - formData.append('fileName', `receipts/${fileName}`); + formData.append('fileName', fileName); formData.append('year', year); const response = await fetch('/api/receipts', { @@ -94,7 +113,7 @@ const UplaodFileModal: FC = (props) => { const sendReceipt: Receipt = { purchaseReportID: Number(id), bucketName: process.env.NEXT_PUBLIC_BUCKET_NAME || '', - fileName: imageFile.name, + fileName: fileName, fileType: imageFile.type, remark: '', }; @@ -176,7 +195,7 @@ const UplaodFileModal: FC = (props) => {
- submit()} disabled={isLoading && !imageFile}> + submit()} disabled={isLoading || !imageFile}> 登録
diff --git a/view/next-project/src/pages/api/receipts.tsx b/view/next-project/src/pages/api/receipts.tsx index cf33f71d..20458a62 100644 --- a/view/next-project/src/pages/api/receipts.tsx +++ b/view/next-project/src/pages/api/receipts.tsx @@ -37,7 +37,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const bucketName = 'finansu'; const year = fields.year && fields.year[0]; - const fileName = `${year}/receipts/${files.file[0].originalFilename}`; + const fileName = fields.fileName + ? `${year}/receipts/${fields.fileName}` + : `${year}/receipts/${files.file[0].originalFilename}`; const file = files.file[0]; const mimetype = file.mimetype; const metaData = { From 0327c835f4ee44c13379189a9bf6933db467fd99 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 11 Aug 2024 16:09:37 +0900 Subject: [PATCH 08/11] =?UTF-8?q?=E5=85=A8=E8=A7=92=E3=81=AE=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/sponsoractivities/EditInvoiceModal.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx index 8cf584cf..fba6af5d 100644 --- a/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx +++ b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx @@ -117,7 +117,12 @@ export default function EditInvoiceModal(props: ModalProps) { value={invoiceSponsorStyle.price} onChange={(e) => { onChangeSponsorStyle( - { ...invoiceSponsorStyle, price: Number(e.target.value) }, + { + ...invoiceSponsorStyle, + price: isNaN(Number(e.target.value)) + ? invoiceSponsorStyle.price + : Number(e.target.value), + }, index, ); }} From 3692c33699dc8123502015d9d46ef0a58223d290 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 11 Aug 2024 16:54:10 +0900 Subject: [PATCH 09/11] =?UTF-8?q?[fix]=E4=BB=8A=E6=9C=88=E3=82=92=E6=AD=A3?= =?UTF-8?q?=E3=81=97=E3=81=8F=E5=87=BA=E5=8A=9B=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/purchasereports/UploadFileModal.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/view/next-project/src/components/purchasereports/UploadFileModal.tsx b/view/next-project/src/components/purchasereports/UploadFileModal.tsx index edb36d7f..f1a4a24f 100644 --- a/view/next-project/src/components/purchasereports/UploadFileModal.tsx +++ b/view/next-project/src/components/purchasereports/UploadFileModal.tsx @@ -77,7 +77,8 @@ const UplaodFileModal: FC = (props) => { // 日付取得 const date = new Date(); - const month = date.getMonth() < 10 ? '0' + date.getMonth() : date.getMonth(); + const thisMonth = date.getMonth() + 1; + const month = thisMonth < 10 ? '0' + thisMonth : thisMonth; const day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); const formattedDate = `${date.getFullYear()}${month}${day}`; const randomStr = generateRandomString(); From c8fbc475bb875662a2c72d53372fb40c777335e5 Mon Sep 17 00:00:00 2001 From: uchida189 Date: Sat, 24 Aug 2024 14:43:57 +0900 Subject: [PATCH 10/11] =?UTF-8?q?[feat]=E5=8D=94=E8=B3=9B=E6=B4=BB?= =?UTF-8?q?=E5=8B=95=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=A7=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E5=A4=96=E3=82=BF=E3=83=83=E3=83=97=E3=81=A7=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=80=E3=83=AB=E3=82=92=E9=96=89=E3=81=98=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../sponsoractivities/AddPdfDetailModal.tsx | 12 +++++++----- .../sponsoractivities/DeleteModal.tsx | 10 +++++++--- .../sponsoractivities/DetailModal.tsx | 2 +- .../sponsoractivities/EditInvoiceModal.tsx | 14 +++++++------- .../components/sponsoractivities/EditModal.tsx | 18 +++++++----------- .../sponsoractivities/FilterModal.tsx | 7 +------ .../sponsoractivities/PaymentDayModal.tsx | 12 +++++++----- .../SponsorActivitiesAddModal.tsx | 12 ++++++------ .../sponsoractivities/UploadFileModal.tsx | 2 +- 10 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index be84314c..0f1a7264 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ FinanSu.iml finansu.env finansu.local.env api/tmp +.DS_Store # cloudflare web/**/*.json diff --git a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx index b003a779..f5d55529 100644 --- a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx +++ b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx @@ -90,15 +90,17 @@ export default function AddPdfDetailModal(props: ModalProps) { (e: React.ChangeEvent | React.ChangeEvent) => { setInvoiceDate({ ...invoiceData, [input]: e.target.value }); }; + + const onClose = () => { + props.setIsOpen(false); + }; return ( - +
{ - props.setIsOpen(false); - }} + onClick={onClose} />

@@ -135,7 +137,7 @@ export default function AddPdfDetailModal(props: ModalProps) { formatDate(invoiceData.deadline), formatDate(invoiceData.issuedDate, false), ); - props.setIsOpen(false); + onClose(); }} > ダウンロード diff --git a/view/next-project/src/components/sponsoractivities/DeleteModal.tsx b/view/next-project/src/components/sponsoractivities/DeleteModal.tsx index 86d52d77..7afc83bf 100644 --- a/view/next-project/src/components/sponsoractivities/DeleteModal.tsx +++ b/view/next-project/src/components/sponsoractivities/DeleteModal.tsx @@ -17,6 +17,10 @@ const SponsorActivitiesDeleteModal: FC = (props) => { props.setShowModal(false); router.reload(); }; + + const onClose = () => { + props.setShowModal(false); + }; const deleteSponsorActivity = async () => { const deleteSponsorActivityUrl = process.env.CSR_API_URI + '/activities/' + props.id; @@ -24,17 +28,17 @@ const SponsorActivitiesDeleteModal: FC = (props) => { }; return ( - +

- props.setShowModal(false)} /> +
協賛企業の削除
削除しますか?
- 戻る + 戻る { deleteSponsorActivity(); diff --git a/view/next-project/src/components/sponsoractivities/DetailModal.tsx b/view/next-project/src/components/sponsoractivities/DetailModal.tsx index af011e1f..25d3b9a8 100644 --- a/view/next-project/src/components/sponsoractivities/DetailModal.tsx +++ b/view/next-project/src/components/sponsoractivities/DetailModal.tsx @@ -31,7 +31,7 @@ const DetailModal: FC = (props) => { const [pageNum, setPageNum] = useState(1); return ( - +
diff --git a/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx index fba6af5d..1fb0de6a 100644 --- a/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx +++ b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx @@ -51,15 +51,17 @@ export default function EditInvoiceModal(props: ModalProps) { setInvoice(editInvoice); setIsOpen(false); }; + + const onClose = () => { + props.setIsOpen(false); + }; return ( - +
{ - setIsOpen(false); - }} + onClick={onClose} />
@@ -135,9 +137,7 @@ export default function EditInvoiceModal(props: ModalProps) {
{ - setIsOpen(false); - }} + onClick={onClose} > 戻る diff --git a/view/next-project/src/components/sponsoractivities/EditModal.tsx b/view/next-project/src/components/sponsoractivities/EditModal.tsx index 0e0368db..7bf06eb1 100644 --- a/view/next-project/src/components/sponsoractivities/EditModal.tsx +++ b/view/next-project/src/components/sponsoractivities/EditModal.tsx @@ -210,6 +210,10 @@ export default function EditModal(props: ModalProps) { }, [formDataSponsorID]); const NO_SPONSORS_MESSAGE = '企業が登録されていません'; + + const onClose = () => { + props.setIsOpen(false); + }; // 協賛企業の情報 const content = (data: SponsorActivity) => ( @@ -352,14 +356,10 @@ export default function EditModal(props: ModalProps) { ); return ( - +
- { - props.setIsOpen(false); - }} - /> +
協賛企業の修正
@@ -371,11 +371,7 @@ export default function EditModal(props: ModalProps) {
)}
- { - props.setIsOpen(false); - }} - > + 戻る = (props) => { }; return ( - { - onClose(); - }} - > +
diff --git a/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx b/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx index b4a31929..0925d8cf 100644 --- a/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx +++ b/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx @@ -47,14 +47,16 @@ export default function PaymentDayModal(props: ModalProps) { setFormData({ ...formData, [input]: e.target.value }); }; + const onClose = () => { + props.setIsOpen(false); + }; + return ( - +
{ - props.setIsOpen(false); - }} + onClick={onClose} />

@@ -76,7 +78,7 @@ export default function PaymentDayModal(props: ModalProps) { formatDate(paymentDay, false), formatDate(formData.receivedAt, false), ); - props.setIsOpen(false); + onClose(); }} > 領収書ダウンロード diff --git a/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx b/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx index 46c0df58..842f549b 100644 --- a/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx +++ b/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx @@ -198,6 +198,10 @@ export default function SponsorActivitiesAddModal(props: Props) { }, [formDataSponsorID]); const NO_SPONSORS_MESSAGE = '企業が登録されていません'; + + const onClose = () => { + props.setIsOpen(false); + }; // 協賛活動の情報 const content = (data: SponsorActivity) => ( @@ -426,14 +430,10 @@ export default function SponsorActivitiesAddModal(props: Props) { }; return ( - +

- { - props.setIsOpen(false); - }} - /> +
協賛活動の登録
diff --git a/view/next-project/src/components/sponsoractivities/UploadFileModal.tsx b/view/next-project/src/components/sponsoractivities/UploadFileModal.tsx index 063b82da..92807023 100644 --- a/view/next-project/src/components/sponsoractivities/UploadFileModal.tsx +++ b/view/next-project/src/components/sponsoractivities/UploadFileModal.tsx @@ -152,7 +152,7 @@ const UplaodFileModal: FC = (props) => { }; return ( - +
From 5b7fdb715ec198b7c2bedcc7641ea1675a9fb18f Mon Sep 17 00:00:00 2001 From: uchida189 Date: Sat, 24 Aug 2024 05:46:53 +0000 Subject: [PATCH 11/11] formatted by workflow --- .../sponsoractivities/AddPdfDetailModal.tsx | 6 ++---- .../src/components/sponsoractivities/DeleteModal.tsx | 2 +- .../sponsoractivities/EditInvoiceModal.tsx | 12 +++--------- .../src/components/sponsoractivities/EditModal.tsx | 8 +++----- .../components/sponsoractivities/PaymentDayModal.tsx | 4 +--- .../sponsoractivities/SponsorActivitiesAddModal.tsx | 4 ++-- 6 files changed, 12 insertions(+), 24 deletions(-) diff --git a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx index f5d55529..b2d5eec4 100644 --- a/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx +++ b/view/next-project/src/components/sponsoractivities/AddPdfDetailModal.tsx @@ -90,7 +90,7 @@ export default function AddPdfDetailModal(props: ModalProps) { (e: React.ChangeEvent | React.ChangeEvent) => { setInvoiceDate({ ...invoiceData, [input]: e.target.value }); }; - + const onClose = () => { props.setIsOpen(false); }; @@ -99,9 +99,7 @@ export default function AddPdfDetailModal(props: ModalProps) {
- +

請求書の発行 diff --git a/view/next-project/src/components/sponsoractivities/DeleteModal.tsx b/view/next-project/src/components/sponsoractivities/DeleteModal.tsx index 7afc83bf..99f7cd0d 100644 --- a/view/next-project/src/components/sponsoractivities/DeleteModal.tsx +++ b/view/next-project/src/components/sponsoractivities/DeleteModal.tsx @@ -17,7 +17,7 @@ const SponsorActivitiesDeleteModal: FC = (props) => { props.setShowModal(false); router.reload(); }; - + const onClose = () => { props.setShowModal(false); }; diff --git a/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx index 1fb0de6a..02ee5a67 100644 --- a/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx +++ b/view/next-project/src/components/sponsoractivities/EditInvoiceModal.tsx @@ -51,7 +51,7 @@ export default function EditInvoiceModal(props: ModalProps) { setInvoice(editInvoice); setIsOpen(false); }; - + const onClose = () => { props.setIsOpen(false); }; @@ -60,9 +60,7 @@ export default function EditInvoiceModal(props: ModalProps) {

- +
請求書の修正
@@ -136,11 +134,7 @@ export default function EditInvoiceModal(props: ModalProps) {
- - 戻る - + 戻る 編集完了
diff --git a/view/next-project/src/components/sponsoractivities/EditModal.tsx b/view/next-project/src/components/sponsoractivities/EditModal.tsx index 7bf06eb1..4fb3ba16 100644 --- a/view/next-project/src/components/sponsoractivities/EditModal.tsx +++ b/view/next-project/src/components/sponsoractivities/EditModal.tsx @@ -210,7 +210,7 @@ export default function EditModal(props: ModalProps) { }, [formDataSponsorID]); const NO_SPONSORS_MESSAGE = '企業が登録されていません'; - + const onClose = () => { props.setIsOpen(false); }; @@ -359,7 +359,7 @@ export default function EditModal(props: ModalProps) {
- +
協賛企業の修正
@@ -371,9 +371,7 @@ export default function EditModal(props: ModalProps) {
)}
- - 戻る - + 戻る { submit(formData); diff --git a/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx b/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx index 0925d8cf..d55ecd39 100644 --- a/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx +++ b/view/next-project/src/components/sponsoractivities/PaymentDayModal.tsx @@ -55,9 +55,7 @@ export default function PaymentDayModal(props: ModalProps) {
- +

入金日を入力 diff --git a/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx b/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx index 842f549b..b2a8b84f 100644 --- a/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx +++ b/view/next-project/src/components/sponsoractivities/SponsorActivitiesAddModal.tsx @@ -198,7 +198,7 @@ export default function SponsorActivitiesAddModal(props: Props) { }, [formDataSponsorID]); const NO_SPONSORS_MESSAGE = '企業が登録されていません'; - + const onClose = () => { props.setIsOpen(false); }; @@ -433,7 +433,7 @@ export default function SponsorActivitiesAddModal(props: Props) {

- +
協賛活動の登録