Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
15288b270a | ||
|
|
5cfa02a6ef |
@@ -0,0 +1,61 @@
|
|||||||
|
# Version control & IDEs
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
.agents
|
||||||
|
.gemini
|
||||||
|
|
||||||
|
# Build artifacts & compiled outputs
|
||||||
|
frontend
|
||||||
|
dist
|
||||||
|
**/dist
|
||||||
|
out-tsc
|
||||||
|
**/out-tsc
|
||||||
|
bazel-out
|
||||||
|
|
||||||
|
# Dependencies & framework caches
|
||||||
|
node_modules
|
||||||
|
**/node_modules
|
||||||
|
.angular
|
||||||
|
**/.angular
|
||||||
|
.nx
|
||||||
|
**/.nx
|
||||||
|
.sass-cache
|
||||||
|
**/.sass-cache
|
||||||
|
|
||||||
|
# Python virtual environments & caches
|
||||||
|
.venv
|
||||||
|
**/__pycache__
|
||||||
|
**/.mypy_cache
|
||||||
|
**/.ruff_cache
|
||||||
|
**/.pytest_cache
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
*.egg-info
|
||||||
|
|
||||||
|
# Testing & coverage
|
||||||
|
coverage
|
||||||
|
**/coverage
|
||||||
|
.coverage
|
||||||
|
htmlcov
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Environment & local deployment/dev files
|
||||||
|
.env*
|
||||||
|
!.env.example
|
||||||
|
ansible
|
||||||
|
deploy.sh
|
||||||
|
lint.sh
|
||||||
|
version_bump.sh
|
||||||
|
Makefile
|
||||||
|
README.md
|
||||||
|
CHANGES.md
|
||||||
|
typings
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
+47
-1
@@ -1,5 +1,51 @@
|
|||||||
|
# IDEs & System Files
|
||||||
.idea/
|
.idea/
|
||||||
frontend
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Build outputs
|
||||||
|
frontend/
|
||||||
|
dist/
|
||||||
|
**/dist/
|
||||||
|
out-tsc/
|
||||||
|
**/out-tsc/
|
||||||
|
bazel-out/
|
||||||
|
|
||||||
|
# Angular & Nx caches
|
||||||
|
.angular/
|
||||||
|
**/.angular/
|
||||||
|
.nx/
|
||||||
|
**/.nx/
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
node_modules/
|
||||||
|
**/node_modules/
|
||||||
|
|
||||||
|
# Python & Virtual Environments
|
||||||
|
.venv/
|
||||||
|
**/__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
*.egg-info/
|
||||||
|
.mypy_cache/
|
||||||
|
**/.mypy_cache/
|
||||||
|
.ruff_cache/
|
||||||
|
**/.ruff_cache/
|
||||||
|
.pytest_cache/
|
||||||
|
**/.pytest_cache/
|
||||||
|
|
||||||
|
# Testing & Coverage
|
||||||
|
coverage/
|
||||||
|
**/coverage/
|
||||||
|
.coverage
|
||||||
|
htmlcov/
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
# Ignore Pyright-generated stubs
|
# Ignore Pyright-generated stubs
|
||||||
*.pyi
|
*.pyi
|
||||||
|
|||||||
Vendored
+18
-1
@@ -27,19 +27,36 @@
|
|||||||
"files.exclude": {
|
"files.exclude": {
|
||||||
"**/__pycache__": true,
|
"**/__pycache__": true,
|
||||||
"**/.mypy_cache": true,
|
"**/.mypy_cache": true,
|
||||||
|
"**/.ruff_cache": true,
|
||||||
|
"**/.pytest_cache": true,
|
||||||
".idea": true,
|
".idea": true,
|
||||||
"**/node_modules": true,
|
"**/node_modules": true,
|
||||||
"typings": true,
|
"typings": true,
|
||||||
|
"frontend": true,
|
||||||
|
"**/.angular": true,
|
||||||
|
"**/.nx": true,
|
||||||
|
"**/out-tsc": true,
|
||||||
|
"**/dist": true,
|
||||||
|
"**/.sass-cache": true,
|
||||||
|
"**/coverage": true
|
||||||
},
|
},
|
||||||
"search.exclude": {
|
"search.exclude": {
|
||||||
"**/__pycache__": true,
|
"**/__pycache__": true,
|
||||||
"**/.mypy_cache": true,
|
"**/.mypy_cache": true,
|
||||||
|
"**/.ruff_cache": true,
|
||||||
|
"**/.pytest_cache": true,
|
||||||
".idea": true,
|
".idea": true,
|
||||||
"**/node_modules": true,
|
"**/node_modules": true,
|
||||||
"**/poetry.lock": true,
|
"**/poetry.lock": true,
|
||||||
"**/package-lock.json": true,
|
"**/package-lock.json": true,
|
||||||
"/overlord/.angular/**": true,
|
|
||||||
"typings": true,
|
"typings": true,
|
||||||
|
"frontend/**": true,
|
||||||
|
"**/.angular/**": true,
|
||||||
|
"**/.nx/**": true,
|
||||||
|
"**/out-tsc/**": true,
|
||||||
|
"**/dist/**": true,
|
||||||
|
"**/.sass-cache/**": true,
|
||||||
|
"**/coverage/**": true
|
||||||
},
|
},
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.ruff": "always",
|
"source.fixAll.ruff": "always",
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ RUN \
|
|||||||
else echo "Lockfile not found." && exit 1; \
|
else echo "Lockfile not found." && exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
FROM python:3.14-slim AS runner
|
FROM python:3.14-slim AS runner
|
||||||
LABEL maintainer="Amritanshu <docker@tanshu.com>"
|
LABEL maintainer="Amritanshu <docker@tanshu.com>"
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "15.2.3"
|
__version__ = "15.2.4"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "brewman"
|
name = "brewman"
|
||||||
version = "15.2.3"
|
version = "15.2.4"
|
||||||
description = "Accounting plus inventory management for a restaurant."
|
description = "Accounting plus inventory management for a restaurant."
|
||||||
requires-python = ">=3.14"
|
requires-python = ">=3.14"
|
||||||
authors = [{ name = "tanshu", email = "git@tanshu.com" }]
|
authors = [{ name = "tanshu", email = "git@tanshu.com" }]
|
||||||
|
|||||||
Generated
+1
-1
@@ -211,7 +211,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "brewman"
|
name = "brewman"
|
||||||
version = "15.2.3"
|
version = "15.2.4"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "alembic" },
|
{ name = "alembic" },
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit ; pwd -P )
|
|||||||
cd "$parent_path/overlord" || exit
|
cd "$parent_path/overlord" || exit
|
||||||
npx prettier --write src/app
|
npx prettier --write src/app
|
||||||
npx ng lint --fix
|
npx ng lint --fix
|
||||||
cd "$parent_path/brewman" || exit
|
|
||||||
|
|
||||||
uvx ruff format .
|
cd "$parent_path/brewman" || exit
|
||||||
uvx ruff check . # Lint all files in the current directory (and any subdirectories)
|
uv run ruff format .
|
||||||
uvx bandit --recursive brewman
|
uv run ruff check . # Lint all files in the current directory (and any subdirectories)
|
||||||
uvx bandit --recursive .
|
uv run bandit --recursive brewman
|
||||||
uvx safety check
|
uv run bandit --recursive .
|
||||||
|
uv run safety check
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "overlord",
|
"name": "overlord",
|
||||||
"version": "15.2.3",
|
"version": "15.2.4",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
export const environment = {
|
export const environment = {
|
||||||
ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry
|
ACCESS_TOKEN_REFRESH_MINUTES: 10, // refresh token 10 minutes before expiry
|
||||||
version: '15.2.3',
|
version: '15.2.4',
|
||||||
title: 'HnG / TGB',
|
title: 'HnG / TGB',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -134,9 +134,9 @@
|
|||||||
<span class="flex">
|
<span class="flex">
|
||||||
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
||||||
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
||||||
> by <strong>{{ form.userName() }}</strong
|
> by <strong>{{ form.userName().value().name }}</strong
|
||||||
>.
|
>.
|
||||||
{{ form.posted() ? 'Posted by ' + form.poster() : '' }}
|
{{ form.posted().value() ? 'Posted by ' + form.poster().value() : '' }}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ export interface IssueFormModel {
|
|||||||
posted: boolean;
|
posted: boolean;
|
||||||
creationDate: string;
|
creationDate: string;
|
||||||
lastEditDate: string;
|
lastEditDate: string;
|
||||||
userName: string;
|
userName: User;
|
||||||
poster: string;
|
poster: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ export class IssueComponent {
|
|||||||
posted: voucher.posted,
|
posted: voucher.posted,
|
||||||
creationDate: voucher.creationDate,
|
creationDate: voucher.creationDate,
|
||||||
lastEditDate: voucher.lastEditDate,
|
lastEditDate: voucher.lastEditDate,
|
||||||
userName: voucher.user?.name ?? '',
|
userName: voucher.user ?? new User(),
|
||||||
poster: voucher.poster ?? '',
|
poster: voucher.poster ?? '',
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -174,8 +174,8 @@
|
|||||||
<span class="flex">
|
<span class="flex">
|
||||||
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
||||||
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
||||||
> by <strong>{{ form.userName() }}</strong
|
> by <strong>{{ form.userName().value().name }}</strong
|
||||||
>. {{ form.posted() ? 'Posted by ' + form.poster() : '' }}
|
>. {{ form.posted().value() ? 'Posted by ' + form.poster().value() : '' }}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import { AccountService } from '../core/account.service';
|
|||||||
import { CostCentre } from '../core/cost-centre';
|
import { CostCentre } from '../core/cost-centre';
|
||||||
import { DbFile } from '../core/db-file';
|
import { DbFile } from '../core/db-file';
|
||||||
import { Journal } from '../core/journal';
|
import { Journal } from '../core/journal';
|
||||||
|
import { User } from '../core/user';
|
||||||
import { Voucher } from '../core/voucher';
|
import { Voucher } from '../core/voucher';
|
||||||
import { VoucherService } from '../core/voucher.service';
|
import { VoucherService } from '../core/voucher.service';
|
||||||
import { AccountingPipe } from '../shared/accounting.pipe';
|
import { AccountingPipe } from '../shared/accounting.pipe';
|
||||||
@@ -64,7 +65,7 @@ export interface JournalFormModel {
|
|||||||
posted: boolean;
|
posted: boolean;
|
||||||
creationDate: string;
|
creationDate: string;
|
||||||
lastEditDate: string;
|
lastEditDate: string;
|
||||||
userName: string;
|
userName: User;
|
||||||
poster: string;
|
poster: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,7 +195,7 @@ export class JournalComponent {
|
|||||||
posted: voucher.posted,
|
posted: voucher.posted,
|
||||||
creationDate: voucher.creationDate,
|
creationDate: voucher.creationDate,
|
||||||
lastEditDate: voucher.lastEditDate,
|
lastEditDate: voucher.lastEditDate,
|
||||||
userName: voucher.user?.name ?? '',
|
userName: voucher.user ?? new User(),
|
||||||
poster: voucher.poster,
|
poster: voucher.poster,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -182,9 +182,9 @@
|
|||||||
<span class="flex">
|
<span class="flex">
|
||||||
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
||||||
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
||||||
> by <strong>{{ form.userName() }}</strong
|
> by <strong>{{ form.userName().value().name }}</strong
|
||||||
>.
|
>.
|
||||||
{{ form.posted() ? 'Posted by ' + form.poster() : '' }}
|
{{ form.posted().value() ? 'Posted by ' + form.poster().value() : '' }}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export interface PaymentFormModel {
|
|||||||
posted: boolean;
|
posted: boolean;
|
||||||
creationDate: string;
|
creationDate: string;
|
||||||
lastEditDate: string;
|
lastEditDate: string;
|
||||||
userName: string;
|
userName: User;
|
||||||
poster: string;
|
poster: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@ export class PaymentComponent {
|
|||||||
posted: voucher.posted,
|
posted: voucher.posted,
|
||||||
creationDate: voucher.creationDate,
|
creationDate: voucher.creationDate,
|
||||||
lastEditDate: voucher.lastEditDate,
|
lastEditDate: voucher.lastEditDate,
|
||||||
userName: voucher.user?.name ?? '',
|
userName: voucher.user ?? new User(),
|
||||||
poster: voucher.poster ?? '',
|
poster: voucher.poster ?? '',
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -207,9 +207,9 @@
|
|||||||
<span class="flex">
|
<span class="flex">
|
||||||
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
||||||
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
||||||
> by <strong>{{ form.userName() }}</strong
|
> by <strong>{{ form.userName().value().name }}</strong
|
||||||
>.
|
>.
|
||||||
{{ form.posted() ? 'Posted by ' + form.poster() : '' }}
|
{{ form.posted().value() ? 'Posted by ' + form.poster().value() : '' }}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ export interface PurchaseReturnFormModel {
|
|||||||
posted: boolean;
|
posted: boolean;
|
||||||
creationDate: string;
|
creationDate: string;
|
||||||
lastEditDate: string;
|
lastEditDate: string;
|
||||||
userName: string;
|
userName: User;
|
||||||
poster: string;
|
poster: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,7 +157,7 @@ export class PurchaseReturnComponent {
|
|||||||
posted: voucher.posted,
|
posted: voucher.posted,
|
||||||
creationDate: voucher.creationDate,
|
creationDate: voucher.creationDate,
|
||||||
lastEditDate: voucher.lastEditDate,
|
lastEditDate: voucher.lastEditDate,
|
||||||
userName: voucher.user?.name ?? '',
|
userName: voucher.user ?? null,
|
||||||
poster: voucher.poster ?? '',
|
poster: voucher.poster ?? '',
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -227,9 +227,9 @@
|
|||||||
<span class="flex">
|
<span class="flex">
|
||||||
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
||||||
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
||||||
> by <strong>{{ form.userName() }}</strong
|
> by <strong>{{ form.userName().value().name }}</strong
|
||||||
>.
|
>.
|
||||||
{{ form.posted() ? 'Posted by ' + form.poster() : '' }}
|
{{ form.posted().value() ? 'Posted by ' + form.poster().value() : '' }}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export interface PurchaseFormModel {
|
|||||||
posted: boolean;
|
posted: boolean;
|
||||||
creationDate: string;
|
creationDate: string;
|
||||||
lastEditDate: string;
|
lastEditDate: string;
|
||||||
userName: string;
|
userName: User;
|
||||||
poster: string;
|
poster: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ export class PurchaseComponent {
|
|||||||
posted: voucher.posted,
|
posted: voucher.posted,
|
||||||
creationDate: voucher.creationDate,
|
creationDate: voucher.creationDate,
|
||||||
lastEditDate: voucher.lastEditDate,
|
lastEditDate: voucher.lastEditDate,
|
||||||
userName: voucher.user?.name ?? '',
|
userName: voucher.user ?? null,
|
||||||
poster: voucher.poster ?? '',
|
poster: voucher.poster ?? '',
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -177,8 +177,8 @@
|
|||||||
<span class="flex">
|
<span class="flex">
|
||||||
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
Created on <strong>{{ form.creationDate().value() | localTime }}</strong
|
||||||
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
> and Last Edited on <strong>{{ form.lastEditDate().value() | localTime }}</strong
|
||||||
> by <strong>{{ form.userName() }}</strong
|
> by <strong>{{ form.userName().value().name }}</strong
|
||||||
>. {{ form.posted() ? 'Posted by ' + form.poster() : '' }}
|
>. {{ form.posted().value() ? 'Posted by ' + form.poster().value() : '' }}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ export interface ReceiptFormModel {
|
|||||||
posted: boolean;
|
posted: boolean;
|
||||||
creationDate: string;
|
creationDate: string;
|
||||||
lastEditDate: string;
|
lastEditDate: string;
|
||||||
userName: string;
|
userName: User;
|
||||||
poster: string;
|
poster: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ export class ReceiptComponent {
|
|||||||
posted: voucher.posted,
|
posted: voucher.posted,
|
||||||
creationDate: voucher.creationDate,
|
creationDate: voucher.creationDate,
|
||||||
lastEditDate: voucher.lastEditDate,
|
lastEditDate: voucher.lastEditDate,
|
||||||
userName: voucher.user?.name ?? '',
|
userName: voucher.user ?? null,
|
||||||
poster: voucher.poster ?? '',
|
poster: voucher.poster ?? '',
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,6 +3,12 @@ set -euo pipefail
|
|||||||
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit ; pwd -P )
|
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit ; pwd -P )
|
||||||
cd "$parent_path" || exit
|
cd "$parent_path" || exit
|
||||||
|
|
||||||
|
last_commit_subject=$(git log -1 --format=%s)
|
||||||
|
if [[ "$last_commit_subject" =~ ^Version\ Bump ]]; then
|
||||||
|
echo "Last commit is already a version bump (\"$last_commit_subject\"). Nothing to do."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
if [ 1 -eq "$#" ]
|
if [ 1 -eq "$#" ]
|
||||||
then
|
then
|
||||||
current_version=$(grep -m 1 '^version = ' brewman/pyproject.toml | sed -E 's/version = "([^"]+)"/\1/')
|
current_version=$(grep -m 1 '^version = ' brewman/pyproject.toml | sed -E 's/version = "([^"]+)"/\1/')
|
||||||
|
|||||||
Reference in New Issue
Block a user