03d01d4c4e
on:
pull_request:
branches:
- production
types:
- closed
jobs:
backend-build-and-deploy:
name: Build & Deploy ERP Core Backend
runs-on: linux
if: github.event.pull_request.merged == true
steps:
- name: Checkout code
run: |
git clone \
--depth 1 \
--branch production \
https://oauth2:${{ secrets.ERPCORE }}@gitea.hexdive.com/New_REP_SYSTEM/ERP-core.git \
.
- name: Restore backend
run: dotnet restore Backend/ERPCore.sln
- name: Publish backend
run: |
rm -rf /tmp/erpcore-deploy
mkdir -p /tmp/erpcore-deploy
dotnet publish Backend/ERPCore/ERPCore.csproj \
-c Release \
-r linux-x64 \
--self-contained true \
-o /tmp/erpcore-deploy
- name: Stop backend service
run: systemctl stop erpcore.service
- name: Copy backend to deploy folder
run: |
mkdir -p /home/erp/core/publish
rm -rf /home/erp/core/publish/*
cp -r /tmp/erpcore-deploy/* /home/erp/core/publish/
- name: Fix backend ownership and permissions
run: |
chown -R erpuser:erpuser /home/erp/core/publish
find /home/erp/core/publish -type d -exec chmod 755 {} +
find /home/erp/core/publish -type f -exec chmod 644 {} +
chmod +x /home/erp/core/publish/ERPCore
- name: Restart backend service
run: systemctl restart erpcore.service
- name: Verify backend
run: |
systemctl is-active erpcore.service && echo "Backend service running" || echo "Backend service failed"
frontend-build-and-deploy:
name: Build & Deploy ERP Core Frontend
runs-on: linux
needs: backend-build-and-deploy
if: github.event.pull_request.merged == true
steps:
- name: Checkout code
run: |
git clone \
--depth 1 \
--branch Production \
https://oauth2:${{ secrets.ERPCORE }}@gitea.hexdive.com/New_REP_SYSTEM/ERP-core.git \
.
- name: Build frontend Docker image
run: docker build -t erpcore-frontend:latest Frontend/erp-system
- name: Stop & remove existing frontend container
run: |
docker stop erpcore-frontend 2>/dev/null || true
docker rm erpcore-frontend 2>/dev/null || true
- name: Start frontend container
run: |
docker run -d \
--name erpcore-frontend \
-p 6702:6702 \
--add-host=host.docker.internal:host-gateway \
-e BACKEND_ORIGIN=http://host.docker.internal:6701 \
--restart unless-stopped \
--memory="512m" \
--cpus="1.0" \
--cap-drop ALL \
--security-opt no-new-privileges \
erpcore-frontend:latest
- name: Remove old frontend images
run: docker image prune -f
- name: Verify frontend
run: |
docker ps --filter name=erpcore-frontend --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" \
| grep erpcore-frontend && echo "Frontend container running" || echo "Frontend container failed"
100 lines
3.1 KiB
TypeScript
100 lines
3.1 KiB
TypeScript
import { api } from '@/lib/api'
|
|
import type {
|
|
PaginatedResponse,
|
|
ShopPOResponse,
|
|
InvoiceResponse,
|
|
InvoiceStatus,
|
|
PaymentResponse,
|
|
PaymentMethod,
|
|
ShopPOStatus,
|
|
} from '@/types/api'
|
|
|
|
import type { PageParams } from './master'
|
|
|
|
// ─── Shop POs ─────────────────────────────────────────────────────────────────
|
|
|
|
export interface ShopPOItemBody {
|
|
itemId: string
|
|
quantity: number
|
|
unitPrice?: number | null
|
|
}
|
|
|
|
export interface CreateShopPOBody {
|
|
storeId: string
|
|
items: ShopPOItemBody[]
|
|
}
|
|
|
|
export interface UpdateShopPOItemsBody {
|
|
items: ShopPOItemBody[]
|
|
}
|
|
|
|
export interface ShopPOListParams extends PageParams {
|
|
agentId?: string
|
|
routeId?: string
|
|
shopId?: string
|
|
confirmed?: boolean
|
|
status?: ShopPOStatus
|
|
}
|
|
|
|
export const shopPos = {
|
|
list: (params?: ShopPOListParams) =>
|
|
api.get<PaginatedResponse<ShopPOResponse>>('/shop-pos', { params }).then(r => r.data),
|
|
|
|
get: (id: string) =>
|
|
api.get<ShopPOResponse>(`/shop-pos/${id}`).then(r => r.data),
|
|
|
|
create: (body: CreateShopPOBody) =>
|
|
api.post<ShopPOResponse>('/shop-pos', body).then(r => r.data),
|
|
|
|
updateItems: (id: string, body: UpdateShopPOItemsBody) =>
|
|
api.put<ShopPOResponse>(`/shop-pos/${id}/items`, body).then(r => r.data),
|
|
|
|
confirm: (id: string) =>
|
|
api.post<ShopPOResponse>(`/shop-pos/${id}/confirm`).then(r => r.data),
|
|
|
|
confirmAndCreateInvoice: (id: string) =>
|
|
api.post<ShopPOResponse>(`/shop-pos/${id}/confirm-and-create-invoice`).then(r => r.data),
|
|
|
|
cancel: (id: string) =>
|
|
api.post<ShopPOResponse>(`/shop-pos/${id}/cancel`).then(r => r.data),
|
|
}
|
|
|
|
// ─── Invoices ─────────────────────────────────────────────────────────────────
|
|
|
|
export interface InvoiceListParams extends PageParams {
|
|
agentId?: string
|
|
routeId?: string
|
|
shopId?: string
|
|
status?: InvoiceStatus
|
|
}
|
|
|
|
export const invoices = {
|
|
list: (params?: InvoiceListParams) =>
|
|
api.get<PaginatedResponse<InvoiceResponse>>('/invoices', { params }).then(r => r.data),
|
|
|
|
get: (id: string) =>
|
|
api.get<InvoiceResponse>(`/invoices/${id}`).then(r => r.data),
|
|
|
|
print: (id: string) =>
|
|
api.post<InvoiceResponse>(`/invoices/${id}/print`).then(r => r.data),
|
|
|
|
finalize: (id: string) =>
|
|
api.post<InvoiceResponse>(`/invoices/${id}/finalize`).then(r => r.data),
|
|
}
|
|
|
|
// ─── Payments ─────────────────────────────────────────────────────────────────
|
|
|
|
export interface PaymentBody {
|
|
amount: number
|
|
method: PaymentMethod
|
|
collectedByUserId?: string | null
|
|
}
|
|
|
|
export const payments = {
|
|
listByInvoice: (invoiceId: string) =>
|
|
api.get<PaymentResponse[]>(`/invoices/${invoiceId}/payments`).then(r => r.data),
|
|
|
|
create: (invoiceId: string, body: PaymentBody) =>
|
|
api.post<PaymentResponse>(`/invoices/${invoiceId}/payments`, body).then(r => r.data),
|
|
}
|